├── dist ├── favicon.ico ├── assets │ ├── iconfont │ │ ├── iconfont.eot │ │ ├── iconfont.ttf │ │ ├── iconfont.woff │ │ ├── iconfont.css │ │ ├── iconfont.svg │ │ └── iconfont.js │ └── fonts │ │ └── Montserrat-Regular.ttf ├── index.html ├── images │ └── douban.svg ├── mock │ ├── search-1.json │ └── search-2.json └── scripts │ └── polyfill.js ├── screenshots ├── 1.png └── 2.png ├── src ├── styles │ ├── loader.css │ │ ├── _functions.scss │ │ ├── _variables.scss │ │ ├── _mixins.scss │ │ └── animations │ │ │ └── pacman.scss │ ├── _book_item.scss │ ├── _home_search_container.scss │ ├── index.scss │ ├── _search_results_container.scss │ └── theme_minty │ │ ├── _variables.scss │ │ └── _bootswatch.scss ├── scripts │ ├── index.js │ ├── components │ │ ├── Loading.jsx │ │ ├── components.js │ │ ├── RecentSearch.jsx │ │ ├── ErrorAlert.jsx │ │ ├── PageFooter.jsx │ │ ├── BodyHome.jsx │ │ ├── Navbar.jsx │ │ ├── RootComponent.jsx │ │ ├── Pagination.jsx │ │ ├── BodySearchResults.jsx │ │ └── BookResultItem.jsx │ ├── polyfill.js │ ├── index.d.ts │ ├── browser_storage │ │ └── recent_search.js │ ├── i18n │ │ ├── index.js │ │ └── strings.js │ └── api │ │ ├── setup.js │ │ ├── _response.js │ │ ├── api_search_books.js │ │ └── _ajax.js └── index.html ├── .babelrc ├── .vscode └── settings.json ├── .eslintrc.json ├── GENERATE_PROD_ARCHIVE.sh ├── COPY_ASSET_FILES.sh ├── .gitignore ├── README.md ├── package.json └── LICENSE /dist/favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hangxingliu/assignment-library-system/master/dist/favicon.ico -------------------------------------------------------------------------------- /screenshots/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hangxingliu/assignment-library-system/master/screenshots/1.png -------------------------------------------------------------------------------- /screenshots/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hangxingliu/assignment-library-system/master/screenshots/2.png -------------------------------------------------------------------------------- /dist/assets/iconfont/iconfont.eot: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hangxingliu/assignment-library-system/master/dist/assets/iconfont/iconfont.eot -------------------------------------------------------------------------------- /dist/assets/iconfont/iconfont.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hangxingliu/assignment-library-system/master/dist/assets/iconfont/iconfont.ttf -------------------------------------------------------------------------------- /dist/assets/iconfont/iconfont.woff: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hangxingliu/assignment-library-system/master/dist/assets/iconfont/iconfont.woff -------------------------------------------------------------------------------- /src/styles/loader.css/_functions.scss: -------------------------------------------------------------------------------- 1 | @function delay($interval, $count, $index) { 2 | @return ($index * $interval) - ($interval * $count); 3 | } -------------------------------------------------------------------------------- /dist/assets/fonts/Montserrat-Regular.ttf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/hangxingliu/assignment-library-system/master/dist/assets/fonts/Montserrat-Regular.ttf -------------------------------------------------------------------------------- /.babelrc: -------------------------------------------------------------------------------- 1 | { 2 | "compact": "true", 3 | "comments": false, 4 | "plugins": [ 5 | "minify-mangle-names", 6 | "transform-merge-sibling-variables" 7 | ] 8 | } -------------------------------------------------------------------------------- /src/styles/loader.css/_variables.scss: -------------------------------------------------------------------------------- 1 | $primary-color: $primary !default; 2 | $ball-size: 15px !default; 3 | $margin: 2px !default; 4 | $line-height: 35px !default; 5 | $line-width: 4px !default; -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "OPAC", 4 | "bootswatch", 5 | "describedby", 6 | "dismissible", 7 | "douban", 8 | "dropdown", 9 | "hanxingliu", 10 | "mixins", 11 | "pacman", 12 | "polyfill", 13 | "recents", 14 | "stylesheet" 15 | ] 16 | } -------------------------------------------------------------------------------- /src/scripts/index.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import { updateUI } from "./components/components"; 5 | import { setup } from "./api/setup"; 6 | 7 | setup("/"); 8 | updateUI(); 9 | 10 | window.addEventListener('hashchange', updateUI); 11 | 12 | // console.log(process.env.NODE_ENV); 13 | -------------------------------------------------------------------------------- /src/styles/_book_item.scss: -------------------------------------------------------------------------------- 1 | 2 | .book-item { 3 | border-bottom: 1px dashed $gray-400; 4 | 5 | .book-item-left { 6 | .author-and-publisher { 7 | span,i{ 8 | font-size: .9em; 9 | } 10 | } 11 | } 12 | .book-item-right { 13 | .storage-status { 14 | white-space: nowrap; 15 | } 16 | .link-to-douban { 17 | display: block; 18 | max-width: 24px; 19 | img {width: 100%} 20 | } 21 | } 22 | } -------------------------------------------------------------------------------- /src/styles/loader.css/_mixins.scss: -------------------------------------------------------------------------------- 1 | @mixin global-bg() { 2 | background-color: $primary-color; 3 | } 4 | 5 | @mixin global-animation() { 6 | animation-fill-mode: both; 7 | } 8 | 9 | @mixin balls() { 10 | @include global-bg(); 11 | width: $ball-size; 12 | height: $ball-size; 13 | border-radius: 100%; 14 | margin: $margin; 15 | } 16 | 17 | @mixin lines() { 18 | @include global-bg(); 19 | width: $line-width; 20 | height: $line-height; 21 | border-radius: 2px; 22 | margin: $margin; 23 | } -------------------------------------------------------------------------------- /src/scripts/components/Loading.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { getString, getI18N, setI18N } from '../i18n/index'; 6 | 7 | export function Loading(props) { 8 | return
9 |
10 |
11 |
12 |
13 |
14 |
15 |
16 |
17 |
18 |
; 19 | } -------------------------------------------------------------------------------- /src/scripts/components/components.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | import React from 'react'; 4 | import ReactDOM from 'react-dom'; 5 | import { RootComponent } from './RootComponent'; 6 | 7 | export function updateUI() { 8 | // 获得 React 渲染根节点 9 | let reactRoot = document.getElementById('root'); 10 | return new Promise((resolve, reject) => { 11 | // 重新绘制 RootComponent 组件 12 | //@ts-ignore 13 | try { ReactDOM.render(, reactRoot, resolve); } 14 | catch (ex) { return reject(ex); } 15 | }); 16 | } 17 | -------------------------------------------------------------------------------- /src/scripts/polyfill.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | // ============ 5 | // polyfill 6 | 7 | // for promise and for-of 8 | require("core-js/fn/promise"); 9 | require("core-js/fn/symbol"); 10 | 11 | // for string methods 12 | require("core-js/fn/string/starts-with"); 13 | require("core-js/fn/string/ends-with"); 14 | require("core-js/fn/string/trim"); 15 | 16 | // for react 17 | require("core-js/fn/map"); 18 | require("core-js/fn/set"); 19 | // Warning: React depends on requestAnimationFrame. 20 | // Make sure that you load a polyfill in older browsers.http://fb.me/react-polyfills 21 | require('raf'); //RequestAnimationFrame 22 | -------------------------------------------------------------------------------- /.eslintrc.json: -------------------------------------------------------------------------------- 1 | { 2 | "env": { 3 | "browser": true, 4 | "commonjs": true, 5 | "es6": true, 6 | "node": true, 7 | "jquery": true 8 | }, 9 | "globals": { 10 | }, 11 | "parser": "babel-eslint", 12 | "parserOptions": { 13 | "ecmaFeatures": { 14 | "jsx": true 15 | }, 16 | "sourceType": "module" 17 | }, 18 | "extends": ["eslint:recommended", "plugin:react/recommended"], 19 | "rules": { 20 | "no-unused-vars": "warn", 21 | "no-console": "off", 22 | "react/prop-types": "off", 23 | "react/jsx-no-target-blank": "off" 24 | }, 25 | "plugins": [ 26 | "react" 27 | ] 28 | } -------------------------------------------------------------------------------- /src/scripts/components/RecentSearch.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { getString, getI18N, setI18N } from '../i18n/index'; 6 | import { getRecentSearch } from '../browser_storage/recent_search'; 7 | import { searchBooks } from '../api/api_search_books'; 8 | 9 | export function RecentSearch(props) { 10 | return
11 |
{getString('recentSearch')}
12 | {getRecentSearch().map((recent,i) => 13 | { event.preventDefault(); searchBooks(recent, 1); }} 14 | className="btn btn-link hvr-grow text-muted">{recent})} 15 |
; 16 | } -------------------------------------------------------------------------------- /src/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | A beautiful OPAC 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 |
17 |
18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /dist/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | A beautiful OPAC 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 |
17 |
18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | -------------------------------------------------------------------------------- /src/styles/_home_search_container.scss: -------------------------------------------------------------------------------- 1 | .home-search-container { 2 | padding-top: 10vh; 3 | 4 | background: $gray-200; 5 | min-height: 75vh; 6 | 7 | display: flex; 8 | align-items: center; 9 | flex-wrap: wrap; 10 | flex-direction: column; 11 | 12 | #bannerContainer { 13 | width: 40%; 14 | margin-bottom: 30px; 15 | 16 | img {width: 100%;} 17 | } 18 | #searchBoxContainer { 19 | position: relative; 20 | width: 50%; 21 | @media (max-width: 991.99px) { width: 85%; } 22 | 23 | #searchBox { 24 | font-size: 1.8em; 25 | padding-right: 64px; 26 | } 27 | #searchBtn { 28 | position: absolute; 29 | right: .4em; 30 | top: 0; 31 | text-decoration: none; 32 | &:hover{text-decoration: none;} 33 | &:focus{text-decoration: none;} 34 | 35 | .iconfont { 36 | font-size: 1.8em; 37 | } 38 | } 39 | } 40 | } -------------------------------------------------------------------------------- /dist/images/douban.svg: -------------------------------------------------------------------------------- 1 | -------------------------------------------------------------------------------- /GENERATE_PROD_ARCHIVE.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | 4 | SOURCE="${BASH_SOURCE[0]}"; 5 | while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink 6 | DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"; 7 | SOURCE="$(readlink "$SOURCE")"; 8 | [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"; # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located 9 | done 10 | DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"; 11 | cd "$DIR"; 12 | 13 | BASENAME="$(basename `pwd`)"; 14 | DATE=`date "+%y%m%d-%H%M%S"`; 15 | TARGET="$BASENAME-$DATE.zip"; 16 | 17 | function end() { 18 | [[ $1 == "0" ]] && echo "[+] exit: 0" || echo "[-] exit $1"; 19 | exit $1; } 20 | 21 | echo "[.] building sources ..."; 22 | npm run build-prod || end 1; 23 | 24 | echo "[.] creating archive ..."; 25 | zip -r "${TARGET}" "dist" || end 2; 26 | 27 | end 0; 28 | -------------------------------------------------------------------------------- /src/scripts/index.d.ts: -------------------------------------------------------------------------------- 1 | 2 | type BookStorageItem = { 3 | indexNo: string; 4 | barCode: string; 5 | location: string; 6 | rentable: boolean; 7 | status: string; 8 | }; 9 | type BookItem = { 10 | title: string; 11 | author: string; 12 | publisher: string; 13 | categories: string[]; 14 | isbn: string; 15 | version: string; 16 | brief: string; 17 | storages: BookStorageItem[]; 18 | }; 19 | 20 | interface PagedAPIResponse { 21 | content: T[]; 22 | totalPages: number; 23 | totalElements: number; 24 | size: number; 25 | last: boolean; 26 | first: boolean; 27 | number: number; 28 | }; 29 | 30 | type PagedAPIResponseAny = PagedAPIResponse; 31 | type PagedAPIResponseBook = PagedAPIResponse; 32 | 33 | type LastSearchBooksContext = { 34 | error: string | Error; 35 | query: string; 36 | page: number; 37 | response: PagedAPIResponseBook 38 | }; 39 | 40 | type BookResultItemComponentProps = { 41 | keyword: string; 42 | book: BookItem; 43 | } 44 | -------------------------------------------------------------------------------- /src/scripts/components/ErrorAlert.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { getString } from '../i18n/index'; 6 | 7 | /** @type {string|Error} */ 8 | const DEFAULT_ERROR = null; 9 | 10 | /** @type {(event: React.MouseEvent) => any} */ 11 | const DEFAULT_ON_RETRY = null; 12 | 13 | export function ErrorAlert({ 14 | title = '', 15 | error = DEFAULT_ERROR, 16 | onRetry = DEFAULT_ON_RETRY, 17 | dismissible = false 18 | }) { 19 | //@ts-ignore 20 | let msg = error.message || error; 21 | return
22 | {dismissible ? : null} 23 | {title} 24 |

{msg}

25 | {onRetry ? : null} 30 |
; 31 | } -------------------------------------------------------------------------------- /src/scripts/browser_storage/recent_search.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | const STORAGE_KEY = "opac-recent"; 5 | 6 | /** 7 | * 获得最近的搜索记录 8 | * @returns {string[]} 9 | */ 10 | export function getRecentSearch() { 11 | try { 12 | // 从 localStorage中读取 13 | let recent = JSON.parse( 14 | localStorage.getItem(STORAGE_KEY) || "[]"); 15 | // 检查是否是字符串数组 16 | if (Array.isArray(recent) && 17 | recent.filter(it => typeof it != 'string').length == 0) 18 | return recent; 19 | return []; 20 | } catch (ex) { 21 | return []; 22 | } 23 | } 24 | 25 | /** 26 | * 添加一条最近搜索记录 (包含去重操作) 27 | * @param {string} keyword 28 | */ 29 | export function addRecentSearch(keyword = '') { 30 | let recents = getRecentSearch(); 31 | let newRecents = [keyword]; 32 | for (let recent of recents) 33 | if (recent != keyword) // 去除重复 34 | newRecents.push(recent); 35 | // 只记录最近5条 36 | newRecents = newRecents.slice(0, 5); 37 | localStorage.setItem(STORAGE_KEY, 38 | JSON.stringify(newRecents)); 39 | return newRecents; 40 | } -------------------------------------------------------------------------------- /src/styles/index.scss: -------------------------------------------------------------------------------- 1 | // setup bootswatch and bootstrap 2 | @import "./theme_minty/_variables.scss"; 3 | @import "../../node_modules/bootstrap/scss/bootstrap.scss"; 4 | @import "./theme_minty/_bootswatch.scss"; 5 | 6 | // setup hover.css 7 | @import "../../node_modules/hover.css/scss/hover.scss"; 8 | 9 | // setup loader.css 10 | @import "./loader.css/_variables.scss"; 11 | @import "./loader.css/_mixins.scss"; 12 | @import "./loader.css/animations/pacman.scss"; // only pick up pac-man loader 13 | 14 | @import "./_home_search_container.scss"; 15 | @import "./_search_results_container.scss"; 16 | @import "./_book_item.scss"; 17 | 18 | .body-container { 19 | margin-top: 56px; 20 | } 21 | .loading-container{ 22 | .loading-center { 23 | width: 200px; 24 | max-width: 80vw; 25 | padding-left: 80px; // fixed pac-man loader location to center 26 | margin: 0 auto; 27 | } 28 | } 29 | .center-pagination-container { 30 | display: flex; 31 | justify-content: center; 32 | } 33 | .recent-search-container { 34 | .title{ font-size: 1.2em; } 35 | } 36 | 37 | .cursor-pointer { cursor: pointer; } -------------------------------------------------------------------------------- /src/scripts/components/PageFooter.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { getString } from '../i18n/index'; 6 | 7 | export function PageFooter(props) { 8 | return ; 24 | } 25 | 26 | function Link({ children, link}) { 27 | return {children}; 28 | } -------------------------------------------------------------------------------- /src/scripts/i18n/index.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import { STRINGS_EN_ZH_MAP } from "./strings"; 5 | import { updateUI } from "../components/components"; 6 | 7 | let currentLanguage = 1; // 默认简体中文 8 | 9 | /** @returns {string} */ 10 | export function getI18N() { 11 | return currentLanguage == 0 ? "English" : "简体中文"; 12 | } 13 | /** @param {"en"|"zh-CN"} language */ 14 | export function setI18N(language) { 15 | let newLanguage = 0; //en 16 | if (language == "zh-CN") 17 | newLanguage = 1; 18 | 19 | // 如果设置前后语言有变化, 则刷新页面 20 | if (newLanguage != currentLanguage) { 21 | currentLanguage = newLanguage; 22 | updateUI(); 23 | } 24 | } 25 | 26 | /** 27 | * @param {string} name 28 | * @param {any[]} [p] 29 | * @returns {string} 30 | */ 31 | export function getString(name, ...p) { 32 | if (!(name in STRINGS_EN_ZH_MAP)) { 33 | // 找不到字段的翻译 34 | console.error(`Could not found i18n string named ${name}`); 35 | return name; 36 | } 37 | // 默认是字符串 38 | let str = STRINGS_EN_ZH_MAP[name][currentLanguage]; 39 | // 也可以是字符串格式化函数 40 | if (typeof str == 'function') 41 | return str(...p); 42 | return str; 43 | } 44 | -------------------------------------------------------------------------------- /src/scripts/i18n/strings.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | 3 | // name: [english, chinese] 4 | /** @type {{[name: string]: (string|Function)[]}} */ 5 | export const STRINGS_EN_ZH_MAP = { 6 | title: ["A Brilliant OPAC ", "一个不错的图书检索系统"], 7 | searchPlaceHolder: ["Book title/Author/ISBN", "图书标题/作者/ISBN"], 8 | retry: ["Retry", "重试"], 9 | unknownError: ["Unknown Error", "未知错误"], 10 | networkError: ["Network Error", "网络错误"], 11 | indexNo: ["Index No.", "索书号"], 12 | barCode: ["Bar Code", "条码号"], 13 | location: ["Location", "位置"], 14 | status: ["Status", "状态"], 15 | recentSearch: ["Recent Search:", "近期搜索:"], 16 | iconFrom: ["Icons from ", "图标来自 "], 17 | fontFrom: ["Web fonts from ", "Web字体来自 "], 18 | themeFrom: ["Theme Based on ", "样式基于 "], 19 | and: [" and ", " 和 "], 20 | license: ["Code released under the ", "代码开源协议: "], 21 | 22 | matchedBooksReport: [ 23 | (c, p, pAll) => `Matched ${c} results in ${pAll} pages. Current page: ${p}.`, 24 | (c, p, pAll) => `匹配到 ${c} 个结果 共 ${pAll} 页. 目前在第 ${p} 页.` 25 | ], 26 | storageStatus: [ 27 | (all, has) => `Holding: ${all} / Rentable: ${has}`, 28 | (all, has) => `馆藏: ${all} 本 / 可借: ${has} 本` 29 | ] 30 | }; -------------------------------------------------------------------------------- /src/styles/_search_results_container.scss: -------------------------------------------------------------------------------- 1 | .search-results-top-container { 2 | $thisHeight: 96px; 3 | 4 | background: $gray-300; 5 | 6 | height: $thisHeight; 7 | display: flex; 8 | justify-content: center; 9 | align-items: center; 10 | 11 | #logoContainer { 12 | $logoHeight: 56px; 13 | padding-top: 6px; 14 | height: $logoHeight; 15 | 16 | img { height: $logoHeight;} 17 | 18 | @media (max-width: 575px) { 19 | $logoHeight: 36px; 20 | height: $logoHeight; 21 | 22 | img { height: $logoHeight;} 23 | } 24 | } 25 | 26 | #miniSearchBoxContainer { 27 | position: relative; 28 | width: 80%; 29 | max-width: 960px; 30 | @media (max-width: 991.99px) { width: 85%; } 31 | 32 | #miniSearchBox { 33 | font-size: 1.2em; 34 | padding-right: 64px; 35 | } 36 | #miniSearchBtn { 37 | position: absolute; 38 | right: .4em; 39 | top: 0; 40 | text-decoration: none; 41 | &:hover{text-decoration: none;} 42 | &:focus{text-decoration: none;} 43 | 44 | .iconfont { 45 | font-size: 1.2em; 46 | } 47 | } 48 | } 49 | } 50 | 51 | .search-results-container { 52 | background: $gray-200; 53 | 54 | min-height: 100vh; 55 | } -------------------------------------------------------------------------------- /src/scripts/components/BodyHome.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { getString, getI18N, setI18N } from '../i18n/index'; 6 | import { searchBooks } from '../api/api_search_books'; 7 | import { RecentSearch } from './RecentSearch'; 8 | 9 | function onSearch() { 10 | let keyword = String($('#searchBox').val()).trim(); 11 | if (!keyword) 12 | return; 13 | 14 | searchBooks(keyword, 1); 15 | } 16 | 17 | export function BodyHome(props) { 18 | return
19 |
20 | 21 |
22 |
{event.preventDefault();onSearch();}}> 23 | 28 | 31 |
32 | 33 |
; 34 | } -------------------------------------------------------------------------------- /src/scripts/api/setup.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | const MOCK = 'mock'; 5 | let API = MOCK; 6 | export function getAPIName() { return API } 7 | export function isMock() { return API == MOCK; } 8 | 9 | function parseAPIFromHref() { 10 | let hashIndex = location.href.indexOf('#'); 11 | let href = hashIndex >= 0 ? location.href.slice(0, hashIndex) : location.href; 12 | let match = href.match(/[&\?]api=(.+?)(?:&|$)/); 13 | return match ? decodeURIComponent(match[1]) : null; 14 | } 15 | function normalizeAPI(uri = '') { 16 | // relative path 17 | if (uri.startsWith('/')) 18 | return uri.replace(/\/$/, ''); 19 | 20 | const matcher = /^https?:\/\// 21 | if (!uri.match(matcher)) { 22 | let match = location.href.match(matcher) || ['http://']; 23 | uri = `${match[0]}${uri}`; 24 | } 25 | return uri.replace(/\/$/, ''); 26 | } 27 | 28 | export function setup(defaultAPI = MOCK) { 29 | // 从 URL 中解析 API源(API服务器) 30 | API = parseAPIFromHref(); 31 | if (!API) { 32 | // 如果没有通过 URL 设置特定的API源, 则选用默认的API源 33 | // 在开发模式下: 默认的源是 模拟数据. 34 | API = (process.env.NODE_ENV == "development") ? MOCK : defaultAPI; 35 | } 36 | if (API != MOCK) 37 | API = normalizeAPI(API); 38 | console.log("API:", API || "current server"); 39 | } 40 | -------------------------------------------------------------------------------- /COPY_ASSET_FILES.sh: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env bash 2 | 3 | TARGET="dist/assets"; 4 | 5 | SOURCE="${BASH_SOURCE[0]}"; 6 | while [ -h "$SOURCE" ]; do # resolve $SOURCE until the file is no longer a symlink 7 | DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"; 8 | SOURCE="$(readlink "$SOURCE")"; 9 | [[ $SOURCE != /* ]] && SOURCE="$DIR/$SOURCE"; # if $SOURCE was a relative symlink, we need to resolve it relative to the path where the symlink file was located 10 | done 11 | DIR="$( cd -P "$( dirname "$SOURCE" )" && pwd )"; 12 | cd "$DIR"; 13 | 14 | function end() { 15 | [[ $1 == "0" ]] && echo "[+] exit: 0" || echo "[-] exit $1"; 16 | exit $1; } 17 | 18 | 19 | echo "[.] creating target folder ..."; 20 | [[ -z "$TARGET" ]] && end 1; # avoding empty path 21 | if [[ -d "$TARGET" ]]; then rm -rf "$TARGET" || end 1; fi 22 | mkdir -p "$TARGET" || end 1; 23 | 24 | echo "[.] generating javascript ..."; 25 | JS="$TARGET/vendor.min.js"; 26 | echo "" > "$JS" || end 2; 27 | cat ./node_modules/jquery/dist/jquery.slim.min.js >> "$JS" || end 2; 28 | echo "" >> "$JS" || end 2; # empty line 29 | cat ./node_modules/popper.js/dist/umd/popper.min.js >> "$JS" || end 2; 30 | echo "" >> "$JS" || end 2; # empty line 31 | cat ./node_modules/bootstrap/dist/js/bootstrap.min.js >> "$JS" || end 2; 32 | 33 | end 0; -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # ignore target archive zip file 2 | /*.zip 3 | 4 | # ignore ssh-mount 5 | ssh-mount 6 | ssh-mount.sh 7 | 8 | # ignore old files 9 | *.old 10 | 11 | # Logs 12 | logs 13 | *.log 14 | npm-debug.log* 15 | yarn-debug.log* 16 | yarn-error.log* 17 | 18 | # Runtime data 19 | pids 20 | *.pid 21 | *.seed 22 | *.pid.lock 23 | 24 | # Directory for instrumented libs generated by jscoverage/JSCover 25 | lib-cov 26 | 27 | # Coverage directory used by tools like istanbul 28 | coverage 29 | 30 | # nyc test coverage 31 | .nyc_output 32 | 33 | # Grunt intermediate storage (http://gruntjs.com/creating-plugins#storing-task-files) 34 | .grunt 35 | 36 | # Bower dependency directory (https://bower.io/) 37 | bower_components 38 | 39 | # node-waf configuration 40 | .lock-wscript 41 | 42 | # Compiled binary addons (http://nodejs.org/api/addons.html) 43 | build/Release 44 | 45 | # Dependency directories 46 | node_modules/ 47 | jspm_packages/ 48 | 49 | # Typescript v1 declaration files 50 | typings/ 51 | 52 | # Optional npm cache directory 53 | .npm 54 | 55 | # Optional eslint cache 56 | .eslintcache 57 | 58 | # Optional REPL history 59 | .node_repl_history 60 | 61 | # Output of 'npm pack' 62 | *.tgz 63 | 64 | # Yarn Integrity file 65 | .yarn-integrity 66 | 67 | # dotenv environment variables file 68 | .env 69 | 70 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Library System Frontend (Curriculum Design) 2 | 3 | An OPAC (library query system) for curriculum design. 4 | 一个为了交作业而制作的图书查询系统. 5 | 6 | ## Screenshots 7 | 8 | ![](screenshots/1.png) 9 | ![](screenshots/2.png) 10 | 11 | ## Development 12 | 13 | ### Overview 14 | 15 | Relative knowledge: 16 | 相关知识: 17 | 18 | - HTML/Javascript/CSS 19 | - Sass 20 | - **Bootstrap/JQuery** 21 | - **React** 22 | 23 | ### Some Commands 24 | 25 | ``` bash 26 | # Firstly, ensure you installed Node.js development environment. 27 | # 首先, 确认你已经安装Node.js开发环境 28 | node --version; 29 | # Secondly, install dependencies. 然后安装相关依赖包 30 | npm install; 31 | 32 | # How to build front-end codes. 如何构建前端页面的代码呢? 33 | npm run build-dev-live; 34 | # OR: npm run build-dev 35 | # OR: npm run build-prod-live 36 | # OR: npm run build-prod 37 | ``` 38 | 39 | ### Implement Search API 40 | 41 | 实现图书查询的API 42 | 43 | Default API is from mock data (`./dist/mock/**.json`) for development mode, 44 | and `/api/search?query=&page=` under same domain for production mode. 45 | 46 | 开发模式的默认的API是来自模拟数据文件 (`./dist/mock/**.json`). 47 | 产品模式下的默认API是同一个域下的 `/api/search?query=&page=`. 48 | 49 | - Request: `GET /api/search?query={QUERY_KEYWORD}&page={PAGE_NO}` 50 | - `{PAGE_NO}` is a number from 1 51 | - Response: refer files `./dist/mock/**.json` 52 | 53 | ## License 54 | 55 | [GPLv3](LICENSE) 56 | 57 | ## Author 58 | 59 | [LiuYue @hanxingliu](https://github.com/hangxingliu) 60 | -------------------------------------------------------------------------------- /src/scripts/components/Navbar.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { getString, getI18N, setI18N } from '../i18n/index'; 6 | 7 | export function Navbar(props) { 8 | return
9 |
10 | {getString("title")} 11 | 14 | 33 |
34 |
; 35 | } -------------------------------------------------------------------------------- /src/scripts/api/_response.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | /** @returns {BookItem} */ 5 | export function createBookItemFromResponseItem(item) { 6 | if (!item) 7 | return null; 8 | 9 | let title_author = (item['题名/责任者'] || []) 10 | .join('') 11 | .split(/\s*\/\s*/) 12 | .map(v => v.trim()); 13 | let author2 = (item['个人责任者'] || []).join(''); 14 | let isbn_price = (item['ISBN及定价'] || []) 15 | .join('') 16 | .split(/[\s\/]+/) 17 | .map(v => v.trim()) 18 | .filter(v => v); 19 | 20 | return { 21 | title: title_author[0] || "", 22 | author: title_author[1] || author2, 23 | publisher: (item['出版发行项'] || []).join(''), 24 | categories: (item['学科主题'] || []), 25 | isbn: isbn_price[0] || "", 26 | version: (item['版本说明'] || []).join(''), 27 | brief: ([item['提要文摘附注'], item['一般附注']] 28 | .filter(a => Array.isArray(a) && a.length > 0)[0] || []) 29 | .join(''), 30 | storages: (item['storages'] || []).map(storage => { 31 | let status = (storage['书刊状态'] || "").trim(); 32 | let location = storage['校区-馆藏地']; 33 | if (!location && storage['密集架号']) 34 | location = `密集书库: ${storage['密集架号']}`; 35 | return { 36 | indexNo: storage['索书号'] || "", 37 | barCode: storage['条码号'] || "", 38 | location: location || "", 39 | rentable: status == "可借", 40 | status 41 | }; 42 | }) 43 | }; 44 | } 45 | 46 | /** 47 | * @param {PagedAPIResponseAny} response 48 | * @returns {PagedAPIResponseBook} 49 | */ 50 | export function createBooksAPIResponse(response) { 51 | response.content = response.content.map(item => 52 | createBookItemFromResponseItem(item)); 53 | return response; 54 | } -------------------------------------------------------------------------------- /src/scripts/components/RootComponent.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { Navbar } from './Navbar'; 6 | import { BodyHome } from './BodyHome'; 7 | import { BodySearchResults } from './BodySearchResults'; 8 | import { getLastSearchBooks, searchBooks } from '../api/api_search_books'; 9 | import { PageFooter } from './PageFooter'; 10 | 11 | let isFirstRender = true; 12 | const DEFAULT_ROUTER_NAME = 'index'; 13 | function getRouter() { 14 | let match = location.hash.replace(/^#/, '').match(/^([\w\-]+)(?:\/(.+))?$/); 15 | if (!match) return { name: DEFAULT_ROUTER_NAME }; 16 | return { name: match[1], param: decodeURIComponent(match[2]) }; 17 | } 18 | 19 | function getBodyComponent() { 20 | let { name, param } = getRouter(); 21 | if (name == 'book') { 22 | return 23 | } else if (name == 'search') { 24 | let match = param.match(/(\d+)\/(.+)/); 25 | if (match) { 26 | let page = parseInt(match[1]), 27 | keyword = match[2]; 28 | 29 | if (isFirstRender) 30 | process.nextTick(() => searchBooks(keyword, page)); 31 | 32 | let lastSearch = getLastSearchBooks(); 33 | console.log(lastSearch) 34 | return 37 | } 38 | } 39 | // index 40 | return 41 | } 42 | 43 | export function RootComponent(props) { 44 | let body = getBodyComponent(); 45 | // 是否是第一次渲染 46 | isFirstRender = false; 47 | 48 | return [ 49 | // 标题栏 50 | , 51 | // 主内容 52 |
{body}
, 53 | // 页尾信息 54 | 55 | ]; 56 | } -------------------------------------------------------------------------------- /src/scripts/components/Pagination.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { updateUI } from './components'; 6 | import { searchBooks } from '../api/api_search_books'; 7 | 8 | const PAGINATION_DELTA = 3; 9 | 10 | export function Pagination({ 11 | keyword, page, totalPages, first, last 12 | }) { 13 | return
    14 |
  • 15 | « 16 |
  • 17 | {generateButtons(keyword, page, totalPages)} 18 |
  • 19 | » 20 |
  • 21 |
; 22 | } 23 | 24 | function generateOnClick(keyword, gotoPage) { 25 | return event => { 26 | event.preventDefault(); 27 | searchBooks(keyword, gotoPage); 28 | }; 29 | } 30 | 31 | function generateButtons(keyword, page, totalPages) { 32 | let left = page - PAGINATION_DELTA, 33 | right = page + PAGINATION_DELTA + 1, 34 | range = []; 35 | 36 | if (left > 1) range.push(generateDots(1)); 37 | for (let i = 1; i <= totalPages; i++) { 38 | if (i >= left && i < right) { 39 | range.push(generateButton(i)); 40 | } 41 | } 42 | if (right < totalPages) range.push(generateDots(totalPages)); 43 | return range; 44 | 45 | function generateDots(key) { 46 | return
  • 47 | ... 48 |
  • ; 49 | } 50 | function generateButton(nowPage) { 51 | return
  • 53 | {nowPage} 55 |
  • ; 56 | } 57 | } -------------------------------------------------------------------------------- /src/scripts/api/api_search_books.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | const API_SEARCH_BOOKS = 'api/search'; 5 | 6 | import { isMock, getAPIName } from "./setup"; 7 | import { ajaxGetJSON, ajaxMockDelay, ajaxMockFailed } from "./_ajax"; 8 | import { createBooksAPIResponse } from "./_response"; 9 | import { updateUI } from "../components/components"; 10 | import { addRecentSearch } from "../browser_storage/recent_search"; 11 | 12 | let lastSearchQuery = '', lastSearchPage = 1; 13 | let lastSearchError = null; 14 | /** @type {PagedAPIResponseBook} */ 15 | let lastSearchResponse = null; 16 | 17 | /** @returns {Promise} */ 18 | function _searchBooks(query = '', page = 1) { 19 | lastSearchQuery = query; 20 | lastSearchPage = page; 21 | lastSearchResponse = null; 22 | return (isMock() 23 | ? ajaxMockDelay(100, 500) 24 | .then(() => ajaxMockFailed(0.1)) 25 | .then(() => ajaxGetJSON(`mock/search-${page == 1 ? 1 : 2}.json`)) 26 | : ajaxGetJSON(`${getAPIName()}/${API_SEARCH_BOOKS}?` + 27 | `query=${encodeURIComponent(query)}&page=${page}`)) 28 | .then(({ result }) => { 29 | return Promise.resolve(lastSearchResponse = createBooksAPIResponse(result)) 30 | }); 31 | } 32 | 33 | export function searchBooks(query = '', page = 1) { 34 | addRecentSearch(query); 35 | 36 | location.hash = `#search/${page}/${encodeURIComponent(query)}`; 37 | lastSearchError = null; 38 | 39 | updateUI().then(() => _searchBooks(query, page)) 40 | .then(() => process.nextTick(updateUI)) 41 | .catch(error => { 42 | console.error(`search book throw:`, error); 43 | lastSearchError = error; 44 | updateUI(); 45 | }); 46 | } 47 | export function searchBooksRetry() { 48 | console.log(getLastSearchBooks()); 49 | if (lastSearchQuery && lastSearchPage) 50 | searchBooks(lastSearchQuery, lastSearchPage); 51 | } 52 | 53 | /** @returns {LastSearchBooksContext} */ 54 | export function getLastSearchBooks() { 55 | return { 56 | query: lastSearchQuery, 57 | page: lastSearchPage, 58 | response: lastSearchResponse, 59 | error: lastSearchError 60 | }; 61 | } 62 | 63 | -------------------------------------------------------------------------------- /src/styles/loader.css/animations/pacman.scss: -------------------------------------------------------------------------------- 1 | @import '../variables'; 2 | @import '../mixins'; 3 | @import '../functions'; 4 | 5 | $size: 50px; 6 | $dotSize: $size * 0.4; 7 | 8 | @keyframes rotate_pacman_half_up { 9 | 0% { 10 | transform:rotate(270deg); 11 | } 12 | 50% { 13 | transform:rotate(360deg); 14 | } 15 | 100% { 16 | transform:rotate(270deg); 17 | } 18 | } 19 | 20 | @keyframes rotate_pacman_half_down { 21 | 0% { 22 | transform:rotate(90deg); 23 | } 24 | 50% { 25 | transform:rotate(0deg); 26 | } 27 | 100% { 28 | transform:rotate(90deg); 29 | } 30 | } 31 | 32 | @mixin pacman_design(){ 33 | width: 0px; 34 | height: 0px; 35 | border-right: $size solid transparent; 36 | border-top: $size solid $primary-color; 37 | border-left: $size solid $primary-color; 38 | border-bottom: $size solid $primary-color; 39 | border-radius: $size; 40 | } 41 | 42 | @keyframes pacman-balls { 43 | 75% { 44 | opacity: 0.7; 45 | } 46 | 100% { 47 | transform: translate(-4 * $size, -$size / 4); 48 | } 49 | } 50 | 51 | @mixin ball-placement($n:3, $start:0) { 52 | @for $i from $start through $n { 53 | > div:nth-child(#{$i + 2}) { 54 | animation: pacman-balls 1s delay(.33s, $n, $i) infinite linear; 55 | } 56 | } 57 | } 58 | 59 | .pacman { 60 | @include ball-placement(); 61 | 62 | position: relative; 63 | 64 | > div:first-of-type { 65 | @include pacman_design(); 66 | animation: rotate_pacman_half_up 0.5s 0s infinite; 67 | position: relative; 68 | left: -($size * 1.2); 69 | } 70 | 71 | > div:nth-child(2) { 72 | @include pacman_design(); 73 | animation: rotate_pacman_half_down 0.5s 0s infinite; 74 | margin-top: -2 * $size; 75 | position: relative; 76 | left: -($size * 1.2); 77 | } 78 | 79 | > div:nth-child(3), 80 | > div:nth-child(4), 81 | > div:nth-child(5), 82 | > div:nth-child(6) { 83 | @include balls(); 84 | 85 | width: $dotSize; 86 | height: $dotSize; 87 | 88 | position: absolute; 89 | transform: translate(0, -$size / 4); 90 | top: $size; 91 | left: $size * 2.8; 92 | } 93 | } -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "assignment-library-system", 3 | "version": "1.0.0", 4 | "description": "An library system for assignment", 5 | "main": "index.js", 6 | "scripts": { 7 | "start": "node ./build/build.js dev -w", 8 | "build-dev": "node ./build/build.js dev", 9 | "build-dev-live": "node ./build/build.js dev -w", 10 | "build-prod": "node ./build/build.js prod", 11 | "build-prod-live": "node ./build/build.js prod -w", 12 | "git-archive": "git archive --output=\"git-HEAD-$(date '+%y%m%d-%H%M%S').zip\" HEAD" 13 | }, 14 | "author": "LiuYue", 15 | "license": "GPL-3.0", 16 | "devDependencies": { 17 | "@types/jquery": "^3.2.17", 18 | "@types/node": "^8.5.8", 19 | "async": "^2.5.0", 20 | "babel-core": "^6.25.0", 21 | "babel-plugin-minify-dead-code-elimination": "^0.2.0", 22 | "babel-plugin-minify-mangle-names": "^0.2.0", 23 | "babel-plugin-transform-es2015-modules-commonjs": "^6.26.0", 24 | "babel-plugin-transform-merge-sibling-variables": "^6.8.6", 25 | "babel-plugin-transform-object-rest-spread": "^6.26.0", 26 | "babel-preset-es2015": "^6.24.1", 27 | "babel-preset-react": "^6.24.1", 28 | "babelify": "^7.3.0", 29 | "browserify": "^14.4.0", 30 | "colors": "^1.1.2", 31 | "commander": "^2.11.0", 32 | "convert-source-map": "^1.5.0", 33 | "envify": "^4.1.0", 34 | "eslint": "^4.4.1", 35 | "eslint-plugin-react": "^7.2.0", 36 | "fs-extra": "^4.0.1", 37 | "glob": "^7.1.2", 38 | "js-yaml": "^3.9.1", 39 | "node-sass": "^4.7.2", 40 | "postcss": "^6.0.9", 41 | "watch": "^1.0.2", 42 | "watchify": "^3.9.0" 43 | }, 44 | "dependencies": { 45 | "bootstrap": "^4.0.0-beta.3", 46 | "core-js": "^2.5.3", 47 | "hover.css": "^2.2.1", 48 | "jquery": "^3.2.1", 49 | "loaders.css": "^0.1.2", 50 | "popper.js": "^1.12.9", 51 | "raf": "^3.4.0", 52 | "react": "^16.2.0", 53 | "react-dom": "^16.2.0" 54 | }, 55 | "repository": { 56 | "type": "git", 57 | "url": "git+https://github.com/hangxingliu/assignment-library-system.git" 58 | }, 59 | "keywords": [ 60 | "library", 61 | "manager" 62 | ], 63 | "bugs": { 64 | "url": "https://github.com/hangxingliu/assignment-library-system/issues" 65 | }, 66 | "homepage": "https://github.com/hangxingliu/assignment-library-system#readme" 67 | } 68 | -------------------------------------------------------------------------------- /src/scripts/api/_ajax.js: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | export const x_www_form_urlencoded = 'application/x-www-form-urlencoded; charset=UTF-8'; 5 | 6 | /** 7 | * @param {string} method 8 | * @param {string} url 9 | * @param {any} data 10 | * @param {string} [sendDataType] Request Body Content-type 11 | * @returns {Promise<{status: number; result: string}>} 12 | */ 13 | export function ajax(method, url, data = null, 14 | sendDataType = '', allowedStatusCode = [200] ) { 15 | 16 | return new Promise((resolve, reject) => { 17 | // 是否使用了 XDomainRequest 而不是 XMLHttpRequest 18 | let isXDomainRequest = false; 19 | let xhr = new XMLHttpRequest(); 20 | 21 | // For IE8/IE9 Cross domain request: 22 | // 为了兼容IE8/IE9 的跨域问题: 23 | //@ts-ignore 24 | if (typeof XDomainRequest != 'undefined') { 25 | //@ts-ignore 26 | xhr = new XDomainRequest(); 27 | isXDomainRequest = true; 28 | } 29 | 30 | xhr.open(method, url); 31 | if (sendDataType) 32 | xhr.setRequestHeader("Content-type", sendDataType); 33 | xhr.onload = () => { 34 | // fake status 200 for XDomainRequest(without status field) 35 | if (isXDomainRequest) 36 | return resolve({ status: 200, result: xhr.responseText }); 37 | 38 | if (xhr.readyState != 4 || allowedStatusCode.indexOf(xhr.status) < 0 ) 39 | return onError(); 40 | resolve({ status: xhr.status, result: xhr.responseText }); 41 | } 42 | xhr.onerror = onError; 43 | xhr.send(data); 44 | 45 | function onError() { 46 | reject(`XMLHttpRequest failed! readyState: ${xhr.readyState}; ` + 47 | `xhr.status: ${xhr.status || ""} ${xhr.statusText || ""}`);} 48 | }); 49 | } 50 | 51 | /** 52 | * @param {string} method 53 | * @param {string} url 54 | * @param {any} data 55 | * @param {string} [sendDataType] Request Body Content-type 56 | * @returns {Promise<{status: number; result: any}>} 57 | */ 58 | export function ajaxJSON(method, url, data = null, 59 | sendDataType = '', allowedStatusCode = [200]) { 60 | return ajax(method, url, data, sendDataType, allowedStatusCode).then(body => { 61 | try { 62 | return Promise.resolve({ status: body.status, result: JSON.parse(body.result) }); 63 | } catch (ex) { 64 | return Promise.reject(`Invalid JSON object: ${url}`); 65 | } 66 | }); 67 | } 68 | 69 | /** 70 | * @param {string} url 71 | * @returns {Promise<{status: number; result: any}>} 72 | */ 73 | export function ajaxGetJSON(url, allowedStatusCode = [200]) { 74 | return ajaxJSON("GET", url, null, null, allowedStatusCode); 75 | } 76 | 77 | export function ajaxMockDelay(min, max) { 78 | return new Promise((resolve) => { 79 | let delay = min + (Math.random() * Math.abs(max - min)); 80 | if (delay < 15) delay = 15; 81 | setTimeout(resolve, delay); 82 | }); 83 | } 84 | 85 | export function ajaxMockFailed(percent) { 86 | return new Promise((resolve, reject) => 87 | Math.random() > percent ? resolve(true) : reject(`Network broken! (mock)`)); 88 | } -------------------------------------------------------------------------------- /src/scripts/components/BodySearchResults.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { getString, getI18N, setI18N } from '../i18n/index'; 6 | import { Loading } from './Loading'; 7 | import { ErrorAlert } from './ErrorAlert'; 8 | import { searchBooksRetry, getLastSearchBooks, searchBooks } from '../api/api_search_books'; 9 | import { Pagination } from './Pagination'; 10 | import { BookResultItem } from './BookResultItem'; 11 | 12 | /** @type {PagedAPIResponseBook} */ 13 | const DEFAULT_BOOKS_RESPONSE = null; 14 | /** @type {string|Error} */ 15 | const DEFAULT_SEARCH_ERROR = null; 16 | 17 | function onSearch() { 18 | let keyword = String($('#miniSearchBox').val()).trim(); 19 | if (!keyword) 20 | return; 21 | 22 | searchBooks(keyword, 1); 23 | } 24 | 25 | export function BodySearchResults({ 26 | page = 1, 27 | keyword = "", 28 | booksResponse = DEFAULT_BOOKS_RESPONSE, 29 | searchError = DEFAULT_SEARCH_ERROR, 30 | }) { 31 | return
    32 |
    33 |
    34 | 35 |
    36 |
    { event.preventDefault(); onSearch(); }}> 38 | 43 | 46 |
    47 |
    48 |
    49 |
    50 | {booksResponse 51 | ?
    52 |
    53 |
    54 | {getString('matchedBooksReport', 55 | booksResponse.totalElements, 56 | page, 57 | booksResponse.totalPages)} 58 |
    59 |
    60 | {booksResponse.content.map((book, i) => 61 | )} 62 |
    63 |
    64 | 67 |
    68 |
    69 |
    70 | :
    71 | {searchError 72 | ?
    73 | { event.preventDefault(); searchBooksRetry(); }} /> 76 |
    77 | :
    78 | 79 |
    } 80 |
    } 81 |
    82 |
    83 |
    ; 84 | } -------------------------------------------------------------------------------- /src/styles/theme_minty/_variables.scss: -------------------------------------------------------------------------------- 1 | // Minty 4.0.0 2 | // Bootswatch 3 | 4 | // 5 | // Color system 6 | // 7 | 8 | $white: #fff !default; 9 | $gray-100: #f8f9fa !default; 10 | $gray-200: #f7f7f9 !default; 11 | $gray-300: #eceeef !default; 12 | $gray-400: #ced4da !default; 13 | $gray-500: #aaa !default; 14 | $gray-600: #888 !default; 15 | $gray-700: #5a5a5a !default; 16 | $gray-800: #343a40 !default; 17 | $gray-900: #212529 !default; 18 | $black: #000 !default; 19 | 20 | $blue: #007bff !default; 21 | $indigo: #6610f2 !default; 22 | $purple: #6f42c1 !default; 23 | $pink: #e83e8c !default; 24 | $red: #FF7851 !default; 25 | $orange: #fd7e14 !default; 26 | $yellow: #FFCE67 !default; 27 | $green: #56CC9D !default; 28 | $teal: #20c997 !default; 29 | $cyan: #6CC3D5 !default; 30 | 31 | $primary: #78C2AD !default; 32 | $secondary: #F3969A !default; 33 | $success: $green !default; 34 | $info: $cyan !default; 35 | $warning: $yellow !default; 36 | $danger: $red !default; 37 | $light: $gray-100 !default; 38 | $dark: $gray-800 !default; 39 | 40 | // Body 41 | 42 | $body-color: $gray-600 !default; 43 | 44 | // Components 45 | 46 | $border-radius: .4rem !default; 47 | $border-radius-lg: .6rem !default; 48 | $border-radius-sm: .3rem !default; 49 | 50 | // Fonts 51 | 52 | $headings-font-family: "Montserrat", -apple-system, system-ui, BlinkMacSystemFont, "Segoe UI", Roboto, "Helvetica Neue", Arial, sans-serif !default; 53 | $headings-color: $gray-700 !default; 54 | 55 | // Tables 56 | 57 | $table-border-color: rgba(0,0,0,0.05) !default; 58 | 59 | // Dropdowns 60 | 61 | $dropdown-link-hover-color: $white !default; 62 | $dropdown-link-hover-bg: $secondary !default; 63 | 64 | // Navbar 65 | 66 | $navbar-dark-color: rgba($white,.6) !default; 67 | $navbar-dark-hover-color: $white !default; 68 | 69 | $navbar-light-color: rgba($black,.3) !default; 70 | $navbar-light-hover-color: $gray-700 !default; 71 | $navbar-light-active-color: $gray-700 !default; 72 | $navbar-light-disabled-color: rgba($black,.1) !default; 73 | 74 | // Pagination 75 | 76 | $pagination-color: $white !default; 77 | $pagination-bg: $primary !default; 78 | $pagination-border-color: $primary !default; 79 | 80 | $pagination-hover-color: $white !default; 81 | $pagination-hover-bg: $secondary !default; 82 | $pagination-hover-border-color: $pagination-hover-bg !default; 83 | 84 | $pagination-active-bg: $secondary !default; 85 | $pagination-active-border-color: $pagination-active-bg !default; 86 | 87 | $pagination-disabled-color: $white !default; 88 | $pagination-disabled-bg: #CCE8E0 !default; 89 | $pagination-disabled-border-color: $pagination-disabled-bg !default; 90 | 91 | // Breadcrumbs 92 | 93 | $breadcrumb-bg: $primary !default; 94 | $breadcrumb-divider-color: $white !default; 95 | $breadcrumb-active-color: $breadcrumb-divider-color !default; 96 | -------------------------------------------------------------------------------- /dist/assets/iconfont/iconfont.css: -------------------------------------------------------------------------------- 1 | 2 | @font-face {font-family: "iconfont"; 3 | src: url('iconfont.eot?t=1515660243543'); /* IE9*/ 4 | src: url('iconfont.eot?t=1515660243543#iefix') format('embedded-opentype'), /* IE6-IE8 */ 5 | url('data:application/x-font-woff;charset=utf-8;base64,d09GRgABAAAAAAhwAAsAAAAADCwAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAABHU1VCAAABCAAAADMAAABCsP6z7U9TLzIAAAE8AAAARAAAAFZXQ0lRY21hcAAAAYAAAAB5AAAByJ1h1bpnbHlmAAAB/AAABGAAAAWoTD/pQGhlYWQAAAZcAAAALwAAADYQGc0+aGhlYQAABowAAAAcAAAAJAfeA4dobXR4AAAGqAAAABMAAAAYF+kAAGxvY2EAAAa8AAAADgAAAA4E8gLYbWF4cAAABswAAAAeAAAAIAEWAKJuYW1lAAAG7AAAAUUAAAJtPlT+fXBvc3QAAAg0AAAAPAAAAE+Uo3kTeJxjYGRgYOBikGPQYWB0cfMJYeBgYGGAAJAMY05meiJQDMoDyrGAaQ4gZoOIAgCKIwNPAHicY2Bk/sM4gYGVgYOpk+kMAwNDP4RmfM1gxMjBwMDEwMrMgBUEpLmmMDgwVDxPZm7438AQw9zAcBUozAiSAwAvEg0peJzFkcENwyAQBOeCiaLYfzeRSix3QQ8Rj9QLZTh7gB+uwIsGsatDhzggAkF8xAT2w3B9lVrLA++WT2zyCy8eOucSy1zXmo5D6dWdMlWfy11oN9XRntwmu6/1VUvb9+F8DnmgJ5bY8dmUuaPfo64dn1VNHeIfMJEZewAAAHicbVTNixxVEH/1evr1zOuZ19s9/bXz3T273Ts7k9n56Jlx1exAPjabZIXEBOPqIskSoh4SBMEIK7guBASFiOAlHoIm4CHgwVXIIZB/wIiH/AOiePDiWWE61vQkgmBTr9571fXxq+qqJjIhT36RHkguyZMl0iXHyBlCgDXBF7QMXhi1aRMsT7YcU0hhPfSUut+WDoPjM9PuDaPAYQrTQEAF+l5vGLZpCINojb4APbsMMF8snDMWS4b0GXA3rNyIT9GvwarWS9raofhka2z2avn09axhzBvGp2kmy2lKU5qAq46dkTOcxXdlrWA9qDZoFbLzYWFzK1crGpc+jq6VF50MwN4e5Is18c1YL+hIHxTsvDGvzOXSbiFXXzDh+m+qm8+Wg18JPhLm2pTepH8RlXTImBDZa0M0HHkVMFneZ5ZusvpT0RqM9DaEngBFr4CD94EeBYuoOtNiih4N6e8x4ZrGKVE1bRsXn/xYa7Vq8MhrAjS9mNRaQDeGNKq1xOT1RE2N+62auAbCFjBl9IlQJ/gCmkcSG3plZjshw5PTXSKqiAB1bqHOPL2liiSPY9KfUkAWyEXyOSF5AWEbBmswhu6UDUfDCjAFsSN1Z8sCxzYV5q9AIq77QbgKmGF3tjBnTBkJk13Fj+l0Z8tM3EhtNHjq0LSTd8+U0GQ4WoXEOArCbjDz+DezZM6ZJgfcEo4QXOfpjGZluC4jsRztHwihLqgH7qofXOi0XguXN7xypAnDEPlOefzVRRQ1T3jlTl7TdU14ziNvPXhpv1tqiGnJRei6Y98/vrnuHe3ML3ORzYpyB53BQ66kwOLCFQHPZ3Jp7ClTl1PZDIJBAc/zeO9Aq6lCfO964mm88ulm65ULScTxCQBdmJ1SZSMMz6OsddSl72rqcwP07q1vHve9F0tJRNA4hvwXRXlJEELx2+xJB9I7OE0RdhiWpB8GdQG2M2ujaY2xQFhKLKTtJCXFQYNZ6fHaBum7M6fASHOhS/zEJkyM1OPbu3cl6e4uctdZGh9+e6l5SLo8eYvu7+zs04Sf3rk3zilguenhl1u3H6em2ndSqTu7y2fqhxeszWj1xsaA/nRpX5L2L+1MOWHJUPxA/yCr5Di5Tj4in5AvcPoRMyIc4Ia4FWvKphkgUOz9aR59BNuzHaT+DHa/N22fATZe33b0MPA1gDr2DBo92/xgpM+arGdXkyroo2GvCjhd/elQ+QxbzDJt/HFEyv+cpG+NOa06t1i9WVwCRS2o29tvvKdo2aymluak908vHakwLpvy5fby2WKDG0zLx/dp9maWdsy62QHeKJxf6V1Nifr6obMfpnKyBAzYlXONVxtCyEVtl2uZXdXkMpXT8cpDU7CHlvWfjTZVDJGTh0UfwC+uYLiG1Euzwlw81GzOU2BQlTOgLgXBqMzLGn05S2k2vmdxXoonTIBLOQcD0gx+llOyElDTYgxP8f2RLI/geTkNaTkeUdhDk8aWqU4ZVxv/AAVF2xJ4nGNgZGBgAOKMnZ/L4/ltvjJwszCAwLVal8sI+r82CwNzAZDLwcAEEgUAQucKuwB4nGNgZGBgbvjfwBDDwgACQJKRARWwAQBHDAJveJxjYWBgYH7JwMDCgIoBEp8BAQAAAAAAAHYA2gGoAf4C1AAAeJxjYGRgYGBjmAbEIMAExFxAyMDwH8xnAAAYHAG5AAB4nGWPTU7DMBCFX/oHpBKqqGCH5AViASj9EatuWFRq911036ZOmyqJI8et1ANwHo7ACTgC3IA78EgnmzaWx9+8eWNPANzgBx6O3y33kT1cMjtyDRe4F65TfxBukF+Em2jjVbhF/U3YxzOmwm10YXmD17hi9oR3YQ8dfAjXcI1P4Tr1L+EG+Vu4iTv8CrfQ8erCPuZeV7iNRy/2x1YvnF6p5UHFockikzm/gple75KFrdLqnGtbxCZTg6BfSVOdaVvdU+zXQ+ciFVmTqgmrOkmMyq3Z6tAFG+fyUa8XiR6EJuVYY/62xgKOcQWFJQ6MMUIYZIjK6Og7VWb0r7FDwl57Vj3N53RbFNT/c4UBAvTPXFO6stJ5Ok+BPV8bUnV0K27LnpQ0kV7NSRKyQl7WtlRC6gE2ZVeOEXpc0Yk/KGdI/wAJWm7IAAAAeJxjYGKAAC4G7ICNkYmRmZGFkZWRjZGdgbGCJSk/P5szNzE9LzMtM7WIuSg1jwMklJtYlM3AAAC36Qq9') format('woff'), 6 | url('iconfont.ttf?t=1515660243543') format('truetype'), /* chrome, firefox, opera, Safari, Android, iOS 4.2+*/ 7 | url('iconfont.svg?t=1515660243543#iconfont') format('svg'); /* iOS 4.1- */ 8 | } 9 | 10 | .iconfont { 11 | font-family:"iconfont" !important; 12 | font-size:16px; 13 | font-style:normal; 14 | -webkit-font-smoothing: antialiased; 15 | -moz-osx-font-smoothing: grayscale; 16 | } 17 | 18 | .icon-book:before { content: "\e60b"; } 19 | 20 | .icon-magnifier:before { content: "\e605"; } 21 | 22 | .icon-ren:before { content: "\e717"; } 23 | 24 | .icon-bookmark:before { content: "\e763"; } 25 | 26 | -------------------------------------------------------------------------------- /src/scripts/components/BookResultItem.jsx: -------------------------------------------------------------------------------- 1 | //@ts-check 2 | /// 3 | 4 | import React from 'react'; 5 | import { getString, getI18N, setI18N } from '../i18n/index'; 6 | 7 | /** @type {BookItem} */ 8 | const DEFAULT_BOOK_ITEM = null; 9 | 10 | /** 11 | * @augments {React.Component} 12 | */ 13 | export class BookResultItem extends React.Component{ 14 | constructor(props) { 15 | super(props); 16 | this.state = { expand: false }; 17 | 18 | this.toggleExpandContent = this.toggleExpandContent.bind(this); 19 | } 20 | toggleExpandContent() { this.setState({ expand: !this.state.expand }); } 21 | 22 | componentWillReceiveProps(newProps) { 23 | this.setState({ expand: false }); 24 | } 25 | 26 | render() { 27 | let { keyword , book } = this.props; 28 | let statusColor = "text-success"; 29 | let rentableCount = book.storages.filter(s => s.rentable).length; 30 | if (rentableCount == 0) 31 | statusColor = "text-danger"; 32 | 33 | return
    34 |
    35 |
    36 |
    38 |
    39 | {book.title} 40 | {book.version ? ({book.version}) : null} 41 |
    42 |
    43 |
    44 | {book.categories.map((c, i) => 45 | {c})} 46 |
    47 |
    48 | ISBN: {book.isbn} 49 |
    50 |
    51 |
    52 | {book.brief} 53 |
    54 |
    55 |
    56 | 57 | {book.author} 58 |
    59 |
    60 | 61 | {book.publisher} 62 |
    63 |
    64 |
    65 |
    67 | 68 |
    69 |
    70 | 72 | 73 | 74 |
    75 |
    77 | 78 | 83 | 84 |
    85 |
    86 |
    87 |
    88 | {this.state.expand && book.storages.length ? 89 |
    90 |
    91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | {book.storages.map((storage,i) => 102 | 103 | 104 | 105 | 106 | 107 | )} 108 | 109 |
    {getString('barCode')}{getString('indexNo')}{getString('location')}{getString('status')}
    {storage.barCode}{storage.indexNo}{storage.location}{storage.status}
    110 |
    111 |
    : null} 112 |
    ; 113 | } 114 | } -------------------------------------------------------------------------------- /src/styles/theme_minty/_bootswatch.scss: -------------------------------------------------------------------------------- 1 | // Minty 4.0.0 2 | // Bootswatch 3 | 4 | 5 | // Variables =================================================================== 6 | 7 | // $web-font-path: "https://fonts.googleapis.com/css?family=Montserrat" !default; 8 | // @import url($web-font-path); 9 | @font-face { 10 | font-family: 'Montserrat'; 11 | font-style: normal; 12 | font-weight: 400; 13 | src: local('Montserrat Regular'), 14 | local('Montserrat-Regular'), 15 | url(../assets/fonts/Montserrat-Regular.ttf) format('truetype'); 16 | } 17 | 18 | // Navbar ====================================================================== 19 | 20 | .navbar { 21 | font-family: $headings-font-family; 22 | } 23 | 24 | .bg-dark { 25 | background-color: $secondary !important; 26 | } 27 | 28 | .border-dark { 29 | border-color: $secondary !important; 30 | } 31 | 32 | // Buttons ===================================================================== 33 | 34 | .btn { 35 | font-family: $headings-font-family; 36 | 37 | &, 38 | &:hover { 39 | color: $white; 40 | } 41 | 42 | &-link, 43 | &-link:hover { 44 | color: $primary; 45 | } 46 | 47 | &-link.disabled:hover { 48 | color: $gray-600; 49 | } 50 | 51 | &-outline-primary { 52 | color: $primary; 53 | } 54 | 55 | &-outline-secondary { 56 | color: $secondary; 57 | } 58 | 59 | &-outline-success { 60 | color: $success; 61 | } 62 | 63 | &-outline-info { 64 | color: $info; 65 | } 66 | 67 | &-outline-warning { 68 | color: $warning; 69 | } 70 | 71 | &-outline-danger { 72 | color: $danger; 73 | } 74 | 75 | &-outline-dark { 76 | color: $dark; 77 | } 78 | 79 | &-outline-light { 80 | color: $light; 81 | } 82 | } 83 | 84 | // Typography ================================================================== 85 | 86 | // Tables ====================================================================== 87 | 88 | .table { 89 | 90 | &-success, 91 | &-info, 92 | &-warning, 93 | &-danger { 94 | color: #fff; 95 | } 96 | 97 | &-success { 98 | &, > th, > td { 99 | background-color: $success; 100 | } 101 | } 102 | 103 | &-info { 104 | &, > th, > td { 105 | background-color: $info; 106 | } 107 | } 108 | 109 | &-danger { 110 | &, > th, > td { 111 | background-color: $danger; 112 | } 113 | } 114 | 115 | &-warning { 116 | &, > th, > td { 117 | background-color: $warning; 118 | } 119 | } 120 | 121 | &-hover { 122 | 123 | .table-success:hover { 124 | &, > th, > td { 125 | background-color: darken($success, 5%); 126 | } 127 | } 128 | 129 | .table-info:hover { 130 | &, > th, > td { 131 | background-color: darken($info, 5%); 132 | } 133 | } 134 | 135 | .table-danger:hover { 136 | &, > th, > td { 137 | background-color: darken($danger, 5%); 138 | } 139 | } 140 | 141 | .table-warning:hover { 142 | &, > th, > td { 143 | background-color: darken($warning, 5%); 144 | } 145 | } 146 | } 147 | 148 | .thead-dark th { 149 | background-color: $primary; 150 | border-color: $table-border-color; 151 | font-family: $headings-font-family; 152 | } 153 | } 154 | 155 | // Forms ======================================================================= 156 | 157 | legend { 158 | font-family: $headings-font-family; 159 | } 160 | 161 | // Navs ======================================================================== 162 | 163 | .dropdown-menu { 164 | font-family: $font-family-sans-serif; 165 | } 166 | 167 | .breadcrumb { 168 | a { 169 | color: $navbar-dark-color; 170 | } 171 | 172 | a:hover { 173 | color: $white; 174 | text-decoration: none; 175 | } 176 | } 177 | 178 | // Indicators ================================================================== 179 | 180 | .alert { 181 | color: $white; 182 | 183 | h1, h2, h3, h4, h5, h6 { 184 | color: inherit; 185 | } 186 | 187 | a, 188 | .alert-link { 189 | color: $white; 190 | } 191 | 192 | &-success { 193 | &, > th, > td { 194 | background-color: $success; 195 | } 196 | } 197 | 198 | &-info { 199 | &, > th, > td { 200 | background-color: $info; 201 | } 202 | } 203 | 204 | &-danger { 205 | &, > th, > td { 206 | background-color: $danger; 207 | } 208 | } 209 | 210 | &-warning { 211 | &, > th, > td { 212 | background-color: $warning; 213 | } 214 | } 215 | } 216 | 217 | .badge { 218 | color: $white; 219 | 220 | &-light { 221 | color: $gray-700; 222 | } 223 | } 224 | 225 | // Progress bars =============================================================== 226 | 227 | // Containers ================================================================== 228 | 229 | .card, 230 | .list-group-item { 231 | h1, h2, h3, h4, h5, h6 { 232 | color: inherit; 233 | } 234 | } 235 | -------------------------------------------------------------------------------- /dist/assets/iconfont/iconfont.svg: -------------------------------------------------------------------------------- 1 | 2 | 3 | 6 | 7 | 8 | Created by iconfont 9 | 10 | 11 | 12 | 13 | 21 | 22 | 23 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | -------------------------------------------------------------------------------- /dist/assets/iconfont/iconfont.js: -------------------------------------------------------------------------------- 1 | (function(window){var svgSprite='';var script=function(){var scripts=document.getElementsByTagName("script");return scripts[scripts.length-1]}();var shouldInjectCss=script.getAttribute("data-injectcss");var ready=function(fn){if(document.addEventListener){if(~["complete","loaded","interactive"].indexOf(document.readyState)){setTimeout(fn,0)}else{var loadFn=function(){document.removeEventListener("DOMContentLoaded",loadFn,false);fn()};document.addEventListener("DOMContentLoaded",loadFn,false)}}else if(document.attachEvent){IEContentLoaded(window,fn)}function IEContentLoaded(w,fn){var d=w.document,done=false,init=function(){if(!done){done=true;fn()}};var polling=function(){try{d.documentElement.doScroll("left")}catch(e){setTimeout(polling,50);return}init()};polling();d.onreadystatechange=function(){if(d.readyState=="complete"){d.onreadystatechange=null;init()}}}};var before=function(el,target){target.parentNode.insertBefore(el,target)};var prepend=function(el,target){if(target.firstChild){before(el,target.firstChild)}else{target.appendChild(el)}};function appendSvg(){var div,svg;div=document.createElement("div");div.innerHTML=svgSprite;svgSprite=null;svg=div.getElementsByTagName("svg")[0];if(svg){svg.setAttribute("aria-hidden","true");svg.style.position="absolute";svg.style.width=0;svg.style.height=0;svg.style.overflow="hidden";prepend(svg,document.body)}}if(shouldInjectCss&&!window.__iconfont__svg__cssinject__){window.__iconfont__svg__cssinject__=true;try{document.write("")}catch(e){console&&console.log(e)}}ready(appendSvg)})(window) -------------------------------------------------------------------------------- /dist/mock/search-1.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": [ 3 | { 4 | "并列正题名": [ 5 | "软件工程" 6 | ], 7 | "storages": [ 8 | { 9 | "索书号": "TP311.5/S006.5 ", 10 | "密集架号": " ", 11 | "条码号": "A0948933", 12 | "年卷期": " ", 13 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 14 | "书刊状态": "可借" 15 | } 16 | ], 17 | "出版发行项": [ 18 | "北京:机械工业出版社,2011" 19 | ], 20 | "个人责任者": [ 21 | "萨默维尔 (英) (Sommerville, Lan) 著" 22 | ], 23 | "ISBN及定价": [ 24 | "978-7-111-34825-2/CNY99.00" 25 | ], 26 | "载体形态项": [ 27 | "XIV, 773页:图;25cm" 28 | ], 29 | "责任者附注": [ 30 | "Sommerville规范汉译姓: 萨默维尔" 31 | ], 32 | "refresh": 1515337171.1106942, 33 | "丛编项": [ 34 | "经典原版书库" 35 | ], 36 | "原作版本附注": [ 37 | "据原书第9版英文版影印" 38 | ], 39 | "题名/责任者": [ 40 | "Software engineering/(英) Ian Sommerville著" 41 | ], 42 | "score": 11, 43 | "出版发行附注": [ 44 | "由Pearson Education Asia Ltd.授权" 45 | ], 46 | "提要文摘附注": [ 47 | "本书是系统介绍软件工程理论的经典教材, 全书共四个部分, 完整讨论了软件工程各个阶段的内容。涵盖了对所有开发过程都很基础的重要主题, 包括软件工程理论与实践的最新进展。" 48 | ], 49 | "marc": "0000338637", 50 | "学科主题": [ 51 | "软件工程-ruan jian gong cheng-英文" 52 | ], 53 | "版本说明": [ 54 | "英文版" 55 | ], 56 | "中图法分类号": [ 57 | "TP311.5" 58 | ], 59 | "_id": { 60 | "timestamp": 1515337171, 61 | "machineIdentifier": 2918358, 62 | "processIdentifier": 7024, 63 | "counter": 8382326, 64 | "time": 1515337171000, 65 | "date": 1515337171000, 66 | "timeSecond": 1515337171 67 | } 68 | }, 69 | { 70 | "并列正题名": [ 71 | "软件工程" 72 | ], 73 | "storages": [ 74 | { 75 | "索书号": "TP311.5/S006.7 ", 76 | "密集架号": " ", 77 | "条码号": "A1393851", 78 | "年卷期": " ", 79 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 80 | "书刊状态": "可借" 81 | } 82 | ], 83 | "出版发行项": [ 84 | "北京:机械工业出版社,2017.10" 85 | ], 86 | "个人责任者": [ 87 | "萨默维尔 (Sommerville, Ian) 著" 88 | ], 89 | "ISBN及定价": [ 90 | "978-7-111-58096-6/CNY129.00" 91 | ], 92 | "载体形态项": [ 93 | "xvi, 761页:图;24cm" 94 | ], 95 | "责任者附注": [ 96 | "伊恩·萨默维尔, 英国著名软件工程专家。" 97 | ], 98 | "refresh": 1515337574.135963, 99 | "丛编项": [ 100 | "经典原版书库" 101 | ], 102 | "原作版本附注": [ 103 | "据原书第10版影印" 104 | ], 105 | "题名/责任者": [ 106 | "Software engineering/Ian Sommerville" 107 | ], 108 | "score": 11, 109 | "出版发行附注": [ 110 | "由Pearson Education Inc.授权出版" 111 | ], 112 | "提要文摘附注": [ 113 | "本书是软件工程领域的经典教材, 自1982年第1版出版至今, 伴随着软件工程学科的发展不断更新, 影响了一代又一代的软件工程人才, 对学科建设也产生了积极影响。全书共四个部分, 完整讨论了软件工程各个阶段的内容, 是软件工程相关专业本科生和研究生的教材, 也是软件工程师必备的参考书籍。" 114 | ], 115 | "marc": "0000582956", 116 | "学科主题": [ 117 | "软件工程-英文" 118 | ], 119 | "版本说明": [ 120 | "影印版" 121 | ], 122 | "中图法分类号": [ 123 | "TP311.5" 124 | ], 125 | "_id": { 126 | "timestamp": 1515337574, 127 | "machineIdentifier": 2918358, 128 | "processIdentifier": 7024, 129 | "counter": 8626645, 130 | "time": 1515337574000, 131 | "date": 1515337574000, 132 | "timeSecond": 1515337574 133 | } 134 | }, 135 | { 136 | "storages": [ 137 | { 138 | "索书号": "TP31/P97 ", 139 | "密集架号": "0039157 ", 140 | "条码号": "A0018375", 141 | "年卷期": " ", 142 | "校区-馆藏地": "总馆—一楼密集库   ", 143 | "书刊状态": "可借" 144 | } 145 | ], 146 | "出版发行项": [ 147 | "北京:国防工业出版社,1988.7" 148 | ], 149 | "score": 7.5, 150 | "个人责任者": [ 151 | "杨芙清" 152 | ], 153 | "ISBN及定价": [ 154 | "7-118-00050-7 平/RMB5.60" 155 | ], 156 | "marc": "0000028582", 157 | "载体形态项": [ 158 | "270页;26cm" 159 | ], 160 | "中图法分类号": [ 161 | "TP31-43" 162 | ], 163 | "refresh": 1515297899.6573427, 164 | "_id": { 165 | "timestamp": 1515297899, 166 | "machineIdentifier": 2918358, 167 | "processIdentifier": 15316, 168 | "counter": 1619854, 169 | "time": 1515297899000, 170 | "date": 1515297899000, 171 | "timeSecond": 1515297899 172 | }, 173 | "题名/责任者": [ 174 | "软件工程/杨芙清校" 175 | ] 176 | }, 177 | { 178 | "storages": [ 179 | { 180 | "索书号": "TP311.5/W222 ", 181 | "密集架号": "0045608 ", 182 | "条码号": "A0128150", 183 | "年卷期": " ", 184 | "校区-馆藏地": "总馆—一楼密集库   ", 185 | "书刊状态": "可借" 186 | }, 187 | { 188 | "索书号": "TP311.5/W222 ", 189 | "密集架号": "0045609 ", 190 | "条码号": "A0128151", 191 | "年卷期": " ", 192 | "校区-馆藏地": "总馆—一楼密集库   ", 193 | "书刊状态": "可借" 194 | }, 195 | { 196 | "索书号": "TP311.5/W222 ", 197 | "密集架号": "0399312 ", 198 | "条码号": "A0128149", 199 | "年卷期": " ", 200 | "校区-馆藏地": "总馆—密集库3   ", 201 | "书刊状态": "可借" 202 | } 203 | ], 204 | "出版发行项": [ 205 | "沈阳:东北大学出版社,2001.3" 206 | ], 207 | "score": 7.5, 208 | "个人责任者": [ 209 | "王家华 编著" 210 | ], 211 | "ISBN及定价": [ 212 | "7-81054-492-6 平装/RMB30.00" 213 | ], 214 | "marc": "0000059276", 215 | "载体形态项": [ 216 | "305页;26cm" 217 | ], 218 | "学科主题": [ 219 | "软件工程-高等学校-教材" 220 | ], 221 | "中图法分类号": [ 222 | "TP311.5" 223 | ], 224 | "refresh": 1515297932.0552163, 225 | "_id": { 226 | "timestamp": 1515297932, 227 | "machineIdentifier": 2918358, 228 | "processIdentifier": 15316, 229 | "counter": 1650548, 230 | "time": 1515297932000, 231 | "date": 1515297932000, 232 | "timeSecond": 1515297932 233 | }, 234 | "题名/责任者": [ 235 | "软件工程/王家华编著" 236 | ] 237 | }, 238 | { 239 | "一般附注": [ 240 | "高等学校21世纪教材" 241 | ], 242 | "storages": [ 243 | { 244 | "索书号": "TP311.5/Z111 ", 245 | "密集架号": "0045612 ", 246 | "条码号": "A0169107", 247 | "年卷期": " ", 248 | "校区-馆藏地": "总馆—一楼密集库   ", 249 | "书刊状态": "可借" 250 | }, 251 | { 252 | "索书号": "TP311.5/Z111 ", 253 | "密集架号": "0170074 ", 254 | "条码号": "A0169108", 255 | "年卷期": " ", 256 | "校区-馆藏地": "总馆—一楼密集库   ", 257 | "书刊状态": "可借" 258 | }, 259 | { 260 | "索书号": "TP311.5/Z111 ", 261 | "密集架号": "0045611 ", 262 | "条码号": "A0169106", 263 | "年卷期": " ", 264 | "校区-馆藏地": "总馆—一楼密集库   ", 265 | "书刊状态": "可借" 266 | } 267 | ], 268 | "出版发行项": [ 269 | "北京:人民邮电出版社,2002" 270 | ], 271 | "个人责任者": [ 272 | "张海藩 编著" 273 | ], 274 | "ISBN及定价": [ 275 | "7-115-09378-4/CNY29.00" 276 | ], 277 | "载体形态项": [ 278 | "10,338页;26cm" 279 | ], 280 | "refresh": 1515297949.3165715, 281 | "题名/责任者": [ 282 | "软件工程/张海藩编著" 283 | ], 284 | "score": 7.5, 285 | "marc": "0000075489", 286 | "学科主题": [ 287 | "软件工程", 288 | "软件工程-高等学校-教材" 289 | ], 290 | "中图法分类号": [ 291 | "TP311.5" 292 | ], 293 | "_id": { 294 | "timestamp": 1515297949, 295 | "machineIdentifier": 2918358, 296 | "processIdentifier": 15316, 297 | "counter": 1666761, 298 | "time": 1515297949000, 299 | "date": 1515297949000, 300 | "timeSecond": 1515297949 301 | } 302 | }, 303 | { 304 | "storages": [ 305 | { 306 | "索书号": "TP311.5-43/X789 ", 307 | "密集架号": " ", 308 | "条码号": "A0158053", 309 | "年卷期": " ", 310 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 311 | "书刊状态": "借出-应还日期:2014-09-21" 312 | }, 313 | { 314 | "索书号": "TP311.5-43/X789 ", 315 | "密集架号": " ", 316 | "条码号": "A0158055", 317 | "年卷期": " ", 318 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 319 | "书刊状态": "借出-应还日期:2014-09-21" 320 | }, 321 | { 322 | "索书号": "TP311.5-43/X789 ", 323 | "密集架号": "0361743 ", 324 | "条码号": "A0158054", 325 | "年卷期": " ", 326 | "校区-馆藏地": "总馆—密集库3   ", 327 | "书刊状态": "可借" 328 | } 329 | ], 330 | "出版发行项": [ 331 | "武汉:华中科技大学出版社,2001.1" 332 | ], 333 | "个人责任者": [ 334 | "徐仁佐 主编" 335 | ], 336 | "ISBN及定价": [ 337 | "7-5609-2363-1/CNY27.00" 338 | ], 339 | "载体形态项": [ 340 | "355页:图;23cm" 341 | ], 342 | "使用对象附注": [ 343 | "读者对象:计算机专业本科生、广大软件产业及IT产业从业人员。" 344 | ], 345 | "refresh": 1515297947.436498, 346 | "丛编项": [ 347 | "面向21世纪计算机专业本科系列教材" 348 | ], 349 | "题名/责任者": [ 350 | "软件工程/徐仁佐主编" 351 | ], 352 | "score": 7.5, 353 | "提要文摘附注": [ 354 | "本书分软件工程技术与软件工程管理两部分。软件工程技术部分包括软件工程概述,软件需求分析,软件复用,软件测试,软件维护与软件再工程,软件工具与软件开发环境等内容;软件工程管理部分包括软件抽量管理,软件文档与软件工程标准化,软件项目、配置及人员组织管理,软件知识产权保护等内容;最后介绍当前国际上软件工程研究的新方向。" 355 | ], 356 | "marc": "0000073743", 357 | "学科主题": [ 358 | "软件工程-ruan jian gong cheng-高等学校-教材" 359 | ], 360 | "书目附注": [ 361 | "有书目(第353~355页)和索引(第351~352页)" 362 | ], 363 | "中图法分类号": [ 364 | "TP311.5", 365 | "TP311.5-43" 366 | ], 367 | "_id": { 368 | "timestamp": 1515297947, 369 | "machineIdentifier": 2918358, 370 | "processIdentifier": 15316, 371 | "counter": 1665015, 372 | "time": 1515297947000, 373 | "date": 1515297947000, 374 | "timeSecond": 1515297947 375 | } 376 | }, 377 | { 378 | "并列正题名": [ 379 | "Software Engineering" 380 | ], 381 | "一般附注": [ 382 | "普通高等学校计算机科学与技术专业新编系列教材" 383 | ], 384 | "storages": [ 385 | { 386 | "索书号": "TP311.5/Z024 ", 387 | "密集架号": "0170080 ", 388 | "条码号": "A0169597", 389 | "年卷期": " ", 390 | "校区-馆藏地": "总馆—一楼密集库   ", 391 | "书刊状态": "可借" 392 | }, 393 | { 394 | "索书号": "TP311.5/Z024 ", 395 | "密集架号": "0170054 ", 396 | "条码号": "A0169598", 397 | "年卷期": " ", 398 | "校区-馆藏地": "总馆—一楼密集库   ", 399 | "书刊状态": "可借" 400 | }, 401 | { 402 | "索书号": "TP311.5/Z024 ", 403 | "密集架号": "0038723 ", 404 | "条码号": "A0199423", 405 | "年卷期": " ", 406 | "校区-馆藏地": "总馆—一楼密集库   ", 407 | "书刊状态": "可借" 408 | }, 409 | { 410 | "索书号": "TP311.5/Z024 ", 411 | "密集架号": "0038722 ", 412 | "条码号": "A0199424", 413 | "年卷期": " ", 414 | "校区-馆藏地": "总馆—一楼密集库   ", 415 | "书刊状态": "可借" 416 | }, 417 | { 418 | "索书号": "TP311.5/Z024 ", 419 | "密集架号": "0038721 ", 420 | "条码号": "A0169596", 421 | "年卷期": " ", 422 | "校区-馆藏地": "总馆—一楼密集库   ", 423 | "书刊状态": "可借" 424 | } 425 | ], 426 | "出版发行项": [ 427 | "武汉:武汉理工大学出版社,2003" 428 | ], 429 | "个人责任者": [ 430 | "曾建潮 主编" 431 | ], 432 | "ISBN及定价": [ 433 | "7-5629-1954-2/CNY25.00" 434 | ], 435 | "载体形态项": [ 436 | "284页;23cm" 437 | ], 438 | "refresh": 1515297950.3175476, 439 | "题名/责任者": [ 440 | "软件工程/曾建潮主编" 441 | ], 442 | "score": 7.5, 443 | "提要文摘附注": [ 444 | "本书共12章,包括:概论;可行性分析;总体设计;详细设计;编码实现;面向对象的方法学、面向对象的分析方法和建模技术等。" 445 | ], 446 | "marc": "0000076441", 447 | "学科主题": [ 448 | "软件工程", 449 | "软件工程-高等学校-教材" 450 | ], 451 | "中图法分类号": [ 452 | "TP311.5" 453 | ], 454 | "_id": { 455 | "timestamp": 1515297950, 456 | "machineIdentifier": 2918358, 457 | "processIdentifier": 15316, 458 | "counter": 1667713, 459 | "time": 1515297950000, 460 | "date": 1515297950000, 461 | "timeSecond": 1515297950 462 | } 463 | }, 464 | { 465 | "storages": [ 466 | { 467 | "索书号": "TP311.5/L098 ", 468 | "密集架号": "0044469 ", 469 | "条码号": "A0209015", 470 | "年卷期": " ", 471 | "校区-馆藏地": "总馆—一楼密集库   ", 472 | "书刊状态": "可借" 473 | }, 474 | { 475 | "索书号": "TP311.5/L098 ", 476 | "密集架号": "0044470 ", 477 | "条码号": "A0209016", 478 | "年卷期": " ", 479 | "校区-馆藏地": "总馆—一楼密集库   ", 480 | "书刊状态": "可借" 481 | }, 482 | { 483 | "索书号": "TP311.5/L098 ", 484 | "密集架号": "0044467 ", 485 | "条码号": "A0209017", 486 | "年卷期": " ", 487 | "校区-馆藏地": "总馆—一楼密集库   ", 488 | "书刊状态": "可借" 489 | }, 490 | { 491 | "索书号": "TP311.5/L098 ", 492 | "密集架号": "0044468 ", 493 | "条码号": "A0209018", 494 | "年卷期": " ", 495 | "校区-馆藏地": "总馆—一楼密集库   ", 496 | "书刊状态": "可借" 497 | }, 498 | { 499 | "索书号": "TP311.5/L098 ", 500 | "密集架号": "0372613 ", 501 | "条码号": "A0209014", 502 | "年卷期": " ", 503 | "校区-馆藏地": "总馆—密集库3   ", 504 | "书刊状态": "可借" 505 | } 506 | ], 507 | "出版发行项": [ 508 | "北京:人民交通出版社,2004" 509 | ], 510 | "个人责任者": [ 511 | "冷英男 主编" 512 | ], 513 | "ISBN及定价": [ 514 | "7-114-04932-3 平装/CNY23.00" 515 | ], 516 | "载体形态项": [ 517 | "216页:图;26cm" 518 | ], 519 | "使用对象附注": [ 520 | "高职高专学校学生、编程人员和普通读者。" 521 | ], 522 | "refresh": 1515297959.6689723, 523 | "丛编项": [ 524 | "面向21世纪高职高专计算机专业教材" 525 | ], 526 | "题名/责任者": [ 527 | "软件工程/冷英男主编" 528 | ], 529 | "score": 7.5, 530 | "提要文摘附注": [ 531 | "本书系统地介绍了软件工程的基本概念、技术与方法,内容包括:软件开发模型,系统分析,需求分析,软件设计等内容。" 532 | ], 533 | "marc": "0000085111", 534 | "学科主题": [ 535 | "软件工程-高等教育-教材" 536 | ], 537 | "书目附注": [ 538 | "有书目 (第216页)" 539 | ], 540 | "中图法分类号": [ 541 | "TP311.5" 542 | ], 543 | "_id": { 544 | "timestamp": 1515297959, 545 | "machineIdentifier": 2918358, 546 | "processIdentifier": 15316, 547 | "counter": 1676383, 548 | "time": 1515297959000, 549 | "date": 1515297959000, 550 | "timeSecond": 1515297959 551 | } 552 | }, 553 | { 554 | "一般附注": [ 555 | "21世纪高等学校本科系列教材(15) 计算机科学与技术专业" 556 | ], 557 | "storages": [ 558 | { 559 | "索书号": "TP311.5/Z762 ", 560 | "密集架号": "0045615 ", 561 | "条码号": "A0207504", 562 | "年卷期": " ", 563 | "校区-馆藏地": "总馆—一楼密集库   ", 564 | "书刊状态": "可借" 565 | }, 566 | { 567 | "索书号": "TP311.5/Z762 ", 568 | "密集架号": "0045185 ", 569 | "条码号": "A0207505", 570 | "年卷期": " ", 571 | "校区-馆藏地": "总馆—一楼密集库   ", 572 | "书刊状态": "可借" 573 | }, 574 | { 575 | "索书号": "TP311.5/Z762 ", 576 | "密集架号": "0045187 ", 577 | "条码号": "A0207506", 578 | "年卷期": " ", 579 | "校区-馆藏地": "总馆—一楼密集库   ", 580 | "书刊状态": "可借" 581 | }, 582 | { 583 | "索书号": "TP311.5/Z762 ", 584 | "密集架号": "0045186 ", 585 | "条码号": "A0207508", 586 | "年卷期": " ", 587 | "校区-馆藏地": "总馆—一楼密集库   ", 588 | "书刊状态": "可借" 589 | }, 590 | { 591 | "索书号": "TP311.5/Z762 ", 592 | "密集架号": "0377278 ", 593 | "条码号": "A0207507", 594 | "年卷期": " ", 595 | "校区-馆藏地": "总馆—密集库3   ", 596 | "书刊状态": "可借" 597 | } 598 | ], 599 | "出版发行项": [ 600 | "重庆:重庆大学出版社,2001" 601 | ], 602 | "个人责任者": [ 603 | "周枫 编著" 604 | ], 605 | "ISBN及定价": [ 606 | "7-5624-2300-8/CNY22.00" 607 | ], 608 | "载体形态项": [ 609 | "226页;26cm" 610 | ], 611 | "refresh": 1515297960.2084193, 612 | "题名/责任者": [ 613 | "软件工程/周枫等编著" 614 | ], 615 | "score": 7.5, 616 | "提要文摘附注": [ 617 | "本书共分12章,主要以工程化学的软件开发方法为主导,系统、全面地介绍了这门功课的原理、方法及应用。" 618 | ], 619 | "marc": "0000085567", 620 | "学科主题": [ 621 | "软件工程-高等学校-教材" 622 | ], 623 | "中图法分类号": [ 624 | "TP311.5" 625 | ], 626 | "_id": { 627 | "timestamp": 1515297960, 628 | "machineIdentifier": 2918358, 629 | "processIdentifier": 15316, 630 | "counter": 1676839, 631 | "time": 1515297960000, 632 | "date": 1515297960000, 633 | "timeSecond": 1515297960 634 | } 635 | }, 636 | { 637 | "一般附注": [ 638 | "21世纪高等院校计算机系列教材" 639 | ], 640 | "storages": [ 641 | { 642 | "索书号": "TP311.5/C161 ", 643 | "密集架号": "0397952 ", 644 | "条码号": "A0230725", 645 | "年卷期": " ", 646 | "校区-馆藏地": "总馆—密集库3   ", 647 | "书刊状态": "可借" 648 | }, 649 | { 650 | "索书号": "TP311.5/C161 ", 651 | "密集架号": "0397950 ", 652 | "条码号": "A0230726", 653 | "年卷期": " ", 654 | "校区-馆藏地": "总馆—密集库3   ", 655 | "书刊状态": "可借" 656 | }, 657 | { 658 | "索书号": "TP311.5/C161 ", 659 | "密集架号": "0397953 ", 660 | "条码号": "A0230727", 661 | "年卷期": " ", 662 | "校区-馆藏地": "总馆—密集库3   ", 663 | "书刊状态": "可借" 664 | }, 665 | { 666 | "索书号": "TP311.5/C161 ", 667 | "密集架号": "0397949 ", 668 | "条码号": "A0230728", 669 | "年卷期": " ", 670 | "校区-馆藏地": "总馆—密集库3   ", 671 | "书刊状态": "可借" 672 | }, 673 | { 674 | "索书号": "TP311.5/C161 ", 675 | "密集架号": "0397951 ", 676 | "条码号": "A0230724", 677 | "年卷期": " ", 678 | "校区-馆藏地": "总馆—密集库3   ", 679 | "书刊状态": "可借" 680 | } 681 | ], 682 | "出版发行项": [ 683 | "北京:中国水利水电出版社,2004" 684 | ], 685 | "个人责任者": [ 686 | "曹哲 主编" 687 | ], 688 | "ISBN及定价": [ 689 | "7-5084-1555-8/CNY24.00" 690 | ], 691 | "载体形态项": [ 692 | "255页;26cm" 693 | ], 694 | "refresh": 1515297973.1072123, 695 | "题名/责任者": [ 696 | "软件工程/曹哲主编" 697 | ], 698 | "score": 7.5, 699 | "提要文摘附注": [ 700 | "本书主要内容包括:概述,软件项目管理,计算机系统工程,需求分析,面向数据流的分析方法,面向数据的分析设计方法,面向数据的设计方法,面向对象的设计方法,人机界面设计,程序设计语言与编码,软件测试,软件测试、软件维护、软件配置管理以及软件开发新技术简介等。" 701 | ], 702 | "marc": "0000097261", 703 | "学科主题": [ 704 | "软件工程-高等学校-教材" 705 | ], 706 | "中图法分类号": [ 707 | "TP311.5" 708 | ], 709 | "_id": { 710 | "timestamp": 1515297973, 711 | "machineIdentifier": 2918358, 712 | "processIdentifier": 15316, 713 | "counter": 1688533, 714 | "time": 1515297973000, 715 | "date": 1515297973000, 716 | "timeSecond": 1515297973 717 | } 718 | } 719 | ], 720 | "totalPages": 22, 721 | "totalElements": 216, 722 | "last": false, 723 | "size": 10, 724 | "number": 0, 725 | "sort": null, 726 | "first": true, 727 | "numberOfElements": 10 728 | } -------------------------------------------------------------------------------- /dist/mock/search-2.json: -------------------------------------------------------------------------------- 1 | { 2 | "content": [ 3 | { 4 | "一般附注": [ 5 | "21世纪高等院校计算机系列教材" 6 | ], 7 | "storages": [ 8 | { 9 | "索书号": "TP311.5/C161 ", 10 | "密集架号": "0397952 ", 11 | "条码号": "A0230725", 12 | "年卷期": " ", 13 | "校区-馆藏地": "总馆—密集库3   ", 14 | "书刊状态": "可借" 15 | }, 16 | { 17 | "索书号": "TP311.5/C161 ", 18 | "密集架号": "0397950 ", 19 | "条码号": "A0230726", 20 | "年卷期": " ", 21 | "校区-馆藏地": "总馆—密集库3   ", 22 | "书刊状态": "可借" 23 | }, 24 | { 25 | "索书号": "TP311.5/C161 ", 26 | "密集架号": "0397953 ", 27 | "条码号": "A0230727", 28 | "年卷期": " ", 29 | "校区-馆藏地": "总馆—密集库3   ", 30 | "书刊状态": "可借" 31 | }, 32 | { 33 | "索书号": "TP311.5/C161 ", 34 | "密集架号": "0397949 ", 35 | "条码号": "A0230728", 36 | "年卷期": " ", 37 | "校区-馆藏地": "总馆—密集库3   ", 38 | "书刊状态": "可借" 39 | }, 40 | { 41 | "索书号": "TP311.5/C161 ", 42 | "密集架号": "0397951 ", 43 | "条码号": "A0230724", 44 | "年卷期": " ", 45 | "校区-馆藏地": "总馆—密集库3   ", 46 | "书刊状态": "可借" 47 | } 48 | ], 49 | "出版发行项": [ 50 | "北京:中国水利水电出版社,2004" 51 | ], 52 | "个人责任者": [ 53 | "曹哲 主编" 54 | ], 55 | "ISBN及定价": [ 56 | "7-5084-1555-8/CNY24.00" 57 | ], 58 | "载体形态项": [ 59 | "255页;26cm" 60 | ], 61 | "refresh": 1515336816.8811147, 62 | "题名/责任者": [ 63 | "软件工程/曹哲主编" 64 | ], 65 | "score": 7.5, 66 | "提要文摘附注": [ 67 | "本书主要内容包括:概述,软件项目管理,计算机系统工程,需求分析,面向数据流的分析方法,面向数据的分析设计方法,面向数据的设计方法,面向对象的设计方法,人机界面设计,程序设计语言与编码,软件测试,软件测试、软件维护、软件配置管理以及软件开发新技术简介等。" 68 | ], 69 | "marc": "0000097261", 70 | "学科主题": [ 71 | "软件工程-高等学校-教材" 72 | ], 73 | "中图法分类号": [ 74 | "TP311.5" 75 | ], 76 | "_id": { 77 | "timestamp": 1515336816, 78 | "machineIdentifier": 2918358, 79 | "processIdentifier": 7024, 80 | "counter": 8140950, 81 | "time": 1515336816000, 82 | "date": 1515336816000, 83 | "timeSecond": 1515336816 84 | } 85 | }, 86 | { 87 | "storages": [ 88 | { 89 | "索书号": "TP311.5/Y110 ", 90 | "密集架号": "0360642 ", 91 | "条码号": "A0324160", 92 | "年卷期": " ", 93 | "校区-馆藏地": "总馆—密集库3   ", 94 | "书刊状态": "可借" 95 | }, 96 | { 97 | "索书号": "TP311.5/Y110 ", 98 | "密集架号": "0360644 ", 99 | "条码号": "A0324161", 100 | "年卷期": " ", 101 | "校区-馆藏地": "总馆—密集库3   ", 102 | "书刊状态": "可借" 103 | }, 104 | { 105 | "索书号": "TP311.5/Y110 ", 106 | "密集架号": "0360640 ", 107 | "条码号": "A0324162", 108 | "年卷期": " ", 109 | "校区-馆藏地": "总馆—密集库3   ", 110 | "书刊状态": "可借" 111 | }, 112 | { 113 | "索书号": "TP311.5/Y110 ", 114 | "密集架号": "0360643 ", 115 | "条码号": "A0324163", 116 | "年卷期": " ", 117 | "校区-馆藏地": "总馆—密集库3   ", 118 | "书刊状态": "可借" 119 | }, 120 | { 121 | "索书号": "TP311.5/Y110 ", 122 | "密集架号": "0360639 ", 123 | "条码号": "A0369656", 124 | "年卷期": " ", 125 | "校区-馆藏地": "总馆—密集库3   ", 126 | "书刊状态": "可借" 127 | }, 128 | { 129 | "索书号": "TP311.5/Y110 ", 130 | "密集架号": "0360638 ", 131 | "条码号": "A0369672", 132 | "年卷期": " ", 133 | "校区-馆藏地": "总馆—密集库3   ", 134 | "书刊状态": "可借" 135 | }, 136 | { 137 | "索书号": "TP311.5/Y110 ", 138 | "密集架号": "0360641 ", 139 | "条码号": "A0324159", 140 | "年卷期": " ", 141 | "校区-馆藏地": "总馆—密集库3   ", 142 | "书刊状态": "可借" 143 | } 144 | ], 145 | "出版发行项": [ 146 | "北京:中国水利水电出版社,2005" 147 | ], 148 | "个人责任者": [ 149 | "闫菲 主编" 150 | ], 151 | "ISBN及定价": [ 152 | "7-5084-3032-8/CNY22.00" 153 | ], 154 | "载体形态项": [ 155 | "222页:图;26cm" 156 | ], 157 | "refresh": 1515336846.9829195, 158 | "丛编项": [ 159 | "21世纪高职高专新概念教材" 160 | ], 161 | "题名/责任者": [ 162 | "软件工程/闫菲主编" 163 | ], 164 | "score": 7.5, 165 | "提要文摘附注": [ 166 | "本书共14章,分别介绍了软件危机与软件工程、软件生命周期及软件开发模型、计算机系统工程、总体设计等内容。" 167 | ], 168 | "marc": "0000123634", 169 | "学科主题": [ 170 | "软件工程-高等教育-教材" 171 | ], 172 | "版本说明": [ 173 | "2版" 174 | ], 175 | "中图法分类号": [ 176 | "TP311.5" 177 | ], 178 | "_id": { 179 | "timestamp": 1515336846, 180 | "machineIdentifier": 2918358, 181 | "processIdentifier": 7024, 182 | "counter": 8167323, 183 | "time": 1515336846000, 184 | "date": 1515336846000, 185 | "timeSecond": 1515336846 186 | } 187 | }, 188 | { 189 | "一般附注": [ 190 | "高等学校教材 计算机科学与技术" 191 | ], 192 | "storages": [ 193 | { 194 | "索书号": "TP311.5/Y430 ", 195 | "密集架号": "0361449 ", 196 | "条码号": "A0402843", 197 | "年卷期": " ", 198 | "校区-馆藏地": "总馆—密集库3   ", 199 | "书刊状态": "可借" 200 | }, 201 | { 202 | "索书号": "TP311.5/Y430 ", 203 | "密集架号": " ", 204 | "条码号": "A0402798", 205 | "年卷期": " ", 206 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 207 | "书刊状态": "借出-应还日期:2014-09-21" 208 | }, 209 | { 210 | "索书号": "TP311.5/Y430 ", 211 | "密集架号": " ", 212 | "条码号": "A0402842", 213 | "年卷期": " ", 214 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 215 | "书刊状态": "借出-应还日期:2014-09-21" 216 | }, 217 | { 218 | "索书号": "TP311.5/Y430 ", 219 | "密集架号": "0361450 ", 220 | "条码号": "A0402799", 221 | "年卷期": " ", 222 | "校区-馆藏地": "总馆—密集库3   ", 223 | "书刊状态": "可借" 224 | } 225 | ], 226 | "出版发行项": [ 227 | "北京:清华大学出版社,2006" 228 | ], 229 | "个人责任者": [ 230 | "叶俊民 编著" 231 | ], 232 | "ISBN及定价": [ 233 | "7-302-12906-1/CNY29.00" 234 | ], 235 | "载体形态项": [ 236 | "13,361页;26cm" 237 | ], 238 | "refresh": 1515336872.117611, 239 | "题名/责任者": [ 240 | "软件工程/叶俊民编著" 241 | ], 242 | "score": 7.5, 243 | "提要文摘附注": [ 244 | "本书共12章。介绍了软件工程的背景和基础知识、软件项目管理的方法和技术;讨论了软件分析、设计技术;着重介绍了人机交互的设计;讨论了软件构件的设计技术;研究了面向的概念和分析、设计方法;介绍了软件测试和维护的基础知识。" 245 | ], 246 | "marc": "0000145903", 247 | "学科主题": [ 248 | "软件工程", 249 | "软件工程-高等学校-教材" 250 | ], 251 | "中图法分类号": [ 252 | "TP311.5" 253 | ], 254 | "_id": { 255 | "timestamp": 1515336872, 256 | "machineIdentifier": 2918358, 257 | "processIdentifier": 7024, 258 | "counter": 8189592, 259 | "time": 1515336872000, 260 | "date": 1515336872000, 261 | "timeSecond": 1515336872 262 | } 263 | }, 264 | { 265 | "一般附注": [ 266 | "高等学校计算机科学与技术教材 国家自然科学基金(70471091)资助 高等学校博士点专项科研基金(20030561024)资助" 267 | ], 268 | "storages": [ 269 | { 270 | "索书号": "TP311.5/W035 ", 271 | "密集架号": "0372654 ", 272 | "条码号": "A0452211", 273 | "年卷期": " ", 274 | "校区-馆藏地": "总馆—密集库3   ", 275 | "书刊状态": "可借" 276 | }, 277 | { 278 | "索书号": "TP311.5/W035 ", 279 | "密集架号": " ", 280 | "条码号": "A0452212", 281 | "年卷期": " ", 282 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 283 | "书刊状态": "借出-应还日期:2014-09-21" 284 | }, 285 | { 286 | "索书号": "TP311.5/W035 ", 287 | "密集架号": " ", 288 | "条码号": "A0452213", 289 | "年卷期": " ", 290 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 291 | "书刊状态": "借出-应还日期:2014-09-21" 292 | }, 293 | { 294 | "索书号": "TP311.5/W035 ", 295 | "密集架号": " ", 296 | "条码号": "A0452214", 297 | "年卷期": " ", 298 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 299 | "书刊状态": "借出-应还日期:2014-09-21" 300 | }, 301 | { 302 | "索书号": "TP311.5/W035 ", 303 | "密集架号": "0372653 ", 304 | "条码号": "A0452210", 305 | "年卷期": " ", 306 | "校区-馆藏地": "总馆—密集库3   ", 307 | "书刊状态": "可借" 308 | } 309 | ], 310 | "出版发行项": [ 311 | "北京:清华大学出版社,2006" 312 | ], 313 | "个人责任者": [ 314 | "万江平 编著" 315 | ], 316 | "ISBN及定价": [ 317 | "7-81082-733-2/CNY36.00" 318 | ], 319 | "载体形态项": [ 320 | "377页;26cm" 321 | ], 322 | "refresh": 1515336884.5068865, 323 | "题名/责任者": [ 324 | "软件工程/万江平编著" 325 | ], 326 | "score": 7.5, 327 | "提要文摘附注": [ 328 | "本书运用了前沿的知识科学和系统科学来处理软件和软件工程的复杂性。使用了IEEE的软件工程知识体系、著名的软件过程成熟度模型和NASA的软件开发实践经验。针对中国的实际情况和软件产业的发展,突出了软件质量管理和软件过程改进,采用了面向对象技术、项目管理等软件来解决中国软件工程教育有培训的实际问题。" 329 | ], 330 | "marc": "0000157072", 331 | "学科主题": [ 332 | "软件工程-高等学校-教材" 333 | ], 334 | "中图法分类号": [ 335 | "TP311.5" 336 | ], 337 | "_id": { 338 | "timestamp": 1515336884, 339 | "machineIdentifier": 2918358, 340 | "processIdentifier": 7024, 341 | "counter": 8200761, 342 | "time": 1515336884000, 343 | "date": 1515336884000, 344 | "timeSecond": 1515336884 345 | } 346 | }, 347 | { 348 | "一般附注": [ 349 | "高等学校教材 软件工程" 350 | ], 351 | "storages": [ 352 | { 353 | "索书号": "TP311.5/L144 ", 354 | "密集架号": " ", 355 | "条码号": "A0531359", 356 | "年卷期": " ", 357 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 358 | "书刊状态": "借出-应还日期:2014-09-21" 359 | }, 360 | { 361 | "索书号": "TP311.5/L144 ", 362 | "密集架号": " ", 363 | "条码号": "A0531361", 364 | "年卷期": " ", 365 | "校区-馆藏地": "总馆—二楼自然科学图书借阅室Ⅱ   ", 366 | "书刊状态": "借出-应还日期:2014-09-21" 367 | }, 368 | { 369 | "索书号": "TP311.5/L144 ", 370 | "密集架号": "0372702 ", 371 | "条码号": "A0531360", 372 | "年卷期": " ", 373 | "校区-馆藏地": "总馆—密集库3   ", 374 | "书刊状态": "可借" 375 | } 376 | ], 377 | "出版发行项": [ 378 | "北京:清华大学出版社,2008" 379 | ], 380 | "个人责任者": [ 381 | "李代平 编著" 382 | ], 383 | "ISBN及定价": [ 384 | "978-7-302-15731-1/CNY46.00" 385 | ], 386 | "载体形态项": [ 387 | "19,523页;26cm" 388 | ], 389 | "refresh": 1515336944.6978767, 390 | "题名/责任者": [ 391 | "软件工程/李代平等编著" 392 | ], 393 | "score": 7.5, 394 | "提要文摘附注": [ 395 | "本书分为基础理论、结构化方法、面向对象方法与实现、质量与工程管理四部分。每一章都有相应的例子和解释。" 396 | ], 397 | "marc": "0000208460", 398 | "学科主题": [ 399 | "软件工程", 400 | "软件工程-高等学校-教材" 401 | ], 402 | "版本说明": [ 403 | "2版" 404 | ], 405 | "中图法分类号": [ 406 | "TP311.5" 407 | ], 408 | "_id": { 409 | "timestamp": 1515336944, 410 | "machineIdentifier": 2918358, 411 | "processIdentifier": 7024, 412 | "counter": 8252149, 413 | "time": 1515336944000, 414 | "date": 1515336944000, 415 | "timeSecond": 1515336944 416 | } 417 | }, 418 | { 419 | "一般附注": [ 420 | "21世纪高职高专系列教材" 421 | ], 422 | "storages": [ 423 | { 424 | "索书号": "TP311.5/Z811 ", 425 | "密集架号": "0376623 ", 426 | "条码号": "A0654922", 427 | "年卷期": " ", 428 | "校区-馆藏地": "总馆—密集库3   ", 429 | "书刊状态": "可借" 430 | } 431 | ], 432 | "出版发行项": [ 433 | "北京:机械工业出版社,2001" 434 | ], 435 | "个人责任者": [ 436 | "周志刚 主编" 437 | ], 438 | "ISBN及定价": [ 439 | "7-111-08408-X/CNY18.00" 440 | ], 441 | "载体形态项": [ 442 | "169页;26cm" 443 | ], 444 | "refresh": 1515337043.7695458, 445 | "题名/责任者": [ 446 | "软件工程/周志刚主编" 447 | ], 448 | "score": 7.5, 449 | "提要文摘附注": [ 450 | "全书共分九章,内容包括绪论、软件定义及计划、软件需求分析、软件设计、软件编码、软件测试、软件运行及维护、软件项目管理技术、面向对象软件工程等。" 451 | ], 452 | "marc": "0000270135", 453 | "学科主题": [ 454 | "软件工程", 455 | "软件工程-高等教育-教材" 456 | ], 457 | "中图法分类号": [ 458 | "TP311.5" 459 | ], 460 | "_id": { 461 | "timestamp": 1515337043, 462 | "machineIdentifier": 2918358, 463 | "processIdentifier": 7024, 464 | "counter": 8313824, 465 | "time": 1515337043000, 466 | "date": 1515337043000, 467 | "timeSecond": 1515337043 468 | } 469 | }, 470 | { 471 | "一般附注": [ 472 | "普通高等教育“十一五”国家级规划教材" 473 | ], 474 | "storages": [ 475 | { 476 | "索书号": "TP311.5/X292.1 ", 477 | "密集架号": "0372675 ", 478 | "条码号": "A0693603", 479 | "年卷期": " ", 480 | "校区-馆藏地": "总馆—密集库3   ", 481 | "书刊状态": "可借" 482 | }, 483 | { 484 | "索书号": "TP311.5/X292.1 ", 485 | "密集架号": "0372673 ", 486 | "条码号": "A0693604", 487 | "年卷期": " ", 488 | "校区-馆藏地": "总馆—密集库3   ", 489 | "书刊状态": "可借" 490 | }, 491 | { 492 | "索书号": "TP311.5/X292.1 ", 493 | "密集架号": "0372674 ", 494 | "条码号": "A0693602", 495 | "年卷期": " ", 496 | "校区-馆藏地": "总馆—密集库3   ", 497 | "书刊状态": "可借" 498 | } 499 | ], 500 | "出版发行项": [ 501 | "北京:国防工业出版社,2009" 502 | ], 503 | "个人责任者": [ 504 | "肖汉 主编" 505 | ], 506 | "ISBN及定价": [ 507 | "978-7-118-06001-0/CNY39.00" 508 | ], 509 | "载体形态项": [ 510 | "16,428页;26cm" 511 | ], 512 | "refresh": 1515337030.0243692, 513 | "题名/责任者": [ 514 | "软件工程/肖汉主编" 515 | ], 516 | "score": 7.5, 517 | "提要文摘附注": [ 518 | "本书第1篇讲述软件工程与软件过程;第2篇讲述结构化分析、设计与实现;第3篇讲述面向对象的概念、模型、分析、设计与实现;第4篇讲述软件项目的计划、组织和控制;第5篇讲述软件重用,软件工程环境,设计模式,敏捷开发。" 519 | ], 520 | "marc": "0000262985", 521 | "学科主题": [ 522 | "软件工程", 523 | "软件工程-高等教育-教材" 524 | ], 525 | "中图法分类号": [ 526 | "TP311.5" 527 | ], 528 | "_id": { 529 | "timestamp": 1515337030, 530 | "machineIdentifier": 2918358, 531 | "processIdentifier": 7024, 532 | "counter": 8306674, 533 | "time": 1515337030000, 534 | "date": 1515337030000, 535 | "timeSecond": 1515337030 536 | } 537 | }, 538 | { 539 | "一般附注": [ 540 | "21世纪大学计算机系列教材" 541 | ], 542 | "storages": [ 543 | { 544 | "索书号": "TP311.5/Z011.1 ", 545 | "密集架号": "0361681 ", 546 | "条码号": "A0692967", 547 | "年卷期": " ", 548 | "校区-馆藏地": "总馆—密集库3   ", 549 | "书刊状态": "可借" 550 | }, 551 | { 552 | "索书号": "TP311.5/Z011.1 ", 553 | "密集架号": "0361680 ", 554 | "条码号": "A0692968", 555 | "年卷期": " ", 556 | "校区-馆藏地": "总馆—密集库3   ", 557 | "书刊状态": "可借" 558 | }, 559 | { 560 | "索书号": "TP311.5/Z011.1 ", 561 | "密集架号": "0361679 ", 562 | "条码号": "A0692966", 563 | "年卷期": " ", 564 | "校区-馆藏地": "总馆—密集库3   ", 565 | "书刊状态": "可借" 566 | } 567 | ], 568 | "出版发行项": [ 569 | "北京:科学出版社,2009" 570 | ], 571 | "个人责任者": [ 572 | "臧铁刚 主编" 573 | ], 574 | "ISBN及定价": [ 575 | "978-7-03-024293-8/CNY28.00" 576 | ], 577 | "载体形态项": [ 578 | "254页;26cm" 579 | ], 580 | "refresh": 1515337031.7918413, 581 | "题名/责任者": [ 582 | "软件工程/臧铁刚主编" 583 | ], 584 | "score": 7.5, 585 | "提要文摘附注": [ 586 | "本书共分10章,内容涵盖了软件工程概述、软件系统可行性研究与需求分析、软件设计技术、编码及程序设计语言、软件的技术量度及质量保障、软件测试技术、软件维护技术、软件项目管理以及新型的软件工程技术等。" 587 | ], 588 | "marc": "0000263980", 589 | "学科主题": [ 590 | "软件工程", 591 | "软件工程-高等学校-教材" 592 | ], 593 | "中图法分类号": [ 594 | "TP311.5" 595 | ], 596 | "_id": { 597 | "timestamp": 1515337031, 598 | "machineIdentifier": 2918358, 599 | "processIdentifier": 7024, 600 | "counter": 8307669, 601 | "time": 1515337031000, 602 | "date": 1515337031000, 603 | "timeSecond": 1515337031 604 | } 605 | }, 606 | { 607 | "一般附注": [ 608 | "高等职业教育特色精品课程规划教材 高等职业教育课程改革项目研究成果" 609 | ], 610 | "storages": [ 611 | { 612 | "索书号": "TP311.5/Z114 ", 613 | "密集架号": "0361703 ", 614 | "条码号": "A0754345", 615 | "年卷期": " ", 616 | "校区-馆藏地": "总馆—密集库3   ", 617 | "书刊状态": "可借" 618 | }, 619 | { 620 | "索书号": "TP311.5/Z114 ", 621 | "密集架号": "0361705 ", 622 | "条码号": "A0754346", 623 | "年卷期": " ", 624 | "校区-馆藏地": "总馆—密集库3   ", 625 | "书刊状态": "可借" 626 | }, 627 | { 628 | "索书号": "TP311.5/Z114 ", 629 | "密集架号": "0361704 ", 630 | "条码号": "A0754344", 631 | "年卷期": " ", 632 | "校区-馆藏地": "总馆—密集库3   ", 633 | "书刊状态": "可借" 634 | } 635 | ], 636 | "出版发行项": [ 637 | "北京:北京理工大学出版社,2009" 638 | ], 639 | "个人责任者": [ 640 | "张洪民 主编" 641 | ], 642 | "ISBN及定价": [ 643 | "978-7-5640-2490-1/CNY23.00" 644 | ], 645 | "载体形态项": [ 646 | "176页;26cm" 647 | ], 648 | "refresh": 1515337053.3035753, 649 | "题名/责任者": [ 650 | "软件工程/张洪民主编" 651 | ], 652 | "score": 7.5, 653 | "提要文摘附注": [ 654 | "本书分为十二章,内容包括软件工程概述、软件建模语言、软件计划、需求分析、概要设计、详细设计、编码、软件测试、软件维护、软件工程标准化和软件文档等。" 655 | ], 656 | "marc": "0000275114", 657 | "学科主题": [ 658 | "软件工程", 659 | "软件工程-高等教育-教材" 660 | ], 661 | "中图法分类号": [ 662 | "TP311.5" 663 | ], 664 | "_id": { 665 | "timestamp": 1515337053, 666 | "machineIdentifier": 2918358, 667 | "processIdentifier": 7024, 668 | "counter": 8318803, 669 | "time": 1515337053000, 670 | "date": 1515337053000, 671 | "timeSecond": 1515337053 672 | } 673 | }, 674 | { 675 | "storages": [ 676 | { 677 | "索书号": "TP311.5/Z111.4 ", 678 | "密集架号": "0361309 ", 679 | "条码号": "A0778835", 680 | "年卷期": " ", 681 | "校区-馆藏地": "总馆—密集库3   ", 682 | "书刊状态": "可借" 683 | }, 684 | { 685 | "索书号": "TP311.5/Z111.4 ", 686 | "密集架号": "0361311 ", 687 | "条码号": "A0778836", 688 | "年卷期": " ", 689 | "校区-馆藏地": "总馆—密集库3   ", 690 | "书刊状态": "可借" 691 | }, 692 | { 693 | "索书号": "TP311.5/Z111.4 ", 694 | "密集架号": "0361310 ", 695 | "条码号": "A0778834", 696 | "年卷期": " ", 697 | "校区-馆藏地": "总馆—密集库3   ", 698 | "书刊状态": "可借" 699 | } 700 | ], 701 | "出版发行项": [ 702 | "北京:清华大学出版社,2009" 703 | ], 704 | "个人责任者": [ 705 | "张海藩 编著" 706 | ], 707 | "ISBN及定价": [ 708 | "978-7-302-19812-3/CNY29.50" 709 | ], 710 | "载体形态项": [ 711 | "12,334页;26cm" 712 | ], 713 | "refresh": 1515337043.3194294, 714 | "题名/责任者": [ 715 | "软件工程/张海藩编著" 716 | ], 717 | "score": 7.5, 718 | "提要文摘附注": [ 719 | "本书系统讲述了软件工程的概念、原理和典型的方法学,并介绍了软件项目的管理技术。" 720 | ], 721 | "marc": "0000269911", 722 | "学科主题": [ 723 | "软件工程" 724 | ], 725 | "中图法分类号": [ 726 | "TP311.5" 727 | ], 728 | "_id": { 729 | "timestamp": 1515337043, 730 | "machineIdentifier": 2918358, 731 | "processIdentifier": 7024, 732 | "counter": 8313600, 733 | "time": 1515337043000, 734 | "date": 1515337043000, 735 | "timeSecond": 1515337043 736 | } 737 | } 738 | ], 739 | "totalPages": 22, 740 | "totalElements": 216, 741 | "last": false, 742 | "size": 10, 743 | "number": 2, 744 | "sort": null, 745 | "first": false, 746 | "numberOfElements": 10 747 | } -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | GNU GENERAL PUBLIC LICENSE 2 | Version 3, 29 June 2007 3 | 4 | Copyright (C) 2007 Free Software Foundation, Inc. 5 | Everyone is permitted to copy and distribute verbatim copies 6 | of this license document, but changing it is not allowed. 7 | 8 | Preamble 9 | 10 | The GNU General Public License is a free, copyleft license for 11 | software and other kinds of works. 12 | 13 | The licenses for most software and other practical works are designed 14 | to take away your freedom to share and change the works. By contrast, 15 | the GNU General Public License is intended to guarantee your freedom to 16 | share and change all versions of a program--to make sure it remains free 17 | software for all its users. We, the Free Software Foundation, use the 18 | GNU General Public License for most of our software; it applies also to 19 | any other work released this way by its authors. You can apply it to 20 | your programs, too. 21 | 22 | When we speak of free software, we are referring to freedom, not 23 | price. Our General Public Licenses are designed to make sure that you 24 | have the freedom to distribute copies of free software (and charge for 25 | them if you wish), that you receive source code or can get it if you 26 | want it, that you can change the software or use pieces of it in new 27 | free programs, and that you know you can do these things. 28 | 29 | To protect your rights, we need to prevent others from denying you 30 | these rights or asking you to surrender the rights. Therefore, you have 31 | certain responsibilities if you distribute copies of the software, or if 32 | you modify it: responsibilities to respect the freedom of others. 33 | 34 | For example, if you distribute copies of such a program, whether 35 | gratis or for a fee, you must pass on to the recipients the same 36 | freedoms that you received. You must make sure that they, too, receive 37 | or can get the source code. And you must show them these terms so they 38 | know their rights. 39 | 40 | Developers that use the GNU GPL protect your rights with two steps: 41 | (1) assert copyright on the software, and (2) offer you this License 42 | giving you legal permission to copy, distribute and/or modify it. 43 | 44 | For the developers' and authors' protection, the GPL clearly explains 45 | that there is no warranty for this free software. For both users' and 46 | authors' sake, the GPL requires that modified versions be marked as 47 | changed, so that their problems will not be attributed erroneously to 48 | authors of previous versions. 49 | 50 | Some devices are designed to deny users access to install or run 51 | modified versions of the software inside them, although the manufacturer 52 | can do so. This is fundamentally incompatible with the aim of 53 | protecting users' freedom to change the software. The systematic 54 | pattern of such abuse occurs in the area of products for individuals to 55 | use, which is precisely where it is most unacceptable. Therefore, we 56 | have designed this version of the GPL to prohibit the practice for those 57 | products. If such problems arise substantially in other domains, we 58 | stand ready to extend this provision to those domains in future versions 59 | of the GPL, as needed to protect the freedom of users. 60 | 61 | Finally, every program is threatened constantly by software patents. 62 | States should not allow patents to restrict development and use of 63 | software on general-purpose computers, but in those that do, we wish to 64 | avoid the special danger that patents applied to a free program could 65 | make it effectively proprietary. To prevent this, the GPL assures that 66 | patents cannot be used to render the program non-free. 67 | 68 | The precise terms and conditions for copying, distribution and 69 | modification follow. 70 | 71 | TERMS AND CONDITIONS 72 | 73 | 0. Definitions. 74 | 75 | "This License" refers to version 3 of the GNU General Public License. 76 | 77 | "Copyright" also means copyright-like laws that apply to other kinds of 78 | works, such as semiconductor masks. 79 | 80 | "The Program" refers to any copyrightable work licensed under this 81 | License. Each licensee is addressed as "you". "Licensees" and 82 | "recipients" may be individuals or organizations. 83 | 84 | To "modify" a work means to copy from or adapt all or part of the work 85 | in a fashion requiring copyright permission, other than the making of an 86 | exact copy. The resulting work is called a "modified version" of the 87 | earlier work or a work "based on" the earlier work. 88 | 89 | A "covered work" means either the unmodified Program or a work based 90 | on the Program. 91 | 92 | To "propagate" a work means to do anything with it that, without 93 | permission, would make you directly or secondarily liable for 94 | infringement under applicable copyright law, except executing it on a 95 | computer or modifying a private copy. Propagation includes copying, 96 | distribution (with or without modification), making available to the 97 | public, and in some countries other activities as well. 98 | 99 | To "convey" a work means any kind of propagation that enables other 100 | parties to make or receive copies. Mere interaction with a user through 101 | a computer network, with no transfer of a copy, is not conveying. 102 | 103 | An interactive user interface displays "Appropriate Legal Notices" 104 | to the extent that it includes a convenient and prominently visible 105 | feature that (1) displays an appropriate copyright notice, and (2) 106 | tells the user that there is no warranty for the work (except to the 107 | extent that warranties are provided), that licensees may convey the 108 | work under this License, and how to view a copy of this License. If 109 | the interface presents a list of user commands or options, such as a 110 | menu, a prominent item in the list meets this criterion. 111 | 112 | 1. Source Code. 113 | 114 | The "source code" for a work means the preferred form of the work 115 | for making modifications to it. "Object code" means any non-source 116 | form of a work. 117 | 118 | A "Standard Interface" means an interface that either is an official 119 | standard defined by a recognized standards body, or, in the case of 120 | interfaces specified for a particular programming language, one that 121 | is widely used among developers working in that language. 122 | 123 | The "System Libraries" of an executable work include anything, other 124 | than the work as a whole, that (a) is included in the normal form of 125 | packaging a Major Component, but which is not part of that Major 126 | Component, and (b) serves only to enable use of the work with that 127 | Major Component, or to implement a Standard Interface for which an 128 | implementation is available to the public in source code form. A 129 | "Major Component", in this context, means a major essential component 130 | (kernel, window system, and so on) of the specific operating system 131 | (if any) on which the executable work runs, or a compiler used to 132 | produce the work, or an object code interpreter used to run it. 133 | 134 | The "Corresponding Source" for a work in object code form means all 135 | the source code needed to generate, install, and (for an executable 136 | work) run the object code and to modify the work, including scripts to 137 | control those activities. However, it does not include the work's 138 | System Libraries, or general-purpose tools or generally available free 139 | programs which are used unmodified in performing those activities but 140 | which are not part of the work. For example, Corresponding Source 141 | includes interface definition files associated with source files for 142 | the work, and the source code for shared libraries and dynamically 143 | linked subprograms that the work is specifically designed to require, 144 | such as by intimate data communication or control flow between those 145 | subprograms and other parts of the work. 146 | 147 | The Corresponding Source need not include anything that users 148 | can regenerate automatically from other parts of the Corresponding 149 | Source. 150 | 151 | The Corresponding Source for a work in source code form is that 152 | same work. 153 | 154 | 2. Basic Permissions. 155 | 156 | All rights granted under this License are granted for the term of 157 | copyright on the Program, and are irrevocable provided the stated 158 | conditions are met. This License explicitly affirms your unlimited 159 | permission to run the unmodified Program. The output from running a 160 | covered work is covered by this License only if the output, given its 161 | content, constitutes a covered work. This License acknowledges your 162 | rights of fair use or other equivalent, as provided by copyright law. 163 | 164 | You may make, run and propagate covered works that you do not 165 | convey, without conditions so long as your license otherwise remains 166 | in force. You may convey covered works to others for the sole purpose 167 | of having them make modifications exclusively for you, or provide you 168 | with facilities for running those works, provided that you comply with 169 | the terms of this License in conveying all material for which you do 170 | not control copyright. Those thus making or running the covered works 171 | for you must do so exclusively on your behalf, under your direction 172 | and control, on terms that prohibit them from making any copies of 173 | your copyrighted material outside their relationship with you. 174 | 175 | Conveying under any other circumstances is permitted solely under 176 | the conditions stated below. Sublicensing is not allowed; section 10 177 | makes it unnecessary. 178 | 179 | 3. Protecting Users' Legal Rights From Anti-Circumvention Law. 180 | 181 | No covered work shall be deemed part of an effective technological 182 | measure under any applicable law fulfilling obligations under article 183 | 11 of the WIPO copyright treaty adopted on 20 December 1996, or 184 | similar laws prohibiting or restricting circumvention of such 185 | measures. 186 | 187 | When you convey a covered work, you waive any legal power to forbid 188 | circumvention of technological measures to the extent such circumvention 189 | is effected by exercising rights under this License with respect to 190 | the covered work, and you disclaim any intention to limit operation or 191 | modification of the work as a means of enforcing, against the work's 192 | users, your or third parties' legal rights to forbid circumvention of 193 | technological measures. 194 | 195 | 4. Conveying Verbatim Copies. 196 | 197 | You may convey verbatim copies of the Program's source code as you 198 | receive it, in any medium, provided that you conspicuously and 199 | appropriately publish on each copy an appropriate copyright notice; 200 | keep intact all notices stating that this License and any 201 | non-permissive terms added in accord with section 7 apply to the code; 202 | keep intact all notices of the absence of any warranty; and give all 203 | recipients a copy of this License along with the Program. 204 | 205 | You may charge any price or no price for each copy that you convey, 206 | and you may offer support or warranty protection for a fee. 207 | 208 | 5. Conveying Modified Source Versions. 209 | 210 | You may convey a work based on the Program, or the modifications to 211 | produce it from the Program, in the form of source code under the 212 | terms of section 4, provided that you also meet all of these conditions: 213 | 214 | a) The work must carry prominent notices stating that you modified 215 | it, and giving a relevant date. 216 | 217 | b) The work must carry prominent notices stating that it is 218 | released under this License and any conditions added under section 219 | 7. This requirement modifies the requirement in section 4 to 220 | "keep intact all notices". 221 | 222 | c) You must license the entire work, as a whole, under this 223 | License to anyone who comes into possession of a copy. This 224 | License will therefore apply, along with any applicable section 7 225 | additional terms, to the whole of the work, and all its parts, 226 | regardless of how they are packaged. This License gives no 227 | permission to license the work in any other way, but it does not 228 | invalidate such permission if you have separately received it. 229 | 230 | d) If the work has interactive user interfaces, each must display 231 | Appropriate Legal Notices; however, if the Program has interactive 232 | interfaces that do not display Appropriate Legal Notices, your 233 | work need not make them do so. 234 | 235 | A compilation of a covered work with other separate and independent 236 | works, which are not by their nature extensions of the covered work, 237 | and which are not combined with it such as to form a larger program, 238 | in or on a volume of a storage or distribution medium, is called an 239 | "aggregate" if the compilation and its resulting copyright are not 240 | used to limit the access or legal rights of the compilation's users 241 | beyond what the individual works permit. Inclusion of a covered work 242 | in an aggregate does not cause this License to apply to the other 243 | parts of the aggregate. 244 | 245 | 6. Conveying Non-Source Forms. 246 | 247 | You may convey a covered work in object code form under the terms 248 | of sections 4 and 5, provided that you also convey the 249 | machine-readable Corresponding Source under the terms of this License, 250 | in one of these ways: 251 | 252 | a) Convey the object code in, or embodied in, a physical product 253 | (including a physical distribution medium), accompanied by the 254 | Corresponding Source fixed on a durable physical medium 255 | customarily used for software interchange. 256 | 257 | b) Convey the object code in, or embodied in, a physical product 258 | (including a physical distribution medium), accompanied by a 259 | written offer, valid for at least three years and valid for as 260 | long as you offer spare parts or customer support for that product 261 | model, to give anyone who possesses the object code either (1) a 262 | copy of the Corresponding Source for all the software in the 263 | product that is covered by this License, on a durable physical 264 | medium customarily used for software interchange, for a price no 265 | more than your reasonable cost of physically performing this 266 | conveying of source, or (2) access to copy the 267 | Corresponding Source from a network server at no charge. 268 | 269 | c) Convey individual copies of the object code with a copy of the 270 | written offer to provide the Corresponding Source. This 271 | alternative is allowed only occasionally and noncommercially, and 272 | only if you received the object code with such an offer, in accord 273 | with subsection 6b. 274 | 275 | d) Convey the object code by offering access from a designated 276 | place (gratis or for a charge), and offer equivalent access to the 277 | Corresponding Source in the same way through the same place at no 278 | further charge. You need not require recipients to copy the 279 | Corresponding Source along with the object code. If the place to 280 | copy the object code is a network server, the Corresponding Source 281 | may be on a different server (operated by you or a third party) 282 | that supports equivalent copying facilities, provided you maintain 283 | clear directions next to the object code saying where to find the 284 | Corresponding Source. Regardless of what server hosts the 285 | Corresponding Source, you remain obligated to ensure that it is 286 | available for as long as needed to satisfy these requirements. 287 | 288 | e) Convey the object code using peer-to-peer transmission, provided 289 | you inform other peers where the object code and Corresponding 290 | Source of the work are being offered to the general public at no 291 | charge under subsection 6d. 292 | 293 | A separable portion of the object code, whose source code is excluded 294 | from the Corresponding Source as a System Library, need not be 295 | included in conveying the object code work. 296 | 297 | A "User Product" is either (1) a "consumer product", which means any 298 | tangible personal property which is normally used for personal, family, 299 | or household purposes, or (2) anything designed or sold for incorporation 300 | into a dwelling. In determining whether a product is a consumer product, 301 | doubtful cases shall be resolved in favor of coverage. For a particular 302 | product received by a particular user, "normally used" refers to a 303 | typical or common use of that class of product, regardless of the status 304 | of the particular user or of the way in which the particular user 305 | actually uses, or expects or is expected to use, the product. A product 306 | is a consumer product regardless of whether the product has substantial 307 | commercial, industrial or non-consumer uses, unless such uses represent 308 | the only significant mode of use of the product. 309 | 310 | "Installation Information" for a User Product means any methods, 311 | procedures, authorization keys, or other information required to install 312 | and execute modified versions of a covered work in that User Product from 313 | a modified version of its Corresponding Source. The information must 314 | suffice to ensure that the continued functioning of the modified object 315 | code is in no case prevented or interfered with solely because 316 | modification has been made. 317 | 318 | If you convey an object code work under this section in, or with, or 319 | specifically for use in, a User Product, and the conveying occurs as 320 | part of a transaction in which the right of possession and use of the 321 | User Product is transferred to the recipient in perpetuity or for a 322 | fixed term (regardless of how the transaction is characterized), the 323 | Corresponding Source conveyed under this section must be accompanied 324 | by the Installation Information. But this requirement does not apply 325 | if neither you nor any third party retains the ability to install 326 | modified object code on the User Product (for example, the work has 327 | been installed in ROM). 328 | 329 | The requirement to provide Installation Information does not include a 330 | requirement to continue to provide support service, warranty, or updates 331 | for a work that has been modified or installed by the recipient, or for 332 | the User Product in which it has been modified or installed. Access to a 333 | network may be denied when the modification itself materially and 334 | adversely affects the operation of the network or violates the rules and 335 | protocols for communication across the network. 336 | 337 | Corresponding Source conveyed, and Installation Information provided, 338 | in accord with this section must be in a format that is publicly 339 | documented (and with an implementation available to the public in 340 | source code form), and must require no special password or key for 341 | unpacking, reading or copying. 342 | 343 | 7. Additional Terms. 344 | 345 | "Additional permissions" are terms that supplement the terms of this 346 | License by making exceptions from one or more of its conditions. 347 | Additional permissions that are applicable to the entire Program shall 348 | be treated as though they were included in this License, to the extent 349 | that they are valid under applicable law. If additional permissions 350 | apply only to part of the Program, that part may be used separately 351 | under those permissions, but the entire Program remains governed by 352 | this License without regard to the additional permissions. 353 | 354 | When you convey a copy of a covered work, you may at your option 355 | remove any additional permissions from that copy, or from any part of 356 | it. (Additional permissions may be written to require their own 357 | removal in certain cases when you modify the work.) You may place 358 | additional permissions on material, added by you to a covered work, 359 | for which you have or can give appropriate copyright permission. 360 | 361 | Notwithstanding any other provision of this License, for material you 362 | add to a covered work, you may (if authorized by the copyright holders of 363 | that material) supplement the terms of this License with terms: 364 | 365 | a) Disclaiming warranty or limiting liability differently from the 366 | terms of sections 15 and 16 of this License; or 367 | 368 | b) Requiring preservation of specified reasonable legal notices or 369 | author attributions in that material or in the Appropriate Legal 370 | Notices displayed by works containing it; or 371 | 372 | c) Prohibiting misrepresentation of the origin of that material, or 373 | requiring that modified versions of such material be marked in 374 | reasonable ways as different from the original version; or 375 | 376 | d) Limiting the use for publicity purposes of names of licensors or 377 | authors of the material; or 378 | 379 | e) Declining to grant rights under trademark law for use of some 380 | trade names, trademarks, or service marks; or 381 | 382 | f) Requiring indemnification of licensors and authors of that 383 | material by anyone who conveys the material (or modified versions of 384 | it) with contractual assumptions of liability to the recipient, for 385 | any liability that these contractual assumptions directly impose on 386 | those licensors and authors. 387 | 388 | All other non-permissive additional terms are considered "further 389 | restrictions" within the meaning of section 10. If the Program as you 390 | received it, or any part of it, contains a notice stating that it is 391 | governed by this License along with a term that is a further 392 | restriction, you may remove that term. If a license document contains 393 | a further restriction but permits relicensing or conveying under this 394 | License, you may add to a covered work material governed by the terms 395 | of that license document, provided that the further restriction does 396 | not survive such relicensing or conveying. 397 | 398 | If you add terms to a covered work in accord with this section, you 399 | must place, in the relevant source files, a statement of the 400 | additional terms that apply to those files, or a notice indicating 401 | where to find the applicable terms. 402 | 403 | Additional terms, permissive or non-permissive, may be stated in the 404 | form of a separately written license, or stated as exceptions; 405 | the above requirements apply either way. 406 | 407 | 8. Termination. 408 | 409 | You may not propagate or modify a covered work except as expressly 410 | provided under this License. Any attempt otherwise to propagate or 411 | modify it is void, and will automatically terminate your rights under 412 | this License (including any patent licenses granted under the third 413 | paragraph of section 11). 414 | 415 | However, if you cease all violation of this License, then your 416 | license from a particular copyright holder is reinstated (a) 417 | provisionally, unless and until the copyright holder explicitly and 418 | finally terminates your license, and (b) permanently, if the copyright 419 | holder fails to notify you of the violation by some reasonable means 420 | prior to 60 days after the cessation. 421 | 422 | Moreover, your license from a particular copyright holder is 423 | reinstated permanently if the copyright holder notifies you of the 424 | violation by some reasonable means, this is the first time you have 425 | received notice of violation of this License (for any work) from that 426 | copyright holder, and you cure the violation prior to 30 days after 427 | your receipt of the notice. 428 | 429 | Termination of your rights under this section does not terminate the 430 | licenses of parties who have received copies or rights from you under 431 | this License. If your rights have been terminated and not permanently 432 | reinstated, you do not qualify to receive new licenses for the same 433 | material under section 10. 434 | 435 | 9. Acceptance Not Required for Having Copies. 436 | 437 | You are not required to accept this License in order to receive or 438 | run a copy of the Program. Ancillary propagation of a covered work 439 | occurring solely as a consequence of using peer-to-peer transmission 440 | to receive a copy likewise does not require acceptance. However, 441 | nothing other than this License grants you permission to propagate or 442 | modify any covered work. These actions infringe copyright if you do 443 | not accept this License. Therefore, by modifying or propagating a 444 | covered work, you indicate your acceptance of this License to do so. 445 | 446 | 10. Automatic Licensing of Downstream Recipients. 447 | 448 | Each time you convey a covered work, the recipient automatically 449 | receives a license from the original licensors, to run, modify and 450 | propagate that work, subject to this License. You are not responsible 451 | for enforcing compliance by third parties with this License. 452 | 453 | An "entity transaction" is a transaction transferring control of an 454 | organization, or substantially all assets of one, or subdividing an 455 | organization, or merging organizations. If propagation of a covered 456 | work results from an entity transaction, each party to that 457 | transaction who receives a copy of the work also receives whatever 458 | licenses to the work the party's predecessor in interest had or could 459 | give under the previous paragraph, plus a right to possession of the 460 | Corresponding Source of the work from the predecessor in interest, if 461 | the predecessor has it or can get it with reasonable efforts. 462 | 463 | You may not impose any further restrictions on the exercise of the 464 | rights granted or affirmed under this License. For example, you may 465 | not impose a license fee, royalty, or other charge for exercise of 466 | rights granted under this License, and you may not initiate litigation 467 | (including a cross-claim or counterclaim in a lawsuit) alleging that 468 | any patent claim is infringed by making, using, selling, offering for 469 | sale, or importing the Program or any portion of it. 470 | 471 | 11. Patents. 472 | 473 | A "contributor" is a copyright holder who authorizes use under this 474 | License of the Program or a work on which the Program is based. The 475 | work thus licensed is called the contributor's "contributor version". 476 | 477 | A contributor's "essential patent claims" are all patent claims 478 | owned or controlled by the contributor, whether already acquired or 479 | hereafter acquired, that would be infringed by some manner, permitted 480 | by this License, of making, using, or selling its contributor version, 481 | but do not include claims that would be infringed only as a 482 | consequence of further modification of the contributor version. For 483 | purposes of this definition, "control" includes the right to grant 484 | patent sublicenses in a manner consistent with the requirements of 485 | this License. 486 | 487 | Each contributor grants you a non-exclusive, worldwide, royalty-free 488 | patent license under the contributor's essential patent claims, to 489 | make, use, sell, offer for sale, import and otherwise run, modify and 490 | propagate the contents of its contributor version. 491 | 492 | In the following three paragraphs, a "patent license" is any express 493 | agreement or commitment, however denominated, not to enforce a patent 494 | (such as an express permission to practice a patent or covenant not to 495 | sue for patent infringement). To "grant" such a patent license to a 496 | party means to make such an agreement or commitment not to enforce a 497 | patent against the party. 498 | 499 | If you convey a covered work, knowingly relying on a patent license, 500 | and the Corresponding Source of the work is not available for anyone 501 | to copy, free of charge and under the terms of this License, through a 502 | publicly available network server or other readily accessible means, 503 | then you must either (1) cause the Corresponding Source to be so 504 | available, or (2) arrange to deprive yourself of the benefit of the 505 | patent license for this particular work, or (3) arrange, in a manner 506 | consistent with the requirements of this License, to extend the patent 507 | license to downstream recipients. "Knowingly relying" means you have 508 | actual knowledge that, but for the patent license, your conveying the 509 | covered work in a country, or your recipient's use of the covered work 510 | in a country, would infringe one or more identifiable patents in that 511 | country that you have reason to believe are valid. 512 | 513 | If, pursuant to or in connection with a single transaction or 514 | arrangement, you convey, or propagate by procuring conveyance of, a 515 | covered work, and grant a patent license to some of the parties 516 | receiving the covered work authorizing them to use, propagate, modify 517 | or convey a specific copy of the covered work, then the patent license 518 | you grant is automatically extended to all recipients of the covered 519 | work and works based on it. 520 | 521 | A patent license is "discriminatory" if it does not include within 522 | the scope of its coverage, prohibits the exercise of, or is 523 | conditioned on the non-exercise of one or more of the rights that are 524 | specifically granted under this License. You may not convey a covered 525 | work if you are a party to an arrangement with a third party that is 526 | in the business of distributing software, under which you make payment 527 | to the third party based on the extent of your activity of conveying 528 | the work, and under which the third party grants, to any of the 529 | parties who would receive the covered work from you, a discriminatory 530 | patent license (a) in connection with copies of the covered work 531 | conveyed by you (or copies made from those copies), or (b) primarily 532 | for and in connection with specific products or compilations that 533 | contain the covered work, unless you entered into that arrangement, 534 | or that patent license was granted, prior to 28 March 2007. 535 | 536 | Nothing in this License shall be construed as excluding or limiting 537 | any implied license or other defenses to infringement that may 538 | otherwise be available to you under applicable patent law. 539 | 540 | 12. No Surrender of Others' Freedom. 541 | 542 | If conditions are imposed on you (whether by court order, agreement or 543 | otherwise) that contradict the conditions of this License, they do not 544 | excuse you from the conditions of this License. If you cannot convey a 545 | covered work so as to satisfy simultaneously your obligations under this 546 | License and any other pertinent obligations, then as a consequence you may 547 | not convey it at all. For example, if you agree to terms that obligate you 548 | to collect a royalty for further conveying from those to whom you convey 549 | the Program, the only way you could satisfy both those terms and this 550 | License would be to refrain entirely from conveying the Program. 551 | 552 | 13. Use with the GNU Affero General Public License. 553 | 554 | Notwithstanding any other provision of this License, you have 555 | permission to link or combine any covered work with a work licensed 556 | under version 3 of the GNU Affero General Public License into a single 557 | combined work, and to convey the resulting work. The terms of this 558 | License will continue to apply to the part which is the covered work, 559 | but the special requirements of the GNU Affero General Public License, 560 | section 13, concerning interaction through a network will apply to the 561 | combination as such. 562 | 563 | 14. Revised Versions of this License. 564 | 565 | The Free Software Foundation may publish revised and/or new versions of 566 | the GNU General Public License from time to time. Such new versions will 567 | be similar in spirit to the present version, but may differ in detail to 568 | address new problems or concerns. 569 | 570 | Each version is given a distinguishing version number. If the 571 | Program specifies that a certain numbered version of the GNU General 572 | Public License "or any later version" applies to it, you have the 573 | option of following the terms and conditions either of that numbered 574 | version or of any later version published by the Free Software 575 | Foundation. If the Program does not specify a version number of the 576 | GNU General Public License, you may choose any version ever published 577 | by the Free Software Foundation. 578 | 579 | If the Program specifies that a proxy can decide which future 580 | versions of the GNU General Public License can be used, that proxy's 581 | public statement of acceptance of a version permanently authorizes you 582 | to choose that version for the Program. 583 | 584 | Later license versions may give you additional or different 585 | permissions. However, no additional obligations are imposed on any 586 | author or copyright holder as a result of your choosing to follow a 587 | later version. 588 | 589 | 15. Disclaimer of Warranty. 590 | 591 | THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY 592 | APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT 593 | HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY 594 | OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, 595 | THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 596 | PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM 597 | IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF 598 | ALL NECESSARY SERVICING, REPAIR OR CORRECTION. 599 | 600 | 16. Limitation of Liability. 601 | 602 | IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING 603 | WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS 604 | THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY 605 | GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE 606 | USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF 607 | DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD 608 | PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), 609 | EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF 610 | SUCH DAMAGES. 611 | 612 | 17. Interpretation of Sections 15 and 16. 613 | 614 | If the disclaimer of warranty and limitation of liability provided 615 | above cannot be given local legal effect according to their terms, 616 | reviewing courts shall apply local law that most closely approximates 617 | an absolute waiver of all civil liability in connection with the 618 | Program, unless a warranty or assumption of liability accompanies a 619 | copy of the Program in return for a fee. 620 | 621 | END OF TERMS AND CONDITIONS 622 | 623 | How to Apply These Terms to Your New Programs 624 | 625 | If you develop a new program, and you want it to be of the greatest 626 | possible use to the public, the best way to achieve this is to make it 627 | free software which everyone can redistribute and change under these terms. 628 | 629 | To do so, attach the following notices to the program. It is safest 630 | to attach them to the start of each source file to most effectively 631 | state the exclusion of warranty; and each file should have at least 632 | the "copyright" line and a pointer to where the full notice is found. 633 | 634 | {one line to give the program's name and a brief idea of what it does.} 635 | Copyright (C) {year} {name of author} 636 | 637 | This program is free software: you can redistribute it and/or modify 638 | it under the terms of the GNU General Public License as published by 639 | the Free Software Foundation, either version 3 of the License, or 640 | (at your option) any later version. 641 | 642 | This program is distributed in the hope that it will be useful, 643 | but WITHOUT ANY WARRANTY; without even the implied warranty of 644 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 645 | GNU General Public License for more details. 646 | 647 | You should have received a copy of the GNU General Public License 648 | along with this program. If not, see . 649 | 650 | Also add information on how to contact you by electronic and paper mail. 651 | 652 | If the program does terminal interaction, make it output a short 653 | notice like this when it starts in an interactive mode: 654 | 655 | {project} Copyright (C) {year} {fullname} 656 | This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'. 657 | This is free software, and you are welcome to redistribute it 658 | under certain conditions; type `show c' for details. 659 | 660 | The hypothetical commands `show w' and `show c' should show the appropriate 661 | parts of the General Public License. Of course, your program's commands 662 | might be different; for a GUI interface, you would use an "about box". 663 | 664 | You should also get your employer (if you work as a programmer) or school, 665 | if any, to sign a "copyright disclaimer" for the program, if necessary. 666 | For more information on this, and how to apply and follow the GNU GPL, see 667 | . 668 | 669 | The GNU General Public License does not permit incorporating your program 670 | into proprietary programs. If your program is a subroutine library, you 671 | may consider it more useful to permit linking proprietary applications with 672 | the library. If this is what you want to do, use the GNU Lesser General 673 | Public License instead of this License. But first, please read 674 | . 675 | -------------------------------------------------------------------------------- /dist/scripts/polyfill.js: -------------------------------------------------------------------------------- 1 | (function _(c,e,t){function r(i,o){if(!e[i]){if(!c[i]){var n=typeof require=="function"&&require;if(!o&&n)return n(i,!0);if(s)return s(i,!0);var a=new Error("Cannot find module '"+i+"'");throw a.code="MODULE_NOT_FOUND",a;}var p=e[i]={exports:{}};c[i][0].call(p.exports,function(t){var e=c[i][1][t];return r(e?e:t);},p,p.exports,_,c,e,t);}return e[i].exports;}for(var s=typeof require=="function"&&require,i=0;ia){c=_[a++];if(c!=c)return true;}else for(;l>a;a++)if(e||a in _){if(_[a]===o)return e||a||0;}return!e&&-1;};};},{"./_to-absolute-index":81,"./_to-iobject":83,"./_to-length":84}],14:[function(e,t,o){var s=e('./_cof'),r=e('./_wks')('toStringTag'),i=s(function(){return arguments;}())=='Arguments',n=function(e,t){try{return e[t];}catch(t){}};t.exports=function(e){var t,o,_;return e===undefined?'Undefined':e===null?'Null':typeof(o=n(t=Object(e),r))=='string'?o:i?s(t):(_=s(t))=='Object'&&typeof t.callee=='function'?'Arguments':_;};},{"./_cof":15,"./_wks":91}],15:[function(e,t,o){var s={}.toString;t.exports=function(e){return s.call(e).slice(8,-1);};},{}],16:[function(e,t,o){'use strict';var s=e('./_object-dp').f,r=e('./_object-create'),i=e('./_redefine-all'),n=e('./_ctx'),_=e('./_an-instance'),l=e('./_for-of'),a=e('./_iter-define'),c=e('./_iter-step'),p=e('./_set-species'),d=e('./_descriptors'),f=e('./_meta').fastKey,u=e('./_validate-collection'),m=d?'_s':'size',b=function(e,t){var o=f(t),s;if(o!=='F')return e._i[o];for(s=e._f;s;s=s.n){if(s.k==t)return s;}};t.exports={getConstructor:function(e,t,o,a){var c=e(function(e,s){_(e,c,t,'_i');e._t=t;e._i=r(null);e._f=undefined;e._l=undefined;e[m]=0;if(s!=undefined)l(s,o,e[a],e);});i(c.prototype,{clear:function e(){for(var o=u(this,t),s=o._i,r=o._f;r;r=r.n){r.r=true;if(r.p)r.p=r.p.n=undefined;delete s[r.i];}o._f=o._l=undefined;o[m]=0;},'delete':function(e){var o=u(this,t),s=b(o,e);if(s){var r=s.n,i=s.p;delete o._i[s.i];s.r=true;if(i)i.n=r;if(r)r.p=i;if(o._f==s)o._f=r;if(o._l==s)o._l=i;o[m]--;}return!!s;},forEach:function e(o){u(this,t);var s=n(o,arguments.length>1?arguments[1]:undefined,3),r;while(r=r?r.n:this._f){s(r.v,r.k,this);while(r&&r.r)r=r.p;}},has:function e(o){return!!b(u(this,t),o);}});if(d)s(c.prototype,'size',{get:function(){return u(this,t)[m];}});return c;},def:function(e,t,o){var s=b(e,t),r,i;if(s){s.v=o;}else{e._l=s={i:i=f(t,true),k:t,v:o,p:r=e._l,n:undefined,r:false};if(!e._f)e._f=s;if(r)r.n=s;e[m]++;if(i!=='F')e._i[i]=s;}return e;},getEntry:b,setStrong:function(e,t,o){a(e,t,function(e,o){this._t=u(e,t);this._k=o;this._l=undefined;},function(){var e=this,t=e._k,o=e._l;while(o&&o.r)o=o.p;if(!e._t||!(e._l=o=o?o.n:e._t._f)){e._t=undefined;return c(1);}if(t=='keys')return c(0,o.k);if(t=='values')return c(0,o.v);return c(0,[o.k,o.v]);},o?'entries':'values',!o,true);p(t);}};},{"./_an-instance":10,"./_ctx":20,"./_descriptors":22,"./_for-of":29,"./_iter-define":44,"./_iter-step":46,"./_meta":49,"./_object-create":52,"./_object-dp":53,"./_redefine-all":66,"./_set-species":71,"./_validate-collection":88}],17:[function(e,t,o){var s=e('./_classof'),r=e('./_array-from-iterable');t.exports=function(e){return function t(){if(s(this)!=e)throw TypeError(e+"#toJSON isn't generic");return r(this);};};},{"./_array-from-iterable":12,"./_classof":14}],18:[function(e,t,o){'use strict';var s=e('./_global'),r=e('./_export'),i=e('./_redefine'),n=e('./_redefine-all'),_=e('./_meta'),l=e('./_for-of'),a=e('./_an-instance'),c=e('./_is-object'),p=e('./_fails'),d=e('./_iter-detect'),f=e('./_set-to-string-tag'),u=e('./_inherit-if-required');t.exports=function(e,t,o,m,b,g){var y=s[e],h=y,x=b?'set':'add',j=h&&h.prototype,k={},S=function(e){var t=j[e];i(j,e,e=='delete'?function(e){return g&&!c(e)?false:t.call(this,e===0?0:e);}:e=='has'?function e(o){return g&&!c(o)?false:t.call(this,o===0?0:o);}:e=='get'?function e(o){return g&&!c(o)?undefined:t.call(this,o===0?0:o);}:e=='add'?function e(o){t.call(this,o===0?0:o);return this;}:function e(o,s){t.call(this,o===0?0:o,s);return this;});};if(typeof h!='function'||!(g||j.forEach&&!p(function(){new h().entries().next();}))){h=m.getConstructor(t,e,b,x);n(h.prototype,o);_.NEED=true;}else{var E=new h(),w=E[x](g?{}:-0,1)!=E,v=p(function(){E.has(1);}),T=d(function(e){new h(e);}),O=!g&&p(function(){var e=new h(),t=5;while(t--)e[x](t,t);return!e.has(-0);});if(!T){h=t(function(t,o){a(t,h,e);var s=u(new y(),t,h);if(o!=undefined)l(o,b,s[x],s);return s;});h.prototype=j;j.constructor=h;}if(v||O){S('delete');S('has');b&&S('get');}if(O||w)S(x);if(g&&j.clear)delete j.clear;}f(h,e);k[e]=h;r(r.G+r.W+r.F*(h!=y),k);if(!g)m.setStrong(h,e,b);return h;};},{"./_an-instance":10,"./_export":26,"./_fails":28,"./_for-of":29,"./_global":30,"./_inherit-if-required":35,"./_is-object":40,"./_iter-detect":45,"./_meta":49,"./_redefine":67,"./_redefine-all":66,"./_set-to-string-tag":72}],19:[function(e,t,o){var s=t.exports={version:'2.5.3'};if(typeof __e=='number')__e=s;},{}],20:[function(e,t,o){var s=e('./_a-function');t.exports=function(e,t,o){s(e);if(t===undefined)return e;switch(o){case 1:return function(o){return e.call(t,o);};case 2:return function(o,s){return e.call(t,o,s);};case 3:return function(o,s,r){return e.call(t,o,s,r);};}return function(){return e.apply(t,arguments);};};},{"./_a-function":8}],21:[function(e,t,o){t.exports=function(e){if(e==undefined)throw TypeError("Can't call method on "+e);return e;};},{}],22:[function(e,t,o){t.exports=!e('./_fails')(function(){return Object.defineProperty({},'a',{get:function(){return 7;}}).a!=7;});},{"./_fails":28}],23:[function(e,t,o){var s=e('./_is-object'),r=e('./_global').document,i=s(r)&&s(r.createElement);t.exports=function(e){return i?r.createElement(e):{};};},{"./_global":30,"./_is-object":40}],24:[function(e,t,o){t.exports='constructor,hasOwnProperty,isPrototypeOf,propertyIsEnumerable,toLocaleString,toString,valueOf'.split(',');},{}],25:[function(e,t,o){var s=e('./_object-keys'),r=e('./_object-gops'),n=e('./_object-pie');t.exports=function(e){var t=s(e),o=r.f;if(o){var _=o(e),l=n.f,a=0,i;while(_.length>a)if(l.call(e,i=_[a++]))t.push(i);}return t;};},{"./_object-gops":58,"./_object-keys":61,"./_object-pie":62}],26:[function(e,t,o){var s=e('./_global'),r=e('./_core'),i=e('./_hide'),n=e('./_redefine'),_=e('./_ctx'),l='prototype',a=function(e,t,o){var c=e&a.F,p=e&a.G,d=e&a.S,f=e&a.P,u=e&a.B,m=p?s:d?s[t]||(s[t]={}):(s[t]||{})[l],b=p?r:r[t]||(r[t]={}),g=b[l]||(b[l]={}),y,h,x,j;if(p)o=t;for(y in o){h=!c&&m&&m[y]!==undefined;x=(h?m:o)[y];j=u&&h?_(x,s):f&&typeof x=='function'?_(Function.call,x):x;if(m)n(m,y,x,e&a.U);if(b[y]!=x)i(b,y,j);if(f&&g[y]!=x)g[y]=x;}};s.core=r;a.F=1;a.G=2;a.S=4;a.P=8;a.B=16;a.W=32;a.U=64;a.R=128;t.exports=a;},{"./_core":19,"./_ctx":20,"./_global":30,"./_hide":32,"./_redefine":67}],27:[function(e,t,o){var s=e('./_wks')('match');t.exports=function(e){var t=/./;try{'/./'[e](t);}catch(o){try{t[s]=false;return!'/./'[e](t);}catch(e){}}return true;};},{"./_wks":91}],28:[function(e,t,o){t.exports=function(e){try{return!!e();}catch(t){return true;}};},{}],29:[function(e,t,o){var s=e('./_ctx'),r=e('./_iter-call'),i=e('./_is-array-iter'),n=e('./_an-object'),_=e('./_to-length'),l=e('./core.get-iterator-method'),a={},c={},o=t.exports=function(e,t,o,p,d){var u=d?function(){return e;}:l(e),m=s(o,p,t?2:1),f=0,b,g,y,h;if(typeof u!='function')throw TypeError(e+' is not iterable!');if(i(u))for(b=_(e.length);b>f;f++){h=t?m(n(g=e[f])[0],g[1]):m(e[f]);if(h===a||h===c)return h;}else for(y=u.call(e);!(g=y.next()).done;){h=r(y,m,g.value,t);if(h===a||h===c)return h;}};o.BREAK=a;o.RETURN=c;},{"./_an-object":11,"./_ctx":20,"./_is-array-iter":38,"./_iter-call":42,"./_to-length":84,"./core.get-iterator-method":92}],30:[function(e,t,o){var s=t.exports=typeof window!='undefined'&&window.Math==Math?window:typeof self!='undefined'&&self.Math==Math?self:Function('return this')();if(typeof __g=='number')__g=s;},{}],31:[function(e,t,o){var s={}.hasOwnProperty;t.exports=function(e,t){return s.call(e,t);};},{}],32:[function(e,t,o){var s=e('./_object-dp'),r=e('./_property-desc');t.exports=e('./_descriptors')?function(e,t,o){return s.f(e,t,r(1,o));}:function(e,t,o){e[t]=o;return e;};},{"./_descriptors":22,"./_object-dp":53,"./_property-desc":65}],33:[function(e,t,o){var s=e('./_global').document;t.exports=s&&s.documentElement;},{"./_global":30}],34:[function(e,t,o){t.exports=!e('./_descriptors')&&!e('./_fails')(function(){return Object.defineProperty(e('./_dom-create')('div'),'a',{get:function(){return 7;}}).a!=7;});},{"./_descriptors":22,"./_dom-create":23,"./_fails":28}],35:[function(e,t,o){var s=e('./_is-object'),r=e('./_set-proto').set;t.exports=function(e,t,o){var i=t.constructor,n;if(i!==o&&typeof i=='function'&&(n=i.prototype)!==o.prototype&&s(n)&&r){r(e,n);}return e;};},{"./_is-object":40,"./_set-proto":70}],36:[function(e,t,o){t.exports=function(e,t,o){var s=o===undefined;switch(t.length){case 0:return s?e():e.call(o);case 1:return s?e(t[0]):e.call(o,t[0]);case 2:return s?e(t[0],t[1]):e.call(o,t[0],t[1]);case 3:return s?e(t[0],t[1],t[2]):e.call(o,t[0],t[1],t[2]);case 4:return s?e(t[0],t[1],t[2],t[3]):e.call(o,t[0],t[1],t[2],t[3]);}return e.apply(o,t);};},{}],37:[function(e,t,o){var s=e('./_cof');t.exports=Object('z').propertyIsEnumerable(0)?Object:function(e){return s(e)=='String'?e.split(''):Object(e);};},{"./_cof":15}],38:[function(e,t,o){var s=e('./_iterators'),r=e('./_wks')('iterator'),i=Array.prototype;t.exports=function(e){return e!==undefined&&(s.Array===e||i[r]===e);};},{"./_iterators":47,"./_wks":91}],39:[function(e,t,o){var s=e('./_cof');t.exports=Array.isArray||function e(t){return s(t)=='Array';};},{"./_cof":15}],40:[function(e,t,o){t.exports=function(e){return typeof e==='object'?e!==null:typeof e==='function';};},{}],41:[function(e,t,o){var s=e('./_is-object'),r=e('./_cof'),i=e('./_wks')('match');t.exports=function(e){var t;return s(e)&&((t=e[i])!==undefined?!!t:r(e)=='RegExp');};},{"./_cof":15,"./_is-object":40,"./_wks":91}],42:[function(e,t,o){var s=e('./_an-object');t.exports=function(t,e,o,r){try{return r?e(s(o)[0],o[1]):e(o);}catch(o){var i=t['return'];if(i!==undefined)s(i.call(t));throw o;}};},{"./_an-object":11}],43:[function(e,t,o){'use strict';var s=e('./_object-create'),r=e('./_property-desc'),i=e('./_set-to-string-tag'),n={};e('./_hide')(n,e('./_wks')('iterator'),function(){return this;});t.exports=function(e,t,o){e.prototype=s(n,{next:r(1,o)});i(e,t+' Iterator');};},{"./_hide":32,"./_object-create":52,"./_property-desc":65,"./_set-to-string-tag":72,"./_wks":91}],44:[function(e,t,o){'use strict';var s=e('./_library'),r=e('./_export'),i=e('./_redefine'),n=e('./_hide'),_=e('./_has'),l=e('./_iterators'),a=e('./_iter-create'),c=e('./_set-to-string-tag'),p=e('./_object-gpo'),d=e('./_wks')('iterator'),f=!([].keys&&'next'in[].keys()),u='@@iterator',m='keys',b='values',g=function(){return this;};t.exports=function(e,t,o,y,h,x,j){a(o,t,y);var k=function(e){if(!f&&e in v)return v[e];switch(e){case m:return function t(){return new o(this,e);};case b:return function t(){return new o(this,e);};}return function t(){return new o(this,e);};},S=t+' Iterator',E=h==b,w=false,v=e.prototype,T=v[d]||v[u]||h&&v[h],O=!f&&T||k(h),P=h?!E?O:k('entries'):undefined,R=t=='Array'?v.entries||T:T,A,I,N;if(R){N=p(R.call(new e()));if(N!==Object.prototype&&N.next){c(N,S,true);if(!s&&!_(N,d))n(N,d,g);}}if(E&&T&&T.name!==b){w=true;O=function e(){return T.call(this);};}if((!s||j)&&(f||w||!v[d])){n(v,d,O);}l[t]=O;l[S]=g;if(h){A={values:E?O:k(b),keys:x?O:k(m),entries:P};if(j)for(I in A){if(!(I in v))i(v,I,A[I]);}else r(r.P+r.F*(f||w),t,A);}return A;};},{"./_export":26,"./_has":31,"./_hide":32,"./_iter-create":43,"./_iterators":47,"./_library":48,"./_object-gpo":59,"./_redefine":67,"./_set-to-string-tag":72,"./_wks":91}],45:[function(e,t,o){var s=e('./_wks')('iterator'),r=false;try{var i=[7][s]();i['return']=function(){r=true;};Array.from(i,function(){throw 2;});}catch(t){}t.exports=function(e,t){if(!t&&!r)return false;var o=false;try{var i=[7],n=i[s]();n.next=function(){return{done:o=true};};i[s]=function(){return n;};e(i);}catch(t){}return o;};},{"./_wks":91}],46:[function(e,t,o){t.exports=function(e,t){return{value:t,done:!!e};};},{}],47:[function(e,t,o){t.exports={};},{}],48:[function(e,t,o){t.exports=false;},{}],49:[function(e,t,o){var s=e('./_uid')('meta'),r=e('./_is-object'),i=e('./_has'),n=e('./_object-dp').f,_=0,l=Object.isExtensible||function(){return true;},a=!e('./_fails')(function(){return l(Object.preventExtensions({}));}),c=function(e){n(e,s,{value:{i:'O'+ ++_,w:{}}});},p=function(e,t){if(!r(e))return typeof e=='symbol'?e:(typeof e=='string'?'S':'P')+e;if(!i(e,s)){if(!l(e))return'F';if(!t)return'E';c(e);}return e[s].i;},d=function(e,t){if(!i(e,s)){if(!l(e))return true;if(!t)return false;c(e);}return e[s].w;},f=function(e){if(a&&u.NEED&&l(e)&&!i(e,s))c(e);return e;},u=t.exports={KEY:s,NEED:false,fastKey:p,getWeak:d,onFreeze:f};},{"./_fails":28,"./_has":31,"./_is-object":40,"./_object-dp":53,"./_uid":87}],50:[function(e,t,o){var s=e('./_global'),r=e('./_task').set,i=s.MutationObserver||s.WebKitMutationObserver,n=s.process,_=s.Promise,l=e('./_cof')(n)=='process';t.exports=function(){var t,o,a,e=function(){var e,s;if(l&&(e=n.domain))e.exit();while(t){s=t.fn;t=t.next;try{s();}catch(s){if(t)a();else o=undefined;throw s;}}o=undefined;if(e)e.enter();};if(l){a=function(){n.nextTick(e);};}else if(i&&!(s.navigator&&s.navigator.standalone)){var c=true,p=document.createTextNode('');new i(e).observe(p,{characterData:true});a=function(){p.data=c=!c;};}else if(_&&_.resolve){var d=_.resolve();a=function(){d.then(e);};}else{a=function(){r.call(s,e);};}return function(e){var s={fn:e,next:undefined};if(o)o.next=s;if(!t){t=s;a();}o=s;};};},{"./_cof":15,"./_global":30,"./_task":80}],51:[function(e,t,o){'use strict';var r=e('./_a-function');function s(e){var t,o;this.promise=new e(function(e,s){if(t!==undefined||o!==undefined)throw TypeError('Bad Promise constructor');t=e;o=s;});this.resolve=r(t);this.reject=r(o);}t.exports.f=function(e){return new s(e);};},{"./_a-function":8}],52:[function(e,t,o){var s=e('./_an-object'),r=e('./_object-dps'),n=e('./_enum-bug-keys'),i=e('./_shared-key')('IE_PROTO'),_=function(){},l='prototype',a=function(){var t=e('./_dom-create')('iframe'),o=n.length,s='<',r='>',i;t.style.display='none';e('./_html').appendChild(t);t.src='javascript:';i=t.contentWindow.document;i.open();i.write(s+'script'+r+'document.F=Object'+s+'/script'+r);i.close();a=i.F;while(o--)delete a[l][n[o]];return a();};t.exports=Object.create||function e(t,o){var n;if(t!==null){_[l]=s(t);n=new _();_[l]=null;n[i]=t;}else n=a();return o===undefined?n:r(n,o);};},{"./_an-object":11,"./_dom-create":23,"./_enum-bug-keys":24,"./_html":33,"./_object-dps":54,"./_shared-key":73}],53:[function(e,t,o){var s=e('./_an-object'),r=e('./_ie8-dom-define'),i=e('./_to-primitive'),n=Object.defineProperty;o.f=e('./_descriptors')?Object.defineProperty:function e(t,o,_){s(t);o=i(o,true);s(_);if(r)try{return n(t,o,_);}catch(t){}if('get'in _||'set'in _)throw TypeError('Accessors not supported!');if('value'in _)t[o]=_.value;return t;};},{"./_an-object":11,"./_descriptors":22,"./_ie8-dom-define":34,"./_to-primitive":86}],54:[function(e,t,o){var s=e('./_object-dp'),r=e('./_an-object'),n=e('./_object-keys');t.exports=e('./_descriptors')?Object.defineProperties:function e(t,o){r(t);var _=n(o),l=_.length,a=0,i;while(l>a)s.f(t,i=_[a++],o[i]);return t;};},{"./_an-object":11,"./_descriptors":22,"./_object-dp":53,"./_object-keys":61}],55:[function(e,t,o){var s=e('./_object-pie'),r=e('./_property-desc'),i=e('./_to-iobject'),n=e('./_to-primitive'),_=e('./_has'),l=e('./_ie8-dom-define'),a=Object.getOwnPropertyDescriptor;o.f=e('./_descriptors')?a:function e(t,o){t=i(t);o=n(o,true);if(l)try{return a(t,o);}catch(t){}if(_(t,o))return r(!s.f.call(t,o),t[o]);};},{"./_descriptors":22,"./_has":31,"./_ie8-dom-define":34,"./_object-pie":62,"./_property-desc":65,"./_to-iobject":83,"./_to-primitive":86}],56:[function(e,t,o){var s=e('./_to-iobject'),r=e('./_object-gopn').f,i={}.toString,n=typeof window=='object'&&window&&Object.getOwnPropertyNames?Object.getOwnPropertyNames(window):[],_=function(e){try{return r(e);}catch(t){return n.slice();}};t.exports.f=function e(t){return n&&i.call(t)=='[object Window]'?_(t):r(s(t));};},{"./_object-gopn":57,"./_to-iobject":83}],57:[function(e,t,o){var s=e('./_object-keys-internal'),r=e('./_enum-bug-keys').concat('length','prototype');o.f=Object.getOwnPropertyNames||function e(t){return s(t,r);};},{"./_enum-bug-keys":24,"./_object-keys-internal":60}],58:[function(e,t,o){o.f=Object.getOwnPropertySymbols;},{}],59:[function(e,t,o){var s=e('./_has'),r=e('./_to-object'),i=e('./_shared-key')('IE_PROTO'),n=Object.prototype;t.exports=Object.getPrototypeOf||function(e){e=r(e);if(s(e,i))return e[i];if(typeof e.constructor=='function'&&e instanceof e.constructor){return e.constructor.prototype;}return e instanceof Object?n:null;};},{"./_has":31,"./_shared-key":73,"./_to-object":85}],60:[function(e,t,o){var s=e('./_has'),r=e('./_to-iobject'),i=e('./_array-includes')(false),n=e('./_shared-key')('IE_PROTO');t.exports=function(e,t){var o=r(e),_=0,l=[],a;for(a in o)if(a!=n)s(o,a)&&l.push(a);while(t.length>_)if(s(o,a=t[_++])){~i(l,a)||l.push(a);}return l;};},{"./_array-includes":13,"./_has":31,"./_shared-key":73,"./_to-iobject":83}],61:[function(e,t,o){var s=e('./_object-keys-internal'),r=e('./_enum-bug-keys');t.exports=Object.keys||function e(t){return s(t,r);};},{"./_enum-bug-keys":24,"./_object-keys-internal":60}],62:[function(e,t,o){o.f={}.propertyIsEnumerable;},{}],63:[function(e,t,o){t.exports=function(e){try{return{e:false,v:e()};}catch(t){return{e:true,v:t};}};},{}],64:[function(e,t,o){var s=e('./_an-object'),r=e('./_is-object'),i=e('./_new-promise-capability');t.exports=function(e,t){s(e);if(r(t)&&t.constructor===e)return t;var o=i.f(e),n=o.resolve;n(t);return o.promise;};},{"./_an-object":11,"./_is-object":40,"./_new-promise-capability":51}],65:[function(e,t,o){t.exports=function(e,t){return{enumerable:!(e&1),configurable:!(e&2),writable:!(e&4),value:t};};},{}],66:[function(e,t,o){var s=e('./_redefine');t.exports=function(e,t,o){for(var r in t)s(e,r,t[r],o);return e;};},{"./_redefine":67}],67:[function(e,t,o){var s=e('./_global'),r=e('./_hide'),i=e('./_has'),n=e('./_uid')('src'),_='toString',l=Function[_],a=(''+l).split(_);e('./_core').inspectSource=function(e){return l.call(e);};(t.exports=function(e,t,o,_){var l=typeof o=='function';if(l)i(o,'name')||r(o,'name',t);if(e[t]===o)return;if(l)i(o,n)||r(o,n,e[t]?''+e[t]:a.join(String(t)));if(e===s){e[t]=o;}else if(!_){delete e[t];r(e,t,o);}else if(e[t]){e[t]=o;}else{r(e,t,o);}})(Function.prototype,_,function e(){return typeof this=='function'&&this[n]||l.call(this);});},{"./_core":19,"./_global":30,"./_has":31,"./_hide":32,"./_uid":87}],68:[function(e,t,o){'use strict';var s=e('./_export'),r=e('./_a-function'),i=e('./_ctx'),_=e('./_for-of');t.exports=function(e){s(s.S,e,{from:function e(t){var o=arguments[1],s,l,a,n;r(this);s=o!==undefined;if(s)r(o);if(t==undefined)return new this();l=[];if(s){a=0;n=i(o,arguments[2],2);_(t,false,function(e){l.push(n(e,a++));});}else{_(t,false,l.push,l);}return new this(l);}});};},{"./_a-function":8,"./_ctx":20,"./_export":26,"./_for-of":29}],69:[function(e,t,o){'use strict';var s=e('./_export');t.exports=function(e){s(s.S,e,{of:function e(){var t=arguments.length,o=new Array(t);while(t--)o[t]=arguments[t];return new this(o);}});};},{"./_export":26}],70:[function(e,t,o){var s=e('./_is-object'),r=e('./_an-object'),i=function(e,t){r(e);if(!s(t)&&t!==null)throw TypeError(t+": can't set as prototype!");};t.exports={set:Object.setPrototypeOf||('__proto__'in{}?function(t,o,s){try{s=e('./_ctx')(Function.call,e('./_object-gopd').f(Object.prototype,'__proto__').set,2);s(t,[]);o=!(t instanceof Array);}catch(t){o=true;}return function e(t,r){i(t,r);if(o)t.__proto__=r;else s(t,r);return t;};}({},false):undefined),check:i};},{"./_an-object":11,"./_ctx":20,"./_is-object":40,"./_object-gopd":55}],71:[function(e,t,o){'use strict';var s=e('./_global'),r=e('./_object-dp'),i=e('./_descriptors'),n=e('./_wks')('species');t.exports=function(e){var t=s[e];if(i&&t&&!t[n])r.f(t,n,{configurable:true,get:function(){return this;}});};},{"./_descriptors":22,"./_global":30,"./_object-dp":53,"./_wks":91}],72:[function(e,t,o){var s=e('./_object-dp').f,r=e('./_has'),i=e('./_wks')('toStringTag');t.exports=function(e,t,o){if(e&&!r(e=o?e:e.prototype,i))s(e,i,{configurable:true,value:t});};},{"./_has":31,"./_object-dp":53,"./_wks":91}],73:[function(e,t,o){var s=e('./_shared')('keys'),r=e('./_uid');t.exports=function(e){return s[e]||(s[e]=r(e));};},{"./_shared":74,"./_uid":87}],74:[function(e,t,o){var s=e('./_global'),r='__core-js_shared__',i=s[r]||(s[r]={});t.exports=function(e){return i[e]||(i[e]={});};},{"./_global":30}],75:[function(e,t,o){var s=e('./_an-object'),r=e('./_a-function'),i=e('./_wks')('species');t.exports=function(e,t){var o=s(e).constructor,n;return o===undefined||(n=s(o)[i])==undefined?t:r(n);};},{"./_a-function":8,"./_an-object":11,"./_wks":91}],76:[function(e,t,o){var r=e('./_to-integer'),n=e('./_defined');t.exports=function(e){return function(t,o){var _=String(n(t)),s=r(o),i=_.length,l,a;if(s<0||s>=i)return e?'':undefined;l=_.charCodeAt(s);return l<0xd800||l>0xdbff||s+1===i||(a=_.charCodeAt(s+1))<0xdc00||a>0xdfff?e?_.charAt(s):l:e?_.slice(s,s+2):(l-0xd800<<10)+(a-0xdc00)+0x10000;};};},{"./_defined":21,"./_to-integer":82}],77:[function(e,t,o){var s=e('./_is-regexp'),r=e('./_defined');t.exports=function(e,t,o){if(s(t))throw TypeError('String#'+o+" doesn't accept regex!");return String(r(e));};},{"./_defined":21,"./_is-regexp":41}],78:[function(e,t,o){var s=e('./_export'),r=e('./_defined'),i=e('./_fails'),n=e('./_string-ws'),_='['+n+']',l='\u200b\u0085',a=RegExp('^'+_+_+'*'),c=RegExp(_+_+'*$'),p=function(e,t,o){var r={},_=i(function(){return!!n[e]()||l[e]()!=l;}),a=r[e]=_?t(d):n[e];if(o)r[o]=a;s(s.P+s.F*_,'String',r);},d=p.trim=function(e,t){e=String(r(e));if(t&1)e=e.replace(a,'');if(t&2)e=e.replace(c,'');return e;};t.exports=p;},{"./_defined":21,"./_export":26,"./_fails":28,"./_string-ws":79}],79:[function(e,t,o){t.exports='\x09\x0A\x0B\x0C\x0D\x20\xA0\u1680\u180E\u2000\u2001\u2002\u2003'+'\u2004\u2005\u2006\u2007\u2008\u2009\u200A\u202F\u205F\u3000\u2028\u2029\uFEFF';},{}],80:[function(e,t,o){var s=e('./_ctx'),r=e('./_invoke'),i=e('./_html'),n=e('./_dom-create'),_=e('./_global'),l=_.process,a=_.setImmediate,c=_.clearImmediate,p=_.MessageChannel,d=_.Dispatch,f=0,u={},m='onreadystatechange',b,g,y,h=function(){var e=+this;if(u.hasOwnProperty(e)){var t=u[e];delete u[e];t();}},x=function(e){h.call(e.data);};if(!a||!c){a=function e(t){var o=[],s=1;while(arguments.length>s)o.push(arguments[s++]);u[++f]=function(){r(typeof t=='function'?t:Function(t),o);};b(f);return f;};c=function e(t){delete u[t];};if(e('./_cof')(l)=='process'){b=function(e){l.nextTick(s(h,e,1));};}else if(d&&d.now){b=function(e){d.now(s(h,e,1));};}else if(p){g=new p();y=g.port2;g.port1.onmessage=x;b=s(y.postMessage,y,1);}else if(_.addEventListener&&typeof postMessage=='function'&&!_.importScripts){b=function(e){_.postMessage(e+'','*');};_.addEventListener('message',x,false);}else if(m in n('script')){b=function(e){i.appendChild(n('script'))[m]=function(){i.removeChild(this);h.call(e);};};}else{b=function(e){setTimeout(s(h,e,1),0);};}}t.exports={set:a,clear:c};},{"./_cof":15,"./_ctx":20,"./_dom-create":23,"./_global":30,"./_html":33,"./_invoke":36}],81:[function(e,t,o){var s=e('./_to-integer'),r=Math.max,i=Math.min;t.exports=function(e,t){e=s(e);return e<0?r(e+t,0):i(e,t);};},{"./_to-integer":82}],82:[function(e,t,o){var s=Math.ceil,r=Math.floor;t.exports=function(e){return isNaN(e=+e)?0:(e>0?r:s)(e);};},{}],83:[function(e,t,o){var s=e('./_iobject'),r=e('./_defined');t.exports=function(e){return s(r(e));};},{"./_defined":21,"./_iobject":37}],84:[function(e,t,o){var s=e('./_to-integer'),r=Math.min;t.exports=function(e){return e>0?r(s(e),0x1fffffffffffff):0;};},{"./_to-integer":82}],85:[function(e,t,o){var s=e('./_defined');t.exports=function(e){return Object(s(e));};},{"./_defined":21}],86:[function(e,t,o){var s=e('./_is-object');t.exports=function(e,t){if(!s(e))return e;var o,r;if(t&&typeof(o=e.toString)=='function'&&!s(r=o.call(e)))return r;if(typeof(o=e.valueOf)=='function'&&!s(r=o.call(e)))return r;if(!t&&typeof(o=e.toString)=='function'&&!s(r=o.call(e)))return r;throw TypeError("Can't convert object to primitive value");};},{"./_is-object":40}],87:[function(e,t,o){var s=0,r=Math.random();t.exports=function(e){return'Symbol('.concat(e===undefined?'':e,')_',(++s+r).toString(36));};},{}],88:[function(e,t,o){var s=e('./_is-object');t.exports=function(e,t){if(!s(e)||e._t!==t)throw TypeError('Incompatible receiver, '+t+' required!');return e;};},{"./_is-object":40}],89:[function(e,t,o){var s=e('./_global'),r=e('./_core'),i=e('./_library'),n=e('./_wks-ext'),_=e('./_object-dp').f;t.exports=function(e){var t=r.Symbol||(r.Symbol=i?{}:s.Symbol||{});if(e.charAt(0)!='_'&&!(e in t))_(t,e,{value:n.f(e)});};},{"./_core":19,"./_global":30,"./_library":48,"./_object-dp":53,"./_wks-ext":90}],90:[function(e,t,o){o.f=e('./_wks');},{"./_wks":91}],91:[function(e,t,o){var s=e('./_shared')('wks'),r=e('./_uid'),i=e('./_global').Symbol,n=typeof i=='function',_=t.exports=function(e){return s[e]||(s[e]=n&&i[e]||(n?i:r)('Symbol.'+e));};_.store=s;},{"./_global":30,"./_shared":74,"./_uid":87}],92:[function(e,t,o){var s=e('./_classof'),r=e('./_wks')('iterator'),i=e('./_iterators');t.exports=e('./_core').getIteratorMethod=function(e){if(e!=undefined)return e[r]||e['@@iterator']||i[s(e)];};},{"./_classof":14,"./_core":19,"./_iterators":47,"./_wks":91}],93:[function(e,t,o){'use strict';var s=e('./_add-to-unscopables'),r=e('./_iter-step'),i=e('./_iterators'),n=e('./_to-iobject');t.exports=e('./_iter-define')(Array,'Array',function(e,t){this._t=n(e);this._i=0;this._k=t;},function(){var e=this._t,t=this._k,o=this._i++;if(!e||o>=e.length){this._t=undefined;return r(1);}if(t=='keys')return r(0,o);if(t=='values')return r(0,e[o]);return r(0,[o,e[o]]);},'values');i.Arguments=i.Array;s('keys');s('values');s('entries');},{"./_add-to-unscopables":9,"./_iter-define":44,"./_iter-step":46,"./_iterators":47,"./_to-iobject":83}],94:[function(e,t,o){'use strict';var s=e('./_collection-strong'),r=e('./_validate-collection'),i='Map';t.exports=e('./_collection')(i,function(e){return function t(){return e(this,arguments.length>0?arguments[0]:undefined);};},{get:function e(t){var o=s.getEntry(r(this,i),t);return o&&o.v;},set:function e(t,o){return s.def(r(this,i),t===0?0:t,o);}},s,true);},{"./_collection":18,"./_collection-strong":16,"./_validate-collection":88}],95:[function(e,t,o){'use strict';var s=e('./_classof'),r={};r[e('./_wks')('toStringTag')]='z';if(r+''!='[object z]'){e('./_redefine')(Object.prototype,'toString',function e(){return'[object '+s(this)+']';},true);}},{"./_classof":14,"./_redefine":67,"./_wks":91}],96:[function(e,t,o){'use strict';var s=e('./_library'),r=e('./_global'),i=e('./_ctx'),n=e('./_classof'),_=e('./_export'),l=e('./_is-object'),a=e('./_a-function'),c=e('./_an-instance'),p=e('./_for-of'),d=e('./_species-constructor'),f=e('./_task').set,u=e('./_microtask')(),m=e('./_new-promise-capability'),b=e('./_perform'),g=e('./_promise-resolve'),y='Promise',h=r.TypeError,x=r.process,j=r[y],k=n(x)=='process',S=function(){},E,w,v,T,O=w=m.f,P=!!function(){try{var t=j.resolve(1),o=(t.constructor={})[e('./_wks')('species')]=function(e){e(S,S);};return(k||typeof PromiseRejectionEvent=='function')&&t.then(S)instanceof o;}catch(t){}}(),R=function(e){var t;return l(e)&&typeof(t=e.then)=='function'?t:false;},A=function(e,t){if(e._n)return;e._n=true;var o=e._c;u(function(){var s=e._v,r=e._s==1,n=0,i=function(t){var o=r?t.ok:t.fail,i=t.resolve,n=t.reject,_=t.domain,l,a;try{if(o){if(!r){if(e._h==2)D(e);e._h=1;}if(o===true)l=s;else{if(_)_.enter();l=o(s);if(_)_.exit();}if(l===t.promise){n(h('Promise-chain cycle'));}else if(a=R(l)){a.call(l,i,n);}else i(l);}else n(s);}catch(t){n(t);}};while(o.length>n)i(o[n++]);e._c=[];e._n=false;if(t&&!e._h)I(e);});},I=function(e){f.call(r,function(){var t=e._v,o=N(e),s,i,n;if(o){s=b(function(){if(k){x.emit('unhandledRejection',t,e);}else if(i=r.onunhandledrejection){i({promise:e,reason:t});}else if((n=r.console)&&n.error){n.error('Unhandled promise rejection',t);}});e._h=k||N(e)?2:1;}e._a=undefined;if(o&&s.e)throw s.v;});},N=function(e){return e._h!==1&&(e._a||e._c).length===0;},D=function(e){f.call(r,function(){var t;if(k){x.emit('rejectionHandled',e);}else if(t=r.onrejectionhandled){t({promise:e,reason:e._v});}});},L=function(e){var t=this;if(t._d)return;t._d=true;t=t._w||t;t._v=e;t._s=2;if(!t._a)t._a=t._c.slice();A(t,true);},M=function(e){var t=this,o;if(t._d)return;t._d=true;t=t._w||t;try{if(t===e)throw h("Promise can't be resolved itself");if(o=R(e)){u(function(){var s={_w:t,_d:false};try{o.call(e,i(M,s,1),i(L,s,1));}catch(t){L.call(s,t);}});}else{t._v=e;t._s=1;A(t,false);}}catch(o){L.call({_w:t,_d:false},o);}};if(!P){j=function e(t){c(this,j,y,'_h');a(t);E.call(this);try{t(i(M,this,1),i(L,this,1));}catch(e){L.call(this,e);}};E=function e(t){this._c=[];this._a=undefined;this._s=0;this._d=false;this._v=undefined;this._h=0;this._n=false;};E.prototype=e('./_redefine-all')(j.prototype,{then:function e(t,o){var s=O(d(this,j));s.ok=typeof t=='function'?t:true;s.fail=typeof o=='function'&&o;s.domain=k?x.domain:undefined;this._c.push(s);if(this._a)this._a.push(s);if(this._s)A(this,false);return s.promise;},'catch':function(e){return this.then(undefined,e);}});v=function(){var e=new E();this.promise=e;this.resolve=i(M,e,1);this.reject=i(L,e,1);};m.f=O=function(e){return e===j||e===T?new v(e):w(e);};}_(_.G+_.W+_.F*!P,{Promise:j});e('./_set-to-string-tag')(j,y);e('./_set-species')(y);T=e('./_core')[y];_(_.S+_.F*!P,y,{reject:function e(t){var o=O(this),s=o.reject;s(t);return o.promise;}});_(_.S+_.F*(s||!P),y,{resolve:function e(t){return g(s&&this===T?j:this,t);}});_(_.S+_.F*!(P&&e('./_iter-detect')(function(e){j.all(e)['catch'](S);})),y,{all:function e(t){var o=this,s=O(o),r=s.resolve,i=s.reject,n=b(function(){var e=[],s=0,n=1;p(t,false,function(t){var _=s++,l=false;e.push(undefined);n++;o.resolve(t).then(function(t){if(l)return;l=true;e[_]=t;--n||r(e);},i);});--n||r(e);});if(n.e)i(n.v);return s.promise;},race:function e(t){var o=this,s=O(o),r=s.reject,i=b(function(){p(t,false,function(e){o.resolve(e).then(s.resolve,r);});});if(i.e)r(i.v);return s.promise;}});},{"./_a-function":8,"./_an-instance":10,"./_classof":14,"./_core":19,"./_ctx":20,"./_export":26,"./_for-of":29,"./_global":30,"./_is-object":40,"./_iter-detect":45,"./_library":48,"./_microtask":50,"./_new-promise-capability":51,"./_perform":63,"./_promise-resolve":64,"./_redefine-all":66,"./_set-species":71,"./_set-to-string-tag":72,"./_species-constructor":75,"./_task":80,"./_wks":91}],97:[function(e,t,o){'use strict';var s=e('./_collection-strong'),r=e('./_validate-collection'),i='Set';t.exports=e('./_collection')(i,function(e){return function t(){return e(this,arguments.length>0?arguments[0]:undefined);};},{add:function e(t){return s.def(r(this,i),t=t===0?0:t,t);}},s);},{"./_collection":18,"./_collection-strong":16,"./_validate-collection":88}],98:[function(e,t,o){'use strict';var s=e('./_export'),r=e('./_to-length'),i=e('./_string-context'),n='endsWith',_=''[n];s(s.P+s.F*e('./_fails-is-regexp')(n),'String',{endsWith:function e(t){var o=i(this,t,n),s=arguments.length>1?arguments[1]:undefined,l=r(o.length),a=s===undefined?l:Math.min(r(s),l),c=String(t);return _?_.call(o,c,a):o.slice(a-c.length,a)===c;}});},{"./_export":26,"./_fails-is-regexp":27,"./_string-context":77,"./_to-length":84}],99:[function(e,t,o){'use strict';var s=e('./_string-at')(true);e('./_iter-define')(String,'String',function(e){this._t=String(e);this._i=0;},function(){var e=this._t,t=this._i,o;if(t>=e.length)return{value:undefined,done:true};o=s(e,t);this._i+=o.length;return{value:o,done:false};});},{"./_iter-define":44,"./_string-at":76}],100:[function(e,t,o){'use strict';var s=e('./_export'),r=e('./_to-length'),i=e('./_string-context'),n='startsWith',_=''[n];s(s.P+s.F*e('./_fails-is-regexp')(n),'String',{startsWith:function e(t){var o=i(this,t,n),s=r(Math.min(arguments.length>1?arguments[1]:undefined,o.length)),l=String(t);return _?_.call(o,l,s):o.slice(s,s+l.length)===l;}});},{"./_export":26,"./_fails-is-regexp":27,"./_string-context":77,"./_to-length":84}],101:[function(e,t,o){'use strict';e('./_string-trim')('trim',function(e){return function t(){return e(this,3);};});},{"./_string-trim":78}],102:[function(e,t,o){'use strict';var s=e('./_global'),r=e('./_has'),i=e('./_descriptors'),n=e('./_export'),_=e('./_redefine'),l=e('./_meta').KEY,a=e('./_fails'),c=e('./_shared'),p=e('./_set-to-string-tag'),d=e('./_uid'),f=e('./_wks'),u=e('./_wks-ext'),m=e('./_wks-define'),b=e('./_enum-keys'),g=e('./_is-array'),y=e('./_an-object'),h=e('./_is-object'),x=e('./_to-iobject'),S=e('./_to-primitive'),E=e('./_property-desc'),w=e('./_object-create'),v=e('./_object-gopn-ext'),T=e('./_object-gopd'),O=e('./_object-dp'),P=e('./_object-keys'),R=T.f,A=O.f,I=v.f,N=s.Symbol,D=s.JSON,L=D&&D.stringify,M='prototype',F=f('_hidden'),C=f('toPrimitive'),Y={}.propertyIsEnumerable,H=c('symbol-registry'),W=c('symbols'),G=c('op-symbols'),K=Object[M],U=typeof N=='function',q=s.QObject,V=!q||!q[M]||!q[M].findChild,z=i&&a(function(){return w(A({},'a',{get:function(){return A(this,'a',{value:7}).a;}})).a!=7;})?function(e,t,o){var s=R(K,t);if(s)delete K[t];A(e,t,o);if(s&&e!==K)A(K,t,s);}:A,B=function(e){var t=W[e]=w(N[M]);t._k=e;return t;},J=U&&typeof N.iterator=='symbol'?function(e){return typeof e=='symbol';}:function(e){return e instanceof N;},Z=function e(t,o,s){if(t===K)Z(G,o,s);y(t);o=S(o,true);y(s);if(r(W,o)){if(!s.enumerable){if(!r(t,F))A(t,F,E(1,{}));t[F][o]=true;}else{if(r(t,F)&&t[F][o])t[F][o]=false;s=w(s,{enumerable:E(0,false)});}return z(t,o,s);}return A(t,o,s);},$=function e(t,o){y(t);var s=b(o=x(o)),r=0,i=s.length,n;while(i>r)Z(t,n=s[r++],o[n]);return t;},Q=function e(t,o){return o===undefined?w(t):$(w(t),o);},X=function e(t){var o=Y.call(this,t=S(t,true));if(this===K&&r(W,t)&&!r(G,t))return false;return o||!r(this,t)||!r(W,t)||r(this,F)&&this[F][t]?o:true;},ee=function e(t,o){t=x(t);o=S(o,true);if(t===K&&r(W,o)&&!r(G,o))return;var s=R(t,o);if(s&&r(W,o)&&!(r(t,F)&&t[F][o]))s.enumerable=true;return s;},te=function e(t){var o=I(x(t)),s=[],n=0,i;while(o.length>n){if(!r(W,i=o[n++])&&i!=F&&i!=l)s.push(i);}return s;},oe=function e(t){var o=t===K,s=I(o?G:x(t)),n=[],_=0,i;while(s.length>_){if(r(W,i=s[_++])&&(o?r(K,i):true))n.push(W[i]);}return n;};if(!U){N=function e(){if(this instanceof N)throw TypeError('Symbol is not a constructor!');var t=d(arguments.length>0?arguments[0]:undefined),o=function(e){if(this===K)o.call(G,e);if(r(this,F)&&r(this[F],t))this[F][t]=false;z(this,t,E(1,e));};if(i&&V)z(K,t,{configurable:true,set:o});return B(t);};_(N[M],'toString',function e(){return this._k;});T.f=ee;O.f=Z;e('./_object-gopn').f=v.f=te;e('./_object-pie').f=X;e('./_object-gops').f=oe;if(i&&!e('./_library')){_(K,'propertyIsEnumerable',X,true);}u.f=function(e){return B(f(e));};}n(n.G+n.W+n.F*!U,{Symbol:N});for(var se='hasInstance,isConcatSpreadable,iterator,match,replace,search,species,split,toPrimitive,toStringTag,unscopables'.split(','),re=0;se.length>re;)f(se[re++]);for(var j=P(f.store),ie=0;j.length>ie;)m(j[ie++]);n(n.S+n.F*!U,'Symbol',{'for':function(e){return r(H,e+='')?H[e]:H[e]=N(e);},keyFor:function e(t){if(!J(t))throw TypeError(t+' is not a symbol!');for(var o in H)if(H[o]===t)return o;},useSetter:function(){V=true;},useSimple:function(){V=false;}});n(n.S+n.F*!U,'Object',{create:Q,defineProperty:Z,defineProperties:$,getOwnPropertyDescriptor:ee,getOwnPropertyNames:te,getOwnPropertySymbols:oe});D&&n(n.S+n.F*(!U||a(function(){var e=N();return L([e])!='[null]'||L({a:e})!='{}'||L(Object(e))!='{}';})),'JSON',{stringify:function e(t){var o=[t],s=1,r,i;while(arguments.length>s)o.push(arguments[s++]);i=r=o[1];if(!h(r)&&t===undefined||J(t))return;if(!g(r))r=function(e,t){if(typeof i=='function')t=i.call(this,e,t);if(!J(t))return t;};o[1]=r;return L.apply(D,o);}});N[M][C]||e('./_hide')(N[M],C,N[M].valueOf);p(N,'Symbol');p(Math,'Math',true);p(s.JSON,'JSON',true);},{"./_an-object":11,"./_descriptors":22,"./_enum-keys":25,"./_export":26,"./_fails":28,"./_global":30,"./_has":31,"./_hide":32,"./_is-array":39,"./_is-object":40,"./_library":48,"./_meta":49,"./_object-create":52,"./_object-dp":53,"./_object-gopd":55,"./_object-gopn":57,"./_object-gopn-ext":56,"./_object-gops":58,"./_object-keys":61,"./_object-pie":62,"./_property-desc":65,"./_redefine":67,"./_set-to-string-tag":72,"./_shared":74,"./_to-iobject":83,"./_to-primitive":86,"./_uid":87,"./_wks":91,"./_wks-define":89,"./_wks-ext":90}],103:[function(e,t,o){e('./_set-collection-from')('Map');},{"./_set-collection-from":68}],104:[function(e,t,o){e('./_set-collection-of')('Map');},{"./_set-collection-of":69}],105:[function(e,t,o){var s=e('./_export');s(s.P+s.R,'Map',{toJSON:e('./_collection-to-json')('Map')});},{"./_collection-to-json":17,"./_export":26}],106:[function(e,t,o){'use strict';var s=e('./_export'),r=e('./_core'),i=e('./_global'),n=e('./_species-constructor'),_=e('./_promise-resolve');s(s.P+s.R,'Promise',{'finally':function(t){var o=n(this,r.Promise||i.Promise),e=typeof t=='function';return this.then(e?function(e){return _(o,t()).then(function(){return e;});}:t,e?function(s){return _(o,t()).then(function(){throw s;});}:t);}});},{"./_core":19,"./_export":26,"./_global":30,"./_promise-resolve":64,"./_species-constructor":75}],107:[function(e,t,o){'use strict';var s=e('./_export'),r=e('./_new-promise-capability'),i=e('./_perform');s(s.S,'Promise',{'try':function(e){var t=r.f(this),o=i(e);(o.e?t.reject:t.resolve)(o.v);return t.promise;}});},{"./_export":26,"./_new-promise-capability":51,"./_perform":63}],108:[function(e,t,o){e('./_set-collection-from')('Set');},{"./_set-collection-from":68}],109:[function(e,t,o){e('./_set-collection-of')('Set');},{"./_set-collection-of":69}],110:[function(e,t,o){var s=e('./_export');s(s.P+s.R,'Set',{toJSON:e('./_collection-to-json')('Set')});},{"./_collection-to-json":17,"./_export":26}],111:[function(e,t,o){e('./_wks-define')('asyncIterator');},{"./_wks-define":89}],112:[function(e,t,o){e('./_wks-define')('observable');},{"./_wks-define":89}],113:[function(e,t,o){for(var s=e('./es6.array.iterator'),r=e('./_object-keys'),n=e('./_redefine'),_=e('./_global'),l=e('./_hide'),a=e('./_iterators'),c=e('./_wks'),p=c('iterator'),d=c('toStringTag'),f=a.Array,u={CSSRuleList:true,CSSStyleDeclaration:false,CSSValueList:false,ClientRectList:false,DOMRectList:false,DOMStringList:false,DOMTokenList:true,DataTransferItemList:false,FileList:false,HTMLAllCollection:false,HTMLCollection:false,HTMLFormElement:false,HTMLSelectElement:false,MediaList:true,MimeTypeArray:false,NamedNodeMap:false,NodeList:true,PaintRequestList:false,Plugin:false,PluginArray:false,SVGLengthList:false,SVGNumberList:false,SVGPathSegList:false,SVGPointList:false,SVGStringList:false,SVGTransformList:false,SourceBufferList:false,StyleSheetList:true,TextTrackCueList:false,TextTrackList:false,TouchList:false},m=r(u),b=0;b1){for(var o=1;o