diff --git a/.babelrc b/.babelrc deleted file mode 100644 index 3cc8597..0000000 --- a/.babelrc +++ /dev/null @@ -1,47 +0,0 @@ -{ - "plugins": [ - "transform-class-properties", - "transform-export-extensions", - "transform-object-rest-spread", - [ - "transform-runtime", - { - "polyfill": false - } - ] - ], - "presets": [ - [ - "env", - { - "targets": { - "browsers": [ - "last 2 versions", - "IE 11" - ] - }, - "modules": false - } - ] - ], - "sourceMaps": "inline", - "env": { - "server": { - "plugins": [ - "transform-class-properties", - "transform-export-extensions", - "transform-object-rest-spread", - [ - "transform-runtime", - { - "polyfill": false - } - ] - ], - "presets": [ - "es2015" - ], - "sourceMaps": "inline" - } - } - } \ No newline at end of file diff --git a/.eslintignore b/.eslintignore index 34e6ec3..f06235c 100644 --- a/.eslintignore +++ b/.eslintignore @@ -1,2 +1,2 @@ node_modules -lib/app/libs +dist diff --git a/.eslintrc.yml b/.eslintrc.yml index 1c8d63e..c07b113 100644 --- a/.eslintrc.yml +++ b/.eslintrc.yml @@ -13,11 +13,14 @@ env: browser: true rules: + # no-undef: 0 prettier/prettier: - error - trailingComma: es5 singleQuote: true semi: false + no-var: 2 + prefer-const: 2 # TODO: The following rules should be removed incrementally in order to fully # integrate lint rules from the Standard ESLint config and Prettier diff --git a/.gitignore b/.gitignore index 40b878d..6e4ab98 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,3 @@ -node_modules/ \ No newline at end of file +node_modules/ +dist +.flamebirdrc \ No newline at end of file diff --git a/.travis.yml b/.travis.yml index 867f1b1..5342fa8 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,21 +1,60 @@ language: node_js -branches: - only: - - master node_js: - "node" + cache: - yarn: true directories: - - "node_modules" + - "node_modules" + before_install: - - echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc + - export PACKAGE_VERSION=$(node -p "require('./package.json').version") + - export NPM_REMOTE_VERSION=$(npm view flamebird version) + - export PACKAGE_NAME=$(node -p "require('./package.json').name") + - export BRANCH_IS_TAG=$(node -p "/^([0-9].[0-9].[0-9]+((-(alpha|beta))|))$/.test('${TRAVIS_BRANCH}')") + - export PROJECT_NAME="acacode/flamebird" + - export RELEASE_BODY=$(node -p "'[Click here to find current release changes](https://github.com/$PROJECT_NAME/blob/$TRAVIS_BRANCH/CHANGELOG.md)'") + install: - - yarn -script: - - yarn lint-js - - yarn build-prod -after_success: - - if [ ${TRAVIS_BRANCH} = "master" ] && [ "${TRAVIS_PULL_REQUEST}" = "false" ];then - npm publish; - fi + - npm ci + +jobs: + include: + - stage: pre-test(lint,audit) + script: + - npm audit + - npm run lint + - stage: test + script: + - npm run build + - npm run test + - stage: publish + if: env(BRANCH_IS_TAG) != true AND branch = master AND type = push + name: "Create Github Release" + before_deploy: + - git config --global user.email "builds@travis-ci.com" + - git config --global user.name "Travis CI" + - git tag $PACKAGE_VERSION -a -m "Generated tag from TravisCI for build $TRAVIS_BUILD_NUMBER from $TRAVIS_BRANCH" + - git push -q https://$GITHUB_TOKEN@github.com/$PROJECT_NAME --tags + - zip -r release.zip dist flamebird.js LICENSE postinstall.js README.md client server package-lock.json package.json + - ls -l + deploy: + provider: releases + name: "Release ${PACKAGE_VERSION}" + body: "$RELEASE_BODY" + overwrite: true + skip_cleanup: true + api_key: + secure: ${GITHUB_TOKEN} + file: + - release.zip + on: + all_branches: true + repo: $PROJECT_NAME + after_deploy: + - echo "//registry.npmjs.org/:_authToken=\${NPM_TOKEN}" > .npmrc + - npm publish + +notifications: + slack: + rooms: + secure: oEsx4yOk0AkiYMrjhDbKzh7mJIHd/Rn1Y+C86bmxGxCbAc/VuAM1pRfk/A3o7I0QwDzFZ1XCZrHT1VsYDj4ypFaJb8pCtwOU0pv+mseGlcYOvtV5NgQMBM3HQvx9+9iF8sLXg1glzToNkd8iBkbNxEgg6EEeBdX3mD7QX04xl4Mgl259gofN1pOxP3LwHKkKcZgeS6MAEfWhBG/a8poAccvusgn75wNZ1qyI+ZPYtQ75JK4QieJzmxTHPr2gGhq1EwRWYIjjyIEA4ofQpjWyzy0U6OQKBxwPaH+GM+Vn6hhp5JOenmiIslUZmzgyXL233Iu4iMvh1AiLJvB7AIBDilA3CYvCzM5uQVyKqiNFMrkcBRZgE3FCAaYYcpfr+k+3wO3HGstvcW+xxB3EdOGfXuI6Bu31k6kQQjXTZnYCGXgH4b+s+CkknOt04VXMxwPaQNjwb7+2HZt7En0kCAcswCB2ZYekfwJ8ps+ahlKGDbPEgg/vYAPV0JqwY4gEGFOthe3MhHDzpnjm6udpItlYrlcqzV4w4b3LEOgc5AomrQRD+SPdFHwvUjtjyDjyhdPNK9QixCIPW55njCssCJOi5kwq74zr3eVvqD8ijmUdfL6ASu1113fs/4k58mX4GwEkmMicThLg01aoppd3IWTc//bsYOLC+AbC8cAm9JZZWHA= diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..fd3430d --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,14 @@ +{ + // Use IntelliSense to learn about possible attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "attach", + "name": "Attach by Process ID", + "processId": "${command:PickProcess}" + } + ] +} \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md index 247cc82..b7f621d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -2,7 +2,60 @@ # Changelog -## [2.1.4] - 06.12.2018 +## [3.0.0-alpha] - {date} + +Improvenments: + - command `fb web` will have only one instance of NodeJS application. + First call `fb web -p SOME_PORT` create a server hosted on port `SOME_PORT`. + But call `fb web` inside another project will not create a new server + But instead of this you can see all your running projects looking at `localhost:SOME_PORT` + + +### Added +- `web` [internal] changed webpack configuration for web client +- `web` new options: + - `-i, --ignore-trs` (in previous version it used by default) + Allows to launch tasks without yarn or npm ( use absolute paths: webpack -> node_modules/.bin/webpack ) + default: `false` + - `-r, --task-runner ` + Allows to use another task runner for launch tasks. By default will use npm ( For example: -r yarn ) + default: `'npm'` + - `-w, --without-browser` + This option disable opening the new tab in Google Chrome browser + default: `false` + - `-s, --sort-by-name` + This option using to sort all commands by name (asc) + default: `false` +- `cmd` new options: + - `-i, --ignore-trs` (in previous version it used by default) + Allows to launch tasks without yarn or npm ( use absolute paths: webpack -> node_modules/.bin/webpack ) + default: `false` + - `-r, --task-runner ` + Allows to use another task runner for launch tasks. By default will use npm ( For example: -r yarn ) + default: `'npm'` + +### Changed +- [internal] fully refactored code on nodeJS and web view +- Option prefix from `-j, --procfile ` to `-f, --procfile ` +- [web] changed API endpoints: + - `POST:/run/${taskId}` -> `POST:/${configId}/${taskId}/run` + - `POST:/stop/${taskId}` -> `POST:/${configId}/${taskId}/stop` + - `POST:/clear-logs/${taskId}` -> `DELETE/${configId}/${taskId}/logs` + - `GET:/logs/${taskId}` -> `GET:/${configId}/${taskId}/logs` + - `POST:/update-envs({ id: string, envs: object})` -> `PUT:/${configId}/${taskId}/envs(envs:object)` + + +### Fixed +- Problems linked with running flamebird without `node_modules` folder + +### Removed +- Removed default usage experimental converting npm/yarn run scripts to the absolute paths +- [web] + - `/run-all` API endpoint + - `/stop-all` API endpoint + + +## [2.1.4] - 12/06/2018 ### Added - `web` hotkey feautures @@ -25,7 +78,7 @@ - typo fixes in `README.md` -## [2.0.0] - 01.12.2018 +## [2.0.0] - 12/01/2018 ### Changed - `web` replaced web http-client `axios` to `kinka` @@ -124,7 +177,7 @@ ### Fixed - fixed webpack build after installing npm packages -## [1.7.0] - 2018-05-13 +## [1.7.0] - 13/05/2018 ### Changed - refactoring code in frontend part of application @@ -156,7 +209,7 @@ ### Removed - removed option `-p, --package` -## [1.5.5] - 2018-04-23 +## [1.5.5] - 04/23/2018 ### Changed - working status of the tasks dependent on the server's status of task @@ -168,7 +221,7 @@ - fb web: UnhandledPromiseRejectionWarning: Error: spawn chrome ENOENT [BUG](https://github.com/acacode/flamebird/issues/2) -## [1.5.3] - 2018-04-21 +## [1.5.3] - 04/21/2018 ### Added - option `-n, --name ` for the `web` command. Sets the name of application @@ -179,7 +232,7 @@ - route `commands` renamed to `info` and now returns object with properties `appName` and `commands` -## [1.5.0] - 2018-04-21 +## [1.5.0] - 04/21/2018 ### Added - `fb` - additional command name for the calling flamebird @@ -189,7 +242,7 @@ - option `-P, --port ` for `web` command. Sets the server port. By default 5050 value -## [1.0.0] - 2018-04-18 +## [1.0.0] - 04/18/2018 ### Added - command `flamebird start` for the launching all commands in Procfile diff --git a/LICENSE b/LICENSE index aa33468..985ae05 100644 --- a/LICENSE +++ b/LICENSE @@ -1,6 +1,6 @@ MIT License -Copyright (c) 2018-present Sergey Volkov +Copyright (c) 2018-present acacode Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the diff --git a/Procfile b/Procfile new file mode 100644 index 0000000..73d9b30 --- /dev/null +++ b/Procfile @@ -0,0 +1 @@ +client: nodemon --exec \"npm run client:dev\" --watch client -V diff --git a/README.md b/README.md index 5ba9ba0..c3fd269 100644 --- a/README.md +++ b/README.md @@ -1,6 +1,6 @@
- +

@@ -67,6 +67,90 @@ hotkey | action SHIFT + A | Run all tasks SHIFT + S | Stop all tasks + +

How it looks:

+ +![](assets/web-ui-screen.png) + + + +## Contribution + + +If you want to help this project you need to read this part of readme.md for more detail understanding of for what some things are needed. + +First of all take a look at project structure: + +- **flamebird project** + - [flamebird.js](./flamebird.js) - Executable by nodejs file when call `fb start`/`fb web`. Describe information about commands `web` and `start`. + - [LICENSE](./LICENSE) + - [nodemon.json](./nodemon.json) - Nodemon config file. Only needed for debug flamebird. + - [node_modules](./node_modules) - you know what is that :D + - [package-lock.json](./package-lock.json) + - [package.json](./package.json) + - [postinstall.js](./postinstall.js) - Script which execute after installing flamebird dependencies + - [Procfile](./Procfile) - List of scripts which execute via nodemon. Only needed for debug flamebird. + - [README.md](./README.md) + - [webpack.config.js](./webpack.config.js) + - [babel.config.js](./babel.config.js) + - [CHANGELOG.md](./CHANGELOG.md) + - __assets__ + - [task_button.png](./assets/task_button.png) + - [hotkeys_button.png](./assets/hotkeys_button.png) + - [web-ui-screen.png](./assets/web-ui-screen.png) + - __client__ Client application ⚡️ + - __controllers__ - folder with controllers where each one have specific UI manipulations + - [Header.js](./client/controllers/Header.js) + - __assets__ - folder with assets + - [logo.psd](./client/assets/logo.psd) - source of the flamebird logo + - [logo.png](./client/assets/logo.png) + - [logo2_small.png](./client/assets/logo2_small.png) + - [logo2.png](./client/assets/logo2.png) + - [logo2_transparent.png](./client/assets/logo2_transparent.png) + - __helpers__ - folder with helpers where helper contains specific logic. In future it will be removed or moved into modules in `scripts` folder. + - [dom_utils.js](./client/helpers/dom_utils.js) + - [hotKeys.js](./client/helpers/hotKeys.js) + - [tabs.js](./client/helpers/tabs.js) + - [taskList.js](./client/helpers/taskList.js) + - [WindowAttached.js](./client/helpers/WindowAttached.js) + - [global.js](./client/global.js) - global file which implement pattern Facade and combine all interactions of modules from `scripts` folder. + - [index.html](./client/index.html) + - [medium-screens.css](./client/medium-screens.css) + - __scripts__ - Bunch of modules which needed for web application. + - [Api.js](./client/scripts/Api.js) - Contains all API endpoints which needed for client. It uses `kinka` as http web client. + - [Configs.js](./client/scripts/Configs.js) - Responsible for update configs list + - [HotKeys.js](./client/scripts/HotKeys.js) - Hot keys + - [Tabs.js](./client/scripts/Tabs.js) - Module which responsible for update tabs list. + - [TaskList.js](./client/scripts/TaskList.js) - Module which responsible for update tasks list. + - [ThemeSwitcher.js](./client/scripts/ThemeSwitcher.js) - Module which responsible for theme switching. + - [WebLogger.js](./client/scripts/WebLogger.js) - Logger module. Output logs into the logs container + - [WebSocket.js](./client/scripts/WebSocket.js) - WebSocket client connection + - [small-screens.css](./client/small-screens.css) + - __styles__ + - [dark-theme.css](./client/styles/dark-theme.css) + - [fullscreen.css](./client/styles/fullscreen.css) + - [hot_keys-shortcuts.css](./client/styles/hot_keys-shortcuts.css) + - [styles.css](./client/styles.css) + - __dist__ - client build folder + - __server__ Server application ⚡️ + - [config.js](./server/config.js) - module which working with configuration file (`.flamebirdrc`) + - [constants.js](./server/constants.js) - module which contains constant values. It usings on both sides (client, server) + - [processWorker.js](./server/processWorker.js) - module which responsible for run/stop tasks + - [server.js](./server/server.js) - [`Web version`] module which contains API endpoints. + - __utils__ - bunch of utilities 😊 + - [colors.js](./server/utils/colors.js) - tools which colorize console output + - [commands.js](./server/utils/commands.js) - tools which needed for CRUD commands + - [emitter.js](./server/utils/emitter.js) - instance of `events.EventEmitter`. + - [envs.js](./server/utils/envs.js) - tools which needed for parse environment variables + - [mem_cache.js](./server/utils/mem_cache.js) - just simple object which save all information. Have methods `get`, `set` + - [processes.js](./server/utils/processes.js) - tools which needed for create and kill processes + - [ws.js](./server/ws.js) - [`Web version`] Websocket connection + - [taskfile.js](./server/taskfile.js) - module which parse all commands from `Procfile` and `package.json` + + + + + ## 📝 License Licensed under the [MIT License](./LICENSE). diff --git a/assets/web-ui-screen.png b/assets/web-ui-screen.png new file mode 100644 index 0000000..db59dff Binary files /dev/null and b/assets/web-ui-screen.png differ diff --git a/babel.config.js b/babel.config.js new file mode 100644 index 0000000..790eb9c --- /dev/null +++ b/babel.config.js @@ -0,0 +1,26 @@ +/* eslint-disable */ + + +module.exports = { + "sourceMaps": true, + "presets": [ + [ + "@babel/preset-env", + { + "targets": { + "browsers": ["last 2 versions"] + }, + "modules": "commonjs" + }, + ] + ], + "ignore": [/[\/\\]core-js/, /@babel[\/\\]runtime/], + "plugins": [ + "@babel/plugin-transform-runtime", + "@babel/plugin-syntax-dynamic-import", + "@babel/plugin-proposal-class-properties", + "@babel/plugin-proposal-export-default-from", + "@babel/plugin-proposal-export-namespace-from", + "@babel/plugin-proposal-object-rest-spread" + ] +} \ No newline at end of file diff --git a/lib/app/logo.png b/client/assets/logo.png similarity index 100% rename from lib/app/logo.png rename to client/assets/logo.png diff --git a/lib/app/logo.psd b/client/assets/logo.psd similarity index 100% rename from lib/app/logo.psd rename to client/assets/logo.psd diff --git a/lib/app/logo2.png b/client/assets/logo2.png similarity index 100% rename from lib/app/logo2.png rename to client/assets/logo2.png diff --git a/lib/app/logo2_small.png b/client/assets/logo2_small.png similarity index 100% rename from lib/app/logo2_small.png rename to client/assets/logo2_small.png diff --git a/lib/app/logo2_transparent.png b/client/assets/logo2_transparent.png similarity index 100% rename from lib/app/logo2_transparent.png rename to client/assets/logo2_transparent.png diff --git a/client/controllers/Header.js b/client/controllers/Header.js new file mode 100644 index 0000000..79c9e29 --- /dev/null +++ b/client/controllers/Header.js @@ -0,0 +1,101 @@ +import $ from 'jquery' +import WindowAttached from '../helpers/WindowAttached' +import ThemeSwitcher, { THEMES } from '../scripts/ThemeSwitcher' +import { toggleClass, el as getEl } from '../helpers/dom_utils' + +export class Header extends WindowAttached('header') { + themeSwitcher = new ThemeSwitcher({ + onSwitchTheme: newTheme => { + $('.toggle.color').toggleClass('active', newTheme === THEMES.DARK) + }, + }) + + deps = { + hotkeys: null, + } + + configShowed = false + fullscreen = !!localStorage.getItem('fullscreen') + hotKeysEnabled = !!localStorage.getItem('hotkeys') + notificationsEnabled = !!localStorage.getItem('notifications') + + constructor({ hotkeys }) { + super() + + this.deps.hotkeys = hotkeys + + $(document).ready(() => { + this.themeSwitcher.setTheme(localStorage.getItem('theme') || 'white') + + this.updateFullscreen() + this.updateHotkeys() + this.updateNotifications() + + window.addEventListener('click', () => { + if (this.configShowed) { + this.handleTitleClick(false) + } + }) + }) + } + + handleThemeIconClick = () => { + this.themeSwitcher.switchTheme() + } + + handleResizeIconClick = () => { + this.fullscreen = !this.fullscreen + this.updateFullscreen() + } + + handleNotificationsIconClick = () => { + this.notificationsEnabled = !this.notificationsEnabled + this.updateNotifications() + } + + handleTitleClick = overrideFlag => { + if (typeof overrideFlag === 'boolean') { + this.configShowed = overrideFlag + } else { + this.configShowed = !this.configShowed + window.event.stopPropagation() + } + document.body.setAttribute('config', this.configShowed ? 'show' : 'hide') + } + + handleKeyboardIconClick = () => { + this.hotKeysEnabled = !this.hotKeysEnabled + this.updateHotkeys() + } + + updateNotifications() { + toggleClass( + getEl('.main-button.notifications'), + 'active', + this.notificationsEnabled + ) + if (this.notificationsEnabled) { + localStorage.setItem('notifications', true) + } else { + delete localStorage.notifications + $('.task.updated').removeClass('updated') + } + } + + updateFullscreen() { + toggleClass(getEl('.main-button.resize'), 'active', this.fullscreen) + + if (this.fullscreen) { + localStorage.setItem('fullscreen', true) + document.body.setAttribute('fullscreen', 'true') + } else { + document.body.removeAttribute('fullscreen') + delete localStorage.fullscreen + } + } + + updateHotkeys() { + toggleClass(getEl('.main-button.hot-keys'), 'active', this.hotKeysEnabled) + this.deps.hotkeys.triggerEnabled(this.hotKeysEnabled) + } +} diff --git a/client/global.js b/client/global.js new file mode 100644 index 0000000..f7d98a3 --- /dev/null +++ b/client/global.js @@ -0,0 +1,302 @@ +import _ from 'lodash' +import $ from 'jquery' +import api from './scripts/Api' +import TaskList from './scripts/TaskList' +import WebLogger from './scripts/WebLogger' +import HotKeys from './scripts/HotKeys' +import { el as getEl } from './helpers/dom_utils' +import Tabs from './scripts/Tabs' +import WindowAttached from './helpers/WindowAttached' +import { clearifyEvent } from './helpers/hotKeys' +import { Header } from './controllers/Header' +import WebSocket from './scripts/WebSocket' +import ConfigsManager from './scripts/Configs' + +export const DEFAULT_PROJECT_NAME = 'flamebird' + +class Global extends WindowAttached('global') { + watchTaskLogsScrollTop = true + setTheme + previousEnvs = null + projectName = DEFAULT_PROJECT_NAME + pageIsNotActive = false + + configsManager = new ConfigsManager('.configs-list', { + // TODO: fix config as undefined + onSetConfig: config => this.handleConfigSet(config), + getConfigs: async () => { + const { + data: { configs }, + } = await api.getProjectInfo() + return configs || [] + }, + onRemoveConfig: config => { + const activeConfig = this.configsManager.getActiveConfig() + + // TODO: fix activeConfig as undefined + if (activeConfig.id === config.id) { + this.configsManager.setConfig(0) + } + this.stopAllTasks(config) + api.removeConfig(config.id) + }, + }) + + logger + taskList = null + hotkeys = new HotKeys({ + tab: event => { + clearifyEvent(event) + Tabs.setNextAsActive() + return false + }, + arrowUp: () => this.logger.scrollTo('bottom', 0, 40), + arrowDown: () => this.logger.scrollTo('top', 0, 40), + del: () => this.clearLogs(), + shiftA: () => this.runAllTasks(), + shiftS: () => this.stopAllTasks(), + shiftR: () => { + const activeTask = this.taskList.getActive() + + if (!activeTask.isLaunching) { + if (activeTask.isRun) { + this.stopTask(activeTask) + } else { + this.runTask(activeTask) + } + } + }, + shiftArrowUp: () => this.logger.scrollTo('top', '1500'), + shiftArrowDown: () => this.logger.scrollTo('bottom', '500'), + }) + + header = new Header({ hotkeys: this.hotkeys }) + + showTaskList() { + $(document.body).toggleClass('task-list-showed') + } + + handleConfigSet = ({ commands, name }) => { + this.setProjectName(name) + + if (this.taskList) { + this.taskList.initalizeTasks(commands) + } else { + this.taskList = new TaskList(getEl('#task-list'), commands, { + onOpenTask: this.openTask, + onRunTask: this.runTask, + onStopTask: this.stopTask, + onCreateTaskEl: this.onCreateTaskEl, + }) + } + } + + runAllTasks(config = this.configsManager.getActiveConfig()) { + _.each( + this.taskList.getAllFromActiveTab({ isRun: false }), + ({ isRun, id, isActive }) => { + this.taskList.updateTask(id, { isRun, isActive, isLaunching: true }) + api.runTask(config.id, id) + } + ) + } + + stopAllTasks(config = this.configsManager.getActiveConfig()) { + _.each( + this.taskList.getAllFromActiveTab({ isRun: true }), + ({ isRun, id, isActive }) => { + this.taskList.updateTask(id, { isRun, isActive, isStopping: true }) + api.stopTask(config.id, id) + } + ) + } + + clearLogs(activeTask) { + if (!activeTask) { + activeTask = this.taskList.getActive() + } + if (_.isString(activeTask)) { + activeTask = this.taskList.getTask(activeTask) + } + const config = this.configsManager.getActiveConfig() + api.clearLogs(config.id, activeTask.id) + activeTask.logs = [] + this.logger.clear() + this.logger.updateDescription(activeTask.task) + this.logger.updateEnvs(activeTask.envs) + } + + triggerScrollWatcher(e) { + this.logger.scrollTo('bottom', '1500') + this.watchTaskLogsScrollTop = !this.watchTaskLogsScrollTop + $('.logs-button.autoscroll').toggleClass( + 'active', + this.watchTaskLogsScrollTop + ) + } + + handleClickTab(tab) { + if (tab !== Tabs.getActive().name) { + Tabs.setActive(tab) + } + } + + enableEnvsForm() { + getEl('.envs-log').classList.add('active') + this.previousEnvs = _.clone(this.taskList.getActive().envs) + } + + updateEnvs() { + getEl('.envs-log').classList.remove('active') + const activeTask = this.taskList.getActive() + _.each(getEl('.envs-log > input', true), el => { + const input = $(el) + this.previousEnvs[input.attr('key')] = input.val() + }) + activeTask.envs = _.clone(this.previousEnvs) + this.clearLogs(activeTask) + const config = this.configsManager.getActiveConfig() + api.updateEnvs(config.id, activeTask.id, this.previousEnvs) + this.taskList.updateTask(activeTask.id, { + isRun: true, + isActive: activeTask.isActive, + isLaunching: true, + }) + this.previousEnvs = null + } + + cancelEnvs() { + getEl('.envs-log').classList.remove('active') + _.each(getEl('.envs-log > input', true), el => { + const input = $(el) + input.val(this.previousEnvs[input.attr('key')]) + }) + this.taskList.getActive().envs = _.clone(this.previousEnvs) + this.previousEnvs = null + } + + async updateTaskLogs({ task, envs, id }) { + this.logger.clear() + const config = this.configsManager.getActiveConfig() + const { data: rawLogs } = await api.getLogs(config.id, id) + this.logger.updateDescription(task) + this.logger.updateEnvs(envs) + const logs = _.map(rawLogs, this.logger.createHTMLLog).join('') + setTimeout(() => { + this.logger.push(logs, true) + this.logger.scrollTo('bottom') + }, 0) + } + + openTask = task => { + // const active = this.taskList.getActive() + // if (!active || id !== active.id) { + if (task.id) { + if (this.header.notificationsEnabled) + this.taskList.notifyAboutTask(task.id, false) + this.taskList.setActive(task) + this.updateTaskLogs(task) + } + // } + } + + runTask = task => { + window.event.stopPropagation() + // const task = this.taskList.getTask(id) + if (!task.isLaunching && !task.isRun) { + const config = this.configsManager.getActiveConfig() + this.taskList.setActive(task, true) + this.updateTaskLogs(task) + api.runTask(config.id, task.id) + } + } + + stopTask = task => { + window.event.stopPropagation() + // const task = this.taskList.getTask(id) + if (!task.isLaunching && task.isRun) { + const config = this.configsManager.getActiveConfig() + this.taskList.updateTask(task.id, { + isActive: task.isActive, + isStopping: true, + }) + api.stopTask(config.id, task.id) + } + } + + onCreateTaskEl = (taskEl, index) => { + if (this.hotkeys.isEnabled) { + this.hotkeys.connectTaskButton(taskEl, index) + } + } + + handleOnUpdateLog = ({ name, id, isRun, isLaunching, isStopping, log }) => { + if (name) { + const isActive = id === this.taskList.getActive().id + this.taskList.updateTask(id, { + isRun, + isActive, + isLaunching, + isStopping, + }) + if (log) { + if (isActive) { + this.logger.push(log) + if (this.watchTaskLogsScrollTop) this.logger.scrollTo('bottom') + if (this.header.notificationsEnabled && this.pageIsNotActive) { + this.taskList.notifyAboutTask(id, true, { + notify: this.header.notificationsEnabled, + projectName: this.projectName, + log, + }) + } + } else if (this.header.notificationsEnabled) { + this.taskList.notifyAboutTask(id, true, { + notify: this.header.notificationsEnabled, + log, + projectName: this.projectName, + }) + } + } + } + } + + getLogger = () => this.logger + getTaskList = () => this.taskList + + setProjectName = name => { + this.projectName = name + if (this.projectName) { + $('title').text(`${this.projectName} | fb`) + $('.title span').text(this.projectName) + } + } + + constructor() { + super() + $(document).ready(async () => { + $(window).focus(() => { + this.pageIsNotActive = false + if (this.header.notificationsEnabled) { + this.taskList.notifyAboutTask(this.taskList.getActive().id, false) + } + }) + + $(window).blur(() => { + this.pageIsNotActive = true + }) + + this.configsManager + .refreshConfigs() + .then(() => this.configsManager.setConfig(0)) + + this.logger = new WebLogger(getEl('#task-logs')) + this.websocket = new WebSocket(`ws://${location.host}`, { + onLogUpdate: this.handleOnUpdateLog, + onAppListUpdate: this.configsManager.refreshConfigs, + }) + }) + } +} + +export default new Global() diff --git a/client/helpers/WindowAttached.js b/client/helpers/WindowAttached.js new file mode 100644 index 0000000..b02cec8 --- /dev/null +++ b/client/helpers/WindowAttached.js @@ -0,0 +1,7 @@ +export default function WindowAttached(windowProperty) { + return class WindowAttached { + constructor() { + window[windowProperty] = this + } + } +} diff --git a/lib/app/scripts/dom_utils.js b/client/helpers/dom_utils.js similarity index 57% rename from lib/app/scripts/dom_utils.js rename to client/helpers/dom_utils.js index ba3b323..c25f77d 100644 --- a/lib/app/scripts/dom_utils.js +++ b/client/helpers/dom_utils.js @@ -1,11 +1,19 @@ -/* global $, _ */ -window.createButton = function(classes, icon, onClick, asJqElement, innerText) { +import $ from 'jquery' +import _ from 'lodash' + +export const createButton = function( + classes, + icon, + onClick, + asJqElement, + innerText +) { let button if (asJqElement) { button = $('') button.addClass(classes) if (icon) { - var iconEl = $('') + const iconEl = $('') button.html(iconEl) } if (innerText) { @@ -29,12 +37,12 @@ window.createButton = function(classes, icon, onClick, asJqElement, innerText) { return button } -window.createSpan = function(classes, text) { +export const createSpan = function(classes, text) { return '' + text + '' } -window.funcToStr = function(func) { - var args = _.slice(arguments, 1) +export const funcToStr = function(func) { + const args = _.slice(arguments, 1) return ( func.name + '(' + @@ -52,7 +60,7 @@ window.funcToStr = function(func) { ) } -window.createDiv = function( +export const createDiv = function( classes, innerText, icon, @@ -60,7 +68,7 @@ window.createDiv = function( onClick, asJqElement ) { - var element = + let element = '
+ + + + flamebird + + + + + + + + + + + + + + +
+
+ + flamebird + + +
+
+ +
+ + + + + + +
+
+ + +
+
+
+ + + + + + + + diff --git a/client/medium-screens.css b/client/medium-screens.css new file mode 100644 index 0000000..00a4abe --- /dev/null +++ b/client/medium-screens.css @@ -0,0 +1,83 @@ +@media screen and (max-width: 923px) { + .wrapper { + max-width: 100%; + } + + body { + padding: 0; + } + + .tasks-button{ + position: absolute; + left: 0; + top: 0; + display: block; + background: transparent; + border: none; + padding: 6px 10px; + border-radius: 0; + color: #4e4e4e; + font-size: 24px; + cursor:pointer; + z-index: 10; + } + .tasks-button > .fas:before{ + content: "\f0c9"; + } + .task-list-showed .tasks-button > .fas:before{ + content: "\f00d"; + } + header .title { + padding-left: 50px; + } + #task-list { + transform: translateX(-100%); + width: 0; + } + + #task-logs { + width: 100%; + } + .task-list-showed #task-list { + transform: translateX(0); + } + .task.new-task, .task-list-showed #task-list{ + width: 30%; + } + .active-tab-procfile .task.new-task,.active-tab-procfile .task.new-task.show{ + transform: scaleY(.6) translateY(58px); + } + .task-list-showed .active-tab-procfile .task.new-task{ + transform: none + } + .task-list-showed #task-logs { + width: 70%; + } + .task-list-showed .tabs { + position: absolute; + left: calc(30% + 12px); + top: 37px; + transform: rotate(0deg); + z-index: 2; + } + .task-list-showed .tab { + border-radius: 0 0 8px 8px; + } + .logs-container { + padding-top: 27px; + } + .scrolling > .task-data { + top: 45px; + } + + .main-button.toggle{ + min-width: 40px; + } + .main-button.toggle span{ + display: none; + } + + .task-list-showed .active-tab-procfile .task.new-task.show { + transform: translateY(-128px); + } +} \ No newline at end of file diff --git a/client/scripts/Api.js b/client/scripts/Api.js new file mode 100644 index 0000000..2c32367 --- /dev/null +++ b/client/scripts/Api.js @@ -0,0 +1,14 @@ +import _ from 'lodash' +import kinka from 'kinka' + +export default new (class Api { + getProjectInfo = () => kinka.get('/info') + getProjectVersion = () => kinka.get('/project-version') + runTask = (configId, taskId) => kinka.post(`/${configId}/${taskId}/run`) + stopTask = (configId, taskId) => kinka.post(`/${configId}/${taskId}/stop`) + clearLogs = (configId, taskId) => kinka.delete(`/${configId}/${taskId}/logs`) + getLogs = (configId, taskId) => kinka.get(`/${configId}/${taskId}/logs`) + removeConfig = configId => kinka.delete(`/${configId}`) + updateEnvs = (configId, taskId, envs) => + kinka.post(`/${configId}/${taskId}/envs`, _.clone(envs)) +})() diff --git a/client/scripts/Configs.js b/client/scripts/Configs.js new file mode 100644 index 0000000..96eadf9 --- /dev/null +++ b/client/scripts/Configs.js @@ -0,0 +1,72 @@ +import _ from 'lodash' +import { el, createEl } from '../helpers/dom_utils' + +export default class ConfigsManager { + configs = [] + activeConfigIndex = 0 + + refreshConfigs = async () => { + const configs = await this.getConfigs() + this.configs = configs + if (!this.getActiveConfig()) { + this.setConfig(0) + } + this.refreshHtml() + } + + refreshHtml = () => { + const configsContainerEl = el(this.configsContainer) + configsContainerEl.innerHTML = '' + + this.configs.forEach((config, index) => + createEl('div', { + className: 'config', + children: [ + createEl('span', { + className: 'name', + innerText: config.name, + }), + index && + createEl('i', { + className: 'fas fa-times close-icon', + onclick: () => { + window.event.preventDefault() + this.removeConfig(index) + }, + }), + ], + onclick: () => this.setConfig(index), + parent: configsContainerEl, + }) + ) + } + + setConfig = (index = 0) => { + this.activeConfigIndex = index + + this.onSetConfig(this.getActiveConfig()) + } + + getConfigByIndex = (index = 0) => { + return this.configs[index] + } + + getConfigById = id => _.find(this.configs, { id }) + + removeConfig = index => { + const [removedConfig] = this.configs.splice(index, 1) + this.onRemoveConfig(removedConfig, index) + + this.refreshHtml() + } + + getActiveConfig = () => this.configs[this.activeConfigIndex] + + constructor(configsContainer, { onSetConfig, getConfigs, onRemoveConfig }) { + this.configsContainer = configsContainer + // this.configs = configs + this.onSetConfig = onSetConfig || _.noop + this.onRemoveConfig = onRemoveConfig || _.noop + this.getConfigs = getConfigs || _.noop + } +} diff --git a/client/scripts/HotKeys.js b/client/scripts/HotKeys.js new file mode 100644 index 0000000..e3b286a --- /dev/null +++ b/client/scripts/HotKeys.js @@ -0,0 +1,174 @@ +import _ from 'lodash' +import $ from 'jquery' + +const TASK_CHAR_CODES = [ + 81, + 87, + 69, + 82, + 84, + 89, + 85, + 73, + 79, + 80, + 219, + 221, + 65, + 83, + 68, + 70, + 71, + 72, + 74, + 75, + 76, + 186, + 222, + 90, + 88, + 67, + 86, + 66, + 78, + 77, + 188, + 190, + 191, +] + +// const TASK_LIST_ELEMENTS_QUERY = '#task-list .task' + +const getTaskQueryByKeyCode = keyCode => $(`.task[char-code="${keyCode}"]`) + +export default class HotKeys { + isEnabled = false + taskCharCodes = TASK_CHAR_CODES + + actions = { + tab: _.noop, + arrowUp: _.noop, + arrowDown: _.noop, + del: _.noop, + shiftA: _.noop, + shiftS: _.noop, + shiftR: _.noop, + shiftArrowUp: _.noop, + shiftArrowDown: _.noop, + } + + keyCodeActions = { + // [shift] key is not triggered + 0: { + 38: 'arrowUp', + 40: 'arrowDown', + 46: 'del', + 9: 'tab', + }, + // [shift] key is triggered + 1: { + 38: 'shiftArrowUp', + 40: 'shiftArrowDown', + 65: 'shiftA', + 82: 'shiftR', + 83: 'shiftS', + }, + } + + clearifyEvent = event => { + // event.keyCode = 0 + // event.ctrlKey = false + // event.cancelBubble = true + event.preventDefault() + event.stopPropagation() + } + + onKeyClick = event => { + const { + shiftKey, + keyCode, + target: { tagName }, + } = event + if (_.indexOf(['INPUT', 'TEXTAREA'], tagName) === -1) { + if (shiftKey) { + this.clearifyEvent(event) + } + const actionName = this.keyCodeActions[+shiftKey][keyCode] + if (actionName) { + this.actions[actionName](event) + } else if (!shiftKey) { + getTaskQueryByKeyCode(keyCode).trigger('click') + } + } + } + + triggerEnabled(isEnabled) { + this.isEnabled = !!isEnabled + if (this.isEnabled) { + this.connect() + } else { + this.disconnect() + } + } + + connect() { + window.addEventListener('keydown', this.onKeyClick, false) + localStorage.setItem('hotkeys', true) + document.body.setAttribute('hotkeys', 'true') + + // setTimeout(() => { + // _.each( + // document.querySelectorAll(TASK_LIST_ELEMENTS_QUERY), + // (element, keycodeIndex) => { + // element.setAttribute('char-code', this.taskCharCodes[keycodeIndex]) + // } + // ) + // }) + } + + disconnect() { + window.removeEventListener('keydown', this.onKeyClick, false) + delete localStorage.hotkeys + document.body.removeAttribute('hotkeys') + // setTimeout(() => { + // _.each(document.querySelectorAll(TASK_LIST_ELEMENTS_QUERY), element => { + // element.removeAttribute('char-code') + // }) + // }) + } + + connectTaskButton = (taskEl, index) => { + taskEl.setAttribute('char-code', this.taskCharCodes[index]) + } + + constructor({ + tab, + arrowUp, + arrowDown, + del, + shiftA, + shiftS, + shiftR, + shiftArrowUp, + shiftArrowDown, + } = {}) { + // this.triggerEnabled(true) + + _.each( + { + tab, + arrowUp, + arrowDown, + del, + shiftA, + shiftS, + shiftR, + shiftArrowUp, + shiftArrowDown, + }, + (handler, handlerName) => { + this.actions[handlerName] = handler + } + ) + } +} diff --git a/client/scripts/Tabs.js b/client/scripts/Tabs.js new file mode 100644 index 0000000..a0df273 --- /dev/null +++ b/client/scripts/Tabs.js @@ -0,0 +1,101 @@ +import _ from 'lodash' +import { el, createEl } from '../helpers/dom_utils' +import { createTab } from '../helpers/tabs' + +const WRAPPER_ELEMENT = '.wrapper' +const TABS_CONTAINER = '#tabs' +const ACTIVE_TAB_CLASSNAME = 'active' + +export const PRIORITY_TAB = createTab('procfile', true) + +export const DEFAULT_TABS = [ + createTab('npm'), + PRIORITY_TAB, + createTab('grunt'), + createTab('gulp'), +] + +class Tabs { + wrapper = null + onChangeListeners = [] + + tabs = [...DEFAULT_TABS] + + activeTab = _.find(this.tabs, { active: true }) + + constructor(wrapperElementQuery, tabsContainerQuery) { + this.tabsContainer = el(tabsContainerQuery) + this.wrapper = el(wrapperElementQuery) + } + + createTabs = tabs => { + this.tabsContainer.innerHTML = '' + + this.tabs = tabs + this.tabs.forEach(tab => { + createEl('button', { + className: 'tab' + (tab.active ? ` ${ACTIVE_TAB_CLASSNAME}` : ''), + id: tab.name, + innerText: tab.name, + onclick: () => this.setActive(tab.name), + parent: this.tabsContainer, + }) + }) + } + + getAll = () => this.tabs + + getTabBy = partialTabData => _.find(this.tabs, partialTabData) + + getNotActiveTabs = () => this.getTabBy({ active: false }) + + getTab = name => this.getTabBy({ name }) + + getActive = () => this.activeTab + + setActive = name => { + const prevTab = this.activeTab + // if (prevTab.name !== name) { + if (this.getTab(prevTab.name)) { + prevTab.active = false + el(`#${prevTab.name}`).classList.remove(ACTIVE_TAB_CLASSNAME) + } + this.activeTab = this.getTab(name) + this.activeTab.active = true + + el(`#${this.activeTab.name}`).classList.add(ACTIVE_TAB_CLASSNAME) + + if (this.onChangeListeners.length) { + this.onChangeListeners.forEach(listener => + listener(this.activeTab.name, prevTab.name) + ) + } + this.wrapper.className = `wrapper active-tab-${this.activeTab.name}` + return this.activeTab + } + + setNextAsActive() { + const index = this.tabs.findIndex(tab => tab.name === this.activeTab.name) + if (_.isUndefined(this.tabs[index + 1])) { + this.setActive(this.tabs[0].name) + } else { + this.setActive(this.tabs[index + 1].name) + } + } + + listenChanges = callback => { + this.onChangeListeners.push(callback) + } + + removeTab = tab => { + const removingTabIndex = this.tabs.findIndex( + ({ name }) => tab.name === name + ) + if (removingTabIndex !== -1) { + this.tabs.splice(removingTabIndex, 1) + el(`#${tab.name}`).remove() + } + } +} + +export default new Tabs(WRAPPER_ELEMENT, TABS_CONTAINER) diff --git a/client/scripts/TaskList.js b/client/scripts/TaskList.js new file mode 100644 index 0000000..ff9bc0e --- /dev/null +++ b/client/scripts/TaskList.js @@ -0,0 +1,219 @@ +import _ from 'lodash' +import Tabs, { PRIORITY_TAB } from './Tabs' +// import HotKeys from './HotKeys' +import { toggleClass, addClass, removeClass, el } from '../helpers/dom_utils' +import { createTab } from '../helpers/tabs' +import WindowAttached from '../helpers/WindowAttached' +import { createTaskElement } from '../helpers/taskList' + +const TASK_CLASSES = { + ACTIVE: 'active', + STOPPING: 'stopping', + RUNNING: 'running', + LAUNCHING: 'clicked', + UPDATED: 'updated', +} + +export default class TaskList extends WindowAttached('taskList') { + element + taskList = {} + activeTaskByTab = {} + notifyTaskTimers = {} + + constructor( + taskListContainer, + tasks, + { onOpenTask, onRunTask, onStopTask, onCreateTaskEl } = {} + ) { + super() + this.onOpenTask = onOpenTask || _.noop + this.onRunTask = onRunTask || _.noop + this.onStopTask = onStopTask || _.noop + this.onStopTask = onStopTask || _.noop + this.onCreateTaskEl = onCreateTaskEl || _.noop + + this.element = taskListContainer + + Tabs.listenChanges(this.handleTabChange) + this.initalizeTasks(tasks) + } + + initalizeTasks = tasks => { + this.element.innerHTML = '' + + this.taskList = {} + this.activeTaskByTab = {} + + this.taskList = _.reduce( + tasks, + (taskList, task) => { + if (!taskList[task.type]) { + taskList[task.type] = [] + } + taskList[task.type].push(task) + return taskList + }, + // TODO: probably we can use just this.taskList here + this.taskList + ) + + const tabs = _.map(_.keys(this.taskList), tabName => { + this.activeTaskByTab[tabName] = {} + return createTab(tabName, tabName === PRIORITY_TAB.name) + }) + + Tabs.createTabs(tabs) + + let activeTab = null + + for (let x = 0; x < tabs.length; x++) { + const tab = tabs[x] + if (tab) { + const tasks = this.getTasksByTab(tab) + if (tasks && tasks.length) { + this.activeTaskByTab[tab.name] = [tasks[0].id] + if (!activeTab || tab.name === PRIORITY_TAB.name) { + activeTab = tab + } + } else { + delete this.taskList[tab.name] + delete this.activeTaskByTab[tab.name] + Tabs.removeTab(tab) + x-- + } + } + } + + if (activeTab) Tabs.setActive(activeTab.name) + } + + handleTabChange = name => { + this.clear() + this.updateTaskList(name) + + setTimeout(() => { + const { name: currentName } = Tabs.getActive() + if (name !== currentName) { + name = currentName + } + if (this.activeTaskByTab[name].length) { + el(`#${this.activeTaskByTab[name][0]}`).click() + } else { + global.getLogger().clear() + } + }, 0) + } + + updateTaskList(tabName) { + _.forEach(this.taskList[tabName], (task, index) => { + // TODO: ??? + // if (HotKeys.isEnabled) { + // HotKeys.connect(task, index) + // } + const taskEl = createTaskElement(task, index, { + onOpenTask: () => this.onOpenTask(task), + onRunTask: () => this.onRunTask(task), + onStopTask: () => this.onStopTask(task), + }) + + this.onCreateTaskEl(taskEl, index) + + this.element.appendChild(taskEl) + }) + } + + getTask = id => _.find(_.concat.apply(null, _.values(this.taskList)), { id }) + + updateTask(id, { isRun, isActive, isLaunching, isStopping }) { + const task = this.getTask(id) + + // TODO: fix task as undefined + + const taskElem = document.getElementById(task.id) + task.isRun = isRun + task.isLaunching = !!isLaunching + task.isStopping = !!isStopping + task.isActive = !!isActive + + if (task.isActive) { + const prevActiveTask = document.querySelector( + `.task.${TASK_CLASSES.ACTIVE}` + ) + if (prevActiveTask) { + const prevTaskId = this.activeTaskByTab[task.type][0] + if (prevTaskId !== task.id) { + this.getTask(prevTaskId).isActive = false + removeClass(prevActiveTask, TASK_CLASSES.ACTIVE) + } + } + this.activeTaskByTab[task.type] = [task.id] + addClass(taskElem, TASK_CLASSES.ACTIVE) + } + toggleClass(taskElem, TASK_CLASSES.STOPPING, isStopping) + toggleClass(taskElem, TASK_CLASSES.RUNNING, isRun) + toggleClass(taskElem, TASK_CLASSES.LAUNCHING, isLaunching) + return task + } + + clear() { + while (this.element.lastChild) + this.element.removeChild(this.element.lastChild) + } + + setActive(task, isLaunching, isStopping) { + this.updateTask(task.id, { + isRun: task.isRun, + isActive: true, + isLaunching: isLaunching === undefined ? task.isLaunching : isLaunching, + isStopping: isStopping === undefined ? task.isStopping : isStopping, + }) + } + + getTasksByTab = tab => { + const tasks = this.taskList[tab.name] + return tasks && tasks.length && tasks + } + + getAllFromActiveTab(filter) { + const tasks = this.getTasksByTab(Tabs.getActive()) + return filter ? _.filter(tasks, filter) : tasks + } + + getActive = () => this.getTask(this.activeTaskByTab[Tabs.getActive().name][0]) + + notifyAboutTask(taskId, isUpdated, options) { + const task = this.getTask(taskId) + const activeTab = Tabs.getActive() + if (!options) options = {} + if (task.type === activeTab.name) + el(`#${taskId}`).classList[isUpdated ? 'add' : 'remove']( + TASK_CLASSES.UPDATED + ) + if (Notification && options.notify && isUpdated) { + if (this.notifyTaskTimers[taskId]) { + clearTimeout(this.notifyTaskTimers[taskId]) + this.notifyTaskTimers[taskId] = null + } + this.notifyTaskTimers[taskId] = setTimeout(() => { + const task = this.getTask(taskId) + if (Notification.permission === 'granted') { + const notification = new Notification( + `"${task.name}" has been updated`, + { + icon: 'assets/logo2_small.png', + body: + `project: ${options.projectName}\r\n` + + `taskfile: [${task.type}]\r\n` + + 'latest message: \r\n' + + `...${options.log + .split('') + .splice(-22) + .join('')}`, + } + ) + notification.onclick = () => window.focus() + } else Notification.requestPermission() + }, 2800) + } + } +} diff --git a/client/scripts/ThemeSwitcher.js b/client/scripts/ThemeSwitcher.js new file mode 100644 index 0000000..cad16ef --- /dev/null +++ b/client/scripts/ThemeSwitcher.js @@ -0,0 +1,31 @@ +import _ from 'lodash' +import WindowAttached from '../helpers/WindowAttached' + +export const THEMES = { + WHITE: 'white', + DARK: 'dark', +} + +export default class ThemeSwitcher extends WindowAttached('ThemeSwitcher') { + theme = THEMES.WHITE + + onSwitchTheme = _.noop + + setTheme = newTheme => { + localStorage.setItem('theme', newTheme) + document.body.setAttribute('theme', newTheme) + this.theme = newTheme + + this.onSwitchTheme(this.theme) + } + + switchTheme = () => { + const newTheme = this.theme === THEMES.DARK ? THEMES.WHITE : THEMES.DARK + this.setTheme(newTheme) + } + + constructor({ onSwitchTheme }) { + super() + this.onSwitchTheme = onSwitchTheme + } +} diff --git a/client/scripts/WebLogger.js b/client/scripts/WebLogger.js new file mode 100644 index 0000000..6cf52a3 --- /dev/null +++ b/client/scripts/WebLogger.js @@ -0,0 +1,153 @@ +import $ from 'jquery' +import AnsiUp from 'ansi_up' +import _ from 'lodash' +import { + createSpan, + toggleClass, + createEl, + createButton, + createEnvsInput, +} from '../helpers/dom_utils' + +export default class WebLogger { + watchTaskLogsScrollTop = true + autoScrollButton + loggerId + element + ansiUp + + scrollTo(direction, animate, scrollPixels) { + const scrollTop = scrollPixels + ? $(this.element).scrollTop() + : direction === 'bottom' + ? this.element.scrollHeight + : 0 + if (scrollPixels) { + $(this.element).scrollTop( + direction === 'bottom' + ? scrollTop - scrollPixels + : scrollTop + scrollPixels + ) + } else if (animate) { + $(this.element).animate({ scrollTop }, animate) + } else { + this.element.scrollTop = scrollTop + } + } + + createHTMLLog = logData => { + const log = this.ansiUp.ansi_to_html( + logData.replace(/\n/g, '
').replace(/ /g, ' ') + ) + if (log.includes('Warning:')) { + return createSpan('ansi-yellow-fg', log) + } + if (log.includes('Exited Successfully')) { + return createSpan('ended ok', log) + } + if (log.includes('Exited with exit code ')) { + return createSpan('ended', log) + } + return log + .replace(/(.<\/span>)/g, () => + createSpan('ansi-bright-black-fg mocha-test', '.') + ) + .replace(/(!<\/span>)/g, () => + createSpan('ansi-red-fg mocha-test', '!') + ) + } + + push(log, isRaw) { + this.element.insertAdjacentHTML( + 'beforeend', + isRaw ? log : this.createHTMLLog(log) + ) + } + + clear() { + while (this.element.lastChild) { + this.element.removeChild(this.element.lastChild) + } + } + + updateEnvs(envs) { + if (_.keys(envs).length) { + const container = document.createElement('div') + container.classList.add('envs-log') + container.innerHTML = + _.map( + envs, + (value, key) => + `${createSpan('ansi-bright-magenta-fg', key)}=${createEnvsInput( + key, + value + )}` + ).join(', ') + + createButton('logs-button', 'edit', 'global.enableEnvsForm()') + + createButton('logs-button cancel', 'times', 'global.cancelEnvs()') + + createButton('logs-button apply', 'check', 'global.updateEnvs()') + this.element.appendChild(container) + } + } + + updateDescription(description) { + const container = createEl('div', { className: 'task-data' }) + const span = createEl('span', { innerText: description }) + container.appendChild(span) + this.element.appendChild(container) + } + + onScroll() { + toggleClass(this, 'scrolling', this.scrollTop > 70) + } + + triggerScrollWatcher = () => { + this.scrollTo('bottom', '1500') + this.watchTaskLogsScrollTop = !this.watchTaskLogsScrollTop + toggleClass(this.autoScrollButton, 'active', this.watchTaskLogsScrollTop) + } + + createScrollActions(parent) { + const scrollActions = createEl('div', { + className: 'scroll-actions', + parent, + }) + createEl('button', { + className: 'logs-button scroll-top', + onclick: () => this.scrollTo('top', '500'), + innerHTML: '', + parent: scrollActions, + }) + createEl('button', { + className: 'logs-button clear', + onclick: () => window.global.clearLogs(this.loggerId), + innerHTML: '', + parent: scrollActions, + }) + this.autoScrollButton = createEl('button', { + className: `logs-button autoscroll ${ + this.watchTaskLogsScrollTop ? 'active' : '' + }`, + onclick: () => this.triggerScrollWatcher(), + innerHTML: '', + parent: scrollActions, + }) + } + + constructor(logsContainer, id) { + this.loggerId = id + const wrapper = createEl('div', { + className: 'logs-wrapper', + parent: logsContainer, + }) + this.createScrollActions(wrapper) + this.element = createEl('div', { + className: 'logs-container', + parent: wrapper, + onscroll: this.onScroll, + }) + this.ansiUp = new AnsiUp() + this.ansiUp.use_classes = true + this.ansiUp.escape_for_html = false + } +} diff --git a/client/scripts/WebSocket.js b/client/scripts/WebSocket.js new file mode 100644 index 0000000..1668cac --- /dev/null +++ b/client/scripts/WebSocket.js @@ -0,0 +1,29 @@ +import _ from 'lodash' +const { MESSAGE_TYPES } = require('../../server/constants') + +export default class WebSocket { + connection = null + + constructor(url, { onConnection, onLogUpdate, onAppListUpdate } = {}) { + this.onConnection = onConnection || _.noop + this.onLogUpdate = onLogUpdate || _.noop + this.onAppListUpdate = onAppListUpdate || _.noop + + this.connection = new window.WebSocket(url) + this.connection.onmessage = this.handleMessageReceive + } + + handleMessageReceive = ({ data }) => { + const { type, message } = JSON.parse(data) + + switch (type) { + case MESSAGE_TYPES.CONNECTION: + return this.onConnection(message) + case MESSAGE_TYPES.LOG: + return this.onLogUpdate(message) + case MESSAGE_TYPES.APPS_LIST_UPDATE: + return this.onAppListUpdate(message) + default: + } + } +} diff --git a/client/small-screens.css b/client/small-screens.css new file mode 100644 index 0000000..2590b17 --- /dev/null +++ b/client/small-screens.css @@ -0,0 +1,50 @@ +@media screen and (max-width: 545px) { + header .title{ + display: none; + } + .main-buttons { + margin-left: auto; + } + + .main-button:not(.toggle).run{ + margin-left: 30px; + } + .main-button.toggle.hot-keys{ + display: none; + } + + .task-list-showed #task-logs{ + width: 100%; + } + + #task-list{ + position: absolute; + z-index: 1; + height: calc(100% - 40px); + background: inherit; + transition: transform 289ms ease; + } + body #task-list,.task-list-showed #task-list{ + width: 80%; + } + + header{ + height: 40px; + } + + .tabs { + transition: left 289ms ease; + position: absolute; + left: -32px; + top: 292px; + transform: rotate(90deg); + z-index: 2; + } + + .task-list-showed .tabs { + left: calc(80% + 6px); + } + .main-button.toggle.resize { + display: none; + } +} \ No newline at end of file diff --git a/lib/app/styles.css b/client/styles.css similarity index 79% rename from lib/app/styles.css rename to client/styles.css index 518214a..be10767 100644 --- a/lib/app/styles.css +++ b/client/styles.css @@ -56,46 +56,52 @@ header { overflow-y: auto; } -#tasks { +#task-list { height: calc(100% - 40px); width: 28%; position: relative; } -#tasks::-webkit-scrollbar { +#task-list::-webkit-scrollbar { width: 10px; } -#tasks::-webkit-scrollbar-track { +#task-list::-webkit-scrollbar-track { background: #f1f1f1; } -#tasks::-webkit-scrollbar-thumb { +#task-list::-webkit-scrollbar-thumb { background: rgba(0, 0, 0, 0.15); } -#tasks::-webkit-scrollbar-thumb:hover { +#task-list::-webkit-scrollbar-thumb:hover { background: rgba(0, 0, 0, 0.2); } -#task-logs { +#task-logs{ width: 72%; + height: calc(100% - 40px); + overflow: hidden; + display: flex; + flex-direction: column; +} + +.logs-container{ background: #1e1e1e; - /* white-space: pre; */ word-break: break-all; text-align: justify; - height: calc(100% - 40px); color: #dedede; font-size: 13px; font-family: monospace; padding: 8px 0 27px 8px; position: relative; overflow-x: hidden; + height: 100%; } -#task-logs::-webkit-scrollbar { +.logs-container::-webkit-scrollbar { width: 10px; } -#task-logs::-webkit-scrollbar-thumb { +.logs-container::-webkit-scrollbar-thumb { background: #f1f1f1; } -#task-logs::-webkit-scrollbar-thumb:hover { +.logs-container::-webkit-scrollbar-thumb:hover { background: rgb(220, 220, 220); } @@ -126,7 +132,6 @@ header { padding: 0; display: flex; overflow: hidden; - padding-left: 43px; } @@ -162,7 +167,6 @@ header { .run{ background: #2eb97a; - /* margin-right: 5px; */ right: 12px; color: #d5ffec; } @@ -181,16 +185,12 @@ header > * { } .task-data { min-height: 32px; - /* float: left; */ - /* justify-content: center; */ padding: 9px 8px 0 0; width: auto; - /* flex-direction: column; */ background: transparent; position: relative; top: -6px; display: flex; - /* transition: all 239ms cubic-bezier(0.18, 0.89, 0.32, 1.28); */ } .task-data > span { background: #ebebeb; @@ -225,7 +225,6 @@ header > * { left: -5px; font-size: 24px; top: 8px; - /* padding: 9px 0; */ color: rgba(80, 80, 80, 0); } @@ -272,6 +271,9 @@ header > * { user-select: none; padding: 9px 0; transition: transform 199ms cubic-bezier(0.18, 0.89, 0.32, 1.28) !important; + text-overflow: ellipsis; + overflow: hidden; + white-space: nowrap; } @@ -308,9 +310,6 @@ header > * { .task.running > span, .task.clicked > span, .task.stopping > span { transform: translateX(6px); } -/* .task.active:not(.running):before { - background: transparent; -} */ .task.clicked:before,.task.stopping:before { opacity: 1; } @@ -341,11 +340,11 @@ header > * { .mocha-test {font-size: 16px;} .bold{font-weight: bold;} -#task-logs > div > span.ansi-red-fg { +.logs-container > div > span.ansi-red-fg { display: block; } -#task-logs > div { +.logs-container > div { padding-bottom: 3px; font-size: 14px; } @@ -404,43 +403,49 @@ button.logs-button:hover { } button.tab { - position: absolute; - border-top-left-radius: 10px; + /* position: absolute; */ + border-top-left-radius: 8px; user-select: none; - border-top-right-radius: 10px; + border-top-right-radius: 8px; border: none; - /* text-transform: uppercase; */ - padding: 1px 10px 3px; + padding: 1px 0 3px; z-index: -50; - color: #a7a7a7; + color: #595959; background: rgb(239, 239, 239); cursor: pointer; - box-shadow: 0 0px 2px rgba(0, 0, 0, 0.28), inset 0 -1px 10px rgba(0, 0, 0, 0.1); + box-shadow: 0 0px 0px 0.5px rgb(171, 171, 171); transition: background 269ms cubic-bezier(0, 0, 0.2, 1); + transform: rotate(-90deg); + margin: 21px -3px; + line-height: 10px; + position: relative; + width: inherit; } button.tab.active, button.tab:active { z-index: 3; - background: #ebebeb; - font-weight: 500; - box-shadow: 0 0px 2px rgba(0, 0, 0, 0.49), inset 0 1px 10px rgba(0, 0, 0, 0.15); - color: #565656; + background: rgb(255, 247, 204); + /* font-weight: 500; */ + box-shadow: 0 0px 0px 0.5px rgb(154, 137, 47); + color: #212121; } -button#procfile { - left: -52px; - /* top: 8px; */ -} .envs-log:before{ content:'envs: '; } .tabs { position: absolute; - left: -32px; - top: 215px; - transform: rotate(-90deg); + left: -46.5px; + top: 0; z-index: 0; + display: flex; + flex-direction: column; + flex: 1; + height: 100%; + padding-top: 100px; + padding-left: 12px; + width: 58px; } .envs-log { @@ -485,18 +490,16 @@ button#procfile { color: #ebebeb; } -.flying > .task-data { +.scrolling > .task-data { position: fixed; left: auto; right: auto; top: auto; width: 546px; margin-top: -5px; - /* opacity: .2; */ } .logo{ position: absolute; - /* display: inline-block; */ width: 40px; z-index: -1; left: -27px; @@ -510,6 +513,27 @@ button#procfile { font-weight: 500; padding-left: 6px; background: #f1f1f1; + max-height: 40px; + text-overflow: ellipsis; + overflow: hidden; + z-index: 10; + white-space: nowrap; + max-width: 180px; + cursor: pointer; + position: relative; +} +.title span { + padding-right: 6px; + user-select: none; +} +.title .fas { + position: absolute; + right: 0; + font-size: 14px; + color: #9a9a9a; + line-height: 0.9; + padding: 8px 0 5px; + transition: transform 189ms ease; } .project-version { color: #888888; @@ -536,7 +560,7 @@ button#procfile { -#task-logs > * { +.logs-container > * { font-family: monospace; } @@ -549,20 +573,82 @@ button#procfile { color: #dbffef; } -[theme="dark"] .toggle.color .fas { - transform: scaleX(-1); -} - .toggle.color .fas { transition: transform 239ms ease-out; } -.flying > .task-data > span:not(:hover) { +.scrolling > .task-data > span:not(:hover) { opacity: .5; background: rgba(235, 235, 235, 0.58); color: #1d1d1d; } +.logs-wrapper { + position: relative; + flex: 1; + overflow: auto; +} + +.scroll-actions { + position: absolute; + right: 0; + bottom: 0; + z-index: 1; +} + +.configs-list { + position: absolute; + left: -10px; + top: calc(100% - 10px); + width: 240px; + min-height: 40px; + background: #efefef; + z-index: 99999; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.17), 0 2px 10px rgba(0, 0, 0, 0.17); + display: none; + padding: 0; +} + +.config { + font-weight: 400; + cursor: pointer; + color: #212529; + display: flex; + justify-content: space-between; + align-items: center; + padding: 4px 10px 4px; +} + +.config:hover { + background: white; +} + +.config:not(:first-child) { + border-top: 1px solid rgba(0, 0, 0, 0.06); +} + +.config:first-child { + padding-top: 6px; +} + +.config:last-child { + padding-bottom: 6px; +} + +.config .name { + user-select: none; +} + +[config="show"] .configs-list { + display: block; +} +[config="show"] .title .fas { + transform: rotate(180deg); +} + +.close-icon { + color: #b55d5d; +} @-moz-keyframes spin { 100% { -moz-transform: rotate(360deg); } } @-webkit-keyframes spin { 100% { -webkit-transform: rotate(360deg); } } @@ -571,4 +657,4 @@ button#procfile { 50%{ background: rgb(255, 247, 204); } -} \ No newline at end of file +} diff --git a/client/styles/dark-theme.css b/client/styles/dark-theme.css new file mode 100644 index 0000000..9b7a66f --- /dev/null +++ b/client/styles/dark-theme.css @@ -0,0 +1,138 @@ + +body[theme="dark"] { + background: #212121; +} + +[theme="dark"] header { + background: #3e3e3e; + box-shadow: 0 2px 2px rgba(0, 0, 0, 0.33); +} + +[theme="dark"] .title { + color: #eeeeee; + background: #3e3e3e; +} + +[theme="dark"] .wrapper { + background: #424242; +} + + +[theme="dark"] .task.active { + background: rgb(37, 37, 37); + color: #ebebeb; +} + + +[theme="dark"] .task { + color: #a5a5a5; +} + + +[theme="dark"] .task:hover { + background: rgb(37, 37, 37); + color: #ebebeb; +} + + + +[theme="dark"] button.tab { + color: #d1d1d1; + background: rgb(69, 69, 69); + box-shadow: 0 0px 0px 0.5px rgb(33, 33, 33); +} + + +[theme="dark"] button.tab.active, +[theme="dark"] button.tab:active { + background: rgb(159, 144, 55); + color: #212121; +} + +[theme="dark"] .logs-container{ + color: #dcdcdc; +} + +[theme="dark"] .ansi-red-fg { + color: rgb(230, 78, 78); +} + +[theme="dark"] .logs-container::-webkit-scrollbar-thumb { + background: #c1c1c1; +} + +[theme="dark"] .logs-container::-webkit-scrollbar-thumb:hover { + background: #9e9e9e; +} + +[theme="dark"] .logs-container{ + background: #060606; +} + +[theme="dark"] .ansi-bright-black-fg { + color: #909090; +} + +[theme="dark"] .main-button.toggle { + background: #333333; + color: #929292; +} + +[theme="dark"] .main-button.toggle.active { + background: #2e7b58; + color: #b5e0cd; +} + + +[theme="dark"] .run{ + background: #2f9a6a; +} + +[theme="dark"] .stop{background: #8c4343;} + + +[theme="dark"] .task.new-task .form input,[theme="dark"] .task.new-task .form textarea { + background: #333; + color: #dcdcdc; +} + +[theme="dark"] .task.new-task .form button { + background: #2e7b58; + color: #b5e0cd; +} + + +[theme="dark"] .task.updated{ + animation-name: dark-highlight; +} + +[theme="dark"] .toggle.color .fas { + transform: scaleX(-1); +} + +[theme="dark"] .close-icon { + color: #995959; +} + +[theme="dark"] .configs-list { + background: #424242; +} + +[theme="dark"] .config { + color: #aeaeae; +} + +[theme="dark"] .config:hover { + background: #2b2b2b; +} + +[theme="dark"] .config:not(:first-child) { + border-color: rgba(255, 255, 255, 0.05); +} + + +@keyframes dark-highlight{ + 50%{ + background: rgb(79, 80, 63); + } +} \ No newline at end of file diff --git a/client/styles/fullscreen.css b/client/styles/fullscreen.css new file mode 100644 index 0000000..e7bcedd --- /dev/null +++ b/client/styles/fullscreen.css @@ -0,0 +1,35 @@ +@media screen and (min-width: 923px) { + body[fullscreen="true"] { + padding: 0.9% 0; + } + + [fullscreen="true"] .wrapper { + max-width: calc(98.2% - 40px); + } + + [fullscreen="true"] header .title { + padding-left: 49px; + } + + [fullscreen="true"] #task-list,[fullscreen="true"] .task.new-task { + width: 260px; + } + + [fullscreen="true"] #task-logs { + width: calc(100% - 260px); + } + [fullscreen="true"] .scrolling > .task-data { + top: 48px; + } + + [fullscreen="true"] .logo { + left: 3px; + z-index: 20; + top: 4px; + } + + [fullscreen="true"] .logs-container { + padding: 20px 20px 27px; + } + +} \ No newline at end of file diff --git a/client/styles/hot_keys-shortcuts.css b/client/styles/hot_keys-shortcuts.css new file mode 100644 index 0000000..dac29a7 --- /dev/null +++ b/client/styles/hot_keys-shortcuts.css @@ -0,0 +1,92 @@ + +[hotkeys="true"] .task:after{ + position: absolute; + right: 6px; + bottom: 6px; + font-size: 11px; + text-transform: uppercase; + color: #828282; + text-align: center; + width: 10px; +} +[hotkeys="true"] .task-num-1:after { + content:'q'; +} +[hotkeys="true"] .task-num-2:after { + content:'w'; +} +[hotkeys="true"] .task-num-3:after { + content:'e'; +} +[hotkeys="true"] .task-num-4:after { + content:'r'; +} +[hotkeys="true"] .task-num-5:after { + content:'t'; +} +[hotkeys="true"] .task-num-6:after { + content:'y'; +} +[hotkeys="true"] .task-num-7:after { + content:'u'; +} +[hotkeys="true"] .task-num-8:after { + content:'i'; +} +[hotkeys="true"] .task-num-9:after { + content:'o'; +} +[hotkeys="true"] .task-num-10:after { + content:'p'; +} +[hotkeys="true"] .task-num-11:after { + content:'['; +} +[hotkeys="true"] .task-num-12:after { + content:']'; +} +[hotkeys="true"] .task-num-13:after { + content:'a'; +} +[hotkeys="true"] .task-num-14:after { + content:'s'; +} +[hotkeys="true"] .task-num-15:after { + content:'d'; +} +[hotkeys="true"] .task-num-16:after { + content:'f'; +} +[hotkeys="true"] .task-num-17:after { + content:'g'; +} +[hotkeys="true"] .task-num-18:after { + content:'h'; +} +[hotkeys="true"] .task-num-19:after { + content:'j'; +} +[hotkeys="true"] .task-num-20:after { + content:'k'; +} +[hotkeys="true"] .task-num-21:after { + content:'l'; +} +[hotkeys="true"] .task-num-22:after { + content:';'; +} +[hotkeys="true"] .task-num-23:after { + content:"'"; +} +[hotkeys="true"] .task-num-24:after { + content:'z'; +} +[hotkeys="true"] .task-num-25:after { + content:'x'; +} +[hotkeys="true"] .task-num-26:after { + content:'c'; +} +[hotkeys="true"] .task-num-27:after { + content:'v'; +} \ No newline at end of file diff --git a/flamebird.js b/flamebird.js old mode 100644 new mode 100755 index b0816b3..de5e7eb --- a/flamebird.js +++ b/flamebird.js @@ -1,26 +1,24 @@ #!/usr/bin/env node + // Copyright IBM Corp. 2012,2015. All Rights Reserved. // Node module: flamebird // This file is licensed under the MIT License. // License text available at https://opensource.org/licenses/MIT const program = require('commander') -const utils = require('./lib/utils') -const storage = require('./lib/storage') -const emitter = require('./lib/emitter') -const processWorker = require('./lib/processWorker') -const server = require('./lib/server') +const emitter = require('./server/utils/emitter') +const { createConfig } = require('./server/config') +const { yellow, red, grey, cyan } = require('./server/utils/colors') +const processWorker = require('./server/processWorker') +const server = require('./server/server') + +process.title = 'flamebird (nodejs task manager)' + +/* special properties for colorizing output logs */ process.env.FORCE_COLOR = true process.env.colors = true process.env.color = true -function init(args, isWeb) { - args.web = !!isWeb - storage.set('actionArgs', args) - require('./lib/envs').load(program.env) - return require('./lib/taskfile').load(program.procfile, args) -} - process.once('SIGINT', function() { emitter.emit('killall', 'SIGINT') process.exit() @@ -32,46 +30,161 @@ process.once('SIGTERM', function() { process.exit() }) -program.version(utils.getLogoWithVersion(), '-v, --version') +program.on('--help', function() { + console.log('\r\nExamples:') + console.log( + ' ' + + grey('$') + + ' fb start -p -t start:dev,server:dev ' + + '- launch commands "start:dev" and "server:dev" (-t start:dev,server:dev) from package.json (-p)\r\n' + + ' ' + + grey('$') + + ' fb start ' + + '- launch all commands from Procfile and output logs to this command line\r\n' + + ' ' + + grey('$') + + ' fb web ' + + '- launch web GUI which have contained all possible commands from package.json etc.\r\n' + + ' ' + + grey('$') + + ' fb web -w -u yarn ' + + '- launch web GUI without opening new tab in the browser (-w) and will use another package manager (-u yarn) for launching commands from package.json\r\n' + + ' ' + + grey('$') + + ' fb web -i ' + + '- launch web GUI which will launch tasks without yarn or npm (using absolute paths: webpack -> node_modules/.bin/webpack) (-i)' + ) +}) + +program.version(getLogo(true), '-v, --version') program.usage('[command] [options]') -program.option('-j, --procfile ', 'load procfile from file', 'Procfile') + +program.option('-f, --procfile ', 'load procfile from file', 'Procfile') program.option( '-e, --env ', 'load environment from file, a comma-separated list', '.env' ) + program .command('start') .usage('[Options]') .option('-p, --package', 'Use package.json for managing tasks') + .option( + '-i, --ignore-trs', + 'Allows to launch tasks without yarn or npm ( using absolute paths: webpack -> node_modules/.bin/webpack )', + false + ) .option( '-t, --tasks [tasks]', 'List of tasks which will be run flamebird ( example : --tasks start,start:dev,start-server )' ) - .description('Start the jobs in the Procfile/Package.json') - .action(args => processWorker.runAll(init(args), args)) + .option( + '-r, --task-runner ', + `Allows to use another task runner for launch tasks. By default will use npm ( For example: -r yarn )`, + 'npm' + ) + .description( + 'Launch commands from Procfile/package.json and output logs in the current command line' + ) + .action(args => { + const config = createConfig(args) + processWorker.runAll(config.commands) + }) + program .command('web') .usage('[Options]') .option('-p, --port ', 'sets the server port', 5050) + .option( + '-i, --ignore-trs', + 'Allows to launch tasks without yarn or npm ( use absolute paths: webpack -> node_modules/.bin/webpack )', + false + ) .option( '-n, --name ', - 'sets the project name', - "By default takes from 'package.json' else 'flamebird'" + 'Sets the project name. By default takes from "package.json" else "flamebird"', + 'flamebird' ) .option( '-t, --tasks [tasks]', 'List of tasks which will be run flamebird ( example : --tasks start,start:dev,start-server )' ) + .option( + '-r, --task-runner ', + `Allows to use another task runner for launch tasks. By default will use npm ( For example: -r yarn )`, + 'npm' + ) + .option( + '-w, --without-browser', + 'This option disable opening the new tab in Google Chrome browser', + false + ) + .option( + '-s, --sort-by-name', + 'This option using to sort all commands by name (asc)', + false + ) .description( - 'Launch web application which will help to manage all tasks in your application' + 'Launch ' + + cyan('web application') + + ' which will help to manage all commands from package.json/Procfile/Grunt/Gulp' ) - .action(args => server.start(init(args, true), args.port, args)) + .action(args => { + const config = createConfig(args, true) + if (config.main) server.start(config) + else server.update(config) + }) program.parse(process.argv) if (!process.argv.slice(2).length) { - console.log(utils.getLogoWithVersion()) + console.log(getLogo()) program.outputHelp() - console.log(process.env.npm_config_) +} + +function getLogo(displayOnlyVersion) { + const { version } = require('./package.json') + const strings = [] + if (!displayOnlyVersion) { + strings.push(yellow(' ╔══╗ ╔╗ ╔══╗ ╔╗ ╔╗ ╔═══╗ ╔══╗ ╔══╗ ╔═══╗ ╔══╗ ')) + strings.push( + red(' ║╔═╝') + + yellow(' ║║ ║╔╗║ ║║ ║║ ║╔══╝ ║╔╗║ ╚╗╔╝ ║╔═╗║ ') + + red('║╔╗╚╗ ') + ) + strings.push( + red(' ║╚═╗ ') + + yellow('║║ ║╚╝║ ║╚╗╔╝║ ║╚══╗ ║╚╝╚╗ ║║ ║╚═╝║') + + red(' ║║╚╗║ ') + ) + strings.push( + red(' ║╔═╝ ║║ ║╔╗║') + + yellow(' ║╔╗╔╗║ ║╔══╝ ║╔═╗║ ') + + red('║║ ║╔╗╔╝ ║║ ║║ ') + ) + strings.push( + red(' ║║ ║╚═╗ ║║║║ ') + + yellow('║║╚╝║║ ║╚══╗ ║╚═╝║') + + red(' ╔╝╚╗ ║║║║ ║╚═╝║ ') + ) + strings.push( + red(' ╚╝ ╚══╝ ╚╝╚╝ ╚╝ ╚╝ ') + + yellow('╚═══╝') + + red(' ╚═══╝ ╚══╝ ╚╝╚╝ ╚═══╝ ') + ) + strings.push( + ' ' + grey(' - wonderful nodejs task manager ') + ' ' + ) + } + const v = + version + + new Array(version.length >= 10 ? 10 : version.length - version.length).join( + ' ' + ) + const commonSpace = displayOnlyVersion ? ' ' : ' ' + strings.push(commonSpace + red('╔═══════════════╗ ')) + strings.push(commonSpace + red('║') + yellow(' v' + v + ' ') + red('║ ')) + strings.push(commonSpace + red('╚═══════════════╝ ') + '\r\n') + return strings.join('\r\n') } diff --git a/lib/app/.eslintrc.yml b/lib/app/.eslintrc.yml deleted file mode 100644 index 9b9e596..0000000 --- a/lib/app/.eslintrc.yml +++ /dev/null @@ -1,21 +0,0 @@ -extends: - - eslint:recommended - - standard - - prettier - - prettier/standard - -parser: babel-eslint - -plugins: - - standard - - prettier - -rules: - prettier/prettier: - - error - - trailingComma: es5 - singleQuote: true - semi: false - - # TODO: The following rules should be removed incrementally in order to fully - # integrate lint rules from the Standard ESLint config and Prettier diff --git a/lib/app/index.html b/lib/app/index.html deleted file mode 100644 index 823bf26..0000000 --- a/lib/app/index.html +++ /dev/null @@ -1,74 +0,0 @@ - - - - - - flamebird - - - - - - - - - - - - -
-
- flamebird - -
- - - - - - -
- - - - -
- -
-
- - - -
- - - - - - - - - - - - diff --git a/lib/app/libs/ansi_up.js b/lib/app/libs/ansi_up.js deleted file mode 100644 index b8149b1..0000000 --- a/lib/app/libs/ansi_up.js +++ /dev/null @@ -1,327 +0,0 @@ -/* ansi_up.js - * author : Dru Nelson - * license : MIT - * http://github.com/drudru/ansi_up - */ -;(function(root, factory) { - if (typeof define === 'function' && define.amd) { - // AMD. Register as an anonymous module. - define(['exports'], factory) - } else if ( - typeof exports === 'object' && - typeof exports.nodeName !== 'string' - ) { - // CommonJS - factory(exports) - } else { - // Browser globals - var exp = {} - factory(exp) - root.AnsiUp = exp.default - } -})(this, function(exports) { - 'use strict' - function rgx(tmplObj) { - var subst = [] - for (var _i = 1; _i < arguments.length; _i++) { - subst[_i - 1] = arguments[_i] - } - var regexText = tmplObj.raw[0] - var wsrgx = /^\s+|\s+\n|\s+#[\s\S]+?\n/gm - var txt2 = regexText.replace(wsrgx, '') - return new RegExp(txt2, 'm') - } - var AnsiUp = (function() { - function AnsiUp() { - this.VERSION = '3.0.0' - this.ansi_colors = [ - [ - { rgb: [0, 0, 0], class_name: 'ansi-black' }, - { rgb: [187, 0, 0], class_name: 'ansi-red' }, - { rgb: [0, 187, 0], class_name: 'ansi-green' }, - { rgb: [187, 187, 0], class_name: 'ansi-yellow' }, - { rgb: [0, 0, 187], class_name: 'ansi-blue' }, - { rgb: [187, 0, 187], class_name: 'ansi-magenta' }, - { rgb: [0, 187, 187], class_name: 'ansi-cyan' }, - { rgb: [255, 255, 255], class_name: 'ansi-white' }, - ], - [ - { rgb: [85, 85, 85], class_name: 'ansi-bright-black' }, - { rgb: [255, 85, 85], class_name: 'ansi-bright-red' }, - { rgb: [0, 255, 0], class_name: 'ansi-bright-green' }, - { rgb: [255, 255, 85], class_name: 'ansi-bright-yellow' }, - { rgb: [85, 85, 255], class_name: 'ansi-bright-blue' }, - { rgb: [255, 85, 255], class_name: 'ansi-bright-magenta' }, - { rgb: [85, 255, 255], class_name: 'ansi-bright-cyan' }, - { rgb: [255, 255, 255], class_name: 'ansi-bright-white' }, - ], - ] - this.htmlFormatter = { - transform: function(fragment, instance) { - var txt = fragment.text - if (txt.length === 0) return txt - if (instance._escape_for_html) txt = instance.old_escape_for_html(txt) - if (!fragment.bold && fragment.fg === null && fragment.bg === null) - return txt - var styles = [] - var classes = [] - var fg = fragment.fg - var bg = fragment.bg - if (fragment.bold) styles.push('font-weight:bold') - if (!instance._use_classes) { - if (fg) styles.push('color:rgb(' + fg.rgb.join(',') + ')') - if (bg) styles.push('background-color:rgb(' + bg.rgb + ')') - } else { - if (fg) { - if (fg.class_name !== 'truecolor') { - classes.push(fg.class_name + '-fg') - } else { - styles.push('color:rgb(' + fg.rgb.join(',') + ')') - } - } - if (bg) { - if (bg.class_name !== 'truecolor') { - classes.push(bg.class_name + '-bg') - } else { - styles.push('background-color:rgb(' + bg.rgb.join(',') + ')') - } - } - } - var class_string = '' - var style_string = '' - if (classes.length) - class_string = ' class="' + classes.join(' ') + '"' - if (styles.length) style_string = ' style="' + styles.join(';') + '"' - return '' + txt + '
' - }, - compose: function(segments, instance) { - return segments.join('') - }, - } - this.textFormatter = { - transform: function(fragment, instance) { - return fragment.text - }, - compose: function(segments, instance) { - return segments.join('') - }, - } - this.setup_256_palette() - this._use_classes = false - this._escape_for_html = true - this.bold = false - this.fg = this.bg = null - this._buffer = '' - } - Object.defineProperty(AnsiUp.prototype, 'use_classes', { - get: function() { - return this._use_classes - }, - set: function(arg) { - this._use_classes = arg - }, - enumerable: true, - configurable: true, - }) - Object.defineProperty(AnsiUp.prototype, 'escape_for_html', { - get: function() { - return this._escape_for_html - }, - set: function(arg) { - this._escape_for_html = arg - }, - enumerable: true, - configurable: true, - }) - AnsiUp.prototype.setup_256_palette = function() { - var _this = this - this.palette_256 = [] - this.ansi_colors.forEach(function(palette) { - palette.forEach(function(rec) { - _this.palette_256.push(rec) - }) - }) - var levels = [0, 95, 135, 175, 215, 255] - for (var r = 0; r < 6; ++r) { - for (var g = 0; g < 6; ++g) { - for (var b = 0; b < 6; ++b) { - var col = { - rgb: [levels[r], levels[g], levels[b]], - class_name: 'truecolor', - } - this.palette_256.push(col) - } - } - } - var grey_level = 8 - for (var i = 0; i < 24; ++i, grey_level += 10) { - var gry = { - rgb: [grey_level, grey_level, grey_level], - class_name: 'truecolor', - } - this.palette_256.push(gry) - } - } - AnsiUp.prototype.old_escape_for_html = function(txt) { - return txt.replace(/[&<>]/gm, function(str) { - if (str === '&') return '&' - if (str === '<') return '<' - if (str === '>') return '>' - }) - } - AnsiUp.prototype.old_linkify = function(txt) { - return txt.replace(/(https?:\/\/[^\s]+)/gm, function(str) { - return '' + str + '' - }) - } - AnsiUp.prototype.detect_incomplete_ansi = function(txt) { - return !/.*?[\x40-\x7e]/.test(txt) - } - AnsiUp.prototype.detect_incomplete_link = function(txt) { - var found = false - for (var i = txt.length - 1; i > 0; i--) { - if (/\s|\x1B/.test(txt[i])) { - found = true - break - } - } - if (!found) { - if (/(https?:\/\/[^\s]+)/.test(txt)) return 0 - else return -1 - } - var prefix = txt.substr(i + 1, 4) - if (prefix.length === 0) return -1 - if ('http'.indexOf(prefix) === 0) return i + 1 - } - AnsiUp.prototype.ansi_to = function(txt, formatter) { - var pkt = this._buffer + txt - this._buffer = '' - var raw_text_pkts = pkt.split(/\x1B\[/) - if (raw_text_pkts.length === 1) raw_text_pkts.push('') - this.handle_incomplete_sequences(raw_text_pkts) - var first_chunk = this.with_state(raw_text_pkts.shift()) - var blocks = new Array(raw_text_pkts.length) - for (var i = 0, len = raw_text_pkts.length; i < len; ++i) { - blocks[i] = formatter.transform( - this.process_ansi(raw_text_pkts[i]), - this - ) - } - if (first_chunk.text.length > 0) - blocks.unshift(formatter.transform(first_chunk, this)) - return formatter.compose(blocks, this) - } - AnsiUp.prototype.ansi_to_html = function(txt) { - return this.ansi_to(txt, this.htmlFormatter) - } - AnsiUp.prototype.ansi_to_text = function(txt) { - return this.ansi_to(txt, this.textFormatter) - } - AnsiUp.prototype.with_state = function(text) { - return { bold: this.bold, fg: this.fg, bg: this.bg, text: text } - } - AnsiUp.prototype.handle_incomplete_sequences = function(chunks) { - var last_chunk = chunks[chunks.length - 1] - if (last_chunk.length > 0 && this.detect_incomplete_ansi(last_chunk)) { - this._buffer = '\x1B[' + last_chunk - chunks.pop() - chunks.push('') - } else { - if (last_chunk.slice(-1) === '\x1B') { - this._buffer = '\x1B' - console.log('raw', chunks) - chunks.pop() - chunks.push(last_chunk.substr(0, last_chunk.length - 1)) - console.log(chunks) - console.log(last_chunk) - } - if ( - chunks.length === 2 && - chunks[1] === '' && - chunks[0].slice(-1) === '\x1B' - ) { - this._buffer = '\x1B' - last_chunk = chunks.shift() - chunks.unshift(last_chunk.substr(0, last_chunk.length - 1)) - } - } - } - AnsiUp.prototype.process_ansi = function(block) { - if (!this._sgr_regex) { - this._sgr_regex = ((_a = [ - '\n ^ # beginning of line\n ([!<-?]?) # a private-mode char (!, <, =, >, ?)\n ([d;]*) # any digits or semicolons\n ([ -/]? # an intermediate modifier\n [@-~]) # the command\n ([sS]*) # any text following this CSI sequence\n ', - ]), - (_a.raw = [ - '\n ^ # beginning of line\n ([!\\x3c-\\x3f]?) # a private-mode char (!, <, =, >, ?)\n ([\\d;]*) # any digits or semicolons\n ([\\x20-\\x2f]? # an intermediate modifier\n [\\x40-\\x7e]) # the command\n ([\\s\\S]*) # any text following this CSI sequence\n ', - ]), - rgx(_a)) - } - var matches = block.match(this._sgr_regex) - if (!matches) { - return this.with_state(block) - } - var orig_txt = matches[4] - if (matches[1] !== '' || matches[3] !== 'm') { - return this.with_state(orig_txt) - } - var sgr_cmds = matches[2].split(';') - while (sgr_cmds.length > 0) { - var sgr_cmd_str = sgr_cmds.shift() - var num = parseInt(sgr_cmd_str, 10) - if (isNaN(num) || num === 0) { - this.fg = this.bg = null - this.bold = false - } else if (num === 1) { - this.bold = true - } else if (num === 22) { - this.bold = false - } else if (num === 39) { - this.fg = null - } else if (num === 49) { - this.bg = null - } else if (num >= 30 && num < 38) { - this.fg = this.ansi_colors[0][num - 30] - } else if (num >= 40 && num < 48) { - this.bg = this.ansi_colors[0][num - 40] - } else if (num >= 90 && num < 98) { - this.fg = this.ansi_colors[1][num - 90] - } else if (num >= 100 && num < 108) { - this.bg = this.ansi_colors[1][num - 100] - } else if (num === 38 || num === 48) { - if (sgr_cmds.length > 0) { - var is_foreground = num === 38 - var mode_cmd = sgr_cmds.shift() - if (mode_cmd === '5' && sgr_cmds.length > 0) { - var palette_index = parseInt(sgr_cmds.shift(), 10) - if (palette_index >= 0 && palette_index <= 255) { - if (is_foreground) this.fg = this.palette_256[palette_index] - else this.bg = this.palette_256[palette_index] - } - } - if (mode_cmd === '2' && sgr_cmds.length > 2) { - var r = parseInt(sgr_cmds.shift(), 10) - var g = parseInt(sgr_cmds.shift(), 10) - var b = parseInt(sgr_cmds.shift(), 10) - if ( - r >= 0 && - r <= 255 && - (g >= 0 && g <= 255) && - (b >= 0 && b <= 255) - ) { - var c = { rgb: [r, g, b], class_name: 'truecolor' } - if (is_foreground) this.fg = c - else this.bg = c - } - } - } - } - } - return this.with_state(orig_txt) - var _a - } - return AnsiUp - })() - // # sourceMappingURL=ansi_up.js.map - Object.defineProperty(exports, '__esModule', { value: true }) - exports.default = AnsiUp -}) diff --git a/lib/app/libs/jquery.min.js b/lib/app/libs/jquery.min.js deleted file mode 100644 index df55f41..0000000 --- a/lib/app/libs/jquery.min.js +++ /dev/null @@ -1,5311 +0,0 @@ -/*! jQuery v3.3.1 | (c) JS Foundation and other contributors | jquery.org/license */ -!(function(e, t) { - 'use strict' - typeof module === 'object' && typeof module.exports === 'object' - ? (module.exports = e.document - ? t(e, !0) - : function(e) { - if (!e.document) - throw new Error('jQuery requires a window with a document') - return t(e) - }) - : t(e) -})(typeof window !== 'undefined' ? window : this, function(e, t) { - 'use strict' - var n = [], - r = e.document, - i = Object.getPrototypeOf, - o = n.slice, - a = n.concat, - s = n.push, - u = n.indexOf, - l = {}, - c = l.toString, - f = l.hasOwnProperty, - p = f.toString, - d = p.call(Object), - h = {}, - g = function e(t) { - return typeof t === 'function' && typeof t.nodeType !== 'number' - }, - y = function e(t) { - return t != null && t === t.window - }, - v = { type: !0, src: !0, noModule: !0 } - function m(e, t, n) { - var i, - o = (t = t || r).createElement('script') - if (((o.text = e), n)) for (i in v) n[i] && (o[i] = n[i]) - t.head.appendChild(o).parentNode.removeChild(o) - } - function x(e) { - return e == null - ? e + '' - : typeof e === 'object' || typeof e === 'function' - ? l[c.call(e)] || 'object' - : typeof e - } - var b = '3.3.1', - w = function(e, t) { - return new w.fn.init(e, t) - }, - T = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g - ;(w.fn = w.prototype = { - jquery: '3.3.1', - constructor: w, - length: 0, - toArray: function() { - return o.call(this) - }, - get: function(e) { - return e == null ? o.call(this) : e < 0 ? this[e + this.length] : this[e] - }, - pushStack: function(e) { - var t = w.merge(this.constructor(), e) - return (t.prevObject = this), t - }, - each: function(e) { - return w.each(this, e) - }, - map: function(e) { - return this.pushStack( - w.map(this, function(t, n) { - return e.call(t, n, t) - }) - ) - }, - slice: function() { - return this.pushStack(o.apply(this, arguments)) - }, - first: function() { - return this.eq(0) - }, - last: function() { - return this.eq(-1) - }, - eq: function(e) { - var t = this.length, - n = +e + (e < 0 ? t : 0) - return this.pushStack(n >= 0 && n < t ? [this[n]] : []) - }, - end: function() { - return this.prevObject || this.constructor() - }, - push: s, - sort: n.sort, - splice: n.splice, - }), - (w.extend = w.fn.extend = function() { - var e, - t, - n, - r, - i, - o, - a = arguments[0] || {}, - s = 1, - u = arguments.length, - l = !1 - for ( - typeof a === 'boolean' && ((l = a), (a = arguments[s] || {}), s++), - typeof a === 'object' || g(a) || (a = {}), - s === u && ((a = this), s--); - s < u; - s++ - ) - if ((e = arguments[s]) != null) - for (t in e) - (n = a[t]), - a !== (r = e[t]) && - (l && r && (w.isPlainObject(r) || (i = Array.isArray(r))) - ? (i - ? ((i = !1), (o = n && Array.isArray(n) ? n : [])) - : (o = n && w.isPlainObject(n) ? n : {}), - (a[t] = w.extend(l, o, r))) - : void 0 !== r && (a[t] = r)) - return a - }), - w.extend({ - expando: 'jQuery' + ('3.3.1' + Math.random()).replace(/\D/g, ''), - isReady: !0, - error: function(e) { - throw new Error(e) - }, - noop: function() {}, - isPlainObject: function(e) { - var t, n - return ( - !(!e || c.call(e) !== '[object Object]') && - (!(t = i(e)) || - (typeof (n = f.call(t, 'constructor') && t.constructor) === - 'function' && - p.call(n) === d)) - ) - }, - isEmptyObject: function(e) { - var t - for (t in e) return !1 - return !0 - }, - globalEval: function(e) { - m(e) - }, - each: function(e, t) { - var n, - r = 0 - if (C(e)) { - for (n = e.length; r < n; r++) if (!1 === t.call(e[r], r, e[r])) break - } else for (r in e) if (!1 === t.call(e[r], r, e[r])) break - return e - }, - trim: function(e) { - return e == null ? '' : (e + '').replace(T, '') - }, - makeArray: function(e, t) { - var n = t || [] - return ( - e != null && - (C(Object(e)) - ? w.merge(n, typeof e === 'string' ? [e] : e) - : s.call(n, e)), - n - ) - }, - inArray: function(e, t, n) { - return t == null ? -1 : u.call(t, e, n) - }, - merge: function(e, t) { - for (var n = +t.length, r = 0, i = e.length; r < n; r++) e[i++] = t[r] - return (e.length = i), e - }, - grep: function(e, t, n) { - for (var r, i = [], o = 0, a = e.length, s = !n; o < a; o++) - (r = !t(e[o], o)) !== s && i.push(e[o]) - return i - }, - map: function(e, t, n) { - var r, - i, - o = 0, - s = [] - if (C(e)) - for (r = e.length; o < r; o++) - (i = t(e[o], o, n)) != null && s.push(i) - else for (o in e) (i = t(e[o], o, n)) != null && s.push(i) - return a.apply([], s) - }, - guid: 1, - support: h, - }), - typeof Symbol === 'function' && - (w.fn[Symbol.iterator] = n[Symbol.iterator]), - w.each( - 'Boolean Number String Function Array Date RegExp Object Error Symbol'.split( - ' ' - ), - function(e, t) { - l['[object ' + t + ']'] = t.toLowerCase() - } - ) - function C(e) { - var t = !!e && 'length' in e && e.length, - n = x(e) - return ( - !g(e) && - !y(e) && - (n === 'array' || - t === 0 || - (typeof t === 'number' && t > 0 && t - 1 in e)) - ) - } - var E = (function(e) { - var t, - n, - r, - i, - o, - a, - s, - u, - l, - c, - f, - p, - d, - h, - g, - y, - v, - m, - x, - b = 'sizzle' + 1 * new Date(), - w = e.document, - T = 0, - C = 0, - E = ae(), - k = ae(), - S = ae(), - D = function(e, t) { - return e === t && (f = !0), 0 - }, - N = {}.hasOwnProperty, - A = [], - j = A.pop, - q = A.push, - L = A.push, - H = A.slice, - O = function(e, t) { - for (var n = 0, r = e.length; n < r; n++) if (e[n] === t) return n - return -1 - }, - P = - 'checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped', - M = '[\\x20\\t\\r\\n\\f]', - R = '(?:\\\\.|[\\w-]|[^\0-\\xa0])+', - I = - '\\[' + - M + - '*(' + - R + - ')(?:' + - M + - '*([*^$|!~]?=)' + - M + - '*(?:\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)"|(' + - R + - '))|)' + - M + - '*\\]', - W = - ':(' + - R + - ')(?:\\(((\'((?:\\\\.|[^\\\\\'])*)\'|"((?:\\\\.|[^\\\\"])*)")|((?:\\\\.|[^\\\\()[\\]]|' + - I + - ')*)|.*)\\)|)', - $ = new RegExp(M + '+', 'g'), - B = new RegExp('^' + M + '+|((?:^|[^\\\\])(?:\\\\.)*)' + M + '+$', 'g'), - F = new RegExp('^' + M + '*,' + M + '*'), - _ = new RegExp('^' + M + '*([>+~]|' + M + ')' + M + '*'), - z = new RegExp('=' + M + '*([^\\]\'"]*?)' + M + '*\\]', 'g'), - X = new RegExp(W), - U = new RegExp('^' + R + '$'), - V = { - ID: new RegExp('^#(' + R + ')'), - CLASS: new RegExp('^\\.(' + R + ')'), - TAG: new RegExp('^(' + R + '|[*])'), - ATTR: new RegExp('^' + I), - PSEUDO: new RegExp('^' + W), - CHILD: new RegExp( - '^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\(' + - M + - '*(even|odd|(([+-]|)(\\d*)n|)' + - M + - '*(?:([+-]|)' + - M + - '*(\\d+)|))' + - M + - '*\\)|)', - 'i' - ), - bool: new RegExp('^(?:' + P + ')$', 'i'), - needsContext: new RegExp( - '^' + - M + - '*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\(' + - M + - '*((?:-\\d)?\\d*)' + - M + - '*\\)|)(?=[^-]|$)', - 'i' - ), - }, - G = /^(?:input|select|textarea|button)$/i, - Y = /^h\d$/i, - Q = /^[^{]+\{\s*\[native \w/, - J = /^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/, - K = /[+~]/, - Z = new RegExp('\\\\([\\da-f]{1,6}' + M + '?|(' + M + ')|.)', 'ig'), - ee = function(e, t, n) { - var r = '0x' + t - 65536 - return r !== r || n - ? t - : r < 0 - ? String.fromCharCode(r + 65536) - : String.fromCharCode((r >> 10) | 55296, (1023 & r) | 56320) - }, - te = /([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g, - ne = function(e, t) { - return t - ? e === '\0' - ? '\ufffd' - : e.slice(0, -1) + - '\\' + - e.charCodeAt(e.length - 1).toString(16) + - ' ' - : '\\' + e - }, - re = function() { - p() - }, - ie = me( - function(e) { - return !0 === e.disabled && ('form' in e || 'label' in e) - }, - { dir: 'parentNode', next: 'legend' } - ) - try { - L.apply((A = H.call(w.childNodes)), w.childNodes), - A[w.childNodes.length].nodeType - } catch (e) { - L = { - apply: A.length - ? function(e, t) { - q.apply(e, H.call(t)) - } - : function(e, t) { - var n = e.length, - r = 0 - while ((e[n++] = t[r++])); - e.length = n - 1 - }, - } - } - function oe(e, t, r, i) { - var o, - s, - l, - c, - f, - h, - v, - m = t && t.ownerDocument, - T = t ? t.nodeType : 9 - if ( - ((r = r || []), - typeof e !== 'string' || !e || (T !== 1 && T !== 9 && T !== 11)) - ) - return r - if ( - !i && - ((t ? t.ownerDocument || t : w) !== d && p(t), (t = t || d), g) - ) { - if (T !== 11 && (f = J.exec(e))) - if ((o = f[1])) { - if (T === 9) { - if (!(l = t.getElementById(o))) return r - if (l.id === o) return r.push(l), r - } else if (m && (l = m.getElementById(o)) && x(t, l) && l.id === o) - return r.push(l), r - } else { - if (f[2]) return L.apply(r, t.getElementsByTagName(e)), r - if ( - (o = f[3]) && - n.getElementsByClassName && - t.getElementsByClassName - ) - return L.apply(r, t.getElementsByClassName(o)), r - } - if (n.qsa && !S[e + ' '] && (!y || !y.test(e))) { - if (T !== 1) (m = t), (v = e) - else if (t.nodeName.toLowerCase() !== 'object') { - ;(c = t.getAttribute('id')) - ? (c = c.replace(te, ne)) - : t.setAttribute('id', (c = b)), - (s = (h = a(e)).length) - while (s--) h[s] = '#' + c + ' ' + ve(h[s]) - ;(v = h.join(',')), (m = (K.test(e) && ge(t.parentNode)) || t) - } - if (v) - try { - return L.apply(r, m.querySelectorAll(v)), r - } catch (e) { - } finally { - c === b && t.removeAttribute('id') - } - } - } - return u(e.replace(B, '$1'), t, r, i) - } - function ae() { - var e = [] - function t(n, i) { - return ( - e.push(n + ' ') > r.cacheLength && delete t[e.shift()], - (t[n + ' '] = i) - ) - } - return t - } - function se(e) { - return (e[b] = !0), e - } - function ue(e) { - var t = d.createElement('fieldset') - try { - return !!e(t) - } catch (e) { - return !1 - } finally { - t.parentNode && t.parentNode.removeChild(t), (t = null) - } - } - function le(e, t) { - var n = e.split('|'), - i = n.length - while (i--) r.attrHandle[n[i]] = t - } - function ce(e, t) { - var n = t && e, - r = - n && - e.nodeType === 1 && - t.nodeType === 1 && - e.sourceIndex - t.sourceIndex - if (r) return r - if (n) while ((n = n.nextSibling)) if (n === t) return -1 - return e ? 1 : -1 - } - function fe(e) { - return function(t) { - return t.nodeName.toLowerCase() === 'input' && t.type === e - } - } - function pe(e) { - return function(t) { - var n = t.nodeName.toLowerCase() - return (n === 'input' || n === 'button') && t.type === e - } - } - function de(e) { - return function(t) { - return 'form' in t - ? t.parentNode && !1 === t.disabled - ? 'label' in t - ? 'label' in t.parentNode - ? t.parentNode.disabled === e - : t.disabled === e - : t.isDisabled === e || (t.isDisabled !== !e && ie(t) === e) - : t.disabled === e - : 'label' in t && t.disabled === e - } - } - function he(e) { - return se(function(t) { - return ( - (t = +t), - se(function(n, r) { - var i, - o = e([], n.length, t), - a = o.length - while (a--) n[(i = o[a])] && (n[i] = !(r[i] = n[i])) - }) - ) - }) - } - function ge(e) { - return e && typeof e.getElementsByTagName !== 'undefined' && e - } - ;(n = oe.support = {}), - (o = oe.isXML = function(e) { - var t = e && (e.ownerDocument || e).documentElement - return !!t && t.nodeName !== 'HTML' - }), - (p = oe.setDocument = function(e) { - var t, - i, - a = e ? e.ownerDocument || e : w - return a !== d && a.nodeType === 9 && a.documentElement - ? ((d = a), - (h = d.documentElement), - (g = !o(d)), - w !== d && - (i = d.defaultView) && - i.top !== i && - (i.addEventListener - ? i.addEventListener('unload', re, !1) - : i.attachEvent && i.attachEvent('onunload', re)), - (n.attributes = ue(function(e) { - return (e.className = 'i'), !e.getAttribute('className') - })), - (n.getElementsByTagName = ue(function(e) { - return ( - e.appendChild(d.createComment('')), - !e.getElementsByTagName('*').length - ) - })), - (n.getElementsByClassName = Q.test(d.getElementsByClassName)), - (n.getById = ue(function(e) { - return ( - (h.appendChild(e).id = b), - !d.getElementsByName || !d.getElementsByName(b).length - ) - })), - n.getById - ? ((r.filter.ID = function(e) { - var t = e.replace(Z, ee) - return function(e) { - return e.getAttribute('id') === t - } - }), - (r.find.ID = function(e, t) { - if (typeof t.getElementById !== 'undefined' && g) { - var n = t.getElementById(e) - return n ? [n] : [] - } - })) - : ((r.filter.ID = function(e) { - var t = e.replace(Z, ee) - return function(e) { - var n = - typeof e.getAttributeNode !== 'undefined' && - e.getAttributeNode('id') - return n && n.value === t - } - }), - (r.find.ID = function(e, t) { - if (typeof t.getElementById !== 'undefined' && g) { - var n, - r, - i, - o = t.getElementById(e) - if (o) { - if ((n = o.getAttributeNode('id')) && n.value === e) - return [o] - ;(i = t.getElementsByName(e)), (r = 0) - while ((o = i[r++])) - if ((n = o.getAttributeNode('id')) && n.value === e) - return [o] - } - return [] - } - })), - (r.find.TAG = n.getElementsByTagName - ? function(e, t) { - return typeof t.getElementsByTagName !== 'undefined' - ? t.getElementsByTagName(e) - : n.qsa ? t.querySelectorAll(e) : void 0 - } - : function(e, t) { - var n, - r = [], - i = 0, - o = t.getElementsByTagName(e) - if (e === '*') { - while ((n = o[i++])) n.nodeType === 1 && r.push(n) - return r - } - return o - }), - (r.find.CLASS = - n.getElementsByClassName && - function(e, t) { - if (typeof t.getElementsByClassName !== 'undefined' && g) - return t.getElementsByClassName(e) - }), - (v = []), - (y = []), - (n.qsa = Q.test(d.querySelectorAll)) && - (ue(function(e) { - ;(h.appendChild(e).innerHTML = - ""), - e.querySelectorAll("[msallowcapture^='']").length && - y.push('[*^$]=' + M + '*(?:\'\'|"")'), - e.querySelectorAll('[selected]').length || - y.push('\\[' + M + '*(?:value|' + P + ')'), - e.querySelectorAll('[id~=' + b + '-]').length || y.push('~='), - e.querySelectorAll(':checked').length || y.push(':checked'), - e.querySelectorAll('a#' + b + '+*').length || - y.push('.#.+[+~]') - }), - ue(function(e) { - e.innerHTML = - "" - var t = d.createElement('input') - t.setAttribute('type', 'hidden'), - e.appendChild(t).setAttribute('name', 'D'), - e.querySelectorAll('[name=d]').length && - y.push('name' + M + '*[*^$|!~]?='), - e.querySelectorAll(':enabled').length !== 2 && - y.push(':enabled', ':disabled'), - (h.appendChild(e).disabled = !0), - e.querySelectorAll(':disabled').length !== 2 && - y.push(':enabled', ':disabled'), - e.querySelectorAll('*,:x'), - y.push(',.*:') - })), - (n.matchesSelector = Q.test( - (m = - h.matches || - h.webkitMatchesSelector || - h.mozMatchesSelector || - h.oMatchesSelector || - h.msMatchesSelector) - )) && - ue(function(e) { - ;(n.disconnectedMatch = m.call(e, '*')), - m.call(e, "[s!='']:x"), - v.push('!=', W) - }), - (y = y.length && new RegExp(y.join('|'))), - (v = v.length && new RegExp(v.join('|'))), - (t = Q.test(h.compareDocumentPosition)), - (x = - t || Q.test(h.contains) - ? function(e, t) { - var n = e.nodeType === 9 ? e.documentElement : e, - r = t && t.parentNode - return ( - e === r || - !( - !r || - r.nodeType !== 1 || - !(n.contains - ? n.contains(r) - : e.compareDocumentPosition && - 16 & e.compareDocumentPosition(r)) - ) - ) - } - : function(e, t) { - if (t) while ((t = t.parentNode)) if (t === e) return !0 - return !1 - }), - (D = t - ? function(e, t) { - if (e === t) return (f = !0), 0 - var r = - !e.compareDocumentPosition - !t.compareDocumentPosition - return ( - r || - (1 & - (r = - (e.ownerDocument || e) === (t.ownerDocument || t) - ? e.compareDocumentPosition(t) - : 1) || - (!n.sortDetached && t.compareDocumentPosition(e) === r) - ? e === d || (e.ownerDocument === w && x(w, e)) - ? -1 - : t === d || (t.ownerDocument === w && x(w, t)) - ? 1 - : c ? O(c, e) - O(c, t) : 0 - : 4 & r ? -1 : 1) - ) - } - : function(e, t) { - if (e === t) return (f = !0), 0 - var n, - r = 0, - i = e.parentNode, - o = t.parentNode, - a = [e], - s = [t] - if (!i || !o) - return e === d - ? -1 - : t === d ? 1 : i ? -1 : o ? 1 : c ? O(c, e) - O(c, t) : 0 - if (i === o) return ce(e, t) - n = e - while ((n = n.parentNode)) a.unshift(n) - n = t - while ((n = n.parentNode)) s.unshift(n) - while (a[r] === s[r]) r++ - return r - ? ce(a[r], s[r]) - : a[r] === w ? -1 : s[r] === w ? 1 : 0 - }), - d) - : d - }), - (oe.matches = function(e, t) { - return oe(e, null, null, t) - }), - (oe.matchesSelector = function(e, t) { - if ( - ((e.ownerDocument || e) !== d && p(e), - (t = t.replace(z, "='$1']")), - n.matchesSelector && - g && - !S[t + ' '] && - (!v || !v.test(t)) && - (!y || !y.test(t))) - ) - try { - var r = m.call(e, t) - if ( - r || - n.disconnectedMatch || - (e.document && e.document.nodeType !== 11) - ) - return r - } catch (e) {} - return oe(t, d, null, [e]).length > 0 - }), - (oe.contains = function(e, t) { - return (e.ownerDocument || e) !== d && p(e), x(e, t) - }), - (oe.attr = function(e, t) { - ;(e.ownerDocument || e) !== d && p(e) - var i = r.attrHandle[t.toLowerCase()], - o = i && N.call(r.attrHandle, t.toLowerCase()) ? i(e, t, !g) : void 0 - return void 0 !== o - ? o - : n.attributes || !g - ? e.getAttribute(t) - : (o = e.getAttributeNode(t)) && o.specified ? o.value : null - }), - (oe.escape = function(e) { - return (e + '').replace(te, ne) - }), - (oe.error = function(e) { - throw new Error('Syntax error, unrecognized expression: ' + e) - }), - (oe.uniqueSort = function(e) { - var t, - r = [], - i = 0, - o = 0 - if ( - ((f = !n.detectDuplicates), - (c = !n.sortStable && e.slice(0)), - e.sort(D), - f) - ) { - while ((t = e[o++])) t === e[o] && (i = r.push(o)) - while (i--) e.splice(r[i], 1) - } - return (c = null), e - }), - (i = oe.getText = function(e) { - var t, - n = '', - r = 0, - o = e.nodeType - if (o) { - if (o === 1 || o === 9 || o === 11) { - if (typeof e.textContent === 'string') return e.textContent - for (e = e.firstChild; e; e = e.nextSibling) n += i(e) - } else if (o === 3 || o === 4) return e.nodeValue - } else while ((t = e[r++])) n += i(t) - return n - }), - ((r = oe.selectors = { - cacheLength: 50, - createPseudo: se, - match: V, - attrHandle: {}, - find: {}, - relative: { - '>': { dir: 'parentNode', first: !0 }, - ' ': { dir: 'parentNode' }, - '+': { dir: 'previousSibling', first: !0 }, - '~': { dir: 'previousSibling' }, - }, - preFilter: { - ATTR: function(e) { - return ( - (e[1] = e[1].replace(Z, ee)), - (e[3] = (e[3] || e[4] || e[5] || '').replace(Z, ee)), - e[2] === '~=' && (e[3] = ' ' + e[3] + ' '), - e.slice(0, 4) - ) - }, - CHILD: function(e) { - return ( - (e[1] = e[1].toLowerCase()), - e[1].slice(0, 3) === 'nth' - ? (e[3] || oe.error(e[0]), - (e[4] = +(e[4] - ? e[5] + (e[6] || 1) - : 2 * (e[3] === 'even' || e[3] === 'odd'))), - (e[5] = +(e[7] + e[8] || e[3] === 'odd'))) - : e[3] && oe.error(e[0]), - e - ) - }, - PSEUDO: function(e) { - var t, - n = !e[6] && e[2] - return V.CHILD.test(e[0]) - ? null - : (e[3] - ? (e[2] = e[4] || e[5] || '') - : n && - X.test(n) && - (t = a(n, !0)) && - (t = n.indexOf(')', n.length - t) - n.length) && - ((e[0] = e[0].slice(0, t)), (e[2] = n.slice(0, t))), - e.slice(0, 3)) - }, - }, - filter: { - TAG: function(e) { - var t = e.replace(Z, ee).toLowerCase() - return e === '*' - ? function() { - return !0 - } - : function(e) { - return e.nodeName && e.nodeName.toLowerCase() === t - } - }, - CLASS: function(e) { - var t = E[e + ' '] - return ( - t || - ((t = new RegExp('(^|' + M + ')' + e + '(' + M + '|$)')) && - E(e, function(e) { - return t.test( - (typeof e.className === 'string' && e.className) || - (typeof e.getAttribute !== 'undefined' && - e.getAttribute('class')) || - '' - ) - })) - ) - }, - ATTR: function(e, t, n) { - return function(r) { - var i = oe.attr(r, e) - return i == null - ? t === '!=' - : !t || - ((i += ''), - t === '=' - ? i === n - : t === '!=' - ? i !== n - : t === '^=' - ? n && i.indexOf(n) === 0 - : t === '*=' - ? n && i.indexOf(n) > -1 - : t === '$=' - ? n && i.slice(-n.length) === n - : t === '~=' - ? (' ' + i.replace($, ' ') + ' ').indexOf(n) > - -1 - : t === '|=' && - (i === n || - i.slice(0, n.length + 1) === n + '-')) - } - }, - CHILD: function(e, t, n, r, i) { - var o = e.slice(0, 3) !== 'nth', - a = e.slice(-4) !== 'last', - s = t === 'of-type' - return r === 1 && i === 0 - ? function(e) { - return !!e.parentNode - } - : function(t, n, u) { - var l, - c, - f, - p, - d, - h, - g = o !== a ? 'nextSibling' : 'previousSibling', - y = t.parentNode, - v = s && t.nodeName.toLowerCase(), - m = !u && !s, - x = !1 - if (y) { - if (o) { - while (g) { - p = t - while ((p = p[g])) - if ( - s - ? p.nodeName.toLowerCase() === v - : p.nodeType === 1 - ) - return !1 - h = g = e === 'only' && !h && 'nextSibling' - } - return !0 - } - if (((h = [a ? y.firstChild : y.lastChild]), a && m)) { - ;(x = - (d = - (l = - (c = - (f = (p = y)[b] || (p[b] = {}))[p.uniqueID] || - (f[p.uniqueID] = {}))[e] || [])[0] === T && - l[1]) && l[2]), - (p = d && y.childNodes[d]) - while ((p = (++d && p && p[g]) || (x = d = 0) || h.pop())) - if (p.nodeType === 1 && ++x && p === t) { - c[e] = [T, d, x] - break - } - } else if ( - (m && - (x = d = - (l = - (c = - (f = (p = t)[b] || (p[b] = {}))[p.uniqueID] || - (f[p.uniqueID] = {}))[e] || [])[0] === T && l[1]), - !1 === x) - ) - while ((p = (++d && p && p[g]) || (x = d = 0) || h.pop())) - if ( - (s - ? p.nodeName.toLowerCase() === v - : p.nodeType === 1) && - ++x && - (m && - ((c = - (f = p[b] || (p[b] = {}))[p.uniqueID] || - (f[p.uniqueID] = {}))[e] = [T, x]), - p === t) - ) - break - return (x -= i) === r || (x % r == 0 && x / r >= 0) - } - } - }, - PSEUDO: function(e, t) { - var n, - i = - r.pseudos[e] || - r.setFilters[e.toLowerCase()] || - oe.error('unsupported pseudo: ' + e) - return i[b] - ? i(t) - : i.length > 1 - ? ((n = [e, e, '', t]), - r.setFilters.hasOwnProperty(e.toLowerCase()) - ? se(function(e, n) { - var r, - o = i(e, t), - a = o.length - while (a--) e[(r = O(e, o[a]))] = !(n[r] = o[a]) - }) - : function(e) { - return i(e, 0, n) - }) - : i - }, - }, - pseudos: { - not: se(function(e) { - var t = [], - n = [], - r = s(e.replace(B, '$1')) - return r[b] - ? se(function(e, t, n, i) { - var o, - a = r(e, null, i, []), - s = e.length - while (s--) (o = a[s]) && (e[s] = !(t[s] = o)) - }) - : function(e, i, o) { - return (t[0] = e), r(t, null, o, n), (t[0] = null), !n.pop() - } - }), - has: se(function(e) { - return function(t) { - return oe(e, t).length > 0 - } - }), - contains: se(function(e) { - return ( - (e = e.replace(Z, ee)), - function(t) { - return (t.textContent || t.innerText || i(t)).indexOf(e) > -1 - } - ) - }), - lang: se(function(e) { - return ( - U.test(e || '') || oe.error('unsupported lang: ' + e), - (e = e.replace(Z, ee).toLowerCase()), - function(t) { - var n - do { - if ( - (n = g - ? t.lang - : t.getAttribute('xml:lang') || t.getAttribute('lang')) - ) - return ( - (n = n.toLowerCase()) === e || n.indexOf(e + '-') === 0 - ) - } while ((t = t.parentNode) && t.nodeType === 1) - return !1 - } - ) - }), - target: function(t) { - var n = e.location && e.location.hash - return n && n.slice(1) === t.id - }, - root: function(e) { - return e === h - }, - focus: function(e) { - return ( - e === d.activeElement && - (!d.hasFocus || d.hasFocus()) && - !!(e.type || e.href || ~e.tabIndex) - ) - }, - enabled: de(!1), - disabled: de(!0), - checked: function(e) { - var t = e.nodeName.toLowerCase() - return ( - (t === 'input' && !!e.checked) || (t === 'option' && !!e.selected) - ) - }, - selected: function(e) { - return e.parentNode && e.parentNode.selectedIndex, !0 === e.selected - }, - empty: function(e) { - for (e = e.firstChild; e; e = e.nextSibling) - if (e.nodeType < 6) return !1 - return !0 - }, - parent: function(e) { - return !r.pseudos.empty(e) - }, - header: function(e) { - return Y.test(e.nodeName) - }, - input: function(e) { - return G.test(e.nodeName) - }, - button: function(e) { - var t = e.nodeName.toLowerCase() - return (t === 'input' && e.type === 'button') || t === 'button' - }, - text: function(e) { - var t - return ( - e.nodeName.toLowerCase() === 'input' && - e.type === 'text' && - ((t = e.getAttribute('type')) == null || - t.toLowerCase() === 'text') - ) - }, - first: he(function() { - return [0] - }), - last: he(function(e, t) { - return [t - 1] - }), - eq: he(function(e, t, n) { - return [n < 0 ? n + t : n] - }), - even: he(function(e, t) { - for (var n = 0; n < t; n += 2) e.push(n) - return e - }), - odd: he(function(e, t) { - for (var n = 1; n < t; n += 2) e.push(n) - return e - }), - lt: he(function(e, t, n) { - for (var r = n < 0 ? n + t : n; --r >= 0; ) e.push(r) - return e - }), - gt: he(function(e, t, n) { - for (var r = n < 0 ? n + t : n; ++r < t; ) e.push(r) - return e - }), - }, - }).pseudos.nth = - r.pseudos.eq) - for (t in { radio: !0, checkbox: !0, file: !0, password: !0, image: !0 }) - r.pseudos[t] = fe(t) - for (t in { submit: !0, reset: !0 }) r.pseudos[t] = pe(t) - function ye() {} - ;(ye.prototype = r.filters = r.pseudos), - (r.setFilters = new ye()), - (a = oe.tokenize = function(e, t) { - var n, - i, - o, - a, - s, - u, - l, - c = k[e + ' '] - if (c) return t ? 0 : c.slice(0) - ;(s = e), (u = []), (l = r.preFilter) - while (s) { - ;(n && !(i = F.exec(s))) || - (i && (s = s.slice(i[0].length) || s), u.push((o = []))), - (n = !1), - (i = _.exec(s)) && - ((n = i.shift()), - o.push({ value: n, type: i[0].replace(B, ' ') }), - (s = s.slice(n.length))) - for (a in r.filter) - !(i = V[a].exec(s)) || - (l[a] && !(i = l[a](i))) || - ((n = i.shift()), - o.push({ value: n, type: a, matches: i }), - (s = s.slice(n.length))) - if (!n) break - } - return t ? s.length : s ? oe.error(e) : k(e, u).slice(0) - }) - function ve(e) { - for (var t = 0, n = e.length, r = ''; t < n; t++) r += e[t].value - return r - } - function me(e, t, n) { - var r = t.dir, - i = t.next, - o = i || r, - a = n && o === 'parentNode', - s = C++ - return t.first - ? function(t, n, i) { - while ((t = t[r])) if (t.nodeType === 1 || a) return e(t, n, i) - return !1 - } - : function(t, n, u) { - var l, - c, - f, - p = [T, s] - if (u) { - while ((t = t[r])) - if ((t.nodeType === 1 || a) && e(t, n, u)) return !0 - } else - while ((t = t[r])) - if (t.nodeType === 1 || a) - if ( - ((f = t[b] || (t[b] = {})), - (c = f[t.uniqueID] || (f[t.uniqueID] = {})), - i && i === t.nodeName.toLowerCase()) - ) - t = t[r] || t - else { - if ((l = c[o]) && l[0] === T && l[1] === s) - return (p[2] = l[2]) - if (((c[o] = p), (p[2] = e(t, n, u)))) return !0 - } - return !1 - } - } - function xe(e) { - return e.length > 1 - ? function(t, n, r) { - var i = e.length - while (i--) if (!e[i](t, n, r)) return !1 - return !0 - } - : e[0] - } - function be(e, t, n) { - for (var r = 0, i = t.length; r < i; r++) oe(e, t[r], n) - return n - } - function we(e, t, n, r, i) { - for (var o, a = [], s = 0, u = e.length, l = t != null; s < u; s++) - (o = e[s]) && ((n && !n(o, r, i)) || (a.push(o), l && t.push(s))) - return a - } - function Te(e, t, n, r, i, o) { - return ( - r && !r[b] && (r = Te(r)), - i && !i[b] && (i = Te(i, o)), - se(function(o, a, s, u) { - var l, - c, - f, - p = [], - d = [], - h = a.length, - g = o || be(t || '*', s.nodeType ? [s] : s, []), - y = !e || (!o && t) ? g : we(g, p, e, s, u), - v = n ? (i || (o ? e : h || r) ? [] : a) : y - if ((n && n(y, v, s, u), r)) { - ;(l = we(v, d)), r(l, [], s, u), (c = l.length) - while (c--) (f = l[c]) && (v[d[c]] = !(y[d[c]] = f)) - } - if (o) { - if (i || e) { - if (i) { - ;(l = []), (c = v.length) - while (c--) (f = v[c]) && l.push((y[c] = f)) - i(null, (v = []), l, u) - } - c = v.length - while (c--) - (f = v[c]) && - (l = i ? O(o, f) : p[c]) > -1 && - (o[l] = !(a[l] = f)) - } - } else (v = we(v === a ? v.splice(h, v.length) : v)), i ? i(null, a, v, u) : L.apply(a, v) - }) - ) - } - function Ce(e) { - for ( - var t, - n, - i, - o = e.length, - a = r.relative[e[0].type], - s = a || r.relative[' '], - u = a ? 1 : 0, - c = me( - function(e) { - return e === t - }, - s, - !0 - ), - f = me( - function(e) { - return O(t, e) > -1 - }, - s, - !0 - ), - p = [ - function(e, n, r) { - var i = - (!a && (r || n !== l)) || - ((t = n).nodeType ? c(e, n, r) : f(e, n, r)) - return (t = null), i - }, - ]; - u < o; - u++ - ) - if ((n = r.relative[e[u].type])) p = [me(xe(p), n)] - else { - if ((n = r.filter[e[u].type].apply(null, e[u].matches))[b]) { - for (i = ++u; i < o; i++) if (r.relative[e[i].type]) break - return Te( - u > 1 && xe(p), - u > 1 && - ve( - e - .slice(0, u - 1) - .concat({ value: e[u - 2].type === ' ' ? '*' : '' }) - ).replace(B, '$1'), - n, - u < i && Ce(e.slice(u, i)), - i < o && Ce((e = e.slice(i))), - i < o && ve(e) - ) - } - p.push(n) - } - return xe(p) - } - function Ee(e, t) { - var n = t.length > 0, - i = e.length > 0, - o = function(o, a, s, u, c) { - var f, - h, - y, - v = 0, - m = '0', - x = o && [], - b = [], - w = l, - C = o || (i && r.find.TAG('*', c)), - E = (T += w == null ? 1 : Math.random() || 0.1), - k = C.length - for ( - c && (l = a === d || a || c); - m !== k && (f = C[m]) != null; - m++ - ) { - if (i && f) { - ;(h = 0), a || f.ownerDocument === d || (p(f), (s = !g)) - while ((y = e[h++])) - if (y(f, a || d, s)) { - u.push(f) - break - } - c && (T = E) - } - n && ((f = !y && f) && v--, o && x.push(f)) - } - if (((v += m), n && m !== v)) { - h = 0 - while ((y = t[h++])) y(x, b, a, s) - if (o) { - if (v > 0) while (m--) x[m] || b[m] || (b[m] = j.call(u)) - b = we(b) - } - L.apply(u, b), - c && !o && b.length > 0 && v + t.length > 1 && oe.uniqueSort(u) - } - return c && ((T = E), (l = w)), x - } - return n ? se(o) : o - } - return ( - (s = oe.compile = function(e, t) { - var n, - r = [], - i = [], - o = S[e + ' '] - if (!o) { - t || (t = a(e)), (n = t.length) - while (n--) (o = Ce(t[n]))[b] ? r.push(o) : i.push(o) - ;(o = S(e, Ee(i, r))).selector = e - } - return o - }), - (u = oe.select = function(e, t, n, i) { - var o, - u, - l, - c, - f, - p = typeof e === 'function' && e, - d = !i && a((e = p.selector || e)) - if (((n = n || []), d.length === 1)) { - if ( - (u = d[0] = d[0].slice(0)).length > 2 && - (l = u[0]).type === 'ID' && - t.nodeType === 9 && - g && - r.relative[u[1].type] - ) { - if (!(t = (r.find.ID(l.matches[0].replace(Z, ee), t) || [])[0])) - return n - p && (t = t.parentNode), (e = e.slice(u.shift().value.length)) - } - o = V.needsContext.test(e) ? 0 : u.length - while (o--) { - if (((l = u[o]), r.relative[(c = l.type)])) break - if ( - (f = r.find[c]) && - (i = f( - l.matches[0].replace(Z, ee), - (K.test(u[0].type) && ge(t.parentNode)) || t - )) - ) { - if ((u.splice(o, 1), !(e = i.length && ve(u)))) - return L.apply(n, i), n - break - } - } - } - return ( - (p || s(e, d))( - i, - t, - !g, - n, - !t || (K.test(e) && ge(t.parentNode)) || t - ), - n - ) - }), - (n.sortStable = - b - .split('') - .sort(D) - .join('') === b), - (n.detectDuplicates = !!f), - p(), - (n.sortDetached = ue(function(e) { - return 1 & e.compareDocumentPosition(d.createElement('fieldset')) - })), - ue(function(e) { - return ( - (e.innerHTML = ""), - e.firstChild.getAttribute('href') === '#' - ) - }) || - le('type|href|height|width', function(e, t, n) { - if (!n) return e.getAttribute(t, t.toLowerCase() === 'type' ? 1 : 2) - }), - (n.attributes && - ue(function(e) { - return ( - (e.innerHTML = ''), - e.firstChild.setAttribute('value', ''), - e.firstChild.getAttribute('value') === '' - ) - })) || - le('value', function(e, t, n) { - if (!n && e.nodeName.toLowerCase() === 'input') return e.defaultValue - }), - ue(function(e) { - return e.getAttribute('disabled') == null - }) || - le(P, function(e, t, n) { - var r - if (!n) - return !0 === e[t] - ? t.toLowerCase() - : (r = e.getAttributeNode(t)) && r.specified ? r.value : null - }), - oe - ) - })(e) - ;(w.find = E), - (w.expr = E.selectors), - (w.expr[':'] = w.expr.pseudos), - (w.uniqueSort = w.unique = E.uniqueSort), - (w.text = E.getText), - (w.isXMLDoc = E.isXML), - (w.contains = E.contains), - (w.escapeSelector = E.escape) - var k = function(e, t, n) { - var r = [], - i = void 0 !== n - while ((e = e[t]) && e.nodeType !== 9) - if (e.nodeType === 1) { - if (i && w(e).is(n)) break - r.push(e) - } - return r - }, - S = function(e, t) { - for (var n = []; e; e = e.nextSibling) - e.nodeType === 1 && e !== t && n.push(e) - return n - }, - D = w.expr.match.needsContext - function N(e, t) { - return e.nodeName && e.nodeName.toLowerCase() === t.toLowerCase() - } - var A = /^<([a-z][^\/\0>:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i - function j(e, t, n) { - return g(t) - ? w.grep(e, function(e, r) { - return !!t.call(e, r, e) !== n - }) - : t.nodeType - ? w.grep(e, function(e) { - return (e === t) !== n - }) - : typeof t !== 'string' - ? w.grep(e, function(e) { - return u.call(t, e) > -1 !== n - }) - : w.filter(t, e, n) - } - ;(w.filter = function(e, t, n) { - var r = t[0] - return ( - n && (e = ':not(' + e + ')'), - t.length === 1 && r.nodeType === 1 - ? w.find.matchesSelector(r, e) ? [r] : [] - : w.find.matches( - e, - w.grep(t, function(e) { - return e.nodeType === 1 - }) - ) - ) - }), - w.fn.extend({ - find: function(e) { - var t, - n, - r = this.length, - i = this - if (typeof e !== 'string') - return this.pushStack( - w(e).filter(function() { - for (t = 0; t < r; t++) if (w.contains(i[t], this)) return !0 - }) - ) - for (n = this.pushStack([]), t = 0; t < r; t++) w.find(e, i[t], n) - return r > 1 ? w.uniqueSort(n) : n - }, - filter: function(e) { - return this.pushStack(j(this, e || [], !1)) - }, - not: function(e) { - return this.pushStack(j(this, e || [], !0)) - }, - is: function(e) { - return !!j( - this, - typeof e === 'string' && D.test(e) ? w(e) : e || [], - !1 - ).length - }, - }) - var q, - L = /^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]+))$/ - ;((w.fn.init = function(e, t, n) { - var i, o - if (!e) return this - if (((n = n || q), typeof e === 'string')) { - if ( - !(i = - e[0] === '<' && e[e.length - 1] === '>' && e.length >= 3 - ? [null, e, null] - : L.exec(e)) || - (!i[1] && t) - ) - return !t || t.jquery ? (t || n).find(e) : this.constructor(t).find(e) - if (i[1]) { - if ( - ((t = t instanceof w ? t[0] : t), - w.merge( - this, - w.parseHTML(i[1], t && t.nodeType ? t.ownerDocument || t : r, !0) - ), - A.test(i[1]) && w.isPlainObject(t)) - ) - for (i in t) g(this[i]) ? this[i](t[i]) : this.attr(i, t[i]) - return this - } - return ( - (o = r.getElementById(i[2])) && ((this[0] = o), (this.length = 1)), this - ) - } - return e.nodeType - ? ((this[0] = e), (this.length = 1), this) - : g(e) ? (void 0 !== n.ready ? n.ready(e) : e(w)) : w.makeArray(e, this) - }).prototype = - w.fn), - (q = w(r)) - var H = /^(?:parents|prev(?:Until|All))/, - O = { children: !0, contents: !0, next: !0, prev: !0 } - w.fn.extend({ - has: function(e) { - var t = w(e, this), - n = t.length - return this.filter(function() { - for (var e = 0; e < n; e++) if (w.contains(this, t[e])) return !0 - }) - }, - closest: function(e, t) { - var n, - r = 0, - i = this.length, - o = [], - a = typeof e !== 'string' && w(e) - if (!D.test(e)) - for (; r < i; r++) - for (n = this[r]; n && n !== t; n = n.parentNode) - if ( - n.nodeType < 11 && - (a - ? a.index(n) > -1 - : n.nodeType === 1 && w.find.matchesSelector(n, e)) - ) { - o.push(n) - break - } - return this.pushStack(o.length > 1 ? w.uniqueSort(o) : o) - }, - index: function(e) { - return e - ? typeof e === 'string' - ? u.call(w(e), this[0]) - : u.call(this, e.jquery ? e[0] : e) - : this[0] && this[0].parentNode ? this.first().prevAll().length : -1 - }, - add: function(e, t) { - return this.pushStack(w.uniqueSort(w.merge(this.get(), w(e, t)))) - }, - addBack: function(e) { - return this.add(e == null ? this.prevObject : this.prevObject.filter(e)) - }, - }) - function P(e, t) { - while ((e = e[t]) && e.nodeType !== 1); - return e - } - w.each( - { - parent: function(e) { - var t = e.parentNode - return t && t.nodeType !== 11 ? t : null - }, - parents: function(e) { - return k(e, 'parentNode') - }, - parentsUntil: function(e, t, n) { - return k(e, 'parentNode', n) - }, - next: function(e) { - return P(e, 'nextSibling') - }, - prev: function(e) { - return P(e, 'previousSibling') - }, - nextAll: function(e) { - return k(e, 'nextSibling') - }, - prevAll: function(e) { - return k(e, 'previousSibling') - }, - nextUntil: function(e, t, n) { - return k(e, 'nextSibling', n) - }, - prevUntil: function(e, t, n) { - return k(e, 'previousSibling', n) - }, - siblings: function(e) { - return S((e.parentNode || {}).firstChild, e) - }, - children: function(e) { - return S(e.firstChild) - }, - contents: function(e) { - return N(e, 'iframe') - ? e.contentDocument - : (N(e, 'template') && (e = e.content || e), - w.merge([], e.childNodes)) - }, - }, - function(e, t) { - w.fn[e] = function(n, r) { - var i = w.map(this, t, n) - return ( - e.slice(-5) !== 'Until' && (r = n), - r && typeof r === 'string' && (i = w.filter(r, i)), - this.length > 1 && - (O[e] || w.uniqueSort(i), H.test(e) && i.reverse()), - this.pushStack(i) - ) - } - } - ) - var M = /[^\x20\t\r\n\f]+/g - function R(e) { - var t = {} - return ( - w.each(e.match(M) || [], function(e, n) { - t[n] = !0 - }), - t - ) - } - w.Callbacks = function(e) { - e = typeof e === 'string' ? R(e) : w.extend({}, e) - var t, - n, - r, - i, - o = [], - a = [], - s = -1, - u = function() { - for (i = i || e.once, r = t = !0; a.length; s = -1) { - n = a.shift() - while (++s < o.length) - !1 === o[s].apply(n[0], n[1]) && - e.stopOnFalse && - ((s = o.length), (n = !1)) - } - e.memory || (n = !1), (t = !1), i && (o = n ? [] : '') - }, - l = { - add: function() { - return ( - o && - (n && !t && ((s = o.length - 1), a.push(n)), - (function t(n) { - w.each(n, function(n, r) { - g(r) - ? (e.unique && l.has(r)) || o.push(r) - : r && r.length && x(r) !== 'string' && t(r) - }) - })(arguments), - n && !t && u()), - this - ) - }, - remove: function() { - return ( - w.each(arguments, function(e, t) { - var n - while ((n = w.inArray(t, o, n)) > -1) - o.splice(n, 1), n <= s && s-- - }), - this - ) - }, - has: function(e) { - return e ? w.inArray(e, o) > -1 : o.length > 0 - }, - empty: function() { - return o && (o = []), this - }, - disable: function() { - return (i = a = []), (o = n = ''), this - }, - disabled: function() { - return !o - }, - lock: function() { - return (i = a = []), n || t || (o = n = ''), this - }, - locked: function() { - return !!i - }, - fireWith: function(e, n) { - return ( - i || - ((n = [e, (n = n || []).slice ? n.slice() : n]), - a.push(n), - t || u()), - this - ) - }, - fire: function() { - return l.fireWith(this, arguments), this - }, - fired: function() { - return !!r - }, - } - return l - } - function I(e) { - return e - } - function W(e) { - throw e - } - function $(e, t, n, r) { - var i - try { - e && g((i = e.promise)) - ? i - .call(e) - .done(t) - .fail(n) - : e && g((i = e.then)) ? i.call(e, t, n) : t.apply(void 0, [e].slice(r)) - } catch (e) { - n.apply(void 0, [e]) - } - } - w.extend({ - Deferred: function(t) { - var n = [ - [ - 'notify', - 'progress', - w.Callbacks('memory'), - w.Callbacks('memory'), - 2, - ], - [ - 'resolve', - 'done', - w.Callbacks('once memory'), - w.Callbacks('once memory'), - 0, - 'resolved', - ], - [ - 'reject', - 'fail', - w.Callbacks('once memory'), - w.Callbacks('once memory'), - 1, - 'rejected', - ], - ], - r = 'pending', - i = { - state: function() { - return r - }, - always: function() { - return o.done(arguments).fail(arguments), this - }, - catch: function(e) { - return i.then(null, e) - }, - pipe: function() { - var e = arguments - return w - .Deferred(function(t) { - w.each(n, function(n, r) { - var i = g(e[r[4]]) && e[r[4]] - o[r[1]](function() { - var e = i && i.apply(this, arguments) - e && g(e.promise) - ? e - .promise() - .progress(t.notify) - .done(t.resolve) - .fail(t.reject) - : t[r[0] + 'With'](this, i ? [e] : arguments) - }) - }), - (e = null) - }) - .promise() - }, - then: function(t, r, i) { - var o = 0 - function a(t, n, r, i) { - return function() { - var s = this, - u = arguments, - l = function() { - var e, l - if (!(t < o)) { - if ((e = r.apply(s, u)) === n.promise()) - throw new TypeError('Thenable self-resolution') - ;(l = - e && - (typeof e === 'object' || typeof e === 'function') && - e.then), - g(l) - ? i - ? l.call(e, a(o, n, I, i), a(o, n, W, i)) - : (o++, - l.call( - e, - a(o, n, I, i), - a(o, n, W, i), - a(o, n, I, n.notifyWith) - )) - : (r !== I && ((s = void 0), (u = [e])), - (i || n.resolveWith)(s, u)) - } - }, - c = i - ? l - : function() { - try { - l() - } catch (e) { - w.Deferred.exceptionHook && - w.Deferred.exceptionHook(e, c.stackTrace), - t + 1 >= o && - (r !== W && ((s = void 0), (u = [e])), - n.rejectWith(s, u)) - } - } - t - ? c() - : (w.Deferred.getStackHook && - (c.stackTrace = w.Deferred.getStackHook()), - e.setTimeout(c)) - } - } - return w - .Deferred(function(e) { - n[0][3].add(a(0, e, g(i) ? i : I, e.notifyWith)), - n[1][3].add(a(0, e, g(t) ? t : I)), - n[2][3].add(a(0, e, g(r) ? r : W)) - }) - .promise() - }, - promise: function(e) { - return e != null ? w.extend(e, i) : i - }, - }, - o = {} - return ( - w.each(n, function(e, t) { - var a = t[2], - s = t[5] - ;(i[t[1]] = a.add), - s && - a.add( - function() { - r = s - }, - n[3 - e][2].disable, - n[3 - e][3].disable, - n[0][2].lock, - n[0][3].lock - ), - a.add(t[3].fire), - (o[t[0]] = function() { - return ( - o[t[0] + 'With'](this === o ? void 0 : this, arguments), this - ) - }), - (o[t[0] + 'With'] = a.fireWith) - }), - i.promise(o), - t && t.call(o, o), - o - ) - }, - when: function(e) { - var t = arguments.length, - n = t, - r = Array(n), - i = o.call(arguments), - a = w.Deferred(), - s = function(e) { - return function(n) { - ;(r[e] = this), - (i[e] = arguments.length > 1 ? o.call(arguments) : n), - --t || a.resolveWith(r, i) - } - } - if ( - t <= 1 && - ($(e, a.done(s(n)).resolve, a.reject, !t), - a.state() === 'pending' || g(i[n] && i[n].then)) - ) - return a.then() - while (n--) $(i[n], s(n), a.reject) - return a.promise() - }, - }) - var B = /^(Eval|Internal|Range|Reference|Syntax|Type|URI)Error$/ - ;(w.Deferred.exceptionHook = function(t, n) { - e.console && - e.console.warn && - t && - B.test(t.name) && - e.console.warn('jQuery.Deferred exception: ' + t.message, t.stack, n) - }), - (w.readyException = function(t) { - e.setTimeout(function() { - throw t - }) - }) - var F = w.Deferred() - ;(w.fn.ready = function(e) { - return ( - F.then(e)['catch'](function(e) { - w.readyException(e) - }), - this - ) - }), - w.extend({ - isReady: !1, - readyWait: 1, - ready: function(e) { - ;(!0 === e ? --w.readyWait : w.isReady) || - ((w.isReady = !0), - (!0 !== e && --w.readyWait > 0) || F.resolveWith(r, [w])) - }, - }), - (w.ready.then = F.then) - function _() { - r.removeEventListener('DOMContentLoaded', _), - e.removeEventListener('load', _), - w.ready() - } - r.readyState === 'complete' || - (r.readyState !== 'loading' && !r.documentElement.doScroll) - ? e.setTimeout(w.ready) - : (r.addEventListener('DOMContentLoaded', _), e.addEventListener('load', _)) - var z = function(e, t, n, r, i, o, a) { - var s = 0, - u = e.length, - l = n == null - if (x(n) === 'object') { - i = !0 - for (s in n) z(e, t, s, n[s], !0, o, a) - } else if ( - void 0 !== r && - ((i = !0), - g(r) || (a = !0), - l && - (a - ? (t.call(e, r), (t = null)) - : ((l = t), - (t = function(e, t, n) { - return l.call(w(e), n) - }))), - t) - ) - for (; s < u; s++) t(e[s], n, a ? r : r.call(e[s], s, t(e[s], n))) - return i ? e : l ? t.call(e) : u ? t(e[0], n) : o - }, - X = /^-ms-/, - U = /-([a-z])/g - function V(e, t) { - return t.toUpperCase() - } - function G(e) { - return e.replace(X, 'ms-').replace(U, V) - } - var Y = function(e) { - return e.nodeType === 1 || e.nodeType === 9 || !+e.nodeType - } - function Q() { - this.expando = w.expando + Q.uid++ - } - ;(Q.uid = 1), - (Q.prototype = { - cache: function(e) { - var t = e[this.expando] - return ( - t || - ((t = {}), - Y(e) && - (e.nodeType - ? (e[this.expando] = t) - : Object.defineProperty(e, this.expando, { - value: t, - configurable: !0, - }))), - t - ) - }, - set: function(e, t, n) { - var r, - i = this.cache(e) - if (typeof t === 'string') i[G(t)] = n - else for (r in t) i[G(r)] = t[r] - return i - }, - get: function(e, t) { - return void 0 === t - ? this.cache(e) - : e[this.expando] && e[this.expando][G(t)] - }, - access: function(e, t, n) { - return void 0 === t || (t && typeof t === 'string' && void 0 === n) - ? this.get(e, t) - : (this.set(e, t, n), void 0 !== n ? n : t) - }, - remove: function(e, t) { - var n, - r = e[this.expando] - if (void 0 !== r) { - if (void 0 !== t) { - n = (t = Array.isArray(t) - ? t.map(G) - : (t = G(t)) in r ? [t] : t.match(M) || []).length - while (n--) delete r[t[n]] - } - ;(void 0 === t || w.isEmptyObject(r)) && - (e.nodeType ? (e[this.expando] = void 0) : delete e[this.expando]) - } - }, - hasData: function(e) { - var t = e[this.expando] - return void 0 !== t && !w.isEmptyObject(t) - }, - }) - var J = new Q(), - K = new Q(), - Z = /^(?:\{[\w\W]*\}|\[[\w\W]*\])$/, - ee = /[A-Z]/g - function te(e) { - return ( - e === 'true' || - (e !== 'false' && - (e === 'null' - ? null - : e === +e + '' ? +e : Z.test(e) ? JSON.parse(e) : e)) - ) - } - function ne(e, t, n) { - var r - if (void 0 === n && e.nodeType === 1) - if ( - ((r = 'data-' + t.replace(ee, '-$&').toLowerCase()), - typeof (n = e.getAttribute(r)) === 'string') - ) { - try { - n = te(n) - } catch (e) {} - K.set(e, t, n) - } else n = void 0 - return n - } - w.extend({ - hasData: function(e) { - return K.hasData(e) || J.hasData(e) - }, - data: function(e, t, n) { - return K.access(e, t, n) - }, - removeData: function(e, t) { - K.remove(e, t) - }, - _data: function(e, t, n) { - return J.access(e, t, n) - }, - _removeData: function(e, t) { - J.remove(e, t) - }, - }), - w.fn.extend({ - data: function(e, t) { - var n, - r, - i, - o = this[0], - a = o && o.attributes - if (void 0 === e) { - if ( - this.length && - ((i = K.get(o)), o.nodeType === 1 && !J.get(o, 'hasDataAttrs')) - ) { - n = a.length - while (n--) - a[n] && - (r = a[n].name).indexOf('data-') === 0 && - ((r = G(r.slice(5))), ne(o, r, i[r])) - J.set(o, 'hasDataAttrs', !0) - } - return i - } - return typeof e === 'object' - ? this.each(function() { - K.set(this, e) - }) - : z( - this, - function(t) { - var n - if (o && void 0 === t) { - if (void 0 !== (n = K.get(o, e))) return n - if (void 0 !== (n = ne(o, e))) return n - } else - this.each(function() { - K.set(this, e, t) - }) - }, - null, - t, - arguments.length > 1, - null, - !0 - ) - }, - removeData: function(e) { - return this.each(function() { - K.remove(this, e) - }) - }, - }), - w.extend({ - queue: function(e, t, n) { - var r - if (e) - return ( - (t = (t || 'fx') + 'queue'), - (r = J.get(e, t)), - n && - (!r || Array.isArray(n) - ? (r = J.access(e, t, w.makeArray(n))) - : r.push(n)), - r || [] - ) - }, - dequeue: function(e, t) { - t = t || 'fx' - var n = w.queue(e, t), - r = n.length, - i = n.shift(), - o = w._queueHooks(e, t), - a = function() { - w.dequeue(e, t) - } - i === 'inprogress' && ((i = n.shift()), r--), - i && - (t === 'fx' && n.unshift('inprogress'), - delete o.stop, - i.call(e, a, o)), - !r && o && o.empty.fire() - }, - _queueHooks: function(e, t) { - var n = t + 'queueHooks' - return ( - J.get(e, n) || - J.access(e, n, { - empty: w.Callbacks('once memory').add(function() { - J.remove(e, [t + 'queue', n]) - }), - }) - ) - }, - }), - w.fn.extend({ - queue: function(e, t) { - var n = 2 - return ( - typeof e !== 'string' && ((t = e), (e = 'fx'), n--), - arguments.length < n - ? w.queue(this[0], e) - : void 0 === t - ? this - : this.each(function() { - var n = w.queue(this, e, t) - w._queueHooks(this, e), - e === 'fx' && n[0] !== 'inprogress' && w.dequeue(this, e) - }) - ) - }, - dequeue: function(e) { - return this.each(function() { - w.dequeue(this, e) - }) - }, - clearQueue: function(e) { - return this.queue(e || 'fx', []) - }, - promise: function(e, t) { - var n, - r = 1, - i = w.Deferred(), - o = this, - a = this.length, - s = function() { - --r || i.resolveWith(o, [o]) - } - typeof e !== 'string' && ((t = e), (e = void 0)), (e = e || 'fx') - while (a--) - (n = J.get(o[a], e + 'queueHooks')) && - n.empty && - (r++, n.empty.add(s)) - return s(), i.promise(t) - }, - }) - var re = /[+-]?(?:\d*\.|)\d+(?:[eE][+-]?\d+|)/.source, - ie = new RegExp('^(?:([+-])=|)(' + re + ')([a-z%]*)$', 'i'), - oe = ['Top', 'Right', 'Bottom', 'Left'], - ae = function(e, t) { - return ( - (e = t || e).style.display === 'none' || - (e.style.display === '' && - w.contains(e.ownerDocument, e) && - w.css(e, 'display') === 'none') - ) - }, - se = function(e, t, n, r) { - var i, - o, - a = {} - for (o in t) (a[o] = e.style[o]), (e.style[o] = t[o]) - i = n.apply(e, r || []) - for (o in t) e.style[o] = a[o] - return i - } - function ue(e, t, n, r) { - var i, - o, - a = 20, - s = r - ? function() { - return r.cur() - } - : function() { - return w.css(e, t, '') - }, - u = s(), - l = (n && n[3]) || (w.cssNumber[t] ? '' : 'px'), - c = (w.cssNumber[t] || (l !== 'px' && +u)) && ie.exec(w.css(e, t)) - if (c && c[3] !== l) { - ;(u /= 2), (l = l || c[3]), (c = +u || 1) - while (a--) - w.style(e, t, c + l), - (1 - o) * (1 - (o = s() / u || 0.5)) <= 0 && (a = 0), - (c /= o) - ;(c *= 2), w.style(e, t, c + l), (n = n || []) - } - return ( - n && - ((c = +c || +u || 0), - (i = n[1] ? c + (n[1] + 1) * n[2] : +n[2]), - r && ((r.unit = l), (r.start = c), (r.end = i))), - i - ) - } - var le = {} - function ce(e) { - var t, - n = e.ownerDocument, - r = e.nodeName, - i = le[r] - return ( - i || - ((t = n.body.appendChild(n.createElement(r))), - (i = w.css(t, 'display')), - t.parentNode.removeChild(t), - i === 'none' && (i = 'block'), - (le[r] = i), - i) - ) - } - function fe(e, t) { - for (var n, r, i = [], o = 0, a = e.length; o < a; o++) - (r = e[o]).style && - ((n = r.style.display), - t - ? (n === 'none' && - ((i[o] = J.get(r, 'display') || null), - i[o] || (r.style.display = '')), - r.style.display === '' && ae(r) && (i[o] = ce(r))) - : n !== 'none' && ((i[o] = 'none'), J.set(r, 'display', n))) - for (o = 0; o < a; o++) i[o] != null && (e[o].style.display = i[o]) - return e - } - w.fn.extend({ - show: function() { - return fe(this, !0) - }, - hide: function() { - return fe(this) - }, - toggle: function(e) { - return typeof e === 'boolean' - ? e ? this.show() : this.hide() - : this.each(function() { - ae(this) ? w(this).show() : w(this).hide() - }) - }, - }) - var pe = /^(?:checkbox|radio)$/i, - de = /<([a-z][^\/\0>\x20\t\r\n\f]+)/i, - he = /^$|^module$|\/(?:java|ecma)script/i, - ge = { - option: [1, "'], - thead: [1, '', '
'], - col: [2, '', '
'], - tr: [2, '', '
'], - td: [3, '', '
'], - _default: [0, '', ''], - } - ;(ge.optgroup = ge.option), - (ge.tbody = ge.tfoot = ge.colgroup = ge.caption = ge.thead), - (ge.th = ge.td) - function ye(e, t) { - var n - return ( - (n = - typeof e.getElementsByTagName !== 'undefined' - ? e.getElementsByTagName(t || '*') - : typeof e.querySelectorAll !== 'undefined' - ? e.querySelectorAll(t || '*') - : []), - void 0 === t || (t && N(e, t)) ? w.merge([e], n) : n - ) - } - function ve(e, t) { - for (var n = 0, r = e.length; n < r; n++) - J.set(e[n], 'globalEval', !t || J.get(t[n], 'globalEval')) - } - var me = /<|&#?\w+;/ - function xe(e, t, n, r, i) { - for ( - var o, - a, - s, - u, - l, - c, - f = t.createDocumentFragment(), - p = [], - d = 0, - h = e.length; - d < h; - d++ - ) - if ((o = e[d]) || o === 0) - if (x(o) === 'object') w.merge(p, o.nodeType ? [o] : o) - else if (me.test(o)) { - ;(a = a || f.appendChild(t.createElement('div'))), - (s = (de.exec(o) || ['', ''])[1].toLowerCase()), - (u = ge[s] || ge._default), - (a.innerHTML = u[1] + w.htmlPrefilter(o) + u[2]), - (c = u[0]) - while (c--) a = a.lastChild - w.merge(p, a.childNodes), ((a = f.firstChild).textContent = '') - } else p.push(t.createTextNode(o)) - ;(f.textContent = ''), (d = 0) - while ((o = p[d++])) - if (r && w.inArray(o, r) > -1) i && i.push(o) - else if ( - ((l = w.contains(o.ownerDocument, o)), - (a = ye(f.appendChild(o), 'script')), - l && ve(a), - n) - ) { - c = 0 - while ((o = a[c++])) he.test(o.type || '') && n.push(o) - } - return f - } - !(function() { - var e = r.createDocumentFragment().appendChild(r.createElement('div')), - t = r.createElement('input') - t.setAttribute('type', 'radio'), - t.setAttribute('checked', 'checked'), - t.setAttribute('name', 't'), - e.appendChild(t), - (h.checkClone = e.cloneNode(!0).cloneNode(!0).lastChild.checked), - (e.innerHTML = ''), - (h.noCloneChecked = !!e.cloneNode(!0).lastChild.defaultValue) - })() - var be = r.documentElement, - we = /^key/, - Te = /^(?:mouse|pointer|contextmenu|drag|drop)|click/, - Ce = /^([^.]*)(?:\.(.+)|)/ - function Ee() { - return !0 - } - function ke() { - return !1 - } - function Se() { - try { - return r.activeElement - } catch (e) {} - } - function De(e, t, n, r, i, o) { - var a, s - if (typeof t === 'object') { - typeof n !== 'string' && ((r = r || n), (n = void 0)) - for (s in t) De(e, s, n, r, t[s], o) - return e - } - if ( - (r == null && i == null - ? ((i = n), (r = n = void 0)) - : i == null && - (typeof n === 'string' - ? ((i = r), (r = void 0)) - : ((i = r), (r = n), (n = void 0))), - !1 === i) - ) - i = ke - else if (!i) return e - return ( - o === 1 && - ((a = i), - ((i = function(e) { - return w().off(e), a.apply(this, arguments) - }).guid = - a.guid || (a.guid = w.guid++))), - e.each(function() { - w.event.add(this, t, i, r, n) - }) - ) - } - ;(w.event = { - global: {}, - add: function(e, t, n, r, i) { - var o, - a, - s, - u, - l, - c, - f, - p, - d, - h, - g, - y = J.get(e) - if (y) { - n.handler && ((n = (o = n).handler), (i = o.selector)), - i && w.find.matchesSelector(be, i), - n.guid || (n.guid = w.guid++), - (u = y.events) || (u = y.events = {}), - (a = y.handle) || - (a = y.handle = function(t) { - return typeof w !== 'undefined' && w.event.triggered !== t.type - ? w.event.dispatch.apply(e, arguments) - : void 0 - }), - (l = (t = (t || '').match(M) || ['']).length) - while (l--) - (d = g = (s = Ce.exec(t[l]) || [])[1]), - (h = (s[2] || '').split('.').sort()), - d && - ((f = w.event.special[d] || {}), - (d = (i ? f.delegateType : f.bindType) || d), - (f = w.event.special[d] || {}), - (c = w.extend( - { - type: d, - origType: g, - data: r, - handler: n, - guid: n.guid, - selector: i, - needsContext: i && w.expr.match.needsContext.test(i), - namespace: h.join('.'), - }, - o - )), - (p = u[d]) || - (((p = u[d] = []).delegateCount = 0), - (f.setup && !1 !== f.setup.call(e, r, h, a)) || - (e.addEventListener && e.addEventListener(d, a))), - f.add && - (f.add.call(e, c), c.handler.guid || (c.handler.guid = n.guid)), - i ? p.splice(p.delegateCount++, 0, c) : p.push(c), - (w.event.global[d] = !0)) - } - }, - remove: function(e, t, n, r, i) { - var o, - a, - s, - u, - l, - c, - f, - p, - d, - h, - g, - y = J.hasData(e) && J.get(e) - if (y && (u = y.events)) { - l = (t = (t || '').match(M) || ['']).length - while (l--) - if ( - ((s = Ce.exec(t[l]) || []), - (d = g = s[1]), - (h = (s[2] || '').split('.').sort()), - d) - ) { - ;(f = w.event.special[d] || {}), - (p = u[(d = (r ? f.delegateType : f.bindType) || d)] || []), - (s = - s[2] && - new RegExp('(^|\\.)' + h.join('\\.(?:.*\\.|)') + '(\\.|$)')), - (a = o = p.length) - while (o--) - (c = p[o]), - (!i && g !== c.origType) || - (n && n.guid !== c.guid) || - (s && !s.test(c.namespace)) || - (r && r !== c.selector && (r !== '**' || !c.selector)) || - (p.splice(o, 1), - c.selector && p.delegateCount--, - f.remove && f.remove.call(e, c)) - a && - !p.length && - ((f.teardown && !1 !== f.teardown.call(e, h, y.handle)) || - w.removeEvent(e, d, y.handle), - delete u[d]) - } else for (d in u) w.event.remove(e, d + t[l], n, r, !0) - w.isEmptyObject(u) && J.remove(e, 'handle events') - } - }, - dispatch: function(e) { - var t = w.event.fix(e), - n, - r, - i, - o, - a, - s, - u = new Array(arguments.length), - l = (J.get(this, 'events') || {})[t.type] || [], - c = w.event.special[t.type] || {} - for (u[0] = t, n = 1; n < arguments.length; n++) u[n] = arguments[n] - if ( - ((t.delegateTarget = this), - !c.preDispatch || !1 !== c.preDispatch.call(this, t)) - ) { - ;(s = w.event.handlers.call(this, t, l)), (n = 0) - while ((o = s[n++]) && !t.isPropagationStopped()) { - ;(t.currentTarget = o.elem), (r = 0) - while ((a = o.handlers[r++]) && !t.isImmediatePropagationStopped()) - (t.rnamespace && !t.rnamespace.test(a.namespace)) || - ((t.handleObj = a), - (t.data = a.data), - void 0 !== - (i = ( - (w.event.special[a.origType] || {}).handle || a.handler - ).apply(o.elem, u)) && - !1 === (t.result = i) && - (t.preventDefault(), t.stopPropagation())) - } - return c.postDispatch && c.postDispatch.call(this, t), t.result - } - }, - handlers: function(e, t) { - var n, - r, - i, - o, - a, - s = [], - u = t.delegateCount, - l = e.target - if (u && l.nodeType && !(e.type === 'click' && e.button >= 1)) - for (; l !== this; l = l.parentNode || this) - if (l.nodeType === 1 && (e.type !== 'click' || !0 !== l.disabled)) { - for (o = [], a = {}, n = 0; n < u; n++) - void 0 === a[(i = (r = t[n]).selector + ' ')] && - (a[i] = r.needsContext - ? w(i, this).index(l) > -1 - : w.find(i, this, null, [l]).length), - a[i] && o.push(r) - o.length && s.push({ elem: l, handlers: o }) - } - return ( - (l = this), u < t.length && s.push({ elem: l, handlers: t.slice(u) }), s - ) - }, - addProp: function(e, t) { - Object.defineProperty(w.Event.prototype, e, { - enumerable: !0, - configurable: !0, - get: g(t) - ? function() { - if (this.originalEvent) return t(this.originalEvent) - } - : function() { - if (this.originalEvent) return this.originalEvent[e] - }, - set: function(t) { - Object.defineProperty(this, e, { - enumerable: !0, - configurable: !0, - writable: !0, - value: t, - }) - }, - }) - }, - fix: function(e) { - return e[w.expando] ? e : new w.Event(e) - }, - special: { - load: { noBubble: !0 }, - focus: { - trigger: function() { - if (this !== Se() && this.focus) return this.focus(), !1 - }, - delegateType: 'focusin', - }, - blur: { - trigger: function() { - if (this === Se() && this.blur) return this.blur(), !1 - }, - delegateType: 'focusout', - }, - click: { - trigger: function() { - if (this.type === 'checkbox' && this.click && N(this, 'input')) - return this.click(), !1 - }, - _default: function(e) { - return N(e.target, 'a') - }, - }, - beforeunload: { - postDispatch: function(e) { - void 0 !== e.result && - e.originalEvent && - (e.originalEvent.returnValue = e.result) - }, - }, - }, - }), - (w.removeEvent = function(e, t, n) { - e.removeEventListener && e.removeEventListener(t, n) - }), - (w.Event = function(e, t) { - if (!(this instanceof w.Event)) return new w.Event(e, t) - e && e.type - ? ((this.originalEvent = e), - (this.type = e.type), - (this.isDefaultPrevented = - e.defaultPrevented || - (void 0 === e.defaultPrevented && !1 === e.returnValue) - ? Ee - : ke), - (this.target = - e.target && e.target.nodeType === 3 - ? e.target.parentNode - : e.target), - (this.currentTarget = e.currentTarget), - (this.relatedTarget = e.relatedTarget)) - : (this.type = e), - t && w.extend(this, t), - (this.timeStamp = (e && e.timeStamp) || Date.now()), - (this[w.expando] = !0) - }), - (w.Event.prototype = { - constructor: w.Event, - isDefaultPrevented: ke, - isPropagationStopped: ke, - isImmediatePropagationStopped: ke, - isSimulated: !1, - preventDefault: function() { - var e = this.originalEvent - ;(this.isDefaultPrevented = Ee), - e && !this.isSimulated && e.preventDefault() - }, - stopPropagation: function() { - var e = this.originalEvent - ;(this.isPropagationStopped = Ee), - e && !this.isSimulated && e.stopPropagation() - }, - stopImmediatePropagation: function() { - var e = this.originalEvent - ;(this.isImmediatePropagationStopped = Ee), - e && !this.isSimulated && e.stopImmediatePropagation(), - this.stopPropagation() - }, - }), - w.each( - { - altKey: !0, - bubbles: !0, - cancelable: !0, - changedTouches: !0, - ctrlKey: !0, - detail: !0, - eventPhase: !0, - metaKey: !0, - pageX: !0, - pageY: !0, - shiftKey: !0, - view: !0, - char: !0, - charCode: !0, - key: !0, - keyCode: !0, - button: !0, - buttons: !0, - clientX: !0, - clientY: !0, - offsetX: !0, - offsetY: !0, - pointerId: !0, - pointerType: !0, - screenX: !0, - screenY: !0, - targetTouches: !0, - toElement: !0, - touches: !0, - which: function(e) { - var t = e.button - return e.which == null && we.test(e.type) - ? e.charCode != null ? e.charCode : e.keyCode - : !e.which && void 0 !== t && Te.test(e.type) - ? 1 & t ? 1 : 2 & t ? 3 : 4 & t ? 2 : 0 - : e.which - }, - }, - w.event.addProp - ), - w.each( - { - mouseenter: 'mouseover', - mouseleave: 'mouseout', - pointerenter: 'pointerover', - pointerleave: 'pointerout', - }, - function(e, t) { - w.event.special[e] = { - delegateType: t, - bindType: t, - handle: function(e) { - var n, - r = this, - i = e.relatedTarget, - o = e.handleObj - return ( - (i && (i === r || w.contains(r, i))) || - ((e.type = o.origType), - (n = o.handler.apply(this, arguments)), - (e.type = t)), - n - ) - }, - } - } - ), - w.fn.extend({ - on: function(e, t, n, r) { - return De(this, e, t, n, r) - }, - one: function(e, t, n, r) { - return De(this, e, t, n, r, 1) - }, - off: function(e, t, n) { - var r, i - if (e && e.preventDefault && e.handleObj) - return ( - (r = e.handleObj), - w(e.delegateTarget).off( - r.namespace ? r.origType + '.' + r.namespace : r.origType, - r.selector, - r.handler - ), - this - ) - if (typeof e === 'object') { - for (i in e) this.off(i, t, e[i]) - return this - } - return ( - (!1 !== t && typeof t !== 'function') || ((n = t), (t = void 0)), - !1 === n && (n = ke), - this.each(function() { - w.event.remove(this, e, n, t) - }) - ) - }, - }) - var Ne = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^\/\0>\x20\t\r\n\f]*)[^>]*)\/>/gi, - Ae = /\s*$/g - function Le(e, t) { - return N(e, 'table') && N(t.nodeType !== 11 ? t : t.firstChild, 'tr') - ? w(e).children('tbody')[0] || e - : e - } - function He(e) { - return (e.type = (e.getAttribute('type') !== null) + '/' + e.type), e - } - function Oe(e) { - return ( - (e.type || '').slice(0, 5) === 'true/' - ? (e.type = e.type.slice(5)) - : e.removeAttribute('type'), - e - ) - } - function Pe(e, t) { - var n, r, i, o, a, s, u, l - if (t.nodeType === 1) { - if ( - J.hasData(e) && - ((o = J.access(e)), (a = J.set(t, o)), (l = o.events)) - ) { - delete a.handle, (a.events = {}) - for (i in l) - for (n = 0, r = l[i].length; n < r; n++) w.event.add(t, i, l[i][n]) - } - K.hasData(e) && ((s = K.access(e)), (u = w.extend({}, s)), K.set(t, u)) - } - } - function Me(e, t) { - var n = t.nodeName.toLowerCase() - n === 'input' && pe.test(e.type) - ? (t.checked = e.checked) - : (n !== 'input' && n !== 'textarea') || (t.defaultValue = e.defaultValue) - } - function Re(e, t, n, r) { - t = a.apply([], t) - var i, - o, - s, - u, - l, - c, - f = 0, - p = e.length, - d = p - 1, - y = t[0], - v = g(y) - if (v || (p > 1 && typeof y === 'string' && !h.checkClone && je.test(y))) - return e.each(function(i) { - var o = e.eq(i) - v && (t[0] = y.call(this, i, o.html())), Re(o, t, n, r) - }) - if ( - p && - ((i = xe(t, e[0].ownerDocument, !1, e, r)), - (o = i.firstChild), - i.childNodes.length === 1 && (i = o), - o || r) - ) { - for (u = (s = w.map(ye(i, 'script'), He)).length; f < p; f++) - (l = i), - f !== d && - ((l = w.clone(l, !0, !0)), u && w.merge(s, ye(l, 'script'))), - n.call(e[f], l, f) - if (u) - for (c = s[s.length - 1].ownerDocument, w.map(s, Oe), f = 0; f < u; f++) - (l = s[f]), - he.test(l.type || '') && - !J.access(l, 'globalEval') && - w.contains(c, l) && - (l.src && (l.type || '').toLowerCase() !== 'module' - ? w._evalUrl && w._evalUrl(l.src) - : m(l.textContent.replace(qe, ''), c, l)) - } - return e - } - function Ie(e, t, n) { - for (var r, i = t ? w.filter(t, e) : e, o = 0; (r = i[o]) != null; o++) - n || r.nodeType !== 1 || w.cleanData(ye(r)), - r.parentNode && - (n && w.contains(r.ownerDocument, r) && ve(ye(r, 'script')), - r.parentNode.removeChild(r)) - return e - } - w.extend({ - htmlPrefilter: function(e) { - return e.replace(Ne, '<$1>') - }, - clone: function(e, t, n) { - var r, - i, - o, - a, - s = e.cloneNode(!0), - u = w.contains(e.ownerDocument, e) - if ( - !( - h.noCloneChecked || - (e.nodeType !== 1 && e.nodeType !== 11) || - w.isXMLDoc(e) - ) - ) - for (a = ye(s), r = 0, i = (o = ye(e)).length; r < i; r++) - Me(o[r], a[r]) - if (t) - if (n) - for (o = o || ye(e), a = a || ye(s), r = 0, i = o.length; r < i; r++) - Pe(o[r], a[r]) - else Pe(e, s) - return (a = ye(s, 'script')).length > 0 && ve(a, !u && ye(e, 'script')), s - }, - cleanData: function(e) { - for (var t, n, r, i = w.event.special, o = 0; void 0 !== (n = e[o]); o++) - if (Y(n)) { - if ((t = n[J.expando])) { - if (t.events) - for (r in t.events) - i[r] ? w.event.remove(n, r) : w.removeEvent(n, r, t.handle) - n[J.expando] = void 0 - } - n[K.expando] && (n[K.expando] = void 0) - } - }, - }), - w.fn.extend({ - detach: function(e) { - return Ie(this, e, !0) - }, - remove: function(e) { - return Ie(this, e) - }, - text: function(e) { - return z( - this, - function(e) { - return void 0 === e - ? w.text(this) - : this.empty().each(function() { - ;(this.nodeType !== 1 && - this.nodeType !== 11 && - this.nodeType !== 9) || - (this.textContent = e) - }) - }, - null, - e, - arguments.length - ) - }, - append: function() { - return Re(this, arguments, function(e) { - ;(this.nodeType !== 1 && - this.nodeType !== 11 && - this.nodeType !== 9) || - Le(this, e).appendChild(e) - }) - }, - prepend: function() { - return Re(this, arguments, function(e) { - if ( - this.nodeType === 1 || - this.nodeType === 11 || - this.nodeType === 9 - ) { - var t = Le(this, e) - t.insertBefore(e, t.firstChild) - } - }) - }, - before: function() { - return Re(this, arguments, function(e) { - this.parentNode && this.parentNode.insertBefore(e, this) - }) - }, - after: function() { - return Re(this, arguments, function(e) { - this.parentNode && this.parentNode.insertBefore(e, this.nextSibling) - }) - }, - empty: function() { - for (var e, t = 0; (e = this[t]) != null; t++) - e.nodeType === 1 && (w.cleanData(ye(e, !1)), (e.textContent = '')) - return this - }, - clone: function(e, t) { - return ( - (e = e != null && e), - (t = t == null ? e : t), - this.map(function() { - return w.clone(this, e, t) - }) - ) - }, - html: function(e) { - return z( - this, - function(e) { - var t = this[0] || {}, - n = 0, - r = this.length - if (void 0 === e && t.nodeType === 1) return t.innerHTML - if ( - typeof e === 'string' && - !Ae.test(e) && - !ge[(de.exec(e) || ['', ''])[1].toLowerCase()] - ) { - e = w.htmlPrefilter(e) - try { - for (; n < r; n++) - (t = this[n] || {}).nodeType === 1 && - (w.cleanData(ye(t, !1)), (t.innerHTML = e)) - t = 0 - } catch (e) {} - } - t && this.empty().append(e) - }, - null, - e, - arguments.length - ) - }, - replaceWith: function() { - var e = [] - return Re( - this, - arguments, - function(t) { - var n = this.parentNode - w.inArray(this, e) < 0 && - (w.cleanData(ye(this)), n && n.replaceChild(t, this)) - }, - e - ) - }, - }), - w.each( - { - appendTo: 'append', - prependTo: 'prepend', - insertBefore: 'before', - insertAfter: 'after', - replaceAll: 'replaceWith', - }, - function(e, t) { - w.fn[e] = function(e) { - for (var n, r = [], i = w(e), o = i.length - 1, a = 0; a <= o; a++) - (n = a === o ? this : this.clone(!0)), - w(i[a])[t](n), - s.apply(r, n.get()) - return this.pushStack(r) - } - } - ) - var We = new RegExp('^(' + re + ')(?!px)[a-z%]+$', 'i'), - $e = function(t) { - var n = t.ownerDocument.defaultView - return (n && n.opener) || (n = e), n.getComputedStyle(t) - }, - Be = new RegExp(oe.join('|'), 'i') - !(function() { - function t() { - if (c) { - ;(l.style.cssText = - 'position:absolute;left:-11111px;width:60px;margin-top:1px;padding:0;border:0'), - (c.style.cssText = - 'position:relative;display:block;box-sizing:border-box;overflow:scroll;margin:auto;border:1px;padding:1px;width:60%;top:1%'), - be.appendChild(l).appendChild(c) - var t = e.getComputedStyle(c) - ;(i = t.top !== '1%'), - (u = n(t.marginLeft) === 12), - (c.style.right = '60%'), - (s = n(t.right) === 36), - (o = n(t.width) === 36), - (c.style.position = 'absolute'), - (a = c.offsetWidth === 36 || 'absolute'), - be.removeChild(l), - (c = null) - } - } - function n(e) { - return Math.round(parseFloat(e)) - } - var i, - o, - a, - s, - u, - l = r.createElement('div'), - c = r.createElement('div') - c.style && - ((c.style.backgroundClip = 'content-box'), - (c.cloneNode(!0).style.backgroundClip = ''), - (h.clearCloneStyle = c.style.backgroundClip === 'content-box'), - w.extend(h, { - boxSizingReliable: function() { - return t(), o - }, - pixelBoxStyles: function() { - return t(), s - }, - pixelPosition: function() { - return t(), i - }, - reliableMarginLeft: function() { - return t(), u - }, - scrollboxSize: function() { - return t(), a - }, - })) - })() - function Fe(e, t, n) { - var r, - i, - o, - a, - s = e.style - return ( - (n = n || $e(e)) && - ((a = n.getPropertyValue(t) || n[t]) !== '' || - w.contains(e.ownerDocument, e) || - (a = w.style(e, t)), - !h.pixelBoxStyles() && - We.test(a) && - Be.test(t) && - ((r = s.width), - (i = s.minWidth), - (o = s.maxWidth), - (s.minWidth = s.maxWidth = s.width = a), - (a = n.width), - (s.width = r), - (s.minWidth = i), - (s.maxWidth = o))), - void 0 !== a ? a + '' : a - ) - } - function _e(e, t) { - return { - get: function() { - if (!e()) return (this.get = t).apply(this, arguments) - delete this.get - }, - } - } - var ze = /^(none|table(?!-c[ea]).+)/, - Xe = /^--/, - Ue = { position: 'absolute', visibility: 'hidden', display: 'block' }, - Ve = { letterSpacing: '0', fontWeight: '400' }, - Ge = ['Webkit', 'Moz', 'ms'], - Ye = r.createElement('div').style - function Qe(e) { - if (e in Ye) return e - var t = e[0].toUpperCase() + e.slice(1), - n = Ge.length - while (n--) if ((e = Ge[n] + t) in Ye) return e - } - function Je(e) { - var t = w.cssProps[e] - return t || (t = w.cssProps[e] = Qe(e) || e), t - } - function Ke(e, t, n) { - var r = ie.exec(t) - return r ? Math.max(0, r[2] - (n || 0)) + (r[3] || 'px') : t - } - function Ze(e, t, n, r, i, o) { - var a = t === 'width' ? 1 : 0, - s = 0, - u = 0 - if (n === (r ? 'border' : 'content')) return 0 - for (; a < 4; a += 2) - n === 'margin' && (u += w.css(e, n + oe[a], !0, i)), - r - ? (n === 'content' && (u -= w.css(e, 'padding' + oe[a], !0, i)), - n !== 'margin' && - (u -= w.css(e, 'border' + oe[a] + 'Width', !0, i))) - : ((u += w.css(e, 'padding' + oe[a], !0, i)), - n !== 'padding' - ? (u += w.css(e, 'border' + oe[a] + 'Width', !0, i)) - : (s += w.css(e, 'border' + oe[a] + 'Width', !0, i))) - return ( - !r && - o >= 0 && - (u += Math.max( - 0, - Math.ceil( - e['offset' + t[0].toUpperCase() + t.slice(1)] - o - u - s - 0.5 - ) - )), - u - ) - } - function et(e, t, n) { - var r = $e(e), - i = Fe(e, t, r), - o = w.css(e, 'boxSizing', !1, r) === 'border-box', - a = o - if (We.test(i)) { - if (!n) return i - i = 'auto' - } - return ( - (a = a && (h.boxSizingReliable() || i === e.style[t])), - (i === 'auto' || - (!parseFloat(i) && w.css(e, 'display', !1, r) === 'inline')) && - ((i = e['offset' + t[0].toUpperCase() + t.slice(1)]), (a = !0)), - (i = parseFloat(i) || 0) + - Ze(e, t, n || (o ? 'border' : 'content'), a, r, i) + - 'px' - ) - } - w.extend({ - cssHooks: { - opacity: { - get: function(e, t) { - if (t) { - var n = Fe(e, 'opacity') - return n === '' ? '1' : n - } - }, - }, - }, - cssNumber: { - animationIterationCount: !0, - columnCount: !0, - fillOpacity: !0, - flexGrow: !0, - flexShrink: !0, - fontWeight: !0, - lineHeight: !0, - opacity: !0, - order: !0, - orphans: !0, - widows: !0, - zIndex: !0, - zoom: !0, - }, - cssProps: {}, - style: function(e, t, n, r) { - if (e && e.nodeType !== 3 && e.nodeType !== 8 && e.style) { - var i, - o, - a, - s = G(t), - u = Xe.test(t), - l = e.style - if ( - (u || (t = Je(s)), (a = w.cssHooks[t] || w.cssHooks[s]), void 0 === n) - ) - return ( - a && 'get' in a && void 0 !== (i = a.get(e, !1, r)) - ? i - : l[t]((o = typeof n)) == 'string' && - (i = ie.exec(n)) && - i[1] && - ((n = ue(e, t, i)), (o = 'number')), - n != null && - n === n && - (o === 'number' && - (n += (i && i[3]) || (w.cssNumber[s] ? '' : 'px')), - h.clearCloneStyle || - n !== '' || - t.indexOf('background') !== 0 || - (l[t] = 'inherit'), - (a && 'set' in a && void 0 === (n = a.set(e, n, r))) || - (u ? l.setProperty(t, n) : (l[t] = n))) - ) - } - }, - css: function(e, t, n, r) { - var i, - o, - a, - s = G(t) - return ( - Xe.test(t) || (t = Je(s)), - (a = w.cssHooks[t] || w.cssHooks[s]) && - 'get' in a && - (i = a.get(e, !0, n)), - void 0 === i && (i = Fe(e, t, r)), - i === 'normal' && t in Ve && (i = Ve[t]), - n === '' || n - ? ((o = parseFloat(i)), !0 === n || isFinite(o) ? o || 0 : i) - : i - ) - }, - }), - w.each(['height', 'width'], function(e, t) { - w.cssHooks[t] = { - get: function(e, n, r) { - if (n) - return !ze.test(w.css(e, 'display')) || - (e.getClientRects().length && e.getBoundingClientRect().width) - ? et(e, t, r) - : se(e, Ue, function() { - return et(e, t, r) - }) - }, - set: function(e, n, r) { - var i, - o = $e(e), - a = w.css(e, 'boxSizing', !1, o) === 'border-box', - s = r && Ze(e, t, r, a, o) - return ( - a && - h.scrollboxSize() === o.position && - (s -= Math.ceil( - e['offset' + t[0].toUpperCase() + t.slice(1)] - - parseFloat(o[t]) - - Ze(e, t, 'border', !1, o) - - 0.5 - )), - s && - (i = ie.exec(n)) && - (i[3] || 'px') !== 'px' && - ((e.style[t] = n), (n = w.css(e, t))), - Ke(e, n, s) - ) - }, - } - }), - (w.cssHooks.marginLeft = _e(h.reliableMarginLeft, function(e, t) { - if (t) - return ( - (parseFloat(Fe(e, 'marginLeft')) || - e.getBoundingClientRect().left - - se(e, { marginLeft: 0 }, function() { - return e.getBoundingClientRect().left - })) + 'px' - ) - })), - w.each({ margin: '', padding: '', border: 'Width' }, function(e, t) { - ;(w.cssHooks[e + t] = { - expand: function(n) { - for ( - var r = 0, i = {}, o = typeof n === 'string' ? n.split(' ') : [n]; - r < 4; - r++ - ) - i[e + oe[r] + t] = o[r] || o[r - 2] || o[0] - return i - }, - }), - e !== 'margin' && (w.cssHooks[e + t].set = Ke) - }), - w.fn.extend({ - css: function(e, t) { - return z( - this, - function(e, t, n) { - var r, - i, - o = {}, - a = 0 - if (Array.isArray(t)) { - for (r = $e(e), i = t.length; a < i; a++) - o[t[a]] = w.css(e, t[a], !1, r) - return o - } - return void 0 !== n ? w.style(e, t, n) : w.css(e, t) - }, - e, - t, - arguments.length > 1 - ) - }, - }) - function tt(e, t, n, r, i) { - return new tt.prototype.init(e, t, n, r, i) - } - ;(w.Tween = tt), - (tt.prototype = { - constructor: tt, - init: function(e, t, n, r, i, o) { - ;(this.elem = e), - (this.prop = n), - (this.easing = i || w.easing._default), - (this.options = t), - (this.start = this.now = this.cur()), - (this.end = r), - (this.unit = o || (w.cssNumber[n] ? '' : 'px')) - }, - cur: function() { - var e = tt.propHooks[this.prop] - return e && e.get ? e.get(this) : tt.propHooks._default.get(this) - }, - run: function(e) { - var t, - n = tt.propHooks[this.prop] - return ( - this.options.duration - ? (this.pos = t = w.easing[this.easing]( - e, - this.options.duration * e, - 0, - 1, - this.options.duration - )) - : (this.pos = t = e), - (this.now = (this.end - this.start) * t + this.start), - this.options.step && - this.options.step.call(this.elem, this.now, this), - n && n.set ? n.set(this) : tt.propHooks._default.set(this), - this - ) - }, - }), - (tt.prototype.init.prototype = tt.prototype), - (tt.propHooks = { - _default: { - get: function(e) { - var t - return e.elem.nodeType !== 1 || - (e.elem[e.prop] != null && e.elem.style[e.prop] == null) - ? e.elem[e.prop] - : (t = w.css(e.elem, e.prop, '')) && t !== 'auto' ? t : 0 - }, - set: function(e) { - w.fx.step[e.prop] - ? w.fx.step[e.prop](e) - : e.elem.nodeType !== 1 || - (e.elem.style[w.cssProps[e.prop]] == null && !w.cssHooks[e.prop]) - ? (e.elem[e.prop] = e.now) - : w.style(e.elem, e.prop, e.now + e.unit) - }, - }, - }), - (tt.propHooks.scrollTop = tt.propHooks.scrollLeft = { - set: function(e) { - e.elem.nodeType && e.elem.parentNode && (e.elem[e.prop] = e.now) - }, - }), - (w.easing = { - linear: function(e) { - return e - }, - swing: function(e) { - return 0.5 - Math.cos(e * Math.PI) / 2 - }, - _default: 'swing', - }), - (w.fx = tt.prototype.init), - (w.fx.step = {}) - var nt, - rt, - it = /^(?:toggle|show|hide)$/, - ot = /queueHooks$/ - function at() { - rt && - (!1 === r.hidden && e.requestAnimationFrame - ? e.requestAnimationFrame(at) - : e.setTimeout(at, w.fx.interval), - w.fx.tick()) - } - function st() { - return ( - e.setTimeout(function() { - nt = void 0 - }), - (nt = Date.now()) - ) - } - function ut(e, t) { - var n, - r = 0, - i = { height: e } - for (t = t ? 1 : 0; r < 4; r += 2 - t) - i['margin' + (n = oe[r])] = i['padding' + n] = e - return t && (i.opacity = i.width = e), i - } - function lt(e, t, n) { - for ( - var r, - i = (pt.tweeners[t] || []).concat(pt.tweeners['*']), - o = 0, - a = i.length; - o < a; - o++ - ) - if ((r = i[o].call(n, t, e))) return r - } - function ct(e, t, n) { - var r, - i, - o, - a, - s, - u, - l, - c, - f = 'width' in t || 'height' in t, - p = this, - d = {}, - h = e.style, - g = e.nodeType && ae(e), - y = J.get(e, 'fxshow') - n.queue || - ((a = w._queueHooks(e, 'fx')).unqueued == null && - ((a.unqueued = 0), - (s = a.empty.fire), - (a.empty.fire = function() { - a.unqueued || s() - })), - a.unqueued++, - p.always(function() { - p.always(function() { - a.unqueued--, w.queue(e, 'fx').length || a.empty.fire() - }) - })) - for (r in t) - if (((i = t[r]), it.test(i))) { - if ( - (delete t[r], (o = o || i === 'toggle'), i === (g ? 'hide' : 'show')) - ) { - if (i !== 'show' || !y || void 0 === y[r]) continue - g = !0 - } - d[r] = (y && y[r]) || w.style(e, r) - } - if ((u = !w.isEmptyObject(t)) || !w.isEmptyObject(d)) { - f && - e.nodeType === 1 && - ((n.overflow = [h.overflow, h.overflowX, h.overflowY]), - (l = y && y.display) == null && (l = J.get(e, 'display')), - (c = w.css(e, 'display')) === 'none' && - (l - ? (c = l) - : (fe([e], !0), - (l = e.style.display || l), - (c = w.css(e, 'display')), - fe([e]))), - (c === 'inline' || (c === 'inline-block' && l != null)) && - w.css(e, 'float') === 'none' && - (u || - (p.done(function() { - h.display = l - }), - l == null && ((c = h.display), (l = c === 'none' ? '' : c))), - (h.display = 'inline-block'))), - n.overflow && - ((h.overflow = 'hidden'), - p.always(function() { - ;(h.overflow = n.overflow[0]), - (h.overflowX = n.overflow[1]), - (h.overflowY = n.overflow[2]) - })), - (u = !1) - for (r in d) - u || - (y - ? 'hidden' in y && (g = y.hidden) - : (y = J.access(e, 'fxshow', { display: l })), - o && (y.hidden = !g), - g && fe([e], !0), - p.done(function() { - g || fe([e]), J.remove(e, 'fxshow') - for (r in d) w.style(e, r, d[r]) - })), - (u = lt(g ? y[r] : 0, r, p)), - r in y || ((y[r] = u.start), g && ((u.end = u.start), (u.start = 0))) - } - } - function ft(e, t) { - var n, r, i, o, a - for (n in e) - if ( - ((r = G(n)), - (i = t[r]), - (o = e[n]), - Array.isArray(o) && ((i = o[1]), (o = e[n] = o[0])), - n !== r && ((e[r] = o), delete e[n]), - (a = w.cssHooks[r]) && 'expand' in a) - ) { - ;(o = a.expand(o)), delete e[r] - for (n in o) n in e || ((e[n] = o[n]), (t[n] = i)) - } else t[r] = i - } - function pt(e, t, n) { - var r, - i, - o = 0, - a = pt.prefilters.length, - s = w.Deferred().always(function() { - delete u.elem - }), - u = function() { - if (i) return !1 - for ( - var t = nt || st(), - n = Math.max(0, l.startTime + l.duration - t), - r = 1 - (n / l.duration || 0), - o = 0, - a = l.tweens.length; - o < a; - o++ - ) - l.tweens[o].run(r) - return ( - s.notifyWith(e, [l, r, n]), - r < 1 && a - ? n - : (a || s.notifyWith(e, [l, 1, 0]), s.resolveWith(e, [l]), !1) - ) - }, - l = s.promise({ - elem: e, - props: w.extend({}, t), - opts: w.extend(!0, { specialEasing: {}, easing: w.easing._default }, n), - originalProperties: t, - originalOptions: n, - startTime: nt || st(), - duration: n.duration, - tweens: [], - createTween: function(t, n) { - var r = w.Tween( - e, - l.opts, - t, - n, - l.opts.specialEasing[t] || l.opts.easing - ) - return l.tweens.push(r), r - }, - stop: function(t) { - var n = 0, - r = t ? l.tweens.length : 0 - if (i) return this - for (i = !0; n < r; n++) l.tweens[n].run(1) - return ( - t - ? (s.notifyWith(e, [l, 1, 0]), s.resolveWith(e, [l, t])) - : s.rejectWith(e, [l, t]), - this - ) - }, - }), - c = l.props - for (ft(c, l.opts.specialEasing); o < a; o++) - if ((r = pt.prefilters[o].call(l, e, c, l.opts))) - return ( - g(r.stop) && - (w._queueHooks(l.elem, l.opts.queue).stop = r.stop.bind(r)), - r - ) - return ( - w.map(c, lt, l), - g(l.opts.start) && l.opts.start.call(e, l), - l - .progress(l.opts.progress) - .done(l.opts.done, l.opts.complete) - .fail(l.opts.fail) - .always(l.opts.always), - w.fx.timer(w.extend(u, { elem: e, anim: l, queue: l.opts.queue })), - l - ) - } - ;(w.Animation = w.extend(pt, { - tweeners: { - '*': [ - function(e, t) { - var n = this.createTween(e, t) - return ue(n.elem, e, ie.exec(t), n), n - }, - ], - }, - tweener: function(e, t) { - g(e) ? ((t = e), (e = ['*'])) : (e = e.match(M)) - for (var n, r = 0, i = e.length; r < i; r++) - (n = e[r]), - (pt.tweeners[n] = pt.tweeners[n] || []), - pt.tweeners[n].unshift(t) - }, - prefilters: [ct], - prefilter: function(e, t) { - t ? pt.prefilters.unshift(e) : pt.prefilters.push(e) - }, - })), - (w.speed = function(e, t, n) { - var r = - e && typeof e === 'object' - ? w.extend({}, e) - : { - complete: n || (!n && t) || (g(e) && e), - duration: e, - easing: (n && t) || (t && !g(t) && t), - } - return ( - w.fx.off - ? (r.duration = 0) - : typeof r.duration !== 'number' && - (r.duration in w.fx.speeds - ? (r.duration = w.fx.speeds[r.duration]) - : (r.duration = w.fx.speeds._default)), - (r.queue != null && !0 !== r.queue) || (r.queue = 'fx'), - (r.old = r.complete), - (r.complete = function() { - g(r.old) && r.old.call(this), r.queue && w.dequeue(this, r.queue) - }), - r - ) - }), - w.fn.extend({ - fadeTo: function(e, t, n, r) { - return this.filter(ae) - .css('opacity', 0) - .show() - .end() - .animate({ opacity: t }, e, n, r) - }, - animate: function(e, t, n, r) { - var i = w.isEmptyObject(e), - o = w.speed(t, n, r), - a = function() { - var t = pt(this, w.extend({}, e), o) - ;(i || J.get(this, 'finish')) && t.stop(!0) - } - return ( - (a.finish = a), - i || !1 === o.queue ? this.each(a) : this.queue(o.queue, a) - ) - }, - stop: function(e, t, n) { - var r = function(e) { - var t = e.stop - delete e.stop, t(n) - } - return ( - typeof e !== 'string' && ((n = t), (t = e), (e = void 0)), - t && !1 !== e && this.queue(e || 'fx', []), - this.each(function() { - var t = !0, - i = e != null && e + 'queueHooks', - o = w.timers, - a = J.get(this) - if (i) a[i] && a[i].stop && r(a[i]) - else for (i in a) a[i] && a[i].stop && ot.test(i) && r(a[i]) - for (i = o.length; i--; ) - o[i].elem !== this || - (e != null && o[i].queue !== e) || - (o[i].anim.stop(n), (t = !1), o.splice(i, 1)) - ;(!t && n) || w.dequeue(this, e) - }) - ) - }, - finish: function(e) { - return ( - !1 !== e && (e = e || 'fx'), - this.each(function() { - var t, - n = J.get(this), - r = n[e + 'queue'], - i = n[e + 'queueHooks'], - o = w.timers, - a = r ? r.length : 0 - for ( - n.finish = !0, - w.queue(this, e, []), - i && i.stop && i.stop.call(this, !0), - t = o.length; - t--; - - ) - o[t].elem === this && - o[t].queue === e && - (o[t].anim.stop(!0), o.splice(t, 1)) - for (t = 0; t < a; t++) - r[t] && r[t].finish && r[t].finish.call(this) - delete n.finish - }) - ) - }, - }), - w.each(['toggle', 'show', 'hide'], function(e, t) { - var n = w.fn[t] - w.fn[t] = function(e, r, i) { - return e == null || typeof e === 'boolean' - ? n.apply(this, arguments) - : this.animate(ut(t, !0), e, r, i) - } - }), - w.each( - { - slideDown: ut('show'), - slideUp: ut('hide'), - slideToggle: ut('toggle'), - fadeIn: { opacity: 'show' }, - fadeOut: { opacity: 'hide' }, - fadeToggle: { opacity: 'toggle' }, - }, - function(e, t) { - w.fn[e] = function(e, n, r) { - return this.animate(t, e, n, r) - } - } - ), - (w.timers = []), - (w.fx.tick = function() { - var e, - t = 0, - n = w.timers - for (nt = Date.now(); t < n.length; t++) - (e = n[t])() || n[t] !== e || n.splice(t--, 1) - n.length || w.fx.stop(), (nt = void 0) - }), - (w.fx.timer = function(e) { - w.timers.push(e), w.fx.start() - }), - (w.fx.interval = 13), - (w.fx.start = function() { - rt || ((rt = !0), at()) - }), - (w.fx.stop = function() { - rt = null - }), - (w.fx.speeds = { slow: 600, fast: 200, _default: 400 }), - (w.fn.delay = function(t, n) { - return ( - (t = w.fx ? w.fx.speeds[t] || t : t), - (n = n || 'fx'), - this.queue(n, function(n, r) { - var i = e.setTimeout(n, t) - r.stop = function() { - e.clearTimeout(i) - } - }) - ) - }), - (function() { - var e = r.createElement('input'), - t = r.createElement('select').appendChild(r.createElement('option')) - ;(e.type = 'checkbox'), - (h.checkOn = e.value !== ''), - (h.optSelected = t.selected), - ((e = r.createElement('input')).value = 't'), - (e.type = 'radio'), - (h.radioValue = e.value === 't') - })() - var dt, - ht = w.expr.attrHandle - w.fn.extend({ - attr: function(e, t) { - return z(this, w.attr, e, t, arguments.length > 1) - }, - removeAttr: function(e) { - return this.each(function() { - w.removeAttr(this, e) - }) - }, - }), - w.extend({ - attr: function(e, t, n) { - var r, - i, - o = e.nodeType - if (o !== 3 && o !== 8 && o !== 2) - return typeof e.getAttribute === 'undefined' - ? w.prop(e, t, n) - : ((o === 1 && w.isXMLDoc(e)) || - (i = - w.attrHooks[t.toLowerCase()] || - (w.expr.match.bool.test(t) ? dt : void 0)), - void 0 !== n - ? n === null - ? void w.removeAttr(e, t) - : i && 'set' in i && void 0 !== (r = i.set(e, n, t)) - ? r - : (e.setAttribute(t, n + ''), n) - : i && 'get' in i && (r = i.get(e, t)) !== null - ? r - : (r = w.find.attr(e, t)) == null ? void 0 : r) - }, - attrHooks: { - type: { - set: function(e, t) { - if (!h.radioValue && t === 'radio' && N(e, 'input')) { - var n = e.value - return e.setAttribute('type', t), n && (e.value = n), t - } - }, - }, - }, - removeAttr: function(e, t) { - var n, - r = 0, - i = t && t.match(M) - if (i && e.nodeType === 1) while ((n = i[r++])) e.removeAttribute(n) - }, - }), - (dt = { - set: function(e, t, n) { - return !1 === t ? w.removeAttr(e, n) : e.setAttribute(n, n), n - }, - }), - w.each(w.expr.match.bool.source.match(/\w+/g), function(e, t) { - var n = ht[t] || w.find.attr - ht[t] = function(e, t, r) { - var i, - o, - a = t.toLowerCase() - return ( - r || - ((o = ht[a]), - (ht[a] = i), - (i = n(e, t, r) != null ? a : null), - (ht[a] = o)), - i - ) - } - }) - var gt = /^(?:input|select|textarea|button)$/i, - yt = /^(?:a|area)$/i - w.fn.extend({ - prop: function(e, t) { - return z(this, w.prop, e, t, arguments.length > 1) - }, - removeProp: function(e) { - return this.each(function() { - delete this[w.propFix[e] || e] - }) - }, - }), - w.extend({ - prop: function(e, t, n) { - var r, - i, - o = e.nodeType - if (o !== 3 && o !== 8 && o !== 2) - return ( - (o === 1 && w.isXMLDoc(e)) || - ((t = w.propFix[t] || t), (i = w.propHooks[t])), - void 0 !== n - ? i && 'set' in i && void 0 !== (r = i.set(e, n, t)) - ? r - : (e[t] = n) - : i && 'get' in i && (r = i.get(e, t)) !== null ? r : e[t] - ) - }, - propHooks: { - tabIndex: { - get: function(e) { - var t = w.find.attr(e, 'tabindex') - return t - ? parseInt(t, 10) - : gt.test(e.nodeName) || (yt.test(e.nodeName) && e.href) ? 0 : -1 - }, - }, - }, - propFix: { for: 'htmlFor', class: 'className' }, - }), - h.optSelected || - (w.propHooks.selected = { - get: function(e) { - var t = e.parentNode - return t && t.parentNode && t.parentNode.selectedIndex, null - }, - set: function(e) { - var t = e.parentNode - t && (t.selectedIndex, t.parentNode && t.parentNode.selectedIndex) - }, - }), - w.each( - [ - 'tabIndex', - 'readOnly', - 'maxLength', - 'cellSpacing', - 'cellPadding', - 'rowSpan', - 'colSpan', - 'useMap', - 'frameBorder', - 'contentEditable', - ], - function() { - w.propFix[this.toLowerCase()] = this - } - ) - function vt(e) { - return (e.match(M) || []).join(' ') - } - function mt(e) { - return (e.getAttribute && e.getAttribute('class')) || '' - } - function xt(e) { - return Array.isArray(e) ? e : typeof e === 'string' ? e.match(M) || [] : [] - } - w.fn.extend({ - addClass: function(e) { - var t, - n, - r, - i, - o, - a, - s, - u = 0 - if (g(e)) - return this.each(function(t) { - w(this).addClass(e.call(this, t, mt(this))) - }) - if ((t = xt(e)).length) - while ((n = this[u++])) - if (((i = mt(n)), (r = n.nodeType === 1 && ' ' + vt(i) + ' '))) { - a = 0 - while ((o = t[a++])) r.indexOf(' ' + o + ' ') < 0 && (r += o + ' ') - i !== (s = vt(r)) && n.setAttribute('class', s) - } - return this - }, - removeClass: function(e) { - var t, - n, - r, - i, - o, - a, - s, - u = 0 - if (g(e)) - return this.each(function(t) { - w(this).removeClass(e.call(this, t, mt(this))) - }) - if (!arguments.length) return this.attr('class', '') - if ((t = xt(e)).length) - while ((n = this[u++])) - if (((i = mt(n)), (r = n.nodeType === 1 && ' ' + vt(i) + ' '))) { - a = 0 - while ((o = t[a++])) - while (r.indexOf(' ' + o + ' ') > -1) - r = r.replace(' ' + o + ' ', ' ') - i !== (s = vt(r)) && n.setAttribute('class', s) - } - return this - }, - toggleClass: function(e, t) { - var n = typeof e, - r = n === 'string' || Array.isArray(e) - return typeof t === 'boolean' && r - ? t ? this.addClass(e) : this.removeClass(e) - : g(e) - ? this.each(function(n) { - w(this).toggleClass(e.call(this, n, mt(this), t), t) - }) - : this.each(function() { - var t, i, o, a - if (r) { - ;(i = 0), (o = w(this)), (a = xt(e)) - while ((t = a[i++])) - o.hasClass(t) ? o.removeClass(t) : o.addClass(t) - } else (void 0 !== e && n !== 'boolean') || ((t = mt(this)) && J.set(this, '__className__', t), this.setAttribute && this.setAttribute('class', t || !1 === e ? '' : J.get(this, '__className__') || '')) - }) - }, - hasClass: function(e) { - var t, - n, - r = 0 - t = ' ' + e + ' ' - while ((n = this[r++])) - if (n.nodeType === 1 && (' ' + vt(mt(n)) + ' ').indexOf(t) > -1) - return !0 - return !1 - }, - }) - var bt = /\r/g - w.fn.extend({ - val: function(e) { - var t, - n, - r, - i = this[0] - { - if (arguments.length) - return ( - (r = g(e)), - this.each(function(n) { - var i - this.nodeType === 1 && - ((i = r ? e.call(this, n, w(this).val()) : e) == null - ? (i = '') - : typeof i === 'number' - ? (i += '') - : Array.isArray(i) && - (i = w.map(i, function(e) { - return e == null ? '' : e + '' - })), - ((t = - w.valHooks[this.type] || - w.valHooks[this.nodeName.toLowerCase()]) && - 'set' in t && - void 0 !== t.set(this, i, 'value')) || - (this.value = i)) - }) - ) - if (i) - return (t = - w.valHooks[i.type] || w.valHooks[i.nodeName.toLowerCase()]) && - 'get' in t && - void 0 !== (n = t.get(i, 'value')) - ? n - : typeof (n = i.value) === 'string' - ? n.replace(bt, '') - : n == null ? '' : n - } - }, - }), - w.extend({ - valHooks: { - option: { - get: function(e) { - var t = w.find.attr(e, 'value') - return t != null ? t : vt(w.text(e)) - }, - }, - select: { - get: function(e) { - var t, - n, - r, - i = e.options, - o = e.selectedIndex, - a = e.type === 'select-one', - s = a ? null : [], - u = a ? o + 1 : i.length - for (r = o < 0 ? u : a ? o : 0; r < u; r++) - if ( - ((n = i[r]).selected || r === o) && - !n.disabled && - (!n.parentNode.disabled || !N(n.parentNode, 'optgroup')) - ) { - if (((t = w(n).val()), a)) return t - s.push(t) - } - return s - }, - set: function(e, t) { - var n, - r, - i = e.options, - o = w.makeArray(t), - a = i.length - while (a--) - ((r = i[a]).selected = - w.inArray(w.valHooks.option.get(r), o) > -1) && (n = !0) - return n || (e.selectedIndex = -1), o - }, - }, - }, - }), - w.each(['radio', 'checkbox'], function() { - ;(w.valHooks[this] = { - set: function(e, t) { - if (Array.isArray(t)) - return (e.checked = w.inArray(w(e).val(), t) > -1) - }, - }), - h.checkOn || - (w.valHooks[this].get = function(e) { - return e.getAttribute('value') === null ? 'on' : e.value - }) - }), - (h.focusin = 'onfocusin' in e) - var wt = /^(?:focusinfocus|focusoutblur)$/, - Tt = function(e) { - e.stopPropagation() - } - w.extend(w.event, { - trigger: function(t, n, i, o) { - var a, - s, - u, - l, - c, - p, - d, - h, - v = [i || r], - m = f.call(t, 'type') ? t.type : t, - x = f.call(t, 'namespace') ? t.namespace.split('.') : [] - if ( - ((s = h = u = i = i || r), - i.nodeType !== 3 && - i.nodeType !== 8 && - !wt.test(m + w.event.triggered) && - (m.indexOf('.') > -1 && ((m = (x = m.split('.')).shift()), x.sort()), - (c = m.indexOf(':') < 0 && 'on' + m), - (t = t[w.expando] ? t : new w.Event(m, typeof t === 'object' && t)), - (t.isTrigger = o ? 2 : 3), - (t.namespace = x.join('.')), - (t.rnamespace = t.namespace - ? new RegExp('(^|\\.)' + x.join('\\.(?:.*\\.|)') + '(\\.|$)') - : null), - (t.result = void 0), - t.target || (t.target = i), - (n = n == null ? [t] : w.makeArray(n, [t])), - (d = w.event.special[m] || {}), - o || !d.trigger || !1 !== d.trigger.apply(i, n))) - ) { - if (!o && !d.noBubble && !y(i)) { - for ( - l = d.delegateType || m, wt.test(l + m) || (s = s.parentNode); - s; - s = s.parentNode - ) - v.push(s), (u = s) - u === (i.ownerDocument || r) && - v.push(u.defaultView || u.parentWindow || e) - } - a = 0 - while ((s = v[a++]) && !t.isPropagationStopped()) - (h = s), - (t.type = a > 1 ? l : d.bindType || m), - (p = (J.get(s, 'events') || {})[t.type] && J.get(s, 'handle')) && - p.apply(s, n), - (p = c && s[c]) && - p.apply && - Y(s) && - ((t.result = p.apply(s, n)), - !1 === t.result && t.preventDefault()) - return ( - (t.type = m), - o || - t.isDefaultPrevented() || - (d._default && !1 !== d._default.apply(v.pop(), n)) || - !Y(i) || - (c && - g(i[m]) && - !y(i) && - ((u = i[c]) && (i[c] = null), - (w.event.triggered = m), - t.isPropagationStopped() && h.addEventListener(m, Tt), - i[m](), - t.isPropagationStopped() && h.removeEventListener(m, Tt), - (w.event.triggered = void 0), - u && (i[c] = u))), - t.result - ) - } - }, - simulate: function(e, t, n) { - var r = w.extend(new w.Event(), n, { type: e, isSimulated: !0 }) - w.event.trigger(r, null, t) - }, - }), - w.fn.extend({ - trigger: function(e, t) { - return this.each(function() { - w.event.trigger(e, t, this) - }) - }, - triggerHandler: function(e, t) { - var n = this[0] - if (n) return w.event.trigger(e, t, n, !0) - }, - }), - h.focusin || - w.each({ focus: 'focusin', blur: 'focusout' }, function(e, t) { - var n = function(e) { - w.event.simulate(t, e.target, w.event.fix(e)) - } - w.event.special[t] = { - setup: function() { - var r = this.ownerDocument || this, - i = J.access(r, t) - i || r.addEventListener(e, n, !0), J.access(r, t, (i || 0) + 1) - }, - teardown: function() { - var r = this.ownerDocument || this, - i = J.access(r, t) - 1 - i - ? J.access(r, t, i) - : (r.removeEventListener(e, n, !0), J.remove(r, t)) - }, - } - }) - var Ct = e.location, - Et = Date.now(), - kt = /\?/ - w.parseXML = function(t) { - var n - if (!t || typeof t !== 'string') return null - try { - n = new e.DOMParser().parseFromString(t, 'text/xml') - } catch (e) { - n = void 0 - } - return ( - (n && !n.getElementsByTagName('parsererror').length) || - w.error('Invalid XML: ' + t), - n - ) - } - var St = /\[\]$/, - Dt = /\r?\n/g, - Nt = /^(?:submit|button|image|reset|file)$/i, - At = /^(?:input|select|textarea|keygen)/i - function jt(e, t, n, r) { - var i - if (Array.isArray(t)) - w.each(t, function(t, i) { - n || St.test(e) - ? r(e, i) - : jt( - e + '[' + (typeof i === 'object' && i != null ? t : '') + ']', - i, - n, - r - ) - }) - else if (n || x(t) !== 'object') r(e, t) - else for (i in t) jt(e + '[' + i + ']', t[i], n, r) - } - ;(w.param = function(e, t) { - var n, - r = [], - i = function(e, t) { - var n = g(t) ? t() : t - r[r.length] = - encodeURIComponent(e) + '=' + encodeURIComponent(n == null ? '' : n) - } - if (Array.isArray(e) || (e.jquery && !w.isPlainObject(e))) - w.each(e, function() { - i(this.name, this.value) - }) - else for (n in e) jt(n, e[n], t, i) - return r.join('&') - }), - w.fn.extend({ - serialize: function() { - return w.param(this.serializeArray()) - }, - serializeArray: function() { - return this.map(function() { - var e = w.prop(this, 'elements') - return e ? w.makeArray(e) : this - }) - .filter(function() { - var e = this.type - return ( - this.name && - !w(this).is(':disabled') && - At.test(this.nodeName) && - !Nt.test(e) && - (this.checked || !pe.test(e)) - ) - }) - .map(function(e, t) { - var n = w(this).val() - return n == null - ? null - : Array.isArray(n) - ? w.map(n, function(e) { - return { name: t.name, value: e.replace(Dt, '\r\n') } - }) - : { name: t.name, value: n.replace(Dt, '\r\n') } - }) - .get() - }, - }) - var qt = /%20/g, - Lt = /#.*$/, - Ht = /([?&])_=[^&]*/, - Ot = /^(.*?):[ \t]*([^\r\n]*)$/gm, - Pt = /^(?:about|app|app-storage|.+-extension|file|res|widget):$/, - Mt = /^(?:GET|HEAD)$/, - Rt = /^\/\//, - It = {}, - Wt = {}, - $t = '*/'.concat('*'), - Bt = r.createElement('a') - Bt.href = Ct.href - function Ft(e) { - return function(t, n) { - typeof t !== 'string' && ((n = t), (t = '*')) - var r, - i = 0, - o = t.toLowerCase().match(M) || [] - if (g(n)) - while ((r = o[i++])) - r[0] === '+' - ? ((r = r.slice(1) || '*'), (e[r] = e[r] || []).unshift(n)) - : (e[r] = e[r] || []).push(n) - } - } - function _t(e, t, n, r) { - var i = {}, - o = e === Wt - function a(s) { - var u - return ( - (i[s] = !0), - w.each(e[s] || [], function(e, s) { - var l = s(t, n, r) - return typeof l !== 'string' || o || i[l] - ? o ? !(u = l) : void 0 - : (t.dataTypes.unshift(l), a(l), !1) - }), - u - ) - } - return a(t.dataTypes[0]) || (!i['*'] && a('*')) - } - function zt(e, t) { - var n, - r, - i = w.ajaxSettings.flatOptions || {} - for (n in t) void 0 !== t[n] && ((i[n] ? e : r || (r = {}))[n] = t[n]) - return r && w.extend(!0, e, r), e - } - function Xt(e, t, n) { - var r, - i, - o, - a, - s = e.contents, - u = e.dataTypes - while (u[0] === '*') - u.shift(), - void 0 === r && (r = e.mimeType || t.getResponseHeader('Content-Type')) - if (r) - for (i in s) - if (s[i] && s[i].test(r)) { - u.unshift(i) - break - } - if (u[0] in n) o = u[0] - else { - for (i in n) { - if (!u[0] || e.converters[i + ' ' + u[0]]) { - o = i - break - } - a || (a = i) - } - o = o || a - } - if (o) return o !== u[0] && u.unshift(o), n[o] - } - function Ut(e, t, n, r) { - var i, - o, - a, - s, - u, - l = {}, - c = e.dataTypes.slice() - if (c[1]) for (a in e.converters) l[a.toLowerCase()] = e.converters[a] - o = c.shift() - while (o) - if ( - (e.responseFields[o] && (n[e.responseFields[o]] = t), - !u && r && e.dataFilter && (t = e.dataFilter(t, e.dataType)), - (u = o), - (o = c.shift())) - ) - if (o === '*') o = u - else if (u !== '*' && u !== o) { - if (!(a = l[u + ' ' + o] || l['* ' + o])) - for (i in l) - if ( - (s = i.split(' '))[1] === o && - (a = l[u + ' ' + s[0]] || l['* ' + s[0]]) - ) { - !0 === a - ? (a = l[i]) - : !0 !== l[i] && ((o = s[0]), c.unshift(s[1])) - break - } - if (!0 !== a) - if (a && e['throws']) t = a(t) - else - try { - t = a(t) - } catch (e) { - return { - state: 'parsererror', - error: a ? e : 'No conversion from ' + u + ' to ' + o, - } - } - } - return { state: 'success', data: t } - } - w.extend({ - active: 0, - lastModified: {}, - etag: {}, - ajaxSettings: { - url: Ct.href, - type: 'GET', - isLocal: Pt.test(Ct.protocol), - global: !0, - processData: !0, - async: !0, - contentType: 'application/x-www-form-urlencoded; charset=UTF-8', - accepts: { - '*': $t, - text: 'text/plain', - html: 'text/html', - xml: 'application/xml, text/xml', - json: 'application/json, text/javascript', - }, - contents: { xml: /\bxml\b/, html: /\bhtml/, json: /\bjson\b/ }, - responseFields: { - xml: 'responseXML', - text: 'responseText', - json: 'responseJSON', - }, - converters: { - '* text': String, - 'text html': !0, - 'text json': JSON.parse, - 'text xml': w.parseXML, - }, - flatOptions: { url: !0, context: !0 }, - }, - ajaxSetup: function(e, t) { - return t ? zt(zt(e, w.ajaxSettings), t) : zt(w.ajaxSettings, e) - }, - ajaxPrefilter: Ft(It), - ajaxTransport: Ft(Wt), - ajax: function(t, n) { - typeof t === 'object' && ((n = t), (t = void 0)), (n = n || {}) - var i, - o, - a, - s, - u, - l, - c, - f, - p, - d, - h = w.ajaxSetup({}, n), - g = h.context || h, - y = h.context && (g.nodeType || g.jquery) ? w(g) : w.event, - v = w.Deferred(), - m = w.Callbacks('once memory'), - x = h.statusCode || {}, - b = {}, - T = {}, - C = 'canceled', - E = { - readyState: 0, - getResponseHeader: function(e) { - var t - if (c) { - if (!s) { - s = {} - while ((t = Ot.exec(a))) s[t[1].toLowerCase()] = t[2] - } - t = s[e.toLowerCase()] - } - return t == null ? null : t - }, - getAllResponseHeaders: function() { - return c ? a : null - }, - setRequestHeader: function(e, t) { - return ( - c == null && - ((e = T[e.toLowerCase()] = T[e.toLowerCase()] || e), - (b[e] = t)), - this - ) - }, - overrideMimeType: function(e) { - return c == null && (h.mimeType = e), this - }, - statusCode: function(e) { - var t - if (e) - if (c) E.always(e[E.status]) - else for (t in e) x[t] = [x[t], e[t]] - return this - }, - abort: function(e) { - var t = e || C - return i && i.abort(t), k(0, t), this - }, - } - if ( - (v.promise(E), - (h.url = ((t || h.url || Ct.href) + '').replace( - Rt, - Ct.protocol + '//' - )), - (h.type = n.method || n.type || h.method || h.type), - (h.dataTypes = (h.dataType || '*').toLowerCase().match(M) || ['']), - h.crossDomain == null) - ) { - l = r.createElement('a') - try { - ;(l.href = h.url), - (l.href = l.href), - (h.crossDomain = - Bt.protocol + '//' + Bt.host != l.protocol + '//' + l.host) - } catch (e) { - h.crossDomain = !0 - } - } - if ( - (h.data && - h.processData && - typeof h.data !== 'string' && - (h.data = w.param(h.data, h.traditional)), - _t(It, h, n, E), - c) - ) - return E - ;(f = w.event && h.global) && - w.active++ == 0 && - w.event.trigger('ajaxStart'), - (h.type = h.type.toUpperCase()), - (h.hasContent = !Mt.test(h.type)), - (o = h.url.replace(Lt, '')), - h.hasContent - ? h.data && - h.processData && - (h.contentType || '').indexOf( - 'application/x-www-form-urlencoded' - ) === 0 && - (h.data = h.data.replace(qt, '+')) - : ((d = h.url.slice(o.length)), - h.data && - (h.processData || typeof h.data === 'string') && - ((o += (kt.test(o) ? '&' : '?') + h.data), delete h.data), - !1 === h.cache && - ((o = o.replace(Ht, '$1')), - (d = (kt.test(o) ? '&' : '?') + '_=' + Et++ + d)), - (h.url = o + d)), - h.ifModified && - (w.lastModified[o] && - E.setRequestHeader('If-Modified-Since', w.lastModified[o]), - w.etag[o] && E.setRequestHeader('If-None-Match', w.etag[o])), - ((h.data && h.hasContent && !1 !== h.contentType) || n.contentType) && - E.setRequestHeader('Content-Type', h.contentType), - E.setRequestHeader( - 'Accept', - h.dataTypes[0] && h.accepts[h.dataTypes[0]] - ? h.accepts[h.dataTypes[0]] + - (h.dataTypes[0] !== '*' ? ', ' + $t + '; q=0.01' : '') - : h.accepts['*'] - ) - for (p in h.headers) E.setRequestHeader(p, h.headers[p]) - if (h.beforeSend && (!1 === h.beforeSend.call(g, E, h) || c)) - return E.abort() - if ( - ((C = 'abort'), - m.add(h.complete), - E.done(h.success), - E.fail(h.error), - (i = _t(Wt, h, n, E))) - ) { - if (((E.readyState = 1), f && y.trigger('ajaxSend', [E, h]), c)) - return E - h.async && - h.timeout > 0 && - (u = e.setTimeout(function() { - E.abort('timeout') - }, h.timeout)) - try { - ;(c = !1), i.send(b, k) - } catch (e) { - if (c) throw e - k(-1, e) - } - } else k(-1, 'No Transport') - function k(t, n, r, s) { - var l, - p, - d, - b, - T, - C = n - c || - ((c = !0), - u && e.clearTimeout(u), - (i = void 0), - (a = s || ''), - (E.readyState = t > 0 ? 4 : 0), - (l = (t >= 200 && t < 300) || t === 304), - r && (b = Xt(h, E, r)), - (b = Ut(h, b, E, l)), - l - ? (h.ifModified && - ((T = E.getResponseHeader('Last-Modified')) && - (w.lastModified[o] = T), - (T = E.getResponseHeader('etag')) && (w.etag[o] = T)), - t === 204 || h.type === 'HEAD' - ? (C = 'nocontent') - : t === 304 - ? (C = 'notmodified') - : ((C = b.state), (p = b.data), (l = !(d = b.error)))) - : ((d = C), (!t && C) || ((C = 'error'), t < 0 && (t = 0))), - (E.status = t), - (E.statusText = (n || C) + ''), - l ? v.resolveWith(g, [p, C, E]) : v.rejectWith(g, [E, C, d]), - E.statusCode(x), - (x = void 0), - f && y.trigger(l ? 'ajaxSuccess' : 'ajaxError', [E, h, l ? p : d]), - m.fireWith(g, [E, C]), - f && - (y.trigger('ajaxComplete', [E, h]), - --w.active || w.event.trigger('ajaxStop'))) - } - return E - }, - getJSON: function(e, t, n) { - return w.get(e, t, n, 'json') - }, - getScript: function(e, t) { - return w.get(e, void 0, t, 'script') - }, - }), - w.each(['get', 'post'], function(e, t) { - w[t] = function(e, n, r, i) { - return ( - g(n) && ((i = i || r), (r = n), (n = void 0)), - w.ajax( - w.extend( - { url: e, type: t, dataType: i, data: n, success: r }, - w.isPlainObject(e) && e - ) - ) - ) - } - }), - (w._evalUrl = function(e) { - return w.ajax({ - url: e, - type: 'GET', - dataType: 'script', - cache: !0, - async: !1, - global: !1, - throws: !0, - }) - }), - w.fn.extend({ - wrapAll: function(e) { - var t - return ( - this[0] && - (g(e) && (e = e.call(this[0])), - (t = w(e, this[0].ownerDocument) - .eq(0) - .clone(!0)), - this[0].parentNode && t.insertBefore(this[0]), - t - .map(function() { - var e = this - while (e.firstElementChild) e = e.firstElementChild - return e - }) - .append(this)), - this - ) - }, - wrapInner: function(e) { - return g(e) - ? this.each(function(t) { - w(this).wrapInner(e.call(this, t)) - }) - : this.each(function() { - var t = w(this), - n = t.contents() - n.length ? n.wrapAll(e) : t.append(e) - }) - }, - wrap: function(e) { - var t = g(e) - return this.each(function(n) { - w(this).wrapAll(t ? e.call(this, n) : e) - }) - }, - unwrap: function(e) { - return ( - this.parent(e) - .not('body') - .each(function() { - w(this).replaceWith(this.childNodes) - }), - this - ) - }, - }), - (w.expr.pseudos.hidden = function(e) { - return !w.expr.pseudos.visible(e) - }), - (w.expr.pseudos.visible = function(e) { - return !!(e.offsetWidth || e.offsetHeight || e.getClientRects().length) - }), - (w.ajaxSettings.xhr = function() { - try { - return new e.XMLHttpRequest() - } catch (e) {} - }) - var Vt = { 0: 200, 1223: 204 }, - Gt = w.ajaxSettings.xhr() - ;(h.cors = !!Gt && 'withCredentials' in Gt), - (h.ajax = Gt = !!Gt), - w.ajaxTransport(function(t) { - var n, r - if (h.cors || (Gt && !t.crossDomain)) - return { - send: function(i, o) { - var a, - s = t.xhr() - if ( - (s.open(t.type, t.url, t.async, t.username, t.password), - t.xhrFields) - ) - for (a in t.xhrFields) s[a] = t.xhrFields[a] - t.mimeType && s.overrideMimeType && s.overrideMimeType(t.mimeType), - t.crossDomain || - i['X-Requested-With'] || - (i['X-Requested-With'] = 'XMLHttpRequest') - for (a in i) s.setRequestHeader(a, i[a]) - ;(n = function(e) { - return function() { - n && - ((n = r = s.onload = s.onerror = s.onabort = s.ontimeout = s.onreadystatechange = null), - e === 'abort' - ? s.abort() - : e === 'error' - ? typeof s.status !== 'number' - ? o(0, 'error') - : o(s.status, s.statusText) - : o( - Vt[s.status] || s.status, - s.statusText, - (s.responseType || 'text') !== 'text' || - typeof s.responseText !== 'string' - ? { binary: s.response } - : { text: s.responseText }, - s.getAllResponseHeaders() - )) - } - }), - (s.onload = n()), - (r = s.onerror = s.ontimeout = n('error')), - void 0 !== s.onabort - ? (s.onabort = r) - : (s.onreadystatechange = function() { - s.readyState === 4 && - e.setTimeout(function() { - n && r() - }) - }), - (n = n('abort')) - try { - s.send((t.hasContent && t.data) || null) - } catch (e) { - if (n) throw e - } - }, - abort: function() { - n && n() - }, - } - }), - w.ajaxPrefilter(function(e) { - e.crossDomain && (e.contents.script = !1) - }), - w.ajaxSetup({ - accepts: { - script: - 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript', - }, - contents: { script: /\b(?:java|ecma)script\b/ }, - converters: { - 'text script': function(e) { - return w.globalEval(e), e - }, - }, - }), - w.ajaxPrefilter('script', function(e) { - void 0 === e.cache && (e.cache = !1), e.crossDomain && (e.type = 'GET') - }), - w.ajaxTransport('script', function(e) { - if (e.crossDomain) { - var t, n - return { - send: function(i, o) { - ;(t = w('