Monkey 3 rokov pred
commit
00a50dd0fe
100 zmenil súbory, kde vykonal 10772 pridanie a 0 odobranie
  1. 20 0
      .hbuilderx/launch.json
  2. 215 0
      App.vue
  3. 21 0
      LICENSE
  4. 90 0
      README.md
  5. BIN
      __MACOSX/.hbuilderx/._launch.json
  6. BIN
      __MACOSX/common/cryptojs-master/._README.md
  7. BIN
      __MACOSX/common/cryptojs-master/._cryptojs.js
  8. BIN
      __MACOSX/common/cryptojs-master/._package.json
  9. BIN
      __MACOSX/common/cryptojs-master/lib/._AES.js
  10. BIN
      __MACOSX/common/cryptojs-master/lib/._BlockModes.js
  11. BIN
      __MACOSX/common/cryptojs-master/lib/._Crypto.js
  12. BIN
      __MACOSX/common/cryptojs-master/lib/._CryptoMath.js
  13. BIN
      __MACOSX/common/cryptojs-master/lib/._DES.js
  14. BIN
      __MACOSX/common/cryptojs-master/lib/._HMAC.js
  15. BIN
      __MACOSX/common/cryptojs-master/lib/._MARC4.js
  16. BIN
      __MACOSX/common/cryptojs-master/lib/._MD5.js
  17. BIN
      __MACOSX/common/cryptojs-master/lib/._PBKDF2.js
  18. BIN
      __MACOSX/common/cryptojs-master/lib/._PBKDF2Async.js
  19. BIN
      __MACOSX/common/cryptojs-master/lib/._Rabbit.js
  20. BIN
      __MACOSX/common/cryptojs-master/lib/._SHA1.js
  21. BIN
      __MACOSX/common/cryptojs-master/lib/._SHA256.js
  22. BIN
      __MACOSX/common/cryptojs-master/test/._PBKDF2-test.js
  23. BIN
      __MACOSX/common/cryptojs-master/test/._test.coffee
  24. BIN
      __MACOSX/common/fontFamily/._fontCss.css
  25. BIN
      __MACOSX/static/._.DS_Store
  26. BIN
      __MACOSX/static/app/._.DS_Store
  27. BIN
      __MACOSX/static/app/._close.png
  28. BIN
      __MACOSX/static/app/._data_empty.png
  29. BIN
      __MACOSX/static/app/._service.png
  30. BIN
      __MACOSX/static/app/page1/._.DS_Store
  31. BIN
      __MACOSX/static/app/page1/._btn.png
  32. BIN
      __MACOSX/static/app/page1/._head_top.png
  33. BIN
      __MACOSX/static/app/page1/._home_bg.png
  34. BIN
      __MACOSX/static/app/page2/._head_bg.png
  35. BIN
      __MACOSX/static/app/page3/._arrow-down.png
  36. BIN
      __MACOSX/static/app/page3/._mark.png
  37. BIN
      __MACOSX/static/app/tabs/._tab1.png
  38. BIN
      __MACOSX/static/app/tabs/._tab1_on.png
  39. BIN
      __MACOSX/static/app/tabs/._tab2.png
  40. BIN
      __MACOSX/static/app/tabs/._tab2_on.png
  41. BIN
      __MACOSX/static/c-datepicker/._left_btn.png
  42. BIN
      __MACOSX/static/c-datepicker/._right_btn.png
  43. BIN
      __MACOSX/unpackage/._.DS_Store
  44. BIN
      __MACOSX/unpackage/dist/._.DS_Store
  45. BIN
      __MACOSX/unpackage/dist/build/._.DS_Store
  46. BIN
      __MACOSX/unpackage/dist/dev/._.DS_Store
  47. BIN
      __MACOSX/unpackage/dist/dev/mp-weixin/._.DS_Store
  48. 40 0
      common/WXBizDataCrypt.js
  49. 4249 0
      common/animated.css
  50. 32 0
      common/cryptojs-master/README.md
  51. 17 0
      common/cryptojs-master/cryptojs.js
  52. 402 0
      common/cryptojs-master/lib/AES.js
  53. 378 0
      common/cryptojs-master/lib/BlockModes.js
  54. 155 0
      common/cryptojs-master/lib/Crypto.js
  55. 37 0
      common/cryptojs-master/lib/CryptoMath.js
  56. 1003 0
      common/cryptojs-master/lib/DES.js
  57. 38 0
      common/cryptojs-master/lib/HMAC.js
  58. 117 0
      common/cryptojs-master/lib/MARC4.js
  59. 158 0
      common/cryptojs-master/lib/MD5.js
  60. 49 0
      common/cryptojs-master/lib/PBKDF2.js
  61. 88 0
      common/cryptojs-master/lib/PBKDF2Async.js
  62. 221 0
      common/cryptojs-master/lib/Rabbit.js
  63. 86 0
      common/cryptojs-master/lib/SHA1.js
  64. 130 0
      common/cryptojs-master/lib/SHA256.js
  65. 18 0
      common/cryptojs-master/package.json
  66. 25 0
      common/cryptojs-master/test/PBKDF2-test.js
  67. 13 0
      common/cryptojs-master/test/test.coffee
  68. 853 0
      common/dayjs/CHANGELOG.md
  69. 21 0
      common/dayjs/LICENSE
  70. 139 0
      common/dayjs/README.md
  71. 0 0
      common/dayjs/dayjs.min.js
  72. 25 0
      common/dayjs/esm/constant.js
  73. 429 0
      common/dayjs/esm/index.d.ts
  74. 441 0
      common/dayjs/esm/index.js
  75. 39 0
      common/dayjs/esm/locale/af.js
  76. 40 0
      common/dayjs/esm/locale/am.js
  77. 41 0
      common/dayjs/esm/locale/ar-dz.js
  78. 42 0
      common/dayjs/esm/locale/ar-iq.js
  79. 41 0
      common/dayjs/esm/locale/ar-kw.js
  80. 27 0
      common/dayjs/esm/locale/ar-ly.js
  81. 42 0
      common/dayjs/esm/locale/ar-ma.js
  82. 41 0
      common/dayjs/esm/locale/ar-sa.js
  83. 42 0
      common/dayjs/esm/locale/ar-tn.js
  84. 74 0
      common/dayjs/esm/locale/ar.js
  85. 39 0
      common/dayjs/esm/locale/az.js
  86. 24 0
      common/dayjs/esm/locale/be.js
  87. 55 0
      common/dayjs/esm/locale/bg.js
  88. 39 0
      common/dayjs/esm/locale/bi.js
  89. 39 0
      common/dayjs/esm/locale/bm.js
  90. 81 0
      common/dayjs/esm/locale/bn-bd.js
  91. 72 0
      common/dayjs/esm/locale/bn.js
  92. 38 0
      common/dayjs/esm/locale/bo.js
  93. 93 0
      common/dayjs/esm/locale/br.js
  94. 24 0
      common/dayjs/esm/locale/bs.js
  95. 44 0
      common/dayjs/esm/locale/ca.js
  96. 120 0
      common/dayjs/esm/locale/cs.js
  97. 24 0
      common/dayjs/esm/locale/cv.js
  98. 39 0
      common/dayjs/esm/locale/cy.js
  99. 39 0
      common/dayjs/esm/locale/da.js
  100. 63 0
      common/dayjs/esm/locale/de-at.js

+ 20 - 0
.hbuilderx/launch.json

@@ -0,0 +1,20 @@
+{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/
+  // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数
+    "version": "0.0",
+    "configurations": [{
+     	"default" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"h5" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"mp-weixin" : 
+     	{
+     		"launchtype" : "local"
+     	},
+     	"type" : "uniCloud"
+     }
+    ]
+}

+ 215 - 0
App.vue

@@ -0,0 +1,215 @@
+<script>
+	import Vue from 'vue'
+	import Wechat from '@/util/wechat/wechat.js'
+	import mpWx from '@/common/mpWX.js'
+	import store from '@/store'
+	import { updateCheck } from "@/util/index.js"
+	export default {
+		computed:{
+			
+		},
+		methods: {
+			// 获取系统栏高度
+			async setAppInfo() {
+				let that = this;
+				let platform = '';
+				return new Promise((resolve, reject) => {
+					uni.getSystemInfo({
+						success: function(e) {
+							Vue.prototype.StatusBar = e.statusBarHeight;
+							// #ifdef H5
+							Vue.prototype.CustomBar = e.statusBarHeight + 45;
+							Vue.prototype.SystemInfo = e;
+							
+							if (that.$wxsdk.isWechat()) {
+								platform = 'wxOfficialAccount';
+							} else {
+								platform = 'H5';
+							}
+							// #endif
+			
+							// #ifdef APP-PLUS
+							platform = 'App';
+							if (e.platform == 'android') {
+								uni.setStorageSync('isAndroid', true);
+								Vue.prototype.CustomBar = e.statusBarHeight + 50;
+							} else {
+								Vue.prototype.CustomBar = e.statusBarHeight + 45;
+								uni.setStorageSync('isAndroid', false);
+							}
+							// #endif
+			
+							// #ifdef MP-WEIXIN
+							platform = 'wxMiniProgram';
+							// new Wechat().getWxMiniProgramSessionKey();
+							let custom = wx.getMenuButtonBoundingClientRect();
+							Vue.prototype.Custom = custom;
+							Vue.prototype.CustomBar = custom.bottom + custom.top - e.statusBarHeight;
+							// #endif
+							uni.setStorageSync('platform', platform);
+							resolve(platform);
+						}
+					});
+				});
+				
+			},
+			// 自动登录
+			async autoLogin(options) {
+				// let initData = data;
+				var wechat = new Wechat();
+				if (!uni.getStorageSync('token')) {
+					// #ifdef H5
+						// await wechat.login();
+					// #endif
+				}else {
+					// 已经登录
+					this.jumpPage()
+				}
+			},
+			jumpPage(){
+				// if(window.location.hash.indexOf('page') < 0){
+				// 	// uni.switchTab({
+				// 	// 	url: '/pages/index/index'
+				// 	// });
+				// }else{
+				// 	uni.switchTab({
+				// 		url: window.location.hash.split('#')[1]
+				// 	});
+				// }
+			},
+			wechatLogin() {
+				
+				// mpWx.checkSession().then(res => {
+				// 	console.log(res, 222)
+				// })
+				
+				// mpWx.getUserInfo().then(res => {
+				// 	console.log(res)
+				// })
+				
+				// 微信登录
+				mpWx.login().then(code => {
+					// 获取openId
+					store.dispatch("getOpenId", {code: code}).then(res => {
+						setTimeout(() => {
+							uni.reLaunch({
+								url: '/pages/signs/main/main',
+							})
+						})
+					})
+				})	
+				
+				// uni.switchTab({
+				// 	url: "/pages/signs/me/me"
+				// })
+				
+			}
+		},
+		onLaunch: async function(options) {
+			console.log(options)
+			// 初始化
+			await this.setAppInfo();
+			
+			// 检查更新
+			// #ifdef MP-WEIXIN
+			updateCheck.call(this)
+			// #endif
+			
+			// #ifdef MP-WEIXIN
+				this.wechatLogin()
+			// #endif
+			
+			
+			// #ifdef H5
+				try {
+					//  await this.autoLogin(options.query);
+				} catch (e) {
+					
+				}
+			// #endif
+		},
+		onPageNotFound(){
+			uni.reLaunch({
+				url: '/pages/signs/main/main',
+			})
+		},
+		onUnhandledRejection(e) {
+			// console.log(e)
+			// console.log(this)
+			uni.showModal({
+				title: '提示',
+				content: "加载失败,请尝试刷新"
+			});
+		}
+	}
+</script>
+
+<style lang="scss">
+	/*每个页面公共css */
+	@import "@/uni_modules/colorui/main.css";
+	@import "@/uni_modules/uview-ui/index.scss";	
+	@import "@/uni_modules/uview-ui/theme.scss";	
+	@import "common/demo.scss";
+	@import "common/fontFamily/fontCss.css";
+	
+	uni-radio:not([disabled]) .uni-radio-input:hover,
+	uni-checkbox:not([disabled]) .uni-checkbox-input:hover {
+		border-color: #ccc !important;
+	}
+	
+	page {
+		-webkit-overflow-scrolling: touch; //ios滑动不流畅
+		height: 100%;
+		background: #f6f6f6;
+		width: 100%;
+		font-size: 30upx;
+		font-family: NotoSansHans-Bold;
+		word-break: break-all; //英文文本不换行
+		color: #333;
+	}
+	::-webkit-scrollbar {
+		width: 0;
+		height: 0;
+		color: transparent;
+		display: none;
+	}
+	
+	
+	page{
+		height: 100%;
+	}
+	.app-full{
+		background-color: $app-bg-color;
+		 height: 100%;
+	}
+	.app-page{
+		background-color: $app-bg-color;
+		height: 100%;
+		padding-bottom: 100rpx;
+		
+		/* #ifndef H5*/
+			min-height: 100%
+		/* #endif */
+		
+		/* #ifdef H5 */
+			padding-bottom: 100rpx;
+		/* #endif */
+	}
+	
+	.box-head{
+		display: flex;
+		align-items: center;
+		background: linear-gradient(90deg, rgba(121,169,206,0.4) 0%, rgba(121,169,206,0) 100%);
+		border-radius: 2rpx;
+		width: 259rpx;
+		height: 50rpx;
+		padding-left: 28rpx;
+		border-left: 8rpx solid #79A9CE;
+		.name{
+			font-size: 28rpx;
+			font-family: PingFang SC;
+			font-weight: bold;
+			color: #333333;
+		}
+	}
+</style>

+ 21 - 0
LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2021 www.uviewui.com
+
+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.

+ 90 - 0
README.md

@@ -0,0 +1,90 @@
+<p align="center">
+    <img alt="logo" src="https://uviewui.com/common/logo.png" width="120" height="120" style="margin-bottom: 10px;">
+</p>
+<h3 align="center" style="margin: 30px 0 30px;font-weight: bold;font-size:40px;">uView 2.0</h3>
+<h3 align="center">多平台快速开发的UI框架</h3>
+
+[![stars](https://img.shields.io/github/stars/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)
+[![forks](https://img.shields.io/github/forks/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0)
+[![issues](https://img.shields.io/github/issues/umicro/uView2.0?style=flat-square&logo=GitHub)](https://github.com/umicro/uView2.0/issues)
+[![Website](https://img.shields.io/badge/uView-up-blue?style=flat-square)](https://uviewui.com)
+[![release](https://img.shields.io/github/v/release/umicro/uView2.0?style=flat-square)](https://gitee.com/umicro/uView2.0/releases)
+[![license](https://img.shields.io/github/license/umicro/uView2.0?style=flat-square)](https://en.wikipedia.org/wiki/MIT_License)
+
+## 说明
+
+uView UI,是[uni-app](https://uniapp.dcloud.io/)全面兼容nvue的uni-app生态框架,全面的组件和便捷的工具会让您信手拈来,如鱼得水
+
+## [官方文档:https://v2.uviewui.com](https://v2.uviewui.com)
+
+### 官方1群:1042987248(已满)
+### 官方2群:249718512(已满)
+### 官方3群:1129077272(已满)
+### 官方4群:1084514613(已满)
+### 官方5群:863820668(已满)
+### 官方6群:745721078(已满)
+### 官方7群:627867855(已满)
+### 官方8群:496409492(已满)
+### 官方9群:828504448(已满)
+### [点击加10群交流反馈:232041042](https://jq.qq.com/?_wv=1027&k=KnbeceDU)
+
+## 特性
+
+- 全面兼容nvue,原生渲染,高性能
+- 兼容安卓,iOS,微信小程序,H5,QQ小程序,百度小程序,支付宝小程序,头条小程序
+- 60+精选组件,功能丰富,多端兼容,让您快速集成,开箱即用
+- 众多贴心的JS利器,让您飞镖在手,召之即来,百步穿杨
+- 众多的常用页面和布局,让您专注逻辑,事半功倍
+- 详尽的文档支持,现代化的演示效果
+- 按需引入,精简打包体积
+
+
+## 预览
+
+您可以通过**微信**扫码,查看最佳的演示效果。
+<br>
+<br>
+<img src="https://uviewui.com/common/weixin_mini_qrcode.png" width="220" height="220" >
+
+
+## 链接
+
+- [官方文档](https://v2.uviewui.com/)
+- [更新日志](https://v2.uviewui.com/components/changelog.html)
+- [升级指南](https://v2.uviewui.com/components/changeGuide.html)
+- [关于我们](https://v2.uviewui.com/cooperation/about.html)
+
+## 交流反馈
+
+欢迎加入我们的QQ群交流反馈:[点此跳转](https://www.uviewui.com/components/addQQGroup.html)
+
+## 安装
+
+#### **下载地址** —— [https://ext.dcloud.net.cn/plugin?id=1593](https://ext.dcloud.net.cn/plugin?id=1593)
+
+## 快速上手
+
+请通过[官网安装文档](https://v2.uviewui.com/components/install.html)了解更详细的内容
+
+## 使用方法
+配置easycom规则后,自动按需引入,无需`import`组件,直接引用即可。
+
+```html
+<template>
+	<u-button>按钮</u-button>
+</template>
+```
+
+请通过[快速上手](https://v2.uviewui.com/components/quickstart.html)了解更详细的内容
+
+
+## 捐赠uView的研发
+
+uView文档内容和框架源码全部开源免费,如果您认为uView帮到了您的开发工作,您可以捐赠uView的研发工作,捐赠无门槛,哪怕是一杯可乐也好(相信这比打赏主播更有意义)。
+
+<img src="https://uviewui.com/common/wechat.png" width="220" >
+<img style="margin-left: 100px;" src="https://uviewui.com/common/alipay.png" width="220" >
+
+## 版权信息
+uView遵循[MIT](https://en.wikipedia.org/wiki/MIT_License)开源协议,意味着您无需支付任何费用,也无需授权,即可将uView应用到您的产品中。
+

BIN
__MACOSX/.hbuilderx/._launch.json


BIN
__MACOSX/common/cryptojs-master/._README.md


BIN
__MACOSX/common/cryptojs-master/._cryptojs.js


BIN
__MACOSX/common/cryptojs-master/._package.json


BIN
__MACOSX/common/cryptojs-master/lib/._AES.js


BIN
__MACOSX/common/cryptojs-master/lib/._BlockModes.js


BIN
__MACOSX/common/cryptojs-master/lib/._Crypto.js


BIN
__MACOSX/common/cryptojs-master/lib/._CryptoMath.js


BIN
__MACOSX/common/cryptojs-master/lib/._DES.js


BIN
__MACOSX/common/cryptojs-master/lib/._HMAC.js


BIN
__MACOSX/common/cryptojs-master/lib/._MARC4.js


BIN
__MACOSX/common/cryptojs-master/lib/._MD5.js


BIN
__MACOSX/common/cryptojs-master/lib/._PBKDF2.js


BIN
__MACOSX/common/cryptojs-master/lib/._PBKDF2Async.js


BIN
__MACOSX/common/cryptojs-master/lib/._Rabbit.js


BIN
__MACOSX/common/cryptojs-master/lib/._SHA1.js


BIN
__MACOSX/common/cryptojs-master/lib/._SHA256.js


BIN
__MACOSX/common/cryptojs-master/test/._PBKDF2-test.js


BIN
__MACOSX/common/cryptojs-master/test/._test.coffee


BIN
__MACOSX/common/fontFamily/._fontCss.css


BIN
__MACOSX/static/._.DS_Store


BIN
__MACOSX/static/app/._.DS_Store


BIN
__MACOSX/static/app/._close.png


BIN
__MACOSX/static/app/._data_empty.png


BIN
__MACOSX/static/app/._service.png


BIN
__MACOSX/static/app/page1/._.DS_Store


BIN
__MACOSX/static/app/page1/._btn.png


BIN
__MACOSX/static/app/page1/._head_top.png


BIN
__MACOSX/static/app/page1/._home_bg.png


BIN
__MACOSX/static/app/page2/._head_bg.png


BIN
__MACOSX/static/app/page3/._arrow-down.png


BIN
__MACOSX/static/app/page3/._mark.png


BIN
__MACOSX/static/app/tabs/._tab1.png


BIN
__MACOSX/static/app/tabs/._tab1_on.png


BIN
__MACOSX/static/app/tabs/._tab2.png


BIN
__MACOSX/static/app/tabs/._tab2_on.png


BIN
__MACOSX/static/c-datepicker/._left_btn.png


BIN
__MACOSX/static/c-datepicker/._right_btn.png


BIN
__MACOSX/unpackage/._.DS_Store


BIN
__MACOSX/unpackage/dist/._.DS_Store


BIN
__MACOSX/unpackage/dist/build/._.DS_Store


BIN
__MACOSX/unpackage/dist/dev/._.DS_Store


BIN
__MACOSX/unpackage/dist/dev/mp-weixin/._.DS_Store


+ 40 - 0
common/WXBizDataCrypt.js

@@ -0,0 +1,40 @@
+/**
+ * Created by rd on 2017/5/4.
+ */
+// 引入CryptoJS  路径依个人导入情况变动
+var Crypto = require('./cryptojs-master/cryptojs.js').Crypto;
+var app = getApp();
+
+function RdWXBizDataCrypt(appId, sessionKey) {
+  this.appId = appId
+  this.sessionKey = sessionKey
+}
+
+RdWXBizDataCrypt.prototype.decryptData = function (encryptedData, iv) {
+  // base64 decode :使用 CryptoJS 中 Crypto.util.base64ToBytes()进行 base64解码
+  var encryptedData = Crypto.util.base64ToBytes(encryptedData)
+  var key = Crypto.util.base64ToBytes(this.sessionKey);
+  var iv = Crypto.util.base64ToBytes(iv);
+
+  // 对称解密使用的算法为 AES-128-CBC,数据采用PKCS#7填充
+  var mode = new Crypto.mode.CBC(Crypto.pad.pkcs7);
+  
+  try {
+    // 解密
+    var bytes = Crypto.AES.decrypt(encryptedData, key, {
+        asBpytes:true,
+        iv: iv,
+        mode: mode
+    });
+    
+    var decryptResult = JSON.parse(bytes);
+    
+  } catch (err) {
+    console.log(err)
+  }
+
+
+  return decryptResult
+}
+
+module.exports = RdWXBizDataCrypt

+ 4249 - 0
common/animated.css

@@ -0,0 +1,4249 @@
+/*!
+ * animate.css - https://animate.style/
+ * Version - 4.1.1
+ * Licensed under the Hippocratic License 2.1 - http://firstdonoharm.dev
+ *
+ * Copyright (c) 2022 Animate.css
+ */
+:root {
+    --animate-duration: 1s;
+    --animate-delay: 1s;
+    --animate-repeat:1
+}
+
+.animate__animated {
+    -webkit-animation-duration: 1s;
+    animation-duration: 1s;
+    -webkit-animation-duration: var(--animate-duration);
+    animation-duration: var(--animate-duration);
+    -webkit-animation-fill-mode: both;
+    animation-fill-mode:both
+}
+
+.animate__animated.animate__infinite {
+    -webkit-animation-iteration-count: infinite;
+    animation-iteration-count:infinite
+}
+
+.animate__animated.animate__repeat-1 {
+    -webkit-animation-iteration-count: 1;
+    animation-iteration-count: 1;
+    -webkit-animation-iteration-count: var(--animate-repeat);
+    animation-iteration-count:var(--animate-repeat)
+}
+
+.animate__animated.animate__repeat-2 {
+    -webkit-animation-iteration-count: 2;
+    animation-iteration-count: 2;
+    -webkit-animation-iteration-count: calc(var(--animate-repeat) * 2);
+    animation-iteration-count:calc(var(--animate-repeat) * 2)
+}
+
+.animate__animated.animate__repeat-3 {
+    -webkit-animation-iteration-count: 3;
+    animation-iteration-count: 3;
+    -webkit-animation-iteration-count: calc(var(--animate-repeat) * 3);
+    animation-iteration-count:calc(var(--animate-repeat) * 3)
+}
+
+.animate__animated.animate__delay-1s {
+    -webkit-animation-delay: 1s;
+    animation-delay: 1s;
+    -webkit-animation-delay: var(--animate-delay);
+    animation-delay:var(--animate-delay)
+}
+
+.animate__animated.animate__delay-2s {
+    -webkit-animation-delay: 2s;
+    animation-delay: 2s;
+    -webkit-animation-delay: calc(var(--animate-delay) * 2);
+    animation-delay:calc(var(--animate-delay) * 2)
+}
+
+.animate__animated.animate__delay-3s {
+    -webkit-animation-delay: 3s;
+    animation-delay: 3s;
+    -webkit-animation-delay: calc(var(--animate-delay) * 3);
+    animation-delay:calc(var(--animate-delay) * 3)
+}
+
+.animate__animated.animate__delay-4s {
+    -webkit-animation-delay: 4s;
+    animation-delay: 4s;
+    -webkit-animation-delay: calc(var(--animate-delay) * 4);
+    animation-delay:calc(var(--animate-delay) * 4)
+}
+
+.animate__animated.animate__delay-5s {
+    -webkit-animation-delay: 5s;
+    animation-delay: 5s;
+    -webkit-animation-delay: calc(var(--animate-delay) * 5);
+    animation-delay:calc(var(--animate-delay) * 5)
+}
+
+.animate__animated.animate__faster {
+    -webkit-animation-duration: .5s;
+    animation-duration: .5s;
+    -webkit-animation-duration: calc(var(--animate-duration) /2);
+    animation-duration:calc(var(--animate-duration)/2)
+}
+
+.animate__animated.animate__fast {
+    -webkit-animation-duration: .8s;
+    animation-duration: .8s;
+    -webkit-animation-duration: calc(var(--animate-duration) * .8);
+    animation-duration:calc(var(--animate-duration) * .8)
+}
+
+.animate__animated.animate__slow {
+    -webkit-animation-duration: 2s;
+    animation-duration: 2s;
+    -webkit-animation-duration: calc(var(--animate-duration) * 2);
+    animation-duration:calc(var(--animate-duration) * 2)
+}
+
+.animate__animated.animate__slower {
+    -webkit-animation-duration: 3s;
+    animation-duration: 3s;
+    -webkit-animation-duration: calc(var(--animate-duration) * 3);
+    animation-duration:calc(var(--animate-duration) * 3)
+}
+
+@media (prefers-reduced-motion: reduce), print {
+    .animate__animated {
+        -webkit-animation-duration: 1ms !important;
+        animation-duration: 1ms !important;
+        -webkit-animation-iteration-count: 1 !important;
+        animation-iteration-count: 1 !important;
+        -webkit-transition-duration: 1ms !important;
+        transition-duration:1ms !important
+    }
+
+    .animate__animated[class * =Out] {
+        opacity:0
+    }
+}
+
+@-webkit-keyframes bounce {
+    0%, 20%, 53%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    40%, 43% {
+        -webkit-animation-timing-function: cubic-bezier(.755, .05, .855, .06);
+        animation-timing-function: cubic-bezier(.755, .05, .855, .06);
+        -webkit-transform: translate3d(0, -30px, 0) scaleY(1.1);
+        transform:translate3d(0, -30px, 0) scaleY(1.1)
+    }
+
+    70% {
+        -webkit-animation-timing-function: cubic-bezier(.755, .05, .855, .06);
+        animation-timing-function: cubic-bezier(.755, .05, .855, .06);
+        -webkit-transform: translate3d(0, -15px, 0) scaleY(1.05);
+        transform:translate3d(0, -15px, 0) scaleY(1.05)
+    }
+
+    80% {
+        -webkit-transform: translateZ(0) scaleY(.95);
+        transform: translateZ(0) scaleY(.95);
+        -webkit-transition-timing-function: cubic-bezier(.215, .61, .355, 1);
+        transition-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    90% {
+        -webkit-transform: translate3d(0, -4px, 0) scaleY(1.02);
+        transform:translate3d(0, -4px, 0) scaleY(1.02)
+    }
+}
+
+@keyframes bounce {
+    0%, 20%, 53%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    40%, 43% {
+        -webkit-animation-timing-function: cubic-bezier(.755, .05, .855, .06);
+        animation-timing-function: cubic-bezier(.755, .05, .855, .06);
+        -webkit-transform: translate3d(0, -30px, 0) scaleY(1.1);
+        transform:translate3d(0, -30px, 0) scaleY(1.1)
+    }
+
+    70% {
+        -webkit-animation-timing-function: cubic-bezier(.755, .05, .855, .06);
+        animation-timing-function: cubic-bezier(.755, .05, .855, .06);
+        -webkit-transform: translate3d(0, -15px, 0) scaleY(1.05);
+        transform:translate3d(0, -15px, 0) scaleY(1.05)
+    }
+
+    80% {
+        -webkit-transform: translateZ(0) scaleY(.95);
+        transform: translateZ(0) scaleY(.95);
+        -webkit-transition-timing-function: cubic-bezier(.215, .61, .355, 1);
+        transition-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    90% {
+        -webkit-transform: translate3d(0, -4px, 0) scaleY(1.02);
+        transform:translate3d(0, -4px, 0) scaleY(1.02)
+    }
+}
+
+.animate__bounce {
+    -webkit-animation-name: bounce;
+    animation-name: bounce;
+    -webkit-transform-origin: center bottom;
+    transform-origin:center bottom
+}
+
+@-webkit-keyframes flash {
+    0%, 50%, to {
+        opacity:1
+    }
+
+    25%, 75% {
+        opacity:0
+    }
+}
+
+@keyframes flash {
+    0%, 50%, to {
+        opacity:1
+    }
+
+    25%, 75% {
+        opacity:0
+    }
+}
+
+.animate__flash {
+    -webkit-animation-name: flash;
+    animation-name:flash
+}
+
+@-webkit-keyframes pulse {
+    0% {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+
+    50% {
+        -webkit-transform: scale3d(1.05, 1.05, 1.05);
+        transform:scale3d(1.05, 1.05, 1.05)
+    }
+
+    to {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+}
+
+@keyframes pulse {
+    0% {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+
+    50% {
+        -webkit-transform: scale3d(1.05, 1.05, 1.05);
+        transform:scale3d(1.05, 1.05, 1.05)
+    }
+
+    to {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+}
+
+.animate__pulse {
+    -webkit-animation-name: pulse;
+    animation-name: pulse;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function:ease-in-out
+}
+
+@-webkit-keyframes rubberBand {
+    0% {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+
+    30% {
+        -webkit-transform: scale3d(1.25, .75, 1);
+        transform:scale3d(1.25, .75, 1)
+    }
+
+    40% {
+        -webkit-transform: scale3d(.75, 1.25, 1);
+        transform:scale3d(.75, 1.25, 1)
+    }
+
+    50% {
+        -webkit-transform: scale3d(1.15, .85, 1);
+        transform:scale3d(1.15, .85, 1)
+    }
+
+    65% {
+        -webkit-transform: scale3d(.95, 1.05, 1);
+        transform:scale3d(.95, 1.05, 1)
+    }
+
+    75% {
+        -webkit-transform: scale3d(1.05, .95, 1);
+        transform:scale3d(1.05, .95, 1)
+    }
+
+    to {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+}
+
+@keyframes rubberBand {
+    0% {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+
+    30% {
+        -webkit-transform: scale3d(1.25, .75, 1);
+        transform:scale3d(1.25, .75, 1)
+    }
+
+    40% {
+        -webkit-transform: scale3d(.75, 1.25, 1);
+        transform:scale3d(.75, 1.25, 1)
+    }
+
+    50% {
+        -webkit-transform: scale3d(1.15, .85, 1);
+        transform:scale3d(1.15, .85, 1)
+    }
+
+    65% {
+        -webkit-transform: scale3d(.95, 1.05, 1);
+        transform:scale3d(.95, 1.05, 1)
+    }
+
+    75% {
+        -webkit-transform: scale3d(1.05, .95, 1);
+        transform:scale3d(1.05, .95, 1)
+    }
+
+    to {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+}
+
+.animate__rubberBand {
+    -webkit-animation-name: rubberBand;
+    animation-name:rubberBand
+}
+
+@-webkit-keyframes shakeX {
+    0%, to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    10%, 30%, 50%, 70%, 90% {
+        -webkit-transform: translate3d(-10px, 0, 0);
+        transform:translate3d(-10px, 0, 0)
+    }
+
+    20%, 40%, 60%, 80% {
+        -webkit-transform: translate3d(10px, 0, 0);
+        transform:translate3d(10px, 0, 0)
+    }
+}
+
+@keyframes shakeX {
+    0%, to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    10%, 30%, 50%, 70%, 90% {
+        -webkit-transform: translate3d(-10px, 0, 0);
+        transform:translate3d(-10px, 0, 0)
+    }
+
+    20%, 40%, 60%, 80% {
+        -webkit-transform: translate3d(10px, 0, 0);
+        transform:translate3d(10px, 0, 0)
+    }
+}
+
+.animate__shakeX {
+    -webkit-animation-name: shakeX;
+    animation-name:shakeX
+}
+
+@-webkit-keyframes shakeY {
+    0%, to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    10%, 30%, 50%, 70%, 90% {
+        -webkit-transform: translate3d(0, -10px, 0);
+        transform:translate3d(0, -10px, 0)
+    }
+
+    20%, 40%, 60%, 80% {
+        -webkit-transform: translate3d(0, 10px, 0);
+        transform:translate3d(0, 10px, 0)
+    }
+}
+
+@keyframes shakeY {
+    0%, to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    10%, 30%, 50%, 70%, 90% {
+        -webkit-transform: translate3d(0, -10px, 0);
+        transform:translate3d(0, -10px, 0)
+    }
+
+    20%, 40%, 60%, 80% {
+        -webkit-transform: translate3d(0, 10px, 0);
+        transform:translate3d(0, 10px, 0)
+    }
+}
+
+.animate__shakeY {
+    -webkit-animation-name: shakeY;
+    animation-name:shakeY
+}
+
+@-webkit-keyframes headShake {
+    0% {
+        -webkit-transform: translateX(0);
+        transform:translateX(0)
+    }
+
+    6.5% {
+        -webkit-transform: translateX(-6px) rotateY(-9deg);
+        transform:translateX(-6px) rotateY(-9deg)
+    }
+
+    18.5% {
+        -webkit-transform: translateX(5px) rotateY(7deg);
+        transform:translateX(5px) rotateY(7deg)
+    }
+
+    31.5% {
+        -webkit-transform: translateX(-3px) rotateY(-5deg);
+        transform:translateX(-3px) rotateY(-5deg)
+    }
+
+    43.5% {
+        -webkit-transform: translateX(2px) rotateY(3deg);
+        transform:translateX(2px) rotateY(3deg)
+    }
+
+    50% {
+        -webkit-transform: translateX(0);
+        transform:translateX(0)
+    }
+}
+
+@keyframes headShake {
+    0% {
+        -webkit-transform: translateX(0);
+        transform:translateX(0)
+    }
+
+    6.5% {
+        -webkit-transform: translateX(-6px) rotateY(-9deg);
+        transform:translateX(-6px) rotateY(-9deg)
+    }
+
+    18.5% {
+        -webkit-transform: translateX(5px) rotateY(7deg);
+        transform:translateX(5px) rotateY(7deg)
+    }
+
+    31.5% {
+        -webkit-transform: translateX(-3px) rotateY(-5deg);
+        transform:translateX(-3px) rotateY(-5deg)
+    }
+
+    43.5% {
+        -webkit-transform: translateX(2px) rotateY(3deg);
+        transform:translateX(2px) rotateY(3deg)
+    }
+
+    50% {
+        -webkit-transform: translateX(0);
+        transform:translateX(0)
+    }
+}
+
+.animate__headShake {
+    -webkit-animation-name: headShake;
+    animation-name: headShake;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function:ease-in-out
+}
+
+@-webkit-keyframes swing {
+    20% {
+        -webkit-transform: rotate(15deg);
+        transform:rotate(15deg)
+    }
+
+    40% {
+        -webkit-transform: rotate(-10deg);
+        transform:rotate(-10deg)
+    }
+
+    60% {
+        -webkit-transform: rotate(5deg);
+        transform:rotate(5deg)
+    }
+
+    80% {
+        -webkit-transform: rotate(-5deg);
+        transform:rotate(-5deg)
+    }
+
+    to {
+        -webkit-transform: rotate(0deg);
+        transform:rotate(0deg)
+    }
+}
+
+@keyframes swing {
+    20% {
+        -webkit-transform: rotate(15deg);
+        transform:rotate(15deg)
+    }
+
+    40% {
+        -webkit-transform: rotate(-10deg);
+        transform:rotate(-10deg)
+    }
+
+    60% {
+        -webkit-transform: rotate(5deg);
+        transform:rotate(5deg)
+    }
+
+    80% {
+        -webkit-transform: rotate(-5deg);
+        transform:rotate(-5deg)
+    }
+
+    to {
+        -webkit-transform: rotate(0deg);
+        transform:rotate(0deg)
+    }
+}
+
+.animate__swing {
+    -webkit-animation-name: swing;
+    animation-name: swing;
+    -webkit-transform-origin: top center;
+    transform-origin:top center
+}
+
+@-webkit-keyframes tada {
+    0% {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+
+    10%, 20% {
+        -webkit-transform: scale3d(.9, .9, .9) rotate(-3deg);
+        transform:scale3d(.9, .9, .9) rotate(-3deg)
+    }
+
+    30%, 50%, 70%, 90% {
+        -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(3deg);
+        transform:scale3d(1.1, 1.1, 1.1) rotate(3deg)
+    }
+
+    40%, 60%, 80% {
+        -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg);
+        transform:scale3d(1.1, 1.1, 1.1) rotate(-3deg)
+    }
+
+    to {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+}
+
+@keyframes tada {
+    0% {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+
+    10%, 20% {
+        -webkit-transform: scale3d(.9, .9, .9) rotate(-3deg);
+        transform:scale3d(.9, .9, .9) rotate(-3deg)
+    }
+
+    30%, 50%, 70%, 90% {
+        -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(3deg);
+        transform:scale3d(1.1, 1.1, 1.1) rotate(3deg)
+    }
+
+    40%, 60%, 80% {
+        -webkit-transform: scale3d(1.1, 1.1, 1.1) rotate(-3deg);
+        transform:scale3d(1.1, 1.1, 1.1) rotate(-3deg)
+    }
+
+    to {
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+}
+
+.animate__tada {
+    -webkit-animation-name: tada;
+    animation-name:tada
+}
+
+@-webkit-keyframes wobble {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    15% {
+        -webkit-transform: translate3d(-25%, 0, 0) rotate(-5deg);
+        transform:translate3d(-25%, 0, 0) rotate(-5deg)
+    }
+
+    30% {
+        -webkit-transform: translate3d(20%, 0, 0) rotate(3deg);
+        transform:translate3d(20%, 0, 0) rotate(3deg)
+    }
+
+    45% {
+        -webkit-transform: translate3d(-15%, 0, 0) rotate(-3deg);
+        transform:translate3d(-15%, 0, 0) rotate(-3deg)
+    }
+
+    60% {
+        -webkit-transform: translate3d(10%, 0, 0) rotate(2deg);
+        transform:translate3d(10%, 0, 0) rotate(2deg)
+    }
+
+    75% {
+        -webkit-transform: translate3d(-5%, 0, 0) rotate(-1deg);
+        transform:translate3d(-5%, 0, 0) rotate(-1deg)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes wobble {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    15% {
+        -webkit-transform: translate3d(-25%, 0, 0) rotate(-5deg);
+        transform:translate3d(-25%, 0, 0) rotate(-5deg)
+    }
+
+    30% {
+        -webkit-transform: translate3d(20%, 0, 0) rotate(3deg);
+        transform:translate3d(20%, 0, 0) rotate(3deg)
+    }
+
+    45% {
+        -webkit-transform: translate3d(-15%, 0, 0) rotate(-3deg);
+        transform:translate3d(-15%, 0, 0) rotate(-3deg)
+    }
+
+    60% {
+        -webkit-transform: translate3d(10%, 0, 0) rotate(2deg);
+        transform:translate3d(10%, 0, 0) rotate(2deg)
+    }
+
+    75% {
+        -webkit-transform: translate3d(-5%, 0, 0) rotate(-1deg);
+        transform:translate3d(-5%, 0, 0) rotate(-1deg)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__wobble {
+    -webkit-animation-name: wobble;
+    animation-name:wobble
+}
+
+@-webkit-keyframes jello {
+    0%, 11.1%, to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    22.2% {
+        -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
+        transform:skewX(-12.5deg) skewY(-12.5deg)
+    }
+
+    33.3% {
+        -webkit-transform: skewX(6.25deg) skewY(6.25deg);
+        transform:skewX(6.25deg) skewY(6.25deg)
+    }
+
+    44.4% {
+        -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
+        transform:skewX(-3.125deg) skewY(-3.125deg)
+    }
+
+    55.5% {
+        -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
+        transform:skewX(1.5625deg) skewY(1.5625deg)
+    }
+
+    66.6% {
+        -webkit-transform: skewX(-.78125deg) skewY(-.78125deg);
+        transform:skewX(-.78125deg) skewY(-.78125deg)
+    }
+
+    77.7% {
+        -webkit-transform: skewX(.390625deg) skewY(.390625deg);
+        transform:skewX(.390625deg) skewY(.390625deg)
+    }
+
+    88.8% {
+        -webkit-transform: skewX(-.1953125deg) skewY(-.1953125deg);
+        transform:skewX(-.1953125deg) skewY(-.1953125deg)
+    }
+}
+
+@keyframes jello {
+    0%, 11.1%, to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    22.2% {
+        -webkit-transform: skewX(-12.5deg) skewY(-12.5deg);
+        transform:skewX(-12.5deg) skewY(-12.5deg)
+    }
+
+    33.3% {
+        -webkit-transform: skewX(6.25deg) skewY(6.25deg);
+        transform:skewX(6.25deg) skewY(6.25deg)
+    }
+
+    44.4% {
+        -webkit-transform: skewX(-3.125deg) skewY(-3.125deg);
+        transform:skewX(-3.125deg) skewY(-3.125deg)
+    }
+
+    55.5% {
+        -webkit-transform: skewX(1.5625deg) skewY(1.5625deg);
+        transform:skewX(1.5625deg) skewY(1.5625deg)
+    }
+
+    66.6% {
+        -webkit-transform: skewX(-.78125deg) skewY(-.78125deg);
+        transform:skewX(-.78125deg) skewY(-.78125deg)
+    }
+
+    77.7% {
+        -webkit-transform: skewX(.390625deg) skewY(.390625deg);
+        transform:skewX(.390625deg) skewY(.390625deg)
+    }
+
+    88.8% {
+        -webkit-transform: skewX(-.1953125deg) skewY(-.1953125deg);
+        transform:skewX(-.1953125deg) skewY(-.1953125deg)
+    }
+}
+
+.animate__jello {
+    -webkit-animation-name: jello;
+    animation-name: jello;
+    -webkit-transform-origin: center;
+    transform-origin:center
+}
+
+@-webkit-keyframes heartBeat {
+    0% {
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    14% {
+        -webkit-transform: scale(1.3);
+        transform:scale(1.3)
+    }
+
+    28% {
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    42% {
+        -webkit-transform: scale(1.3);
+        transform:scale(1.3)
+    }
+
+    70% {
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+@keyframes heartBeat {
+    0% {
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    14% {
+        -webkit-transform: scale(1.3);
+        transform:scale(1.3)
+    }
+
+    28% {
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    42% {
+        -webkit-transform: scale(1.3);
+        transform:scale(1.3)
+    }
+
+    70% {
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+.animate__heartBeat {
+    -webkit-animation-duration: 1.3s;
+    animation-duration: 1.3s;
+    -webkit-animation-duration: calc(var(--animate-duration) * 1.3);
+    animation-duration: calc(var(--animate-duration) * 1.3);
+    -webkit-animation-name: heartBeat;
+    animation-name: heartBeat;
+    -webkit-animation-timing-function: ease-in-out;
+    animation-timing-function:ease-in-out
+}
+
+@-webkit-keyframes backInDown {
+    0% {
+        opacity: .7;
+        -webkit-transform: translateY(-1200px) scale(.7);
+        transform:translateY(-1200px) scale(.7)
+    }
+
+    80% {
+        opacity: .7;
+        -webkit-transform: translateY(0) scale(.7);
+        transform:translateY(0) scale(.7)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+@keyframes backInDown {
+    0% {
+        opacity: .7;
+        -webkit-transform: translateY(-1200px) scale(.7);
+        transform:translateY(-1200px) scale(.7)
+    }
+
+    80% {
+        opacity: .7;
+        -webkit-transform: translateY(0) scale(.7);
+        transform:translateY(0) scale(.7)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+.animate__backInDown {
+    -webkit-animation-name: backInDown;
+    animation-name:backInDown
+}
+
+@-webkit-keyframes backInLeft {
+    0% {
+        opacity: .7;
+        -webkit-transform: translateX(-2000px) scale(.7);
+        transform:translateX(-2000px) scale(.7)
+    }
+
+    80% {
+        opacity: .7;
+        -webkit-transform: translateX(0) scale(.7);
+        transform:translateX(0) scale(.7)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+@keyframes backInLeft {
+    0% {
+        opacity: .7;
+        -webkit-transform: translateX(-2000px) scale(.7);
+        transform:translateX(-2000px) scale(.7)
+    }
+
+    80% {
+        opacity: .7;
+        -webkit-transform: translateX(0) scale(.7);
+        transform:translateX(0) scale(.7)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+.animate__backInLeft {
+    -webkit-animation-name: backInLeft;
+    animation-name:backInLeft
+}
+
+@-webkit-keyframes backInRight {
+    0% {
+        opacity: .7;
+        -webkit-transform: translateX(2000px) scale(.7);
+        transform:translateX(2000px) scale(.7)
+    }
+
+    80% {
+        opacity: .7;
+        -webkit-transform: translateX(0) scale(.7);
+        transform:translateX(0) scale(.7)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+@keyframes backInRight {
+    0% {
+        opacity: .7;
+        -webkit-transform: translateX(2000px) scale(.7);
+        transform:translateX(2000px) scale(.7)
+    }
+
+    80% {
+        opacity: .7;
+        -webkit-transform: translateX(0) scale(.7);
+        transform:translateX(0) scale(.7)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+.animate__backInRight {
+    -webkit-animation-name: backInRight;
+    animation-name:backInRight
+}
+
+@-webkit-keyframes backInUp {
+    0% {
+        opacity: .7;
+        -webkit-transform: translateY(1200px) scale(.7);
+        transform:translateY(1200px) scale(.7)
+    }
+
+    80% {
+        opacity: .7;
+        -webkit-transform: translateY(0) scale(.7);
+        transform:translateY(0) scale(.7)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+@keyframes backInUp {
+    0% {
+        opacity: .7;
+        -webkit-transform: translateY(1200px) scale(.7);
+        transform:translateY(1200px) scale(.7)
+    }
+
+    80% {
+        opacity: .7;
+        -webkit-transform: translateY(0) scale(.7);
+        transform:translateY(0) scale(.7)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+.animate__backInUp {
+    -webkit-animation-name: backInUp;
+    animation-name:backInUp
+}
+
+@-webkit-keyframes backOutDown {
+    0% {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    20% {
+        opacity: .7;
+        -webkit-transform: translateY(0) scale(.7);
+        transform:translateY(0) scale(.7)
+    }
+
+    to {
+        opacity: .7;
+        -webkit-transform: translateY(700px) scale(.7);
+        transform:translateY(700px) scale(.7)
+    }
+}
+
+@keyframes backOutDown {
+    0% {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    20% {
+        opacity: .7;
+        -webkit-transform: translateY(0) scale(.7);
+        transform:translateY(0) scale(.7)
+    }
+
+    to {
+        opacity: .7;
+        -webkit-transform: translateY(700px) scale(.7);
+        transform:translateY(700px) scale(.7)
+    }
+}
+
+.animate__backOutDown {
+    -webkit-animation-name: backOutDown;
+    animation-name:backOutDown
+}
+
+@-webkit-keyframes backOutLeft {
+    0% {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    20% {
+        opacity: .7;
+        -webkit-transform: translateX(0) scale(.7);
+        transform:translateX(0) scale(.7)
+    }
+
+    to {
+        opacity: .7;
+        -webkit-transform: translateX(-2000px) scale(.7);
+        transform:translateX(-2000px) scale(.7)
+    }
+}
+
+@keyframes backOutLeft {
+    0% {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    20% {
+        opacity: .7;
+        -webkit-transform: translateX(0) scale(.7);
+        transform:translateX(0) scale(.7)
+    }
+
+    to {
+        opacity: .7;
+        -webkit-transform: translateX(-2000px) scale(.7);
+        transform:translateX(-2000px) scale(.7)
+    }
+}
+
+.animate__backOutLeft {
+    -webkit-animation-name: backOutLeft;
+    animation-name:backOutLeft
+}
+
+@-webkit-keyframes backOutRight {
+    0% {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    20% {
+        opacity: .7;
+        -webkit-transform: translateX(0) scale(.7);
+        transform:translateX(0) scale(.7)
+    }
+
+    to {
+        opacity: .7;
+        -webkit-transform: translateX(2000px) scale(.7);
+        transform:translateX(2000px) scale(.7)
+    }
+}
+
+@keyframes backOutRight {
+    0% {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    20% {
+        opacity: .7;
+        -webkit-transform: translateX(0) scale(.7);
+        transform:translateX(0) scale(.7)
+    }
+
+    to {
+        opacity: .7;
+        -webkit-transform: translateX(2000px) scale(.7);
+        transform:translateX(2000px) scale(.7)
+    }
+}
+
+.animate__backOutRight {
+    -webkit-animation-name: backOutRight;
+    animation-name:backOutRight
+}
+
+@-webkit-keyframes backOutUp {
+    0% {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    20% {
+        opacity: .7;
+        -webkit-transform: translateY(0) scale(.7);
+        transform:translateY(0) scale(.7)
+    }
+
+    to {
+        opacity: .7;
+        -webkit-transform: translateY(-700px) scale(.7);
+        transform:translateY(-700px) scale(.7)
+    }
+}
+
+@keyframes backOutUp {
+    0% {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+
+    20% {
+        opacity: .7;
+        -webkit-transform: translateY(0) scale(.7);
+        transform:translateY(0) scale(.7)
+    }
+
+    to {
+        opacity: .7;
+        -webkit-transform: translateY(-700px) scale(.7);
+        transform:translateY(-700px) scale(.7)
+    }
+}
+
+.animate__backOutUp {
+    -webkit-animation-name: backOutUp;
+    animation-name:backOutUp
+}
+
+@-webkit-keyframes bounceIn {
+    0%, 20%, 40%, 60%, 80%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: scale3d(.3, .3, .3);
+        transform:scale3d(.3, .3, .3)
+    }
+
+    20% {
+        -webkit-transform: scale3d(1.1, 1.1, 1.1);
+        transform:scale3d(1.1, 1.1, 1.1)
+    }
+
+    40% {
+        -webkit-transform: scale3d(.9, .9, .9);
+        transform:scale3d(.9, .9, .9)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: scale3d(1.03, 1.03, 1.03);
+        transform:scale3d(1.03, 1.03, 1.03)
+    }
+
+    80% {
+        -webkit-transform: scale3d(.97, .97, .97);
+        transform:scale3d(.97, .97, .97)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+}
+
+@keyframes bounceIn {
+    0%, 20%, 40%, 60%, 80%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: scale3d(.3, .3, .3);
+        transform:scale3d(.3, .3, .3)
+    }
+
+    20% {
+        -webkit-transform: scale3d(1.1, 1.1, 1.1);
+        transform:scale3d(1.1, 1.1, 1.1)
+    }
+
+    40% {
+        -webkit-transform: scale3d(.9, .9, .9);
+        transform:scale3d(.9, .9, .9)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: scale3d(1.03, 1.03, 1.03);
+        transform:scale3d(1.03, 1.03, 1.03)
+    }
+
+    80% {
+        -webkit-transform: scale3d(.97, .97, .97);
+        transform:scale3d(.97, .97, .97)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scaleX(1);
+        transform:scaleX(1)
+    }
+}
+
+.animate__bounceIn {
+    -webkit-animation-duration: .75s;
+    animation-duration: .75s;
+    -webkit-animation-duration: calc(var(--animate-duration) * .75);
+    animation-duration: calc(var(--animate-duration) * .75);
+    -webkit-animation-name: bounceIn;
+    animation-name:bounceIn
+}
+
+@-webkit-keyframes bounceInDown {
+    0%, 60%, 75%, 90%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -3000px, 0) scaleY(3);
+        transform:translate3d(0, -3000px, 0) scaleY(3)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: translate3d(0, 25px, 0) scaleY(.9);
+        transform:translate3d(0, 25px, 0) scaleY(.9)
+    }
+
+    75% {
+        -webkit-transform: translate3d(0, -10px, 0) scaleY(.95);
+        transform:translate3d(0, -10px, 0) scaleY(.95)
+    }
+
+    90% {
+        -webkit-transform: translate3d(0, 5px, 0) scaleY(.985);
+        transform:translate3d(0, 5px, 0) scaleY(.985)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes bounceInDown {
+    0%, 60%, 75%, 90%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -3000px, 0) scaleY(3);
+        transform:translate3d(0, -3000px, 0) scaleY(3)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: translate3d(0, 25px, 0) scaleY(.9);
+        transform:translate3d(0, 25px, 0) scaleY(.9)
+    }
+
+    75% {
+        -webkit-transform: translate3d(0, -10px, 0) scaleY(.95);
+        transform:translate3d(0, -10px, 0) scaleY(.95)
+    }
+
+    90% {
+        -webkit-transform: translate3d(0, 5px, 0) scaleY(.985);
+        transform:translate3d(0, 5px, 0) scaleY(.985)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__bounceInDown {
+    -webkit-animation-name: bounceInDown;
+    animation-name:bounceInDown
+}
+
+@-webkit-keyframes bounceInLeft {
+    0%, 60%, 75%, 90%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-3000px, 0, 0) scaleX(3);
+        transform:translate3d(-3000px, 0, 0) scaleX(3)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: translate3d(25px, 0, 0) scaleX(1);
+        transform:translate3d(25px, 0, 0) scaleX(1)
+    }
+
+    75% {
+        -webkit-transform: translate3d(-10px, 0, 0) scaleX(.98);
+        transform:translate3d(-10px, 0, 0) scaleX(.98)
+    }
+
+    90% {
+        -webkit-transform: translate3d(5px, 0, 0) scaleX(.995);
+        transform:translate3d(5px, 0, 0) scaleX(.995)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes bounceInLeft {
+    0%, 60%, 75%, 90%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-3000px, 0, 0) scaleX(3);
+        transform:translate3d(-3000px, 0, 0) scaleX(3)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: translate3d(25px, 0, 0) scaleX(1);
+        transform:translate3d(25px, 0, 0) scaleX(1)
+    }
+
+    75% {
+        -webkit-transform: translate3d(-10px, 0, 0) scaleX(.98);
+        transform:translate3d(-10px, 0, 0) scaleX(.98)
+    }
+
+    90% {
+        -webkit-transform: translate3d(5px, 0, 0) scaleX(.995);
+        transform:translate3d(5px, 0, 0) scaleX(.995)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__bounceInLeft {
+    -webkit-animation-name: bounceInLeft;
+    animation-name:bounceInLeft
+}
+
+@-webkit-keyframes bounceInRight {
+    0%, 60%, 75%, 90%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(3000px, 0, 0) scaleX(3);
+        transform:translate3d(3000px, 0, 0) scaleX(3)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: translate3d(-25px, 0, 0) scaleX(1);
+        transform:translate3d(-25px, 0, 0) scaleX(1)
+    }
+
+    75% {
+        -webkit-transform: translate3d(10px, 0, 0) scaleX(.98);
+        transform:translate3d(10px, 0, 0) scaleX(.98)
+    }
+
+    90% {
+        -webkit-transform: translate3d(-5px, 0, 0) scaleX(.995);
+        transform:translate3d(-5px, 0, 0) scaleX(.995)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes bounceInRight {
+    0%, 60%, 75%, 90%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(3000px, 0, 0) scaleX(3);
+        transform:translate3d(3000px, 0, 0) scaleX(3)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: translate3d(-25px, 0, 0) scaleX(1);
+        transform:translate3d(-25px, 0, 0) scaleX(1)
+    }
+
+    75% {
+        -webkit-transform: translate3d(10px, 0, 0) scaleX(.98);
+        transform:translate3d(10px, 0, 0) scaleX(.98)
+    }
+
+    90% {
+        -webkit-transform: translate3d(-5px, 0, 0) scaleX(.995);
+        transform:translate3d(-5px, 0, 0) scaleX(.995)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__bounceInRight {
+    -webkit-animation-name: bounceInRight;
+    animation-name:bounceInRight
+}
+
+@-webkit-keyframes bounceInUp {
+    0%, 60%, 75%, 90%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 3000px, 0) scaleY(5);
+        transform:translate3d(0, 3000px, 0) scaleY(5)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: translate3d(0, -20px, 0) scaleY(.9);
+        transform:translate3d(0, -20px, 0) scaleY(.9)
+    }
+
+    75% {
+        -webkit-transform: translate3d(0, 10px, 0) scaleY(.95);
+        transform:translate3d(0, 10px, 0) scaleY(.95)
+    }
+
+    90% {
+        -webkit-transform: translate3d(0, -5px, 0) scaleY(.985);
+        transform:translate3d(0, -5px, 0) scaleY(.985)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes bounceInUp {
+    0%, 60%, 75%, 90%, to {
+        -webkit-animation-timing-function: cubic-bezier(.215, .61, .355, 1);
+        animation-timing-function:cubic-bezier(.215, .61, .355, 1)
+    }
+
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 3000px, 0) scaleY(5);
+        transform:translate3d(0, 3000px, 0) scaleY(5)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: translate3d(0, -20px, 0) scaleY(.9);
+        transform:translate3d(0, -20px, 0) scaleY(.9)
+    }
+
+    75% {
+        -webkit-transform: translate3d(0, 10px, 0) scaleY(.95);
+        transform:translate3d(0, 10px, 0) scaleY(.95)
+    }
+
+    90% {
+        -webkit-transform: translate3d(0, -5px, 0) scaleY(.985);
+        transform:translate3d(0, -5px, 0) scaleY(.985)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__bounceInUp {
+    -webkit-animation-name: bounceInUp;
+    animation-name:bounceInUp
+}
+
+@-webkit-keyframes bounceOut {
+    20% {
+        -webkit-transform: scale3d(.9, .9, .9);
+        transform:scale3d(.9, .9, .9)
+    }
+
+    50%, 55% {
+        opacity: 1;
+        -webkit-transform: scale3d(1.1, 1.1, 1.1);
+        transform:scale3d(1.1, 1.1, 1.1)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: scale3d(.3, .3, .3);
+        transform:scale3d(.3, .3, .3)
+    }
+}
+
+@keyframes bounceOut {
+    20% {
+        -webkit-transform: scale3d(.9, .9, .9);
+        transform:scale3d(.9, .9, .9)
+    }
+
+    50%, 55% {
+        opacity: 1;
+        -webkit-transform: scale3d(1.1, 1.1, 1.1);
+        transform:scale3d(1.1, 1.1, 1.1)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: scale3d(.3, .3, .3);
+        transform:scale3d(.3, .3, .3)
+    }
+}
+
+.animate__bounceOut {
+    -webkit-animation-duration: .75s;
+    animation-duration: .75s;
+    -webkit-animation-duration: calc(var(--animate-duration) * .75);
+    animation-duration: calc(var(--animate-duration) * .75);
+    -webkit-animation-name: bounceOut;
+    animation-name:bounceOut
+}
+
+@-webkit-keyframes bounceOutDown {
+    20% {
+        -webkit-transform: translate3d(0, 10px, 0) scaleY(.985);
+        transform:translate3d(0, 10px, 0) scaleY(.985)
+    }
+
+    40%, 45% {
+        opacity: 1;
+        -webkit-transform: translate3d(0, -20px, 0) scaleY(.9);
+        transform:translate3d(0, -20px, 0) scaleY(.9)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 2000px, 0) scaleY(3);
+        transform:translate3d(0, 2000px, 0) scaleY(3)
+    }
+}
+
+@keyframes bounceOutDown {
+    20% {
+        -webkit-transform: translate3d(0, 10px, 0) scaleY(.985);
+        transform:translate3d(0, 10px, 0) scaleY(.985)
+    }
+
+    40%, 45% {
+        opacity: 1;
+        -webkit-transform: translate3d(0, -20px, 0) scaleY(.9);
+        transform:translate3d(0, -20px, 0) scaleY(.9)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 2000px, 0) scaleY(3);
+        transform:translate3d(0, 2000px, 0) scaleY(3)
+    }
+}
+
+.animate__bounceOutDown {
+    -webkit-animation-name: bounceOutDown;
+    animation-name:bounceOutDown
+}
+
+@-webkit-keyframes bounceOutLeft {
+    20% {
+        opacity: 1;
+        -webkit-transform: translate3d(20px, 0, 0) scaleX(.9);
+        transform:translate3d(20px, 0, 0) scaleX(.9)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-2000px, 0, 0) scaleX(2);
+        transform:translate3d(-2000px, 0, 0) scaleX(2)
+    }
+}
+
+@keyframes bounceOutLeft {
+    20% {
+        opacity: 1;
+        -webkit-transform: translate3d(20px, 0, 0) scaleX(.9);
+        transform:translate3d(20px, 0, 0) scaleX(.9)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-2000px, 0, 0) scaleX(2);
+        transform:translate3d(-2000px, 0, 0) scaleX(2)
+    }
+}
+
+.animate__bounceOutLeft {
+    -webkit-animation-name: bounceOutLeft;
+    animation-name:bounceOutLeft
+}
+
+@-webkit-keyframes bounceOutRight {
+    20% {
+        opacity: 1;
+        -webkit-transform: translate3d(-20px, 0, 0) scaleX(.9);
+        transform:translate3d(-20px, 0, 0) scaleX(.9)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(2000px, 0, 0) scaleX(2);
+        transform:translate3d(2000px, 0, 0) scaleX(2)
+    }
+}
+
+@keyframes bounceOutRight {
+    20% {
+        opacity: 1;
+        -webkit-transform: translate3d(-20px, 0, 0) scaleX(.9);
+        transform:translate3d(-20px, 0, 0) scaleX(.9)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(2000px, 0, 0) scaleX(2);
+        transform:translate3d(2000px, 0, 0) scaleX(2)
+    }
+}
+
+.animate__bounceOutRight {
+    -webkit-animation-name: bounceOutRight;
+    animation-name:bounceOutRight
+}
+
+@-webkit-keyframes bounceOutUp {
+    20% {
+        -webkit-transform: translate3d(0, -10px, 0) scaleY(.985);
+        transform:translate3d(0, -10px, 0) scaleY(.985)
+    }
+
+    40%, 45% {
+        opacity: 1;
+        -webkit-transform: translate3d(0, 20px, 0) scaleY(.9);
+        transform:translate3d(0, 20px, 0) scaleY(.9)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -2000px, 0) scaleY(3);
+        transform:translate3d(0, -2000px, 0) scaleY(3)
+    }
+}
+
+@keyframes bounceOutUp {
+    20% {
+        -webkit-transform: translate3d(0, -10px, 0) scaleY(.985);
+        transform:translate3d(0, -10px, 0) scaleY(.985)
+    }
+
+    40%, 45% {
+        opacity: 1;
+        -webkit-transform: translate3d(0, 20px, 0) scaleY(.9);
+        transform:translate3d(0, 20px, 0) scaleY(.9)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -2000px, 0) scaleY(3);
+        transform:translate3d(0, -2000px, 0) scaleY(3)
+    }
+}
+
+.animate__bounceOutUp {
+    -webkit-animation-name: bounceOutUp;
+    animation-name:bounceOutUp
+}
+
+@-webkit-keyframes fadeIn {
+    0% {
+        opacity:0
+    }
+
+    to {
+        opacity:1
+    }
+}
+
+@keyframes fadeIn {
+    0% {
+        opacity:0
+    }
+
+    to {
+        opacity:1
+    }
+}
+
+.animate__fadeIn {
+    -webkit-animation-name: fadeIn;
+    animation-name:fadeIn
+}
+
+@-webkit-keyframes fadeInDown {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -100%, 0);
+        transform:translate3d(0, -100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInDown {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -100%, 0);
+        transform:translate3d(0, -100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInDown {
+    -webkit-animation-name: fadeInDown;
+    animation-name:fadeInDown
+}
+
+@-webkit-keyframes fadeInDownBig {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -2000px, 0);
+        transform:translate3d(0, -2000px, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInDownBig {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -2000px, 0);
+        transform:translate3d(0, -2000px, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInDownBig {
+    -webkit-animation-name: fadeInDownBig;
+    animation-name:fadeInDownBig
+}
+
+@-webkit-keyframes fadeInLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0);
+        transform:translate3d(-100%, 0, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0);
+        transform:translate3d(-100%, 0, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInLeft {
+    -webkit-animation-name: fadeInLeft;
+    animation-name:fadeInLeft
+}
+
+@-webkit-keyframes fadeInLeftBig {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-2000px, 0, 0);
+        transform:translate3d(-2000px, 0, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInLeftBig {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-2000px, 0, 0);
+        transform:translate3d(-2000px, 0, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInLeftBig {
+    -webkit-animation-name: fadeInLeftBig;
+    animation-name:fadeInLeftBig
+}
+
+@-webkit-keyframes fadeInRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0);
+        transform:translate3d(100%, 0, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0);
+        transform:translate3d(100%, 0, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInRight {
+    -webkit-animation-name: fadeInRight;
+    animation-name:fadeInRight
+}
+
+@-webkit-keyframes fadeInRightBig {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(2000px, 0, 0);
+        transform:translate3d(2000px, 0, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInRightBig {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(2000px, 0, 0);
+        transform:translate3d(2000px, 0, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInRightBig {
+    -webkit-animation-name: fadeInRightBig;
+    animation-name:fadeInRightBig
+}
+
+@-webkit-keyframes fadeInUp {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 100%, 0);
+        transform:translate3d(0, 100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInUp {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 100%, 0);
+        transform:translate3d(0, 100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInUp {
+    -webkit-animation-name: fadeInUp;
+    animation-name:fadeInUp
+}
+
+@-webkit-keyframes fadeInUpBig {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 2000px, 0);
+        transform:translate3d(0, 2000px, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInUpBig {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 2000px, 0);
+        transform:translate3d(0, 2000px, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInUpBig {
+    -webkit-animation-name: fadeInUpBig;
+    animation-name:fadeInUpBig
+}
+
+@-webkit-keyframes fadeInTopLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, -100%, 0);
+        transform:translate3d(-100%, -100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInTopLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, -100%, 0);
+        transform:translate3d(-100%, -100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInTopLeft {
+    -webkit-animation-name: fadeInTopLeft;
+    animation-name:fadeInTopLeft
+}
+
+@-webkit-keyframes fadeInTopRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, -100%, 0);
+        transform:translate3d(100%, -100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInTopRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, -100%, 0);
+        transform:translate3d(100%, -100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInTopRight {
+    -webkit-animation-name: fadeInTopRight;
+    animation-name:fadeInTopRight
+}
+
+@-webkit-keyframes fadeInBottomLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 100%, 0);
+        transform:translate3d(-100%, 100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInBottomLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 100%, 0);
+        transform:translate3d(-100%, 100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInBottomLeft {
+    -webkit-animation-name: fadeInBottomLeft;
+    animation-name:fadeInBottomLeft
+}
+
+@-webkit-keyframes fadeInBottomRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 100%, 0);
+        transform:translate3d(100%, 100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes fadeInBottomRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 100%, 0);
+        transform:translate3d(100%, 100%, 0)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__fadeInBottomRight {
+    -webkit-animation-name: fadeInBottomRight;
+    animation-name:fadeInBottomRight
+}
+
+@-webkit-keyframes fadeOut {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity:0
+    }
+}
+
+@keyframes fadeOut {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity:0
+    }
+}
+
+.animate__fadeOut {
+    -webkit-animation-name: fadeOut;
+    animation-name:fadeOut
+}
+
+@-webkit-keyframes fadeOutDown {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 100%, 0);
+        transform:translate3d(0, 100%, 0)
+    }
+}
+
+@keyframes fadeOutDown {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 100%, 0);
+        transform:translate3d(0, 100%, 0)
+    }
+}
+
+.animate__fadeOutDown {
+    -webkit-animation-name: fadeOutDown;
+    animation-name:fadeOutDown
+}
+
+@-webkit-keyframes fadeOutDownBig {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 2000px, 0);
+        transform:translate3d(0, 2000px, 0)
+    }
+}
+
+@keyframes fadeOutDownBig {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 2000px, 0);
+        transform:translate3d(0, 2000px, 0)
+    }
+}
+
+.animate__fadeOutDownBig {
+    -webkit-animation-name: fadeOutDownBig;
+    animation-name:fadeOutDownBig
+}
+
+@-webkit-keyframes fadeOutLeft {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0);
+        transform:translate3d(-100%, 0, 0)
+    }
+}
+
+@keyframes fadeOutLeft {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0);
+        transform:translate3d(-100%, 0, 0)
+    }
+}
+
+.animate__fadeOutLeft {
+    -webkit-animation-name: fadeOutLeft;
+    animation-name:fadeOutLeft
+}
+
+@-webkit-keyframes fadeOutLeftBig {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-2000px, 0, 0);
+        transform:translate3d(-2000px, 0, 0)
+    }
+}
+
+@keyframes fadeOutLeftBig {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-2000px, 0, 0);
+        transform:translate3d(-2000px, 0, 0)
+    }
+}
+
+.animate__fadeOutLeftBig {
+    -webkit-animation-name: fadeOutLeftBig;
+    animation-name:fadeOutLeftBig
+}
+
+@-webkit-keyframes fadeOutRight {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0);
+        transform:translate3d(100%, 0, 0)
+    }
+}
+
+@keyframes fadeOutRight {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0);
+        transform:translate3d(100%, 0, 0)
+    }
+}
+
+.animate__fadeOutRight {
+    -webkit-animation-name: fadeOutRight;
+    animation-name:fadeOutRight
+}
+
+@-webkit-keyframes fadeOutRightBig {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(2000px, 0, 0);
+        transform:translate3d(2000px, 0, 0)
+    }
+}
+
+@keyframes fadeOutRightBig {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(2000px, 0, 0);
+        transform:translate3d(2000px, 0, 0)
+    }
+}
+
+.animate__fadeOutRightBig {
+    -webkit-animation-name: fadeOutRightBig;
+    animation-name:fadeOutRightBig
+}
+
+@-webkit-keyframes fadeOutUp {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -100%, 0);
+        transform:translate3d(0, -100%, 0)
+    }
+}
+
+@keyframes fadeOutUp {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -100%, 0);
+        transform:translate3d(0, -100%, 0)
+    }
+}
+
+.animate__fadeOutUp {
+    -webkit-animation-name: fadeOutUp;
+    animation-name:fadeOutUp
+}
+
+@-webkit-keyframes fadeOutUpBig {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -2000px, 0);
+        transform:translate3d(0, -2000px, 0)
+    }
+}
+
+@keyframes fadeOutUpBig {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, -2000px, 0);
+        transform:translate3d(0, -2000px, 0)
+    }
+}
+
+.animate__fadeOutUpBig {
+    -webkit-animation-name: fadeOutUpBig;
+    animation-name:fadeOutUpBig
+}
+
+@-webkit-keyframes fadeOutTopLeft {
+    0% {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, -100%, 0);
+        transform:translate3d(-100%, -100%, 0)
+    }
+}
+
+@keyframes fadeOutTopLeft {
+    0% {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, -100%, 0);
+        transform:translate3d(-100%, -100%, 0)
+    }
+}
+
+.animate__fadeOutTopLeft {
+    -webkit-animation-name: fadeOutTopLeft;
+    animation-name:fadeOutTopLeft
+}
+
+@-webkit-keyframes fadeOutTopRight {
+    0% {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, -100%, 0);
+        transform:translate3d(100%, -100%, 0)
+    }
+}
+
+@keyframes fadeOutTopRight {
+    0% {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, -100%, 0);
+        transform:translate3d(100%, -100%, 0)
+    }
+}
+
+.animate__fadeOutTopRight {
+    -webkit-animation-name: fadeOutTopRight;
+    animation-name:fadeOutTopRight
+}
+
+@-webkit-keyframes fadeOutBottomRight {
+    0% {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 100%, 0);
+        transform:translate3d(100%, 100%, 0)
+    }
+}
+
+@keyframes fadeOutBottomRight {
+    0% {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 100%, 0);
+        transform:translate3d(100%, 100%, 0)
+    }
+}
+
+.animate__fadeOutBottomRight {
+    -webkit-animation-name: fadeOutBottomRight;
+    animation-name:fadeOutBottomRight
+}
+
+@-webkit-keyframes fadeOutBottomLeft {
+    0% {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 100%, 0);
+        transform:translate3d(-100%, 100%, 0)
+    }
+}
+
+@keyframes fadeOutBottomLeft {
+    0% {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 100%, 0);
+        transform:translate3d(-100%, 100%, 0)
+    }
+}
+
+.animate__fadeOutBottomLeft {
+    -webkit-animation-name: fadeOutBottomLeft;
+    animation-name:fadeOutBottomLeft
+}
+
+@-webkit-keyframes flip {
+    0% {
+        -webkit-animation-timing-function: ease-out;
+        animation-timing-function: ease-out;
+        -webkit-transform: perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn);
+        transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn)
+    }
+
+    40% {
+        -webkit-animation-timing-function: ease-out;
+        animation-timing-function: ease-out;
+        -webkit-transform: perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg);
+        transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg)
+    }
+
+    50% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg);
+        transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg)
+    }
+
+    80% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) scale3d(.95, .95, .95) translateZ(0) rotateY(0deg);
+        transform:perspective(400px) scale3d(.95, .95, .95) translateZ(0) rotateY(0deg)
+    }
+
+    to {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) scaleX(1) translateZ(0) rotateY(0deg);
+        transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg)
+    }
+}
+
+@keyframes flip {
+    0% {
+        -webkit-animation-timing-function: ease-out;
+        animation-timing-function: ease-out;
+        -webkit-transform: perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn);
+        transform:perspective(400px) scaleX(1) translateZ(0) rotateY(-1turn)
+    }
+
+    40% {
+        -webkit-animation-timing-function: ease-out;
+        animation-timing-function: ease-out;
+        -webkit-transform: perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg);
+        transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-190deg)
+    }
+
+    50% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg);
+        transform:perspective(400px) scaleX(1) translateZ(150px) rotateY(-170deg)
+    }
+
+    80% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) scale3d(.95, .95, .95) translateZ(0) rotateY(0deg);
+        transform:perspective(400px) scale3d(.95, .95, .95) translateZ(0) rotateY(0deg)
+    }
+
+    to {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) scaleX(1) translateZ(0) rotateY(0deg);
+        transform:perspective(400px) scaleX(1) translateZ(0) rotateY(0deg)
+    }
+}
+
+.animate__animated.animate__flip {
+    -webkit-animation-name: flip;
+    animation-name: flip;
+    -webkit-backface-visibility: visible;
+    backface-visibility:visible
+}
+
+@-webkit-keyframes flipInX {
+    0% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        opacity: 0;
+        -webkit-transform: perspective(400px) rotateX(90deg);
+        transform:perspective(400px) rotateX(90deg)
+    }
+
+    40% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) rotateX(-20deg);
+        transform:perspective(400px) rotateX(-20deg)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: perspective(400px) rotateX(10deg);
+        transform:perspective(400px) rotateX(10deg)
+    }
+
+    80% {
+        -webkit-transform: perspective(400px) rotateX(-5deg);
+        transform:perspective(400px) rotateX(-5deg)
+    }
+
+    to {
+        -webkit-transform: perspective(400px);
+        transform:perspective(400px)
+    }
+}
+
+@keyframes flipInX {
+    0% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        opacity: 0;
+        -webkit-transform: perspective(400px) rotateX(90deg);
+        transform:perspective(400px) rotateX(90deg)
+    }
+
+    40% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) rotateX(-20deg);
+        transform:perspective(400px) rotateX(-20deg)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: perspective(400px) rotateX(10deg);
+        transform:perspective(400px) rotateX(10deg)
+    }
+
+    80% {
+        -webkit-transform: perspective(400px) rotateX(-5deg);
+        transform:perspective(400px) rotateX(-5deg)
+    }
+
+    to {
+        -webkit-transform: perspective(400px);
+        transform:perspective(400px)
+    }
+}
+
+.animate__flipInX {
+    -webkit-animation-name: flipInX;
+    animation-name: flipInX;
+    -webkit-backface-visibility: visible !important;
+    backface-visibility:visible !important
+}
+
+@-webkit-keyframes flipInY {
+    0% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        opacity: 0;
+        -webkit-transform: perspective(400px) rotateY(90deg);
+        transform:perspective(400px) rotateY(90deg)
+    }
+
+    40% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) rotateY(-20deg);
+        transform:perspective(400px) rotateY(-20deg)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: perspective(400px) rotateY(10deg);
+        transform:perspective(400px) rotateY(10deg)
+    }
+
+    80% {
+        -webkit-transform: perspective(400px) rotateY(-5deg);
+        transform:perspective(400px) rotateY(-5deg)
+    }
+
+    to {
+        -webkit-transform: perspective(400px);
+        transform:perspective(400px)
+    }
+}
+
+@keyframes flipInY {
+    0% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        opacity: 0;
+        -webkit-transform: perspective(400px) rotateY(90deg);
+        transform:perspective(400px) rotateY(90deg)
+    }
+
+    40% {
+        -webkit-animation-timing-function: ease-in;
+        animation-timing-function: ease-in;
+        -webkit-transform: perspective(400px) rotateY(-20deg);
+        transform:perspective(400px) rotateY(-20deg)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: perspective(400px) rotateY(10deg);
+        transform:perspective(400px) rotateY(10deg)
+    }
+
+    80% {
+        -webkit-transform: perspective(400px) rotateY(-5deg);
+        transform:perspective(400px) rotateY(-5deg)
+    }
+
+    to {
+        -webkit-transform: perspective(400px);
+        transform:perspective(400px)
+    }
+}
+
+.animate__flipInY {
+    -webkit-animation-name: flipInY;
+    animation-name: flipInY;
+    -webkit-backface-visibility: visible !important;
+    backface-visibility:visible !important
+}
+
+@-webkit-keyframes flipOutX {
+    0% {
+        -webkit-transform: perspective(400px);
+        transform:perspective(400px)
+    }
+
+    30% {
+        opacity: 1;
+        -webkit-transform: perspective(400px) rotateX(-20deg);
+        transform:perspective(400px) rotateX(-20deg)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: perspective(400px) rotateX(90deg);
+        transform:perspective(400px) rotateX(90deg)
+    }
+}
+
+@keyframes flipOutX {
+    0% {
+        -webkit-transform: perspective(400px);
+        transform:perspective(400px)
+    }
+
+    30% {
+        opacity: 1;
+        -webkit-transform: perspective(400px) rotateX(-20deg);
+        transform:perspective(400px) rotateX(-20deg)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: perspective(400px) rotateX(90deg);
+        transform:perspective(400px) rotateX(90deg)
+    }
+}
+
+.animate__flipOutX {
+    -webkit-animation-duration: .75s;
+    animation-duration: .75s;
+    -webkit-animation-duration: calc(var(--animate-duration) * .75);
+    animation-duration: calc(var(--animate-duration) * .75);
+    -webkit-animation-name: flipOutX;
+    animation-name: flipOutX;
+    -webkit-backface-visibility: visible !important;
+    backface-visibility:visible !important
+}
+
+@-webkit-keyframes flipOutY {
+    0% {
+        -webkit-transform: perspective(400px);
+        transform:perspective(400px)
+    }
+
+    30% {
+        opacity: 1;
+        -webkit-transform: perspective(400px) rotateY(-15deg);
+        transform:perspective(400px) rotateY(-15deg)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: perspective(400px) rotateY(90deg);
+        transform:perspective(400px) rotateY(90deg)
+    }
+}
+
+@keyframes flipOutY {
+    0% {
+        -webkit-transform: perspective(400px);
+        transform:perspective(400px)
+    }
+
+    30% {
+        opacity: 1;
+        -webkit-transform: perspective(400px) rotateY(-15deg);
+        transform:perspective(400px) rotateY(-15deg)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: perspective(400px) rotateY(90deg);
+        transform:perspective(400px) rotateY(90deg)
+    }
+}
+
+.animate__flipOutY {
+    -webkit-animation-duration: .75s;
+    animation-duration: .75s;
+    -webkit-animation-duration: calc(var(--animate-duration) * .75);
+    animation-duration: calc(var(--animate-duration) * .75);
+    -webkit-animation-name: flipOutY;
+    animation-name: flipOutY;
+    -webkit-backface-visibility: visible !important;
+    backface-visibility:visible !important
+}
+
+@-webkit-keyframes lightSpeedInRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
+        transform:translate3d(100%, 0, 0) skewX(-30deg)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: skewX(20deg);
+        transform:skewX(20deg)
+    }
+
+    80% {
+        -webkit-transform: skewX(-5deg);
+        transform:skewX(-5deg)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes lightSpeedInRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0) skewX(-30deg);
+        transform:translate3d(100%, 0, 0) skewX(-30deg)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: skewX(20deg);
+        transform:skewX(20deg)
+    }
+
+    80% {
+        -webkit-transform: skewX(-5deg);
+        transform:skewX(-5deg)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__lightSpeedInRight {
+    -webkit-animation-name: lightSpeedInRight;
+    animation-name: lightSpeedInRight;
+    -webkit-animation-timing-function: ease-out;
+    animation-timing-function:ease-out
+}
+
+@-webkit-keyframes lightSpeedInLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0) skewX(30deg);
+        transform:translate3d(-100%, 0, 0) skewX(30deg)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: skewX(-20deg);
+        transform:skewX(-20deg)
+    }
+
+    80% {
+        -webkit-transform: skewX(5deg);
+        transform:skewX(5deg)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes lightSpeedInLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0) skewX(30deg);
+        transform:translate3d(-100%, 0, 0) skewX(30deg)
+    }
+
+    60% {
+        opacity: 1;
+        -webkit-transform: skewX(-20deg);
+        transform:skewX(-20deg)
+    }
+
+    80% {
+        -webkit-transform: skewX(5deg);
+        transform:skewX(5deg)
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__lightSpeedInLeft {
+    -webkit-animation-name: lightSpeedInLeft;
+    animation-name: lightSpeedInLeft;
+    -webkit-animation-timing-function: ease-out;
+    animation-timing-function:ease-out
+}
+
+@-webkit-keyframes lightSpeedOutRight {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
+        transform:translate3d(100%, 0, 0) skewX(30deg)
+    }
+}
+
+@keyframes lightSpeedOutRight {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0) skewX(30deg);
+        transform:translate3d(100%, 0, 0) skewX(30deg)
+    }
+}
+
+.animate__lightSpeedOutRight {
+    -webkit-animation-name: lightSpeedOutRight;
+    animation-name: lightSpeedOutRight;
+    -webkit-animation-timing-function: ease-in;
+    animation-timing-function:ease-in
+}
+
+@-webkit-keyframes lightSpeedOutLeft {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0) skewX(-30deg);
+        transform:translate3d(-100%, 0, 0) skewX(-30deg)
+    }
+}
+
+@keyframes lightSpeedOutLeft {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0) skewX(-30deg);
+        transform:translate3d(-100%, 0, 0) skewX(-30deg)
+    }
+}
+
+.animate__lightSpeedOutLeft {
+    -webkit-animation-name: lightSpeedOutLeft;
+    animation-name: lightSpeedOutLeft;
+    -webkit-animation-timing-function: ease-in;
+    animation-timing-function:ease-in
+}
+
+@-webkit-keyframes rotateIn {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(-200deg);
+        transform:rotate(-200deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes rotateIn {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(-200deg);
+        transform:rotate(-200deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__rotateIn {
+    -webkit-animation-name: rotateIn;
+    animation-name: rotateIn;
+    -webkit-transform-origin: center;
+    transform-origin:center
+}
+
+@-webkit-keyframes rotateInDownLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(-45deg);
+        transform:rotate(-45deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes rotateInDownLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(-45deg);
+        transform:rotate(-45deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__rotateInDownLeft {
+    -webkit-animation-name: rotateInDownLeft;
+    animation-name: rotateInDownLeft;
+    -webkit-transform-origin: left bottom;
+    transform-origin:left bottom
+}
+
+@-webkit-keyframes rotateInDownRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(45deg);
+        transform:rotate(45deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes rotateInDownRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(45deg);
+        transform:rotate(45deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__rotateInDownRight {
+    -webkit-animation-name: rotateInDownRight;
+    animation-name: rotateInDownRight;
+    -webkit-transform-origin: right bottom;
+    transform-origin:right bottom
+}
+
+@-webkit-keyframes rotateInUpLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(45deg);
+        transform:rotate(45deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes rotateInUpLeft {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(45deg);
+        transform:rotate(45deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__rotateInUpLeft {
+    -webkit-animation-name: rotateInUpLeft;
+    animation-name: rotateInUpLeft;
+    -webkit-transform-origin: left bottom;
+    transform-origin:left bottom
+}
+
+@-webkit-keyframes rotateInUpRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(-90deg);
+        transform:rotate(-90deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes rotateInUpRight {
+    0% {
+        opacity: 0;
+        -webkit-transform: rotate(-90deg);
+        transform:rotate(-90deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__rotateInUpRight {
+    -webkit-animation-name: rotateInUpRight;
+    animation-name: rotateInUpRight;
+    -webkit-transform-origin: right bottom;
+    transform-origin:right bottom
+}
+
+@-webkit-keyframes rotateOut {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(200deg);
+        transform:rotate(200deg)
+    }
+}
+
+@keyframes rotateOut {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(200deg);
+        transform:rotate(200deg)
+    }
+}
+
+.animate__rotateOut {
+    -webkit-animation-name: rotateOut;
+    animation-name: rotateOut;
+    -webkit-transform-origin: center;
+    transform-origin:center
+}
+
+@-webkit-keyframes rotateOutDownLeft {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(45deg);
+        transform:rotate(45deg)
+    }
+}
+
+@keyframes rotateOutDownLeft {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(45deg);
+        transform:rotate(45deg)
+    }
+}
+
+.animate__rotateOutDownLeft {
+    -webkit-animation-name: rotateOutDownLeft;
+    animation-name: rotateOutDownLeft;
+    -webkit-transform-origin: left bottom;
+    transform-origin:left bottom
+}
+
+@-webkit-keyframes rotateOutDownRight {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(-45deg);
+        transform:rotate(-45deg)
+    }
+}
+
+@keyframes rotateOutDownRight {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(-45deg);
+        transform:rotate(-45deg)
+    }
+}
+
+.animate__rotateOutDownRight {
+    -webkit-animation-name: rotateOutDownRight;
+    animation-name: rotateOutDownRight;
+    -webkit-transform-origin: right bottom;
+    transform-origin:right bottom
+}
+
+@-webkit-keyframes rotateOutUpLeft {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(-45deg);
+        transform:rotate(-45deg)
+    }
+}
+
+@keyframes rotateOutUpLeft {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(-45deg);
+        transform:rotate(-45deg)
+    }
+}
+
+.animate__rotateOutUpLeft {
+    -webkit-animation-name: rotateOutUpLeft;
+    animation-name: rotateOutUpLeft;
+    -webkit-transform-origin: left bottom;
+    transform-origin:left bottom
+}
+
+@-webkit-keyframes rotateOutUpRight {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(90deg);
+        transform:rotate(90deg)
+    }
+}
+
+@keyframes rotateOutUpRight {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: rotate(90deg);
+        transform:rotate(90deg)
+    }
+}
+
+.animate__rotateOutUpRight {
+    -webkit-animation-name: rotateOutUpRight;
+    animation-name: rotateOutUpRight;
+    -webkit-transform-origin: right bottom;
+    transform-origin:right bottom
+}
+
+@-webkit-keyframes hinge {
+    0% {
+        -webkit-animation-timing-function: ease-in-out;
+        animation-timing-function:ease-in-out
+    }
+
+    20%, 60% {
+        -webkit-animation-timing-function: ease-in-out;
+        animation-timing-function: ease-in-out;
+        -webkit-transform: rotate(80deg);
+        transform:rotate(80deg)
+    }
+
+    40%, 80% {
+        -webkit-animation-timing-function: ease-in-out;
+        animation-timing-function: ease-in-out;
+        opacity: 1;
+        -webkit-transform: rotate(60deg);
+        transform:rotate(60deg)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 700px, 0);
+        transform:translate3d(0, 700px, 0)
+    }
+}
+
+@keyframes hinge {
+    0% {
+        -webkit-animation-timing-function: ease-in-out;
+        animation-timing-function:ease-in-out
+    }
+
+    20%, 60% {
+        -webkit-animation-timing-function: ease-in-out;
+        animation-timing-function: ease-in-out;
+        -webkit-transform: rotate(80deg);
+        transform:rotate(80deg)
+    }
+
+    40%, 80% {
+        -webkit-animation-timing-function: ease-in-out;
+        animation-timing-function: ease-in-out;
+        opacity: 1;
+        -webkit-transform: rotate(60deg);
+        transform:rotate(60deg)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(0, 700px, 0);
+        transform:translate3d(0, 700px, 0)
+    }
+}
+
+.animate__hinge {
+    -webkit-animation-duration: 2s;
+    animation-duration: 2s;
+    -webkit-animation-duration: calc(var(--animate-duration) * 2);
+    animation-duration: calc(var(--animate-duration) * 2);
+    -webkit-animation-name: hinge;
+    animation-name: hinge;
+    -webkit-transform-origin: top left;
+    transform-origin:top left
+}
+
+@-webkit-keyframes jackInTheBox {
+    0% {
+        opacity: 0;
+        -webkit-transform: scale(.1) rotate(30deg);
+        transform: scale(.1) rotate(30deg);
+        -webkit-transform-origin: center bottom;
+        transform-origin:center bottom
+    }
+
+    50% {
+        -webkit-transform: rotate(-10deg);
+        transform:rotate(-10deg)
+    }
+
+    70% {
+        -webkit-transform: rotate(3deg);
+        transform:rotate(3deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+@keyframes jackInTheBox {
+    0% {
+        opacity: 0;
+        -webkit-transform: scale(.1) rotate(30deg);
+        transform: scale(.1) rotate(30deg);
+        -webkit-transform-origin: center bottom;
+        transform-origin:center bottom
+    }
+
+    50% {
+        -webkit-transform: rotate(-10deg);
+        transform:rotate(-10deg)
+    }
+
+    70% {
+        -webkit-transform: rotate(3deg);
+        transform:rotate(3deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: scale(1);
+        transform:scale(1)
+    }
+}
+
+.animate__jackInTheBox {
+    -webkit-animation-name: jackInTheBox;
+    animation-name:jackInTheBox
+}
+
+@-webkit-keyframes rollIn {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0) rotate(-120deg);
+        transform:translate3d(-100%, 0, 0) rotate(-120deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes rollIn {
+    0% {
+        opacity: 0;
+        -webkit-transform: translate3d(-100%, 0, 0) rotate(-120deg);
+        transform:translate3d(-100%, 0, 0) rotate(-120deg)
+    }
+
+    to {
+        opacity: 1;
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__rollIn {
+    -webkit-animation-name: rollIn;
+    animation-name:rollIn
+}
+
+@-webkit-keyframes rollOut {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0) rotate(120deg);
+        transform:translate3d(100%, 0, 0) rotate(120deg)
+    }
+}
+
+@keyframes rollOut {
+    0% {
+        opacity:1
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: translate3d(100%, 0, 0) rotate(120deg);
+        transform:translate3d(100%, 0, 0) rotate(120deg)
+    }
+}
+
+.animate__rollOut {
+    -webkit-animation-name: rollOut;
+    animation-name:rollOut
+}
+
+@-webkit-keyframes zoomIn {
+    0% {
+        opacity: 0;
+        -webkit-transform: scale3d(.3, .3, .3);
+        transform:scale3d(.3, .3, .3)
+    }
+
+    50% {
+        opacity:1
+    }
+}
+
+@keyframes zoomIn {
+    0% {
+        opacity: 0;
+        -webkit-transform: scale3d(.3, .3, .3);
+        transform:scale3d(.3, .3, .3)
+    }
+
+    50% {
+        opacity:1
+    }
+}
+
+.animate__zoomIn {
+    -webkit-animation-name: zoomIn;
+    animation-name:zoomIn
+}
+
+@-webkit-keyframes zoomInDown {
+    0% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+        transform:scale3d(.1, .1, .1) translate3d(0, -1000px, 0)
+    }
+
+    60% {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+        transform:scale3d(.475, .475, .475) translate3d(0, 60px, 0)
+    }
+}
+
+@keyframes zoomInDown {
+    0% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -1000px, 0);
+        transform:scale3d(.1, .1, .1) translate3d(0, -1000px, 0)
+    }
+
+    60% {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+        transform:scale3d(.475, .475, .475) translate3d(0, 60px, 0)
+    }
+}
+
+.animate__zoomInDown {
+    -webkit-animation-name: zoomInDown;
+    animation-name:zoomInDown
+}
+
+@-webkit-keyframes zoomInLeft {
+    0% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+        transform:scale3d(.1, .1, .1) translate3d(-1000px, 0, 0)
+    }
+
+    60% {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+        transform:scale3d(.475, .475, .475) translate3d(10px, 0, 0)
+    }
+}
+
+@keyframes zoomInLeft {
+    0% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(-1000px, 0, 0);
+        transform:scale3d(.1, .1, .1) translate3d(-1000px, 0, 0)
+    }
+
+    60% {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(10px, 0, 0);
+        transform:scale3d(.475, .475, .475) translate3d(10px, 0, 0)
+    }
+}
+
+.animate__zoomInLeft {
+    -webkit-animation-name: zoomInLeft;
+    animation-name:zoomInLeft
+}
+
+@-webkit-keyframes zoomInRight {
+    0% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+        transform:scale3d(.1, .1, .1) translate3d(1000px, 0, 0)
+    }
+
+    60% {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+        transform:scale3d(.475, .475, .475) translate3d(-10px, 0, 0)
+    }
+}
+
+@keyframes zoomInRight {
+    0% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(1000px, 0, 0);
+        transform:scale3d(.1, .1, .1) translate3d(1000px, 0, 0)
+    }
+
+    60% {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(-10px, 0, 0);
+        transform:scale3d(.475, .475, .475) translate3d(-10px, 0, 0)
+    }
+}
+
+.animate__zoomInRight {
+    -webkit-animation-name: zoomInRight;
+    animation-name:zoomInRight
+}
+
+@-webkit-keyframes zoomInUp {
+    0% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+        transform:scale3d(.1, .1, .1) translate3d(0, 1000px, 0)
+    }
+
+    60% {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+        transform:scale3d(.475, .475, .475) translate3d(0, -60px, 0)
+    }
+}
+
+@keyframes zoomInUp {
+    0% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 1000px, 0);
+        transform:scale3d(.1, .1, .1) translate3d(0, 1000px, 0)
+    }
+
+    60% {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+        transform:scale3d(.475, .475, .475) translate3d(0, -60px, 0)
+    }
+}
+
+.animate__zoomInUp {
+    -webkit-animation-name: zoomInUp;
+    animation-name:zoomInUp
+}
+
+@-webkit-keyframes zoomOut {
+    0% {
+        opacity:1
+    }
+
+    50% {
+        opacity: 0;
+        -webkit-transform: scale3d(.3, .3, .3);
+        transform:scale3d(.3, .3, .3)
+    }
+
+    to {
+        opacity:0
+    }
+}
+
+@keyframes zoomOut {
+    0% {
+        opacity:1
+    }
+
+    50% {
+        opacity: 0;
+        -webkit-transform: scale3d(.3, .3, .3);
+        transform:scale3d(.3, .3, .3)
+    }
+
+    to {
+        opacity:0
+    }
+}
+
+.animate__zoomOut {
+    -webkit-animation-name: zoomOut;
+    animation-name:zoomOut
+}
+
+@-webkit-keyframes zoomOutDown {
+    40% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+        transform:scale3d(.475, .475, .475) translate3d(0, -60px, 0)
+    }
+
+    to {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+        transform:scale3d(.1, .1, .1) translate3d(0, 2000px, 0)
+    }
+}
+
+@keyframes zoomOutDown {
+    40% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, -60px, 0);
+        transform:scale3d(.475, .475, .475) translate3d(0, -60px, 0)
+    }
+
+    to {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, 2000px, 0);
+        transform:scale3d(.1, .1, .1) translate3d(0, 2000px, 0)
+    }
+}
+
+.animate__zoomOutDown {
+    -webkit-animation-name: zoomOutDown;
+    animation-name: zoomOutDown;
+    -webkit-transform-origin: center bottom;
+    transform-origin:center bottom
+}
+
+@-webkit-keyframes zoomOutLeft {
+    40% {
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+        transform:scale3d(.475, .475, .475) translate3d(42px, 0, 0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
+        transform:scale(.1) translate3d(-2000px, 0, 0)
+    }
+}
+
+@keyframes zoomOutLeft {
+    40% {
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(42px, 0, 0);
+        transform:scale3d(.475, .475, .475) translate3d(42px, 0, 0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: scale(.1) translate3d(-2000px, 0, 0);
+        transform:scale(.1) translate3d(-2000px, 0, 0)
+    }
+}
+
+.animate__zoomOutLeft {
+    -webkit-animation-name: zoomOutLeft;
+    animation-name: zoomOutLeft;
+    -webkit-transform-origin: left center;
+    transform-origin:left center
+}
+
+@-webkit-keyframes zoomOutRight {
+    40% {
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+        transform:scale3d(.475, .475, .475) translate3d(-42px, 0, 0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
+        transform:scale(.1) translate3d(2000px, 0, 0)
+    }
+}
+
+@keyframes zoomOutRight {
+    40% {
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(-42px, 0, 0);
+        transform:scale3d(.475, .475, .475) translate3d(-42px, 0, 0)
+    }
+
+    to {
+        opacity: 0;
+        -webkit-transform: scale(.1) translate3d(2000px, 0, 0);
+        transform:scale(.1) translate3d(2000px, 0, 0)
+    }
+}
+
+.animate__zoomOutRight {
+    -webkit-animation-name: zoomOutRight;
+    animation-name: zoomOutRight;
+    -webkit-transform-origin: right center;
+    transform-origin:right center
+}
+
+@-webkit-keyframes zoomOutUp {
+    40% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+        transform:scale3d(.475, .475, .475) translate3d(0, 60px, 0)
+    }
+
+    to {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+        transform:scale3d(.1, .1, .1) translate3d(0, -2000px, 0)
+    }
+}
+
+@keyframes zoomOutUp {
+    40% {
+        -webkit-animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        animation-timing-function: cubic-bezier(.55, .055, .675, .19);
+        opacity: 1;
+        -webkit-transform: scale3d(.475, .475, .475) translate3d(0, 60px, 0);
+        transform:scale3d(.475, .475, .475) translate3d(0, 60px, 0)
+    }
+
+    to {
+        -webkit-animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        animation-timing-function: cubic-bezier(.175, .885, .32, 1);
+        opacity: 0;
+        -webkit-transform: scale3d(.1, .1, .1) translate3d(0, -2000px, 0);
+        transform:scale3d(.1, .1, .1) translate3d(0, -2000px, 0)
+    }
+}
+
+.animate__zoomOutUp {
+    -webkit-animation-name: zoomOutUp;
+    animation-name: zoomOutUp;
+    -webkit-transform-origin: center bottom;
+    transform-origin:center bottom
+}
+
+@-webkit-keyframes slideInDown {
+    0% {
+        -webkit-transform: translate3d(0, -100%, 0);
+        transform: translate3d(0, -100%, 0);
+        visibility:visible
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes slideInDown {
+    0% {
+        -webkit-transform: translate3d(0, -100%, 0);
+        transform: translate3d(0, -100%, 0);
+        visibility:visible
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__slideInDown {
+    -webkit-animation-name: slideInDown;
+    animation-name:slideInDown
+}
+
+@-webkit-keyframes slideInLeft {
+    0% {
+        -webkit-transform: translate3d(-100%, 0, 0);
+        transform: translate3d(-100%, 0, 0);
+        visibility:visible
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes slideInLeft {
+    0% {
+        -webkit-transform: translate3d(-100%, 0, 0);
+        transform: translate3d(-100%, 0, 0);
+        visibility:visible
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__slideInLeft {
+    -webkit-animation-name: slideInLeft;
+    animation-name:slideInLeft
+}
+
+@-webkit-keyframes slideInRight {
+    0% {
+        -webkit-transform: translate3d(100%, 0, 0);
+        transform: translate3d(100%, 0, 0);
+        visibility:visible
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes slideInRight {
+    0% {
+        -webkit-transform: translate3d(100%, 0, 0);
+        transform: translate3d(100%, 0, 0);
+        visibility:visible
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__slideInRight {
+    -webkit-animation-name: slideInRight;
+    animation-name:slideInRight
+}
+
+@-webkit-keyframes slideInUp {
+    0% {
+        -webkit-transform: translate3d(0, 100%, 0);
+        transform: translate3d(0, 100%, 0);
+        visibility:visible
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+@keyframes slideInUp {
+    0% {
+        -webkit-transform: translate3d(0, 100%, 0);
+        transform: translate3d(0, 100%, 0);
+        visibility:visible
+    }
+
+    to {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+}
+
+.animate__slideInUp {
+    -webkit-animation-name: slideInUp;
+    animation-name:slideInUp
+}
+
+@-webkit-keyframes slideOutDown {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        -webkit-transform: translate3d(0, 100%, 0);
+        transform: translate3d(0, 100%, 0);
+        visibility:hidden
+    }
+}
+
+@keyframes slideOutDown {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        -webkit-transform: translate3d(0, 100%, 0);
+        transform: translate3d(0, 100%, 0);
+        visibility:hidden
+    }
+}
+
+.animate__slideOutDown {
+    -webkit-animation-name: slideOutDown;
+    animation-name:slideOutDown
+}
+
+@-webkit-keyframes slideOutLeft {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        -webkit-transform: translate3d(-100%, 0, 0);
+        transform: translate3d(-100%, 0, 0);
+        visibility:hidden
+    }
+}
+
+@keyframes slideOutLeft {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        -webkit-transform: translate3d(-100%, 0, 0);
+        transform: translate3d(-100%, 0, 0);
+        visibility:hidden
+    }
+}
+
+.animate__slideOutLeft {
+    -webkit-animation-name: slideOutLeft;
+    animation-name:slideOutLeft
+}
+
+@-webkit-keyframes slideOutRight {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        -webkit-transform: translate3d(100%, 0, 0);
+        transform: translate3d(100%, 0, 0);
+        visibility:hidden
+    }
+}
+
+@keyframes slideOutRight {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        -webkit-transform: translate3d(100%, 0, 0);
+        transform: translate3d(100%, 0, 0);
+        visibility:hidden
+    }
+}
+
+.animate__slideOutRight {
+    -webkit-animation-name: slideOutRight;
+    animation-name:slideOutRight
+}
+
+@-webkit-keyframes slideOutUp {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        -webkit-transform: translate3d(0, -100%, 0);
+        transform: translate3d(0, -100%, 0);
+        visibility:hidden
+    }
+}
+
+@keyframes slideOutUp {
+    0% {
+        -webkit-transform: translateZ(0);
+        transform:translateZ(0)
+    }
+
+    to {
+        -webkit-transform: translate3d(0, -100%, 0);
+        transform: translate3d(0, -100%, 0);
+        visibility:hidden
+    }
+}
+
+.animate__slideOutUp {
+    -webkit-animation-name: slideOutUp;
+    animation-name: slideOutUp
+}
+

+ 32 - 0
common/cryptojs-master/README.md

@@ -0,0 +1,32 @@
+cryptojs
+--------
+
+* with little modification, converted from googlecode project [crypto-js](http://code.google.com/p/crypto-js/), and keep the source code structure of the origin project on googlecode
+* source code worked in both browser engines and node scripts. see also: [https://github.com/gwjjeff/crypto-js-npm-conv](https://github.com/gwjjeff/crypto-js-npm-conv)
+* inspiration comes from [ezcrypto](https://github.com/ElmerZhang/ezcrypto), but my tests cannot pass with his version ( ECB/pkcs7 mode ), so I made it myself
+
+### install
+
+```
+npm install cryptojs
+```
+
+### usage (example with [coffee-script](http://coffeescript.org/))
+
+```coffee
+Crypto = (require 'cryptojs').Crypto
+key = '12345678'
+us = 'Hello, 世界!'
+
+mode = new Crypto.mode.ECB Crypto.pad.pkcs7
+
+ub = Crypto.charenc.UTF8.stringToBytes us
+eb = Crypto.DES.encrypt ub, key, {asBytes: true, mode: mode}
+ehs= Crypto.util.bytesToHex eb
+
+eb2= Crypto.util.hexToBytes ehs
+ub2= Crypto.DES.decrypt eb2, key, {asBytes: true, mode: mode}
+us2= Crypto.charenc.UTF8.bytesToString ub2
+# should be same as the var 'us'
+console .log us2
+```

+ 17 - 0
common/cryptojs-master/cryptojs.js

@@ -0,0 +1,17 @@
+var Crypto = exports.Crypto = require('./lib/Crypto').Crypto;
+
+[ 'CryptoMath'
+, 'BlockModes'
+, 'DES'
+, 'AES'
+, 'HMAC'
+, 'MARC4'
+, 'MD5'
+, 'PBKDF2'
+, 'PBKDF2Async'
+, 'Rabbit'
+, 'SHA1'
+, 'SHA256'
+].forEach( function (path) {
+	require('./lib/' + path);
+});

+ 402 - 0
common/cryptojs-master/lib/AES.js

@@ -0,0 +1,402 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8;
+
+// Precomputed SBOX
+var SBOX = [ 0x63, 0x7c, 0x77, 0x7b, 0xf2, 0x6b, 0x6f, 0xc5,
+             0x30, 0x01, 0x67, 0x2b, 0xfe, 0xd7, 0xab, 0x76,
+             0xca, 0x82, 0xc9, 0x7d, 0xfa, 0x59, 0x47, 0xf0,
+             0xad, 0xd4, 0xa2, 0xaf, 0x9c, 0xa4, 0x72, 0xc0,
+             0xb7, 0xfd, 0x93, 0x26, 0x36, 0x3f, 0xf7, 0xcc,
+             0x34, 0xa5, 0xe5, 0xf1, 0x71, 0xd8, 0x31, 0x15,
+             0x04, 0xc7, 0x23, 0xc3, 0x18, 0x96, 0x05, 0x9a,
+             0x07, 0x12, 0x80, 0xe2, 0xeb, 0x27, 0xb2, 0x75,
+             0x09, 0x83, 0x2c, 0x1a, 0x1b, 0x6e, 0x5a, 0xa0,
+             0x52, 0x3b, 0xd6, 0xb3, 0x29, 0xe3, 0x2f, 0x84,
+             0x53, 0xd1, 0x00, 0xed, 0x20, 0xfc, 0xb1, 0x5b,
+             0x6a, 0xcb, 0xbe, 0x39, 0x4a, 0x4c, 0x58, 0xcf,
+             0xd0, 0xef, 0xaa, 0xfb, 0x43, 0x4d, 0x33, 0x85,
+             0x45, 0xf9, 0x02, 0x7f, 0x50, 0x3c, 0x9f, 0xa8,
+             0x51, 0xa3, 0x40, 0x8f, 0x92, 0x9d, 0x38, 0xf5,
+             0xbc, 0xb6, 0xda, 0x21, 0x10, 0xff, 0xf3, 0xd2,
+             0xcd, 0x0c, 0x13, 0xec, 0x5f, 0x97, 0x44, 0x17,
+             0xc4, 0xa7, 0x7e, 0x3d, 0x64, 0x5d, 0x19, 0x73,
+             0x60, 0x81, 0x4f, 0xdc, 0x22, 0x2a, 0x90, 0x88,
+             0x46, 0xee, 0xb8, 0x14, 0xde, 0x5e, 0x0b, 0xdb,
+             0xe0, 0x32, 0x3a, 0x0a, 0x49, 0x06, 0x24, 0x5c,
+             0xc2, 0xd3, 0xac, 0x62, 0x91, 0x95, 0xe4, 0x79,
+             0xe7, 0xc8, 0x37, 0x6d, 0x8d, 0xd5, 0x4e, 0xa9,
+             0x6c, 0x56, 0xf4, 0xea, 0x65, 0x7a, 0xae, 0x08,
+             0xba, 0x78, 0x25, 0x2e, 0x1c, 0xa6, 0xb4, 0xc6,
+             0xe8, 0xdd, 0x74, 0x1f, 0x4b, 0xbd, 0x8b, 0x8a,
+             0x70, 0x3e, 0xb5, 0x66, 0x48, 0x03, 0xf6, 0x0e,
+             0x61, 0x35, 0x57, 0xb9, 0x86, 0xc1, 0x1d, 0x9e,
+             0xe1, 0xf8, 0x98, 0x11, 0x69, 0xd9, 0x8e, 0x94,
+             0x9b, 0x1e, 0x87, 0xe9, 0xce, 0x55, 0x28, 0xdf,
+             0x8c, 0xa1, 0x89, 0x0d, 0xbf, 0xe6, 0x42, 0x68,
+             0x41, 0x99, 0x2d, 0x0f, 0xb0, 0x54, 0xbb, 0x16 ];
+
+// Compute inverse SBOX lookup table
+for (var INVSBOX = [], i = 0; i < 256; i++) INVSBOX[SBOX[i]] = i;
+
+// Compute mulitplication in GF(2^8) lookup tables
+var MULT2 = [],
+    MULT3 = [],
+    MULT9 = [],
+    MULTB = [],
+    MULTD = [],
+    MULTE = [];
+
+function xtime(a, b) {
+	for (var result = 0, i = 0; i < 8; i++) {
+		if (b & 1) result ^= a;
+		var hiBitSet = a & 0x80;
+		a = (a << 1) & 0xFF;
+		if (hiBitSet) a ^= 0x1b;
+		b >>>= 1;
+	}
+	return result;
+}
+
+for (var i = 0; i < 256; i++) {
+	MULT2[i] = xtime(i,2);
+	MULT3[i] = xtime(i,3);
+	MULT9[i] = xtime(i,9);
+	MULTB[i] = xtime(i,0xB);
+	MULTD[i] = xtime(i,0xD);
+	MULTE[i] = xtime(i,0xE);
+}
+
+// Precomputed RCon lookup
+var RCON = [0x00, 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1b, 0x36];
+
+// Inner state
+var state = [[], [], [], []],
+    keylength,
+    nrounds,
+    keyschedule;
+
+var AES = C.AES = {
+
+	/**
+	 * Public API
+	 */
+
+	encrypt: function (message, password, options) {
+
+		options = options || {};
+
+		// Determine mode
+		var mode = options.mode || new C.mode.OFB;
+
+		// Allow mode to override options
+		if (mode.fixOptions) mode.fixOptions(options);
+
+		var
+
+			// Convert to bytes if message is a string
+			m = (
+				message.constructor == String ?
+				UTF8.stringToBytes(message) :
+				message
+			),
+
+			// Generate random IV
+			iv = options.iv || util.randomBytes(AES._blocksize * 4),
+
+			// Generate key
+			k = (
+				password.constructor == String ?
+				// Derive key from passphrase
+				C.PBKDF2(password, iv, 32, { asBytes: true }) :
+				// else, assume byte array representing cryptographic key
+				password
+			);
+
+		// Encrypt
+		AES._init(k);
+		mode.encrypt(AES, m, iv);
+
+		// Return ciphertext
+		m = options.iv ? m : iv.concat(m);
+		return (options && options.asBytes) ? m : util.bytesToBase64(m);
+
+	},
+
+	decrypt: function (ciphertext, password, options) {
+
+		options = options || {};
+
+		// Determine mode
+		var mode = options.mode || new C.mode.OFB;
+
+		// Allow mode to override options
+		if (mode.fixOptions) mode.fixOptions(options);
+
+		var
+
+			// Convert to bytes if ciphertext is a string
+			c = (
+				ciphertext.constructor == String ?
+				util.base64ToBytes(ciphertext):
+			    ciphertext
+			),
+
+			// Separate IV and message
+			iv = options.iv || c.splice(0, AES._blocksize * 4),
+
+			// Generate key
+			k = (
+				password.constructor == String ?
+				// Derive key from passphrase
+				C.PBKDF2(password, iv, 32, { asBytes: true }) :
+				// else, assume byte array representing cryptographic key
+				password
+			);
+
+		// Decrypt
+		AES._init(k);
+		mode.decrypt(AES, c, iv);
+
+		// Return plaintext
+		return (options && options.asBytes) ? c : UTF8.bytesToString(c);
+
+	},
+
+
+	/**
+	 * Package private methods and properties
+	 */
+
+	_blocksize: 4,
+
+	_encryptblock: function (m, offset) {
+
+		// Set input
+		for (var row = 0; row < AES._blocksize; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] = m[offset + col * 4 + row];
+		}
+
+		// Add round key
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] ^= keyschedule[col][row];
+		}
+
+		for (var round = 1; round < nrounds; round++) {
+
+			// Sub bytes
+			for (var row = 0; row < 4; row++) {
+				for (var col = 0; col < 4; col++)
+					state[row][col] = SBOX[state[row][col]];
+			}
+
+			// Shift rows
+			state[1].push(state[1].shift());
+			state[2].push(state[2].shift());
+			state[2].push(state[2].shift());
+			state[3].unshift(state[3].pop());
+
+			// Mix columns
+			for (var col = 0; col < 4; col++) {
+
+				var s0 = state[0][col],
+				    s1 = state[1][col],
+				    s2 = state[2][col],
+				    s3 = state[3][col];
+
+				state[0][col] = MULT2[s0] ^ MULT3[s1] ^ s2 ^ s3;
+				state[1][col] = s0 ^ MULT2[s1] ^ MULT3[s2] ^ s3;
+				state[2][col] = s0 ^ s1 ^ MULT2[s2] ^ MULT3[s3];
+				state[3][col] = MULT3[s0] ^ s1 ^ s2 ^ MULT2[s3];
+
+			}
+
+			// Add round key
+			for (var row = 0; row < 4; row++) {
+				for (var col = 0; col < 4; col++)
+					state[row][col] ^= keyschedule[round * 4 + col][row];
+			}
+
+		}
+
+		// Sub bytes
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] = SBOX[state[row][col]];
+		}
+
+		// Shift rows
+		state[1].push(state[1].shift());
+		state[2].push(state[2].shift());
+		state[2].push(state[2].shift());
+		state[3].unshift(state[3].pop());
+
+		// Add round key
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] ^= keyschedule[nrounds * 4 + col][row];
+		}
+
+		// Set output
+		for (var row = 0; row < AES._blocksize; row++) {
+			for (var col = 0; col < 4; col++)
+				m[offset + col * 4 + row] = state[row][col];
+		}
+
+	},
+
+	_decryptblock: function (c, offset) {
+
+		// Set input
+		for (var row = 0; row < AES._blocksize; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] = c[offset + col * 4 + row];
+		}
+
+		// Add round key
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] ^= keyschedule[nrounds * 4 + col][row];
+		}
+
+		for (var round = 1; round < nrounds; round++) {
+
+			// Inv shift rows
+			state[1].unshift(state[1].pop());
+			state[2].push(state[2].shift());
+			state[2].push(state[2].shift());
+			state[3].push(state[3].shift());
+
+			// Inv sub bytes
+			for (var row = 0; row < 4; row++) {
+				for (var col = 0; col < 4; col++)
+					state[row][col] = INVSBOX[state[row][col]];
+			}
+
+			// Add round key
+			for (var row = 0; row < 4; row++) {
+				for (var col = 0; col < 4; col++)
+					state[row][col] ^= keyschedule[(nrounds - round) * 4 + col][row];
+			}
+
+			// Inv mix columns
+			for (var col = 0; col < 4; col++) {
+
+				var s0 = state[0][col],
+				    s1 = state[1][col],
+				    s2 = state[2][col],
+				    s3 = state[3][col];
+
+				state[0][col] = MULTE[s0] ^ MULTB[s1] ^ MULTD[s2] ^ MULT9[s3];
+				state[1][col] = MULT9[s0] ^ MULTE[s1] ^ MULTB[s2] ^ MULTD[s3];
+				state[2][col] = MULTD[s0] ^ MULT9[s1] ^ MULTE[s2] ^ MULTB[s3];
+				state[3][col] = MULTB[s0] ^ MULTD[s1] ^ MULT9[s2] ^ MULTE[s3];
+
+			}
+
+		}
+
+		// Inv shift rows
+		state[1].unshift(state[1].pop());
+		state[2].push(state[2].shift());
+		state[2].push(state[2].shift());
+		state[3].push(state[3].shift());
+
+		// Inv sub bytes
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] = INVSBOX[state[row][col]];
+		}
+
+		// Add round key
+		for (var row = 0; row < 4; row++) {
+			for (var col = 0; col < 4; col++)
+				state[row][col] ^= keyschedule[col][row];
+		}
+
+		// Set output
+		for (var row = 0; row < AES._blocksize; row++) {
+			for (var col = 0; col < 4; col++)
+				c[offset + col * 4 + row] = state[row][col];
+		}
+
+	},
+
+
+	/**
+	 * Private methods
+	 */
+
+	_init: function (k) {
+		keylength = k.length / 4;
+		nrounds = keylength + 6;
+		AES._keyexpansion(k);
+	},
+
+	// Generate a key schedule
+	_keyexpansion: function (k) {
+
+		keyschedule = [];
+
+		for (var row = 0; row < keylength; row++) {
+			keyschedule[row] = [
+				k[row * 4],
+				k[row * 4 + 1],
+				k[row * 4 + 2],
+				k[row * 4 + 3]
+			];
+		}
+
+		for (var row = keylength; row < AES._blocksize * (nrounds + 1); row++) {
+
+			var temp = [
+				keyschedule[row - 1][0],
+				keyschedule[row - 1][1],
+				keyschedule[row - 1][2],
+				keyschedule[row - 1][3]
+			];
+
+			if (row % keylength == 0) {
+
+				// Rot word
+				temp.push(temp.shift());
+
+				// Sub word
+				temp[0] = SBOX[temp[0]];
+				temp[1] = SBOX[temp[1]];
+				temp[2] = SBOX[temp[2]];
+				temp[3] = SBOX[temp[3]];
+
+				temp[0] ^= RCON[row / keylength];
+
+			} else if (keylength > 6 && row % keylength == 4) {
+
+				// Sub word
+				temp[0] = SBOX[temp[0]];
+				temp[1] = SBOX[temp[1]];
+				temp[2] = SBOX[temp[2]];
+				temp[3] = SBOX[temp[3]];
+
+			}
+
+			keyschedule[row] = [
+				keyschedule[row - keylength][0] ^ temp[0],
+				keyschedule[row - keylength][1] ^ temp[1],
+				keyschedule[row - keylength][2] ^ temp[2],
+				keyschedule[row - keylength][3] ^ temp[3]
+			];
+
+		}
+
+	}
+
+};
+
+})();

+ 378 - 0
common/cryptojs-master/lib/BlockModes.js

@@ -0,0 +1,378 @@
+/*!
+ * Crypto-JS contribution from Simon Greatrix
+ */
+
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Create pad namespace
+var C_pad = C.pad = {};
+
+// Calculate the number of padding bytes required.
+function _requiredPadding(cipher, message) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+    var reqd = blockSizeInBytes - message.length % blockSizeInBytes;
+    return reqd;
+};
+
+// Remove padding when the final byte gives the number of padding bytes.
+var _unpadLength = function (message) {
+        var pad = message.pop();
+        for (var i = 1; i < pad; i++) {
+            message.pop();
+        }
+    };
+
+// No-operation padding, used for stream ciphers
+C_pad.NoPadding = {
+        pad : function (cipher,message) {},
+        unpad : function (message) {}
+    };
+
+// Zero Padding.
+//
+// If the message is not an exact number of blocks, the final block is
+// completed with 0x00 bytes. There is no unpadding.
+C_pad.ZeroPadding = {
+    pad : function (cipher, message) {
+        var blockSizeInBytes = cipher._blocksize * 4;
+        var reqd = message.length % blockSizeInBytes;
+        if( reqd!=0 ) {
+            for(reqd = blockSizeInBytes - reqd; reqd>0; reqd--) {
+                message.push(0x00);
+            }
+        }
+    },
+
+    unpad : function (message) {}
+};
+
+// ISO/IEC 7816-4 padding.
+//
+// Pads the plain text with an 0x80 byte followed by as many 0x00
+// bytes are required to complete the block.
+C_pad.iso7816 = {
+    pad : function (cipher, message) {
+        var reqd = _requiredPadding(cipher, message);
+        message.push(0x80);
+        for (; reqd > 1; reqd--) {
+            message.push(0x00);
+        }
+    },
+
+    unpad : function (message) {
+        while (message.pop() != 0x80) {}
+    }
+};
+
+// ANSI X.923 padding
+//
+// The final block is padded with zeros except for the last byte of the
+// last block which contains the number of padding bytes.
+C_pad.ansix923 = {
+    pad : function (cipher, message) {
+        var reqd = _requiredPadding(cipher, message);
+        for (var i = 1; i < reqd; i++) {
+            message.push(0x00);
+        }
+        message.push(reqd);
+    },
+
+    unpad : _unpadLength
+};
+
+// ISO 10126
+//
+// The final block is padded with random bytes except for the last
+// byte of the last block which contains the number of padding bytes.
+C_pad.iso10126 = {
+    pad : function (cipher, message) {
+        var reqd = _requiredPadding(cipher, message);
+        for (var i = 1; i < reqd; i++) {
+            message.push(Math.floor(Math.random() * 256));
+        }
+        message.push(reqd);
+    },
+
+    unpad : _unpadLength
+};
+
+// PKCS7 padding
+//
+// PKCS7 is described in RFC 5652. Padding is in whole bytes. The
+// value of each added byte is the number of bytes that are added,
+// i.e. N bytes, each of value N are added.
+C_pad.pkcs7 = {
+    pad : function (cipher, message) {
+        var reqd = _requiredPadding(cipher, message);
+        for (var i = 0; i < reqd; i++) {
+            message.push(reqd);
+        }
+    },
+
+    unpad : _unpadLength
+};
+
+// Create mode namespace
+var C_mode = C.mode = {};
+
+/**
+ * Mode base "class".
+ */
+var Mode = C_mode.Mode = function (padding) {
+    if (padding) {
+        this._padding = padding;
+    }
+};
+
+Mode.prototype = {
+    encrypt: function (cipher, m, iv) {
+        this._padding.pad(cipher, m);
+        this._doEncrypt(cipher, m, iv);
+    },
+
+    decrypt: function (cipher, m, iv) {
+        this._doDecrypt(cipher, m, iv);
+        this._padding.unpad(m);
+    },
+
+    // Default padding
+    _padding: C_pad.iso7816
+};
+
+
+/**
+ * Electronic Code Book mode.
+ * 
+ * ECB applies the cipher directly against each block of the input.
+ * 
+ * ECB does not require an initialization vector.
+ */
+var ECB = C_mode.ECB = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var ECB_prototype = ECB.prototype = new Mode;
+
+// Concrete steps for Mode template
+ECB_prototype._doEncrypt = function (cipher, m, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+    // Encrypt each block
+    for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {
+        cipher._encryptblock(m, offset);
+    }
+};
+ECB_prototype._doDecrypt = function (cipher, c, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+    // Decrypt each block
+    for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {
+        cipher._decryptblock(c, offset);
+    }
+};
+
+// ECB never uses an IV
+ECB_prototype.fixOptions = function (options) {
+    options.iv = [];
+};
+
+
+/**
+ * Cipher block chaining
+ * 
+ * The first block is XORed with the IV. Subsequent blocks are XOR with the
+ * previous cipher output.
+ */
+var CBC = C_mode.CBC = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var CBC_prototype = CBC.prototype = new Mode;
+
+// Concrete steps for Mode template
+CBC_prototype._doEncrypt = function (cipher, m, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+
+    // Encrypt each block
+    for (var offset = 0; offset < m.length; offset += blockSizeInBytes) {
+        if (offset == 0) {
+            // XOR first block using IV
+            for (var i = 0; i < blockSizeInBytes; i++)
+            m[i] ^= iv[i];
+        } else {
+            // XOR this block using previous crypted block
+            for (var i = 0; i < blockSizeInBytes; i++)
+            m[offset + i] ^= m[offset + i - blockSizeInBytes];
+        }
+        // Encrypt block
+        cipher._encryptblock(m, offset);
+    }
+};
+CBC_prototype._doDecrypt = function (cipher, c, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+
+    // At the start, the previously crypted block is the IV
+    var prevCryptedBlock = iv;
+
+    // Decrypt each block
+    for (var offset = 0; offset < c.length; offset += blockSizeInBytes) {
+        // Save this crypted block
+        var thisCryptedBlock = c.slice(offset, offset + blockSizeInBytes);
+        // Decrypt block
+        cipher._decryptblock(c, offset);
+        // XOR decrypted block using previous crypted block
+        for (var i = 0; i < blockSizeInBytes; i++) {
+            c[offset + i] ^= prevCryptedBlock[i];
+        }
+        prevCryptedBlock = thisCryptedBlock;
+    }
+};
+
+
+/**
+ * Cipher feed back
+ * 
+ * The cipher output is XORed with the plain text to produce the cipher output,
+ * which is then fed back into the cipher to produce a bit pattern to XOR the
+ * next block with.
+ * 
+ * This is a stream cipher mode and does not require padding.
+ */
+var CFB = C_mode.CFB = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var CFB_prototype = CFB.prototype = new Mode;
+
+// Override padding
+CFB_prototype._padding = C_pad.NoPadding;
+
+// Concrete steps for Mode template
+CFB_prototype._doEncrypt = function (cipher, m, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4,
+        keystream = iv.slice(0);
+
+    // Encrypt each byte
+    for (var i = 0; i < m.length; i++) {
+
+        var j = i % blockSizeInBytes;
+        if (j == 0) cipher._encryptblock(keystream, 0);
+
+        m[i] ^= keystream[j];
+        keystream[j] = m[i];
+    }
+};
+CFB_prototype._doDecrypt = function (cipher, c, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4,
+        keystream = iv.slice(0);
+
+    // Encrypt each byte
+    for (var i = 0; i < c.length; i++) {
+
+        var j = i % blockSizeInBytes;
+        if (j == 0) cipher._encryptblock(keystream, 0);
+
+        var b = c[i];
+        c[i] ^= keystream[j];
+        keystream[j] = b;
+    }
+};
+
+
+/**
+ * Output feed back
+ * 
+ * The cipher repeatedly encrypts its own output. The output is XORed with the
+ * plain text to produce the cipher text.
+ * 
+ * This is a stream cipher mode and does not require padding.
+ */
+var OFB = C_mode.OFB = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var OFB_prototype = OFB.prototype = new Mode;
+
+// Override padding
+OFB_prototype._padding = C_pad.NoPadding;
+
+// Concrete steps for Mode template
+OFB_prototype._doEncrypt = function (cipher, m, iv) {
+
+    var blockSizeInBytes = cipher._blocksize * 4,
+        keystream = iv.slice(0);
+
+    // Encrypt each byte
+    for (var i = 0; i < m.length; i++) {
+
+        // Generate keystream
+        if (i % blockSizeInBytes == 0)
+            cipher._encryptblock(keystream, 0);
+
+        // Encrypt byte
+        m[i] ^= keystream[i % blockSizeInBytes];
+
+    }
+};
+OFB_prototype._doDecrypt = OFB_prototype._doEncrypt;
+
+/**
+ * Counter
+ * @author Gergely Risko
+ *
+ * After every block the last 4 bytes of the IV is increased by one
+ * with carry and that IV is used for the next block.
+ *
+ * This is a stream cipher mode and does not require padding.
+ */
+var CTR = C_mode.CTR = function () {
+    // Call parent constructor
+    Mode.apply(this, arguments);
+};
+
+// Inherit from Mode
+var CTR_prototype = CTR.prototype = new Mode;
+
+// Override padding
+CTR_prototype._padding = C_pad.NoPadding;
+
+CTR_prototype._doEncrypt = function (cipher, m, iv) {
+    var blockSizeInBytes = cipher._blocksize * 4;
+    var counter = iv.slice(0);
+
+    for (var i = 0; i < m.length;) {
+        // do not lose iv
+        var keystream = counter.slice(0);
+
+        // Generate keystream for next block
+        cipher._encryptblock(keystream, 0);
+
+        // XOR keystream with block
+        for (var j = 0; i < m.length && j < blockSizeInBytes; j++, i++) {
+            m[i] ^= keystream[j];
+        }
+
+        // Increase counter
+        if(++(counter[blockSizeInBytes-1]) == 256) {
+            counter[blockSizeInBytes-1] = 0;
+            if(++(counter[blockSizeInBytes-2]) == 256) {
+                counter[blockSizeInBytes-2] = 0;
+                if(++(counter[blockSizeInBytes-3]) == 256) {
+                    counter[blockSizeInBytes-3] = 0;
+                    ++(counter[blockSizeInBytes-4]);
+                }
+            }
+        }
+    }
+};
+CTR_prototype._doDecrypt = CTR_prototype._doEncrypt;
+
+})();

+ 155 - 0
common/cryptojs-master/lib/Crypto.js

@@ -0,0 +1,155 @@
+if (typeof Crypto == "undefined" || ! Crypto.util)
+{
+(function(){
+
+var base64map = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
+
+// Global Crypto object
+// with browser window or with node module
+var Crypto = (typeof window === 'undefined') ? exports.Crypto = {} : window.Crypto = {}; 
+
+// Crypto utilities
+var util = Crypto.util = {
+
+	// Bit-wise rotate left
+	rotl: function (n, b) {
+		return (n << b) | (n >>> (32 - b));
+	},
+
+	// Bit-wise rotate right
+	rotr: function (n, b) {
+		return (n << (32 - b)) | (n >>> b);
+	},
+
+	// Swap big-endian to little-endian and vice versa
+	endian: function (n) {
+
+		// If number given, swap endian
+		if (n.constructor == Number) {
+			return util.rotl(n,  8) & 0x00FF00FF |
+			       util.rotl(n, 24) & 0xFF00FF00;
+		}
+
+		// Else, assume array and swap all items
+		for (var i = 0; i < n.length; i++)
+			n[i] = util.endian(n[i]);
+		return n;
+
+	},
+
+	// Generate an array of any length of random bytes
+	randomBytes: function (n) {
+		for (var bytes = []; n > 0; n--)
+			bytes.push(Math.floor(Math.random() * 256));
+		return bytes;
+	},
+
+	// Convert a byte array to big-endian 32-bit words
+	bytesToWords: function (bytes) {
+		for (var words = [], i = 0, b = 0; i < bytes.length; i++, b += 8)
+			words[b >>> 5] |= (bytes[i] & 0xFF) << (24 - b % 32);
+		return words;
+	},
+
+	// Convert big-endian 32-bit words to a byte array
+	wordsToBytes: function (words) {
+		for (var bytes = [], b = 0; b < words.length * 32; b += 8)
+			bytes.push((words[b >>> 5] >>> (24 - b % 32)) & 0xFF);
+		return bytes;
+	},
+
+	// Convert a byte array to a hex string
+	bytesToHex: function (bytes) {
+		for (var hex = [], i = 0; i < bytes.length; i++) {
+			hex.push((bytes[i] >>> 4).toString(16));
+			hex.push((bytes[i] & 0xF).toString(16));
+		}
+		return hex.join("");
+	},
+
+	// Convert a hex string to a byte array
+	hexToBytes: function (hex) {
+		for (var bytes = [], c = 0; c < hex.length; c += 2)
+			bytes.push(parseInt(hex.substr(c, 2), 16));
+		return bytes;
+	},
+
+	// Convert a byte array to a base-64 string
+	bytesToBase64: function (bytes) {
+
+		// Use browser-native function if it exists
+		if (typeof btoa == "function") return btoa(Binary.bytesToString(bytes));
+
+		for(var base64 = [], i = 0; i < bytes.length; i += 3) {
+			var triplet = (bytes[i] << 16) | (bytes[i + 1] << 8) | bytes[i + 2];
+			for (var j = 0; j < 4; j++) {
+				if (i * 8 + j * 6 <= bytes.length * 8)
+					base64.push(base64map.charAt((triplet >>> 6 * (3 - j)) & 0x3F));
+				else base64.push("=");
+			}
+		}
+
+		return base64.join("");
+
+	},
+
+	// Convert a base-64 string to a byte array
+	base64ToBytes: function (base64) {
+
+		// Use browser-native function if it exists
+		if (typeof atob == "function") return Binary.stringToBytes(atob(base64));
+
+		// Remove non-base-64 characters
+		base64 = base64.replace(/[^A-Z0-9+\/]/ig, "");
+
+		for (var bytes = [], i = 0, imod4 = 0; i < base64.length; imod4 = ++i % 4) {
+			if (imod4 == 0) continue;
+			bytes.push(((base64map.indexOf(base64.charAt(i - 1)) & (Math.pow(2, -2 * imod4 + 8) - 1)) << (imod4 * 2)) |
+			           (base64map.indexOf(base64.charAt(i)) >>> (6 - imod4 * 2)));
+		}
+
+		return bytes;
+
+	}
+
+};
+
+// Crypto character encodings
+var charenc = Crypto.charenc = {};
+
+// UTF-8 encoding
+var UTF8 = charenc.UTF8 = {
+
+	// Convert a string to a byte array
+	stringToBytes: function (str) {
+		return Binary.stringToBytes(unescape(encodeURIComponent(str)));
+	},
+
+	// Convert a byte array to a string
+	bytesToString: function (bytes) {
+		return decodeURIComponent(escape(Binary.bytesToString(bytes)));
+	}
+
+};
+
+// Binary encoding
+var Binary = charenc.Binary = {
+
+	// Convert a string to a byte array
+	stringToBytes: function (str) {
+		for (var bytes = [], i = 0; i < str.length; i++)
+			bytes.push(str.charCodeAt(i) & 0xFF);
+		return bytes;
+	},
+
+	// Convert a byte array to a string
+	bytesToString: function (bytes) {
+		for (var str = [], i = 0; i < bytes.length; i++)
+			str.push(String.fromCharCode(bytes[i]));
+		return str.join("");
+	}
+
+};
+
+})();
+}

+ 37 - 0
common/cryptojs-master/lib/CryptoMath.js

@@ -0,0 +1,37 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcut
+var util = C.util;
+
+// Convert n to unsigned 32-bit integer
+util.u32 = function (n) {
+	return n >>> 0;
+};
+
+// Unsigned 32-bit addition
+util.add = function () {
+	var result = this.u32(arguments[0]);
+	for (var i = 1; i < arguments.length; i++)
+		result = this.u32(result + this.u32(arguments[i]));
+	return result;
+};
+
+// Unsigned 32-bit multiplication
+util.mult = function (m, n) {
+	return this.add((n & 0xFFFF0000) * m,
+			(n & 0x0000FFFF) * m);
+};
+
+// Unsigned 32-bit greater than (>) comparison
+util.gt = function (m, n) {
+	return this.u32(m) > this.u32(n);
+};
+
+// Unsigned 32-bit less than (<) comparison
+util.lt = function (m, n) {
+	return this.u32(m) < this.u32(n);
+};
+
+})();

+ 1003 - 0
common/cryptojs-master/lib/DES.js

@@ -0,0 +1,1003 @@
+/**
+ * Definition of Data Encryption Standard (DES) taken from:
+ * http://www.itl.nist.gov/fipspubs/fip46-2.htm
+ */
+
+(function() {
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+    // Shortcuts
+    var util = C.util, charenc = C.charenc, UTF8 = charenc.UTF8;
+
+    /***************************************************************************
+     * 
+     * DES Key Schedule.
+     * 
+     * The Key consists of 16 sub-keys of 48 bits each. As each sub-key is
+     * applied to an expanded 32-bit value where each 4 bits of input is
+     * expanded into 6 bits of output the sub-key can be broken down into 8
+     * 32-bit values which allows the key to be used without expansion.
+     * 
+     * To create the 16 sub-keys, 56 bits are selected from the input 64 bit key
+     * according to <i>PC1</i>. Each sub-key is generated by left rotating the
+     * bits a different amount and then selecting 48 bits according to <i>PC2</i>.
+     * 
+     **************************************************************************/
+
+    var KeySchedule;
+
+    /**
+     * Representation of a DES key schedule.
+     * 
+     * @param {Array
+     *            of 8 bytes} key The cipher key
+     * 
+     * @constructor
+     */
+    KeySchedule = function(key) {
+        /**
+         * The schedule of 16 keys
+         */
+        this.keys = new Array(16);
+        this._initialiseKeys(key);
+    };
+
+    /**
+     * Permuted Choice 1 (PC1) byte offsets into the key. Each of the 56 entries
+     * selects one bit of DES's 56 bit key.
+     * <p>
+     * 
+     * <pre>
+     * The PC1 is defined as:
+     * 
+     * 57,   49,    41,   33,    25,    17,    9,
+     *  1,   58,    50,   42,    34,    26,   18,
+     * 10,    2,    59,   51,    43,    35,   27,
+     * 19,   11,     3,   60,    52,    44,   36,
+     * 63,   55,    47,   39,    31,    23,   15,
+     *  7,   62,    54,   46,    38,    30,   22,
+     * 14,    6,    61,   53,    45,    37,   29,
+     * 21,   13,     5,   28,    20,    12,    4
+     * </pre>
+     * 
+     * We represent this as an offset into an 8-byte array and a bit mask upon
+     * that byte. For example 57=(7*8)+1 so is the first (MSB) of the 7th byte.
+     * 
+     * @constant
+     */
+    KeySchedule.PC1_offsets = [ 7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0,
+            7, 6, 5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 7, 6, 5, 4, 3, 2, 1, 0, 7, 6,
+            5, 4, 3, 2, 1, 0, 7, 6, 5, 4, 3, 2, 1, 0, 3, 2, 1, 0 ];
+
+    /**
+     * Permuted Choice 1 (PC1) bit masks. Each of the 56 entries selects one bit
+     * of DES's 56 bit key.
+     * 
+     * @constant
+     */
+    KeySchedule.PC1_masks = [ 128, 128, 128, 128, 128, 128, 128, 128, 64, 64,
+            64, 64, 64, 64, 64, 64, 32, 32, 32, 32, 32, 32, 32, 32, 16, 16, 16,
+            16, 2, 2, 2, 2, 2, 2, 2, 2, 4, 4, 4, 4, 4, 4, 4, 4, 8, 8, 8, 8, 8,
+            8, 8, 8, 16, 16, 16, 16 ];
+
+    /**
+     * Permuted Choice 2 (PC2) selects the active 48 bits from the 56 bits of
+     * the key.
+     * <p>
+     * 
+     * <pre>
+     * The PC2 is defined as:
+     * 
+     * 14,   17,   11,   24,    1,    5,
+     *  3,   28,   15,    6,   21,   10,
+     * 23,   19,   12,    4,   26,    8,
+     * 16,    7,   27,   20,   13,    2,
+     * 41,   52,   31,   37,   47,   55,
+     * 30,   40,   51,   45,   33,   48,
+     * 44,   49,   39,   56,   34,   53,
+     * 46,   42,   50,   36,   29,   32
+     * </pre>
+     * 
+     * We invert the choice to specify what each bit adds to each 6-bit value of
+     * the key. For example, bit 1 is the 5th bit selected so this add 2 to the
+     * first 6-bit value.
+     * 
+     * @constant
+     */
+    KeySchedule.PC2_offsets1 = [ 0, 3, 1, 2, 0, 1, 3, 2, 0, 1, 0, 2, 3, 0, 1,
+            3, 0, 0, 2, 3, 1, 0, 2, 0, 0, 2, 3, 1 ];
+
+    /**
+     * PC2 offsets for 2nd block.
+     * 
+     * @constant
+     */
+    KeySchedule.PC2_offsets2 = [ 7, 5, 4, 7, 5, 6, 0, 7, 4, 0, 6, 5, 4, 7, 0,
+            6, 5, 7, 4, 5, 6, 7, 5, 4, 6, 0, 4, 6 ];
+
+    /**
+     * Permuted Choice 2 (PC2) masks for 1st block.
+     * 
+     * @constant
+     */
+    KeySchedule.PC2_masks1 = [ 2, 1, 32, 4, 1, 4, 16, 1, 0, 1, 8, 8, 2, 32, 8,
+            32, 16, 0, 16, 4, 2, 0, 32, 4, 0, 2, 8, 16 ];
+
+    /**
+     * PC2 masks for 2nd block.
+     * 
+     * @constant
+     */
+    KeySchedule.PC2_masks2 = [ 2, 32, 8, 1, 2, 2, 0, 4, 4, 0, 8, 16, 32, 16, 0,
+            32, 4, 32, 2, 1, 16, 8, 8, 16, 1, 0, 1, 4 ];
+
+    /**
+     * Cumulative key shifts.
+     * 
+     * @constant
+     */
+    KeySchedule.keyShifts = [ 1, 2, 4, 6, 8, 10, 12, 14, 15, 17, 19, 21, 23,
+            25, 27, 28 ];
+
+    KeySchedule.prototype._initialiseKeys = function(key) {
+        var i;
+
+        // extract 56 key bits in order determined by PC1
+        var bits = new Array(56);
+        for (i = 0; i < 56; i++) {
+            bits[i] = (key[KeySchedule.PC1_offsets[i]] & KeySchedule.PC1_masks[i]) != 0;
+        }
+
+        // split 56 bits into two 28-bit chunks
+        var bits1 = bits.slice(0, 28);
+        var bits2 = bits.slice(28, 56);
+
+        // duplicate each half to allow for easy bit shifts
+        bits1 = bits1.concat(bits1);
+        bits2 = bits2.concat(bits2);
+
+        // assemble the 16 keys
+        for (i = 0; i < 16; i++) {
+            var k = [ 0, 0, 0, 0, 0, 0, 0, 0 ];
+
+            // select the bits of the key according to PC2
+            var s = KeySchedule.keyShifts[i];
+            for ( var j = 0; j < 28; j++) {
+                if (bits1[j + s]) {
+                    k[KeySchedule.PC2_offsets1[j]] += KeySchedule.PC2_masks1[j];
+                }
+                if (bits2[j + s]) {
+                    k[KeySchedule.PC2_offsets2[j]] += KeySchedule.PC2_masks2[j];
+                }
+            }
+
+            // Scale each of the 8 blocks to a 32-bit mask.
+            k[0] = ((k[0] & 0x1f) << 27) + ((k[0] & 0x20) >> 5);
+            for ( var j = 1; j <= 6; j++) {
+                k[j] = k[j] << (27 - 4 * j);
+            }
+            k[7] = ((k[7] & 0x3e) >> 1) + ((k[7] & 0x1) << 31);
+            this.keys[i] = k;
+        }
+    };
+
+    /**
+     * Retrieve the key for a specified round
+     * 
+     * @param i
+     *            the round
+     * @returns the key
+     */
+    KeySchedule.prototype.getKey = function(i) {
+        return this.keys[i];
+    };
+
+    /***************************************************************************
+     * 
+     * DES Engine State
+     * 
+     **************************************************************************/
+
+    var State;
+
+    /**
+     * The algorithm's state. DES operates on two sets of 32-bits, with each
+     * block of 32-bits treated as a single number.
+     * 
+     * @class
+     */
+    State = function() {
+        /** The LHS of the Feistel scheme */
+        this.lhs = 0;
+        /** The RHS of the Feistel scheme */
+        this.rhs = 0;
+    };
+
+    /**
+     * The masks that select the SBOX input. Each SBOX accepts 6 bits from the
+     * input.
+     * 
+     * @constant
+     */
+    State.SBOX_MASK = [ 0xf8000001, 0x1f800000, 0x01f80000, 0x001f8000,
+            0x0001f800, 0x00001f80, 0x000001f8, 0x8000001f ];
+
+    /**
+     * The SBOXes. The 8 SBOXes each map 6 bit masked bit of the input to 4 bits
+     * of output. These SBOXes include the post SBOX permutation and benefit
+     * from JavaScript's sparse arrays to make specifying the input match
+     * simple.
+     * 
+     * @constant
+     */
+    State.SBOX = new Array(8);
+
+    var SBOX = State.SBOX;
+
+    SBOX[0] = new Array();
+    SBOX[0][0] = 0x808200; // 0 (0, 0) = 14
+    SBOX[0][268435456] = 0x8000; // 10000000 (0, 1) = 4
+    SBOX[0][536870912] = 0x808002; // 20000000 (0, 2) = 13
+    SBOX[0][805306368] = 0x2; // 30000000 (0, 3) = 1
+    SBOX[0][1073741824] = 0x200; // 40000000 (0, 4) = 2
+    SBOX[0][1342177280] = 0x808202; // 50000000 (0, 5) = 15
+    SBOX[0][1610612736] = 0x800202; // 60000000 (0, 6) = 11
+    SBOX[0][1879048192] = 0x800000; // 70000000 (0, 7) = 8
+    SBOX[0][-2147483648] = 0x202; // 80000000 (0, 8) = 3
+    SBOX[0][-1879048192] = 0x800200; // 90000000 (0, 9) = 10
+    SBOX[0][-1610612736] = 0x8200; // a0000000 (0, 10) = 6
+    SBOX[0][-1342177280] = 0x808000; // b0000000 (0, 11) = 12
+    SBOX[0][-1073741824] = 0x8002; // c0000000 (0, 12) = 5
+    SBOX[0][-805306368] = 0x800002; // d0000000 (0, 13) = 9
+    SBOX[0][-536870912] = 0x0; // e0000000 (0, 14) = 0
+    SBOX[0][-268435456] = 0x8202; // f0000000 (0, 15) = 7
+    SBOX[0][134217728] = 0x0; // 8000000 (1, 0) = 0
+    SBOX[0][402653184] = 0x808202; // 18000000 (1, 1) = 15
+    SBOX[0][671088640] = 0x8202; // 28000000 (1, 2) = 7
+    SBOX[0][939524096] = 0x8000; // 38000000 (1, 3) = 4
+    SBOX[0][1207959552] = 0x808200; // 48000000 (1, 4) = 14
+    SBOX[0][1476395008] = 0x200; // 58000000 (1, 5) = 2
+    SBOX[0][1744830464] = 0x808002; // 68000000 (1, 6) = 13
+    SBOX[0][2013265920] = 0x2; // 78000000 (1, 7) = 1
+    SBOX[0][-2013265920] = 0x800200; // 88000000 (1, 8) = 10
+    SBOX[0][-1744830464] = 0x8200; // 98000000 (1, 9) = 6
+    SBOX[0][-1476395008] = 0x808000; // a8000000 (1, 10) = 12
+    SBOX[0][-1207959552] = 0x800202; // b8000000 (1, 11) = 11
+    SBOX[0][-939524096] = 0x800002; // c8000000 (1, 12) = 9
+    SBOX[0][-671088640] = 0x8002; // d8000000 (1, 13) = 5
+    SBOX[0][-402653184] = 0x202; // e8000000 (1, 14) = 3
+    SBOX[0][-134217728] = 0x800000; // f8000000 (1, 15) = 8
+    SBOX[0][1] = 0x8000; // 1 (2, 0) = 4
+    SBOX[0][268435457] = 0x2; // 10000001 (2, 1) = 1
+    SBOX[0][536870913] = 0x808200; // 20000001 (2, 2) = 14
+    SBOX[0][805306369] = 0x800000; // 30000001 (2, 3) = 8
+    SBOX[0][1073741825] = 0x808002; // 40000001 (2, 4) = 13
+    SBOX[0][1342177281] = 0x8200; // 50000001 (2, 5) = 6
+    SBOX[0][1610612737] = 0x200; // 60000001 (2, 6) = 2
+    SBOX[0][1879048193] = 0x800202; // 70000001 (2, 7) = 11
+    SBOX[0][-2147483647] = 0x808202; // 80000001 (2, 8) = 15
+    SBOX[0][-1879048191] = 0x808000; // 90000001 (2, 9) = 12
+    SBOX[0][-1610612735] = 0x800002; // a0000001 (2, 10) = 9
+    SBOX[0][-1342177279] = 0x8202; // b0000001 (2, 11) = 7
+    SBOX[0][-1073741823] = 0x202; // c0000001 (2, 12) = 3
+    SBOX[0][-805306367] = 0x800200; // d0000001 (2, 13) = 10
+    SBOX[0][-536870911] = 0x8002; // e0000001 (2, 14) = 5
+    SBOX[0][-268435455] = 0x0; // f0000001 (2, 15) = 0
+    SBOX[0][134217729] = 0x808202; // 8000001 (3, 0) = 15
+    SBOX[0][402653185] = 0x808000; // 18000001 (3, 1) = 12
+    SBOX[0][671088641] = 0x800000; // 28000001 (3, 2) = 8
+    SBOX[0][939524097] = 0x200; // 38000001 (3, 3) = 2
+    SBOX[0][1207959553] = 0x8000; // 48000001 (3, 4) = 4
+    SBOX[0][1476395009] = 0x800002; // 58000001 (3, 5) = 9
+    SBOX[0][1744830465] = 0x2; // 68000001 (3, 6) = 1
+    SBOX[0][2013265921] = 0x8202; // 78000001 (3, 7) = 7
+    SBOX[0][-2013265919] = 0x8002; // 88000001 (3, 8) = 5
+    SBOX[0][-1744830463] = 0x800202; // 98000001 (3, 9) = 11
+    SBOX[0][-1476395007] = 0x202; // a8000001 (3, 10) = 3
+    SBOX[0][-1207959551] = 0x808200; // b8000001 (3, 11) = 14
+    SBOX[0][-939524095] = 0x800200; // c8000001 (3, 12) = 10
+    SBOX[0][-671088639] = 0x0; // d8000001 (3, 13) = 0
+    SBOX[0][-402653183] = 0x8200; // e8000001 (3, 14) = 6
+    SBOX[0][-134217727] = 0x808002; // f8000001 (3, 15) = 13
+
+    SBOX[1] = new Array();
+    SBOX[1][0] = 0x40084010; // 0 (0, 0) = 15
+    SBOX[1][16777216] = 0x4000; // 1000000 (0, 1) = 1
+    SBOX[1][33554432] = 0x80000; // 2000000 (0, 2) = 8
+    SBOX[1][50331648] = 0x40080010; // 3000000 (0, 3) = 14
+    SBOX[1][67108864] = 0x40000010; // 4000000 (0, 4) = 6
+    SBOX[1][83886080] = 0x40084000; // 5000000 (0, 5) = 11
+    SBOX[1][100663296] = 0x40004000; // 6000000 (0, 6) = 3
+    SBOX[1][117440512] = 0x10; // 7000000 (0, 7) = 4
+    SBOX[1][134217728] = 0x84000; // 8000000 (0, 8) = 9
+    SBOX[1][150994944] = 0x40004010; // 9000000 (0, 9) = 7
+    SBOX[1][167772160] = 0x40000000; // a000000 (0, 10) = 2
+    SBOX[1][184549376] = 0x84010; // b000000 (0, 11) = 13
+    SBOX[1][201326592] = 0x80010; // c000000 (0, 12) = 12
+    SBOX[1][218103808] = 0x0; // d000000 (0, 13) = 0
+    SBOX[1][234881024] = 0x4010; // e000000 (0, 14) = 5
+    SBOX[1][251658240] = 0x40080000; // f000000 (0, 15) = 10
+    SBOX[1][8388608] = 0x40004000; // 800000 (1, 0) = 3
+    SBOX[1][25165824] = 0x84010; // 1800000 (1, 1) = 13
+    SBOX[1][41943040] = 0x10; // 2800000 (1, 2) = 4
+    SBOX[1][58720256] = 0x40004010; // 3800000 (1, 3) = 7
+    SBOX[1][75497472] = 0x40084010; // 4800000 (1, 4) = 15
+    SBOX[1][92274688] = 0x40000000; // 5800000 (1, 5) = 2
+    SBOX[1][109051904] = 0x80000; // 6800000 (1, 6) = 8
+    SBOX[1][125829120] = 0x40080010; // 7800000 (1, 7) = 14
+    SBOX[1][142606336] = 0x80010; // 8800000 (1, 8) = 12
+    SBOX[1][159383552] = 0x0; // 9800000 (1, 9) = 0
+    SBOX[1][176160768] = 0x4000; // a800000 (1, 10) = 1
+    SBOX[1][192937984] = 0x40080000; // b800000 (1, 11) = 10
+    SBOX[1][209715200] = 0x40000010; // c800000 (1, 12) = 6
+    SBOX[1][226492416] = 0x84000; // d800000 (1, 13) = 9
+    SBOX[1][243269632] = 0x40084000; // e800000 (1, 14) = 11
+    SBOX[1][260046848] = 0x4010; // f800000 (1, 15) = 5
+    SBOX[1][268435456] = 0x0; // 10000000 (2, 0) = 0
+    SBOX[1][285212672] = 0x40080010; // 11000000 (2, 1) = 14
+    SBOX[1][301989888] = 0x40004010; // 12000000 (2, 2) = 7
+    SBOX[1][318767104] = 0x40084000; // 13000000 (2, 3) = 11
+    SBOX[1][335544320] = 0x40080000; // 14000000 (2, 4) = 10
+    SBOX[1][352321536] = 0x10; // 15000000 (2, 5) = 4
+    SBOX[1][369098752] = 0x84010; // 16000000 (2, 6) = 13
+    SBOX[1][385875968] = 0x4000; // 17000000 (2, 7) = 1
+    SBOX[1][402653184] = 0x4010; // 18000000 (2, 8) = 5
+    SBOX[1][419430400] = 0x80000; // 19000000 (2, 9) = 8
+    SBOX[1][436207616] = 0x80010; // 1a000000 (2, 10) = 12
+    SBOX[1][452984832] = 0x40000010; // 1b000000 (2, 11) = 6
+    SBOX[1][469762048] = 0x84000; // 1c000000 (2, 12) = 9
+    SBOX[1][486539264] = 0x40004000; // 1d000000 (2, 13) = 3
+    SBOX[1][503316480] = 0x40000000; // 1e000000 (2, 14) = 2
+    SBOX[1][520093696] = 0x40084010; // 1f000000 (2, 15) = 15
+    SBOX[1][276824064] = 0x84010; // 10800000 (3, 0) = 13
+    SBOX[1][293601280] = 0x80000; // 11800000 (3, 1) = 8
+    SBOX[1][310378496] = 0x40080000; // 12800000 (3, 2) = 10
+    SBOX[1][327155712] = 0x4000; // 13800000 (3, 3) = 1
+    SBOX[1][343932928] = 0x40004000; // 14800000 (3, 4) = 3
+    SBOX[1][360710144] = 0x40084010; // 15800000 (3, 5) = 15
+    SBOX[1][377487360] = 0x10; // 16800000 (3, 6) = 4
+    SBOX[1][394264576] = 0x40000000; // 17800000 (3, 7) = 2
+    SBOX[1][411041792] = 0x40084000; // 18800000 (3, 8) = 11
+    SBOX[1][427819008] = 0x40000010; // 19800000 (3, 9) = 6
+    SBOX[1][444596224] = 0x40004010; // 1a800000 (3, 10) = 7
+    SBOX[1][461373440] = 0x80010; // 1b800000 (3, 11) = 12
+    SBOX[1][478150656] = 0x0; // 1c800000 (3, 12) = 0
+    SBOX[1][494927872] = 0x4010; // 1d800000 (3, 13) = 5
+    SBOX[1][511705088] = 0x40080010; // 1e800000 (3, 14) = 14
+    SBOX[1][528482304] = 0x84000; // 1f800000 (3, 15) = 9
+
+    SBOX[2] = new Array();
+    SBOX[2][0] = 0x104; // 0 (0, 0) = 10
+    SBOX[2][1048576] = 0x0; // 100000 (0, 1) = 0
+    SBOX[2][2097152] = 0x4000100; // 200000 (0, 2) = 9
+    SBOX[2][3145728] = 0x10104; // 300000 (0, 3) = 14
+    SBOX[2][4194304] = 0x10004; // 400000 (0, 4) = 6
+    SBOX[2][5242880] = 0x4000004; // 500000 (0, 5) = 3
+    SBOX[2][6291456] = 0x4010104; // 600000 (0, 6) = 15
+    SBOX[2][7340032] = 0x4010000; // 700000 (0, 7) = 5
+    SBOX[2][8388608] = 0x4000000; // 800000 (0, 8) = 1
+    SBOX[2][9437184] = 0x4010100; // 900000 (0, 9) = 13
+    SBOX[2][10485760] = 0x10100; // a00000 (0, 10) = 12
+    SBOX[2][11534336] = 0x4010004; // b00000 (0, 11) = 7
+    SBOX[2][12582912] = 0x4000104; // c00000 (0, 12) = 11
+    SBOX[2][13631488] = 0x10000; // d00000 (0, 13) = 4
+    SBOX[2][14680064] = 0x4; // e00000 (0, 14) = 2
+    SBOX[2][15728640] = 0x100; // f00000 (0, 15) = 8
+    SBOX[2][524288] = 0x4010100; // 80000 (1, 0) = 13
+    SBOX[2][1572864] = 0x4010004; // 180000 (1, 1) = 7
+    SBOX[2][2621440] = 0x0; // 280000 (1, 2) = 0
+    SBOX[2][3670016] = 0x4000100; // 380000 (1, 3) = 9
+    SBOX[2][4718592] = 0x4000004; // 480000 (1, 4) = 3
+    SBOX[2][5767168] = 0x10000; // 580000 (1, 5) = 4
+    SBOX[2][6815744] = 0x10004; // 680000 (1, 6) = 6
+    SBOX[2][7864320] = 0x104; // 780000 (1, 7) = 10
+    SBOX[2][8912896] = 0x4; // 880000 (1, 8) = 2
+    SBOX[2][9961472] = 0x100; // 980000 (1, 9) = 8
+    SBOX[2][11010048] = 0x4010000; // a80000 (1, 10) = 5
+    SBOX[2][12058624] = 0x10104; // b80000 (1, 11) = 14
+    SBOX[2][13107200] = 0x10100; // c80000 (1, 12) = 12
+    SBOX[2][14155776] = 0x4000104; // d80000 (1, 13) = 11
+    SBOX[2][15204352] = 0x4010104; // e80000 (1, 14) = 15
+    SBOX[2][16252928] = 0x4000000; // f80000 (1, 15) = 1
+    SBOX[2][16777216] = 0x4010100; // 1000000 (2, 0) = 13
+    SBOX[2][17825792] = 0x10004; // 1100000 (2, 1) = 6
+    SBOX[2][18874368] = 0x10000; // 1200000 (2, 2) = 4
+    SBOX[2][19922944] = 0x4000100; // 1300000 (2, 3) = 9
+    SBOX[2][20971520] = 0x100; // 1400000 (2, 4) = 8
+    SBOX[2][22020096] = 0x4010104; // 1500000 (2, 5) = 15
+    SBOX[2][23068672] = 0x4000004; // 1600000 (2, 6) = 3
+    SBOX[2][24117248] = 0x0; // 1700000 (2, 7) = 0
+    SBOX[2][25165824] = 0x4000104; // 1800000 (2, 8) = 11
+    SBOX[2][26214400] = 0x4000000; // 1900000 (2, 9) = 1
+    SBOX[2][27262976] = 0x4; // 1a00000 (2, 10) = 2
+    SBOX[2][28311552] = 0x10100; // 1b00000 (2, 11) = 12
+    SBOX[2][29360128] = 0x4010000; // 1c00000 (2, 12) = 5
+    SBOX[2][30408704] = 0x104; // 1d00000 (2, 13) = 10
+    SBOX[2][31457280] = 0x10104; // 1e00000 (2, 14) = 14
+    SBOX[2][32505856] = 0x4010004; // 1f00000 (2, 15) = 7
+    SBOX[2][17301504] = 0x4000000; // 1080000 (3, 0) = 1
+    SBOX[2][18350080] = 0x104; // 1180000 (3, 1) = 10
+    SBOX[2][19398656] = 0x4010100; // 1280000 (3, 2) = 13
+    SBOX[2][20447232] = 0x0; // 1380000 (3, 3) = 0
+    SBOX[2][21495808] = 0x10004; // 1480000 (3, 4) = 6
+    SBOX[2][22544384] = 0x4000100; // 1580000 (3, 5) = 9
+    SBOX[2][23592960] = 0x100; // 1680000 (3, 6) = 8
+    SBOX[2][24641536] = 0x4010004; // 1780000 (3, 7) = 7
+    SBOX[2][25690112] = 0x10000; // 1880000 (3, 8) = 4
+    SBOX[2][26738688] = 0x4010104; // 1980000 (3, 9) = 15
+    SBOX[2][27787264] = 0x10104; // 1a80000 (3, 10) = 14
+    SBOX[2][28835840] = 0x4000004; // 1b80000 (3, 11) = 3
+    SBOX[2][29884416] = 0x4000104; // 1c80000 (3, 12) = 11
+    SBOX[2][30932992] = 0x4010000; // 1d80000 (3, 13) = 5
+    SBOX[2][31981568] = 0x4; // 1e80000 (3, 14) = 2
+    SBOX[2][33030144] = 0x10100; // 1f80000 (3, 15) = 12
+
+    SBOX[3] = new Array();
+    SBOX[3][0] = 0x80401000; // 0 (0, 0) = 7
+    SBOX[3][65536] = 0x80001040; // 10000 (0, 1) = 13
+    SBOX[3][131072] = 0x401040; // 20000 (0, 2) = 14
+    SBOX[3][196608] = 0x80400000; // 30000 (0, 3) = 3
+    SBOX[3][262144] = 0x0; // 40000 (0, 4) = 0
+    SBOX[3][327680] = 0x401000; // 50000 (0, 5) = 6
+    SBOX[3][393216] = 0x80000040; // 60000 (0, 6) = 9
+    SBOX[3][458752] = 0x400040; // 70000 (0, 7) = 10
+    SBOX[3][524288] = 0x80000000; // 80000 (0, 8) = 1
+    SBOX[3][589824] = 0x400000; // 90000 (0, 9) = 2
+    SBOX[3][655360] = 0x40; // a0000 (0, 10) = 8
+    SBOX[3][720896] = 0x80001000; // b0000 (0, 11) = 5
+    SBOX[3][786432] = 0x80400040; // c0000 (0, 12) = 11
+    SBOX[3][851968] = 0x1040; // d0000 (0, 13) = 12
+    SBOX[3][917504] = 0x1000; // e0000 (0, 14) = 4
+    SBOX[3][983040] = 0x80401040; // f0000 (0, 15) = 15
+    SBOX[3][32768] = 0x80001040; // 8000 (1, 0) = 13
+    SBOX[3][98304] = 0x40; // 18000 (1, 1) = 8
+    SBOX[3][163840] = 0x80400040; // 28000 (1, 2) = 11
+    SBOX[3][229376] = 0x80001000; // 38000 (1, 3) = 5
+    SBOX[3][294912] = 0x401000; // 48000 (1, 4) = 6
+    SBOX[3][360448] = 0x80401040; // 58000 (1, 5) = 15
+    SBOX[3][425984] = 0x0; // 68000 (1, 6) = 0
+    SBOX[3][491520] = 0x80400000; // 78000 (1, 7) = 3
+    SBOX[3][557056] = 0x1000; // 88000 (1, 8) = 4
+    SBOX[3][622592] = 0x80401000; // 98000 (1, 9) = 7
+    SBOX[3][688128] = 0x400000; // a8000 (1, 10) = 2
+    SBOX[3][753664] = 0x1040; // b8000 (1, 11) = 12
+    SBOX[3][819200] = 0x80000000; // c8000 (1, 12) = 1
+    SBOX[3][884736] = 0x400040; // d8000 (1, 13) = 10
+    SBOX[3][950272] = 0x401040; // e8000 (1, 14) = 14
+    SBOX[3][1015808] = 0x80000040; // f8000 (1, 15) = 9
+    SBOX[3][1048576] = 0x400040; // 100000 (2, 0) = 10
+    SBOX[3][1114112] = 0x401000; // 110000 (2, 1) = 6
+    SBOX[3][1179648] = 0x80000040; // 120000 (2, 2) = 9
+    SBOX[3][1245184] = 0x0; // 130000 (2, 3) = 0
+    SBOX[3][1310720] = 0x1040; // 140000 (2, 4) = 12
+    SBOX[3][1376256] = 0x80400040; // 150000 (2, 5) = 11
+    SBOX[3][1441792] = 0x80401000; // 160000 (2, 6) = 7
+    SBOX[3][1507328] = 0x80001040; // 170000 (2, 7) = 13
+    SBOX[3][1572864] = 0x80401040; // 180000 (2, 8) = 15
+    SBOX[3][1638400] = 0x80000000; // 190000 (2, 9) = 1
+    SBOX[3][1703936] = 0x80400000; // 1a0000 (2, 10) = 3
+    SBOX[3][1769472] = 0x401040; // 1b0000 (2, 11) = 14
+    SBOX[3][1835008] = 0x80001000; // 1c0000 (2, 12) = 5
+    SBOX[3][1900544] = 0x400000; // 1d0000 (2, 13) = 2
+    SBOX[3][1966080] = 0x40; // 1e0000 (2, 14) = 8
+    SBOX[3][2031616] = 0x1000; // 1f0000 (2, 15) = 4
+    SBOX[3][1081344] = 0x80400000; // 108000 (3, 0) = 3
+    SBOX[3][1146880] = 0x80401040; // 118000 (3, 1) = 15
+    SBOX[3][1212416] = 0x0; // 128000 (3, 2) = 0
+    SBOX[3][1277952] = 0x401000; // 138000 (3, 3) = 6
+    SBOX[3][1343488] = 0x400040; // 148000 (3, 4) = 10
+    SBOX[3][1409024] = 0x80000000; // 158000 (3, 5) = 1
+    SBOX[3][1474560] = 0x80001040; // 168000 (3, 6) = 13
+    SBOX[3][1540096] = 0x40; // 178000 (3, 7) = 8
+    SBOX[3][1605632] = 0x80000040; // 188000 (3, 8) = 9
+    SBOX[3][1671168] = 0x1000; // 198000 (3, 9) = 4
+    SBOX[3][1736704] = 0x80001000; // 1a8000 (3, 10) = 5
+    SBOX[3][1802240] = 0x80400040; // 1b8000 (3, 11) = 11
+    SBOX[3][1867776] = 0x1040; // 1c8000 (3, 12) = 12
+    SBOX[3][1933312] = 0x80401000; // 1d8000 (3, 13) = 7
+    SBOX[3][1998848] = 0x400000; // 1e8000 (3, 14) = 2
+    SBOX[3][2064384] = 0x401040; // 1f8000 (3, 15) = 14
+
+    SBOX[4] = new Array();
+    SBOX[4][0] = 0x80; // 0 (0, 0) = 2
+    SBOX[4][4096] = 0x1040000; // 1000 (0, 1) = 12
+    SBOX[4][8192] = 0x40000; // 2000 (0, 2) = 4
+    SBOX[4][12288] = 0x20000000; // 3000 (0, 3) = 1
+    SBOX[4][16384] = 0x20040080; // 4000 (0, 4) = 7
+    SBOX[4][20480] = 0x1000080; // 5000 (0, 5) = 10
+    SBOX[4][24576] = 0x21000080; // 6000 (0, 6) = 11
+    SBOX[4][28672] = 0x40080; // 7000 (0, 7) = 6
+    SBOX[4][32768] = 0x1000000; // 8000 (0, 8) = 8
+    SBOX[4][36864] = 0x20040000; // 9000 (0, 9) = 5
+    SBOX[4][40960] = 0x20000080; // a000 (0, 10) = 3
+    SBOX[4][45056] = 0x21040080; // b000 (0, 11) = 15
+    SBOX[4][49152] = 0x21040000; // c000 (0, 12) = 13
+    SBOX[4][53248] = 0x0; // d000 (0, 13) = 0
+    SBOX[4][57344] = 0x1040080; // e000 (0, 14) = 14
+    SBOX[4][61440] = 0x21000000; // f000 (0, 15) = 9
+    SBOX[4][2048] = 0x1040080; // 800 (1, 0) = 14
+    SBOX[4][6144] = 0x21000080; // 1800 (1, 1) = 11
+    SBOX[4][10240] = 0x80; // 2800 (1, 2) = 2
+    SBOX[4][14336] = 0x1040000; // 3800 (1, 3) = 12
+    SBOX[4][18432] = 0x40000; // 4800 (1, 4) = 4
+    SBOX[4][22528] = 0x20040080; // 5800 (1, 5) = 7
+    SBOX[4][26624] = 0x21040000; // 6800 (1, 6) = 13
+    SBOX[4][30720] = 0x20000000; // 7800 (1, 7) = 1
+    SBOX[4][34816] = 0x20040000; // 8800 (1, 8) = 5
+    SBOX[4][38912] = 0x0; // 9800 (1, 9) = 0
+    SBOX[4][43008] = 0x21040080; // a800 (1, 10) = 15
+    SBOX[4][47104] = 0x1000080; // b800 (1, 11) = 10
+    SBOX[4][51200] = 0x20000080; // c800 (1, 12) = 3
+    SBOX[4][55296] = 0x21000000; // d800 (1, 13) = 9
+    SBOX[4][59392] = 0x1000000; // e800 (1, 14) = 8
+    SBOX[4][63488] = 0x40080; // f800 (1, 15) = 6
+    SBOX[4][65536] = 0x40000; // 10000 (2, 0) = 4
+    SBOX[4][69632] = 0x80; // 11000 (2, 1) = 2
+    SBOX[4][73728] = 0x20000000; // 12000 (2, 2) = 1
+    SBOX[4][77824] = 0x21000080; // 13000 (2, 3) = 11
+    SBOX[4][81920] = 0x1000080; // 14000 (2, 4) = 10
+    SBOX[4][86016] = 0x21040000; // 15000 (2, 5) = 13
+    SBOX[4][90112] = 0x20040080; // 16000 (2, 6) = 7
+    SBOX[4][94208] = 0x1000000; // 17000 (2, 7) = 8
+    SBOX[4][98304] = 0x21040080; // 18000 (2, 8) = 15
+    SBOX[4][102400] = 0x21000000; // 19000 (2, 9) = 9
+    SBOX[4][106496] = 0x1040000; // 1a000 (2, 10) = 12
+    SBOX[4][110592] = 0x20040000; // 1b000 (2, 11) = 5
+    SBOX[4][114688] = 0x40080; // 1c000 (2, 12) = 6
+    SBOX[4][118784] = 0x20000080; // 1d000 (2, 13) = 3
+    SBOX[4][122880] = 0x0; // 1e000 (2, 14) = 0
+    SBOX[4][126976] = 0x1040080; // 1f000 (2, 15) = 14
+    SBOX[4][67584] = 0x21000080; // 10800 (3, 0) = 11
+    SBOX[4][71680] = 0x1000000; // 11800 (3, 1) = 8
+    SBOX[4][75776] = 0x1040000; // 12800 (3, 2) = 12
+    SBOX[4][79872] = 0x20040080; // 13800 (3, 3) = 7
+    SBOX[4][83968] = 0x20000000; // 14800 (3, 4) = 1
+    SBOX[4][88064] = 0x1040080; // 15800 (3, 5) = 14
+    SBOX[4][92160] = 0x80; // 16800 (3, 6) = 2
+    SBOX[4][96256] = 0x21040000; // 17800 (3, 7) = 13
+    SBOX[4][100352] = 0x40080; // 18800 (3, 8) = 6
+    SBOX[4][104448] = 0x21040080; // 19800 (3, 9) = 15
+    SBOX[4][108544] = 0x0; // 1a800 (3, 10) = 0
+    SBOX[4][112640] = 0x21000000; // 1b800 (3, 11) = 9
+    SBOX[4][116736] = 0x1000080; // 1c800 (3, 12) = 10
+    SBOX[4][120832] = 0x40000; // 1d800 (3, 13) = 4
+    SBOX[4][124928] = 0x20040000; // 1e800 (3, 14) = 5
+    SBOX[4][129024] = 0x20000080; // 1f800 (3, 15) = 3
+
+    SBOX[5] = new Array();
+    SBOX[5][0] = 0x10000008; // 0 (0, 0) = 12
+    SBOX[5][256] = 0x2000; // 100 (0, 1) = 1
+    SBOX[5][512] = 0x10200000; // 200 (0, 2) = 10
+    SBOX[5][768] = 0x10202008; // 300 (0, 3) = 15
+    SBOX[5][1024] = 0x10002000; // 400 (0, 4) = 9
+    SBOX[5][1280] = 0x200000; // 500 (0, 5) = 2
+    SBOX[5][1536] = 0x200008; // 600 (0, 6) = 6
+    SBOX[5][1792] = 0x10000000; // 700 (0, 7) = 8
+    SBOX[5][2048] = 0x0; // 800 (0, 8) = 0
+    SBOX[5][2304] = 0x10002008; // 900 (0, 9) = 13
+    SBOX[5][2560] = 0x202000; // a00 (0, 10) = 3
+    SBOX[5][2816] = 0x8; // b00 (0, 11) = 4
+    SBOX[5][3072] = 0x10200008; // c00 (0, 12) = 14
+    SBOX[5][3328] = 0x202008; // d00 (0, 13) = 7
+    SBOX[5][3584] = 0x2008; // e00 (0, 14) = 5
+    SBOX[5][3840] = 0x10202000; // f00 (0, 15) = 11
+    SBOX[5][128] = 0x10200000; // 80 (1, 0) = 10
+    SBOX[5][384] = 0x10202008; // 180 (1, 1) = 15
+    SBOX[5][640] = 0x8; // 280 (1, 2) = 4
+    SBOX[5][896] = 0x200000; // 380 (1, 3) = 2
+    SBOX[5][1152] = 0x202008; // 480 (1, 4) = 7
+    SBOX[5][1408] = 0x10000008; // 580 (1, 5) = 12
+    SBOX[5][1664] = 0x10002000; // 680 (1, 6) = 9
+    SBOX[5][1920] = 0x2008; // 780 (1, 7) = 5
+    SBOX[5][2176] = 0x200008; // 880 (1, 8) = 6
+    SBOX[5][2432] = 0x2000; // 980 (1, 9) = 1
+    SBOX[5][2688] = 0x10002008; // a80 (1, 10) = 13
+    SBOX[5][2944] = 0x10200008; // b80 (1, 11) = 14
+    SBOX[5][3200] = 0x0; // c80 (1, 12) = 0
+    SBOX[5][3456] = 0x10202000; // d80 (1, 13) = 11
+    SBOX[5][3712] = 0x202000; // e80 (1, 14) = 3
+    SBOX[5][3968] = 0x10000000; // f80 (1, 15) = 8
+    SBOX[5][4096] = 0x10002000; // 1000 (2, 0) = 9
+    SBOX[5][4352] = 0x10200008; // 1100 (2, 1) = 14
+    SBOX[5][4608] = 0x10202008; // 1200 (2, 2) = 15
+    SBOX[5][4864] = 0x2008; // 1300 (2, 3) = 5
+    SBOX[5][5120] = 0x200000; // 1400 (2, 4) = 2
+    SBOX[5][5376] = 0x10000000; // 1500 (2, 5) = 8
+    SBOX[5][5632] = 0x10000008; // 1600 (2, 6) = 12
+    SBOX[5][5888] = 0x202000; // 1700 (2, 7) = 3
+    SBOX[5][6144] = 0x202008; // 1800 (2, 8) = 7
+    SBOX[5][6400] = 0x0; // 1900 (2, 9) = 0
+    SBOX[5][6656] = 0x8; // 1a00 (2, 10) = 4
+    SBOX[5][6912] = 0x10200000; // 1b00 (2, 11) = 10
+    SBOX[5][7168] = 0x2000; // 1c00 (2, 12) = 1
+    SBOX[5][7424] = 0x10002008; // 1d00 (2, 13) = 13
+    SBOX[5][7680] = 0x10202000; // 1e00 (2, 14) = 11
+    SBOX[5][7936] = 0x200008; // 1f00 (2, 15) = 6
+    SBOX[5][4224] = 0x8; // 1080 (3, 0) = 4
+    SBOX[5][4480] = 0x202000; // 1180 (3, 1) = 3
+    SBOX[5][4736] = 0x200000; // 1280 (3, 2) = 2
+    SBOX[5][4992] = 0x10000008; // 1380 (3, 3) = 12
+    SBOX[5][5248] = 0x10002000; // 1480 (3, 4) = 9
+    SBOX[5][5504] = 0x2008; // 1580 (3, 5) = 5
+    SBOX[5][5760] = 0x10202008; // 1680 (3, 6) = 15
+    SBOX[5][6016] = 0x10200000; // 1780 (3, 7) = 10
+    SBOX[5][6272] = 0x10202000; // 1880 (3, 8) = 11
+    SBOX[5][6528] = 0x10200008; // 1980 (3, 9) = 14
+    SBOX[5][6784] = 0x2000; // 1a80 (3, 10) = 1
+    SBOX[5][7040] = 0x202008; // 1b80 (3, 11) = 7
+    SBOX[5][7296] = 0x200008; // 1c80 (3, 12) = 6
+    SBOX[5][7552] = 0x0; // 1d80 (3, 13) = 0
+    SBOX[5][7808] = 0x10000000; // 1e80 (3, 14) = 8
+    SBOX[5][8064] = 0x10002008; // 1f80 (3, 15) = 13
+
+    SBOX[6] = new Array();
+    SBOX[6][0] = 0x100000; // 0 (0, 0) = 4
+    SBOX[6][16] = 0x2000401; // 10 (0, 1) = 11
+    SBOX[6][32] = 0x400; // 20 (0, 2) = 2
+    SBOX[6][48] = 0x100401; // 30 (0, 3) = 14
+    SBOX[6][64] = 0x2100401; // 40 (0, 4) = 15
+    SBOX[6][80] = 0x0; // 50 (0, 5) = 0
+    SBOX[6][96] = 0x1; // 60 (0, 6) = 8
+    SBOX[6][112] = 0x2100001; // 70 (0, 7) = 13
+    SBOX[6][128] = 0x2000400; // 80 (0, 8) = 3
+    SBOX[6][144] = 0x100001; // 90 (0, 9) = 12
+    SBOX[6][160] = 0x2000001; // a0 (0, 10) = 9
+    SBOX[6][176] = 0x2100400; // b0 (0, 11) = 7
+    SBOX[6][192] = 0x2100000; // c0 (0, 12) = 5
+    SBOX[6][208] = 0x401; // d0 (0, 13) = 10
+    SBOX[6][224] = 0x100400; // e0 (0, 14) = 6
+    SBOX[6][240] = 0x2000000; // f0 (0, 15) = 1
+    SBOX[6][8] = 0x2100001; // 8 (1, 0) = 13
+    SBOX[6][24] = 0x0; // 18 (1, 1) = 0
+    SBOX[6][40] = 0x2000401; // 28 (1, 2) = 11
+    SBOX[6][56] = 0x2100400; // 38 (1, 3) = 7
+    SBOX[6][72] = 0x100000; // 48 (1, 4) = 4
+    SBOX[6][88] = 0x2000001; // 58 (1, 5) = 9
+    SBOX[6][104] = 0x2000000; // 68 (1, 6) = 1
+    SBOX[6][120] = 0x401; // 78 (1, 7) = 10
+    SBOX[6][136] = 0x100401; // 88 (1, 8) = 14
+    SBOX[6][152] = 0x2000400; // 98 (1, 9) = 3
+    SBOX[6][168] = 0x2100000; // a8 (1, 10) = 5
+    SBOX[6][184] = 0x100001; // b8 (1, 11) = 12
+    SBOX[6][200] = 0x400; // c8 (1, 12) = 2
+    SBOX[6][216] = 0x2100401; // d8 (1, 13) = 15
+    SBOX[6][232] = 0x1; // e8 (1, 14) = 8
+    SBOX[6][248] = 0x100400; // f8 (1, 15) = 6
+    SBOX[6][256] = 0x2000000; // 100 (2, 0) = 1
+    SBOX[6][272] = 0x100000; // 110 (2, 1) = 4
+    SBOX[6][288] = 0x2000401; // 120 (2, 2) = 11
+    SBOX[6][304] = 0x2100001; // 130 (2, 3) = 13
+    SBOX[6][320] = 0x100001; // 140 (2, 4) = 12
+    SBOX[6][336] = 0x2000400; // 150 (2, 5) = 3
+    SBOX[6][352] = 0x2100400; // 160 (2, 6) = 7
+    SBOX[6][368] = 0x100401; // 170 (2, 7) = 14
+    SBOX[6][384] = 0x401; // 180 (2, 8) = 10
+    SBOX[6][400] = 0x2100401; // 190 (2, 9) = 15
+    SBOX[6][416] = 0x100400; // 1a0 (2, 10) = 6
+    SBOX[6][432] = 0x1; // 1b0 (2, 11) = 8
+    SBOX[6][448] = 0x0; // 1c0 (2, 12) = 0
+    SBOX[6][464] = 0x2100000; // 1d0 (2, 13) = 5
+    SBOX[6][480] = 0x2000001; // 1e0 (2, 14) = 9
+    SBOX[6][496] = 0x400; // 1f0 (2, 15) = 2
+    SBOX[6][264] = 0x100400; // 108 (3, 0) = 6
+    SBOX[6][280] = 0x2000401; // 118 (3, 1) = 11
+    SBOX[6][296] = 0x2100001; // 128 (3, 2) = 13
+    SBOX[6][312] = 0x1; // 138 (3, 3) = 8
+    SBOX[6][328] = 0x2000000; // 148 (3, 4) = 1
+    SBOX[6][344] = 0x100000; // 158 (3, 5) = 4
+    SBOX[6][360] = 0x401; // 168 (3, 6) = 10
+    SBOX[6][376] = 0x2100400; // 178 (3, 7) = 7
+    SBOX[6][392] = 0x2000001; // 188 (3, 8) = 9
+    SBOX[6][408] = 0x2100000; // 198 (3, 9) = 5
+    SBOX[6][424] = 0x0; // 1a8 (3, 10) = 0
+    SBOX[6][440] = 0x2100401; // 1b8 (3, 11) = 15
+    SBOX[6][456] = 0x100401; // 1c8 (3, 12) = 14
+    SBOX[6][472] = 0x400; // 1d8 (3, 13) = 2
+    SBOX[6][488] = 0x2000400; // 1e8 (3, 14) = 3
+    SBOX[6][504] = 0x100001; // 1f8 (3, 15) = 12
+
+    SBOX[7] = new Array();
+    SBOX[7][0] = 0x8000820; // 0 (0, 0) = 13
+    SBOX[7][1] = 0x20000; // 1 (0, 1) = 2
+    SBOX[7][2] = 0x8000000; // 2 (0, 2) = 8
+    SBOX[7][3] = 0x20; // 3 (0, 3) = 4
+    SBOX[7][4] = 0x20020; // 4 (0, 4) = 6
+    SBOX[7][5] = 0x8020820; // 5 (0, 5) = 15
+    SBOX[7][6] = 0x8020800; // 6 (0, 6) = 11
+    SBOX[7][7] = 0x800; // 7 (0, 7) = 1
+    SBOX[7][8] = 0x8020000; // 8 (0, 8) = 10
+    SBOX[7][9] = 0x8000800; // 9 (0, 9) = 9
+    SBOX[7][10] = 0x20800; // a (0, 10) = 3
+    SBOX[7][11] = 0x8020020; // b (0, 11) = 14
+    SBOX[7][12] = 0x820; // c (0, 12) = 5
+    SBOX[7][13] = 0x0; // d (0, 13) = 0
+    SBOX[7][14] = 0x8000020; // e (0, 14) = 12
+    SBOX[7][15] = 0x20820; // f (0, 15) = 7
+    SBOX[7][-2147483648] = 0x800; // 80000000 (1, 0) = 1
+    SBOX[7][-2147483647] = 0x8020820; // 80000001 (1, 1) = 15
+    SBOX[7][-2147483646] = 0x8000820; // 80000002 (1, 2) = 13
+    SBOX[7][-2147483645] = 0x8000000; // 80000003 (1, 3) = 8
+    SBOX[7][-2147483644] = 0x8020000; // 80000004 (1, 4) = 10
+    SBOX[7][-2147483643] = 0x20800; // 80000005 (1, 5) = 3
+    SBOX[7][-2147483642] = 0x20820; // 80000006 (1, 6) = 7
+    SBOX[7][-2147483641] = 0x20; // 80000007 (1, 7) = 4
+    SBOX[7][-2147483640] = 0x8000020; // 80000008 (1, 8) = 12
+    SBOX[7][-2147483639] = 0x820; // 80000009 (1, 9) = 5
+    SBOX[7][-2147483638] = 0x20020; // 8000000a (1, 10) = 6
+    SBOX[7][-2147483637] = 0x8020800; // 8000000b (1, 11) = 11
+    SBOX[7][-2147483636] = 0x0; // 8000000c (1, 12) = 0
+    SBOX[7][-2147483635] = 0x8020020; // 8000000d (1, 13) = 14
+    SBOX[7][-2147483634] = 0x8000800; // 8000000e (1, 14) = 9
+    SBOX[7][-2147483633] = 0x20000; // 8000000f (1, 15) = 2
+    SBOX[7][16] = 0x20820; // 10 (2, 0) = 7
+    SBOX[7][17] = 0x8020800; // 11 (2, 1) = 11
+    SBOX[7][18] = 0x20; // 12 (2, 2) = 4
+    SBOX[7][19] = 0x800; // 13 (2, 3) = 1
+    SBOX[7][20] = 0x8000800; // 14 (2, 4) = 9
+    SBOX[7][21] = 0x8000020; // 15 (2, 5) = 12
+    SBOX[7][22] = 0x8020020; // 16 (2, 6) = 14
+    SBOX[7][23] = 0x20000; // 17 (2, 7) = 2
+    SBOX[7][24] = 0x0; // 18 (2, 8) = 0
+    SBOX[7][25] = 0x20020; // 19 (2, 9) = 6
+    SBOX[7][26] = 0x8020000; // 1a (2, 10) = 10
+    SBOX[7][27] = 0x8000820; // 1b (2, 11) = 13
+    SBOX[7][28] = 0x8020820; // 1c (2, 12) = 15
+    SBOX[7][29] = 0x20800; // 1d (2, 13) = 3
+    SBOX[7][30] = 0x820; // 1e (2, 14) = 5
+    SBOX[7][31] = 0x8000000; // 1f (2, 15) = 8
+    SBOX[7][-2147483632] = 0x20000; // 80000010 (3, 0) = 2
+    SBOX[7][-2147483631] = 0x800; // 80000011 (3, 1) = 1
+    SBOX[7][-2147483630] = 0x8020020; // 80000012 (3, 2) = 14
+    SBOX[7][-2147483629] = 0x20820; // 80000013 (3, 3) = 7
+    SBOX[7][-2147483628] = 0x20; // 80000014 (3, 4) = 4
+    SBOX[7][-2147483627] = 0x8020000; // 80000015 (3, 5) = 10
+    SBOX[7][-2147483626] = 0x8000000; // 80000016 (3, 6) = 8
+    SBOX[7][-2147483625] = 0x8000820; // 80000017 (3, 7) = 13
+    SBOX[7][-2147483624] = 0x8020820; // 80000018 (3, 8) = 15
+    SBOX[7][-2147483623] = 0x8000020; // 80000019 (3, 9) = 12
+    SBOX[7][-2147483622] = 0x8000800; // 8000001a (3, 10) = 9
+    SBOX[7][-2147483621] = 0x0; // 8000001b (3, 11) = 0
+    SBOX[7][-2147483620] = 0x20800; // 8000001c (3, 12) = 3
+    SBOX[7][-2147483619] = 0x820; // 8000001d (3, 13) = 5
+    SBOX[7][-2147483618] = 0x20020; // 8000001e (3, 14) = 6
+    SBOX[7][-2147483617] = 0x8020800; // 8000001f (3, 15) = 11
+
+    State.prototype._exchangeLR = function(v, m) {
+        var t = ((this.lhs >> v) ^ this.rhs) & m;
+        this.rhs ^= t;
+        this.lhs ^= (t << v);
+    };
+
+    State.prototype._exchangeRL = function(v, m) {
+        var t = ((this.rhs >> v) ^ this.lhs) & m;
+        this.lhs ^= t;
+        this.rhs ^= (t << v);
+    };
+
+    /**
+     * Perform the initial permutation of the input to create the starting state
+     * of the algorithm. The initial permutation maps each consecutive bit of
+     * the input into a different byte of the state.
+     * 
+     * <pre>
+     * The initial permutation is defined to be:
+     * 
+     *      58    50   42    34    26   18    10    2  
+     *      60    52   44    36    28   20    12    4
+     *      62    54   46    38    30   22    14    6
+     *      64    56   48    40    32   24    16    8
+     *      57    49   41    33    25   17     9    1
+     *      59    51   43    35    27   19    11    3
+     *      61    53   45    37    29   21    13    5
+     *      63    55   47    39    31   23    15    7
+     * </pre>
+     * 
+     * 
+     * @param message
+     *            The message as an array of unsigned bytes.
+     * @param offset
+     *            The offset into the message that the current 64-bit block
+     *            begins.
+     * @returns the initial engine state
+     */
+    State.prototype.initialPerm = function(message, offset) {
+        var input = message.slice(offset, offset + 8);
+
+        this.lhs = (input[0] << 24) + (input[1] << 16) + (input[2] << 8)
+                + input[3];
+        this.rhs = (input[4] << 24) + (input[5] << 16) + (input[6] << 8)
+                + input[7];
+
+        this._exchangeLR(4, 0x0f0f0f0f);
+        this._exchangeLR(16, 0x0000ffff);
+        this._exchangeRL(2, 0x33333333);
+        this._exchangeRL(8, 0x00ff00ff);
+        this._exchangeLR(1, 0x55555555);
+    };
+
+    /**
+     * Perform one round of the DES algorithm using the given key. A round is
+     * defined as:
+     * 
+     * <pre>
+     * L&amp;rsquo = R
+     * R&amp;rsquo = L &circ; f(R, k)
+     * </pre>
+     * 
+     * where f consists of expanding, XORing with the key and contracting back
+     * with the SBOXes.
+     * 
+     * Note that the final round is defined slightly differently as:
+     * 
+     * <pre>
+     * L&amp;rsquo = L &circ; f(R, k)
+     * R&amp;rsquo = R
+     * </pre>
+     * 
+     * Therefore in the final round this function produces LHS and RHS the wrong
+     * way around.
+     * 
+     * @param k
+     *            the key
+     */
+    State.prototype.round = function(k) {
+        var r = this.rhs, l = this.lhs;
+        var f = 0;
+        for ( var i = 0; i < 8; i++) {
+            var v = (r ^ k[i]) & State.SBOX_MASK[i];
+            f += State.SBOX[i][v];
+        }
+
+        this.lhs = r;
+        this.rhs = l ^ f;
+    };
+
+    /**
+     * Apply the inverse of the initial permutation.
+     * 
+     * <pre>
+     * The inverse is defined to be:
+     * 
+     *      40     8   48    16    56   24    64   32
+     *      39     7   47    15    55   23    63   31
+     *      38     6   46    14    54   22    62   30
+     *      37     5   45    13    53   21    61   29
+     *      36     4   44    12    52   20    60   28
+     *      35     3   43    11    51   19    59   27
+     *      34     2   42    10    50   18    58   26
+     *      33     1   41     9    49   17    57   25
+     * </pre>
+     * 
+     * @param cipherText
+     * @param offset
+     */
+    State.prototype.finalPerm = function(cipherText, offset) {
+        var t = this.lhs;
+        this.lhs = this.rhs;
+        this.rhs = t;
+
+        this._exchangeLR(1, 0x55555555);
+        this._exchangeRL(8, 0x00ff00ff);
+        this._exchangeRL(2, 0x33333333);
+        this._exchangeLR(16, 0x0000ffff);
+        this._exchangeLR(4, 0x0f0f0f0f);
+
+        cipherText[offset] = (this.lhs >> 24) & 0xff;
+        cipherText[offset + 1] = (this.lhs >> 16) & 0xff;
+        cipherText[offset + 2] = (this.lhs >> 8) & 0xff;
+        cipherText[offset + 3] = (this.lhs) & 0xff;
+        cipherText[offset + 4] = (this.rhs >> 24) & 0xff;
+        cipherText[offset + 5] = (this.rhs >> 16) & 0xff;
+        cipherText[offset + 6] = (this.rhs >> 8) & 0xff;
+        cipherText[offset + 7] = (this.rhs) & 0xff;
+    };
+
+    /**
+     * DES cipher
+     */
+    var DES = C.DES = {
+        _blocksize : 2,
+
+        _keyschedule : null,
+
+        _state : new State(),
+
+        _init : function(k) {
+            this._keyschedule = new KeySchedule(k);
+        },
+
+        encrypt : function(message, password, options) {
+
+            options = options || {};
+
+            // Determine mode
+            var mode = options.mode || new C.mode.OFB;
+
+            // Allow mode to override options
+            if (mode.fixOptions)
+                mode.fixOptions(options);
+
+            var
+            // Convert to bytes if message is a string
+            m = (message.constructor == String ? UTF8.stringToBytes(message)
+                    : message),
+
+            // Generate random IV
+            iv = options.iv || util.randomBytes(8),
+
+            // Generate key
+            k = (password.constructor == String ?
+            // Derive key from passphrase
+            C.PBKDF2(password, iv, 8, {
+                asBytes : true
+            }) :
+            // else, assume byte array representing cryptographic key
+            password);
+
+            // Create key schedule
+            this._keyschedule = new KeySchedule(k);
+
+            // Encrypt
+            mode.encrypt(DES, m, iv);
+
+            // Return ciphertext
+            m = options.iv ? m : iv.concat(m);
+            return (options && options.asBytes) ? m : util.bytesToBase64(m);
+        },
+
+        _encryptblock : function(message, offset) {
+            this._state.initialPerm(message, offset);
+            for ( var i = 0; i <= 15; i++) {
+                this._state.round(this._keyschedule.getKey(i));
+            }
+            this._state.finalPerm(message, offset);
+        },
+
+        decrypt : function(ciphertext, password, options) {
+            options = options || {};
+
+            // Determine mode
+            var mode = options.mode || new C.mode.OFB;
+
+            // Allow mode to override options
+            if (mode.fixOptions)
+                mode.fixOptions(options);
+
+            var
+
+            // Convert to bytes if ciphertext is a string
+            c = (ciphertext.constructor == String ? util
+                    .base64ToBytes(ciphertext) : ciphertext),
+
+            // Separate IV and message
+            iv = options.iv || c.splice(0, 8),
+
+            // Generate key
+            k = (password.constructor == String ?
+            // Derive key from passphrase
+            C.PBKDF2(password, iv, 32, {
+                asBytes : true
+            }) :
+            // else, assume byte array representing cryptographic key
+            password);
+
+            // Create key schedule
+            this._keyschedule = new KeySchedule(k);
+
+            mode.decrypt(DES, c, iv);
+
+            // Return plaintext
+            return (options && options.asBytes) ? c : UTF8.bytesToString(c);
+        },
+
+        _decryptblock : function(message, offset) {
+            this._state.initialPerm(message, offset);
+            for ( var i = 15; i >= 0; i--) {
+                this._state.round(this._keyschedule.getKey(i));
+            }
+            this._state.finalPerm(message, offset);
+        }
+
+    };
+})();

+ 38 - 0
common/cryptojs-master/lib/HMAC.js

@@ -0,0 +1,38 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+C.HMAC = function (hasher, message, key, options) {
+
+	// Convert to byte arrays
+	if (message.constructor == String) message = UTF8.stringToBytes(message);
+	if (key.constructor == String) key = UTF8.stringToBytes(key);
+	/* else, assume byte arrays already */
+
+	// Allow arbitrary length keys
+	if (key.length > hasher._blocksize * 4)
+		key = hasher(key, { asBytes: true });
+
+	// XOR keys with pad constants
+	var okey = key.slice(0),
+	    ikey = key.slice(0);
+	for (var i = 0; i < hasher._blocksize * 4; i++) {
+		okey[i] ^= 0x5C;
+		ikey[i] ^= 0x36;
+	}
+
+	var hmacbytes = hasher(okey.concat(hasher(ikey.concat(message), { asBytes: true })), { asBytes: true });
+
+	return options && options.asBytes ? hmacbytes :
+	       options && options.asString ? Binary.bytesToString(hmacbytes) :
+	       util.bytesToHex(hmacbytes);
+
+};
+
+})();

+ 117 - 0
common/cryptojs-master/lib/MARC4.js

@@ -0,0 +1,117 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+var MARC4 = C.MARC4 = {
+
+	/**
+	 * Public API
+	 */
+
+	encrypt: function (message, password) {
+
+		var
+
+		    // Convert to bytes
+		    m = UTF8.stringToBytes(message),
+
+		    // Generate random IV
+		    iv = util.randomBytes(16),
+
+		    // Generate key
+		    k = password.constructor == String ?
+		        // Derive key from passphrase
+		        C.PBKDF2(password, iv, 32, { asBytes: true }) :
+		        // else, assume byte array representing cryptographic key
+		        password;
+
+		// Encrypt
+		MARC4._marc4(m, k, 1536);
+
+		// Return ciphertext
+		return util.bytesToBase64(iv.concat(m));
+
+	},
+
+	decrypt: function (ciphertext, password) {
+
+		var
+
+		    // Convert to bytes
+		    c = util.base64ToBytes(ciphertext),
+
+		    // Separate IV and message
+		    iv = c.splice(0, 16),
+
+		    // Generate key
+		    k = password.constructor == String ?
+		        // Derive key from passphrase
+		        C.PBKDF2(password, iv, 32, { asBytes: true }) :
+		        // else, assume byte array representing cryptographic key
+		        password;
+
+		// Decrypt
+		MARC4._marc4(c, k, 1536);
+
+		// Return plaintext
+		return UTF8.bytesToString(c);
+
+	},
+
+
+	/**
+	 * Internal methods
+	 */
+
+	// The core
+	_marc4: function (m, k, drop) {
+
+		// State variables
+		var i, j, s, temp;
+
+		// Key setup
+		for (i = 0, s = []; i < 256; i++) s[i] = i;
+		for (i = 0, j = 0;  i < 256; i++) {
+
+			j = (j + s[i] + k[i % k.length]) % 256;
+
+			// Swap
+			temp = s[i];
+			s[i] = s[j];
+			s[j] = temp;
+
+		}
+
+		// Clear counters
+		i = j = 0;
+
+		// Encryption
+		for (var k = -drop; k < m.length; k++) {
+
+			i = (i + 1) % 256;
+			j = (j + s[i]) % 256;
+
+			// Swap
+			temp = s[i];
+			s[i] = s[j];
+			s[j] = temp;
+
+			// Stop here if we're still dropping keystream
+			if (k < 0) continue;
+
+			// Encrypt
+			m[k] ^= s[(s[i] + s[j]) % 256];
+
+		}
+
+	}
+
+};
+
+})();

+ 158 - 0
common/cryptojs-master/lib/MD5.js

@@ -0,0 +1,158 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+// Public API
+var MD5 = C.MD5 = function (message, options) {
+	var digestbytes = util.wordsToBytes(MD5._md5(message));
+	return options && options.asBytes ? digestbytes :
+	       options && options.asString ? Binary.bytesToString(digestbytes) :
+	       util.bytesToHex(digestbytes);
+};
+
+// The core
+MD5._md5 = function (message) {
+
+	// Convert to byte array
+	if (message.constructor == String) message = UTF8.stringToBytes(message);
+	/* else, assume byte array already */
+
+	var m = util.bytesToWords(message),
+	    l = message.length * 8,
+	    a =  1732584193,
+	    b = -271733879,
+	    c = -1732584194,
+	    d =  271733878;
+
+	// Swap endian
+	for (var i = 0; i < m.length; i++) {
+		m[i] = ((m[i] <<  8) | (m[i] >>> 24)) & 0x00FF00FF |
+		       ((m[i] << 24) | (m[i] >>>  8)) & 0xFF00FF00;
+	}
+
+	// Padding
+	m[l >>> 5] |= 0x80 << (l % 32);
+	m[(((l + 64) >>> 9) << 4) + 14] = l;
+
+	// Method shortcuts
+	var FF = MD5._ff,
+	    GG = MD5._gg,
+	    HH = MD5._hh,
+	    II = MD5._ii;
+
+	for (var i = 0; i < m.length; i += 16) {
+
+		var aa = a,
+		    bb = b,
+		    cc = c,
+		    dd = d;
+
+		a = FF(a, b, c, d, m[i+ 0],  7, -680876936);
+		d = FF(d, a, b, c, m[i+ 1], 12, -389564586);
+		c = FF(c, d, a, b, m[i+ 2], 17,  606105819);
+		b = FF(b, c, d, a, m[i+ 3], 22, -1044525330);
+		a = FF(a, b, c, d, m[i+ 4],  7, -176418897);
+		d = FF(d, a, b, c, m[i+ 5], 12,  1200080426);
+		c = FF(c, d, a, b, m[i+ 6], 17, -1473231341);
+		b = FF(b, c, d, a, m[i+ 7], 22, -45705983);
+		a = FF(a, b, c, d, m[i+ 8],  7,  1770035416);
+		d = FF(d, a, b, c, m[i+ 9], 12, -1958414417);
+		c = FF(c, d, a, b, m[i+10], 17, -42063);
+		b = FF(b, c, d, a, m[i+11], 22, -1990404162);
+		a = FF(a, b, c, d, m[i+12],  7,  1804603682);
+		d = FF(d, a, b, c, m[i+13], 12, -40341101);
+		c = FF(c, d, a, b, m[i+14], 17, -1502002290);
+		b = FF(b, c, d, a, m[i+15], 22,  1236535329);
+
+		a = GG(a, b, c, d, m[i+ 1],  5, -165796510);
+		d = GG(d, a, b, c, m[i+ 6],  9, -1069501632);
+		c = GG(c, d, a, b, m[i+11], 14,  643717713);
+		b = GG(b, c, d, a, m[i+ 0], 20, -373897302);
+		a = GG(a, b, c, d, m[i+ 5],  5, -701558691);
+		d = GG(d, a, b, c, m[i+10],  9,  38016083);
+		c = GG(c, d, a, b, m[i+15], 14, -660478335);
+		b = GG(b, c, d, a, m[i+ 4], 20, -405537848);
+		a = GG(a, b, c, d, m[i+ 9],  5,  568446438);
+		d = GG(d, a, b, c, m[i+14],  9, -1019803690);
+		c = GG(c, d, a, b, m[i+ 3], 14, -187363961);
+		b = GG(b, c, d, a, m[i+ 8], 20,  1163531501);
+		a = GG(a, b, c, d, m[i+13],  5, -1444681467);
+		d = GG(d, a, b, c, m[i+ 2],  9, -51403784);
+		c = GG(c, d, a, b, m[i+ 7], 14,  1735328473);
+		b = GG(b, c, d, a, m[i+12], 20, -1926607734);
+
+		a = HH(a, b, c, d, m[i+ 5],  4, -378558);
+		d = HH(d, a, b, c, m[i+ 8], 11, -2022574463);
+		c = HH(c, d, a, b, m[i+11], 16,  1839030562);
+		b = HH(b, c, d, a, m[i+14], 23, -35309556);
+		a = HH(a, b, c, d, m[i+ 1],  4, -1530992060);
+		d = HH(d, a, b, c, m[i+ 4], 11,  1272893353);
+		c = HH(c, d, a, b, m[i+ 7], 16, -155497632);
+		b = HH(b, c, d, a, m[i+10], 23, -1094730640);
+		a = HH(a, b, c, d, m[i+13],  4,  681279174);
+		d = HH(d, a, b, c, m[i+ 0], 11, -358537222);
+		c = HH(c, d, a, b, m[i+ 3], 16, -722521979);
+		b = HH(b, c, d, a, m[i+ 6], 23,  76029189);
+		a = HH(a, b, c, d, m[i+ 9],  4, -640364487);
+		d = HH(d, a, b, c, m[i+12], 11, -421815835);
+		c = HH(c, d, a, b, m[i+15], 16,  530742520);
+		b = HH(b, c, d, a, m[i+ 2], 23, -995338651);
+
+		a = II(a, b, c, d, m[i+ 0],  6, -198630844);
+		d = II(d, a, b, c, m[i+ 7], 10,  1126891415);
+		c = II(c, d, a, b, m[i+14], 15, -1416354905);
+		b = II(b, c, d, a, m[i+ 5], 21, -57434055);
+		a = II(a, b, c, d, m[i+12],  6,  1700485571);
+		d = II(d, a, b, c, m[i+ 3], 10, -1894986606);
+		c = II(c, d, a, b, m[i+10], 15, -1051523);
+		b = II(b, c, d, a, m[i+ 1], 21, -2054922799);
+		a = II(a, b, c, d, m[i+ 8],  6,  1873313359);
+		d = II(d, a, b, c, m[i+15], 10, -30611744);
+		c = II(c, d, a, b, m[i+ 6], 15, -1560198380);
+		b = II(b, c, d, a, m[i+13], 21,  1309151649);
+		a = II(a, b, c, d, m[i+ 4],  6, -145523070);
+		d = II(d, a, b, c, m[i+11], 10, -1120210379);
+		c = II(c, d, a, b, m[i+ 2], 15,  718787259);
+		b = II(b, c, d, a, m[i+ 9], 21, -343485551);
+
+		a = (a + aa) >>> 0;
+		b = (b + bb) >>> 0;
+		c = (c + cc) >>> 0;
+		d = (d + dd) >>> 0;
+
+	}
+
+	return util.endian([a, b, c, d]);
+
+};
+
+// Auxiliary functions
+MD5._ff  = function (a, b, c, d, x, s, t) {
+	var n = a + (b & c | ~b & d) + (x >>> 0) + t;
+	return ((n << s) | (n >>> (32 - s))) + b;
+};
+MD5._gg  = function (a, b, c, d, x, s, t) {
+	var n = a + (b & d | c & ~d) + (x >>> 0) + t;
+	return ((n << s) | (n >>> (32 - s))) + b;
+};
+MD5._hh  = function (a, b, c, d, x, s, t) {
+	var n = a + (b ^ c ^ d) + (x >>> 0) + t;
+	return ((n << s) | (n >>> (32 - s))) + b;
+};
+MD5._ii  = function (a, b, c, d, x, s, t) {
+	var n = a + (c ^ (b | ~d)) + (x >>> 0) + t;
+	return ((n << s) | (n >>> (32 - s))) + b;
+};
+
+// Package private blocksize
+MD5._blocksize = 16;
+
+MD5._digestsize = 16;
+
+})();

+ 49 - 0
common/cryptojs-master/lib/PBKDF2.js

@@ -0,0 +1,49 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+C.PBKDF2 = function (password, salt, keylen, options) {
+
+	// Convert to byte arrays
+	if (password.constructor == String) password = UTF8.stringToBytes(password);
+	if (salt.constructor == String) salt = UTF8.stringToBytes(salt);
+	/* else, assume byte arrays already */
+
+	// Defaults
+	var hasher = options && options.hasher || C.SHA1,
+	    iterations = options && options.iterations || 1;
+
+	// Pseudo-random function
+	function PRF(password, salt) {
+		return C.HMAC(hasher, salt, password, { asBytes: true });
+	}
+
+	// Generate key
+	var derivedKeyBytes = [],
+	    blockindex = 1;
+	while (derivedKeyBytes.length < keylen) {
+		var block = PRF(password, salt.concat(util.wordsToBytes([blockindex])));
+		for (var u = block, i = 1; i < iterations; i++) {
+			u = PRF(password, u);
+			for (var j = 0; j < block.length; j++) block[j] ^= u[j];
+		}
+		derivedKeyBytes = derivedKeyBytes.concat(block);
+		blockindex++;
+	}
+
+	// Truncate excess bytes
+	derivedKeyBytes.length = keylen;
+
+	return options && options.asBytes ? derivedKeyBytes :
+	       options && options.asString ? Binary.bytesToString(derivedKeyBytes) :
+	       util.bytesToHex(derivedKeyBytes);
+
+};
+
+})();

+ 88 - 0
common/cryptojs-master/lib/PBKDF2Async.js

@@ -0,0 +1,88 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+if (!C.nextTick) {
+    // node.js has setTime out but prefer process.nextTick
+    if (typeof process != 'undefined' && typeof process.nextTick !== 'undefined') {
+        C.nextTick = process.nextTick;
+    } else if (typeof setTimeout !== 'undefined') {
+        C.nextTick = function (callback) {
+            setTimeout(callback, 0);
+        };
+    }
+}
+
+C.PBKDF2Async = function (password, salt, keylen, callback, options) {
+
+    // Convert to byte arrays
+    if (password.constructor == String) password = UTF8.stringToBytes(password);
+    if (salt.constructor == String) salt = UTF8.stringToBytes(salt);
+    /* else, assume byte arrays already */
+
+    // Defaults
+    var hasher = options && options.hasher || C.SHA1,
+        iterations = options && options.iterations || 1;
+
+    // Progress callback option
+    var progressChangeHandler = options && options.onProgressChange;
+    var totalIterations = Math.ceil(keylen / hasher._digestsize) * iterations;
+    function fireProgressChange(currentIteration) {
+        if (progressChangeHandler) {
+            var iterationsSoFar = derivedKeyBytes.length / hasher._digestsize * iterations + currentIteration;
+            setTimeout(function () {
+                progressChangeHandler(Math.round(iterationsSoFar / totalIterations * 100));
+            }, 0);
+        }
+    }
+
+    // Pseudo-random function
+    function PRF(password, salt) {
+        return C.HMAC(hasher, salt, password, { asBytes: true });
+    }
+
+    var nextTick = C.nextTick;
+
+    // Generate key
+    var derivedKeyBytes = [],
+        blockindex = 1;
+
+    var outer, inner;
+    nextTick(outer = function () {
+        if (derivedKeyBytes.length < keylen) {
+            var block = PRF(password, salt.concat(util.wordsToBytes([blockindex])));
+            fireProgressChange(1);
+
+            var u = block, i = 1;
+            nextTick(inner = function () {
+                if (i < iterations) {
+                    u = PRF(password, u);
+                    for (var j = 0; j < block.length; j++) block[j] ^= u[j];
+                    i++;
+                    fireProgressChange(i);
+
+                    nextTick(inner);
+                } else {
+                    derivedKeyBytes = derivedKeyBytes.concat(block);
+                    blockindex++;
+                    nextTick(outer);
+                }
+            });
+        } else {
+            // Truncate excess bytes
+            derivedKeyBytes.length = keylen;
+            callback(
+                    options && options.asBytes ? derivedKeyBytes :
+                    options && options.asString ? Binary.bytesToString(derivedKeyBytes) :
+                    util.bytesToHex(derivedKeyBytes));
+        }
+    });
+};
+
+})();

+ 221 - 0
common/cryptojs-master/lib/Rabbit.js

@@ -0,0 +1,221 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+// Inner state
+var x = [],
+    c = [],
+    b;
+
+var Rabbit = C.Rabbit = {
+
+	/**
+	 * Public API
+	 */
+
+	encrypt: function (message, password) {
+
+		var
+
+		    // Convert to bytes
+		    m = UTF8.stringToBytes(message),
+
+		    // Generate random IV
+		    iv = util.randomBytes(8),
+
+		    // Generate key
+		    k = password.constructor == String ?
+		        // Derive key from passphrase
+		        C.PBKDF2(password, iv, 32, { asBytes: true }) :
+		        // else, assume byte array representing cryptographic key
+		        password;
+
+		// Encrypt
+		Rabbit._rabbit(m, k, util.bytesToWords(iv));
+
+		// Return ciphertext
+		return util.bytesToBase64(iv.concat(m));
+
+	},
+
+	decrypt: function (ciphertext, password) {
+
+		var
+
+		    // Convert to bytes
+		    c = util.base64ToBytes(ciphertext),
+
+		    // Separate IV and message
+		    iv = c.splice(0, 8),
+
+		    // Generate key
+		    k = password.constructor == String ?
+		        // Derive key from passphrase
+		        C.PBKDF2(password, iv, 32, { asBytes: true }) :
+		        // else, assume byte array representing cryptographic key
+		        password;
+
+		// Decrypt
+		Rabbit._rabbit(c, k, util.bytesToWords(iv));
+
+		// Return plaintext
+		return UTF8.bytesToString(c);
+
+	},
+
+
+	/**
+	 * Internal methods
+	 */
+
+	// Encryption/decryption scheme
+	_rabbit: function (m, k, iv) {
+
+		Rabbit._keysetup(k);
+		if (iv) Rabbit._ivsetup(iv);
+
+		for (var s = [], i = 0; i < m.length; i++) {
+
+			if (i % 16 == 0) {
+
+				// Iterate the system
+				Rabbit._nextstate();
+
+				// Generate 16 bytes of pseudo-random data
+				s[0] = x[0] ^ (x[5] >>> 16) ^ (x[3] << 16);
+				s[1] = x[2] ^ (x[7] >>> 16) ^ (x[5] << 16);
+				s[2] = x[4] ^ (x[1] >>> 16) ^ (x[7] << 16);
+				s[3] = x[6] ^ (x[3] >>> 16) ^ (x[1] << 16);
+
+				// Swap endian
+				for (var j = 0; j < 4; j++) {
+					s[j] = ((s[j] <<  8) | (s[j] >>> 24)) & 0x00FF00FF |
+					       ((s[j] << 24) | (s[j] >>>  8)) & 0xFF00FF00;
+				}
+
+				// Convert words to bytes
+				for (var b = 120; b >= 0; b -= 8)
+					s[b / 8] = (s[b >>> 5] >>> (24 - b % 32)) & 0xFF;
+
+			}
+
+			m[i] ^= s[i % 16];
+
+		}
+
+	},
+
+	// Key setup scheme
+	_keysetup: function (k) {
+
+		// Generate initial state values
+		x[0] = k[0];
+		x[2] = k[1];
+		x[4] = k[2];
+		x[6] = k[3];
+		x[1] = (k[3] << 16) | (k[2] >>> 16);
+		x[3] = (k[0] << 16) | (k[3] >>> 16);
+		x[5] = (k[1] << 16) | (k[0] >>> 16);
+		x[7] = (k[2] << 16) | (k[1] >>> 16);
+
+		// Generate initial counter values
+		c[0] = util.rotl(k[2], 16);
+		c[2] = util.rotl(k[3], 16);
+		c[4] = util.rotl(k[0], 16);
+		c[6] = util.rotl(k[1], 16);
+		c[1] = (k[0] & 0xFFFF0000) | (k[1] & 0xFFFF);
+		c[3] = (k[1] & 0xFFFF0000) | (k[2] & 0xFFFF);
+		c[5] = (k[2] & 0xFFFF0000) | (k[3] & 0xFFFF);
+		c[7] = (k[3] & 0xFFFF0000) | (k[0] & 0xFFFF);
+
+		// Clear carry bit
+		b = 0;
+
+		// Iterate the system four times
+		for (var i = 0; i < 4; i++) Rabbit._nextstate();
+
+		// Modify the counters
+		for (var i = 0; i < 8; i++) c[i] ^= x[(i + 4) & 7];
+
+	},
+
+	// IV setup scheme
+	_ivsetup: function (iv) {
+
+		// Generate four subvectors
+		var i0 = util.endian(iv[0]),
+		    i2 = util.endian(iv[1]),
+		    i1 = (i0 >>> 16) | (i2 & 0xFFFF0000),
+		    i3 = (i2 <<  16) | (i0 & 0x0000FFFF);
+
+		// Modify counter values
+		c[0] ^= i0;
+		c[1] ^= i1;
+		c[2] ^= i2;
+		c[3] ^= i3;
+		c[4] ^= i0;
+		c[5] ^= i1;
+		c[6] ^= i2;
+		c[7] ^= i3;
+
+		// Iterate the system four times
+		for (var i = 0; i < 4; i++) Rabbit._nextstate();
+
+	},
+
+	// Next-state function
+	_nextstate: function () {
+
+		// Save old counter values
+		for (var c_old = [], i = 0; i < 8; i++) c_old[i] = c[i];
+
+		// Calculate new counter values
+		c[0] = (c[0] + 0x4D34D34D + b) >>> 0;
+		c[1] = (c[1] + 0xD34D34D3 + ((c[0] >>> 0) < (c_old[0] >>> 0) ? 1 : 0)) >>> 0;
+		c[2] = (c[2] + 0x34D34D34 + ((c[1] >>> 0) < (c_old[1] >>> 0) ? 1 : 0)) >>> 0;
+		c[3] = (c[3] + 0x4D34D34D + ((c[2] >>> 0) < (c_old[2] >>> 0) ? 1 : 0)) >>> 0;
+		c[4] = (c[4] + 0xD34D34D3 + ((c[3] >>> 0) < (c_old[3] >>> 0) ? 1 : 0)) >>> 0;
+		c[5] = (c[5] + 0x34D34D34 + ((c[4] >>> 0) < (c_old[4] >>> 0) ? 1 : 0)) >>> 0;
+		c[6] = (c[6] + 0x4D34D34D + ((c[5] >>> 0) < (c_old[5] >>> 0) ? 1 : 0)) >>> 0;
+		c[7] = (c[7] + 0xD34D34D3 + ((c[6] >>> 0) < (c_old[6] >>> 0) ? 1 : 0)) >>> 0;
+		b = (c[7] >>> 0) < (c_old[7] >>> 0) ? 1 : 0;
+
+		// Calculate the g-values
+		for (var g = [], i = 0; i < 8; i++) {
+
+			var gx = (x[i] + c[i]) >>> 0;
+
+			// Construct high and low argument for squaring
+			var ga = gx & 0xFFFF,
+			    gb = gx >>> 16;
+
+			// Calculate high and low result of squaring
+			var gh = ((((ga * ga) >>> 17) + ga * gb) >>> 15) + gb * gb,
+			    gl = (((gx & 0xFFFF0000) * gx) >>> 0) + (((gx & 0x0000FFFF) * gx) >>> 0) >>> 0;
+
+			// High XOR low
+			g[i] = gh ^ gl;
+
+		}
+
+		// Calculate new state values
+		x[0] = g[0] + ((g[7] << 16) | (g[7] >>> 16)) + ((g[6] << 16) | (g[6] >>> 16));
+		x[1] = g[1] + ((g[0] <<  8) | (g[0] >>> 24)) + g[7];
+		x[2] = g[2] + ((g[1] << 16) | (g[1] >>> 16)) + ((g[0] << 16) | (g[0] >>> 16));
+		x[3] = g[3] + ((g[2] <<  8) | (g[2] >>> 24)) + g[1];
+		x[4] = g[4] + ((g[3] << 16) | (g[3] >>> 16)) + ((g[2] << 16) | (g[2] >>> 16));
+		x[5] = g[5] + ((g[4] <<  8) | (g[4] >>> 24)) + g[3];
+		x[6] = g[6] + ((g[5] << 16) | (g[5] >>> 16)) + ((g[4] << 16) | (g[4] >>> 16));
+		x[7] = g[7] + ((g[6] <<  8) | (g[6] >>> 24)) + g[5];
+
+	}
+
+};
+
+})();

+ 86 - 0
common/cryptojs-master/lib/SHA1.js

@@ -0,0 +1,86 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+// Public API
+var SHA1 = C.SHA1 = function (message, options) {
+	var digestbytes = util.wordsToBytes(SHA1._sha1(message));
+	return options && options.asBytes ? digestbytes :
+	       options && options.asString ? Binary.bytesToString(digestbytes) :
+	       util.bytesToHex(digestbytes);
+};
+
+// The core
+SHA1._sha1 = function (message) {
+
+	// Convert to byte array
+	if (message.constructor == String) message = UTF8.stringToBytes(message);
+	/* else, assume byte array already */
+
+	var m  = util.bytesToWords(message),
+	    l  = message.length * 8,
+	    w  =  [],
+	    H0 =  1732584193,
+	    H1 = -271733879,
+	    H2 = -1732584194,
+	    H3 =  271733878,
+	    H4 = -1009589776;
+
+	// Padding
+	m[l >> 5] |= 0x80 << (24 - l % 32);
+	m[((l + 64 >>> 9) << 4) + 15] = l;
+
+	for (var i = 0; i < m.length; i += 16) {
+
+		var a = H0,
+		    b = H1,
+		    c = H2,
+		    d = H3,
+		    e = H4;
+
+		for (var j = 0; j < 80; j++) {
+
+			if (j < 16) w[j] = m[i + j];
+			else {
+				var n = w[j-3] ^ w[j-8] ^ w[j-14] ^ w[j-16];
+				w[j] = (n << 1) | (n >>> 31);
+			}
+
+			var t = ((H0 << 5) | (H0 >>> 27)) + H4 + (w[j] >>> 0) + (
+			         j < 20 ? (H1 & H2 | ~H1 & H3) + 1518500249 :
+			         j < 40 ? (H1 ^ H2 ^ H3) + 1859775393 :
+			         j < 60 ? (H1 & H2 | H1 & H3 | H2 & H3) - 1894007588 :
+			                  (H1 ^ H2 ^ H3) - 899497514);
+
+			H4 =  H3;
+			H3 =  H2;
+			H2 = (H1 << 30) | (H1 >>> 2);
+			H1 =  H0;
+			H0 =  t;
+
+		}
+
+		H0 += a;
+		H1 += b;
+		H2 += c;
+		H3 += d;
+		H4 += e;
+
+	}
+
+	return [H0, H1, H2, H3, H4];
+
+};
+
+// Package private blocksize
+SHA1._blocksize = 16;
+
+SHA1._digestsize = 20;
+
+})();

+ 130 - 0
common/cryptojs-master/lib/SHA256.js

@@ -0,0 +1,130 @@
+(function(){
+
+var C = (typeof window === 'undefined') ? require('./Crypto').Crypto : window.Crypto;
+
+// Shortcuts
+var util = C.util,
+    charenc = C.charenc,
+    UTF8 = charenc.UTF8,
+    Binary = charenc.Binary;
+
+// Constants
+var K = [ 0x428A2F98, 0x71374491, 0xB5C0FBCF, 0xE9B5DBA5,
+          0x3956C25B, 0x59F111F1, 0x923F82A4, 0xAB1C5ED5,
+          0xD807AA98, 0x12835B01, 0x243185BE, 0x550C7DC3,
+          0x72BE5D74, 0x80DEB1FE, 0x9BDC06A7, 0xC19BF174,
+          0xE49B69C1, 0xEFBE4786, 0x0FC19DC6, 0x240CA1CC,
+          0x2DE92C6F, 0x4A7484AA, 0x5CB0A9DC, 0x76F988DA,
+          0x983E5152, 0xA831C66D, 0xB00327C8, 0xBF597FC7,
+          0xC6E00BF3, 0xD5A79147, 0x06CA6351, 0x14292967,
+          0x27B70A85, 0x2E1B2138, 0x4D2C6DFC, 0x53380D13,
+          0x650A7354, 0x766A0ABB, 0x81C2C92E, 0x92722C85,
+          0xA2BFE8A1, 0xA81A664B, 0xC24B8B70, 0xC76C51A3,
+          0xD192E819, 0xD6990624, 0xF40E3585, 0x106AA070,
+          0x19A4C116, 0x1E376C08, 0x2748774C, 0x34B0BCB5,
+          0x391C0CB3, 0x4ED8AA4A, 0x5B9CCA4F, 0x682E6FF3,
+          0x748F82EE, 0x78A5636F, 0x84C87814, 0x8CC70208,
+          0x90BEFFFA, 0xA4506CEB, 0xBEF9A3F7, 0xC67178F2 ];
+
+// Public API
+var SHA256 = C.SHA256 = function (message, options) {
+	var digestbytes = util.wordsToBytes(SHA256._sha256(message));
+	return options && options.asBytes ? digestbytes :
+	       options && options.asString ? Binary.bytesToString(digestbytes) :
+	       util.bytesToHex(digestbytes);
+};
+
+// The core
+SHA256._sha256 = function (message) {
+
+	// Convert to byte array
+	if (message.constructor == String) message = UTF8.stringToBytes(message);
+	/* else, assume byte array already */
+
+	var m = util.bytesToWords(message),
+	    l = message.length * 8,
+	    H = [ 0x6A09E667, 0xBB67AE85, 0x3C6EF372, 0xA54FF53A,
+	          0x510E527F, 0x9B05688C, 0x1F83D9AB, 0x5BE0CD19 ],
+	    w = [],
+	    a, b, c, d, e, f, g, h, i, j,
+	    t1, t2;
+
+	// Padding
+	m[l >> 5] |= 0x80 << (24 - l % 32);
+	m[((l + 64 >> 9) << 4) + 15] = l;
+
+	for (var i = 0; i < m.length; i += 16) {
+
+		a = H[0];
+		b = H[1];
+		c = H[2];
+		d = H[3];
+		e = H[4];
+		f = H[5];
+		g = H[6];
+		h = H[7];
+
+		for (var j = 0; j < 64; j++) {
+
+			if (j < 16) w[j] = m[j + i];
+			else {
+
+				var gamma0x = w[j - 15],
+				    gamma1x = w[j - 2],
+				    gamma0  = ((gamma0x << 25) | (gamma0x >>>  7)) ^
+				              ((gamma0x << 14) | (gamma0x >>> 18)) ^
+				               (gamma0x >>> 3),
+				    gamma1  = ((gamma1x <<  15) | (gamma1x >>> 17)) ^
+				              ((gamma1x <<  13) | (gamma1x >>> 19)) ^
+				               (gamma1x >>> 10);
+
+				w[j] = gamma0 + (w[j - 7] >>> 0) +
+				       gamma1 + (w[j - 16] >>> 0);
+
+			}
+
+			var ch  = e & f ^ ~e & g,
+			    maj = a & b ^ a & c ^ b & c,
+			    sigma0 = ((a << 30) | (a >>>  2)) ^
+			             ((a << 19) | (a >>> 13)) ^
+			             ((a << 10) | (a >>> 22)),
+			    sigma1 = ((e << 26) | (e >>>  6)) ^
+			             ((e << 21) | (e >>> 11)) ^
+			             ((e <<  7) | (e >>> 25));
+
+
+			t1 = (h >>> 0) + sigma1 + ch + (K[j]) + (w[j] >>> 0);
+			t2 = sigma0 + maj;
+
+			h = g;
+			g = f;
+			f = e;
+			e = (d + t1) >>> 0;
+			d = c;
+			c = b;
+			b = a;
+			a = (t1 + t2) >>> 0;
+
+		}
+
+		H[0] += a;
+		H[1] += b;
+		H[2] += c;
+		H[3] += d;
+		H[4] += e;
+		H[5] += f;
+		H[6] += g;
+		H[7] += h;
+
+	}
+
+	return H;
+
+};
+
+// Package private blocksize
+SHA256._blocksize = 16;
+
+SHA256._digestsize = 32;
+
+})();

+ 18 - 0
common/cryptojs-master/package.json

@@ -0,0 +1,18 @@
+{
+  "author": "Jeff Guo <gwjjeff@gmail.com>",
+  "name": "cryptojs",
+  "tags": ["Hash", "MD5", "SHA1", "SHA-1", "SHA256", "SHA-256", "RC4", "Rabbit", "AES", "DES", "PBKDF2", "HMAC", "OFB", "CFB", "CTR", "CBC", "Base64"],
+  "description": "Following googlecode project crypto-js, provide standard and secure cryptographic algorithms for NodeJS. Support MD5, SHA-1, SHA-256, RC4, Rabbit, AES, DES, PBKDF2, HMAC, OFB, CFB, CTR, CBC, Base64",
+  "version": "2.5.3",
+  "homepage": "https://github.com/gwjjeff/cryptojs",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/gwjjeff/cryptojs.git"
+  },
+  "main": "cryptojs.js",
+  "engines": {
+    "node": "*"
+  },
+  "dependencies": {},
+  "devDependencies": {}
+}

+ 25 - 0
common/cryptojs-master/test/PBKDF2-test.js

@@ -0,0 +1,25 @@
+var assert = require('assert');
+var Crypto = require('../cryptojs').Crypto; 
+
+(function test_PBKDF2() {
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 128 / 8), "cdedb5281bb2f801565a1122b2563515");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 256 / 8), "cdedb5281bb2f801565a1122b25635150ad1f7a04bb9f3a333ecc0e2e1f70837");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 128 / 8, { iterations : 2	}), "01dbee7f4a9e243e988b62c73cda935d");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 256 / 8, { iterations : 2 }), "01dbee7f4a9e243e988b62c73cda935da05378b93244ec8f48a99e61ad799d86");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 128 / 8, { iterations : 1200}), "5c08eb61fdf71e4e4ec3cf6ba1f5512b");
+	assert.strictEqual(Crypto.PBKDF2("password", "ATHENA.MIT.EDUraeburn", 256 / 8, { iterations : 1200}), "5c08eb61fdf71e4e4ec3cf6ba1f5512ba7e52ddbc5e5142f708a31e2e62b1e13");
+	assert.strictEqual(Crypto.PBKDF2("password", "\x12\x34\x56\x78\x78\x56\x34\x12", 128 / 8, {	iterations : 5 }), "d1daa78615f287e6a1c8b120d7062a49");
+	assert.strictEqual(Crypto.PBKDF2("password", "\x12\x34\x56\x78\x78\x56\x34\x12", 256 / 8, {	iterations : 5 }), "d1daa78615f287e6a1c8b120d7062a493f98d203e6be49a6adf4fa574b6e64ee");
+	assert.strictEqual(Crypto.PBKDF2("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase equals block size", 128 / 8, { iterations : 1200 }), "139c30c0966bc32ba55fdbf212530ac9");
+	assert.strictEqual(Crypto.PBKDF2("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase equals block size", 256 / 8, { iterations : 1200 }), "139c30c0966bc32ba55fdbf212530ac9c5ec59f1a452f5cc9ad940fea0598ed1");
+	assert.strictEqual(Crypto.PBKDF2("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", 128 / 8, { iterations : 1200 }), "9ccad6d468770cd51b10e6a68721be61");
+	assert.strictEqual(Crypto.PBKDF2("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", 256 / 8, { iterations : 1200 }), "9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a");
+	assert.strictEqual(Crypto.PBKDF2([0xf0, 0x9d, 0x84, 0x9e], "EXAMPLE.COMpianist", 128 / 8, { iterations : 50 }), "6b9cf26d45455a43a5b8bb276a403b39");
+	assert.strictEqual(Crypto.PBKDF2([0xf0, 0x9d, 0x84, 0x9e], "EXAMPLE.COMpianist", 256 / 8, { iterations : 50 }), "6b9cf26d45455a43a5b8bb276a403b39e7fe37a0c41e02c281ff3069e1e94f52");
+})(); 
+
+(function test_PBKSD2Async() {
+	Crypto.PBKDF2Async("XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX", "pass phrase exceeds block size", 256 / 8, function(result) {
+		assert.strictEqual(result, "9ccad6d468770cd51b10e6a68721be611a8b4d282601db3b36be9246915ec82a");
+	}, { iterations : 1200 });
+})();

+ 13 - 0
common/cryptojs-master/test/test.coffee

@@ -0,0 +1,13 @@
+Crypto = (require '../cryptojs').Crypto
+key = '12345678'
+us = 'Hello, 世界!'
+
+mode = new Crypto.mode.ECB Crypto.pad.pkcs7
+
+console.log "ub = #{ub = Crypto.charenc.UTF8.stringToBytes us}"
+console.log "eb = #{eb = Crypto.DES.encrypt ub, key, {asBytes: true, mode: mode}}"
+console.log "ehs= #{ehs= Crypto.util.bytesToHex eb}"
+
+console.log "eb2= #{eb2= Crypto.util.hexToBytes ehs}"
+console.log "ub2= #{ub2= Crypto.DES.decrypt eb2, key, {asBytes: true, mode: mode}}"
+console.log "us2= #{us2= Crypto.charenc.UTF8.bytesToString ub2}"

+ 853 - 0
common/dayjs/CHANGELOG.md

@@ -0,0 +1,853 @@
+## [1.11.4](https://github.com/iamkun/dayjs/compare/v1.11.3...v1.11.4) (2022-07-19)
+
+
+### Bug Fixes
+
+* correct past property in ku (kurdish) locale ([#1916](https://github.com/iamkun/dayjs/issues/1916)) ([74e82b9](https://github.com/iamkun/dayjs/commit/74e82b9da5ec8b90361fc27ac7c8b63faf354502))
+* fix French [fr] local ordinal ([#1932](https://github.com/iamkun/dayjs/issues/1932)) ([8f09834](https://github.com/iamkun/dayjs/commit/8f09834a88b8e7f8353c6e7473d4711596890a8c))
+* fix objectSupport plugin ConfigTypeMap type ([#1441](https://github.com/iamkun/dayjs/issues/1441)) ([#1990](https://github.com/iamkun/dayjs/issues/1990)) ([fd51fe4](https://github.com/iamkun/dayjs/commit/fd51fe4f7fa799d8c598343e71fa59299ec4cf93))
+* fix type error to add ordianl property in InstanceLocaleDataReturn and GlobalLocaleDataReturn types ([#1931](https://github.com/iamkun/dayjs/issues/1931)) ([526f0ae](https://github.com/iamkun/dayjs/commit/526f0ae549ffbeeb9ef1099ca23964791fc59743))
+* update locale ar-* meridiem function ([#1954](https://github.com/iamkun/dayjs/issues/1954)) ([3d31611](https://github.com/iamkun/dayjs/commit/3d316117f04362d31f4e8bd349620b8414ce5d0c))
+* zh-tw / zh-hk locale ordinal error ([#1976](https://github.com/iamkun/dayjs/issues/1976)) ([0a1bd08](https://github.com/iamkun/dayjs/commit/0a1bd08e736be7d4e378aaca280caa6543f8066d))
+
+## [1.11.3](https://github.com/iamkun/dayjs/compare/v1.11.2...v1.11.3) (2022-06-06)
+
+
+### Bug Fixes
+
+*  customParseFormat plugin to parse comma as a separator character ([#1913](https://github.com/iamkun/dayjs/issues/1913)) ([41b1405](https://github.com/iamkun/dayjs/commit/41b1405971e099431211ae6c2a100cd797da4427))
+* update Dutch [nl] locale ordinal ([#1908](https://github.com/iamkun/dayjs/issues/1908)) ([5da98f8](https://github.com/iamkun/dayjs/commit/5da98f8085d2d2847d79e38c795082703a14f24b))
+
+## [1.11.2](https://github.com/iamkun/dayjs/compare/v1.11.1...v1.11.2) (2022-05-06)
+
+
+### Bug Fixes
+
+* add OpUnitType (week) to quarterOfYear startOf/endOf types ([#1865](https://github.com/iamkun/dayjs/issues/1865)) ([400bc3e](https://github.com/iamkun/dayjs/commit/400bc3e8915e0c58e7abbfd3a1235364b1abaf3e))
+* Fix type issue with ManipulateType ([#1864](https://github.com/iamkun/dayjs/issues/1864)) ([d033dfc](https://github.com/iamkun/dayjs/commit/d033dfcfc1d2ced39b2733898e8d85ad5984c9e9))
+* fix UTC plugin .valueOf not taking DST into account  ([#1448](https://github.com/iamkun/dayjs/issues/1448)) ([27d1c50](https://github.com/iamkun/dayjs/commit/27d1c506100ae6624f258c21cc06b24768ced733))
+
+## [1.11.1](https://github.com/iamkun/dayjs/compare/v1.11.0...v1.11.1) (2022-04-15)
+
+
+### Bug Fixes
+
+* add Bengali (Bangladesh) [bn-bd] locale ([#1806](https://github.com/iamkun/dayjs/issues/1806)) ([840ed76](https://github.com/iamkun/dayjs/commit/840ed76eedc085afefc4dedd05f31d44196b63b0))
+* refactor replace deprecated String.prototype.substr() ([#1836](https://github.com/iamkun/dayjs/issues/1836)) ([627fa39](https://github.com/iamkun/dayjs/commit/627fa393e4daf83c92431162dbe18534b23fcbae))
+* Update German [de] locale, adds the abbreviations for month including a . in the end, as in September -> Sept. ([#1831](https://github.com/iamkun/dayjs/issues/1831)) ([4e2802c](https://github.com/iamkun/dayjs/commit/4e2802cc3bec2941ffb737a15fb531c90951eafe))
+* update Italian (Switzerland) [it-ch] locale relativeTime ([#1829](https://github.com/iamkun/dayjs/issues/1829)) ([8e6d11d](https://github.com/iamkun/dayjs/commit/8e6d11d053393d97bee1ba411adb2d82de1a58c4))
+* update Kurdish [ku] locale strings and formatted output contains non-standard kurdish characters ([#1848](https://github.com/iamkun/dayjs/issues/1848)) ([a597d0b](https://github.com/iamkun/dayjs/commit/a597d0b1b8dd28e626f8c59d326622088f7b51e7))
+* update locale bo [Tibetan]: corrected the orders in formats ([#1823](https://github.com/iamkun/dayjs/issues/1823)) ([e790516](https://github.com/iamkun/dayjs/commit/e79051617af6787358f6c9b5443d987b8b53a9e1))
+
+# [1.11.0](https://github.com/iamkun/dayjs/compare/v1.10.8...v1.11.0) (2022-03-14)
+
+
+### Bug Fixes
+
+* Add Kirundi (rn) locale ([#1793](https://github.com/iamkun/dayjs/issues/1793)) ([74e5247](https://github.com/iamkun/dayjs/commit/74e5247227a779fffde39bdfcd1ee19911496709))
+* add missing date shorthand D type definition ([#1752](https://github.com/iamkun/dayjs/issues/1752)) ([b045baf](https://github.com/iamkun/dayjs/commit/b045baf1646a81f7e4f446f355d02d5fb0ef4aa7))
+* Add relative time to Galician (gl) and fix ordinals ([#1800](https://github.com/iamkun/dayjs/issues/1800)) ([dcbf170](https://github.com/iamkun/dayjs/commit/dcbf1708400624addfbddbc71e0f6a9ac15fa961))
+* update German locales (de-at, de-ch) ([#1775](https://github.com/iamkun/dayjs/issues/1775)) ([f9055a7](https://github.com/iamkun/dayjs/commit/f9055a77bf3d84c575e5fcf99e21611138ba64d7))
+* update Icelandic [is] locale relativeTime config ([#1796](https://github.com/iamkun/dayjs/issues/1796)) ([76f9e17](https://github.com/iamkun/dayjs/commit/76f9e1756de7e99c01e471dab30ea074b9ec9629))
+* Update index.d.ts note ([#1716](https://github.com/iamkun/dayjs/issues/1716)) ([5a108ff](https://github.com/iamkun/dayjs/commit/5a108ff3159c53fd270ea7638f33c35c934d6457))
+* Update locale German [de] monthsShort ([#1746](https://github.com/iamkun/dayjs/issues/1746)) ([4a7b7d0](https://github.com/iamkun/dayjs/commit/4a7b7d07c885bb9338514c234dbb708e24e9863e))
+* update meridiem function to Kurdish (ku) locale ([#1725](https://github.com/iamkun/dayjs/issues/1725)) ([efd3904](https://github.com/iamkun/dayjs/commit/efd3904ff8cbf0a4fc064911dda76fc86b669f7b))
+* update updateLocal plugin typescript types ([#1692](https://github.com/iamkun/dayjs/issues/1692)) ([c7a3f73](https://github.com/iamkun/dayjs/commit/c7a3f73064dbb63b4d365b2ad4c792f075f4d8d8))
+
+
+### Features
+
+* Fallback to language only locale + support uppercase locales ([#1524](https://github.com/iamkun/dayjs/issues/1524)) ([9138dc2](https://github.com/iamkun/dayjs/commit/9138dc28206875372da4fb74c64716437cd11b95))
+
+## [1.10.8](https://github.com/iamkun/dayjs/compare/v1.10.7...v1.10.8) (2022-02-28)
+
+
+### Bug Fixes
+
+* set locale pt, pt-br correct weekdays and months ([#1697](https://github.com/iamkun/dayjs/issues/1697)) ([e019301](https://github.com/iamkun/dayjs/commit/e01930171c8235f58a114236f146086428f99569))
+
+## [1.10.7](https://github.com/iamkun/dayjs/compare/v1.10.6...v1.10.7) (2021-09-10)
+
+
+### Bug Fixes
+
+* Add  Spanish (Mexico) [es-mx] locale ([#1614](https://github.com/iamkun/dayjs/issues/1614)) ([3393f2a](https://github.com/iamkun/dayjs/commit/3393f2ad55346d55902683a2e31c6f253d96c8c2))
+* Add Arabic (Iraq) [ar-iq] locale ([#1627](https://github.com/iamkun/dayjs/issues/1627)) ([b5a1391](https://github.com/iamkun/dayjs/commit/b5a1391011b247d08863d291542db5937b23b427))
+* add format object type to type file ([#1572](https://github.com/iamkun/dayjs/issues/1572)) ([5a79cc6](https://github.com/iamkun/dayjs/commit/5a79cc6408e825d9e123629eb44fc19c996d7751))
+* duration plugin when parsing duration from ISO string, set missing components to 0 instead of NaN ([#1611](https://github.com/iamkun/dayjs/issues/1611)) ([252585b](https://github.com/iamkun/dayjs/commit/252585b4b2bd59508150e21bb994908a9d78f9b0))
+* narrow type for `add` and `subtract` ([#1576](https://github.com/iamkun/dayjs/issues/1576)) ([1686962](https://github.com/iamkun/dayjs/commit/16869621b1a42563064dbf87f80c1ebfd74c1188))
+* update customParseFormat plugin strict x X parsing ([#1571](https://github.com/iamkun/dayjs/issues/1571)) ([08adda5](https://github.com/iamkun/dayjs/commit/08adda54edbcca38601f57841921d0f87f84e49e))
+* update Lithuanian [lt] locale spelling for single month ([#1609](https://github.com/iamkun/dayjs/issues/1609)) ([255dc54](https://github.com/iamkun/dayjs/commit/255dc54d9295de135a9037ce6ca13cae4bfd2cfb))
+* Update Norwegian Bokmål [nb] local yearStart 4 ([#1608](https://github.com/iamkun/dayjs/issues/1608)) ([7a8467c](https://github.com/iamkun/dayjs/commit/7a8467c0b7d59821f7e19d4a6973bcda8e4c19b1))
+* update plugin advancedFormat `isValid` validation ([#1566](https://github.com/iamkun/dayjs/issues/1566)) ([755fc8b](https://github.com/iamkun/dayjs/commit/755fc8bb1c532eb991459f180eee81367d12016c))
+* update Sinhalese [si] locale month name ([#1475](https://github.com/iamkun/dayjs/issues/1475)) ([63de2a8](https://github.com/iamkun/dayjs/commit/63de2a8b7dcd7e68c132c85d88572d4c9d296907))
+* update utcOffset plugin type file ([#1604](https://github.com/iamkun/dayjs/issues/1604)) ([f68e4b1](https://github.com/iamkun/dayjs/commit/f68e4b1a29fc33542f74cde10ec6d9fb045ca37e))
+
+## [1.10.6](https://github.com/iamkun/dayjs/compare/v1.10.5...v1.10.6) (2021-07-06)
+
+
+### Bug Fixes
+
+* add invalid date string override ([#1465](https://github.com/iamkun/dayjs/issues/1465)) ([#1470](https://github.com/iamkun/dayjs/issues/1470)) ([06f88f4](https://github.com/iamkun/dayjs/commit/06f88f425828b1ce96b737332d25145a95a4ee9d))
+* add sv-fi Finland Swedish locale ([#1522](https://github.com/iamkun/dayjs/issues/1522)) ([8e32164](https://github.com/iamkun/dayjs/commit/8e32164855cff724642e24c37a631eb4c4d760c8))
+* customParseFormat support parsing X x timestamp ([#1567](https://github.com/iamkun/dayjs/issues/1567)) ([eb087f5](https://github.com/iamkun/dayjs/commit/eb087f52861313b8dd8a5c1b77858665ec72859e))
+* dayjs ConfigTypeMap add null & undefined ([#1560](https://github.com/iamkun/dayjs/issues/1560)) ([b5e40e6](https://github.com/iamkun/dayjs/commit/b5e40e6f16abeaea6a0facfa466d20aefaa8a444))
+* Fix DayOfYear plugin when using BadMutable plugin ([#1511](https://github.com/iamkun/dayjs/issues/1511)) ([0b0c6a3](https://github.com/iamkun/dayjs/commit/0b0c6a31ec9c0aff991b0e8dd6eed116201274cc))
+* Implement ordinal in Bulgarian translation (fixes [#1501](https://github.com/iamkun/dayjs/issues/1501)) ([#1502](https://github.com/iamkun/dayjs/issues/1502)) ([b728da5](https://github.com/iamkun/dayjs/commit/b728da5ed9ed08210004ed20ce5fcd52a92de7da))
+* more strict delimiter in REGEX_PARSE ([#1555](https://github.com/iamkun/dayjs/issues/1555)) ([bfdab5c](https://github.com/iamkun/dayjs/commit/bfdab5c0d45a5736b68e8e1b1354fc021e05f607))
+* parameter type ([#1549](https://github.com/iamkun/dayjs/issues/1549)) ([f369844](https://github.com/iamkun/dayjs/commit/f369844dd69d253c4c7cbf68150939db3db233be))
+* update customParseFormat plugin to custom two-digit year parse function ([#1421](https://github.com/iamkun/dayjs/issues/1421)) ([bb5df55](https://github.com/iamkun/dayjs/commit/bb5df55cd3975dc7638b8f4e762afa470b6620f7))
+* update names of weekdays and months in Bulgarian [bg] to lowercase ([#1438](https://github.com/iamkun/dayjs/issues/1438)) ([b246210](https://github.com/iamkun/dayjs/commit/b24621091fec9cf6704de21e4b323f6f0c4abbf1))
+* update type file `.diff` ([#1505](https://github.com/iamkun/dayjs/issues/1505)) ([6508494](https://github.com/iamkun/dayjs/commit/6508494a4e62977b4397baaeef293d1bcf3c7235))
+* update UTC plugin type file for strict parsing ([#1443](https://github.com/iamkun/dayjs/issues/1443)) ([b4f28df](https://github.com/iamkun/dayjs/commit/b4f28df219fe63202dffdbeeaec5677c4d2c9111))
+
+## [1.10.5](https://github.com/iamkun/dayjs/compare/v1.10.4...v1.10.5) (2021-05-26)
+
+
+### Bug Fixes
+
+* add meridiem in ar locales ([#1375](https://github.com/iamkun/dayjs/issues/1375)) ([319f616](https://github.com/iamkun/dayjs/commit/319f616e572a03b984013d04d1b3a18ffd5b1190))
+* Added Zulu support to customParseFormat ([#1359](https://github.com/iamkun/dayjs/issues/1359)) ([1138a3f](https://github.com/iamkun/dayjs/commit/1138a3f0a76592c6d72fb86c4399e133fa41e2ec))
+* fix Bengali [bn] locale monthsShort error ([a0e6c0c](https://github.com/iamkun/dayjs/commit/a0e6c0cf3e1828020dfa11432c6716990f6ed5e0))
+* fix missing types for ArraySupport plugin ([#1401](https://github.com/iamkun/dayjs/issues/1401)) ([b1abdc4](https://github.com/iamkun/dayjs/commit/b1abdc40ee6c9d18ff46c311a114e0755677ea6f))
+* fix Ukrainian [uk] locale ([#1463](https://github.com/iamkun/dayjs/issues/1463)) ([0fdac93](https://github.com/iamkun/dayjs/commit/0fdac93ff2531542301b76952be9b084b2e2dfa0))
+* hotfix for `Duration` types ([#1357](https://github.com/iamkun/dayjs/issues/1357)) ([855b7b3](https://github.com/iamkun/dayjs/commit/855b7b3d049a3903794f91db3419f167c00dabd2)), closes [#1354](https://github.com/iamkun/dayjs/issues/1354)
+* timezone plugin DST error ([#1352](https://github.com/iamkun/dayjs/issues/1352)) ([71bed15](https://github.com/iamkun/dayjs/commit/71bed155edf32bff24379930ac684fc783538d8f))
+* Update duration plugin change string to number ([#1394](https://github.com/iamkun/dayjs/issues/1394)) ([e1546d1](https://github.com/iamkun/dayjs/commit/e1546d1a0cdb97ae92cf11efe61d94707af6a3a3))
+* update Duration plugin to support no-argument ([#1400](https://github.com/iamkun/dayjs/issues/1400)) ([8d9a5ae](https://github.com/iamkun/dayjs/commit/8d9a5ae0749e1b4e76babd4deeaa3b1d9776c29b))
+* Update Finnish [fi] locale to set yearStart  ([#1378](https://github.com/iamkun/dayjs/issues/1378)) ([f3370bd](https://github.com/iamkun/dayjs/commit/f3370bda4e435118f714c8a7daf5c88cfc4b69ba))
+* update Russian [ru] locale meridiem and unit tests ([#1403](https://github.com/iamkun/dayjs/issues/1403)) ([f10f39d](https://github.com/iamkun/dayjs/commit/f10f39de7db70244a3c35e4a421090a12972457b))
+* update Russian [ru] locale yearStart config  ([#1372](https://github.com/iamkun/dayjs/issues/1372)) ([5052515](https://github.com/iamkun/dayjs/commit/5052515fe35b2444201ef8ef87220b1876a94d0a))
+* update Slovenian [sl] locale to set correct ordinal  ([#1386](https://github.com/iamkun/dayjs/issues/1386)) ([cb4f746](https://github.com/iamkun/dayjs/commit/cb4f74633b3020d6dbf19548c8cb13613dafca18))
+* update Spanish [es] locale to change month names to lowercase ([#1414](https://github.com/iamkun/dayjs/issues/1414)) ([9c20e77](https://github.com/iamkun/dayjs/commit/9c20e77caf7b1b5eccf418175203b198d4e29535))
+* update Swedish [sv] locale to set correct yearStart ([#1385](https://github.com/iamkun/dayjs/issues/1385)) ([66c5935](https://github.com/iamkun/dayjs/commit/66c59354964ef456bcd5f6152819618f44978082))
+* update UTC plugin to support string argument like +HH:mm ([#1395](https://github.com/iamkun/dayjs/issues/1395)) ([656127c](https://github.com/iamkun/dayjs/commit/656127cc44eda50923a1ac755602863fc32b9e69))
+
+## [1.10.4](https://github.com/iamkun/dayjs/compare/v1.10.3...v1.10.4) (2021-01-22)
+
+
+### Bug Fixes
+
+* Correct handling negative duration ([#1317](https://github.com/iamkun/dayjs/issues/1317)) ([3f5c085](https://github.com/iamkun/dayjs/commit/3f5c085608182472f20b84766b10949945663e44))
+* Improve `Duration` types ([#1338](https://github.com/iamkun/dayjs/issues/1338)) ([4aca4b1](https://github.com/iamkun/dayjs/commit/4aca4b1b584a15de1146d929f95c944594032f20))
+* parse a string for MMM month format with underscore delimiter ([#1349](https://github.com/iamkun/dayjs/issues/1349)) ([82ef9a3](https://github.com/iamkun/dayjs/commit/82ef9a304f06287ac0a14c4da9a7fe6152b5fec9))
+* Update Bengali [bn] locale ([#1329](https://github.com/iamkun/dayjs/issues/1329)) ([02d96ec](https://github.com/iamkun/dayjs/commit/02d96ec7189f62d6ef8987135919cbb5ceff20a6))
+* update locale Portuguese [pt] yearStart ([#1345](https://github.com/iamkun/dayjs/issues/1345)) ([5c785d5](https://github.com/iamkun/dayjs/commit/5c785d528cc08811638d7cbfc7fc158d67b32d75))
+* update Polish [pl] locale yearStart ([#1348](https://github.com/iamkun/dayjs/issues/1348)) ([e93e6b8](https://github.com/iamkun/dayjs/commit/e93e6b8ffa61036b26382f1763e3864d4a7d5df5))
+* Update Slovenian [sl] relativeTime locale ([#1333](https://github.com/iamkun/dayjs/issues/1333)) ([fe5f1d0](https://github.com/iamkun/dayjs/commit/fe5f1d0afbe57b70339e268047e6c3028ca3d59b))
+
+## [1.10.3](https://github.com/iamkun/dayjs/compare/v1.10.2...v1.10.3) (2021-01-09)
+
+
+### Bug Fixes
+
+* fix customParseFormat plugin strict mode parse meridiem bug ([#1321](https://github.com/iamkun/dayjs/issues/1321)) ([e49eeef](https://github.com/iamkun/dayjs/commit/e49eeefbe8acb36419d36ca2e7ed8bc152f73ac1))
+* fix weekYear plugin missing locale bug ([#1319](https://github.com/iamkun/dayjs/issues/1319)) ([344bdc0](https://github.com/iamkun/dayjs/commit/344bdc0eed6843edb05723dc7853a41833d88f08)), closes [#1304](https://github.com/iamkun/dayjs/issues/1304)
+* update advancedFormat plugin to add format options for iso week and weekyear ([#1309](https://github.com/iamkun/dayjs/issues/1309)) ([2c54c64](https://github.com/iamkun/dayjs/commit/2c54c6441871a175ac9b95e41e4cd075dbac10cb))
+* update devHelper to add dev warning setting locale before loading ([c5cc893](https://github.com/iamkun/dayjs/commit/c5cc89355e1e206ca72433c19c40cb528690b04f))
+* update German [de] locale yearStart ([1858df8](https://github.com/iamkun/dayjs/commit/1858df8008de56570680723df89b36a8cbc970ef)), closes [#1264](https://github.com/iamkun/dayjs/issues/1264)
+
+## [1.10.2](https://github.com/iamkun/dayjs/compare/v1.10.1...v1.10.2) (2021-01-05)
+
+
+### Bug Fixes
+
+* fix parse regex bug ([#1307](https://github.com/iamkun/dayjs/issues/1307)) ([db2b6a5](https://github.com/iamkun/dayjs/commit/db2b6a5ea8e70f9fda645d113ca33495aa96b616)), closes [#1305](https://github.com/iamkun/dayjs/issues/1305)
+* remove module entry in package.json to revert 1.10.1 change ([#1314](https://github.com/iamkun/dayjs/issues/1314)) ([824dcb8](https://github.com/iamkun/dayjs/commit/824dcb8dfcccf14f64b6a2741a00fcdfe53dcd98))
+* update devHelper add warning "passing Year as a Number will be parsed as a Unix timestamp" ([#1315](https://github.com/iamkun/dayjs/issues/1315)) ([b0dda31](https://github.com/iamkun/dayjs/commit/b0dda3139e25441ab4e7c1f4f192dee0ecce6ef8))
+
+## [1.10.1](https://github.com/iamkun/dayjs/compare/v1.10.0...v1.10.1) (2021-01-03)
+
+
+### Bug Fixes
+
+* fix typescript type error UnitTypeLongPlural ([#1302](https://github.com/iamkun/dayjs/issues/1302)) ([bfaabe4](https://github.com/iamkun/dayjs/commit/bfaabe4f398c11564eca6cda7c8aded22e1b231a)), closes [#1300](https://github.com/iamkun/dayjs/issues/1300)
+
+# [1.10.0](https://github.com/iamkun/dayjs/compare/v1.9.8...v1.10.0) (2021-01-03)
+
+
+### Bug Fixes
+
+* add ordinal to localeData plugin ([#1266](https://github.com/iamkun/dayjs/issues/1266)) ([fd229fa](https://github.com/iamkun/dayjs/commit/fd229fa5bd26bcba810e2535eb937ea8d99106c2))
+* add preParsePostFormat plugin & update Arabic [ar] locale ([#1255](https://github.com/iamkun/dayjs/issues/1255)) ([f2e4790](https://github.com/iamkun/dayjs/commit/f2e479006a9a49bc0917f8620101d40ac645f7f2))
+* add type support for plural forms of units ([#1289](https://github.com/iamkun/dayjs/issues/1289)) ([de49bb1](https://github.com/iamkun/dayjs/commit/de49bb100badfb92b9a5933cc568841f340a923f))
+* escape last period to match only milliseconds ([#1239](https://github.com/iamkun/dayjs/issues/1239)) ([#1295](https://github.com/iamkun/dayjs/issues/1295)) ([64037e6](https://github.com/iamkun/dayjs/commit/64037e6a8cf303dcfd2b954f309bd9691f87fffc))
+
+
+### Features
+
+* add ES6 Module Support, package.json module point to "esm/index.js" ([#1298](https://github.com/iamkun/dayjs/issues/1298)) ([f63375d](https://github.com/iamkun/dayjs/commit/f63375dea89becbd3bb2bb8ea7289c58c752bfed)), closes [#598](https://github.com/iamkun/dayjs/issues/598) [#313](https://github.com/iamkun/dayjs/issues/313)
+
+## [1.9.8](https://github.com/iamkun/dayjs/compare/v1.9.7...v1.9.8) (2020-12-27)
+
+
+### Bug Fixes
+
+* fix Ukrainian [uk] locale typo ([1605cc0](https://github.com/iamkun/dayjs/commit/1605cc0f6fe0e9c46a92d529bc9cd6e130432337))
+* update Hebrew [he] locale for double units ([#1287](https://github.com/iamkun/dayjs/issues/1287)) ([1c4b0da](https://github.com/iamkun/dayjs/commit/1c4b0da1468522e59dc9ee646d10dd2b31477d99))
+* update zh locale meridiem "noon" ([0e7ff3d](https://github.com/iamkun/dayjs/commit/0e7ff3dd29ca3aed85cb76dfcb8298d326e26542))
+* update zh-cn locale definition of noon  ([#1278](https://github.com/iamkun/dayjs/issues/1278)) ([d5930b9](https://github.com/iamkun/dayjs/commit/d5930b96ff884f4176ca3fcb1bc95e8f1ec75c71))
+
+## [1.9.7](https://github.com/iamkun/dayjs/compare/v1.9.6...v1.9.7) (2020-12-05)
+
+
+### Bug Fixes
+
+* add duration.format to format a Duration ([#1202](https://github.com/iamkun/dayjs/issues/1202)) ([9a859a1](https://github.com/iamkun/dayjs/commit/9a859a147ba223a1eeff0f2bb6f33d97e0ccc6c7))
+* Add function handling for relativeTime.future and relativeTime.past ([#1197](https://github.com/iamkun/dayjs/issues/1197)) ([ef1979c](https://github.com/iamkun/dayjs/commit/ef1979ce85c61fe2d759ef3c37cb6aaf2358094f))
+* avoid install installed plugin ([#1214](https://github.com/iamkun/dayjs/issues/1214)) ([a92eb6c](https://github.com/iamkun/dayjs/commit/a92eb6c4dc1437ec920e69484d52984f5921a8ea))
+* avoid memory leak after installing a plugin too many times ([b8d2e32](https://github.com/iamkun/dayjs/commit/b8d2e32a9eb59661a7ed6200daa070687becaebd))
+* fix diff bug when UTC plugin enabled ([#1201](https://github.com/iamkun/dayjs/issues/1201)) ([9544ed2](https://github.com/iamkun/dayjs/commit/9544ed2a6c466b8308d26b33a388a6737435a1f4)), closes [#1200](https://github.com/iamkun/dayjs/issues/1200)
+* fix startOf/endOf bug in timezone plugin ([#1229](https://github.com/iamkun/dayjs/issues/1229)) ([eb5fbc4](https://github.com/iamkun/dayjs/commit/eb5fbc4c7d1b62a8615d2f263b404a9515d8e15c))
+* fix utc plugin diff edge case ([#1187](https://github.com/iamkun/dayjs/issues/1187)) ([971b3d4](https://github.com/iamkun/dayjs/commit/971b3d40b4c9403165138f1034e2223cd97c3abf))
+* update customParseFormat plugin to parse 2-digit offset ([#1209](https://github.com/iamkun/dayjs/issues/1209)) ([b56936a](https://github.com/iamkun/dayjs/commit/b56936ab77b8f6289a1b77d49307b495c4bf9f91)), closes [#1205](https://github.com/iamkun/dayjs/issues/1205)
+* Update timezone plugin type definition ([#1221](https://github.com/iamkun/dayjs/issues/1221)) ([34cfb92](https://github.com/iamkun/dayjs/commit/34cfb920b9653ad44d4b31fe49e533692a3ce01b))
+
+## [1.9.6](https://github.com/iamkun/dayjs/compare/v1.9.5...v1.9.6) (2020-11-10)
+
+
+### Bug Fixes
+
+* fix customParseFormat plugin parsing date bug ([#1198](https://github.com/iamkun/dayjs/issues/1198)) ([50f05ad](https://github.com/iamkun/dayjs/commit/50f05ad3addf27827c5657ae7519514e40d9faec)), closes [#1194](https://github.com/iamkun/dayjs/issues/1194)
+* Update lv (Latvian) locale relative time ([#1192](https://github.com/iamkun/dayjs/issues/1192)) ([6d6c684](https://github.com/iamkun/dayjs/commit/6d6c6841b13ba4f7e69de92caf132a3592c5253a))
+
+## [1.9.5](https://github.com/iamkun/dayjs/compare/v1.9.4...v1.9.5) (2020-11-05)
+
+
+### Bug Fixes
+
+* customParseFormat plugin supports parsing localizedFormats  ([#1110](https://github.com/iamkun/dayjs/issues/1110)) ([402b603](https://github.com/iamkun/dayjs/commit/402b603aa3ee4199786950bc88b3fdc6b527aa35))
+* fix customParseFormat plugin parse meridiem bug ([#1169](https://github.com/iamkun/dayjs/issues/1169)) ([9e8f8d9](https://github.com/iamkun/dayjs/commit/9e8f8d96c69d557f4d267f42567c25ae9e7ab227)), closes [#1168](https://github.com/iamkun/dayjs/issues/1168)
+* fix devHelper error in umd bundle in browser ([#1165](https://github.com/iamkun/dayjs/issues/1165)) ([d11b5ee](https://github.com/iamkun/dayjs/commit/d11b5ee7dc11af671355f65ccda00f6ba42cc725))
+* fix utc plugin diff bug in DST ([#1171](https://github.com/iamkun/dayjs/issues/1171)) ([f8da3fe](https://github.com/iamkun/dayjs/commit/f8da3fe7e50c84c0502bf5be0b364910922dbd79)), closes [#1097](https://github.com/iamkun/dayjs/issues/1097) [#1021](https://github.com/iamkun/dayjs/issues/1021)
+* isoWeek plugin type ([#1177](https://github.com/iamkun/dayjs/issues/1177)) ([c3d0436](https://github.com/iamkun/dayjs/commit/c3d0436b06f74989e3a2c751a5d170f8072c4aad))
+* update localeData plugin to support meridiem ([#1174](https://github.com/iamkun/dayjs/issues/1174)) ([fdb09e4](https://github.com/iamkun/dayjs/commit/fdb09e4074cc7e8f6196846f18d3566c1f9e8fcd)), closes [#1172](https://github.com/iamkun/dayjs/issues/1172)
+* update timezone plugin parse Date instance / timestamp logic & remove useless test ([#1183](https://github.com/iamkun/dayjs/issues/1183)) ([a7f858b](https://github.com/iamkun/dayjs/commit/a7f858bb70ad81f718ba35c479e84b54eace48b2))
+
+## [1.9.4](https://github.com/iamkun/dayjs/compare/v1.9.3...v1.9.4) (2020-10-23)
+
+
+### Bug Fixes
+
+* Add descriptions to types ([#1148](https://github.com/iamkun/dayjs/issues/1148)) ([9a407a1](https://github.com/iamkun/dayjs/commit/9a407a140b089345a387d1aceab4d0d1635229c7))
+* add devHelper plugin ([#1163](https://github.com/iamkun/dayjs/issues/1163)) ([de49dc8](https://github.com/iamkun/dayjs/commit/de49dc80c83b85de4170571b64412bd60ada221b))
+* Fix Hungarian (hu) locale ([#1112](https://github.com/iamkun/dayjs/issues/1112)) ([ab13754](https://github.com/iamkun/dayjs/commit/ab13754f43c5033dacaa0eb2042dc4ab1a7a2754))
+* fix minMax plugin parsing empty array bug ([#1062](https://github.com/iamkun/dayjs/issues/1062)) ([368108b](https://github.com/iamkun/dayjs/commit/368108bc6d5cb1542f711b8eba722bd4dfaab0cd))
+* update adding/subtracting Duration from Dayjs object ([#1156](https://github.com/iamkun/dayjs/issues/1156)) ([f861aca](https://github.com/iamkun/dayjs/commit/f861acac3e83e28d3a4a96312c71119fd6b544fc))
+* update en-NZ locale to use proper ordinal formatting function ([#1143](https://github.com/iamkun/dayjs/issues/1143)) ([fcdbc58](https://github.com/iamkun/dayjs/commit/fcdbc5880710456a29b2bacf250542230bf48b99))
+* update localeData plugin type ([#1116](https://github.com/iamkun/dayjs/issues/1116)) ([ee5a4ec](https://github.com/iamkun/dayjs/commit/ee5a4ec41edddfb57d103c35182dc635c9264a10))
+* update timezone plugin to support custom parse format ([#1160](https://github.com/iamkun/dayjs/issues/1160)) ([48cbf31](https://github.com/iamkun/dayjs/commit/48cbf3118ba5427de428777c2e025896db654f2e)), closes [#1159](https://github.com/iamkun/dayjs/issues/1159)
+* update timezone plugin to support keepLocalTime ([#1161](https://github.com/iamkun/dayjs/issues/1161)) ([1d429e5](https://github.com/iamkun/dayjs/commit/1d429e5fe4467ebddcf81b43cf6f36e5e3be944c)), closes [#1149](https://github.com/iamkun/dayjs/issues/1149)
+
+## [1.9.3](https://github.com/iamkun/dayjs/compare/v1.9.2...v1.9.3) (2020-10-13)
+
+
+### Bug Fixes
+
+* fix localizedFormat export error ([#1133](https://github.com/iamkun/dayjs/issues/1133)) ([deecd6a](https://github.com/iamkun/dayjs/commit/deecd6ab8a2f4173ee7046f6b568b41fd2677531)), closes [#1132](https://github.com/iamkun/dayjs/issues/1132)
+
+## [1.9.2](https://github.com/iamkun/dayjs/compare/v1.9.1...v1.9.2) (2020-10-13)
+
+
+### Bug Fixes
+
+* add arraySupport plugin ([#1129](https://github.com/iamkun/dayjs/issues/1129)) ([be505c2](https://github.com/iamkun/dayjs/commit/be505c2c540261027342cecc55d8919a3d18d893))
+* export type of duration plugin ([#1094](https://github.com/iamkun/dayjs/issues/1094)) ([2c92e71](https://github.com/iamkun/dayjs/commit/2c92e71bf55d09601120cdf433da7a19cc8abff6))
+* Fix LocaleData plugin longDateFormat lowercase error ([#1101](https://github.com/iamkun/dayjs/issues/1101)) ([7937ccd](https://github.com/iamkun/dayjs/commit/7937ccdeac47d094a60e65ebb62a6020b81c46f4))
+* Fix objectSupport plugin bug in UTC ([#1107](https://github.com/iamkun/dayjs/issues/1107)) ([fe90bb6](https://github.com/iamkun/dayjs/commit/fe90bb6944f2ff1969ca975954d303b449dfa95b)), closes [#1105](https://github.com/iamkun/dayjs/issues/1105)
+* fix Serbian locale grammar (sr, sr-cyrl) ([#1108](https://github.com/iamkun/dayjs/issues/1108)) ([cc87eff](https://github.com/iamkun/dayjs/commit/cc87eff8b75b0d86ce0956516319d402bccae6c0))
+* Fix typo for "monday" in arabic ([#1067](https://github.com/iamkun/dayjs/issues/1067)) ([2e1e426](https://github.com/iamkun/dayjs/commit/2e1e42650124f30282dc4d710798d576b928f1c7))
+* support dayjs.add(Duration), dayjs.subtract(Duration) ([#1099](https://github.com/iamkun/dayjs/issues/1099)) ([b1a0294](https://github.com/iamkun/dayjs/commit/b1a02942c5238203aaa04ce9a074c73742324ab7))
+* update Breton [br] locale relativeTime config ([#1103](https://github.com/iamkun/dayjs/issues/1103)) ([b038bfd](https://github.com/iamkun/dayjs/commit/b038bfdb128889d677c95534d2be29cc30c9e72f))
+* update Catalan [ca] locale ordinal ([73da380](https://github.com/iamkun/dayjs/commit/73da38024c8b550bdcfbe3ff7e578e742c7aecf2))
+* update German [de] locale relativeTime config ([#1109](https://github.com/iamkun/dayjs/issues/1109)) ([f6e771b](https://github.com/iamkun/dayjs/commit/f6e771b70f93d19ebb12e6b794aa4628a1796248))
+* update localeData plugin to add longDateFormat to global localeData ([#1106](https://github.com/iamkun/dayjs/issues/1106)) ([16937d1](https://github.com/iamkun/dayjs/commit/16937d16e053b8c1d4a607622fa2fdbfd9809832))
+* Update objectSupport plugin to return current date time while parsing empty object ([f56783e](https://github.com/iamkun/dayjs/commit/f56783e14d8cf50916b015e7188b23bb6fbca839))
+
+## [1.9.1](https://github.com/iamkun/dayjs/compare/v1.9.0...v1.9.1) (2020-09-28)
+
+
+### Bug Fixes
+
+* Fix objectSupport plugin to get the correct result (zero-based month) ([#1089](https://github.com/iamkun/dayjs/issues/1089)) ([f95ac15](https://github.com/iamkun/dayjs/commit/f95ac15a4577ae5a3d1ce353872a2cd9fc454bc2))
+
+# [1.9.0](https://github.com/iamkun/dayjs/compare/v1.8.36...v1.9.0) (2020-09-28)
+
+
+### Bug Fixes
+
+* Add `setDefault` typing to timezone.d.ts ([#1057](https://github.com/iamkun/dayjs/issues/1057)) ([c0f0886](https://github.com/iamkun/dayjs/commit/c0f088620f17260e6e3ebce7697d561b5623f5f3))
+* fix DST bug in utc plugin ([#1053](https://github.com/iamkun/dayjs/issues/1053)) ([3d73543](https://github.com/iamkun/dayjs/commit/3d7354361f042ced1176d91f9ae9edffe6173425))
+* Fix optional type for timezone plugin ([#1081](https://github.com/iamkun/dayjs/issues/1081)) ([a6ebcf2](https://github.com/iamkun/dayjs/commit/a6ebcf283a83273562dce5663155e3b3a12ea9a5)), closes [#1079](https://github.com/iamkun/dayjs/issues/1079)
+* Fix timezone plugin conversion bug ([#1073](https://github.com/iamkun/dayjs/issues/1073)) ([16816a3](https://github.com/iamkun/dayjs/commit/16816a31ff43220aca9d1d179df6b729182abb55))
+* update duration plugin type file ([#1065](https://github.com/iamkun/dayjs/issues/1065)) ([94af9af](https://github.com/iamkun/dayjs/commit/94af9af27c5bc182cbb24f1845e561dd1d82d776))
+* update timezone plugin to support getting offset name e.g. EST ([#1069](https://github.com/iamkun/dayjs/issues/1069)) ([cbb755e](https://github.com/iamkun/dayjs/commit/cbb755e5c68d49c5678291f3ce832b32831a056e))
+* update utc plugin to support keepLocalTime `.utc(true)` ([#1080](https://github.com/iamkun/dayjs/issues/1080)) ([5ce4e0d](https://github.com/iamkun/dayjs/commit/5ce4e0d2f552f3645262537ff7afdc946f5a7e72))
+
+
+### Features
+
+* Correct casing for en-sg locale name ([#1048](https://github.com/iamkun/dayjs/issues/1048)) ([2edaddc](https://github.com/iamkun/dayjs/commit/2edaddc22a7eb914f915531f389766217acd7034))
+
+## [1.8.36](https://github.com/iamkun/dayjs/compare/v1.8.35...v1.8.36) (2020-09-17)
+
+
+### Bug Fixes
+
+* Add Amharic (am) locale ([#1046](https://github.com/iamkun/dayjs/issues/1046)) ([cdc49a1](https://github.com/iamkun/dayjs/commit/cdc49a1911c74b7ea96ed222f42796d53715cfed))
+* Export Duration type in duration plugin ([#1043](https://github.com/iamkun/dayjs/issues/1043)) ([0f20c3a](https://github.com/iamkun/dayjs/commit/0f20c3ac75d9ac1026a15a7bb343d3a150d9b30f))
+* Fix duration plugin parsing milliseconds bug ([#1042](https://github.com/iamkun/dayjs/issues/1042)) ([fe2301b](https://github.com/iamkun/dayjs/commit/fe2301b22318886aaa89ed1620e0a118e98c2b8a))
+* Timezone plugin set default timezone ([#1033](https://github.com/iamkun/dayjs/issues/1033)) ([0c2050a](https://github.com/iamkun/dayjs/commit/0c2050a152da708b01edd6150a5013f642b14576))
+* Timezone plugin should have the same behavior in latest ICU version ([#1032](https://github.com/iamkun/dayjs/issues/1032)) ([de31592](https://github.com/iamkun/dayjs/commit/de315921575cc50c38464b27d0338e30a54d8e2a))
+* Update Finnish (fi) locale ([#963](https://github.com/iamkun/dayjs/issues/963)) ([cf8b6a0](https://github.com/iamkun/dayjs/commit/cf8b6a096f24b54cbdb95675ac386d8ac85ea616))
+* Update Polish (pl) , Hungarian (hr) and Lithuanian (lt) localization ([#1045](https://github.com/iamkun/dayjs/issues/1045)) ([638fd39](https://github.com/iamkun/dayjs/commit/638fd394fc24f4188390faf387da6b156e7c6320))
+
+## [1.8.35](https://github.com/iamkun/dayjs/compare/v1.8.34...v1.8.35) (2020-09-02)
+
+
+### Bug Fixes
+
+* Fix BadMutable plugin bug in .diff ([#1023](https://github.com/iamkun/dayjs/issues/1023)) ([40ab6d9](https://github.com/iamkun/dayjs/commit/40ab6d9a53e8047cfca63c611c25dd045372d021))
+* fix LocaleData plugin to support instance.weekdays() API ([#1019](https://github.com/iamkun/dayjs/issues/1019)) ([a09d259](https://github.com/iamkun/dayjs/commit/a09d259a407b81d1cb6bb5623fad551c775d8674)), closes [#1017](https://github.com/iamkun/dayjs/issues/1017)
+* Update Dutch (nl) locale to set correct yearStart ([1533a2c](https://github.com/iamkun/dayjs/commit/1533a2cc1475270032da2d87b19fc3d62327e6e3))
+
+## [1.8.34](https://github.com/iamkun/dayjs/compare/v1.8.33...v1.8.34) (2020-08-20)
+
+
+### Bug Fixes
+
+* Fix Timezone plugin to preserve milliseconds while changing timezone ([#1003](https://github.com/iamkun/dayjs/issues/1003)) ([5f446ed](https://github.com/iamkun/dayjs/commit/5f446eda770fa97e895c81a8195b3ba5d082cef0)), closes [#1002](https://github.com/iamkun/dayjs/issues/1002)
+* support parsing unlimited decimals of millisecond ([#1010](https://github.com/iamkun/dayjs/issues/1010)) ([d1bdd36](https://github.com/iamkun/dayjs/commit/d1bdd36a56e3d1786523a180e3fc18068f609135)), closes [#544](https://github.com/iamkun/dayjs/issues/544)
+* update Duration plugin to support global locale ([#1008](https://github.com/iamkun/dayjs/issues/1008)) ([1c49c83](https://github.com/iamkun/dayjs/commit/1c49c83e79811eede13db6372b5d65db598aee77)), closes [#1007](https://github.com/iamkun/dayjs/issues/1007)
+
+## [1.8.33](https://github.com/iamkun/dayjs/compare/v1.8.32...v1.8.33) (2020-08-10)
+
+
+### Bug Fixes
+
+* Add PluralGetSet plugin for plural getters/setters ([#996](https://github.com/iamkun/dayjs/issues/996)) ([f76e3ce](https://github.com/iamkun/dayjs/commit/f76e3ce2fbe5d3e9ed9121086baf55eb0cc4d355))
+* Add typescript type defs in esm build ([#985](https://github.com/iamkun/dayjs/issues/985)) ([50e3b3c](https://github.com/iamkun/dayjs/commit/50e3b3c6719cb0b4ec6eff394dacd63d5db8f253))
+* Fix isoWeek Plugin cal bug in UTC mode ([#993](https://github.com/iamkun/dayjs/issues/993)) ([f2e5f32](https://github.com/iamkun/dayjs/commit/f2e5f327aaf12b4572296ec6e107ecc05fcf76e7))
+* Fix Timezone plugin parsing js date, Day.js object, timestamp bug && update type file ([#994](https://github.com/iamkun/dayjs/issues/994)) ([22f3d49](https://github.com/iamkun/dayjs/commit/22f3d49405da98db6da56d1673eebcd01b57554b)), closes [#992](https://github.com/iamkun/dayjs/issues/992) [#989](https://github.com/iamkun/dayjs/issues/989)
+* Fix Timezone plugin UTCOffset rounding bug ([#987](https://github.com/iamkun/dayjs/issues/987)) ([b07182b](https://github.com/iamkun/dayjs/commit/b07182bbdf5aef7f6bf1e88fcd38432e2b8ee465)), closes [#986](https://github.com/iamkun/dayjs/issues/986)
+* Fix UTC plugin bug while comparing an utc instance to a local one ([#995](https://github.com/iamkun/dayjs/issues/995)) ([747c0fb](https://github.com/iamkun/dayjs/commit/747c0fb4eba6353755b5dad3417fd8d5a408c378))
+* Update pt-br locale weekStart 0 ([#984](https://github.com/iamkun/dayjs/issues/984)) ([0f881c1](https://github.com/iamkun/dayjs/commit/0f881c18efb02b9d0ba7f76cba92bb504226fa95))
+
+## [1.8.32](https://github.com/iamkun/dayjs/compare/v1.8.31...v1.8.32) (2020-08-04)
+
+
+### Bug Fixes
+
+* Add Experimental Timezone Plugin ([#974](https://github.com/iamkun/dayjs/issues/974)) ([e69caba](https://github.com/iamkun/dayjs/commit/e69caba1b0957241a855aa0ae38db899fa2c3795))
+* fix parse date string error e.g. '2020/9/30' ([#980](https://github.com/iamkun/dayjs/issues/980)) ([231790d](https://github.com/iamkun/dayjs/commit/231790da62af0494732960c2c50d86ae9bf63ec6)), closes [#979](https://github.com/iamkun/dayjs/issues/979)
+* update monthDiff function to get more accurate results ([19e8a7f](https://github.com/iamkun/dayjs/commit/19e8a7f2f7582b717f49d446822e39603694433c))
+* Update UTC plugin to support keepLocalTime ([#973](https://github.com/iamkun/dayjs/issues/973)) ([9f488e5](https://github.com/iamkun/dayjs/commit/9f488e5aca92f0b4c2951459436829d79f86d8d7))
+
+## [1.8.31](https://github.com/iamkun/dayjs/compare/v1.8.30...v1.8.31) (2020-07-29)
+
+
+### Bug Fixes
+
+* Rollback LocalePresetType to string ([#968](https://github.com/iamkun/dayjs/issues/968)) ([b342bd3](https://github.com/iamkun/dayjs/commit/b342bd3d84987d6c7587a0c4590d614fb0e670d7))
+* Update Regex to parse 'YYYY' correctly ([#969](https://github.com/iamkun/dayjs/issues/969)) ([70c1239](https://github.com/iamkun/dayjs/commit/70c123990dcc6bd479fa2b5d7f9985127872a826))
+
+## [1.8.30](https://github.com/iamkun/dayjs/compare/v1.8.29...v1.8.30) (2020-07-22)
+
+
+### Bug Fixes
+
+* Add Haitian Creole (ht) and Spanish Puerto Rico (es-pr) locale configs ([#958](https://github.com/iamkun/dayjs/issues/958)) ([b2642e2](https://github.com/iamkun/dayjs/commit/b2642e2d1f87734a34808c66e5176cb18bc0414d))
+* Fix UTC plugin wrong hour bug while adding month or year  ([#957](https://github.com/iamkun/dayjs/issues/957)) ([28ae070](https://github.com/iamkun/dayjs/commit/28ae070024ff26685c88ce4cc8747307e86923c9))
+* Update French (fr) locale to set correct yearStart ([14ab808](https://github.com/iamkun/dayjs/commit/14ab808a7b7e226f2eb2cbe894916a18ed5d967d)), closes [#956](https://github.com/iamkun/dayjs/issues/956)
+
+## [1.8.29](https://github.com/iamkun/dayjs/compare/v1.8.28...v1.8.29) (2020-07-02)
+
+
+### Bug Fixes
+
+* Duration plugin supports parse ISO string with week (W) ([#950](https://github.com/iamkun/dayjs/issues/950)) ([f0fc12a](https://github.com/iamkun/dayjs/commit/f0fc12adadcab53fb0577ad8f5e2f1cf784fd8f5))
+* LocaleData plugin supports locale order ([#938](https://github.com/iamkun/dayjs/issues/938)) ([62f429d](https://github.com/iamkun/dayjs/commit/62f429db73a0a069b1267231dea172b85f4b90e3)), closes [#936](https://github.com/iamkun/dayjs/issues/936)
+* Update type definition to support array format ([#945](https://github.com/iamkun/dayjs/issues/945)) ([81d4740](https://github.com/iamkun/dayjs/commit/81d4740511d47e34f891b21afeb0449ef8a28688)), closes [#944](https://github.com/iamkun/dayjs/issues/944)
+* Update type definition to support strict mode ([#951](https://github.com/iamkun/dayjs/issues/951)) ([8d54f3f](https://github.com/iamkun/dayjs/commit/8d54f3f7d4d161e72c767fa09699e70a2b3d681c))
+
+## [1.8.28](https://github.com/iamkun/dayjs/compare/v1.8.27...v1.8.28) (2020-05-28)
+
+
+### Bug Fixes
+
+* Fix CustomParseFormat plugin month index error ([#918](https://github.com/iamkun/dayjs/issues/918)) ([fa2ec7f](https://github.com/iamkun/dayjs/commit/fa2ec7fcb980dcd2c7498dafe2f9ca2e52d735cf)), closes [#915](https://github.com/iamkun/dayjs/issues/915)
+* Update Ukrainian (uk) locale monthFormat and monthStandalone ([#899](https://github.com/iamkun/dayjs/issues/899)) ([a08756e](https://github.com/iamkun/dayjs/commit/a08756e80bd1d7126fca28c5ad9e382613fc86c4))
+
+## [1.8.27](https://github.com/iamkun/dayjs/compare/v1.8.26...v1.8.27) (2020-05-14)
+
+
+### Bug Fixes
+
+* Add Kinyarwanda (rw) locale ([#903](https://github.com/iamkun/dayjs/issues/903)) ([f355235](https://github.com/iamkun/dayjs/commit/f355235a836540d77880959fb1b614c87e9f7b3e))
+* Add plugin objectSupport ([#887](https://github.com/iamkun/dayjs/issues/887)) ([52dfb13](https://github.com/iamkun/dayjs/commit/52dfb13a6b84f0a753cc5761192b92416f440961))
+* Add Turkmen (tk) locale ([#893](https://github.com/iamkun/dayjs/issues/893)) ([a9ca8dc](https://github.com/iamkun/dayjs/commit/a9ca8dcbbd0964c5b9abb4e8a2d620c983cf091a))
+* Fix CustomParseFormat plugin set locale error ([#896](https://github.com/iamkun/dayjs/issues/896)) ([8035c8a](https://github.com/iamkun/dayjs/commit/8035c8a760549b631252252718db3cdc4ab2f68f))
+* Fix locale month function bug ([#908](https://github.com/iamkun/dayjs/issues/908)) ([bf347c3](https://github.com/iamkun/dayjs/commit/bf347c36e401f50727fb5afcc537497b54b90d6b))
+* Update CustomParseFormat plugin to support Array formats ([#906](https://github.com/iamkun/dayjs/issues/906)) ([97856c6](https://github.com/iamkun/dayjs/commit/97856c603ef5fbbeb1cf8a42387479e56a77dbe8))
+
+## [1.8.26](https://github.com/iamkun/dayjs/compare/v1.8.25...v1.8.26) (2020-04-30)
+
+
+### Bug Fixes
+
+* Fix Duration plugin `.toISOString` format bug ([#889](https://github.com/iamkun/dayjs/issues/889)) ([058d624](https://github.com/iamkun/dayjs/commit/058d624808fd2be024ae846bcb2e03885f39b556)), closes [#888](https://github.com/iamkun/dayjs/issues/888)
+* Fix WeekOfYear plugin bug while using BadMutable plugin ([#884](https://github.com/iamkun/dayjs/issues/884)) ([2977438](https://github.com/iamkun/dayjs/commit/2977438458542573a4500e21f7ba5d1f8442960e))
+* Update CustomParseFormat plugin strict mode ([#882](https://github.com/iamkun/dayjs/issues/882)) ([db642ac](https://github.com/iamkun/dayjs/commit/db642ac73e52e00d8c41546b2935c9e691cf66e0))
+* Update RelativeTime plugin default config ([#883](https://github.com/iamkun/dayjs/issues/883)) ([0606f42](https://github.com/iamkun/dayjs/commit/0606f425aef8ccbfc3da3e43cba368130603b0cc))
+
+## [1.8.25](https://github.com/iamkun/dayjs/compare/v1.8.24...v1.8.25) (2020-04-21)
+
+
+### Bug Fixes
+
+* Fix CustomParseFormat plugin of parsing only YYYY / YYYY-MM bug ([#873](https://github.com/iamkun/dayjs/issues/873)) ([3cea04d](https://github.com/iamkun/dayjs/commit/3cea04d33d54d44bbdd3d026b5c7f67ebf176116)), closes [#849](https://github.com/iamkun/dayjs/issues/849)
+* Fix Duration plugin get seconds ([#867](https://github.com/iamkun/dayjs/issues/867)) ([62b092d](https://github.com/iamkun/dayjs/commit/62b092d9f9a3db5506ef01f798bdf211f163f53f))
+* Fix type definition of locale ([9790b85](https://github.com/iamkun/dayjs/commit/9790b853e6113243a7f4a81dd12c6509e406a102))
+* Fix UTC plugin startOf, endOf bug ([#872](https://github.com/iamkun/dayjs/issues/872)) ([4141084](https://github.com/iamkun/dayjs/commit/4141084ba96d35cadcda3f1e661bf1d0f6c8e4de)), closes [#809](https://github.com/iamkun/dayjs/issues/809) [#808](https://github.com/iamkun/dayjs/issues/808)
+
+## [1.8.24](https://github.com/iamkun/dayjs/compare/v1.8.23...v1.8.24) (2020-04-10)
+
+
+### Bug Fixes
+
+* Add config option to RelativeTime plugin ([#851](https://github.com/iamkun/dayjs/issues/851)) ([bd24034](https://github.com/iamkun/dayjs/commit/bd24034b95bfc656024b75ef3f3c986708845fed))
+* add Duration plugin ([#858](https://github.com/iamkun/dayjs/issues/858)) ([d568273](https://github.com/iamkun/dayjs/commit/d568273223199ca0497f238e2cc3a8d3dcf32d0f))
+* Add en-in, en-tt locales ([#855](https://github.com/iamkun/dayjs/issues/855)) ([c39fb96](https://github.com/iamkun/dayjs/commit/c39fb96e2a9102c14b004c14a6c073af9d266f2f))
+* add isToday, isTomorrow, isYesterday plugins ([#857](https://github.com/iamkun/dayjs/issues/857)) ([fc08ab6](https://github.com/iamkun/dayjs/commit/fc08ab68f8a28269802deeab9d6b0473b92cdc51))
+* Add option callback to Calendar plugin ([#839](https://github.com/iamkun/dayjs/issues/839)) ([b25be90](https://github.com/iamkun/dayjs/commit/b25be9094325295310c8fc5e617fb058be8a5f68))
+* Fix monthsShort for locale fr ([#862](https://github.com/iamkun/dayjs/issues/862)) ([d2de9a0](https://github.com/iamkun/dayjs/commit/d2de9a0b44b830038ed0094f79bfd40726311f2a))
+* Update Breton locale (br) meridiem config ([#856](https://github.com/iamkun/dayjs/issues/856)) ([a2a6672](https://github.com/iamkun/dayjs/commit/a2a66720abb788a8f1cffbfd0929b35579f29c72))
+* Update Ukrainian (uk) locale relative time ([#842](https://github.com/iamkun/dayjs/issues/842)) ([578bc1a](https://github.com/iamkun/dayjs/commit/578bc1a23c6e737783bbac3da12c0ed5d1edcf82))
+
+## [1.8.23](https://github.com/iamkun/dayjs/compare/v1.8.22...v1.8.23) (2020-03-16)
+
+
+### Bug Fixes
+
+* Add Chinese (zh) locale ([f9b8945](https://github.com/iamkun/dayjs/commit/f9b89453166d8b53d33b1d7eefd9942022552e6e))
+* Fix IsoWeek plugin typescript definition ([#828](https://github.com/iamkun/dayjs/issues/828)) ([30aab0c](https://github.com/iamkun/dayjs/commit/30aab0c7bce85dfac0ae208a891def30f88b5cb4))
+* Update Arabic (ar) locale relative time ([#836](https://github.com/iamkun/dayjs/issues/836)) ([14044c6](https://github.com/iamkun/dayjs/commit/14044c6fda1229e3f0e5473d3f886bd79589b15f))
+* Update Slovak (sk) locale,  Czech (cs) locale ([#833](https://github.com/iamkun/dayjs/issues/833)) ([f0d451f](https://github.com/iamkun/dayjs/commit/f0d451f795e9ebf752cd854d51b25b11de2343a3))
+* Update Thai (th) locale relativeTime ([#826](https://github.com/iamkun/dayjs/issues/826)) ([63b7c03](https://github.com/iamkun/dayjs/commit/63b7c03a6dbb0507d60776e8bad6cccde3828b88)), closes [#816](https://github.com/iamkun/dayjs/issues/816)
+
+## [1.8.22](https://github.com/iamkun/dayjs/compare/v1.8.21...v1.8.22) (2020-03-08)
+
+
+### Bug Fixes
+
+* Add IsoWeek plugin ([#811](https://github.com/iamkun/dayjs/issues/811)) ([28a2207](https://github.com/iamkun/dayjs/commit/28a2207ef9849afbac15dd29267b2e7a09cd3c16))
+* Fix unsupported locale fallback to previous one ([#819](https://github.com/iamkun/dayjs/issues/819)) ([4868715](https://github.com/iamkun/dayjs/commit/48687152cf5bee6a4c1b8ceea4bda8b9bab9be10))
+
+## [1.8.21](https://github.com/iamkun/dayjs/compare/v1.8.20...v1.8.21) (2020-02-26)
+
+
+### Bug Fixes
+
+* Set + Get accept 'D' as the short version of 'date' ([#795](https://github.com/iamkun/dayjs/issues/795)) ([523c038](https://github.com/iamkun/dayjs/commit/523c03880fa8bbad83214494ad02cd606cdb8b30))
+* Update DayOfYear plugin type ([#799](https://github.com/iamkun/dayjs/issues/799)) ([5809652](https://github.com/iamkun/dayjs/commit/5809652e40245b7759827d9bf317abdcfa75a330))
+* Update fi (Finnish) locale relativeTime ([#797](https://github.com/iamkun/dayjs/issues/797)) ([4a470fb](https://github.com/iamkun/dayjs/commit/4a470fbd6fef9e051727d0f26d53cc050b85935d))
+
+## [1.8.20](https://github.com/iamkun/dayjs/compare/v1.8.19...v1.8.20) (2020-02-04)
+
+
+### Bug Fixes
+
+* Add Bislama Locale (bi) ([#780](https://github.com/iamkun/dayjs/issues/780)) ([9ac6ab4](https://github.com/iamkun/dayjs/commit/9ac6ab481bc883dd4ecc02caab12c8b2fc218a42))
+* Fix weekOfYear plugin to support yearStart locale for better week number result ([#769](https://github.com/iamkun/dayjs/issues/769)) ([f00db36](https://github.com/iamkun/dayjs/commit/f00db36e70bc7beaca1abadeb30a9b1fbb3261ee))
+* Update et (Estonian) locale relativeTime ([#790](https://github.com/iamkun/dayjs/issues/790)) ([d8e0f45](https://github.com/iamkun/dayjs/commit/d8e0f45f6cd2d5e5704b9797929227454c92d1a5))
+* Update LocaleData plugin to support dayjs.localeData().weekdays() API ([287fed6](https://github.com/iamkun/dayjs/commit/287fed6db9eb4fd979b4861aca4dacbd32422533)), closes [#779](https://github.com/iamkun/dayjs/issues/779)
+* Update LocaleData plugin to support dayjs.months dayjs.weekdays API ([144c2ae](https://github.com/iamkun/dayjs/commit/144c2ae6e15fbf89e3acd7c8cb9e237c5f6e1348)), closes [#779](https://github.com/iamkun/dayjs/issues/779)
+* Update pl locale fusional config ([d372475](https://github.com/iamkun/dayjs/commit/d3724758bb27d5b17587b995ba14e7e80dcd1151))
+
+## [1.8.19](https://github.com/iamkun/dayjs/compare/v1.8.18...v1.8.19) (2020-01-06)
+
+
+### Bug Fixes
+
+* Add UpdateLocale plugin to update a locale's properties ([#766](https://github.com/iamkun/dayjs/issues/766)) ([82ce2ba](https://github.com/iamkun/dayjs/commit/82ce2ba8d7e402e40f6d005d400eb5356a0b0633))
+* Fix CustomParseFormat Plugin 'YYYY-MM' use first day of the month ([ba709ec](https://github.com/iamkun/dayjs/commit/ba709eca86a71ae648bc68bf67d9abdc229198d4)), closes [#761](https://github.com/iamkun/dayjs/issues/761)
+* Fix CustomParseFormat Plugin to set correct locale ([66ce23f](https://github.com/iamkun/dayjs/commit/66ce23f2e18c5506e8f1a7ef20d3483a4df80087))
+* Fix WeekOfYear Plugin wrong calender week number bug ([79b86db](https://github.com/iamkun/dayjs/commit/79b86dbbf3cfd3f1e2165b3d479a7061ad1b6925)), closes [#760](https://github.com/iamkun/dayjs/issues/760)
+* Update RelativeTime plugin to support function to make additional processing ([#767](https://github.com/iamkun/dayjs/issues/767)) ([4bd9250](https://github.com/iamkun/dayjs/commit/4bd9250fbe7131e2fddfb5fa1b3350e8c2262ca9))
+* Update ru, uk, cs locale to support relativeTime with plural ([3f080f7](https://github.com/iamkun/dayjs/commit/3f080f7d6bfdc4018cbb7c4d0112ff1ead4ef6b8))
+
+## [1.8.18](https://github.com/iamkun/dayjs/compare/v1.8.17...v1.8.18) (2019-12-18)
+
+
+### Bug Fixes
+
+* Add missing locale type definition ([#716](https://github.com/iamkun/dayjs/issues/716)) ([cde5d0b](https://github.com/iamkun/dayjs/commit/cde5d0b91be7b2f5f3098de4aa0b9a4f0f28ea5c))
+* Fix .locale() handel unsupported locale ([78ec173](https://github.com/iamkun/dayjs/commit/78ec173fcecc1299516ab7b44f4554d431b4b2fd))
+* Update Italian locale (it) ([#727](https://github.com/iamkun/dayjs/issues/727)) ([5b53e98](https://github.com/iamkun/dayjs/commit/5b53e98c0a3ba0eb9573a9c77caeb907439be9e7))
+* Update locale (fa) ([#733](https://github.com/iamkun/dayjs/issues/733)) ([9ad2e47](https://github.com/iamkun/dayjs/commit/9ad2e47e0569b23991bb0d5578f49c792c12df08))
+* Update locale (zh-cn) ([#706](https://github.com/iamkun/dayjs/issues/706)) ([e31e544](https://github.com/iamkun/dayjs/commit/e31e54414fb90e1f54da13a117748ba37f52645d))
+* Update locale (zh-cn) meridiem ([#735](https://github.com/iamkun/dayjs/issues/735)) ([15d1b81](https://github.com/iamkun/dayjs/commit/15d1b813e7faf5a1f9d1ea6fc673fd27ac49d8b1))
+* Update LocaleData plugin to support dayjs().longDateFormat() ([#734](https://github.com/iamkun/dayjs/issues/734)) ([aa0f210](https://github.com/iamkun/dayjs/commit/aa0f210a1e3c4f6aba61c3b96f9eb445b43a33f0)), closes [#680](https://github.com/iamkun/dayjs/issues/680)
+* Update Mongolian (mn) locale relativeTime ([#753](https://github.com/iamkun/dayjs/issues/753)) ([6d51435](https://github.com/iamkun/dayjs/commit/6d51435092c0c94d8e50256d3f0f058cdd15febe))
+* Update Swedish locale (sv) fix ordinal error ([#745](https://github.com/iamkun/dayjs/issues/745)) ([49670d5](https://github.com/iamkun/dayjs/commit/49670d5ae31e4e21636cc5a8bfe35fef0f6d9e4a)), closes [#743](https://github.com/iamkun/dayjs/issues/743)
+
+## [1.8.17](https://github.com/iamkun/dayjs/compare/v1.8.16...v1.8.17) (2019-11-06)
+
+
+### Bug Fixes
+
+* Fix set utcOffset in utc mode ([d148115](https://github.com/iamkun/dayjs/commit/d148115dad8f1a5afc0a64e9b8163dfeba4616b6))
+* Update advancedFormat plugin to support w ww wo week tokens … ([#678](https://github.com/iamkun/dayjs/issues/678)) ([26cfa63](https://github.com/iamkun/dayjs/commit/26cfa63a524b803f7966dac5464f9cbf8f63387e)), closes [#676](https://github.com/iamkun/dayjs/issues/676)
+* Update ka locale weekdays ([f8ca3d4](https://github.com/iamkun/dayjs/commit/f8ca3d4ba1d3cbe41613d3909c0627935a51a0c4))
+* Update nb locale ([#679](https://github.com/iamkun/dayjs/issues/679)) ([1063b0e](https://github.com/iamkun/dayjs/commit/1063b0e1b5c19a1354d233cc0f21438e7073233a))
+* Update Polish locale (pl)([#713](https://github.com/iamkun/dayjs/issues/713)) ([30d2f02](https://github.com/iamkun/dayjs/commit/30d2f026b47188833a4f44fee4bab52467d4a718))
+* Update Ukrainian locale (uk) ([#710](https://github.com/iamkun/dayjs/issues/710)) ([360161c](https://github.com/iamkun/dayjs/commit/360161cac75f597fdd51d9d1ff138601282a1b4b))
+* UTC plugin set utcOffset value ([#668](https://github.com/iamkun/dayjs/issues/668)) ([8877883](https://github.com/iamkun/dayjs/commit/88778838e71dd309e79cd1a8094d5bea36ca3390))
+
+## [1.8.16](https://github.com/iamkun/dayjs/compare/v1.8.15...v1.8.16) (2019-08-27)
+
+
+### Bug Fixes
+
+* Fix relativeTime Plugin .FromNow() result error in UTC mode ([a385d5c](https://github.com/iamkun/dayjs/commit/a385d5c))
+* Handle locale in WeekOfYear plugin ([#658](https://github.com/iamkun/dayjs/issues/658)) ([0e45b0a](https://github.com/iamkun/dayjs/commit/0e45b0a))
+* LocaleData plugin returns all months and weekdays data when pas no argument ([#645](https://github.com/iamkun/dayjs/issues/645)) ([95e70b4](https://github.com/iamkun/dayjs/commit/95e70b4))
+* Return null in toJSON if not valid ([#633](https://github.com/iamkun/dayjs/issues/633)) ([19affc8](https://github.com/iamkun/dayjs/commit/19affc8))
+* Update Danish (da) locale ([#626](https://github.com/iamkun/dayjs/issues/626)) ([ac2ec77](https://github.com/iamkun/dayjs/commit/ac2ec77))
+* Update Korean locale meridiem ([#642](https://github.com/iamkun/dayjs/issues/642)) ([b457146](https://github.com/iamkun/dayjs/commit/b457146))
+* update Occitan locale Catalan locale ([#630](https://github.com/iamkun/dayjs/issues/630)) ([fef135e](https://github.com/iamkun/dayjs/commit/fef135e))
+* update pt-br locale ([#628](https://github.com/iamkun/dayjs/issues/628)) ([ccf596d](https://github.com/iamkun/dayjs/commit/ccf596d))
+* Update weekdaysShort to some locale files ([#643](https://github.com/iamkun/dayjs/issues/643)) ([cc1f15f](https://github.com/iamkun/dayjs/commit/cc1f15f))
+
+## [1.8.15](https://github.com/iamkun/dayjs/compare/v1.8.14...v1.8.15) (2019-07-08)
+
+
+### Bug Fixes
+
+* Fix dayjs.locale() returns current global locale ([#602](https://github.com/iamkun/dayjs/issues/602)) ([790cd1a](https://github.com/iamkun/dayjs/commit/790cd1a))
+* Fix incorrect Thai locale translation of July ([#607](https://github.com/iamkun/dayjs/issues/607)) ([43cbfd3](https://github.com/iamkun/dayjs/commit/43cbfd3))
+* Lowercase french locale months and weekdays ([#615](https://github.com/iamkun/dayjs/issues/615)) ([e5a257c](https://github.com/iamkun/dayjs/commit/e5a257c))
+* Type - Export Ls object to query all available locales ([#623](https://github.com/iamkun/dayjs/issues/623)) ([f6bfae0](https://github.com/iamkun/dayjs/commit/f6bfae0))
+* Update  nb (Norsk Bokmål) locale ([#604](https://github.com/iamkun/dayjs/issues/604)) ([907f5c9](https://github.com/iamkun/dayjs/commit/907f5c9))
+* Update types of `.diff` API ([#617](https://github.com/iamkun/dayjs/issues/617)) ([f0f43d2](https://github.com/iamkun/dayjs/commit/f0f43d2))
+
+## [1.8.14](https://github.com/iamkun/dayjs/compare/v1.8.13...v1.8.14) (2019-05-07)
+
+
+### Bug Fixes
+
+* Fix `.format` API returns UTC offset when value is 0 bug ([b254964](https://github.com/iamkun/dayjs/commit/b254964))
+* Fix QuarterOfYear plugin bug ([#591](https://github.com/iamkun/dayjs/issues/591)) ([434f774](https://github.com/iamkun/dayjs/commit/434f774))
+* Fix UTC plugin add day DST bug ([#590](https://github.com/iamkun/dayjs/issues/590)) ([86cd839](https://github.com/iamkun/dayjs/commit/86cd839))
+
+## [1.8.13](https://github.com/iamkun/dayjs/compare/v1.8.12...v1.8.13) (2019-04-26)
+
+
+### Bug Fixes
+
+* Add missing relativeTime and formats for some locales ([#560](https://github.com/iamkun/dayjs/issues/560)) ([96b917e](https://github.com/iamkun/dayjs/commit/96b917e))
+* Add weekday (locale aware day of the week) plugin ([#569](https://github.com/iamkun/dayjs/issues/569)) ([9007cc5](https://github.com/iamkun/dayjs/commit/9007cc5)), closes [#559](https://github.com/iamkun/dayjs/issues/559)
+* Allow customizing "am" / "pm" strings with locale meridiem function ([#580](https://github.com/iamkun/dayjs/issues/580)) ([576e93e](https://github.com/iamkun/dayjs/commit/576e93e)), closes [#578](https://github.com/iamkun/dayjs/issues/578)
+* Fix `.add` day/week decimal rouding bug ([800f6c9](https://github.com/iamkun/dayjs/commit/800f6c9))
+* Fix `.diff` type definition error ([#565](https://github.com/iamkun/dayjs/issues/565)) ([c4921ae](https://github.com/iamkun/dayjs/commit/c4921ae)), closes [#561](https://github.com/iamkun/dayjs/issues/561)
+* Fix CustomParseFormat plugin bug ([#568](https://github.com/iamkun/dayjs/issues/568)) ([1f5a9db](https://github.com/iamkun/dayjs/commit/1f5a9db)), closes [#555](https://github.com/iamkun/dayjs/issues/555)
+* Fix relativeTime plugin Math.round bug ([40bea40](https://github.com/iamkun/dayjs/commit/40bea40))
+* skip square brackets in  buddhistEra, advancedFormat plugins ([#556](https://github.com/iamkun/dayjs/issues/556)) ([9279718](https://github.com/iamkun/dayjs/commit/9279718)), closes [#554](https://github.com/iamkun/dayjs/issues/554)
+* Update Indonesian locale([#574](https://github.com/iamkun/dayjs/issues/574)) ([0aa7143](https://github.com/iamkun/dayjs/commit/0aa7143))
+* Update locale month to support both array and function ([#581](https://github.com/iamkun/dayjs/issues/581)) ([b6599d3](https://github.com/iamkun/dayjs/commit/b6599d3))
+* Update LocalizedFormat plugin lowercase formats logic ([#557](https://github.com/iamkun/dayjs/issues/557)) ([d409304](https://github.com/iamkun/dayjs/commit/d409304))
+
+## [1.8.12](https://github.com/iamkun/dayjs/compare/v1.8.11...v1.8.12) (2019-04-02)
+
+
+### Bug Fixes
+
+* Add .get API ([7318797](https://github.com/iamkun/dayjs/commit/7318797))
+* Add 79 locales ([#541](https://github.com/iamkun/dayjs/issues/541)) ([f75a125](https://github.com/iamkun/dayjs/commit/f75a125))
+* Add Calendar plugin ([d1b9cf9](https://github.com/iamkun/dayjs/commit/d1b9cf9))
+* Add isoWeeksInYear plugin ([2db8631](https://github.com/iamkun/dayjs/commit/2db8631))
+* Add Occitan (oc-lnc) locale file ([#551](https://github.com/iamkun/dayjs/issues/551)) ([c30b715](https://github.com/iamkun/dayjs/commit/c30b715))
+* Add plugin minMax to sopport .max .min ([2870a23](https://github.com/iamkun/dayjs/commit/2870a23))
+* Fix set Month Year error in last day of the month ([d058f4a](https://github.com/iamkun/dayjs/commit/d058f4a))
+* Update ko locale weekdaysShort  ([#543](https://github.com/iamkun/dayjs/issues/543)) ([317fd3e](https://github.com/iamkun/dayjs/commit/317fd3e))
+* Update localizedFormat plugin to support lowercase localizable formats (l, ll, lll, llll) ([#546](https://github.com/iamkun/dayjs/issues/546)) ([f2b5ebf](https://github.com/iamkun/dayjs/commit/f2b5ebf))
+
+## [1.8.11](https://github.com/iamkun/dayjs/compare/v1.8.10...v1.8.11) (2019-03-21)
+
+
+### Bug Fixes
+
+* Add .add('quarter') .startOf('quarter') through plugin quarterOfYear ([dde39e9](https://github.com/iamkun/dayjs/commit/dde39e9)), closes [#537](https://github.com/iamkun/dayjs/issues/537) [#531](https://github.com/iamkun/dayjs/issues/531)
+* Add locale support for Azerbaijani language (az) ([#535](https://github.com/iamkun/dayjs/issues/535)) ([eeb20fa](https://github.com/iamkun/dayjs/commit/eeb20fa))
+* Correct typescript definition `add` ([22a249c](https://github.com/iamkun/dayjs/commit/22a249c)), closes [#531](https://github.com/iamkun/dayjs/issues/531)
+* Fix CustomParseFormat plugin formatting bug ([#536](https://github.com/iamkun/dayjs/issues/536)) ([8578546](https://github.com/iamkun/dayjs/commit/8578546)), closes [#533](https://github.com/iamkun/dayjs/issues/533)
+* Update pt locale ([#538](https://github.com/iamkun/dayjs/issues/538)) ([1ac9e1e](https://github.com/iamkun/dayjs/commit/1ac9e1e))
+
+## [1.8.10](https://github.com/iamkun/dayjs/compare/v1.8.9...v1.8.10) (2019-03-10)
+
+
+### Bug Fixes
+
+* **locale:** Add nepali (ne) locale ([#524](https://github.com/iamkun/dayjs/issues/524)) ([bdbec01](https://github.com/iamkun/dayjs/commit/bdbec01))
+* Add WeekYear plugin ([a892608](https://github.com/iamkun/dayjs/commit/a892608))
+* API .locale() with no argument should return current locale name string ([8d63d88](https://github.com/iamkun/dayjs/commit/8d63d88))
+* CustomParseFormat correct parse HH:mm:ss with only one digit like 0:12:10 ([600d547](https://github.com/iamkun/dayjs/commit/600d547))
+* CustomParseFormat plugin parse Do format string ([bf27fda](https://github.com/iamkun/dayjs/commit/bf27fda)), closes [#522](https://github.com/iamkun/dayjs/issues/522)
+* Expand setters like .year(2000) .hour(12) ([ac532a0](https://github.com/iamkun/dayjs/commit/ac532a0))
+* Move toObject, toArray API to separate plugin from core ([40a3431](https://github.com/iamkun/dayjs/commit/40a3431))
+
+## [1.8.9](https://github.com/iamkun/dayjs/compare/v1.8.8...v1.8.9) (2019-03-06)
+
+
+### Features
+
+* Add UTC mode with UTC plugin ([#517](https://github.com/iamkun/dayjs/issues/517)) ([caf335c](https://github.com/iamkun/dayjs/commit/caf335c))
+
+> For plugin developers: Please note, we have changed the name of some method in `Utils` in order to reduce the file size. ([#517](https://github.com/iamkun/dayjs/issues/517)) ([detail](https://github.com/iamkun/dayjs/pull/517/files#diff-2b4ca49d4bb0a774c4d4c1672d7aa781R46))
+
+### Bug Fixes
+
+* Add locale de-AT ([#515](https://github.com/iamkun/dayjs/issues/515)) ([d93f7b6](https://github.com/iamkun/dayjs/commit/d93f7b6))
+* Add locale zh-hk ([#516](https://github.com/iamkun/dayjs/issues/516)) ([5fc05a6](https://github.com/iamkun/dayjs/commit/5fc05a6))
+
+## [1.8.8](https://github.com/iamkun/dayjs/compare/v1.8.7...v1.8.8) (2019-02-25)
+
+
+### Bug Fixes
+
+* Update relativeTime plugin type definition ([de56f2c](https://github.com/iamkun/dayjs/commit/de56f2c))
+
+## [1.8.7](https://github.com/iamkun/dayjs/compare/v1.8.6...v1.8.7) (2019-02-24)
+
+
+### Bug Fixes
+
+* Add plugin type definitions ([#418](https://github.com/iamkun/dayjs/issues/418)) ([361d437](https://github.com/iamkun/dayjs/commit/361d437))
+* Add Swahili locale ([#508](https://github.com/iamkun/dayjs/issues/508)) ([b9cee84](https://github.com/iamkun/dayjs/commit/b9cee84))
+* Parse month string 'MMMM MMM (February, Feb)' in customParseFormat ([#457](https://github.com/iamkun/dayjs/issues/457)) ([f343206](https://github.com/iamkun/dayjs/commit/f343206))
+* Update declaration file .diff .isBefore .isSame .isAfter ([#496](https://github.com/iamkun/dayjs/issues/496)) ([4523275](https://github.com/iamkun/dayjs/commit/4523275))
+* Word orders corrections for locale 'fa' ([#491](https://github.com/iamkun/dayjs/issues/491)) ([56050c2](https://github.com/iamkun/dayjs/commit/56050c2))
+
+## [1.8.6](https://github.com/iamkun/dayjs/compare/v1.8.5...v1.8.6) (2019-02-14)
+
+
+### Bug Fixes
+
+* Add Bahasa Melayu (Malaysia) locale ([#485](https://github.com/iamkun/dayjs/issues/485)) ([cb208b0](https://github.com/iamkun/dayjs/commit/cb208b0))
+* Copy & export built-in en locale to /locale folder as a separate file ([a7e05e0](https://github.com/iamkun/dayjs/commit/a7e05e0))
+* Fix bug in customParseFormat plugin while month(MM) is '01' ([9884ca5](https://github.com/iamkun/dayjs/commit/9884ca5)), closes [#494](https://github.com/iamkun/dayjs/issues/494)
+* Fix startOf week bug while week start is not Sunday ([5eaf77b](https://github.com/iamkun/dayjs/commit/5eaf77b))
+* Implemented isBetween inclusivity ([#464](https://github.com/iamkun/dayjs/issues/464)) ([af2f4f1](https://github.com/iamkun/dayjs/commit/af2f4f1))
+* Update Swedish and Finnish locales ([#488](https://github.com/iamkun/dayjs/issues/488)) ([f142082](https://github.com/iamkun/dayjs/commit/f142082))
+* Fix commonJS require ES Module bug in webpack4 ([23f9f3d](https://github.com/iamkun/dayjs/commit/23f9f3d)), check [#492](https://github.com/iamkun/dayjs/issues/492)
+
+> Get access to ESM code with `import dayjs from 'dayjs/esm'`
+
+## [1.8.5](https://github.com/iamkun/dayjs/compare/v1.8.4...v1.8.5) (2019-02-07)
+
+
+### Bug Fixes
+
+* Add en-gb locale ([#478](https://github.com/iamkun/dayjs/issues/478)) ([508c3a7](https://github.com/iamkun/dayjs/commit/508c3a7))
+* **module:** transpile everything except ES6 modules in the 'module' entrypoint ([#477](https://github.com/iamkun/dayjs/issues/477)) ([#480](https://github.com/iamkun/dayjs/issues/480)) ([#482](https://github.com/iamkun/dayjs/issues/482)) ([767017d](https://github.com/iamkun/dayjs/commit/767017d))
+* update customParseFormat plugin support hh:mm ([54947cc](https://github.com/iamkun/dayjs/commit/54947cc)), closes [#484](https://github.com/iamkun/dayjs/issues/484)
+* Update module in package.json ([5c5a7a0](https://github.com/iamkun/dayjs/commit/5c5a7a0))
+
+## [1.8.4](https://github.com/iamkun/dayjs/compare/v1.8.3...v1.8.4) (2019-02-05)
+
+* Allow set start day of week in locale && Allow set week in weekOfYear plugin ([1295591](https://github.com/iamkun/dayjs/commit/1295591))
+### Bug Fixes
+* update all locale files with correct week start ([5b03412](https://github.com/iamkun/dayjs/commit/5b03412))
+* update es es-do locale adding weekStart && update weekStart test ([66e42ec](https://github.com/iamkun/dayjs/commit/66e42ec))
+* Revert default export ([b00da1b](https://github.com/iamkun/dayjs/commit/b00da1b))
+
+## [1.8.3](https://github.com/iamkun/dayjs/compare/v1.8.2...v1.8.3) (2019-02-04)
+
+
+### Bug Fixes
+
+* fix ios safari YYYY-MM-DD HH:mm parse BUG ([e02ae82](https://github.com/iamkun/dayjs/commit/e02ae82)), closes [#254](https://github.com/iamkun/dayjs/issues/254)
+
+## [1.8.2](https://github.com/iamkun/dayjs/compare/v1.8.1...v1.8.2) (2019-02-02)
+
+
+### Bug Fixes
+
+* Add missing czech language locale ([#461](https://github.com/iamkun/dayjs/issues/461)) ([7e04004](https://github.com/iamkun/dayjs/commit/7e04004))
+* Add utcOffset api method and fix calculating diff error in DST ([#453](https://github.com/iamkun/dayjs/issues/453)) ([ce2e30e](https://github.com/iamkun/dayjs/commit/ce2e30e))
+* Fix it locale error ([#458](https://github.com/iamkun/dayjs/issues/458)) ([f6d9a64](https://github.com/iamkun/dayjs/commit/f6d9a64))
+* Add DayOfYear plugin (#454)
+* Fix es locale monthsShort error
+
+## [1.8.1](https://github.com/iamkun/dayjs/compare/v1.8.0...v1.8.1) (2019-02-02)
+
+* Add LocalizedFormat plugin supplying format like LTS, LT, LLLL 
+
+* <del>update declaration File with default export (#278)</del>
+> <del>From v1.8.1, in TypeScript Project, just `import from dayjs from 'dayjs'`</del>
+* add ES2015 module support (#451)
+
+### Performance Improvements
+
+* **format:** reuse matches instead of created when replacing ([#441](https://github.com/iamkun/dayjs/issues/441)) ([10b79d8](https://github.com/iamkun/dayjs/commit/10b79d8))
+
+# [1.8.0](https://github.com/iamkun/dayjs/compare/v1.7.8...v1.8.0) (2019-01-14)
+
+
+### Features
+
+* add CustomParseFormat plugin  and QuarterOfYear plugin ([#450](https://github.com/iamkun/dayjs/issues/450)) ([8f6f63c](https://github.com/iamkun/dayjs/commit/8f6f63c))
+
+## [1.7.8](https://github.com/iamkun/dayjs/compare/v1.7.7...v1.7.8) (2018-12-13)
+
+
+### Feature
+
+* update isSame isBefore isAfter supports units ([fd65464](https://github.com/iamkun/dayjs/commit/fd65464))
+
+* add greek lithuanian locales 
+
+## [1.7.7](https://github.com/iamkun/dayjs/compare/v1.7.6...v1.7.7) (2018-09-26)
+
+
+### Bug Fixes
+
+* **DST:** fix daylight saving time DST bug && add test ([#354](https://github.com/iamkun/dayjs/issues/354)) ([6fca6d5](https://github.com/iamkun/dayjs/commit/6fca6d5))
+
+## [1.7.6](https://github.com/iamkun/dayjs/compare/v1.7.5...v1.7.6) (2018-09-25)
+
+
+### Bug Fixes
+
+* **add dayjs.unix:** add dayjs.unix to parse timestamp in seconds && locale update ([5711c5e](https://github.com/iamkun/dayjs/commit/5711c5e))
+
+## [1.7.5](https://github.com/iamkun/dayjs/compare/v1.7.4...v1.7.5) (2018-08-10)
+
+
+### Bug Fixes
+
+* add isBetween API & update ([b5fc3d1](https://github.com/iamkun/dayjs/commit/b5fc3d1))
+
+## [1.7.4](https://github.com/iamkun/dayjs/compare/v1.7.3...v1.7.4) (2018-07-11)
+
+
+### Bug Fixes
+
+* update set week logic ([60b6325](https://github.com/iamkun/dayjs/commit/60b6325)), closes [#276](https://github.com/iamkun/dayjs/issues/276)
+
+## [1.7.3](https://github.com/iamkun/dayjs/compare/v1.7.2...v1.7.3) (2018-07-10)
+
+
+### Bug Fixes
+
+* **locale-nl:** set correct weekdays and months ([6d089d7](https://github.com/iamkun/dayjs/commit/6d089d7))
+
+## [1.7.2](https://github.com/iamkun/dayjs/compare/v1.7.1...v1.7.2) (2018-07-04)
+
+
+### Bug Fixes
+
+* DEPRECATED isLeapYear, use IsLeapYear plugin instead ([e2e5116](https://github.com/iamkun/dayjs/commit/e2e5116))
+
+## [1.7.1](https://github.com/iamkun/dayjs/compare/v1.7.0...v1.7.1) (2018-07-03)
+
+
+### Bug Fixes
+
+* fix week() error near the end of the year ([fa03689](https://github.com/iamkun/dayjs/commit/fa03689))
+
+# [1.7.0](https://github.com/iamkun/dayjs/compare/v1.6.10...v1.7.0) (2018-07-02)
+
+
+### Features
+
+* Added method `.week()` to retrieve week of the year ([e1c1b1c](https://github.com/iamkun/dayjs/commit/e1c1b1c))
+* Updated Japanese locae
+
+## [1.6.10](https://github.com/iamkun/dayjs/compare/v1.6.9...v1.6.10) (2018-06-25)
+
+
+### Bug Fixes
+
+* Add relative locales to russian language ([c7e9898](https://github.com/iamkun/dayjs/commit/c7e9898)), closes [#256](https://github.com/iamkun/dayjs/issues/256)
+
+## [1.6.9](https://github.com/iamkun/dayjs/compare/v1.6.8...v1.6.9) (2018-06-14)
+
+
+### Bug Fixes
+
+* add isDayjs => boolean API ([6227c8b](https://github.com/iamkun/dayjs/commit/6227c8b))
+
+## [1.6.8](https://github.com/iamkun/dayjs/compare/v1.6.7...v1.6.8) (2018-06-14)
+
+
+### Bug Fixes
+
+* fix  Advanced format bug in zh-cn ([0c07874](https://github.com/iamkun/dayjs/commit/0c07874)), closes [#242](https://github.com/iamkun/dayjs/issues/242)
+
+## [1.6.7](https://github.com/iamkun/dayjs/compare/v1.6.6...v1.6.7) (2018-06-11)
+
+
+### Bug Fixes
+
+* fix id locale ([1ebbeb8](https://github.com/iamkun/dayjs/commit/1ebbeb8)), closes [#234](https://github.com/iamkun/dayjs/issues/234)
+
+<a name="1.6.6"></a>
+## [1.6.6](https://github.com/iamkun/dayjs/compare/v1.6.5...v1.6.6) (2018-06-06)
+
+
+### Bug Fixes
+
+*  format API update and locale file update ([5ca48f0](https://github.com/iamkun/dayjs/commit/5ca48f0)), closes [#228](https://github.com/iamkun/dayjs/issues/228)
+
+<a name="1.6.5"></a>
+## [1.6.5](https://github.com/iamkun/dayjs/compare/v1.6.4...v1.6.5) (2018-05-31)
+
+
+### Bug Fixes
+
+* bugfix, utils update and  locale file update ([ebcb6d5](https://github.com/iamkun/dayjs/commit/ebcb6d5)), closes [#214](https://github.com/iamkun/dayjs/issues/214)
+
+<a name="1.6.4"></a>
+## [1.6.4](https://github.com/iamkun/dayjs/compare/v1.6.3...v1.6.4) (2018-05-25)
+
+
+### Bug Fixes
+
+* add RelativeTime plugin and locale file update ([c1fbbca](https://github.com/iamkun/dayjs/commit/c1fbbca)), closes [#198](https://github.com/iamkun/dayjs/issues/198)
+
+<a name="1.6.3"></a>
+## [1.6.3](https://github.com/iamkun/dayjs/compare/v1.6.2...v1.6.3) (2018-05-21)
+
+
+### Bug Fixes
+
+* Changing locales locally is immutable from this release ([2cce729](https://github.com/iamkun/dayjs/commit/2cce729)), closes [#182](https://github.com/iamkun/dayjs/issues/182)
+* instance locale change should be immutable ([84597c9](https://github.com/iamkun/dayjs/commit/84597c9))
+* Add more locales
+* english ordinal fix
+
+<a name="1.6.2"></a>
+## [1.6.2](https://github.com/iamkun/dayjs/compare/v1.6.1...v1.6.2) (2018-05-18)
+
+
+### Bug Fixes
+
+* change-log update && test new npm release ([aa49cba](https://github.com/iamkun/dayjs/commit/aa49cba)), closes [#163](https://github.com/iamkun/dayjs/issues/163)
+
+<a name="1.6.1"></a>
+## [1.6.1](https://github.com/iamkun/dayjs/compare/v1.6.0...v1.6.1) (2018-05-18)
+
+
+### Bug Fixes
+
+* Add German, Brazilian Portuguese locales
+* add() & parse() bug fix & add locale de, pt-br ([bf1331e](https://github.com/iamkun/dayjs/commit/bf1331e))
+
+<a name="1.6.0"></a>
+# [1.6.0](https://github.com/iamkun/dayjs/compare/v1.5.24...v1.6.0) (2018-05-15)
+
+
+### Features
+
+* Locale && Plugin ([2342c55](https://github.com/iamkun/dayjs/commit/2342c55)), closes [#141](https://github.com/iamkun/dayjs/issues/141)

+ 21 - 0
common/dayjs/LICENSE

@@ -0,0 +1,21 @@
+MIT License
+
+Copyright (c) 2018-present, iamkun
+
+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.

+ 139 - 0
common/dayjs/README.md

@@ -0,0 +1,139 @@
+English | [简体中文](./docs/zh-cn/README.zh-CN.md) | [日本語](./docs/ja/README-ja.md) | [Português Brasileiro](./docs/pt-br/README-pt-br.md) | [한국어](./docs/ko/README-ko.md) | [Español (España)](./docs/es-es/README-es-es.md) | [Русский](./docs/ru/README-ru.md) | [Türkçe](./docs/tr/README-tr.md) | [සිංහල](./docs/si/README-si.md)
+
+<p align="center"><a href="https://day.js.org/" target="_blank" rel="noopener noreferrer"><img width="550"
+                                                                             src="https://user-images.githubusercontent.com/17680888/39081119-3057bbe2-456e-11e8-862c-646133ad4b43.png"
+                                                                             alt="Day.js"></a></p>
+<p align="center">Fast <b>2kB</b> alternative to Moment.js with the same modern API</p>
+<p align="center">
+    <a href="https://unpkg.com/dayjs/dayjs.min.js"><img
+            src="https://img.badgesize.io/https://unpkg.com/dayjs/dayjs.min.js?compression=gzip&style=flat-square"
+            alt="Gzip Size"></a>
+    <a href="https://www.npmjs.com/package/dayjs"><img src="https://img.shields.io/npm/v/dayjs.svg?style=flat-square&colorB=51C838"
+                                                       alt="NPM Version"></a>
+    <a href="https://travis-ci.com/iamkun/dayjs"><img
+            src="https://img.shields.io/travis/iamkun/dayjs/master.svg?style=flat-square" alt="Build Status"></a>
+    <a href="https://codecov.io/gh/iamkun/dayjs"><img
+            src="https://img.shields.io/codecov/c/github/iamkun/dayjs/master.svg?style=flat-square" alt="Codecov"></a>
+    <a href="https://github.com/iamkun/dayjs/blob/master/LICENSE"><img
+            src="https://img.shields.io/badge/license-MIT-brightgreen.svg?style=flat-square" alt="License"></a>
+    <br>
+    <a href="https://saucelabs.com/u/dayjs">
+        <img width="750" src="https://user-images.githubusercontent.com/17680888/40040137-8e3323a6-584b-11e8-9dba-bbe577ee8a7b.png" alt="Sauce Test Status">
+    </a>
+</p>
+
+> Day.js is a minimalist JavaScript library that parses, validates, manipulates, and displays dates and times for modern browsers with a largely Moment.js-compatible API. If you use Moment.js, you already know how to use Day.js.
+
+```js
+dayjs().startOf('month').add(1, 'day').set('year', 2018).format('YYYY-MM-DD HH:mm:ss');
+```
+
+* 🕒 Familiar Moment.js API & patterns
+* 💪 Immutable
+* 🔥 Chainable
+* 🌐 I18n support
+* 📦 2kb mini library
+* 👫 All browsers supported
+
+---
+
+## Getting Started
+
+### Documentation
+
+You can find for more details, API, and other docs on [day.js.org](https://day.js.org/) website.
+
+### Installation
+
+```console
+npm install dayjs --save
+```
+
+📚[Installation Guide](https://day.js.org/docs/en/installation/installation)
+
+### API
+
+It's easy to use Day.js APIs to parse, validate, manipulate, and display dates and times.
+
+```javascript
+dayjs('2018-08-08') // parse
+
+dayjs().format('{YYYY} MM-DDTHH:mm:ss SSS [Z] A') // display
+
+dayjs().set('month', 3).month() // get & set
+
+dayjs().add(1, 'year') // manipulate
+
+dayjs().isBefore(dayjs()) // query
+```
+
+📚[API Reference](https://day.js.org/docs/en/parse/parse)
+
+### I18n
+
+Day.js has great support for internationalization.
+
+But none of them will be included in your build unless you use it.
+
+```javascript
+import 'dayjs/locale/es' // load on demand
+
+dayjs.locale('es') // use Spanish locale globally
+
+dayjs('2018-05-05').locale('zh-cn').format() // use Chinese Simplified locale in a specific instance
+```
+📚[Internationalization](https://day.js.org/docs/en/i18n/i18n)
+
+### Plugin
+
+A plugin is an independent module that can be added to Day.js to extend functionality or add new features.
+
+```javascript
+import advancedFormat from 'dayjs/plugin/advancedFormat' // load on demand
+
+dayjs.extend(advancedFormat) // use plugin
+
+dayjs().format('Q Do k kk X x') // more available formats
+```
+
+📚[Plugin List](https://day.js.org/docs/en/plugin/plugin)
+
+## Sponsors
+
+Support this project by becoming a sponsor. Your logo will show up here with a link to your website. 
+
+[[Become a sponsor via Github](https://github.com/sponsors/iamkun/)] [[Become a sponsor via OpenCollective](https://opencollective.com/dayjs#sponsor)]
+
+<a href="https://github.com/alan-eu" target="_blank">
+  <img width="70" src="https://avatars.githubusercontent.com/u/18175329?s=52&v=4">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://www.exoflare.com/open-source/?utm_source=dayjs&utm_campaign=open_source" target="_blank">
+  <img width="70" src="https://user-images.githubusercontent.com/17680888/162761622-1407a849-0c41-4591-8aa9-f98114ec2092.png">
+</a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://github.com/vendure-ecommerce" target="_blank"><img width="70" src="https://avatars.githubusercontent.com/u/39629390?s=52&v=4"></a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://github.com/Velc" target="_blank"><img width="70" src="https://avatars.githubusercontent.com/u/1551649?s=52&v=4"></a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://github.com/projectdiscovery" target="_blank"><img width="70" src="https://avatars.githubusercontent.com/u/50994705?s=52&v=4"></a>
+&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
+<a href="https://opencollective.com/datawrapper" target="_blank"><img width="70" src="https://images.opencollective.com/datawrapper/c13e229/logo.png"></a>
+
+## Contributors
+
+This project exists thanks to all the people who contribute.
+
+Please give us a 💖 star 💖 to support us. Thank you.
+
+And thank you to all our backers! 🙏
+
+<a href="https://opencollective.com/dayjs/backer/0/website?requireActive=false" target="_blank"><img src="https://opencollective.com/dayjs/backer/0/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs/backer/1/website?requireActive=false" target="_blank"><img src="https://opencollective.com/dayjs/backer/1/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs/backer/2/website?requireActive=false" target="_blank"><img src="https://opencollective.com/dayjs/backer/2/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs/backer/3/website?requireActive=false" target="_blank"><img src="https://opencollective.com/dayjs/backer/3/avatar.svg?requireActive=false"></a>
+<a href="https://opencollective.com/dayjs#backers" target="_blank"><img src="https://opencollective.com/dayjs/contributors.svg?width=890" /></a>
+
+## License
+
+Day.js is licensed under a [MIT License](./LICENSE).

Rozdielové dáta súboru neboli zobrazené, pretože súbor je príliš veľký
+ 0 - 0
common/dayjs/dayjs.min.js


+ 25 - 0
common/dayjs/esm/constant.js

@@ -0,0 +1,25 @@
+export var SECONDS_A_MINUTE = 60;
+export var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;
+export var SECONDS_A_DAY = SECONDS_A_HOUR * 24;
+export var SECONDS_A_WEEK = SECONDS_A_DAY * 7;
+export var MILLISECONDS_A_SECOND = 1e3;
+export var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;
+export var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;
+export var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;
+export var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND; // English locales
+
+export var MS = 'millisecond';
+export var S = 'second';
+export var MIN = 'minute';
+export var H = 'hour';
+export var D = 'day';
+export var W = 'week';
+export var M = 'month';
+export var Q = 'quarter';
+export var Y = 'year';
+export var DATE = 'date';
+export var FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ';
+export var INVALID_DATE_STRING = 'Invalid Date'; // regex
+
+export var REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[Tt\s]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?[.:]?(\d+)?$/;
+export var REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;

+ 429 - 0
common/dayjs/esm/index.d.ts

@@ -0,0 +1,429 @@
+/// <reference path="./locale/index.d.ts" />
+
+export = dayjs;
+
+declare function dayjs (date?: dayjs.ConfigType): dayjs.Dayjs
+
+declare function dayjs (date?: dayjs.ConfigType, format?: dayjs.OptionType, strict?: boolean): dayjs.Dayjs
+
+declare function dayjs (date?: dayjs.ConfigType, format?: dayjs.OptionType, locale?: string, strict?: boolean): dayjs.Dayjs
+
+declare namespace dayjs {
+  interface ConfigTypeMap {
+    default: string | number | Date | Dayjs | null | undefined
+  }
+
+  export type ConfigType = ConfigTypeMap[keyof ConfigTypeMap]
+
+  export interface FormatObject { locale?: string, format?: string, utc?: boolean }
+
+  export type OptionType = FormatObject | string | string[]
+
+  export type UnitTypeShort = 'd' | 'D' | 'M' | 'y' | 'h' | 'm' | 's' | 'ms'
+
+  export type UnitTypeLong = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' | 'date'
+
+  export type UnitTypeLongPlural = 'milliseconds' | 'seconds' | 'minutes' | 'hours' | 'days' | 'months' | 'years' | 'dates'
+  
+  export type UnitType = UnitTypeLong | UnitTypeLongPlural | UnitTypeShort;
+
+  export type OpUnitType = UnitType | "week" | "weeks" | 'w';
+  export type QUnitType = UnitType | "quarter" | "quarters" | 'Q';
+  export type ManipulateType = Exclude<OpUnitType, 'date' | 'dates'>;
+  class Dayjs {
+    constructor (config?: ConfigType)
+    /**
+     * All Day.js objects are immutable. Still, `dayjs#clone` can create a clone of the current object if you need one.
+     * ```
+     * dayjs().clone()// => Dayjs
+     * dayjs(dayjs('2019-01-25')) // passing a Dayjs object to a constructor will also clone it
+     * ```
+     * Docs: https://day.js.org/docs/en/parse/dayjs-clone
+     */
+    clone(): Dayjs
+    /**
+     * This returns a `boolean` indicating whether the Day.js object contains a valid date or not.
+     * ```
+     * dayjs().isValid()// => boolean
+     * ```
+     * Docs: https://day.js.org/docs/en/parse/is-valid
+     */
+    isValid(): boolean
+    /**
+     * Get the year.
+     * ```
+     * dayjs().year()// => 2020
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/year
+     */
+    year(): number
+    /**
+     * Set the year.
+     * ```
+     * dayjs().year(2000)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/year
+     */
+    year(value: number): Dayjs
+    /**
+     * Get the month.
+     *
+     * Months are zero indexed, so January is month 0.
+     * ```
+     * dayjs().month()// => 0-11
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/month
+     */
+    month(): number
+    /**
+     * Set the month.
+     *
+     * Months are zero indexed, so January is month 0.
+     *
+     * Accepts numbers from 0 to 11. If the range is exceeded, it will bubble up to the next year.
+     * ```
+     * dayjs().month(0)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/month
+     */
+    month(value: number): Dayjs
+    /**
+     * Get the date of the month.
+     * ```
+     * dayjs().date()// => 1-31
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/date
+     */
+    date(): number
+    /**
+     * Set the date of the month.
+     *
+     * Accepts numbers from 1 to 31. If the range is exceeded, it will bubble up to the next months.
+     * ```
+     * dayjs().date(1)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/date
+     */
+    date(value: number): Dayjs
+    /**
+     * Get the day of the week.
+     *
+     * Returns numbers from 0 (Sunday) to 6 (Saturday).
+     * ```
+     * dayjs().day()// 0-6
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/day
+     */
+    day(): number
+    /**
+     * Set the day of the week.
+     *
+     * Accepts numbers from 0 (Sunday) to 6 (Saturday). If the range is exceeded, it will bubble up to next weeks.
+     * ```
+     * dayjs().day(0)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/day
+     */
+    day(value: number): Dayjs
+    /**
+     * Get the hour.
+     * ```
+     * dayjs().hour()// => 0-23
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/hour
+     */
+    hour(): number
+    /**
+     * Set the hour.
+     *
+     * Accepts numbers from 0 to 23. If the range is exceeded, it will bubble up to the next day.
+     * ```
+     * dayjs().hour(12)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/hour
+     */
+    hour(value: number): Dayjs
+    /**
+     * Get the minutes.
+     * ```
+     * dayjs().minute()// => 0-59
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/minute
+     */
+    minute(): number
+    /**
+     * Set the minutes.
+     *
+     * Accepts numbers from 0 to 59. If the range is exceeded, it will bubble up to the next hour.
+     * ```
+     * dayjs().minute(59)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/minute
+     */
+    minute(value: number): Dayjs
+    /**
+     * Get the seconds.
+     * ```
+     * dayjs().second()// => 0-59
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/second
+     */
+    second(): number
+    /**
+     * Set the seconds.
+     *
+     * Accepts numbers from 0 to 59. If the range is exceeded, it will bubble up to the next minutes.
+     * ```
+     * dayjs().second(1)// Dayjs
+     * ```
+     */
+    second(value: number): Dayjs
+    /**
+     * Get the milliseconds.
+     * ```
+     * dayjs().millisecond()// => 0-999
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/millisecond
+     */
+    millisecond(): number
+    /**
+     * Set the milliseconds.
+     *
+     * Accepts numbers from 0 to 999. If the range is exceeded, it will bubble up to the next seconds.
+     * ```
+     * dayjs().millisecond(1)// => Dayjs
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/millisecond
+     */
+    millisecond(value: number): Dayjs
+    /**
+     * Generic setter, accepting unit as first argument, and value as second, returns a new instance with the applied changes.
+     *
+     * In general:
+     * ```
+     * dayjs().set(unit, value) === dayjs()[unit](value)
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     * ```
+     * dayjs().set('date', 1)
+     * dayjs().set('month', 3) // April
+     * dayjs().set('second', 30)
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/set
+     */
+    set(unit: UnitType, value: number): Dayjs
+    /**
+     * String getter, returns the corresponding information getting from Day.js object.
+     *
+     * In general:
+     * ```
+     * dayjs().get(unit) === dayjs()[unit]()
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     * ```
+     * dayjs().get('year')
+     * dayjs().get('month') // start 0
+     * dayjs().get('date')
+     * ```
+     * Docs: https://day.js.org/docs/en/get-set/get
+     */
+    get(unit: UnitType): number
+    /**
+     * Returns a cloned Day.js object with a specified amount of time added.
+     * ```
+     * dayjs().add(7, 'day')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/add
+     */
+    add(value: number, unit?: ManipulateType): Dayjs
+    /**
+     * Returns a cloned Day.js object with a specified amount of time subtracted.
+     * ```
+     * dayjs().subtract(7, 'year')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/subtract
+     */
+    subtract(value: number, unit?: ManipulateType): Dayjs
+    /**
+     * Returns a cloned Day.js object and set it to the start of a unit of time.
+     * ```
+     * dayjs().startOf('year')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/start-of
+     */
+    startOf(unit: OpUnitType): Dayjs
+    /**
+     * Returns a cloned Day.js object and set it to the end of a unit of time.
+     * ```
+     * dayjs().endOf('month')// => Dayjs
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/manipulate/end-of
+     */
+    endOf(unit: OpUnitType): Dayjs
+    /**
+     * Get the formatted date according to the string of tokens passed in.
+     *
+     * To escape characters, wrap them in square brackets (e.g. [MM]).
+     * ```
+     * dayjs().format()// => current date in ISO8601, without fraction seconds e.g. '2020-04-02T08:02:17-05:00'
+     * dayjs('2019-01-25').format('[YYYYescape] YYYY-MM-DDTHH:mm:ssZ[Z]')// 'YYYYescape 2019-01-25T00:00:00-02:00Z'
+     * dayjs('2019-01-25').format('DD/MM/YYYY') // '25/01/2019'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/format
+     */
+    format(template?: string): string
+    /**
+     * This indicates the difference between two date-time in the specified unit.
+     *
+     * To get the difference in milliseconds, use `dayjs#diff`
+     * ```
+     * const date1 = dayjs('2019-01-25')
+     * const date2 = dayjs('2018-06-05')
+     * date1.diff(date2) // 20214000000 default milliseconds
+     * date1.diff() // milliseconds to current time
+     * ```
+     *
+     * To get the difference in another unit of measurement, pass that measurement as the second argument.
+     * ```
+     * const date1 = dayjs('2019-01-25')
+     * date1.diff('2018-06-05', 'month') // 7
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/display/difference
+     */
+    diff(date?: ConfigType, unit?: QUnitType | OpUnitType, float?: boolean): number
+    /**
+     * This returns the number of **milliseconds** since the Unix Epoch of the Day.js object.
+     * ```
+     * dayjs('2019-01-25').valueOf() // 1548381600000
+     * +dayjs(1548381600000) // 1548381600000
+     * ```
+     * To get a Unix timestamp (the number of seconds since the epoch) from a Day.js object, you should use Unix Timestamp `dayjs#unix()`.
+     *
+     * Docs: https://day.js.org/docs/en/display/unix-timestamp-milliseconds
+     */
+    valueOf(): number
+    /**
+     * This returns the Unix timestamp (the number of **seconds** since the Unix Epoch) of the Day.js object.
+     * ```
+     * dayjs('2019-01-25').unix() // 1548381600
+     * ```
+     * This value is floored to the nearest second, and does not include a milliseconds component.
+     *
+     * Docs: https://day.js.org/docs/en/display/unix-timestamp
+     */
+    unix(): number
+    /**
+     * Get the number of days in the current month.
+     * ```
+     * dayjs('2019-01-25').daysInMonth() // 31
+     * ```
+     * Docs: https://day.js.org/docs/en/display/days-in-month
+     */
+    daysInMonth(): number
+    /**
+     * To get a copy of the native `Date` object parsed from the Day.js object use `dayjs#toDate`.
+     * ```
+     * dayjs('2019-01-25').toDate()// => Date
+     * ```
+     */
+    toDate(): Date
+    /**
+     * To serialize as an ISO 8601 string.
+     * ```
+     * dayjs('2019-01-25').toJSON() // '2019-01-25T02:00:00.000Z'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/as-json
+     */
+    toJSON(): string
+    /**
+     * To format as an ISO 8601 string.
+     * ```
+     * dayjs('2019-01-25').toISOString() // '2019-01-25T02:00:00.000Z'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/as-iso-string
+     */
+    toISOString(): string
+    /**
+     * Returns a string representation of the date.
+     * ```
+     * dayjs('2019-01-25').toString() // 'Fri, 25 Jan 2019 02:00:00 GMT'
+     * ```
+     * Docs: https://day.js.org/docs/en/display/as-string
+     */
+    toString(): string
+    /**
+     * Get the UTC offset in minutes.
+     * ```
+     * dayjs().utcOffset()
+     * ```
+     * Docs: https://day.js.org/docs/en/manipulate/utc-offset
+     */
+    utcOffset(): number
+    /**
+     * This indicates whether the Day.js object is before the other supplied date-time.
+     * ```
+     * dayjs().isBefore(dayjs('2011-01-01')) // default milliseconds
+     * ```
+     * If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.
+     * ```
+     * dayjs().isBefore('2011-01-01', 'year')// => boolean
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/query/is-before
+     */
+    isBefore(date: ConfigType, unit?: OpUnitType): boolean
+    /**
+     * This indicates whether the Day.js object is the same as the other supplied date-time.
+     * ```
+     * dayjs().isSame(dayjs('2011-01-01')) // default milliseconds
+     * ```
+     * If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.
+     * ```
+     * dayjs().isSame('2011-01-01', 'year')// => boolean
+     * ```
+     * Docs: https://day.js.org/docs/en/query/is-same
+     */
+    isSame(date: ConfigType, unit?: OpUnitType): boolean
+    /**
+     * This indicates whether the Day.js object is after the other supplied date-time.
+     * ```
+     * dayjs().isAfter(dayjs('2011-01-01')) // default milliseconds
+     * ```
+     * If you want to limit the granularity to a unit other than milliseconds, pass it as the second parameter.
+     * ```
+     * dayjs().isAfter('2011-01-01', 'year')// => boolean
+     * ```
+     * Units are case insensitive, and support plural and short forms.
+     *
+     * Docs: https://day.js.org/docs/en/query/is-after
+     */
+    isAfter(date: ConfigType, unit?: OpUnitType): boolean
+
+    locale(): string
+
+    locale(preset: string | ILocale, object?: Partial<ILocale>): Dayjs
+  }
+
+  export type PluginFunc<T = unknown> = (option: T, c: typeof Dayjs, d: typeof dayjs) => void
+
+  export function extend<T = unknown>(plugin: PluginFunc<T>, option?: T): Dayjs
+
+  export function locale(preset?: string | ILocale, object?: Partial<ILocale>, isLocal?: boolean): string
+
+  export function isDayjs(d: any): d is Dayjs
+
+  export function unix(t: number): Dayjs
+
+  const Ls : { [key: string] :  ILocale }
+}

+ 441 - 0
common/dayjs/esm/index.js

@@ -0,0 +1,441 @@
+import * as C from './constant';
+import en from './locale/en';
+import U from './utils';
+var L = 'en'; // global locale
+
+var Ls = {}; // global loaded locale
+
+Ls[L] = en;
+
+var isDayjs = function isDayjs(d) {
+  return d instanceof Dayjs;
+}; // eslint-disable-line no-use-before-define
+
+
+var parseLocale = function parseLocale(preset, object, isLocal) {
+  var l;
+  if (!preset) return L;
+
+  if (typeof preset === 'string') {
+    var presetLower = preset.toLowerCase();
+
+    if (Ls[presetLower]) {
+      l = presetLower;
+    }
+
+    if (object) {
+      Ls[presetLower] = object;
+      l = presetLower;
+    }
+
+    var presetSplit = preset.split('-');
+
+    if (!l && presetSplit.length > 1) {
+      return parseLocale(presetSplit[0]);
+    }
+  } else {
+    var name = preset.name;
+    Ls[name] = preset;
+    l = name;
+  }
+
+  if (!isLocal && l) L = l;
+  return l || !isLocal && L;
+};
+
+var dayjs = function dayjs(date, c) {
+  if (isDayjs(date)) {
+    return date.clone();
+  } // eslint-disable-next-line no-nested-ternary
+
+
+  var cfg = typeof c === 'object' ? c : {};
+  cfg.date = date;
+  cfg.args = arguments; // eslint-disable-line prefer-rest-params
+
+  return new Dayjs(cfg); // eslint-disable-line no-use-before-define
+};
+
+var wrapper = function wrapper(date, instance) {
+  return dayjs(date, {
+    locale: instance.$L,
+    utc: instance.$u,
+    x: instance.$x,
+    $offset: instance.$offset // todo: refactor; do not use this.$offset in you code
+
+  });
+};
+
+var Utils = U; // for plugin use
+
+Utils.l = parseLocale;
+Utils.i = isDayjs;
+Utils.w = wrapper;
+
+var parseDate = function parseDate(cfg) {
+  var date = cfg.date,
+      utc = cfg.utc;
+  if (date === null) return new Date(NaN); // null is invalid
+
+  if (Utils.u(date)) return new Date(); // today
+
+  if (date instanceof Date) return new Date(date);
+
+  if (typeof date === 'string' && !/Z$/i.test(date)) {
+    var d = date.match(C.REGEX_PARSE);
+
+    if (d) {
+      var m = d[2] - 1 || 0;
+      var ms = (d[7] || '0').substring(0, 3);
+
+      if (utc) {
+        return new Date(Date.UTC(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));
+      }
+
+      return new Date(d[1], m, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);
+    }
+  }
+
+  return new Date(date); // everything else
+};
+
+var Dayjs = /*#__PURE__*/function () {
+  function Dayjs(cfg) {
+    this.$L = parseLocale(cfg.locale, null, true);
+    this.parse(cfg); // for plugin
+  }
+
+  var _proto = Dayjs.prototype;
+
+  _proto.parse = function parse(cfg) {
+    this.$d = parseDate(cfg);
+    this.$x = cfg.x || {};
+    this.init();
+  };
+
+  _proto.init = function init() {
+    var $d = this.$d;
+    this.$y = $d.getFullYear();
+    this.$M = $d.getMonth();
+    this.$D = $d.getDate();
+    this.$W = $d.getDay();
+    this.$H = $d.getHours();
+    this.$m = $d.getMinutes();
+    this.$s = $d.getSeconds();
+    this.$ms = $d.getMilliseconds();
+  } // eslint-disable-next-line class-methods-use-this
+  ;
+
+  _proto.$utils = function $utils() {
+    return Utils;
+  };
+
+  _proto.isValid = function isValid() {
+    return !(this.$d.toString() === C.INVALID_DATE_STRING);
+  };
+
+  _proto.isSame = function isSame(that, units) {
+    var other = dayjs(that);
+    return this.startOf(units) <= other && other <= this.endOf(units);
+  };
+
+  _proto.isAfter = function isAfter(that, units) {
+    return dayjs(that) < this.startOf(units);
+  };
+
+  _proto.isBefore = function isBefore(that, units) {
+    return this.endOf(units) < dayjs(that);
+  };
+
+  _proto.$g = function $g(input, get, set) {
+    if (Utils.u(input)) return this[get];
+    return this.set(set, input);
+  };
+
+  _proto.unix = function unix() {
+    return Math.floor(this.valueOf() / 1000);
+  };
+
+  _proto.valueOf = function valueOf() {
+    // timezone(hour) * 60 * 60 * 1000 => ms
+    return this.$d.getTime();
+  };
+
+  _proto.startOf = function startOf(units, _startOf) {
+    var _this = this;
+
+    // startOf -> endOf
+    var isStartOf = !Utils.u(_startOf) ? _startOf : true;
+    var unit = Utils.p(units);
+
+    var instanceFactory = function instanceFactory(d, m) {
+      var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m, d) : new Date(_this.$y, m, d), _this);
+      return isStartOf ? ins : ins.endOf(C.D);
+    };
+
+    var instanceFactorySet = function instanceFactorySet(method, slice) {
+      var argumentStart = [0, 0, 0, 0];
+      var argumentEnd = [23, 59, 59, 999];
+      return Utils.w(_this.toDate()[method].apply( // eslint-disable-line prefer-spread
+      _this.toDate('s'), (isStartOf ? argumentStart : argumentEnd).slice(slice)), _this);
+    };
+
+    var $W = this.$W,
+        $M = this.$M,
+        $D = this.$D;
+    var utcPad = "set" + (this.$u ? 'UTC' : '');
+
+    switch (unit) {
+      case C.Y:
+        return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);
+
+      case C.M:
+        return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);
+
+      case C.W:
+        {
+          var weekStart = this.$locale().weekStart || 0;
+          var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;
+          return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);
+        }
+
+      case C.D:
+      case C.DATE:
+        return instanceFactorySet(utcPad + "Hours", 0);
+
+      case C.H:
+        return instanceFactorySet(utcPad + "Minutes", 1);
+
+      case C.MIN:
+        return instanceFactorySet(utcPad + "Seconds", 2);
+
+      case C.S:
+        return instanceFactorySet(utcPad + "Milliseconds", 3);
+
+      default:
+        return this.clone();
+    }
+  };
+
+  _proto.endOf = function endOf(arg) {
+    return this.startOf(arg, false);
+  };
+
+  _proto.$set = function $set(units, _int) {
+    var _C$D$C$DATE$C$M$C$Y$C;
+
+    // private set
+    var unit = Utils.p(units);
+    var utcPad = "set" + (this.$u ? 'UTC' : '');
+    var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[C.D] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[C.DATE] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[C.M] = utcPad + "Month", _C$D$C$DATE$C$M$C$Y$C[C.Y] = utcPad + "FullYear", _C$D$C$DATE$C$M$C$Y$C[C.H] = utcPad + "Hours", _C$D$C$DATE$C$M$C$Y$C[C.MIN] = utcPad + "Minutes", _C$D$C$DATE$C$M$C$Y$C[C.S] = utcPad + "Seconds", _C$D$C$DATE$C$M$C$Y$C[C.MS] = utcPad + "Milliseconds", _C$D$C$DATE$C$M$C$Y$C)[unit];
+    var arg = unit === C.D ? this.$D + (_int - this.$W) : _int;
+
+    if (unit === C.M || unit === C.Y) {
+      // clone is for badMutable plugin
+      var date = this.clone().set(C.DATE, 1);
+      date.$d[name](arg);
+      date.init();
+      this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).$d;
+    } else if (name) this.$d[name](arg);
+
+    this.init();
+    return this;
+  };
+
+  _proto.set = function set(string, _int2) {
+    return this.clone().$set(string, _int2);
+  };
+
+  _proto.get = function get(unit) {
+    return this[Utils.p(unit)]();
+  };
+
+  _proto.add = function add(number, units) {
+    var _this2 = this,
+        _C$MIN$C$H$C$S$unit;
+
+    number = Number(number); // eslint-disable-line no-param-reassign
+
+    var unit = Utils.p(units);
+
+    var instanceFactorySet = function instanceFactorySet(n) {
+      var d = dayjs(_this2);
+      return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);
+    };
+
+    if (unit === C.M) {
+      return this.set(C.M, this.$M + number);
+    }
+
+    if (unit === C.Y) {
+      return this.set(C.Y, this.$y + number);
+    }
+
+    if (unit === C.D) {
+      return instanceFactorySet(1);
+    }
+
+    if (unit === C.W) {
+      return instanceFactorySet(7);
+    }
+
+    var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[C.MIN] = C.MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[C.H] = C.MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[C.S] = C.MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1; // ms
+
+    var nextTimeStamp = this.$d.getTime() + number * step;
+    return Utils.w(nextTimeStamp, this);
+  };
+
+  _proto.subtract = function subtract(number, string) {
+    return this.add(number * -1, string);
+  };
+
+  _proto.format = function format(formatStr) {
+    var _this3 = this;
+
+    var locale = this.$locale();
+    if (!this.isValid()) return locale.invalidDate || C.INVALID_DATE_STRING;
+    var str = formatStr || C.FORMAT_DEFAULT;
+    var zoneStr = Utils.z(this);
+    var $H = this.$H,
+        $m = this.$m,
+        $M = this.$M;
+    var weekdays = locale.weekdays,
+        months = locale.months,
+        meridiem = locale.meridiem;
+
+    var getShort = function getShort(arr, index, full, length) {
+      return arr && (arr[index] || arr(_this3, str)) || full[index].slice(0, length);
+    };
+
+    var get$H = function get$H(num) {
+      return Utils.s($H % 12 || 12, num, '0');
+    };
+
+    var meridiemFunc = meridiem || function (hour, minute, isLowercase) {
+      var m = hour < 12 ? 'AM' : 'PM';
+      return isLowercase ? m.toLowerCase() : m;
+    };
+
+    var matches = {
+      YY: String(this.$y).slice(-2),
+      YYYY: this.$y,
+      M: $M + 1,
+      MM: Utils.s($M + 1, 2, '0'),
+      MMM: getShort(locale.monthsShort, $M, months, 3),
+      MMMM: getShort(months, $M),
+      D: this.$D,
+      DD: Utils.s(this.$D, 2, '0'),
+      d: String(this.$W),
+      dd: getShort(locale.weekdaysMin, this.$W, weekdays, 2),
+      ddd: getShort(locale.weekdaysShort, this.$W, weekdays, 3),
+      dddd: weekdays[this.$W],
+      H: String($H),
+      HH: Utils.s($H, 2, '0'),
+      h: get$H(1),
+      hh: get$H(2),
+      a: meridiemFunc($H, $m, true),
+      A: meridiemFunc($H, $m, false),
+      m: String($m),
+      mm: Utils.s($m, 2, '0'),
+      s: String(this.$s),
+      ss: Utils.s(this.$s, 2, '0'),
+      SSS: Utils.s(this.$ms, 3, '0'),
+      Z: zoneStr // 'ZZ' logic below
+
+    };
+    return str.replace(C.REGEX_FORMAT, function (match, $1) {
+      return $1 || matches[match] || zoneStr.replace(':', '');
+    }); // 'ZZ'
+  };
+
+  _proto.utcOffset = function utcOffset() {
+    // Because a bug at FF24, we're rounding the timezone offset around 15 minutes
+    // https://github.com/moment/moment/pull/1871
+    return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;
+  };
+
+  _proto.diff = function diff(input, units, _float) {
+    var _C$Y$C$M$C$Q$C$W$C$D$;
+
+    var unit = Utils.p(units);
+    var that = dayjs(input);
+    var zoneDelta = (that.utcOffset() - this.utcOffset()) * C.MILLISECONDS_A_MINUTE;
+    var diff = this - that;
+    var result = Utils.m(this, that);
+    result = (_C$Y$C$M$C$Q$C$W$C$D$ = {}, _C$Y$C$M$C$Q$C$W$C$D$[C.Y] = result / 12, _C$Y$C$M$C$Q$C$W$C$D$[C.M] = result, _C$Y$C$M$C$Q$C$W$C$D$[C.Q] = result / 3, _C$Y$C$M$C$Q$C$W$C$D$[C.W] = (diff - zoneDelta) / C.MILLISECONDS_A_WEEK, _C$Y$C$M$C$Q$C$W$C$D$[C.D] = (diff - zoneDelta) / C.MILLISECONDS_A_DAY, _C$Y$C$M$C$Q$C$W$C$D$[C.H] = diff / C.MILLISECONDS_A_HOUR, _C$Y$C$M$C$Q$C$W$C$D$[C.MIN] = diff / C.MILLISECONDS_A_MINUTE, _C$Y$C$M$C$Q$C$W$C$D$[C.S] = diff / C.MILLISECONDS_A_SECOND, _C$Y$C$M$C$Q$C$W$C$D$)[unit] || diff; // milliseconds
+
+    return _float ? result : Utils.a(result);
+  };
+
+  _proto.daysInMonth = function daysInMonth() {
+    return this.endOf(C.M).$D;
+  };
+
+  _proto.$locale = function $locale() {
+    // get locale object
+    return Ls[this.$L];
+  };
+
+  _proto.locale = function locale(preset, object) {
+    if (!preset) return this.$L;
+    var that = this.clone();
+    var nextLocaleName = parseLocale(preset, object, true);
+    if (nextLocaleName) that.$L = nextLocaleName;
+    return that;
+  };
+
+  _proto.clone = function clone() {
+    return Utils.w(this.$d, this);
+  };
+
+  _proto.toDate = function toDate() {
+    return new Date(this.valueOf());
+  };
+
+  _proto.toJSON = function toJSON() {
+    return this.isValid() ? this.toISOString() : null;
+  };
+
+  _proto.toISOString = function toISOString() {
+    // ie 8 return
+    // new Dayjs(this.valueOf() + this.$d.getTimezoneOffset() * 60000)
+    // .format('YYYY-MM-DDTHH:mm:ss.SSS[Z]')
+    return this.$d.toISOString();
+  };
+
+  _proto.toString = function toString() {
+    return this.$d.toUTCString();
+  };
+
+  return Dayjs;
+}();
+
+var proto = Dayjs.prototype;
+dayjs.prototype = proto;
+[['$ms', C.MS], ['$s', C.S], ['$m', C.MIN], ['$H', C.H], ['$W', C.D], ['$M', C.M], ['$y', C.Y], ['$D', C.DATE]].forEach(function (g) {
+  proto[g[1]] = function (input) {
+    return this.$g(input, g[0], g[1]);
+  };
+});
+
+dayjs.extend = function (plugin, option) {
+  if (!plugin.$i) {
+    // install plugin only once
+    plugin(option, Dayjs, dayjs);
+    plugin.$i = true;
+  }
+
+  return dayjs;
+};
+
+dayjs.locale = parseLocale;
+dayjs.isDayjs = isDayjs;
+
+dayjs.unix = function (timestamp) {
+  return dayjs(timestamp * 1e3);
+};
+
+dayjs.en = Ls[L];
+dayjs.Ls = Ls;
+dayjs.p = {};
+export default dayjs;

+ 39 - 0
common/dayjs/esm/locale/af.js

@@ -0,0 +1,39 @@
+// Afrikaans [af]
+import dayjs from '../index';
+var locale = {
+  name: 'af',
+  weekdays: 'Sondag_Maandag_Dinsdag_Woensdag_Donderdag_Vrydag_Saterdag'.split('_'),
+  months: 'Januarie_Februarie_Maart_April_Mei_Junie_Julie_Augustus_September_Oktober_November_Desember'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Son_Maa_Din_Woe_Don_Vry_Sat'.split('_'),
+  monthsShort: 'Jan_Feb_Mrt_Apr_Mei_Jun_Jul_Aug_Sep_Okt_Nov_Des'.split('_'),
+  weekdaysMin: 'So_Ma_Di_Wo_Do_Vr_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  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'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 40 - 0
common/dayjs/esm/locale/am.js

@@ -0,0 +1,40 @@
+// Amharic [am]
+import dayjs from '../index';
+var locale = {
+  name: 'am',
+  weekdays: 'እሑድ_ሰኞ_ማክሰኞ_ረቡዕ_ሐሙስ_አርብ_ቅዳሜ'.split('_'),
+  weekdaysShort: 'እሑድ_ሰኞ_ማክሰ_ረቡዕ_ሐሙስ_አርብ_ቅዳሜ'.split('_'),
+  weekdaysMin: 'እሑ_ሰኞ_ማክ_ረቡ_ሐሙ_አር_ቅዳ'.split('_'),
+  months: 'ጃንዋሪ_ፌብሯሪ_ማርች_ኤፕሪል_ሜይ_ጁን_ጁላይ_ኦገስት_ሴፕቴምበር_ኦክቶበር_ኖቬምበር_ዲሴምበር'.split('_'),
+  monthsShort: 'ጃንዋ_ፌብሯ_ማርች_ኤፕሪ_ሜይ_ጁን_ጁላይ_ኦገስ_ሴፕቴ_ኦክቶ_ኖቬም_ዲሴም'.split('_'),
+  weekStart: 1,
+  yearStart: 4,
+  relativeTime: {
+    future: 'በ%s',
+    past: '%s በፊት',
+    s: 'ጥቂት ሰከንዶች',
+    m: 'አንድ ደቂቃ',
+    mm: '%d ደቂቃዎች',
+    h: 'አንድ ሰዓት',
+    hh: '%d ሰዓታት',
+    d: 'አንድ ቀን',
+    dd: '%d ቀናት',
+    M: 'አንድ ወር',
+    MM: '%d ወራት',
+    y: 'አንድ ዓመት',
+    yy: '%d ዓመታት'
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'MMMM D ፣ YYYY',
+    LLL: 'MMMM D ፣ YYYY HH:mm',
+    LLLL: 'dddd ፣ MMMM D ፣ YYYY HH:mm'
+  },
+  ordinal: function ordinal(n) {
+    return n + "\u129B";
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 41 - 0
common/dayjs/esm/locale/ar-dz.js

@@ -0,0 +1,41 @@
+// Arabic (Algeria) [ar-dz]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-dz',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysMin: 'أح_إث_ثلا_أر_خم_جم_سب'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 42 - 0
common/dayjs/esm/locale/ar-iq.js

@@ -0,0 +1,42 @@
+//  Arabic (Iraq) [ar-iq]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-iq',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'كانون الثاني_شباط_آذار_نيسان_أيار_حزيران_تموز_آب_أيلول_تشرين الأول_ تشرين الثاني_كانون الأول'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'كانون الثاني_شباط_آذار_نيسان_أيار_حزيران_تموز_آب_أيلول_تشرين الأول_ تشرين الثاني_كانون الأول'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 41 - 0
common/dayjs/esm/locale/ar-kw.js

@@ -0,0 +1,41 @@
+// Arabic (Kuwait) [ar-kw]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-kw',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+  weekdaysShort: 'احد_اثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 27 - 0
common/dayjs/esm/locale/ar-ly.js

@@ -0,0 +1,27 @@
+// Arabic (Lybia) [ar-ly]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-ly',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekStart: 6,
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'D/‏M/‏YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 42 - 0
common/dayjs/esm/locale/ar-ma.js

@@ -0,0 +1,42 @@
+// Arabic (Morocco) [ar-ma]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-ma',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+  weekStart: 6,
+  weekdaysShort: 'احد_إثنين_ثلاثاء_اربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'يناير_فبراير_مارس_أبريل_ماي_يونيو_يوليوز_غشت_شتنبر_أكتوبر_نونبر_دجنبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 41 - 0
common/dayjs/esm/locale/ar-sa.js

@@ -0,0 +1,41 @@
+// Arabic (Saudi Arabia) [ar-sa]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-sa',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 42 - 0
common/dayjs/esm/locale/ar-tn.js

@@ -0,0 +1,42 @@
+//  Arabic (Tunisia) [ar-tn]
+import dayjs from '../index';
+var locale = {
+  name: 'ar-tn',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  months: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  monthsShort: 'جانفي_فيفري_مارس_أفريل_ماي_جوان_جويلية_أوت_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  },
+  meridiem: function meridiem(hour) {
+    return hour > 12 ? 'م' : 'ص';
+  },
+  relativeTime: {
+    future: 'في %s',
+    past: 'منذ %s',
+    s: 'ثوان',
+    m: 'دقيقة',
+    mm: '%d دقائق',
+    h: 'ساعة',
+    hh: '%d ساعات',
+    d: 'يوم',
+    dd: '%d أيام',
+    M: 'شهر',
+    MM: '%d أشهر',
+    y: 'سنة',
+    yy: '%d سنوات'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 74 - 0
common/dayjs/esm/locale/ar.js

@@ -0,0 +1,74 @@
+// Arabic [ar]
+import dayjs from '../index';
+var months = 'يناير_فبراير_مارس_أبريل_مايو_يونيو_يوليو_أغسطس_سبتمبر_أكتوبر_نوفمبر_ديسمبر'.split('_');
+var symbolMap = {
+  1: '١',
+  2: '٢',
+  3: '٣',
+  4: '٤',
+  5: '٥',
+  6: '٦',
+  7: '٧',
+  8: '٨',
+  9: '٩',
+  0: '٠'
+};
+var numberMap = {
+  '١': '1',
+  '٢': '2',
+  '٣': '3',
+  '٤': '4',
+  '٥': '5',
+  '٦': '6',
+  '٧': '7',
+  '٨': '8',
+  '٩': '9',
+  '٠': '0'
+};
+var locale = {
+  name: 'ar',
+  weekdays: 'الأحد_الإثنين_الثلاثاء_الأربعاء_الخميس_الجمعة_السبت'.split('_'),
+  weekdaysShort: 'أحد_إثنين_ثلاثاء_أربعاء_خميس_جمعة_سبت'.split('_'),
+  weekdaysMin: 'ح_ن_ث_ر_خ_ج_س'.split('_'),
+  months: months,
+  monthsShort: months,
+  weekStart: 6,
+  relativeTime: {
+    future: 'بعد %s',
+    past: 'منذ %s',
+    s: 'ثانية واحدة',
+    m: 'دقيقة واحدة',
+    mm: '%d دقائق',
+    h: 'ساعة واحدة',
+    hh: '%d ساعات',
+    d: 'يوم واحد',
+    dd: '%d أيام',
+    M: 'شهر واحد',
+    MM: '%d أشهر',
+    y: 'عام واحد',
+    yy: '%d أعوام'
+  },
+  preparse: function preparse(string) {
+    return string.replace(/[١٢٣٤٥٦٧٨٩٠]/g, function (match) {
+      return numberMap[match];
+    }).replace(/،/g, ',');
+  },
+  postformat: function postformat(string) {
+    return string.replace(/\d/g, function (match) {
+      return symbolMap[match];
+    }).replace(/,/g, '،');
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'D/‏M/‏YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd D MMMM YYYY HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 39 - 0
common/dayjs/esm/locale/az.js

@@ -0,0 +1,39 @@
+// Azerbaijani [az]
+import dayjs from '../index';
+var locale = {
+  name: 'az',
+  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('_'),
+  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('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY г.',
+    LLL: 'D MMMM YYYY г., H:mm',
+    LLLL: 'dddd, D MMMM YYYY г., H:mm'
+  },
+  relativeTime: {
+    future: '%s sonra',
+    past: '%s əvvəl',
+    s: 'bir neçə saniyə',
+    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'
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 24 - 0
common/dayjs/esm/locale/be.js

@@ -0,0 +1,24 @@
+// Belarusian [be]
+import dayjs from '../index';
+var locale = {
+  name: 'be',
+  weekdays: 'нядзелю_панядзелак_аўторак_сераду_чацвер_пятніцу_суботу'.split('_'),
+  months: 'студзеня_лютага_сакавіка_красавіка_траўня_чэрвеня_ліпеня_жніўня_верасня_кастрычніка_лістапада_снежня'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+  monthsShort: 'студ_лют_сак_крас_трав_чэрв_ліп_жнів_вер_каст_ліст_снеж'.split('_'),
+  weekdaysMin: 'нд_пн_ат_ср_чц_пт_сб'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D MMMM YYYY г.',
+    LLL: 'D MMMM YYYY г., HH:mm',
+    LLLL: 'dddd, D MMMM YYYY г., HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 55 - 0
common/dayjs/esm/locale/bg.js

@@ -0,0 +1,55 @@
+// Bulgarian [bg]
+import dayjs from '../index';
+var locale = {
+  name: 'bg',
+  weekdays: 'неделя_понеделник_вторник_сряда_четвъртък_петък_събота'.split('_'),
+  weekdaysShort: 'нед_пон_вто_сря_чет_пет_съб'.split('_'),
+  weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'),
+  months: 'януари_февруари_март_април_май_юни_юли_август_септември_октомври_ноември_декември'.split('_'),
+  monthsShort: 'янр_фев_мар_апр_май_юни_юли_авг_сеп_окт_ное_дек'.split('_'),
+  weekStart: 1,
+  ordinal: function ordinal(n) {
+    var last2Digits = n % 100;
+
+    if (last2Digits > 10 && last2Digits < 20) {
+      return n + "-\u0442\u0438";
+    }
+
+    var lastDigit = n % 10;
+
+    if (lastDigit === 1) {
+      return n + "-\u0432\u0438";
+    } else if (lastDigit === 2) {
+      return n + "-\u0440\u0438";
+    } else if (lastDigit === 7 || lastDigit === 8) {
+      return n + "-\u043C\u0438";
+    }
+
+    return n + "-\u0442\u0438";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'D.MM.YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY H:mm',
+    LLLL: 'dddd, D MMMM YYYY H:mm'
+  },
+  relativeTime: {
+    future: 'след %s',
+    past: 'преди %s',
+    s: 'няколко секунди',
+    m: 'минута',
+    mm: '%d минути',
+    h: 'час',
+    hh: '%d часа',
+    d: 'ден',
+    dd: '%d дена',
+    M: 'месец',
+    MM: '%d месеца',
+    y: 'година',
+    yy: '%d години'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 39 - 0
common/dayjs/esm/locale/bi.js

@@ -0,0 +1,39 @@
+// Bislama [bi]
+import dayjs from '../index';
+var locale = {
+  name: 'bi',
+  weekdays: 'Sande_Mande_Tusde_Wenesde_Tosde_Fraede_Sarade'.split('_'),
+  months: 'Januari_Februari_Maj_Eprel_Mei_Jun_Julae_Okis_Septemba_Oktoba_Novemba_Disemba'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'San_Man_Tus_Wen_Tos_Frae_Sar'.split('_'),
+  monthsShort: 'Jan_Feb_Maj_Epr_Mai_Jun_Jul_Oki_Sep_Okt_Nov_Dis'.split('_'),
+  weekdaysMin: 'San_Ma_Tu_We_To_Fr_Sar'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'h:mm A',
+    LTS: 'h:mm:ss A',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY h:mm A',
+    LLLL: 'dddd, D MMMM YYYY h:mm A'
+  },
+  relativeTime: {
+    future: 'lo %s',
+    past: '%s bifo',
+    s: 'sam seken',
+    m: 'wan minit',
+    mm: '%d minit',
+    h: 'wan haoa',
+    hh: '%d haoa',
+    d: 'wan dei',
+    dd: '%d dei',
+    M: 'wan manis',
+    MM: '%d manis',
+    y: 'wan yia',
+    yy: '%d yia'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 39 - 0
common/dayjs/esm/locale/bm.js

@@ -0,0 +1,39 @@
+// Bambara [bm]
+import dayjs from '../index';
+var locale = {
+  name: 'bm',
+  weekdays: 'Kari_Ntɛnɛn_Tarata_Araba_Alamisa_Juma_Sibiri'.split('_'),
+  months: 'Zanwuyekalo_Fewuruyekalo_Marisikalo_Awirilikalo_Mɛkalo_Zuwɛnkalo_Zuluyekalo_Utikalo_Sɛtanburukalo_ɔkutɔburukalo_Nowanburukalo_Desanburukalo'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Kar_Ntɛ_Tar_Ara_Ala_Jum_Sib'.split('_'),
+  monthsShort: 'Zan_Few_Mar_Awi_Mɛ_Zuw_Zul_Uti_Sɛt_ɔku_Now_Des'.split('_'),
+  weekdaysMin: 'Ka_Nt_Ta_Ar_Al_Ju_Si'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'MMMM [tile] D [san] YYYY',
+    LLL: 'MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm',
+    LLLL: 'dddd MMMM [tile] D [san] YYYY [lɛrɛ] HH:mm'
+  },
+  relativeTime: {
+    future: '%s kɔnɔ',
+    past: 'a bɛ %s bɔ',
+    s: 'sanga dama dama',
+    m: 'miniti kelen',
+    mm: 'miniti %d',
+    h: 'lɛrɛ kelen',
+    hh: 'lɛrɛ %d',
+    d: 'tile kelen',
+    dd: 'tile %d',
+    M: 'kalo kelen',
+    MM: 'kalo %d',
+    y: 'san kelen',
+    yy: 'san %d'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 81 - 0
common/dayjs/esm/locale/bn-bd.js

@@ -0,0 +1,81 @@
+// Bengali (Bangladesh) [bn-bd]
+import dayjs from '../index';
+var symbolMap = {
+  1: '১',
+  2: '২',
+  3: '৩',
+  4: '৪',
+  5: '৫',
+  6: '৬',
+  7: '৭',
+  8: '৮',
+  9: '৯',
+  0: '০'
+};
+var numberMap = {
+  '১': '1',
+  '২': '2',
+  '৩': '3',
+  '৪': '4',
+  '৫': '5',
+  '৬': '6',
+  '৭': '7',
+  '৮': '8',
+  '৯': '9',
+  '০': '0'
+};
+var locale = {
+  name: 'bn-bd',
+  weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),
+  months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+  weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+  monthsShort: 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),
+  weekdaysMin: 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
+  weekStart: 0,
+  preparse: function preparse(string) {
+    return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+      return numberMap[match];
+    });
+  },
+  postformat: function postformat(string) {
+    return string.replace(/\d/g, function (match) {
+      return symbolMap[match];
+    });
+  },
+  ordinal: function ordinal(n) {
+    var s = ['ই', 'লা', 'রা', 'ঠা', 'শে'];
+    var v = n % 100;
+    return "[" + n + (s[(v - 20) % 10] || s[v] || s[0]) + "]";
+  },
+  formats: {
+    LT: 'A h:mm সময়',
+    LTS: 'A h:mm:ss সময়',
+    L: 'DD/MM/YYYY খ্রিস্টাব্দ',
+    LL: 'D MMMM YYYY খ্রিস্টাব্দ',
+    LLL: 'D MMMM YYYY খ্রিস্টাব্দ, A h:mm সময়',
+    LLLL: 'dddd, D MMMM YYYY খ্রিস্টাব্দ, A h:mm সময়'
+  },
+  meridiem: function meridiem(hour) {
+    return (
+      /* eslint-disable no-nested-ternary */
+      hour < 4 ? 'রাত' : hour < 6 ? 'ভোর' : hour < 12 ? 'সকাল' : hour < 15 ? 'দুপুর' : hour < 18 ? 'বিকাল' : hour < 20 ? 'সন্ধ্যা' : 'রাত'
+    );
+  },
+  relativeTime: {
+    future: '%s পরে',
+    past: '%s আগে',
+    s: 'কয়েক সেকেন্ড',
+    m: 'এক মিনিট',
+    mm: '%d মিনিট',
+    h: 'এক ঘন্টা',
+    hh: '%d ঘন্টা',
+    d: 'এক দিন',
+    dd: '%d দিন',
+    M: 'এক মাস',
+    MM: '%d মাস',
+    y: 'এক বছর',
+    yy: '%d বছর'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 72 - 0
common/dayjs/esm/locale/bn.js

@@ -0,0 +1,72 @@
+// Bengali [bn]
+import dayjs from '../index';
+var symbolMap = {
+  1: '১',
+  2: '২',
+  3: '৩',
+  4: '৪',
+  5: '৫',
+  6: '৬',
+  7: '৭',
+  8: '৮',
+  9: '৯',
+  0: '০'
+};
+var numberMap = {
+  '১': '1',
+  '২': '2',
+  '৩': '3',
+  '৪': '4',
+  '৫': '5',
+  '৬': '6',
+  '৭': '7',
+  '৮': '8',
+  '৯': '9',
+  '০': '0'
+};
+var locale = {
+  name: 'bn',
+  weekdays: 'রবিবার_সোমবার_মঙ্গলবার_বুধবার_বৃহস্পতিবার_শুক্রবার_শনিবার'.split('_'),
+  months: 'জানুয়ারি_ফেব্রুয়ারি_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্টেম্বর_অক্টোবর_নভেম্বর_ডিসেম্বর'.split('_'),
+  weekdaysShort: 'রবি_সোম_মঙ্গল_বুধ_বৃহস্পতি_শুক্র_শনি'.split('_'),
+  monthsShort: 'জানু_ফেব্রু_মার্চ_এপ্রিল_মে_জুন_জুলাই_আগস্ট_সেপ্ট_অক্টো_নভে_ডিসে'.split('_'),
+  weekdaysMin: 'রবি_সোম_মঙ্গ_বুধ_বৃহঃ_শুক্র_শনি'.split('_'),
+  preparse: function preparse(string) {
+    return string.replace(/[১২৩৪৫৬৭৮৯০]/g, function (match) {
+      return numberMap[match];
+    });
+  },
+  postformat: function postformat(string) {
+    return string.replace(/\d/g, function (match) {
+      return symbolMap[match];
+    });
+  },
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm সময়',
+    LTS: 'A h:mm:ss সময়',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm সময়',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm সময়'
+  },
+  relativeTime: {
+    future: '%s পরে',
+    past: '%s আগে',
+    s: 'কয়েক সেকেন্ড',
+    m: 'এক মিনিট',
+    mm: '%d মিনিট',
+    h: 'এক ঘন্টা',
+    hh: '%d ঘন্টা',
+    d: 'এক দিন',
+    dd: '%d দিন',
+    M: 'এক মাস',
+    MM: '%d মাস',
+    y: 'এক বছর',
+    yy: '%d বছর'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 38 - 0
common/dayjs/esm/locale/bo.js

@@ -0,0 +1,38 @@
+// Tibetan [bo]
+import dayjs from '../index';
+var locale = {
+  name: 'bo',
+  weekdays: 'གཟའ་ཉི་མ་_གཟའ་ཟླ་བ་_གཟའ་མིག་དམར་_གཟའ་ལྷག་པ་_གཟའ་ཕུར་བུ_གཟའ་པ་སངས་_གཟའ་སྤེན་པ་'.split('_'),
+  weekdaysShort: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+  weekdaysMin: 'ཉི་མ་_ཟླ་བ་_མིག་དམར་_ལྷག་པ་_ཕུར་བུ_པ་སངས་_སྤེན་པ་'.split('_'),
+  months: 'ཟླ་བ་དང་པོ_ཟླ་བ་གཉིས་པ_ཟླ་བ་གསུམ་པ_ཟླ་བ་བཞི་པ_ཟླ་བ་ལྔ་པ_ཟླ་བ་དྲུག་པ_ཟླ་བ་བདུན་པ_ཟླ་བ་བརྒྱད་པ_ཟླ་བ་དགུ་པ_ཟླ་བ་བཅུ་པ_ཟླ་བ་བཅུ་གཅིག་པ_ཟླ་བ་བཅུ་གཉིས་པ'.split('_'),
+  monthsShort: 'ཟླ་དང་པོ_ཟླ་གཉིས་པ_ཟླ་གསུམ་པ_ཟླ་བཞི་པ_ཟླ་ལྔ་པ_ཟླ་དྲུག་པ_ཟླ་བདུན་པ_ཟླ་བརྒྱད་པ_ཟླ་དགུ་པ_ཟླ་བཅུ་པ_ཟླ་བཅུ་གཅིག་པ_ཟླ་བཅུ་གཉིས་པ'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'A h:mm',
+    LTS: 'A h:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY, A h:mm',
+    LLLL: 'dddd, D MMMM YYYY, A h:mm'
+  },
+  relativeTime: {
+    future: '%s ལ་',
+    past: '%s སྔོན་ལ་',
+    s: 'ཏོག་ཙམ་',
+    m: 'སྐར་མ་གཅིག་',
+    mm: 'སྐར་མ་ %d',
+    h: 'ཆུ་ཚོད་གཅིག་',
+    hh: 'ཆུ་ཚོད་ %d',
+    d: 'ཉིན་གཅིག་',
+    dd: 'ཉིན་ %d',
+    M: 'ཟླ་བ་གཅིག་',
+    MM: 'ཟླ་བ་ %d',
+    y: 'ལོ་གཅིག་',
+    yy: 'ལོ་ %d'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 93 - 0
common/dayjs/esm/locale/br.js

@@ -0,0 +1,93 @@
+// Breton [br]
+import dayjs from '../index';
+
+function lastNumber(number) {
+  if (number > 9) {
+    return lastNumber(number % 10);
+  }
+
+  return number;
+}
+
+function softMutation(text) {
+  var mutationTable = {
+    m: 'v',
+    b: 'v',
+    d: 'z'
+  };
+  return mutationTable[text.charAt(0)] + text.substring(1);
+}
+
+function mutation(text, number) {
+  if (number === 2) {
+    return softMutation(text);
+  }
+
+  return text;
+}
+
+function relativeTimeWithMutation(number, withoutSuffix, key) {
+  var format = {
+    mm: 'munutenn',
+    MM: 'miz',
+    dd: 'devezh'
+  };
+  return number + " " + mutation(format[key], number);
+}
+
+function specialMutationForYears(number) {
+  /* istanbul ignore next line */
+  switch (lastNumber(number)) {
+    case 1:
+    case 3:
+    case 4:
+    case 5:
+    case 9:
+      return number + " bloaz";
+
+    default:
+      return number + " vloaz";
+  }
+}
+
+var locale = {
+  name: 'br',
+  weekdays: 'Sul_Lun_Meurzh_Mercʼher_Yaou_Gwener_Sadorn'.split('_'),
+  months: 'Genver_Cʼhwevrer_Meurzh_Ebrel_Mae_Mezheven_Gouere_Eost_Gwengolo_Here_Du_Kerzu'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Sul_Lun_Meu_Mer_Yao_Gwe_Sad'.split('_'),
+  monthsShort: 'Gen_Cʼhwe_Meu_Ebr_Mae_Eve_Gou_Eos_Gwe_Her_Du_Ker'.split('_'),
+  weekdaysMin: 'Su_Lu_Me_Mer_Ya_Gw_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    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 h[e]mm A',
+    LLLL: 'dddd, D [a viz] MMMM YYYY h[e]mm A'
+  },
+  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
+  },
+  meridiem: function meridiem(hour) {
+    return hour < 12 ? 'a.m.' : 'g.m.';
+  } // a-raok merenn | goude merenn
+
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 24 - 0
common/dayjs/esm/locale/bs.js

@@ -0,0 +1,24 @@
+// Bosnian [bs]
+import dayjs from '../index';
+var locale = {
+  name: 'bs',
+  weekdays: 'nedjelja_ponedjeljak_utorak_srijeda_četvrtak_petak_subota'.split('_'),
+  months: 'januar_februar_mart_april_maj_juni_juli_august_septembar_oktobar_novembar_decembar'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'ned._pon._uto._sri._čet._pet._sub.'.split('_'),
+  monthsShort: 'jan._feb._mar._apr._maj._jun._jul._aug._sep._okt._nov._dec.'.split('_'),
+  weekdaysMin: 'ne_po_ut_sr_če_pe_su'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm',
+    LLLL: 'dddd, D. MMMM YYYY H:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 44 - 0
common/dayjs/esm/locale/ca.js

@@ -0,0 +1,44 @@
+// Catalan [ca]
+import dayjs from '../index';
+var locale = {
+  name: 'ca',
+  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('_'),
+  months: 'Gener_Febrer_Març_Abril_Maig_Juny_Juliol_Agost_Setembre_Octubre_Novembre_Desembre'.split('_'),
+  monthsShort: 'Gen._Febr._Març_Abr._Maig_Juny_Jul._Ag._Set._Oct._Nov._Des.'.split('_'),
+  weekStart: 1,
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM [de] YYYY',
+    LLL: 'D MMMM [de] YYYY [a les] H:mm',
+    LLLL: 'dddd D MMMM [de] YYYY [a les] H:mm',
+    ll: 'D MMM YYYY',
+    lll: 'D MMM YYYY, H:mm',
+    llll: 'ddd D MMM YYYY, H:mm'
+  },
+  relativeTime: {
+    future: 'd\'aquí %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'
+  },
+  ordinal: function ordinal(n) {
+    var ord;
+    if (n === 1 || n === 3) ord = 'r';else if (n === 2) ord = 'n';else if (n === 4) ord = 't';else ord = 'è';
+    return "" + n + ord;
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 120 - 0
common/dayjs/esm/locale/cs.js

@@ -0,0 +1,120 @@
+// Czech [cs]
+import dayjs from '../index';
+
+function plural(n) {
+  return n > 1 && n < 5 && ~~(n / 10) !== 1; // eslint-disable-line
+}
+/* eslint-disable */
+
+
+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');
+      }
+
+      return result + "minutami";
+
+    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');
+      }
+
+      return result + "hodinami";
+
+    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í');
+      }
+
+      return result + "dny";
+
+    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ů');
+      }
+
+      return result + "m\u011Bs\xEDci";
+
+    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');
+      }
+
+      return result + "lety";
+  }
+}
+/* eslint-enable */
+
+
+var locale = {
+  name: 'cs',
+  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('_'),
+  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('_'),
+  weekStart: 1,
+  yearStart: 4,
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  formats: {
+    LT: 'H:mm',
+    LTS: 'H:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY H:mm',
+    LLLL: 'dddd D. MMMM YYYY H:mm',
+    l: 'D. M. YYYY'
+  },
+  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
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 24 - 0
common/dayjs/esm/locale/cv.js

@@ -0,0 +1,24 @@
+// Chuvash [cv]
+import dayjs from '../index';
+var locale = {
+  name: 'cv',
+  weekdays: 'вырсарникун_тунтикун_ытларикун_юнкун_кӗҫнерникун_эрнекун_шӑматкун'.split('_'),
+  months: 'кӑрлач_нарӑс_пуш_ака_май_ҫӗртме_утӑ_ҫурла_авӑн_юпа_чӳк_раштав'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'выр_тун_ытл_юн_кӗҫ_эрн_шӑм'.split('_'),
+  monthsShort: 'кӑр_нар_пуш_ака_май_ҫӗр_утӑ_ҫур_авн_юпа_чӳк_раш'.split('_'),
+  weekdaysMin: 'вр_тн_ыт_юн_кҫ_эр_шм'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD-MM-YYYY',
+    LL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ]',
+    LLL: 'YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm',
+    LLLL: 'dddd, YYYY [ҫулхи] MMMM [уйӑхӗн] D[-мӗшӗ], HH:mm'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 39 - 0
common/dayjs/esm/locale/cy.js

@@ -0,0 +1,39 @@
+// Welsh [cy]
+import dayjs from '../index';
+var locale = {
+  name: 'cy',
+  weekdays: 'Dydd Sul_Dydd Llun_Dydd Mawrth_Dydd Mercher_Dydd Iau_Dydd Gwener_Dydd Sadwrn'.split('_'),
+  months: 'Ionawr_Chwefror_Mawrth_Ebrill_Mai_Mehefin_Gorffennaf_Awst_Medi_Hydref_Tachwedd_Rhagfyr'.split('_'),
+  weekStart: 1,
+  weekdaysShort: 'Sul_Llun_Maw_Mer_Iau_Gwe_Sad'.split('_'),
+  monthsShort: 'Ion_Chwe_Maw_Ebr_Mai_Meh_Gor_Aws_Med_Hyd_Tach_Rhag'.split('_'),
+  weekdaysMin: 'Su_Ll_Ma_Me_Ia_Gw_Sa'.split('_'),
+  ordinal: function ordinal(n) {
+    return n;
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD/MM/YYYY',
+    LL: 'D MMMM YYYY',
+    LLL: 'D MMMM YYYY HH:mm',
+    LLLL: 'dddd, D MMMM YYYY HH:mm'
+  },
+  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'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 39 - 0
common/dayjs/esm/locale/da.js

@@ -0,0 +1,39 @@
+// Danish [da]
+import dayjs from '../index';
+var locale = {
+  name: 'da',
+  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('_'),
+  months: 'januar_februar_marts_april_maj_juni_juli_august_september_oktober_november_december'.split('_'),
+  monthsShort: 'jan._feb._mar._apr._maj_juni_juli_aug._sept._okt._nov._dec.'.split('_'),
+  weekStart: 1,
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  formats: {
+    LT: 'HH:mm',
+    LTS: 'HH:mm:ss',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY HH:mm',
+    LLLL: 'dddd [d.] D. MMMM YYYY [kl.] HH:mm'
+  },
+  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'
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

+ 63 - 0
common/dayjs/esm/locale/de-at.js

@@ -0,0 +1,63 @@
+// German (Austria) [de-at]
+import dayjs from '../index';
+var texts = {
+  s: 'ein paar Sekunden',
+  m: ['eine Minute', 'einer Minute'],
+  mm: '%d Minuten',
+  h: ['eine Stunde', 'einer Stunde'],
+  hh: '%d Stunden',
+  d: ['ein Tag', 'einem Tag'],
+  dd: ['%d Tage', '%d Tagen'],
+  M: ['ein Monat', 'einem Monat'],
+  MM: ['%d Monate', '%d Monaten'],
+  y: ['ein Jahr', 'einem Jahr'],
+  yy: ['%d Jahre', '%d Jahren']
+};
+
+function relativeTimeFormatter(number, withoutSuffix, key) {
+  var l = texts[key];
+
+  if (Array.isArray(l)) {
+    l = l[withoutSuffix ? 0 : 1];
+  }
+
+  return l.replace('%d', number);
+}
+
+var locale = {
+  name: 'de-at',
+  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('_'),
+  months: 'Jänner_Februar_März_April_Mai_Juni_Juli_August_September_Oktober_November_Dezember'.split('_'),
+  monthsShort: 'Jän._Feb._März_Apr._Mai_Juni_Juli_Aug._Sep._Okt._Nov._Dez.'.split('_'),
+  ordinal: function ordinal(n) {
+    return n + ".";
+  },
+  weekStart: 1,
+  formats: {
+    LTS: 'HH:mm:ss',
+    LT: 'HH:mm',
+    L: 'DD.MM.YYYY',
+    LL: 'D. MMMM YYYY',
+    LLL: 'D. MMMM YYYY HH:mm',
+    LLLL: 'dddd, D. MMMM YYYY HH:mm'
+  },
+  relativeTime: {
+    future: 'in %s',
+    past: 'vor %s',
+    s: relativeTimeFormatter,
+    m: relativeTimeFormatter,
+    mm: relativeTimeFormatter,
+    h: relativeTimeFormatter,
+    hh: relativeTimeFormatter,
+    d: relativeTimeFormatter,
+    dd: relativeTimeFormatter,
+    M: relativeTimeFormatter,
+    MM: relativeTimeFormatter,
+    y: relativeTimeFormatter,
+    yy: relativeTimeFormatter
+  }
+};
+dayjs.locale(locale, null, true);
+export default locale;

Niektoré súbory nie sú zobrazené, pretože je v týchto rozdielových dátach zmenené mnoho súborov