├── .example.env
├── Publish
├── change_logs.text
├── assets
│ ├── setup_1.png
│ ├── appstore.png
│ ├── leave_wechat.png
│ └── widget_helper.png
├── images
│ ├── mobile.png
│ ├── payment.jpg
│ ├── appple-store.jpg
│ └── logo.svg
├── plugins
│ ├── slick
│ │ ├── ajax-loader.gif
│ │ ├── fonts
│ │ │ ├── slick.eot
│ │ │ ├── slick.ttf
│ │ │ ├── slick.woff
│ │ │ └── slick.svg
│ │ ├── slick.css
│ │ ├── slick-theme.css
│ │ ├── README.markdown
│ │ └── slick.min.js
│ ├── themify-icons
│ │ ├── fonts
│ │ │ ├── themify.eot
│ │ │ ├── themify.ttf
│ │ │ └── themify.woff
│ │ └── themify-icons.css
│ ├── syotimer
│ │ └── jquery.syotimer.min.js
│ ├── fancybox
│ │ └── jquery.fancybox.min.css
│ └── aos
│ │ └── aos.js
├── version.json
├── installer.js
├── 404.html
├── js
│ └── script.js
├── payment.html
├── about.html
├── index.html
└── installation.html
├── .gitignore
├── screenshots
├── sc_1.png
└── sc_2.jpeg
├── jsconfig.json
├── .prettierrc
├── install-runtime.js
├── .eslintrc
├── package.json
├── LICENSE
├── README.md
├── encode.js
├── guide.html
├── pack.js
├── README.en-us.md
├── app.js
└── Scripts
└── 「小件件」开发环境.js
/.example.env:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Publish/change_logs.text:
--------------------------------------------------------------------------------
1 |
2 | *修复 - 之前由于BMW更换新的接口,导致无法登录,现在经由BMW官方短信验证登录
3 | *优化 - 删除部分冗余代码
4 |
--------------------------------------------------------------------------------
/.gitignore:
--------------------------------------------------------------------------------
1 | node_modules/
2 | package-lock.json
3 | Widget.js
4 | .DS_File
5 | Dist/
6 | example.json
7 | .env
--------------------------------------------------------------------------------
/screenshots/sc_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/screenshots/sc_1.png
--------------------------------------------------------------------------------
/screenshots/sc_2.jpeg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/screenshots/sc_2.jpeg
--------------------------------------------------------------------------------
/Publish/assets/setup_1.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/assets/setup_1.png
--------------------------------------------------------------------------------
/Publish/images/mobile.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/images/mobile.png
--------------------------------------------------------------------------------
/Publish/images/payment.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/images/payment.jpg
--------------------------------------------------------------------------------
/Publish/assets/appstore.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/assets/appstore.png
--------------------------------------------------------------------------------
/Publish/assets/leave_wechat.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/assets/leave_wechat.png
--------------------------------------------------------------------------------
/Publish/images/appple-store.jpg:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/images/appple-store.jpg
--------------------------------------------------------------------------------
/Publish/assets/widget_helper.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/assets/widget_helper.png
--------------------------------------------------------------------------------
/Publish/plugins/slick/ajax-loader.gif:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/plugins/slick/ajax-loader.gif
--------------------------------------------------------------------------------
/Publish/plugins/slick/fonts/slick.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/plugins/slick/fonts/slick.eot
--------------------------------------------------------------------------------
/Publish/plugins/slick/fonts/slick.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/plugins/slick/fonts/slick.ttf
--------------------------------------------------------------------------------
/Publish/plugins/slick/fonts/slick.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/plugins/slick/fonts/slick.woff
--------------------------------------------------------------------------------
/Publish/plugins/themify-icons/fonts/themify.eot:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/plugins/themify-icons/fonts/themify.eot
--------------------------------------------------------------------------------
/Publish/plugins/themify-icons/fonts/themify.ttf:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/plugins/themify-icons/fonts/themify.ttf
--------------------------------------------------------------------------------
/Publish/plugins/themify-icons/fonts/themify.woff:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/opp100/bmw-scriptable-widgets/HEAD/Publish/plugins/themify-icons/fonts/themify.woff
--------------------------------------------------------------------------------
/Publish/version.json:
--------------------------------------------------------------------------------
1 | {
2 | "WIDGET_VERSION": "v2.2.1",
3 | "WIDGET_BUILD": "22050702",
4 | "BMW_USER_AGENT": "ios(15.4.1);bmw;2.3.0(13603)"
5 | }
6 |
--------------------------------------------------------------------------------
/jsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "checkJs": true
4 | },
5 | "exclude": [
6 | "node_modules",
7 | "**/node_modules/*"
8 | ]
9 | }
--------------------------------------------------------------------------------
/.prettierrc:
--------------------------------------------------------------------------------
1 | {
2 | "printWidth": 120,
3 | "tabWidth": 4,
4 | "semi": true,
5 | "bracketSpacing": false,
6 | "jsxBracketSameLine": true,
7 | "singleQuote": true,
8 | "arrowParents": "always",
9 | "trailingComma": "none"
10 | }
11 |
--------------------------------------------------------------------------------
/install-runtime.js:
--------------------------------------------------------------------------------
1 | const FILE_MGR = FileManager[module.filename.includes('Documents/iCloud~') ? 'iCloud' : 'local']();
2 | await Promise.all(
3 | [*|FILES|*].map(async (js) => {
4 | const REQ = new Request(`http://*|IP_ADDRESS|*/Scripts/${encodeURIComponent(js)}`);
5 | const RES = await REQ.load();
6 | FILE_MGR.write(FILE_MGR.joinPath(FILE_MGR.documentsDirectory(), js), RES);
7 | })
8 | );
9 | FILE_MGR.remove(module.filename);
10 | Safari.open('scriptable:///open?scriptName=' + encodeURIComponent('「源码」小组件示例'));
11 |
--------------------------------------------------------------------------------
/.eslintrc:
--------------------------------------------------------------------------------
1 | {
2 | "extends": "google",
3 | "parserOptions": {
4 | "sourceType": "module",
5 | "ecmaVersion": 2017
6 | },
7 | "rules": {
8 | "max-len": [
9 | "error",
10 | {
11 | "code": 120,
12 | "ignoreTrailingComments": true,
13 | "ignoreUrls": true,
14 | "ignoreStrings": true,
15 | "ignoreTemplateLiterals": true,
16 | "ignoreRegExpLiterals": true
17 | }
18 | ],
19 | "comma-dangle": [
20 | "error",
21 | "never"
22 | ],
23 | "require-jsdoc": 0
24 | }
25 | }
--------------------------------------------------------------------------------
/package.json:
--------------------------------------------------------------------------------
1 | {
2 | "name": "v2-dev",
3 | "version": "1.0.0",
4 | "runtime_ver": 20201209,
5 | "description": "",
6 | "main": "index.js",
7 | "scripts": {
8 | "test": "echo \"Error: no test specified\" && exit 1",
9 | "start": "node app",
10 | "build": "node pack Scripts/「源码」bmw-linker.js",
11 | "purge-cdn": "https://purge.jsdelivr.net/gh/opp100/bmw-scriptable-widgets@main/"
12 | },
13 | "author": "",
14 | "license": "ISC",
15 | "dependencies": {
16 | "body-parser": "^1.19.0",
17 | "dotenv": "^10.0.0",
18 | "express": "^4.17.1",
19 | "javascript-obfuscator": "^2.9.4",
20 | "multer": "^1.4.2"
21 | },
22 | "devDependencies": {
23 | "@types/scriptable-ios": "^1.6.3"
24 | }
25 | }
26 |
--------------------------------------------------------------------------------
/Publish/installer.js:
--------------------------------------------------------------------------------
1 | const FILE_MGR = FileManager[module.filename.includes('Documents/iCloud~') ? 'iCloud' : 'local']();
2 | let files = FILE_MGR.listContents(FILE_MGR.documentsDirectory());
3 |
4 | await Promise.all(
5 | ['bmw-linker.js'].map(async (js) => {
6 | const REQ = new Request(`https://cdn.jsdelivr.net/gh/opp100/bmw-scriptable-widgets@main/Publish/${encodeURIComponent(js)}`);
7 | const RES = await REQ.load();
8 | try {
9 | FILE_MGR.remove(FILE_MGR.joinPath(FILE_MGR.documentsDirectory(), js));
10 | } catch (e) {}
11 |
12 | FILE_MGR.write(FILE_MGR.joinPath(FILE_MGR.documentsDirectory(), js), RES);
13 | })
14 | );
15 |
16 | FILE_MGR.remove(module.filename);
17 | Safari.open('scriptable:///run?scriptName=' + encodeURIComponent('bmw-linker.js'));
18 |
--------------------------------------------------------------------------------
/LICENSE:
--------------------------------------------------------------------------------
1 | MIT License
2 |
3 | Copyright (c) 2021 Youke XIANG
4 |
5 | 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:
6 |
7 | The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
8 |
9 | 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.
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # bmw-scriptable-widgets
2 |
3 | ## 介绍
4 | 本程序是基于Scriptable开发的一个小组件。使用「小件件」作为开发框架而搭建。
5 |
6 | 主要用于从My BMW API中获取车辆相关信息并以小组件的形式展示到iOS设备上。
7 |
8 | More languages: [English](README.en-us.md).
9 |
10 | ## 程序主页
11 | [](https://bmw-linker.com)
12 |
13 | ## 小组件效果
14 | 
15 |
16 | ## 如何开发
17 | *开发需要nodejs环境,建议使用 [nvm](https://github.com/nvm-sh/nvm) 搭建node环境。
18 |
19 | *建议使用[VSCode](https://code.visualstudio.com/)作为IDE来开发此程序
20 |
21 | 在终端中运行以下命令
22 | ```bash
23 | npm install
24 | npm start
25 | ```
26 | 然后根据Console的提示来
27 |
28 | *如果IP不正确,可以添加一个`.env`文件,然后放入电脑的IP和端口
29 | ```
30 | DEV_SERVER=192.168.1.123
31 | ```
32 |
33 | ## 「小件件」开发框架
34 | > iOS 小组件快速开发框架 / 模板 / 小组件源码 👉 for [Scriptable](https://scriptable.app)
35 | > 「小件件」开发框架[「小件件」开发框架](https://github.com/im3x/Scriptables)
36 |
37 |
38 | ### 特别鸣谢
39 | 感谢POPO大佬帮助UI建设。
40 |
41 | 感谢胡总、吹雪、沙包、以及部分群友,提供思路帮助与测试
42 |
43 | ### License
44 | [](./LICENSE)
45 |
46 | ### 资助开发
47 | [](./Publish/images/payment.jpg)
48 |
--------------------------------------------------------------------------------
/encode.js:
--------------------------------------------------------------------------------
1 | // 加密压缩打包后的小组件代码
2 | // 方便隐藏敏感信息,减少组件体积和保护小组件不被随意修改
3 |
4 | // 用法:
5 | // node encode.js Dist/「小件件」你的小组件.js
6 |
7 |
8 | const process = require('process')
9 | const os = require('os')
10 | const fs = require('fs')
11 | const path = require('path')
12 |
13 | var JB = require('javascript-obfuscator');
14 |
15 | if (process.argv.length !== 3) {
16 | console.log('[!] 用法:node encode.js Dist/「小件件」xxx.js')
17 | process.exit(0)
18 | }
19 |
20 | const file_name = process.argv[2]
21 | const out_name = file_name.replace(".js", ".enc.js")
22 |
23 | // 读取源文件
24 | const widget_file = fs.readFileSync(path.join(__dirname, file_name))
25 |
26 | let widget_code = widget_file.toString("utf-8")
27 | widget_code = widget_code.split("await Running(Widget)")[0];
28 |
29 |
30 | var result = JB.obfuscate(widget_code.toString("utf-8"), {
31 | "rotateStringArray": true,
32 | "selfDefending": true,
33 | "stringArray": true,
34 | splitStringsChunkLength: 100,
35 | "stringArrayEncoding": ["rc4", "base64"]
36 | }).getObfuscatedCode()
37 |
38 | let result_header = widget_code.split("// icon-color:")[0]
39 | result_header += "// icon-color:"
40 | result_header += widget_code.split("// icon-color:")[1].split("\n")[0]
41 | result_header += "\n// " + file_name
42 | result_header += "\n// https://github.com/im3x/Scriptables"
43 |
44 | let result_code = `${result_header}\n${result};await Running(Widget);`
45 |
46 | fs.writeFileSync(path.join(__dirname, out_name), result_code);
47 |
48 | console.log("[*] 文件已压缩混淆至:", out_name)
--------------------------------------------------------------------------------
/guide.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
6 | 手机安装「小件件」开发环境指导
7 |
8 |
9 |
10 |
11 |
12 | 打开 Scriptable,点击 ➕,粘贴,运行 ▶️
13 | 👉 2. 点击打开 Scriptable
14 |
15 |
44 |
55 |
--------------------------------------------------------------------------------
/pack.js:
--------------------------------------------------------------------------------
1 | /**
2 | * 打包成单独小组件
3 | * 用法:
4 | * node pack.js Scripts/「源码」小组件示例.js
5 | * 将会在`Dist`目录生成「小件件」小组件示例.js 文件,这个文件可以发送给用户单独使用
6 | */
7 |
8 | const process = require('process')
9 | const os = require('os')
10 | const fs = require('fs')
11 | const path = require('path')
12 |
13 | if (process.argv.length !== 3) {
14 | console.log('[!] 用法:node pack Scripts/「源码」xxx.js')
15 | process.exit(0)
16 | }
17 |
18 | const SAVE_PATH = path.join(__dirname, "Publish")
19 | const file_name = process.argv[2]
20 | const out_name = file_name.replace("「源码」", "").replace("Scripts", "Publish");
21 |
22 | // 创建目录
23 | if (!fs.existsSync(SAVE_PATH)) {
24 | fs.mkdirSync(SAVE_PATH)
25 | }
26 | // 组合文件
27 | const runtime_file = fs.readFileSync(path.join(__dirname, "Scripts", "「小件件」开发环境.js"))
28 |
29 | const runtime_code = runtime_file.toString("utf-8").split("// @running.end")[0]
30 | const widget_file = fs.readFileSync(path.join(__dirname, file_name))
31 |
32 | const widget_code = widget_file.toString("utf-8");
33 | const widget_class = widget_code.split("// @组件代码开始")[1].split("// @组件代码结束")[0]
34 | const widget_header = widget_code.split('// icon-color:')[1].split('\n')[0];
35 |
36 | let result_code = `// Variables used by Scriptable.
37 | // These must be at the very top of the file. Do not edit.
38 | // icon-color:${widget_header}
39 | ${runtime_code}
40 | ${widget_class}
41 | await Running(Widget)`
42 |
43 | // 写入文件
44 | fs.writeFileSync(path.join(__dirname, out_name), result_code)
45 | console.log('[*] 文件已经保存到:' + out_name)
--------------------------------------------------------------------------------
/README.en-us.md:
--------------------------------------------------------------------------------
1 | # bmw-scriptable-widgets
2 |
3 | ## What's this about?
4 | This project is a pure Node JS widget which can be used on [Scriptable](https://scriptable.app).
5 |
6 | The main purpose of this project is the load vehicle related information from, then display them into the desktop of iOS ( > 13) devices.
7 |
8 | 其他语言版本: [中文](README.md).
9 | ## Home Page
10 | [](https://bmw-linker.com)
11 | ## Screenshots
12 | 
13 |
14 | ## How to Develop
15 | *NodeJS is required,recommend using [nvm](https://github.com/nvm-sh/nvm) to setup Node environment easily.
16 |
17 | *[VSCode](https://code.visualstudio.com/) is suggested as IDE for this project
18 |
19 | Run following commands in you Terminal
20 | ```bash
21 | npm install
22 | npm start
23 | ```
24 | Then follow the instruction shown in the Console
25 |
26 | *If the IP address doesn't setup correctly, please put the `.env` file in the root of project and put your computer's IP address. Such as:
27 | ```
28 | DEV_SERVER=192.168.1.123
29 | ```
30 |
31 | ### Contributors
32 | Thanks POPO provides UI。
33 |
34 | Thanks for Mr. Hu, Mr.Chui and Mr.Shabao provide ideas and API logics.
35 |
36 | Thanks many other bimmwer owners give us feedback suggestions and help with test.
37 |
38 | ### License
39 | [](./LICENSE)
40 |
41 | ### DONATE
42 | [](./Publish/images/payment.jpg)
--------------------------------------------------------------------------------
/Publish/plugins/slick/fonts/slick.svg:
--------------------------------------------------------------------------------
1 |
2 |
3 |
15 |
--------------------------------------------------------------------------------
/Publish/plugins/slick/slick.css:
--------------------------------------------------------------------------------
1 | /* Slider */
2 | .slick-slider
3 | {
4 | position: relative;
5 |
6 | display: block;
7 | box-sizing: border-box;
8 |
9 | -webkit-user-select: none;
10 | -moz-user-select: none;
11 | -ms-user-select: none;
12 | user-select: none;
13 |
14 | -webkit-touch-callout: none;
15 | -khtml-user-select: none;
16 | -ms-touch-action: pan-y;
17 | touch-action: pan-y;
18 | -webkit-tap-highlight-color: transparent;
19 | }
20 |
21 | .slick-list
22 | {
23 | position: relative;
24 |
25 | display: block;
26 | overflow: hidden;
27 |
28 | margin: 0;
29 | padding: 0;
30 | }
31 | .slick-list:focus
32 | {
33 | outline: none;
34 | }
35 | .slick-list.dragging
36 | {
37 | cursor: pointer;
38 | cursor: hand;
39 | }
40 |
41 | .slick-slider .slick-track,
42 | .slick-slider .slick-list
43 | {
44 | -webkit-transform: translate3d(0, 0, 0);
45 | -moz-transform: translate3d(0, 0, 0);
46 | -ms-transform: translate3d(0, 0, 0);
47 | -o-transform: translate3d(0, 0, 0);
48 | transform: translate3d(0, 0, 0);
49 | }
50 |
51 | .slick-track
52 | {
53 | position: relative;
54 | top: 0;
55 | left: 0;
56 |
57 | display: block;
58 | margin-left: auto;
59 | margin-right: auto;
60 | }
61 | .slick-track:before,
62 | .slick-track:after
63 | {
64 | display: table;
65 |
66 | content: '';
67 | }
68 | .slick-track:after
69 | {
70 | clear: both;
71 | }
72 | .slick-loading .slick-track
73 | {
74 | visibility: hidden;
75 | }
76 |
77 | .slick-slide
78 | {
79 | display: none;
80 | float: left;
81 |
82 | height: 100%;
83 | min-height: 1px;
84 | }
85 | [dir='rtl'] .slick-slide
86 | {
87 | float: right;
88 | }
89 | .slick-slide img
90 | {
91 | display: block;
92 | }
93 | .slick-slide.slick-loading img
94 | {
95 | display: none;
96 | }
97 | .slick-slide.dragging img
98 | {
99 | pointer-events: none;
100 | }
101 | .slick-initialized .slick-slide
102 | {
103 | display: block;
104 | }
105 | .slick-loading .slick-slide
106 | {
107 | visibility: hidden;
108 | }
109 | .slick-vertical .slick-slide
110 | {
111 | display: block;
112 |
113 | height: auto;
114 |
115 | border: 1px solid transparent;
116 | }
117 | .slick-arrow.slick-hidden {
118 | display: none;
119 | }
120 |
--------------------------------------------------------------------------------
/Publish/404.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | BMW Linker - 404
9 |
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
37 |
38 |
39 |
404
40 |
页面无法找到
41 |
访问主页
42 |
43 |
44 |
45 |
46 |
47 |
48 |
49 |
50 |
51 |
52 |
53 |
54 |
55 |
56 |
57 |
58 |
59 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
--------------------------------------------------------------------------------
/Publish/plugins/slick/slick-theme.css:
--------------------------------------------------------------------------------
1 | @charset 'UTF-8';
2 | /* Slider */
3 | .slick-loading .slick-list
4 | {
5 | background: #fff url('./ajax-loader.gif') center center no-repeat;
6 | }
7 |
8 | /* Icons */
9 | @font-face
10 | {
11 | font-family: 'slick';
12 | font-weight: normal;
13 | font-style: normal;
14 |
15 | src: url('./fonts/slick.eot');
16 | src: url('./fonts/slick.eot?#iefix') format('embedded-opentype'), url('./fonts/slick.woff') format('woff'), url('./fonts/slick.ttf') format('truetype'), url('./fonts/slick.svg#slick') format('svg');
17 | }
18 | /* Arrows */
19 | .slick-prev,
20 | .slick-next
21 | {
22 | font-size: 0;
23 | line-height: 0;
24 |
25 | position: absolute;
26 | top: 50%;
27 |
28 | display: block;
29 |
30 | width: 20px;
31 | height: 20px;
32 | padding: 0;
33 | -webkit-transform: translate(0, -50%);
34 | -ms-transform: translate(0, -50%);
35 | transform: translate(0, -50%);
36 |
37 | cursor: pointer;
38 |
39 | color: transparent;
40 | border: none;
41 | outline: none;
42 | background: transparent;
43 | }
44 | .slick-prev:hover,
45 | .slick-prev:focus,
46 | .slick-next:hover,
47 | .slick-next:focus
48 | {
49 | color: transparent;
50 | outline: none;
51 | background: transparent;
52 | }
53 | .slick-prev:hover:before,
54 | .slick-prev:focus:before,
55 | .slick-next:hover:before,
56 | .slick-next:focus:before
57 | {
58 | opacity: 1;
59 | }
60 | .slick-prev.slick-disabled:before,
61 | .slick-next.slick-disabled:before
62 | {
63 | opacity: .25;
64 | }
65 |
66 | .slick-prev:before,
67 | .slick-next:before
68 | {
69 | font-family: 'slick';
70 | font-size: 20px;
71 | line-height: 1;
72 |
73 | opacity: .75;
74 | color: white;
75 |
76 | -webkit-font-smoothing: antialiased;
77 | -moz-osx-font-smoothing: grayscale;
78 | }
79 |
80 | .slick-prev
81 | {
82 | left: -25px;
83 | }
84 | [dir='rtl'] .slick-prev
85 | {
86 | right: -25px;
87 | left: auto;
88 | }
89 | .slick-prev:before
90 | {
91 | content: '←';
92 | }
93 | [dir='rtl'] .slick-prev:before
94 | {
95 | content: '→';
96 | }
97 |
98 | .slick-next
99 | {
100 | right: -25px;
101 | }
102 | [dir='rtl'] .slick-next
103 | {
104 | right: auto;
105 | left: -25px;
106 | }
107 | .slick-next:before
108 | {
109 | content: '→';
110 | }
111 | [dir='rtl'] .slick-next:before
112 | {
113 | content: '←';
114 | }
115 |
116 | /* Dots */
117 | .slick-dotted.slick-slider
118 | {
119 | margin-bottom: 30px;
120 | }
121 |
122 | .slick-dots
123 | {
124 | position: absolute;
125 | bottom: -25px;
126 |
127 | display: block;
128 |
129 | width: 100%;
130 | padding: 0;
131 | margin: 0;
132 |
133 | list-style: none;
134 |
135 | text-align: center;
136 | }
137 | .slick-dots li
138 | {
139 | position: relative;
140 |
141 | display: inline-block;
142 |
143 | width: 20px;
144 | height: 20px;
145 | margin: 0 5px;
146 | padding: 0;
147 |
148 | cursor: pointer;
149 | }
150 | .slick-dots li button
151 | {
152 | font-size: 0;
153 | line-height: 0;
154 |
155 | display: block;
156 |
157 | width: 20px;
158 | height: 20px;
159 | padding: 5px;
160 |
161 | cursor: pointer;
162 |
163 | color: transparent;
164 | border: 0;
165 | outline: none;
166 | background: transparent;
167 | }
168 | .slick-dots li button:hover,
169 | .slick-dots li button:focus
170 | {
171 | outline: none;
172 | }
173 | .slick-dots li button:hover:before,
174 | .slick-dots li button:focus:before
175 | {
176 | opacity: 1;
177 | }
178 | .slick-dots li button:before
179 | {
180 | font-family: 'slick';
181 | font-size: 6px;
182 | line-height: 20px;
183 |
184 | position: absolute;
185 | top: 0;
186 | left: 0;
187 |
188 | width: 20px;
189 | height: 20px;
190 |
191 | content: '•';
192 | text-align: center;
193 |
194 | opacity: .25;
195 | color: black;
196 |
197 | -webkit-font-smoothing: antialiased;
198 | -moz-osx-font-smoothing: grayscale;
199 | }
200 | .slick-dots li.slick-active button:before
201 | {
202 | opacity: 1;
203 | color: #2e7eed;
204 | }
205 |
--------------------------------------------------------------------------------
/Publish/js/script.js:
--------------------------------------------------------------------------------
1 | (function ($) {
2 | 'use strict';
3 |
4 | // ----------------------------
5 | // AOS
6 | // ----------------------------
7 | AOS.init({
8 | once: true
9 | });
10 |
11 |
12 | $(window).on('scroll', function () {
13 | //.Scroll to top show/hide
14 | var scrollToTop = $('.scroll-top-to'),
15 | scroll = $(window).scrollTop();
16 | if (scroll >= 200) {
17 | scrollToTop.fadeIn(200);
18 | } else {
19 | scrollToTop.fadeOut(100);
20 | }
21 | });
22 | // scroll-to-top
23 | $('.scroll-top-to').on('click', function () {
24 | $('body,html').animate({
25 | scrollTop: 0
26 | }, 500);
27 | return false;
28 | });
29 |
30 | $(document).ready(function() {
31 |
32 | // navbarDropdown
33 | if ($(window).width() < 992) {
34 | $('.main-nav .dropdown-toggle').on('click', function () {
35 | $(this).siblings('.dropdown-menu').animate({
36 | height: 'toggle'
37 | }, 300);
38 | });
39 | }
40 |
41 | // -----------------------------
42 | // Testimonial Slider
43 | // -----------------------------
44 | $('.testimonial-slider').slick({
45 | slidesToShow: 2,
46 | infinite: true,
47 | arrows: false,
48 | autoplay: true,
49 | autoplaySpeed: 2000,
50 | dots: true,
51 | responsive: [
52 | {
53 | breakpoint: 991,
54 | settings: {
55 | slidesToShow: 1,
56 | slidesToScroll: 1
57 | }
58 | }
59 | ]
60 | });
61 |
62 |
63 | // -----------------------------
64 | // Video Replace
65 | // -----------------------------
66 | $('.video-box i').click(function () {
67 | var video = '';
68 | $(this).replaceWith(video);
69 | });
70 |
71 |
72 | // -----------------------------
73 | // Count Down JS
74 | // -----------------------------
75 | var syoTimer = $('#simple-timer');
76 | if (syoTimer) {
77 | $('#simple-timer').syotimer({
78 | year: 2023,
79 | month: 9,
80 | day: 1,
81 | hour: 0,
82 | minute: 0
83 | });
84 | }
85 |
86 |
87 | // -----------------------------
88 | // Story Slider
89 | // -----------------------------
90 | $('.about-slider').slick({
91 | slidesToShow: 1,
92 | infinite: true,
93 | arrows: false,
94 | autoplay: true,
95 | autoplaySpeed: 2000,
96 | dots: true
97 | });
98 |
99 |
100 | // -----------------------------
101 | // Quote Slider
102 | // -----------------------------
103 | $('.quote-slider').slick({
104 | slidesToShow: 1,
105 | infinite: true,
106 | arrows: false,
107 | autoplay: true,
108 | autoplaySpeed: 2000,
109 | dots: true
110 | });
111 |
112 |
113 | // -----------------------------
114 | // Client Slider
115 | // -----------------------------
116 | $('.client-slider').slick({
117 | slidesToShow: 4,
118 | infinite: true,
119 | arrows: false,
120 | // autoplay: true,
121 | autoplaySpeed: 2000,
122 | dots: true,
123 | responsive: [
124 | {
125 | breakpoint: 0,
126 | settings: {
127 | slidesToShow: 1,
128 | slidesToScroll: 1
129 | }
130 | },
131 | {
132 | breakpoint: 575,
133 | settings: {
134 | slidesToShow: 2,
135 | slidesToScroll: 1
136 | }
137 | },
138 | {
139 | breakpoint: 767,
140 | settings: {
141 | slidesToShow: 2,
142 | slidesToScroll: 2
143 | }
144 | },
145 | {
146 | breakpoint: 991,
147 | settings: {
148 | slidesToShow: 3,
149 | slidesToScroll: 2
150 | }
151 | }
152 | ]
153 | });
154 |
155 |
156 | // scroll
157 | // $('.scrollTo').on('click', function (e) {
158 | // e.preventDefault();
159 | // var target = $(this).attr('href');
160 | // $('html, body').animate({
161 | // scrollTop: ($(target).offset().top)
162 | // }, 500);
163 | // });
164 |
165 | });
166 |
167 | })(jQuery);
--------------------------------------------------------------------------------
/Publish/payment.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | BMW Linker - 打赏开发者
9 |
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
打赏开发者
68 |
69 |
70 |
71 | 微信扫码请开发者喝可乐
72 |
73 | (最好是无糖的)
74 |
75 |
76 |

77 |
78 |
79 |
80 | 给开发者留言:
81 |
82 |
83 | xyouk721@gmail.com
84 |
85 |
86 |
87 |
88 |
89 |
90 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
105 |
106 |
107 |
108 |
109 |
110 |
111 |
112 |
113 |
114 |
--------------------------------------------------------------------------------
/Publish/plugins/syotimer/jquery.syotimer.min.js:
--------------------------------------------------------------------------------
1 | /**
2 | * SyoTimer v.2.0.0 | under MIT licence
3 | * https://github.com/mrfratello/SyoTimer#readme
4 | */
5 | !function(e){var t="day",i="hour",n="minute",o="second",r=86400,a=3600,s=60,d={d:t,h:i,m:n,s:o},l={list:[o,n,i,t],next:function(e){var t=this.list.indexOf(e);return t0&&this.list[t-1]}},u={year:2014,month:7,day:31,hour:0,minute:0,second:0,timeZone:"local",ignoreTransferTime:!1,layout:"dhms",periodic:!1,periodInterval:7,periodUnit:"d",doubleNumbers:!0,effectType:"none",lang:"eng",headTitle:"",footTitle:"",afterDeadline:function(e){e.bodyBlock.html('The countdown is finished!
')}},m={second:!1,minute:!1,hour:!1,day:!1},c={init:function(t){var i=e.extend({},u,t||{});i.itemTypes=y.getItemTypesByLayout(i.layout),i._itemsHas=e.extend({},m);for(var n=0;n",{"class":"syotimer__head"}).html(i.headTitle),r=e("",{"class":"syotimer__body"}),a=e("",{"class":"syotimer__footer"}).html(i.footTitle),s={},d=0;d .syotimer-cell__value",t).css("opacity",1);var n=new Date,o=new Date(i.year,i.month-1,i.day,i.hour,i.minute,i.second),r=y.getDifferenceWithTimezone(n,o,i),a=y.getSecondsToDeadLine(r,i);a>=0?(c._refreshUnitsDom.apply(this,[a]),c._applyEffectSwitch.apply(this,[i.effectType])):(t=e.extend(t,t.data("syotimer-blocks")),i.afterDeadline(t))},_refreshUnitsDom:function(i){var n=e(this),o=n.data("syotimer-options"),r=n.data("syotimer-items"),a=o.itemTypes,s=y.getUnitsToDeadLine(i);o._itemsHas.day||(s.hour+=24*s.day),o._itemsHas.hour||(s.minute+=60*s.hour),o._itemsHas.minute||(s.second+=60*s.minute);for(var d=0;d",{"class":"syotimer-cell__value",text:"0"}),i=e("",{"class":"syotimer-cell__unit"}),n=e("",{"class":"syotimer-cell"});return n.append(t).append(i),n},getItemTypesByLayout:function(e){for(var t=[],i=0;i=0?(r=s%t.periodInterval,r=0===r?t.periodInterval:r,r-=1):r=t.periodInterval-s%t.periodInterval,o=n%a,0===o&&n<0&&r--,i=Math.abs(r*a+o)}else i=n;return i},getUnitsToDeadLine:function(e){var i=t,n={};do{var o=y.getPeriodUnit(i);n[i]=Math.floor(e/o),e%=o}while(i=l.prev(i));return n},getPeriodUnit:function(e){switch(e){case"d":case t:return r;case"h":case i:return a;case"m":case n:return s;case"s":case o:return 1}},getDifferenceWithTimezone:function(e,t,o){var r,a=t.getTime()-e.getTime(),s=0,d=0;if("local"!==o.timeZone){var l=parseFloat(o.timeZone)*y.getPeriodUnit(i),u=-e.getTimezoneOffset()*y.getPeriodUnit(n);s=1e3*(l-u)}if(o.ignoreTransferTime){var m=-e.getTimezoneOffset()*y.getPeriodUnit(n),c=-t.getTimezoneOffset()*y.getPeriodUnit(n);d=1e3*(m-c)}return r=s+d,a-r},format2:function(e,t){return t=t!==!1,e<=9&&t?"0"+e:""+e}},p={setOption:function(t,i){var n=e(this),o=n.data("syotimer-options");o.hasOwnProperty(t)&&(o[t]=i,n.data("syotimer-options",o))}};e.fn.syotimer=function(t){if("string"==typeof t&&"setOption"===t){var i=Array.prototype.slice.call(arguments,1);return this.each(function(){p[t].apply(this,i)})}return null===t||"object"==typeof t?c.init.apply(this,[t]):void e.error("SyoTimer. Error in call methods: methods is not exist")},e.syotimerLang={rus:{second:["секунда","секунды","секунд"],minute:["минута","минуты","минут"],hour:["час","часа","часов"],day:["день","дня","дней"],handler:"rusNumeral"},eng:{second:["second","seconds"],minute:["minute","minutes"],hour:["hour","hours"],day:["day","days"]},por:{second:["segundo","segundos"],minute:["minuto","minutos"],hour:["hora","horas"],day:["dia","dias"]},spa:{second:["segundo","segundos"],minute:["minuto","minutos"],hour:["hora","horas"],day:["día","días"]},heb:{second:["שניה","שניות"],minute:["דקה","דקות"],hour:["שעה","שעות"],day:["יום","ימים"]},universal:function(e){return 1===e?0:1},rusNumeral:function(e){var t,i=[2,0,1,1,1,2];return t=e%100>4&&e%100<20?2:i[e%10<5?e%10:5]},getNumeral:function(t,i,n){var o=e.syotimerLang[i].handler||"universal",r=this[o](t);return e.syotimerLang[i][n][r]}}}(jQuery);
6 |
--------------------------------------------------------------------------------
/app.js:
--------------------------------------------------------------------------------
1 | require('dotenv').config();
2 |
3 | const fs = require('fs');
4 | const os = require('os');
5 | const path = require('path');
6 | const express = require('express');
7 | const child_process = require('child_process');
8 | const multer = require('multer');
9 | const bodyParser = require('body-parser');
10 |
11 | const HTTP_PORT = process.env.DEV_SERVER_PORT || 5566;
12 | const WORK_DIR = path.dirname(__filename);
13 | const SCRIPTS_DIR = path.join(WORK_DIR, 'Scripts');
14 | const PUBLISH_DIR = path.join(WORK_DIR, 'Publish');
15 |
16 | const app = express();
17 | const upload = multer({
18 | dest: os.tmpdir()
19 | });
20 | app.use(upload.any());
21 | app.use(
22 | bodyParser.urlencoded({
23 | extended: false
24 | })
25 | );
26 | app.use(bodyParser.json());
27 |
28 | const _ip = process.env.DEV_SERVER || getIPAdress();
29 |
30 | app.get('/', (req, res) => {
31 | let html = fs.readFileSync(path.join(WORK_DIR, 'guide.html')).toString();
32 | let js = fs.readFileSync(path.join(WORK_DIR, 'install-runtime.js')).toString();
33 |
34 | js = js.replace('*|IP_ADDRESS|*', `${_ip}:${HTTP_PORT}`);
35 |
36 | // load all files from scripts table
37 | let files = fs.readdirSync(SCRIPTS_DIR);
38 | let filesStr = '';
39 |
40 | for (const file of files) {
41 | filesStr += `'${file}',`;
42 | }
43 |
44 | js = js.replace('*|FILES|*', filesStr);
45 |
46 | html = html.replace('@@code@@', js);
47 |
48 | res.send(html);
49 | });
50 |
51 | app.get('/Scripts/:fileName', (req, res) => {
52 | try {
53 | let js = fs.readFileSync(path.join(SCRIPTS_DIR, req.params['fileName'])).toString();
54 | res.send(js);
55 | } catch (e) {
56 | res.send('//访问文件错误');
57 | }
58 | });
59 |
60 | app.get('/Publish/:fileName*', (req, res) => {
61 | try {
62 | let filePath = req.params['fileName'];
63 | for (const key in req.params) {
64 | if (Object.hasOwnProperty.call(req.params, key) && key != 'fileName') {
65 | filePath += req.params[key];
66 | }
67 | }
68 | console.warn(filePath);
69 |
70 | res.sendFile(path.join(PUBLISH_DIR, filePath));
71 | } catch (e) {
72 | res.send('//访问文件错误');
73 | }
74 | });
75 |
76 | app.get('/ping', (req, res) => {
77 | console.log('[-] ping..');
78 | setTimeout(() => {
79 | res.send('pong').end();
80 | }, 1000);
81 | });
82 |
83 | let FILE_DATE = null;
84 |
85 | app.get('/sync', (req, res) => {
86 | // console.log('[-] 等待同步到手机..')
87 | const {name} = req.query;
88 |
89 | const WIDGET_FILE = path.join(SCRIPTS_DIR, name + '.js');
90 | if (!fs.existsSync(WIDGET_FILE)) return res.send('nofile').end();
91 |
92 | setTimeout(() => {
93 | // 判断文件时间
94 | const _time = fs.statSync(WIDGET_FILE).mtimeMs;
95 | if (_time === FILE_DATE) {
96 | res.send('no').end();
97 | return;
98 | // return console.log("[!] 文件没有更改,不同步")
99 | }
100 | // 同步
101 | res.sendFile(WIDGET_FILE);
102 | console.log('[+] 同步到手机完毕');
103 | FILE_DATE = _time;
104 | }, 1000);
105 | });
106 |
107 | app.post('/sync', (req, res) => {
108 | if (req.files.length !== 1) return res.send('no');
109 | console.log('[+] Scriptalbe App 已连接');
110 | const _file = req.files[0];
111 | const FILE_NAME = _file['originalname'] + '.js';
112 | const WIDGET_FILE = path.join(SCRIPTS_DIR, FILE_NAME);
113 | fs.renameSync(_file['path'], WIDGET_FILE);
114 | res.send('ok');
115 | console.log(`[*] 小组件源码(${_file['originalname']})已同步,请打开编辑`);
116 | FILE_DATE = fs.statSync(WIDGET_FILE).mtimeMs;
117 | // 尝试打开
118 | let cmd = `code "${WIDGET_FILE}"`;
119 | if (os.platform() === 'win32') {
120 | cmd = `cmd.exe /c ${cmd}`;
121 | } else if (os.platform() === 'linux') {
122 | let shell = process.env['SHELL'];
123 | cmd = `${shell} -c ${cmd}`;
124 | } else {
125 | cmd = `"/Applications/Visual Studio Code.app/Contents/MacOS/Electron" "${WIDGET_FILE}"`;
126 | }
127 | child_process.execSync(cmd);
128 | });
129 |
130 | // 远程 console,调试中把调试输出内容传送到服务端控制台输出
131 | app.post('/console', (req, res) => {
132 | const {t, data} = req.body;
133 | const _time = new Date().toLocaleString().split(' ')[1];
134 | switch (t) {
135 | case 'warn':
136 | console.warn(`[console.warn / ${_time}]`, typeof data === 'string' ? data : '');
137 | if (typeof data === 'object') console.warn(data);
138 | break;
139 | case 'error':
140 | console.error(`[console.error / ${_time}]`, typeof data === 'string' ? data : '');
141 | if (typeof data === 'object') console.error(data);
142 | break;
143 | default:
144 | console.log(`[console.log / ${_time}]`, typeof data === 'string' ? data : '');
145 | if (typeof data === 'object') console.log(data);
146 | }
147 | res.send('ok');
148 | });
149 |
150 | // 获取当前电脑IP
151 | function getIPAdress() {
152 | var interfaces = os.networkInterfaces();
153 | for (var devName in interfaces) {
154 | var iface = interfaces[devName];
155 | for (var i = 0; i < iface.length; i++) {
156 | var alias = iface[i];
157 | if (alias.family === 'IPv4' && alias.address !== '127.0.0.1' && !alias.internal) {
158 | return alias.address;
159 | }
160 | }
161 | }
162 | }
163 |
164 | const _host = `http://${_ip}:${HTTP_PORT}`;
165 |
166 | console.log('[*] 「小件件」开发服务运行中');
167 | console.log(`[-] 地址:${_host}`);
168 | console.log(`[-] 如果你的手机还没有配置开发环境,请手机 Safari 访问上述地址,查看引导`);
169 | console.log(
170 | '[+] 如果你的手机已经安装好环境和小组件模板,请在 Scriptable 里点击小组件模板->远程开发,服务器地址输入:',
171 | _ip
172 | );
173 | console.log('[*] 更多帮助:https://github.com/im3x/scriptables');
174 | app.listen(HTTP_PORT);
175 |
--------------------------------------------------------------------------------
/Publish/about.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | BMW Linker - 关于
9 |
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
36 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
关于小组件
68 |
69 |
70 |
71 | BMW-Linker是开源免费的,由BMW车主兴趣开发,所有责任与BMW公司无关。
72 |
73 |
74 |
75 | BMW-Linker不会收集您的个人账户信息,所有账号信息将存在iCloud或者iPhone上但也请您妥善保管自己的账号。
76 |
77 |
78 |
79 | BMW-Linker会不定期推出新功能,如果BMW官方推出了小组件,BMW-Linker将会停止更新与支持。
80 |
81 |
82 |
83 | 感谢 Popo 提供 UI 设计,感谢胡总、吹雪和部分群友,提供思路帮助与测试。
84 |
85 |
86 |
87 | 感谢各路车友帮忙教学、推广、支持等。
88 |
89 |
90 |
91 |
点击这里赞助开发者
92 |
93 |
94 |
95 |
96 |
97 |
125 |
126 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
--------------------------------------------------------------------------------
/Publish/index.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | BMW Linker - 主页
9 |
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
60 |
61 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
71 |
72 |
73 |
74 |
75 |
76 |
77 |
78 |
79 |
80 |
81 |
82 |
83 |
84 |
85 |
86 |
BMW-Linker
小组件
87 |
让您最棒的BMW出现在iOS桌面
88 |
点击这里开始
89 |
90 |
91 |

92 |
93 |
94 |
95 |
96 |
97 |
98 |
99 |
100 |
101 |
102 |
103 |
104 |
实时同步
105 |
106 | 小组件会与您的My BMW同步,让您能更快捷地获取车辆信息
107 |
108 |
109 |
110 |
111 |
开源代码
112 |
小组件已将代码完全开源化,免费,无广告,无后门,更安全,更透明
113 |
114 |
115 |
116 |
自定义
117 |
小组件支持大量自定义,让您的小组件更具创造性
118 |
119 |
120 |
121 |
122 |
123 |
124 |
125 |
128 |
133 |
134 |
135 |
136 |
137 |
138 |
139 |
140 |
141 |
142 |
143 |
144 |
145 |
146 |
147 |
148 |
149 |
150 |
151 |
--------------------------------------------------------------------------------
/Publish/images/logo.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/Publish/installation.html:
--------------------------------------------------------------------------------
1 |
2 |
3 |
4 |
5 |
7 |
8 | BMW Linker - 小组件安装指导
9 |
10 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
19 |
20 |
21 |
22 |
23 |
24 |
25 |
26 |
27 |
28 |
29 |
30 |
31 |
32 |
33 |
34 |
35 |
60 |
61 |
62 |
63 |
64 |
65 |
66 |
67 |
68 |
69 |
70 |
BMW Linker
71 |
小组件安装指导
72 |
73 |
74 |
75 |
80 |
81 |
84 |
85 |
86 |
87 |
88 |
1. 下载安装 Scriptable App
89 |
90 |
104 |
105 |
106 |
107 |
2. 点击 复制代码
108 |
复制代码
109 |
110 |
111 |
112 |
113 |
114 |
3. 点击 打开Scriptable, 点击 ➕,粘贴至空白处,运行 ▶️
115 |
打开 Scriptable
118 |
119 |
120 |
121 |
122 |
4. 点击bmw-linker并根据提示完成设置
123 |

124 |
125 |
126 |
5. 在桌面添加小组件
127 |

128 |
129 |
130 |
131 |
132 |
133 |
134 |
135 |
136 |
137 |
138 |
「遇到问题可查看帮助文档」
139 |
140 |
141 |
142 |
143 |
144 |
149 |
150 |
151 |
152 |
153 |
154 |
155 |
156 |
157 |
158 |
159 |
160 |
161 |
162 |
163 |
164 |
165 |
166 |
167 |
168 |
207 |
263 |
264 |
--------------------------------------------------------------------------------
/Publish/plugins/fancybox/jquery.fancybox.min.css:
--------------------------------------------------------------------------------
1 | @charset "UTF-8";.fancybox-enabled{overflow:hidden}.fancybox-enabled body{overflow:visible;height:100%}.fancybox-is-hidden{position:absolute;top:-9999px;left:-9999px;visibility:hidden}.fancybox-container{position:fixed;top:0;left:0;width:100%;height:100%;z-index:99993;-webkit-tap-highlight-color:transparent;-webkit-backface-visibility:hidden;backface-visibility:hidden;-webkit-transform:translateZ(0);transform:translateZ(0)}.fancybox-container~.fancybox-container{z-index:99992}.fancybox-bg,.fancybox-inner,.fancybox-outer,.fancybox-stage{position:absolute;top:0;right:0;bottom:0;left:0}.fancybox-outer{overflow-y:auto;-webkit-overflow-scrolling:touch}.fancybox-bg{background:#1e1e1e;opacity:0;transition-duration:inherit;transition-property:opacity;transition-timing-function:cubic-bezier(.47,0,.74,.71)}.fancybox-is-open .fancybox-bg{opacity:.87;transition-timing-function:cubic-bezier(.22,.61,.36,1)}.fancybox-caption-wrap,.fancybox-infobar,.fancybox-toolbar{position:absolute;direction:ltr;z-index:99997;opacity:0;visibility:hidden;transition:opacity .25s,visibility 0s linear .25s;box-sizing:border-box}.fancybox-show-caption .fancybox-caption-wrap,.fancybox-show-infobar .fancybox-infobar,.fancybox-show-toolbar .fancybox-toolbar{opacity:1;visibility:visible;transition:opacity .25s,visibility 0s}.fancybox-infobar{top:0;left:50%;margin-left:-79px}.fancybox-infobar__body{display:inline-block;width:70px;line-height:44px;font-size:13px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;text-align:center;color:#ddd;background-color:rgba(30,30,30,.7);pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-touch-callout:none;-webkit-tap-highlight-color:transparent;-webkit-font-smoothing:subpixel-antialiased}.fancybox-toolbar{top:0;right:0}.fancybox-stage{overflow:hidden;direction:ltr;z-index:99994;-webkit-transform:translateZ(0)}.fancybox-slide{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;overflow:auto;outline:none;white-space:normal;box-sizing:border-box;text-align:center;z-index:99994;-webkit-overflow-scrolling:touch;display:none;-webkit-backface-visibility:hidden;backface-visibility:hidden;transition-property:opacity,-webkit-transform;transition-property:transform,opacity;transition-property:transform,opacity,-webkit-transform;-webkit-transform-style:preserve-3d;transform-style:preserve-3d}.fancybox-slide:before{content:"";display:inline-block;vertical-align:middle;height:100%;width:0}.fancybox-is-sliding .fancybox-slide,.fancybox-slide--current,.fancybox-slide--next,.fancybox-slide--previous{display:block}.fancybox-slide--image{overflow:visible}.fancybox-slide--image:before{display:none}.fancybox-slide--video .fancybox-content,.fancybox-slide--video iframe{background:#000}.fancybox-slide--map .fancybox-content,.fancybox-slide--map iframe{background:#e5e3df}.fancybox-slide--next{z-index:99995}.fancybox-slide>*{display:inline-block;position:relative;padding:24px;margin:44px 0;border-width:0;vertical-align:middle;text-align:left;background-color:#fff;overflow:auto;box-sizing:border-box}.fancybox-slide .fancybox-image-wrap{position:absolute;top:0;left:0;margin:0;padding:0;border:0;z-index:99995;background:transparent;cursor:default;overflow:visible;-webkit-transform-origin:top left;transform-origin:top left;background-size:100% 100%;background-repeat:no-repeat;-webkit-backface-visibility:hidden;backface-visibility:hidden}.fancybox-can-zoomOut .fancybox-image-wrap{cursor:zoom-out}.fancybox-can-zoomIn .fancybox-image-wrap{cursor:zoom-in}.fancybox-can-drag .fancybox-image-wrap{cursor:-webkit-grab;cursor:grab}.fancybox-is-dragging .fancybox-image-wrap{cursor:-webkit-grabbing;cursor:grabbing}.fancybox-image,.fancybox-spaceball{position:absolute;top:0;left:0;width:100%;height:100%;margin:0;padding:0;border:0;max-width:none;max-height:none}.fancybox-spaceball{z-index:1}.fancybox-slide--iframe .fancybox-content{padding:0;width:80%;height:80%;max-width:calc(100% - 100px);max-height:calc(100% - 88px);overflow:visible;background:#fff}.fancybox-iframe{display:block;padding:0;border:0;height:100%}.fancybox-error,.fancybox-iframe{margin:0;width:100%;background:#fff}.fancybox-error{padding:40px;max-width:380px;cursor:default}.fancybox-error p{margin:0;padding:0;color:#444;font:16px/20px Helvetica Neue,Helvetica,Arial,sans-serif}.fancybox-close-small{position:absolute;top:0;right:0;width:44px;height:44px;padding:0;margin:0;border:0;border-radius:0;outline:none;background:transparent;z-index:10;cursor:pointer}.fancybox-close-small:after{content:"×";position:absolute;top:5px;right:5px;width:30px;height:30px;font:20px/30px Arial,Helvetica Neue,Helvetica,sans-serif;color:#888;font-weight:300;text-align:center;border-radius:50%;border-width:0;background:#fff;transition:background .25s;box-sizing:border-box;z-index:2}.fancybox-close-small:focus:after{outline:1px dotted #888}.fancybox-close-small:hover:after{color:#555;background:#eee}.fancybox-slide--iframe .fancybox-close-small{top:0;right:-44px}.fancybox-slide--iframe .fancybox-close-small:after{background:transparent;font-size:35px;color:#aaa}.fancybox-slide--iframe .fancybox-close-small:hover:after{color:#fff}.fancybox-caption-wrap{bottom:0;left:0;right:0;padding:60px 30px 0;background:linear-gradient(180deg,transparent 0,rgba(0,0,0,.1) 20%,rgba(0,0,0,.2) 40%,rgba(0,0,0,.6) 80%,rgba(0,0,0,.8));pointer-events:none}.fancybox-caption{padding:30px 0;border-top:1px solid hsla(0,0%,100%,.4);font-size:14px;font-family:Helvetica Neue,Helvetica,Arial,sans-serif;color:#fff;line-height:20px;-webkit-text-size-adjust:none}.fancybox-caption a,.fancybox-caption button,.fancybox-caption select{pointer-events:all}.fancybox-caption a{color:#fff;text-decoration:underline}.fancybox-button{display:inline-block;position:relative;margin:0;padding:0;border:0;width:44px;height:44px;line-height:44px;text-align:center;background:transparent;color:#ddd;border-radius:0;cursor:pointer;vertical-align:top;outline:none}.fancybox-button[disabled]{cursor:default;pointer-events:none}.fancybox-button,.fancybox-infobar__body{background:rgba(30,30,30,.6)}.fancybox-button:hover:not([disabled]){color:#fff;background:rgba(0,0,0,.8)}.fancybox-button:after,.fancybox-button:before{content:"";pointer-events:none;position:absolute;background-color:currentColor;color:currentColor;opacity:.9;box-sizing:border-box;display:inline-block}.fancybox-button[disabled]:after,.fancybox-button[disabled]:before{opacity:.3}.fancybox-button--left:after,.fancybox-button--right:after{top:18px;width:6px;height:6px;background:transparent;border-top:2px solid currentColor;border-right:2px solid currentColor}.fancybox-button--left:after{left:20px;-webkit-transform:rotate(-135deg);transform:rotate(-135deg)}.fancybox-button--right:after{right:20px;-webkit-transform:rotate(45deg);transform:rotate(45deg)}.fancybox-button--left{border-bottom-left-radius:5px}.fancybox-button--right{border-bottom-right-radius:5px}.fancybox-button--close:after,.fancybox-button--close:before{content:"";display:inline-block;position:absolute;height:2px;width:16px;top:calc(50% - 1px);left:calc(50% - 8px)}.fancybox-button--close:before{-webkit-transform:rotate(45deg);transform:rotate(45deg)}.fancybox-button--close:after{-webkit-transform:rotate(-45deg);transform:rotate(-45deg)}.fancybox-arrow{position:absolute;top:50%;margin:-50px 0 0;height:100px;width:54px;padding:0;border:0;outline:none;background:none;cursor:pointer;z-index:99995;opacity:0;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;transition:opacity .25s}.fancybox-arrow:after{content:"";position:absolute;top:28px;width:44px;height:44px;background-color:rgba(30,30,30,.8);background-image:url(data:image/svg+xml;base64,PHN2ZyBmaWxsPSIjRkZGRkZGIiBoZWlnaHQ9IjQ4IiB2aWV3Qm94PSIwIDAgMjQgMjQiIHdpZHRoPSI0OCIgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIj4gICAgPHBhdGggZD0iTTAgMGgyNHYyNEgweiIgZmlsbD0ibm9uZSIvPiAgICA8cGF0aCBkPSJNMTIgNGwtMS40MSAxLjQxTDE2LjE3IDExSDR2MmgxMi4xN2wtNS41OCA1LjU5TDEyIDIwbDgtOHoiLz48L3N2Zz4=);background-repeat:no-repeat;background-position:50%;background-size:24px 24px}.fancybox-arrow--right{right:0}.fancybox-arrow--left{left:0;-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fancybox-arrow--left:after,.fancybox-arrow--right:after{left:0}.fancybox-show-nav .fancybox-arrow{opacity:.6}.fancybox-show-nav .fancybox-arrow[disabled]{opacity:.3}.fancybox-loading{border:6px solid hsla(0,0%,39%,.4);border-top:6px solid hsla(0,0%,100%,.6);border-radius:100%;height:50px;width:50px;-webkit-animation:a .8s infinite linear;animation:a .8s infinite linear;background:transparent;position:absolute;top:50%;left:50%;margin-top:-25px;margin-left:-25px;z-index:99999}@-webkit-keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes a{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fancybox-animated{transition-timing-function:cubic-bezier(0,0,.25,1)}.fancybox-fx-slide.fancybox-slide--previous{-webkit-transform:translate3d(-100%,0,0);transform:translate3d(-100%,0,0);opacity:0}.fancybox-fx-slide.fancybox-slide--next{-webkit-transform:translate3d(100%,0,0);transform:translate3d(100%,0,0);opacity:0}.fancybox-fx-slide.fancybox-slide--current{-webkit-transform:translateZ(0);transform:translateZ(0);opacity:1}.fancybox-fx-fade.fancybox-slide--next,.fancybox-fx-fade.fancybox-slide--previous{opacity:0;transition-timing-function:cubic-bezier(.19,1,.22,1)}.fancybox-fx-fade.fancybox-slide--current{opacity:1}.fancybox-fx-zoom-in-out.fancybox-slide--previous{-webkit-transform:scale3d(1.5,1.5,1.5);transform:scale3d(1.5,1.5,1.5);opacity:0}.fancybox-fx-zoom-in-out.fancybox-slide--next{-webkit-transform:scale3d(.5,.5,.5);transform:scale3d(.5,.5,.5);opacity:0}.fancybox-fx-zoom-in-out.fancybox-slide--current{-webkit-transform:scaleX(1);transform:scaleX(1);opacity:1}.fancybox-fx-rotate.fancybox-slide--previous{-webkit-transform:rotate(-1turn);transform:rotate(-1turn);opacity:0}.fancybox-fx-rotate.fancybox-slide--next{-webkit-transform:rotate(1turn);transform:rotate(1turn);opacity:0}.fancybox-fx-rotate.fancybox-slide--current{-webkit-transform:rotate(0deg);transform:rotate(0deg);opacity:1}.fancybox-fx-circular.fancybox-slide--previous{-webkit-transform:scale3d(0,0,0) translate3d(-100%,0,0);transform:scale3d(0,0,0) translate3d(-100%,0,0);opacity:0}.fancybox-fx-circular.fancybox-slide--next{-webkit-transform:scale3d(0,0,0) translate3d(100%,0,0);transform:scale3d(0,0,0) translate3d(100%,0,0);opacity:0}.fancybox-fx-circular.fancybox-slide--current{-webkit-transform:scaleX(1) translateZ(0);transform:scaleX(1) translateZ(0);opacity:1}.fancybox-fx-tube.fancybox-slide--previous{-webkit-transform:translate3d(-100%,0,0) scale(.1) skew(-10deg);transform:translate3d(-100%,0,0) scale(.1) skew(-10deg)}.fancybox-fx-tube.fancybox-slide--next{-webkit-transform:translate3d(100%,0,0) scale(.1) skew(10deg);transform:translate3d(100%,0,0) scale(.1) skew(10deg)}.fancybox-fx-tube.fancybox-slide--current{-webkit-transform:translateZ(0) scale(1);transform:translateZ(0) scale(1)}@media (max-width:800px){.fancybox-infobar{left:0;margin-left:0}.fancybox-button--left,.fancybox-button--right{display:none!important}.fancybox-caption{padding:20px 0;margin:0}}.fancybox-button--fullscreen:before{width:15px;height:11px;left:calc(50% - 7px);top:calc(50% - 6px);border:2px solid;background:none}.fancybox-button--pause:before,.fancybox-button--play:before{top:calc(50% - 6px);left:calc(50% - 4px);background:transparent}.fancybox-button--play:before{width:0;height:0;border-top:6px inset transparent;border-bottom:6px inset transparent;border-left:10px solid;border-radius:1px}.fancybox-button--pause:before{width:7px;height:11px;border-style:solid;border-width:0 2px}.fancybox-button--thumbs,.fancybox-thumbs{display:none}@media (min-width:800px){.fancybox-button--thumbs{display:inline-block}.fancybox-button--thumbs span{font-size:23px}.fancybox-button--thumbs:before{width:3px;height:3px;top:calc(50% - 2px);left:calc(50% - 2px);box-shadow:0 -4px 0,-4px -4px 0,4px -4px 0,inset 0 0 0 32px,-4px 0 0,4px 0 0,0 4px 0,-4px 4px 0,4px 4px 0}.fancybox-thumbs{position:absolute;top:0;right:0;bottom:0;left:auto;width:220px;margin:0;padding:5px 5px 0 0;background:#fff;word-break:normal;-webkit-tap-highlight-color:transparent;-webkit-overflow-scrolling:touch;-ms-overflow-style:-ms-autohiding-scrollbar;box-sizing:border-box;z-index:99995}.fancybox-show-thumbs .fancybox-thumbs{display:block}.fancybox-show-thumbs .fancybox-inner{right:220px}.fancybox-thumbs>ul{list-style:none;position:absolute;position:relative;width:100%;height:100%;margin:0;padding:0;overflow-x:hidden;overflow-y:auto;font-size:0}.fancybox-thumbs>ul>li{float:left;overflow:hidden;max-width:50%;padding:0;margin:0;width:105px;height:75px;position:relative;cursor:pointer;outline:none;border:5px solid transparent;border-top-width:0;border-right-width:0;-webkit-tap-highlight-color:transparent;-webkit-backface-visibility:hidden;backface-visibility:hidden;box-sizing:border-box}li.fancybox-thumbs-loading{background:rgba(0,0,0,.1)}.fancybox-thumbs>ul>li>img{position:absolute;top:0;left:0;min-width:100%;min-height:100%;max-width:none;max-height:none;-webkit-touch-callout:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.fancybox-thumbs>ul>li:before{content:"";position:absolute;top:0;right:0;bottom:0;left:0;border-radius:2px;border:4px solid #4ea7f9;z-index:99991;opacity:0;transition:all .2s cubic-bezier(.25,.46,.45,.94)}.fancybox-thumbs>ul>li.fancybox-thumbs-active:before{opacity:1}}
--------------------------------------------------------------------------------
/Publish/plugins/slick/README.markdown:
--------------------------------------------------------------------------------
1 | slick
2 | -------
3 |
4 | [1]:
5 |
6 | _the last carousel you'll ever need_
7 |
8 | #### Demo
9 |
10 | [http://kenwheeler.github.io/slick](http://kenwheeler.github.io/slick/)
11 |
12 | #### CDN
13 |
14 | To start working with Slick right away, there's a couple of CDN choices availabile
15 | to serve the files as close, and fast as possible to your users:
16 |
17 | - https://cdnjs.com/libraries/slick-carousel
18 | - https://www.jsdelivr.com/projects/jquery.slick
19 |
20 | ##### Example using jsDelivr
21 |
22 | Just add a link to the css file in your ``:
23 |
24 | ```html
25 |
26 |
27 |
28 |
29 | ```
30 |
31 | Then, before your closing `````` tag add:
32 |
33 | ```html
34 |
35 | ```
36 |
37 | #### Package Managers
38 |
39 | ```sh
40 | # Bower
41 | bower install --save slick-carousel
42 |
43 | # NPM
44 | npm install slick-carousel
45 | ```
46 |
47 | #### Contributing
48 |
49 | PLEASE review CONTRIBUTING.markdown prior to requesting a feature, filing a pull request or filing an issue.
50 |
51 | ### Data Attribute Settings
52 |
53 | In slick 1.5 you can now add settings using the data-slick attribute. You still need to call $(element).slick() to initialize slick on the element.
54 |
55 | Example:
56 |
57 | ```html
58 |
59 |
1
60 |
2
61 |
3
62 |
4
63 |
5
64 |
6
65 |
66 | ```
67 |
68 | ### Settings
69 |
70 | Option | Type | Default | Description
71 | ------ | ---- | ------- | -----------
72 | accessibility | boolean | true | Enables tabbing and arrow key navigation. Unless `autoplay: true`, sets browser focus to current slide (or first of current slide set, if multiple `slidesToShow`) after slide change. For full a11y compliance enable focusOnChange in addition to this.
73 | adaptiveHeight | boolean | false | Adapts slider height to the current slide
74 | appendArrows | string | $(element) | Change where the navigation arrows are attached (Selector, htmlString, Array, Element, jQuery object)
75 | appendDots | string | $(element) | Change where the navigation dots are attached (Selector, htmlString, Array, Element, jQuery object)
76 | arrows | boolean | true | Enable Next/Prev arrows
77 | asNavFor | string | $(element) | Enables syncing of multiple sliders
78 | autoplay | boolean | false | Enables auto play of slides
79 | autoplaySpeed | int | 3000 | Auto play change interval
80 | centerMode | boolean | false | Enables centered view with partial prev/next slides. Use with odd numbered slidesToShow counts.
81 | centerPadding | string | '50px' | Side padding when in center mode. (px or %)
82 | cssEase | string | 'ease' | CSS3 easing
83 | customPaging | function | n/a | Custom paging templates. See source for use example.
84 | dots | boolean | false | Current slide indicator dots
85 | dotsClass | string | 'slick-dots' | Class for slide indicator dots container
86 | draggable | boolean | true | Enables desktop dragging
87 | easing | string | 'linear' | animate() fallback easing
88 | edgeFriction | integer | 0.15 | Resistance when swiping edges of non-infinite carousels
89 | fade | boolean | false | Enables fade
90 | focusOnSelect | boolean | false | Enable focus on selected element (click)
91 | focusOnChange | boolean | false | Puts focus on slide after change
92 | infinite | boolean | true | Infinite looping
93 | initialSlide | integer | 0 | Slide to start on
94 | lazyLoad | string | 'ondemand' | Accepts 'ondemand' or 'progressive' for lazy load technique. 'ondemand' will load the image as soon as you slide to it, 'progressive' loads one image after the other when the page loads.
95 | mobileFirst | boolean | false | Responsive settings use mobile first calculation
96 | nextArrow | string (html \| jQuery selector) \| object (DOM node \| jQuery object) | `` | Allows you to select a node or customize the HTML for the "Next" arrow.
97 | pauseOnDotsHover | boolean | false | Pauses autoplay when a dot is hovered
98 | pauseOnFocus | boolean | true | Pauses autoplay when slider is focussed
99 | pauseOnHover | boolean | true | Pauses autoplay on hover
100 | prevArrow | string (html \| jQuery selector) \| object (DOM node \| jQuery object) | `` | Allows you to select a node or customize the HTML for the "Previous" arrow.
101 | respondTo | string | 'window' | Width that responsive object responds to. Can be 'window', 'slider' or 'min' (the smaller of the two).
102 | responsive | array | null | Array of objects [containing breakpoints and settings objects (see example)](#responsive-option-example). Enables settings at given `breakpoint`. Set `settings` to "unslick" instead of an object to disable slick at a given breakpoint.
103 | rows | int | 1 | Setting this to more than 1 initializes grid mode. Use slidesPerRow to set how many slides should be in each row.
104 | rtl | boolean | false | Change the slider's direction to become right-to-left
105 | slide | string | '' | Slide element query
106 | slidesPerRow | int | 1 | With grid mode initialized via the rows option, this sets how many slides are in each grid row.
107 | slidesToScroll | int | 1 | # of slides to scroll at a time
108 | slidesToShow | int | 1 | # of slides to show at a time
109 | speed | int | 300 | Transition speed
110 | swipe | boolean | true | Enables touch swipe
111 | swipeToSlide | boolean | false | Swipe to slide irrespective of slidesToScroll
112 | touchMove | boolean | true | Enables slide moving with touch
113 | touchThreshold | int | 5 | To advance slides, the user must swipe a length of (1/touchThreshold) * the width of the slider.
114 | useCSS | boolean | true | Enable/Disable CSS Transitions
115 | useTransform | boolean | true | Enable/Disable CSS Transforms
116 | variableWidth | boolean | false | Disables automatic slide width calculation
117 | vertical | boolean | false | Vertical slide direction
118 | verticalSwiping | boolean | false | Changes swipe direction to vertical
119 | waitForAnimate | boolean | true | Ignores requests to advance the slide while animating
120 | zIndex | number | 1000 | Set the zIndex values for slides, useful for IE9 and lower
121 |
122 | ##### Responsive Option Example
123 | The responsive option, and value, is quite unique and powerful.
124 | You can use it like so:
125 |
126 | ```javascript
127 | $(".slider").slick({
128 |
129 | // normal options...
130 | infinite: false,
131 |
132 | // the magic
133 | responsive: [{
134 |
135 | breakpoint: 1024,
136 | settings: {
137 | slidesToShow: 3,
138 | infinite: true
139 | }
140 |
141 | }, {
142 |
143 | breakpoint: 600,
144 | settings: {
145 | slidesToShow: 2,
146 | dots: true
147 | }
148 |
149 | }, {
150 |
151 | breakpoint: 300,
152 | settings: "unslick" // destroys slick
153 |
154 | }]
155 | });
156 | ```
157 |
158 |
159 |
160 |
161 | ### Events
162 |
163 | In slick 1.4, callback methods were deprecated and replaced with events. Use them before the initialization of slick as shown below:
164 |
165 | ```javascript
166 | // On swipe event
167 | $('.your-element').on('swipe', function(event, slick, direction){
168 | console.log(direction);
169 | // left
170 | });
171 |
172 | // On edge hit
173 | $('.your-element').on('edge', function(event, slick, direction){
174 | console.log('edge was hit')
175 | });
176 |
177 | // On before slide change
178 | $('.your-element').on('beforeChange', function(event, slick, currentSlide, nextSlide){
179 | console.log(nextSlide);
180 | });
181 | ```
182 |
183 | Event | Params | Description
184 | ------ | -------- | -----------
185 | afterChange | event, slick, currentSlide | After slide change callback
186 | beforeChange | event, slick, currentSlide, nextSlide | Before slide change callback
187 | breakpoint | event, slick, breakpoint | Fires after a breakpoint is hit
188 | destroy | event, slick | When slider is destroyed, or unslicked.
189 | edge | event, slick, direction | Fires when an edge is overscrolled in non-infinite mode.
190 | init | event, slick | When Slick initializes for the first time callback. Note that this event should be defined before initializing the slider.
191 | reInit | event, slick | Every time Slick (re-)initializes callback
192 | setPosition | event, slick | Every time Slick recalculates position
193 | swipe | event, slick, direction | Fires after swipe/drag
194 | lazyLoaded | event, slick, image, imageSource | Fires after image loads lazily
195 | lazyLoadError | event, slick, image, imageSource | Fires after image fails to load
196 |
197 |
198 | #### Methods
199 |
200 | Methods are called on slick instances through the slick method itself in version 1.4, see below:
201 |
202 | ```javascript
203 | // Add a slide
204 | $('.your-element').slick('slickAdd',"");
205 |
206 | // Get the current slide
207 | var currentSlide = $('.your-element').slick('slickCurrentSlide');
208 | ```
209 |
210 | This new syntax allows you to call any internal slick method as well:
211 |
212 | ```javascript
213 | // Manually refresh positioning of slick
214 | $('.your-element').slick('setPosition');
215 | ```
216 |
217 |
218 | Method | Argument | Description
219 | ------ | -------- | -----------
220 | `slick` | options : object | Initializes Slick
221 | `unslick` | | Destroys Slick
222 | `slickNext` | | Triggers next slide
223 | `slickPrev` | | Triggers previous slide
224 | `slickPause` | | Pause Autoplay
225 | `slickPlay` | | Start Autoplay (_will also set `autoplay` option to `true`_)
226 | `slickGoTo` | index : int, dontAnimate : bool | Goes to slide by index, skipping animation if second parameter is set to true
227 | `slickCurrentSlide` | | Returns the current slide index
228 | `slickAdd` | element : html or DOM object, index: int, addBefore: bool | Add a slide. If an index is provided, will add at that index, or before if addBefore is set. If no index is provided, add to the end or to the beginning if addBefore is set. Accepts HTML String || Object
229 | `slickRemove` | index: int, removeBefore: bool | Remove slide by index. If removeBefore is set true, remove slide preceding index, or the first slide if no index is specified. If removeBefore is set to false, remove the slide following index, or the last slide if no index is set.
230 | `slickFilter` | filter : selector or function | Filters slides using jQuery .filter syntax
231 | `slickUnfilter` | | Removes applied filter
232 | `slickGetOption` | option : string(option name) | Gets an option value.
233 | `slickSetOption` | change an option, `refresh` is always `boolean` and will update UI changes...
234 | | `option, value, refresh` | change a [single `option`](https://github.com/kenwheeler/slick#settings) to given `value`; `refresh` is optional.
235 | | `"responsive", [{ breakpoint: n, settings: {} }, ... ], refresh` | change or add [whole sets of responsive options](#responsive-option-example)
236 | | `{ option: value, option: value, ... }, refresh` | change [multiple `option`s](https://github.com/kenwheeler/slick#settings) to corresponding `value`s.
237 |
238 |
239 | #### Example
240 |
241 | Initialize with:
242 |
243 | ```javascript
244 | $(element).slick({
245 | dots: true,
246 | speed: 500
247 | });
248 | ```
249 |
250 | Change the speed with:
251 |
252 | ```javascript
253 | $(element).slick('slickSetOption', 'speed', 5000, true);
254 | ```
255 |
256 | Destroy with:
257 |
258 | ```javascript
259 | $(element).slick('unslick');
260 | ```
261 |
262 |
263 | #### Sass Variables
264 |
265 | Variable | Type | Default | Description
266 | ------ | ---- | ------- | -----------
267 | $slick-font-path | string | "./fonts/" | Directory path for the slick icon font
268 | $slick-font-family | string | "slick" | Font-family for slick icon font
269 | $slick-loader-path | string | "./" | Directory path for the loader image
270 | $slick-arrow-color | color | white | Color of the left/right arrow icons
271 | $slick-dot-color | color | black | Color of the navigation dots
272 | $slick-dot-color-active | color | $slick-dot-color | Color of the active navigation dot
273 | $slick-prev-character | string | '\2190' | Unicode character code for the previous arrow icon
274 | $slick-next-character | string | '\2192' | Unicode character code for the next arrow icon
275 | $slick-dot-character | string | '\2022' | Unicode character code for the navigation dot icon
276 | $slick-dot-size | pixels | 6px | Size of the navigation dots
277 |
278 | #### Browser support
279 |
280 | Slick works on IE8+ in addition to other modern browsers such as Chrome, Firefox, and Safari.
281 |
282 | #### Dependencies
283 |
284 | jQuery 1.7
285 |
286 | #### License
287 |
288 | Copyright (c) 2017 Ken Wheeler
289 |
290 | Licensed under the MIT license.
291 |
292 | Free as in Bacon.
293 |
--------------------------------------------------------------------------------
/Publish/plugins/aos/aos.js:
--------------------------------------------------------------------------------
1 | !function(e,t){"object"==typeof exports&&"object"==typeof module?module.exports=t():"function"==typeof define&&define.amd?define([],t):"object"==typeof exports?exports.AOS=t():e.AOS=t()}(this,function(){return function(e){function t(o){if(n[o])return n[o].exports;var i=n[o]={exports:{},id:o,loaded:!1};return e[o].call(i.exports,i,i.exports,t),i.loaded=!0,i.exports}var n={};return t.m=e,t.c=n,t.p="dist/",t(0)}([function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}var i=Object.assign||function(e){for(var t=1;t0&&void 0!==arguments[0]&&arguments[0];if(e&&(k=!0),k)return w=(0,y.default)(w,j),(0,b.default)(w,j.once),w},_=function(){w=(0,h.default)(),O()},S=function(){w.forEach(function(e,t){e.node.removeAttribute("data-aos"),e.node.removeAttribute("data-aos-easing"),e.node.removeAttribute("data-aos-duration"),e.node.removeAttribute("data-aos-delay")})},z=function(e){return e===!0||"mobile"===e&&p.default.mobile()||"phone"===e&&p.default.phone()||"tablet"===e&&p.default.tablet()||"function"==typeof e&&e()===!0},A=function(e){return j=i(j,e),w=(0,h.default)(),z(j.disable)||x?S():(document.querySelector("body").setAttribute("data-aos-easing",j.easing),document.querySelector("body").setAttribute("data-aos-duration",j.duration),document.querySelector("body").setAttribute("data-aos-delay",j.delay),"DOMContentLoaded"===j.startEvent&&["complete","interactive"].indexOf(document.readyState)>-1?O(!0):"load"===j.startEvent?window.addEventListener(j.startEvent,function(){O(!0)}):document.addEventListener(j.startEvent,function(){O(!0)}),window.addEventListener("resize",(0,f.default)(O,j.debounceDelay,!0)),window.addEventListener("orientationchange",(0,f.default)(O,j.debounceDelay,!0)),window.addEventListener("scroll",(0,u.default)(function(){(0,b.default)(w,j.once)},j.throttleDelay)),j.disableMutationObserver||(0,d.default)("[data-aos]",_),w)};e.exports={init:A,refresh:O,refreshHard:_}},function(e,t){},,,,,function(e,t){(function(t){"use strict";function n(e,t,n){function o(t){var n=b,o=v;return b=v=void 0,k=t,g=e.apply(o,n)}function r(e){return k=e,h=setTimeout(s,t),_?o(e):g}function a(e){var n=e-w,o=e-k,i=t-n;return S?j(i,y-o):i}function c(e){var n=e-w,o=e-k;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=O();return c(e)?d(e):void(h=setTimeout(s,a(e)))}function d(e){return h=void 0,z&&b?o(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),k=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(O())}function m(){var e=O(),n=c(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),o(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,k=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(f);return t=u(t)||0,i(n)&&(_=!!n.leading,S="maxWait"in n,y=S?x(u(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e,t,o){var r=!0,a=!0;if("function"!=typeof e)throw new TypeError(f);return i(o)&&(r="leading"in o?!!o.leading:r,a="trailing"in o?!!o.trailing:a),n(e,t,{leading:r,maxWait:t,trailing:a})}function i(e){var t="undefined"==typeof e?"undefined":c(e);return!!e&&("object"==t||"function"==t)}function r(e){return!!e&&"object"==("undefined"==typeof e?"undefined":c(e))}function a(e){return"symbol"==("undefined"==typeof e?"undefined":c(e))||r(e)&&k.call(e)==d}function u(e){if("number"==typeof e)return e;if(a(e))return s;if(i(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=i(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(l,"");var n=m.test(e);return n||b.test(e)?v(e.slice(2),n?2:8):p.test(e)?s:+e}var c="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},f="Expected a function",s=NaN,d="[object Symbol]",l=/^\s+|\s+$/g,p=/^[-+]0x[0-9a-f]+$/i,m=/^0b[01]+$/i,b=/^0o[0-7]+$/i,v=parseInt,y="object"==("undefined"==typeof t?"undefined":c(t))&&t&&t.Object===Object&&t,g="object"==("undefined"==typeof self?"undefined":c(self))&&self&&self.Object===Object&&self,h=y||g||Function("return this")(),w=Object.prototype,k=w.toString,x=Math.max,j=Math.min,O=function(){return h.Date.now()};e.exports=o}).call(t,function(){return this}())},function(e,t){(function(t){"use strict";function n(e,t,n){function i(t){var n=b,o=v;return b=v=void 0,O=t,g=e.apply(o,n)}function r(e){return O=e,h=setTimeout(s,t),_?i(e):g}function u(e){var n=e-w,o=e-O,i=t-n;return S?x(i,y-o):i}function f(e){var n=e-w,o=e-O;return void 0===w||n>=t||n<0||S&&o>=y}function s(){var e=j();return f(e)?d(e):void(h=setTimeout(s,u(e)))}function d(e){return h=void 0,z&&b?i(e):(b=v=void 0,g)}function l(){void 0!==h&&clearTimeout(h),O=0,b=w=v=h=void 0}function p(){return void 0===h?g:d(j())}function m(){var e=j(),n=f(e);if(b=arguments,v=this,w=e,n){if(void 0===h)return r(w);if(S)return h=setTimeout(s,t),i(w)}return void 0===h&&(h=setTimeout(s,t)),g}var b,v,y,g,h,w,O=0,_=!1,S=!1,z=!0;if("function"!=typeof e)throw new TypeError(c);return t=a(t)||0,o(n)&&(_=!!n.leading,S="maxWait"in n,y=S?k(a(n.maxWait)||0,t):y,z="trailing"in n?!!n.trailing:z),m.cancel=l,m.flush=p,m}function o(e){var t="undefined"==typeof e?"undefined":u(e);return!!e&&("object"==t||"function"==t)}function i(e){return!!e&&"object"==("undefined"==typeof e?"undefined":u(e))}function r(e){return"symbol"==("undefined"==typeof e?"undefined":u(e))||i(e)&&w.call(e)==s}function a(e){if("number"==typeof e)return e;if(r(e))return f;if(o(e)){var t="function"==typeof e.valueOf?e.valueOf():e;e=o(t)?t+"":t}if("string"!=typeof e)return 0===e?e:+e;e=e.replace(d,"");var n=p.test(e);return n||m.test(e)?b(e.slice(2),n?2:8):l.test(e)?f:+e}var u="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(e){return typeof e}:function(e){return e&&"function"==typeof Symbol&&e.constructor===Symbol&&e!==Symbol.prototype?"symbol":typeof e},c="Expected a function",f=NaN,s="[object Symbol]",d=/^\s+|\s+$/g,l=/^[-+]0x[0-9a-f]+$/i,p=/^0b[01]+$/i,m=/^0o[0-7]+$/i,b=parseInt,v="object"==("undefined"==typeof t?"undefined":u(t))&&t&&t.Object===Object&&t,y="object"==("undefined"==typeof self?"undefined":u(self))&&self&&self.Object===Object&&self,g=v||y||Function("return this")(),h=Object.prototype,w=h.toString,k=Math.max,x=Math.min,j=function(){return g.Date.now()};e.exports=n}).call(t,function(){return this}())},function(e,t){"use strict";function n(e,t){var n=new r(o);a=t,n.observe(i.documentElement,{childList:!0,subtree:!0,removedNodes:!0})}function o(e){e&&e.forEach(function(e){var t=Array.prototype.slice.call(e.addedNodes),n=Array.prototype.slice.call(e.removedNodes),o=t.concat(n).filter(function(e){return e.hasAttribute&&e.hasAttribute("data-aos")}).length;o&&a()})}Object.defineProperty(t,"__esModule",{value:!0});var i=window.document,r=window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver,a=function(){};t.default=n},function(e,t){"use strict";function n(e,t){if(!(e instanceof t))throw new TypeError("Cannot call a class as a function")}function o(){return navigator.userAgent||navigator.vendor||window.opera||""}Object.defineProperty(t,"__esModule",{value:!0});var i=function(){function e(e,t){for(var n=0;ne.position?e.node.classList.add("aos-animate"):"undefined"!=typeof o&&("false"===o||!n&&"true"!==o)&&e.node.classList.remove("aos-animate")},o=function(e,t){var o=window.pageYOffset,i=window.innerHeight;e.forEach(function(e,r){n(e,i+o,t)})};t.default=o},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(12),r=o(i),a=function(e,t){return e.forEach(function(e,n){e.node.classList.add("aos-init"),e.position=(0,r.default)(e.node,t.offset)}),e};t.default=a},function(e,t,n){"use strict";function o(e){return e&&e.__esModule?e:{default:e}}Object.defineProperty(t,"__esModule",{value:!0});var i=n(13),r=o(i),a=function(e,t){var n=0,o=0,i=window.innerHeight,a={offset:e.getAttribute("data-aos-offset"),anchor:e.getAttribute("data-aos-anchor"),anchorPlacement:e.getAttribute("data-aos-anchor-placement")};switch(a.offset&&!isNaN(a.offset)&&(o=parseInt(a.offset)),a.anchor&&document.querySelectorAll(a.anchor)&&(e=document.querySelectorAll(a.anchor)[0]),n=(0,r.default)(e).top,a.anchorPlacement){case"top-bottom":break;case"center-bottom":n+=e.offsetHeight/2;break;case"bottom-bottom":n+=e.offsetHeight;break;case"top-center":n+=i/2;break;case"bottom-center":n+=i/2+e.offsetHeight;break;case"center-center":n+=i/2+e.offsetHeight/2;break;case"top-top":n+=i;break;case"bottom-top":n+=e.offsetHeight+i;break;case"center-top":n+=e.offsetHeight/2+i}return a.anchorPlacement||a.offset||isNaN(t)||(o=t),n+o};t.default=a},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){for(var t=0,n=0;e&&!isNaN(e.offsetLeft)&&!isNaN(e.offsetTop);)t+=e.offsetLeft-("BODY"!=e.tagName?e.scrollLeft:0),n+=e.offsetTop-("BODY"!=e.tagName?e.scrollTop:0),e=e.offsetParent;return{top:n,left:t}};t.default=n},function(e,t){"use strict";Object.defineProperty(t,"__esModule",{value:!0});var n=function(e){return e=e||document.querySelectorAll("[data-aos]"),Array.prototype.map.call(e,function(e){return{node:e}})};t.default=n}])});
--------------------------------------------------------------------------------
/Publish/plugins/themify-icons/themify-icons.css:
--------------------------------------------------------------------------------
1 | @font-face {
2 | font-family: 'themify';
3 | src: url('fonts/themify.eot?-fvbane');
4 | src: url('fonts/themify.eot?#iefix-fvbane') format('embedded-opentype'),
5 | url('fonts/themify.woff?-fvbane') format('woff'),
6 | url('fonts/themify.ttf?-fvbane') format('truetype'),
7 | url('fonts/themify.svg?-fvbane#themify') format('svg');
8 | font-weight: normal;
9 | font-style: normal;
10 | }
11 |
12 | [class^="ti-"],
13 | [class*=" ti-"] {
14 | font-family: 'themify';
15 | speak: none;
16 | font-style: normal;
17 | font-weight: normal;
18 | font-variant: normal;
19 | text-transform: none;
20 | line-height: 1;
21 |
22 | /* Better Font Rendering =========== */
23 | -webkit-font-smoothing: antialiased;
24 | -moz-osx-font-smoothing: grayscale;
25 | }
26 |
27 | .ti-wand:before {
28 | content: "\e600";
29 | }
30 |
31 | .ti-volume:before {
32 | content: "\e601";
33 | }
34 |
35 | .ti-user:before {
36 | content: "\e602";
37 | }
38 |
39 | .ti-unlock:before {
40 | content: "\e603";
41 | }
42 |
43 | .ti-unlink:before {
44 | content: "\e604";
45 | }
46 |
47 | .ti-trash:before {
48 | content: "\e605";
49 | }
50 |
51 | .ti-thought:before {
52 | content: "\e606";
53 | }
54 |
55 | .ti-target:before {
56 | content: "\e607";
57 | }
58 |
59 | .ti-tag:before {
60 | content: "\e608";
61 | }
62 |
63 | .ti-tablet:before {
64 | content: "\e609";
65 | }
66 |
67 | .ti-star:before {
68 | content: "\e60a";
69 | }
70 |
71 | .ti-spray:before {
72 | content: "\e60b";
73 | }
74 |
75 | .ti-signal:before {
76 | content: "\e60c";
77 | }
78 |
79 | .ti-shopping-cart:before {
80 | content: "\e60d";
81 | }
82 |
83 | .ti-shopping-cart-full:before {
84 | content: "\e60e";
85 | }
86 |
87 | .ti-settings:before {
88 | content: "\e60f";
89 | }
90 |
91 | .ti-search:before {
92 | content: "\e610";
93 | }
94 |
95 | .ti-zoom-in:before {
96 | content: "\e611";
97 | }
98 |
99 | .ti-zoom-out:before {
100 | content: "\e612";
101 | }
102 |
103 | .ti-cut:before {
104 | content: "\e613";
105 | }
106 |
107 | .ti-ruler:before {
108 | content: "\e614";
109 | }
110 |
111 | .ti-ruler-pencil:before {
112 | content: "\e615";
113 | }
114 |
115 | .ti-ruler-alt:before {
116 | content: "\e616";
117 | }
118 |
119 | .ti-bookmark:before {
120 | content: "\e617";
121 | }
122 |
123 | .ti-bookmark-alt:before {
124 | content: "\e618";
125 | }
126 |
127 | .ti-reload:before {
128 | content: "\e619";
129 | }
130 |
131 | .ti-plus:before {
132 | content: "\e61a";
133 | }
134 |
135 | .ti-pin:before {
136 | content: "\e61b";
137 | }
138 |
139 | .ti-pencil:before {
140 | content: "\e61c";
141 | }
142 |
143 | .ti-pencil-alt:before {
144 | content: "\e61d";
145 | }
146 |
147 | .ti-paint-roller:before {
148 | content: "\e61e";
149 | }
150 |
151 | .ti-paint-bucket:before {
152 | content: "\e61f";
153 | }
154 |
155 | .ti-na:before {
156 | content: "\e620";
157 | }
158 |
159 | .ti-mobile:before {
160 | content: "\e621";
161 | }
162 |
163 | .ti-minus:before {
164 | content: "\e622";
165 | }
166 |
167 | .ti-medall:before {
168 | content: "\e623";
169 | }
170 |
171 | .ti-medall-alt:before {
172 | content: "\e624";
173 | }
174 |
175 | .ti-marker:before {
176 | content: "\e625";
177 | }
178 |
179 | .ti-marker-alt:before {
180 | content: "\e626";
181 | }
182 |
183 | .ti-arrow-up:before {
184 | content: "\e627";
185 | }
186 |
187 | .ti-arrow-right:before {
188 | content: "\e628";
189 | }
190 |
191 | .ti-arrow-left:before {
192 | content: "\e629";
193 | }
194 |
195 | .ti-arrow-down:before {
196 | content: "\e62a";
197 | }
198 |
199 | .ti-lock:before {
200 | content: "\e62b";
201 | }
202 |
203 | .ti-location-arrow:before {
204 | content: "\e62c";
205 | }
206 |
207 | .ti-link:before {
208 | content: "\e62d";
209 | }
210 |
211 | .ti-layout:before {
212 | content: "\e62e";
213 | }
214 |
215 | .ti-layers:before {
216 | content: "\e62f";
217 | }
218 |
219 | .ti-layers-alt:before {
220 | content: "\e630";
221 | }
222 |
223 | .ti-key:before {
224 | content: "\e631";
225 | }
226 |
227 | .ti-import:before {
228 | content: "\e632";
229 | }
230 |
231 | .ti-image:before {
232 | content: "\e633";
233 | }
234 |
235 | .ti-heart:before {
236 | content: "\e634";
237 | }
238 |
239 | .ti-heart-broken:before {
240 | content: "\e635";
241 | }
242 |
243 | .ti-hand-stop:before {
244 | content: "\e636";
245 | }
246 |
247 | .ti-hand-open:before {
248 | content: "\e637";
249 | }
250 |
251 | .ti-hand-drag:before {
252 | content: "\e638";
253 | }
254 |
255 | .ti-folder:before {
256 | content: "\e639";
257 | }
258 |
259 | .ti-flag:before {
260 | content: "\e63a";
261 | }
262 |
263 | .ti-flag-alt:before {
264 | content: "\e63b";
265 | }
266 |
267 | .ti-flag-alt-2:before {
268 | content: "\e63c";
269 | }
270 |
271 | .ti-eye:before {
272 | content: "\e63d";
273 | }
274 |
275 | .ti-export:before {
276 | content: "\e63e";
277 | }
278 |
279 | .ti-exchange-vertical:before {
280 | content: "\e63f";
281 | }
282 |
283 | .ti-desktop:before {
284 | content: "\e640";
285 | }
286 |
287 | .ti-cup:before {
288 | content: "\e641";
289 | }
290 |
291 | .ti-crown:before {
292 | content: "\e642";
293 | }
294 |
295 | .ti-comments:before {
296 | content: "\e643";
297 | }
298 |
299 | .ti-comment:before {
300 | content: "\e644";
301 | }
302 |
303 | .ti-comment-alt:before {
304 | content: "\e645";
305 | }
306 |
307 | .ti-close:before {
308 | content: "\e646";
309 | }
310 |
311 | .ti-clip:before {
312 | content: "\e647";
313 | }
314 |
315 | .ti-angle-up:before {
316 | content: "\e648";
317 | }
318 |
319 | .ti-angle-right:before {
320 | content: "\e649";
321 | }
322 |
323 | .ti-angle-left:before {
324 | content: "\e64a";
325 | }
326 |
327 | .ti-angle-down:before {
328 | content: "\e64b";
329 | }
330 |
331 | .ti-check:before {
332 | content: "\e64c";
333 | }
334 |
335 | .ti-check-box:before {
336 | content: "\e64d";
337 | }
338 |
339 | .ti-camera:before {
340 | content: "\e64e";
341 | }
342 |
343 | .ti-announcement:before {
344 | content: "\e64f";
345 | }
346 |
347 | .ti-brush:before {
348 | content: "\e650";
349 | }
350 |
351 | .ti-briefcase:before {
352 | content: "\e651";
353 | }
354 |
355 | .ti-bolt:before {
356 | content: "\e652";
357 | }
358 |
359 | .ti-bolt-alt:before {
360 | content: "\e653";
361 | }
362 |
363 | .ti-blackboard:before {
364 | content: "\e654";
365 | }
366 |
367 | .ti-bag:before {
368 | content: "\e655";
369 | }
370 |
371 | .ti-move:before {
372 | content: "\e656";
373 | }
374 |
375 | .ti-arrows-vertical:before {
376 | content: "\e657";
377 | }
378 |
379 | .ti-arrows-horizontal:before {
380 | content: "\e658";
381 | }
382 |
383 | .ti-fullscreen:before {
384 | content: "\e659";
385 | }
386 |
387 | .ti-arrow-top-right:before {
388 | content: "\e65a";
389 | }
390 |
391 | .ti-arrow-top-left:before {
392 | content: "\e65b";
393 | }
394 |
395 | .ti-arrow-circle-up:before {
396 | content: "\e65c";
397 | }
398 |
399 | .ti-arrow-circle-right:before {
400 | content: "\e65d";
401 | }
402 |
403 | .ti-arrow-circle-left:before {
404 | content: "\e65e";
405 | }
406 |
407 | .ti-arrow-circle-down:before {
408 | content: "\e65f";
409 | }
410 |
411 | .ti-angle-double-up:before {
412 | content: "\e660";
413 | }
414 |
415 | .ti-angle-double-right:before {
416 | content: "\e661";
417 | }
418 |
419 | .ti-angle-double-left:before {
420 | content: "\e662";
421 | }
422 |
423 | .ti-angle-double-down:before {
424 | content: "\e663";
425 | }
426 |
427 | .ti-zip:before {
428 | content: "\e664";
429 | }
430 |
431 | .ti-world:before {
432 | content: "\e665";
433 | }
434 |
435 | .ti-wheelchair:before {
436 | content: "\e666";
437 | }
438 |
439 | .ti-view-list:before {
440 | content: "\e667";
441 | }
442 |
443 | .ti-view-list-alt:before {
444 | content: "\e668";
445 | }
446 |
447 | .ti-view-grid:before {
448 | content: "\e669";
449 | }
450 |
451 | .ti-uppercase:before {
452 | content: "\e66a";
453 | }
454 |
455 | .ti-upload:before {
456 | content: "\e66b";
457 | }
458 |
459 | .ti-underline:before {
460 | content: "\e66c";
461 | }
462 |
463 | .ti-truck:before {
464 | content: "\e66d";
465 | }
466 |
467 | .ti-timer:before {
468 | content: "\e66e";
469 | }
470 |
471 | .ti-ticket:before {
472 | content: "\e66f";
473 | }
474 |
475 | .ti-thumb-up:before {
476 | content: "\e670";
477 | }
478 |
479 | .ti-thumb-down:before {
480 | content: "\e671";
481 | }
482 |
483 | .ti-text:before {
484 | content: "\e672";
485 | }
486 |
487 | .ti-stats-up:before {
488 | content: "\e673";
489 | }
490 |
491 | .ti-stats-down:before {
492 | content: "\e674";
493 | }
494 |
495 | .ti-split-v:before {
496 | content: "\e675";
497 | }
498 |
499 | .ti-split-h:before {
500 | content: "\e676";
501 | }
502 |
503 | .ti-smallcap:before {
504 | content: "\e677";
505 | }
506 |
507 | .ti-shine:before {
508 | content: "\e678";
509 | }
510 |
511 | .ti-shift-right:before {
512 | content: "\e679";
513 | }
514 |
515 | .ti-shift-left:before {
516 | content: "\e67a";
517 | }
518 |
519 | .ti-shield:before {
520 | content: "\e67b";
521 | }
522 |
523 | .ti-notepad:before {
524 | content: "\e67c";
525 | }
526 |
527 | .ti-server:before {
528 | content: "\e67d";
529 | }
530 |
531 | .ti-quote-right:before {
532 | content: "\e67e";
533 | }
534 |
535 | .ti-quote-left:before {
536 | content: "\e67f";
537 | }
538 |
539 | .ti-pulse:before {
540 | content: "\e680";
541 | }
542 |
543 | .ti-printer:before {
544 | content: "\e681";
545 | }
546 |
547 | .ti-power-off:before {
548 | content: "\e682";
549 | }
550 |
551 | .ti-plug:before {
552 | content: "\e683";
553 | }
554 |
555 | .ti-pie-chart:before {
556 | content: "\e684";
557 | }
558 |
559 | .ti-paragraph:before {
560 | content: "\e685";
561 | }
562 |
563 | .ti-panel:before {
564 | content: "\e686";
565 | }
566 |
567 | .ti-package:before {
568 | content: "\e687";
569 | }
570 |
571 | .ti-music:before {
572 | content: "\e688";
573 | }
574 |
575 | .ti-music-alt:before {
576 | content: "\e689";
577 | }
578 |
579 | .ti-mouse:before {
580 | content: "\e68a";
581 | }
582 |
583 | .ti-mouse-alt:before {
584 | content: "\e68b";
585 | }
586 |
587 | .ti-money:before {
588 | content: "\e68c";
589 | }
590 |
591 | .ti-microphone:before {
592 | content: "\e68d";
593 | }
594 |
595 | .ti-menu:before {
596 | content: "\e68e";
597 | }
598 |
599 | .ti-menu-alt:before {
600 | content: "\e68f";
601 | }
602 |
603 | .ti-map:before {
604 | content: "\e690";
605 | }
606 |
607 | .ti-map-alt:before {
608 | content: "\e691";
609 | }
610 |
611 | .ti-loop:before {
612 | content: "\e692";
613 | }
614 |
615 | .ti-location-pin:before {
616 | content: "\e693";
617 | }
618 |
619 | .ti-list:before {
620 | content: "\e694";
621 | }
622 |
623 | .ti-light-bulb:before {
624 | content: "\e695";
625 | }
626 |
627 | .ti-Italic:before {
628 | content: "\e696";
629 | }
630 |
631 | .ti-info:before {
632 | content: "\e697";
633 | }
634 |
635 | .ti-infinite:before {
636 | content: "\e698";
637 | }
638 |
639 | .ti-id-badge:before {
640 | content: "\e699";
641 | }
642 |
643 | .ti-hummer:before {
644 | content: "\e69a";
645 | }
646 |
647 | .ti-home:before {
648 | content: "\e69b";
649 | }
650 |
651 | .ti-help:before {
652 | content: "\e69c";
653 | }
654 |
655 | .ti-headphone:before {
656 | content: "\e69d";
657 | }
658 |
659 | .ti-harddrives:before {
660 | content: "\e69e";
661 | }
662 |
663 | .ti-harddrive:before {
664 | content: "\e69f";
665 | }
666 |
667 | .ti-gift:before {
668 | content: "\e6a0";
669 | }
670 |
671 | .ti-game:before {
672 | content: "\e6a1";
673 | }
674 |
675 | .ti-filter:before {
676 | content: "\e6a2";
677 | }
678 |
679 | .ti-files:before {
680 | content: "\e6a3";
681 | }
682 |
683 | .ti-file:before {
684 | content: "\e6a4";
685 | }
686 |
687 | .ti-eraser:before {
688 | content: "\e6a5";
689 | }
690 |
691 | .ti-envelope:before {
692 | content: "\e6a6";
693 | }
694 |
695 | .ti-download:before {
696 | content: "\e6a7";
697 | }
698 |
699 | .ti-direction:before {
700 | content: "\e6a8";
701 | }
702 |
703 | .ti-direction-alt:before {
704 | content: "\e6a9";
705 | }
706 |
707 | .ti-dashboard:before {
708 | content: "\e6aa";
709 | }
710 |
711 | .ti-control-stop:before {
712 | content: "\e6ab";
713 | }
714 |
715 | .ti-control-shuffle:before {
716 | content: "\e6ac";
717 | }
718 |
719 | .ti-control-play:before {
720 | content: "\e6ad";
721 | }
722 |
723 | .ti-control-pause:before {
724 | content: "\e6ae";
725 | }
726 |
727 | .ti-control-forward:before {
728 | content: "\e6af";
729 | }
730 |
731 | .ti-control-backward:before {
732 | content: "\e6b0";
733 | }
734 |
735 | .ti-cloud:before {
736 | content: "\e6b1";
737 | }
738 |
739 | .ti-cloud-up:before {
740 | content: "\e6b2";
741 | }
742 |
743 | .ti-cloud-down:before {
744 | content: "\e6b3";
745 | }
746 |
747 | .ti-clipboard:before {
748 | content: "\e6b4";
749 | }
750 |
751 | .ti-car:before {
752 | content: "\e6b5";
753 | }
754 |
755 | .ti-calendar:before {
756 | content: "\e6b6";
757 | }
758 |
759 | .ti-book:before {
760 | content: "\e6b7";
761 | }
762 |
763 | .ti-bell:before {
764 | content: "\e6b8";
765 | }
766 |
767 | .ti-basketball:before {
768 | content: "\e6b9";
769 | }
770 |
771 | .ti-bar-chart:before {
772 | content: "\e6ba";
773 | }
774 |
775 | .ti-bar-chart-alt:before {
776 | content: "\e6bb";
777 | }
778 |
779 | .ti-back-right:before {
780 | content: "\e6bc";
781 | }
782 |
783 | .ti-back-left:before {
784 | content: "\e6bd";
785 | }
786 |
787 | .ti-arrows-corner:before {
788 | content: "\e6be";
789 | }
790 |
791 | .ti-archive:before {
792 | content: "\e6bf";
793 | }
794 |
795 | .ti-anchor:before {
796 | content: "\e6c0";
797 | }
798 |
799 | .ti-align-right:before {
800 | content: "\e6c1";
801 | }
802 |
803 | .ti-align-left:before {
804 | content: "\e6c2";
805 | }
806 |
807 | .ti-align-justify:before {
808 | content: "\e6c3";
809 | }
810 |
811 | .ti-align-center:before {
812 | content: "\e6c4";
813 | }
814 |
815 | .ti-alert:before {
816 | content: "\e6c5";
817 | }
818 |
819 | .ti-alarm-clock:before {
820 | content: "\e6c6";
821 | }
822 |
823 | .ti-agenda:before {
824 | content: "\e6c7";
825 | }
826 |
827 | .ti-write:before {
828 | content: "\e6c8";
829 | }
830 |
831 | .ti-window:before {
832 | content: "\e6c9";
833 | }
834 |
835 | .ti-widgetized:before {
836 | content: "\e6ca";
837 | }
838 |
839 | .ti-widget:before {
840 | content: "\e6cb";
841 | }
842 |
843 | .ti-widget-alt:before {
844 | content: "\e6cc";
845 | }
846 |
847 | .ti-wallet:before {
848 | content: "\e6cd";
849 | }
850 |
851 | .ti-video-clapper:before {
852 | content: "\e6ce";
853 | }
854 |
855 | .ti-video-camera:before {
856 | content: "\e6cf";
857 | }
858 |
859 | .ti-vector:before {
860 | content: "\e6d0";
861 | }
862 |
863 | .ti-themify-logo:before {
864 | content: "\e6d1";
865 | }
866 |
867 | .ti-themify-favicon:before {
868 | content: "\e6d2";
869 | }
870 |
871 | .ti-themify-favicon-alt:before {
872 | content: "\e6d3";
873 | }
874 |
875 | .ti-support:before {
876 | content: "\e6d4";
877 | }
878 |
879 | .ti-stamp:before {
880 | content: "\e6d5";
881 | }
882 |
883 | .ti-split-v-alt:before {
884 | content: "\e6d6";
885 | }
886 |
887 | .ti-slice:before {
888 | content: "\e6d7";
889 | }
890 |
891 | .ti-shortcode:before {
892 | content: "\e6d8";
893 | }
894 |
895 | .ti-shift-right-alt:before {
896 | content: "\e6d9";
897 | }
898 |
899 | .ti-shift-left-alt:before {
900 | content: "\e6da";
901 | }
902 |
903 | .ti-ruler-alt-2:before {
904 | content: "\e6db";
905 | }
906 |
907 | .ti-receipt:before {
908 | content: "\e6dc";
909 | }
910 |
911 | .ti-pin2:before {
912 | content: "\e6dd";
913 | }
914 |
915 | .ti-pin-alt:before {
916 | content: "\e6de";
917 | }
918 |
919 | .ti-pencil-alt2:before {
920 | content: "\e6df";
921 | }
922 |
923 | .ti-palette:before {
924 | content: "\e6e0";
925 | }
926 |
927 | .ti-more:before {
928 | content: "\e6e1";
929 | }
930 |
931 | .ti-more-alt:before {
932 | content: "\e6e2";
933 | }
934 |
935 | .ti-microphone-alt:before {
936 | content: "\e6e3";
937 | }
938 |
939 | .ti-magnet:before {
940 | content: "\e6e4";
941 | }
942 |
943 | .ti-line-double:before {
944 | content: "\e6e5";
945 | }
946 |
947 | .ti-line-dotted:before {
948 | content: "\e6e6";
949 | }
950 |
951 | .ti-line-dashed:before {
952 | content: "\e6e7";
953 | }
954 |
955 | .ti-layout-width-full:before {
956 | content: "\e6e8";
957 | }
958 |
959 | .ti-layout-width-default:before {
960 | content: "\e6e9";
961 | }
962 |
963 | .ti-layout-width-default-alt:before {
964 | content: "\e6ea";
965 | }
966 |
967 | .ti-layout-tab:before {
968 | content: "\e6eb";
969 | }
970 |
971 | .ti-layout-tab-window:before {
972 | content: "\e6ec";
973 | }
974 |
975 | .ti-layout-tab-v:before {
976 | content: "\e6ed";
977 | }
978 |
979 | .ti-layout-tab-min:before {
980 | content: "\e6ee";
981 | }
982 |
983 | .ti-layout-slider:before {
984 | content: "\e6ef";
985 | }
986 |
987 | .ti-layout-slider-alt:before {
988 | content: "\e6f0";
989 | }
990 |
991 | .ti-layout-sidebar-right:before {
992 | content: "\e6f1";
993 | }
994 |
995 | .ti-layout-sidebar-none:before {
996 | content: "\e6f2";
997 | }
998 |
999 | .ti-layout-sidebar-left:before {
1000 | content: "\e6f3";
1001 | }
1002 |
1003 | .ti-layout-placeholder:before {
1004 | content: "\e6f4";
1005 | }
1006 |
1007 | .ti-layout-menu:before {
1008 | content: "\e6f5";
1009 | }
1010 |
1011 | .ti-layout-menu-v:before {
1012 | content: "\e6f6";
1013 | }
1014 |
1015 | .ti-layout-menu-separated:before {
1016 | content: "\e6f7";
1017 | }
1018 |
1019 | .ti-layout-menu-full:before {
1020 | content: "\e6f8";
1021 | }
1022 |
1023 | .ti-layout-media-right-alt:before {
1024 | content: "\e6f9";
1025 | }
1026 |
1027 | .ti-layout-media-right:before {
1028 | content: "\e6fa";
1029 | }
1030 |
1031 | .ti-layout-media-overlay:before {
1032 | content: "\e6fb";
1033 | }
1034 |
1035 | .ti-layout-media-overlay-alt:before {
1036 | content: "\e6fc";
1037 | }
1038 |
1039 | .ti-layout-media-overlay-alt-2:before {
1040 | content: "\e6fd";
1041 | }
1042 |
1043 | .ti-layout-media-left-alt:before {
1044 | content: "\e6fe";
1045 | }
1046 |
1047 | .ti-layout-media-left:before {
1048 | content: "\e6ff";
1049 | }
1050 |
1051 | .ti-layout-media-center-alt:before {
1052 | content: "\e700";
1053 | }
1054 |
1055 | .ti-layout-media-center:before {
1056 | content: "\e701";
1057 | }
1058 |
1059 | .ti-layout-list-thumb:before {
1060 | content: "\e702";
1061 | }
1062 |
1063 | .ti-layout-list-thumb-alt:before {
1064 | content: "\e703";
1065 | }
1066 |
1067 | .ti-layout-list-post:before {
1068 | content: "\e704";
1069 | }
1070 |
1071 | .ti-layout-list-large-image:before {
1072 | content: "\e705";
1073 | }
1074 |
1075 | .ti-layout-line-solid:before {
1076 | content: "\e706";
1077 | }
1078 |
1079 | .ti-layout-grid4:before {
1080 | content: "\e707";
1081 | }
1082 |
1083 | .ti-layout-grid3:before {
1084 | content: "\e708";
1085 | }
1086 |
1087 | .ti-layout-grid2:before {
1088 | content: "\e709";
1089 | }
1090 |
1091 | .ti-layout-grid2-thumb:before {
1092 | content: "\e70a";
1093 | }
1094 |
1095 | .ti-layout-cta-right:before {
1096 | content: "\e70b";
1097 | }
1098 |
1099 | .ti-layout-cta-left:before {
1100 | content: "\e70c";
1101 | }
1102 |
1103 | .ti-layout-cta-center:before {
1104 | content: "\e70d";
1105 | }
1106 |
1107 | .ti-layout-cta-btn-right:before {
1108 | content: "\e70e";
1109 | }
1110 |
1111 | .ti-layout-cta-btn-left:before {
1112 | content: "\e70f";
1113 | }
1114 |
1115 | .ti-layout-column4:before {
1116 | content: "\e710";
1117 | }
1118 |
1119 | .ti-layout-column3:before {
1120 | content: "\e711";
1121 | }
1122 |
1123 | .ti-layout-column2:before {
1124 | content: "\e712";
1125 | }
1126 |
1127 | .ti-layout-accordion-separated:before {
1128 | content: "\e713";
1129 | }
1130 |
1131 | .ti-layout-accordion-merged:before {
1132 | content: "\e714";
1133 | }
1134 |
1135 | .ti-layout-accordion-list:before {
1136 | content: "\e715";
1137 | }
1138 |
1139 | .ti-ink-pen:before {
1140 | content: "\e716";
1141 | }
1142 |
1143 | .ti-info-alt:before {
1144 | content: "\e717";
1145 | }
1146 |
1147 | .ti-help-alt:before {
1148 | content: "\e718";
1149 | }
1150 |
1151 | .ti-headphone-alt:before {
1152 | content: "\e719";
1153 | }
1154 |
1155 | .ti-hand-point-up:before {
1156 | content: "\e71a";
1157 | }
1158 |
1159 | .ti-hand-point-right:before {
1160 | content: "\e71b";
1161 | }
1162 |
1163 | .ti-hand-point-left:before {
1164 | content: "\e71c";
1165 | }
1166 |
1167 | .ti-hand-point-down:before {
1168 | content: "\e71d";
1169 | }
1170 |
1171 | .ti-gallery:before {
1172 | content: "\e71e";
1173 | }
1174 |
1175 | .ti-face-smile:before {
1176 | content: "\e71f";
1177 | }
1178 |
1179 | .ti-face-sad:before {
1180 | content: "\e720";
1181 | }
1182 |
1183 | .ti-credit-card:before {
1184 | content: "\e721";
1185 | }
1186 |
1187 | .ti-control-skip-forward:before {
1188 | content: "\e722";
1189 | }
1190 |
1191 | .ti-control-skip-backward:before {
1192 | content: "\e723";
1193 | }
1194 |
1195 | .ti-control-record:before {
1196 | content: "\e724";
1197 | }
1198 |
1199 | .ti-control-eject:before {
1200 | content: "\e725";
1201 | }
1202 |
1203 | .ti-comments-smiley:before {
1204 | content: "\e726";
1205 | }
1206 |
1207 | .ti-brush-alt:before {
1208 | content: "\e727";
1209 | }
1210 |
1211 | .ti-youtube:before {
1212 | content: "\e728";
1213 | }
1214 |
1215 | .ti-vimeo:before {
1216 | content: "\e729";
1217 | }
1218 |
1219 | .ti-twitter:before {
1220 | content: "\e72a";
1221 | }
1222 |
1223 | .ti-time:before {
1224 | content: "\e72b";
1225 | }
1226 |
1227 | .ti-tumblr:before {
1228 | content: "\e72c";
1229 | }
1230 |
1231 | .ti-skype:before {
1232 | content: "\e72d";
1233 | }
1234 |
1235 | .ti-share:before {
1236 | content: "\e72e";
1237 | }
1238 |
1239 | .ti-share-alt:before {
1240 | content: "\e72f";
1241 | }
1242 |
1243 | .ti-rocket:before {
1244 | content: "\e730";
1245 | }
1246 |
1247 | .ti-pinterest:before {
1248 | content: "\e731";
1249 | }
1250 |
1251 | .ti-new-window:before {
1252 | content: "\e732";
1253 | }
1254 |
1255 | .ti-microsoft:before {
1256 | content: "\e733";
1257 | }
1258 |
1259 | .ti-list-ol:before {
1260 | content: "\e734";
1261 | }
1262 |
1263 | .ti-linkedin:before {
1264 | content: "\e735";
1265 | }
1266 |
1267 | .ti-layout-sidebar-2:before {
1268 | content: "\e736";
1269 | }
1270 |
1271 | .ti-layout-grid4-alt:before {
1272 | content: "\e737";
1273 | }
1274 |
1275 | .ti-layout-grid3-alt:before {
1276 | content: "\e738";
1277 | }
1278 |
1279 | .ti-layout-grid2-alt:before {
1280 | content: "\e739";
1281 | }
1282 |
1283 | .ti-layout-column4-alt:before {
1284 | content: "\e73a";
1285 | }
1286 |
1287 | .ti-layout-column3-alt:before {
1288 | content: "\e73b";
1289 | }
1290 |
1291 | .ti-layout-column2-alt:before {
1292 | content: "\e73c";
1293 | }
1294 |
1295 | .ti-instagram:before {
1296 | content: "\e73d";
1297 | }
1298 |
1299 | .ti-google:before {
1300 | content: "\e73e";
1301 | }
1302 |
1303 | .ti-github:before {
1304 | content: "\e73f";
1305 | }
1306 |
1307 | .ti-flickr:before {
1308 | content: "\e740";
1309 | }
1310 |
1311 | .ti-facebook:before {
1312 | content: "\e741";
1313 | }
1314 |
1315 | .ti-dropbox:before {
1316 | content: "\e742";
1317 | }
1318 |
1319 | .ti-dribbble:before {
1320 | content: "\e743";
1321 | }
1322 |
1323 | .ti-apple:before {
1324 | content: "\e744";
1325 | }
1326 |
1327 | .ti-android:before {
1328 | content: "\e745";
1329 | }
1330 |
1331 | .ti-save:before {
1332 | content: "\e746";
1333 | }
1334 |
1335 | .ti-save-alt:before {
1336 | content: "\e747";
1337 | }
1338 |
1339 | .ti-yahoo:before {
1340 | content: "\e748";
1341 | }
1342 |
1343 | .ti-wordpress:before {
1344 | content: "\e749";
1345 | }
1346 |
1347 | .ti-vimeo-alt:before {
1348 | content: "\e74a";
1349 | }
1350 |
1351 | .ti-twitter-alt:before {
1352 | content: "\e74b";
1353 | }
1354 |
1355 | .ti-tumblr-alt:before {
1356 | content: "\e74c";
1357 | }
1358 |
1359 | .ti-trello:before {
1360 | content: "\e74d";
1361 | }
1362 |
1363 | .ti-stack-overflow:before {
1364 | content: "\e74e";
1365 | }
1366 |
1367 | .ti-soundcloud:before {
1368 | content: "\e74f";
1369 | }
1370 |
1371 | .ti-sharethis:before {
1372 | content: "\e750";
1373 | }
1374 |
1375 | .ti-sharethis-alt:before {
1376 | content: "\e751";
1377 | }
1378 |
1379 | .ti-reddit:before {
1380 | content: "\e752";
1381 | }
1382 |
1383 | .ti-pinterest-alt:before {
1384 | content: "\e753";
1385 | }
1386 |
1387 | .ti-microsoft-alt:before {
1388 | content: "\e754";
1389 | }
1390 |
1391 | .ti-linux:before {
1392 | content: "\e755";
1393 | }
1394 |
1395 | .ti-jsfiddle:before {
1396 | content: "\e756";
1397 | }
1398 |
1399 | .ti-joomla:before {
1400 | content: "\e757";
1401 | }
1402 |
1403 | .ti-html5:before {
1404 | content: "\e758";
1405 | }
1406 |
1407 | .ti-flickr-alt:before {
1408 | content: "\e759";
1409 | }
1410 |
1411 | .ti-email:before {
1412 | content: "\e75a";
1413 | }
1414 |
1415 | .ti-drupal:before {
1416 | content: "\e75b";
1417 | }
1418 |
1419 | .ti-dropbox-alt:before {
1420 | content: "\e75c";
1421 | }
1422 |
1423 | .ti-css3:before {
1424 | content: "\e75d";
1425 | }
1426 |
1427 | .ti-rss:before {
1428 | content: "\e75e";
1429 | }
1430 |
1431 | .ti-rss-alt:before {
1432 | content: "\e75f";
1433 | }
1434 |
--------------------------------------------------------------------------------
/Publish/plugins/slick/slick.min.js:
--------------------------------------------------------------------------------
1 | !function(i){"use strict";"function"==typeof define&&define.amd?define(["jquery"],i):"undefined"!=typeof exports?module.exports=i(require("jquery")):i(jQuery)}(function(i){"use strict";var e=window.Slick||{};(e=function(){var e=0;return function(t,o){var s,n=this;n.defaults={accessibility:!0,adaptiveHeight:!1,appendArrows:i(t),appendDots:i(t),arrows:!0,asNavFor:null,prevArrow:'',nextArrow:'',autoplay:!1,autoplaySpeed:3e3,centerMode:!1,centerPadding:"50px",cssEase:"ease",customPaging:function(e,t){return i('').text(t+1)},dots:!1,dotsClass:"slick-dots",draggable:!0,easing:"linear",edgeFriction:.35,fade:!1,focusOnSelect:!1,focusOnChange:!1,infinite:!0,initialSlide:0,lazyLoad:"ondemand",mobileFirst:!1,pauseOnHover:!0,pauseOnFocus:!0,pauseOnDotsHover:!1,respondTo:"window",responsive:null,rows:1,rtl:!1,slide:"",slidesPerRow:1,slidesToShow:1,slidesToScroll:1,speed:500,swipe:!0,swipeToSlide:!1,touchMove:!0,touchThreshold:5,useCSS:!0,useTransform:!0,variableWidth:!1,vertical:!1,verticalSwiping:!1,waitForAnimate:!0,zIndex:1e3},n.initials={animating:!1,dragging:!1,autoPlayTimer:null,currentDirection:0,currentLeft:null,currentSlide:0,direction:1,$dots:null,listWidth:null,listHeight:null,loadIndex:0,$nextArrow:null,$prevArrow:null,scrolling:!1,slideCount:null,slideWidth:null,$slideTrack:null,$slides:null,sliding:!1,slideOffset:0,swipeLeft:null,swiping:!1,$list:null,touchObject:{},transformsEnabled:!1,unslicked:!1},i.extend(n,n.initials),n.activeBreakpoint=null,n.animType=null,n.animProp=null,n.breakpoints=[],n.breakpointSettings=[],n.cssTransitions=!1,n.focussed=!1,n.interrupted=!1,n.hidden="hidden",n.paused=!0,n.positionProp=null,n.respondTo=null,n.rowCount=1,n.shouldClick=!0,n.$slider=i(t),n.$slidesCache=null,n.transformType=null,n.transitionType=null,n.visibilityChange="visibilitychange",n.windowWidth=0,n.windowTimer=null,s=i(t).data("slick")||{},n.options=i.extend({},n.defaults,o,s),n.currentSlide=n.options.initialSlide,n.originalSettings=n.options,void 0!==document.mozHidden?(n.hidden="mozHidden",n.visibilityChange="mozvisibilitychange"):void 0!==document.webkitHidden&&(n.hidden="webkitHidden",n.visibilityChange="webkitvisibilitychange"),n.autoPlay=i.proxy(n.autoPlay,n),n.autoPlayClear=i.proxy(n.autoPlayClear,n),n.autoPlayIterator=i.proxy(n.autoPlayIterator,n),n.changeSlide=i.proxy(n.changeSlide,n),n.clickHandler=i.proxy(n.clickHandler,n),n.selectHandler=i.proxy(n.selectHandler,n),n.setPosition=i.proxy(n.setPosition,n),n.swipeHandler=i.proxy(n.swipeHandler,n),n.dragHandler=i.proxy(n.dragHandler,n),n.keyHandler=i.proxy(n.keyHandler,n),n.instanceUid=e++,n.htmlExpr=/^(?:\s*(<[\w\W]+>)[^>]*)$/,n.registerBreakpoints(),n.init(!0)}}()).prototype.activateADA=function(){this.$slideTrack.find(".slick-active").attr({"aria-hidden":"false"}).find("a, input, button, select").attr({tabindex:"0"})},e.prototype.addSlide=e.prototype.slickAdd=function(e,t,o){var s=this;if("boolean"==typeof t)o=t,t=null;else if(t<0||t>=s.slideCount)return!1;s.unload(),"number"==typeof t?0===t&&0===s.$slides.length?i(e).appendTo(s.$slideTrack):o?i(e).insertBefore(s.$slides.eq(t)):i(e).insertAfter(s.$slides.eq(t)):!0===o?i(e).prependTo(s.$slideTrack):i(e).appendTo(s.$slideTrack),s.$slides=s.$slideTrack.children(this.options.slide),s.$slideTrack.children(this.options.slide).detach(),s.$slideTrack.append(s.$slides),s.$slides.each(function(e,t){i(t).attr("data-slick-index",e)}),s.$slidesCache=s.$slides,s.reinit()},e.prototype.animateHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.animate({height:e},i.options.speed)}},e.prototype.animateSlide=function(e,t){var o={},s=this;s.animateHeight(),!0===s.options.rtl&&!1===s.options.vertical&&(e=-e),!1===s.transformsEnabled?!1===s.options.vertical?s.$slideTrack.animate({left:e},s.options.speed,s.options.easing,t):s.$slideTrack.animate({top:e},s.options.speed,s.options.easing,t):!1===s.cssTransitions?(!0===s.options.rtl&&(s.currentLeft=-s.currentLeft),i({animStart:s.currentLeft}).animate({animStart:e},{duration:s.options.speed,easing:s.options.easing,step:function(i){i=Math.ceil(i),!1===s.options.vertical?(o[s.animType]="translate("+i+"px, 0px)",s.$slideTrack.css(o)):(o[s.animType]="translate(0px,"+i+"px)",s.$slideTrack.css(o))},complete:function(){t&&t.call()}})):(s.applyTransition(),e=Math.ceil(e),!1===s.options.vertical?o[s.animType]="translate3d("+e+"px, 0px, 0px)":o[s.animType]="translate3d(0px,"+e+"px, 0px)",s.$slideTrack.css(o),t&&setTimeout(function(){s.disableTransition(),t.call()},s.options.speed))},e.prototype.getNavTarget=function(){var e=this,t=e.options.asNavFor;return t&&null!==t&&(t=i(t).not(e.$slider)),t},e.prototype.asNavFor=function(e){var t=this.getNavTarget();null!==t&&"object"==typeof t&&t.each(function(){var t=i(this).slick("getSlick");t.unslicked||t.slideHandler(e,!0)})},e.prototype.applyTransition=function(i){var e=this,t={};!1===e.options.fade?t[e.transitionType]=e.transformType+" "+e.options.speed+"ms "+e.options.cssEase:t[e.transitionType]="opacity "+e.options.speed+"ms "+e.options.cssEase,!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.autoPlay=function(){var i=this;i.autoPlayClear(),i.slideCount>i.options.slidesToShow&&(i.autoPlayTimer=setInterval(i.autoPlayIterator,i.options.autoplaySpeed))},e.prototype.autoPlayClear=function(){var i=this;i.autoPlayTimer&&clearInterval(i.autoPlayTimer)},e.prototype.autoPlayIterator=function(){var i=this,e=i.currentSlide+i.options.slidesToScroll;i.paused||i.interrupted||i.focussed||(!1===i.options.infinite&&(1===i.direction&&i.currentSlide+1===i.slideCount-1?i.direction=0:0===i.direction&&(e=i.currentSlide-i.options.slidesToScroll,i.currentSlide-1==0&&(i.direction=1))),i.slideHandler(e))},e.prototype.buildArrows=function(){var e=this;!0===e.options.arrows&&(e.$prevArrow=i(e.options.prevArrow).addClass("slick-arrow"),e.$nextArrow=i(e.options.nextArrow).addClass("slick-arrow"),e.slideCount>e.options.slidesToShow?(e.$prevArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.$nextArrow.removeClass("slick-hidden").removeAttr("aria-hidden tabindex"),e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.prependTo(e.options.appendArrows),e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.appendTo(e.options.appendArrows),!0!==e.options.infinite&&e.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true")):e.$prevArrow.add(e.$nextArrow).addClass("slick-hidden").attr({"aria-disabled":"true",tabindex:"-1"}))},e.prototype.buildDots=function(){var e,t,o=this;if(!0===o.options.dots){for(o.$slider.addClass("slick-dotted"),t=i("").addClass(o.options.dotsClass),e=0;e<=o.getDotCount();e+=1)t.append(i("").append(o.options.customPaging.call(this,o,e)));o.$dots=t.appendTo(o.options.appendDots),o.$dots.find("li").first().addClass("slick-active")}},e.prototype.buildOut=function(){var e=this;e.$slides=e.$slider.children(e.options.slide+":not(.slick-cloned)").addClass("slick-slide"),e.slideCount=e.$slides.length,e.$slides.each(function(e,t){i(t).attr("data-slick-index",e).data("originalStyling",i(t).attr("style")||"")}),e.$slider.addClass("slick-slider"),e.$slideTrack=0===e.slideCount?i('').appendTo(e.$slider):e.$slides.wrapAll('').parent(),e.$list=e.$slideTrack.wrap('').parent(),e.$slideTrack.css("opacity",0),!0!==e.options.centerMode&&!0!==e.options.swipeToSlide||(e.options.slidesToScroll=1),i("img[data-lazy]",e.$slider).not("[src]").addClass("slick-loading"),e.setupInfinite(),e.buildArrows(),e.buildDots(),e.updateDots(),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),!0===e.options.draggable&&e.$list.addClass("draggable")},e.prototype.buildRows=function(){var i,e,t,o,s,n,r,l=this;if(o=document.createDocumentFragment(),n=l.$slider.children(),l.options.rows>1){for(r=l.options.slidesPerRow*l.options.rows,s=Math.ceil(n.length/r),i=0;ir.breakpoints[o]&&(s=r.breakpoints[o]));null!==s?null!==r.activeBreakpoint?(s!==r.activeBreakpoint||t)&&(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):(r.activeBreakpoint=s,"unslick"===r.breakpointSettings[s]?r.unslick(s):(r.options=i.extend({},r.originalSettings,r.breakpointSettings[s]),!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e)),l=s):null!==r.activeBreakpoint&&(r.activeBreakpoint=null,r.options=r.originalSettings,!0===e&&(r.currentSlide=r.options.initialSlide),r.refresh(e),l=s),e||!1===l||r.$slider.trigger("breakpoint",[r,l])}},e.prototype.changeSlide=function(e,t){var o,s,n,r=this,l=i(e.currentTarget);switch(l.is("a")&&e.preventDefault(),l.is("li")||(l=l.closest("li")),n=r.slideCount%r.options.slidesToScroll!=0,o=n?0:(r.slideCount-r.currentSlide)%r.options.slidesToScroll,e.data.message){case"previous":s=0===o?r.options.slidesToScroll:r.options.slidesToShow-o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide-s,!1,t);break;case"next":s=0===o?r.options.slidesToScroll:o,r.slideCount>r.options.slidesToShow&&r.slideHandler(r.currentSlide+s,!1,t);break;case"index":var d=0===e.data.index?0:e.data.index||l.index()*r.options.slidesToScroll;r.slideHandler(r.checkNavigable(d),!1,t),l.children().trigger("focus");break;default:return}},e.prototype.checkNavigable=function(i){var e,t;if(e=this.getNavigableIndexes(),t=0,i>e[e.length-1])i=e[e.length-1];else for(var o in e){if(ie.options.slidesToShow&&(e.$prevArrow&&e.$prevArrow.off("click.slick",e.changeSlide),e.$nextArrow&&e.$nextArrow.off("click.slick",e.changeSlide),!0===e.options.accessibility&&(e.$prevArrow&&e.$prevArrow.off("keydown.slick",e.keyHandler),e.$nextArrow&&e.$nextArrow.off("keydown.slick",e.keyHandler))),e.$list.off("touchstart.slick mousedown.slick",e.swipeHandler),e.$list.off("touchmove.slick mousemove.slick",e.swipeHandler),e.$list.off("touchend.slick mouseup.slick",e.swipeHandler),e.$list.off("touchcancel.slick mouseleave.slick",e.swipeHandler),e.$list.off("click.slick",e.clickHandler),i(document).off(e.visibilityChange,e.visibility),e.cleanUpSlideEvents(),!0===e.options.accessibility&&e.$list.off("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().off("click.slick",e.selectHandler),i(window).off("orientationchange.slick.slick-"+e.instanceUid,e.orientationChange),i(window).off("resize.slick.slick-"+e.instanceUid,e.resize),i("[draggable!=true]",e.$slideTrack).off("dragstart",e.preventDefault),i(window).off("load.slick.slick-"+e.instanceUid,e.setPosition)},e.prototype.cleanUpSlideEvents=function(){var e=this;e.$list.off("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.off("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.cleanUpRows=function(){var i,e=this;e.options.rows>1&&((i=e.$slides.children().children()).removeAttr("style"),e.$slider.empty().append(i))},e.prototype.clickHandler=function(i){!1===this.shouldClick&&(i.stopImmediatePropagation(),i.stopPropagation(),i.preventDefault())},e.prototype.destroy=function(e){var t=this;t.autoPlayClear(),t.touchObject={},t.cleanUpEvents(),i(".slick-cloned",t.$slider).detach(),t.$dots&&t.$dots.remove(),t.$prevArrow&&t.$prevArrow.length&&(t.$prevArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.prevArrow)&&t.$prevArrow.remove()),t.$nextArrow&&t.$nextArrow.length&&(t.$nextArrow.removeClass("slick-disabled slick-arrow slick-hidden").removeAttr("aria-hidden aria-disabled tabindex").css("display",""),t.htmlExpr.test(t.options.nextArrow)&&t.$nextArrow.remove()),t.$slides&&(t.$slides.removeClass("slick-slide slick-active slick-center slick-visible slick-current").removeAttr("aria-hidden").removeAttr("data-slick-index").each(function(){i(this).attr("style",i(this).data("originalStyling"))}),t.$slideTrack.children(this.options.slide).detach(),t.$slideTrack.detach(),t.$list.detach(),t.$slider.append(t.$slides)),t.cleanUpRows(),t.$slider.removeClass("slick-slider"),t.$slider.removeClass("slick-initialized"),t.$slider.removeClass("slick-dotted"),t.unslicked=!0,e||t.$slider.trigger("destroy",[t])},e.prototype.disableTransition=function(i){var e=this,t={};t[e.transitionType]="",!1===e.options.fade?e.$slideTrack.css(t):e.$slides.eq(i).css(t)},e.prototype.fadeSlide=function(i,e){var t=this;!1===t.cssTransitions?(t.$slides.eq(i).css({zIndex:t.options.zIndex}),t.$slides.eq(i).animate({opacity:1},t.options.speed,t.options.easing,e)):(t.applyTransition(i),t.$slides.eq(i).css({opacity:1,zIndex:t.options.zIndex}),e&&setTimeout(function(){t.disableTransition(i),e.call()},t.options.speed))},e.prototype.fadeSlideOut=function(i){var e=this;!1===e.cssTransitions?e.$slides.eq(i).animate({opacity:0,zIndex:e.options.zIndex-2},e.options.speed,e.options.easing):(e.applyTransition(i),e.$slides.eq(i).css({opacity:0,zIndex:e.options.zIndex-2}))},e.prototype.filterSlides=e.prototype.slickFilter=function(i){var e=this;null!==i&&(e.$slidesCache=e.$slides,e.unload(),e.$slideTrack.children(this.options.slide).detach(),e.$slidesCache.filter(i).appendTo(e.$slideTrack),e.reinit())},e.prototype.focusHandler=function(){var e=this;e.$slider.off("focus.slick blur.slick").on("focus.slick blur.slick","*",function(t){t.stopImmediatePropagation();var o=i(this);setTimeout(function(){e.options.pauseOnFocus&&(e.focussed=o.is(":focus"),e.autoPlay())},0)})},e.prototype.getCurrent=e.prototype.slickCurrentSlide=function(){return this.currentSlide},e.prototype.getDotCount=function(){var i=this,e=0,t=0,o=0;if(!0===i.options.infinite)if(i.slideCount<=i.options.slidesToShow)++o;else for(;en.options.slidesToShow&&(n.slideOffset=n.slideWidth*n.options.slidesToShow*-1,s=-1,!0===n.options.vertical&&!0===n.options.centerMode&&(2===n.options.slidesToShow?s=-1.5:1===n.options.slidesToShow&&(s=-2)),r=t*n.options.slidesToShow*s),n.slideCount%n.options.slidesToScroll!=0&&i+n.options.slidesToScroll>n.slideCount&&n.slideCount>n.options.slidesToShow&&(i>n.slideCount?(n.slideOffset=(n.options.slidesToShow-(i-n.slideCount))*n.slideWidth*-1,r=(n.options.slidesToShow-(i-n.slideCount))*t*-1):(n.slideOffset=n.slideCount%n.options.slidesToScroll*n.slideWidth*-1,r=n.slideCount%n.options.slidesToScroll*t*-1))):i+n.options.slidesToShow>n.slideCount&&(n.slideOffset=(i+n.options.slidesToShow-n.slideCount)*n.slideWidth,r=(i+n.options.slidesToShow-n.slideCount)*t),n.slideCount<=n.options.slidesToShow&&(n.slideOffset=0,r=0),!0===n.options.centerMode&&n.slideCount<=n.options.slidesToShow?n.slideOffset=n.slideWidth*Math.floor(n.options.slidesToShow)/2-n.slideWidth*n.slideCount/2:!0===n.options.centerMode&&!0===n.options.infinite?n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)-n.slideWidth:!0===n.options.centerMode&&(n.slideOffset=0,n.slideOffset+=n.slideWidth*Math.floor(n.options.slidesToShow/2)),e=!1===n.options.vertical?i*n.slideWidth*-1+n.slideOffset:i*t*-1+r,!0===n.options.variableWidth&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,!0===n.options.centerMode&&(o=n.slideCount<=n.options.slidesToShow||!1===n.options.infinite?n.$slideTrack.children(".slick-slide").eq(i):n.$slideTrack.children(".slick-slide").eq(i+n.options.slidesToShow+1),e=!0===n.options.rtl?o[0]?-1*(n.$slideTrack.width()-o[0].offsetLeft-o.width()):0:o[0]?-1*o[0].offsetLeft:0,e+=(n.$list.width()-o.outerWidth())/2)),e},e.prototype.getOption=e.prototype.slickGetOption=function(i){return this.options[i]},e.prototype.getNavigableIndexes=function(){var i,e=this,t=0,o=0,s=[];for(!1===e.options.infinite?i=e.slideCount:(t=-1*e.options.slidesToScroll,o=-1*e.options.slidesToScroll,i=2*e.slideCount);t-1*o.swipeLeft)return e=n,!1}),Math.abs(i(e).attr("data-slick-index")-o.currentSlide)||1):o.options.slidesToScroll},e.prototype.goTo=e.prototype.slickGoTo=function(i,e){this.changeSlide({data:{message:"index",index:parseInt(i)}},e)},e.prototype.init=function(e){var t=this;i(t.$slider).hasClass("slick-initialized")||(i(t.$slider).addClass("slick-initialized"),t.buildRows(),t.buildOut(),t.setProps(),t.startLoad(),t.loadSlider(),t.initializeEvents(),t.updateArrows(),t.updateDots(),t.checkResponsive(!0),t.focusHandler()),e&&t.$slider.trigger("init",[t]),!0===t.options.accessibility&&t.initADA(),t.options.autoplay&&(t.paused=!1,t.autoPlay())},e.prototype.initADA=function(){var e=this,t=Math.ceil(e.slideCount/e.options.slidesToShow),o=e.getNavigableIndexes().filter(function(i){return i>=0&&ii.options.slidesToShow&&(i.$prevArrow.off("click.slick").on("click.slick",{message:"previous"},i.changeSlide),i.$nextArrow.off("click.slick").on("click.slick",{message:"next"},i.changeSlide),!0===i.options.accessibility&&(i.$prevArrow.on("keydown.slick",i.keyHandler),i.$nextArrow.on("keydown.slick",i.keyHandler)))},e.prototype.initDotEvents=function(){var e=this;!0===e.options.dots&&(i("li",e.$dots).on("click.slick",{message:"index"},e.changeSlide),!0===e.options.accessibility&&e.$dots.on("keydown.slick",e.keyHandler)),!0===e.options.dots&&!0===e.options.pauseOnDotsHover&&i("li",e.$dots).on("mouseenter.slick",i.proxy(e.interrupt,e,!0)).on("mouseleave.slick",i.proxy(e.interrupt,e,!1))},e.prototype.initSlideEvents=function(){var e=this;e.options.pauseOnHover&&(e.$list.on("mouseenter.slick",i.proxy(e.interrupt,e,!0)),e.$list.on("mouseleave.slick",i.proxy(e.interrupt,e,!1)))},e.prototype.initializeEvents=function(){var e=this;e.initArrowEvents(),e.initDotEvents(),e.initSlideEvents(),e.$list.on("touchstart.slick mousedown.slick",{action:"start"},e.swipeHandler),e.$list.on("touchmove.slick mousemove.slick",{action:"move"},e.swipeHandler),e.$list.on("touchend.slick mouseup.slick",{action:"end"},e.swipeHandler),e.$list.on("touchcancel.slick mouseleave.slick",{action:"end"},e.swipeHandler),e.$list.on("click.slick",e.clickHandler),i(document).on(e.visibilityChange,i.proxy(e.visibility,e)),!0===e.options.accessibility&&e.$list.on("keydown.slick",e.keyHandler),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),i(window).on("orientationchange.slick.slick-"+e.instanceUid,i.proxy(e.orientationChange,e)),i(window).on("resize.slick.slick-"+e.instanceUid,i.proxy(e.resize,e)),i("[draggable!=true]",e.$slideTrack).on("dragstart",e.preventDefault),i(window).on("load.slick.slick-"+e.instanceUid,e.setPosition),i(e.setPosition)},e.prototype.initUI=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.show(),i.$nextArrow.show()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.show()},e.prototype.keyHandler=function(i){var e=this;i.target.tagName.match("TEXTAREA|INPUT|SELECT")||(37===i.keyCode&&!0===e.options.accessibility?e.changeSlide({data:{message:!0===e.options.rtl?"next":"previous"}}):39===i.keyCode&&!0===e.options.accessibility&&e.changeSlide({data:{message:!0===e.options.rtl?"previous":"next"}}))},e.prototype.lazyLoad=function(){function e(e){i("img[data-lazy]",e).each(function(){var e=i(this),t=i(this).attr("data-lazy"),o=i(this).attr("data-srcset"),s=i(this).attr("data-sizes")||n.$slider.attr("data-sizes"),r=document.createElement("img");r.onload=function(){e.animate({opacity:0},100,function(){o&&(e.attr("srcset",o),s&&e.attr("sizes",s)),e.attr("src",t).animate({opacity:1},200,function(){e.removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading")}),n.$slider.trigger("lazyLoaded",[n,e,t])})},r.onerror=function(){e.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),n.$slider.trigger("lazyLoadError",[n,e,t])},r.src=t})}var t,o,s,n=this;if(!0===n.options.centerMode?!0===n.options.infinite?s=(o=n.currentSlide+(n.options.slidesToShow/2+1))+n.options.slidesToShow+2:(o=Math.max(0,n.currentSlide-(n.options.slidesToShow/2+1)),s=n.options.slidesToShow/2+1+2+n.currentSlide):(o=n.options.infinite?n.options.slidesToShow+n.currentSlide:n.currentSlide,s=Math.ceil(o+n.options.slidesToShow),!0===n.options.fade&&(o>0&&o--,s<=n.slideCount&&s++)),t=n.$slider.find(".slick-slide").slice(o,s),"anticipated"===n.options.lazyLoad)for(var r=o-1,l=s,d=n.$slider.find(".slick-slide"),a=0;a=n.slideCount-n.options.slidesToShow?e(n.$slider.find(".slick-cloned").slice(0,n.options.slidesToShow)):0===n.currentSlide&&e(n.$slider.find(".slick-cloned").slice(-1*n.options.slidesToShow))},e.prototype.loadSlider=function(){var i=this;i.setPosition(),i.$slideTrack.css({opacity:1}),i.$slider.removeClass("slick-loading"),i.initUI(),"progressive"===i.options.lazyLoad&&i.progressiveLazyLoad()},e.prototype.next=e.prototype.slickNext=function(){this.changeSlide({data:{message:"next"}})},e.prototype.orientationChange=function(){var i=this;i.checkResponsive(),i.setPosition()},e.prototype.pause=e.prototype.slickPause=function(){var i=this;i.autoPlayClear(),i.paused=!0},e.prototype.play=e.prototype.slickPlay=function(){var i=this;i.autoPlay(),i.options.autoplay=!0,i.paused=!1,i.focussed=!1,i.interrupted=!1},e.prototype.postSlide=function(e){var t=this;t.unslicked||(t.$slider.trigger("afterChange",[t,e]),t.animating=!1,t.slideCount>t.options.slidesToShow&&t.setPosition(),t.swipeLeft=null,t.options.autoplay&&t.autoPlay(),!0===t.options.accessibility&&(t.initADA(),t.options.focusOnChange&&i(t.$slides.get(t.currentSlide)).attr("tabindex",0).focus()))},e.prototype.prev=e.prototype.slickPrev=function(){this.changeSlide({data:{message:"previous"}})},e.prototype.preventDefault=function(i){i.preventDefault()},e.prototype.progressiveLazyLoad=function(e){e=e||1;var t,o,s,n,r,l=this,d=i("img[data-lazy]",l.$slider);d.length?(t=d.first(),o=t.attr("data-lazy"),s=t.attr("data-srcset"),n=t.attr("data-sizes")||l.$slider.attr("data-sizes"),(r=document.createElement("img")).onload=function(){s&&(t.attr("srcset",s),n&&t.attr("sizes",n)),t.attr("src",o).removeAttr("data-lazy data-srcset data-sizes").removeClass("slick-loading"),!0===l.options.adaptiveHeight&&l.setPosition(),l.$slider.trigger("lazyLoaded",[l,t,o]),l.progressiveLazyLoad()},r.onerror=function(){e<3?setTimeout(function(){l.progressiveLazyLoad(e+1)},500):(t.removeAttr("data-lazy").removeClass("slick-loading").addClass("slick-lazyload-error"),l.$slider.trigger("lazyLoadError",[l,t,o]),l.progressiveLazyLoad())},r.src=o):l.$slider.trigger("allImagesLoaded",[l])},e.prototype.refresh=function(e){var t,o,s=this;o=s.slideCount-s.options.slidesToShow,!s.options.infinite&&s.currentSlide>o&&(s.currentSlide=o),s.slideCount<=s.options.slidesToShow&&(s.currentSlide=0),t=s.currentSlide,s.destroy(!0),i.extend(s,s.initials,{currentSlide:t}),s.init(),e||s.changeSlide({data:{message:"index",index:t}},!1)},e.prototype.registerBreakpoints=function(){var e,t,o,s=this,n=s.options.responsive||null;if("array"===i.type(n)&&n.length){s.respondTo=s.options.respondTo||"window";for(e in n)if(o=s.breakpoints.length-1,n.hasOwnProperty(e)){for(t=n[e].breakpoint;o>=0;)s.breakpoints[o]&&s.breakpoints[o]===t&&s.breakpoints.splice(o,1),o--;s.breakpoints.push(t),s.breakpointSettings[t]=n[e].settings}s.breakpoints.sort(function(i,e){return s.options.mobileFirst?i-e:e-i})}},e.prototype.reinit=function(){var e=this;e.$slides=e.$slideTrack.children(e.options.slide).addClass("slick-slide"),e.slideCount=e.$slides.length,e.currentSlide>=e.slideCount&&0!==e.currentSlide&&(e.currentSlide=e.currentSlide-e.options.slidesToScroll),e.slideCount<=e.options.slidesToShow&&(e.currentSlide=0),e.registerBreakpoints(),e.setProps(),e.setupInfinite(),e.buildArrows(),e.updateArrows(),e.initArrowEvents(),e.buildDots(),e.updateDots(),e.initDotEvents(),e.cleanUpSlideEvents(),e.initSlideEvents(),e.checkResponsive(!1,!0),!0===e.options.focusOnSelect&&i(e.$slideTrack).children().on("click.slick",e.selectHandler),e.setSlideClasses("number"==typeof e.currentSlide?e.currentSlide:0),e.setPosition(),e.focusHandler(),e.paused=!e.options.autoplay,e.autoPlay(),e.$slider.trigger("reInit",[e])},e.prototype.resize=function(){var e=this;i(window).width()!==e.windowWidth&&(clearTimeout(e.windowDelay),e.windowDelay=window.setTimeout(function(){e.windowWidth=i(window).width(),e.checkResponsive(),e.unslicked||e.setPosition()},50))},e.prototype.removeSlide=e.prototype.slickRemove=function(i,e,t){var o=this;if(i="boolean"==typeof i?!0===(e=i)?0:o.slideCount-1:!0===e?--i:i,o.slideCount<1||i<0||i>o.slideCount-1)return!1;o.unload(),!0===t?o.$slideTrack.children().remove():o.$slideTrack.children(this.options.slide).eq(i).remove(),o.$slides=o.$slideTrack.children(this.options.slide),o.$slideTrack.children(this.options.slide).detach(),o.$slideTrack.append(o.$slides),o.$slidesCache=o.$slides,o.reinit()},e.prototype.setCSS=function(i){var e,t,o=this,s={};!0===o.options.rtl&&(i=-i),e="left"==o.positionProp?Math.ceil(i)+"px":"0px",t="top"==o.positionProp?Math.ceil(i)+"px":"0px",s[o.positionProp]=i,!1===o.transformsEnabled?o.$slideTrack.css(s):(s={},!1===o.cssTransitions?(s[o.animType]="translate("+e+", "+t+")",o.$slideTrack.css(s)):(s[o.animType]="translate3d("+e+", "+t+", 0px)",o.$slideTrack.css(s)))},e.prototype.setDimensions=function(){var i=this;!1===i.options.vertical?!0===i.options.centerMode&&i.$list.css({padding:"0px "+i.options.centerPadding}):(i.$list.height(i.$slides.first().outerHeight(!0)*i.options.slidesToShow),!0===i.options.centerMode&&i.$list.css({padding:i.options.centerPadding+" 0px"})),i.listWidth=i.$list.width(),i.listHeight=i.$list.height(),!1===i.options.vertical&&!1===i.options.variableWidth?(i.slideWidth=Math.ceil(i.listWidth/i.options.slidesToShow),i.$slideTrack.width(Math.ceil(i.slideWidth*i.$slideTrack.children(".slick-slide").length))):!0===i.options.variableWidth?i.$slideTrack.width(5e3*i.slideCount):(i.slideWidth=Math.ceil(i.listWidth),i.$slideTrack.height(Math.ceil(i.$slides.first().outerHeight(!0)*i.$slideTrack.children(".slick-slide").length)));var e=i.$slides.first().outerWidth(!0)-i.$slides.first().width();!1===i.options.variableWidth&&i.$slideTrack.children(".slick-slide").width(i.slideWidth-e)},e.prototype.setFade=function(){var e,t=this;t.$slides.each(function(o,s){e=t.slideWidth*o*-1,!0===t.options.rtl?i(s).css({position:"relative",right:e,top:0,zIndex:t.options.zIndex-2,opacity:0}):i(s).css({position:"relative",left:e,top:0,zIndex:t.options.zIndex-2,opacity:0})}),t.$slides.eq(t.currentSlide).css({zIndex:t.options.zIndex-1,opacity:1})},e.prototype.setHeight=function(){var i=this;if(1===i.options.slidesToShow&&!0===i.options.adaptiveHeight&&!1===i.options.vertical){var e=i.$slides.eq(i.currentSlide).outerHeight(!0);i.$list.css("height",e)}},e.prototype.setOption=e.prototype.slickSetOption=function(){var e,t,o,s,n,r=this,l=!1;if("object"===i.type(arguments[0])?(o=arguments[0],l=arguments[1],n="multiple"):"string"===i.type(arguments[0])&&(o=arguments[0],s=arguments[1],l=arguments[2],"responsive"===arguments[0]&&"array"===i.type(arguments[1])?n="responsive":void 0!==arguments[1]&&(n="single")),"single"===n)r.options[o]=s;else if("multiple"===n)i.each(o,function(i,e){r.options[i]=e});else if("responsive"===n)for(t in s)if("array"!==i.type(r.options.responsive))r.options.responsive=[s[t]];else{for(e=r.options.responsive.length-1;e>=0;)r.options.responsive[e].breakpoint===s[t].breakpoint&&r.options.responsive.splice(e,1),e--;r.options.responsive.push(s[t])}l&&(r.unload(),r.reinit())},e.prototype.setPosition=function(){var i=this;i.setDimensions(),i.setHeight(),!1===i.options.fade?i.setCSS(i.getLeft(i.currentSlide)):i.setFade(),i.$slider.trigger("setPosition",[i])},e.prototype.setProps=function(){var i=this,e=document.body.style;i.positionProp=!0===i.options.vertical?"top":"left","top"===i.positionProp?i.$slider.addClass("slick-vertical"):i.$slider.removeClass("slick-vertical"),void 0===e.WebkitTransition&&void 0===e.MozTransition&&void 0===e.msTransition||!0===i.options.useCSS&&(i.cssTransitions=!0),i.options.fade&&("number"==typeof i.options.zIndex?i.options.zIndex<3&&(i.options.zIndex=3):i.options.zIndex=i.defaults.zIndex),void 0!==e.OTransform&&(i.animType="OTransform",i.transformType="-o-transform",i.transitionType="OTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.MozTransform&&(i.animType="MozTransform",i.transformType="-moz-transform",i.transitionType="MozTransition",void 0===e.perspectiveProperty&&void 0===e.MozPerspective&&(i.animType=!1)),void 0!==e.webkitTransform&&(i.animType="webkitTransform",i.transformType="-webkit-transform",i.transitionType="webkitTransition",void 0===e.perspectiveProperty&&void 0===e.webkitPerspective&&(i.animType=!1)),void 0!==e.msTransform&&(i.animType="msTransform",i.transformType="-ms-transform",i.transitionType="msTransition",void 0===e.msTransform&&(i.animType=!1)),void 0!==e.transform&&!1!==i.animType&&(i.animType="transform",i.transformType="transform",i.transitionType="transition"),i.transformsEnabled=i.options.useTransform&&null!==i.animType&&!1!==i.animType},e.prototype.setSlideClasses=function(i){var e,t,o,s,n=this;if(t=n.$slider.find(".slick-slide").removeClass("slick-active slick-center slick-current").attr("aria-hidden","true"),n.$slides.eq(i).addClass("slick-current"),!0===n.options.centerMode){var r=n.options.slidesToShow%2==0?1:0;e=Math.floor(n.options.slidesToShow/2),!0===n.options.infinite&&(i>=e&&i<=n.slideCount-1-e?n.$slides.slice(i-e+r,i+e+1).addClass("slick-active").attr("aria-hidden","false"):(o=n.options.slidesToShow+i,t.slice(o-e+1+r,o+e+2).addClass("slick-active").attr("aria-hidden","false")),0===i?t.eq(t.length-1-n.options.slidesToShow).addClass("slick-center"):i===n.slideCount-1&&t.eq(n.options.slidesToShow).addClass("slick-center")),n.$slides.eq(i).addClass("slick-center")}else i>=0&&i<=n.slideCount-n.options.slidesToShow?n.$slides.slice(i,i+n.options.slidesToShow).addClass("slick-active").attr("aria-hidden","false"):t.length<=n.options.slidesToShow?t.addClass("slick-active").attr("aria-hidden","false"):(s=n.slideCount%n.options.slidesToShow,o=!0===n.options.infinite?n.options.slidesToShow+i:i,n.options.slidesToShow==n.options.slidesToScroll&&n.slideCount-is.options.slidesToShow)){for(o=!0===s.options.centerMode?s.options.slidesToShow+1:s.options.slidesToShow,e=s.slideCount;e>s.slideCount-o;e-=1)t=e-1,i(s.$slides[t]).clone(!0).attr("id","").attr("data-slick-index",t-s.slideCount).prependTo(s.$slideTrack).addClass("slick-cloned");for(e=0;ea.getDotCount()*a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else if(!1===a.options.infinite&&!0===a.options.centerMode&&(i<0||i>a.slideCount-a.options.slidesToScroll))!1===a.options.fade&&(o=a.currentSlide,!0!==t?a.animateSlide(r,function(){a.postSlide(o)}):a.postSlide(o));else{if(a.options.autoplay&&clearInterval(a.autoPlayTimer),s=o<0?a.slideCount%a.options.slidesToScroll!=0?a.slideCount-a.slideCount%a.options.slidesToScroll:a.slideCount+o:o>=a.slideCount?a.slideCount%a.options.slidesToScroll!=0?0:o-a.slideCount:o,a.animating=!0,a.$slider.trigger("beforeChange",[a,a.currentSlide,s]),n=a.currentSlide,a.currentSlide=s,a.setSlideClasses(a.currentSlide),a.options.asNavFor&&(l=(l=a.getNavTarget()).slick("getSlick")).slideCount<=l.options.slidesToShow&&l.setSlideClasses(a.currentSlide),a.updateDots(),a.updateArrows(),!0===a.options.fade)return!0!==t?(a.fadeSlideOut(n),a.fadeSlide(s,function(){a.postSlide(s)})):a.postSlide(s),void a.animateHeight();!0!==t?a.animateSlide(d,function(){a.postSlide(s)}):a.postSlide(s)}},e.prototype.startLoad=function(){var i=this;!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&(i.$prevArrow.hide(),i.$nextArrow.hide()),!0===i.options.dots&&i.slideCount>i.options.slidesToShow&&i.$dots.hide(),i.$slider.addClass("slick-loading")},e.prototype.swipeDirection=function(){var i,e,t,o,s=this;return i=s.touchObject.startX-s.touchObject.curX,e=s.touchObject.startY-s.touchObject.curY,t=Math.atan2(e,i),(o=Math.round(180*t/Math.PI))<0&&(o=360-Math.abs(o)),o<=45&&o>=0?!1===s.options.rtl?"left":"right":o<=360&&o>=315?!1===s.options.rtl?"left":"right":o>=135&&o<=225?!1===s.options.rtl?"right":"left":!0===s.options.verticalSwiping?o>=35&&o<=135?"down":"up":"vertical"},e.prototype.swipeEnd=function(i){var e,t,o=this;if(o.dragging=!1,o.swiping=!1,o.scrolling)return o.scrolling=!1,!1;if(o.interrupted=!1,o.shouldClick=!(o.touchObject.swipeLength>10),void 0===o.touchObject.curX)return!1;if(!0===o.touchObject.edgeHit&&o.$slider.trigger("edge",[o,o.swipeDirection()]),o.touchObject.swipeLength>=o.touchObject.minSwipe){switch(t=o.swipeDirection()){case"left":case"down":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide+o.getSlideCount()):o.currentSlide+o.getSlideCount(),o.currentDirection=0;break;case"right":case"up":e=o.options.swipeToSlide?o.checkNavigable(o.currentSlide-o.getSlideCount()):o.currentSlide-o.getSlideCount(),o.currentDirection=1}"vertical"!=t&&(o.slideHandler(e),o.touchObject={},o.$slider.trigger("swipe",[o,t]))}else o.touchObject.startX!==o.touchObject.curX&&(o.slideHandler(o.currentSlide),o.touchObject={})},e.prototype.swipeHandler=function(i){var e=this;if(!(!1===e.options.swipe||"ontouchend"in document&&!1===e.options.swipe||!1===e.options.draggable&&-1!==i.type.indexOf("mouse")))switch(e.touchObject.fingerCount=i.originalEvent&&void 0!==i.originalEvent.touches?i.originalEvent.touches.length:1,e.touchObject.minSwipe=e.listWidth/e.options.touchThreshold,!0===e.options.verticalSwiping&&(e.touchObject.minSwipe=e.listHeight/e.options.touchThreshold),i.data.action){case"start":e.swipeStart(i);break;case"move":e.swipeMove(i);break;case"end":e.swipeEnd(i)}},e.prototype.swipeMove=function(i){var e,t,o,s,n,r,l=this;return n=void 0!==i.originalEvent?i.originalEvent.touches:null,!(!l.dragging||l.scrolling||n&&1!==n.length)&&(e=l.getLeft(l.currentSlide),l.touchObject.curX=void 0!==n?n[0].pageX:i.clientX,l.touchObject.curY=void 0!==n?n[0].pageY:i.clientY,l.touchObject.swipeLength=Math.round(Math.sqrt(Math.pow(l.touchObject.curX-l.touchObject.startX,2))),r=Math.round(Math.sqrt(Math.pow(l.touchObject.curY-l.touchObject.startY,2))),!l.options.verticalSwiping&&!l.swiping&&r>4?(l.scrolling=!0,!1):(!0===l.options.verticalSwiping&&(l.touchObject.swipeLength=r),t=l.swipeDirection(),void 0!==i.originalEvent&&l.touchObject.swipeLength>4&&(l.swiping=!0,i.preventDefault()),s=(!1===l.options.rtl?1:-1)*(l.touchObject.curX>l.touchObject.startX?1:-1),!0===l.options.verticalSwiping&&(s=l.touchObject.curY>l.touchObject.startY?1:-1),o=l.touchObject.swipeLength,l.touchObject.edgeHit=!1,!1===l.options.infinite&&(0===l.currentSlide&&"right"===t||l.currentSlide>=l.getDotCount()&&"left"===t)&&(o=l.touchObject.swipeLength*l.options.edgeFriction,l.touchObject.edgeHit=!0),!1===l.options.vertical?l.swipeLeft=e+o*s:l.swipeLeft=e+o*(l.$list.height()/l.listWidth)*s,!0===l.options.verticalSwiping&&(l.swipeLeft=e+o*s),!0!==l.options.fade&&!1!==l.options.touchMove&&(!0===l.animating?(l.swipeLeft=null,!1):void l.setCSS(l.swipeLeft))))},e.prototype.swipeStart=function(i){var e,t=this;if(t.interrupted=!0,1!==t.touchObject.fingerCount||t.slideCount<=t.options.slidesToShow)return t.touchObject={},!1;void 0!==i.originalEvent&&void 0!==i.originalEvent.touches&&(e=i.originalEvent.touches[0]),t.touchObject.startX=t.touchObject.curX=void 0!==e?e.pageX:i.clientX,t.touchObject.startY=t.touchObject.curY=void 0!==e?e.pageY:i.clientY,t.dragging=!0},e.prototype.unfilterSlides=e.prototype.slickUnfilter=function(){var i=this;null!==i.$slidesCache&&(i.unload(),i.$slideTrack.children(this.options.slide).detach(),i.$slidesCache.appendTo(i.$slideTrack),i.reinit())},e.prototype.unload=function(){var e=this;i(".slick-cloned",e.$slider).remove(),e.$dots&&e.$dots.remove(),e.$prevArrow&&e.htmlExpr.test(e.options.prevArrow)&&e.$prevArrow.remove(),e.$nextArrow&&e.htmlExpr.test(e.options.nextArrow)&&e.$nextArrow.remove(),e.$slides.removeClass("slick-slide slick-active slick-visible slick-current").attr("aria-hidden","true").css("width","")},e.prototype.unslick=function(i){var e=this;e.$slider.trigger("unslick",[e,i]),e.destroy()},e.prototype.updateArrows=function(){var i=this;Math.floor(i.options.slidesToShow/2),!0===i.options.arrows&&i.slideCount>i.options.slidesToShow&&!i.options.infinite&&(i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false"),0===i.currentSlide?(i.$prevArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$nextArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-i.options.slidesToShow&&!1===i.options.centerMode?(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")):i.currentSlide>=i.slideCount-1&&!0===i.options.centerMode&&(i.$nextArrow.addClass("slick-disabled").attr("aria-disabled","true"),i.$prevArrow.removeClass("slick-disabled").attr("aria-disabled","false")))},e.prototype.updateDots=function(){var i=this;null!==i.$dots&&(i.$dots.find("li").removeClass("slick-active").end(),i.$dots.find("li").eq(Math.floor(i.currentSlide/i.options.slidesToScroll)).addClass("slick-active"))},e.prototype.visibility=function(){var i=this;i.options.autoplay&&(document[i.hidden]?i.interrupted=!0:i.interrupted=!1)},i.fn.slick=function(){var i,t,o=this,s=arguments[0],n=Array.prototype.slice.call(arguments,1),r=o.length;for(i=0;i>16)+(t>>16)+(r>>16)<<16|65535&r}function f(n,t,r,e,o,u){return d((c=d(d(t,n),d(e,u)))<<(f=o)|c>>>32-f,r);var c,f}function l(n,t,r,e,o,u,c){return f(t&r|~t&e,n,t,o,u,c)}function v(n,t,r,e,o,u,c){return f(t&e|r&~e,n,t,o,u,c)}function g(n,t,r,e,o,u,c){return f(t^r^e,n,t,o,u,c)}function m(n,t,r,e,o,u,c){return f(r^(t|~e),n,t,o,u,c)}function i(n,t){var r,e,o,u;n[t>>5]|=128<>>9<<4)]=t;for(var c=1732584193,f=-271733879,i=-1732584194,a=271733878,h=0;h>5]>>>e%32&255);return t}function h(n){var t=[];for(t[(n.length>>2)-1]=void 0,e=0;e>5]|=(255&n.charCodeAt(e/8))<>>4&15)+r.charAt(15&t);return e}function r(n){return unescape(encodeURIComponent(n))}function o(n){return a(i(h(t=r(n)),8*t.length));var t}function u(n,t){return function(n,t){var r,e,o=h(n),u=[],c=[];for(u[15]=c[15]=void 0,16>shg_sum;pixels[yi+1]=(g_sum*mul_sum)>>shg_sum;pixels[yi+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(yw+((p=x+radius+1)>shg_sum;pixels[p+1]=(g_sum*mul_sum)>>shg_sum;pixels[p+2]=(b_sum*mul_sum)>>shg_sum;r_sum-=r_out_sum;g_sum-=g_out_sum;b_sum-=b_out_sum;r_out_sum-=stackIn.r;g_out_sum-=stackIn.g;b_out_sum-=stackIn.b;p=(x+(((p=y+radiusPlus1) 0.5 ? d / (2 - max - min) : d / (max + min);
224 | switch(max){
225 | case r: h = (g - b) / d + (g < b ? 6 : 0); break;
226 | case g: h = (b - r) / d + 2; break;
227 | case b: h = (r - g) / d + 4; break;
228 | }
229 | h /= 6;
230 | }
231 |
232 | return [h, s, l];
233 | }
234 |
235 | function hslToRgb(h, s, l){
236 | var r, g, b;
237 |
238 | if(s == 0){
239 | r = g = b = l; // achromatic
240 | }else{
241 | var hue2rgb = function hue2rgb(p, q, t){
242 | if(t < 0) t += 1;
243 | if(t > 1) t -= 1;
244 | if(t < 1/6) return p + (q - p) * 6 * t;
245 | if(t < 1/2) return q;
246 | if(t < 2/3) return p + (q - p) * (2/3 - t) * 6;
247 | return p;
248 | }
249 |
250 | var q = l < 0.5 ? l * (1 + s) : l + s - l * s;
251 | var p = 2 * l - q;
252 | r = hue2rgb(p, q, h + 1/3);
253 | g = hue2rgb(p, q, h);
254 | b = hue2rgb(p, q, h - 1/3);
255 | }
256 |
257 | return [Math.round(r * 255), Math.round(g * 255), Math.round(b * 255)];
258 | }
259 |
260 | function lightBlur(hsl) {
261 |
262 | // Adjust the luminance.
263 | let lumCalc = 0.35 + (0.3 / hsl[2]);
264 | if (lumCalc < 1) { lumCalc = 1; }
265 | else if (lumCalc > 3.3) { lumCalc = 3.3; }
266 | const l = hsl[2] * lumCalc;
267 |
268 | // Adjust the saturation.
269 | const colorful = 2 * hsl[1] * l;
270 | const s = hsl[1] * colorful * 1.5;
271 |
272 | return [hsl[0],s,l];
273 |
274 | }
275 |
276 | function darkBlur(hsl) {
277 |
278 | // Adjust the saturation.
279 | const colorful = 2 * hsl[1] * hsl[2];
280 | const s = hsl[1] * (1 - hsl[2]) * 3;
281 |
282 | return [hsl[0],s,hsl[2]];
283 |
284 | }
285 |
286 | // Set up the canvas.
287 | const img = document.getElementById("blurImg");
288 | const canvas = document.getElementById("mainCanvas");
289 |
290 | const w = img.naturalWidth;
291 | const h = img.naturalHeight;
292 |
293 | canvas.style.width = w + "px";
294 | canvas.style.height = h + "px";
295 | canvas.width = w;
296 | canvas.height = h;
297 |
298 | const context = canvas.getContext("2d");
299 | context.clearRect( 0, 0, w, h );
300 | context.drawImage( img, 0, 0 );
301 |
302 | // Get the image data from the context.
303 | var imageData = context.getImageData(0,0,w,h);
304 | var pix = imageData.data;
305 |
306 | var isDark = "${style}" == "dark";
307 | var imageFunc = isDark ? darkBlur : lightBlur;
308 |
309 | for (let i=0; i < pix.length; i+=4) {
310 |
311 | // Convert to HSL.
312 | let hsl = rgbToHsl(pix[i],pix[i+1],pix[i+2]);
313 |
314 | // Apply the image function.
315 | hsl = imageFunc(hsl);
316 |
317 | // Convert back to RGB.
318 | const rgb = hslToRgb(hsl[0], hsl[1], hsl[2]);
319 |
320 | // Put the values back into the data.
321 | pix[i] = rgb[0];
322 | pix[i+1] = rgb[1];
323 | pix[i+2] = rgb[2];
324 |
325 | }
326 |
327 | // Draw over the old image.
328 | context.putImageData(imageData,0,0);
329 |
330 | // Blur the image.
331 | stackBlurCanvasRGB("mainCanvas", 0, 0, w, h, ${blur});
332 |
333 | // Perform the additional processing for dark images.
334 | if (isDark) {
335 |
336 | // Draw the hard light box over it.
337 | context.globalCompositeOperation = "hard-light";
338 | context.fillStyle = "rgba(55,55,55,0.2)";
339 | context.fillRect(0, 0, w, h);
340 |
341 | // Draw the soft light box over it.
342 | context.globalCompositeOperation = "soft-light";
343 | context.fillStyle = "rgba(55,55,55,1)";
344 | context.fillRect(0, 0, w, h);
345 |
346 | // Draw the regular box over it.
347 | context.globalCompositeOperation = "source-over";
348 | context.fillStyle = "rgba(55,55,55,0.4)";
349 | context.fillRect(0, 0, w, h);
350 |
351 | // Otherwise process light images.
352 | } else {
353 | context.fillStyle = "rgba(255,255,255,0.4)";
354 | context.fillRect(0, 0, w, h);
355 | }
356 |
357 | // Return a base64 representation.
358 | canvas.toDataURL();
359 | `
360 |
361 | // Convert the images and create the HTML.
362 | let blurImgData = Data.fromPNG(img).toBase64String()
363 | let html = `
364 |
365 |
366 | `
367 |
368 | // Make the web view and get its return value.
369 | let view = new WebView()
370 | await view.loadHTML(html)
371 | let returnValue = await view.evaluateJavaScript(js)
372 |
373 | // Remove the data type from the string and convert to data.
374 | let imageDataString = returnValue.slice(22)
375 | let imageData = Data.fromBase64String(imageDataString)
376 |
377 | // Convert to image and crop before returning.
378 | let imageFromData = Image.fromData(imageData)
379 | // return cropImage(imageFromData)
380 | return imageFromData
381 | }
382 |
383 |
384 | // Pixel sizes and positions for widgets on all supported phones.
385 | function phoneSizes() {
386 | let phones = {
387 | // 12 and 12 Pro
388 | "2532": {
389 | small: 474,
390 | medium: 1014,
391 | large: 1062,
392 | left: 78,
393 | right: 618,
394 | top: 231,
395 | middle: 819,
396 | bottom: 1407
397 | },
398 |
399 | // 11 Pro Max, XS Max
400 | "2688": {
401 | small: 507,
402 | medium: 1080,
403 | large: 1137,
404 | left: 81,
405 | right: 654,
406 | top: 228,
407 | middle: 858,
408 | bottom: 1488
409 | },
410 |
411 | // 11, XR
412 | "1792": {
413 | small: 338,
414 | medium: 720,
415 | large: 758,
416 | left: 54,
417 | right: 436,
418 | top: 160,
419 | middle: 580,
420 | bottom: 1000
421 | },
422 |
423 |
424 | // 11 Pro, XS, X
425 | "2436": {
426 | small: 465,
427 | medium: 987,
428 | large: 1035,
429 | left: 69,
430 | right: 591,
431 | top: 213,
432 | middle: 783,
433 | bottom: 1353
434 | },
435 |
436 | // Plus phones
437 | "2208": {
438 | small: 471,
439 | medium: 1044,
440 | large: 1071,
441 | left: 99,
442 | right: 672,
443 | top: 114,
444 | middle: 696,
445 | bottom: 1278
446 | },
447 |
448 | // SE2 and 6/6S/7/8
449 | "1334": {
450 | small: 296,
451 | medium: 642,
452 | large: 648,
453 | left: 54,
454 | right: 400,
455 | top: 60,
456 | middle: 412,
457 | bottom: 764
458 | },
459 |
460 |
461 | // SE1
462 | "1136": {
463 | small: 282,
464 | medium: 584,
465 | large: 622,
466 | left: 30,
467 | right: 332,
468 | top: 59,
469 | middle: 399,
470 | bottom: 399
471 | },
472 |
473 | // 11 and XR in Display Zoom mode
474 | "1624": {
475 | small: 310,
476 | medium: 658,
477 | large: 690,
478 | left: 46,
479 | right: 394,
480 | top: 142,
481 | middle: 522,
482 | bottom: 902
483 | },
484 |
485 | // Plus in Display Zoom mode
486 | "2001" : {
487 | small: 444,
488 | medium: 963,
489 | large: 972,
490 | left: 81,
491 | right: 600,
492 | top: 90,
493 | middle: 618,
494 | bottom: 1146
495 | }
496 | }
497 | return phones
498 | }
499 |
500 | var message
501 | message = title || "开始之前,请先前往桌面,截取空白界面的截图。然后回来继续"
502 | let exitOptions = ["我已截图","前去截图 >"]
503 | let shouldExit = await generateAlert(message,exitOptions)
504 | if (shouldExit) return
505 |
506 | // Get screenshot and determine phone size.
507 | let img = await Photos.fromLibrary()
508 | let height = img.size.height
509 | let phone = phoneSizes()[height]
510 | if (!phone) {
511 | message = "好像您选择的照片不是正确的截图,或者您的机型我们暂时不支持。点击确定前往社区讨论"
512 | let _id = await generateAlert(message,["帮助", "取消"])
513 | if (_id===0) Safari.openInApp('https://support.qq.com/products/287371', false)
514 | return
515 | }
516 |
517 | // Prompt for widget size and position.
518 | message = "截图中要设置透明背景组件的尺寸类型是?"
519 | let sizes = ["小尺寸","中尺寸","大尺寸"]
520 | let size = await generateAlert(message,sizes)
521 | let widgetSize = sizes[size]
522 |
523 | message = "要设置透明背景的小组件在哪个位置?"
524 | message += (height == 1136 ? " (备注:当前设备只支持两行小组件,所以下边选项中的「中间」和「底部」的选项是一致的)" : "")
525 |
526 | // Determine image crop based on phone size.
527 | let crop = { w: "", h: "", x: "", y: "" }
528 | if (widgetSize == "小尺寸") {
529 | crop.w = phone.small
530 | crop.h = phone.small
531 | let positions = ["左上角","右上角","中间左","中间右","左下角","右下角"]
532 | let _posotions = ["Top left","Top right","Middle left","Middle right","Bottom left","Bottom right"]
533 | let position = await generateAlert(message,positions)
534 |
535 | // Convert the two words into two keys for the phone size dictionary.
536 | let keys = _posotions[position].toLowerCase().split(' ')
537 | crop.y = phone[keys[0]]
538 | crop.x = phone[keys[1]]
539 |
540 | } else if (widgetSize == "中尺寸") {
541 | crop.w = phone.medium
542 | crop.h = phone.small
543 |
544 | // Medium and large widgets have a fixed x-value.
545 | crop.x = phone.left
546 | let positions = ["顶部","中间","底部"]
547 | let _positions = ["Top","Middle","Bottom"]
548 | let position = await generateAlert(message,positions)
549 | let key = _positions[position].toLowerCase()
550 | crop.y = phone[key]
551 |
552 | } else if(widgetSize == "大尺寸") {
553 | crop.w = phone.medium
554 | crop.h = phone.large
555 | crop.x = phone.left
556 | let positions = ["顶部","底部"]
557 | let position = await generateAlert(message,positions)
558 |
559 | // Large widgets at the bottom have the "middle" y-value.
560 | crop.y = position ? phone.middle : phone.top
561 | }
562 |
563 | // 透明/模糊选项
564 | message = "需要给背景图片加什么显示效果?"
565 | let blurOptions = ["透明", "白色 模糊", "黑色 模糊"]
566 | let blurred = await generateAlert(message, blurOptions)
567 |
568 | // Crop image and finalize the widget.
569 | if (blurred) {
570 | const style = (blurred === 1) ? 'light' : 'dark'
571 | img = await blurImage(img, style)
572 | }
573 | let imgCrop = cropImage(img, new Rect(crop.x,crop.y,crop.w,crop.h))
574 |
575 |
576 | return imgCrop
577 |
578 | }
579 |
580 | /**
581 | * 弹出一个通知
582 | * @param {string} title 通知标题
583 | * @param {string} body 通知内容
584 | * @param {string} url 点击后打开的URL
585 | */
586 | async notify (title, body, url = null, opts = {}) {
587 | let n = new Notification()
588 | n = Object.assign(n, opts);
589 | n.title = title
590 | n.body = body
591 | if (url) n.openURL = url
592 | return await n.schedule()
593 | }
594 |
595 |
596 | /**
597 | * 给图片加一层半透明遮罩
598 | * @param {Image} img 要处理的图片
599 | * @param {string} color 遮罩背景颜色
600 | * @param {float} opacity 透明度
601 | */
602 | async shadowImage (img, color = '#000000', opacity = 0.7) {
603 | let ctx = new DrawContext()
604 | // 获取图片的尺寸
605 | ctx.size = img.size
606 |
607 | ctx.drawImageInRect(img, new Rect(0, 0, img.size['width'], img.size['height']))
608 | ctx.setFillColor(new Color(color, opacity))
609 | ctx.fillRect(new Rect(0, 0, img.size['width'], img.size['height']))
610 |
611 | let res = await ctx.getImage()
612 | return res
613 | }
614 |
615 | /**
616 | * 获取当前插件的设置
617 | * @param {boolean} json 是否为json格式
618 | */
619 | getSettings(json=true){
620 | let res=json?{}:""
621 | let cache=""
622 | // if (global && Keychain.contains(this.SETTING_KEY2)) {
623 | // cache = Keychain.get(this.SETTING_KEY2)
624 | // } else if (Keychain.contains(this.SETTING_KEY)) {
625 | // cache = Keychain.get(this.SETTING_KEY)
626 | // } else if (Keychain.contains(this.SETTING_KEY1)) {
627 | // cache = Keychain.get(this.SETTING_KEY1)
628 | // } else if (Keychain.contains(this.SETTING_KEY2)){
629 | if (Keychain.contains(this.SETTING_KEY)) {
630 | cache= Keychain.get(this.SETTING_KEY)
631 | }
632 | if (json){
633 | try {
634 | res=JSON.parse(cache)
635 | } catch (e) {}
636 | }else{
637 | res=cache
638 | }
639 |
640 | return res
641 | }
642 |
643 | /**
644 | * 存储当前设置
645 | * @param {bool} notify 是否通知提示
646 | */
647 | saveSettings(notify=true){
648 | let res= (typeof this.settings==="object")?JSON.stringify(this.settings):String(this.settings)
649 | Keychain.set(this.SETTING_KEY, res)
650 | if (notify) this.notify("设置成功","桌面组件稍后将自动刷新")
651 | }
652 |
653 | /**
654 | * 获取当前插件是否有自定义背景图片
655 | * @reutrn img | false
656 | */
657 | getBackgroundImage () {
658 | // 如果有KEY则优先加载,key>key1>key2
659 | // key2是全局
660 | let result = null
661 | if (this.FILE_MGR_LOCAL.fileExists(this.BACKGROUND_KEY)) {
662 | result = Image.fromFile(this.BACKGROUND_KEY)
663 | // } else if (this.FILE_MGR_LOCAL.fileExists(this.BACKGROUND_KEY1)) {
664 | // result = Image.fromFile(this.BACKGROUND_KEY1)
665 | // } else if (this.FILE_MGR_LOCAL.fileExists(this.BACKGROUND_KEY2)) {
666 | // result = Image.fromFile(this.BACKGROUND_KEY2)
667 | }
668 | return result
669 | }
670 |
671 | /**
672 | * 设置当前组件的背景图片
673 | * @param {image} img
674 | */
675 | setBackgroundImage (img, notify = true) {
676 | if (!img) {
677 | // 移除背景
678 | if (this.FILE_MGR_LOCAL.fileExists(this.BACKGROUND_KEY)) {
679 | this.FILE_MGR_LOCAL.remove(this.BACKGROUND_KEY)
680 | // } else if (this.FILE_MGR_LOCAL.fileExists(this.BACKGROUND_KEY1)) {
681 | // this.FILE_MGR_LOCAL.remove(this.BACKGROUND_KEY1)
682 | // } else if (this.FILE_MGR_LOCAL.fileExists(this.BACKGROUND_KEY2)) {
683 | // this.FILE_MGR_LOCAL.remove(this.BACKGROUND_KEY2)
684 | }
685 | if (notify) this.notify("移除成功", "小组件背景图片已移除,稍后刷新生效")
686 | } else {
687 | // 设置背景
688 | // 全部设置一遍,
689 | this.FILE_MGR_LOCAL.writeImage(this.BACKGROUND_KEY, img)
690 | // this.FILE_MGR_LOCAL.writeImage(this.BACKGROUND_KEY1, img)
691 | // this.FILE_MGR_LOCAL.writeImage(this.BACKGROUND_KEY2, img)
692 | if (notify) this.notify("设置成功", "小组件背景图片已设置!稍后刷新生效")
693 | }
694 | }
695 |
696 | }
697 | // @base.end
698 | // 运行环境
699 | // @running.start
700 | const Running = async (Widget, default_args = "") => {
701 | let M = null
702 | // 判断hash是否和当前设备匹配
703 | if (config.runsInWidget) {
704 | M = new Widget(args.widgetParameter || '')
705 | const W = await M.render()
706 | Script.setWidget(W)
707 | Script.complete()
708 | } else {
709 | let { act, data, __arg, __size } = args.queryParameters
710 | M = new Widget(__arg || default_args || '')
711 | if (__size) M.init(__size)
712 | if (!act || !M['_actions']) {
713 | // 弹出选择菜单
714 | const actions = M['_actions']
715 | const _actions = []
716 | const alert = new Alert()
717 | alert.title = M.name
718 | alert.message = M.desc
719 |
720 | for (let _ in actions) {
721 | alert.addAction(_)
722 | _actions.push(actions[_])
723 | }
724 | alert.addCancelAction("取消操作")
725 | const idx = await alert.presentSheet()
726 | if (_actions[idx]) {
727 | const func = _actions[idx]
728 | await func()
729 | }
730 | return
731 | }
732 | let _tmp = act.split('-').map(_ => _[0].toUpperCase() + _.substr(1)).join('')
733 | let _act = `action${_tmp}`
734 | if (M[_act] && typeof M[_act] === 'function') {
735 | const func = M[_act].bind(M)
736 | await func(data)
737 | }
738 | }
739 | }
740 | // @running.end
741 |
742 | // 测试环境
743 | const Testing = async (Widget, default_args = "") => {
744 | let M = null
745 | // 判断hash是否和当前设备匹配
746 | if (config.runsInWidget) {
747 | M = new Widget(args.widgetParameter || '')
748 | const W = await M.render()
749 | Script.setWidget(W)
750 | Script.complete()
751 | } else {
752 | let { act, data, __arg, __size } = args.queryParameters
753 | M = new Widget(__arg || default_args || '')
754 | if (__size) M.init(__size)
755 | if (!act || !M['_actions']) {
756 | // 弹出选择菜单
757 | const actions = M['_actions']
758 | const _actions = [
759 | // 远程开发
760 | async () => {
761 | // 1. 获取服务器ip
762 | const a = new Alert()
763 | a.title = "服务器 IP"
764 | a.message = "请输入远程开发服务器(电脑)IP地址"
765 | let xjj_debug_server = "192.168.1.3"
766 | if (Keychain.contains("xjj_debug_server")) {
767 | xjj_debug_server = Keychain.get("xjj_debug_server")
768 | }
769 | a.addTextField("server-ip", xjj_debug_server)
770 | a.addAction("连接")
771 | a.addCancelAction("取消")
772 | const id = await a.presentAlert()
773 | if (id === -1) return
774 | const ip = a.textFieldValue(0)
775 | // 保存到本地
776 | Keychain.set("xjj_debug_server", ip)
777 | const server_api = `http://${ip}:5566`
778 | // 2. 发送当前文件到远程服务器
779 | const SELF_FILE = module.filename.replace('「小件件」开发环境', Script.name())
780 | const req = new Request(`${server_api}/sync`)
781 | req.method = "POST"
782 | req.addFileToMultipart(SELF_FILE, "Widget", Script.name())
783 | try {
784 | const res = await req.loadString()
785 | if (res !== "ok") {
786 | return M.notify("连接失败", res)
787 | }
788 | } catch (e) {
789 | return M.notify("连接错误", e.message)
790 | }
791 | M.notify("连接成功", "编辑文件后保存即可进行下一步预览操作")
792 | // 重写console.log方法,把数据传递到nodejs
793 | const rconsole_log = async (data, t = 'log') => {
794 | const _req = new Request(`${server_api}/console`)
795 | _req.method = "POST"
796 | _req.headers = {
797 | 'Content-Type': 'application/json'
798 | }
799 | _req.body = JSON.stringify({
800 | t,
801 | data
802 | })
803 | return await _req.loadString()
804 | }
805 | const lconsole_log = console.log.bind(console)
806 | const lconsole_warn = console.warn.bind(console)
807 | const lconsole_error = console.error.bind(console)
808 | console.log = d => {
809 | lconsole_log(d)
810 | rconsole_log(d, 'log')
811 | }
812 | console.warn = d => {
813 | lconsole_warn(d)
814 | rconsole_log(d, 'warn')
815 | }
816 | console.error = d => {
817 | lconsole_error(d)
818 | rconsole_log(d, 'error')
819 | }
820 | // 3. 同步
821 | while (1) {
822 | let _res = ""
823 | try {
824 | const _req = new Request(`${server_api}/sync?name=${encodeURIComponent(Script.name())}`)
825 | _res = await _req.loadString()
826 | } catch (e) {
827 | M.notify("停止调试", "与开发服务器的连接已终止")
828 | break
829 | }
830 | if (_res === "stop") {
831 | console.log("[!] 停止同步")
832 | break
833 | } else if (_res === "no") {
834 | // console.log("[-] 没有更新内容")
835 | } else if (_res.length > 0) {
836 | M.notify("同步成功", "新文件已同步,大小:" + _res.length)
837 | // 重新加载组件
838 | // 1. 读取当前源码
839 | const _code = _res.split('// @组件代码开始')[1].split('// @组件代码结束')[0]
840 | // 2. 解析 widget class
841 | let NewWidget = null
842 | try {
843 | const _func = new Function(`const _Debugger = Base => {\n${_code}\nreturn Widget\n}\nreturn _Debugger`)
844 | NewWidget = _func()(Base)
845 | } catch (e) {
846 | M.notify("解析失败", e.message)
847 | }
848 | if (!NewWidget) continue;
849 | // 3. 重新执行 widget class
850 | delete M;
851 | M = new NewWidget(__arg || default_args || '')
852 | if (__size) M.init(__size)
853 | // 写入文件
854 | FileManager.local().writeString(SELF_FILE, _res)
855 | // 执行预览
856 | let i = await _actions[1](true)
857 | if (i === (4+Object.keys(actions).length)) break
858 | }
859 | }
860 | },
861 | // 预览组件
862 | async (debug = false) => {
863 | let a = new Alert()
864 | a.title = "预览组件"
865 | a.message = "测试桌面组件在各种尺寸下的显示效果"
866 | a.addAction("小尺寸 Small")
867 | a.addAction("中尺寸 Medium")
868 | a.addAction("大尺寸 Large")
869 | a.addAction("全部 All")
870 | a.addCancelAction("取消操作")
871 | const funcs = []
872 | if (debug) {
873 | for (let _ in actions) {
874 | a.addAction(_)
875 | funcs.push(actions[_].bind(M))
876 | }
877 | a.addDestructiveAction("停止调试")
878 | }
879 | let i = await a.presentSheet()
880 | if (i === -1) return
881 | let w
882 | switch (i) {
883 | case 0:
884 | M.widgetFamily = 'small'
885 | w = await M.render()
886 | await w.presentSmall()
887 | break;
888 | case 1:
889 | M.widgetFamily = 'medium'
890 | w = await M.render()
891 | await w.presentMedium()
892 | break
893 | case 2:
894 | M.widgetFamily = 'large'
895 | w = await M.render()
896 | await w.presentLarge()
897 | break
898 | case 3:
899 | M.widgetFamily = 'small'
900 | w = await M.render()
901 | await w.presentSmall()
902 | M.widgetFamily = 'medium'
903 | w = await M.render()
904 | await w.presentMedium()
905 | M.widgetFamily = 'large'
906 | w = await M.render()
907 | await w.presentLarge()
908 | break
909 | default:
910 | const func = funcs[i - 4];
911 | if (func) await func();
912 | break;
913 | }
914 |
915 | return i
916 | },
917 | // 复制源码
918 | async () => {
919 | const SELF_FILE = module.filename.replace('「小件件」开发环境', Script.name())
920 | const source = FileManager.local().readString(SELF_FILE)
921 | Pasteboard.copyString(source)
922 | await M.notify("复制成功", "当前脚本的源代码已复制到剪贴板!")
923 | },
924 | async () => {
925 | Safari.openInApp("https://www.kancloud.cn/im3x/scriptable/content", false)
926 | },
927 | async () => {
928 | Safari.openInApp("https://support.qq.com/products/287371", false)
929 | }
930 | ]
931 | const alert = new Alert()
932 | alert.title = M.name
933 | alert.message = M.desc
934 | alert.addAction("远程开发")
935 | alert.addAction("预览组件")
936 | alert.addAction("复制源码")
937 | alert.addAction("开发文档")
938 | alert.addAction("反馈交流")
939 | for (let _ in actions) {
940 | alert.addAction(_)
941 | _actions.push(actions[_])
942 | }
943 | alert.addCancelAction("取消操作")
944 | const idx = await alert.presentSheet()
945 | if (_actions[idx]) {
946 | const func = _actions[idx]
947 | await func()
948 | }
949 | return
950 | }
951 | let _tmp = act.split('-').map(_ => _[0].toUpperCase() + _.substr(1)).join('')
952 | let _act = `action${_tmp}`
953 | if (M[_act] && typeof M[_act] === 'function') {
954 | const func = M[_act].bind(M)
955 | await func(data)
956 | }
957 | }
958 | }
959 |
960 | module.exports = {
961 | Base,
962 | Testing,
963 | Running,
964 | }
965 |
966 | // 自更新
967 | // 流程:
968 | // 1. 获取远程gitee仓库的本文件代码
969 | // 2. 对比sha,如果和本地存储的不一致,则下载
970 | // 3. 下载保存,存储sha
971 | // 4. 更新时间为每小时一次
972 | //
973 | ;(async () => {
974 | const UPDATE_KEY = "XJJ_UPDATE_AT"
975 | let UPDATED_AT = 0
976 | const UPDATE_FILE = '「小件件」开发环境.js'
977 | const FILE_MGR = FileManager[module.filename.includes('Documents/iCloud~') ? 'iCloud' : 'local']()
978 | if (Keychain.contains(UPDATE_KEY)) {
979 | UPDATED_AT = parseInt(Keychain.get(UPDATE_KEY))
980 | }
981 | if (UPDATED_AT > (+new Date - 1000*60*60)) return console.warn('[-] 1 小时内已检查过更新')
982 | console.log('[*] 检测开发环境是否有更新..')
983 | const req = new Request('https://gitee.com/im3x/Scriptables/raw/v2-dev/package.json')
984 | const res = await req.loadJSON()
985 | console.log(`[+] 远程开发环境版本:${res['runtime_ver']}`)
986 | if (res['runtime_ver'] === RUNTIME_VERSION) return console.warn('[-] 远程版本一致,暂无更新')
987 | console.log('[+] 开始更新开发环境..')
988 | const REMOTE_REQ = new Request('https://gitee.com/im3x/Scriptables/raw/v2-dev/Scripts/%E3%80%8C%E5%B0%8F%E4%BB%B6%E4%BB%B6%E3%80%8D%E5%BC%80%E5%8F%91%E7%8E%AF%E5%A2%83.js')
989 | const REMOTE_RES = await REMOTE_REQ.load()
990 | FILE_MGR.write(FILE_MGR.joinPath(FILE_MGR.documentsDirectory(), UPDATE_FILE), REMOTE_RES);
991 | const n = new Notification()
992 | n.title = "更新成功"
993 | n.body = "「小件件」开发环境已自动更新!"
994 | n.schedule()
995 | UPDATED_AT = +new Date
996 | Keychain.set(UPDATE_KEY, String(UPDATED_AT))
997 | })()
--------------------------------------------------------------------------------