diff --git a/.DS_Store b/.DS_Store index d56ec1c..f80afa3 100644 Binary files a/.DS_Store and b/.DS_Store differ diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..02f08fb --- /dev/null +++ b/.babelrc @@ -0,0 +1,5 @@ +{ + "presets": [ + "es2015" + ] +} \ No newline at end of file diff --git a/.eslintrc b/.eslintrc new file mode 100644 index 0000000..3710412 --- /dev/null +++ b/.eslintrc @@ -0,0 +1,19 @@ +env: + node: true + shared-node-browser: true +extends: 'eslint:recommended' +rules: + indent: + - warn + - 2 + quotes: + - error + - single + semi: + - error + - always + no-console: 0 + no-unused-vars: + - warn +plugins: + - standard \ No newline at end of file diff --git a/.github/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md new file mode 100644 index 0000000..62bad1c --- /dev/null +++ b/.github/ISSUE_TEMPLATE.md @@ -0,0 +1,2 @@ + \ No newline at end of file diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..2287f0c --- /dev/null +++ b/.gitignore @@ -0,0 +1,10 @@ +*.log +*.~lock +*.js +**/*.map +*.gulp/**.js +dist/ +node_modules/ +.DS_Store +/themes +/icons diff --git a/.gulp/consts/log.ts b/.gulp/consts/log.ts new file mode 100644 index 0000000..bc933ba --- /dev/null +++ b/.gulp/consts/log.ts @@ -0,0 +1,7 @@ +export const HR: string = '\nā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”ā€”\n'; +export const MESSAGE_BUMP_ERROR: string = ' There was an issue bumping version:\n'; +export const MESSAGE_BUMP_SUCCESS: string = ' Finished successfully\n'; +export const MESSAGE_ICON_ERROR: string = 'There is an error with JSON generated for icons'; +export const MESSAGE_ICON_ACCENTS_ERROR: string = 'Failed to create accents icon themes, please read the log file.'; +export const MESSAGE_GENERATED: string = 'Generated'; +export const MESSAGE_THEME_VARIANT_PARSE_ERROR: string = 'Error when parsing json for theme variants'; \ No newline at end of file diff --git a/.gulp/index.ts b/.gulp/index.ts new file mode 100644 index 0000000..6e2342e --- /dev/null +++ b/.gulp/index.ts @@ -0,0 +1,10 @@ +// export the tasks +export * from './tasks/icons'; +export * from './tasks/icons-accents'; +export * from './tasks/icons-variants'; +export * from './tasks/themes'; +export * from './tasks/watcher'; +export * from './tasks/changelog-title'; + +// export default script +export default ['build:themes']; diff --git a/.gulp/interfaces/iicon.ts b/.gulp/interfaces/iicon.ts new file mode 100644 index 0000000..9c63e4e --- /dev/null +++ b/.gulp/interfaces/iicon.ts @@ -0,0 +1,20 @@ +export interface IIcon { + /** + * Icon filename + * @type {string} + * @memberof IIcon + */ + filename: string; + /** + * If set to true, the icon is marked as last + * @type {boolean} + * @memberof IIcon + */ + last: boolean; + /** + * Icon's name + * @type {string} + * @memberof IIcon + */ + name: string; +} \ No newline at end of file diff --git a/.gulp/interfaces/itheme-icons-accents.ts b/.gulp/interfaces/itheme-icons-accents.ts new file mode 100644 index 0000000..e2a5324 --- /dev/null +++ b/.gulp/interfaces/itheme-icons-accents.ts @@ -0,0 +1,8 @@ +import { IThemeIconsItem } from "./itheme-icons-item"; + +export interface IThemeIconsAccents { + iconDefinitions: { + _folder_open: IThemeIconsItem; + _folder_open_build: IThemeIconsItem; + } +} \ No newline at end of file diff --git a/.gulp/interfaces/itheme-icons-item.ts b/.gulp/interfaces/itheme-icons-item.ts new file mode 100644 index 0000000..1a5c615 --- /dev/null +++ b/.gulp/interfaces/itheme-icons-item.ts @@ -0,0 +1,3 @@ +export interface IThemeIconsItem { + iconPath: string; +} \ No newline at end of file diff --git a/.gulp/interfaces/itheme-icons-variants.ts b/.gulp/interfaces/itheme-icons-variants.ts new file mode 100644 index 0000000..15e91e7 --- /dev/null +++ b/.gulp/interfaces/itheme-icons-variants.ts @@ -0,0 +1,17 @@ +import { IThemeIconsItem } from "./itheme-icons-item"; + +export interface IThemeIconsVariants { + iconDefinitions: { + "_folder_dark": IThemeIconsItem; + "_folder_dark_build": IThemeIconsItem; + "_folder_light": IThemeIconsItem; + "_folder_light_build": IThemeIconsItem; + "_folder_vscode": IThemeIconsItem; + "_folder_gulp": IThemeIconsItem; + "_folder_node": IThemeIconsItem; + "_folder_images": IThemeIconsItem; + "_folder_js": IThemeIconsItem; + "_folder_src": IThemeIconsItem; + "_folder_assets": IThemeIconsItem; + } +} \ No newline at end of file diff --git a/.gulp/interfaces/itheme-variant.ts b/.gulp/interfaces/itheme-variant.ts new file mode 100644 index 0000000..3f74e6c --- /dev/null +++ b/.gulp/interfaces/itheme-variant.ts @@ -0,0 +1,42 @@ +export interface IThemeVariant { + id: string; + name: string; + scheme: { + background: string; + base: { + black: string; + blue: string; + brown: string; + cyan: string; + green: string; + orange: string; + paleblue: string; + pink: string; + purple: string; + red: string; + violet: string; + white: string; + yellow: string; + } + caret: string; + comments: string; + findHighlight: string; + focusBorder: string; + foreground: string; + guides: string; + inputBackground: string; + inputBorder: string; + inputForeground: string; + invisibles: string; + lineHighlight: string; + lineNumbers: string; + listHoverForeground: string; + scrollbars: string; + scrollbarsHover: string; + selection: string; + shadow: string; + sidebarForeground: string; + statusbarForeground: string; + } + type: string; +} \ No newline at end of file diff --git a/.gulp/tasks/changelog-title.ts b/.gulp/tasks/changelog-title.ts new file mode 100644 index 0000000..c892c40 --- /dev/null +++ b/.gulp/tasks/changelog-title.ts @@ -0,0 +1,11 @@ +import * as gulp from "gulp"; +import * as fs from 'fs'; +import { CHARSET } from "../../extensions/consts/files"; + + +export default gulp.task('changelog-title', () => { + fs.writeFileSync( + './CHANGELOG.md', + fs.readFileSync('CHANGELOG.md', CHARSET).replace('# Change Log', '# Material Theme Changelog'), + { encoding: CHARSET }); +}); \ No newline at end of file diff --git a/.gulp/tasks/icons-accents.ts b/.gulp/tasks/icons-accents.ts new file mode 100644 index 0000000..a643185 --- /dev/null +++ b/.gulp/tasks/icons-accents.ts @@ -0,0 +1,127 @@ +import * as fs from 'fs'; +import * as gulp from 'gulp'; +import * as gutil from 'gulp-util'; +import * as path from 'path'; + +import { MESSAGE_GENERATED, MESSAGE_ICON_ACCENTS_ERROR } from "../consts/log"; + +import { CHARSET } from "../../extensions/consts/files"; +import { IDefaults } from "../../extensions/interfaces/idefaults"; +import { IThemeIconsAccents } from "../interfaces/itheme-icons-accents"; +import PATHS from '../../extensions/consts/paths' +import { IThemeIconsItem } from '../interfaces/itheme-icons-item'; +import { getAccentableIcons } from '../../extensions/helpers/fs'; + +const BASE_ICON_THEME_PATH: string = path.join(process.cwd(), PATHS.THEMES, './Material-Theme-Icons.json'); +const DEFAULTS: IDefaults = require('../../extensions/defaults.json'); + +/** + * Normalizes icon path + * @param {string} iconPath + * @returns {string} + */ +function normalizeIconPath(iconPath: string): string { + return path.join(process.cwd(), PATHS.ICONS, iconPath); +} + +/** + * Replaces a file name with the accented filename + * @param {string} name + * @param {string} accentName + * @returns {string} + */ +function replaceNameWithAccent(name: string, accentName: string): string { + return name.replace('.svg', `.accent.${ accentName }.svg`); +} + +/** + * Replaces a SVG colour + * + * @param {string} filecontent + * @param {string} colour + * @returns {string} + */ +export function replaceSVGColour(filecontent: string, colour: string): string { + return filecontent.replace(new RegExp('#(80CBC4)', 'i'), ($0, $1) => { + + colour = colour.replace('#', ''); + console.log(`Replacing colour ${ $1 } with ${ colour }`) + return $0.replace($1, colour); + }); +} + +/** + * Replaces white spaces in accents' names + * @param {string} input + * @returns {string} + */ +function replaceWhiteSpaces(input: string): string { + return input.replace(/\s+/g, '-'); +} + +/** + * Writes a new svg file + * @param {string} fromFile + * @param {string} toFile + * @param {string} accentColour + */ +function writeSVGIcon(fromFile: string, toFile: string, accent: string): void { + let fileContent: string = fs.readFileSync(normalizeIconPath(fromFile), CHARSET); + let content: string = replaceSVGColour(fileContent, DEFAULTS.accents[accent]); + toFile = normalizeIconPath(toFile); + + gutil.log(gutil.colors.gray(`Accented icon ${toFile} created with colour ${ accent } (${ DEFAULTS.accents[accent] })`)); + + fs.writeFileSync(toFile, content); +} + +// Exports task to index.ts +export default gulp.task('build:icons.accents', cb => { + let basetheme: IThemeIconsAccents; + + try { + basetheme = require(BASE_ICON_THEME_PATH); + + Object.keys(DEFAULTS.accents).forEach(key => { + let iconName = replaceWhiteSpaces(key); + let themecopy: IThemeIconsAccents = JSON.parse(JSON.stringify(basetheme)); + let themePath: string = path.join(PATHS.THEMES, `./Material-Theme-Icons-${ key }.json`); + + getAccentableIcons().forEach(accentableIconName => { + gutil.log(gutil.colors.gray(`Preparing ${ accentableIconName } accented icon`)); + + let iconOriginDefinition: IThemeIconsItem = (basetheme.iconDefinitions as any)[accentableIconName]; + let iconCopyDefinition: IThemeIconsItem = (themecopy.iconDefinitions as any)[accentableIconName]; + + if (iconOriginDefinition !== undefined && typeof iconOriginDefinition.iconPath === 'string' && iconCopyDefinition !== undefined && typeof iconCopyDefinition.iconPath === 'string') { + iconCopyDefinition.iconPath = replaceNameWithAccent(iconOriginDefinition.iconPath, iconName); + writeSVGIcon(iconOriginDefinition.iconPath, iconCopyDefinition.iconPath, key); + } else { + gutil.log(gutil.colors.yellow(`Icon ${ accentableIconName } not found`)) + } + }); + + // themecopy.iconDefinitions._folder_open.iconPath = replaceNameWithAccent(basetheme.iconDefinitions._folder_open.iconPath, iconName); + // themecopy.iconDefinitions._folder_open_build.iconPath = replaceNameWithAccent(basetheme.iconDefinitions._folder_open_build.iconPath, iconName); + + // writeSVGIcon(basetheme.iconDefinitions._folder_open.iconPath, themecopy.iconDefinitions._folder_open.iconPath, key); + // writeSVGIcon(basetheme.iconDefinitions._folder_open_build.iconPath, themecopy.iconDefinitions._folder_open_build.iconPath, key); + + // fs.writeFileSync(themePath, JSON.stringify(themecopy)); + + // addContributeIconTheme(id, label, themepathJSON, PACKAGE_JSON); + + gutil.log(gutil.colors.green(MESSAGE_GENERATED, themePath)); + }); + + // writePackageJSON(PACKAGE_JSON); + + } catch (error) { + // http://ragefaces.memesoftware.com/faces/large/misc-le-fu-l.png + gutil.log(gutil.colors.red(MESSAGE_ICON_ACCENTS_ERROR)); + cb(error); + return; + } + + cb(); +}); \ No newline at end of file diff --git a/.gulp/tasks/icons-variants.ts b/.gulp/tasks/icons-variants.ts new file mode 100644 index 0000000..c95f049 --- /dev/null +++ b/.gulp/tasks/icons-variants.ts @@ -0,0 +1,60 @@ +import {getVariantIcons} from '../../extensions/helpers/fs'; +import * as gulp from 'gulp'; +import * as path from 'path'; +import * as fs from 'fs'; + +import { CHARSET } from "../../extensions/consts/files"; +import { IPackageJSON } from "../../extensions/interfaces/ipackage.json"; +import { IThemeIconsVariants } from "../interfaces/itheme-icons-variants"; +import PATHS from '../../extensions/consts/paths' +import { getDefaultValues } from "../../extensions/helpers/fs"; +import { IDefaultsThemeVariantColours } from "../../extensions/interfaces/idefaults"; +import { IThemeIconsItem } from '../interfaces/itheme-icons-item'; + +const PACKAGE_JSON: IPackageJSON = require(path.join(process.cwd(), './package.json')); + +let variants: IDefaultsThemeVariantColours = getDefaultValues().themeVariantsColours; + +function writeIconVariant(filepath: string, destpath: string, colour: string): void { + let regexp = new RegExp('(#4a616c)', 'i') + filepath = path.join(process.cwd(), PATHS.ICONS, filepath); + destpath = path.join(process.cwd(), PATHS.ICONS, destpath); + fs.writeFileSync(destpath, fs.readFileSync(filepath, CHARSET).replace(regexp, ($0, $1) => $0.replace($1, colour)), { encoding: CHARSET }) ; +} + + +export default gulp.task('build:icons.variants', callback => { + try { + Object.keys(variants).forEach(variantName => { + PACKAGE_JSON.contributes.iconThemes.forEach(contribute => { + let regexpCheck: RegExp = new RegExp(Object.keys(variants).join('|'), 'i'); + + if (regexpCheck.test(contribute.path) || regexpCheck.test(contribute.id)) return; + + let basepath: string = path.join(process.cwd(), contribute.path); + let basetheme: IThemeIconsVariants = require(basepath); + let theme: IThemeIconsVariants = JSON.parse(JSON.stringify(basetheme)); + let variant = variants[variantName]; + + getVariantIcons().forEach(_iconName => { + let basethemeIcon: IThemeIconsItem = (basetheme.iconDefinitions as any)[_iconName]; + let themeIcon: IThemeIconsItem = (theme.iconDefinitions as any)[_iconName]; + + if (themeIcon !== undefined) { + themeIcon.iconPath = themeIcon.iconPath.replace('.svg', `${ variantName }.svg`); + } + + if (basethemeIcon !== undefined && themeIcon !== undefined) { + writeIconVariant(basethemeIcon.iconPath, themeIcon.iconPath, variant); + } + }); + }); + }); + + } catch (error) { + callback(error); + return; + } + + callback(); +}); \ No newline at end of file diff --git a/.gulp/tasks/icons.ts b/.gulp/tasks/icons.ts new file mode 100644 index 0000000..da574b7 --- /dev/null +++ b/.gulp/tasks/icons.ts @@ -0,0 +1,82 @@ +import * as fs from 'fs'; +import * as gulp from 'gulp'; +import * as gutil from 'gulp-util'; +import * as mustache from 'mustache'; +import * as path from 'path'; + +import { HR, MESSAGE_GENERATED, MESSAGE_ICON_ERROR } from './../consts/log'; + +import { CHARSET } from "../../extensions/consts/files"; +import { IGenericObject } from "../../extensions/interfaces/igeneric-object"; +import { IIcon } from './../interfaces/iicon'; +import paths from '../../extensions/consts/paths'; +import { ensureDir } from '../../extensions/helpers/fs'; + +/** + * Returns an object implementing the IIcon interface + * @param {string} fileName + * @returns {IIcon} + */ +function iconFactory(fileName: string): IIcon { + gutil.log(gutil.colors.gray(`Processing icon ${ fileName }`)) + let name: string = path.basename(fileName, path.extname(fileName)); + let filename: string = name; + let last: boolean = false; + + // renaming icon for vscode + // if the icon filename starts with a folder prefix, + // the resulting name will be prefixed only by an underscore, + // otherwise the icon will be prefixed by a _file_ prefix + if (name.indexOf('folder')) { + name = name.indexOf('file') ? `_file_${ name }` : `_${ name }`; + } else { + name = `_${ name }`; + } + + gutil.log(gutil.colors.gray(`VSCode icon name ${ name } with filename ${ filename }`)); + + return { filename, name, last } as IIcon; +} + +/** + * > Build Icons + * @returns {gulp.Gulp} + */ +export default gulp.task('build:icons', cb => { + let contents: string; + let fileNames: string[] = fs.readdirSync(path.join(paths.SRC, `./icons/svgs`)); + let icons: IIcon[] = fileNames.map(fileName => iconFactory(fileName)); + let partials: string[] = fs.readdirSync(path.join(paths.SRC, `./icons/partials`)); + let partialsData: IGenericObject = {}; + let pathTemp: string = './themes/.material-theme-icons.tmp'; + + ensureDir(path.join(paths.THEMES)); + + icons[icons.length - 1].last = true; + + partials.forEach(partial => { + partialsData[path.basename(partial, path.extname(partial))] = fs.readFileSync(path.join(paths.SRC, `./icons/partials`, `./${partial}`), CHARSET); + }); + + contents = mustache.render( + fs.readFileSync(path.join(paths.SRC, `./icons/icons-theme.json`), CHARSET) + , { icons } + , partialsData + ); + + try { + contents = JSON.stringify(JSON.parse(contents), null, 2); + } catch (error) { + gutil.log(gutil.colors.red(MESSAGE_ICON_ERROR), error); + cb(error); + return; + } + + fs.writeFileSync(pathTemp, contents, { encoding: CHARSET }); + + gutil.log(gutil.colors.gray(HR)); + gutil.log(MESSAGE_GENERATED, gutil.colors.green(pathTemp)); + gutil.log(gutil.colors.gray(HR)); + + cb(); +}); diff --git a/.gulp/tasks/themes.ts b/.gulp/tasks/themes.ts new file mode 100644 index 0000000..9dca1a8 --- /dev/null +++ b/.gulp/tasks/themes.ts @@ -0,0 +1,60 @@ +import * as fs from 'fs'; +import * as gulp from 'gulp'; +import * as gulpUtil from 'gulp-util'; +import * as mustache from 'mustache'; +import * as path from 'path'; + +import { HR, MESSAGE_GENERATED, MESSAGE_THEME_VARIANT_PARSE_ERROR } from './../consts/log'; + +import { CHARSET } from "../../extensions/consts/files"; +import { IDefaults } from "../../extensions/interfaces/idefaults"; +import { IThemeVariant } from './../interfaces/itheme-variant'; +import paths from '../../extensions/consts/paths'; +import { ensureDir } from '../../extensions/helpers/fs'; + +let commons: IDefaults = require('../../extensions/defaults.json'); + +let themeTemplateFileContent: string = fs.readFileSync(path.join(paths.SRC, `/themes/theme-template-color-theme.json`), CHARSET); +let themeVariants: IThemeVariant[] = []; + +let fileNames: string[] = fs.readdirSync(path.join(paths.SRC, `./themes/settings/specific`)); + +// build theme variants for later use in templating +fileNames.forEach(fileName => { + let filePath: string = path.join(paths.SRC, `./themes/settings/specific`, `./${fileName}`); + let contents: string = fs.readFileSync(filePath, CHARSET); + + try { + themeVariants.push(JSON.parse(contents)); + } catch (error) { + gulpUtil.log(MESSAGE_THEME_VARIANT_PARSE_ERROR, error); + } +}); + +/** + * Themes task + * Builds Themes + */ +export default gulp.task('build:themes', cb => { + gulpUtil.log(gulpUtil.colors.gray(HR)); + + ensureDir(path.join(paths.THEMES)); + + try { + themeVariants.forEach(variant => { + let filePath = path.join(paths.THEMES, `./${variant.name}.json`); + let templateData = { commons, variant }; + let templateJSON: any = JSON.parse(mustache.render(themeTemplateFileContent, templateData)); + let templateJSONStringified: string = JSON.stringify(templateJSON, null, 2); + + fs.writeFileSync(filePath, templateJSONStringified, { encoding: CHARSET }); + + gulpUtil.log(MESSAGE_GENERATED, gulpUtil.colors.green(filePath)); + }); + } catch (exception) { + gulpUtil.log(exception); + cb(exception); + } + + gulpUtil.log(gulpUtil.colors.gray(HR)); +}); diff --git a/.gulp/tasks/watcher.ts b/.gulp/tasks/watcher.ts new file mode 100644 index 0000000..e0be4d1 --- /dev/null +++ b/.gulp/tasks/watcher.ts @@ -0,0 +1,14 @@ +import * as gulp from "gulp"; +import * as path from "path"; + +import Paths from "../../extensions/consts/paths"; + +/* + * > Watcher + * Watches files and build the themes + */ +export default gulp.task('watch', () => { + // Commented due + // gulp.watch(path.join(Paths.SRC, `./themes/**/*.json`), ['build:themes']); + gulp.watch(path.join(Paths.SRC, `./themes/**/*.json`)); +}); \ No newline at end of file diff --git a/.npmrc b/.npmrc new file mode 100644 index 0000000..aea17fd --- /dev/null +++ b/.npmrc @@ -0,0 +1,4 @@ +git-tag-version = false +tag-version-prefix = +save-exact = true +progress = true \ No newline at end of file diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..acc9440 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,56 @@ +{ + // Use IntelliSense to learn about possible Node.js debug attributes. + // Hover to view descriptions of existing attributes. + // For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387 + "version": "0.2.0", + "configurations": [ + { + "type": "node", + "request": "launch", + "name": "Gulp build-icons-variants", + "program": "${workspaceRoot}/node_modules/gulp/bin/gulp.js", + "args": [ + "build:icons.variants" + ] + }, + { + "type": "node", + "request": "launch", + "name": "Gulp build-icons", + "program": "${workspaceRoot}/node_modules/gulp/bin/gulp.js", + "args": [ + "build:icons.accents" + ] + }, + { + "name": "Launch Extension", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceRoot}" + ], + "stopOnEntry": false, + "sourceMaps": true, + "outFiles": [ + "${workspaceRoot}/out/src/**/*.js" + ] + }, + { + "name": "Launch Tests", + "type": "extensionHost", + "request": "launch", + "runtimeExecutable": "${execPath}", + "args": [ + "--extensionDevelopmentPath=${workspaceRoot}", + "--extensionTestsPath=${workspaceRoot}/out/test" + ], + "stopOnEntry": false, + "sourceMaps": true, + "outFiles": [ + "${workspaceRoot}/out/test/**/*.js" + ], + "preLaunchTask": "npm" + } + ] +} \ No newline at end of file diff --git a/.vscode/settings.json b/.vscode/settings.json new file mode 100644 index 0000000..e3fc186 --- /dev/null +++ b/.vscode/settings.json @@ -0,0 +1,29 @@ +{ + "editor.tabSize": 2, + "editor.insertSpaces": true, + "files.exclude": { + "**/.git": true, + ".git-crypt": true, + "**/.svn": true, + "**/.hg": true, + "**/CVS": true, + "**/.DS_Store": true, + "**/*.js": { + "when": "$(basename).ts" + }, + "**/*.js.map": true + }, + "files.associations": { + "*.template": "json" + }, + "html.format.preserveNewLines": true, + "files.trimTrailingWhitespace": true, + "[markdown]": { + "diffEditor.ignoreTrimWhitespace": false, + "editor.tabSize": 4, + "editor.wordWrap": "on", + "editor.quickSuggestions": false + }, + "gulp.autoDetect": "off", + "npm.autoDetect": "off" +} \ No newline at end of file diff --git a/.vscode/tasks.json b/.vscode/tasks.json new file mode 100644 index 0000000..97c75a8 --- /dev/null +++ b/.vscode/tasks.json @@ -0,0 +1,89 @@ +// Available variables which can be used inside of strings. +// ${workspaceRoot}: the root folder of the team +// ${file}: the current opened file +// ${fileBasename}: the current opened file's basename +// ${fileDirname}: the current opened file's dirname +// ${fileExtname}: the current opened file's extension +// ${cwd}: the current working directory of the spawned process +// A task runner that calls a custom npm script that compiles the extension. +{ + "version": "2.0.0", + // tasks list (build, build-theme, semver etc) + "tasks": [ + { + "args": [ + "run", + "build" + ], + "command": "npm", + "dependsOn": "tsc", + "taskName": "build", + "group": { + "kind": "build", + "isDefault": true + }, + "problemMatcher": [] + }, + { + "linux": { + "args": [ + ".", + "-name", + "\"*.js\"", + "-not", + "-path", + "\"./node_modules/*\"", + "-not", + "-path", + "\"./src/*\"", + "-not", + "-path", + "\"./test/*\"", + "-type", + "f", + "-delete" + ], + "command": "find" + }, + "osx": { + "args": [ + ".", + "-name", + "\"*.js\"", + "-not", + "-path", + "\"./node_modules/*\"", + "-not", + "-path", + "\"./src/*\"", + "-not", + "-path", + "\"./test/*\"", + "-type", + "f", + "-delete" + ], + "command": "find" + }, + "command": "", + "taskName": "clean project" + }, + { + "args": [ + "run", + "changelog" + ], + "command": "npm", + "taskName": "changelog" + }, + { + "args": [ + "-p", + "." + ], + "command": "tsc", + "dependsOn": "clean project", + "taskName": "tsc" + } + ] +} \ No newline at end of file diff --git a/.vscodeignore b/.vscodeignore new file mode 100644 index 0000000..420a7ae --- /dev/null +++ b/.vscodeignore @@ -0,0 +1,17 @@ +*.log +*.ts +**/*.map +.github +.gitignore +.gulp +.vscode/** +assets/ +gulpfile.babel.ts +node_modules +out/test/** +src/** +test/** +tsconfig.json +typings/** +vsc-extension-quickstart.md +yarn.lock \ No newline at end of file diff --git a/.yarnrc b/.yarnrc new file mode 100644 index 0000000..1b2af90 --- /dev/null +++ b/.yarnrc @@ -0,0 +1,2 @@ +save-exact true +save-prefix false \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md new file mode 100644 index 0000000..d6c4a4e --- /dev/null +++ b/CHANGELOG.md @@ -0,0 +1,352 @@ +# Material Theme Changelog + +All notable changes to this project will be documented in this file. See [standard-version](https://github.com/conventional-changelog/standard-version) for commit guidelines. + + +# [1.6.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.5.1...v1.6.0) (2018-04-15) + + +### Bug Fixes + +* Add babel icon to .babelrc.json files ([41fe77c](https://github.com/equinusocio/vsc-material-theme/commit/41fe77c)), closes [#154](https://github.com/equinusocio/vsc-material-theme/issues/154) + + +### Features + +* Add .gitlab-ci.yml file icon ([5b5c9ec](https://github.com/equinusocio/vsc-material-theme/commit/5b5c9ec)), closes [#155](https://github.com/equinusocio/vsc-material-theme/issues/155) + + + + +## [1.5.1](https://github.com/equinusocio/vsc-material-theme/compare/v1.5.0...v1.5.1) (2018-03-10) + + +### Bug Fixes + +* Fix notifications background. Close [#143](https://github.com/equinusocio/vsc-material-theme/issues/143) ([8981088](https://github.com/equinusocio/vsc-material-theme/commit/8981088)), closes [#142](https://github.com/equinusocio/vsc-material-theme/issues/142) + + + + +# [1.5.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.4.0...v1.5.0) (2018-03-08) + + +### Bug Fixes + +* Add support for the new notifications UX ([008bac1](https://github.com/equinusocio/vsc-material-theme/commit/008bac1)) + + +### Features + +* Highlight line number on selected line ([cf69a74](https://github.com/equinusocio/vsc-material-theme/commit/cf69a74)) + + + + +# [1.4.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.3.0...v1.4.0) (2018-02-19) + + +### Bug Fixes + +* Fix constants color in php language ([444cf9a](https://github.com/equinusocio/vsc-material-theme/commit/444cf9a)), closes [#138](https://github.com/equinusocio/vsc-material-theme/issues/138) +* Fix input validation colors contrast ([30df0a6](https://github.com/equinusocio/vsc-material-theme/commit/30df0a6)) + + +### Features + +* Add a subtle highlight on tab hover ([405000e](https://github.com/equinusocio/vsc-material-theme/commit/405000e)) + + + + +## [1.4.3](https://github.com/equinusocio/vsc-material-theme/compare/v1.4.0...v1.4.3) (2018-02-19) + + + + +# [1.4.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.3.0...v1.4.0) (2018-02-19) + + +### Bug Fixes + +* Fix constants color in php language ([444cf9a](https://github.com/equinusocio/vsc-material-theme/commit/444cf9a)), closes [#138](https://github.com/equinusocio/vsc-material-theme/issues/138) +* Fix input validation colors contrast ([30df0a6](https://github.com/equinusocio/vsc-material-theme/commit/30df0a6)) + + +### Features + +* Add a subtle highlight on tab hover ([405000e](https://github.com/equinusocio/vsc-material-theme/commit/405000e)) + + + + +# [1.3.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.2.0...v1.3.0) (2018-01-21) + + +### Bug Fixes + +* Fix editor rule color ([2732da4](https://github.com/equinusocio/vsc-material-theme/commit/2732da4)) +* Fix highlight backgrounds in PeekView ([b66e88e](https://github.com/equinusocio/vsc-material-theme/commit/b66e88e)) +* Temporary fix to git edited file background when list is inactive ([6b1925e](https://github.com/equinusocio/vsc-material-theme/commit/6b1925e)) +* Update main field of package.json ([#130](https://github.com/equinusocio/vsc-material-theme/issues/130)) ([40dd529](https://github.com/equinusocio/vsc-material-theme/commit/40dd529)) + + +### Features + +* Add gulp icon to gulp-config.js files ([83c058f](https://github.com/equinusocio/vsc-material-theme/commit/83c058f)), closes [#128](https://github.com/equinusocio/vsc-material-theme/issues/128) +* Add zephyr file icon ([9e64343](https://github.com/equinusocio/vsc-material-theme/commit/9e64343)), closes [#124](https://github.com/equinusocio/vsc-material-theme/issues/124) + + + + +# [1.2.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.1.2...v1.2.0) (2017-12-29) + + +### Features + +* Add ci folder icon ([a2ba7f8](https://github.com/equinusocio/vsc-material-theme/commit/a2ba7f8)), closes [#119](https://github.com/equinusocio/vsc-material-theme/issues/119) +* Add laravel blade file icon ([f7070f4](https://github.com/equinusocio/vsc-material-theme/commit/f7070f4)), closes [#114](https://github.com/equinusocio/vsc-material-theme/issues/114) +* Add reason (.re, .rei) file icon ([384d8d2](https://github.com/equinusocio/vsc-material-theme/commit/384d8d2)) + + + + +## [1.1.2](https://github.com/equinusocio/vsc-material-theme/compare/v1.1.0...v1.1.2) (2017-11-14) + + +### Bug Fixes + +* Add dist folder icon ([a6600d2](https://github.com/equinusocio/vsc-material-theme/commit/a6600d2)) +* Add test folder icon ([0a73ce4](https://github.com/equinusocio/vsc-material-theme/commit/0a73ce4)) +* Improve markdown highlight ([dc9a6fa](https://github.com/equinusocio/vsc-material-theme/commit/dc9a6fa)), closes [#113](https://github.com/equinusocio/vsc-material-theme/issues/113) +* Improve src folder icon ([e06b881](https://github.com/equinusocio/vsc-material-theme/commit/e06b881)) +* New bower_components folder icon ([adcb304](https://github.com/equinusocio/vsc-material-theme/commit/adcb304)) +* Update .git folder icon ([2f37966](https://github.com/equinusocio/vsc-material-theme/commit/2f37966)) +* Update .github folder icon ([d371804](https://github.com/equinusocio/vsc-material-theme/commit/d371804)) +* Update package-lock.json and yarn.lock file icons ([7136700](https://github.com/equinusocio/vsc-material-theme/commit/7136700)), closes [#108](https://github.com/equinusocio/vsc-material-theme/issues/108) + + +### Features + +* Add Rollup js file icon ([5755813](https://github.com/equinusocio/vsc-material-theme/commit/5755813)) + + + + +# [1.1.0](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.5...v1.1.0) (2017-11-04) + + +### Bug Fixes + +* Add babel icon to .babelrc files ([f2a64ab](https://github.com/equinusocio/vsc-material-theme/commit/f2a64ab)), closes [#101](https://github.com/equinusocio/vsc-material-theme/issues/101) +* Add postcss icon to .pcss files ([9eac9c4](https://github.com/equinusocio/vsc-material-theme/commit/9eac9c4)), closes [#107](https://github.com/equinusocio/vsc-material-theme/issues/107) +* Minor UI fixes ([65a18e8](https://github.com/equinusocio/vsc-material-theme/commit/65a18e8)) + + +### Features + +* Add set italic style for keyword operators ([ea9b755](https://github.com/equinusocio/vsc-material-theme/commit/ea9b755)), closes [#99](https://github.com/equinusocio/vsc-material-theme/issues/99) +* Add sidebar git colors support ([0cf2007](https://github.com/equinusocio/vsc-material-theme/commit/0cf2007)) +* New folder icons ([2dfbaaa](https://github.com/equinusocio/vsc-material-theme/commit/2dfbaaa)) +* New High Contrast theme variants. ([79d68b3](https://github.com/equinusocio/vsc-material-theme/commit/79d68b3)) +* Remove arrow icons beside folders in explorer view ([28006e5](https://github.com/equinusocio/vsc-material-theme/commit/28006e5)) + + + + +## [1.0.5](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.4...v1.0.5) (2017-10-12) + + +### Bug Fixes + +* Fix show changelog command ([370a4d9](https://github.com/equinusocio/vsc-material-theme/commit/370a4d9)) +* Improve tab inactive foreground contrast ([c3d0b82](https://github.com/equinusocio/vsc-material-theme/commit/c3d0b82)) + + +### Features + +* Add .asp, .aspx and .ascx file icon ([f7d4af0](https://github.com/equinusocio/vsc-material-theme/commit/f7d4af0)), closes [#96](https://github.com/equinusocio/vsc-material-theme/issues/96) +* Add .mjs file icon ([605b8bf](https://github.com/equinusocio/vsc-material-theme/commit/605b8bf)), closes [#93](https://github.com/equinusocio/vsc-material-theme/issues/93) +* Add .yarnrc and .npmrc file icon ([f715cd0](https://github.com/equinusocio/vsc-material-theme/commit/f715cd0)) +* Add colors for sidebar git.untracked and git.modified files ([3f1077d](https://github.com/equinusocio/vsc-material-theme/commit/3f1077d)) + + + + +## [1.0.3](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.2...v1.0.3) (2017-09-27) + + +### Bug Fixes + +* Fix brackets color (punctuation.class...). Fix [#76](https://github.com/equinusocio/vsc-material-theme/issues/76) ([02d20b7](https://github.com/equinusocio/vsc-material-theme/commit/02d20b7)) +* Fix wrong gutter indicator for add line. Close 89 ([83df9f9](https://github.com/equinusocio/vsc-material-theme/commit/83df9f9)) +* Update gutter line colors. Fix [#79](https://github.com/equinusocio/vsc-material-theme/issues/79) ([0298a59](https://github.com/equinusocio/vsc-material-theme/commit/0298a59)) + + +### Features + +* Add tab active bottom border ([5bd1934](https://github.com/equinusocio/vsc-material-theme/commit/5bd1934)), closes [#88](https://github.com/equinusocio/vsc-material-theme/issues/88) +* Adds "show changelog" command. ([038ded7](https://github.com/equinusocio/vsc-material-theme/commit/038ded7)) + + + + +## [1.0.2](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.1...v1.0.2) (2017-07-25) + + +### Bug Fixes + +* Fix squiggles visibility ([0900c30](https://github.com/equinusocio/vsc-material-theme/commit/0900c30)), closes [#70](https://github.com/equinusocio/vsc-material-theme/issues/70) +* Fixes an issues with the old settings "materialTheme.cache.workbench.accent". ([6c2ce83](https://github.com/equinusocio/vsc-material-theme/commit/6c2ce83)) +* Fixes an unhandled undefined, which causes theme to break (issue [#69](https://github.com/equinusocio/vsc-material-theme/issues/69)). ([14a471f](https://github.com/equinusocio/vsc-material-theme/commit/14a471f)) + + + + +## [1.0.1](https://github.com/equinusocio/vsc-material-theme/compare/v1.0.0...v1.0.1) (2017-07-24) + + +### Bug Fixes + +* Add .ex file icon ([b6eb130](https://github.com/equinusocio/vsc-material-theme/commit/b6eb130)), closes [#60](https://github.com/equinusocio/vsc-material-theme/issues/60) +* Add accent color to progressbar ([4758c45](https://github.com/equinusocio/vsc-material-theme/commit/4758c45)) +* Add squigglies color ([8502a39](https://github.com/equinusocio/vsc-material-theme/commit/8502a39)) +* Fix editor marker navigation color ([16230f2](https://github.com/equinusocio/vsc-material-theme/commit/16230f2)) +* Fix notification bar badge colors ([a3428ab](https://github.com/equinusocio/vsc-material-theme/commit/a3428ab)) +* Fix python special var parameter color ([027b342](https://github.com/equinusocio/vsc-material-theme/commit/027b342)), closes [#57](https://github.com/equinusocio/vsc-material-theme/issues/57) +* Fix theme variants and settings reload ([ada03ed](https://github.com/equinusocio/vsc-material-theme/commit/ada03ed)) +* Improve workbench theme and colors ([4798102](https://github.com/equinusocio/vsc-material-theme/commit/4798102)) + + + + +# [1.0.0](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.17...v1.0.0) (2017-06-19) + + +### Bug Fixes + +* Add and update file icons ([ef9abab](https://github.com/equinusocio/vsc-material-theme/commit/ef9abab)) +* Fix inputs placeholder color ([6d5cef6](https://github.com/equinusocio/vsc-material-theme/commit/6d5cef6)) +* Fix tree selected foreground when sidebar is inactive ([351cd20](https://github.com/equinusocio/vsc-material-theme/commit/351cd20)) +* Improve sidebar tree coloring ([4993587](https://github.com/equinusocio/vsc-material-theme/commit/4993587)) +* Style welcome page links ([e873530](https://github.com/equinusocio/vsc-material-theme/commit/e873530)) + + +### Features + +* adds theme accents config. ([c648ab8](https://github.com/equinusocio/vsc-material-theme/commit/c648ab8)) +* Adds theme changer command ([cb68fdc](https://github.com/equinusocio/vsc-material-theme/commit/cb68fdc)) + + + + +## [0.0.17](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.16...v0.0.17) (2017-05-22) + + +### Bug Fixes + +* Fix inactive group inactive tab foreground ([2d52311](https://github.com/equinusocio/vsc-material-theme/commit/2d52311)), closes [#47](https://github.com/equinusocio/vsc-material-theme/issues/47) +* Improve sidebar colorization ([9cf9f34](https://github.com/equinusocio/vsc-material-theme/commit/9cf9f34)) + + +### Features + +* Add puppet (.pp) file icon ([d2dc180](https://github.com/equinusocio/vsc-material-theme/commit/d2dc180)) + + + + +## [0.0.16](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.15...v0.0.16) (2017-05-18) + + +### Bug Fixes + +* Fix C file icon ([8a5a331](https://github.com/equinusocio/vsc-material-theme/commit/8a5a331)), closes [#46](https://github.com/equinusocio/vsc-material-theme/issues/46) +* Fix the waterfall of bleed words ([6d001c4](https://github.com/equinusocio/vsc-material-theme/commit/6d001c4)), closes [#44](https://github.com/equinusocio/vsc-material-theme/issues/44) +* Fix the waterfall of blooding words ([8b62470](https://github.com/equinusocio/vsc-material-theme/commit/8b62470)), closes [#44](https://github.com/equinusocio/vsc-material-theme/issues/44) +* Improve tree colors (wip) ([d9a1f2c](https://github.com/equinusocio/vsc-material-theme/commit/d9a1f2c)) +* Panel hover borders ([a83dfcb](https://github.com/equinusocio/vsc-material-theme/commit/a83dfcb)) + + + + +## [0.0.15](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.14...v0.0.15) (2017-05-17) + + + + +## [0.0.14](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.13...v0.0.14) (2017-05-16) + + +### Bug Fixes + +* Fix bracket match border color ([4f778f1](https://github.com/equinusocio/vsc-material-theme/commit/4f778f1)) +* Fix invalids color highlight ([100397c](https://github.com/equinusocio/vsc-material-theme/commit/100397c)), closes [#40](https://github.com/equinusocio/vsc-material-theme/issues/40) +* Fix notification bar foreground on Lighter ([c177e46](https://github.com/equinusocio/vsc-material-theme/commit/c177e46)), closes [#34](https://github.com/equinusocio/vsc-material-theme/issues/34) +* Fix selectionHighlightBackground color ([9578f38](https://github.com/equinusocio/vsc-material-theme/commit/9578f38)), closes [#38](https://github.com/equinusocio/vsc-material-theme/issues/38) +* improve C# highlight ([c72c314](https://github.com/equinusocio/vsc-material-theme/commit/c72c314)), closes [#26](https://github.com/equinusocio/vsc-material-theme/issues/26) +* Improve c++ syntax highlight ([1a927d6](https://github.com/equinusocio/vsc-material-theme/commit/1a927d6)) +* Temporary fix buttons background ([f97d06a](https://github.com/equinusocio/vsc-material-theme/commit/f97d06a)), closes [#37](https://github.com/equinusocio/vsc-material-theme/issues/37) + + + + +## [0.0.13](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.12...v0.0.13) (2017-05-10) + + +### Bug Fixes + +* Fix statusbar background when no project opened ([d0a7cbc](https://github.com/equinusocio/vsc-material-theme/commit/d0a7cbc)), closes [#27](https://github.com/equinusocio/vsc-material-theme/issues/27) +* Improve ansi colors (integrated terminal) ([d1fa94f](https://github.com/equinusocio/vsc-material-theme/commit/d1fa94f)) + + +### Features + +* Add build/dist folder icon ([668db44](https://github.com/equinusocio/vsc-material-theme/commit/668db44)), closes [#6](https://github.com/equinusocio/vsc-material-theme/issues/6) +* Improve worckbench theme ([caff8ce](https://github.com/equinusocio/vsc-material-theme/commit/caff8ce)) + + + + +## [0.0.12](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.8...v0.0.12) (2017-05-04) + + +### Bug Fixes + +* Fix folder icon color ([81c03e6](https://github.com/equinusocio/vsc-material-theme/commit/81c03e6)) +* Update workbench theme ([232d1e3](https://github.com/equinusocio/vsc-material-theme/commit/232d1e3)) + + +### Features + +* Add graphql file icon ([ba18877](https://github.com/equinusocio/vsc-material-theme/commit/ba18877)) +* Improve workbench theme ([c7c8038](https://github.com/equinusocio/vsc-material-theme/commit/c7c8038)) +* Update workbench theme ([6ddfaa9](https://github.com/equinusocio/vsc-material-theme/commit/6ddfaa9)) + + + + +## [0.0.8](https://github.com/equinusocio/vsc-material-theme/compare/v0.0.7...v0.0.8) (2017-04-11) + + +### Bug Fixes + +* Add bower icon ([3e73e1f](https://github.com/equinusocio/vsc-material-theme/commit/3e73e1f)) +* Fix background color for highlighted searched string ([060d24d](https://github.com/equinusocio/vsc-material-theme/commit/060d24d)), closes [#4](https://github.com/equinusocio/vsc-material-theme/issues/4) +* fix lighter scheme colors ([2ba1c0d](https://github.com/equinusocio/vsc-material-theme/commit/2ba1c0d)) +* Fix opened folder icon ([40700ca](https://github.com/equinusocio/vsc-material-theme/commit/40700ca)), closes [#1](https://github.com/equinusocio/vsc-material-theme/issues/1) +* Fix some file and folder icons ([b927646](https://github.com/equinusocio/vsc-material-theme/commit/b927646)) +* Fix var hover background ([a8fee8c](https://github.com/equinusocio/vsc-material-theme/commit/a8fee8c)) +* Update json icon ([ce30ff7](https://github.com/equinusocio/vsc-material-theme/commit/ce30ff7)) +* Update some file icons ([cf2a1ee](https://github.com/equinusocio/vsc-material-theme/commit/cf2a1ee)) +* **Icons:** Fix .ts and def ts icons ([4c0cf00](https://github.com/equinusocio/vsc-material-theme/commit/4c0cf00)), closes [#10](https://github.com/equinusocio/vsc-material-theme/issues/10) + + +### Features + +* Add lighter theme (wip) ([0f7d3c2](https://github.com/equinusocio/vsc-material-theme/commit/0f7d3c2)) +* Add Material Theme icon-theme ([7d3b7bd](https://github.com/equinusocio/vsc-material-theme/commit/7d3b7bd)) +* first beta release ([b4dead1](https://github.com/equinusocio/vsc-material-theme/commit/b4dead1)) +* **Icons:** Add new filetype icons ([5bc8002](https://github.com/equinusocio/vsc-material-theme/commit/5bc8002)) +* **Icons:** Add new icons ([3921218](https://github.com/equinusocio/vsc-material-theme/commit/3921218)) +* first full theme implementation (wip) ([c3c42d4](https://github.com/equinusocio/vsc-material-theme/commit/c3c42d4)) diff --git a/CODE_OF_CONDUCT.md b/CODE_OF_CONDUCT.md new file mode 100644 index 0000000..059647c --- /dev/null +++ b/CODE_OF_CONDUCT.md @@ -0,0 +1,46 @@ +# Contributor Covenant Code of Conduct + +## Our Pledge + +In the interest of fostering an open and welcoming environment, we as contributors and maintainers pledge to making participation in our project and our community a harassment-free experience for everyone, regardless of age, body size, disability, ethnicity, gender identity and expression, level of experience, nationality, personal appearance, race, religion, or sexual identity and orientation. + +## Our Standards + +Examples of behavior that contributes to creating a positive environment include: + +* Using welcoming and inclusive language +* Being respectful of differing viewpoints and experiences +* Gracefully accepting constructive criticism +* Focusing on what is best for the community +* Showing empathy towards other community members + +Examples of unacceptable behavior by participants include: + +* The use of sexualized language or imagery and unwelcome sexual attention or advances +* Trolling, insulting/derogatory comments, and personal or political attacks +* Public or private harassment +* Publishing others' private information, such as a physical or electronic address, without explicit permission +* Other conduct which could reasonably be considered inappropriate in a professional setting + +## Our Responsibilities + +Project maintainers are responsible for clarifying the standards of acceptable behavior and are expected to take appropriate and fair corrective action in response to any instances of unacceptable behavior. + +Project maintainers have the right and responsibility to remove, edit, or reject comments, commits, code, wiki edits, issues, and other contributions that are not aligned to this Code of Conduct, or to ban temporarily or permanently any contributor for other behaviors that they deem inappropriate, threatening, offensive, or harmful. + +## Scope + +This Code of Conduct applies both within project spaces and in public spaces when an individual is representing the project or its community. Examples of representing a project or community include using an official project e-mail address, posting via an official social media account, or acting as an appointed representative at an online or offline event. Representation of a project may be further defined and clarified by project maintainers. + +## Enforcement + +Instances of abusive, harassing, or otherwise unacceptable behavior may be reported by contacting the project team at astorino.design@gmail.com. The project team will review and investigate all complaints, and will respond in a way that it deems appropriate to the circumstances. The project team is obligated to maintain confidentiality with regard to the reporter of an incident. Further details of specific enforcement policies may be posted separately. + +Project maintainers who do not follow or enforce the Code of Conduct in good faith may face temporary or permanent repercussions as determined by other members of the project's leadership. + +## Attribution + +This Code of Conduct is adapted from the [Contributor Covenant][homepage], version 1.4, available at [http://contributor-covenant.org/version/1/4][version] + +[homepage]: http://contributor-covenant.org +[version]: http://contributor-covenant.org/version/1/4/ diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md new file mode 100644 index 0000000..3e296f9 --- /dev/null +++ b/CONTRIBUTING.md @@ -0,0 +1,104 @@ +# Contributing guidelines + +> Note: this document is intended as a draft, it will be updated soon + +## Requirements: + +* Nodejs ^6.x +* Visual Studio Code +* GPG Tool + +- [Contributing guidelines](#contributing-guidelines) + - [Requirements:](#requirements) + - [Decrypt content](#decrypt-content) + - [Installing and compiling source](#installing-and-compiling-source) + - [Testing the theme](#testing-the-theme) + - [Adding new Material Theme commands](#adding-new-material-theme-commands) + - [Adding new icons](#adding-new-icons) + - [Financial contributions](#financial-contributions) + - [Credits](#credits) + - [Contributors](#contributors) + - [Backers](#backers) + - [Sponsors](#sponsors) + +## Decrypt content +We use git-crypt to encrypt compiler files. To contribute you need a GPG key public/private associated with your github email. + +1. Export your public key by running + +```gpg --output PATH/FILENAME.gpg --export ASSOCIATEDEMAIL``` + +2. Send the exported `.gpg` file to a contributor that will add you to the trusted people. +3. Fetch and pull then decrypt files with `git-crypt unlock` entering your key password. + +## Installing and compiling source + +First you will have to install node_modules through npm or yarn + +```shell +npm install +# or +yarn install +``` + +To compile to the source code, you have to execute the build task through visual studio code. +First you need to invoke to quick command (on MacOS `āŒ˜P`, while on Linux/windows is `ctrl+p`) +then type `task build` and wait until vsc will have finished the task. + +### Testing the theme + +To test the theme, you will have to go to the debug section, select the *Launch Extension* from debug and execute it. + +### Adding new Material Theme commands + +Soon(ish)Ā® + +### Adding new icons + +* Add your icon to the `~/src/icons/svgs` directory. + +* Add the reference to that icon to the `~/src/icons/partials/fileNames.js` or if your icon is referred to a directory adds the reference to the `~/src/icons/partials/folderNames.js` file, otherwise to `~/src/icons/partials/fileExtensions.js` if is referred to a file extension. + +* If you want to make the icon sensitive to be accented, modify the `~/extensions/defaults.json` file, adding the icon definition to the `accentableIcons` array (e.g. ["_folder_open", "_folder_open_build"]) and the path to the `icons.theme.iconDefinitions` object. The same applies to variants (the variant icons array is called "variantsIcons") + +* Execute the build command. + +* Enjoy your new icons in Material Theme, and don't forget to pull request! + + +## Financial contributions + +We also welcome financial contributions in full transparency on our [open collective](https://opencollective.com/vsc-material-theme). +Anyone can file an expense. If the expense makes sense for the development of the community, it will be "merged" in the ledger of our open collective by the core contributors and the person who filed the expense will be reimbursed. + + +## Credits + + +### Contributors + +Thank you to all the people who have already contributed to vsc-material-theme! + + + +### Backers + +Thank you to all our backers! [[Become a backer](https://opencollective.com/vsc-material-theme#backer)] + + + + +### Sponsors + +Thank you to all our sponsors! (please ask your company to also support this open source project by [becoming a sponsor](https://opencollective.com/vsc-material-theme#sponsor)) + + + + + + + + + + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..f83691d --- /dev/null +++ b/LICENSE @@ -0,0 +1,201 @@ + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ + + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + (except as stated in this section) patent license to make, have made, + use, offer to sell, sell, import, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "{}" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 Mattia Astorino + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. \ No newline at end of file diff --git a/README.md b/README.md new file mode 100644 index 0000000..7423c7e --- /dev/null +++ b/README.md @@ -0,0 +1,185 @@ + +

+ +[![Twitter](https://img.shields.io/twitter/url/https/github.com/equinusocio/vsc-material-theme.svg?style=flat-square)](https://twitter.com/intent/tweet?text=This%20is%20the%20most%20epic%20theme:&url=https%3A%2F%2Fgithub.com%2Fequinusocio%2Fvsc-material-theme) +[![GitHub tag](https://img.shields.io/github/release/equinusocio/vsc-material-theme.svg?style=flat-square)](https://github.com/equinusocio/vsc-material-theme/releases) + + + + +The most epic theme meets Visual Studio Code. You can help by reporting issues [here](https://github.com/equinusocio/vsc-material-theme/issues) + + + +- [Getting started](#getting-started) + - [Installation](#installation) + - [Packaged VSIX Extension](#packaged-vsix-extension) + - [GitHub Repository Clone](#github-repository-clone) + - [Activate theme](#activate-theme) + - [Activate File Icons](#activate-file-icons) + - [Set the accent color](#set-the-accent-color) + - [Override theme colors](#override-theme-colors) +- [Recommended settings for a better experience](#recommended-settings-for-a-better-experience) +- [Other resources](#other-resources) + - [Contributors](#contributors) + - [Backers](#backers) + - [Sponsors](#sponsors) + + + +
+ Screenshots +

+ + + + +

+
+ +# Getting started + +You can install this awesome theme through the [Visual Studio Code Marketplace](https://marketplace.visualstudio.com/items?itemName=Equinusocio.vsc-material-theme). + +## Installation + +Launch *Quick Open* + - Linux `Ctrl+P` + - macOS `āŒ˜P` + - Windows `Ctrl+P` + +Paste the following command and press `Enter`: + +```shell +ext install vsc-material-theme +``` + +#### Packaged VSIX Extension + +[Download the latest .vsix release](https://github.com/equinusocio/vsc-material-theme/releases/latest) file from the GitHub repository and install it from the command line + +```shell +code --install-extension vsc-material-theme-*.*.*.vsix +``` + +or from within VS Code by launching *Quick Open* and running the *Install from VSIX...* command. + +##### GitHub Repository Clone + +Change to your `.vscode/extensions` [VS Code extensions directory](https://code.visualstudio.com/docs/extensions/install-extension#_side-loading). +Depending on your platform it is located in the following folders: + + - **Linux** `~/.vscode/extensions` + - **macOs** `~/.vscode/extensions` + - **Windows** `%USERPROFILE%\.vscode\extensions` + +Clone the Material Theme repository as `Equinusocio.vsc-material-theme`: + +```shell +git clone https://github.com/equinusocio/vsc-material-theme.git Equinusocio.vsc-material-theme +``` + + +## Activate theme + +Launch *Quick Open*, + + - Linux `Ctrl + Shift + P` + - macOS `āŒ˜ + Shift + P` + - Windows `Ctrl + Shift + P` + +Type `theme` and choose `Preferences: Color Theme`, then select Material Theme from the list. + +This theme provides different color variants, to change the active theme variant type `Material Theme` and choose `Material Theme: Settings`, then select `Change color variant` and pick one theme from the list. + +## Activate File Icons + +Launch *Quick Open*, + + - Linux `Ctrl + Shift + P` + - macOS `āŒ˜ + Shift + P` + - Windows `Ctrl + Shift + P` + +type `icon theme` and select `Material Theme Icons` from the drop-down menu. + +## Set the accent color + +Launch *Quick Open*, + + - Linux `Ctrl + Shift + P` + - macOS `āŒ˜ + Shift + P` + - Windows `Ctrl + Shift + P` + +Type `Material Theme` and choose `Material Theme: Settings`, then select `Change accent color` and pick one color from the list. + +## Override theme colors +You can override the material theme ui and schemes colors by adding these theme-specific settings to your configuration. + +```js +"editor.tokenColorCustomizations": { + "[Material Theme]": { + "comments": "#229977" + }, + "..." +}, +"workbench.colorCustomizations": { + "[Material Theme]": { + "sideBar.background": "#347890" + }, + "..." +} +``` + +# Recommended settings for a better experience + +```js +{ + // Controls the font family. + "editor.fontFamily": "Operator Mono", + // Controls the line height. Use 0 to compute the lineHeight from the fontSize. + "editor.lineHeight": 24, + // Enables font ligatures + "editor.fontLigatures": true, + // Controls if file decorations should use badges. + "explorer.decorations.badges": false +} +``` + +# Other resources +- **AppIcon:** [Download](https://github.com/equinusocio/vsc-material-theme/files/989048/vsc-material-theme-appicon.zip) the official Material Theme app icon for Visual Studio code + + +## Contributors + +This project exists thanks to all the people who contribute. [[Contribute]](CONTRIBUTING.md). + + + +## Backers + +Thank you to all our backers! šŸ™ [[Become a backer](https://opencollective.com/vsc-material-theme#backer)] + + + + +## Sponsors + +Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/vsc-material-theme#sponsor)] + + + + + + + + + + + + +--- + +

Copyright © 2017 Mattia Astorino

+ +

diff --git a/assets/header.jpg b/assets/header.jpg new file mode 100644 index 0000000..8a95742 Binary files /dev/null and b/assets/header.jpg differ diff --git a/assets/screen.jpg b/assets/screen.jpg new file mode 100644 index 0000000..e43f02d Binary files /dev/null and b/assets/screen.jpg differ diff --git a/extensions/commands/accents-setter/index.ts b/extensions/commands/accents-setter/index.ts new file mode 100644 index 0000000..3b042e6 --- /dev/null +++ b/extensions/commands/accents-setter/index.ts @@ -0,0 +1,142 @@ +import * as vscode from 'vscode'; + +import {IAccentCustomProperty} from '../../interfaces/iaccent-custom-property'; +import { IDefaults } from "../../interfaces/idefaults"; +import {IGenericObject} from '../../interfaces/igeneric-object'; +import { updateAccent, isMaterialTheme, isMaterialThemeIcons } from "../../helpers/settings"; +import { getCurrentThemeID, getCurrentThemeIconsID, reloadWindow } from "../../helpers/vscode"; +import { THEME_ICONS } from "../theme-icons/index"; + +const REGEXP_HEX: RegExp = /^#([0-9A-F]{6}|[0-9A-F]{8})$/i; + +let themeConfigCommon: IDefaults = require('../../defaults.json'); +let accentsProperties: IGenericObject = { + "activityBarBadge.background": { + alpha: 100, + value: undefined + }, + "list.activeSelectionForeground": { + alpha: 100, + value: undefined + }, + "list.inactiveSelectionForeground": { + alpha: 100, + value: undefined + }, + "list.highlightForeground": { + alpha: 100, + value: undefined + }, + "scrollbarSlider.activeBackground": { + alpha: 50, + value: undefined + }, + "editorSuggestWidget.highlightForeground": { + alpha: 100, + value: undefined + }, + "textLink.foreground": { + alpha: 100, + value: undefined + }, + "progressBar.background": { + alpha: 100, + value: undefined + }, + "pickerGroup.foreground": { + alpha: 100, + value: undefined + }, + "tab.activeBorder": { + alpha: 100, + value: undefined + }, + "notificationLink.foreground": { + alpha: 100, + value: undefined + } +} + +/** + * Assigns colours + * @param {string} colour + * @param {*} config + */ +function assignColorCustomizations(colour: string, config: any): void { + if (!isValidColour(colour)) { + colour = undefined; + } + + Object.keys(accentsProperties).forEach(propertyName => { + let accent: IAccentCustomProperty = accentsProperties[propertyName]; + let _colour = colour; + + if (colour && accent.alpha < 100) { + _colour = `${ colour }${ accent.alpha > 10 ? accent.alpha : `0${ accent.alpha }` }`; + } + + if (accent) { + config[propertyName] = _colour; + } + }); +} + +/** + * Determines if a string is a valid colour + * @param {(string | null | undefined)} colour + * @returns {boolean} + */ +function isValidColour(colour: string | null | undefined): boolean { + if (typeof colour === 'string' && REGEXP_HEX.test(colour)) { + return true; + } + return false; +} + +/** + * Sets workbench options + * @param {string} accentSelected + * @param {*} config + */ +function setWorkbenchOptions(accentSelected: string | undefined, config: any): void { + vscode.workspace.getConfiguration().update('workbench.colorCustomizations', config, true).then(() => { + let themeID = getCurrentThemeID() + let themeIconsID = getCurrentThemeIconsID() + + updateAccent(accentSelected).then(() => { + if (isMaterialTheme(themeID) && isMaterialThemeIcons(themeIconsID)) { + THEME_ICONS().then(() => reloadWindow()); + } + }); + }, reason => { + vscode.window.showErrorMessage(reason); + }); +} + +/** + * VSCode command + */ +export const THEME_ACCENTS_SETTER = () => { + // shows the quick pick dropdown + let options: string[] = Object.keys(themeConfigCommon.accents); + let purgeColourKey: string = 'Remove accents'; + + options.push(purgeColourKey); + + vscode.window.showQuickPick(options).then(accentSelected => { + if (accentSelected === null || accentSelected === undefined) return; + + let config: any = vscode.workspace.getConfiguration().get('workbench.colorCustomizations'); + + switch(accentSelected) { + case purgeColourKey: + assignColorCustomizations(undefined, config); + setWorkbenchOptions(undefined, config); + break; + default: + assignColorCustomizations(themeConfigCommon.accents[accentSelected], config); + setWorkbenchOptions(accentSelected, config); + break; + } + }); +} \ No newline at end of file diff --git a/extensions/commands/theme-icons/index.ts b/extensions/commands/theme-icons/index.ts new file mode 100644 index 0000000..9beb82c --- /dev/null +++ b/extensions/commands/theme-icons/index.ts @@ -0,0 +1,98 @@ +import {getAccentableIcons} from '../../helpers/fs'; +import * as fs from 'fs'; + +import { getAbsolutePath, getDefaultValues, getThemeIconsByContributeID, getThemeIconsContribute, getVariantIcons } from "../../helpers/fs"; +import { getCurrentThemeIconsID } from "../../helpers/vscode"; +import { getCustomSettings, isAccent, isMaterialThemeIcons } from "../../helpers/settings"; + +import { CHARSET } from "../../consts/files"; +import { IPackageJSONThemeIcons } from "../../interfaces/ipackage.json"; +import {IThemeIconsIconPath, IThemeIcons} from '../../interfaces/itheme-icons'; + + +function getIconDefinition(definitions: any, iconname: string): IThemeIconsIconPath { + return (definitions as any)[iconname]; +} + +/** + * Replaces icon path with the accented one. + * @param {string} iconPath + * @param {string} accentName + * @returns {string} + */ +function replaceIconPathWithAccent(iconPath: string, accentName: string): string { + return iconPath.replace('.svg', `.accent.${ accentName }.svg`); +} + +export const THEME_ICONS = () => { + let deferred: any = {}; + let promise = new Promise((resolve, reject) => { + deferred.resolve = resolve; + deferred.reject = reject; + }); + let themeIconsID: string = getCurrentThemeIconsID(); + + if (isMaterialThemeIcons(themeIconsID)) { + let customSettings = getCustomSettings(); + let defaults = getDefaultValues(); + let accentName = customSettings.accent; + let variantName: string = customSettings.themeColours === undefined ? '' : customSettings.themeColours; + let themeContribute: IPackageJSONThemeIcons = getThemeIconsContribute(themeIconsID); + let theme: IThemeIcons = getThemeIconsByContributeID(themeIconsID); + let themepath: string = getAbsolutePath(themeContribute.path); + + if (isAccent(accentName, defaults)) { + let _accentName = accentName.replace(/\s+/, '-'); + + getAccentableIcons().forEach(iconname => { + let distIcon = getIconDefinition(theme.iconDefinitions, iconname); + let outIcon = getIconDefinition(defaults.icons.theme.iconDefinitions, iconname); + + if (typeof distIcon === 'object' && typeof outIcon === 'object') { + distIcon.iconPath = replaceIconPathWithAccent(outIcon.iconPath, _accentName) + } + }) + + // theme.iconDefinitions._folder_open.iconPath = defaults.icons.theme.iconDefinitions._folder_open.iconPath.replace('.svg', `.accent.${ _accentName }.svg`); + // theme.iconDefinitions._folder_open_build.iconPath = defaults.icons.theme.iconDefinitions._folder_open_build.iconPath.replace('.svg', `.accent.${ _accentName }.svg`); + } else { + + getAccentableIcons().forEach(iconname => { + let distIcon = getIconDefinition(theme.iconDefinitions, iconname); + let outIcon = getIconDefinition(defaults.icons.theme.iconDefinitions, iconname); + + distIcon.iconPath = outIcon.iconPath; + }); + // theme.iconDefinitions._folder_open.iconPath = defaults.icons.theme.iconDefinitions._folder_open.iconPath; + // theme.iconDefinitions._folder_open_build.iconPath = defaults.icons.theme.iconDefinitions._folder_open_build.iconPath; + } + + getVariantIcons().forEach(iconname => { + let distIcon = getIconDefinition(theme.iconDefinitions, iconname); + let outIcon = getIconDefinition(defaults.icons.theme.iconDefinitions, iconname); + + if (!!distIcon && !!outIcon) { + distIcon.iconPath = outIcon.iconPath.replace('.svg', `${ variantName }.svg`); + } + }) + + // theme.iconDefinitions._folder_dark.iconPath = defaults.icons.theme.iconDefinitions._folder_dark.iconPath.replace('.svg', `${ variantName }.svg`); + // theme.iconDefinitions._folder_dark_build.iconPath = defaults.icons.theme.iconDefinitions._folder_dark_build.iconPath.replace('.svg', `${ variantName }.svg`); + + // theme.iconDefinitions._folder_light.iconPath = defaults.icons.theme.iconDefinitions._folder_light.iconPath.replace('.svg', `${ variantName }.svg`); + // theme.iconDefinitions["_folder_light_build"].iconPath = defaults.icons.theme.iconDefinitions["_folder_light_build"].iconPath.replace('.svg', `${ variantName }.svg`); + + fs.writeFile(themepath, JSON.stringify(theme), { encoding: CHARSET }, (error) => { + if (error) { + deferred.reject(error); + return; + } + + deferred.resolve(); + }); + } else { + deferred.resolve(); + } + + return promise; +} \ No newline at end of file diff --git a/extensions/commands/theme-variant/index.ts b/extensions/commands/theme-variant/index.ts new file mode 100644 index 0000000..08aaa4f --- /dev/null +++ b/extensions/commands/theme-variant/index.ts @@ -0,0 +1,41 @@ +import * as fs from "fs"; +import * as vscode from 'vscode'; + +import { getAbsolutePath, getDefaultValues, getPackageJSON } from "../../helpers/fs"; +import { getCustomSettings, setCustomSettings } from "../../helpers/settings"; + +import { CHARSET } from "../../consts/files"; +import { THEME_ICONS } from "../theme-icons/index"; +import { reloadWindow } from "../../helpers/vscode"; + +export const THEME_VARIANT = () => { + let defaults = getDefaultValues(); + let options: string[] = Object.keys(defaults.themeVariants); + let packageJSON = getPackageJSON(); + + options = options.filter(i => i !== packageJSON.contributes.themes[0].path); + + vscode.window.showQuickPick(options).then((response: string) => { + if (!response) return; + + let customSettings = getCustomSettings(); + let themepath: string = defaults.themeVariants[response]; + let themeUITheme: string = defaults.themeVariantsUITheme[response]; + + customSettings.themeColours = response; + + packageJSON.contributes.themes[0].path = themepath; + packageJSON.contributes.themes[0].uiTheme = themeUITheme; + + fs.writeFile(getAbsolutePath('./package.json'), JSON.stringify(packageJSON, null, 2), { encoding: CHARSET }, (error) => { + if (error) { + console.trace(error); + return; + } + + setCustomSettings(customSettings).then(() => { + THEME_ICONS().then(() => reloadWindow()).catch(error => console.trace(error)) + }); + }); + }); +} \ No newline at end of file diff --git a/extensions/consts/files.ts b/extensions/consts/files.ts new file mode 100644 index 0000000..ccde74c --- /dev/null +++ b/extensions/consts/files.ts @@ -0,0 +1,5 @@ +/** + * File charset + * @type {string} + */ +export const CHARSET: string = 'utf-8'; \ No newline at end of file diff --git a/extensions/consts/paths.ts b/extensions/consts/paths.ts new file mode 100644 index 0000000..4f673e9 --- /dev/null +++ b/extensions/consts/paths.ts @@ -0,0 +1,13 @@ +import * as path from 'path'; + +import { IPaths } from '../interfaces/ipaths'; + +export const PATHS: IPaths = { + DIST: './dist', + ICONS: './icons', + SRC: './src', + THEMES: './themes', + VSIX_DIR: path.join(__dirname, '../../'), +}; + +export default PATHS; diff --git a/extensions/defaults.json b/extensions/defaults.json new file mode 100644 index 0000000..99e91e8 --- /dev/null +++ b/extensions/defaults.json @@ -0,0 +1,197 @@ +{ + "accents": { + "Acid Lime": "#C6FF00", + "Blue": "#2979FF", + "Breaking Bad": "#388E3C", + "Bright Teal": "#64FFDA", + "Cyan": "#00BCD4", + "Graphite": "#616161", + "Indigo": "#5C6BC0", + "Lime": "#7CB342", + "Orange": "#FF7042", + "Pink": "#FF4081", + "Purple": "#AB47BC", + "Red": "#E57373", + "Sky": "#84FFFF", + "Tomato": "#F44336", + "Teal": "#80CBC4", + "Yellow": "#FFA000" + }, + "accentableIcons": [ + "_folder_open", + "_folder_open_build", + "_folder_vscode_open", + "_folder_gulp_open", + "_folder_node_open", + "_folder_images_open", + "_folder_js_open", + "_folder_src_open", + "_folder_assets_open", + "_folder_bower_open", + "_folder_git_open", + "_folder_github_open", + "_folder_test_open", + "_folder_dist_open", + "_folder_ci_open" + ], + "changelog": { + "lastversion": "1.5.1" + }, + "icons": { + "theme": { + "iconDefinitions": { + "_folder_ci": { + "iconPath": "../icons/folder_ci.svg" + }, + "_folder_ci_open": { + "iconPath": "../icons/folder_ci_open.svg" + }, + "_folder_dist": { + "iconPath": "../icons/folder_dist.svg" + }, + "_folder_dist_open": { + "iconPath": "../icons/folder_dist_open.svg" + }, + "_folder_test": { + "iconPath": "../icons/folder_test.svg" + }, + "_folder_test_open": { + "iconPath": "../icons/folder_test_open.svg" + }, + "_folder_github": { + "iconPath": "../icons/folder_github.svg" + }, + "_folder_github_open": { + "iconPath": "../icons/folder_github_open.svg" + }, + "_folder_git": { + "iconPath": "../icons/folder_git.svg" + }, + "_folder_git_open": { + "iconPath": "../icons/folder_git_open.svg" + }, + "_folder_bower": { + "iconPath": "../icons/folder_bower.svg" + }, + "_folder_bower_open": { + "iconPath": "../icons/folder_bower_open.svg" + }, + "_folder_assets": { + "iconPath": "../icons/folder_assets.svg" + }, + "_folder_assets_open": { + "iconPath": "../icons/folder_assets_open.svg" + }, + "_folder_src": { + "iconPath": "../icons/folder_src.svg" + }, + "_folder_src_open": { + "iconPath": "../icons/folder_src_open.svg" + }, + "_folder_js": { + "iconPath": "../icons/folder_js.svg" + }, + "_folder_js_open": { + "iconPath": "../icons/folder_js_open.svg" + }, + "_folder_images": { + "iconPath": "../icons/folder_images.svg" + }, + "_folder_images_open": { + "iconPath": "../icons/folder_images_open.svg" + }, + "_folder_gulp": { + "iconPath": "../icons/folder_gulp.svg" + }, + "_folder_gulp_open": { + "iconPath": "../icons/folder_gulp_open.svg" + }, + "_folder_node": { + "iconPath": "../icons/folder_node.svg" + }, + "_folder_node_open": { + "iconPath": "../icons/folder_node_open.svg" + }, + "_folder_vscode": { + "iconPath": "../icons/folder_vscode.svg" + }, + "_folder_vscode_open": { + "iconPath": "../icons/folder_vscode_open.svg" + }, + "_folder_dark": { + "iconPath": "../icons/folder_dark.svg" + }, + "_folder_dark_build": { + "iconPath": "../icons/folder_dark_build.svg" + }, + "_folder_light": { + "iconPath": "../icons/folder_light.svg" + }, + "_folder_light_build": { + "iconPath": "../icons/folder_light_build.svg" + }, + "_file_folder": { + "iconPath": "../icons/file_folder.svg" + }, + "_file_folder_build": { + "iconPath": "../icons/file_folder_build.svg" + }, + "_folder_open": { + "iconPath": "../icons/folder_open.svg" + }, + "_folder_open_build": { + "iconPath": "../icons/folder_open_build.svg" + } + } + } + }, + "themeVariants": { + "Darker": "./themes/Material-Theme-Darker.json", + "Darker High Contrast": "./themes/Material-Theme-Darker-High-Contrast.json", + "Default": "./themes/Material-Theme-Default.json", + "Default High Contrast": "./themes/Material-Theme-Default-High-Contrast.json", + "Light": "./themes/Material-Theme-Lighter.json", + "Light High Contrast": "./themes/Material-Theme-Lighter-High-Contrast.json", + "Palenight": "./themes/Material-Theme-Palenight.json", + "Palenight High Contrast": "./themes/Material-Theme-Palenight-High-Contrast.json" + }, + "themeVariantsColours": { + "Darker": "#424242", + "Darker High Contrast": "#424242", + "Default": "#4A616C", + "Default High Contrast": "#4A616C", + "Light": "#90A4AE", + "Light High Contrast": "#90A4AE", + "Palenight": "#4E5579", + "Palenight High Contrast": "#4E5579" + }, + "themeVariantsUITheme": { + "Darker": "vs-dark", + "Darker High Contrast": "vs-dark", + "Default": "vs-dark", + "Default High Contrast": "vs-dark", + "Light": "vs", + "Light High Contrast": "vs", + "Palenight": "vs-dark", + "Palenight High Contrast": "vs-dark" + }, + "variantsIcons": [ + "_folder_dark_build", + "_folder_dark", + "_folder_light_build", + "_folder_light", + "_folder_vscode", + "_folder_gulp", + "_folder_node", + "_folder_images", + "_folder_js", + "_folder_src", + "_folder_assets", + "_folder_bower", + "_folder_git", + "_folder_github", + "_folder_test", + "_folder_dist", + "_folder_ci" + ] +} \ No newline at end of file diff --git a/extensions/helpers/changelog.ts b/extensions/helpers/changelog.ts new file mode 100644 index 0000000..f1edc28 --- /dev/null +++ b/extensions/helpers/changelog.ts @@ -0,0 +1,61 @@ +import * as path from 'path'; +import * as vscode from 'vscode'; + +import { getDefaultValues, getPackageJSON, writeFile } from "./fs"; +import { PATHS } from '../consts/paths'; + +function previewFile(): void { + let uri = vscode.Uri.file(path.join(PATHS.VSIX_DIR, './CHANGELOG.md')); + + vscode.commands.executeCommand('markdown.showPreview', uri); + +} + +function splitVersion(input: string): { major: number, minor: number, patch: number } { + let [ major, minor, patch ] = input.split('.').map(i => parseInt(i)); + return { major, minor, patch }; +} + +export function showChangelog(): void { + let extname: string = 'Microsoft.vscode-markdown'; + let md = vscode.extensions.getExtension(extname); + + if (md === undefined) { + console.warn(`Ext not found ${ extname }`) + return; + } + + if (md.isActive) { + previewFile(); + } else { + md.activate().then(() => { + previewFile(); + }, reason => { + console.warn(reason); + }); + } +} + +export function shouldShowChangelog(): boolean { + let defaults = getDefaultValues(); + let out: boolean; + let packageJSON = getPackageJSON(); + + if (defaults.changelog == undefined || (defaults.changelog !== undefined && typeof defaults.changelog.lastversion !== 'string')) { + defaults.changelog = { + lastversion: packageJSON.version + } + out = true; + } else { + let versionCurrent = splitVersion(packageJSON.version); + let versionOld = splitVersion(defaults.changelog.lastversion); + + out = versionCurrent.major > versionOld.major || versionCurrent.minor > versionOld.minor || versionCurrent.patch > versionOld.patch; + + defaults.changelog.lastversion = packageJSON.version; + } + + writeFile(path.join('./extensions/defaults.json'), JSON.stringify(defaults, null, 2)); + + return out; +} \ No newline at end of file diff --git a/extensions/helpers/fs.ts b/extensions/helpers/fs.ts new file mode 100644 index 0000000..de5e41f --- /dev/null +++ b/extensions/helpers/fs.ts @@ -0,0 +1,106 @@ +import * as fs from 'fs' +import * as path from 'path' + +import { IPackageJSON, IPackageJSONThemeIcons } from "../interfaces/ipackage.json"; + +import { CHARSET } from "../consts/files"; +import { IDefaults } from "../interfaces/idefaults"; +import { IThemeIcons } from "../interfaces/itheme-icons"; +import { PATHS } from "../consts/paths"; + +/** + * @export + * @param {string} dirname + */ +export function ensureDir(dirname: string): void { + if (!fs.existsSync(dirname)) { + fs.mkdirSync(dirname); + } +} + +/** + * Gets default value + * @export + * @returns {IDefaults} + */ +export function getDefaultValues(): IDefaults { + let defaults: IDefaults = require(path.join(PATHS.VSIX_DIR, './extensions/defaults.json')); + + if (defaults === undefined || defaults === null) { + throw new Error('Cannot find defaults params'); + } + + return defaults; +} + +/** + * Gets an absolute path + * + * @export + * @param {string} input + * @returns {string} + */ +export function getAbsolutePath(input: string): string { + return path.join(PATHS.VSIX_DIR, input); +} + +/** + * @export + * @returns {string[]} + */ +export function getAccentableIcons(): string[] { + return getDefaultValues().accentableIcons; +} + +/** + * @export + * @returns {string[]} + */ +export function getVariantIcons(): string[] { + return getDefaultValues().variantsIcons; +} + +/** + * Gets a theme content by a given contribute ID + * + * @export + * @param {string} ID + * @returns {IThemeIcons} + */ +export function getThemeIconsByContributeID(ID: string): IThemeIcons | null { + let contribute: IPackageJSONThemeIcons = getThemeIconsContribute(ID) + return contribute !== null ? require(path.join(PATHS.VSIX_DIR, contribute.path)) : null; +} + +/** + * Gets a theme by name + * @export + * @param {string} name + * @returns {IThemeIcons} + */ +export function getThemeIconsContribute(ID: string): IPackageJSONThemeIcons { + let contributes = getPackageJSON().contributes.iconThemes.filter(contribute => contribute.id === ID); + return contributes[0] !== undefined ? contributes[0] : null; +} + +/** + * Gets package JSON + * @export + * @returns {*} + */ +export function getPackageJSON(): IPackageJSON { + let packageJSON: IPackageJSON = require(path.join(PATHS.VSIX_DIR, './package.json')); + return packageJSON; +} + +/** + * Writes a file inside the vsix directory + * @export + * @param {string} filename + * @param {string} filecontent + */ +export function writeFile(filename: string, filecontent: string): void { + filename = path.join(PATHS.VSIX_DIR, filename); + console.log(arguments) + fs.writeFileSync(filename, filecontent, { encoding: CHARSET }); +} \ No newline at end of file diff --git a/extensions/helpers/settings.ts b/extensions/helpers/settings.ts new file mode 100644 index 0000000..0216fc2 --- /dev/null +++ b/extensions/helpers/settings.ts @@ -0,0 +1,120 @@ +import * as vscode from 'vscode'; + +import { IDefaults } from "../interfaces/idefaults"; +import { IThemeCustomProperties } from "../interfaces/itheme-custom-properties"; +import {getPackageJSON} from './fs'; + +/** + * Gets saved accent + * @export + * @returns {(string | null)} + */ +export function getAccent(): string | undefined { + return getCustomSettings().accent; +} + +/** + * Gets custom settings + * @export + * @returns {*} + */ +export function getCustomSettings(): IThemeCustomProperties { + return vscode.workspace.getConfiguration().get('materialTheme.cache.workbench.settings', {}); +} + +/** + * Checks if a given string could be an accent + * + * @export + * @param {string} accentName + * @returns {boolean} + */ +export function isAccent(accentName: string, defaults: IDefaults): boolean { + return Object.keys(defaults.accents).filter(name => name === accentName).length > 0; +} + +/** + * Determines if the passing theme label is a material theme + * @export + * @param {string} themeName + * @returns {boolean} + */ +export function isMaterialTheme(themeName: string): boolean { + let packageJSON = getPackageJSON(); + return packageJSON.contributes.themes.filter(contrib => contrib.label === themeName).length > 0; +} + +/** + * Determines if the passing icons theme is a material theme + * @export + * @param {string} themeIconsName + * @returns {boolean} + */ +export function isMaterialThemeIcons(themeIconsName: string): boolean { + let packageJSON = getPackageJSON(); + return packageJSON.contributes.iconThemes.filter(contribute => contribute.id === themeIconsName).length > 0; +} + +/** + * Sets a custom property in custom settings + * @export + * @param {string} settingname + * @param {*} value + */ +export function setCustomSetting(settingname: string, value: any): Thenable { + let settings: any = getCustomSettings(); + settings[settingname] = value; + return vscode.workspace.getConfiguration().update('materialTheme.cache.workbench.settings', settings, true); +} + +/** + * Sets custom properties in custom settings + * @export + * @param {*} settingsObject + * @returns {Thenable} + */ +export function setCustomSettings(settingsObject: IThemeCustomProperties): Thenable { + let settings: any = getCustomSettings(); + + Object.keys(settingsObject).forEach(key => settings[key] = (settingsObject as any)[key]); + + return vscode.workspace.getConfiguration().update('materialTheme.cache.workbench.settings', settings, true); +} + +/** + * Determines if the window should reload + * @export + * @param {string} themeColour + * @param {string} themeIcons + * @returns {boolean} + */ +export function shouldReloadWindow(themeColour: string, themeIcons: string): boolean { + let isTheme: boolean = isMaterialTheme(themeColour); + let isThemeIcons: boolean = isMaterialThemeIcons(themeIcons); + + if (!isTheme && !isThemeIcons) return false; + + let customSettings = getCustomSettings(); + + return customSettings.accent !== customSettings.accentPrevious; +} + +/** + * Updates accent name + * @export + * @param {string} accentName + */ +export function updateAccent(accentName: string): Thenable { + let config: IThemeCustomProperties = getCustomSettings(); + let prevaccent = getAccent(); + + if (prevaccent !== undefined && prevaccent !== accentName) { + config.accentPrevious = prevaccent; + } else if (accentName === undefined) { + config.accentPrevious = undefined; + } + + config.accent = accentName; + + return setCustomSettings(config); +} \ No newline at end of file diff --git a/extensions/helpers/vscode.ts b/extensions/helpers/vscode.ts new file mode 100644 index 0000000..8ae4cc7 --- /dev/null +++ b/extensions/helpers/vscode.ts @@ -0,0 +1,42 @@ +import * as vscode from 'vscode' + + +export function askForWindowReload(): Thenable { + const PROMPT_MESSAGE: string = 'Material Theme requires VS Code reload in order to display icons correctly.'; + const PROMPT_MESSAGE_CONFIRM: string = 'Ok, reload'; + const PROMPT_MESSAGE_CANCEL: string = 'I will do it later'; + + return vscode.window.showInformationMessage(PROMPT_MESSAGE, PROMPT_MESSAGE_CONFIRM, PROMPT_MESSAGE_CANCEL).then((response) => { + if (response === PROMPT_MESSAGE_CONFIRM) { + reloadWindow(); + } + }, (error) => { + console.log(error); + }); +} + +/** + * Gets your current theme ID + * @export + * @returns {string} + */ +export function getCurrentThemeID(): string { + return vscode.workspace.getConfiguration().get('workbench.colorTheme'); +} + +/** + * Gets your current icons theme ID + * @export + * @returns {string} + */ +export function getCurrentThemeIconsID(): string { + return vscode.workspace.getConfiguration().get('workbench.iconTheme'); +} + +/** + * Reloads current vscode window. + * @export + */ +export function reloadWindow(): void { + vscode.commands.executeCommand('workbench.action.reloadWindow'); +} \ No newline at end of file diff --git a/extensions/interfaces/iaccent-custom-property.ts b/extensions/interfaces/iaccent-custom-property.ts new file mode 100644 index 0000000..6b6b81d --- /dev/null +++ b/extensions/interfaces/iaccent-custom-property.ts @@ -0,0 +1,4 @@ +export interface IAccentCustomProperty { + alpha: number; + value: any; +} \ No newline at end of file diff --git a/extensions/interfaces/idefaults.ts b/extensions/interfaces/idefaults.ts new file mode 100644 index 0000000..4e4ee50 --- /dev/null +++ b/extensions/interfaces/idefaults.ts @@ -0,0 +1,63 @@ +export interface IDefaults { + accents: IAccents; + accentableIcons: string[]; + changelog: IChangelog; + icons: IDefaultsThemeIcons; + themeVariants: IDefaultsThemeVariant; + themeVariantsColours: IDefaultsThemeVariantColours; + themeVariantsUITheme: IDefaultsThemeVariantUITheme; + variantsIcons: string[]; +} + +export interface IAccents { + teal: string; + [index: string]: string; +} + +export interface IChangelog { + lastversion: string; +} + +export interface IDefaultsThemeIcons { + theme: { + iconDefinitions: { + _folder_open: { + iconPath: string; + } + _folder_open_build: { + iconPath: string; + } + _folder_dark: { + iconPath: string; + } + _folder_dark_build: { + iconPath: string; + } + "_folder_light_build": { + iconPath: string; + } + _folder_light: { + iconPath: string; + } + } + } +} + +export interface IDefaultsThemeVariant { + [index: string]: string; + Darker: string; + DarkerHighContrast: string; + Default: string; + DefaultHighContrast: string; + Light: string; + LightHighContrast: string; + PalenightHighContrast: string; +} + +export interface IDefaultsThemeVariantColours extends IDefaultsThemeVariant { + +} + +export interface IDefaultsThemeVariantUITheme extends IDefaultsThemeVariant { + +} \ No newline at end of file diff --git a/extensions/interfaces/igeneric-object.ts b/extensions/interfaces/igeneric-object.ts new file mode 100644 index 0000000..7631326 --- /dev/null +++ b/extensions/interfaces/igeneric-object.ts @@ -0,0 +1,3 @@ +export interface IGenericObject { + [index: string]: TValue; +} \ No newline at end of file diff --git a/extensions/interfaces/ipackage.json.ts b/extensions/interfaces/ipackage.json.ts new file mode 100644 index 0000000..b52a9f7 --- /dev/null +++ b/extensions/interfaces/ipackage.json.ts @@ -0,0 +1,61 @@ +import { IGenericObject } from '../../extensions/interfaces/igeneric-object'; + +export interface IPackageJSONBadge { + description: string; + href: string; + url: string; +} + +export interface IPackageJSONContributes { + commands: IPackageJSONCommand[]; + configuration: IPackageJSONConfiguration; + iconThemes: IPackageJSONThemeIcons[]; + themes: IPackageJSONTheme[]; +} + +export interface IPackageJSONConfiguration { + properties: { + + } +} + +export interface IPackageJSONCommand { + category: string; + command: string; + title: string; +} + +export interface IPackageJSONTheme { + label: string; + path: string; + uiTheme: string; +} + +export interface IPackageJSONThemeIcons { + id: string; + label: string; + path: string; +} + +export interface IPackageJSON { + "activationEvents": string[] + "badges": IPackageJSONBadge[]; + "contributes": IPackageJSONContributes; + "bugs": IGenericObject; + "categories": string[]; + "description": string; + "displayName": string; + "engines": IGenericObject; + "galleryBanner": IGenericObject; + "homepage": string; + "icon": string; + "license": string; + "main": string; + "name": string; + "preview": boolean; + "publisher": string; + "repository": IGenericObject; + "scripts": IGenericObject; + "version": string; + "devDependencies": IGenericObject; +} \ No newline at end of file diff --git a/extensions/interfaces/ipaths.ts b/extensions/interfaces/ipaths.ts new file mode 100644 index 0000000..ba3d072 --- /dev/null +++ b/extensions/interfaces/ipaths.ts @@ -0,0 +1,32 @@ +export interface IPaths { + /** + * Dist dir + * @type {string} + * @memberof IPaths + */ + DIST: string; + /** + * Icons dir + * @type {string} + * @memberof IPaths + */ + ICONS: string; + /** + * Src dir + * @type {string} + * @memberof IPaths + */ + SRC: string; + /** + * Themes dir + * @type {string} + * @memberof IPaths + */ + THEMES: string; + /** + * Extension directory + * @type {string} + * @memberof IPaths + */ + VSIX_DIR: string; +} \ No newline at end of file diff --git a/extensions/interfaces/itheme-custom-properties.ts b/extensions/interfaces/itheme-custom-properties.ts new file mode 100644 index 0000000..e801dc8 --- /dev/null +++ b/extensions/interfaces/itheme-custom-properties.ts @@ -0,0 +1,6 @@ +export interface IThemeCustomProperties { + accent?: string; + accentPrevious?: string; + themeColours?: string; + themeIcons?: string; +} \ No newline at end of file diff --git a/extensions/interfaces/itheme-icons.ts b/extensions/interfaces/itheme-icons.ts new file mode 100644 index 0000000..23e10f6 --- /dev/null +++ b/extensions/interfaces/itheme-icons.ts @@ -0,0 +1,513 @@ +export interface IThemeIconsIconPath { + iconPath: string; +} + +export interface IThemeIcons { + "iconDefinitions": + { + "_folder_dark": IThemeIconsIconPath; + "_file_folder": IThemeIconsIconPath; + "_folder_dark_build": IThemeIconsIconPath; + "_folder_light": IThemeIconsIconPath; + "_folder_light_build": IThemeIconsIconPath; + "_folder_open": IThemeIconsIconPath; + "_folder_open_build": IThemeIconsIconPath; + "_file_dark": IThemeIconsIconPath; + "_file_actionscript": IThemeIconsIconPath; + "_file_ai": IThemeIconsIconPath; + "_file_android": IThemeIconsIconPath; + "_file_angular": IThemeIconsIconPath; + "_file_applescript": IThemeIconsIconPath; + "_file_arduino": IThemeIconsIconPath; + "_file_assembly": IThemeIconsIconPath; + "_file_autohotkey": IThemeIconsIconPath; + "_file_bower": IThemeIconsIconPath; + "_file_c": IThemeIconsIconPath; + "_file_certificate": IThemeIconsIconPath; + "_file_changelog": IThemeIconsIconPath; + "_file_clojure": IThemeIconsIconPath; + "_file_cmake": IThemeIconsIconPath; + "_file_cmd": IThemeIconsIconPath; + "_file_coffee": IThemeIconsIconPath; + "_file_console": IThemeIconsIconPath; + "_file_contributing": IThemeIconsIconPath; + "_file_cpp": IThemeIconsIconPath; + "_file_credits": IThemeIconsIconPath; + "_file_csharp": IThemeIconsIconPath; + "_file_css-map": IThemeIconsIconPath; + "_file_css": IThemeIconsIconPath; + "_file_dart": IThemeIconsIconPath; + "_file_database": IThemeIconsIconPath; + "_file_dlang": IThemeIconsIconPath; + "_file_docker": IThemeIconsIconPath; + "_file_document": IThemeIconsIconPath; + "_file_email": IThemeIconsIconPath; + "_file_exe": IThemeIconsIconPath; + "_file_favicon": IThemeIconsIconPath; + "_file_file": IThemeIconsIconPath; + "_file_flash": IThemeIconsIconPath; + "_file_flow": IThemeIconsIconPath; + "_file_folder-build": IThemeIconsIconPath; + "_file_folder-light-build": IThemeIconsIconPath; + "_file_folder-light": IThemeIconsIconPath; + "_file_folder-outline-build": IThemeIconsIconPath; + "_file_folder-outline": IThemeIconsIconPath; + "_file_font": IThemeIconsIconPath; + "_file_fsharp": IThemeIconsIconPath; + "_file_git": IThemeIconsIconPath; + "_file_github": IThemeIconsIconPath; + "_file_go": IThemeIconsIconPath; + "_file_gopher": IThemeIconsIconPath; + "_file_gradle": IThemeIconsIconPath; + "_file_graphql": IThemeIconsIconPath; + "_file_groovy": IThemeIconsIconPath; + "_file_grunt": IThemeIconsIconPath; + "_file_gulp": IThemeIconsIconPath; + "_file_haml": IThemeIconsIconPath; + "_file_haskell": IThemeIconsIconPath; + "_file_html": IThemeIconsIconPath; + "_file_image": IThemeIconsIconPath; + "_file_ionic": IThemeIconsIconPath; + "_file_java": IThemeIconsIconPath; + "_file_javascript-map": IThemeIconsIconPath; + "_file_js": IThemeIconsIconPath; + "_file_json": IThemeIconsIconPath; + "_file_key": IThemeIconsIconPath; + "_file_kotlin": IThemeIconsIconPath; + "_file_less": IThemeIconsIconPath; + "_file_lib": IThemeIconsIconPath; + "_file_license": IThemeIconsIconPath; + "_file_lua": IThemeIconsIconPath; + "_file_markdown": IThemeIconsIconPath; + "_file_markup": IThemeIconsIconPath; + "_file_movie": IThemeIconsIconPath; + "_file_music": IThemeIconsIconPath; + "_file_mustache": IThemeIconsIconPath; + "_file_mxml": IThemeIconsIconPath; + "_file_nodejs": IThemeIconsIconPath; + "_file_npm": IThemeIconsIconPath; + "_file_ocaml": IThemeIconsIconPath; + "_file_pdf": IThemeIconsIconPath; + "_file_php": IThemeIconsIconPath; + "_file_polymer": IThemeIconsIconPath; + "_file_postcss": IThemeIconsIconPath; + "_file_powerpoint": IThemeIconsIconPath; + "_file_pp": IThemeIconsIconPath; + "_file_procfile": IThemeIconsIconPath; + "_file_pug": IThemeIconsIconPath; + "_file_python": IThemeIconsIconPath; + "_file_r": IThemeIconsIconPath; + "_file_rails": IThemeIconsIconPath; + "_file_raml": IThemeIconsIconPath; + "_file_react": IThemeIconsIconPath; + "_file_readme": IThemeIconsIconPath; + "_file_ruby": IThemeIconsIconPath; + "_file_rust": IThemeIconsIconPath; + "_file_sass": IThemeIconsIconPath; + "_file_settings": IThemeIconsIconPath; + "_file_sketch": IThemeIconsIconPath; + "_file_star": IThemeIconsIconPath; + "_file_stylus": IThemeIconsIconPath; + "_file_sublime": IThemeIconsIconPath; + "_file_svg": IThemeIconsIconPath; + "_file_swc": IThemeIconsIconPath; + "_file_swift": IThemeIconsIconPath; + "_file_swig": IThemeIconsIconPath; + "_file_table": IThemeIconsIconPath; + "_file_tex": IThemeIconsIconPath; + "_file_todo": IThemeIconsIconPath; + "_file_tune": IThemeIconsIconPath; + "_file_twig": IThemeIconsIconPath; + "_file_typescript": IThemeIconsIconPath; + "_file_typescript_def": IThemeIconsIconPath; + "_file_url": IThemeIconsIconPath; + "_file_virtual": IThemeIconsIconPath; + "_file_visualstudio": IThemeIconsIconPath; + "_file_vue": IThemeIconsIconPath; + "_file_webpack": IThemeIconsIconPath; + "_file_word": IThemeIconsIconPath; + "_file_xaml": IThemeIconsIconPath; + "_file_xml": IThemeIconsIconPath; + "_file_yaml": IThemeIconsIconPath; + "_file_yarn": IThemeIconsIconPath; + "_file_zip": IThemeIconsIconPath; + }; + "fileExtensions": + { + "cmd": string; + "mustache": string; + "rails": string; + "styl": string; + "twig": string; + "swig": string; + "sketch": string; + "do": string; + "sublime-settings": string; + "sublime-theme": string; + "sublime-commands": string; + "sublime-menu": string; + "html": string; + "jade": string; + "pug": string; + "md": string; + "md.rendered": string; + "markdown": string; + "markdown.rendered": string; + "css": string; + "postcss": string; + "scss": string; + "sass": string; + "less": string; + "json": string; + "yaml": string; + "YAML-tmLanguage": string; + "yml": string; + "xml": string; + "plist": string; + "xsd": string; + "dtd": string; + "xsl": string; + "xslt": string; + "resx": string; + "iml": string; + "xquery": string; + "tmLanguage": string; + "png": string; + "jpeg": string; + "jpg": string; + "gif": string; + "svg": string; + "eps": string; + "ai": string; + "ico": string; + "tif": string; + "tiff": string; + "psd": string; + "psb": string; + "ami": string; + "apx": string; + "bmp": string; + "bpg": string; + "brk": string; + "cur": string; + "dds": string; + "dng": string; + "exr": string; + "fpx": string; + "gbr": string; + "img": string; + "jbig2": string; + "jb2": string; + "jng": string; + "jxr": string; + "pbm": string; + "pgf": string; + "pic": string; + "raw": string; + "webp": string; + "php": string; + "js": string; + "ejs": string; + "jsx": string; + "ini": string; + "dlc": string; + "dll": string; + "config": string; + "conf": string; + "esx": string; + "ts": string; + "tsx": string; + "d.ts": string; + "pdf": string; + "xlsx": string; + "xls": string; + "csv": string; + "vscodeignore": string; + "vsixmanifest": string; + "suo": string; + "sln": string; + "pdb": string; + "cs": string; + "csx": string; + "csproj": string; + "zip": string; + "tar": string; + "gz": string; + "xz": string; + "bzip2": string; + "gzip": string; + "7z": string; + "7zip": string; + "pzip": string; + "wim": string; + "rar": string; + "tgz": string; + "exe": string; + "msi": string; + "java": string; + "jar": string; + "jsp": string; + "c": string; + "h": string; + "m": string; + "cc": string; + "cpp": string; + "c++": string; + "hpp": string; + "mm": string; + "cxx": string; + "go": string; + "py": string; + "url": string; + "sh": string; + "bat": string; + "ps1": string; + "fish": string; + "bash": string; + "gradle": string; + "doc": string; + "docx": string; + "rtf": string; + "properties": string; + "prop": string; + "settings": string; + "sql": string; + "accdb": string; + "mdb": string; + "cer": string; + "cert": string; + "crt": string; + "pub": string; + "key": string; + "pem": string; + "asc": string; + "woff": string; + "woff2": string; + "ttf": string; + "eot": string; + "suit": string; + "otf": string; + "bmap": string; + "fnt": string; + "odttf": string; + "ttc": string; + "font": string; + "fonts": string; + "sui": string; + "ntf": string; + "mrf": string; + "lib": string; + "rb": string; + "erb": string; + "fs": string; + "fsx": string; + "fsi": string; + "fsproj": string; + "manifest": string; + "swift": string; + "ino": string; + "dockerignore": string; + "tex": string; + "bib": string; + "pptx": string; + "ppt": string; + "pptm": string; + "potx": string; + "pot": string; + "potm": string; + "ppsx": string; + "ppsm": string; + "pps": string; + "ppam": string; + "ppa": string; + "webm": string; + "mkv": string; + "flv": string; + "vob": string; + "ogv": string; + "ogg": string; + "gifv": string; + "avi": string; + "mov": string; + "qt": string; + "wmv": string; + "yuv": string; + "rm": string; + "rmvb": string; + "mp4": string; + "m4v": string; + "mpg": string; + "mp2": string; + "mpeg": string; + "mpe": string; + "mpv": string; + "m2v": string; + "vdi": string; + "vbox": string; + "vbox-prev": string; + "ics": string; + "mp3": string; + "flac": string; + "m4a": string; + "wma": string; + "aiff": string; + "coffee": string; + "txt": string; + "sqlite": string; + "graphql": string; + "gql": string; + "props": string; + "toml": string; + "rs": string; + "raml": string; + "xaml": string; + "prefs": string; + "hs": string; + "kt": string; + "project": string; + "patch": string; + "dockerfile": string; + "vb": string; + "lua": string; + "clj": string; + "groovy": string; + "r": string; + "rst": string; + "dart": string; + "as": string; + "mxml": string; + "ahk": string; + "swf": string; + "swc": string; + "cmake": string; + "asm": string; + "a51": string; + "inc": string; + "nasm": string; + "s": string; + "ms": string; + "agc": string; + "ags": string; + "aea": string; + "argus": string; + "mitigus": string; + "binsource": string; + "vue": string; + "ml": string; + "mli": string; + "cmx": string; + "js.map": string; + "css.map": string; + "tmTheme": string; + "pp": string; + "applescript": string; + "haml": string }; + "fileNames": + { "gruntfile.js": string; + "bower.json": string; + ".bowerrc": string; + "webpack.js": string; + "webpack.config.js": string; + "webpack.dev.js": string; + "webpack.prod.js": string; + "webpack.common.js": string; + "webpackfile.js": string; + "ionic.config.json": string; + ".io-config.json": string; + "gulpfile.js": string; + "gulpfile.babel.js": string; + "package.json": string; + "gradle.properties": string; + "gradlew": string; + ".jscsrc": string; + ".jshintrc": string; + ".jshintignore": string; + ".npmignore": string; + "tsconfig.json": string; + "tslint.json": string; + "androidmanifest.xml": string; + "gradle-wrapper.properties": string; + ".editorconfig": string; + "procfile": string; + ".env": string; + "dockerfile": string; + "license": string; + "license.md": string; + "license.md.rendered": string; + "license.txt": string; + ".babelrc": string; + ".eslintrc": string; + ".buildignore": string; + ".htaccess": string; + "composer.lock": string; + ".gitignore": string; + ".gitconfig": string; + ".gitattributes": string; + ".gitmodules": string; + ".gitkeep": string; + "yarn.lock": string; + ".yarnclean": string; + ".yarn-integrity": string; + "yarn-error.log": string; + "contributing.md": string; + "contributing.md.rendered": string; + "readme.md": string; + "readme.md.rendered": string; + ".mailmap": string; + "makefile": string; + "changelog": string; + "changelog.md": string; + "changelog.md.rendered": string; + "CREDITS": string; + "credits.txt": string; + "credits.md": string; + "credits.md.rendered": string; + ".flowconfig": string; + ".jsbeautifyrc": string; + "git-history": string; + "angular-cli.json": string; + "app.module.ts": string; + "favicon.ico": string }; + "file": string; + "folder": string; + "folderExpanded": string; + "languageIds": + { "git": string }; + "light": + { + "folderExpanded": string; + "folder": string; + "folderNames": + { "node_modules": string; + ".git": string; + ".github": string; + ".gulp": string; + "bower_components": string; + "build": string; + "dist": string }; + "folderNamesExpanded": + { "node_modules": string; + ".git": string; + ".github": string; + ".gulp": string; + "bower_components": string; + "build": string; + "dist": string } + }; + "folderNames": + { "node_modules": string; + ".git": string; + ".github": string; + ".gulp": string; + "bower_components": string; + "build": string; + "dist": string }; + "folderNamesExpanded": + { "node_modules": string; + ".git": string; + ".github": string; + ".gulp": string; + "bower_components": string; + "build": string; + "dist": string } +} diff --git a/extensions/material.theme.config.ts b/extensions/material.theme.config.ts new file mode 100644 index 0000000..a4a17ff --- /dev/null +++ b/extensions/material.theme.config.ts @@ -0,0 +1,49 @@ +import * as vscode from 'vscode'; + +import { IGenericObject } from "./interfaces/igeneric-object"; +import { THEME_ACCENTS_SETTER } from "./commands/accents-setter/index"; +import { THEME_VARIANT } from "./commands/theme-variant/index"; +import { shouldShowChangelog, showChangelog } from './helpers/changelog'; + +enum Commands { + ACCENTS, + CHANGELOG, + COLOUR_VARIANT +} + +const OPTIONS: IGenericObject = { + 'šŸ– Change accent color': Commands.ACCENTS, + 'šŸŽØ Change color variant': Commands.COLOUR_VARIANT, + 'šŸš§ Show changelog': Commands.CHANGELOG +} + +export function activate(context: vscode.ExtensionContext) { + if (vscode.workspace.getConfiguration().has('materialTheme.cache.workbench.accent')) { + vscode.workspace.getConfiguration().update('materialTheme.cache.workbench.accent', undefined, true); + } + + if (shouldShowChangelog()) { + showChangelog(); + } + + // registering the command + let command = vscode.commands.registerCommand('material.theme.config', () => { + // the user is going to choose what aspect of theme to config + vscode.window.showQuickPick(Object.keys(OPTIONS)).then(response => { + // switching selected option + switch(OPTIONS[response]) { + case Commands.ACCENTS: + THEME_ACCENTS_SETTER(); + break; + case Commands.CHANGELOG: + showChangelog(); + break; + case Commands.COLOUR_VARIANT: + THEME_VARIANT(); + break; + } + }); + }); + + context.subscriptions.push(command); +} diff --git a/gulpfile.babel.ts b/gulpfile.babel.ts new file mode 100644 index 0000000..40ab315 --- /dev/null +++ b/gulpfile.babel.ts @@ -0,0 +1,9 @@ +import * as Gulp from 'gulp'; +import * as GulpStats from 'gulp-stats'; +import * as tasks from './.gulp'; + +// Use gulp-stats +GulpStats(Gulp); + +// set default task +Gulp.task('default', tasks.default as any); \ No newline at end of file diff --git a/iconlist.json b/iconlist.json new file mode 100644 index 0000000..83ccbc5 --- /dev/null +++ b/iconlist.json @@ -0,0 +1,113 @@ +[ + "actionscript", + "ai", + "android", + "angular", + "arduino", + "assembly", + "autohotkey", + "bower", + "c-lang", + "certificate", + "changelog", + "clojure", + "cmake", + "cmd", + "coffee", + "console", + "contributing", + "cpp", + "credits", + "csharp", + "css-map", + "css", + "dart", + "database", + "dlang", + "docker", + "document", + "email", + "exe", + "favicon", + "file", + "flash", + "flow", + "folder-light", + "folder-outline", + "folder", + "font", + "fsharp", + "git", + "github", + "gopher", + "gradle", + "groovy", + "grunt", + "gulp", + "haskell", + "html", + "image", + "ionic", + "java", + "javascript-map", + "js", + "json", + "key", + "kotlin", + "less", + "lib", + "license", + "lua", + "markdown", + "markup", + "movie", + "music", + "mustache", + "mxml", + "nodejs", + "npm", + "ocaml", + "pdf", + "php", + "polymer", + "postcss", + "powerpoint", + "procfile", + "pug", + "python", + "r", + "rails", + "raml", + "react", + "readme", + "ruby", + "rust", + "sass", + "settings", + "sketch", + "star", + "stylus", + "sublime", + "svg", + "swc", + "swift", + "swig", + "table", + "tex", + "todo", + "tune", + "twig", + "typescript", + "typescript_def", + "url", + "virtual", + "visualstudio", + "vue", + "webpack", + "word", + "xaml", + "xml", + "yaml", + "yarn", + "zip" +] \ No newline at end of file diff --git a/logo.png b/logo.png new file mode 100644 index 0000000..c30b64f Binary files /dev/null and b/logo.png differ diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..3bd6035 --- /dev/null +++ b/package-lock.json @@ -0,0 +1,9623 @@ +{ + "name": "vsc-material-theme", + "version": "1.6.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "@types/chalk": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/@types/chalk/-/chalk-2.2.0.tgz", + "integrity": "sha512-1zzPV9FDe1I/WHhRkf9SNgqtRJWZqrBWgu7JGveuHmmyR9CnAPCie2N/x+iHrgnpYBIcCJWHBoMRv2TRWktsvw==", + "dev": true, + "requires": { + "chalk": "1.1.3" + } + }, + "@types/chokidar": { + "version": "1.7.4", + "resolved": "https://registry.npmjs.org/@types/chokidar/-/chokidar-1.7.4.tgz", + "integrity": "sha512-QVuksEzbvU22DJg9vFW9O++u0yT6aXnn64qq/KzaUUWuf+E2IAEzAM90qGlgWpLq3pPHbUfvmlJz1TZnUePQUg==", + "dev": true, + "requires": { + "@types/events": "1.1.0", + "@types/node": "9.4.5" + } + }, + "@types/events": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@types/events/-/events-1.1.0.tgz", + "integrity": "sha512-y3bR98mzYOo0pAZuiLari+cQyiKk3UXRuT45h1RjhfeCzqkjaVsfZJNaxdgtk7/3tzOm1ozLTqEqMP3VbI48jw==", + "dev": true + }, + "@types/glob": { + "version": "5.0.35", + "resolved": "https://registry.npmjs.org/@types/glob/-/glob-5.0.35.tgz", + "integrity": "sha512-wc+VveszMLyMWFvXLkloixT4n0harUIVZjnpzztaZ0nKLuul7Z32iMt2fUFGAaZ4y1XWjFRMtCI5ewvyh4aIeg==", + "dev": true, + "requires": { + "@types/events": "1.1.0", + "@types/minimatch": "3.0.3", + "@types/node": "9.4.5" + } + }, + "@types/glob-stream": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/@types/glob-stream/-/glob-stream-6.1.0.tgz", + "integrity": "sha512-RHv6ZQjcTncXo3thYZrsbAVwoy4vSKosSWhuhuQxLOTv74OJuFQxXkmUuZCr3q9uNBEVCvIzmZL/FeRNbHZGUg==", + "dev": true, + "requires": { + "@types/glob": "5.0.35", + "@types/node": "9.4.5" + } + }, + "@types/gulp": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/@types/gulp/-/gulp-4.0.5.tgz", + "integrity": "sha512-nx1QjPTiRpvLfYsZ7MBu7bT6Cm7tAXyLbY0xbdx2IEMxCK2v2urIhJMQZHW0iV1TskM71Xl6p2uRRuWDbk+/7g==", + "dev": true, + "requires": { + "@types/chokidar": "1.7.4", + "@types/undertaker": "1.1.4", + "@types/vinyl-fs": "2.4.8" + } + }, + "@types/gulp-if": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/gulp-if/-/gulp-if-0.0.33.tgz", + "integrity": "sha512-J5lzff21X7r1x/4hSzn02GgIUEyjCqYIXZ9GgGBLhbsD3RiBdqwnkFWgF16/0jO5rcVZ52Zp+6MQMQdvIsWuKg==", + "dev": true, + "requires": { + "@types/node": "9.4.5", + "@types/vinyl": "2.0.2" + } + }, + "@types/gulp-util": { + "version": "3.0.34", + "resolved": "https://registry.npmjs.org/@types/gulp-util/-/gulp-util-3.0.34.tgz", + "integrity": "sha512-E06WN1OfqL5UsMwJ1T7ClgnaXgaPipb7Ee8euMc3KRHLNqxdvWrDir9KA6uevgzBgT7XbjgmzZA2pkzDqBBX7A==", + "dev": true, + "requires": { + "@types/node": "9.4.5", + "@types/through2": "2.0.33", + "@types/vinyl": "2.0.2", + "chalk": "2.3.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "@types/minimatch": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/@types/minimatch/-/minimatch-3.0.3.tgz", + "integrity": "sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==", + "dev": true + }, + "@types/mustache": { + "version": "0.8.30", + "resolved": "https://registry.npmjs.org/@types/mustache/-/mustache-0.8.30.tgz", + "integrity": "sha512-z80ZxL9CwGlyyuZ7fz3RBtsxzSasf8R8LeSQYF5xrdFVlkV4fsdJ51U1F1lSFAL+Xwk9Jxe7aueeeBedAi52Eg==", + "dev": true + }, + "@types/node": { + "version": "9.4.5", + "resolved": "https://registry.npmjs.org/@types/node/-/node-9.4.5.tgz", + "integrity": "sha512-DvC7bzO5797bkApgukxouHmkOdYN2D0yL5olw0RncDpXUa6n39qTVsUi/5g2QJjPgl8qn4zh+4h0sofNoWGLRg==", + "dev": true + }, + "@types/run-sequence": { + "version": "0.0.30", + "resolved": "https://registry.npmjs.org/@types/run-sequence/-/run-sequence-0.0.30.tgz", + "integrity": "sha512-XwGr1b4yCGUILKeBkzmeWcxmGHQ0vFFFpA6D6y1yLO6gKmYorF+PHqdU5KG+nWt38OvtrkDptmrSmlHX/XtpLw==", + "dev": true, + "requires": { + "@types/gulp": "4.0.5", + "@types/node": "9.4.5" + } + }, + "@types/through2": { + "version": "2.0.33", + "resolved": "https://registry.npmjs.org/@types/through2/-/through2-2.0.33.tgz", + "integrity": "sha1-H/LoihAN+1sUDnu5h5HxGUQA0TE=", + "dev": true, + "requires": { + "@types/node": "9.4.5" + } + }, + "@types/undertaker": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@types/undertaker/-/undertaker-1.1.4.tgz", + "integrity": "sha512-LhkjHZmh7zDJm4SRn59+LN7rYMy41s+GkKmMiaoXpnsWijkYTLPnOG4z8s2SLS5PE/fEZrQXhLBTR+iImM3feA==", + "dev": true, + "requires": { + "@types/events": "1.1.0", + "@types/undertaker-registry": "1.0.1" + } + }, + "@types/undertaker-registry": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@types/undertaker-registry/-/undertaker-registry-1.0.1.tgz", + "integrity": "sha512-Z4TYuEKn9+RbNVk1Ll2SS4x1JeLHecolIbM/a8gveaHsW0Hr+RQMraZACwTO2VD7JvepgA6UO1A1VrbktQrIbQ==", + "dev": true + }, + "@types/vinyl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/@types/vinyl/-/vinyl-2.0.2.tgz", + "integrity": "sha512-2iYpNuOl98SrLPBZfEN9Mh2JCJ2EI9HU35SfgBEb51DcmaHkhp8cKMblYeBqMQiwXMgAD3W60DbQ4i/UdLiXhw==", + "dev": true, + "requires": { + "@types/node": "9.4.5" + } + }, + "@types/vinyl-fs": { + "version": "2.4.8", + "resolved": "https://registry.npmjs.org/@types/vinyl-fs/-/vinyl-fs-2.4.8.tgz", + "integrity": "sha512-yE2pN9OOrxJVeO7IZLHAHrh5R4Q0osbn5WQRuQU6GdXoK7dNFrMK3K7YhATkzf3z0yQBkol3+gafs7Rp0s7dDg==", + "dev": true, + "requires": { + "@types/glob-stream": "6.1.0", + "@types/node": "9.4.5", + "@types/vinyl": "2.0.2" + } + }, + "@types/yamljs": { + "version": "0.2.30", + "resolved": "https://registry.npmjs.org/@types/yamljs/-/yamljs-0.2.30.tgz", + "integrity": "sha1-0DTh0ynkbo0Pc3yajbl/aPgbU4I=", + "dev": true + }, + "@types/yargs": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-10.0.1.tgz", + "integrity": "sha512-EvK+v8864qaRCjtqcJa7iUKWYTIvbdSZ4MJd99QTcBpq2FbVllwW7ldRBesBYINgj2Mn0yMQ2yZZJPej1DcJFA==", + "dev": true + }, + "JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/JSONStream/-/JSONStream-1.3.2.tgz", + "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", + "dev": true, + "requires": { + "jsonparse": "1.3.1", + "through": "2.3.8" + } + }, + "acorn": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-5.4.1.tgz", + "integrity": "sha512-XLmq3H/BVvW6/GbxKryGxWORz1ebilSsUDlyC27bXhWGWAZWkGwS6FLHjOlwFXNFoWFQEO/Df4u0YYd0K3BQgQ==", + "dev": true + }, + "acorn-jsx": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz", + "integrity": "sha1-r9+UiPsezvyDSPb7IvRk4ypYs2s=", + "dev": true, + "requires": { + "acorn": "3.3.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha1-ReN/s56No/JbruP/U2niu18iAXo=", + "dev": true + } + } + }, + "add-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/add-stream/-/add-stream-1.0.0.tgz", + "integrity": "sha1-anmQQ3ynNtXhKI25K9MmbV9csqo=", + "dev": true + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "dev": true, + "requires": { + "co": "4.6.0", + "fast-deep-equal": "1.0.0", + "fast-json-stable-stringify": "2.0.0", + "json-schema-traverse": "0.3.1" + } + }, + "ajv-keywords": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-2.1.1.tgz", + "integrity": "sha1-YXmX/F9gV2iUxDX5QNgZ4TW4B2I=", + "dev": true + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "dev": true, + "requires": { + "kind-of": "3.2.2", + "longest": "1.0.1", + "repeat-string": "1.6.1" + } + }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha1-SlKCrBZHKek2Gbz9OtFR+BfOkfU=", + "dev": true + }, + "ansi-colors": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-colors/-/ansi-colors-1.1.0.tgz", + "integrity": "sha512-SFKX67auSNoVR38N3L+nvsPjOE0bybKTYbkf5tRvushrAPQ9V75huw0ZxBkKVeRU9kqH3d6HA4xTckbwZ4ixmA==", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-cyan": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-cyan/-/ansi-cyan-0.1.1.tgz", + "integrity": "sha1-U4rlKK+JgvKK4w2G8vF0VtJgmHM=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-escapes": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-1.4.0.tgz", + "integrity": "sha1-06ioOzGapneTZisT52HHkRQiMG4=" + }, + "ansi-gray": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-gray/-/ansi-gray-0.1.1.tgz", + "integrity": "sha1-KWLPVOyXksSFEKPetSRDaGHvclE=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-red": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ansi-red/-/ansi-red-0.1.1.tgz", + "integrity": "sha1-jGOPnRCAgAo1PJwoyKgcpHBdlGw=", + "dev": true, + "requires": { + "ansi-wrap": "0.1.0" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "ansi-wrap": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ansi-wrap/-/ansi-wrap-0.1.0.tgz", + "integrity": "sha1-qCJQ3bABXponyoLoLqYDu/pF768=", + "dev": true + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.2.tgz", + "integrity": "sha512-0XNayC8lTHQ2OI8aljNCN3sSx6hsr/1+rlcDAotXJR7C1oZZHCNsfpbKwMjRA3Uqb5tF1Rae2oloTr4xpq+WjA==", + "dev": true, + "requires": { + "micromatch": "2.3.11", + "normalize-path": "2.1.1" + } + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/archy/-/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=", + "dev": true + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "dev": true, + "requires": { + "sprintf-js": "1.0.3" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz", + "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==", + "dev": true + }, + "arr-union": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz", + "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=", + "dev": true + }, + "array-differ": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-differ/-/array-differ-1.0.0.tgz", + "integrity": "sha1-7/UuN1gknTO+QCuLuOVkuytdQDE=", + "dev": true + }, + "array-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz", + "integrity": "sha1-p5SvDAWrF1KEbudTofIRoFugxE8=", + "dev": true + }, + "array-filter": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/array-filter/-/array-filter-0.0.1.tgz", + "integrity": "sha1-fajPLiZijtcygDWB/SH2fKzS7uw=", + "dev": true + }, + "array-find-index": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-find-index/-/array-find-index-1.0.2.tgz", + "integrity": "sha1-3wEKoSh+Fku9pvlyOwqWoexBh6E=", + "dev": true + }, + "array-ify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/array-ify/-/array-ify-1.0.0.tgz", + "integrity": "sha1-nlKHYrSpBmrRY6aWKjZEGOlibs4=", + "dev": true + }, + "array-map": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-map/-/array-map-0.0.0.tgz", + "integrity": "sha1-iKK6tz0c97zVwbEYoAP2b2ZfpmI=", + "dev": true + }, + "array-reduce": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/array-reduce/-/array-reduce-0.0.0.tgz", + "integrity": "sha1-FziZ0//Rx9k4PkR5Ul2+J4yrXys=", + "dev": true + }, + "array-slice": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz", + "integrity": "sha512-B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==", + "dev": true + }, + "array-union": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz", + "integrity": "sha1-mjRBDk9OPaI96jdb5b5w8kd47Dk=", + "dev": true, + "requires": { + "array-uniq": "1.0.3" + } + }, + "array-uniq": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz", + "integrity": "sha1-r2rId6Jcx/dOBYiUdThY39sk/bY=", + "dev": true + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=", + "dev": true + }, + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=", + "dev": true + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true + }, + "assign-symbols": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz", + "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=", + "dev": true + }, + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=", + "dev": true + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=", + "dev": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true + }, + "atob": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/atob/-/atob-2.0.3.tgz", + "integrity": "sha1-GcenYEc3dEaPILLS0DNyrX1Mv10=", + "dev": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true + }, + "babel-code-frame": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz", + "integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "esutils": "2.0.2", + "js-tokens": "3.0.2" + } + }, + "babel-core": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-core/-/babel-core-6.26.0.tgz", + "integrity": "sha1-rzL3izGm/O8RnIew/Y2XU/A6C7g=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-generator": "6.26.1", + "babel-helpers": "6.24.1", + "babel-messages": "6.23.0", + "babel-register": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "convert-source-map": "1.5.1", + "debug": "2.6.9", + "json5": "0.5.1", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "path-is-absolute": "1.0.1", + "private": "0.1.8", + "slash": "1.0.0", + "source-map": "0.5.7" + } + }, + "babel-generator": { + "version": "6.26.1", + "resolved": "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz", + "integrity": "sha512-HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==", + "dev": true, + "requires": { + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "detect-indent": "4.0.0", + "jsesc": "1.3.0", + "lodash": "4.17.5", + "source-map": "0.5.7", + "trim-right": "1.0.1" + } + }, + "babel-helper-call-delegate": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz", + "integrity": "sha1-7Oaqzdx25Bw0YfiL/Fdb0Nqi340=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-define-map": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz", + "integrity": "sha1-pfVtq0GiX5fstJjH66ypgZ+Vvl8=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-helper-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz", + "integrity": "sha1-00dbjAPtmCQqJbSDUasYOZ01gKk=", + "dev": true, + "requires": { + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-get-function-arity": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz", + "integrity": "sha1-j3eCqpNAfEHTqlCQj4mwMbG2hT0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-hoist-variables": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz", + "integrity": "sha1-HssnaJydJVE+rbyZFKc/VAi+enY=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-optimise-call-expression": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz", + "integrity": "sha1-96E0J7qfc/j0+pk8VKl4gtEkQlc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helper-regex": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz", + "integrity": "sha1-MlxZ+QL4LyS3T6zu0DY5VPZJXnI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-helper-replace-supers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz", + "integrity": "sha1-v22/5Dk40XNpohPKiov3S2qQqxo=", + "dev": true, + "requires": { + "babel-helper-optimise-call-expression": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-helpers": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz", + "integrity": "sha1-NHHenK7DiOXIUOWX5Yom3fN2ArI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-check-es2015-constants": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz", + "integrity": "sha1-NRV7EBQm/S/9PaP3XH0ekYNbv4o=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-arrow-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz", + "integrity": "sha1-RSaSy3EdX3ncf4XkQM5BufJE0iE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoped-functions": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz", + "integrity": "sha1-u8UbSflk1wy42OC5ToICRs46YUE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-block-scoping": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz", + "integrity": "sha1-1w9SmcEwjQXBL0Y4E7CgnnOxiV8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "lodash": "4.17.5" + } + }, + "babel-plugin-transform-es2015-classes": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz", + "integrity": "sha1-WkxYpQyclGHlZLSyo7+ryXolhNs=", + "dev": true, + "requires": { + "babel-helper-define-map": "6.26.0", + "babel-helper-function-name": "6.24.1", + "babel-helper-optimise-call-expression": "6.24.1", + "babel-helper-replace-supers": "6.24.1", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-computed-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz", + "integrity": "sha1-b+Ko0WiV1WNPTNmZttNICjCBWbM=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-destructuring": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz", + "integrity": "sha1-mXux8auWf2gtKwh2/jWNYOdlxW0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-duplicate-keys": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz", + "integrity": "sha1-c+s9MQypaePvnskcU3QabxV2Qj4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-for-of": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz", + "integrity": "sha1-9HyVsrYT3x0+zC/bdXNiPHUkhpE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-function-name": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz", + "integrity": "sha1-g0yJhTvDaxrw86TF26qU/Y6sqos=", + "dev": true, + "requires": { + "babel-helper-function-name": "6.24.1", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz", + "integrity": "sha1-T1SgLWzWbPkVKAAZox0xklN3yi4=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-amd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz", + "integrity": "sha1-Oz5UAXI5hC1tGcMBHEvS8AoA0VQ=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-commonjs": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.0.tgz", + "integrity": "sha1-DYOUApt9xqvhqX7xgeAHWN0uXYo=", + "dev": true, + "requires": { + "babel-plugin-transform-strict-mode": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-systemjs": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz", + "integrity": "sha1-/4mhQrkRmpBhlfXxBuzzBdlAfSM=", + "dev": true, + "requires": { + "babel-helper-hoist-variables": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-modules-umd": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz", + "integrity": "sha1-rJl+YoXNGO1hdq22B9YCNErThGg=", + "dev": true, + "requires": { + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0" + } + }, + "babel-plugin-transform-es2015-object-super": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz", + "integrity": "sha1-JM72muIcuDp/hgPa0CH1cusnj40=", + "dev": true, + "requires": { + "babel-helper-replace-supers": "6.24.1", + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-parameters": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz", + "integrity": "sha1-V6w1GrScrxSpfNE7CfZv3wpiXys=", + "dev": true, + "requires": { + "babel-helper-call-delegate": "6.24.1", + "babel-helper-get-function-arity": "6.24.1", + "babel-runtime": "6.26.0", + "babel-template": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-shorthand-properties": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz", + "integrity": "sha1-JPh11nIch2YbvZmkYi5R8U3jiqA=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-spread": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz", + "integrity": "sha1-1taKmfia7cRTbIGlQujdnxdG+NE=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-sticky-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz", + "integrity": "sha1-AMHNsaynERLN8M9hJsLta0V8zbw=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-plugin-transform-es2015-template-literals": { + "version": "6.22.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz", + "integrity": "sha1-qEs0UPfp+PH2g51taH2oS7EjbY0=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-typeof-symbol": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz", + "integrity": "sha1-3sCfHN3/lLUqxz1QXITfWdzOs3I=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0" + } + }, + "babel-plugin-transform-es2015-unicode-regex": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz", + "integrity": "sha1-04sS9C6nMj9yk4fxinxa4frrNek=", + "dev": true, + "requires": { + "babel-helper-regex": "6.26.0", + "babel-runtime": "6.26.0", + "regexpu-core": "2.0.0" + } + }, + "babel-plugin-transform-regenerator": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz", + "integrity": "sha1-4HA2lvveJ/Cj78rPi03KL3s6jy8=", + "dev": true, + "requires": { + "regenerator-transform": "0.10.1" + } + }, + "babel-plugin-transform-strict-mode": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz", + "integrity": "sha1-1fr3qleKZbvlkc9e2uBKDGcCB1g=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0" + } + }, + "babel-polyfill": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.23.0.tgz", + "integrity": "sha1-g2TKYt+Or7gwSZ9pkXdGbDsDSZ0=", + "requires": { + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "regenerator-runtime": "0.10.5" + } + }, + "babel-preset-es2015": { + "version": "6.24.1", + "resolved": "https://registry.npmjs.org/babel-preset-es2015/-/babel-preset-es2015-6.24.1.tgz", + "integrity": "sha1-1EBQ1rwsn+6nAqrzjXJ6AhBTiTk=", + "dev": true, + "requires": { + "babel-plugin-check-es2015-constants": "6.22.0", + "babel-plugin-transform-es2015-arrow-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoped-functions": "6.22.0", + "babel-plugin-transform-es2015-block-scoping": "6.26.0", + "babel-plugin-transform-es2015-classes": "6.24.1", + "babel-plugin-transform-es2015-computed-properties": "6.24.1", + "babel-plugin-transform-es2015-destructuring": "6.23.0", + "babel-plugin-transform-es2015-duplicate-keys": "6.24.1", + "babel-plugin-transform-es2015-for-of": "6.23.0", + "babel-plugin-transform-es2015-function-name": "6.24.1", + "babel-plugin-transform-es2015-literals": "6.22.0", + "babel-plugin-transform-es2015-modules-amd": "6.24.1", + "babel-plugin-transform-es2015-modules-commonjs": "6.26.0", + "babel-plugin-transform-es2015-modules-systemjs": "6.24.1", + "babel-plugin-transform-es2015-modules-umd": "6.24.1", + "babel-plugin-transform-es2015-object-super": "6.24.1", + "babel-plugin-transform-es2015-parameters": "6.24.1", + "babel-plugin-transform-es2015-shorthand-properties": "6.24.1", + "babel-plugin-transform-es2015-spread": "6.22.0", + "babel-plugin-transform-es2015-sticky-regex": "6.24.1", + "babel-plugin-transform-es2015-template-literals": "6.22.0", + "babel-plugin-transform-es2015-typeof-symbol": "6.23.0", + "babel-plugin-transform-es2015-unicode-regex": "6.24.1", + "babel-plugin-transform-regenerator": "6.26.0" + } + }, + "babel-register": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz", + "integrity": "sha1-btAhFz4vy0htestFxgCahW9kcHE=", + "dev": true, + "requires": { + "babel-core": "6.26.0", + "babel-runtime": "6.26.0", + "core-js": "2.5.3", + "home-or-tmp": "2.0.0", + "lodash": "4.17.5", + "mkdirp": "0.5.1", + "source-map-support": "0.4.18" + } + }, + "babel-root-import": { + "version": "4.1.8", + "resolved": "https://registry.npmjs.org/babel-root-import/-/babel-root-import-4.1.8.tgz", + "integrity": "sha1-E1u4OYbVfW91upt3crMWM+Ivvaw=", + "dev": true, + "requires": { + "slash": "1.0.0" + } + }, + "babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "requires": { + "core-js": "2.5.3", + "regenerator-runtime": "0.11.1" + }, + "dependencies": { + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-traverse": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "lodash": "4.17.5" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "dev": true, + "requires": { + "babel-code-frame": "6.26.0", + "babel-messages": "6.23.0", + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "babylon": "6.18.0", + "debug": "2.6.9", + "globals": "9.18.0", + "invariant": "2.2.2", + "lodash": "4.17.5" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "esutils": "2.0.2", + "lodash": "4.17.5", + "to-fast-properties": "1.0.3" + } + }, + "babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "dev": true + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=", + "dev": true + }, + "base": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz", + "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==", + "dev": true, + "requires": { + "cache-base": "1.0.1", + "class-utils": "0.3.6", + "component-emitter": "1.2.1", + "define-property": "1.0.0", + "isobject": "3.0.1", + "mixin-deep": "1.3.1", + "pascalcase": "0.1.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "beeper": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/beeper/-/beeper-1.1.1.tgz", + "integrity": "sha1-5tXqjF2tABMEpwsiY4RH9pyy+Ak=", + "dev": true + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=", + "dev": true + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=", + "dev": true + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "requires": { + "balanced-match": "1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "dev": true, + "requires": { + "expand-range": "1.8.2", + "preserve": "0.2.0", + "repeat-element": "1.1.2" + } + }, + "browser-stdout": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/browser-stdout/-/browser-stdout-1.3.0.tgz", + "integrity": "sha1-81HTKWnTL6XXpVZxVCY9korjvR8=", + "dev": true + }, + "buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha1-DTM+PwDqxQqhRUq9MO+MKl2ackI=", + "dev": true + }, + "builtin-modules": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz", + "integrity": "sha1-Jw8HbFpywC9bZaR9+Uxf46J4iS8=", + "dev": true + }, + "bump-regex": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/bump-regex/-/bump-regex-3.1.0.tgz", + "integrity": "sha512-pgiPDUHh6bT/MDBU/nA1dU67337qD4MbrpQHmpDMiBChEsPEZwNelO25GenJrRYUXbWZuvsIZGLBChtN8Nxb+g==", + "dev": true, + "requires": { + "semver": "5.5.0", + "xtend": "4.0.1" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, + "cache-base": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz", + "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==", + "dev": true, + "requires": { + "collection-visit": "1.0.0", + "component-emitter": "1.2.1", + "get-value": "2.0.6", + "has-value": "1.0.0", + "isobject": "3.0.1", + "set-value": "2.0.0", + "to-object-path": "0.3.0", + "union-value": "1.0.0", + "unset-value": "1.0.0" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "caller-path": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-0.1.0.tgz", + "integrity": "sha1-lAhe9jWB7NPaqSREqP6U6CV3dR8=", + "dev": true, + "requires": { + "callsites": "0.2.0" + } + }, + "callsites": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-0.2.0.tgz", + "integrity": "sha1-r6uWJikQp/M8GaV3WCXGnzTjUMo=", + "dev": true + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=", + "dev": true + }, + "camelcase-keys": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-2.1.0.tgz", + "integrity": "sha1-MIvur/3ygRkFHvodkyITyRuPkuc=", + "dev": true, + "requires": { + "camelcase": "2.1.1", + "map-obj": "1.0.1" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "dev": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4", + "lazy-cache": "1.0.4" + }, + "dependencies": { + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=", + "dev": true, + "optional": true + } + } + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "2.2.1", + "escape-string-regexp": "1.0.5", + "has-ansi": "2.0.0", + "strip-ansi": "3.0.1", + "supports-color": "2.0.0" + } + }, + "chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha1-tUc7M9yXxCTl2Y3IfVXU2KKci/I=" + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "dev": true, + "requires": { + "anymatch": "1.3.2", + "async-each": "1.0.1", + "fsevents": "1.1.3", + "glob-parent": "2.0.0", + "inherits": "2.0.3", + "is-binary-path": "1.0.1", + "is-glob": "2.0.1", + "path-is-absolute": "1.0.1", + "readdirp": "2.1.0" + } + }, + "circular-json": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/circular-json/-/circular-json-0.3.3.tgz", + "integrity": "sha512-UZK3NBx2Mca+b5LsG7bY183pHWt5Y1xts4P3Pz7ENTwGVnJOUWbRb3ocjvX7hx9tq/yTAdclXm9sZ38gNuem4A==", + "dev": true + }, + "class-utils": { + "version": "0.3.6", + "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz", + "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "define-property": "0.2.5", + "isobject": "3.0.1", + "static-extend": "0.1.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=", + "requires": { + "restore-cursor": "2.0.0" + } + }, + "cli-width": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.0.tgz", + "integrity": "sha1-/xnt6Kml5XkyQUewwR8PvLq+1jk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "dev": true, + "optional": true, + "requires": { + "center-align": "0.1.3", + "right-align": "0.1.3", + "wordwrap": "0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=", + "dev": true, + "optional": true + } + } + }, + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "clone-buffer": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-buffer/-/clone-buffer-1.0.0.tgz", + "integrity": "sha1-4+JbIHrE5wGvch4staFnksrD3Fg=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "cloneable-readable": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/cloneable-readable/-/cloneable-readable-1.0.0.tgz", + "integrity": "sha1-pikNQT8hemEjL5XkWP84QYz7ARc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "process-nextick-args": "1.0.7", + "through2": "2.0.3" + }, + "dependencies": { + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true + }, + "coa": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.1.tgz", + "integrity": "sha512-5wfTTO8E2/ja4jFSxePXlG5nRu5bBtL/r1HCIpJW/lzT6yDtKl0u0Z4o/Vpz32IpKmBn7HerheEZQgA9N2DarQ==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "collection-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz", + "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=", + "dev": true, + "requires": { + "map-visit": "1.0.0", + "object-visit": "1.0.1" + } + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.1.tgz", + "integrity": "sha512-mjGanIiwQJskCC18rPR6OmrZ6fm2Lc7PeGFYwCmy5J34wC6F1PzdGL6xeMfmgicfYcNLGuVFA3WzXtIDCQSZxQ==", + "dev": true, + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=", + "dev": true + }, + "color-support": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-support/-/color-support-1.1.3.tgz", + "integrity": "sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==", + "dev": true + }, + "colors": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz", + "integrity": "sha1-FopHAXVran9RoSzgyXv6KMCE7WM=", + "dev": true + }, + "combined-stream": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz", + "integrity": "sha1-cj599ugBrFYTETp+RFqbactjKBg=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "commander": { + "version": "2.14.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz", + "integrity": "sha512-+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==", + "dev": true + }, + "compare-func": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/compare-func/-/compare-func-1.3.2.tgz", + "integrity": "sha1-md0LpFfh+bxyKxLAjsM+6rMfpkg=", + "dev": true, + "requires": { + "array-ify": "1.0.0", + "dot-prop": "3.0.0" + } + }, + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha1-E3kY1teCg/ffemt8WmPhQOaUJeY=", + "dev": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "concat-stream": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.0.tgz", + "integrity": "sha1-CqxmL9Ur54lk1VMvaUeE5wEQrPc=", + "dev": true, + "requires": { + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "typedarray": "0.0.6" + } + }, + "conventional-changelog": { + "version": "1.1.15", + "resolved": "https://registry.npmjs.org/conventional-changelog/-/conventional-changelog-1.1.15.tgz", + "integrity": "sha512-nBHfdoIfm78Bh/8KAEKVjAfr6jT6+uAoayj8EpEIEpjXBwoB74FlC7hUDwbxbAA/WKZout8SuqnpPH0cX4/aqw==", + "dev": true, + "requires": { + "conventional-changelog-angular": "1.6.4", + "conventional-changelog-atom": "0.2.2", + "conventional-changelog-codemirror": "0.3.2", + "conventional-changelog-core": "2.0.3", + "conventional-changelog-ember": "0.3.4", + "conventional-changelog-eslint": "1.0.2", + "conventional-changelog-express": "0.3.2", + "conventional-changelog-jquery": "0.1.0", + "conventional-changelog-jscs": "0.1.0", + "conventional-changelog-jshint": "0.3.2", + "conventional-changelog-preset-loader": "1.1.4" + } + }, + "conventional-changelog-angular": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-angular/-/conventional-changelog-angular-1.6.4.tgz", + "integrity": "sha512-CGtgqRBYOYYwP/FGBZ+NydolVv0+9bFcQZYMqw8YPKms1n6QlKguaqO0bfBLRChWZjDXjTI3Spd/bNineVtAqA==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-atom": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-atom/-/conventional-changelog-atom-0.2.2.tgz", + "integrity": "sha512-NhQcqCMfHTIlnglX4lMskqU6NC9rSqbT7razVHZ/Fq21iEHkrWx5dhjTonRB5BAAUSowBURCczqUILZ612xFrQ==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-codemirror": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-codemirror/-/conventional-changelog-codemirror-0.3.2.tgz", + "integrity": "sha512-z/ZmaSSigCw7Te6ozncLww6DmwCYGXvSbi3S7kkVvPKPRYGkKdWJI6Nmyx3AAqzzt6W420sMVOSJGX6dyEQDKw==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-core": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/conventional-changelog-core/-/conventional-changelog-core-2.0.3.tgz", + "integrity": "sha512-yLnwThgG5M7k4ZuG87sWXQBEQPTijcB4TpUrSzJcH6Jk7vkZR4ej7GJgY5TqKKiVwALWzyAGd6GenzGbNZvYnw==", + "dev": true, + "requires": { + "conventional-changelog-writer": "3.0.2", + "conventional-commits-parser": "2.1.3", + "dateformat": "1.0.12", + "get-pkg-repo": "1.4.0", + "git-raw-commits": "1.3.2", + "git-remote-origin-url": "2.0.0", + "git-semver-tags": "1.3.2", + "lodash": "4.17.5", + "normalize-package-data": "2.4.0", + "q": "1.5.1", + "read-pkg": "1.1.0", + "read-pkg-up": "1.0.1", + "through2": "2.0.3" + }, + "dependencies": { + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + } + } + }, + "conventional-changelog-ember": { + "version": "0.3.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-ember/-/conventional-changelog-ember-0.3.4.tgz", + "integrity": "sha512-PfwI9tvVJFn95of/g4mMBHtXZDPVNuYzi+hDyl9ZZe6/7WyUc90gj+cEgg+8gcrZwUFaZpliWavTYp6tfbBg1A==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-eslint": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-eslint/-/conventional-changelog-eslint-1.0.2.tgz", + "integrity": "sha512-WDs2etoKFNRv3rFgbg3LqPbVWn89OL8bsRbU1NNAnpPVmWcQEGkg/Tny9BjJl++JjxmWqYY+xtPPdnvd63WIYw==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-express": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-express/-/conventional-changelog-express-0.3.2.tgz", + "integrity": "sha512-QQU7t/Ec5bgRSoJL5gHmTfsRCrJOZHfVkbX2NNWl+EU91nAT28HgOAlD6ymH5EYMP/skpVkIwQyT9myVjxcJew==", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jquery": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jquery/-/conventional-changelog-jquery-0.1.0.tgz", + "integrity": "sha1-Agg5cWLjhGmG5xJztsecW1+A9RA=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jscs": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/conventional-changelog-jscs/-/conventional-changelog-jscs-0.1.0.tgz", + "integrity": "sha1-BHnrRDzH1yxYvwvPDvHURKkvDlw=", + "dev": true, + "requires": { + "q": "1.5.1" + } + }, + "conventional-changelog-jshint": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-jshint/-/conventional-changelog-jshint-0.3.2.tgz", + "integrity": "sha512-b3cx1n6QyE5czpZTAEBFZxPj0aQ3vxjmdNrP+E83b+FBxh9cYZQrUXeC5rnIRvSj8rLkYAJJ07oG8PyevAxhtw==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "q": "1.5.1" + } + }, + "conventional-changelog-preset-loader": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/conventional-changelog-preset-loader/-/conventional-changelog-preset-loader-1.1.4.tgz", + "integrity": "sha512-KY9sGPKnKlW542FpNN4++GkijXnND69/MgMa6EDibnyYXO6gV/NPwQwDTH6MOVVIjhspMgEM69H3yFVHo5Ud5g==", + "dev": true + }, + "conventional-changelog-writer": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/conventional-changelog-writer/-/conventional-changelog-writer-3.0.2.tgz", + "integrity": "sha512-eYXmYxT1IUuzzfpQuFA2/t3ex+7rFBbJchDIWyDTAs7OFkPBAfAs3EG04cDkEAG6Tn3wnwrtDKVZL9sMfA3kIw==", + "dev": true, + "requires": { + "compare-func": "1.3.2", + "conventional-commits-filter": "1.1.3", + "dateformat": "1.0.12", + "handlebars": "4.0.11", + "json-stringify-safe": "5.0.1", + "lodash": "4.17.5", + "meow": "3.7.0", + "semver": "5.5.0", + "split": "1.0.1", + "through2": "2.0.3" + }, + "dependencies": { + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, + "conventional-commits-filter": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/conventional-commits-filter/-/conventional-commits-filter-1.1.3.tgz", + "integrity": "sha512-kwGGg0xCHR51YIVjtoCTNgx9I1qEMETerTdSK4XsH2OxNLigDn6XKXnPMFZ+gfoUxaqbnpFSJqs4jYVpuJ1XAg==", + "dev": true, + "requires": { + "is-subset": "0.1.1", + "modify-values": "1.0.0" + } + }, + "conventional-commits-parser": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/conventional-commits-parser/-/conventional-commits-parser-2.1.3.tgz", + "integrity": "sha512-j5nXna/snJtrzFtPbDm+9R5UsjteJkXn+cG1kGEi4+4e25U57CZBB6DiUdxOCnM9LOIHeLDBF61e9MtjPsZthw==", + "dev": true, + "requires": { + "JSONStream": "1.3.2", + "is-text-path": "1.0.1", + "lodash": "4.17.5", + "meow": "3.7.0", + "split2": "2.2.0", + "through2": "2.0.3", + "trim-off-newlines": "1.0.1" + } + }, + "conventional-recommended-bump": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/conventional-recommended-bump/-/conventional-recommended-bump-1.2.1.tgz", + "integrity": "sha512-oJjG6DkRgtnr/t/VrPdzmf4XZv8c4xKVJrVT4zrSHd92KEL+EYxSbYoKq8lQ7U5yLMw7130wrcQTLRjM/T+d4w==", + "dev": true, + "requires": { + "concat-stream": "1.6.0", + "conventional-commits-filter": "1.1.3", + "conventional-commits-parser": "2.1.3", + "git-raw-commits": "1.3.2", + "git-semver-tags": "1.3.2", + "meow": "3.7.0", + "object-assign": "4.1.1" + } + }, + "convert-source-map": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.5.1.tgz", + "integrity": "sha1-uCeAl7m8IpNl3lxiz1/K7YtVmeU=", + "dev": true + }, + "copy-descriptor": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz", + "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=", + "dev": true + }, + "core-js": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.5.3.tgz", + "integrity": "sha1-isw4NFgk8W2DZbfJtCWRaOjtYD4=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cpx": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/cpx/-/cpx-1.5.0.tgz", + "integrity": "sha1-GFvgGFEdhycN7czCkxceN2VauI8=", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "chokidar": "1.7.0", + "duplexer": "0.1.1", + "glob": "7.1.2", + "glob2base": "0.0.12", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "resolve": "1.5.0", + "safe-buffer": "5.1.1", + "shell-quote": "1.6.1", + "subarg": "1.0.0" + } + }, + "cross-spawn": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-5.1.0.tgz", + "integrity": "sha1-6L0O/uWPz/b4+UUQoKVUu/ojVEk=", + "dev": true, + "requires": { + "lru-cache": "4.1.1", + "shebang-command": "1.2.0", + "which": "1.3.0" + }, + "dependencies": { + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.1.tgz", + "integrity": "sha512-q4spe4KTfsAS1SUHLO0wz8Qiyf1+vMIAgpRYioFYDMNqKfHQbg+AVDH3i4fvpl71/P1L0dBl+fQi+P37UYf0ew==", + "dev": true, + "requires": { + "pseudomap": "1.0.2", + "yallist": "2.1.2" + } + } + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "css-select": { + "version": "1.3.0-rc0", + "resolved": "https://registry.npmjs.org/css-select/-/css-select-1.3.0-rc0.tgz", + "integrity": "sha1-b5MZaqrnN2ZuoQNqjLFKj8t6kjE=", + "dev": true, + "requires": { + "boolbase": "1.0.0", + "css-what": "2.1.0", + "domutils": "1.5.1", + "nth-check": "1.0.1" + } + }, + "css-select-base-adapter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.0.tgz", + "integrity": "sha1-AQKz0UYw34bD65+p9UVicBBs+ZA=", + "dev": true + }, + "css-tree": { + "version": "1.0.0-alpha25", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha25.tgz", + "integrity": "sha512-XC6xLW/JqIGirnZuUWHXCHRaAjje2b3OIB0Vj5RIJo6mIi/AdJo30quQl5LxUl0gkXDIrTrFGbMlcZjyFplz1A==", + "dev": true, + "requires": { + "mdn-data": "1.1.0", + "source-map": "0.5.7" + } + }, + "css-url-regex": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/css-url-regex/-/css-url-regex-1.1.0.tgz", + "integrity": "sha1-g4NCMMyfdMRX3lnuvRVD/uuDt+w=", + "dev": true + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/css-what/-/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=", + "dev": true + }, + "csso": { + "version": "3.5.0", + "resolved": "https://registry.npmjs.org/csso/-/csso-3.5.0.tgz", + "integrity": "sha512-WtJjFP3ZsSdWhiZr4/k1B9uHPgYjFYnDxfbaJxk1hz5PDLIJ5BCRWkJqaztZ0DbP8d2ZIVwUPIJb2YmCwkPaMw==", + "dev": true, + "requires": { + "css-tree": "1.0.0-alpha.27" + }, + "dependencies": { + "css-tree": { + "version": "1.0.0-alpha.27", + "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.27.tgz", + "integrity": "sha512-BAYp9FyN4jLXjfvRpTDchBllDptqlK9I7OsagXCG9Am5C+5jc8eRZHgqb9x500W2OKS14MMlpQc/nmh/aA7TEQ==", + "dev": true, + "requires": { + "mdn-data": "1.1.0", + "source-map": "0.5.7" + } + } + } + }, + "currently-unhandled": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/currently-unhandled/-/currently-unhandled-0.4.1.tgz", + "integrity": "sha1-mI3zP+qxke95mmE2nddsF635V+o=", + "dev": true, + "requires": { + "array-find-index": "1.0.2" + } + }, + "dargs": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/dargs/-/dargs-4.1.0.tgz", + "integrity": "sha1-A6nbtLXC8Tm/FK5T8LiipqhvThc=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "dateformat": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-2.2.0.tgz", + "integrity": "sha1-QGXiATz5+5Ft39gu+1Bq1MZ2kGI=", + "dev": true + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=", + "dev": true + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=", + "dev": true + }, + "deep-assign": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/deep-assign/-/deep-assign-1.0.0.tgz", + "integrity": "sha1-sJJ0O+hCfcYh6gBnzex+cN0Z83s=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "dev": true + }, + "defaults": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz", + "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=", + "dev": true, + "requires": { + "clone": "1.0.3" + } + }, + "define-properties": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.2.tgz", + "integrity": "sha1-g6c/L+pWmJj7c3GTyPhzyvbUXJQ=", + "dev": true, + "requires": { + "foreach": "2.0.5", + "object-keys": "1.0.11" + } + }, + "define-property": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz", + "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=", + "dev": true, + "requires": { + "is-descriptor": "1.0.2" + } + }, + "del": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/del/-/del-2.2.2.tgz", + "integrity": "sha1-wSyYHQZ4RshLyvhiz/kw2Qf/0ag=", + "dev": true, + "requires": { + "globby": "5.0.0", + "is-path-cwd": "1.0.0", + "is-path-in-cwd": "1.0.0", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "rimraf": "2.6.2" + } + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "deprecated": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/deprecated/-/deprecated-0.0.1.tgz", + "integrity": "sha1-+cmvVGSvoeepcUWKi97yqpTVuxk=", + "dev": true + }, + "detect-file": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz", + "integrity": "sha1-8NZtA2cqglyxtzvbP+YjEMjlUrc=", + "dev": true + }, + "detect-indent": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz", + "integrity": "sha1-920GQ1LN9Docts5hnE7jqUdd4gg=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "diff": { + "version": "3.3.1", + "resolved": "https://registry.npmjs.org/diff/-/diff-3.3.1.tgz", + "integrity": "sha512-MKPHZDMB0o6yHyDryUOScqZibp914ksXwAMYMTHj6KO8UeKsRYNJD3oNCKjTqZon+V488P7N/HzXF8t7ZR95ww==", + "dev": true + }, + "doctrine": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-2.1.0.tgz", + "integrity": "sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==", + "dev": true, + "requires": { + "esutils": "2.0.2" + } + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "dev": true, + "requires": { + "domelementtype": "1.1.3", + "entities": "1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=", + "dev": true + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=", + "dev": true + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "dev": true, + "requires": { + "dom-serializer": "0.1.0", + "domelementtype": "1.3.0" + } + }, + "dot-prop": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-3.0.0.tgz", + "integrity": "sha1-G3CK8JSknJoOfbyteQq6U52sEXc=", + "dev": true, + "requires": { + "is-obj": "1.0.1" + } + }, + "dotgitignore": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/dotgitignore/-/dotgitignore-1.0.3.tgz", + "integrity": "sha512-eu5XjSstm0WXQsARgo6kPjkINYZlOUW+z/KtAAIBjHa5mUpMPrxJytbPIndWz6GubBuuuH5ljtVcXKnVnH5q8w==", + "dev": true, + "requires": { + "find-up": "2.1.0", + "minimatch": "3.0.4" + }, + "dependencies": { + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + } + } + }, + "duplexer": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/duplexer/-/duplexer-0.1.1.tgz", + "integrity": "sha1-rOb/gIwc5mtX0ev5eXessCM0z8E=", + "dev": true + }, + "duplexer2": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.0.2.tgz", + "integrity": "sha1-xhTc9n4vsUmVqRcR5aYX6KYKMds=", + "dev": true, + "requires": { + "readable-stream": "1.1.14" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + } + } + }, + "duplexify": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.5.3.tgz", + "integrity": "sha512-g8ID9OroF9hKt2POf8YLayy+9594PzmM3scI00/uBXocX3TWNgoB67hjzkFe9ITAbQOne/lLdBxHXvYUM4ZgGA==", + "dev": true, + "requires": { + "end-of-stream": "1.4.1", + "inherits": "2.0.3", + "readable-stream": "2.3.4", + "stream-shift": "1.0.0" + }, + "dependencies": { + "end-of-stream": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz", + "integrity": "sha512-1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==", + "dev": true, + "requires": { + "once": "1.4.0" + } + } + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "encoding": { + "version": "0.1.12", + "resolved": "https://registry.npmjs.org/encoding/-/encoding-0.1.12.tgz", + "integrity": "sha1-U4tm8+5izRq1HsMjgp0flIDHS+s=", + "requires": { + "iconv-lite": "0.4.19" + } + }, + "end-of-stream": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-0.1.5.tgz", + "integrity": "sha1-jhdyBsPICDfYVjLouTWd/osvbq8=", + "dev": true, + "requires": { + "once": "1.3.3" + }, + "dependencies": { + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + } + } + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=", + "dev": true + }, + "error-ex": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.1.tgz", + "integrity": "sha1-+FWobOYa3E6GIcPNoh56dhLDqNw=", + "dev": true, + "requires": { + "is-arrayish": "0.2.1" + } + }, + "es-abstract": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.10.0.tgz", + "integrity": "sha512-/uh/DhdqIOSkAWifU+8nG78vlQxdLckUdI/sPgy0VhuXi2qJ7T8czBmqIYtLQVpCIFYafChnsRsB5pyb1JdmCQ==", + "dev": true, + "requires": { + "es-to-primitive": "1.1.1", + "function-bind": "1.1.1", + "has": "1.0.1", + "is-callable": "1.1.3", + "is-regex": "1.0.4" + } + }, + "es-to-primitive": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.1.1.tgz", + "integrity": "sha1-RTVSSKiJeQNLZ5Lhm7gfK3l13Q0=", + "dev": true, + "requires": { + "is-callable": "1.1.3", + "is-date-object": "1.0.1", + "is-symbol": "1.0.1" + } + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "eslint": { + "version": "4.17.0", + "resolved": "https://registry.npmjs.org/eslint/-/eslint-4.17.0.tgz", + "integrity": "sha512-AyxBUCANU/o/xC0ijGMKavo5Ls3oK6xykiOITlMdjFjrKOsqLrA7Nf5cnrDgcKrHzBirclAZt63XO7YZlVUPwA==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "babel-code-frame": "6.26.0", + "chalk": "2.3.1", + "concat-stream": "1.6.0", + "cross-spawn": "5.1.0", + "debug": "3.1.0", + "doctrine": "2.1.0", + "eslint-scope": "3.7.1", + "eslint-visitor-keys": "1.0.0", + "espree": "3.5.3", + "esquery": "1.0.0", + "esutils": "2.0.2", + "file-entry-cache": "2.0.0", + "functional-red-black-tree": "1.0.1", + "glob": "7.1.2", + "globals": "11.3.0", + "ignore": "3.3.7", + "imurmurhash": "0.1.4", + "inquirer": "3.0.6", + "is-resolvable": "1.1.0", + "js-yaml": "3.10.0", + "json-stable-stringify-without-jsonify": "1.0.1", + "levn": "0.3.0", + "lodash": "4.17.5", + "minimatch": "3.0.4", + "mkdirp": "0.5.1", + "natural-compare": "1.4.0", + "optionator": "0.8.2", + "path-is-inside": "1.0.2", + "pluralize": "7.0.0", + "progress": "2.0.0", + "require-uncached": "1.0.3", + "semver": "5.5.0", + "strip-ansi": "4.0.0", + "strip-json-comments": "2.0.1", + "table": "4.0.2", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "globals": { + "version": "11.3.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.3.0.tgz", + "integrity": "sha512-kkpcKNlmQan9Z5ZmgqKH/SMbSmjxQ7QjyNqfXVc8VJcoBV2UEg+sxQD15GQofGRh2hfpwUb70VC31DR7Rq5Hdw==", + "dev": true + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "eslint-plugin-standard": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/eslint-plugin-standard/-/eslint-plugin-standard-3.0.1.tgz", + "integrity": "sha1-NNDJFbRe3G8BA5PH7vOCOwhWXPI=", + "dev": true + }, + "eslint-scope": { + "version": "3.7.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-3.7.1.tgz", + "integrity": "sha1-PWPD7f2gLgbgGkUq2IyqzHzctug=", + "dev": true, + "requires": { + "esrecurse": "4.2.0", + "estraverse": "4.2.0" + } + }, + "eslint-visitor-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.0.0.tgz", + "integrity": "sha512-qzm/XxIbxm/FHyH341ZrbnMUpe+5Bocte9xkmFMzPMjRaZMcXww+MpBptFvtU+79L362nqiLhekCxCxDPaUMBQ==", + "dev": true + }, + "espree": { + "version": "3.5.3", + "resolved": "https://registry.npmjs.org/espree/-/espree-3.5.3.tgz", + "integrity": "sha512-Zy3tAJDORxQZLl2baguiRU1syPERAIg0L+JB2MWorORgTu/CplzvxS9WWA7Xh4+Q+eOQihNs/1o1Xep8cvCxWQ==", + "dev": true, + "requires": { + "acorn": "5.4.1", + "acorn-jsx": "3.0.1" + } + }, + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.0.tgz", + "integrity": "sha512-oftTcaMu/EGrEIu904mWteKIv8vMuOgGYo7EhVJJN00R/EED9DCua/xxHRdYnKtcECzVg7xOWhflvJMnqcFZjw==", + "dev": true + }, + "esquery": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.0.0.tgz", + "integrity": "sha1-z7qLV9f7qT8XKYqKAGoEzaE9gPo=", + "dev": true, + "requires": { + "estraverse": "4.2.0" + } + }, + "esrecurse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.0.tgz", + "integrity": "sha1-+pVo2Y04I/mkHZHpAtyrnqblsWM=", + "dev": true, + "requires": { + "estraverse": "4.2.0", + "object-assign": "4.1.1" + } + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "dev": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=", + "dev": true + }, + "event-stream": { + "version": "3.3.4", + "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-3.3.4.tgz", + "integrity": "sha1-SrTJoPWlTbkzi0w02Gv86PSzVXE=", + "dev": true, + "requires": { + "duplexer": "0.1.1", + "from": "0.1.7", + "map-stream": "0.1.0", + "pause-stream": "0.0.11", + "split": "0.3.3", + "stream-combiner": "0.0.4", + "through": "2.3.8" + }, + "dependencies": { + "split": { + "version": "0.3.3", + "resolved": "https://registry.npmjs.org/split/-/split-0.3.3.tgz", + "integrity": "sha1-zQ7qXmOiEd//frDwkcQTPi0N0o8=", + "dev": true, + "requires": { + "through": "2.3.8" + } + } + } + }, + "execa": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/execa/-/execa-0.7.0.tgz", + "integrity": "sha1-lEvs00zEHuMqY6n68nrVpl/Fl3c=", + "dev": true, + "requires": { + "cross-spawn": "5.1.0", + "get-stream": "3.0.0", + "is-stream": "1.1.0", + "npm-run-path": "2.0.2", + "p-finally": "1.0.0", + "signal-exit": "3.0.2", + "strip-eof": "1.0.0" + } + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "dev": true, + "requires": { + "is-posix-bracket": "0.1.1" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "dev": true, + "requires": { + "fill-range": "2.2.3" + } + }, + "expand-tilde": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz", + "integrity": "sha1-l+gBqgUt8CRU3kawK/YhZCzchQI=", + "dev": true, + "requires": { + "homedir-polyfill": "1.0.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true + }, + "extend-shallow": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz", + "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=", + "dev": true, + "requires": { + "is-extendable": "0.1.1" + } + }, + "external-editor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/external-editor/-/external-editor-2.1.0.tgz", + "integrity": "sha512-E44iT5QVOUJBKij4IIV3uvxuNlbKS38Tw1HiupxEIHPv9qtC2PrDYohbXV5U+1jnfIXttny8gUhj+oZvflFlzA==", + "requires": { + "chardet": "0.4.2", + "iconv-lite": "0.4.19", + "tmp": "0.0.33" + } + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "dev": true + }, + "fancy-log": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fancy-log/-/fancy-log-1.3.2.tgz", + "integrity": "sha1-9BEl49hPLn2JpD0G2VjI94vha+E=", + "dev": true, + "requires": { + "ansi-gray": "0.1.1", + "color-support": "1.1.3", + "time-stamp": "1.1.0" + } + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "dev": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "dev": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "dev": true + }, + "fd-slicer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz", + "integrity": "sha1-i1vL2ewyfFBBv5qwI/1nUPEXfmU=", + "dev": true, + "requires": { + "pend": "1.2.0" + } + }, + "figures": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", + "integrity": "sha1-OrGi0qYsi/tDGgyUy3l6L84nyWI=", + "requires": { + "escape-string-regexp": "1.0.5" + } + }, + "file-entry-cache": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-2.0.0.tgz", + "integrity": "sha1-w5KZDD5oR4PYOLjISkXYoEhFg2E=", + "dev": true, + "requires": { + "flat-cache": "1.3.0", + "object-assign": "4.1.1" + } + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=", + "dev": true + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "dev": true, + "requires": { + "is-number": "2.1.0", + "isobject": "2.1.0", + "randomatic": "1.1.7", + "repeat-element": "1.1.2", + "repeat-string": "1.6.1" + } + }, + "find-index": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/find-index/-/find-index-0.1.1.tgz", + "integrity": "sha1-Z101iyyjiS15Whq0cjL4tuLg3eQ=", + "dev": true + }, + "find-up": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-1.1.2.tgz", + "integrity": "sha1-ay6YIrGizgpgq2TWEOzK1TyyTQ8=", + "dev": true, + "requires": { + "path-exists": "2.1.0", + "pinkie-promise": "2.0.1" + } + }, + "findup-sync": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz", + "integrity": "sha1-kyaxSIwi0aYIhlCoaQGy2akKLLw=", + "dev": true, + "requires": { + "detect-file": "1.0.0", + "is-glob": "3.1.0", + "micromatch": "3.1.5", + "resolve-dir": "1.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "braces": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.0.tgz", + "integrity": "sha512-P4O8UQRdGiMLWSizsApmXVQDBS6KCt7dSexgLKBmH5Hr1CZq7vsnscFh8oR1sP1ab1Zj0uCHCEzZeV6SfUf3rA==", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fill-range": "4.0.0", + "isobject": "3.0.1", + "repeat-element": "1.1.2", + "snapdragon": "0.8.1", + "snapdragon-node": "2.1.1", + "split-string": "3.1.0", + "to-regex": "3.0.1" + } + }, + "expand-brackets": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz", + "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=", + "dev": true, + "requires": { + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "posix-character-classes": "0.1.1", + "regex-not": "1.0.0", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + } + } + }, + "extglob": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz", + "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==", + "dev": true, + "requires": { + "array-unique": "0.3.2", + "define-property": "1.0.0", + "expand-brackets": "2.1.4", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "regex-not": "1.0.0", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + } + }, + "fill-range": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz", + "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-number": "3.0.0", + "repeat-string": "1.6.1", + "to-regex-range": "2.1.1" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + }, + "micromatch": { + "version": "3.1.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.5.tgz", + "integrity": "sha512-ykttrLPQrz1PUJcXjwsTUjGoPJ64StIGNE2lGVD1c9CuguJ+L7/navsE8IcDNndOoCMvYV0qc/exfVbMHkUhvA==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "braces": "2.3.0", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "extglob": "2.0.4", + "fragment-cache": "0.2.1", + "kind-of": "6.0.2", + "nanomatch": "1.2.7", + "object.pick": "1.3.0", + "regex-not": "1.0.0", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + } + } + } + }, + "fined": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz", + "integrity": "sha1-s33IRLdqL15wgeiE98CuNE8VNHY=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "is-plain-object": "2.0.4", + "object.defaults": "1.1.0", + "object.pick": "1.3.0", + "parse-filepath": "1.0.2" + } + }, + "first-chunk-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/first-chunk-stream/-/first-chunk-stream-1.0.0.tgz", + "integrity": "sha1-Wb+1DNkF9g18OUzT2ayqtOatk04=", + "dev": true + }, + "flagged-respawn": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz", + "integrity": "sha1-Tnmumy6zi/hrO7Vr8+ClaqX8q9c=", + "dev": true + }, + "flat-cache": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-1.3.0.tgz", + "integrity": "sha1-0wMLMrOBVPTjt+nHCfSQ9++XxIE=", + "dev": true, + "requires": { + "circular-json": "0.3.3", + "del": "2.2.2", + "graceful-fs": "4.1.11", + "write": "0.2.1" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=", + "dev": true + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "foreach": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz", + "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true + }, + "fork-stream": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/fork-stream/-/fork-stream-0.0.4.tgz", + "integrity": "sha1-24Sfznf2cIpfjzhq5TOgkHtUrnA=", + "dev": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "fragment-cache": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz", + "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=", + "dev": true, + "requires": { + "map-cache": "0.2.2" + } + }, + "from": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/from/-/from-0.1.7.tgz", + "integrity": "sha1-g8YK/Fi5xWmXAH7Rp2izqzA6RP4=", + "dev": true + }, + "fs-access": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/fs-access/-/fs-access-1.0.1.tgz", + "integrity": "sha1-1qh/JiJxzv6+wwxVNAf7mV2od3o=", + "dev": true, + "requires": { + "null-check": "1.0.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.1.3.tgz", + "integrity": "sha512-WIr7iDkdmdbxu/Gh6eKEZJL6KPE74/5MEsf2whTOFNxbIoIixogroLdKYqB6FDav4Wavh/lZdzzd3b2KxIXC5Q==", + "dev": true, + "optional": true, + "requires": { + "nan": "2.8.0", + "node-pre-gyp": "0.6.39" + }, + "dependencies": { + "abbrev": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.0.tgz", + "integrity": "sha1-0FVMIlZjbi9W58LlrRg/hZQo2B8=", + "dev": true, + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "dev": true, + "optional": true, + "requires": { + "co": "4.6.0", + "json-stable-stringify": "1.0.1" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=", + "dev": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "dev": true, + "optional": true + }, + "are-we-there-yet": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.4.tgz", + "integrity": "sha1-u13KOCu5TwXhUZQ3PRb9O6HKEQ0=", + "dev": true, + "optional": true, + "requires": { + "delegates": "1.0.0", + "readable-stream": "2.2.9" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "dev": true, + "optional": true + }, + "assert-plus": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz", + "integrity": "sha1-104bh+ev/A24qttwIfP+SBAasjQ=", + "dev": true, + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "dev": true, + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "dev": true, + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "dev": true, + "optional": true + }, + "balanced-match": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz", + "integrity": "sha1-yz8+PHMtwPAe5wtAPzAuYddwmDg=", + "dev": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "dev": true, + "optional": true, + "requires": { + "tweetnacl": "0.14.5" + } + }, + "block-stream": { + "version": "0.0.9", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz", + "integrity": "sha1-E+v+d4oDIFz+A3UUgeu0szAMEmo=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "dev": true, + "requires": { + "balanced-match": "0.4.2", + "concat-map": "0.0.1" + } + }, + "buffer-shims": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/buffer-shims/-/buffer-shims-1.0.0.tgz", + "integrity": "sha1-mXjOMXOIxkmth5MCjDR37wRKi1E=", + "dev": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true, + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "dev": true, + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=", + "dev": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "dev": true, + "requires": { + "delayed-stream": "1.0.0" + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "dev": true + }, + "console-control-strings": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz", + "integrity": "sha1-PXz0Rk22RG6mRL9LOVB/mFEAjo4=", + "dev": true + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=", + "dev": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "dev": true, + "requires": { + "boom": "2.10.1" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "dev": true, + "optional": true, + "requires": { + "ms": "2.0.0" + } + }, + "deep-extend": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz", + "integrity": "sha1-SLaZwn4zS/ifEIkr5DL25MfTSn8=", + "dev": true, + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "dev": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "dev": true, + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", + "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", + "dev": true, + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "dev": true, + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "dev": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "dev": true, + "optional": true + }, + "form-data": { + "version": "2.1.4", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz", + "integrity": "sha1-M8GDrPGTJ27KqYFDpp6Uv+4XUNE=", + "dev": true, + "optional": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.5", + "mime-types": "2.1.15" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "dev": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.1" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "dev": true, + "optional": true, + "requires": { + "fstream": "1.0.11", + "inherits": "2.0.3", + "minimatch": "3.0.4" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "dev": true, + "optional": true, + "requires": { + "aproba": "1.1.1", + "console-control-strings": "1.1.0", + "has-unicode": "2.0.1", + "object-assign": "4.1.1", + "signal-exit": "3.0.2", + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wide-align": "1.1.2" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "har-schema": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz", + "integrity": "sha1-0mMTX0MwfALGAq/I/pWXDAFRNp4=", + "dev": true, + "optional": true + }, + "har-validator": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz", + "integrity": "sha1-M0gdDxu/9gDdID11gSpqX7oALio=", + "dev": true, + "optional": true, + "requires": { + "ajv": "4.11.8", + "har-schema": "1.0.5" + } + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=", + "dev": true, + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.0", + "sshpk": "1.13.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "dev": true, + "optional": true + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true, + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true, + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "dev": true, + "optional": true, + "requires": { + "jsbn": "0.1.1" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true, + "optional": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "optional": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true, + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true, + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "dev": true, + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.0.2", + "json-schema": "0.2.3", + "verror": "1.3.6" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "dev": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "dev": true, + "requires": { + "mime-db": "1.27.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.7" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true, + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.39", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.39.tgz", + "integrity": "sha512-OsJV74qxnvz/AMGgcfZoDaeDXKD3oY3QVIbBmwszTFkRisTSXbMQyn4UWzUMOtA5SVhrBZOTp0wcoSBgfMfMmQ==", + "dev": true, + "optional": true, + "requires": { + "detect-libc": "1.0.2", + "hawk": "3.1.3", + "mkdirp": "0.5.1", + "nopt": "4.0.1", + "npmlog": "4.1.0", + "rc": "1.2.1", + "request": "2.81.0", + "rimraf": "2.6.1", + "semver": "5.3.0", + "tar": "2.2.1", + "tar-pack": "3.4.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "dev": true, + "optional": true, + "requires": { + "abbrev": "1.1.0", + "osenv": "0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "dev": true, + "optional": true, + "requires": { + "are-we-there-yet": "1.1.4", + "console-control-strings": "1.1.0", + "gauge": "2.7.4", + "set-blocking": "2.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true, + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=", + "dev": true, + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true, + "optional": true + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=", + "dev": true, + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "dev": true, + "optional": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "dev": true, + "optional": true + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true, + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "dev": true, + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "dev": true, + "optional": true, + "requires": { + "deep-extend": "0.4.2", + "ini": "1.3.4", + "minimist": "1.2.0", + "strip-json-comments": "2.0.1" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "dev": true, + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "dev": true, + "requires": { + "buffer-shims": "1.0.0", + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "1.0.7", + "string_decoder": "1.0.1", + "util-deprecate": "1.0.2" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "dev": true, + "optional": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.5", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "4.2.1", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.15", + "oauth-sign": "0.8.2", + "performance-now": "0.2.0", + "qs": "6.4.0", + "safe-buffer": "5.0.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.2", + "tunnel-agent": "0.6.0", + "uuid": "3.0.1" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "dev": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "dev": true, + "optional": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true, + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "dev": true, + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "dev": true, + "optional": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jodid25519": "1.0.2", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true, + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "dev": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true, + "optional": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "dev": true, + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true, + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "dev": true, + "optional": true, + "requires": { + "debug": "2.6.8", + "fstream": "1.0.11", + "fstream-ignore": "1.0.5", + "once": "1.4.0", + "readable-stream": "2.2.9", + "rimraf": "2.6.1", + "tar": "2.2.1", + "uid-number": "0.0.6" + } + }, + "tough-cookie": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.2.tgz", + "integrity": "sha1-8IH3bkyFcg5sN6X6ztc3FQ2EByo=", + "dev": true, + "optional": true, + "requires": { + "punycode": "1.4.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "optional": true, + "requires": { + "safe-buffer": "5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "dev": true, + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "dev": true, + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "dev": true, + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "wide-align": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.2.tgz", + "integrity": "sha512-ijDLlyQ7s6x1JgCLur53osjm/UXUYD9+0PbYKrBsYisYXzCxN+HC3mYDNy/dWdmf3AwqwU3CXwDCvsNgGK1S0w==", + "dev": true, + "optional": true, + "requires": { + "string-width": "1.0.2" + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + } + } + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "inherits": "2.0.3", + "mkdirp": "0.5.1", + "rimraf": "2.6.2" + } + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==", + "dev": true + }, + "functional-red-black-tree": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz", + "integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=", + "dev": true + }, + "gaze": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz", + "integrity": "sha1-QLcJU30k0dRXZ9takIaJ3+aaxE8=", + "dev": true, + "requires": { + "globule": "0.1.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "dev": true + }, + "generate-object-property": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/generate-object-property/-/generate-object-property-1.2.0.tgz", + "integrity": "sha1-nA4cQDCM6AT0eDYYuTf6iPmdUNA=", + "dev": true, + "requires": { + "is-property": "1.0.2" + } + }, + "get-caller-file": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.2.tgz", + "integrity": "sha1-9wLmMSfn4jHBYKgMFVSstw1QR+U=", + "dev": true + }, + "get-pkg-repo": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/get-pkg-repo/-/get-pkg-repo-1.4.0.tgz", + "integrity": "sha1-xztInAbYDMVTbCyFP54FIyBWly0=", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "meow": "3.7.0", + "normalize-package-data": "2.4.0", + "parse-github-repo-url": "1.4.1", + "through2": "2.0.3" + } + }, + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=", + "dev": true + }, + "get-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz", + "integrity": "sha1-jpQ9E1jcN1VQVOy+LtsFqhdO3hQ=", + "dev": true + }, + "get-value": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz", + "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=", + "dev": true + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "dev": true, + "requires": { + "assert-plus": "1.0.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "git-raw-commits": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/git-raw-commits/-/git-raw-commits-1.3.2.tgz", + "integrity": "sha512-ojMbErvEIPXaqNNwomSp/DYLhhbU+BEcCOyPZ26U8VNaQjBRN9lZ7E3vfjIkTA8JLWYc5zsSxuVXut6bczKhrg==", + "dev": true, + "requires": { + "dargs": "4.1.0", + "lodash.template": "4.4.0", + "meow": "3.7.0", + "split2": "2.2.0", + "through2": "2.0.3" + }, + "dependencies": { + "lodash.template": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-4.4.0.tgz", + "integrity": "sha1-5zoDhcg1VZF0bgILmWecaQ5o+6A=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.templatesettings": "4.1.0" + } + }, + "lodash.templatesettings": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-4.1.0.tgz", + "integrity": "sha1-K01OlbpEDZFf8IvImeRVNmZxMxY=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0" + } + } + } + }, + "git-remote-origin-url": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/git-remote-origin-url/-/git-remote-origin-url-2.0.0.tgz", + "integrity": "sha1-UoJlna4hBxRaERJhEq0yFuxfpl8=", + "dev": true, + "requires": { + "gitconfiglocal": "1.0.0", + "pify": "2.3.0" + } + }, + "git-semver-tags": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/git-semver-tags/-/git-semver-tags-1.3.2.tgz", + "integrity": "sha512-CXQJ4GdxkUya1YQaEKGcYIJ9RiuX4RTWnRIhiMlTItl8czRix4akE0CpoUSLmljuxEnUM/pFpd2FFwo+nV0SPA==", + "dev": true, + "requires": { + "meow": "3.7.0", + "semver": "5.5.0" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, + "gitconfiglocal": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gitconfiglocal/-/gitconfiglocal-1.0.0.tgz", + "integrity": "sha1-QdBF84UaXqiPA/JMocYXgRRGS5s=", + "dev": true, + "requires": { + "ini": "1.3.5" + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "dev": true, + "requires": { + "fs.realpath": "1.0.0", + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "dev": true, + "requires": { + "glob-parent": "2.0.0", + "is-glob": "2.0.1" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "dev": true, + "requires": { + "is-glob": "2.0.1" + } + }, + "glob-stream": { + "version": "3.1.18", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-3.1.18.tgz", + "integrity": "sha1-kXCl8St5Awb9/lmPMT+PeVT9FDs=", + "dev": true, + "requires": { + "glob": "4.5.3", + "glob2base": "0.0.12", + "minimatch": "2.0.10", + "ordered-read-streams": "0.1.0", + "through2": "0.6.5", + "unique-stream": "1.0.0" + }, + "dependencies": { + "glob": { + "version": "4.5.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-4.5.3.tgz", + "integrity": "sha1-xstz0yJsHv7wTePFbQEvAzd+4V8=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "2.0.10", + "once": "1.4.0" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "glob-watcher": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/glob-watcher/-/glob-watcher-0.0.6.tgz", + "integrity": "sha1-uVtKjfdLOcgymLDAXJeLTZo7cQs=", + "dev": true, + "requires": { + "gaze": "0.5.2" + } + }, + "glob2base": { + "version": "0.0.12", + "resolved": "https://registry.npmjs.org/glob2base/-/glob2base-0.0.12.tgz", + "integrity": "sha1-nUGbPijxLoOjYhZKJ3BVkiycDVY=", + "dev": true, + "requires": { + "find-index": "0.1.1" + } + }, + "global-modules": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz", + "integrity": "sha512-sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==", + "dev": true, + "requires": { + "global-prefix": "1.0.2", + "is-windows": "1.0.1", + "resolve-dir": "1.0.1" + } + }, + "global-prefix": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz", + "integrity": "sha1-2/dDxsFJklk8ZVVoy2btMsASLr4=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "homedir-polyfill": "1.0.1", + "ini": "1.3.5", + "is-windows": "1.0.1", + "which": "1.3.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==", + "dev": true + }, + "globby": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/globby/-/globby-5.0.0.tgz", + "integrity": "sha1-69hGZ8oNuzMLmbz8aOrCvFQ3Dg0=", + "dev": true, + "requires": { + "array-union": "1.0.2", + "arrify": "1.0.1", + "glob": "7.1.2", + "object-assign": "4.1.1", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "globule": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz", + "integrity": "sha1-2cjt3h2nnRJaFRt5UzuXhnY0auU=", + "dev": true, + "requires": { + "glob": "3.1.21", + "lodash": "1.0.2", + "minimatch": "0.2.14" + }, + "dependencies": { + "glob": { + "version": "3.1.21", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz", + "integrity": "sha1-0p4KBV3qUTj00H7UDomC6DwgZs0=", + "dev": true, + "requires": { + "graceful-fs": "1.2.3", + "inherits": "1.0.2", + "minimatch": "0.2.14" + } + }, + "graceful-fs": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz", + "integrity": "sha1-FaSAaldUfLLS2/J/QuiajDRRs2Q=", + "dev": true + }, + "inherits": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz", + "integrity": "sha1-ykMJ2t7mtUzAuNJH6NfHoJdb3Js=", + "dev": true + }, + "lodash": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz", + "integrity": "sha1-j1dWDIO1n8JwvT1WG2kAQ0MOJVE=", + "dev": true + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "dev": true, + "requires": { + "lru-cache": "2.7.3", + "sigmund": "1.0.1" + } + } + } + }, + "glogg": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/glogg/-/glogg-1.0.1.tgz", + "integrity": "sha512-ynYqXLoluBKf9XGR1gA59yEJisIL7YHEH4xr3ZziHB5/yl4qWfaK8Js9jGe6gBGCSCKVqiyO30WnRZADvemUNw==", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=", + "dev": true + }, + "growl": { + "version": "1.10.3", + "resolved": "https://registry.npmjs.org/growl/-/growl-1.10.3.tgz", + "integrity": "sha512-hKlsbA5Vu3xsh1Cg3J7jSmX/WaW6A5oBeqzM88oNbCRQFz+zUaXm6yxS4RVytp1scBoJzSYl4YAEOQIt6O8V1Q==", + "dev": true + }, + "gulp": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/gulp/-/gulp-3.9.1.tgz", + "integrity": "sha1-VxzkWSjdQK9lFPxAEYZgFsE4RbQ=", + "dev": true, + "requires": { + "archy": "1.0.0", + "chalk": "1.1.3", + "deprecated": "0.0.1", + "gulp-util": "3.0.8", + "interpret": "1.1.0", + "liftoff": "2.5.0", + "minimist": "1.2.0", + "orchestrator": "0.3.8", + "pretty-hrtime": "1.0.3", + "semver": "4.3.6", + "tildify": "1.2.0", + "v8flags": "2.1.1", + "vinyl-fs": "0.3.14" + } + }, + "gulp-bump": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/gulp-bump/-/gulp-bump-3.1.0.tgz", + "integrity": "sha512-v5FN3TGstRqkqWTPrp1jcUyCM4YbUIvYzJy/lG2YWFXk5HvFgTucBcVhhpH1nJcnI9Y3skPnpTzYoaBQO1qBzA==", + "dev": true, + "requires": { + "bump-regex": "3.1.0", + "plugin-error": "0.1.2", + "plugin-log": "0.1.0", + "semver": "5.5.0", + "through2": "2.0.3" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + } + } + }, + "gulp-chmod": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/gulp-chmod/-/gulp-chmod-2.0.0.tgz", + "integrity": "sha1-AMOQuSigeZslGsz2MaoJ4BzGKZw=", + "dev": true, + "requires": { + "deep-assign": "1.0.0", + "stat-mode": "0.2.2", + "through2": "2.0.3" + } + }, + "gulp-conventional-changelog": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/gulp-conventional-changelog/-/gulp-conventional-changelog-1.1.11.tgz", + "integrity": "sha512-1squYUFPUO1oyesPVNlvcPzytFL0CH9R7y6q1vnVvs3SCBXdNokbxdxM2OyKfkGzqh9KDJdruLCp6jKpQLAhTA==", + "dev": true, + "requires": { + "add-stream": "1.0.0", + "concat-stream": "1.6.0", + "conventional-changelog": "1.1.15", + "fancy-log": "1.3.2", + "object-assign": "4.1.1", + "plugin-error": "1.0.1", + "through2": "2.0.3" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + }, + "plugin-error": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-1.0.1.tgz", + "integrity": "sha512-L1zP0dk7vGweZME2i+EeakvUNqSrdiI3F91TwEoYiGrAfUXmVv6fJIq4g82PAXxNsWOp0J7ZqQy/3Szz0ajTxA==", + "dev": true, + "requires": { + "ansi-colors": "1.1.0", + "arr-diff": "4.0.0", + "arr-union": "3.1.0", + "extend-shallow": "3.0.2" + } + } + } + }, + "gulp-filter": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/gulp-filter/-/gulp-filter-5.1.0.tgz", + "integrity": "sha1-oF4Rr/sHz33PQafeHLe2OsN4PnM=", + "dev": true, + "requires": { + "multimatch": "2.1.0", + "plugin-error": "0.1.2", + "streamfilter": "1.0.7" + } + }, + "gulp-gunzip": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulp-gunzip/-/gulp-gunzip-1.0.0.tgz", + "integrity": "sha1-FbdBFF6Dqcb1CIYkG1fMWHHxUak=", + "dev": true, + "requires": { + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "gulp-if": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/gulp-if/-/gulp-if-2.0.2.tgz", + "integrity": "sha1-pJe351cwBQQcqivIt92jyARE1ik=", + "dev": true, + "requires": { + "gulp-match": "1.0.3", + "ternary-stream": "2.0.1", + "through2": "2.0.3" + } + }, + "gulp-match": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/gulp-match/-/gulp-match-1.0.3.tgz", + "integrity": "sha1-kcfA1/Kb7NZgbVfYCn+Hdqh6uo4=", + "dev": true, + "requires": { + "minimatch": "3.0.4" + } + }, + "gulp-remote-src": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/gulp-remote-src/-/gulp-remote-src-0.4.3.tgz", + "integrity": "sha1-VyjP1kNDPdSEXd7wlp8PlxoqtKE=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "node.extend": "1.1.6", + "request": "2.79.0", + "through2": "2.0.3", + "vinyl": "2.0.2" + }, + "dependencies": { + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "request": { + "version": "2.79.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.79.0.tgz", + "integrity": "sha1-Tf5b9r6LjNw3/Pk+BLZVd3InEN4=", + "dev": true, + "requires": { + "aws-sign2": "0.6.0", + "aws4": "1.6.0", + "caseless": "0.11.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.1.4", + "har-validator": "2.0.6", + "hawk": "3.1.3", + "http-signature": "1.1.1", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "qs": "6.3.2", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.4.3", + "uuid": "3.2.1" + } + }, + "vinyl": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.0.2.tgz", + "integrity": "sha1-CjcT2NTpIhxY8QyhbAEWyeJe2nw=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.0.0", + "is-stream": "1.1.0", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + } + } + }, + "gulp-sourcemaps": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/gulp-sourcemaps/-/gulp-sourcemaps-1.6.0.tgz", + "integrity": "sha1-uG/zSdgBzrVuHZ59x7vLS33uYAw=", + "dev": true, + "requires": { + "convert-source-map": "1.5.1", + "graceful-fs": "4.1.11", + "strip-bom": "2.0.0", + "through2": "2.0.3", + "vinyl": "1.2.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + }, + "gulp-stats": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/gulp-stats/-/gulp-stats-0.0.4.tgz", + "integrity": "sha1-8hbCvAecuJDOv11qqjses5fRK6s=", + "dev": true, + "requires": { + "chalk": "0.5.1", + "pretty-hrtime": "1.0.3", + "text-table": "0.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz", + "integrity": "sha1-DY6UaWej2BQ/k+JOKYUl/BsiNfk=", + "dev": true + }, + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=", + "dev": true + }, + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "dev": true, + "requires": { + "ansi-styles": "1.1.0", + "escape-string-regexp": "1.0.5", + "has-ansi": "0.1.0", + "strip-ansi": "0.3.0", + "supports-color": "0.2.0" + } + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "dev": true, + "requires": { + "ansi-regex": "0.2.1" + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=", + "dev": true + } + } + }, + "gulp-symdest": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/gulp-symdest/-/gulp-symdest-1.1.0.tgz", + "integrity": "sha1-wWUyBzLRks5W/ZQnH/oSMjS/KuA=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "mkdirp": "0.5.1", + "queue": "3.1.0", + "vinyl-fs": "2.4.4" + }, + "dependencies": { + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.4" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "3.5.3", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.4", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + } + } + } + }, + "gulp-untar": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/gulp-untar/-/gulp-untar-0.0.6.tgz", + "integrity": "sha1-1r3v3n6ajgVMnxYjhaB4LEvnQAA=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "gulp-util": "3.0.8", + "streamifier": "0.1.1", + "tar": "2.2.1", + "through2": "2.0.3" + } + }, + "gulp-util": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/gulp-util/-/gulp-util-3.0.8.tgz", + "integrity": "sha1-AFTh50RQLifATBh8PsxQXdVLu08=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-uniq": "1.0.3", + "beeper": "1.1.1", + "chalk": "1.1.3", + "dateformat": "2.2.0", + "fancy-log": "1.3.2", + "gulplog": "1.0.0", + "has-gulplog": "0.1.0", + "lodash._reescape": "3.0.0", + "lodash._reevaluate": "3.0.0", + "lodash._reinterpolate": "3.0.0", + "lodash.template": "3.6.2", + "minimist": "1.2.0", + "multipipe": "0.1.2", + "object-assign": "3.0.0", + "replace-ext": "0.0.1", + "through2": "2.0.3", + "vinyl": "0.5.3" + }, + "dependencies": { + "object-assign": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-3.0.0.tgz", + "integrity": "sha1-m+3VygiXlJvKR+f/QIBi1Un1h/I=", + "dev": true + } + } + }, + "gulp-vinyl-zip": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/gulp-vinyl-zip/-/gulp-vinyl-zip-2.1.0.tgz", + "integrity": "sha1-JOQGhdwFtxSZlSRQmeBZAmO+ja0=", + "dev": true, + "requires": { + "event-stream": "3.3.4", + "queue": "4.4.2", + "through2": "2.0.3", + "vinyl": "2.1.0", + "vinyl-fs": "2.4.4", + "yauzl": "2.9.1", + "yazl": "2.4.3" + }, + "dependencies": { + "clone": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.1.tgz", + "integrity": "sha1-0hfR6WERjjrJpLi7oyhVU79kfNs=", + "dev": true + }, + "clone-stats": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-1.0.0.tgz", + "integrity": "sha1-s3gt/4u1R04Yuba/D9/ngvh3doA=", + "dev": true + }, + "glob": { + "version": "5.0.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-5.0.15.tgz", + "integrity": "sha1-G8k2ueAvSmA/zCIuz3Yz0wuLk7E=", + "dev": true, + "requires": { + "inflight": "1.0.6", + "inherits": "2.0.3", + "minimatch": "3.0.4", + "once": "1.4.0", + "path-is-absolute": "1.0.1" + } + }, + "glob-parent": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", + "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", + "dev": true, + "requires": { + "is-glob": "3.1.0", + "path-dirname": "1.0.2" + } + }, + "glob-stream": { + "version": "5.3.5", + "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-5.3.5.tgz", + "integrity": "sha1-pVZlqajM3EGRWofHAeMtTgFvrSI=", + "dev": true, + "requires": { + "extend": "3.0.1", + "glob": "5.0.15", + "glob-parent": "3.1.0", + "micromatch": "2.3.11", + "ordered-read-streams": "0.3.0", + "through2": "0.6.5", + "to-absolute-glob": "0.1.1", + "unique-stream": "2.2.1" + }, + "dependencies": { + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + } + } + }, + "is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", + "dev": true + }, + "is-glob": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", + "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", + "dev": true, + "requires": { + "is-extglob": "2.1.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "ordered-read-streams": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.3.0.tgz", + "integrity": "sha1-cTfmmzKYuzQiR6G77jiByA4v14s=", + "dev": true, + "requires": { + "is-stream": "1.1.0", + "readable-stream": "2.3.4" + } + }, + "queue": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/queue/-/queue-4.4.2.tgz", + "integrity": "sha512-fSMRXbwhMwipcDZ08enW2vl+YDmAmhcNcr43sCJL8DIg+CFOsoRLG23ctxA+fwNk1w55SePSiS7oqQQSgQoVJQ==", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "replace-ext": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-1.0.0.tgz", + "integrity": "sha1-3mMSg3P8v3w8z6TeWkgMRaZ5WOs=", + "dev": true + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + }, + "unique-stream": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.2.1.tgz", + "integrity": "sha1-WqADz76Uxf+GbE59ZouxxNuts2k=", + "dev": true, + "requires": { + "json-stable-stringify": "1.0.1", + "through2-filter": "2.0.0" + } + }, + "vinyl": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-2.1.0.tgz", + "integrity": "sha1-Ah+cLPlR1rk5lDyJ617lrdT9kkw=", + "dev": true, + "requires": { + "clone": "2.1.1", + "clone-buffer": "1.0.0", + "clone-stats": "1.0.0", + "cloneable-readable": "1.0.0", + "remove-trailing-separator": "1.1.0", + "replace-ext": "1.0.0" + } + }, + "vinyl-fs": { + "version": "2.4.4", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-2.4.4.tgz", + "integrity": "sha1-vm/zJwy1Xf19MGNkDegfJddTIjk=", + "dev": true, + "requires": { + "duplexify": "3.5.3", + "glob-stream": "5.3.5", + "graceful-fs": "4.1.11", + "gulp-sourcemaps": "1.6.0", + "is-valid-glob": "0.3.0", + "lazystream": "1.0.0", + "lodash.isequal": "4.5.0", + "merge-stream": "1.0.1", + "mkdirp": "0.5.1", + "object-assign": "4.1.1", + "readable-stream": "2.3.4", + "strip-bom": "2.0.0", + "strip-bom-stream": "1.0.0", + "through2": "2.0.3", + "through2-filter": "2.0.0", + "vali-date": "1.0.0", + "vinyl": "1.2.0" + }, + "dependencies": { + "clone": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.3.tgz", + "integrity": "sha1-KY1+IjFmD0DAA8LtMUDezz9TCF8=", + "dev": true + }, + "clone-stats": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/clone-stats/-/clone-stats-0.0.1.tgz", + "integrity": "sha1-uI+UqCzzi4eR1YBG6kAprYjKmdE=", + "dev": true + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "vinyl": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-1.2.0.tgz", + "integrity": "sha1-XIgDbPVl5d8FVYv8kR+GVt8hiIQ=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + } + } + } + } + }, + "gulplog": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/gulplog/-/gulplog-1.0.0.tgz", + "integrity": "sha1-4oxNRdBey77YGDY86PnFkmIp/+U=", + "dev": true, + "requires": { + "glogg": "1.0.1" + } + }, + "handlebars": { + "version": "4.0.11", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.0.11.tgz", + "integrity": "sha1-Ywo13+ApS8KB7a5v/F0yn8eYLcw=", + "dev": true, + "requires": { + "async": "1.5.2", + "optimist": "0.6.1", + "source-map": "0.4.4", + "uglify-js": "2.8.29" + }, + "dependencies": { + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "dev": true, + "requires": { + "amdefine": "1.0.1" + } + } + } + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "dev": true + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "commander": "2.14.1", + "is-my-json-valid": "2.17.2", + "pinkie-promise": "2.0.1" + } + }, + "has": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has/-/has-1.0.1.tgz", + "integrity": "sha1-hGFzP1OLCDfJNh45qauelwTcLyg=", + "dev": true, + "requires": { + "function-bind": "1.1.1" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=", + "dev": true + }, + "has-gulplog": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-gulplog/-/has-gulplog-0.1.0.tgz", + "integrity": "sha1-ZBTIKRNpfaUVkDl9r7EvIpZ4Ec4=", + "dev": true, + "requires": { + "sparkles": "1.0.0" + } + }, + "has-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz", + "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "has-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz", + "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "dev": true, + "requires": { + "boom": "2.10.1", + "cryptiles": "2.0.5", + "hoek": "2.16.3", + "sntp": "1.0.9" + } + }, + "he": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/he/-/he-1.1.1.tgz", + "integrity": "sha1-k0EP0hsAlzUVH4howvJx80J+I/0=", + "dev": true + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "dev": true + }, + "home-or-tmp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz", + "integrity": "sha1-42w/LSyufXRqhX440Y1fMqeILbg=", + "dev": true, + "requires": { + "os-homedir": "1.0.2", + "os-tmpdir": "1.0.2" + } + }, + "homedir-polyfill": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz", + "integrity": "sha1-TCu8inWJmP7r9e1oWA921GdotLw=", + "dev": true, + "requires": { + "parse-passwd": "1.0.0" + } + }, + "hosted-git-info": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.5.0.tgz", + "integrity": "sha512-pNgbURSuab90KbTqvRPsseaTxOJCZBD0a7t+haSN33piP9cCM4l0CqdzAif2hUqm716UovKB2ROmiabGAKVXyg==", + "dev": true + }, + "http-signature": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz", + "integrity": "sha1-33LiZwZs0Kxn+3at+OE0qPvPkb8=", + "dev": true, + "requires": { + "assert-plus": "0.2.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "iconv-lite": { + "version": "0.4.19", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.19.tgz", + "integrity": "sha512-oTZqweIP51xaGPI4uPa56/Pri/480R+mo7SeU+YETByQNhDG55ycFyNLIgta9vXhILrxXDmF7ZGhqZIcuN0gJQ==" + }, + "ignore": { + "version": "3.3.7", + "resolved": "https://registry.npmjs.org/ignore/-/ignore-3.3.7.tgz", + "integrity": "sha512-YGG3ejvBNHRqu0559EOxxNFihD0AjpvHlC/pdGKd3X3ofe+CoJkYazwNJYTNebqpPKN+VVQbh4ZFn1DivMNuHA==", + "dev": true + }, + "imurmurhash": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", + "integrity": "sha1-khi5srkoojixPcT7a21XbyMUU+o=", + "dev": true + }, + "indent-string": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-2.1.0.tgz", + "integrity": "sha1-ji1INIdCEhtKghi3oTfppSBJ3IA=", + "dev": true, + "requires": { + "repeating": "2.0.1" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "dev": true, + "requires": { + "once": "1.4.0", + "wrappy": "1.0.2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "dev": true + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==", + "dev": true + }, + "inquirer": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-3.0.6.tgz", + "integrity": "sha1-4EqqnQW3o8ubD0B9BDdfBEcZA0c=", + "requires": { + "ansi-escapes": "1.4.0", + "chalk": "1.1.3", + "cli-cursor": "2.1.0", + "cli-width": "2.2.0", + "external-editor": "2.1.0", + "figures": "2.0.0", + "lodash": "4.17.5", + "mute-stream": "0.0.7", + "run-async": "2.3.0", + "rx": "4.1.0", + "string-width": "2.1.1", + "strip-ansi": "3.0.1", + "through": "2.3.8" + } + }, + "interpret": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz", + "integrity": "sha1-ftGxQQxqDg94z5XTuEQMY/eLhhQ=", + "dev": true + }, + "invariant": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.2.tgz", + "integrity": "sha1-nh9WrArNtr8wMwbzOL47IErmA2A=", + "dev": true, + "requires": { + "loose-envify": "1.3.1" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/invert-kv/-/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=", + "dev": true + }, + "is": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/is/-/is-3.2.1.tgz", + "integrity": "sha1-0Kwq1V63sL7JJqUmb2xmKqqD3KU=", + "dev": true + }, + "is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", + "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", + "dev": true, + "requires": { + "is-relative": "1.0.0", + "is-windows": "1.0.1" + } + }, + "is-accessor-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz", + "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=", + "dev": true + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "dev": true, + "requires": { + "binary-extensions": "1.11.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==", + "dev": true + }, + "is-builtin-module": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz", + "integrity": "sha1-VAVy0096wxGfj3bDDLwbHgN6/74=", + "dev": true, + "requires": { + "builtin-modules": "1.1.1" + } + }, + "is-callable": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.3.tgz", + "integrity": "sha1-hut1OSgF3cM69xySoO7fdO52BLI=", + "dev": true + }, + "is-data-descriptor": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz", + "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==", + "dev": true, + "requires": { + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-date-object": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz", + "integrity": "sha1-mqIOtq7rv/d/vTPnTKAbM1gdOhY=", + "dev": true + }, + "is-descriptor": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz", + "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "1.0.0", + "is-data-descriptor": "1.0.0", + "kind-of": "6.0.2" + }, + "dependencies": { + "kind-of": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz", + "integrity": "sha512-s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==", + "dev": true + } + } + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=", + "dev": true + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-equal-shallow/-/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "dev": true, + "requires": { + "is-primitive": "2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=", + "dev": true + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=", + "dev": true + }, + "is-finite": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz", + "integrity": "sha1-zGZ3aVYCvlUO8R6LSqYwU0K20Ko=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "is-fullwidth-code-point": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", + "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "dev": true, + "requires": { + "is-extglob": "1.0.0" + } + }, + "is-my-ip-valid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-my-ip-valid/-/is-my-ip-valid-1.0.0.tgz", + "integrity": "sha512-gmh/eWXROncUzRnIa1Ubrt5b8ep/MGSnfAUI3aRp+sqTCs1tv1Isl8d8F6JmkN3dXKc3ehZMrtiPN9eL03NuaQ==", + "dev": true + }, + "is-my-json-valid": { + "version": "2.17.2", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.17.2.tgz", + "integrity": "sha512-IBhBslgngMQN8DDSppmgDv7RNrlFotuuDsKcrCP3+HbFaVivIBU7u9oiiErw8sH4ynx3+gOGQ3q2otkgiSi6kg==", + "dev": true, + "requires": { + "generate-function": "2.0.0", + "generate-object-property": "1.2.0", + "is-my-ip-valid": "1.0.0", + "jsonpointer": "4.0.1", + "xtend": "4.0.1" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-1.0.1.tgz", + "integrity": "sha1-PkcprB9f3gJc19g6iW2rn09n2w8=", + "dev": true + }, + "is-odd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-odd/-/is-odd-1.0.0.tgz", + "integrity": "sha1-O4qTLrAos3dcObsJ6RdnrM22kIg=", + "dev": true, + "requires": { + "is-number": "3.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "is-path-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-cwd/-/is-path-cwd-1.0.0.tgz", + "integrity": "sha1-0iXsIxMuie3Tj9p2dHLmLmXxEG0=", + "dev": true + }, + "is-path-in-cwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-path-in-cwd/-/is-path-in-cwd-1.0.0.tgz", + "integrity": "sha1-ZHdYK4IU1gI0YJRWcAO+ip6sBNw=", + "dev": true, + "requires": { + "is-path-inside": "1.0.1" + } + }, + "is-path-inside": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-1.0.1.tgz", + "integrity": "sha1-jvW33lBDej/cprToZe96pVy0gDY=", + "dev": true, + "requires": { + "path-is-inside": "1.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz", + "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-posix-bracket/-/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=", + "dev": true + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=", + "dev": true + }, + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "dev": true + }, + "is-regex": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz", + "integrity": "sha1-VRdIm1RwkbCTDglWVM7SXul+lJE=", + "dev": true, + "requires": { + "has": "1.0.1" + } + }, + "is-relative": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", + "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", + "dev": true, + "requires": { + "is-unc-path": "1.0.0" + } + }, + "is-resolvable": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz", + "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==", + "dev": true + }, + "is-stream": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz", + "integrity": "sha1-EtSj3U5o4Lec6428hBc66A2RykQ=" + }, + "is-subset": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-subset/-/is-subset-0.1.1.tgz", + "integrity": "sha1-ilkRfZMt4d4A8kX83TnOQ/HpOaY=", + "dev": true + }, + "is-symbol": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.1.tgz", + "integrity": "sha1-PMWfAAJRlLarLjjbrmaJJWtmBXI=", + "dev": true + }, + "is-text-path": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-text-path/-/is-text-path-1.0.1.tgz", + "integrity": "sha1-Thqg+1G/vLPpJogAE5cgLBd1tm4=", + "dev": true, + "requires": { + "text-extensions": "1.7.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "dev": true + }, + "is-unc-path": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", + "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", + "dev": true, + "requires": { + "unc-path-regex": "0.1.2" + } + }, + "is-utf8": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-utf8/-/is-utf8-0.2.1.tgz", + "integrity": "sha1-Sw2hRCEE0bM2NA6AeX6GXPOffXI=", + "dev": true + }, + "is-valid-glob": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/is-valid-glob/-/is-valid-glob-0.3.0.tgz", + "integrity": "sha1-1LVcafUYhvm2XHDWwmItN+KfSP4=", + "dev": true + }, + "is-windows": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.1.tgz", + "integrity": "sha1-MQ23D3QtJZoWo2kgK1GvhCMzENk=", + "dev": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "dev": true + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=", + "dev": true + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "dev": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=", + "dev": true + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.10.0.tgz", + "integrity": "sha512-O2v52ffjLa9VeM43J4XocZE//WT9N0IiwDa3KSHH7Tu8CtH+1qM8SIZvnsTh6v+4yFy5KUY3BHUVwjpfAWsjIA==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "esprima": "4.0.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "dev": true, + "optional": true + }, + "jsesc": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz", + "integrity": "sha1-RsP+yMGJKxKwgz25vHYiF226s0s=", + "dev": true + }, + "json-minify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/json-minify/-/json-minify-1.0.0.tgz", + "integrity": "sha1-Q5fnbxloiYM1L8+9Xi5SQ/wKB8g=", + "dev": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "dev": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "dev": true + }, + "json-stable-stringify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz", + "integrity": "sha1-mnWdOcXy/1A/1TAGRu1EX4jE+a8=", + "dev": true, + "requires": { + "jsonify": "0.0.0" + } + }, + "json-stable-stringify-without-jsonify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", + "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=", + "dev": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "dev": true + }, + "json5": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz", + "integrity": "sha1-Hq3nrMASA0rYTiOWdn6tn6VJWCE=", + "dev": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "dev": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=", + "dev": true + }, + "jsonpointer": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-4.0.1.tgz", + "integrity": "sha1-T9kss04OnbPInIYi7PUfm5eMbLk=", + "dev": true + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + }, + "lazy-cache": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-2.0.2.tgz", + "integrity": "sha1-uRkKT5EzVGlIQIWfio9whNiCImQ=", + "dev": true, + "requires": { + "set-getter": "0.1.0" + } + }, + "lazystream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lazystream/-/lazystream-1.0.0.tgz", + "integrity": "sha1-9plf4PggOS9hOWvolGJAe7dxaOQ=", + "dev": true, + "requires": { + "readable-stream": "2.3.4" + } + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "dev": true, + "requires": { + "invert-kv": "1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2", + "type-check": "0.3.2" + } + }, + "liftoff": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz", + "integrity": "sha1-IAkpG7Mc6oYbvxCnwVooyvdcMew=", + "dev": true, + "requires": { + "extend": "3.0.1", + "findup-sync": "2.0.0", + "fined": "1.1.0", + "flagged-respawn": "1.0.0", + "is-plain-object": "2.0.4", + "object.map": "1.0.1", + "rechoir": "0.6.2", + "resolve": "1.5.0" + } + }, + "load-json-file": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-1.1.0.tgz", + "integrity": "sha1-lWkFcI1YtLq0wiYbBPWfMcmTdMA=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "pinkie-promise": "2.0.1", + "strip-bom": "2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "locate-path": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz", + "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=", + "dev": true, + "requires": { + "p-locate": "2.0.0", + "path-exists": "3.0.0" + }, + "dependencies": { + "path-exists": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz", + "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=", + "dev": true + } + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.5.tgz", + "integrity": "sha512-svL3uiZf1RwhH+cWrfZn3A4+U58wbP0tGVTLQPbjplZxZ8ROD9VLuNgsRniTlLe7OlSqR79RUehXgpBW/s0IQw==" + }, + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=", + "dev": true + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "dev": true + }, + "lodash._basevalues": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._basevalues/-/lodash._basevalues-3.0.0.tgz", + "integrity": "sha1-W3dXYoAr3j0yl1A+JjAIIP32Ybc=", + "dev": true + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=", + "dev": true + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=", + "dev": true + }, + "lodash._reescape": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reescape/-/lodash._reescape-3.0.0.tgz", + "integrity": "sha1-Kx1vXf4HyKNVdT5fJ/rH8c3hYWo=", + "dev": true + }, + "lodash._reevaluate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reevaluate/-/lodash._reevaluate-3.0.0.tgz", + "integrity": "sha1-WLx0xAZklTrgsSTYBpltrKQx4u0=", + "dev": true + }, + "lodash._reinterpolate": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz", + "integrity": "sha1-DM8tiRZq8Ds2Y8eWU4t1rG4RTZ0=", + "dev": true + }, + "lodash._root": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._root/-/lodash._root-3.0.1.tgz", + "integrity": "sha1-+6HEUkwZ7ppfgTa0YJ8BfPTe1pI=", + "dev": true + }, + "lodash.escape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.escape/-/lodash.escape-3.2.0.tgz", + "integrity": "sha1-mV7g3BjBtIzJLv+ucaEKq1tIdpg=", + "dev": true, + "requires": { + "lodash._root": "3.0.1" + } + }, + "lodash.isarguments": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.1.0.tgz", + "integrity": "sha1-L1c9hcaiQon/AGY7SRwdM4/zRYo=", + "dev": true + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=", + "dev": true + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha1-QVxEePK8wwEgwizhDtMib30+GOA=", + "dev": true + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "dev": true, + "requires": { + "lodash._getnative": "3.9.1", + "lodash.isarguments": "3.1.0", + "lodash.isarray": "3.0.4" + } + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=", + "dev": true + }, + "lodash.template": { + "version": "3.6.2", + "resolved": "https://registry.npmjs.org/lodash.template/-/lodash.template-3.6.2.tgz", + "integrity": "sha1-+M3sxhaaJVvpCYrosMU9N4kx0U8=", + "dev": true, + "requires": { + "lodash._basecopy": "3.0.1", + "lodash._basetostring": "3.0.1", + "lodash._basevalues": "3.0.0", + "lodash._isiterateecall": "3.0.9", + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0", + "lodash.keys": "3.1.2", + "lodash.restparam": "3.6.1", + "lodash.templatesettings": "3.1.1" + } + }, + "lodash.templatesettings": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.templatesettings/-/lodash.templatesettings-3.1.1.tgz", + "integrity": "sha1-+zB4RHU7Zrnxr6VOJix0UwfbqOU=", + "dev": true, + "requires": { + "lodash._reinterpolate": "3.0.0", + "lodash.escape": "3.2.0" + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=", + "dev": true + }, + "loose-envify": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.3.1.tgz", + "integrity": "sha1-0aitM/qc4OcT1l/dCsi3SNR4yEg=", + "dev": true, + "requires": { + "js-tokens": "3.0.2" + } + }, + "loud-rejection": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/loud-rejection/-/loud-rejection-1.6.0.tgz", + "integrity": "sha1-W0b4AUft7leIcPCG0Eghz5mOVR8=", + "dev": true, + "requires": { + "currently-unhandled": "0.4.1", + "signal-exit": "3.0.2" + } + }, + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=", + "dev": true + }, + "make-iterator": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.0.tgz", + "integrity": "sha1-V7713IXSOSO6I3ZzJNjo+PPZaUs=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "map-cache": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz", + "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=", + "dev": true + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=", + "dev": true + }, + "map-stream": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/map-stream/-/map-stream-0.1.0.tgz", + "integrity": "sha1-5WqpTEyAVaFkBKBnS3jyFffI4ZQ=", + "dev": true + }, + "map-visit": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz", + "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=", + "dev": true, + "requires": { + "object-visit": "1.0.1" + } + }, + "mdn-data": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-1.1.0.tgz", + "integrity": "sha512-jC6B3BFC07cCOU8xx1d+sQtDkVIpGKWv4TzK7pN7PyObdbwlIFJbHYk8ofvr0zrU8SkV1rSi87KAHhWCdLGw1Q==", + "dev": true + }, + "mem": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/mem/-/mem-1.1.0.tgz", + "integrity": "sha1-Xt1StIXKHZAP5kiVUFOZoN+kX3Y=", + "dev": true, + "requires": { + "mimic-fn": "1.2.0" + } + }, + "meow": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.7.0.tgz", + "integrity": "sha1-cstmi0JSKCkKu/qFaJJYcwioAfs=", + "dev": true, + "requires": { + "camelcase-keys": "2.1.0", + "decamelize": "1.2.0", + "loud-rejection": "1.6.0", + "map-obj": "1.0.1", + "minimist": "1.2.0", + "normalize-package-data": "2.4.0", + "object-assign": "4.1.1", + "read-pkg-up": "1.0.1", + "redent": "1.0.0", + "trim-newlines": "1.0.0" + } + }, + "merge-stream": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-1.0.1.tgz", + "integrity": "sha1-QEEgLVCKNCugAXQAjfDCUbjBNeE=", + "dev": true, + "requires": { + "readable-stream": "2.3.4" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "dev": true, + "requires": { + "arr-diff": "2.0.0", + "array-unique": "0.2.1", + "braces": "1.8.5", + "expand-brackets": "0.1.5", + "extglob": "0.3.2", + "filename-regex": "2.0.1", + "is-extglob": "1.0.0", + "is-glob": "2.0.1", + "kind-of": "3.2.2", + "normalize-path": "2.1.1", + "object.omit": "2.0.1", + "parse-glob": "3.0.4", + "regex-cache": "0.4.4" + } + }, + "mime-db": { + "version": "1.33.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.33.0.tgz", + "integrity": "sha512-BHJ/EKruNIqJf/QahvxwQZXKygOQ256myeN/Ew+THcAa5q+PjyTTMMeNQC4DZw5AwfvelsUrA6B67NKMqXDbzQ==", + "dev": true + }, + "mime-types": { + "version": "2.1.18", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.18.tgz", + "integrity": "sha512-lc/aahn+t4/SWV/qcmumYjymLsWfN3ELhpmVuUFjgsORruuZPVSwAQryq+HHGvO/SI2KVX26bx+En+zhM8g8hQ==", + "dev": true, + "requires": { + "mime-db": "1.33.0" + } + }, + "mimic-fn": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", + "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==" + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dev": true, + "requires": { + "brace-expansion": "1.1.11" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "mixin-deep": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz", + "integrity": "sha512-8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==", + "dev": true, + "requires": { + "for-in": "1.0.2", + "is-extendable": "1.0.1" + }, + "dependencies": { + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "dev": true, + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "dev": true + } + } + }, + "mocha": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/mocha/-/mocha-4.1.0.tgz", + "integrity": "sha512-0RVnjg1HJsXY2YFDoTNzcc1NKhYuXKRrBAG2gDygmJJA136Cs2QlRliZG1mA0ap7cuaT30mw16luAeln+4RiNA==", + "dev": true, + "requires": { + "browser-stdout": "1.3.0", + "commander": "2.11.0", + "debug": "3.1.0", + "diff": "3.3.1", + "escape-string-regexp": "1.0.5", + "glob": "7.1.2", + "growl": "1.10.3", + "he": "1.1.1", + "mkdirp": "0.5.1", + "supports-color": "4.4.0" + }, + "dependencies": { + "commander": { + "version": "2.11.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.11.0.tgz", + "integrity": "sha512-b0553uYA5YAEGgyYIGYROzKQ7X5RAqedkfjiZxwi0kL1g3bOaBNNZfYkzt/CL0umgD5wc9Jec2FbB98CjkMRvQ==", + "dev": true + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dev": true, + "requires": { + "ms": "2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=", + "dev": true + }, + "supports-color": { + "version": "4.4.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-4.4.0.tgz", + "integrity": "sha512-rKC3+DyXWgK0ZLKwmRsrkyHVZAjNkfzeehuFWdGGcqGDTZFH73+RH6S/RDAAxl9GusSjZSUWYLmT9N5pzXFOXQ==", + "dev": true, + "requires": { + "has-flag": "2.0.0" + } + } + } + }, + "modify-values": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/modify-values/-/modify-values-1.0.0.tgz", + "integrity": "sha1-4rbN65zhn5kxelNyLz2/XfXqqrI=", + "dev": true + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=", + "dev": true + }, + "multimatch": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/multimatch/-/multimatch-2.1.0.tgz", + "integrity": "sha1-nHkGoi+0wCkZ4vX3UWG0zb1LKis=", + "dev": true, + "requires": { + "array-differ": "1.0.0", + "array-union": "1.0.2", + "arrify": "1.0.1", + "minimatch": "3.0.4" + } + }, + "multipipe": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/multipipe/-/multipipe-0.1.2.tgz", + "integrity": "sha1-Ko8t33Du1WTf8tV/HhoTfZ8FB4s=", + "dev": true, + "requires": { + "duplexer2": "0.0.2" + } + }, + "mustache": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/mustache/-/mustache-2.3.0.tgz", + "integrity": "sha1-QCj3d4sXcIpImTCm5SrDvKDaQdA=", + "dev": true + }, + "mute-stream": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", + "integrity": "sha1-MHXOk7whuPq0PhvE2n6BFe0ee6s=" + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "dev": true, + "optional": true + }, + "nanomatch": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.7.tgz", + "integrity": "sha512-/5ldsnyurvEw7wNpxLFgjVvBLMta43niEYOy0CJ4ntcYSbx6bugRUTQeFb4BR/WanEL1o3aQgHuVLHQaB6tOqg==", + "dev": true, + "requires": { + "arr-diff": "4.0.0", + "array-unique": "0.3.2", + "define-property": "1.0.0", + "extend-shallow": "2.0.1", + "fragment-cache": "0.2.1", + "is-odd": "1.0.0", + "kind-of": "5.1.0", + "object.pick": "1.3.0", + "regex-not": "1.0.0", + "snapdragon": "0.8.1", + "to-regex": "3.0.1" + }, + "dependencies": { + "arr-diff": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz", + "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=", + "dev": true + }, + "array-unique": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz", + "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "natives": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/natives/-/natives-1.1.1.tgz", + "integrity": "sha512-8eRaxn8u/4wN8tGkhlc2cgwwvOLMLUMUn4IYTexMgWd+LyUDfeXVkk2ygQR0hvIHbJQXgHujia3ieUUDwNGkEA==", + "dev": true + }, + "natural-compare": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", + "integrity": "sha1-Sr6/7tdUHywnrPspvbvRXI1bpPc=", + "dev": true + }, + "node-fetch": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-1.6.3.tgz", + "integrity": "sha1-3CNO3WSJmC1Y6PDbT2lQKavNjAQ=", + "requires": { + "encoding": "0.1.12", + "is-stream": "1.1.0" + } + }, + "node.extend": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/node.extend/-/node.extend-1.1.6.tgz", + "integrity": "sha1-p7iCyC1sk6SGOlUEvV3o7IYli5Y=", + "dev": true, + "requires": { + "is": "3.2.1" + } + }, + "normalize-package-data": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz", + "integrity": "sha512-9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==", + "dev": true, + "requires": { + "hosted-git-info": "2.5.0", + "is-builtin-module": "1.0.0", + "semver": "4.3.6", + "validate-npm-package-license": "3.0.1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "dev": true, + "requires": { + "remove-trailing-separator": "1.1.0" + } + }, + "npm-run-path": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz", + "integrity": "sha1-NakjLfo11wZ7TLLd8jV7GHFTbF8=", + "dev": true, + "requires": { + "path-key": "2.0.1" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "dev": true, + "requires": { + "boolbase": "1.0.0" + } + }, + "null-check": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/null-check/-/null-check-1.0.0.tgz", + "integrity": "sha1-l33/1xdgErnsMNKjnbXPcqBDnt0=", + "dev": true + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=", + "dev": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "dev": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object-copy": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz", + "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=", + "dev": true, + "requires": { + "copy-descriptor": "0.1.1", + "define-property": "0.2.5", + "kind-of": "3.2.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + }, + "dependencies": { + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + } + } + }, + "object-keys": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.11.tgz", + "integrity": "sha1-xUYBd4rVYPEULODgG8yotW0TQm0=", + "dev": true + }, + "object-visit": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz", + "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.defaults": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz", + "integrity": "sha1-On+GgzS0B96gbaFtiNXNKeQ1/s8=", + "dev": true, + "requires": { + "array-each": "1.0.1", + "array-slice": "1.1.0", + "for-own": "1.0.0", + "isobject": "3.0.1" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.getownpropertydescriptors": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz", + "integrity": "sha1-h1jIRvW0B62rDyNuCYbxSwUcqhY=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.10.0" + } + }, + "object.map": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz", + "integrity": "sha1-z4Plncj8wK1fQlDh94s7gb2AHTc=", + "dev": true, + "requires": { + "for-own": "1.0.0", + "make-iterator": "1.0.0" + }, + "dependencies": { + "for-own": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz", + "integrity": "sha1-xjMy9BXO3EsE2/5wz4NklMU8tEs=", + "dev": true, + "requires": { + "for-in": "1.0.2" + } + } + } + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "dev": true, + "requires": { + "for-own": "0.1.5", + "is-extendable": "0.1.1" + } + }, + "object.pick": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz", + "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=", + "dev": true, + "requires": { + "isobject": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "object.values": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.0.4.tgz", + "integrity": "sha1-5STaCbT2b/Bd9FdUbscqyZ8TBpo=", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "es-abstract": "1.10.0", + "function-bind": "1.1.1", + "has": "1.0.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "dev": true, + "requires": { + "wrappy": "1.0.2" + } + }, + "onetime": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", + "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=", + "requires": { + "mimic-fn": "1.2.0" + } + }, + "opencollective": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/opencollective/-/opencollective-1.0.3.tgz", + "integrity": "sha1-ruY3K8KBRFg2kMPKja7PwSDdDvE=", + "requires": { + "babel-polyfill": "6.23.0", + "chalk": "1.1.3", + "inquirer": "3.0.6", + "minimist": "1.2.0", + "node-fetch": "1.6.3", + "opn": "4.0.2" + } + }, + "opn": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/opn/-/opn-4.0.2.tgz", + "integrity": "sha1-erwi5kTf9jsKltWrfyeQwPAavJU=", + "requires": { + "object-assign": "4.1.1", + "pinkie-promise": "2.0.1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "dev": true, + "requires": { + "minimist": "0.0.10", + "wordwrap": "0.0.3" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=", + "dev": true + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=", + "dev": true + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "dev": true, + "requires": { + "deep-is": "0.1.3", + "fast-levenshtein": "2.0.6", + "levn": "0.3.0", + "prelude-ls": "1.1.2", + "type-check": "0.3.2", + "wordwrap": "1.0.0" + } + }, + "orchestrator": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/orchestrator/-/orchestrator-0.3.8.tgz", + "integrity": "sha1-FOfp4nZPcxX7rBhOUGx6pt+UrX4=", + "dev": true, + "requires": { + "end-of-stream": "0.1.5", + "sequencify": "0.0.7", + "stream-consume": "0.1.0" + } + }, + "ordered-read-streams": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-0.1.0.tgz", + "integrity": "sha1-/VZamvjrRHO6abbtijQ1LLVS8SY=", + "dev": true + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "dev": true + }, + "os-locale": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-2.1.0.tgz", + "integrity": "sha512-3sslG3zJbEYcaC4YVAvDorjGxc7tv6KVATnLPZONiljsUncvihe9BQoVCEs0RZ1kmf4Hk9OBqlZfJZWI4GanKA==", + "dev": true, + "requires": { + "execa": "0.7.0", + "lcid": "1.0.0", + "mem": "1.1.0" + } + }, + "os-tmpdir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz", + "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=" + }, + "p-finally": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz", + "integrity": "sha1-P7z7FbiZpEEjs0ttzBi3JDNqLK4=", + "dev": true + }, + "p-limit": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.2.0.tgz", + "integrity": "sha512-Y/OtIaXtUPr4/YpMv1pCL5L5ed0rumAaAeBSj12F+bSlMdys7i8oQF/GUJmfpTS/QoaRrS/k6pma29haJpsMng==", + "dev": true, + "requires": { + "p-try": "1.0.0" + } + }, + "p-locate": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz", + "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=", + "dev": true, + "requires": { + "p-limit": "1.2.0" + } + }, + "p-try": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz", + "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=", + "dev": true + }, + "parse-filepath": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz", + "integrity": "sha1-pjISf1Oq89FYdvWHLz/6x2PWyJE=", + "dev": true, + "requires": { + "is-absolute": "1.0.0", + "map-cache": "0.2.2", + "path-root": "0.1.1" + } + }, + "parse-github-repo-url": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/parse-github-repo-url/-/parse-github-repo-url-1.4.1.tgz", + "integrity": "sha1-nn2LslKmy2ukJZUGC3v23z28H1A=", + "dev": true + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "dev": true, + "requires": { + "glob-base": "0.3.0", + "is-dotfile": "1.0.3", + "is-extglob": "1.0.0", + "is-glob": "2.0.1" + } + }, + "parse-json": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-2.2.0.tgz", + "integrity": "sha1-9ID0BDTvgHQfhGkJn43qGPVaTck=", + "dev": true, + "requires": { + "error-ex": "1.3.1" + } + }, + "parse-passwd": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz", + "integrity": "sha1-bVuTSkVpk7I9N/QKOC1vFmao5cY=", + "dev": true + }, + "pascalcase": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz", + "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=", + "dev": true + }, + "path-dirname": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", + "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=", + "dev": true + }, + "path-exists": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-2.1.0.tgz", + "integrity": "sha1-D+tsZPD8UY2adU3V77YscCJ2H0s=", + "dev": true, + "requires": { + "pinkie-promise": "2.0.1" + } + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", + "dev": true + }, + "path-is-inside": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/path-is-inside/-/path-is-inside-1.0.2.tgz", + "integrity": "sha1-NlQX3t5EQw0cEa9hAn+s8HS9/FM=", + "dev": true + }, + "path-key": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz", + "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=", + "dev": true + }, + "path-parse": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.5.tgz", + "integrity": "sha1-PBrfhx6pzWyUMbbqK9dKD/BVxME=", + "dev": true + }, + "path-root": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz", + "integrity": "sha1-mkpoFMrBwM1zNgqV8yCDyOpHRbc=", + "dev": true, + "requires": { + "path-root-regex": "0.1.2" + } + }, + "path-root-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz", + "integrity": "sha1-v8zcjfWxLcUsi0PsONGNcsBLqW0=", + "dev": true + }, + "path-type": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-1.1.0.tgz", + "integrity": "sha1-WcRPfuSR2nBNpBXaWkBwuk+P5EE=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "pify": "2.3.0", + "pinkie-promise": "2.0.1" + } + }, + "pause-stream": { + "version": "0.0.11", + "resolved": "https://registry.npmjs.org/pause-stream/-/pause-stream-0.0.11.tgz", + "integrity": "sha1-/lo0sMvOErWqaitAPuLnO2AvFEU=", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha1-elfrVQpng/kRUzH89GY9XI4AelA=", + "dev": true + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "dev": true + }, + "pify": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pify/-/pify-2.3.0.tgz", + "integrity": "sha1-7RQaasBDqEnqWISY59yosVMw6Qw=", + "dev": true + }, + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + }, + "pinkie-promise": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz", + "integrity": "sha1-ITXW36ejWMBprJsXh3YogihFD/o=", + "requires": { + "pinkie": "2.0.4" + } + }, + "plugin-error": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/plugin-error/-/plugin-error-0.1.2.tgz", + "integrity": "sha1-O5uzM1zPAPQl4HQ34ZJ2ln2kes4=", + "dev": true, + "requires": { + "ansi-cyan": "0.1.1", + "ansi-red": "0.1.1", + "arr-diff": "1.1.0", + "arr-union": "2.1.0", + "extend-shallow": "1.1.4" + }, + "dependencies": { + "arr-diff": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-1.1.0.tgz", + "integrity": "sha1-aHwydYFjWI/vfeezb6vklesaOZo=", + "dev": true, + "requires": { + "arr-flatten": "1.1.0", + "array-slice": "0.2.3" + } + }, + "arr-union": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-2.1.0.tgz", + "integrity": "sha1-IPnqtexw9cfSFbEHexw5Fh0pLH0=", + "dev": true + }, + "array-slice": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/array-slice/-/array-slice-0.2.3.tgz", + "integrity": "sha1-3Tz7gO15c6dRF82sabC5nshhhvU=", + "dev": true + }, + "extend-shallow": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-1.1.4.tgz", + "integrity": "sha1-Gda/lN/AnXa6cR85uHLSH/TdkHE=", + "dev": true, + "requires": { + "kind-of": "1.1.0" + } + }, + "kind-of": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-1.1.0.tgz", + "integrity": "sha1-FAo9LUGjbS78+pN3tiwk+ElaXEQ=", + "dev": true + } + } + }, + "plugin-log": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/plugin-log/-/plugin-log-0.1.0.tgz", + "integrity": "sha1-hgSc9qsQgzOYqTHzaJy67nteEzM=", + "dev": true, + "requires": { + "chalk": "1.1.3", + "dateformat": "1.0.12" + }, + "dependencies": { + "dateformat": { + "version": "1.0.12", + "resolved": "https://registry.npmjs.org/dateformat/-/dateformat-1.0.12.tgz", + "integrity": "sha1-nxJLZ1lMk3/3BpMuSmQsyo27/uk=", + "dev": true, + "requires": { + "get-stdin": "4.0.1", + "meow": "3.7.0" + } + } + } + }, + "pluralize": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/pluralize/-/pluralize-7.0.0.tgz", + "integrity": "sha512-ARhBOdzS3e41FbkW/XWrTEtukqqLoK5+Z/4UeDaLuSW+39JPeFgs4gCGqsrJHVZX0fUrx//4OF0K1CUGwlIFow==", + "dev": true + }, + "posix-character-classes": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz", + "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=", + "dev": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "dev": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=", + "dev": true + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=", + "dev": true + }, + "private": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz", + "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==", + "dev": true + }, + "process-nextick-args": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz", + "integrity": "sha512-MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==", + "dev": true + }, + "progress": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.0.tgz", + "integrity": "sha1-ihvjZr+Pwj2yvSPxDG/pILQ4nR8=", + "dev": true + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=", + "dev": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "dev": true + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz", + "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=", + "dev": true + }, + "qs": { + "version": "6.3.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.3.2.tgz", + "integrity": "sha1-51vV9uJoEioqDgvaYwslUMFmUCw=", + "dev": true + }, + "querystringify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/querystringify/-/querystringify-1.0.0.tgz", + "integrity": "sha1-YoYkIRLFtxL6ZU5SZlK/ahP/Bcs=", + "dev": true + }, + "queue": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/queue/-/queue-3.1.0.tgz", + "integrity": "sha1-bEnQHwCeIlZ4h4nyv/rGuLmZBYU=", + "dev": true, + "requires": { + "inherits": "2.0.3" + } + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.7.tgz", + "integrity": "sha512-D5JUjPyJbaJDkuAazpVnSfVkLlpeO3wDlPROTMLGKG1zMFNFRgrciKo1ltz/AzNTkqE0HzDx655QOL51N06how==", + "dev": true, + "requires": { + "is-number": "3.0.0", + "kind-of": "4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "read-pkg": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-1.1.0.tgz", + "integrity": "sha1-9f+qXs0pyzHAR0vKfXVra7KePyg=", + "dev": true, + "requires": { + "load-json-file": "1.1.0", + "normalize-package-data": "2.4.0", + "path-type": "1.1.0" + } + }, + "read-pkg-up": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-1.0.1.tgz", + "integrity": "sha1-nWPBMnbAZZGNV/ACpX9AobZD+wI=", + "dev": true, + "requires": { + "find-up": "1.1.2", + "read-pkg": "1.1.0" + } + }, + "readable-stream": { + "version": "2.3.4", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.4.tgz", + "integrity": "sha512-vuYxeWYM+fde14+rajzqgeohAI7YoJcHE7kXDAc4Nk0EbuKnJfqtY9YtRkLo/tqkuF7MsBQRhPnPeyjYITp3ZQ==", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "1.0.0", + "process-nextick-args": "2.0.0", + "safe-buffer": "5.1.1", + "string_decoder": "1.0.3", + "util-deprecate": "1.0.2" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "minimatch": "3.0.4", + "readable-stream": "2.3.4", + "set-immediate-shim": "1.0.1" + } + }, + "rechoir": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz", + "integrity": "sha1-hSBLVNuoLVdC4oyWdW70OvUOM4Q=", + "dev": true, + "requires": { + "resolve": "1.5.0" + } + }, + "redent": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/redent/-/redent-1.0.0.tgz", + "integrity": "sha1-z5Fqsf1fHxbfsggi3W7H9zDCr94=", + "dev": true, + "requires": { + "indent-string": "2.1.0", + "strip-indent": "1.0.1" + } + }, + "regenerate": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.3.3.tgz", + "integrity": "sha512-jVpo1GadrDAK59t/0jRx5VxYWQEDkkEKi6+HjE3joFVLfDOh9Xrdh0dF1eSq+BI/SwvTQ44gSscJ8N5zYL61sg==", + "dev": true + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + }, + "regenerator-transform": { + "version": "0.10.1", + "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz", + "integrity": "sha512-PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==", + "dev": true, + "requires": { + "babel-runtime": "6.26.0", + "babel-types": "6.26.0", + "private": "0.1.8" + } + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.4.tgz", + "integrity": "sha512-nVIZwtCjkC9YgvWkpM55B5rBhBYRZhAaJbgcFYXXsHnbZ9UZI9nnVWYZpBlCqv9ho2eZryPnWrZGsOdPwVWXWQ==", + "dev": true, + "requires": { + "is-equal-shallow": "0.1.3" + } + }, + "regex-not": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.0.tgz", + "integrity": "sha1-Qvg+OXcWIt+CawKvF2Ul1qXxV/k=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1" + } + }, + "regexpu-core": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz", + "integrity": "sha1-SdA4g3uNz4v6W5pCE5k45uoq4kA=", + "dev": true, + "requires": { + "regenerate": "1.3.3", + "regjsgen": "0.2.0", + "regjsparser": "0.1.5" + } + }, + "regjsgen": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz", + "integrity": "sha1-bAFq3qxVT3WCP+N6wFuS1aTtsfc=", + "dev": true + }, + "regjsparser": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz", + "integrity": "sha1-fuj4Tcb6eS0/0K4ijSS9lJ6tIFw=", + "dev": true, + "requires": { + "jsesc": "0.5.0" + }, + "dependencies": { + "jsesc": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz", + "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=", + "dev": true + } + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=", + "dev": true + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=", + "dev": true + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=", + "dev": true + }, + "repeating": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz", + "integrity": "sha1-UhTFOpJtNVJwdSf7q0FdvAjQbdo=", + "dev": true, + "requires": { + "is-finite": "1.0.2" + } + }, + "replace-ext": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/replace-ext/-/replace-ext-0.0.1.tgz", + "integrity": "sha1-KbvZIHinOfC8zitO5B6DeVNSKSQ=", + "dev": true + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.83.0.tgz", + "integrity": "sha512-lR3gD69osqm6EYLk9wB/G1W/laGWjzH90t1vEa2xuxHD5KUrSzp9pUSfTm+YC5Nxt2T8nMPEvKlhbQayU7bgFw==", + "dev": true, + "requires": { + "aws-sign2": "0.7.0", + "aws4": "1.6.0", + "caseless": "0.12.0", + "combined-stream": "1.0.6", + "extend": "3.0.1", + "forever-agent": "0.6.1", + "form-data": "2.3.2", + "har-validator": "5.0.3", + "hawk": "6.0.2", + "http-signature": "1.2.0", + "is-typedarray": "1.0.0", + "isstream": "0.1.2", + "json-stringify-safe": "5.0.1", + "mime-types": "2.1.18", + "oauth-sign": "0.8.2", + "performance-now": "2.1.0", + "qs": "6.5.1", + "safe-buffer": "5.1.1", + "stringstream": "0.0.5", + "tough-cookie": "2.3.3", + "tunnel-agent": "0.6.0", + "uuid": "3.2.1" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "dev": true + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "dev": true + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "dev": true, + "requires": { + "boom": "5.2.0" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/boom/-/boom-5.2.0.tgz", + "integrity": "sha512-Z5BTk6ZRe4tXXQlkqftmsAUANpXmuwlsF5Oov8ThoMbQRzdGTA1ngYRW160GexgOgjsFOKJz0LYhoNi+2AMBUw==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + } + } + }, + "form-data": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.2.tgz", + "integrity": "sha1-SXBJi+YEwgwAXU9cI67NIda0kJk=", + "dev": true, + "requires": { + "asynckit": "0.4.0", + "combined-stream": "1.0.6", + "mime-types": "2.1.18" + } + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "dev": true, + "requires": { + "ajv": "5.5.2", + "har-schema": "2.0.0" + } + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-6.0.2.tgz", + "integrity": "sha512-miowhl2+U7Qle4vdLqDdPt9m09K6yZhkLDTWGoUiUzrQCn+mHHSmfJgAyGaLRZbPmTqfFFjRV1QWCW0VWUJBbQ==", + "dev": true, + "requires": { + "boom": "4.3.1", + "cryptiles": "3.1.2", + "hoek": "4.2.1", + "sntp": "2.1.0" + } + }, + "hoek": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-4.2.1.tgz", + "integrity": "sha512-QLg82fGkfnJ/4iy1xZ81/9SIJiq1NGFUMGs6ParyjBZr6jW2Ufj/snDqTHixNlHdPNwN2RLVD0Pi3igeK9+JfA==", + "dev": true + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "jsprim": "1.4.1", + "sshpk": "1.13.1" + } + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.1.tgz", + "integrity": "sha512-eRzhrN1WSINYCDCbrz796z37LOe3m5tmW7RQf6oBntukAG1nmovJvhnwHHRMAfeoItc1m2Hk02WER2aQ/iqs+A==", + "dev": true + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-2.1.0.tgz", + "integrity": "sha512-FL1b58BDrqS3A11lJ0zEdnJ3UOKqVxawAkF3k7F0CVN7VQ34aZrV+G8BZ1WC9ZL7NyrwsW0oviwsWDgRuVYtJg==", + "dev": true, + "requires": { + "hoek": "4.2.1" + } + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + } + } + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=", + "dev": true + }, + "require-main-filename": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz", + "integrity": "sha1-l/cXtp1IeE9fUmpsWqj/3aBVpNE=", + "dev": true + }, + "require-uncached": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/require-uncached/-/require-uncached-1.0.3.tgz", + "integrity": "sha1-Tg1W1slmL9MeQwEcS5WqSZVUIdM=", + "dev": true, + "requires": { + "caller-path": "0.1.0", + "resolve-from": "1.0.1" + } + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=", + "dev": true + }, + "resolve": { + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.5.0.tgz", + "integrity": "sha512-hgoSGrc3pjzAPHNBg+KnFcK2HwlHTs/YrAGUr6qgTVUZmXv1UEXXl0bZNBKMA9fud6lRYFdPGz0xXxycPzmmiw==", + "dev": true, + "requires": { + "path-parse": "1.0.5" + } + }, + "resolve-dir": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz", + "integrity": "sha1-eaQGRMNivoLybv/nOcm7U4IEb0M=", + "dev": true, + "requires": { + "expand-tilde": "2.0.2", + "global-modules": "1.0.0" + } + }, + "resolve-from": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-1.0.1.tgz", + "integrity": "sha1-Jsv+k10a7uq7Kbw/5a6wHpPUQiY=", + "dev": true + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=", + "dev": true + }, + "restore-cursor": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", + "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=", + "requires": { + "onetime": "2.0.1", + "signal-exit": "3.0.2" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "dev": true, + "optional": true, + "requires": { + "align-text": "0.1.4" + } + }, + "rimraf": { + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz", + "integrity": "sha512-lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==", + "dev": true, + "requires": { + "glob": "7.1.2" + } + }, + "run-async": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-2.3.0.tgz", + "integrity": "sha1-A3GrSuC91yDUFm19/aZP96RFpsA=", + "requires": { + "is-promise": "2.1.0" + } + }, + "run-sequence": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/run-sequence/-/run-sequence-2.2.1.tgz", + "integrity": "sha512-qkzZnQWMZjcKbh3CNly2srtrkaO/2H/SI5f2eliMCapdRD3UhMrwjfOAZJAnZ2H8Ju4aBzFZkBGXUqFs9V0yxw==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "fancy-log": "1.3.2", + "plugin-error": "0.1.2" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/rx/-/rx-4.1.0.tgz", + "integrity": "sha1-pfE/957zt0D+MKqAP7CfmIBdR4I=" + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.1.tgz", + "integrity": "sha512-kKvNJn6Mm93gAczWVJg7wH+wGYWNrDHdWvpUmHyEsgCtIwwo3bqPtV4tR5tuPaUhTOo/kvhVwd8XwwOllGYkbg==", + "dev": true + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==", + "dev": true + }, + "semver": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz", + "integrity": "sha1-MAvG4OhjdPe6YQaLWx7NV/xlMto=", + "dev": true + }, + "sequencify": { + "version": "0.0.7", + "resolved": "https://registry.npmjs.org/sequencify/-/sequencify-0.0.7.tgz", + "integrity": "sha1-kM/xnQLgcCf9dn9erT57ldHnOAw=", + "dev": true + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=", + "dev": true + }, + "set-getter": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/set-getter/-/set-getter-0.1.0.tgz", + "integrity": "sha1-12nBgsnVpR9AkUXy+6guXoboA3Y=", + "dev": true, + "requires": { + "to-object-path": "0.3.0" + } + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/set-immediate-shim/-/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=", + "dev": true + }, + "set-value": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz", + "integrity": "sha512-hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "split-string": "3.1.0" + } + }, + "shebang-command": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz", + "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=", + "dev": true, + "requires": { + "shebang-regex": "1.0.0" + } + }, + "shebang-regex": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz", + "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=", + "dev": true + }, + "shell-quote": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/shell-quote/-/shell-quote-1.6.1.tgz", + "integrity": "sha1-9HgZSczkAmlxJ0MOo7PFR29IF2c=", + "dev": true, + "requires": { + "array-filter": "0.0.1", + "array-map": "0.0.0", + "array-reduce": "0.0.0", + "jsonify": "0.0.0" + } + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=", + "dev": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "slash": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz", + "integrity": "sha1-xB8vbDn8FtHNF61LXYlhFK5HDVU=", + "dev": true + }, + "slice-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-1.0.0.tgz", + "integrity": "sha512-POqxBK6Lb3q6s047D/XsDVNPnF9Dl8JSaqe9h9lURl0OdNqy/ujDrOiIHtsqXMGbWWTIomRzAMaTyawAU//Reg==", + "dev": true, + "requires": { + "is-fullwidth-code-point": "2.0.0" + } + }, + "snapdragon": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.1.tgz", + "integrity": "sha1-4StUh/re0+PeoKyR6UAL91tAE3A=", + "dev": true, + "requires": { + "base": "0.11.2", + "debug": "2.6.9", + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "map-cache": "0.2.2", + "source-map": "0.5.7", + "source-map-resolve": "0.5.1", + "use": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "snapdragon-node": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz", + "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==", + "dev": true, + "requires": { + "define-property": "1.0.0", + "isobject": "3.0.1", + "snapdragon-util": "3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "snapdragon-util": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz", + "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "dev": true, + "requires": { + "hoek": "2.16.3" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=", + "dev": true + }, + "source-map-resolve": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.1.tgz", + "integrity": "sha512-0KW2wvzfxm8NCTb30z0LMNyPqWCdDGE2viwzUaucqJdkTRXtZiSY3I+2A6nVAjmdOy0I4gU8DwnVVGsk9jvP2A==", + "dev": true, + "requires": { + "atob": "2.0.3", + "decode-uri-component": "0.2.0", + "resolve-url": "0.2.1", + "source-map-url": "0.4.0", + "urix": "0.1.0" + } + }, + "source-map-support": { + "version": "0.4.18", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz", + "integrity": "sha512-try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==", + "dev": true, + "requires": { + "source-map": "0.5.7" + } + }, + "source-map-url": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz", + "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=", + "dev": true + }, + "sparkles": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/sparkles/-/sparkles-1.0.0.tgz", + "integrity": "sha1-Gsu/tZJDbRC76PeFt8xvgoFQEsM=", + "dev": true + }, + "spdx-correct": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/spdx-correct/-/spdx-correct-1.0.2.tgz", + "integrity": "sha1-SzBz2TP/UfORLwOsVRlJikFQ20A=", + "dev": true, + "requires": { + "spdx-license-ids": "1.2.2" + } + }, + "spdx-expression-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-1.0.4.tgz", + "integrity": "sha1-m98vIOH0DtRH++JzJmGR/O1RYmw=", + "dev": true + }, + "spdx-license-ids": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-1.2.2.tgz", + "integrity": "sha1-yd96NCRZSt5r0RkA1ZZpbcBrrFc=", + "dev": true + }, + "split": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/split/-/split-1.0.1.tgz", + "integrity": "sha512-mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==", + "dev": true, + "requires": { + "through": "2.3.8" + } + }, + "split-string": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz", + "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==", + "dev": true, + "requires": { + "extend-shallow": "3.0.2" + }, + "dependencies": { + "extend-shallow": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz", + "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=", + "dev": true, + "requires": { + "assign-symbols": "1.0.0", + "is-extendable": "1.0.1" + } + }, + "is-extendable": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz", + "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==", + "dev": true, + "requires": { + "is-plain-object": "2.0.4" + } + } + } + }, + "split2": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-2.2.0.tgz", + "integrity": "sha512-RAb22TG39LhI31MbreBgIuKiIKhVsawfTgEGqKHTK87aG+ul/PB8Sqoi3I7kVdRWiCfrKxK3uo4/YUkpNvhPbw==", + "dev": true, + "requires": { + "through2": "2.0.3" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=", + "dev": true + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "dev": true, + "requires": { + "asn1": "0.2.3", + "assert-plus": "1.0.0", + "bcrypt-pbkdf": "1.0.1", + "dashdash": "1.14.1", + "ecc-jsbn": "0.1.1", + "getpass": "0.1.7", + "jsbn": "0.1.1", + "tweetnacl": "0.14.5" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "stable": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.6.tgz", + "integrity": "sha1-kQ9dKu17Ugxud3SZwfMuE5/eyxA=", + "dev": true + }, + "standard-version": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/standard-version/-/standard-version-4.3.0.tgz", + "integrity": "sha512-2UJ2BIUNa7+41PH4FvYicSQED2LCt2RXjmNFis+JZlxZtwzNnGn4uuL8WBUqHoC9b+bJ0AHIAX/bilzm+pGPeA==", + "dev": true, + "requires": { + "chalk": "1.1.3", + "conventional-changelog": "1.1.15", + "conventional-recommended-bump": "1.2.1", + "dotgitignore": "1.0.3", + "figures": "1.7.0", + "fs-access": "1.0.1", + "semver": "5.5.0", + "yargs": "8.0.2" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1", + "wrap-ansi": "2.1.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "figures": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/figures/-/figures-1.7.0.tgz", + "integrity": "sha1-y+Hjr/zxzUS4DK3+0o3Hk6lwHS4=", + "dev": true, + "requires": { + "escape-string-regexp": "1.0.5", + "object-assign": "4.1.1" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "load-json-file": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/load-json-file/-/load-json-file-2.0.0.tgz", + "integrity": "sha1-eUfkIUmvgNaWy/eXvKq8/h/inKg=", + "dev": true, + "requires": { + "graceful-fs": "4.1.11", + "parse-json": "2.2.0", + "pify": "2.3.0", + "strip-bom": "3.0.0" + } + }, + "path-type": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/path-type/-/path-type-2.0.0.tgz", + "integrity": "sha1-8BLMuEFbcJb8LaoQVMPXI4lZTHM=", + "dev": true, + "requires": { + "pify": "2.3.0" + } + }, + "read-pkg": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg/-/read-pkg-2.0.0.tgz", + "integrity": "sha1-jvHAYjxqbbDcZxPEv6xGMysjaPg=", + "dev": true, + "requires": { + "load-json-file": "2.0.0", + "normalize-package-data": "2.4.0", + "path-type": "2.0.0" + } + }, + "read-pkg-up": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/read-pkg-up/-/read-pkg-up-2.0.0.tgz", + "integrity": "sha1-a3KoBImE4MQeeVEP1en6mbO1Sb4=", + "dev": true, + "requires": { + "find-up": "2.1.0", + "read-pkg": "2.0.0" + } + }, + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "strip-bom": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", + "integrity": "sha1-IzTBjpx1n3vdVv3vfprj1YjmjtM=", + "dev": true + }, + "yargs": { + "version": "8.0.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-8.0.2.tgz", + "integrity": "sha1-YpmpBVsc78lp/355wdkY3Osiw2A=", + "dev": true, + "requires": { + "camelcase": "4.1.0", + "cliui": "3.2.0", + "decamelize": "1.2.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "read-pkg-up": "2.0.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "7.0.0" + } + } + } + }, + "stat-mode": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/stat-mode/-/stat-mode-0.2.2.tgz", + "integrity": "sha1-5sgLYjEj19gM8TLOU480YokHJQI=", + "dev": true + }, + "static-extend": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz", + "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "object-copy": "0.1.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "stream-combiner": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/stream-combiner/-/stream-combiner-0.0.4.tgz", + "integrity": "sha1-TV5DPBhSYd3mI8o/RMWGvPXErRQ=", + "dev": true, + "requires": { + "duplexer": "0.1.1" + } + }, + "stream-consume": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/stream-consume/-/stream-consume-0.1.0.tgz", + "integrity": "sha1-pB6tGm1ggc63n2WwYZAbbY89HQ8=", + "dev": true + }, + "stream-shift": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz", + "integrity": "sha1-1cdSgl5TZ+eG944Y5EXqIjoVWVI=", + "dev": true + }, + "streamfilter": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/streamfilter/-/streamfilter-1.0.7.tgz", + "integrity": "sha512-Gk6KZM+yNA1JpW0KzlZIhjo3EaBJDkYfXtYSbOwNIQ7Zd6006E6+sCFlW1NDvFG/vnXhKmw6TJJgiEQg/8lXfQ==", + "dev": true, + "requires": { + "readable-stream": "2.3.4" + } + }, + "streamifier": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/streamifier/-/streamifier-0.1.1.tgz", + "integrity": "sha1-l+mNj6TRBdYqJpHR3AfoINuN/E8=", + "dev": true + }, + "string-width": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", + "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", + "requires": { + "is-fullwidth-code-point": "2.0.0", + "strip-ansi": "4.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "3.0.0" + } + } + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", + "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "dev": true, + "requires": { + "safe-buffer": "5.1.1" + } + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "dev": true + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "2.1.1" + } + }, + "strip-bom": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-1.0.0.tgz", + "integrity": "sha1-hbiGLzhEtabV7IRnqTWYFzo295Q=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "is-utf8": "0.2.1" + } + }, + "strip-bom-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-bom-stream/-/strip-bom-stream-1.0.0.tgz", + "integrity": "sha1-5xRDmFd9Uaa+0PoZlPoF9D/ZiO4=", + "dev": true, + "requires": { + "first-chunk-stream": "1.0.0", + "strip-bom": "2.0.0" + }, + "dependencies": { + "strip-bom": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-2.0.0.tgz", + "integrity": "sha1-YhmoVhZSBJHzV4i9vxRHqZx+aw4=", + "dev": true, + "requires": { + "is-utf8": "0.2.1" + } + } + } + }, + "strip-eof": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz", + "integrity": "sha1-u0P/VZim6wXYm1n80SnJgzE2Br8=", + "dev": true + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "dev": true, + "requires": { + "get-stdin": "4.0.1" + } + }, + "strip-json-comments": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", + "integrity": "sha1-PFMZQukIwml8DsNEhYwobHygpgo=", + "dev": true + }, + "subarg": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/subarg/-/subarg-1.0.0.tgz", + "integrity": "sha1-9izxdYHplrSPyWVpn1TAauJouNI=", + "dev": true, + "requires": { + "minimist": "1.2.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + }, + "svgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.0.4.tgz", + "integrity": "sha512-DR9ieoaBoeySY4pnIJMM3Hez6kcVj+Uzj8AUJkr3435qstozP9i+mZ9yzcbq64A44i9YKh3I1Laex+mAyc69Rg==", + "dev": true, + "requires": { + "coa": "2.0.1", + "colors": "1.1.2", + "css-select": "1.3.0-rc0", + "css-select-base-adapter": "0.1.0", + "css-tree": "1.0.0-alpha25", + "css-url-regex": "1.1.0", + "csso": "3.5.0", + "js-yaml": "3.10.0", + "mkdirp": "0.5.1", + "object.values": "1.0.4", + "sax": "1.2.4", + "stable": "0.1.6", + "unquote": "1.1.1", + "util.promisify": "1.0.0" + } + }, + "table": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/table/-/table-4.0.2.tgz", + "integrity": "sha512-UUkEAPdSGxtRpiV9ozJ5cMTtYiqz7Ni1OGqLXRCynrvzdtR1p+cfOWe2RJLwvUG8hNanaSRjecIqwOjqeatDsA==", + "dev": true, + "requires": { + "ajv": "5.5.2", + "ajv-keywords": "2.1.1", + "chalk": "2.3.1", + "lodash": "4.17.5", + "slice-ansi": "1.0.0", + "string-width": "2.1.1" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.0.tgz", + "integrity": "sha512-NnSOmMEYtVR2JVMIGTzynRkkaxtiq1xnFBcdQD/DnNCYPoEPsVJhM98BDyaoNOQIi7p4okdi3E27eN7GQbsUug==", + "dev": true, + "requires": { + "color-convert": "1.9.1" + } + }, + "chalk": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.3.1.tgz", + "integrity": "sha512-QUU4ofkDoMIVO7hcx1iPTISs88wsO8jA92RQIm4JAwZvFGGAV2hSAA1NX7oVj2Ej2Q6NDTcRDjPTFrMCRZoJ6g==", + "dev": true, + "requires": { + "ansi-styles": "3.2.0", + "escape-string-regexp": "1.0.5", + "supports-color": "5.2.0" + } + }, + "supports-color": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.2.0.tgz", + "integrity": "sha512-F39vS48la4YvTZUPVeTqsjsFNrvcMwrV3RLZINsmHo+7djCvuUzSIeXOnZ5hmjef4bajL1dNccN+tg5XAliO5Q==", + "dev": true, + "requires": { + "has-flag": "3.0.0" + } + } + } + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "dev": true, + "requires": { + "block-stream": "0.0.9", + "fstream": "1.0.11", + "inherits": "2.0.3" + } + }, + "ternary-stream": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/ternary-stream/-/ternary-stream-2.0.1.tgz", + "integrity": "sha1-Bk5Im0tb9gumpre8fy9cJ07Pgmk=", + "dev": true, + "requires": { + "duplexify": "3.5.3", + "fork-stream": "0.0.4", + "merge-stream": "1.0.1", + "through2": "2.0.3" + } + }, + "text-extensions": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/text-extensions/-/text-extensions-1.7.0.tgz", + "integrity": "sha512-AKXZeDq230UaSzaO5s3qQUZOaC7iKbzq0jOFL614R7d9R593HLqAOL0cYoqLdkNrjBSOdmoQI06yigq1TSBXAg==", + "dev": true + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=", + "dev": true + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "through2": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz", + "integrity": "sha1-AARWmzfHx0ujnEPzzteNGtlBQL4=", + "dev": true, + "requires": { + "readable-stream": "2.3.4", + "xtend": "4.0.1" + } + }, + "through2-filter": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-2.0.0.tgz", + "integrity": "sha1-YLxVoNrLdghdsfna6Zq0P4PWIuw=", + "dev": true, + "requires": { + "through2": "2.0.3", + "xtend": "4.0.1" + } + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/tildify/-/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "dev": true, + "requires": { + "os-homedir": "1.0.2" + } + }, + "time-stamp": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/time-stamp/-/time-stamp-1.1.0.tgz", + "integrity": "sha1-dkpaEa9QVhkhsTPztE5hhofg9cM=", + "dev": true + }, + "tmp": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz", + "integrity": "sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==", + "requires": { + "os-tmpdir": "1.0.2" + } + }, + "to-absolute-glob": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-0.1.1.tgz", + "integrity": "sha1-HN+kcqnvUMI57maZm2YsoOs5k38=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1" + } + }, + "to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=", + "dev": true + }, + "to-object-path": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz", + "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + }, + "to-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.1.tgz", + "integrity": "sha1-FTWL7kosg712N3uh3ASdDxiDeq4=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "extend-shallow": "2.0.1", + "regex-not": "1.0.0" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "to-regex-range": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz", + "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=", + "dev": true, + "requires": { + "is-number": "3.0.0", + "repeat-string": "1.6.1" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + } + } + } + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "dev": true, + "requires": { + "punycode": "1.4.1" + } + }, + "trim-newlines": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/trim-newlines/-/trim-newlines-1.0.0.tgz", + "integrity": "sha1-WIeWa7WCpFA6QetST301ARgVphM=", + "dev": true + }, + "trim-off-newlines": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-off-newlines/-/trim-off-newlines-1.0.1.tgz", + "integrity": "sha1-n5up2e+odkw4dpi8v+sshI8RrbM=", + "dev": true + }, + "trim-right": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz", + "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=", + "dev": true + }, + "tunnel-agent": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.3.tgz", + "integrity": "sha1-Y3PbdpCf5XDgjXNYM2Xtgop07us=", + "dev": true + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "dev": true, + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "dev": true, + "requires": { + "prelude-ls": "1.1.2" + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=", + "dev": true + }, + "typescript": { + "version": "2.7.1", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-2.7.1.tgz", + "integrity": "sha512-bqB1yS6o9TNA9ZC/MJxM0FZzPnZdtHj0xWK/IZ5khzVqdpGul/R/EIiHRgFXlwTD7PSIaYVnGKq1QgMCu2mnqw==", + "dev": true + }, + "uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha1-KcVzMUgFe7Th913zW3qcty5qWd0=", + "dev": true, + "optional": true, + "requires": { + "source-map": "0.5.7", + "uglify-to-browserify": "1.0.2", + "yargs": "3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=", + "dev": true, + "optional": true + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "dev": true, + "optional": true, + "requires": { + "camelcase": "1.2.1", + "cliui": "2.1.0", + "decamelize": "1.2.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=", + "dev": true, + "optional": true + }, + "unc-path-regex": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", + "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", + "dev": true + }, + "union-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz", + "integrity": "sha1-XHHDTLW61dzr4+oM0IIHulqhrqQ=", + "dev": true, + "requires": { + "arr-union": "3.1.0", + "get-value": "2.0.6", + "is-extendable": "0.1.1", + "set-value": "0.4.3" + }, + "dependencies": { + "set-value": { + "version": "0.4.3", + "resolved": "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz", + "integrity": "sha1-fbCPnT0i3H945Trzw79GZuzfzPE=", + "dev": true, + "requires": { + "extend-shallow": "2.0.1", + "is-extendable": "0.1.1", + "is-plain-object": "2.0.4", + "to-object-path": "0.3.0" + } + } + } + }, + "unique-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-1.0.0.tgz", + "integrity": "sha1-1ZpKdUJ0R9mqbJHnAmP40mpLEEs=", + "dev": true + }, + "unquote": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz", + "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=", + "dev": true + }, + "unset-value": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz", + "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=", + "dev": true, + "requires": { + "has-value": "0.3.1", + "isobject": "3.0.1" + }, + "dependencies": { + "has-value": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz", + "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=", + "dev": true, + "requires": { + "get-value": "2.0.6", + "has-values": "0.1.4", + "isobject": "2.1.0" + }, + "dependencies": { + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "dev": true, + "requires": { + "isarray": "1.0.0" + } + } + } + }, + "has-values": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz", + "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=", + "dev": true + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + } + } + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz", + "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=", + "dev": true + }, + "url-parse": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/url-parse/-/url-parse-1.2.0.tgz", + "integrity": "sha512-DT1XbYAfmQP65M/mE6OALxmXzZ/z1+e5zk2TcSKe/KiYbNGZxgtttzC0mR/sjopbpOXcbniq7eIKmocJnUWlEw==", + "dev": true, + "requires": { + "querystringify": "1.0.0", + "requires-port": "1.0.0" + } + }, + "use": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/use/-/use-2.0.2.tgz", + "integrity": "sha1-riig1y+TvyJCKhii43mZMRLeyOg=", + "dev": true, + "requires": { + "define-property": "0.2.5", + "isobject": "3.0.1", + "lazy-cache": "2.0.2" + }, + "dependencies": { + "define-property": { + "version": "0.2.5", + "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz", + "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=", + "dev": true, + "requires": { + "is-descriptor": "0.1.6" + } + }, + "is-accessor-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz", + "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-data-descriptor": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz", + "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=", + "dev": true, + "requires": { + "kind-of": "3.2.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "dev": true, + "requires": { + "is-buffer": "1.1.6" + } + } + } + }, + "is-descriptor": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz", + "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==", + "dev": true, + "requires": { + "is-accessor-descriptor": "0.1.6", + "is-data-descriptor": "0.1.4", + "kind-of": "5.1.0" + } + }, + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=", + "dev": true + }, + "kind-of": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz", + "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==", + "dev": true + } + } + }, + "user-home": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/user-home/-/user-home-1.1.1.tgz", + "integrity": "sha1-K1viOjK2Onyd640PKNSFcko98ZA=", + "dev": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "dev": true + }, + "util.promisify": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz", + "integrity": "sha512-i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==", + "dev": true, + "requires": { + "define-properties": "1.1.2", + "object.getownpropertydescriptors": "2.0.3" + } + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.2.1.tgz", + "integrity": "sha512-jZnMwlb9Iku/O3smGWvZhauCf6cvvpKi4BKRiliS3cxnI+Gz9j5MEpTz2UFuXiKPJocb7gnsLHwiS05ige5BEA==", + "dev": true + }, + "v8flags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/v8flags/-/v8flags-2.1.1.tgz", + "integrity": "sha1-qrGh+jDUX4jdMhFIh1rALAtV5bQ=", + "dev": true, + "requires": { + "user-home": "1.1.1" + } + }, + "vali-date": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/vali-date/-/vali-date-1.0.0.tgz", + "integrity": "sha1-G5BKWWCfsyjvB4E4Qgk09rhnCaY=", + "dev": true + }, + "validate-npm-package-license": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.1.tgz", + "integrity": "sha1-KAS6vnEq0zeUWaz74kdGqywwP7w=", + "dev": true, + "requires": { + "spdx-correct": "1.0.2", + "spdx-expression-parse": "1.0.4" + } + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "dev": true, + "requires": { + "assert-plus": "1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "1.3.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "dev": true + } + } + }, + "vinyl": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.5.3.tgz", + "integrity": "sha1-sEVbOPxeDPMNQyUTLkYZcMIJHN4=", + "dev": true, + "requires": { + "clone": "1.0.3", + "clone-stats": "0.0.1", + "replace-ext": "0.0.1" + } + }, + "vinyl-fs": { + "version": "0.3.14", + "resolved": "https://registry.npmjs.org/vinyl-fs/-/vinyl-fs-0.3.14.tgz", + "integrity": "sha1-mmhRzhysHBzqX+hsCTHWIMLPqeY=", + "dev": true, + "requires": { + "defaults": "1.0.3", + "glob-stream": "3.1.18", + "glob-watcher": "0.0.6", + "graceful-fs": "3.0.11", + "mkdirp": "0.5.1", + "strip-bom": "1.0.0", + "through2": "0.6.5", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "graceful-fs": { + "version": "3.0.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-3.0.11.tgz", + "integrity": "sha1-dhPHeKGv6mLyXGMKCG1/Osu92Bg=", + "dev": true, + "requires": { + "natives": "1.1.1" + } + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "dev": true + }, + "readable-stream": { + "version": "1.0.34", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", + "integrity": "sha1-Elgg40vIQtLyqq+v5MKRbuMsFXw=", + "dev": true, + "requires": { + "core-util-is": "1.0.2", + "inherits": "2.0.3", + "isarray": "0.0.1", + "string_decoder": "0.10.31" + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "dev": true + }, + "through2": { + "version": "0.6.5", + "resolved": "https://registry.npmjs.org/through2/-/through2-0.6.5.tgz", + "integrity": "sha1-QaucZ7KdVyCQcUEOHXp6lozTrUg=", + "dev": true, + "requires": { + "readable-stream": "1.0.34", + "xtend": "4.0.1" + } + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vinyl-source-stream": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vinyl-source-stream/-/vinyl-source-stream-1.1.2.tgz", + "integrity": "sha1-YrU6E1YQqJbpjKlr7jqH8Aio54A=", + "dev": true, + "requires": { + "through2": "2.0.3", + "vinyl": "0.4.6" + }, + "dependencies": { + "clone": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/clone/-/clone-0.2.0.tgz", + "integrity": "sha1-xhJqkK1Pctv1rNskPMN3JP6T/B8=", + "dev": true + }, + "vinyl": { + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/vinyl/-/vinyl-0.4.6.tgz", + "integrity": "sha1-LzVsh6VQolVGHza76ypbqL94SEc=", + "dev": true, + "requires": { + "clone": "0.2.0", + "clone-stats": "0.0.1" + } + } + } + }, + "vscode": { + "version": "1.1.10", + "resolved": "https://registry.npmjs.org/vscode/-/vscode-1.1.10.tgz", + "integrity": "sha512-MvFXXSGuhw0Q6GC6dQrnRc0ES+63wpttGIoYGBMQnoS9JFCCNC/rWfX0lBCHJyuKL2Q8CYg0ROsMEHbHVwEtVw==", + "dev": true, + "requires": { + "glob": "7.1.2", + "gulp-chmod": "2.0.0", + "gulp-filter": "5.1.0", + "gulp-gunzip": "1.0.0", + "gulp-remote-src": "0.4.3", + "gulp-symdest": "1.1.0", + "gulp-untar": "0.0.6", + "gulp-vinyl-zip": "2.1.0", + "mocha": "4.1.0", + "request": "2.83.0", + "semver": "5.5.0", + "source-map-support": "0.5.3", + "url-parse": "1.2.0", + "vinyl-source-stream": "1.1.2" + }, + "dependencies": { + "semver": { + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz", + "integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==", + "dev": true + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "dev": true + }, + "source-map-support": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.3.tgz", + "integrity": "sha512-eKkTgWYeBOQqFGXRfKabMFdnWepo51vWqEdoeikaEPFiJC7MCU5j2h4+6Q8npkZTeLGbSyecZvRxiSoWl3rh+w==", + "dev": true, + "requires": { + "source-map": "0.6.1" + } + } + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/which/-/which-1.3.0.tgz", + "integrity": "sha512-xcJpopdamTuY5duC/KnTTNBraPK54YwpenP4lzxU8H91GudWpFv38u0CKjclE1Wi2EH2EDz5LRcHcKbCIzqGyg==", + "dev": true, + "requires": { + "isexe": "2.0.0" + } + }, + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=", + "dev": true + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=", + "dev": true, + "optional": true + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "dev": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "dev": true, + "requires": { + "string-width": "1.0.2", + "strip-ansi": "3.0.1" + }, + "dependencies": { + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "dev": true, + "requires": { + "number-is-nan": "1.0.1" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "dev": true, + "requires": { + "code-point-at": "1.1.0", + "is-fullwidth-code-point": "1.0.0", + "strip-ansi": "3.0.1" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=", + "dev": true + }, + "write": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/write/-/write-0.2.1.tgz", + "integrity": "sha1-X8A4KOJkzqP+kUVUdvejxWbLB1c=", + "dev": true, + "requires": { + "mkdirp": "0.5.1" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "dev": true + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=", + "dev": true + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=", + "dev": true + }, + "yamljs": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz", + "integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==", + "dev": true, + "requires": { + "argparse": "1.0.9", + "glob": "7.1.2" + } + }, + "yargs": { + "version": "11.0.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-11.0.0.tgz", + "integrity": "sha512-Rjp+lMYQOWtgqojx1dEWorjCofi1YN7AoFvYV7b1gx/7dAAeuI4kN5SZiEvr0ZmsZTOpDRcCqrpI10L31tFkBw==", + "dev": true, + "requires": { + "cliui": "4.0.0", + "decamelize": "1.2.0", + "find-up": "2.1.0", + "get-caller-file": "1.0.2", + "os-locale": "2.1.0", + "require-directory": "2.1.1", + "require-main-filename": "1.0.1", + "set-blocking": "2.0.0", + "string-width": "2.1.1", + "which-module": "2.0.0", + "y18n": "3.2.1", + "yargs-parser": "9.0.2" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=", + "dev": true + }, + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + }, + "cliui": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-4.0.0.tgz", + "integrity": "sha512-nY3W5Gu2racvdDk//ELReY+dHjb9PlIcVDFXP72nVIhq2Gy3LuVXYwJoPVudwQnv1shtohpgkdCKT2YaKY0CKw==", + "dev": true, + "requires": { + "string-width": "2.1.1", + "strip-ansi": "4.0.0", + "wrap-ansi": "2.1.0" + } + }, + "find-up": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz", + "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=", + "dev": true, + "requires": { + "locate-path": "2.0.0" + } + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "dev": true, + "requires": { + "ansi-regex": "3.0.0" + } + }, + "yargs-parser": { + "version": "9.0.2", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-9.0.2.tgz", + "integrity": "sha1-nM9qQ0YP5O1Aqbto9I1DuKaMwHc=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + } + } + } + }, + "yargs-parser": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-7.0.0.tgz", + "integrity": "sha1-jQrELxbqVd69MyyvTEA4s+P139k=", + "dev": true, + "requires": { + "camelcase": "4.1.0" + }, + "dependencies": { + "camelcase": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz", + "integrity": "sha1-1UVjW+HjPFQmScaRc+Xeas+uNN0=", + "dev": true + } + } + }, + "yauzl": { + "version": "2.9.1", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.9.1.tgz", + "integrity": "sha1-qBmB6nCleUYTOIPwKcWCGok1mn8=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13", + "fd-slicer": "1.0.1" + } + }, + "yazl": { + "version": "2.4.3", + "resolved": "https://registry.npmjs.org/yazl/-/yazl-2.4.3.tgz", + "integrity": "sha1-7CblzIfVYBud+EMtvdPNLlFzoHE=", + "dev": true, + "requires": { + "buffer-crc32": "0.2.13" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..395d870 --- /dev/null +++ b/package.json @@ -0,0 +1,142 @@ +{ + "name": "vsc-material-theme", + "displayName": "Material Theme", + "description": "The most epic theme now for Visual Studio Code", + "version": "1.6.0", + "publisher": "Equinusocio", + "license": "Apache-2.0", + "author": "Mattia Astorino [@equinusocio]", + "icon": "logo.png", + "galleryBanner": { + "color": "#263238", + "theme": "dark" + }, + "homepage": "https://github.com/equinusocio/vsc-material-theme", + "repository": { + "type": "git", + "url": "https://github.com/equinusocio/vsc-material-theme.git" + }, + "bugs": { + "url": "https://github.com/equinusocio/vsc-material-theme/issues" + }, + "engines": { + "vscode": "^1.19.0" + }, + "standard-version": { + "scripts": { + "postchangelog": "yarn gulp changelog-title" + } + }, + "scripts": { + "build": "yarn build-icons && yarn build-themes && yarn build-icons-accents && yarn build-icons-variants", + "minimize-icons": "svgo -f src/icons/svgs -o icons/", + "minimize-json": "json-minify themes/.material-theme-icons.tmp > themes/Material-Theme-Icons.json && yarn remove-icons-tmp", + "remove-icons": "rimraf icons/* && rimraf themes/Material-Theme-Icons.json", + "remove-icons-tmp": "rimraf themes/.material-theme-icons.tmp", + "build-icons": "yarn remove-icons && yarn minimize-icons && yarn gulp build:icons && yarn minimize-json", + "build-icons-accents": "yarn gulp build:icons.accents", + "build-icons-variants": "yarn gulp build:icons.variants", + "build-themes": "yarn gulp build:themes", + "release": "standard-version", + "postinstall": "node ./node_modules/vscode/bin/install && opencollective postinstall" + }, + "categories": [ + "Themes", + "Other" + ], + "activationEvents": [ + "*" + ], + "main": "./extensions/material.theme.config.js", + "contributes": { + "commands": [ + { + "category": "šŸŽØ Material theme", + "command": "material.theme.config", + "title": "Settings" + } + ], + "configuration": { + "properties": { + "materialTheme.cache.workbench.accent": { + "type": "string", + "title": "[DEPRECATED] This is an old property.", + "description": "This property is intended only for migrating old settings system to a new one. It will be removed in new versions. Don't use it, use \"materialTheme.cache.workbench.settings\" instead." + }, + "materialTheme.cache.workbench.settings": { + "default": {}, + "type": "object", + "title": "Custom material theme settings", + "description": "Material theme settings object." + } + } + }, + "themes": [ + { + "label": "Material Theme", + "path": "./themes/Material-Theme-Palenight.json", + "uiTheme": "vs-dark" + } + ], + "iconThemes": [ + { + "id": "eq-material-theme-icons", + "label": "Material Theme Icons", + "path": "./themes/Material-Theme-Icons.json" + } + ] + }, + "badges": [ + { + "url": "https://camo.githubusercontent.com/d3c6e53aa66426dead24cdedab0e83082103bea6/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6973737565732f657175696e75736f63696f2f7673632d6d6174657269616c2d7468656d652e7376673f7374796c653d666c61742d737175617265", + "href": "https://github.com/equinusocio/vsc-material-theme/issues", + "description": "Open issues" + } + ], + "devDependencies": { + "@types/chalk": "2.2.0", + "@types/gulp": "4.0.5", + "@types/gulp-if": "0.0.33", + "@types/gulp-util": "3.0.34", + "@types/mustache": "0.8.30", + "@types/run-sequence": "0.0.30", + "@types/through2": "2.0.33", + "@types/yamljs": "0.2.30", + "@types/yargs": "10.0.1", + "babel-core": "6.26.0", + "babel-preset-es2015": "6.24.1", + "babel-root-import": "4.1.8", + "cpx": "1.5.0", + "eslint": "4.17.0", + "eslint-plugin-standard": "3.0.1", + "gulp": "3.9.1", + "gulp-bump": "3.1.0", + "gulp-conventional-changelog": "1.1.11", + "gulp-if": "2.0.2", + "gulp-stats": "0.0.4", + "gulp-util": "3.0.8", + "json-minify": "1.0.0", + "mustache": "2.3.0", + "rimraf": "2.6.2", + "run-sequence": "2.2.1", + "standard-version": "4.3.0", + "svgo": "1.0.4", + "typescript": "2.7.1", + "vscode": "1.1.10", + "yamljs": "0.3.0", + "yargs": "11.0.0" + }, + "__metadata": { + "id": "dffaf5a1-2219-434b-9d87-cb586fd59260", + "publisherDisplayName": "Mattia Astorino", + "publisherId": "e41388a1-a892-4c1e-940b-1e7c1bf43c97" + }, + "dependencies": { + "opencollective": "1.0.3" + }, + "collective": { + "type": "opencollective", + "url": "https://opencollective.com/vsc-material-theme", + "logo": "https://opencollective.com/opencollective/logo.txt" + } +} diff --git a/src/icons/icons-theme.json b/src/icons/icons-theme.json new file mode 100644 index 0000000..398bcc1 --- /dev/null +++ b/src/icons/icons-theme.json @@ -0,0 +1,10 @@ +{ + "hidesExplorerArrows": true, + {{> iconDefinitions}} + {{> fileExtensions}} + {{> fileNames}} + {{> fileFolders}} + {{> languageIds}} + {{> light}} + {{> folderNames}} +} diff --git a/src/icons/svgs/actionscript.svg b/src/icons/svgs/actionscript.svg new file mode 100755 index 0000000..d1a6d21 --- /dev/null +++ b/src/icons/svgs/actionscript.svg @@ -0,0 +1,89 @@ + + + + + + image/svg+xml + + + + + + + + { } + AS + diff --git a/src/icons/svgs/ai.svg b/src/icons/svgs/ai.svg new file mode 100644 index 0000000..dcad0f0 --- /dev/null +++ b/src/icons/svgs/ai.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/android.svg b/src/icons/svgs/android.svg new file mode 100755 index 0000000..9dc23cc --- /dev/null +++ b/src/icons/svgs/android.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/angular.svg b/src/icons/svgs/angular.svg new file mode 100755 index 0000000..d48359e --- /dev/null +++ b/src/icons/svgs/angular.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/applescript.svg b/src/icons/svgs/applescript.svg new file mode 100644 index 0000000..33a08db --- /dev/null +++ b/src/icons/svgs/applescript.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/arduino.svg b/src/icons/svgs/arduino.svg new file mode 100755 index 0000000..5d0136f --- /dev/null +++ b/src/icons/svgs/arduino.svg @@ -0,0 +1 @@ +Layer 1 \ No newline at end of file diff --git a/src/icons/svgs/assembly.svg b/src/icons/svgs/assembly.svg new file mode 100755 index 0000000..13ffa1b --- /dev/null +++ b/src/icons/svgs/assembly.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/autohotkey.svg b/src/icons/svgs/autohotkey.svg new file mode 100755 index 0000000..2d30b20 --- /dev/null +++ b/src/icons/svgs/autohotkey.svg @@ -0,0 +1,55 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/icons/svgs/babel.svg b/src/icons/svgs/babel.svg new file mode 100644 index 0000000..95cbb6e --- /dev/null +++ b/src/icons/svgs/babel.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/blade.svg b/src/icons/svgs/blade.svg new file mode 100644 index 0000000..f2e83f9 --- /dev/null +++ b/src/icons/svgs/blade.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/icons/svgs/bower.svg b/src/icons/svgs/bower.svg new file mode 100644 index 0000000..9fb2327 --- /dev/null +++ b/src/icons/svgs/bower.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/c.svg b/src/icons/svgs/c.svg new file mode 100644 index 0000000..f088643 --- /dev/null +++ b/src/icons/svgs/c.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/certificate.svg b/src/icons/svgs/certificate.svg new file mode 100755 index 0000000..b755e35 --- /dev/null +++ b/src/icons/svgs/certificate.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/changelog.svg b/src/icons/svgs/changelog.svg new file mode 100755 index 0000000..18cbc87 --- /dev/null +++ b/src/icons/svgs/changelog.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/clojure.svg b/src/icons/svgs/clojure.svg new file mode 100755 index 0000000..ebd6dda --- /dev/null +++ b/src/icons/svgs/clojure.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/icons/svgs/cmake.svg b/src/icons/svgs/cmake.svg new file mode 100755 index 0000000..d03a99b --- /dev/null +++ b/src/icons/svgs/cmake.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + + + diff --git a/src/icons/svgs/cmd.svg b/src/icons/svgs/cmd.svg new file mode 100644 index 0000000..70d3207 --- /dev/null +++ b/src/icons/svgs/cmd.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/coffee.svg b/src/icons/svgs/coffee.svg new file mode 100755 index 0000000..9495cef --- /dev/null +++ b/src/icons/svgs/coffee.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/console.svg b/src/icons/svgs/console.svg new file mode 100755 index 0000000..05e0344 --- /dev/null +++ b/src/icons/svgs/console.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/contributing.svg b/src/icons/svgs/contributing.svg new file mode 100755 index 0000000..02e92f6 --- /dev/null +++ b/src/icons/svgs/contributing.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/cpp.svg b/src/icons/svgs/cpp.svg new file mode 100755 index 0000000..1395b2e --- /dev/null +++ b/src/icons/svgs/cpp.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/credits.svg b/src/icons/svgs/credits.svg new file mode 100755 index 0000000..d648b6e --- /dev/null +++ b/src/icons/svgs/credits.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/csharp.svg b/src/icons/svgs/csharp.svg new file mode 100755 index 0000000..b9202af --- /dev/null +++ b/src/icons/svgs/csharp.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/css-map.svg b/src/icons/svgs/css-map.svg new file mode 100755 index 0000000..05e3ecf --- /dev/null +++ b/src/icons/svgs/css-map.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/icons/svgs/css.svg b/src/icons/svgs/css.svg new file mode 100755 index 0000000..ae3dfa5 --- /dev/null +++ b/src/icons/svgs/css.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/dart.svg b/src/icons/svgs/dart.svg new file mode 100755 index 0000000..92a3329 --- /dev/null +++ b/src/icons/svgs/dart.svg @@ -0,0 +1,86 @@ + + + Dart + + + + image/svg+xml + + Dart + + + + Philipp Kief + + + + + + + + + + + + + + + + + diff --git a/src/icons/svgs/database.svg b/src/icons/svgs/database.svg new file mode 100755 index 0000000..afaa27c --- /dev/null +++ b/src/icons/svgs/database.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/dlang.svg b/src/icons/svgs/dlang.svg new file mode 100644 index 0000000..40b13c6 --- /dev/null +++ b/src/icons/svgs/dlang.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/docker.svg b/src/icons/svgs/docker.svg new file mode 100644 index 0000000..5fe5f0f --- /dev/null +++ b/src/icons/svgs/docker.svg @@ -0,0 +1,39 @@ + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/svgs/document.svg b/src/icons/svgs/document.svg new file mode 100755 index 0000000..aa62b2b --- /dev/null +++ b/src/icons/svgs/document.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/dotnet.svg b/src/icons/svgs/dotnet.svg new file mode 100644 index 0000000..d31b3fc --- /dev/null +++ b/src/icons/svgs/dotnet.svg @@ -0,0 +1,12 @@ + + + + dotnet + Created with Sketch. + + + + + + + \ No newline at end of file diff --git a/src/icons/svgs/email.svg b/src/icons/svgs/email.svg new file mode 100755 index 0000000..244fbe6 --- /dev/null +++ b/src/icons/svgs/email.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/eslint.svg b/src/icons/svgs/eslint.svg new file mode 100644 index 0000000..2696c8f --- /dev/null +++ b/src/icons/svgs/eslint.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/ex.svg b/src/icons/svgs/ex.svg new file mode 100644 index 0000000..ffe7bef --- /dev/null +++ b/src/icons/svgs/ex.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/exe.svg b/src/icons/svgs/exe.svg new file mode 100755 index 0000000..870667c --- /dev/null +++ b/src/icons/svgs/exe.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/favicon.svg b/src/icons/svgs/favicon.svg new file mode 100755 index 0000000..c78b83d --- /dev/null +++ b/src/icons/svgs/favicon.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/file_dark.svg b/src/icons/svgs/file_dark.svg new file mode 100755 index 0000000..2232f80 --- /dev/null +++ b/src/icons/svgs/file_dark.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/flash.svg b/src/icons/svgs/flash.svg new file mode 100755 index 0000000..1d192ae --- /dev/null +++ b/src/icons/svgs/flash.svg @@ -0,0 +1,90 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + diff --git a/src/icons/svgs/flow.svg b/src/icons/svgs/flow.svg new file mode 100755 index 0000000..a3a96ff --- /dev/null +++ b/src/icons/svgs/flow.svg @@ -0,0 +1,65 @@ + + + + + + image/svg+xml + + + + + + + + F + diff --git a/src/icons/svgs/folder_assets.svg b/src/icons/svgs/folder_assets.svg new file mode 100644 index 0000000..d03adf3 --- /dev/null +++ b/src/icons/svgs/folder_assets.svg @@ -0,0 +1 @@ +folder_assets \ No newline at end of file diff --git a/src/icons/svgs/folder_assets_open.svg b/src/icons/svgs/folder_assets_open.svg new file mode 100644 index 0000000..63071b9 --- /dev/null +++ b/src/icons/svgs/folder_assets_open.svg @@ -0,0 +1 @@ +folder_assets_open \ No newline at end of file diff --git a/src/icons/svgs/folder_bower.svg b/src/icons/svgs/folder_bower.svg new file mode 100644 index 0000000..fc3e493 --- /dev/null +++ b/src/icons/svgs/folder_bower.svg @@ -0,0 +1 @@ +folder_bower \ No newline at end of file diff --git a/src/icons/svgs/folder_bower_open.svg b/src/icons/svgs/folder_bower_open.svg new file mode 100644 index 0000000..ecab30a --- /dev/null +++ b/src/icons/svgs/folder_bower_open.svg @@ -0,0 +1 @@ +folder_bower_open \ No newline at end of file diff --git a/src/icons/svgs/folder_ci.svg b/src/icons/svgs/folder_ci.svg new file mode 100644 index 0000000..3f1a7d1 --- /dev/null +++ b/src/icons/svgs/folder_ci.svg @@ -0,0 +1 @@ +folder_ci \ No newline at end of file diff --git a/src/icons/svgs/folder_ci_open.svg b/src/icons/svgs/folder_ci_open.svg new file mode 100644 index 0000000..3903ad8 --- /dev/null +++ b/src/icons/svgs/folder_ci_open.svg @@ -0,0 +1 @@ +folder_ci_open \ No newline at end of file diff --git a/src/icons/svgs/folder_dark.svg b/src/icons/svgs/folder_dark.svg new file mode 100644 index 0000000..9aa8535 --- /dev/null +++ b/src/icons/svgs/folder_dark.svg @@ -0,0 +1,10 @@ + + + + + + diff --git a/src/icons/svgs/folder_dark_build.svg b/src/icons/svgs/folder_dark_build.svg new file mode 100644 index 0000000..e894e15 --- /dev/null +++ b/src/icons/svgs/folder_dark_build.svg @@ -0,0 +1,15 @@ + + + + + + + + + diff --git a/src/icons/svgs/folder_dist.svg b/src/icons/svgs/folder_dist.svg new file mode 100644 index 0000000..a0537bd --- /dev/null +++ b/src/icons/svgs/folder_dist.svg @@ -0,0 +1 @@ +folder_dist \ No newline at end of file diff --git a/src/icons/svgs/folder_dist_open.svg b/src/icons/svgs/folder_dist_open.svg new file mode 100644 index 0000000..73a06ca --- /dev/null +++ b/src/icons/svgs/folder_dist_open.svg @@ -0,0 +1 @@ +folder_dist_open \ No newline at end of file diff --git a/src/icons/svgs/folder_git.svg b/src/icons/svgs/folder_git.svg new file mode 100644 index 0000000..28b1656 --- /dev/null +++ b/src/icons/svgs/folder_git.svg @@ -0,0 +1 @@ +folder_git \ No newline at end of file diff --git a/src/icons/svgs/folder_git_open.svg b/src/icons/svgs/folder_git_open.svg new file mode 100644 index 0000000..891e7d1 --- /dev/null +++ b/src/icons/svgs/folder_git_open.svg @@ -0,0 +1 @@ +folder_git_open \ No newline at end of file diff --git a/src/icons/svgs/folder_github.svg b/src/icons/svgs/folder_github.svg new file mode 100644 index 0000000..54fa0e2 --- /dev/null +++ b/src/icons/svgs/folder_github.svg @@ -0,0 +1 @@ +folder_github \ No newline at end of file diff --git a/src/icons/svgs/folder_github_open.svg b/src/icons/svgs/folder_github_open.svg new file mode 100644 index 0000000..cb0cfa7 --- /dev/null +++ b/src/icons/svgs/folder_github_open.svg @@ -0,0 +1 @@ +folder_github_open \ No newline at end of file diff --git a/src/icons/svgs/folder_gulp.svg b/src/icons/svgs/folder_gulp.svg new file mode 100644 index 0000000..c8c1f9f --- /dev/null +++ b/src/icons/svgs/folder_gulp.svg @@ -0,0 +1 @@ +folder_gulp \ No newline at end of file diff --git a/src/icons/svgs/folder_gulp_open.svg b/src/icons/svgs/folder_gulp_open.svg new file mode 100644 index 0000000..0d0b9cc --- /dev/null +++ b/src/icons/svgs/folder_gulp_open.svg @@ -0,0 +1 @@ +folder_gulp_open \ No newline at end of file diff --git a/src/icons/svgs/folder_images.svg b/src/icons/svgs/folder_images.svg new file mode 100644 index 0000000..e8bbe6e --- /dev/null +++ b/src/icons/svgs/folder_images.svg @@ -0,0 +1 @@ +folder_images \ No newline at end of file diff --git a/src/icons/svgs/folder_images_open.svg b/src/icons/svgs/folder_images_open.svg new file mode 100644 index 0000000..750b88c --- /dev/null +++ b/src/icons/svgs/folder_images_open.svg @@ -0,0 +1 @@ +folder_images_open \ No newline at end of file diff --git a/src/icons/svgs/folder_js.svg b/src/icons/svgs/folder_js.svg new file mode 100644 index 0000000..6c4c01d --- /dev/null +++ b/src/icons/svgs/folder_js.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svgs/folder_js_open.svg b/src/icons/svgs/folder_js_open.svg new file mode 100644 index 0000000..a4d7ef4 --- /dev/null +++ b/src/icons/svgs/folder_js_open.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svgs/folder_light.svg b/src/icons/svgs/folder_light.svg new file mode 100644 index 0000000..54846de --- /dev/null +++ b/src/icons/svgs/folder_light.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/folder_light_build.svg b/src/icons/svgs/folder_light_build.svg new file mode 100644 index 0000000..3cd3446 --- /dev/null +++ b/src/icons/svgs/folder_light_build.svg @@ -0,0 +1,13 @@ + + + + + + + diff --git a/src/icons/svgs/folder_node.svg b/src/icons/svgs/folder_node.svg new file mode 100644 index 0000000..72e6791 --- /dev/null +++ b/src/icons/svgs/folder_node.svg @@ -0,0 +1 @@ +folder_node \ No newline at end of file diff --git a/src/icons/svgs/folder_node_open.svg b/src/icons/svgs/folder_node_open.svg new file mode 100644 index 0000000..4e72e2f --- /dev/null +++ b/src/icons/svgs/folder_node_open.svg @@ -0,0 +1 @@ +folder_node_open \ No newline at end of file diff --git a/src/icons/svgs/folder_open.svg b/src/icons/svgs/folder_open.svg new file mode 100644 index 0000000..a59c192 --- /dev/null +++ b/src/icons/svgs/folder_open.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/folder_open_build.svg b/src/icons/svgs/folder_open_build.svg new file mode 100644 index 0000000..e7e86f4 --- /dev/null +++ b/src/icons/svgs/folder_open_build.svg @@ -0,0 +1,16 @@ + + + + + + + + + diff --git a/src/icons/svgs/folder_src.svg b/src/icons/svgs/folder_src.svg new file mode 100644 index 0000000..c9f63e1 --- /dev/null +++ b/src/icons/svgs/folder_src.svg @@ -0,0 +1 @@ +folder_src \ No newline at end of file diff --git a/src/icons/svgs/folder_src_open.svg b/src/icons/svgs/folder_src_open.svg new file mode 100644 index 0000000..0c8d18d --- /dev/null +++ b/src/icons/svgs/folder_src_open.svg @@ -0,0 +1 @@ +folder_src_open \ No newline at end of file diff --git a/src/icons/svgs/folder_test.svg b/src/icons/svgs/folder_test.svg new file mode 100644 index 0000000..6eac173 --- /dev/null +++ b/src/icons/svgs/folder_test.svg @@ -0,0 +1 @@ +folder_test \ No newline at end of file diff --git a/src/icons/svgs/folder_test_open.svg b/src/icons/svgs/folder_test_open.svg new file mode 100644 index 0000000..33163af --- /dev/null +++ b/src/icons/svgs/folder_test_open.svg @@ -0,0 +1 @@ +folder_test_open \ No newline at end of file diff --git a/src/icons/svgs/folder_vscode.svg b/src/icons/svgs/folder_vscode.svg new file mode 100644 index 0000000..99cca82 --- /dev/null +++ b/src/icons/svgs/folder_vscode.svg @@ -0,0 +1 @@ +folder_vscode \ No newline at end of file diff --git a/src/icons/svgs/folder_vscode_open.svg b/src/icons/svgs/folder_vscode_open.svg new file mode 100644 index 0000000..3beefea --- /dev/null +++ b/src/icons/svgs/folder_vscode_open.svg @@ -0,0 +1 @@ +folder_vscode_open \ No newline at end of file diff --git a/src/icons/svgs/font.svg b/src/icons/svgs/font.svg new file mode 100755 index 0000000..f7803b0 --- /dev/null +++ b/src/icons/svgs/font.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/fsharp.svg b/src/icons/svgs/fsharp.svg new file mode 100755 index 0000000..91ff767 --- /dev/null +++ b/src/icons/svgs/fsharp.svg @@ -0,0 +1,216 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/icons/svgs/git.svg b/src/icons/svgs/git.svg new file mode 100755 index 0000000..89a4c3c --- /dev/null +++ b/src/icons/svgs/git.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/github.svg b/src/icons/svgs/github.svg new file mode 100644 index 0000000..6edfae5 --- /dev/null +++ b/src/icons/svgs/github.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/gitlab.svg b/src/icons/svgs/gitlab.svg new file mode 100644 index 0000000..97835c6 --- /dev/null +++ b/src/icons/svgs/gitlab.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/icons/svgs/go.svg b/src/icons/svgs/go.svg new file mode 100644 index 0000000..2e1a0d0 --- /dev/null +++ b/src/icons/svgs/go.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/gopher.svg b/src/icons/svgs/gopher.svg new file mode 100755 index 0000000..fc0694c --- /dev/null +++ b/src/icons/svgs/gopher.svg @@ -0,0 +1,167 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/svgs/gradle.svg b/src/icons/svgs/gradle.svg new file mode 100755 index 0000000..d4bc84b --- /dev/null +++ b/src/icons/svgs/gradle.svg @@ -0,0 +1,439 @@ + + + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/icons/svgs/graphql.svg b/src/icons/svgs/graphql.svg new file mode 100644 index 0000000..8df1b04 --- /dev/null +++ b/src/icons/svgs/graphql.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/icons/svgs/groovy.svg b/src/icons/svgs/groovy.svg new file mode 100755 index 0000000..3e71e81 --- /dev/null +++ b/src/icons/svgs/groovy.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/icons/svgs/grunt.svg b/src/icons/svgs/grunt.svg new file mode 100644 index 0000000..94a8442 --- /dev/null +++ b/src/icons/svgs/grunt.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/gulp.svg b/src/icons/svgs/gulp.svg new file mode 100755 index 0000000..eb07242 --- /dev/null +++ b/src/icons/svgs/gulp.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/haml.svg b/src/icons/svgs/haml.svg new file mode 100644 index 0000000..aa23f66 --- /dev/null +++ b/src/icons/svgs/haml.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/icons/svgs/haskell.svg b/src/icons/svgs/haskell.svg new file mode 100755 index 0000000..33aef54 --- /dev/null +++ b/src/icons/svgs/haskell.svg @@ -0,0 +1,75 @@ + + + + + + image/svg+xml + + + + + + + + y + + + diff --git a/src/icons/svgs/html.svg b/src/icons/svgs/html.svg new file mode 100755 index 0000000..a73de36 --- /dev/null +++ b/src/icons/svgs/html.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/image.svg b/src/icons/svgs/image.svg new file mode 100755 index 0000000..c37763f --- /dev/null +++ b/src/icons/svgs/image.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/ionic.svg b/src/icons/svgs/ionic.svg new file mode 100755 index 0000000..d808a7e --- /dev/null +++ b/src/icons/svgs/ionic.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/java.svg b/src/icons/svgs/java.svg new file mode 100755 index 0000000..c3187c6 --- /dev/null +++ b/src/icons/svgs/java.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/javascript-map.svg b/src/icons/svgs/javascript-map.svg new file mode 100755 index 0000000..4be7d30 --- /dev/null +++ b/src/icons/svgs/javascript-map.svg @@ -0,0 +1,59 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/icons/svgs/js.svg b/src/icons/svgs/js.svg new file mode 100644 index 0000000..5496e57 --- /dev/null +++ b/src/icons/svgs/js.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/json.svg b/src/icons/svgs/json.svg new file mode 100755 index 0000000..3390382 --- /dev/null +++ b/src/icons/svgs/json.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/key.svg b/src/icons/svgs/key.svg new file mode 100755 index 0000000..b064be4 --- /dev/null +++ b/src/icons/svgs/key.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/kotlin.svg b/src/icons/svgs/kotlin.svg new file mode 100755 index 0000000..6555b58 --- /dev/null +++ b/src/icons/svgs/kotlin.svg @@ -0,0 +1,108 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/svgs/less.svg b/src/icons/svgs/less.svg new file mode 100644 index 0000000..3fbe602 --- /dev/null +++ b/src/icons/svgs/less.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/lib.svg b/src/icons/svgs/lib.svg new file mode 100755 index 0000000..83f2b8d --- /dev/null +++ b/src/icons/svgs/lib.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/license.svg b/src/icons/svgs/license.svg new file mode 100644 index 0000000..56f79ca --- /dev/null +++ b/src/icons/svgs/license.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/lua.svg b/src/icons/svgs/lua.svg new file mode 100755 index 0000000..f460949 --- /dev/null +++ b/src/icons/svgs/lua.svg @@ -0,0 +1,70 @@ + + + + + + image/svg+xml + + + + + + + + + + + diff --git a/src/icons/svgs/markdown.svg b/src/icons/svgs/markdown.svg new file mode 100755 index 0000000..18cdeaf --- /dev/null +++ b/src/icons/svgs/markdown.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/markup.svg b/src/icons/svgs/markup.svg new file mode 100644 index 0000000..25ac918 --- /dev/null +++ b/src/icons/svgs/markup.svg @@ -0,0 +1,8 @@ + + + + + + + + diff --git a/src/icons/svgs/movie.svg b/src/icons/svgs/movie.svg new file mode 100755 index 0000000..8812c84 --- /dev/null +++ b/src/icons/svgs/movie.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/music.svg b/src/icons/svgs/music.svg new file mode 100755 index 0000000..f01eb9a --- /dev/null +++ b/src/icons/svgs/music.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/mustache.svg b/src/icons/svgs/mustache.svg new file mode 100644 index 0000000..e4c9d3e --- /dev/null +++ b/src/icons/svgs/mustache.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/mxml.svg b/src/icons/svgs/mxml.svg new file mode 100755 index 0000000..4c57bb0 --- /dev/null +++ b/src/icons/svgs/mxml.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/node.svg b/src/icons/svgs/node.svg new file mode 100644 index 0000000..7a3f96d --- /dev/null +++ b/src/icons/svgs/node.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/nodejs.svg b/src/icons/svgs/nodejs.svg new file mode 100644 index 0000000..c8cd6a0 --- /dev/null +++ b/src/icons/svgs/nodejs.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/npm.svg b/src/icons/svgs/npm.svg new file mode 100644 index 0000000..dcedb81 --- /dev/null +++ b/src/icons/svgs/npm.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/ocaml.svg b/src/icons/svgs/ocaml.svg new file mode 100755 index 0000000..12c4dd4 --- /dev/null +++ b/src/icons/svgs/ocaml.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/package-lock.svg b/src/icons/svgs/package-lock.svg new file mode 100644 index 0000000..bd442cb --- /dev/null +++ b/src/icons/svgs/package-lock.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/pdf.svg b/src/icons/svgs/pdf.svg new file mode 100755 index 0000000..89a2e80 --- /dev/null +++ b/src/icons/svgs/pdf.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/php.svg b/src/icons/svgs/php.svg new file mode 100755 index 0000000..8af9132 --- /dev/null +++ b/src/icons/svgs/php.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/polymer.svg b/src/icons/svgs/polymer.svg new file mode 100644 index 0000000..e6db669 --- /dev/null +++ b/src/icons/svgs/polymer.svg @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/svgs/postcss.svg b/src/icons/svgs/postcss.svg new file mode 100644 index 0000000..f9b3012 --- /dev/null +++ b/src/icons/svgs/postcss.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/powerpoint.svg b/src/icons/svgs/powerpoint.svg new file mode 100755 index 0000000..4de60cc --- /dev/null +++ b/src/icons/svgs/powerpoint.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/pp.svg b/src/icons/svgs/pp.svg new file mode 100644 index 0000000..46152e1 --- /dev/null +++ b/src/icons/svgs/pp.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/icons/svgs/procfile.svg b/src/icons/svgs/procfile.svg new file mode 100644 index 0000000..d0cc0fe --- /dev/null +++ b/src/icons/svgs/procfile.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/pug.svg b/src/icons/svgs/pug.svg new file mode 100755 index 0000000..8dfa46a --- /dev/null +++ b/src/icons/svgs/pug.svg @@ -0,0 +1,11 @@ + + + + + + + + + + + diff --git a/src/icons/svgs/python.svg b/src/icons/svgs/python.svg new file mode 100755 index 0000000..5643e9c --- /dev/null +++ b/src/icons/svgs/python.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/r.svg b/src/icons/svgs/r.svg new file mode 100755 index 0000000..796bf62 --- /dev/null +++ b/src/icons/svgs/r.svg @@ -0,0 +1,58 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/icons/svgs/rails.svg b/src/icons/svgs/rails.svg new file mode 100644 index 0000000..37f1b6f --- /dev/null +++ b/src/icons/svgs/rails.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/raml.svg b/src/icons/svgs/raml.svg new file mode 100755 index 0000000..30d0b9b --- /dev/null +++ b/src/icons/svgs/raml.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/react.svg b/src/icons/svgs/react.svg new file mode 100755 index 0000000..95fdef4 --- /dev/null +++ b/src/icons/svgs/react.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/readme.svg b/src/icons/svgs/readme.svg new file mode 100755 index 0000000..2836de7 --- /dev/null +++ b/src/icons/svgs/readme.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/reason.svg b/src/icons/svgs/reason.svg new file mode 100644 index 0000000..48239c6 --- /dev/null +++ b/src/icons/svgs/reason.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/rollup.svg b/src/icons/svgs/rollup.svg new file mode 100644 index 0000000..0fdb662 --- /dev/null +++ b/src/icons/svgs/rollup.svg @@ -0,0 +1,38 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/svgs/ruby.svg b/src/icons/svgs/ruby.svg new file mode 100755 index 0000000..e91a776 --- /dev/null +++ b/src/icons/svgs/ruby.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/rust.svg b/src/icons/svgs/rust.svg new file mode 100755 index 0000000..002dcdc --- /dev/null +++ b/src/icons/svgs/rust.svg @@ -0,0 +1,80 @@ + + + + + + image/svg+xml + + + + + + + + + + R + + + diff --git a/src/icons/svgs/sass.svg b/src/icons/svgs/sass.svg new file mode 100755 index 0000000..4e448be --- /dev/null +++ b/src/icons/svgs/sass.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/scala.svg b/src/icons/svgs/scala.svg new file mode 100644 index 0000000..16377cc --- /dev/null +++ b/src/icons/svgs/scala.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/settings.svg b/src/icons/svgs/settings.svg new file mode 100755 index 0000000..9cb4121 --- /dev/null +++ b/src/icons/svgs/settings.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/sketch.svg b/src/icons/svgs/sketch.svg new file mode 100644 index 0000000..61b3083 --- /dev/null +++ b/src/icons/svgs/sketch.svg @@ -0,0 +1,12 @@ + + + + + + + + + + + + diff --git a/src/icons/svgs/star.svg b/src/icons/svgs/star.svg new file mode 100755 index 0000000..ab4fcad --- /dev/null +++ b/src/icons/svgs/star.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/icons/svgs/stylelint.svg b/src/icons/svgs/stylelint.svg new file mode 100644 index 0000000..0900563 --- /dev/null +++ b/src/icons/svgs/stylelint.svg @@ -0,0 +1,10 @@ + + + + + + + + + + diff --git a/src/icons/svgs/stylus.svg b/src/icons/svgs/stylus.svg new file mode 100644 index 0000000..5ff74bf --- /dev/null +++ b/src/icons/svgs/stylus.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/icons/svgs/sublime.svg b/src/icons/svgs/sublime.svg new file mode 100644 index 0000000..8a9d10f --- /dev/null +++ b/src/icons/svgs/sublime.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/svg.svg b/src/icons/svgs/svg.svg new file mode 100644 index 0000000..dd0f1e0 --- /dev/null +++ b/src/icons/svgs/svg.svg @@ -0,0 +1,21 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/src/icons/svgs/swc.svg b/src/icons/svgs/swc.svg new file mode 100755 index 0000000..1992020 --- /dev/null +++ b/src/icons/svgs/swc.svg @@ -0,0 +1,82 @@ + + + + + + image/svg+xml + + + + + + + + + + + + + + + diff --git a/src/icons/svgs/swift.svg b/src/icons/svgs/swift.svg new file mode 100755 index 0000000..ff72dcd --- /dev/null +++ b/src/icons/svgs/swift.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/swig.svg b/src/icons/svgs/swig.svg new file mode 100644 index 0000000..5e20edf --- /dev/null +++ b/src/icons/svgs/swig.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/table.svg b/src/icons/svgs/table.svg new file mode 100755 index 0000000..180c0ed --- /dev/null +++ b/src/icons/svgs/table.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/tex.svg b/src/icons/svgs/tex.svg new file mode 100755 index 0000000..4739d69 --- /dev/null +++ b/src/icons/svgs/tex.svg @@ -0,0 +1,93 @@ + +image/svg+xml + + + + T +E +X + + \ No newline at end of file diff --git a/src/icons/svgs/todo.svg b/src/icons/svgs/todo.svg new file mode 100644 index 0000000..515e729 --- /dev/null +++ b/src/icons/svgs/todo.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/tune.svg b/src/icons/svgs/tune.svg new file mode 100755 index 0000000..27ca8a3 --- /dev/null +++ b/src/icons/svgs/tune.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/icons/svgs/twig.svg b/src/icons/svgs/twig.svg new file mode 100644 index 0000000..175242c --- /dev/null +++ b/src/icons/svgs/twig.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/typescript.svg b/src/icons/svgs/typescript.svg new file mode 100755 index 0000000..67bfb63 --- /dev/null +++ b/src/icons/svgs/typescript.svg @@ -0,0 +1,57 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/typescript_def.svg b/src/icons/svgs/typescript_def.svg new file mode 100755 index 0000000..15f4410 --- /dev/null +++ b/src/icons/svgs/typescript_def.svg @@ -0,0 +1,72 @@ + + + + + + image/svg+xml + + + + + + + + + TS + + diff --git a/src/icons/svgs/url.svg b/src/icons/svgs/url.svg new file mode 100755 index 0000000..df17496 --- /dev/null +++ b/src/icons/svgs/url.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/virtual.svg b/src/icons/svgs/virtual.svg new file mode 100755 index 0000000..6b958b0 --- /dev/null +++ b/src/icons/svgs/virtual.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/visualstudio.svg b/src/icons/svgs/visualstudio.svg new file mode 100755 index 0000000..58674de --- /dev/null +++ b/src/icons/svgs/visualstudio.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/vue.svg b/src/icons/svgs/vue.svg new file mode 100755 index 0000000..c0b54ee --- /dev/null +++ b/src/icons/svgs/vue.svg @@ -0,0 +1,60 @@ + + + + + + image/svg+xml + + + + + + + + + diff --git a/src/icons/svgs/webpack.svg b/src/icons/svgs/webpack.svg new file mode 100755 index 0000000..5d5ac7b --- /dev/null +++ b/src/icons/svgs/webpack.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/word.svg b/src/icons/svgs/word.svg new file mode 100755 index 0000000..daa938b --- /dev/null +++ b/src/icons/svgs/word.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/xaml.svg b/src/icons/svgs/xaml.svg new file mode 100755 index 0000000..77a1808 --- /dev/null +++ b/src/icons/svgs/xaml.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/xml.svg b/src/icons/svgs/xml.svg new file mode 100755 index 0000000..bf2d3f2 --- /dev/null +++ b/src/icons/svgs/xml.svg @@ -0,0 +1,54 @@ + + + + + + image/svg+xml + + + + + + + + diff --git a/src/icons/svgs/yaml.svg b/src/icons/svgs/yaml.svg new file mode 100755 index 0000000..e19a2b5 --- /dev/null +++ b/src/icons/svgs/yaml.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/yarn-lock.svg b/src/icons/svgs/yarn-lock.svg new file mode 100644 index 0000000..8f27189 --- /dev/null +++ b/src/icons/svgs/yarn-lock.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/yarn.svg b/src/icons/svgs/yarn.svg new file mode 100755 index 0000000..aee195b --- /dev/null +++ b/src/icons/svgs/yarn.svg @@ -0,0 +1,3 @@ + + + diff --git a/src/icons/svgs/zephyr.svg b/src/icons/svgs/zephyr.svg new file mode 100644 index 0000000..c113cdc --- /dev/null +++ b/src/icons/svgs/zephyr.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/src/icons/svgs/zip.svg b/src/icons/svgs/zip.svg new file mode 100755 index 0000000..c1cf4bc --- /dev/null +++ b/src/icons/svgs/zip.svg @@ -0,0 +1,7 @@ + + + + + + + diff --git a/src/themes/settings/specific/darker-hc.json b/src/themes/settings/specific/darker-hc.json new file mode 100644 index 0000000..55e75ce --- /dev/null +++ b/src/themes/settings/specific/darker-hc.json @@ -0,0 +1,45 @@ +{ + "id": "material.theme.darker.hc", + "name": "Material-Theme-Darker-High-Contrast", + "type": "dark", + "scheme": { + "background": "#212121", + "backgroundAlt": "#1a1a1a", + "contrastBorder": "#000000", + "sidebarForeground": "#848484", + "scrollbars": "#00000070", + "comments": "#4A4A4A", + "caret": "#FFCC00", + "findHighlight": "#FFCC00", + "foreground": "#EEFFFF", + "focusBorder": "#FFFFFF", + "guides": "#42424270", + "lineNumbers": "#424242", + "invisibles": "#65737E", + "lineHighlight": "#000000", + "selection": "#61616150", + "shadow": "#00000030", + "inputBackground": "#FFFFFF05", + "inputForeground": "#EEFFFF", + "inputBorder": "#FFFFFF10", + "scrollbarsHover": "#00000030", + "statusbarForeground": "#616161", + "listHoverForeground": "#FFFFFF", + "tabActiveForeground": "#FFFFFF", + "base": { + "white": "#ffffff", + "black": "#000000", + "red": "#FF5370", + "orange": "#F78C6C", + "yellow": "#FFCB6B", + "green": "#C3E88D", + "cyan": "#89DDFF", + "blue": "#82AAFF", + "paleblue": "#B2CCD6", + "purple": "#C792EA", + "brown": "#C17E70", + "pink": "#f07178", + "violet": "#bb80b3" + } + } +} diff --git a/src/themes/settings/specific/darker.json b/src/themes/settings/specific/darker.json new file mode 100644 index 0000000..3ad4453 --- /dev/null +++ b/src/themes/settings/specific/darker.json @@ -0,0 +1,47 @@ +{ + "id": "material.theme.darker", + "name": "Material-Theme-Darker", + "type": "dark", + "scheme": { + "background": "#212121", + "backgroundAlt": "#212121", + "contrastBorder": "#212121", + "comments": "#4A4A4A", + "caret": "#FFCC00", + "findHighlight": "#FFCC00", + "foreground": "#EEFFFF", + "focusBorder": "#FFFFFF", + "guides": "#42424270", + "lineNumbers": "#424242", + "invisibles": "#65737E", + "lineHighlight": "#000000", + "selection": "#61616150", + "shadow": "#00000030", + "inputBackground": "#FFFFFF05", + "inputForeground": "#EEFFFF", + "inputBorder": "#FFFFFF10", + "scrollbars": "#00000050", + "scrollbarsHover": "#00000030", + "statusbarForeground": "#616161", + "sidebarBackground": "#212121", + "sidebarForeground": "#616161", + "listHoverForeground": "#FFFFFF", + "listHoverBackground": "#212121", + "tabActiveForeground": "#FFFFFF", + "base": { + "white": "#ffffff", + "black": "#000000", + "red": "#FF5370", + "orange": "#F78C6C", + "yellow": "#FFCB6B", + "green": "#C3E88D", + "cyan": "#89DDFF", + "blue": "#82AAFF", + "paleblue": "#B2CCD6", + "purple": "#C792EA", + "brown": "#C17E70", + "pink": "#f07178", + "violet": "#bb80b3" + } + } +} diff --git a/src/themes/settings/specific/default-hc.json b/src/themes/settings/specific/default-hc.json new file mode 100644 index 0000000..33ea46e --- /dev/null +++ b/src/themes/settings/specific/default-hc.json @@ -0,0 +1,47 @@ +{ + "id": "material.theme.default.hc", + "name": "Material-Theme-Default-High-Contrast", + "type": "dark", + "scheme": { + "background": "#263238", + "backgroundAlt": "#192227", + "contrastBorder": "#000000", + "scrollbars": "#00000070", + "sidebarForeground": "#5f7a87", + "comments": "#546E7A", + "caret": "#FFCC00", + "findHighlight": "#FFCC00", + "foreground": "#EEFFFF", + "focusBorder": "#FFFFFF", + "guides": "#37474F80", + "lineNumbers": "#37474F", + "invisibles": "#65737E", + "lineHighlight": "#000000", + "selection": "#80CBC420", + "shadow": "#00000030", + "inputBackground": "#FFFFFF05", + "inputForeground": "#EEFFFF", + "inputBorder": "#FFFFFF10", + "scrollbarsHover": "#00000030", + "statusbarForeground": "#546E7A", + "sidebarBackground": "#263238", + "listHoverForeground": "#FFFFFF", + "listHoverBackground": "#263238", + "tabActiveForeground": "#FFFFFF", + "base": { + "white": "#ffffff", + "black": "#000000", + "red": "#FF5370", + "orange": "#F78C6C", + "yellow": "#FFCB6B", + "green": "#C3E88D", + "cyan": "#89DDFF", + "blue": "#82AAFF", + "paleblue": "#B2CCD6", + "purple": "#C792EA", + "brown": "#C17E70", + "pink": "#f07178", + "violet": "#bb80b3" + } + } +} diff --git a/src/themes/settings/specific/default.json b/src/themes/settings/specific/default.json new file mode 100644 index 0000000..b3059f1 --- /dev/null +++ b/src/themes/settings/specific/default.json @@ -0,0 +1,47 @@ +{ + "id": "material.theme.default", + "name": "Material-Theme-Default", + "type": "dark", + "scheme": { + "background": "#263238", + "backgroundAlt": "#263238", + "contrastBorder": "#263238", + "comments": "#546E7A", + "caret": "#FFCC00", + "findHighlight": "#FFCC00", + "foreground": "#EEFFFF", + "focusBorder": "#FFFFFF", + "guides": "#37474F80", + "lineNumbers": "#37474F", + "invisibles": "#65737E", + "lineHighlight": "#000000", + "selection": "#80CBC420", + "shadow": "#00000030", + "inputBackground": "#FFFFFF05", + "inputForeground": "#EEFFFF", + "inputBorder": "#FFFFFF10", + "scrollbars": "#00000050", + "scrollbarsHover": "#00000030", + "statusbarForeground": "#546E7A", + "sidebarBackground": "#263238", + "sidebarForeground": "#607a86", + "listHoverForeground": "#FFFFFF", + "listHoverBackground": "#263238", + "tabActiveForeground": "#FFFFFF", + "base": { + "white": "#ffffff", + "black": "#000000", + "red": "#FF5370", + "orange": "#F78C6C", + "yellow": "#FFCB6B", + "green": "#C3E88D", + "cyan": "#89DDFF", + "blue": "#82AAFF", + "paleblue": "#B2CCD6", + "purple": "#C792EA", + "brown": "#C17E70", + "pink": "#f07178", + "violet": "#bb80b3" + } + } +} diff --git a/src/themes/settings/specific/lighter-hc.json b/src/themes/settings/specific/lighter-hc.json new file mode 100644 index 0000000..c96e4c5 --- /dev/null +++ b/src/themes/settings/specific/lighter-hc.json @@ -0,0 +1,47 @@ +{ + "id": "material.theme.lighter.hc", + "name": "Material-Theme-Lighter-High-Contrast", + "type": "light", + "scheme": { + "background": "#FFFFFF", + "backgroundAlt": "#FAFAFA", + "contrastBorder": "#CBCBCB", + "scrollbars": "#00000040", + "sidebarForeground": "#627883", + "comments": "#90A4AE90", + "caret": "#272727", + "findHighlight": "#FFCC00", + "foreground": "#90A4AE", + "focusBorder": "#FFFFFF", + "guides": "#B0BEC570", + "lineNumbers": "#CFD8DC", + "invisibles": "#E7EAEC", + "lineHighlight": "#CCD7DA", + "selection": "#80CBC440", + "shadow": "#00000020", + "inputBackground": "#00000005", + "inputForeground": "#90A4AE", + "inputBorder": "#00000010", + "scrollbarsHover": "#00000030", + "statusbarForeground": "#7E939E", + "sidebarBackground": "#FAFAFA", + "listHoverForeground": "#B1C7D3", + "listHoverBackground": "#FAFAFA", + "tabActiveForeground": "#000000", + "base": { + "white": "#FFFFFF", + "black": "#000000", + "red": "#E53935", + "orange": "#F76D47", + "yellow": "#FFB62C", + "green": "#91B859", + "cyan": "#39ADB5", + "blue": "#6182B8", + "paleblue": "#8796B0", + "purple": "#7C4DFF", + "brown": "#C17E70", + "pink": "#FF5370", + "violet": "#945EB8" + } + } +} \ No newline at end of file diff --git a/src/themes/settings/specific/lighter.json b/src/themes/settings/specific/lighter.json new file mode 100644 index 0000000..207daf7 --- /dev/null +++ b/src/themes/settings/specific/lighter.json @@ -0,0 +1,47 @@ +{ + "id": "material.theme.lighter", + "name": "Material-Theme-Lighter", + "type": "light", + "scheme": { + "background": "#FAFAFA", + "backgroundAlt": "#FAFAFA", + "contrastBorder": "#FAFAFA", + "comments": "#90A4AE90", + "caret": "#272727", + "findHighlight": "#FFCC00", + "foreground": "#90A4AE", + "focusBorder": "#FFFFFF", + "guides": "#B0BEC570", + "lineNumbers": "#CFD8DC", + "invisibles": "#E7EAEC", + "lineHighlight": "#CCD7DA", + "selection": "#80CBC440", + "shadow": "#00000020", + "inputBackground": "#00000005", + "inputForeground": "#90A4AE", + "inputBorder": "#00000010", + "scrollbars": "#00000050", + "scrollbarsHover": "#00000030", + "statusbarForeground": "#7E939E", + "sidebarBackground": "#FAFAFA", + "sidebarForeground": "#7E939E", + "listHoverForeground": "#B1C7D3", + "listHoverBackground": "#FAFAFA", + "tabActiveForeground": "#000000", + "base": { + "white": "#FFFFFF", + "black": "#000000", + "red": "#E53935", + "orange": "#F76D47", + "yellow": "#FFB62C", + "green": "#91B859", + "cyan": "#39ADB5", + "blue": "#6182B8", + "paleblue": "#8796B0", + "purple": "#7C4DFF", + "brown": "#C17E70", + "pink": "#FF5370", + "violet": "#945EB8" + } + } +} \ No newline at end of file diff --git a/src/themes/settings/specific/palenight-hc.json b/src/themes/settings/specific/palenight-hc.json new file mode 100644 index 0000000..324f912 --- /dev/null +++ b/src/themes/settings/specific/palenight-hc.json @@ -0,0 +1,47 @@ +{ + "id": "material.theme.palenight.hc", + "name": "Material-Theme-Palenight-High-Contrast", + "type": "dark", + "scheme": { + "background": "#292D3E", + "backgroundAlt": "#1B1E2B", + "contrastBorder": "#000000", + "scrollbars": "#00000070", + "sidebarForeground": "#757CA1", + "comments": "#676E95", + "caret": "#FFCC00", + "findHighlight": "#FFCC00", + "foreground": "#A6ACCD", + "focusBorder": "#FFFFFF", + "guides": "#4E557980", + "lineNumbers": "#3A3F58", + "invisibles": "#4E5579", + "lineHighlight": "#000000", + "selection": "#717CB450", + "shadow": "#00000030", + "inputBackground": "#FFFFFF05", + "inputForeground": "#EEFFFF", + "inputBorder": "#FFFFFF10", + "scrollbarsHover": "#00000030", + "statusbarForeground": "#676E95", + "sidebarBackground": "#292D3E", + "listHoverForeground": "#FFFFFF", + "listHoverBackground": "#292D3E", + "tabActiveForeground": "#FFFFFF", + "base": { + "white": "#ffffff", + "black": "#000000", + "red": "#FF5370", + "orange": "#F78C6C", + "yellow": "#FFCB6B", + "green": "#C3E88D", + "cyan": "#89DDFF", + "blue": "#82AAFF", + "paleblue": "#B2CCD6", + "purple": "#C792EA", + "brown": "#C17E70", + "pink": "#f07178", + "violet": "#bb80b3" + } + } +} \ No newline at end of file diff --git a/src/themes/settings/specific/palenight.json b/src/themes/settings/specific/palenight.json new file mode 100644 index 0000000..8d9f211 --- /dev/null +++ b/src/themes/settings/specific/palenight.json @@ -0,0 +1,47 @@ +{ + "id": "material.theme.palenight", + "name": "Material-Theme-Palenight", + "type": "dark", + "scheme": { + "background": "#292D3E", + "backgroundAlt": "#292D3E", + "contrastBorder": "#292D3E", + "comments": "#676E95", + "caret": "#FFCC00", + "findHighlight": "#FFCC00", + "foreground": "#A6ACCD", + "focusBorder": "#FFFFFF", + "guides": "#4E557980", + "lineNumbers": "#3A3F58", + "invisibles": "#4E5579", + "lineHighlight": "#000000", + "selection": "#717CB450", + "shadow": "#00000030", + "inputBackground": "#FFFFFF05", + "inputForeground": "#EEFFFF", + "inputBorder": "#FFFFFF10", + "scrollbars": "#00000050", + "scrollbarsHover": "#00000030", + "statusbarForeground": "#676E95", + "sidebarBackground": "#292D3E", + "sidebarForeground": "#676E95", + "listHoverForeground": "#FFFFFF", + "listHoverBackground": "#292D3E", + "tabActiveForeground": "#FFFFFF", + "base": { + "white": "#ffffff", + "black": "#000000", + "red": "#FF5370", + "orange": "#F78C6C", + "yellow": "#FFCB6B", + "green": "#C3E88D", + "cyan": "#89DDFF", + "blue": "#82AAFF", + "paleblue": "#B2CCD6", + "purple": "#C792EA", + "brown": "#C17E70", + "pink": "#f07178", + "violet": "#bb80b3" + } + } +} \ No newline at end of file diff --git a/src/themes/theme-template-color-theme.json b/src/themes/theme-template-color-theme.json new file mode 100644 index 0000000..51ad483 --- /dev/null +++ b/src/themes/theme-template-color-theme.json @@ -0,0 +1,821 @@ +{ + "name": "{{variant.name}}", + "type": "{{variant.type}}", + "tokenColors": [ + { + "settings": { + "background": "{{variant.scheme.background}}", + "foreground": "{{variant.scheme.base.white}}" + } + }, + { + "name": "Comment", + "scope": [ + "comment", + "punctuation.definition.comment" + ], + "settings": { + "fontStyle": "italic", + "foreground": "{{variant.scheme.comments}}" + } + }, + { + "name": "Variables", + "scope": [ + "variable", + "string constant.other.placeholder" + ], + "settings": { + "foreground": "{{variant.scheme.foreground}}" + } + }, + { + "name": "PHP Constants", + "scope": [ + "constant.other.php" + ], + "settings": { + "foreground": "{{variant.scheme.base.yellow}}" + } + }, + { + "name": "Colors", + "scope": [ + "constant.other.color" + ], + "settings": { + "foreground": "{{variant.scheme.base.white}}" + } + }, + { + "name": "Invalid", + "scope": [ + "invalid", + "invalid.illegal" + ], + "settings": { + "foreground": "{{variant.scheme.base.red}}" + } + }, + { + "name": "Invalid deprecated", + "scope": [ + "invalid.deprecated" + ], + "settings": { + "foreground": "{{variant.scheme.base.purple}}" + } + }, + { + "name": "Keyword, Storage", + "scope": [ + "keyword", + "storage.type", + "storage.modifier" + ], + "settings": { + "foreground": "{{variant.scheme.base.purple}}" + } + }, + { + "name": "Keyword, Storage", + "scope": [ + "Keyword", + "Storage" + ], + "settings": { + "fontStyle": "italic" + } + }, + { + "name": "Operator, Misc", + "scope": [ + "keyword.control", + "constant.other.color", + "punctuation", + "meta.tag", + "punctuation.definition.tag", + "punctuation.separator.inheritance.php", + "punctuation.definition.tag.html", + "punctuation.definition.tag.begin.html", + "punctuation.definition.tag.end.html", + "punctuation.section.embedded", + "keyword.other.template", + "keyword.other.substitution" + ], + "settings": { + "foreground": "{{variant.scheme.base.cyan}}" + } + }, + { + "name": "Keyword Control", + "scope": [ + "keyword.control" + ], + "settings": { + "fontStyle": "italic" + } + }, + { + "name": "Tag", + "scope": [ + "entity.name.tag", + "meta.tag.sgml", + "markup.deleted.git_gutter" + ], + "settings": { + "foreground": "{{variant.scheme.base.pink}}" + } + }, + { + "name": "Function, Special Method", + "scope": [ + "entity.name.function", + "meta.function-call", + "variable.function", + "support.function", + "keyword.other.special-method" + ], + "settings": { + "foreground": "{{variant.scheme.base.blue}}" + } + }, + { + "name": "C-related Block Level Variables", + "scope": [ + "source.cpp meta.block variable.other" + ], + "settings": { + "foreground": "{{variant.scheme.base.pink}}" + } + }, + { + "name": "Variables constant", + "scope": [ + "variable.other.constant" + ], + "settings": { + "foreground": "{{variant.scheme.base.pink}}" + } + }, + { + "name": "Other Variable, String Link", + "scope": [ + "support.other.variable", + "string.other.link" + ], + "settings": { + "foreground": "{{variant.scheme.base.pink}}" + } + }, + { + "name": "Number, Constant, Function Argument, Tag Attribute, Embedded", + "scope": [ + "constant.numeric", + "constant.language", + "support.constant", + "constant.character", + "constant.escape", + "variable.parameter", + "keyword.other.unit", + "keyword.other" + ], + "settings": { + "foreground": "{{variant.scheme.base.orange}}" + } + }, + { + "name": "Number, Constant, Function Argument, Tag Attribute, Embedded", + "scope": [ + "variable.parameter.function.language.special" + ], + "settings": { + "foreground": "{{variant.scheme.base.red}}" + } + }, + { + "name": "String, Symbols, Inherited Class, Markup Heading", + "scope": [ + "string", + "constant.other.symbol", + "constant.other.key", + "entity.other.inherited-class", + "markup.heading", + "markup.inserted.git_gutter", + "meta.group.braces.curly constant.other.object.key.js string.unquoted.label.js" + ], + "settings": { + "fontStyle": "normal", + "foreground": "{{variant.scheme.base.green}}" + } + }, + { + "name": "Class, Support", + "scope": [ + "entity.name", + "support.type", + "support.class", + "support.orther.namespace.use.php", + "meta.use.php", + "support.other.namespace.php", + "markup.changed.git_gutter", + "support.type.sys-types" + ], + "settings": { + "foreground": "{{variant.scheme.base.yellow}}" + } + }, + { + "name": "Entity Types", + "scope": [ + "support.type" + ], + "settings": { + "foreground": "{{variant.scheme.base.paleblue}}" + } + }, + { + "name": "CSS Class and Support", + "scope": [ + "source.css support.type.property-name", + "source.sass support.type.property-name", + "source.scss support.type.property-name", + "source.less support.type.property-name", + "source.stylus support.type.property-name", + "source.postcss support.type.property-name" + ], + "settings": { + "foreground": "{{variant.scheme.base.paleblue}}" + } + }, + { + "name": "Sub-methods", + "scope": [ + "entity.name.module.js", + "variable.import.parameter.js", + "variable.other.class.js" + ], + "settings": { + "foreground": "{{variant.scheme.base.red}}" + } + }, + { + "name": "Language methods", + "scope": [ + "variable.language" + ], + "settings": { + "fontStyle": "italic", + "foreground": "{{variant.scheme.base.red}}" + } + }, + { + "name": "entity.name.method.js", + "scope": [ + "entity.name.method.js" + ], + "settings": { + "fontStyle": "italic", + "foreground": "{{variant.scheme.base.blue}}" + } + }, + { + "name": "meta.method.js", + "scope": [ + "meta.class-method.js entity.name.function.js", + "variable.function.constructor" + ], + "settings": { + "foreground": "{{variant.scheme.base.blue}}" + } + }, + { + "name": "Attributes", + "scope": [ + "entity.other.attribute-name" + ], + "settings": { + "foreground": "{{variant.scheme.base.purple}}" + } + }, + { + "name": "HTML Attributes", + "scope": [ + "text.html.basic entity.other.attribute-name.html", + "text.html.basic entity.other.attribute-name" + ], + "settings": { + "fontStyle": "italic", + "foreground": "{{variant.scheme.base.yellow}}" + } + }, + { + "name": "CSS Classes", + "scope": [ + "entity.other.attribute-name.class" + ], + "settings": { + "foreground": "{{variant.scheme.base.yellow}}" + } + }, + { + "name": "CSS ID's", + "scope": [ + "source.sass keyword.control" + ], + "settings": { + "foreground": "{{variant.scheme.base.blue}}" + } + }, + { + "name": "Inserted", + "scope": [ + "markup.inserted" + ], + "settings": { + "foreground": "{{variant.scheme.base.green}}" + } + }, + { + "name": "Deleted", + "scope": [ + "markup.deleted" + ], + "settings": { + "foreground": "{{variant.scheme.base.red}}" + } + }, + { + "name": "Changed", + "scope": [ + "markup.changed" + ], + "settings": { + "foreground": "{{variant.scheme.base.purple}}" + } + }, + { + "name": "Regular Expressions", + "scope": [ + "string.regexp" + ], + "settings": { + "foreground": "{{variant.scheme.base.cyan}}" + } + }, + { + "name": "Escape Characters", + "scope": [ + "constant.character.escape" + ], + "settings": { + "foreground": "{{variant.scheme.base.cyan}}" + } + }, + { + "name": "URL", + "scope": [ + "*url*", + "*link*", + "*uri*" + ], + "settings": { + "fontStyle": "underline" + } + }, + { + "name": "Decorators", + "scope": [ + "tag.decorator.js entity.name.tag.js", + "tag.decorator.js punctuation.definition.tag.js" + ], + "settings": { + "fontStyle": "italic", + "foreground": "{{variant.scheme.base.blue}}" + } + }, + { + "name": "ES7 Bind Operator", + "scope": [ + "source.js constant.other.object.key.js string.unquoted.label.js" + ], + "settings": { + "fontStyle": "italic", + "foreground": "{{variant.scheme.base.red}}" + } + }, + { + "name": "JSON Key - Level 0", + "scope": [ + "source.json meta.structure.dictionary.json support.type.property-name.json" + ], + "settings": { + "foreground": "{{variant.scheme.base.purple}}" + } + }, + { + "name": "JSON Key - Level 1", + "scope": [ + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json" + ], + "settings": { + "foreground": "{{variant.scheme.base.yellow}}" + } + }, + { + "name": "JSON Key - Level 2", + "scope": [ + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json" + ], + "settings": { + "foreground": "{{variant.scheme.base.orange}}" + } + }, + { + "name": "JSON Key - Level 3", + "scope": [ + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json" + ], + "settings": { + "foreground": "{{variant.scheme.base.red}}" + } + }, + { + "name": "JSON Key - Level 4", + "scope": [ + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json" + ], + "settings": { + "foreground": "{{variant.scheme.base.brown}}" + } + }, + { + "name": "JSON Key - Level 5", + "scope": [ + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json" + ], + "settings": { + "foreground": "{{variant.scheme.base.blue}}" + } + }, + { + "name": "JSON Key - Level 6", + "scope": [ + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json" + ], + "settings": { + "foreground": "{{variant.scheme.base.pink}}" + } + }, + { + "name": "JSON Key - Level 7", + "scope": [ + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json" + ], + "settings": { + "foreground": "{{variant.scheme.base.purple}}" + } + }, + { + "name": "JSON Key - Level 8", + "scope": [ + "source.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json meta.structure.dictionary.value.json meta.structure.dictionary.json support.type.property-name.json" + ], + "settings": { + "foreground": "{{variant.scheme.base.green}}" + } + }, + { + "name": "Markdown - Plain", + "scope": [ + "text.html.markdown", + "punctuation.definition.list_item.markdown" + ], + "settings": { + "foreground": "{{variant.scheme.foreground}}" + } + }, + { + "name": "Markdown - Markup Raw Inline", + "scope": [ + "text.html.markdown markup.inline.raw.markdown" + ], + "settings": { + "foreground": "{{variant.scheme.base.purple}}" + } + }, + { + "name": "Markdown - Markup Raw Inline Punctuation", + "scope": [ + "text.html.markdown markup.inline.raw.markdown punctuation.definition.raw.markdown" + ], + "settings": { + "foreground": "{{variant.scheme.invisibles}}" + } + }, + { + "name": "Markdown - Line Break", + "scope": [ + "text.html.markdown meta.dummy.line-break" + ], + "settings": { + "foreground": "" + } + }, + { + "name": "Markdown - Heading", + "scope": [ + "markdown.heading", + "markup.heading | markup.heading entity.name", + "markup.heading.markdown punctuation.definition.heading.markdown" + ], + "settings": { + "foreground": "{{variant.scheme.base.green}}" + } + }, + { + "name": "Markup - Italic", + "scope": [ + "markup.italic" + ], + "settings": { + "fontStyle": "italic", + "foreground": "{{variant.scheme.base.pink}}" + } + }, + { + "name": "Markup - Bold", + "scope": [ + "markup.bold", + "markup.bold string" + ], + "settings": { + "fontStyle": "bold", + "foreground": "{{variant.scheme.base.pink}}" + } + }, + { + "name": "Markup - Bold-Italic", + "scope": [ + "markup.bold markup.italic", + "markup.italic markup.bold", + "markup.quote markup.bold", + "markup.bold markup.italic string", + "markup.italic markup.bold string", + "markup.quote markup.bold string" + ], + "settings": { + "fontStyle": "bold", + "foreground": "{{variant.scheme.base.pink}}" + } + }, + { + "name": "Markup - Underline", + "scope": [ + "markup.underline" + ], + "settings": { + "fontStyle": "underline", + "foreground": "{{variant.scheme.base.orange}}" + } + }, + { + "name": "Markup - Strike", + "scope": [ + "markup.strike" + ], + "settings": { + "fontStyle": "strike", + "foreground": "" + } + }, + { + "name": "Markdown - Blockquote", + "scope": [ + "markup.quote punctuation.definition.blockquote.markdown" + ], + "settings": { + "background": "{{variant.scheme.invisibles}}", + "foreground": "{{variant.scheme.invisibles}}" + } + }, + { + "name": "Markup - Quote", + "scope": [ + "markup.quote" + ], + "settings": { + "fontStyle": "italic", + "foreground": "" + } + }, + { + "name": "Markdown - Link", + "scope": [ + "string.other.link.title.markdown" + ], + "settings": { + "foreground": "{{variant.scheme.base.blue}}" + } + }, + { + "name": "Markdown - Link Description", + "scope": [ + "string.other.link.description.title.markdown" + ], + "settings": { + "foreground": "{{variant.scheme.base.purple}}" + } + }, + { + "name": "Markdown - Link Anchor", + "scope": [ + "constant.other.reference.link.markdown" + ], + "settings": { + "foreground": "{{variant.scheme.base.yellow}}" + } + }, + { + "name": "Markup - Raw Block", + "scope": [ + "markup.raw.block" + ], + "settings": { + "foreground": "{{variant.scheme.base.purple}}" + } + }, + { + "name": "Markdown - Fenced Bode Block Variable", + "scope": [ + "markup.fenced_code.block.markdown", + "markup.inline.raw.string.markdown" + ], + "settings": { + "foreground": "{{variant.scheme.foreground}}90" + } + }, + { + "name": "Markdown - Fenced Language", + "scope": [ + "variable.language.fenced.markdown" + ], + "settings": { + "foreground": "{{variant.scheme.invisibles}}" + } + }, + { + "name": "Markdown - Separator", + "scope": [ + "meta.separator" + ], + "settings": { + "fontStyle": "bold", + "background": "#00000050", + "foreground": "{{variant.scheme.invisibles}}" + } + }, + { + "name": "Markup - Table", + "scope": [ + "markup.table" + ], + "settings": { + "foreground": "{{variant.scheme.foreground}}" + } + } + ], + "colors": { + "focusBorder": "{{variant.scheme.focusBorder}}00", + "editorCursor.foreground": "{{variant.scheme.caret}}", + "editorRuler.foreground": "{{variant.scheme.guides}}", + "scrollbar.shadow": "{{variant.scheme.background}}00", + "editorLink.activeForeground": "{{variant.scheme.foreground}}", + "selection.background": "{{variant.scheme.foreground}}", + "progressBar.background": "{{commons.accents.Teal}}", + "textLink.foreground": "{{commons.accents.Teal}}", + "textLink.activeForeground": "{{variant.scheme.foreground}}", + "editorLineNumber.foreground": "{{variant.scheme.lineNumbers}}", + "editorActiveLineNumber.foreground": "{{variant.scheme.sidebarForeground}}", + "editorBracketMatch.border": "{{variant.scheme.caret}}50", + "editorBracketMatch.background": "{{variant.scheme.background}}", + "editorWhitespace.foreground": "{{variant.scheme.foreground}}10", + "editor.background": "{{variant.scheme.background}}", + "editor.foreground": "{{variant.scheme.foreground}}", + "editor.lineHighlightBackground": "{{variant.scheme.lineHighlight}}50", + "editor.selectionBackground": "{{variant.scheme.selection}}", + "editor.selectionHighlightBackground": "{{variant.scheme.caret}}20", + "editorOverviewRuler.border": "{{variant.scheme.background}}", + "editorHoverWidget.background": "{{variant.scheme.background}}", + "editorHoverWidget.border": "{{variant.scheme.inputBorder}}", + "editorIndentGuide.background": "{{variant.scheme.guides}}", + "editorGroupHeader.tabsBackground": "{{variant.scheme.background}}", + "editorGroup.border": "{{variant.scheme.shadow}}", + "editorGutter.modifiedBackground": "{{variant.scheme.base.blue}}60", + "editorGutter.addedBackground": "{{variant.scheme.base.green}}60", + "editorGutter.deletedBackground": "{{variant.scheme.base.red}}60", + "tab.activeBorder": "{{commons.accents.Teal}}", + "tab.unfocusedActiveBorder": "{{variant.scheme.comments}}", + "tab.activeForeground": "{{variant.scheme.tabActiveForeground}}", + "tab.inactiveForeground": "{{variant.scheme.sidebarForeground}}", + "tab.inactiveBackground": "{{variant.scheme.background}}", + "tab.unfocusedActiveForeground": "{{variant.scheme.foreground}}", + "tab.border": "{{variant.scheme.background}}", + "statusBar.noFolderBackground": "{{variant.scheme.background}}", + "statusBar.border": "{{variant.scheme.contrastBorder}}60", + "statusBar.background": "{{variant.scheme.backgroundAlt}}", + "statusBar.foreground": "{{variant.scheme.statusbarForeground}}", + "statusBar.debuggingBackground": "{{variant.scheme.base.purple}}", + "statusBar.debuggingForeground": "{{variant.scheme.base.white}}", + "activityBar.background": "{{variant.scheme.backgroundAlt}}", + "activityBar.border": "{{variant.scheme.contrastBorder}}60", + "activityBar.foreground": "{{variant.scheme.foreground}}", + "activityBarBadge.background": "{{commons.accents.Teal}}", + "activityBarBadge.foreground": "{{variant.scheme.base.black}}", + "titleBar.activeBackground": "{{variant.scheme.backgroundAlt}}", + "titleBar.activeForeground": "{{variant.scheme.comments}}", + "titleBar.inactiveBackground": "{{variant.scheme.backgroundAlt}}", + "titleBar.inactiveForeground": "{{variant.scheme.comments}}", + "sideBar.background": "{{variant.scheme.backgroundAlt}}", + "sideBar.foreground": "{{variant.scheme.sidebarForeground}}", + "sideBar.border": "{{variant.scheme.contrastBorder}}60", + "titleBar.border": "{{variant.scheme.contrastBorder}}60", + "sideBarTitle.foreground": "{{variant.scheme.foreground}}", + "sideBarSectionHeader.background": "{{variant.scheme.backgroundAlt}}", + "input.background": "{{variant.scheme.inputBackground}}", + "input.foreground": "{{variant.scheme.inputForeground}}", + "input.placeholderForeground": "{{variant.scheme.foreground}}60", + "input.border": "{{variant.scheme.inputBorder}}", + "inputValidation.errorBorder": "{{variant.scheme.base.red}}50", + "inputValidation.infoBorder": "{{variant.scheme.base.blue}}50", + "inputValidation.warningBorder": "{{variant.scheme.base.yellow}}50", + "dropdown.background": "{{variant.scheme.background}}", + "dropdown.border": "{{variant.scheme.inputBorder}}", + "list.hoverForeground": "{{variant.scheme.listHoverForeground}}", + "list.hoverBackground": "{{variant.scheme.backgroundAlt}}", + "list.activeSelectionBackground": "{{variant.scheme.backgroundAlt}}", + "list.activeSelectionForeground": "{{commons.accents.Teal}}", + "list.inactiveSelectionForeground": "{{commons.accents.Teal}}", + "list.inactiveSelectionBackground": "#00000030", + "list.focusBackground": "{{variant.scheme.foreground}}20", + "list.focusForeground": "{{variant.scheme.foreground}}", + "list.highlightForeground": "{{commons.accents.Teal}}", + "terminal.ansiWhite": "{{variant.scheme.base.white}}", + "terminal.ansiBlack": "{{variant.scheme.comments}}", + "terminal.ansiBlue": "{{variant.scheme.base.blue}}", + "terminal.ansiCyan": "{{variant.scheme.base.cyan}}", + "terminal.ansiGreen": "{{variant.scheme.base.green}}", + "terminal.ansiMagenta": "{{variant.scheme.base.purple}}", + "terminal.ansiRed": "{{variant.scheme.base.red}}", + "terminal.ansiYellow": "{{variant.scheme.base.yellow}}", + "terminal.ansiBrightWhite": "{{variant.scheme.base.white}}", + "terminal.ansiBrightBlack": "{{variant.scheme.comments}}", + "terminal.ansiBrightBlue": "{{variant.scheme.base.blue}}", + "terminal.ansiBrightCyan": "{{variant.scheme.base.cyan}}", + "terminal.ansiBrightGreen": "{{variant.scheme.base.green}}", + "terminal.ansiBrightMagenta": "{{variant.scheme.base.purple}}", + "terminal.ansiBrightRed": "{{variant.scheme.base.red}}", + "terminal.ansiBrightYellow": "{{variant.scheme.base.yellow}}", + "scrollbarSlider.background": "{{variant.scheme.scrollbars}}", + "scrollbarSlider.hoverBackground": "{{variant.scheme.scrollbarsHover}}", + "scrollbarSlider.activeBackground": "{{commons.accents.Teal}}", + "editorSuggestWidget.background": "{{variant.scheme.background}}", + "editorSuggestWidget.foreground": "{{variant.scheme.foreground}}", + "editorSuggestWidget.highlightForeground": "{{commons.accents.Teal}}", + "editorSuggestWidget.selectedBackground": "{{variant.scheme.lineHighlight}}50", + "editorSuggestWidget.border": "{{variant.scheme.inputBorder}}", + "editorError.foreground": "{{variant.scheme.base.red}}70", + "editorWarning.foreground": "{{variant.scheme.base.green}}70", + "editorWidget.background": "{{variant.scheme.background}}", + "editorMarkerNavigation.background": "{{variant.scheme.foreground}}05", + "widget.shadow": "{{variant.scheme.shadow}}", + "panel.border": "{{variant.scheme.contrastBorder}}60", + "panel.background": "{{variant.scheme.backgroundAlt}}", + "panelTitle.activeForeground": "{{variant.scheme.foreground}}", + "diffEditor.insertedTextBackground": "{{variant.scheme.base.green}}15", + "diffEditor.removedTextBackground": "{{variant.scheme.base.red}}20", + "notifications.background": "{{variant.scheme.background}}", + "notifications.foreground": "{{variant.scheme.foreground}}", + "notificationLink.foreground": "{{commons.accents.Teal}}", + "badge.background": "{{variant.scheme.lineHighlight}}30", + "badge.foreground": "{{variant.scheme.comments}}", + "button.background": "{{variant.scheme.selection}}", + "extensionButton.prominentBackground": "{{variant.scheme.base.green}}90", + "extensionButton.prominentHoverBackground": "{{variant.scheme.base.green}}", + "peekView.border": "{{variant.scheme.shadow}}", + "peekViewEditor.background": "{{variant.scheme.foreground}}05", + "peekViewTitle.background": "{{variant.scheme.foreground}}05", + "peekViewResult.background": "{{variant.scheme.foreground}}05", + "peekViewEditorGutter.background": "{{variant.scheme.foreground}}05", + "peekViewTitleDescription.foreground": "{{variant.scheme.foreground}}60", + "peekViewResult.matchHighlightBackground": "{{variant.scheme.selection}}", + "peekViewEditor.matchHighlightBackground": "{{variant.scheme.selection}}", + "debugToolBar.background": "{{variant.scheme.background}}", + "pickerGroup.foreground": "{{commons.accents.Teal}}", + "gitDecoration.deletedResourceForeground": "{{variant.scheme.base.red}}90", + "gitDecoration.conflictingResourceForeground": "{{variant.scheme.base.yellow}}90", + "gitDecoration.modifiedResourceForeground": "{{variant.scheme.base.blue}}90", + "gitDecoration.untrackedResourceForeground": "{{variant.scheme.base.green}}90", + "gitDecoration.ignoredResourceForeground": "{{variant.scheme.sidebarForeground}}90" + } +} \ No newline at end of file diff --git a/test/--.tmcolor b/test/--.tmcolor new file mode 100644 index 0000000..885b2b2 --- /dev/null +++ b/test/--.tmcolor @@ -0,0 +1,79 @@ +comment ā€” for comments. +comment.line ā€” line comments, we specialize further so that the type of comment start character(s) can be extracted from the scope. +comment.line.double-slash ā€” // comment +comment.line.double-dash ā€” -- comment +comment.line.number-sign ā€” # comment +comment.line.percentage ā€” % comment +comment.line.character ā€” other types of line comments. +comment.block ā€” multi-line comments like /* ā€¦ */ and . +comment.block.documentation ā€” embedded documentation. + +constant ā€” various forms of constants. +constant.numeric ā€” those which represent numbers, e.g. 42, 1.3f, 0x4AB1U. +constant.character ā€” those which represent characters, e.g. <, \e, \031. +constant.escape ā€” escape sequences like \e would be constant.character.escape. +constant.language ā€” constants (generally) provided by the language which are ā€œspecialā€ like true, false, nil, YES, NO, etc. +constant.other ā€” other constants, e.g. colors in CSS. + +entity ā€” an entity refers to a larger part of the document, for example a chapter, class, function, or tag. We do not scope the entire entity as entity.* (we use meta.* for that). But we do use entity.* for the ā€œplaceholdersā€ in the larger entity, e.g. if the entity is a chapter, we would use entity.name.section for the chapter title. +entity.name ā€” we are naming the larger entity. +entity.name.function ā€” the name of a function. +entity.name.type ā€” the name of a type declaration or class. +entity.name.tag ā€” a tag name. +entity.name.section ā€” the name is the name of a section/heading. +entity.other ā€” other entities. +entity.other.inherited-class ā€” the superclass/baseclass name. +entity.other.attribute-name ā€” the name of an attribute (mainly in tags). + +invalid ā€” stuff which is ā€œinvalidā€. +invalid.illegal ā€” illegal, e.g. an ampersand or lower-than character in HTML (which is not part of an entity/tag). +invalid.deprecated ā€” for deprecated stuff e.g. using an API function which is deprecated or using styling with strict HTML. + +keyword ā€” keywords (when these do not fall into the other groups). +keyword.control ā€” mainly related to flow control like continue, while, return, etc. +keyword.operator ā€” operators can either be textual (e.g. or) or be characters. +keyword.other ā€” other keywords. + +markup ā€” this is for markup languages and generally applies to larger subsets of the text. +markup.underline ā€” underlined text. +markup.underline.link ā€” this is for links, as a convenience this is derived from markup.underline so that if there is no theme rule which specifically targets markup.underline.link then it will inherit the underline style. +markup.bold ā€” bold text (text which is strong and similar should preferably be derived from this name). +markup.heading ā€” a section header. Optionally provide the heading level as the next element, for example markup.heading.2.html for

ā€¦

in HTML. +markup.italic ā€” italic text (text which is emphasized and similar should preferably be derived from this name). +markup.list ā€” list items. +markup.list.numbered ā€” numbered list items. +markup.list.unnumbered ā€” unnumbered list items. +markup.quote ā€” quoted (sometimes block quoted) text. +markup.raw ā€” text which is verbatim, e.g. code listings. Normally spell checking is disabled for markup.raw. +markup.inline.raw +markup.other ā€” other markup constructs. + +meta - the meta scope is generally used to markup larger parts of the document. For example the entire line which declares a function would be meta.function and the subsets would be storage.type, entity.name.function, variable.parameter etc. and only the latter would be styled. Sometimes the meta part of the scope will be used only to limit the more general element that is styled, most of the time meta scopes are however used in scope selectors for activation of bundle items. For example in Objective-C there is a meta scope for the interface declaration of a class and the implementation, allowing the same tab-triggers to expand differently, depending on context. + +storage ā€” things relating to ā€œstorageā€. +storage.type ā€” the type of something, class, function, int, var, etc. +storage.modifier ā€” a storage modifier like static, final, abstract, etc. + +string ā€” strings. +string.quoted ā€” quoted strings. +string.quoted.single ā€” single quoted strings: 'foo'. +string.quoted.double ā€” double quoted strings: "foo". +string.quoted.triple ā€” triple quoted strings: """Python""". +string.quoted.other ā€” other types of quoting: $'shell', %s{...}. +string.unquoted ā€” for things like here-docs and here-strings. +string.interpolated ā€” strings which are ā€œevaluatedā€: `date`, $(pwd). +string.regexp ā€” regular expressions: /(\w+)/. +string.other ā€” other types of strings (should rarely be used). + +support ā€” things provided by a framework or library should be below support. +support.function ā€” functions provided by the framework/library. For example NSLog in Objective-C is support.function. +support.class ā€” when the framework/library provides classes. +support.type ā€” types provided by the framework/library, this is probably only used for languages derived from C, which has typedef (and struct). Most other languages would introduce new types as classes. +support.constant ā€” constants (magic values) provided by the framework/library. +support.variable ā€” variables provided by the framework/library. For example NSApp in AppKit. +support.other ā€” the above should be exhaustive, but for everything else use support.other. + +variable ā€” variables. Not all languages allow easy identification (and thus markup) of these. +variable.parameter ā€” when the variable is declared as the parameter. +variable.language ā€” reserved language variables like this, super, self, etc. +variable.other ā€” other variables, like $some_variables. diff --git a/test/.gitignore b/test/.gitignore new file mode 100755 index 0000000..e69de29 diff --git a/test/COMMIT_EDITMSG b/test/COMMIT_EDITMSG new file mode 100644 index 0000000..e69de29 diff --git a/test/Dockerfile b/test/Dockerfile new file mode 100644 index 0000000..e69de29 diff --git a/test/LICENSE b/test/LICENSE new file mode 100644 index 0000000..e69de29 diff --git a/test/Procfile b/test/Procfile new file mode 100644 index 0000000..e69de29 diff --git a/test/TODO b/test/TODO new file mode 100644 index 0000000..e69de29 diff --git a/test/adobe.ai b/test/adobe.ai new file mode 100644 index 0000000..e69de29 diff --git a/test/adobe.as b/test/adobe.as new file mode 100644 index 0000000..e69de29 diff --git a/test/adobe.cfc b/test/adobe.cfc new file mode 100644 index 0000000..e69de29 diff --git a/test/adobe.cfm b/test/adobe.cfm new file mode 100644 index 0000000..e69de29 diff --git a/test/adobe.pdf b/test/adobe.pdf new file mode 100644 index 0000000..e69de29 diff --git a/test/adobe.psb b/test/adobe.psb new file mode 100644 index 0000000..e69de29 diff --git a/test/adobe.psd b/test/adobe.psd new file mode 100644 index 0000000..e69de29 diff --git a/test/angular.ng.html b/test/angular.ng.html new file mode 100644 index 0000000..e69de29 diff --git a/test/archive.7z b/test/archive.7z new file mode 100644 index 0000000..e69de29 diff --git a/test/archive.7zip b/test/archive.7zip new file mode 100644 index 0000000..e69de29 diff --git a/test/archive.gz b/test/archive.gz new file mode 100644 index 0000000..e69de29 diff --git a/test/archive.pzip b/test/archive.pzip new file mode 100644 index 0000000..e69de29 diff --git a/test/archive.rar b/test/archive.rar new file mode 100644 index 0000000..e69de29 diff --git a/test/archive.tar b/test/archive.tar new file mode 100644 index 0000000..e69de29 diff --git a/test/archive.tgz b/test/archive.tgz new file mode 100644 index 0000000..e69de29 diff --git a/test/archive.wim b/test/archive.wim new file mode 100644 index 0000000..e69de29 diff --git a/test/archive.zip b/test/archive.zip new file mode 100644 index 0000000..e69de29 diff --git a/test/binary.tga b/test/binary.tga new file mode 100644 index 0000000..e69de29 diff --git a/test/bower.json b/test/bower.json new file mode 100644 index 0000000..e69de29 diff --git a/test/conf b/test/conf new file mode 100644 index 0000000..e69de29 diff --git a/test/default b/test/default new file mode 100644 index 0000000..e69de29 diff --git a/test/font.eot b/test/font.eot new file mode 100644 index 0000000..e69de29 diff --git a/test/font.otf b/test/font.otf new file mode 100644 index 0000000..e69de29 diff --git a/test/font.ttf b/test/font.ttf new file mode 100644 index 0000000..e69de29 diff --git a/test/font.woff b/test/font.woff new file mode 100644 index 0000000..e69de29 diff --git a/test/git-blame b/test/git-blame new file mode 100644 index 0000000..e69de29 diff --git a/test/git-rebase-todo b/test/git-rebase-todo new file mode 100644 index 0000000..e69de29 diff --git a/test/image.jpg b/test/image.jpg new file mode 100644 index 0000000..e69de29 diff --git a/test/image.svg b/test/image.svg new file mode 100644 index 0000000..e69de29 diff --git a/test/package-lock.json b/test/package-lock.json new file mode 100644 index 0000000..e69de29 diff --git a/test/package.json b/test/package.json new file mode 100644 index 0000000..e69de29 diff --git a/test/settings.ini b/test/settings.ini new file mode 100644 index 0000000..e69de29 diff --git a/test/shell.bash b/test/shell.bash new file mode 100644 index 0000000..957abd2 --- /dev/null +++ b/test/shell.bash @@ -0,0 +1,2 @@ +#!/bin/bash +echo "$RANDOM" # Supported in bash. No warnings. diff --git a/test/shell.fish b/test/shell.fish new file mode 100644 index 0000000..e69de29 diff --git a/test/shell.sh b/test/shell.sh new file mode 100644 index 0000000..b3d23a0 --- /dev/null +++ b/test/shell.sh @@ -0,0 +1,2 @@ +#!/bin/sh +echo "$RANDOM" # Unsupported in sh. Produces warning. diff --git a/test/sketch.sketch b/test/sketch.sketch new file mode 100644 index 0000000..e69de29 diff --git a/test/source.applescript b/test/source.applescript new file mode 100644 index 0000000..e69de29 diff --git a/test/source.asa b/test/source.asa new file mode 100644 index 0000000..e69de29 diff --git a/test/source.ascx b/test/source.ascx new file mode 100644 index 0000000..e69de29 diff --git a/test/source.asp b/test/source.asp new file mode 100644 index 0000000..e69de29 diff --git a/test/source.aspx b/test/source.aspx new file mode 100644 index 0000000..e69de29 diff --git a/test/source.blade b/test/source.blade new file mode 100644 index 0000000..e69de29 diff --git a/test/source.blade.php b/test/source.blade.php new file mode 100644 index 0000000..e69de29 diff --git a/test/source.c b/test/source.c new file mode 100644 index 0000000..f0094b3 --- /dev/null +++ b/test/source.c @@ -0,0 +1,1573 @@ +#include "ccv.h" +#include "ccv_internal.h" +#include +#ifdef HAVE_GSL +#include +#include +#endif +#ifdef USE_OPENMP +#include +#endif + +const ccv_bbf_param_t ccv_bbf_default_params = { + .interval = 5, + .min_neighbors = 2, + .accurate = 1, + .flags = 0, + .size = { + 24, + 24, + }, +}; + +#define _ccv_width_padding(x) (((x) + 3) & -4) + +static inline int _ccv_run_bbf_feature(ccv_bbf_feature_t *feature, int *step, unsigned char **u8) +{ +#define pf_at(i) (*(u8[feature->pz[i]] + feature->px[i] + feature->py[i] * step[feature->pz[i]])) +#define nf_at(i) (*(u8[feature->nz[i]] + feature->nx[i] + feature->ny[i] * step[feature->nz[i]])) + unsigned char pmin = pf_at(0), nmax = nf_at(0); + /* check if every point in P > every point in N, and take a shortcut */ + if (pmin <= nmax) + return 0; + int i; + for (i = 1; i < feature->size; i++) + { + if (feature->pz[i] >= 0) + { + int p = pf_at(i); + if (p < pmin) + { + if (p <= nmax) + return 0; + pmin = p; + } + } + if (feature->nz[i] >= 0) + { + int n = nf_at(i); + if (n > nmax) + { + if (pmin <= n) + return 0; + nmax = n; + } + } + } +#undef pf_at +#undef nf_at + return 1; +} + +static int _ccv_read_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier) +{ + FILE *r = fopen(file, "r"); + if (r == 0) + return -1; + int stat = 0; + stat |= fscanf(r, "%d", &classifier->count); + union { + float fl; + int i; + } fli; + stat |= fscanf(r, "%d", &fli.i); + classifier->threshold = fli.fl; + classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t)); + classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float)); + int i, j; + for (i = 0; i < classifier->count; i++) + { + stat |= fscanf(r, "%d", &classifier->feature[i].size); + for (j = 0; j < classifier->feature[i].size; j++) + { + stat |= fscanf(r, "%d %d %d", &classifier->feature[i].px[j], &classifier->feature[i].py[j], &classifier->feature[i].pz[j]); + stat |= fscanf(r, "%d %d %d", &classifier->feature[i].nx[j], &classifier->feature[i].ny[j], &classifier->feature[i].nz[j]); + } + union { + float fl; + int i; + } flia, flib; + stat |= fscanf(r, "%d %d", &flia.i, &flib.i); + classifier->alpha[i * 2] = flia.fl; + classifier->alpha[i * 2 + 1] = flib.fl; + } + fclose(r); + return 0; +} + +#ifdef HAVE_GSL + +static unsigned int _ccv_bbf_time_measure() +{ + struct timeval tv; + gettimeofday(&tv, 0); + return tv.tv_sec * 1000000 + tv.tv_usec; +} + +#define less_than(a, b, aux) ((a) < (b)) +CCV_IMPLEMENT_QSORT(_ccv_sort_32f, float, less_than) +#undef less_than + +static void _ccv_bbf_eval_data(ccv_bbf_stage_classifier_t *classifier, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, float *peval, float *neval) +{ + int i, j; + int steps[] = {_ccv_width_padding(size.width), + _ccv_width_padding(size.width >> 1), + _ccv_width_padding(size.width >> 2)}; + int isizs0 = steps[0] * size.height; + int isizs01 = isizs0 + steps[1] * (size.height >> 1); + for (i = 0; i < posnum; i++) + { + unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01}; + float sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + peval[i] = sum; + } + for (i = 0; i < negnum; i++) + { + unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01}; + float sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + neval[i] = sum; + } +} + +static int _ccv_prune_positive_data(ccv_bbf_classifier_cascade_t *cascade, unsigned char **posdata, int posnum, ccv_size_t size) +{ + float *peval = (float *)ccmalloc(posnum * sizeof(float)); + int i, j, k, rpos = posnum; + for (i = 0; i < cascade->count; i++) + { + _ccv_bbf_eval_data(cascade->stage_classifier + i, posdata, rpos, 0, 0, size, peval, 0); + k = 0; + for (j = 0; j < rpos; j++) + if (peval[j] >= cascade->stage_classifier[i].threshold) + { + posdata[k] = posdata[j]; + ++k; + } + else + { + ccfree(posdata[j]); + } + rpos = k; + } + ccfree(peval); + return rpos; +} + +static int _ccv_prepare_background_data(ccv_bbf_classifier_cascade_t *cascade, char **bgfiles, int bgnum, unsigned char **negdata, int negnum) +{ + int t, i, j, k, q; + int negperbg; + int negtotal = 0; + int steps[] = {_ccv_width_padding(cascade->size.width), + _ccv_width_padding(cascade->size.width >> 1), + _ccv_width_padding(cascade->size.width >> 2)}; + int isizs0 = steps[0] * cascade->size.height; + int isizs1 = steps[1] * (cascade->size.height >> 1); + int isizs2 = steps[2] * (cascade->size.height >> 2); + int *idcheck = (int *)ccmalloc(negnum * sizeof(int)); + + gsl_rng_env_setup(); + + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); + gsl_rng_set(rng, (unsigned long int)idcheck); + + ccv_size_t imgsz = cascade->size; + int rneg = negtotal; + for (t = 0; negtotal < negnum; t++) + { + PRINT(CCV_CLI_INFO, "preparing negative data ... 0%%"); + for (i = 0; i < bgnum; i++) + { + negperbg = (t < 2) ? (negnum - negtotal) / (bgnum - i) + 1 : negnum - negtotal; + ccv_dense_matrix_t *image = 0; + ccv_read(bgfiles[i], &image, CCV_IO_GRAY | CCV_IO_ANY_FILE); + assert((image->type & CCV_C1) && (image->type & CCV_8U)); + if (image == 0) + { + PRINT(CCV_CLI_ERROR, "\n%s file corrupted\n", bgfiles[i]); + continue; + } + if (t % 2 != 0) + ccv_flip(image, 0, 0, CCV_FLIP_X); + if (t % 4 >= 2) + ccv_flip(image, 0, 0, CCV_FLIP_Y); + ccv_bbf_param_t params = {.interval = 3, .min_neighbors = 0, .accurate = 1, .flags = 0, .size = cascade->size}; + ccv_array_t *detected = ccv_bbf_detect_objects(image, &cascade, 1, params); + memset(idcheck, 0, ccv_min(detected->rnum, negperbg) * sizeof(int)); + for (j = 0; j < ccv_min(detected->rnum, negperbg); j++) + { + int r = gsl_rng_uniform_int(rng, detected->rnum); + int flag = 1; + ccv_rect_t *rect = (ccv_rect_t *)ccv_array_get(detected, r); + while (flag) + { + flag = 0; + for (k = 0; k < j; k++) + if (r == idcheck[k]) + { + flag = 1; + r = gsl_rng_uniform_int(rng, detected->rnum); + break; + } + rect = (ccv_rect_t *)ccv_array_get(detected, r); + if ((rect->x < 0) || (rect->y < 0) || (rect->width + rect->x > image->cols) || (rect->height + rect->y > image->rows)) + { + flag = 1; + r = gsl_rng_uniform_int(rng, detected->rnum); + } + } + idcheck[j] = r; + ccv_dense_matrix_t *temp = 0; + ccv_dense_matrix_t *imgs0 = 0; + ccv_dense_matrix_t *imgs1 = 0; + ccv_dense_matrix_t *imgs2 = 0; + ccv_slice(image, (ccv_matrix_t **)&temp, 0, rect->y, rect->x, rect->height, rect->width); + ccv_resample(temp, &imgs0, 0, imgsz.height, imgsz.width, CCV_INTER_AREA); + assert(imgs0->step == steps[0]); + ccv_matrix_free(temp); + ccv_sample_down(imgs0, &imgs1, 0, 0, 0); + assert(imgs1->step == steps[1]); + ccv_sample_down(imgs1, &imgs2, 0, 0, 0); + assert(imgs2->step == steps[2]); + + negdata[negtotal] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2); + unsigned char *u8s0 = negdata[negtotal]; + unsigned char *u8s1 = negdata[negtotal] + isizs0; + unsigned char *u8s2 = negdata[negtotal] + isizs0 + isizs1; + unsigned char *u8[] = {u8s0, u8s1, u8s2}; + memcpy(u8s0, imgs0->data.u8, imgs0->rows * imgs0->step); + ccv_matrix_free(imgs0); + memcpy(u8s1, imgs1->data.u8, imgs1->rows * imgs1->step); + ccv_matrix_free(imgs1); + memcpy(u8s2, imgs2->data.u8, imgs2->rows * imgs2->step); + ccv_matrix_free(imgs2); + + flag = 1; + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier; + for (k = 0; k < cascade->count; ++k, ++classifier) + { + float sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (q = 0; q < classifier->count; ++q, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + if (sum < classifier->threshold) + { + flag = 0; + break; + } + } + if (!flag) + ccfree(negdata[negtotal]); + else + { + ++negtotal; + if (negtotal >= negnum) + break; + } + } + ccv_array_free(detected); + ccv_matrix_free(image); + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\rpreparing negative data ... %2d%%", 100 * negtotal / negnum); + fflush(0); + if (negtotal >= negnum) + break; + } + if (rneg == negtotal) + break; + rneg = negtotal; + PRINT(CCV_CLI_INFO, "\nentering additional round %d\n", t + 1); + } + gsl_rng_free(rng); + ccfree(idcheck); + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\n"); + return negtotal; +} + +static void _ccv_prepare_positive_data(ccv_dense_matrix_t **posimg, unsigned char **posdata, ccv_size_t size, int posnum) +{ + PRINT(CCV_CLI_INFO, "preparing positive data ... 0%%"); + int i; + for (i = 0; i < posnum; i++) + { + ccv_dense_matrix_t *imgs0 = posimg[i]; + ccv_dense_matrix_t *imgs1 = 0; + ccv_dense_matrix_t *imgs2 = 0; + assert((imgs0->type & CCV_C1) && (imgs0->type & CCV_8U) && imgs0->rows == size.height && imgs0->cols == size.width); + ccv_sample_down(imgs0, &imgs1, 0, 0, 0); + ccv_sample_down(imgs1, &imgs2, 0, 0, 0); + int isizs0 = imgs0->rows * imgs0->step; + int isizs1 = imgs1->rows * imgs1->step; + int isizs2 = imgs2->rows * imgs2->step; + + posdata[i] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2); + memcpy(posdata[i], imgs0->data.u8, isizs0); + memcpy(posdata[i] + isizs0, imgs1->data.u8, isizs1); + memcpy(posdata[i] + isizs0 + isizs1, imgs2->data.u8, isizs2); + + PRINT(CCV_CLI_INFO, "\rpreparing positive data ... %2d%%", 100 * (i + 1) / posnum); + fflush(0); + + ccv_matrix_free(imgs1); + ccv_matrix_free(imgs2); + } + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\n"); +} + +typedef struct +{ + double fitness; + int pk, nk; + int age; + double error; + ccv_bbf_feature_t feature; +} ccv_bbf_gene_t; + +static inline void _ccv_bbf_genetic_fitness(ccv_bbf_gene_t *gene) +{ + gene->fitness = (1 - gene->error) * exp(-0.01 * gene->age) * exp((gene->pk + gene->nk) * log(1.015)); +} + +static inline int _ccv_bbf_exist_gene_feature(ccv_bbf_gene_t *gene, int x, int y, int z) +{ + int i; + for (i = 0; i < gene->pk; i++) + if (z == gene->feature.pz[i] && x == gene->feature.px[i] && y == gene->feature.py[i]) + return 1; + for (i = 0; i < gene->nk; i++) + if (z == gene->feature.nz[i] && x == gene->feature.nx[i] && y == gene->feature.ny[i]) + return 1; + return 0; +} + +static inline void _ccv_bbf_randomize_gene(gsl_rng *rng, ccv_bbf_gene_t *gene, int *rows, int *cols) +{ + int i; + do + { + gene->pk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1; + gene->nk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1; + } while (gene->pk + gene->nk < CCV_BBF_POINT_MIN); /* a hard restriction of at least 3 points have to be examed */ + gene->feature.size = ccv_max(gene->pk, gene->nk); + gene->age = 0; + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + { + gene->feature.pz[i] = -1; + gene->feature.nz[i] = -1; + } + int x, y, z; + for (i = 0; i < gene->pk; i++) + { + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(gene, x, y, z)); + gene->feature.pz[i] = z; + gene->feature.px[i] = x; + gene->feature.py[i] = y; + } + for (i = 0; i < gene->nk; i++) + { + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(gene, x, y, z)); + gene->feature.nz[i] = z; + gene->feature.nx[i] = x; + gene->feature.ny[i] = y; + } +} + +static inline double _ccv_bbf_error_rate(ccv_bbf_feature_t *feature, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw) +{ + int i; + int steps[] = {_ccv_width_padding(size.width), + _ccv_width_padding(size.width >> 1), + _ccv_width_padding(size.width >> 2)}; + int isizs0 = steps[0] * size.height; + int isizs01 = isizs0 + steps[1] * (size.height >> 1); + double error = 0; + for (i = 0; i < posnum; i++) + { + unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01}; + if (!_ccv_run_bbf_feature(feature, steps, u8)) + error += pw[i]; + } + for (i = 0; i < negnum; i++) + { + unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01}; + if (_ccv_run_bbf_feature(feature, steps, u8)) + error += nw[i]; + } + return error; +} + +#define less_than(fit1, fit2, aux) ((fit1).fitness >= (fit2).fitness) +static CCV_IMPLEMENT_QSORT(_ccv_bbf_genetic_qsort, ccv_bbf_gene_t, less_than) +#undef less_than + + static ccv_bbf_feature_t _ccv_bbf_genetic_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, int ftnum, ccv_size_t size, double *pw, double *nw) +{ + ccv_bbf_feature_t best; + /* seed (random method) */ + gsl_rng_env_setup(); + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); + union { + unsigned long int li; + double db; + } dbli; + dbli.db = pw[0] + nw[0]; + gsl_rng_set(rng, dbli.li); + int i, j; + int pnum = ftnum * 100; + assert(pnum > 0); + ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc(pnum * sizeof(ccv_bbf_gene_t)); + int rows[] = {size.height, size.height >> 1, size.height >> 2}; + int cols[] = {size.width, size.width >> 1, size.width >> 2}; + for (i = 0; i < pnum; i++) + _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols); + unsigned int timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + for (i = 0; i < pnum; i++) + _ccv_bbf_genetic_fitness(&gene[i]); + double best_err = 1; + int rnum = ftnum * 39; /* number of randomize */ + int mnum = ftnum * 40; /* number of mutation */ + int hnum = ftnum * 20; /* number of hybrid */ + /* iteration stop crit : best no change in 40 iterations */ + int it = 0, t; + for (t = 0; it < 40; ++it, ++t) + { + int min_id = 0; + double min_err = gene[0].error; + for (i = 1; i < pnum; i++) + if (gene[i].error < min_err) + { + min_id = i; + min_err = gene[i].error; + } + min_err = gene[min_id].error = _ccv_bbf_error_rate(&gene[min_id].feature, posdata, posnum, negdata, negnum, size, pw, nw); + if (min_err < best_err) + { + best_err = min_err; + memcpy(&best, &gene[min_id].feature, sizeof(best)); + PRINT(CCV_CLI_INFO, "best bbf feature with error %f\n|-size: %d\n|-positive point: ", best_err, best.size); + for (i = 0; i < best.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.px[i], best.py[i], best.pz[i]); + PRINT(CCV_CLI_INFO, "\n|-negative point: "); + for (i = 0; i < best.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.nx[i], best.ny[i], best.nz[i]); + PRINT(CCV_CLI_INFO, "\n"); + it = 0; + } + PRINT(CCV_CLI_INFO, "minimum error achieved in round %d(%d) : %f with %d ms\n", t, it, min_err, timer / 1000); + _ccv_bbf_genetic_qsort(gene, pnum, 0); + for (i = 0; i < ftnum; i++) + ++gene[i].age; + for (i = ftnum; i < ftnum + mnum; i++) + { + int parent = gsl_rng_uniform_int(rng, ftnum); + memcpy(gene + i, gene + parent, sizeof(ccv_bbf_gene_t)); + /* three mutation strategy : 1. add, 2. remove, 3. refine */ + int pnm, pn = gsl_rng_uniform_int(rng, 2); + int *pnk[] = {&gene[i].pk, &gene[i].nk}; + int *pnx[] = {gene[i].feature.px, gene[i].feature.nx}; + int *pny[] = {gene[i].feature.py, gene[i].feature.ny}; + int *pnz[] = {gene[i].feature.pz, gene[i].feature.nz}; + int x, y, z; + int victim, decay = 1; + do + { + switch (gsl_rng_uniform_int(rng, 3)) + { + case 0: /* add */ + if (gene[i].pk == CCV_BBF_POINT_MAX && gene[i].nk == CCV_BBF_POINT_MAX) + break; + while (*pnk[pn] + 1 > CCV_BBF_POINT_MAX) + pn = gsl_rng_uniform_int(rng, 2); + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z)); + pnz[pn][*pnk[pn]] = z; + pnx[pn][*pnk[pn]] = x; + pny[pn][*pnk[pn]] = y; + ++(*pnk[pn]); + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + decay = gene[i].age = 0; + break; + case 1: /* remove */ + if (gene[i].pk + gene[i].nk <= CCV_BBF_POINT_MIN) /* at least 3 points have to be examed */ + break; + while (*pnk[pn] - 1 <= 0) // || *pnk[pn] + *pnk[!pn] - 1 < CCV_BBF_POINT_MIN) + pn = gsl_rng_uniform_int(rng, 2); + victim = gsl_rng_uniform_int(rng, *pnk[pn]); + for (j = victim; j < *pnk[pn] - 1; j++) + { + pnz[pn][j] = pnz[pn][j + 1]; + pnx[pn][j] = pnx[pn][j + 1]; + pny[pn][j] = pny[pn][j + 1]; + } + pnz[pn][*pnk[pn] - 1] = -1; + --(*pnk[pn]); + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + decay = gene[i].age = 0; + break; + case 2: /* refine */ + pnm = gsl_rng_uniform_int(rng, *pnk[pn]); + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z)); + pnz[pn][pnm] = z; + pnx[pn][pnm] = x; + pny[pn][pnm] = y; + decay = gene[i].age = 0; + break; + } + } while (decay); + } + for (i = ftnum + mnum; i < ftnum + mnum + hnum; i++) + { + /* hybrid strategy: taking positive points from dad, negative points from mum */ + int dad, mum; + do + { + dad = gsl_rng_uniform_int(rng, ftnum); + mum = gsl_rng_uniform_int(rng, ftnum); + } while (dad == mum || gene[dad].pk + gene[mum].nk < CCV_BBF_POINT_MIN); /* at least 3 points have to be examed */ + for (j = 0; j < CCV_BBF_POINT_MAX; j++) + { + gene[i].feature.pz[j] = -1; + gene[i].feature.nz[j] = -1; + } + gene[i].pk = gene[dad].pk; + for (j = 0; j < gene[i].pk; j++) + { + gene[i].feature.pz[j] = gene[dad].feature.pz[j]; + gene[i].feature.px[j] = gene[dad].feature.px[j]; + gene[i].feature.py[j] = gene[dad].feature.py[j]; + } + gene[i].nk = gene[mum].nk; + for (j = 0; j < gene[i].nk; j++) + { + gene[i].feature.nz[j] = gene[mum].feature.nz[j]; + gene[i].feature.nx[j] = gene[mum].feature.nx[j]; + gene[i].feature.ny[j] = gene[mum].feature.ny[j]; + } + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + gene[i].age = 0; + } + for (i = ftnum + mnum + hnum; i < ftnum + mnum + hnum + rnum; i++) + _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols); + timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + for (i = 0; i < pnum; i++) + _ccv_bbf_genetic_fitness(&gene[i]); + } + ccfree(gene); + gsl_rng_free(rng); + return best; +} + +#define less_than(fit1, fit2, aux) ((fit1).error < (fit2).error) +static CCV_IMPLEMENT_QSORT(_ccv_bbf_best_qsort, ccv_bbf_gene_t, less_than) +#undef less_than + + static ccv_bbf_gene_t _ccv_bbf_best_gene(ccv_bbf_gene_t *gene, int pnum, int point_min, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw) +{ + int i; + unsigned int timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + _ccv_bbf_best_qsort(gene, pnum, 0); + int min_id = 0; + double min_err = gene[0].error; + for (i = 0; i < pnum; i++) + if (gene[i].nk + gene[i].pk >= point_min) + { + min_id = i; + min_err = gene[i].error; + break; + } + PRINT(CCV_CLI_INFO, "local best bbf feature with error %f\n|-size: %d\n|-positive point: ", min_err, gene[min_id].feature.size); + for (i = 0; i < gene[min_id].feature.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.px[i], gene[min_id].feature.py[i], gene[min_id].feature.pz[i]); + PRINT(CCV_CLI_INFO, "\n|-negative point: "); + for (i = 0; i < gene[min_id].feature.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.nx[i], gene[min_id].feature.ny[i], gene[min_id].feature.nz[i]); + PRINT(CCV_CLI_INFO, "\nthe computation takes %d ms\n", timer / 1000); + return gene[min_id]; +} + +static ccv_bbf_feature_t _ccv_bbf_convex_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_bbf_feature_t *best_feature, ccv_size_t size, double *pw, double *nw) +{ + ccv_bbf_gene_t best_gene; + /* seed (random method) */ + gsl_rng_env_setup(); + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); + union { + unsigned long int li; + double db; + } dbli; + dbli.db = pw[0] + nw[0]; + gsl_rng_set(rng, dbli.li); + int i, j, k, q, p, g, t; + int rows[] = {size.height, size.height >> 1, size.height >> 2}; + int cols[] = {size.width, size.width >> 1, size.width >> 2}; + int pnum = rows[0] * cols[0] + rows[1] * cols[1] + rows[2] * cols[2]; + ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc((pnum * (CCV_BBF_POINT_MAX * 2 + 1) * 2 + CCV_BBF_POINT_MAX * 2 + 1) * sizeof(ccv_bbf_gene_t)); + if (best_feature == 0) + { + /* bootstrapping the best feature, start from two pixels, one for positive, one for negative + * the bootstrapping process go like this: first, it will assign a random pixel as positive + * and enumerate every possible pixel as negative, and pick the best one. Then, enumerate every + * possible pixel as positive, and pick the best one, until it converges */ + memset(&best_gene, 0, sizeof(ccv_bbf_gene_t)); + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + best_gene.feature.pz[i] = best_gene.feature.nz[i] = -1; + best_gene.pk = 1; + best_gene.nk = 0; + best_gene.feature.size = 1; + best_gene.feature.pz[0] = gsl_rng_uniform_int(rng, 3); + best_gene.feature.px[0] = gsl_rng_uniform_int(rng, cols[best_gene.feature.pz[0]]); + best_gene.feature.py[0] = gsl_rng_uniform_int(rng, rows[best_gene.feature.pz[0]]); + for (t = 0;; ++t) + { + g = 0; + if (t % 2 == 0) + { + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (i != best_gene.feature.pz[0] || j != best_gene.feature.px[0] || k != best_gene.feature.py[0]) + { + gene[g] = best_gene; + gene[g].pk = gene[g].nk = 1; + gene[g].feature.nz[0] = i; + gene[g].feature.nx[0] = j; + gene[g].feature.ny[0] = k; + g++; + } + } + else + { + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (i != best_gene.feature.nz[0] || j != best_gene.feature.nx[0] || k != best_gene.feature.ny[0]) + { + gene[g] = best_gene; + gene[g].pk = gene[g].nk = 1; + gene[g].feature.pz[0] = i; + gene[g].feature.px[0] = j; + gene[g].feature.py[0] = k; + g++; + } + } + PRINT(CCV_CLI_INFO, "bootstrapping round : %d\n", t); + ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, 2, posdata, posnum, negdata, negnum, size, pw, nw); + if (local_gene.error >= best_gene.error - 1e-10) + break; + best_gene = local_gene; + } + } + else + { + best_gene.feature = *best_feature; + best_gene.pk = best_gene.nk = best_gene.feature.size; + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + if (best_feature->pz[i] == -1) + { + best_gene.pk = i; + break; + } + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + if (best_feature->nz[i] == -1) + { + best_gene.nk = i; + break; + } + } + /* after bootstrapping, the float search technique will do the following permutations: + * a). add a new point to positive or negative + * b). remove a point from positive or negative + * c). move an existing point in positive or negative to another position + * the three rules applied exhaustively, no heuristic used. */ + for (t = 0;; ++t) + { + g = 0; + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (!_ccv_bbf_exist_gene_feature(&best_gene, j, k, i)) + { + /* add positive point */ + if (best_gene.pk < CCV_BBF_POINT_MAX - 1) + { + gene[g] = best_gene; + gene[g].feature.pz[gene[g].pk] = i; + gene[g].feature.px[gene[g].pk] = j; + gene[g].feature.py[gene[g].pk] = k; + gene[g].pk++; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + /* add negative point */ + if (best_gene.nk < CCV_BBF_POINT_MAX - 1) + { + gene[g] = best_gene; + gene[g].feature.nz[gene[g].nk] = i; + gene[g].feature.nx[gene[g].nk] = j; + gene[g].feature.ny[gene[g].nk] = k; + gene[g].nk++; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + /* refine positive point */ + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + gene[g].feature.pz[q] = i; + gene[g].feature.px[q] = j; + gene[g].feature.py[q] = k; + g++; + } + /* add positive point, remove negative point */ + if (best_gene.pk < CCV_BBF_POINT_MAX - 1 && best_gene.nk > 1) + { + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + gene[g].feature.pz[gene[g].pk] = i; + gene[g].feature.px[gene[g].pk] = j; + gene[g].feature.py[gene[g].pk] = k; + gene[g].pk++; + for (p = q; p < best_gene.nk - 1; p++) + { + gene[g].feature.nz[p] = gene[g].feature.nz[p + 1]; + gene[g].feature.nx[p] = gene[g].feature.nx[p + 1]; + gene[g].feature.ny[p] = gene[g].feature.ny[p + 1]; + } + gene[g].feature.nz[gene[g].nk - 1] = -1; + gene[g].nk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + } + /* refine negative point */ + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + gene[g].feature.nz[q] = i; + gene[g].feature.nx[q] = j; + gene[g].feature.ny[q] = k; + g++; + } + /* add negative point, remove positive point */ + if (best_gene.pk > 1 && best_gene.nk < CCV_BBF_POINT_MAX - 1) + { + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + gene[g].feature.nz[gene[g].nk] = i; + gene[g].feature.nx[gene[g].nk] = j; + gene[g].feature.ny[gene[g].nk] = k; + gene[g].nk++; + for (p = q; p < best_gene.pk - 1; p++) + { + gene[g].feature.pz[p] = gene[g].feature.pz[p + 1]; + gene[g].feature.px[p] = gene[g].feature.px[p + 1]; + gene[g].feature.py[p] = gene[g].feature.py[p + 1]; + } + gene[g].feature.pz[gene[g].pk - 1] = -1; + gene[g].pk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + } + } + if (best_gene.pk > 1) + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + for (i = q; i < best_gene.pk - 1; i++) + { + gene[g].feature.pz[i] = gene[g].feature.pz[i + 1]; + gene[g].feature.px[i] = gene[g].feature.px[i + 1]; + gene[g].feature.py[i] = gene[g].feature.py[i + 1]; + } + gene[g].feature.pz[gene[g].pk - 1] = -1; + gene[g].pk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + if (best_gene.nk > 1) + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + for (i = q; i < best_gene.nk - 1; i++) + { + gene[g].feature.nz[i] = gene[g].feature.nz[i + 1]; + gene[g].feature.nx[i] = gene[g].feature.nx[i + 1]; + gene[g].feature.ny[i] = gene[g].feature.ny[i + 1]; + } + gene[g].feature.nz[gene[g].nk - 1] = -1; + gene[g].nk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + gene[g] = best_gene; + g++; + PRINT(CCV_CLI_INFO, "float search round : %d\n", t); + ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, CCV_BBF_POINT_MIN, posdata, posnum, negdata, negnum, size, pw, nw); + if (local_gene.error >= best_gene.error - 1e-10) + break; + best_gene = local_gene; + } + ccfree(gene); + gsl_rng_free(rng); + return best_gene.feature; +} + +static int _ccv_write_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier) +{ + FILE *w = fopen(file, "wb"); + if (w == 0) + return -1; + fprintf(w, "%d\n", classifier->count); + union { + float fl; + int i; + } fli; + fli.fl = classifier->threshold; + fprintf(w, "%d\n", fli.i); + int i, j; + for (i = 0; i < classifier->count; i++) + { + fprintf(w, "%d\n", classifier->feature[i].size); + for (j = 0; j < classifier->feature[i].size; j++) + { + fprintf(w, "%d %d %d\n", classifier->feature[i].px[j], classifier->feature[i].py[j], classifier->feature[i].pz[j]); + fprintf(w, "%d %d %d\n", classifier->feature[i].nx[j], classifier->feature[i].ny[j], classifier->feature[i].nz[j]); + } + union { + float fl; + int i; + } flia, flib; + flia.fl = classifier->alpha[i * 2]; + flib.fl = classifier->alpha[i * 2 + 1]; + fprintf(w, "%d %d\n", flia.i, flib.i); + } + fclose(w); + return 0; +} + +static int _ccv_read_background_data(const char *file, unsigned char **negdata, int *negnum, ccv_size_t size) +{ + int stat = 0; + FILE *r = fopen(file, "rb"); + if (r == 0) + return -1; + stat |= fread(negnum, sizeof(int), 1, r); + int i; + int isizs012 = _ccv_width_padding(size.width) * size.height + + _ccv_width_padding(size.width >> 1) * (size.height >> 1) + + _ccv_width_padding(size.width >> 2) * (size.height >> 2); + for (i = 0; i < *negnum; i++) + { + negdata[i] = (unsigned char *)ccmalloc(isizs012); + stat |= fread(negdata[i], 1, isizs012, r); + } + fclose(r); + return 0; +} + +static int _ccv_write_background_data(const char *file, unsigned char **negdata, int negnum, ccv_size_t size) +{ + FILE *w = fopen(file, "w"); + if (w == 0) + return -1; + fwrite(&negnum, sizeof(int), 1, w); + int i; + int isizs012 = _ccv_width_padding(size.width) * size.height + + _ccv_width_padding(size.width >> 1) * (size.height >> 1) + + _ccv_width_padding(size.width >> 2) * (size.height >> 2); + for (i = 0; i < negnum; i++) + fwrite(negdata[i], 1, isizs012, w); + fclose(w); + return 0; +} + +static int _ccv_resume_bbf_cascade_training_state(const char *file, int *i, int *k, int *bg, double *pw, double *nw, int posnum, int negnum) +{ + int stat = 0; + FILE *r = fopen(file, "r"); + if (r == 0) + return -1; + stat |= fscanf(r, "%d %d %d", i, k, bg); + int j; + union { + double db; + int i[2]; + } dbi; + for (j = 0; j < posnum; j++) + { + stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]); + pw[j] = dbi.db; + } + for (j = 0; j < negnum; j++) + { + stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]); + nw[j] = dbi.db; + } + fclose(r); + return 0; +} + +static int _ccv_save_bbf_cacade_training_state(const char *file, int i, int k, int bg, double *pw, double *nw, int posnum, int negnum) +{ + FILE *w = fopen(file, "w"); + if (w == 0) + return -1; + fprintf(w, "%d %d %d\n", i, k, bg); + int j; + union { + double db; + int i[2]; + } dbi; + for (j = 0; j < posnum; ++j) + { + dbi.db = pw[j]; + fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]); + } + fprintf(w, "\n"); + for (j = 0; j < negnum; ++j) + { + dbi.db = nw[j]; + fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]); + } + fprintf(w, "\n"); + fclose(w); + return 0; +} + +void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params) +{ + int i, j, k; + /* allocate memory for usage */ + ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + cascade->count = 0; + cascade->size = size; + cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(sizeof(ccv_bbf_stage_classifier_t)); + unsigned char **posdata = (unsigned char **)ccmalloc(posnum * sizeof(unsigned char *)); + unsigned char **negdata = (unsigned char **)ccmalloc(negnum * sizeof(unsigned char *)); + double *pw = (double *)ccmalloc(posnum * sizeof(double)); + double *nw = (double *)ccmalloc(negnum * sizeof(double)); + float *peval = (float *)ccmalloc(posnum * sizeof(float)); + float *neval = (float *)ccmalloc(negnum * sizeof(float)); + double inv_balance_k = 1. / params.balance_k; + /* balance factor k, and weighted with 0.01 */ + params.balance_k *= 0.01; + inv_balance_k *= 0.01; + + int steps[] = {_ccv_width_padding(cascade->size.width), + _ccv_width_padding(cascade->size.width >> 1), + _ccv_width_padding(cascade->size.width >> 2)}; + int isizs0 = steps[0] * cascade->size.height; + int isizs01 = isizs0 + steps[1] * (cascade->size.height >> 1); + + i = 0; + k = 0; + int bg = 0; + int cacheK = 10; + /* state resume code */ + char buf[1024]; + sprintf(buf, "%s/stat.txt", dir); + _ccv_resume_bbf_cascade_training_state(buf, &i, &k, &bg, pw, nw, posnum, negnum); + if (i > 0) + { + cascade->count = i; + ccfree(cascade->stage_classifier); + cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(i * sizeof(ccv_bbf_stage_classifier_t)); + for (j = 0; j < i; j++) + { + sprintf(buf, "%s/stage-%d.txt", dir, j); + _ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[j]); + } + } + if (k > 0) + cacheK = k; + int rpos, rneg = 0; + if (bg) + { + sprintf(buf, "%s/negs.txt", dir); + _ccv_read_background_data(buf, negdata, &rneg, cascade->size); + } + + for (; i < params.layer; i++) + { + if (!bg) + { + rneg = _ccv_prepare_background_data(cascade, bgfiles, bgnum, negdata, negnum); + /* save state of background data */ + sprintf(buf, "%s/negs.txt", dir); + _ccv_write_background_data(buf, negdata, rneg, cascade->size); + bg = 1; + } + double totalw; + /* save state of cascade : level, weight etc. */ + sprintf(buf, "%s/stat.txt", dir); + _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum); + ccv_bbf_stage_classifier_t classifier; + if (k > 0) + { + /* resume state of classifier */ + sprintf(buf, "%s/stage-%d.txt", dir, i); + _ccv_read_bbf_stage_classifier(buf, &classifier); + } + else + { + /* initialize classifier */ + for (j = 0; j < posnum; j++) + pw[j] = params.balance_k; + for (j = 0; j < rneg; j++) + nw[j] = inv_balance_k; + classifier.count = k; + classifier.threshold = 0; + classifier.feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * sizeof(ccv_bbf_feature_t)); + classifier.alpha = (float *)ccmalloc(cacheK * 2 * sizeof(float)); + } + _ccv_prepare_positive_data(posimg, posdata, cascade->size, posnum); + rpos = _ccv_prune_positive_data(cascade, posdata, posnum, cascade->size); + PRINT(CCV_CLI_INFO, "%d postivie data and %d negative data in training\n", rpos, rneg); + /* reweight to 1.00 */ + totalw = 0; + for (j = 0; j < rpos; j++) + totalw += pw[j]; + for (j = 0; j < rneg; j++) + totalw += nw[j]; + for (j = 0; j < rpos; j++) + pw[j] = pw[j] / totalw; + for (j = 0; j < rneg; j++) + nw[j] = nw[j] / totalw; + for (;; k++) + { + /* get overall true-positive, false-positive rate and threshold */ + double tp = 0, fp = 0, etp = 0, efp = 0; + _ccv_bbf_eval_data(&classifier, posdata, rpos, negdata, rneg, cascade->size, peval, neval); + _ccv_sort_32f(peval, rpos, 0); + classifier.threshold = peval[(int)((1. - params.pos_crit) * rpos)] - 1e-6; + for (j = 0; j < rpos; j++) + { + if (peval[j] >= 0) + ++tp; + if (peval[j] >= classifier.threshold) + ++etp; + } + tp /= rpos; + etp /= rpos; + for (j = 0; j < rneg; j++) + { + if (neval[j] >= 0) + ++fp; + if (neval[j] >= classifier.threshold) + ++efp; + } + fp /= rneg; + efp /= rneg; + PRINT(CCV_CLI_INFO, "stage classifier real TP rate : %f, FP rate : %f\n", tp, fp); + PRINT(CCV_CLI_INFO, "stage classifier TP rate : %f, FP rate : %f at threshold : %f\n", etp, efp, classifier.threshold); + if (k > 0) + { + /* save classifier state */ + sprintf(buf, "%s/stage-%d.txt", dir, i); + _ccv_write_bbf_stage_classifier(buf, &classifier); + sprintf(buf, "%s/stat.txt", dir); + _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum); + } + if (etp > params.pos_crit && efp < params.neg_crit) + break; + /* TODO: more post-process is needed in here */ + + /* select the best feature in current distribution through genetic algorithm optimization */ + ccv_bbf_feature_t best; + if (params.optimizer == CCV_BBF_GENETIC_OPT) + { + best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw); + } + else if (params.optimizer == CCV_BBF_FLOAT_OPT) + { + best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, 0, cascade->size, pw, nw); + } + else + { + best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw); + best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, &best, cascade->size, pw, nw); + } + double err = _ccv_bbf_error_rate(&best, posdata, rpos, negdata, rneg, cascade->size, pw, nw); + double rw = (1 - err) / err; + totalw = 0; + /* reweight */ + for (j = 0; j < rpos; j++) + { + unsigned char *u8[] = {posdata[j], posdata[j] + isizs0, posdata[j] + isizs01}; + if (!_ccv_run_bbf_feature(&best, steps, u8)) + pw[j] *= rw; + pw[j] *= params.balance_k; + totalw += pw[j]; + } + for (j = 0; j < rneg; j++) + { + unsigned char *u8[] = {negdata[j], negdata[j] + isizs0, negdata[j] + isizs01}; + if (_ccv_run_bbf_feature(&best, steps, u8)) + nw[j] *= rw; + nw[j] *= inv_balance_k; + totalw += nw[j]; + } + for (j = 0; j < rpos; j++) + pw[j] = pw[j] / totalw; + for (j = 0; j < rneg; j++) + nw[j] = nw[j] / totalw; + double c = log(rw); + PRINT(CCV_CLI_INFO, "coefficient of feature %d: %f\n", k + 1, c); + classifier.count = k + 1; + /* resizing classifier */ + if (k >= cacheK) + { + ccv_bbf_feature_t *feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * 2 * sizeof(ccv_bbf_feature_t)); + memcpy(feature, classifier.feature, cacheK * sizeof(ccv_bbf_feature_t)); + ccfree(classifier.feature); + float *alpha = (float *)ccmalloc(cacheK * 4 * sizeof(float)); + memcpy(alpha, classifier.alpha, cacheK * 2 * sizeof(float)); + ccfree(classifier.alpha); + classifier.feature = feature; + classifier.alpha = alpha; + cacheK *= 2; + } + /* setup new feature */ + classifier.feature[k] = best; + classifier.alpha[k * 2] = -c; + classifier.alpha[k * 2 + 1] = c; + } + cascade->count = i + 1; + ccv_bbf_stage_classifier_t *stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + memcpy(stage_classifier, cascade->stage_classifier, i * sizeof(ccv_bbf_stage_classifier_t)); + ccfree(cascade->stage_classifier); + stage_classifier[i] = classifier; + cascade->stage_classifier = stage_classifier; + k = 0; + bg = 0; + for (j = 0; j < rpos; j++) + ccfree(posdata[j]); + for (j = 0; j < rneg; j++) + ccfree(negdata[j]); + } + + ccfree(neval); + ccfree(peval); + ccfree(nw); + ccfree(pw); + ccfree(negdata); + ccfree(posdata); + ccfree(cascade); +} +#else +void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params) +{ + fprintf(stderr, " ccv_bbf_classifier_cascade_new requires libgsl support, please compile ccv with libgsl.\n"); +} +#endif + +static int _ccv_is_equal(const void *_r1, const void *_r2, void *data) +{ + const ccv_comp_t *r1 = (const ccv_comp_t *)_r1; + const ccv_comp_t *r2 = (const ccv_comp_t *)_r2; + int distance = (int)(r1->rect.width * 0.25 + 0.5); + + return r2->rect.x <= r1->rect.x + distance && + r2->rect.x >= r1->rect.x - distance && + r2->rect.y <= r1->rect.y + distance && + r2->rect.y >= r1->rect.y - distance && + r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) && + (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width; +} + +static int _ccv_is_equal_same_class(const void *_r1, const void *_r2, void *data) +{ + const ccv_comp_t *r1 = (const ccv_comp_t *)_r1; + const ccv_comp_t *r2 = (const ccv_comp_t *)_r2; + int distance = (int)(r1->rect.width * 0.25 + 0.5); + + return r2->classification.id == r1->classification.id && + r2->rect.x <= r1->rect.x + distance && + r2->rect.x >= r1->rect.x - distance && + r2->rect.y <= r1->rect.y + distance && + r2->rect.y >= r1->rect.y - distance && + r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) && + (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width; +} + +ccv_array_t *ccv_bbf_detect_objects(ccv_dense_matrix_t *a, ccv_bbf_classifier_cascade_t **_cascade, int count, ccv_bbf_param_t params) +{ + int hr = a->rows / params.size.height; + int wr = a->cols / params.size.width; + double scale = pow(2., 1. / (params.interval + 1.)); + int next = params.interval + 1; + int scale_upto = (int)(log((double)ccv_min(hr, wr)) / log(scale)); + ccv_dense_matrix_t **pyr = (ccv_dense_matrix_t **)alloca((scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *)); + memset(pyr, 0, (scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *)); + if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width) + ccv_resample(a, &pyr[0], 0, a->rows * _cascade[0]->size.height / params.size.height, a->cols * _cascade[0]->size.width / params.size.width, CCV_INTER_AREA); + else + pyr[0] = a; + int i, j, k, t, x, y, q; + for (i = 1; i < ccv_min(params.interval + 1, scale_upto + next * 2); i++) + ccv_resample(pyr[0], &pyr[i * 4], 0, (int)(pyr[0]->rows / pow(scale, i)), (int)(pyr[0]->cols / pow(scale, i)), CCV_INTER_AREA); + for (i = next; i < scale_upto + next * 2; i++) + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4], 0, 0, 0); + if (params.accurate) + for (i = next * 2; i < scale_upto + next * 2; i++) + { + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 1], 0, 1, 0); + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 2], 0, 0, 1); + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 3], 0, 1, 1); + } + ccv_array_t *idx_seq; + ccv_array_t *seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + ccv_array_t *seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + ccv_array_t *result_seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + /* detect in multi scale */ + for (t = 0; t < count; t++) + { + ccv_bbf_classifier_cascade_t *cascade = _cascade[t]; + float scale_x = (float)params.size.width / (float)cascade->size.width; + float scale_y = (float)params.size.height / (float)cascade->size.height; + ccv_array_clear(seq); + for (i = 0; i < scale_upto; i++) + { + int dx[] = {0, 1, 0, 1}; + int dy[] = {0, 0, 1, 1}; + int i_rows = pyr[i * 4 + next * 8]->rows - (cascade->size.height >> 2); + int steps[] = {pyr[i * 4]->step, pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8]->step}; + int i_cols = pyr[i * 4 + next * 8]->cols - (cascade->size.width >> 2); + int paddings[] = {pyr[i * 4]->step * 4 - i_cols * 4, + pyr[i * 4 + next * 4]->step * 2 - i_cols * 2, + pyr[i * 4 + next * 8]->step - i_cols}; + for (q = 0; q < (params.accurate ? 4 : 1); q++) + { + unsigned char *u8[] = {pyr[i * 4]->data.u8 + dx[q] * 2 + dy[q] * pyr[i * 4]->step * 2, pyr[i * 4 + next * 4]->data.u8 + dx[q] + dy[q] * pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8 + q]->data.u8}; + for (y = 0; y < i_rows; y++) + { + for (x = 0; x < i_cols; x++) + { + float sum; + int flag = 1; + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier; + for (j = 0; j < cascade->count; ++j, ++classifier) + { + sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (k = 0; k < classifier->count; ++k, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + if (sum < classifier->threshold) + { + flag = 0; + break; + } + } + if (flag) + { + ccv_comp_t comp; + comp.rect = ccv_rect((int)((x * 4 + dx[q] * 2) * scale_x + 0.5), (int)((y * 4 + dy[q] * 2) * scale_y + 0.5), (int)(cascade->size.width * scale_x + 0.5), (int)(cascade->size.height * scale_y + 0.5)); + comp.neighbors = 1; + comp.classification.id = t; + comp.classification.confidence = sum; + ccv_array_push(seq, &comp); + } + u8[0] += 4; + u8[1] += 2; + u8[2] += 1; + } + u8[0] += paddings[0]; + u8[1] += paddings[1]; + u8[2] += paddings[2]; + } + } + scale_x *= scale; + scale_y *= scale; + } + + /* the following code from OpenCV's haar feature implementation */ + if (params.min_neighbors == 0) + { + for (i = 0; i < seq->rnum; i++) + { + ccv_comp_t *comp = (ccv_comp_t *)ccv_array_get(seq, i); + ccv_array_push(result_seq, comp); + } + } + else + { + idx_seq = 0; + ccv_array_clear(seq2); + // group retrieved rectangles in order to filter out noise + int ncomp = ccv_array_group(seq, &idx_seq, _ccv_is_equal_same_class, 0); + ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t)); + memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t)); + + // count number of neighbors + for (i = 0; i < seq->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq, i); + int idx = *(int *)ccv_array_get(idx_seq, i); + + if (comps[idx].neighbors == 0) + comps[idx].classification.confidence = r1.classification.confidence; + + ++comps[idx].neighbors; + + comps[idx].rect.x += r1.rect.x; + comps[idx].rect.y += r1.rect.y; + comps[idx].rect.width += r1.rect.width; + comps[idx].rect.height += r1.rect.height; + comps[idx].classification.id = r1.classification.id; + comps[idx].classification.confidence = ccv_max(comps[idx].classification.confidence, r1.classification.confidence); + } + + // calculate average bounding box + for (i = 0; i < ncomp; i++) + { + int n = comps[i].neighbors; + if (n >= params.min_neighbors) + { + ccv_comp_t comp; + comp.rect.x = (comps[i].rect.x * 2 + n) / (2 * n); + comp.rect.y = (comps[i].rect.y * 2 + n) / (2 * n); + comp.rect.width = (comps[i].rect.width * 2 + n) / (2 * n); + comp.rect.height = (comps[i].rect.height * 2 + n) / (2 * n); + comp.neighbors = comps[i].neighbors; + comp.classification.id = comps[i].classification.id; + comp.classification.confidence = comps[i].classification.confidence; + ccv_array_push(seq2, &comp); + } + } + + // filter out small face rectangles inside large face rectangles + for (i = 0; i < seq2->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq2, i); + int flag = 1; + + for (j = 0; j < seq2->rnum; j++) + { + ccv_comp_t r2 = *(ccv_comp_t *)ccv_array_get(seq2, j); + int distance = (int)(r2.rect.width * 0.25 + 0.5); + + if (i != j && + r1.classification.id == r2.classification.id && + r1.rect.x >= r2.rect.x - distance && + r1.rect.y >= r2.rect.y - distance && + r1.rect.x + r1.rect.width <= r2.rect.x + r2.rect.width + distance && + r1.rect.y + r1.rect.height <= r2.rect.y + r2.rect.height + distance && + (r2.neighbors > ccv_max(3, r1.neighbors) || r1.neighbors < 3)) + { + flag = 0; + break; + } + } + + if (flag) + ccv_array_push(result_seq, &r1); + } + ccv_array_free(idx_seq); + ccfree(comps); + } + } + + ccv_array_free(seq); + ccv_array_free(seq2); + + ccv_array_t *result_seq2; + /* the following code from OpenCV's haar feature implementation */ + if (params.flags & CCV_BBF_NO_NESTED) + { + result_seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + idx_seq = 0; + // group retrieved rectangles in order to filter out noise + int ncomp = ccv_array_group(result_seq, &idx_seq, _ccv_is_equal, 0); + ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t)); + memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t)); + + // count number of neighbors + for (i = 0; i < result_seq->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(result_seq, i); + int idx = *(int *)ccv_array_get(idx_seq, i); + + if (comps[idx].neighbors == 0 || comps[idx].classification.confidence < r1.classification.confidence) + { + comps[idx].classification.confidence = r1.classification.confidence; + comps[idx].neighbors = 1; + comps[idx].rect = r1.rect; + comps[idx].classification.id = r1.classification.id; + } + } + + // calculate average bounding box + for (i = 0; i < ncomp; i++) + if (comps[i].neighbors) + ccv_array_push(result_seq2, &comps[i]); + + ccv_array_free(result_seq); + ccfree(comps); + } + else + { + result_seq2 = result_seq; + } + + for (i = 1; i < scale_upto + next * 2; i++) + ccv_matrix_free(pyr[i * 4]); + if (params.accurate) + for (i = next * 2; i < scale_upto + next * 2; i++) + { + ccv_matrix_free(pyr[i * 4 + 1]); + ccv_matrix_free(pyr[i * 4 + 2]); + ccv_matrix_free(pyr[i * 4 + 3]); + } + if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width) + ccv_matrix_free(pyr[0]); + + return result_seq2; +} + +ccv_bbf_classifier_cascade_t *ccv_bbf_read_classifier_cascade(const char *directory) +{ + char buf[1024]; + sprintf(buf, "%s/cascade.txt", directory); + int s, i; + FILE *r = fopen(buf, "r"); + if (r == 0) + return 0; + ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + s = fscanf(r, "%d %d %d", &cascade->count, &cascade->size.width, &cascade->size.height); + assert(s > 0); + cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + for (i = 0; i < cascade->count; i++) + { + sprintf(buf, "%s/stage-%d.txt", directory, i); + if (_ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[i]) < 0) + { + cascade->count = i; + break; + } + } + fclose(r); + return cascade; +} + +ccv_bbf_classifier_cascade_t *ccv_bbf_classifier_cascade_read_binary(char *s) +{ + int i; + ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + memcpy(&cascade->count, s, sizeof(cascade->count)); + s += sizeof(cascade->count); + memcpy(&cascade->size.width, s, sizeof(cascade->size.width)); + s += sizeof(cascade->size.width); + memcpy(&cascade->size.height, s, sizeof(cascade->size.height)); + s += sizeof(cascade->size.height); + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + for (i = 0; i < cascade->count; i++, classifier++) + { + memcpy(&classifier->count, s, sizeof(classifier->count)); + s += sizeof(classifier->count); + memcpy(&classifier->threshold, s, sizeof(classifier->threshold)); + s += sizeof(classifier->threshold); + classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t)); + classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float)); + memcpy(classifier->feature, s, classifier->count * sizeof(ccv_bbf_feature_t)); + s += classifier->count * sizeof(ccv_bbf_feature_t); + memcpy(classifier->alpha, s, classifier->count * 2 * sizeof(float)); + s += classifier->count * 2 * sizeof(float); + } + return cascade; +} + +int ccv_bbf_classifier_cascade_write_binary(ccv_bbf_classifier_cascade_t *cascade, char *s, int slen) +{ + int i; + int len = sizeof(cascade->count) + sizeof(cascade->size.width) + sizeof(cascade->size.height); + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier; + for (i = 0; i < cascade->count; i++, classifier++) + len += sizeof(classifier->count) + sizeof(classifier->threshold) + classifier->count * sizeof(ccv_bbf_feature_t) + classifier->count * 2 * sizeof(float); + if (slen >= len) + { + memcpy(s, &cascade->count, sizeof(cascade->count)); + s += sizeof(cascade->count); + memcpy(s, &cascade->size.width, sizeof(cascade->size.width)); + s += sizeof(cascade->size.width); + memcpy(s, &cascade->size.height, sizeof(cascade->size.height)); + s += sizeof(cascade->size.height); + classifier = cascade->stage_classifier; + for (i = 0; i < cascade->count; i++, classifier++) + { + memcpy(s, &classifier->count, sizeof(classifier->count)); + s += sizeof(classifier->count); + memcpy(s, &classifier->threshold, sizeof(classifier->threshold)); + s += sizeof(classifier->threshold); + memcpy(s, classifier->feature, classifier->count * sizeof(ccv_bbf_feature_t)); + s += classifier->count * sizeof(ccv_bbf_feature_t); + memcpy(s, classifier->alpha, classifier->count * 2 * sizeof(float)); + s += classifier->count * 2 * sizeof(float); + } + } + return len; +} + +void ccv_bbf_classifier_cascade_free(ccv_bbf_classifier_cascade_t *cascade) +{ + int i; + for (i = 0; i < cascade->count; ++i) + { + ccfree(cascade->stage_classifier[i].feature); + ccfree(cascade->stage_classifier[i].alpha); + } + ccfree(cascade->stage_classifier); + ccfree(cascade); +} \ No newline at end of file diff --git a/test/source.c++ b/test/source.c++ new file mode 100644 index 0000000..6a6b390 --- /dev/null +++ b/test/source.c++ @@ -0,0 +1,1502 @@ +#include "ccv.h" +#include "ccv_internal.h" +#include +#ifdef HAVE_GSL +#include +#include +#endif +#ifdef USE_OPENMP +#include +#endif + +const ccv_bbf_param_t ccv_bbf_default_params = { + .interval = 5, + .min_neighbors = 2, + .accurate = 1, + .flags = 0, + .size = { + 24, + 24, + }, +}; + +#define _ccv_width_padding(x) (((x) + 3) & -4) + +static inline int _ccv_run_bbf_feature(ccv_bbf_feature_t* feature, int* step, unsigned char** u8) +{ +#define pf_at(i) (*(u8[feature->pz[i]] + feature->px[i] + feature->py[i] * step[feature->pz[i]])) +#define nf_at(i) (*(u8[feature->nz[i]] + feature->nx[i] + feature->ny[i] * step[feature->nz[i]])) + unsigned char pmin = pf_at(0), nmax = nf_at(0); + /* check if every point in P > every point in N, and take a shortcut */ + if (pmin <= nmax) + return 0; + int i; + for (i = 1; i < feature->size; i++) + { + if (feature->pz[i] >= 0) + { + int p = pf_at(i); + if (p < pmin) + { + if (p <= nmax) + return 0; + pmin = p; + } + } + if (feature->nz[i] >= 0) + { + int n = nf_at(i); + if (n > nmax) + { + if (pmin <= n) + return 0; + nmax = n; + } + } + } +#undef pf_at +#undef nf_at + return 1; +} + +static int _ccv_read_bbf_stage_classifier(const char* file, ccv_bbf_stage_classifier_t* classifier) +{ + FILE* r = fopen(file, "r"); + if (r == 0) return -1; + int stat = 0; + stat |= fscanf(r, "%d", &classifier->count); + union { float fl; int i; } fli; + stat |= fscanf(r, "%d", &fli.i); + classifier->threshold = fli.fl; + classifier->feature = (ccv_bbf_feature_t*)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t)); + classifier->alpha = (float*)ccmalloc(classifier->count * 2 * sizeof(float)); + int i, j; + for (i = 0; i < classifier->count; i++) + { + stat |= fscanf(r, "%d", &classifier->feature[i].size); + for (j = 0; j < classifier->feature[i].size; j++) + { + stat |= fscanf(r, "%d %d %d", &classifier->feature[i].px[j], &classifier->feature[i].py[j], &classifier->feature[i].pz[j]); + stat |= fscanf(r, "%d %d %d", &classifier->feature[i].nx[j], &classifier->feature[i].ny[j], &classifier->feature[i].nz[j]); + } + union { float fl; int i; } flia, flib; + stat |= fscanf(r, "%d %d", &flia.i, &flib.i); + classifier->alpha[i * 2] = flia.fl; + classifier->alpha[i * 2 + 1] = flib.fl; + } + fclose(r); + return 0; +} + +#ifdef HAVE_GSL + +static unsigned int _ccv_bbf_time_measure() +{ + struct timeval tv; + gettimeofday(&tv, 0); + return tv.tv_sec * 1000000 + tv.tv_usec; +} + +#define less_than(a, b, aux) ((a) < (b)) +CCV_IMPLEMENT_QSORT(_ccv_sort_32f, float, less_than) +#undef less_than + +static void _ccv_bbf_eval_data(ccv_bbf_stage_classifier_t* classifier, unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, ccv_size_t size, float* peval, float* neval) +{ + int i, j; + int steps[] = { _ccv_width_padding(size.width), + _ccv_width_padding(size.width >> 1), + _ccv_width_padding(size.width >> 2) }; + int isizs0 = steps[0] * size.height; + int isizs01 = isizs0 + steps[1] * (size.height >> 1); + for (i = 0; i < posnum; i++) + { + unsigned char* u8[] = { posdata[i], posdata[i] + isizs0, posdata[i] + isizs01 }; + float sum = 0; + float* alpha = classifier->alpha; + ccv_bbf_feature_t* feature = classifier->feature; + for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + peval[i] = sum; + } + for (i = 0; i < negnum; i++) + { + unsigned char* u8[] = { negdata[i], negdata[i] + isizs0, negdata[i] + isizs01 }; + float sum = 0; + float* alpha = classifier->alpha; + ccv_bbf_feature_t* feature = classifier->feature; + for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + neval[i] = sum; + } +} + +static int _ccv_prune_positive_data(ccv_bbf_classifier_cascade_t* cascade, unsigned char** posdata, int posnum, ccv_size_t size) +{ + float* peval = (float*)ccmalloc(posnum * sizeof(float)); + int i, j, k, rpos = posnum; + for (i = 0; i < cascade->count; i++) + { + _ccv_bbf_eval_data(cascade->stage_classifier + i, posdata, rpos, 0, 0, size, peval, 0); + k = 0; + for (j = 0; j < rpos; j++) + if (peval[j] >= cascade->stage_classifier[i].threshold) + { + posdata[k] = posdata[j]; + ++k; + } else { + ccfree(posdata[j]); + } + rpos = k; + } + ccfree(peval); + return rpos; +} + +static int _ccv_prepare_background_data(ccv_bbf_classifier_cascade_t* cascade, char** bgfiles, int bgnum, unsigned char** negdata, int negnum) +{ + int t, i, j, k, q; + int negperbg; + int negtotal = 0; + int steps[] = { _ccv_width_padding(cascade->size.width), + _ccv_width_padding(cascade->size.width >> 1), + _ccv_width_padding(cascade->size.width >> 2) }; + int isizs0 = steps[0] * cascade->size.height; + int isizs1 = steps[1] * (cascade->size.height >> 1); + int isizs2 = steps[2] * (cascade->size.height >> 2); + int* idcheck = (int*)ccmalloc(negnum * sizeof(int)); + + gsl_rng_env_setup(); + + gsl_rng* rng = gsl_rng_alloc(gsl_rng_default); + gsl_rng_set(rng, (unsigned long int)idcheck); + + ccv_size_t imgsz = cascade->size; + int rneg = negtotal; + for (t = 0; negtotal < negnum; t++) + { + PRINT(CCV_CLI_INFO, "preparing negative data ... 0%%"); + for (i = 0; i < bgnum; i++) + { + negperbg = (t < 2) ? (negnum - negtotal) / (bgnum - i) + 1 : negnum - negtotal; + ccv_dense_matrix_t* image = 0; + ccv_read(bgfiles[i], &image, CCV_IO_GRAY | CCV_IO_ANY_FILE); + assert((image->type & CCV_C1) && (image->type & CCV_8U)); + if (image == 0) + { + PRINT(CCV_CLI_ERROR, "\n%s file corrupted\n", bgfiles[i]); + continue; + } + if (t % 2 != 0) + ccv_flip(image, 0, 0, CCV_FLIP_X); + if (t % 4 >= 2) + ccv_flip(image, 0, 0, CCV_FLIP_Y); + ccv_bbf_param_t params = { .interval = 3, .min_neighbors = 0, .accurate = 1, .flags = 0, .size = cascade->size }; + ccv_array_t* detected = ccv_bbf_detect_objects(image, &cascade, 1, params); + memset(idcheck, 0, ccv_min(detected->rnum, negperbg) * sizeof(int)); + for (j = 0; j < ccv_min(detected->rnum, negperbg); j++) + { + int r = gsl_rng_uniform_int(rng, detected->rnum); + int flag = 1; + ccv_rect_t* rect = (ccv_rect_t*)ccv_array_get(detected, r); + while (flag) { + flag = 0; + for (k = 0; k < j; k++) + if (r == idcheck[k]) + { + flag = 1; + r = gsl_rng_uniform_int(rng, detected->rnum); + break; + } + rect = (ccv_rect_t*)ccv_array_get(detected, r); + if ((rect->x < 0) || (rect->y < 0) || (rect->width + rect->x > image->cols) || (rect->height + rect->y > image->rows)) + { + flag = 1; + r = gsl_rng_uniform_int(rng, detected->rnum); + } + } + idcheck[j] = r; + ccv_dense_matrix_t* temp = 0; + ccv_dense_matrix_t* imgs0 = 0; + ccv_dense_matrix_t* imgs1 = 0; + ccv_dense_matrix_t* imgs2 = 0; + ccv_slice(image, (ccv_matrix_t**)&temp, 0, rect->y, rect->x, rect->height, rect->width); + ccv_resample(temp, &imgs0, 0, imgsz.height, imgsz.width, CCV_INTER_AREA); + assert(imgs0->step == steps[0]); + ccv_matrix_free(temp); + ccv_sample_down(imgs0, &imgs1, 0, 0, 0); + assert(imgs1->step == steps[1]); + ccv_sample_down(imgs1, &imgs2, 0, 0, 0); + assert(imgs2->step == steps[2]); + + negdata[negtotal] = (unsigned char*)ccmalloc(isizs0 + isizs1 + isizs2); + unsigned char* u8s0 = negdata[negtotal]; + unsigned char* u8s1 = negdata[negtotal] + isizs0; + unsigned char* u8s2 = negdata[negtotal] + isizs0 + isizs1; + unsigned char* u8[] = { u8s0, u8s1, u8s2 }; + memcpy(u8s0, imgs0->data.u8, imgs0->rows * imgs0->step); + ccv_matrix_free(imgs0); + memcpy(u8s1, imgs1->data.u8, imgs1->rows * imgs1->step); + ccv_matrix_free(imgs1); + memcpy(u8s2, imgs2->data.u8, imgs2->rows * imgs2->step); + ccv_matrix_free(imgs2); + + flag = 1; + ccv_bbf_stage_classifier_t* classifier = cascade->stage_classifier; + for (k = 0; k < cascade->count; ++k, ++classifier) + { + float sum = 0; + float* alpha = classifier->alpha; + ccv_bbf_feature_t* feature = classifier->feature; + for (q = 0; q < classifier->count; ++q, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + if (sum < classifier->threshold) + { + flag = 0; + break; + } + } + if (!flag) + ccfree(negdata[negtotal]); + else { + ++negtotal; + if (negtotal >= negnum) + break; + } + } + ccv_array_free(detected); + ccv_matrix_free(image); + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\rpreparing negative data ... %2d%%", 100 * negtotal / negnum); + fflush(0); + if (negtotal >= negnum) + break; + } + if (rneg == negtotal) + break; + rneg = negtotal; + PRINT(CCV_CLI_INFO, "\nentering additional round %d\n", t + 1); + } + gsl_rng_free(rng); + ccfree(idcheck); + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\n"); + return negtotal; +} + +static void _ccv_prepare_positive_data(ccv_dense_matrix_t** posimg, unsigned char** posdata, ccv_size_t size, int posnum) +{ + PRINT(CCV_CLI_INFO, "preparing positive data ... 0%%"); + int i; + for (i = 0; i < posnum; i++) + { + ccv_dense_matrix_t* imgs0 = posimg[i]; + ccv_dense_matrix_t* imgs1 = 0; + ccv_dense_matrix_t* imgs2 = 0; + assert((imgs0->type & CCV_C1) && (imgs0->type & CCV_8U) && imgs0->rows == size.height && imgs0->cols == size.width); + ccv_sample_down(imgs0, &imgs1, 0, 0, 0); + ccv_sample_down(imgs1, &imgs2, 0, 0, 0); + int isizs0 = imgs0->rows * imgs0->step; + int isizs1 = imgs1->rows * imgs1->step; + int isizs2 = imgs2->rows * imgs2->step; + + posdata[i] = (unsigned char*)ccmalloc(isizs0 + isizs1 + isizs2); + memcpy(posdata[i], imgs0->data.u8, isizs0); + memcpy(posdata[i] + isizs0, imgs1->data.u8, isizs1); + memcpy(posdata[i] + isizs0 + isizs1, imgs2->data.u8, isizs2); + + PRINT(CCV_CLI_INFO, "\rpreparing positive data ... %2d%%", 100 * (i + 1) / posnum); + fflush(0); + + ccv_matrix_free(imgs1); + ccv_matrix_free(imgs2); + } + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\n"); +} + +typedef struct { + double fitness; + int pk, nk; + int age; + double error; + ccv_bbf_feature_t feature; +} ccv_bbf_gene_t; + +static inline void _ccv_bbf_genetic_fitness(ccv_bbf_gene_t* gene) +{ + gene->fitness = (1 - gene->error) * exp(-0.01 * gene->age) * exp((gene->pk + gene->nk) * log(1.015)); +} + +static inline int _ccv_bbf_exist_gene_feature(ccv_bbf_gene_t* gene, int x, int y, int z) +{ + int i; + for (i = 0; i < gene->pk; i++) + if (z == gene->feature.pz[i] && x == gene->feature.px[i] && y == gene->feature.py[i]) + return 1; + for (i = 0; i < gene->nk; i++) + if (z == gene->feature.nz[i] && x == gene->feature.nx[i] && y == gene->feature.ny[i]) + return 1; + return 0; +} + +static inline void _ccv_bbf_randomize_gene(gsl_rng* rng, ccv_bbf_gene_t* gene, int* rows, int* cols) +{ + int i; + do { + gene->pk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1; + gene->nk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1; + } while (gene->pk + gene->nk < CCV_BBF_POINT_MIN); /* a hard restriction of at least 3 points have to be examed */ + gene->feature.size = ccv_max(gene->pk, gene->nk); + gene->age = 0; + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + { + gene->feature.pz[i] = -1; + gene->feature.nz[i] = -1; + } + int x, y, z; + for (i = 0; i < gene->pk; i++) + { + do { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(gene, x, y, z)); + gene->feature.pz[i] = z; + gene->feature.px[i] = x; + gene->feature.py[i] = y; + } + for (i = 0; i < gene->nk; i++) + { + do { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while ( _ccv_bbf_exist_gene_feature(gene, x, y, z)); + gene->feature.nz[i] = z; + gene->feature.nx[i] = x; + gene->feature.ny[i] = y; + } +} + +static inline double _ccv_bbf_error_rate(ccv_bbf_feature_t* feature, unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, ccv_size_t size, double* pw, double* nw) +{ + int i; + int steps[] = { _ccv_width_padding(size.width), + _ccv_width_padding(size.width >> 1), + _ccv_width_padding(size.width >> 2) }; + int isizs0 = steps[0] * size.height; + int isizs01 = isizs0 + steps[1] * (size.height >> 1); + double error = 0; + for (i = 0; i < posnum; i++) + { + unsigned char* u8[] = { posdata[i], posdata[i] + isizs0, posdata[i] + isizs01 }; + if (!_ccv_run_bbf_feature(feature, steps, u8)) + error += pw[i]; + } + for (i = 0; i < negnum; i++) + { + unsigned char* u8[] = { negdata[i], negdata[i] + isizs0, negdata[i] + isizs01 }; + if ( _ccv_run_bbf_feature(feature, steps, u8)) + error += nw[i]; + } + return error; +} + +#define less_than(fit1, fit2, aux) ((fit1).fitness >= (fit2).fitness) +static CCV_IMPLEMENT_QSORT(_ccv_bbf_genetic_qsort, ccv_bbf_gene_t, less_than) +#undef less_than + +static ccv_bbf_feature_t _ccv_bbf_genetic_optimize(unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, int ftnum, ccv_size_t size, double* pw, double* nw) +{ + ccv_bbf_feature_t best; + /* seed (random method) */ + gsl_rng_env_setup(); + gsl_rng* rng = gsl_rng_alloc(gsl_rng_default); + union { unsigned long int li; double db; } dbli; + dbli.db = pw[0] + nw[0]; + gsl_rng_set(rng, dbli.li); + int i, j; + int pnum = ftnum * 100; + assert(pnum > 0); + ccv_bbf_gene_t* gene = (ccv_bbf_gene_t*)ccmalloc(pnum * sizeof(ccv_bbf_gene_t)); + int rows[] = { size.height, size.height >> 1, size.height >> 2 }; + int cols[] = { size.width, size.width >> 1, size.width >> 2 }; + for (i = 0; i < pnum; i++) + _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols); + unsigned int timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + for (i = 0; i < pnum; i++) + _ccv_bbf_genetic_fitness(&gene[i]); + double best_err = 1; + int rnum = ftnum * 39; /* number of randomize */ + int mnum = ftnum * 40; /* number of mutation */ + int hnum = ftnum * 20; /* number of hybrid */ + /* iteration stop crit : best no change in 40 iterations */ + int it = 0, t; + for (t = 0 ; it < 40; ++it, ++t) + { + int min_id = 0; + double min_err = gene[0].error; + for (i = 1; i < pnum; i++) + if (gene[i].error < min_err) + { + min_id = i; + min_err = gene[i].error; + } + min_err = gene[min_id].error = _ccv_bbf_error_rate(&gene[min_id].feature, posdata, posnum, negdata, negnum, size, pw, nw); + if (min_err < best_err) + { + best_err = min_err; + memcpy(&best, &gene[min_id].feature, sizeof(best)); + PRINT(CCV_CLI_INFO, "best bbf feature with error %f\n|-size: %d\n|-positive point: ", best_err, best.size); + for (i = 0; i < best.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.px[i], best.py[i], best.pz[i]); + PRINT(CCV_CLI_INFO, "\n|-negative point: "); + for (i = 0; i < best.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.nx[i], best.ny[i], best.nz[i]); + PRINT(CCV_CLI_INFO, "\n"); + it = 0; + } + PRINT(CCV_CLI_INFO, "minimum error achieved in round %d(%d) : %f with %d ms\n", t, it, min_err, timer / 1000); + _ccv_bbf_genetic_qsort(gene, pnum, 0); + for (i = 0; i < ftnum; i++) + ++gene[i].age; + for (i = ftnum; i < ftnum + mnum; i++) + { + int parent = gsl_rng_uniform_int(rng, ftnum); + memcpy(gene + i, gene + parent, sizeof(ccv_bbf_gene_t)); + /* three mutation strategy : 1. add, 2. remove, 3. refine */ + int pnm, pn = gsl_rng_uniform_int(rng, 2); + int* pnk[] = { &gene[i].pk, &gene[i].nk }; + int* pnx[] = { gene[i].feature.px, gene[i].feature.nx }; + int* pny[] = { gene[i].feature.py, gene[i].feature.ny }; + int* pnz[] = { gene[i].feature.pz, gene[i].feature.nz }; + int x, y, z; + int victim, decay = 1; + do { + switch (gsl_rng_uniform_int(rng, 3)) + { + case 0: /* add */ + if (gene[i].pk == CCV_BBF_POINT_MAX && gene[i].nk == CCV_BBF_POINT_MAX) + break; + while (*pnk[pn] + 1 > CCV_BBF_POINT_MAX) + pn = gsl_rng_uniform_int(rng, 2); + do { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z)); + pnz[pn][*pnk[pn]] = z; + pnx[pn][*pnk[pn]] = x; + pny[pn][*pnk[pn]] = y; + ++(*pnk[pn]); + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + decay = gene[i].age = 0; + break; + case 1: /* remove */ + if (gene[i].pk + gene[i].nk <= CCV_BBF_POINT_MIN) /* at least 3 points have to be examed */ + break; + while (*pnk[pn] - 1 <= 0) // || *pnk[pn] + *pnk[!pn] - 1 < CCV_BBF_POINT_MIN) + pn = gsl_rng_uniform_int(rng, 2); + victim = gsl_rng_uniform_int(rng, *pnk[pn]); + for (j = victim; j < *pnk[pn] - 1; j++) + { + pnz[pn][j] = pnz[pn][j + 1]; + pnx[pn][j] = pnx[pn][j + 1]; + pny[pn][j] = pny[pn][j + 1]; + } + pnz[pn][*pnk[pn] - 1] = -1; + --(*pnk[pn]); + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + decay = gene[i].age = 0; + break; + case 2: /* refine */ + pnm = gsl_rng_uniform_int(rng, *pnk[pn]); + do { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z)); + pnz[pn][pnm] = z; + pnx[pn][pnm] = x; + pny[pn][pnm] = y; + decay = gene[i].age = 0; + break; + } + } while (decay); + } + for (i = ftnum + mnum; i < ftnum + mnum + hnum; i++) + { + /* hybrid strategy: taking positive points from dad, negative points from mum */ + int dad, mum; + do { + dad = gsl_rng_uniform_int(rng, ftnum); + mum = gsl_rng_uniform_int(rng, ftnum); + } while (dad == mum || gene[dad].pk + gene[mum].nk < CCV_BBF_POINT_MIN); /* at least 3 points have to be examed */ + for (j = 0; j < CCV_BBF_POINT_MAX; j++) + { + gene[i].feature.pz[j] = -1; + gene[i].feature.nz[j] = -1; + } + gene[i].pk = gene[dad].pk; + for (j = 0; j < gene[i].pk; j++) + { + gene[i].feature.pz[j] = gene[dad].feature.pz[j]; + gene[i].feature.px[j] = gene[dad].feature.px[j]; + gene[i].feature.py[j] = gene[dad].feature.py[j]; + } + gene[i].nk = gene[mum].nk; + for (j = 0; j < gene[i].nk; j++) + { + gene[i].feature.nz[j] = gene[mum].feature.nz[j]; + gene[i].feature.nx[j] = gene[mum].feature.nx[j]; + gene[i].feature.ny[j] = gene[mum].feature.ny[j]; + } + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + gene[i].age = 0; + } + for (i = ftnum + mnum + hnum; i < ftnum + mnum + hnum + rnum; i++) + _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols); + timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + for (i = 0; i < pnum; i++) + _ccv_bbf_genetic_fitness(&gene[i]); + } + ccfree(gene); + gsl_rng_free(rng); + return best; +} + +#define less_than(fit1, fit2, aux) ((fit1).error < (fit2).error) +static CCV_IMPLEMENT_QSORT(_ccv_bbf_best_qsort, ccv_bbf_gene_t, less_than) +#undef less_than + +static ccv_bbf_gene_t _ccv_bbf_best_gene(ccv_bbf_gene_t* gene, int pnum, int point_min, unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, ccv_size_t size, double* pw, double* nw) +{ + int i; + unsigned int timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + _ccv_bbf_best_qsort(gene, pnum, 0); + int min_id = 0; + double min_err = gene[0].error; + for (i = 0; i < pnum; i++) + if (gene[i].nk + gene[i].pk >= point_min) + { + min_id = i; + min_err = gene[i].error; + break; + } + PRINT(CCV_CLI_INFO, "local best bbf feature with error %f\n|-size: %d\n|-positive point: ", min_err, gene[min_id].feature.size); + for (i = 0; i < gene[min_id].feature.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.px[i], gene[min_id].feature.py[i], gene[min_id].feature.pz[i]); + PRINT(CCV_CLI_INFO, "\n|-negative point: "); + for (i = 0; i < gene[min_id].feature.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.nx[i], gene[min_id].feature.ny[i], gene[min_id].feature.nz[i]); + PRINT(CCV_CLI_INFO, "\nthe computation takes %d ms\n", timer / 1000); + return gene[min_id]; +} + +static ccv_bbf_feature_t _ccv_bbf_convex_optimize(unsigned char** posdata, int posnum, unsigned char** negdata, int negnum, ccv_bbf_feature_t* best_feature, ccv_size_t size, double* pw, double* nw) +{ + ccv_bbf_gene_t best_gene; + /* seed (random method) */ + gsl_rng_env_setup(); + gsl_rng* rng = gsl_rng_alloc(gsl_rng_default); + union { unsigned long int li; double db; } dbli; + dbli.db = pw[0] + nw[0]; + gsl_rng_set(rng, dbli.li); + int i, j, k, q, p, g, t; + int rows[] = { size.height, size.height >> 1, size.height >> 2 }; + int cols[] = { size.width, size.width >> 1, size.width >> 2 }; + int pnum = rows[0] * cols[0] + rows[1] * cols[1] + rows[2] * cols[2]; + ccv_bbf_gene_t* gene = (ccv_bbf_gene_t*)ccmalloc((pnum * (CCV_BBF_POINT_MAX * 2 + 1) * 2 + CCV_BBF_POINT_MAX * 2 + 1) * sizeof(ccv_bbf_gene_t)); + if (best_feature == 0) + { + /* bootstrapping the best feature, start from two pixels, one for positive, one for negative + * the bootstrapping process go like this: first, it will assign a random pixel as positive + * and enumerate every possible pixel as negative, and pick the best one. Then, enumerate every + * possible pixel as positive, and pick the best one, until it converges */ + memset(&best_gene, 0, sizeof(ccv_bbf_gene_t)); + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + best_gene.feature.pz[i] = best_gene.feature.nz[i] = -1; + best_gene.pk = 1; + best_gene.nk = 0; + best_gene.feature.size = 1; + best_gene.feature.pz[0] = gsl_rng_uniform_int(rng, 3); + best_gene.feature.px[0] = gsl_rng_uniform_int(rng, cols[best_gene.feature.pz[0]]); + best_gene.feature.py[0] = gsl_rng_uniform_int(rng, rows[best_gene.feature.pz[0]]); + for (t = 0; ; ++t) + { + g = 0; + if (t % 2 == 0) + { + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (i != best_gene.feature.pz[0] || j != best_gene.feature.px[0] || k != best_gene.feature.py[0]) + { + gene[g] = best_gene; + gene[g].pk = gene[g].nk = 1; + gene[g].feature.nz[0] = i; + gene[g].feature.nx[0] = j; + gene[g].feature.ny[0] = k; + g++; + } + } else { + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (i != best_gene.feature.nz[0] || j != best_gene.feature.nx[0] || k != best_gene.feature.ny[0]) + { + gene[g] = best_gene; + gene[g].pk = gene[g].nk = 1; + gene[g].feature.pz[0] = i; + gene[g].feature.px[0] = j; + gene[g].feature.py[0] = k; + g++; + } + } + PRINT(CCV_CLI_INFO, "bootstrapping round : %d\n", t); + ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, 2, posdata, posnum, negdata, negnum, size, pw, nw); + if (local_gene.error >= best_gene.error - 1e-10) + break; + best_gene = local_gene; + } + } else { + best_gene.feature = *best_feature; + best_gene.pk = best_gene.nk = best_gene.feature.size; + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + if (best_feature->pz[i] == -1) + { + best_gene.pk = i; + break; + } + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + if (best_feature->nz[i] == -1) + { + best_gene.nk = i; + break; + } + } + /* after bootstrapping, the float search technique will do the following permutations: + * a). add a new point to positive or negative + * b). remove a point from positive or negative + * c). move an existing point in positive or negative to another position + * the three rules applied exhaustively, no heuristic used. */ + for (t = 0; ; ++t) + { + g = 0; + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (!_ccv_bbf_exist_gene_feature(&best_gene, j, k, i)) + { + /* add positive point */ + if (best_gene.pk < CCV_BBF_POINT_MAX - 1) + { + gene[g] = best_gene; + gene[g].feature.pz[gene[g].pk] = i; + gene[g].feature.px[gene[g].pk] = j; + gene[g].feature.py[gene[g].pk] = k; + gene[g].pk++; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + /* add negative point */ + if (best_gene.nk < CCV_BBF_POINT_MAX - 1) + { + gene[g] = best_gene; + gene[g].feature.nz[gene[g].nk] = i; + gene[g].feature.nx[gene[g].nk] = j; + gene[g].feature.ny[gene[g].nk] = k; + gene[g].nk++; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + /* refine positive point */ + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + gene[g].feature.pz[q] = i; + gene[g].feature.px[q] = j; + gene[g].feature.py[q] = k; + g++; + } + /* add positive point, remove negative point */ + if (best_gene.pk < CCV_BBF_POINT_MAX - 1 && best_gene.nk > 1) + { + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + gene[g].feature.pz[gene[g].pk] = i; + gene[g].feature.px[gene[g].pk] = j; + gene[g].feature.py[gene[g].pk] = k; + gene[g].pk++; + for (p = q; p < best_gene.nk - 1; p++) + { + gene[g].feature.nz[p] = gene[g].feature.nz[p + 1]; + gene[g].feature.nx[p] = gene[g].feature.nx[p + 1]; + gene[g].feature.ny[p] = gene[g].feature.ny[p + 1]; + } + gene[g].feature.nz[gene[g].nk - 1] = -1; + gene[g].nk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + } + /* refine negative point */ + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + gene[g].feature.nz[q] = i; + gene[g].feature.nx[q] = j; + gene[g].feature.ny[q] = k; + g++; + } + /* add negative point, remove positive point */ + if (best_gene.pk > 1 && best_gene.nk < CCV_BBF_POINT_MAX - 1) + { + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + gene[g].feature.nz[gene[g].nk] = i; + gene[g].feature.nx[gene[g].nk] = j; + gene[g].feature.ny[gene[g].nk] = k; + gene[g].nk++; + for (p = q; p < best_gene.pk - 1; p++) + { + gene[g].feature.pz[p] = gene[g].feature.pz[p + 1]; + gene[g].feature.px[p] = gene[g].feature.px[p + 1]; + gene[g].feature.py[p] = gene[g].feature.py[p + 1]; + } + gene[g].feature.pz[gene[g].pk - 1] = -1; + gene[g].pk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + } + } + if (best_gene.pk > 1) + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + for (i = q; i < best_gene.pk - 1; i++) + { + gene[g].feature.pz[i] = gene[g].feature.pz[i + 1]; + gene[g].feature.px[i] = gene[g].feature.px[i + 1]; + gene[g].feature.py[i] = gene[g].feature.py[i + 1]; + } + gene[g].feature.pz[gene[g].pk - 1] = -1; + gene[g].pk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + if (best_gene.nk > 1) + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + for (i = q; i < best_gene.nk - 1; i++) + { + gene[g].feature.nz[i] = gene[g].feature.nz[i + 1]; + gene[g].feature.nx[i] = gene[g].feature.nx[i + 1]; + gene[g].feature.ny[i] = gene[g].feature.ny[i + 1]; + } + gene[g].feature.nz[gene[g].nk - 1] = -1; + gene[g].nk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + gene[g] = best_gene; + g++; + PRINT(CCV_CLI_INFO, "float search round : %d\n", t); + ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, CCV_BBF_POINT_MIN, posdata, posnum, negdata, negnum, size, pw, nw); + if (local_gene.error >= best_gene.error - 1e-10) + break; + best_gene = local_gene; + } + ccfree(gene); + gsl_rng_free(rng); + return best_gene.feature; +} + +static int _ccv_write_bbf_stage_classifier(const char* file, ccv_bbf_stage_classifier_t* classifier) +{ + FILE* w = fopen(file, "wb"); + if (w == 0) return -1; + fprintf(w, "%d\n", classifier->count); + union { float fl; int i; } fli; + fli.fl = classifier->threshold; + fprintf(w, "%d\n", fli.i); + int i, j; + for (i = 0; i < classifier->count; i++) + { + fprintf(w, "%d\n", classifier->feature[i].size); + for (j = 0; j < classifier->feature[i].size; j++) + { + fprintf(w, "%d %d %d\n", classifier->feature[i].px[j], classifier->feature[i].py[j], classifier->feature[i].pz[j]); + fprintf(w, "%d %d %d\n", classifier->feature[i].nx[j], classifier->feature[i].ny[j], classifier->feature[i].nz[j]); + } + union { float fl; int i; } flia, flib; + flia.fl = classifier->alpha[i * 2]; + flib.fl = classifier->alpha[i * 2 + 1]; + fprintf(w, "%d %d\n", flia.i, flib.i); + } + fclose(w); + return 0; +} + +static int _ccv_read_background_data(const char* file, unsigned char** negdata, int* negnum, ccv_size_t size) +{ + int stat = 0; + FILE* r = fopen(file, "rb"); + if (r == 0) return -1; + stat |= fread(negnum, sizeof(int), 1, r); + int i; + int isizs012 = _ccv_width_padding(size.width) * size.height + + _ccv_width_padding(size.width >> 1) * (size.height >> 1) + + _ccv_width_padding(size.width >> 2) * (size.height >> 2); + for (i = 0; i < *negnum; i++) + { + negdata[i] = (unsigned char*)ccmalloc(isizs012); + stat |= fread(negdata[i], 1, isizs012, r); + } + fclose(r); + return 0; +} + +static int _ccv_write_background_data(const char* file, unsigned char** negdata, int negnum, ccv_size_t size) +{ + FILE* w = fopen(file, "w"); + if (w == 0) return -1; + fwrite(&negnum, sizeof(int), 1, w); + int i; + int isizs012 = _ccv_width_padding(size.width) * size.height + + _ccv_width_padding(size.width >> 1) * (size.height >> 1) + + _ccv_width_padding(size.width >> 2) * (size.height >> 2); + for (i = 0; i < negnum; i++) + fwrite(negdata[i], 1, isizs012, w); + fclose(w); + return 0; +} + +static int _ccv_resume_bbf_cascade_training_state(const char* file, int* i, int* k, int* bg, double* pw, double* nw, int posnum, int negnum) +{ + int stat = 0; + FILE* r = fopen(file, "r"); + if (r == 0) return -1; + stat |= fscanf(r, "%d %d %d", i, k, bg); + int j; + union { double db; int i[2]; } dbi; + for (j = 0; j < posnum; j++) + { + stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]); + pw[j] = dbi.db; + } + for (j = 0; j < negnum; j++) + { + stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]); + nw[j] = dbi.db; + } + fclose(r); + return 0; +} + +static int _ccv_save_bbf_cacade_training_state(const char* file, int i, int k, int bg, double* pw, double* nw, int posnum, int negnum) +{ + FILE* w = fopen(file, "w"); + if (w == 0) return -1; + fprintf(w, "%d %d %d\n", i, k, bg); + int j; + union { double db; int i[2]; } dbi; + for (j = 0; j < posnum; ++j) + { + dbi.db = pw[j]; + fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]); + } + fprintf(w, "\n"); + for (j = 0; j < negnum; ++j) + { + dbi.db = nw[j]; + fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]); + } + fprintf(w, "\n"); + fclose(w); + return 0; +} + +void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t** posimg, int posnum, char** bgfiles, int bgnum, int negnum, ccv_size_t size, const char* dir, ccv_bbf_new_param_t params) +{ + int i, j, k; + /* allocate memory for usage */ + ccv_bbf_classifier_cascade_t* cascade = (ccv_bbf_classifier_cascade_t*)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + cascade->count = 0; + cascade->size = size; + cascade->stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(sizeof(ccv_bbf_stage_classifier_t)); + unsigned char** posdata = (unsigned char**)ccmalloc(posnum * sizeof(unsigned char*)); + unsigned char** negdata = (unsigned char**)ccmalloc(negnum * sizeof(unsigned char*)); + double* pw = (double*)ccmalloc(posnum * sizeof(double)); + double* nw = (double*)ccmalloc(negnum * sizeof(double)); + float* peval = (float*)ccmalloc(posnum * sizeof(float)); + float* neval = (float*)ccmalloc(negnum * sizeof(float)); + double inv_balance_k = 1. / params.balance_k; + /* balance factor k, and weighted with 0.01 */ + params.balance_k *= 0.01; + inv_balance_k *= 0.01; + + int steps[] = { _ccv_width_padding(cascade->size.width), + _ccv_width_padding(cascade->size.width >> 1), + _ccv_width_padding(cascade->size.width >> 2) }; + int isizs0 = steps[0] * cascade->size.height; + int isizs01 = isizs0 + steps[1] * (cascade->size.height >> 1); + + i = 0; + k = 0; + int bg = 0; + int cacheK = 10; + /* state resume code */ + char buf[1024]; + sprintf(buf, "%s/stat.txt", dir); + _ccv_resume_bbf_cascade_training_state(buf, &i, &k, &bg, pw, nw, posnum, negnum); + if (i > 0) + { + cascade->count = i; + ccfree(cascade->stage_classifier); + cascade->stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(i * sizeof(ccv_bbf_stage_classifier_t)); + for (j = 0; j < i; j++) + { + sprintf(buf, "%s/stage-%d.txt", dir, j); + _ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[j]); + } + } + if (k > 0) + cacheK = k; + int rpos, rneg = 0; + if (bg) + { + sprintf(buf, "%s/negs.txt", dir); + _ccv_read_background_data(buf, negdata, &rneg, cascade->size); + } + + for (; i < params.layer; i++) + { + if (!bg) + { + rneg = _ccv_prepare_background_data(cascade, bgfiles, bgnum, negdata, negnum); + /* save state of background data */ + sprintf(buf, "%s/negs.txt", dir); + _ccv_write_background_data(buf, negdata, rneg, cascade->size); + bg = 1; + } + double totalw; + /* save state of cascade : level, weight etc. */ + sprintf(buf, "%s/stat.txt", dir); + _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum); + ccv_bbf_stage_classifier_t classifier; + if (k > 0) + { + /* resume state of classifier */ + sprintf( buf, "%s/stage-%d.txt", dir, i ); + _ccv_read_bbf_stage_classifier(buf, &classifier); + } else { + /* initialize classifier */ + for (j = 0; j < posnum; j++) + pw[j] = params.balance_k; + for (j = 0; j < rneg; j++) + nw[j] = inv_balance_k; + classifier.count = k; + classifier.threshold = 0; + classifier.feature = (ccv_bbf_feature_t*)ccmalloc(cacheK * sizeof(ccv_bbf_feature_t)); + classifier.alpha = (float*)ccmalloc(cacheK * 2 * sizeof(float)); + } + _ccv_prepare_positive_data(posimg, posdata, cascade->size, posnum); + rpos = _ccv_prune_positive_data(cascade, posdata, posnum, cascade->size); + PRINT(CCV_CLI_INFO, "%d postivie data and %d negative data in training\n", rpos, rneg); + /* reweight to 1.00 */ + totalw = 0; + for (j = 0; j < rpos; j++) + totalw += pw[j]; + for (j = 0; j < rneg; j++) + totalw += nw[j]; + for (j = 0; j < rpos; j++) + pw[j] = pw[j] / totalw; + for (j = 0; j < rneg; j++) + nw[j] = nw[j] / totalw; + for (; ; k++) + { + /* get overall true-positive, false-positive rate and threshold */ + double tp = 0, fp = 0, etp = 0, efp = 0; + _ccv_bbf_eval_data(&classifier, posdata, rpos, negdata, rneg, cascade->size, peval, neval); + _ccv_sort_32f(peval, rpos, 0); + classifier.threshold = peval[(int)((1. - params.pos_crit) * rpos)] - 1e-6; + for (j = 0; j < rpos; j++) + { + if (peval[j] >= 0) + ++tp; + if (peval[j] >= classifier.threshold) + ++etp; + } + tp /= rpos; etp /= rpos; + for (j = 0; j < rneg; j++) + { + if (neval[j] >= 0) + ++fp; + if (neval[j] >= classifier.threshold) + ++efp; + } + fp /= rneg; efp /= rneg; + PRINT(CCV_CLI_INFO, "stage classifier real TP rate : %f, FP rate : %f\n", tp, fp); + PRINT(CCV_CLI_INFO, "stage classifier TP rate : %f, FP rate : %f at threshold : %f\n", etp, efp, classifier.threshold); + if (k > 0) + { + /* save classifier state */ + sprintf(buf, "%s/stage-%d.txt", dir, i); + _ccv_write_bbf_stage_classifier(buf, &classifier); + sprintf(buf, "%s/stat.txt", dir); + _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum); + } + if (etp > params.pos_crit && efp < params.neg_crit) + break; + /* TODO: more post-process is needed in here */ + + /* select the best feature in current distribution through genetic algorithm optimization */ + ccv_bbf_feature_t best; + if (params.optimizer == CCV_BBF_GENETIC_OPT) + { + best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw); + } else if (params.optimizer == CCV_BBF_FLOAT_OPT) { + best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, 0, cascade->size, pw, nw); + } else { + best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw); + best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, &best, cascade->size, pw, nw); + } + double err = _ccv_bbf_error_rate(&best, posdata, rpos, negdata, rneg, cascade->size, pw, nw); + double rw = (1 - err) / err; + totalw = 0; + /* reweight */ + for (j = 0; j < rpos; j++) + { + unsigned char* u8[] = { posdata[j], posdata[j] + isizs0, posdata[j] + isizs01 }; + if (!_ccv_run_bbf_feature(&best, steps, u8)) + pw[j] *= rw; + pw[j] *= params.balance_k; + totalw += pw[j]; + } + for (j = 0; j < rneg; j++) + { + unsigned char* u8[] = { negdata[j], negdata[j] + isizs0, negdata[j] + isizs01 }; + if (_ccv_run_bbf_feature(&best, steps, u8)) + nw[j] *= rw; + nw[j] *= inv_balance_k; + totalw += nw[j]; + } + for (j = 0; j < rpos; j++) + pw[j] = pw[j] / totalw; + for (j = 0; j < rneg; j++) + nw[j] = nw[j] / totalw; + double c = log(rw); + PRINT(CCV_CLI_INFO, "coefficient of feature %d: %f\n", k + 1, c); + classifier.count = k + 1; + /* resizing classifier */ + if (k >= cacheK) + { + ccv_bbf_feature_t* feature = (ccv_bbf_feature_t*)ccmalloc(cacheK * 2 * sizeof(ccv_bbf_feature_t)); + memcpy(feature, classifier.feature, cacheK * sizeof(ccv_bbf_feature_t)); + ccfree(classifier.feature); + float* alpha = (float*)ccmalloc(cacheK * 4 * sizeof(float)); + memcpy(alpha, classifier.alpha, cacheK * 2 * sizeof(float)); + ccfree(classifier.alpha); + classifier.feature = feature; + classifier.alpha = alpha; + cacheK *= 2; + } + /* setup new feature */ + classifier.feature[k] = best; + classifier.alpha[k * 2] = -c; + classifier.alpha[k * 2 + 1] = c; + } + cascade->count = i + 1; + ccv_bbf_stage_classifier_t* stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + memcpy(stage_classifier, cascade->stage_classifier, i * sizeof(ccv_bbf_stage_classifier_t)); + ccfree(cascade->stage_classifier); + stage_classifier[i] = classifier; + cascade->stage_classifier = stage_classifier; + k = 0; + bg = 0; + for (j = 0; j < rpos; j++) + ccfree(posdata[j]); + for (j = 0; j < rneg; j++) + ccfree(negdata[j]); + } + + ccfree(neval); + ccfree(peval); + ccfree(nw); + ccfree(pw); + ccfree(negdata); + ccfree(posdata); + ccfree(cascade); +} +#else +void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t** posimg, int posnum, char** bgfiles, int bgnum, int negnum, ccv_size_t size, const char* dir, ccv_bbf_new_param_t params) +{ + fprintf(stderr, " ccv_bbf_classifier_cascade_new requires libgsl support, please compile ccv with libgsl.\n"); +} +#endif + +static int _ccv_is_equal(const void* _r1, const void* _r2, void* data) +{ + const ccv_comp_t* r1 = (const ccv_comp_t*)_r1; + const ccv_comp_t* r2 = (const ccv_comp_t*)_r2; + int distance = (int)(r1->rect.width * 0.25 + 0.5); + + return r2->rect.x <= r1->rect.x + distance && + r2->rect.x >= r1->rect.x - distance && + r2->rect.y <= r1->rect.y + distance && + r2->rect.y >= r1->rect.y - distance && + r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) && + (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width; +} + +static int _ccv_is_equal_same_class(const void* _r1, const void* _r2, void* data) +{ + const ccv_comp_t* r1 = (const ccv_comp_t*)_r1; + const ccv_comp_t* r2 = (const ccv_comp_t*)_r2; + int distance = (int)(r1->rect.width * 0.25 + 0.5); + + return r2->classification.id == r1->classification.id && + r2->rect.x <= r1->rect.x + distance && + r2->rect.x >= r1->rect.x - distance && + r2->rect.y <= r1->rect.y + distance && + r2->rect.y >= r1->rect.y - distance && + r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) && + (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width; +} + +ccv_array_t* ccv_bbf_detect_objects(ccv_dense_matrix_t* a, ccv_bbf_classifier_cascade_t** _cascade, int count, ccv_bbf_param_t params) +{ + int hr = a->rows / params.size.height; + int wr = a->cols / params.size.width; + double scale = pow(2., 1. / (params.interval + 1.)); + int next = params.interval + 1; + int scale_upto = (int)(log((double)ccv_min(hr, wr)) / log(scale)); + ccv_dense_matrix_t** pyr = (ccv_dense_matrix_t**)alloca((scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t*)); + memset(pyr, 0, (scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t*)); + if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width) + ccv_resample(a, &pyr[0], 0, a->rows * _cascade[0]->size.height / params.size.height, a->cols * _cascade[0]->size.width / params.size.width, CCV_INTER_AREA); + else + pyr[0] = a; + int i, j, k, t, x, y, q; + for (i = 1; i < ccv_min(params.interval + 1, scale_upto + next * 2); i++) + ccv_resample(pyr[0], &pyr[i * 4], 0, (int)(pyr[0]->rows / pow(scale, i)), (int)(pyr[0]->cols / pow(scale, i)), CCV_INTER_AREA); + for (i = next; i < scale_upto + next * 2; i++) + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4], 0, 0, 0); + if (params.accurate) + for (i = next * 2; i < scale_upto + next * 2; i++) + { + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 1], 0, 1, 0); + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 2], 0, 0, 1); + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 3], 0, 1, 1); + } + ccv_array_t* idx_seq; + ccv_array_t* seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + ccv_array_t* seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + ccv_array_t* result_seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + /* detect in multi scale */ + for (t = 0; t < count; t++) + { + ccv_bbf_classifier_cascade_t* cascade = _cascade[t]; + float scale_x = (float) params.size.width / (float) cascade->size.width; + float scale_y = (float) params.size.height / (float) cascade->size.height; + ccv_array_clear(seq); + for (i = 0; i < scale_upto; i++) + { + int dx[] = {0, 1, 0, 1}; + int dy[] = {0, 0, 1, 1}; + int i_rows = pyr[i * 4 + next * 8]->rows - (cascade->size.height >> 2); + int steps[] = { pyr[i * 4]->step, pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8]->step }; + int i_cols = pyr[i * 4 + next * 8]->cols - (cascade->size.width >> 2); + int paddings[] = { pyr[i * 4]->step * 4 - i_cols * 4, + pyr[i * 4 + next * 4]->step * 2 - i_cols * 2, + pyr[i * 4 + next * 8]->step - i_cols }; + for (q = 0; q < (params.accurate ? 4 : 1); q++) + { + unsigned char* u8[] = { pyr[i * 4]->data.u8 + dx[q] * 2 + dy[q] * pyr[i * 4]->step * 2, pyr[i * 4 + next * 4]->data.u8 + dx[q] + dy[q] * pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8 + q]->data.u8 }; + for (y = 0; y < i_rows; y++) + { + for (x = 0; x < i_cols; x++) + { + float sum; + int flag = 1; + ccv_bbf_stage_classifier_t* classifier = cascade->stage_classifier; + for (j = 0; j < cascade->count; ++j, ++classifier) + { + sum = 0; + float* alpha = classifier->alpha; + ccv_bbf_feature_t* feature = classifier->feature; + for (k = 0; k < classifier->count; ++k, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + if (sum < classifier->threshold) + { + flag = 0; + break; + } + } + if (flag) + { + ccv_comp_t comp; + comp.rect = ccv_rect((int)((x * 4 + dx[q] * 2) * scale_x + 0.5), (int)((y * 4 + dy[q] * 2) * scale_y + 0.5), (int)(cascade->size.width * scale_x + 0.5), (int)(cascade->size.height * scale_y + 0.5)); + comp.neighbors = 1; + comp.classification.id = t; + comp.classification.confidence = sum; + ccv_array_push(seq, &comp); + } + u8[0] += 4; + u8[1] += 2; + u8[2] += 1; + } + u8[0] += paddings[0]; + u8[1] += paddings[1]; + u8[2] += paddings[2]; + } + } + scale_x *= scale; + scale_y *= scale; + } + + /* the following code from OpenCV's haar feature implementation */ + if(params.min_neighbors == 0) + { + for (i = 0; i < seq->rnum; i++) + { + ccv_comp_t* comp = (ccv_comp_t*)ccv_array_get(seq, i); + ccv_array_push(result_seq, comp); + } + } else { + idx_seq = 0; + ccv_array_clear(seq2); + // group retrieved rectangles in order to filter out noise + int ncomp = ccv_array_group(seq, &idx_seq, _ccv_is_equal_same_class, 0); + ccv_comp_t* comps = (ccv_comp_t*)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t)); + memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t)); + + // count number of neighbors + for(i = 0; i < seq->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t*)ccv_array_get(seq, i); + int idx = *(int*)ccv_array_get(idx_seq, i); + + if (comps[idx].neighbors == 0) + comps[idx].classification.confidence = r1.classification.confidence; + + ++comps[idx].neighbors; + + comps[idx].rect.x += r1.rect.x; + comps[idx].rect.y += r1.rect.y; + comps[idx].rect.width += r1.rect.width; + comps[idx].rect.height += r1.rect.height; + comps[idx].classification.id = r1.classification.id; + comps[idx].classification.confidence = ccv_max(comps[idx].classification.confidence, r1.classification.confidence); + } + + // calculate average bounding box + for(i = 0; i < ncomp; i++) + { + int n = comps[i].neighbors; + if(n >= params.min_neighbors) + { + ccv_comp_t comp; + comp.rect.x = (comps[i].rect.x * 2 + n) / (2 * n); + comp.rect.y = (comps[i].rect.y * 2 + n) / (2 * n); + comp.rect.width = (comps[i].rect.width * 2 + n) / (2 * n); + comp.rect.height = (comps[i].rect.height * 2 + n) / (2 * n); + comp.neighbors = comps[i].neighbors; + comp.classification.id = comps[i].classification.id; + comp.classification.confidence = comps[i].classification.confidence; + ccv_array_push(seq2, &comp); + } + } + + // filter out small face rectangles inside large face rectangles + for(i = 0; i < seq2->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t*)ccv_array_get(seq2, i); + int flag = 1; + + for(j = 0; j < seq2->rnum; j++) + { + ccv_comp_t r2 = *(ccv_comp_t*)ccv_array_get(seq2, j); + int distance = (int)(r2.rect.width * 0.25 + 0.5); + + if(i != j && + r1.classification.id == r2.classification.id && + r1.rect.x >= r2.rect.x - distance && + r1.rect.y >= r2.rect.y - distance && + r1.rect.x + r1.rect.width <= r2.rect.x + r2.rect.width + distance && + r1.rect.y + r1.rect.height <= r2.rect.y + r2.rect.height + distance && + (r2.neighbors > ccv_max(3, r1.neighbors) || r1.neighbors < 3)) + { + flag = 0; + break; + } + } + + if(flag) + ccv_array_push(result_seq, &r1); + } + ccv_array_free(idx_seq); + ccfree(comps); + } + } + + ccv_array_free(seq); + ccv_array_free(seq2); + + ccv_array_t* result_seq2; + /* the following code from OpenCV's haar feature implementation */ + if (params.flags & CCV_BBF_NO_NESTED) + { + result_seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + idx_seq = 0; + // group retrieved rectangles in order to filter out noise + int ncomp = ccv_array_group(result_seq, &idx_seq, _ccv_is_equal, 0); + ccv_comp_t* comps = (ccv_comp_t*)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t)); + memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t)); + + // count number of neighbors + for(i = 0; i < result_seq->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t*)ccv_array_get(result_seq, i); + int idx = *(int*)ccv_array_get(idx_seq, i); + + if (comps[idx].neighbors == 0 || comps[idx].classification.confidence < r1.classification.confidence) + { + comps[idx].classification.confidence = r1.classification.confidence; + comps[idx].neighbors = 1; + comps[idx].rect = r1.rect; + comps[idx].classification.id = r1.classification.id; + } + } + + // calculate average bounding box + for(i = 0; i < ncomp; i++) + if(comps[i].neighbors) + ccv_array_push(result_seq2, &comps[i]); + + ccv_array_free(result_seq); + ccfree(comps); + } else { + result_seq2 = result_seq; + } + + for (i = 1; i < scale_upto + next * 2; i++) + ccv_matrix_free(pyr[i * 4]); + if (params.accurate) + for (i = next * 2; i < scale_upto + next * 2; i++) + { + ccv_matrix_free(pyr[i * 4 + 1]); + ccv_matrix_free(pyr[i * 4 + 2]); + ccv_matrix_free(pyr[i * 4 + 3]); + } + if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width) + ccv_matrix_free(pyr[0]); + + return result_seq2; +} + +ccv_bbf_classifier_cascade_t* ccv_bbf_read_classifier_cascade(const char* directory) +{ + char buf[1024]; + sprintf(buf, "%s/cascade.txt", directory); + int s, i; + FILE* r = fopen(buf, "r"); + if (r == 0) + return 0; + ccv_bbf_classifier_cascade_t* cascade = (ccv_bbf_classifier_cascade_t*)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + s = fscanf(r, "%d %d %d", &cascade->count, &cascade->size.width, &cascade->size.height); + assert(s > 0); + cascade->stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + for (i = 0; i < cascade->count; i++) + { + sprintf(buf, "%s/stage-%d.txt", directory, i); + if (_ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[i]) < 0) + { + cascade->count = i; + break; + } + } + fclose(r); + return cascade; +} + +ccv_bbf_classifier_cascade_t* ccv_bbf_classifier_cascade_read_binary(char* s) +{ + int i; + ccv_bbf_classifier_cascade_t* cascade = (ccv_bbf_classifier_cascade_t*)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + memcpy(&cascade->count, s, sizeof(cascade->count)); s += sizeof(cascade->count); + memcpy(&cascade->size.width, s, sizeof(cascade->size.width)); s += sizeof(cascade->size.width); + memcpy(&cascade->size.height, s, sizeof(cascade->size.height)); s += sizeof(cascade->size.height); + ccv_bbf_stage_classifier_t* classifier = cascade->stage_classifier = (ccv_bbf_stage_classifier_t*)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + for (i = 0; i < cascade->count; i++, classifier++) + { + memcpy(&classifier->count, s, sizeof(classifier->count)); s += sizeof(classifier->count); + memcpy(&classifier->threshold, s, sizeof(classifier->threshold)); s += sizeof(classifier->threshold); + classifier->feature = (ccv_bbf_feature_t*)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t)); + classifier->alpha = (float*)ccmalloc(classifier->count * 2 * sizeof(float)); + memcpy(classifier->feature, s, classifier->count * sizeof(ccv_bbf_feature_t)); s += classifier->count * sizeof(ccv_bbf_feature_t); + memcpy(classifier->alpha, s, classifier->count * 2 * sizeof(float)); s += classifier->count * 2 * sizeof(float); + } + return cascade; + +} + +int ccv_bbf_classifier_cascade_write_binary(ccv_bbf_classifier_cascade_t* cascade, char* s, int slen) +{ + int i; + int len = sizeof(cascade->count) + sizeof(cascade->size.width) + sizeof(cascade->size.height); + ccv_bbf_stage_classifier_t* classifier = cascade->stage_classifier; + for (i = 0; i < cascade->count; i++, classifier++) + len += sizeof(classifier->count) + sizeof(classifier->threshold) + classifier->count * sizeof(ccv_bbf_feature_t) + classifier->count * 2 * sizeof(float); + if (slen >= len) + { + memcpy(s, &cascade->count, sizeof(cascade->count)); s += sizeof(cascade->count); + memcpy(s, &cascade->size.width, sizeof(cascade->size.width)); s += sizeof(cascade->size.width); + memcpy(s, &cascade->size.height, sizeof(cascade->size.height)); s += sizeof(cascade->size.height); + classifier = cascade->stage_classifier; + for (i = 0; i < cascade->count; i++, classifier++) + { + memcpy(s, &classifier->count, sizeof(classifier->count)); s += sizeof(classifier->count); + memcpy(s, &classifier->threshold, sizeof(classifier->threshold)); s += sizeof(classifier->threshold); + memcpy(s, classifier->feature, classifier->count * sizeof(ccv_bbf_feature_t)); s += classifier->count * sizeof(ccv_bbf_feature_t); + memcpy(s, classifier->alpha, classifier->count * 2 * sizeof(float)); s += classifier->count * 2 * sizeof(float); + } + } + return len; +} + +void ccv_bbf_classifier_cascade_free(ccv_bbf_classifier_cascade_t* cascade) +{ + int i; + for (i = 0; i < cascade->count; ++i) + { + ccfree(cascade->stage_classifier[i].feature); + ccfree(cascade->stage_classifier[i].alpha); + } + ccfree(cascade->stage_classifier); + ccfree(cascade); +} \ No newline at end of file diff --git a/test/source.cc b/test/source.cc new file mode 100644 index 0000000..f0094b3 --- /dev/null +++ b/test/source.cc @@ -0,0 +1,1573 @@ +#include "ccv.h" +#include "ccv_internal.h" +#include +#ifdef HAVE_GSL +#include +#include +#endif +#ifdef USE_OPENMP +#include +#endif + +const ccv_bbf_param_t ccv_bbf_default_params = { + .interval = 5, + .min_neighbors = 2, + .accurate = 1, + .flags = 0, + .size = { + 24, + 24, + }, +}; + +#define _ccv_width_padding(x) (((x) + 3) & -4) + +static inline int _ccv_run_bbf_feature(ccv_bbf_feature_t *feature, int *step, unsigned char **u8) +{ +#define pf_at(i) (*(u8[feature->pz[i]] + feature->px[i] + feature->py[i] * step[feature->pz[i]])) +#define nf_at(i) (*(u8[feature->nz[i]] + feature->nx[i] + feature->ny[i] * step[feature->nz[i]])) + unsigned char pmin = pf_at(0), nmax = nf_at(0); + /* check if every point in P > every point in N, and take a shortcut */ + if (pmin <= nmax) + return 0; + int i; + for (i = 1; i < feature->size; i++) + { + if (feature->pz[i] >= 0) + { + int p = pf_at(i); + if (p < pmin) + { + if (p <= nmax) + return 0; + pmin = p; + } + } + if (feature->nz[i] >= 0) + { + int n = nf_at(i); + if (n > nmax) + { + if (pmin <= n) + return 0; + nmax = n; + } + } + } +#undef pf_at +#undef nf_at + return 1; +} + +static int _ccv_read_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier) +{ + FILE *r = fopen(file, "r"); + if (r == 0) + return -1; + int stat = 0; + stat |= fscanf(r, "%d", &classifier->count); + union { + float fl; + int i; + } fli; + stat |= fscanf(r, "%d", &fli.i); + classifier->threshold = fli.fl; + classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t)); + classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float)); + int i, j; + for (i = 0; i < classifier->count; i++) + { + stat |= fscanf(r, "%d", &classifier->feature[i].size); + for (j = 0; j < classifier->feature[i].size; j++) + { + stat |= fscanf(r, "%d %d %d", &classifier->feature[i].px[j], &classifier->feature[i].py[j], &classifier->feature[i].pz[j]); + stat |= fscanf(r, "%d %d %d", &classifier->feature[i].nx[j], &classifier->feature[i].ny[j], &classifier->feature[i].nz[j]); + } + union { + float fl; + int i; + } flia, flib; + stat |= fscanf(r, "%d %d", &flia.i, &flib.i); + classifier->alpha[i * 2] = flia.fl; + classifier->alpha[i * 2 + 1] = flib.fl; + } + fclose(r); + return 0; +} + +#ifdef HAVE_GSL + +static unsigned int _ccv_bbf_time_measure() +{ + struct timeval tv; + gettimeofday(&tv, 0); + return tv.tv_sec * 1000000 + tv.tv_usec; +} + +#define less_than(a, b, aux) ((a) < (b)) +CCV_IMPLEMENT_QSORT(_ccv_sort_32f, float, less_than) +#undef less_than + +static void _ccv_bbf_eval_data(ccv_bbf_stage_classifier_t *classifier, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, float *peval, float *neval) +{ + int i, j; + int steps[] = {_ccv_width_padding(size.width), + _ccv_width_padding(size.width >> 1), + _ccv_width_padding(size.width >> 2)}; + int isizs0 = steps[0] * size.height; + int isizs01 = isizs0 + steps[1] * (size.height >> 1); + for (i = 0; i < posnum; i++) + { + unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01}; + float sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + peval[i] = sum; + } + for (i = 0; i < negnum; i++) + { + unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01}; + float sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + neval[i] = sum; + } +} + +static int _ccv_prune_positive_data(ccv_bbf_classifier_cascade_t *cascade, unsigned char **posdata, int posnum, ccv_size_t size) +{ + float *peval = (float *)ccmalloc(posnum * sizeof(float)); + int i, j, k, rpos = posnum; + for (i = 0; i < cascade->count; i++) + { + _ccv_bbf_eval_data(cascade->stage_classifier + i, posdata, rpos, 0, 0, size, peval, 0); + k = 0; + for (j = 0; j < rpos; j++) + if (peval[j] >= cascade->stage_classifier[i].threshold) + { + posdata[k] = posdata[j]; + ++k; + } + else + { + ccfree(posdata[j]); + } + rpos = k; + } + ccfree(peval); + return rpos; +} + +static int _ccv_prepare_background_data(ccv_bbf_classifier_cascade_t *cascade, char **bgfiles, int bgnum, unsigned char **negdata, int negnum) +{ + int t, i, j, k, q; + int negperbg; + int negtotal = 0; + int steps[] = {_ccv_width_padding(cascade->size.width), + _ccv_width_padding(cascade->size.width >> 1), + _ccv_width_padding(cascade->size.width >> 2)}; + int isizs0 = steps[0] * cascade->size.height; + int isizs1 = steps[1] * (cascade->size.height >> 1); + int isizs2 = steps[2] * (cascade->size.height >> 2); + int *idcheck = (int *)ccmalloc(negnum * sizeof(int)); + + gsl_rng_env_setup(); + + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); + gsl_rng_set(rng, (unsigned long int)idcheck); + + ccv_size_t imgsz = cascade->size; + int rneg = negtotal; + for (t = 0; negtotal < negnum; t++) + { + PRINT(CCV_CLI_INFO, "preparing negative data ... 0%%"); + for (i = 0; i < bgnum; i++) + { + negperbg = (t < 2) ? (negnum - negtotal) / (bgnum - i) + 1 : negnum - negtotal; + ccv_dense_matrix_t *image = 0; + ccv_read(bgfiles[i], &image, CCV_IO_GRAY | CCV_IO_ANY_FILE); + assert((image->type & CCV_C1) && (image->type & CCV_8U)); + if (image == 0) + { + PRINT(CCV_CLI_ERROR, "\n%s file corrupted\n", bgfiles[i]); + continue; + } + if (t % 2 != 0) + ccv_flip(image, 0, 0, CCV_FLIP_X); + if (t % 4 >= 2) + ccv_flip(image, 0, 0, CCV_FLIP_Y); + ccv_bbf_param_t params = {.interval = 3, .min_neighbors = 0, .accurate = 1, .flags = 0, .size = cascade->size}; + ccv_array_t *detected = ccv_bbf_detect_objects(image, &cascade, 1, params); + memset(idcheck, 0, ccv_min(detected->rnum, negperbg) * sizeof(int)); + for (j = 0; j < ccv_min(detected->rnum, negperbg); j++) + { + int r = gsl_rng_uniform_int(rng, detected->rnum); + int flag = 1; + ccv_rect_t *rect = (ccv_rect_t *)ccv_array_get(detected, r); + while (flag) + { + flag = 0; + for (k = 0; k < j; k++) + if (r == idcheck[k]) + { + flag = 1; + r = gsl_rng_uniform_int(rng, detected->rnum); + break; + } + rect = (ccv_rect_t *)ccv_array_get(detected, r); + if ((rect->x < 0) || (rect->y < 0) || (rect->width + rect->x > image->cols) || (rect->height + rect->y > image->rows)) + { + flag = 1; + r = gsl_rng_uniform_int(rng, detected->rnum); + } + } + idcheck[j] = r; + ccv_dense_matrix_t *temp = 0; + ccv_dense_matrix_t *imgs0 = 0; + ccv_dense_matrix_t *imgs1 = 0; + ccv_dense_matrix_t *imgs2 = 0; + ccv_slice(image, (ccv_matrix_t **)&temp, 0, rect->y, rect->x, rect->height, rect->width); + ccv_resample(temp, &imgs0, 0, imgsz.height, imgsz.width, CCV_INTER_AREA); + assert(imgs0->step == steps[0]); + ccv_matrix_free(temp); + ccv_sample_down(imgs0, &imgs1, 0, 0, 0); + assert(imgs1->step == steps[1]); + ccv_sample_down(imgs1, &imgs2, 0, 0, 0); + assert(imgs2->step == steps[2]); + + negdata[negtotal] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2); + unsigned char *u8s0 = negdata[negtotal]; + unsigned char *u8s1 = negdata[negtotal] + isizs0; + unsigned char *u8s2 = negdata[negtotal] + isizs0 + isizs1; + unsigned char *u8[] = {u8s0, u8s1, u8s2}; + memcpy(u8s0, imgs0->data.u8, imgs0->rows * imgs0->step); + ccv_matrix_free(imgs0); + memcpy(u8s1, imgs1->data.u8, imgs1->rows * imgs1->step); + ccv_matrix_free(imgs1); + memcpy(u8s2, imgs2->data.u8, imgs2->rows * imgs2->step); + ccv_matrix_free(imgs2); + + flag = 1; + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier; + for (k = 0; k < cascade->count; ++k, ++classifier) + { + float sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (q = 0; q < classifier->count; ++q, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + if (sum < classifier->threshold) + { + flag = 0; + break; + } + } + if (!flag) + ccfree(negdata[negtotal]); + else + { + ++negtotal; + if (negtotal >= negnum) + break; + } + } + ccv_array_free(detected); + ccv_matrix_free(image); + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\rpreparing negative data ... %2d%%", 100 * negtotal / negnum); + fflush(0); + if (negtotal >= negnum) + break; + } + if (rneg == negtotal) + break; + rneg = negtotal; + PRINT(CCV_CLI_INFO, "\nentering additional round %d\n", t + 1); + } + gsl_rng_free(rng); + ccfree(idcheck); + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\n"); + return negtotal; +} + +static void _ccv_prepare_positive_data(ccv_dense_matrix_t **posimg, unsigned char **posdata, ccv_size_t size, int posnum) +{ + PRINT(CCV_CLI_INFO, "preparing positive data ... 0%%"); + int i; + for (i = 0; i < posnum; i++) + { + ccv_dense_matrix_t *imgs0 = posimg[i]; + ccv_dense_matrix_t *imgs1 = 0; + ccv_dense_matrix_t *imgs2 = 0; + assert((imgs0->type & CCV_C1) && (imgs0->type & CCV_8U) && imgs0->rows == size.height && imgs0->cols == size.width); + ccv_sample_down(imgs0, &imgs1, 0, 0, 0); + ccv_sample_down(imgs1, &imgs2, 0, 0, 0); + int isizs0 = imgs0->rows * imgs0->step; + int isizs1 = imgs1->rows * imgs1->step; + int isizs2 = imgs2->rows * imgs2->step; + + posdata[i] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2); + memcpy(posdata[i], imgs0->data.u8, isizs0); + memcpy(posdata[i] + isizs0, imgs1->data.u8, isizs1); + memcpy(posdata[i] + isizs0 + isizs1, imgs2->data.u8, isizs2); + + PRINT(CCV_CLI_INFO, "\rpreparing positive data ... %2d%%", 100 * (i + 1) / posnum); + fflush(0); + + ccv_matrix_free(imgs1); + ccv_matrix_free(imgs2); + } + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\n"); +} + +typedef struct +{ + double fitness; + int pk, nk; + int age; + double error; + ccv_bbf_feature_t feature; +} ccv_bbf_gene_t; + +static inline void _ccv_bbf_genetic_fitness(ccv_bbf_gene_t *gene) +{ + gene->fitness = (1 - gene->error) * exp(-0.01 * gene->age) * exp((gene->pk + gene->nk) * log(1.015)); +} + +static inline int _ccv_bbf_exist_gene_feature(ccv_bbf_gene_t *gene, int x, int y, int z) +{ + int i; + for (i = 0; i < gene->pk; i++) + if (z == gene->feature.pz[i] && x == gene->feature.px[i] && y == gene->feature.py[i]) + return 1; + for (i = 0; i < gene->nk; i++) + if (z == gene->feature.nz[i] && x == gene->feature.nx[i] && y == gene->feature.ny[i]) + return 1; + return 0; +} + +static inline void _ccv_bbf_randomize_gene(gsl_rng *rng, ccv_bbf_gene_t *gene, int *rows, int *cols) +{ + int i; + do + { + gene->pk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1; + gene->nk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1; + } while (gene->pk + gene->nk < CCV_BBF_POINT_MIN); /* a hard restriction of at least 3 points have to be examed */ + gene->feature.size = ccv_max(gene->pk, gene->nk); + gene->age = 0; + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + { + gene->feature.pz[i] = -1; + gene->feature.nz[i] = -1; + } + int x, y, z; + for (i = 0; i < gene->pk; i++) + { + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(gene, x, y, z)); + gene->feature.pz[i] = z; + gene->feature.px[i] = x; + gene->feature.py[i] = y; + } + for (i = 0; i < gene->nk; i++) + { + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(gene, x, y, z)); + gene->feature.nz[i] = z; + gene->feature.nx[i] = x; + gene->feature.ny[i] = y; + } +} + +static inline double _ccv_bbf_error_rate(ccv_bbf_feature_t *feature, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw) +{ + int i; + int steps[] = {_ccv_width_padding(size.width), + _ccv_width_padding(size.width >> 1), + _ccv_width_padding(size.width >> 2)}; + int isizs0 = steps[0] * size.height; + int isizs01 = isizs0 + steps[1] * (size.height >> 1); + double error = 0; + for (i = 0; i < posnum; i++) + { + unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01}; + if (!_ccv_run_bbf_feature(feature, steps, u8)) + error += pw[i]; + } + for (i = 0; i < negnum; i++) + { + unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01}; + if (_ccv_run_bbf_feature(feature, steps, u8)) + error += nw[i]; + } + return error; +} + +#define less_than(fit1, fit2, aux) ((fit1).fitness >= (fit2).fitness) +static CCV_IMPLEMENT_QSORT(_ccv_bbf_genetic_qsort, ccv_bbf_gene_t, less_than) +#undef less_than + + static ccv_bbf_feature_t _ccv_bbf_genetic_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, int ftnum, ccv_size_t size, double *pw, double *nw) +{ + ccv_bbf_feature_t best; + /* seed (random method) */ + gsl_rng_env_setup(); + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); + union { + unsigned long int li; + double db; + } dbli; + dbli.db = pw[0] + nw[0]; + gsl_rng_set(rng, dbli.li); + int i, j; + int pnum = ftnum * 100; + assert(pnum > 0); + ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc(pnum * sizeof(ccv_bbf_gene_t)); + int rows[] = {size.height, size.height >> 1, size.height >> 2}; + int cols[] = {size.width, size.width >> 1, size.width >> 2}; + for (i = 0; i < pnum; i++) + _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols); + unsigned int timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + for (i = 0; i < pnum; i++) + _ccv_bbf_genetic_fitness(&gene[i]); + double best_err = 1; + int rnum = ftnum * 39; /* number of randomize */ + int mnum = ftnum * 40; /* number of mutation */ + int hnum = ftnum * 20; /* number of hybrid */ + /* iteration stop crit : best no change in 40 iterations */ + int it = 0, t; + for (t = 0; it < 40; ++it, ++t) + { + int min_id = 0; + double min_err = gene[0].error; + for (i = 1; i < pnum; i++) + if (gene[i].error < min_err) + { + min_id = i; + min_err = gene[i].error; + } + min_err = gene[min_id].error = _ccv_bbf_error_rate(&gene[min_id].feature, posdata, posnum, negdata, negnum, size, pw, nw); + if (min_err < best_err) + { + best_err = min_err; + memcpy(&best, &gene[min_id].feature, sizeof(best)); + PRINT(CCV_CLI_INFO, "best bbf feature with error %f\n|-size: %d\n|-positive point: ", best_err, best.size); + for (i = 0; i < best.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.px[i], best.py[i], best.pz[i]); + PRINT(CCV_CLI_INFO, "\n|-negative point: "); + for (i = 0; i < best.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.nx[i], best.ny[i], best.nz[i]); + PRINT(CCV_CLI_INFO, "\n"); + it = 0; + } + PRINT(CCV_CLI_INFO, "minimum error achieved in round %d(%d) : %f with %d ms\n", t, it, min_err, timer / 1000); + _ccv_bbf_genetic_qsort(gene, pnum, 0); + for (i = 0; i < ftnum; i++) + ++gene[i].age; + for (i = ftnum; i < ftnum + mnum; i++) + { + int parent = gsl_rng_uniform_int(rng, ftnum); + memcpy(gene + i, gene + parent, sizeof(ccv_bbf_gene_t)); + /* three mutation strategy : 1. add, 2. remove, 3. refine */ + int pnm, pn = gsl_rng_uniform_int(rng, 2); + int *pnk[] = {&gene[i].pk, &gene[i].nk}; + int *pnx[] = {gene[i].feature.px, gene[i].feature.nx}; + int *pny[] = {gene[i].feature.py, gene[i].feature.ny}; + int *pnz[] = {gene[i].feature.pz, gene[i].feature.nz}; + int x, y, z; + int victim, decay = 1; + do + { + switch (gsl_rng_uniform_int(rng, 3)) + { + case 0: /* add */ + if (gene[i].pk == CCV_BBF_POINT_MAX && gene[i].nk == CCV_BBF_POINT_MAX) + break; + while (*pnk[pn] + 1 > CCV_BBF_POINT_MAX) + pn = gsl_rng_uniform_int(rng, 2); + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z)); + pnz[pn][*pnk[pn]] = z; + pnx[pn][*pnk[pn]] = x; + pny[pn][*pnk[pn]] = y; + ++(*pnk[pn]); + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + decay = gene[i].age = 0; + break; + case 1: /* remove */ + if (gene[i].pk + gene[i].nk <= CCV_BBF_POINT_MIN) /* at least 3 points have to be examed */ + break; + while (*pnk[pn] - 1 <= 0) // || *pnk[pn] + *pnk[!pn] - 1 < CCV_BBF_POINT_MIN) + pn = gsl_rng_uniform_int(rng, 2); + victim = gsl_rng_uniform_int(rng, *pnk[pn]); + for (j = victim; j < *pnk[pn] - 1; j++) + { + pnz[pn][j] = pnz[pn][j + 1]; + pnx[pn][j] = pnx[pn][j + 1]; + pny[pn][j] = pny[pn][j + 1]; + } + pnz[pn][*pnk[pn] - 1] = -1; + --(*pnk[pn]); + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + decay = gene[i].age = 0; + break; + case 2: /* refine */ + pnm = gsl_rng_uniform_int(rng, *pnk[pn]); + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z)); + pnz[pn][pnm] = z; + pnx[pn][pnm] = x; + pny[pn][pnm] = y; + decay = gene[i].age = 0; + break; + } + } while (decay); + } + for (i = ftnum + mnum; i < ftnum + mnum + hnum; i++) + { + /* hybrid strategy: taking positive points from dad, negative points from mum */ + int dad, mum; + do + { + dad = gsl_rng_uniform_int(rng, ftnum); + mum = gsl_rng_uniform_int(rng, ftnum); + } while (dad == mum || gene[dad].pk + gene[mum].nk < CCV_BBF_POINT_MIN); /* at least 3 points have to be examed */ + for (j = 0; j < CCV_BBF_POINT_MAX; j++) + { + gene[i].feature.pz[j] = -1; + gene[i].feature.nz[j] = -1; + } + gene[i].pk = gene[dad].pk; + for (j = 0; j < gene[i].pk; j++) + { + gene[i].feature.pz[j] = gene[dad].feature.pz[j]; + gene[i].feature.px[j] = gene[dad].feature.px[j]; + gene[i].feature.py[j] = gene[dad].feature.py[j]; + } + gene[i].nk = gene[mum].nk; + for (j = 0; j < gene[i].nk; j++) + { + gene[i].feature.nz[j] = gene[mum].feature.nz[j]; + gene[i].feature.nx[j] = gene[mum].feature.nx[j]; + gene[i].feature.ny[j] = gene[mum].feature.ny[j]; + } + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + gene[i].age = 0; + } + for (i = ftnum + mnum + hnum; i < ftnum + mnum + hnum + rnum; i++) + _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols); + timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + for (i = 0; i < pnum; i++) + _ccv_bbf_genetic_fitness(&gene[i]); + } + ccfree(gene); + gsl_rng_free(rng); + return best; +} + +#define less_than(fit1, fit2, aux) ((fit1).error < (fit2).error) +static CCV_IMPLEMENT_QSORT(_ccv_bbf_best_qsort, ccv_bbf_gene_t, less_than) +#undef less_than + + static ccv_bbf_gene_t _ccv_bbf_best_gene(ccv_bbf_gene_t *gene, int pnum, int point_min, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw) +{ + int i; + unsigned int timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + _ccv_bbf_best_qsort(gene, pnum, 0); + int min_id = 0; + double min_err = gene[0].error; + for (i = 0; i < pnum; i++) + if (gene[i].nk + gene[i].pk >= point_min) + { + min_id = i; + min_err = gene[i].error; + break; + } + PRINT(CCV_CLI_INFO, "local best bbf feature with error %f\n|-size: %d\n|-positive point: ", min_err, gene[min_id].feature.size); + for (i = 0; i < gene[min_id].feature.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.px[i], gene[min_id].feature.py[i], gene[min_id].feature.pz[i]); + PRINT(CCV_CLI_INFO, "\n|-negative point: "); + for (i = 0; i < gene[min_id].feature.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.nx[i], gene[min_id].feature.ny[i], gene[min_id].feature.nz[i]); + PRINT(CCV_CLI_INFO, "\nthe computation takes %d ms\n", timer / 1000); + return gene[min_id]; +} + +static ccv_bbf_feature_t _ccv_bbf_convex_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_bbf_feature_t *best_feature, ccv_size_t size, double *pw, double *nw) +{ + ccv_bbf_gene_t best_gene; + /* seed (random method) */ + gsl_rng_env_setup(); + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); + union { + unsigned long int li; + double db; + } dbli; + dbli.db = pw[0] + nw[0]; + gsl_rng_set(rng, dbli.li); + int i, j, k, q, p, g, t; + int rows[] = {size.height, size.height >> 1, size.height >> 2}; + int cols[] = {size.width, size.width >> 1, size.width >> 2}; + int pnum = rows[0] * cols[0] + rows[1] * cols[1] + rows[2] * cols[2]; + ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc((pnum * (CCV_BBF_POINT_MAX * 2 + 1) * 2 + CCV_BBF_POINT_MAX * 2 + 1) * sizeof(ccv_bbf_gene_t)); + if (best_feature == 0) + { + /* bootstrapping the best feature, start from two pixels, one for positive, one for negative + * the bootstrapping process go like this: first, it will assign a random pixel as positive + * and enumerate every possible pixel as negative, and pick the best one. Then, enumerate every + * possible pixel as positive, and pick the best one, until it converges */ + memset(&best_gene, 0, sizeof(ccv_bbf_gene_t)); + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + best_gene.feature.pz[i] = best_gene.feature.nz[i] = -1; + best_gene.pk = 1; + best_gene.nk = 0; + best_gene.feature.size = 1; + best_gene.feature.pz[0] = gsl_rng_uniform_int(rng, 3); + best_gene.feature.px[0] = gsl_rng_uniform_int(rng, cols[best_gene.feature.pz[0]]); + best_gene.feature.py[0] = gsl_rng_uniform_int(rng, rows[best_gene.feature.pz[0]]); + for (t = 0;; ++t) + { + g = 0; + if (t % 2 == 0) + { + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (i != best_gene.feature.pz[0] || j != best_gene.feature.px[0] || k != best_gene.feature.py[0]) + { + gene[g] = best_gene; + gene[g].pk = gene[g].nk = 1; + gene[g].feature.nz[0] = i; + gene[g].feature.nx[0] = j; + gene[g].feature.ny[0] = k; + g++; + } + } + else + { + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (i != best_gene.feature.nz[0] || j != best_gene.feature.nx[0] || k != best_gene.feature.ny[0]) + { + gene[g] = best_gene; + gene[g].pk = gene[g].nk = 1; + gene[g].feature.pz[0] = i; + gene[g].feature.px[0] = j; + gene[g].feature.py[0] = k; + g++; + } + } + PRINT(CCV_CLI_INFO, "bootstrapping round : %d\n", t); + ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, 2, posdata, posnum, negdata, negnum, size, pw, nw); + if (local_gene.error >= best_gene.error - 1e-10) + break; + best_gene = local_gene; + } + } + else + { + best_gene.feature = *best_feature; + best_gene.pk = best_gene.nk = best_gene.feature.size; + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + if (best_feature->pz[i] == -1) + { + best_gene.pk = i; + break; + } + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + if (best_feature->nz[i] == -1) + { + best_gene.nk = i; + break; + } + } + /* after bootstrapping, the float search technique will do the following permutations: + * a). add a new point to positive or negative + * b). remove a point from positive or negative + * c). move an existing point in positive or negative to another position + * the three rules applied exhaustively, no heuristic used. */ + for (t = 0;; ++t) + { + g = 0; + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (!_ccv_bbf_exist_gene_feature(&best_gene, j, k, i)) + { + /* add positive point */ + if (best_gene.pk < CCV_BBF_POINT_MAX - 1) + { + gene[g] = best_gene; + gene[g].feature.pz[gene[g].pk] = i; + gene[g].feature.px[gene[g].pk] = j; + gene[g].feature.py[gene[g].pk] = k; + gene[g].pk++; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + /* add negative point */ + if (best_gene.nk < CCV_BBF_POINT_MAX - 1) + { + gene[g] = best_gene; + gene[g].feature.nz[gene[g].nk] = i; + gene[g].feature.nx[gene[g].nk] = j; + gene[g].feature.ny[gene[g].nk] = k; + gene[g].nk++; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + /* refine positive point */ + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + gene[g].feature.pz[q] = i; + gene[g].feature.px[q] = j; + gene[g].feature.py[q] = k; + g++; + } + /* add positive point, remove negative point */ + if (best_gene.pk < CCV_BBF_POINT_MAX - 1 && best_gene.nk > 1) + { + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + gene[g].feature.pz[gene[g].pk] = i; + gene[g].feature.px[gene[g].pk] = j; + gene[g].feature.py[gene[g].pk] = k; + gene[g].pk++; + for (p = q; p < best_gene.nk - 1; p++) + { + gene[g].feature.nz[p] = gene[g].feature.nz[p + 1]; + gene[g].feature.nx[p] = gene[g].feature.nx[p + 1]; + gene[g].feature.ny[p] = gene[g].feature.ny[p + 1]; + } + gene[g].feature.nz[gene[g].nk - 1] = -1; + gene[g].nk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + } + /* refine negative point */ + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + gene[g].feature.nz[q] = i; + gene[g].feature.nx[q] = j; + gene[g].feature.ny[q] = k; + g++; + } + /* add negative point, remove positive point */ + if (best_gene.pk > 1 && best_gene.nk < CCV_BBF_POINT_MAX - 1) + { + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + gene[g].feature.nz[gene[g].nk] = i; + gene[g].feature.nx[gene[g].nk] = j; + gene[g].feature.ny[gene[g].nk] = k; + gene[g].nk++; + for (p = q; p < best_gene.pk - 1; p++) + { + gene[g].feature.pz[p] = gene[g].feature.pz[p + 1]; + gene[g].feature.px[p] = gene[g].feature.px[p + 1]; + gene[g].feature.py[p] = gene[g].feature.py[p + 1]; + } + gene[g].feature.pz[gene[g].pk - 1] = -1; + gene[g].pk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + } + } + if (best_gene.pk > 1) + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + for (i = q; i < best_gene.pk - 1; i++) + { + gene[g].feature.pz[i] = gene[g].feature.pz[i + 1]; + gene[g].feature.px[i] = gene[g].feature.px[i + 1]; + gene[g].feature.py[i] = gene[g].feature.py[i + 1]; + } + gene[g].feature.pz[gene[g].pk - 1] = -1; + gene[g].pk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + if (best_gene.nk > 1) + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + for (i = q; i < best_gene.nk - 1; i++) + { + gene[g].feature.nz[i] = gene[g].feature.nz[i + 1]; + gene[g].feature.nx[i] = gene[g].feature.nx[i + 1]; + gene[g].feature.ny[i] = gene[g].feature.ny[i + 1]; + } + gene[g].feature.nz[gene[g].nk - 1] = -1; + gene[g].nk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + gene[g] = best_gene; + g++; + PRINT(CCV_CLI_INFO, "float search round : %d\n", t); + ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, CCV_BBF_POINT_MIN, posdata, posnum, negdata, negnum, size, pw, nw); + if (local_gene.error >= best_gene.error - 1e-10) + break; + best_gene = local_gene; + } + ccfree(gene); + gsl_rng_free(rng); + return best_gene.feature; +} + +static int _ccv_write_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier) +{ + FILE *w = fopen(file, "wb"); + if (w == 0) + return -1; + fprintf(w, "%d\n", classifier->count); + union { + float fl; + int i; + } fli; + fli.fl = classifier->threshold; + fprintf(w, "%d\n", fli.i); + int i, j; + for (i = 0; i < classifier->count; i++) + { + fprintf(w, "%d\n", classifier->feature[i].size); + for (j = 0; j < classifier->feature[i].size; j++) + { + fprintf(w, "%d %d %d\n", classifier->feature[i].px[j], classifier->feature[i].py[j], classifier->feature[i].pz[j]); + fprintf(w, "%d %d %d\n", classifier->feature[i].nx[j], classifier->feature[i].ny[j], classifier->feature[i].nz[j]); + } + union { + float fl; + int i; + } flia, flib; + flia.fl = classifier->alpha[i * 2]; + flib.fl = classifier->alpha[i * 2 + 1]; + fprintf(w, "%d %d\n", flia.i, flib.i); + } + fclose(w); + return 0; +} + +static int _ccv_read_background_data(const char *file, unsigned char **negdata, int *negnum, ccv_size_t size) +{ + int stat = 0; + FILE *r = fopen(file, "rb"); + if (r == 0) + return -1; + stat |= fread(negnum, sizeof(int), 1, r); + int i; + int isizs012 = _ccv_width_padding(size.width) * size.height + + _ccv_width_padding(size.width >> 1) * (size.height >> 1) + + _ccv_width_padding(size.width >> 2) * (size.height >> 2); + for (i = 0; i < *negnum; i++) + { + negdata[i] = (unsigned char *)ccmalloc(isizs012); + stat |= fread(negdata[i], 1, isizs012, r); + } + fclose(r); + return 0; +} + +static int _ccv_write_background_data(const char *file, unsigned char **negdata, int negnum, ccv_size_t size) +{ + FILE *w = fopen(file, "w"); + if (w == 0) + return -1; + fwrite(&negnum, sizeof(int), 1, w); + int i; + int isizs012 = _ccv_width_padding(size.width) * size.height + + _ccv_width_padding(size.width >> 1) * (size.height >> 1) + + _ccv_width_padding(size.width >> 2) * (size.height >> 2); + for (i = 0; i < negnum; i++) + fwrite(negdata[i], 1, isizs012, w); + fclose(w); + return 0; +} + +static int _ccv_resume_bbf_cascade_training_state(const char *file, int *i, int *k, int *bg, double *pw, double *nw, int posnum, int negnum) +{ + int stat = 0; + FILE *r = fopen(file, "r"); + if (r == 0) + return -1; + stat |= fscanf(r, "%d %d %d", i, k, bg); + int j; + union { + double db; + int i[2]; + } dbi; + for (j = 0; j < posnum; j++) + { + stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]); + pw[j] = dbi.db; + } + for (j = 0; j < negnum; j++) + { + stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]); + nw[j] = dbi.db; + } + fclose(r); + return 0; +} + +static int _ccv_save_bbf_cacade_training_state(const char *file, int i, int k, int bg, double *pw, double *nw, int posnum, int negnum) +{ + FILE *w = fopen(file, "w"); + if (w == 0) + return -1; + fprintf(w, "%d %d %d\n", i, k, bg); + int j; + union { + double db; + int i[2]; + } dbi; + for (j = 0; j < posnum; ++j) + { + dbi.db = pw[j]; + fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]); + } + fprintf(w, "\n"); + for (j = 0; j < negnum; ++j) + { + dbi.db = nw[j]; + fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]); + } + fprintf(w, "\n"); + fclose(w); + return 0; +} + +void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params) +{ + int i, j, k; + /* allocate memory for usage */ + ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + cascade->count = 0; + cascade->size = size; + cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(sizeof(ccv_bbf_stage_classifier_t)); + unsigned char **posdata = (unsigned char **)ccmalloc(posnum * sizeof(unsigned char *)); + unsigned char **negdata = (unsigned char **)ccmalloc(negnum * sizeof(unsigned char *)); + double *pw = (double *)ccmalloc(posnum * sizeof(double)); + double *nw = (double *)ccmalloc(negnum * sizeof(double)); + float *peval = (float *)ccmalloc(posnum * sizeof(float)); + float *neval = (float *)ccmalloc(negnum * sizeof(float)); + double inv_balance_k = 1. / params.balance_k; + /* balance factor k, and weighted with 0.01 */ + params.balance_k *= 0.01; + inv_balance_k *= 0.01; + + int steps[] = {_ccv_width_padding(cascade->size.width), + _ccv_width_padding(cascade->size.width >> 1), + _ccv_width_padding(cascade->size.width >> 2)}; + int isizs0 = steps[0] * cascade->size.height; + int isizs01 = isizs0 + steps[1] * (cascade->size.height >> 1); + + i = 0; + k = 0; + int bg = 0; + int cacheK = 10; + /* state resume code */ + char buf[1024]; + sprintf(buf, "%s/stat.txt", dir); + _ccv_resume_bbf_cascade_training_state(buf, &i, &k, &bg, pw, nw, posnum, negnum); + if (i > 0) + { + cascade->count = i; + ccfree(cascade->stage_classifier); + cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(i * sizeof(ccv_bbf_stage_classifier_t)); + for (j = 0; j < i; j++) + { + sprintf(buf, "%s/stage-%d.txt", dir, j); + _ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[j]); + } + } + if (k > 0) + cacheK = k; + int rpos, rneg = 0; + if (bg) + { + sprintf(buf, "%s/negs.txt", dir); + _ccv_read_background_data(buf, negdata, &rneg, cascade->size); + } + + for (; i < params.layer; i++) + { + if (!bg) + { + rneg = _ccv_prepare_background_data(cascade, bgfiles, bgnum, negdata, negnum); + /* save state of background data */ + sprintf(buf, "%s/negs.txt", dir); + _ccv_write_background_data(buf, negdata, rneg, cascade->size); + bg = 1; + } + double totalw; + /* save state of cascade : level, weight etc. */ + sprintf(buf, "%s/stat.txt", dir); + _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum); + ccv_bbf_stage_classifier_t classifier; + if (k > 0) + { + /* resume state of classifier */ + sprintf(buf, "%s/stage-%d.txt", dir, i); + _ccv_read_bbf_stage_classifier(buf, &classifier); + } + else + { + /* initialize classifier */ + for (j = 0; j < posnum; j++) + pw[j] = params.balance_k; + for (j = 0; j < rneg; j++) + nw[j] = inv_balance_k; + classifier.count = k; + classifier.threshold = 0; + classifier.feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * sizeof(ccv_bbf_feature_t)); + classifier.alpha = (float *)ccmalloc(cacheK * 2 * sizeof(float)); + } + _ccv_prepare_positive_data(posimg, posdata, cascade->size, posnum); + rpos = _ccv_prune_positive_data(cascade, posdata, posnum, cascade->size); + PRINT(CCV_CLI_INFO, "%d postivie data and %d negative data in training\n", rpos, rneg); + /* reweight to 1.00 */ + totalw = 0; + for (j = 0; j < rpos; j++) + totalw += pw[j]; + for (j = 0; j < rneg; j++) + totalw += nw[j]; + for (j = 0; j < rpos; j++) + pw[j] = pw[j] / totalw; + for (j = 0; j < rneg; j++) + nw[j] = nw[j] / totalw; + for (;; k++) + { + /* get overall true-positive, false-positive rate and threshold */ + double tp = 0, fp = 0, etp = 0, efp = 0; + _ccv_bbf_eval_data(&classifier, posdata, rpos, negdata, rneg, cascade->size, peval, neval); + _ccv_sort_32f(peval, rpos, 0); + classifier.threshold = peval[(int)((1. - params.pos_crit) * rpos)] - 1e-6; + for (j = 0; j < rpos; j++) + { + if (peval[j] >= 0) + ++tp; + if (peval[j] >= classifier.threshold) + ++etp; + } + tp /= rpos; + etp /= rpos; + for (j = 0; j < rneg; j++) + { + if (neval[j] >= 0) + ++fp; + if (neval[j] >= classifier.threshold) + ++efp; + } + fp /= rneg; + efp /= rneg; + PRINT(CCV_CLI_INFO, "stage classifier real TP rate : %f, FP rate : %f\n", tp, fp); + PRINT(CCV_CLI_INFO, "stage classifier TP rate : %f, FP rate : %f at threshold : %f\n", etp, efp, classifier.threshold); + if (k > 0) + { + /* save classifier state */ + sprintf(buf, "%s/stage-%d.txt", dir, i); + _ccv_write_bbf_stage_classifier(buf, &classifier); + sprintf(buf, "%s/stat.txt", dir); + _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum); + } + if (etp > params.pos_crit && efp < params.neg_crit) + break; + /* TODO: more post-process is needed in here */ + + /* select the best feature in current distribution through genetic algorithm optimization */ + ccv_bbf_feature_t best; + if (params.optimizer == CCV_BBF_GENETIC_OPT) + { + best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw); + } + else if (params.optimizer == CCV_BBF_FLOAT_OPT) + { + best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, 0, cascade->size, pw, nw); + } + else + { + best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw); + best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, &best, cascade->size, pw, nw); + } + double err = _ccv_bbf_error_rate(&best, posdata, rpos, negdata, rneg, cascade->size, pw, nw); + double rw = (1 - err) / err; + totalw = 0; + /* reweight */ + for (j = 0; j < rpos; j++) + { + unsigned char *u8[] = {posdata[j], posdata[j] + isizs0, posdata[j] + isizs01}; + if (!_ccv_run_bbf_feature(&best, steps, u8)) + pw[j] *= rw; + pw[j] *= params.balance_k; + totalw += pw[j]; + } + for (j = 0; j < rneg; j++) + { + unsigned char *u8[] = {negdata[j], negdata[j] + isizs0, negdata[j] + isizs01}; + if (_ccv_run_bbf_feature(&best, steps, u8)) + nw[j] *= rw; + nw[j] *= inv_balance_k; + totalw += nw[j]; + } + for (j = 0; j < rpos; j++) + pw[j] = pw[j] / totalw; + for (j = 0; j < rneg; j++) + nw[j] = nw[j] / totalw; + double c = log(rw); + PRINT(CCV_CLI_INFO, "coefficient of feature %d: %f\n", k + 1, c); + classifier.count = k + 1; + /* resizing classifier */ + if (k >= cacheK) + { + ccv_bbf_feature_t *feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * 2 * sizeof(ccv_bbf_feature_t)); + memcpy(feature, classifier.feature, cacheK * sizeof(ccv_bbf_feature_t)); + ccfree(classifier.feature); + float *alpha = (float *)ccmalloc(cacheK * 4 * sizeof(float)); + memcpy(alpha, classifier.alpha, cacheK * 2 * sizeof(float)); + ccfree(classifier.alpha); + classifier.feature = feature; + classifier.alpha = alpha; + cacheK *= 2; + } + /* setup new feature */ + classifier.feature[k] = best; + classifier.alpha[k * 2] = -c; + classifier.alpha[k * 2 + 1] = c; + } + cascade->count = i + 1; + ccv_bbf_stage_classifier_t *stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + memcpy(stage_classifier, cascade->stage_classifier, i * sizeof(ccv_bbf_stage_classifier_t)); + ccfree(cascade->stage_classifier); + stage_classifier[i] = classifier; + cascade->stage_classifier = stage_classifier; + k = 0; + bg = 0; + for (j = 0; j < rpos; j++) + ccfree(posdata[j]); + for (j = 0; j < rneg; j++) + ccfree(negdata[j]); + } + + ccfree(neval); + ccfree(peval); + ccfree(nw); + ccfree(pw); + ccfree(negdata); + ccfree(posdata); + ccfree(cascade); +} +#else +void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params) +{ + fprintf(stderr, " ccv_bbf_classifier_cascade_new requires libgsl support, please compile ccv with libgsl.\n"); +} +#endif + +static int _ccv_is_equal(const void *_r1, const void *_r2, void *data) +{ + const ccv_comp_t *r1 = (const ccv_comp_t *)_r1; + const ccv_comp_t *r2 = (const ccv_comp_t *)_r2; + int distance = (int)(r1->rect.width * 0.25 + 0.5); + + return r2->rect.x <= r1->rect.x + distance && + r2->rect.x >= r1->rect.x - distance && + r2->rect.y <= r1->rect.y + distance && + r2->rect.y >= r1->rect.y - distance && + r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) && + (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width; +} + +static int _ccv_is_equal_same_class(const void *_r1, const void *_r2, void *data) +{ + const ccv_comp_t *r1 = (const ccv_comp_t *)_r1; + const ccv_comp_t *r2 = (const ccv_comp_t *)_r2; + int distance = (int)(r1->rect.width * 0.25 + 0.5); + + return r2->classification.id == r1->classification.id && + r2->rect.x <= r1->rect.x + distance && + r2->rect.x >= r1->rect.x - distance && + r2->rect.y <= r1->rect.y + distance && + r2->rect.y >= r1->rect.y - distance && + r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) && + (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width; +} + +ccv_array_t *ccv_bbf_detect_objects(ccv_dense_matrix_t *a, ccv_bbf_classifier_cascade_t **_cascade, int count, ccv_bbf_param_t params) +{ + int hr = a->rows / params.size.height; + int wr = a->cols / params.size.width; + double scale = pow(2., 1. / (params.interval + 1.)); + int next = params.interval + 1; + int scale_upto = (int)(log((double)ccv_min(hr, wr)) / log(scale)); + ccv_dense_matrix_t **pyr = (ccv_dense_matrix_t **)alloca((scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *)); + memset(pyr, 0, (scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *)); + if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width) + ccv_resample(a, &pyr[0], 0, a->rows * _cascade[0]->size.height / params.size.height, a->cols * _cascade[0]->size.width / params.size.width, CCV_INTER_AREA); + else + pyr[0] = a; + int i, j, k, t, x, y, q; + for (i = 1; i < ccv_min(params.interval + 1, scale_upto + next * 2); i++) + ccv_resample(pyr[0], &pyr[i * 4], 0, (int)(pyr[0]->rows / pow(scale, i)), (int)(pyr[0]->cols / pow(scale, i)), CCV_INTER_AREA); + for (i = next; i < scale_upto + next * 2; i++) + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4], 0, 0, 0); + if (params.accurate) + for (i = next * 2; i < scale_upto + next * 2; i++) + { + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 1], 0, 1, 0); + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 2], 0, 0, 1); + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 3], 0, 1, 1); + } + ccv_array_t *idx_seq; + ccv_array_t *seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + ccv_array_t *seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + ccv_array_t *result_seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + /* detect in multi scale */ + for (t = 0; t < count; t++) + { + ccv_bbf_classifier_cascade_t *cascade = _cascade[t]; + float scale_x = (float)params.size.width / (float)cascade->size.width; + float scale_y = (float)params.size.height / (float)cascade->size.height; + ccv_array_clear(seq); + for (i = 0; i < scale_upto; i++) + { + int dx[] = {0, 1, 0, 1}; + int dy[] = {0, 0, 1, 1}; + int i_rows = pyr[i * 4 + next * 8]->rows - (cascade->size.height >> 2); + int steps[] = {pyr[i * 4]->step, pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8]->step}; + int i_cols = pyr[i * 4 + next * 8]->cols - (cascade->size.width >> 2); + int paddings[] = {pyr[i * 4]->step * 4 - i_cols * 4, + pyr[i * 4 + next * 4]->step * 2 - i_cols * 2, + pyr[i * 4 + next * 8]->step - i_cols}; + for (q = 0; q < (params.accurate ? 4 : 1); q++) + { + unsigned char *u8[] = {pyr[i * 4]->data.u8 + dx[q] * 2 + dy[q] * pyr[i * 4]->step * 2, pyr[i * 4 + next * 4]->data.u8 + dx[q] + dy[q] * pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8 + q]->data.u8}; + for (y = 0; y < i_rows; y++) + { + for (x = 0; x < i_cols; x++) + { + float sum; + int flag = 1; + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier; + for (j = 0; j < cascade->count; ++j, ++classifier) + { + sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (k = 0; k < classifier->count; ++k, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + if (sum < classifier->threshold) + { + flag = 0; + break; + } + } + if (flag) + { + ccv_comp_t comp; + comp.rect = ccv_rect((int)((x * 4 + dx[q] * 2) * scale_x + 0.5), (int)((y * 4 + dy[q] * 2) * scale_y + 0.5), (int)(cascade->size.width * scale_x + 0.5), (int)(cascade->size.height * scale_y + 0.5)); + comp.neighbors = 1; + comp.classification.id = t; + comp.classification.confidence = sum; + ccv_array_push(seq, &comp); + } + u8[0] += 4; + u8[1] += 2; + u8[2] += 1; + } + u8[0] += paddings[0]; + u8[1] += paddings[1]; + u8[2] += paddings[2]; + } + } + scale_x *= scale; + scale_y *= scale; + } + + /* the following code from OpenCV's haar feature implementation */ + if (params.min_neighbors == 0) + { + for (i = 0; i < seq->rnum; i++) + { + ccv_comp_t *comp = (ccv_comp_t *)ccv_array_get(seq, i); + ccv_array_push(result_seq, comp); + } + } + else + { + idx_seq = 0; + ccv_array_clear(seq2); + // group retrieved rectangles in order to filter out noise + int ncomp = ccv_array_group(seq, &idx_seq, _ccv_is_equal_same_class, 0); + ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t)); + memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t)); + + // count number of neighbors + for (i = 0; i < seq->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq, i); + int idx = *(int *)ccv_array_get(idx_seq, i); + + if (comps[idx].neighbors == 0) + comps[idx].classification.confidence = r1.classification.confidence; + + ++comps[idx].neighbors; + + comps[idx].rect.x += r1.rect.x; + comps[idx].rect.y += r1.rect.y; + comps[idx].rect.width += r1.rect.width; + comps[idx].rect.height += r1.rect.height; + comps[idx].classification.id = r1.classification.id; + comps[idx].classification.confidence = ccv_max(comps[idx].classification.confidence, r1.classification.confidence); + } + + // calculate average bounding box + for (i = 0; i < ncomp; i++) + { + int n = comps[i].neighbors; + if (n >= params.min_neighbors) + { + ccv_comp_t comp; + comp.rect.x = (comps[i].rect.x * 2 + n) / (2 * n); + comp.rect.y = (comps[i].rect.y * 2 + n) / (2 * n); + comp.rect.width = (comps[i].rect.width * 2 + n) / (2 * n); + comp.rect.height = (comps[i].rect.height * 2 + n) / (2 * n); + comp.neighbors = comps[i].neighbors; + comp.classification.id = comps[i].classification.id; + comp.classification.confidence = comps[i].classification.confidence; + ccv_array_push(seq2, &comp); + } + } + + // filter out small face rectangles inside large face rectangles + for (i = 0; i < seq2->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq2, i); + int flag = 1; + + for (j = 0; j < seq2->rnum; j++) + { + ccv_comp_t r2 = *(ccv_comp_t *)ccv_array_get(seq2, j); + int distance = (int)(r2.rect.width * 0.25 + 0.5); + + if (i != j && + r1.classification.id == r2.classification.id && + r1.rect.x >= r2.rect.x - distance && + r1.rect.y >= r2.rect.y - distance && + r1.rect.x + r1.rect.width <= r2.rect.x + r2.rect.width + distance && + r1.rect.y + r1.rect.height <= r2.rect.y + r2.rect.height + distance && + (r2.neighbors > ccv_max(3, r1.neighbors) || r1.neighbors < 3)) + { + flag = 0; + break; + } + } + + if (flag) + ccv_array_push(result_seq, &r1); + } + ccv_array_free(idx_seq); + ccfree(comps); + } + } + + ccv_array_free(seq); + ccv_array_free(seq2); + + ccv_array_t *result_seq2; + /* the following code from OpenCV's haar feature implementation */ + if (params.flags & CCV_BBF_NO_NESTED) + { + result_seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + idx_seq = 0; + // group retrieved rectangles in order to filter out noise + int ncomp = ccv_array_group(result_seq, &idx_seq, _ccv_is_equal, 0); + ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t)); + memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t)); + + // count number of neighbors + for (i = 0; i < result_seq->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(result_seq, i); + int idx = *(int *)ccv_array_get(idx_seq, i); + + if (comps[idx].neighbors == 0 || comps[idx].classification.confidence < r1.classification.confidence) + { + comps[idx].classification.confidence = r1.classification.confidence; + comps[idx].neighbors = 1; + comps[idx].rect = r1.rect; + comps[idx].classification.id = r1.classification.id; + } + } + + // calculate average bounding box + for (i = 0; i < ncomp; i++) + if (comps[i].neighbors) + ccv_array_push(result_seq2, &comps[i]); + + ccv_array_free(result_seq); + ccfree(comps); + } + else + { + result_seq2 = result_seq; + } + + for (i = 1; i < scale_upto + next * 2; i++) + ccv_matrix_free(pyr[i * 4]); + if (params.accurate) + for (i = next * 2; i < scale_upto + next * 2; i++) + { + ccv_matrix_free(pyr[i * 4 + 1]); + ccv_matrix_free(pyr[i * 4 + 2]); + ccv_matrix_free(pyr[i * 4 + 3]); + } + if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width) + ccv_matrix_free(pyr[0]); + + return result_seq2; +} + +ccv_bbf_classifier_cascade_t *ccv_bbf_read_classifier_cascade(const char *directory) +{ + char buf[1024]; + sprintf(buf, "%s/cascade.txt", directory); + int s, i; + FILE *r = fopen(buf, "r"); + if (r == 0) + return 0; + ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + s = fscanf(r, "%d %d %d", &cascade->count, &cascade->size.width, &cascade->size.height); + assert(s > 0); + cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + for (i = 0; i < cascade->count; i++) + { + sprintf(buf, "%s/stage-%d.txt", directory, i); + if (_ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[i]) < 0) + { + cascade->count = i; + break; + } + } + fclose(r); + return cascade; +} + +ccv_bbf_classifier_cascade_t *ccv_bbf_classifier_cascade_read_binary(char *s) +{ + int i; + ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + memcpy(&cascade->count, s, sizeof(cascade->count)); + s += sizeof(cascade->count); + memcpy(&cascade->size.width, s, sizeof(cascade->size.width)); + s += sizeof(cascade->size.width); + memcpy(&cascade->size.height, s, sizeof(cascade->size.height)); + s += sizeof(cascade->size.height); + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + for (i = 0; i < cascade->count; i++, classifier++) + { + memcpy(&classifier->count, s, sizeof(classifier->count)); + s += sizeof(classifier->count); + memcpy(&classifier->threshold, s, sizeof(classifier->threshold)); + s += sizeof(classifier->threshold); + classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t)); + classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float)); + memcpy(classifier->feature, s, classifier->count * sizeof(ccv_bbf_feature_t)); + s += classifier->count * sizeof(ccv_bbf_feature_t); + memcpy(classifier->alpha, s, classifier->count * 2 * sizeof(float)); + s += classifier->count * 2 * sizeof(float); + } + return cascade; +} + +int ccv_bbf_classifier_cascade_write_binary(ccv_bbf_classifier_cascade_t *cascade, char *s, int slen) +{ + int i; + int len = sizeof(cascade->count) + sizeof(cascade->size.width) + sizeof(cascade->size.height); + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier; + for (i = 0; i < cascade->count; i++, classifier++) + len += sizeof(classifier->count) + sizeof(classifier->threshold) + classifier->count * sizeof(ccv_bbf_feature_t) + classifier->count * 2 * sizeof(float); + if (slen >= len) + { + memcpy(s, &cascade->count, sizeof(cascade->count)); + s += sizeof(cascade->count); + memcpy(s, &cascade->size.width, sizeof(cascade->size.width)); + s += sizeof(cascade->size.width); + memcpy(s, &cascade->size.height, sizeof(cascade->size.height)); + s += sizeof(cascade->size.height); + classifier = cascade->stage_classifier; + for (i = 0; i < cascade->count; i++, classifier++) + { + memcpy(s, &classifier->count, sizeof(classifier->count)); + s += sizeof(classifier->count); + memcpy(s, &classifier->threshold, sizeof(classifier->threshold)); + s += sizeof(classifier->threshold); + memcpy(s, classifier->feature, classifier->count * sizeof(ccv_bbf_feature_t)); + s += classifier->count * sizeof(ccv_bbf_feature_t); + memcpy(s, classifier->alpha, classifier->count * 2 * sizeof(float)); + s += classifier->count * 2 * sizeof(float); + } + } + return len; +} + +void ccv_bbf_classifier_cascade_free(ccv_bbf_classifier_cascade_t *cascade) +{ + int i; + for (i = 0; i < cascade->count; ++i) + { + ccfree(cascade->stage_classifier[i].feature); + ccfree(cascade->stage_classifier[i].alpha); + } + ccfree(cascade->stage_classifier); + ccfree(cascade); +} \ No newline at end of file diff --git a/test/source.clj b/test/source.clj new file mode 100644 index 0000000..e69de29 diff --git a/test/source.coffee b/test/source.coffee new file mode 100644 index 0000000..e69de29 diff --git a/test/source.cpp b/test/source.cpp new file mode 100644 index 0000000..793837f --- /dev/null +++ b/test/source.cpp @@ -0,0 +1,1582 @@ +#include "ccv.h" +#include "ccv_internal.h" +#include +#ifdef HAVE_GSL +#include +#include +#endif +#ifdef USE_OPENMP +#include +#endif +const ; + +finitario crear_finitario(info_t i) { + finitario nuevo = new rep_finitario; + nuevo->dato = i; + nuevo->primerio = NULL; + return nuevo; +} + + +const ccv_bbf_param_t ccv_bbf_default_params = { + .interval = 5, + .min_neighbors = 2, + .accurate = 1, + .flags = 0, + .size = { + 24, + 24, + }, +}; + +#define _ccv_width_padding(x) (((x) + 3) & -4) + +static inline int _ccv_run_bbf_feature(ccv_bbf_feature_t *feature, int *step, unsigned char **u8) +{ +#define pf_at(i) (*(u8[feature->pz[i]] + feature->px[i] + feature->py[i] * step[feature->pz[i]])) +#define nf_at(i) (*(u8[feature->nz[i]] + feature->nx[i] + feature->ny[i] * step[feature->nz[i]])) + unsigned char pmin = pf_at(0), nmax = nf_at(0); + /* check if every point in P > every point in N, and take a shortcut */ + if (pmin <= nmax) + return 0; + int i; + for (i = 1; i < feature->size; i++) + { + if (feature->pz[i] >= 0) + { + int p = pf_at(i); + if (p < pmin) + { + if (p <= nmax) + return 0; + pmin = p; + } + } + if (feature->nz[i] >= 0) + { + int n = nf_at(i); + if (n > nmax) + { + if (pmin <= n) + return 0; + nmax = n; + } + } + } +#undef pf_at +#undef nf_at + return 1; +} + +static int _ccv_read_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier) +{ + FILE *r = fopen(file, "r"); + if (r == 0) + return -1; + int stat = 0; + stat |= fscanf(r, "%d", &classifier->count); + union { + float fl; + int i; + } fli; + stat |= fscanf(r, "%d", &fli.i); + classifier->threshold = fli.fl; + classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t)); + classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float)); + int i, j; + for (i = 0; i < classifier->count; i++) + { + stat |= fscanf(r, "%d", &classifier->feature[i].size); + for (j = 0; j < classifier->feature[i].size; j++) + { + stat |= fscanf(r, "%d %d %d", &classifier->feature[i].px[j], &classifier->feature[i].py[j], &classifier->feature[i].pz[j]); + stat |= fscanf(r, "%d %d %d", &classifier->feature[i].nx[j], &classifier->feature[i].ny[j], &classifier->feature[i].nz[j]); + } + union { + float fl; + int i; + } flia, flib; + stat |= fscanf(r, "%d %d", &flia.i, &flib.i); + classifier->alpha[i * 2] = flia.fl; + classifier->alpha[i * 2 + 1] = flib.fl; + } + fclose(r); + return 0; +} + +#ifdef HAVE_GSL + +static unsigned int _ccv_bbf_time_measure() +{ + struct timeval tv; + gettimeofday(&tv, 0); + return tv.tv_sec * 1000000 + tv.tv_usec; +} + +#define less_than(a, b, aux) ((a) < (b)) +CCV_IMPLEMENT_QSORT(_ccv_sort_32f, float, less_than) +#undef less_than + +static void _ccv_bbf_eval_data(ccv_bbf_stage_classifier_t *classifier, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, float *peval, float *neval) +{ + int i, j; + int steps[] = {_ccv_width_padding(size.width), + _ccv_width_padding(size.width >> 1), + _ccv_width_padding(size.width >> 2)}; + int isizs0 = steps[0] * size.height; + int isizs01 = isizs0 + steps[1] * (size.height >> 1); + for (i = 0; i < posnum; i++) + { + unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01}; + float sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + peval[i] = sum; + } + for (i = 0; i < negnum; i++) + { + unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01}; + float sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (j = 0; j < classifier->count; ++j, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + neval[i] = sum; + } +} + +static int _ccv_prune_positive_data(ccv_bbf_classifier_cascade_t *cascade, unsigned char **posdata, int posnum, ccv_size_t size) +{ + float *peval = (float *)ccmalloc(posnum * sizeof(float)); + int i, j, k, rpos = posnum; + for (i = 0; i < cascade->count; i++) + { + _ccv_bbf_eval_data(cascade->stage_classifier + i, posdata, rpos, 0, 0, size, peval, 0); + k = 0; + for (j = 0; j < rpos; j++) + if (peval[j] >= cascade->stage_classifier[i].threshold) + { + posdata[k] = posdata[j]; + ++k; + } + else + { + ccfree(posdata[j]); + } + rpos = k; + } + ccfree(peval); + return rpos; +} + +static int _ccv_prepare_background_data(ccv_bbf_classifier_cascade_t *cascade, char **bgfiles, int bgnum, unsigned char **negdata, int negnum) +{ + int t, i, j, k, q; + int negperbg; + int negtotal = 0; + int steps[] = {_ccv_width_padding(cascade->size.width), + _ccv_width_padding(cascade->size.width >> 1), + _ccv_width_padding(cascade->size.width >> 2)}; + int isizs0 = steps[0] * cascade->size.height; + int isizs1 = steps[1] * (cascade->size.height >> 1); + int isizs2 = steps[2] * (cascade->size.height >> 2); + int *idcheck = (int *)ccmalloc(negnum * sizeof(int)); + + gsl_rng_env_setup(); + + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); + gsl_rng_set(rng, (unsigned long int)idcheck); + + ccv_size_t imgsz = cascade->size; + int rneg = negtotal; + for (t = 0; negtotal < negnum; t++) + { + PRINT(CCV_CLI_INFO, "preparing negative data ... 0%%"); + for (i = 0; i < bgnum; i++) + { + negperbg = (t < 2) ? (negnum - negtotal) / (bgnum - i) + 1 : negnum - negtotal; + ccv_dense_matrix_t *image = 0; + ccv_read(bgfiles[i], &image, CCV_IO_GRAY | CCV_IO_ANY_FILE); + assert((image->type & CCV_C1) && (image->type & CCV_8U)); + if (image == 0) + { + PRINT(CCV_CLI_ERROR, "\n%s file corrupted\n", bgfiles[i]); + continue; + } + if (t % 2 != 0) + ccv_flip(image, 0, 0, CCV_FLIP_X); + if (t % 4 >= 2) + ccv_flip(image, 0, 0, CCV_FLIP_Y); + ccv_bbf_param_t params = {.interval = 3, .min_neighbors = 0, .accurate = 1, .flags = 0, .size = cascade->size}; + ccv_array_t *detected = ccv_bbf_detect_objects(image, &cascade, 1, params); + memset(idcheck, 0, ccv_min(detected->rnum, negperbg) * sizeof(int)); + for (j = 0; j < ccv_min(detected->rnum, negperbg); j++) + { + int r = gsl_rng_uniform_int(rng, detected->rnum); + int flag = 1; + ccv_rect_t *rect = (ccv_rect_t *)ccv_array_get(detected, r); + while (flag) + { + flag = 0; + for (k = 0; k < j; k++) + if (r == idcheck[k]) + { + flag = 1; + r = gsl_rng_uniform_int(rng, detected->rnum); + break; + } + rect = (ccv_rect_t *)ccv_array_get(detected, r); + if ((rect->x < 0) || (rect->y < 0) || (rect->width + rect->x > image->cols) || (rect->height + rect->y > image->rows)) + { + flag = 1; + r = gsl_rng_uniform_int(rng, detected->rnum); + } + } + idcheck[j] = r; + ccv_dense_matrix_t *temp = 0; + ccv_dense_matrix_t *imgs0 = 0; + ccv_dense_matrix_t *imgs1 = 0; + ccv_dense_matrix_t *imgs2 = 0; + ccv_slice(image, (ccv_matrix_t **)&temp, 0, rect->y, rect->x, rect->height, rect->width); + ccv_resample(temp, &imgs0, 0, imgsz.height, imgsz.width, CCV_INTER_AREA); + assert(imgs0->step == steps[0]); + ccv_matrix_free(temp); + ccv_sample_down(imgs0, &imgs1, 0, 0, 0); + assert(imgs1->step == steps[1]); + ccv_sample_down(imgs1, &imgs2, 0, 0, 0); + assert(imgs2->step == steps[2]); + + negdata[negtotal] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2); + unsigned char *u8s0 = negdata[negtotal]; + unsigned char *u8s1 = negdata[negtotal] + isizs0; + unsigned char *u8s2 = negdata[negtotal] + isizs0 + isizs1; + unsigned char *u8[] = {u8s0, u8s1, u8s2}; + memcpy(u8s0, imgs0->data.u8, imgs0->rows * imgs0->step); + ccv_matrix_free(imgs0); + memcpy(u8s1, imgs1->data.u8, imgs1->rows * imgs1->step); + ccv_matrix_free(imgs1); + memcpy(u8s2, imgs2->data.u8, imgs2->rows * imgs2->step); + ccv_matrix_free(imgs2); + + flag = 1; + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier; + for (k = 0; k < cascade->count; ++k, ++classifier) + { + float sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (q = 0; q < classifier->count; ++q, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + if (sum < classifier->threshold) + { + flag = 0; + break; + } + } + if (!flag) + ccfree(negdata[negtotal]); + else + { + ++negtotal; + if (negtotal >= negnum) + break; + } + } + ccv_array_free(detected); + ccv_matrix_free(image); + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\rpreparing negative data ... %2d%%", 100 * negtotal / negnum); + fflush(0); + if (negtotal >= negnum) + break; + } + if (rneg == negtotal) + break; + rneg = negtotal; + PRINT(CCV_CLI_INFO, "\nentering additional round %d\n", t + 1); + } + gsl_rng_free(rng); + ccfree(idcheck); + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\n"); + return negtotal; +} + +static void _ccv_prepare_positive_data(ccv_dense_matrix_t **posimg, unsigned char **posdata, ccv_size_t size, int posnum) +{ + PRINT(CCV_CLI_INFO, "preparing positive data ... 0%%"); + int i; + for (i = 0; i < posnum; i++) + { + ccv_dense_matrix_t *imgs0 = posimg[i]; + ccv_dense_matrix_t *imgs1 = 0; + ccv_dense_matrix_t *imgs2 = 0; + assert((imgs0->type & CCV_C1) && (imgs0->type & CCV_8U) && imgs0->rows == size.height && imgs0->cols == size.width); + ccv_sample_down(imgs0, &imgs1, 0, 0, 0); + ccv_sample_down(imgs1, &imgs2, 0, 0, 0); + int isizs0 = imgs0->rows * imgs0->step; + int isizs1 = imgs1->rows * imgs1->step; + int isizs2 = imgs2->rows * imgs2->step; + + posdata[i] = (unsigned char *)ccmalloc(isizs0 + isizs1 + isizs2); + memcpy(posdata[i], imgs0->data.u8, isizs0); + memcpy(posdata[i] + isizs0, imgs1->data.u8, isizs1); + memcpy(posdata[i] + isizs0 + isizs1, imgs2->data.u8, isizs2); + + PRINT(CCV_CLI_INFO, "\rpreparing positive data ... %2d%%", 100 * (i + 1) / posnum); + fflush(0); + + ccv_matrix_free(imgs1); + ccv_matrix_free(imgs2); + } + ccv_drain_cache(); + PRINT(CCV_CLI_INFO, "\n"); +} + +typedef struct +{ + double fitness; + int pk, nk; + int age; + double error; + ccv_bbf_feature_t feature; +} ccv_bbf_gene_t; + +static inline void _ccv_bbf_genetic_fitness(ccv_bbf_gene_t *gene) +{ + gene->fitness = (1 - gene->error) * exp(-0.01 * gene->age) * exp((gene->pk + gene->nk) * log(1.015)); +} + +static inline int _ccv_bbf_exist_gene_feature(ccv_bbf_gene_t *gene, int x, int y, int z) +{ + int i; + for (i = 0; i < gene->pk; i++) + if (z == gene->feature.pz[i] && x == gene->feature.px[i] && y == gene->feature.py[i]) + return 1; + for (i = 0; i < gene->nk; i++) + if (z == gene->feature.nz[i] && x == gene->feature.nx[i] && y == gene->feature.ny[i]) + return 1; + return 0; +} + +static inline void _ccv_bbf_randomize_gene(gsl_rng *rng, ccv_bbf_gene_t *gene, int *rows, int *cols) +{ + int i; + do + { + gene->pk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1; + gene->nk = gsl_rng_uniform_int(rng, CCV_BBF_POINT_MAX - 1) + 1; + } while (gene->pk + gene->nk < CCV_BBF_POINT_MIN); /* a hard restriction of at least 3 points have to be examed */ + gene->feature.size = ccv_max(gene->pk, gene->nk); + gene->age = 0; + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + { + gene->feature.pz[i] = -1; + gene->feature.nz[i] = -1; + } + int x, y, z; + for (i = 0; i < gene->pk; i++) + { + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(gene, x, y, z)); + gene->feature.pz[i] = z; + gene->feature.px[i] = x; + gene->feature.py[i] = y; + } + for (i = 0; i < gene->nk; i++) + { + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(gene, x, y, z)); + gene->feature.nz[i] = z; + gene->feature.nx[i] = x; + gene->feature.ny[i] = y; + } +} + +static inline double _ccv_bbf_error_rate(ccv_bbf_feature_t *feature, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw) +{ + int i; + int steps[] = {_ccv_width_padding(size.width), + _ccv_width_padding(size.width >> 1), + _ccv_width_padding(size.width >> 2)}; + int isizs0 = steps[0] * size.height; + int isizs01 = isizs0 + steps[1] * (size.height >> 1); + double error = 0; + for (i = 0; i < posnum; i++) + { + unsigned char *u8[] = {posdata[i], posdata[i] + isizs0, posdata[i] + isizs01}; + if (!_ccv_run_bbf_feature(feature, steps, u8)) + error += pw[i]; + } + for (i = 0; i < negnum; i++) + { + unsigned char *u8[] = {negdata[i], negdata[i] + isizs0, negdata[i] + isizs01}; + if (_ccv_run_bbf_feature(feature, steps, u8)) + error += nw[i]; + } + return error; +} + +#define less_than(fit1, fit2, aux) ((fit1).fitness >= (fit2).fitness) +static CCV_IMPLEMENT_QSORT(_ccv_bbf_genetic_qsort, ccv_bbf_gene_t, less_than) +#undef less_than + + static ccv_bbf_feature_t _ccv_bbf_genetic_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, int ftnum, ccv_size_t size, double *pw, double *nw) +{ + ccv_bbf_feature_t best; + /* seed (random method) */ + gsl_rng_env_setup(); + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); + union { + unsigned long int li; + double db; + } dbli; + dbli.db = pw[0] + nw[0]; + gsl_rng_set(rng, dbli.li); + int i, j; + int pnum = ftnum * 100; + assert(pnum > 0); + ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc(pnum * sizeof(ccv_bbf_gene_t)); + int rows[] = {size.height, size.height >> 1, size.height >> 2}; + int cols[] = {size.width, size.width >> 1, size.width >> 2}; + for (i = 0; i < pnum; i++) + _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols); + unsigned int timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + for (i = 0; i < pnum; i++) + _ccv_bbf_genetic_fitness(&gene[i]); + double best_err = 1; + int rnum = ftnum * 39; /* number of randomize */ + int mnum = ftnum * 40; /* number of mutation */ + int hnum = ftnum * 20; /* number of hybrid */ + /* iteration stop crit : best no change in 40 iterations */ + int it = 0, t; + for (t = 0; it < 40; ++it, ++t) + { + int min_id = 0; + double min_err = gene[0].error; + for (i = 1; i < pnum; i++) + if (gene[i].error < min_err) + { + min_id = i; + min_err = gene[i].error; + } + min_err = gene[min_id].error = _ccv_bbf_error_rate(&gene[min_id].feature, posdata, posnum, negdata, negnum, size, pw, nw); + if (min_err < best_err) + { + best_err = min_err; + memcpy(&best, &gene[min_id].feature, sizeof(best)); + PRINT(CCV_CLI_INFO, "best bbf feature with error %f\n|-size: %d\n|-positive point: ", best_err, best.size); + for (i = 0; i < best.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.px[i], best.py[i], best.pz[i]); + PRINT(CCV_CLI_INFO, "\n|-negative point: "); + for (i = 0; i < best.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", best.nx[i], best.ny[i], best.nz[i]); + PRINT(CCV_CLI_INFO, "\n"); + it = 0; + } + PRINT(CCV_CLI_INFO, "minimum error achieved in round %d(%d) : %f with %d ms\n", t, it, min_err, timer / 1000); + _ccv_bbf_genetic_qsort(gene, pnum, 0); + for (i = 0; i < ftnum; i++) + ++gene[i].age; + for (i = ftnum; i < ftnum + mnum; i++) + { + int parent = gsl_rng_uniform_int(rng, ftnum); + memcpy(gene + i, gene + parent, sizeof(ccv_bbf_gene_t)); + /* three mutation strategy : 1. add, 2. remove, 3. refine */ + int pnm, pn = gsl_rng_uniform_int(rng, 2); + int *pnk[] = {&gene[i].pk, &gene[i].nk}; + int *pnx[] = {gene[i].feature.px, gene[i].feature.nx}; + int *pny[] = {gene[i].feature.py, gene[i].feature.ny}; + int *pnz[] = {gene[i].feature.pz, gene[i].feature.nz}; + int x, y, z; + int victim, decay = 1; + do + { + switch (gsl_rng_uniform_int(rng, 3)) + { + case 0: /* add */ + if (gene[i].pk == CCV_BBF_POINT_MAX && gene[i].nk == CCV_BBF_POINT_MAX) + break; + while (*pnk[pn] + 1 > CCV_BBF_POINT_MAX) + pn = gsl_rng_uniform_int(rng, 2); + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z)); + pnz[pn][*pnk[pn]] = z; + pnx[pn][*pnk[pn]] = x; + pny[pn][*pnk[pn]] = y; + ++(*pnk[pn]); + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + decay = gene[i].age = 0; + break; + case 1: /* remove */ + if (gene[i].pk + gene[i].nk <= CCV_BBF_POINT_MIN) /* at least 3 points have to be examed */ + break; + while (*pnk[pn] - 1 <= 0) // || *pnk[pn] + *pnk[!pn] - 1 < CCV_BBF_POINT_MIN) + pn = gsl_rng_uniform_int(rng, 2); + victim = gsl_rng_uniform_int(rng, *pnk[pn]); + for (j = victim; j < *pnk[pn] - 1; j++) + { + pnz[pn][j] = pnz[pn][j + 1]; + pnx[pn][j] = pnx[pn][j + 1]; + pny[pn][j] = pny[pn][j + 1]; + } + pnz[pn][*pnk[pn] - 1] = -1; + --(*pnk[pn]); + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + decay = gene[i].age = 0; + break; + case 2: /* refine */ + pnm = gsl_rng_uniform_int(rng, *pnk[pn]); + do + { + z = gsl_rng_uniform_int(rng, 3); + x = gsl_rng_uniform_int(rng, cols[z]); + y = gsl_rng_uniform_int(rng, rows[z]); + } while (_ccv_bbf_exist_gene_feature(&gene[i], x, y, z)); + pnz[pn][pnm] = z; + pnx[pn][pnm] = x; + pny[pn][pnm] = y; + decay = gene[i].age = 0; + break; + } + } while (decay); + } + for (i = ftnum + mnum; i < ftnum + mnum + hnum; i++) + { + /* hybrid strategy: taking positive points from dad, negative points from mum */ + int dad, mum; + do + { + dad = gsl_rng_uniform_int(rng, ftnum); + mum = gsl_rng_uniform_int(rng, ftnum); + } while (dad == mum || gene[dad].pk + gene[mum].nk < CCV_BBF_POINT_MIN); /* at least 3 points have to be examed */ + for (j = 0; j < CCV_BBF_POINT_MAX; j++) + { + gene[i].feature.pz[j] = -1; + gene[i].feature.nz[j] = -1; + } + gene[i].pk = gene[dad].pk; + for (j = 0; j < gene[i].pk; j++) + { + gene[i].feature.pz[j] = gene[dad].feature.pz[j]; + gene[i].feature.px[j] = gene[dad].feature.px[j]; + gene[i].feature.py[j] = gene[dad].feature.py[j]; + } + gene[i].nk = gene[mum].nk; + for (j = 0; j < gene[i].nk; j++) + { + gene[i].feature.nz[j] = gene[mum].feature.nz[j]; + gene[i].feature.nx[j] = gene[mum].feature.nx[j]; + gene[i].feature.ny[j] = gene[mum].feature.ny[j]; + } + gene[i].feature.size = ccv_max(gene[i].pk, gene[i].nk); + gene[i].age = 0; + } + for (i = ftnum + mnum + hnum; i < ftnum + mnum + hnum + rnum; i++) + _ccv_bbf_randomize_gene(rng, &gene[i], rows, cols); + timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + for (i = 0; i < pnum; i++) + _ccv_bbf_genetic_fitness(&gene[i]); + } + ccfree(gene); + gsl_rng_free(rng); + return best; +} + +#define less_than(fit1, fit2, aux) ((fit1).error < (fit2).error) +static CCV_IMPLEMENT_QSORT(_ccv_bbf_best_qsort, ccv_bbf_gene_t, less_than) +#undef less_than + + static ccv_bbf_gene_t _ccv_bbf_best_gene(ccv_bbf_gene_t *gene, int pnum, int point_min, unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_size_t size, double *pw, double *nw) +{ + int i; + unsigned int timer = _ccv_bbf_time_measure(); +#ifdef USE_OPENMP +#pragma omp parallel for private(i) schedule(dynamic) +#endif + for (i = 0; i < pnum; i++) + gene[i].error = _ccv_bbf_error_rate(&gene[i].feature, posdata, posnum, negdata, negnum, size, pw, nw); + timer = _ccv_bbf_time_measure() - timer; + _ccv_bbf_best_qsort(gene, pnum, 0); + int min_id = 0; + double min_err = gene[0].error; + for (i = 0; i < pnum; i++) + if (gene[i].nk + gene[i].pk >= point_min) + { + min_id = i; + min_err = gene[i].error; + break; + } + PRINT(CCV_CLI_INFO, "local best bbf feature with error %f\n|-size: %d\n|-positive point: ", min_err, gene[min_id].feature.size); + for (i = 0; i < gene[min_id].feature.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.px[i], gene[min_id].feature.py[i], gene[min_id].feature.pz[i]); + PRINT(CCV_CLI_INFO, "\n|-negative point: "); + for (i = 0; i < gene[min_id].feature.size; i++) + PRINT(CCV_CLI_INFO, "(%d %d %d), ", gene[min_id].feature.nx[i], gene[min_id].feature.ny[i], gene[min_id].feature.nz[i]); + PRINT(CCV_CLI_INFO, "\nthe computation takes %d ms\n", timer / 1000); + return gene[min_id]; +} + +static ccv_bbf_feature_t _ccv_bbf_convex_optimize(unsigned char **posdata, int posnum, unsigned char **negdata, int negnum, ccv_bbf_feature_t *best_feature, ccv_size_t size, double *pw, double *nw) +{ + ccv_bbf_gene_t best_gene; + /* seed (random method) */ + gsl_rng_env_setup(); + gsl_rng *rng = gsl_rng_alloc(gsl_rng_default); + union { + unsigned long int li; + double db; + } dbli; + dbli.db = pw[0] + nw[0]; + gsl_rng_set(rng, dbli.li); + int i, j, k, q, p, g, t; + int rows[] = {size.height, size.height >> 1, size.height >> 2}; + int cols[] = {size.width, size.width >> 1, size.width >> 2}; + int pnum = rows[0] * cols[0] + rows[1] * cols[1] + rows[2] * cols[2]; + ccv_bbf_gene_t *gene = (ccv_bbf_gene_t *)ccmalloc((pnum * (CCV_BBF_POINT_MAX * 2 + 1) * 2 + CCV_BBF_POINT_MAX * 2 + 1) * sizeof(ccv_bbf_gene_t)); + if (best_feature == 0) + { + /* bootstrapping the best feature, start from two pixels, one for positive, one for negative + * the bootstrapping process go like this: first, it will assign a random pixel as positive + * and enumerate every possible pixel as negative, and pick the best one. Then, enumerate every + * possible pixel as positive, and pick the best one, until it converges */ + memset(&best_gene, 0, sizeof(ccv_bbf_gene_t)); + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + best_gene.feature.pz[i] = best_gene.feature.nz[i] = -1; + best_gene.pk = 1; + best_gene.nk = 0; + best_gene.feature.size = 1; + best_gene.feature.pz[0] = gsl_rng_uniform_int(rng, 3); + best_gene.feature.px[0] = gsl_rng_uniform_int(rng, cols[best_gene.feature.pz[0]]); + best_gene.feature.py[0] = gsl_rng_uniform_int(rng, rows[best_gene.feature.pz[0]]); + for (t = 0;; ++t) + { + g = 0; + if (t % 2 == 0) + { + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (i != best_gene.feature.pz[0] || j != best_gene.feature.px[0] || k != best_gene.feature.py[0]) + { + gene[g] = best_gene; + gene[g].pk = gene[g].nk = 1; + gene[g].feature.nz[0] = i; + gene[g].feature.nx[0] = j; + gene[g].feature.ny[0] = k; + g++; + } + } + else + { + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (i != best_gene.feature.nz[0] || j != best_gene.feature.nx[0] || k != best_gene.feature.ny[0]) + { + gene[g] = best_gene; + gene[g].pk = gene[g].nk = 1; + gene[g].feature.pz[0] = i; + gene[g].feature.px[0] = j; + gene[g].feature.py[0] = k; + g++; + } + } + PRINT(CCV_CLI_INFO, "bootstrapping round : %d\n", t); + ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, 2, posdata, posnum, negdata, negnum, size, pw, nw); + if (local_gene.error >= best_gene.error - 1e-10) + break; + best_gene = local_gene; + } + } + else + { + best_gene.feature = *best_feature; + best_gene.pk = best_gene.nk = best_gene.feature.size; + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + if (best_feature->pz[i] == -1) + { + best_gene.pk = i; + break; + } + for (i = 0; i < CCV_BBF_POINT_MAX; i++) + if (best_feature->nz[i] == -1) + { + best_gene.nk = i; + break; + } + } + /* after bootstrapping, the float search technique will do the following permutations: + * a). add a new point to positive or negative + * b). remove a point from positive or negative + * c). move an existing point in positive or negative to another position + * the three rules applied exhaustively, no heuristic used. */ + for (t = 0;; ++t) + { + g = 0; + for (i = 0; i < 3; i++) + for (j = 0; j < cols[i]; j++) + for (k = 0; k < rows[i]; k++) + if (!_ccv_bbf_exist_gene_feature(&best_gene, j, k, i)) + { + /* add positive point */ + if (best_gene.pk < CCV_BBF_POINT_MAX - 1) + { + gene[g] = best_gene; + gene[g].feature.pz[gene[g].pk] = i; + gene[g].feature.px[gene[g].pk] = j; + gene[g].feature.py[gene[g].pk] = k; + gene[g].pk++; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + /* add negative point */ + if (best_gene.nk < CCV_BBF_POINT_MAX - 1) + { + gene[g] = best_gene; + gene[g].feature.nz[gene[g].nk] = i; + gene[g].feature.nx[gene[g].nk] = j; + gene[g].feature.ny[gene[g].nk] = k; + gene[g].nk++; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + /* refine positive point */ + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + gene[g].feature.pz[q] = i; + gene[g].feature.px[q] = j; + gene[g].feature.py[q] = k; + g++; + } + /* add positive point, remove negative point */ + if (best_gene.pk < CCV_BBF_POINT_MAX - 1 && best_gene.nk > 1) + { + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + gene[g].feature.pz[gene[g].pk] = i; + gene[g].feature.px[gene[g].pk] = j; + gene[g].feature.py[gene[g].pk] = k; + gene[g].pk++; + for (p = q; p < best_gene.nk - 1; p++) + { + gene[g].feature.nz[p] = gene[g].feature.nz[p + 1]; + gene[g].feature.nx[p] = gene[g].feature.nx[p + 1]; + gene[g].feature.ny[p] = gene[g].feature.ny[p + 1]; + } + gene[g].feature.nz[gene[g].nk - 1] = -1; + gene[g].nk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + } + /* refine negative point */ + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + gene[g].feature.nz[q] = i; + gene[g].feature.nx[q] = j; + gene[g].feature.ny[q] = k; + g++; + } + /* add negative point, remove positive point */ + if (best_gene.pk > 1 && best_gene.nk < CCV_BBF_POINT_MAX - 1) + { + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + gene[g].feature.nz[gene[g].nk] = i; + gene[g].feature.nx[gene[g].nk] = j; + gene[g].feature.ny[gene[g].nk] = k; + gene[g].nk++; + for (p = q; p < best_gene.pk - 1; p++) + { + gene[g].feature.pz[p] = gene[g].feature.pz[p + 1]; + gene[g].feature.px[p] = gene[g].feature.px[p + 1]; + gene[g].feature.py[p] = gene[g].feature.py[p + 1]; + } + gene[g].feature.pz[gene[g].pk - 1] = -1; + gene[g].pk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + } + } + if (best_gene.pk > 1) + for (q = 0; q < best_gene.pk; q++) + { + gene[g] = best_gene; + for (i = q; i < best_gene.pk - 1; i++) + { + gene[g].feature.pz[i] = gene[g].feature.pz[i + 1]; + gene[g].feature.px[i] = gene[g].feature.px[i + 1]; + gene[g].feature.py[i] = gene[g].feature.py[i + 1]; + } + gene[g].feature.pz[gene[g].pk - 1] = -1; + gene[g].pk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + if (best_gene.nk > 1) + for (q = 0; q < best_gene.nk; q++) + { + gene[g] = best_gene; + for (i = q; i < best_gene.nk - 1; i++) + { + gene[g].feature.nz[i] = gene[g].feature.nz[i + 1]; + gene[g].feature.nx[i] = gene[g].feature.nx[i + 1]; + gene[g].feature.ny[i] = gene[g].feature.ny[i + 1]; + } + gene[g].feature.nz[gene[g].nk - 1] = -1; + gene[g].nk--; + gene[g].feature.size = ccv_max(gene[g].pk, gene[g].nk); + g++; + } + gene[g] = best_gene; + g++; + PRINT(CCV_CLI_INFO, "float search round : %d\n", t); + ccv_bbf_gene_t local_gene = _ccv_bbf_best_gene(gene, g, CCV_BBF_POINT_MIN, posdata, posnum, negdata, negnum, size, pw, nw); + if (local_gene.error >= best_gene.error - 1e-10) + break; + best_gene = local_gene; + } + ccfree(gene); + gsl_rng_free(rng); + return best_gene.feature; +} + +static int _ccv_write_bbf_stage_classifier(const char *file, ccv_bbf_stage_classifier_t *classifier) +{ + FILE *w = fopen(file, "wb"); + if (w == 0) + return -1; + fprintf(w, "%d\n", classifier->count); + union { + float fl; + int i; + } fli; + fli.fl = classifier->threshold; + fprintf(w, "%d\n", fli.i); + int i, j; + for (i = 0; i < classifier->count; i++) + { + fprintf(w, "%d\n", classifier->feature[i].size); + for (j = 0; j < classifier->feature[i].size; j++) + { + fprintf(w, "%d %d %d\n", classifier->feature[i].px[j], classifier->feature[i].py[j], classifier->feature[i].pz[j]); + fprintf(w, "%d %d %d\n", classifier->feature[i].nx[j], classifier->feature[i].ny[j], classifier->feature[i].nz[j]); + } + union { + float fl; + int i; + } flia, flib; + flia.fl = classifier->alpha[i * 2]; + flib.fl = classifier->alpha[i * 2 + 1]; + fprintf(w, "%d %d\n", flia.i, flib.i); + } + fclose(w); + return 0; +} + +static int _ccv_read_background_data(const char *file, unsigned char **negdata, int *negnum, ccv_size_t size) +{ + int stat = 0; + FILE *r = fopen(file, "rb"); + if (r == 0) + return -1; + stat |= fread(negnum, sizeof(int), 1, r); + int i; + int isizs012 = _ccv_width_padding(size.width) * size.height + + _ccv_width_padding(size.width >> 1) * (size.height >> 1) + + _ccv_width_padding(size.width >> 2) * (size.height >> 2); + for (i = 0; i < *negnum; i++) + { + negdata[i] = (unsigned char *)ccmalloc(isizs012); + stat |= fread(negdata[i], 1, isizs012, r); + } + fclose(r); + return 0; +} + +static int _ccv_write_background_data(const char *file, unsigned char **negdata, int negnum, ccv_size_t size) +{ + FILE *w = fopen(file, "w"); + if (w == 0) + return -1; + fwrite(&negnum, sizeof(int), 1, w); + int i; + int isizs012 = _ccv_width_padding(size.width) * size.height + + _ccv_width_padding(size.width >> 1) * (size.height >> 1) + + _ccv_width_padding(size.width >> 2) * (size.height >> 2); + for (i = 0; i < negnum; i++) + fwrite(negdata[i], 1, isizs012, w); + fclose(w); + return 0; +} + +static int _ccv_resume_bbf_cascade_training_state(const char *file, int *i, int *k, int *bg, double *pw, double *nw, int posnum, int negnum) +{ + int stat = 0; + FILE *r = fopen(file, "r"); + if (r == 0) + return -1; + stat |= fscanf(r, "%d %d %d", i, k, bg); + int j; + union { + double db; + int i[2]; + } dbi; + for (j = 0; j < posnum; j++) + { + stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]); + pw[j] = dbi.db; + } + for (j = 0; j < negnum; j++) + { + stat |= fscanf(r, "%d %d", &dbi.i[0], &dbi.i[1]); + nw[j] = dbi.db; + } + fclose(r); + return 0; +} + +static int _ccv_save_bbf_cacade_training_state(const char *file, int i, int k, int bg, double *pw, double *nw, int posnum, int negnum) +{ + FILE *w = fopen(file, "w"); + if (w == 0) + return -1; + fprintf(w, "%d %d %d\n", i, k, bg); + int j; + union { + double db; + int i[2]; + } dbi; + for (j = 0; j < posnum; ++j) + { + dbi.db = pw[j]; + fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]); + } + fprintf(w, "\n"); + for (j = 0; j < negnum; ++j) + { + dbi.db = nw[j]; + fprintf(w, "%d %d ", dbi.i[0], dbi.i[1]); + } + fprintf(w, "\n"); + fclose(w); + return 0; +} + +void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params) +{ + int i, j, k; + /* allocate memory for usage */ + ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + cascade->count = 0; + cascade->size = size; + cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(sizeof(ccv_bbf_stage_classifier_t)); + unsigned char **posdata = (unsigned char **)ccmalloc(posnum * sizeof(unsigned char *)); + unsigned char **negdata = (unsigned char **)ccmalloc(negnum * sizeof(unsigned char *)); + double *pw = (double *)ccmalloc(posnum * sizeof(double)); + double *nw = (double *)ccmalloc(negnum * sizeof(double)); + float *peval = (float *)ccmalloc(posnum * sizeof(float)); + float *neval = (float *)ccmalloc(negnum * sizeof(float)); + double inv_balance_k = 1. / params.balance_k; + /* balance factor k, and weighted with 0.01 */ + params.balance_k *= 0.01; + inv_balance_k *= 0.01; + + int steps[] = {_ccv_width_padding(cascade->size.width), + _ccv_width_padding(cascade->size.width >> 1), + _ccv_width_padding(cascade->size.width >> 2)}; + int isizs0 = steps[0] * cascade->size.height; + int isizs01 = isizs0 + steps[1] * (cascade->size.height >> 1); + + i = 0; + k = 0; + int bg = 0; + int cacheK = 10; + /* state resume code */ + char buf[1024]; + sprintf(buf, "%s/stat.txt", dir); + _ccv_resume_bbf_cascade_training_state(buf, &i, &k, &bg, pw, nw, posnum, negnum); + if (i > 0) + { + cascade->count = i; + ccfree(cascade->stage_classifier); + cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(i * sizeof(ccv_bbf_stage_classifier_t)); + for (j = 0; j < i; j++) + { + sprintf(buf, "%s/stage-%d.txt", dir, j); + _ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[j]); + } + } + if (k > 0) + cacheK = k; + int rpos, rneg = 0; + if (bg) + { + sprintf(buf, "%s/negs.txt", dir); + _ccv_read_background_data(buf, negdata, &rneg, cascade->size); + } + + for (; i < params.layer; i++) + { + if (!bg) + { + rneg = _ccv_prepare_background_data(cascade, bgfiles, bgnum, negdata, negnum); + /* save state of background data */ + sprintf(buf, "%s/negs.txt", dir); + _ccv_write_background_data(buf, negdata, rneg, cascade->size); + bg = 1; + } + double totalw; + /* save state of cascade : level, weight etc. */ + sprintf(buf, "%s/stat.txt", dir); + _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum); + ccv_bbf_stage_classifier_t classifier; + if (k > 0) + { + /* resume state of classifier */ + sprintf(buf, "%s/stage-%d.txt", dir, i); + _ccv_read_bbf_stage_classifier(buf, &classifier); + } + else + { + /* initialize classifier */ + for (j = 0; j < posnum; j++) + pw[j] = params.balance_k; + for (j = 0; j < rneg; j++) + nw[j] = inv_balance_k; + classifier.count = k; + classifier.threshold = 0; + classifier.feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * sizeof(ccv_bbf_feature_t)); + classifier.alpha = (float *)ccmalloc(cacheK * 2 * sizeof(float)); + } + _ccv_prepare_positive_data(posimg, posdata, cascade->size, posnum); + rpos = _ccv_prune_positive_data(cascade, posdata, posnum, cascade->size); + PRINT(CCV_CLI_INFO, "%d postivie data and %d negative data in training\n", rpos, rneg); + /* reweight to 1.00 */ + totalw = 0; + for (j = 0; j < rpos; j++) + totalw += pw[j]; + for (j = 0; j < rneg; j++) + totalw += nw[j]; + for (j = 0; j < rpos; j++) + pw[j] = pw[j] / totalw; + for (j = 0; j < rneg; j++) + nw[j] = nw[j] / totalw; + for (;; k++) + { + /* get overall true-positive, false-positive rate and threshold */ + double tp = 0, fp = 0, etp = 0, efp = 0; + _ccv_bbf_eval_data(&classifier, posdata, rpos, negdata, rneg, cascade->size, peval, neval); + _ccv_sort_32f(peval, rpos, 0); + classifier.threshold = peval[(int)((1. - params.pos_crit) * rpos)] - 1e-6; + for (j = 0; j < rpos; j++) + { + if (peval[j] >= 0) + ++tp; + if (peval[j] >= classifier.threshold) + ++etp; + } + tp /= rpos; + etp /= rpos; + for (j = 0; j < rneg; j++) + { + if (neval[j] >= 0) + ++fp; + if (neval[j] >= classifier.threshold) + ++efp; + } + fp /= rneg; + efp /= rneg; + PRINT(CCV_CLI_INFO, "stage classifier real TP rate : %f, FP rate : %f\n", tp, fp); + PRINT(CCV_CLI_INFO, "stage classifier TP rate : %f, FP rate : %f at threshold : %f\n", etp, efp, classifier.threshold); + if (k > 0) + { + /* save classifier state */ + sprintf(buf, "%s/stage-%d.txt", dir, i); + _ccv_write_bbf_stage_classifier(buf, &classifier); + sprintf(buf, "%s/stat.txt", dir); + _ccv_save_bbf_cacade_training_state(buf, i, k, bg, pw, nw, posnum, negnum); + } + if (etp > params.pos_crit && efp < params.neg_crit) + break; + /* TODO: more post-process is needed in here */ + + /* select the best feature in current distribution through genetic algorithm optimization */ + ccv_bbf_feature_t best; + if (params.optimizer == CCV_BBF_GENETIC_OPT) + { + best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw); + } + else if (params.optimizer == CCV_BBF_FLOAT_OPT) + { + best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, 0, cascade->size, pw, nw); + } + else + { + best = _ccv_bbf_genetic_optimize(posdata, rpos, negdata, rneg, params.feature_number, cascade->size, pw, nw); + best = _ccv_bbf_convex_optimize(posdata, rpos, negdata, rneg, &best, cascade->size, pw, nw); + } + double err = _ccv_bbf_error_rate(&best, posdata, rpos, negdata, rneg, cascade->size, pw, nw); + double rw = (1 - err) / err; + totalw = 0; + /* reweight */ + for (j = 0; j < rpos; j++) + { + unsigned char *u8[] = {posdata[j], posdata[j] + isizs0, posdata[j] + isizs01}; + if (!_ccv_run_bbf_feature(&best, steps, u8)) + pw[j] *= rw; + pw[j] *= params.balance_k; + totalw += pw[j]; + } + for (j = 0; j < rneg; j++) + { + unsigned char *u8[] = {negdata[j], negdata[j] + isizs0, negdata[j] + isizs01}; + if (_ccv_run_bbf_feature(&best, steps, u8)) + nw[j] *= rw; + nw[j] *= inv_balance_k; + totalw += nw[j]; + } + for (j = 0; j < rpos; j++) + pw[j] = pw[j] / totalw; + for (j = 0; j < rneg; j++) + nw[j] = nw[j] / totalw; + double c = log(rw); + PRINT(CCV_CLI_INFO, "coefficient of feature %d: %f\n", k + 1, c); + classifier.count = k + 1; + /* resizing classifier */ + if (k >= cacheK) + { + ccv_bbf_feature_t *feature = (ccv_bbf_feature_t *)ccmalloc(cacheK * 2 * sizeof(ccv_bbf_feature_t)); + memcpy(feature, classifier.feature, cacheK * sizeof(ccv_bbf_feature_t)); + ccfree(classifier.feature); + float *alpha = (float *)ccmalloc(cacheK * 4 * sizeof(float)); + memcpy(alpha, classifier.alpha, cacheK * 2 * sizeof(float)); + ccfree(classifier.alpha); + classifier.feature = feature; + classifier.alpha = alpha; + cacheK *= 2; + } + /* setup new feature */ + classifier.feature[k] = best; + classifier.alpha[k * 2] = -c; + classifier.alpha[k * 2 + 1] = c; + } + cascade->count = i + 1; + ccv_bbf_stage_classifier_t *stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + memcpy(stage_classifier, cascade->stage_classifier, i * sizeof(ccv_bbf_stage_classifier_t)); + ccfree(cascade->stage_classifier); + stage_classifier[i] = classifier; + cascade->stage_classifier = stage_classifier; + k = 0; + bg = 0; + for (j = 0; j < rpos; j++) + ccfree(posdata[j]); + for (j = 0; j < rneg; j++) + ccfree(negdata[j]); + } + + ccfree(neval); + ccfree(peval); + ccfree(nw); + ccfree(pw); + ccfree(negdata); + ccfree(posdata); + ccfree(cascade); +} +#else +void ccv_bbf_classifier_cascade_new(ccv_dense_matrix_t **posimg, int posnum, char **bgfiles, int bgnum, int negnum, ccv_size_t size, const char *dir, ccv_bbf_new_param_t params) +{ + fprintf(stderr, " ccv_bbf_classifier_cascade_new requires libgsl support, please compile ccv with libgsl.\n"); +} +#endif + +static int _ccv_is_equal(const void *_r1, const void *_r2, void *data) +{ + const ccv_comp_t *r1 = (const ccv_comp_t *)_r1; + const ccv_comp_t *r2 = (const ccv_comp_t *)_r2; + int distance = (int)(r1->rect.width * 0.25 + 0.5); + + return r2->rect.x <= r1->rect.x + distance && + r2->rect.x >= r1->rect.x - distance && + r2->rect.y <= r1->rect.y + distance && + r2->rect.y >= r1->rect.y - distance && + r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) && + (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width; +} + +static int _ccv_is_equal_same_class(const void *_r1, const void *_r2, void *data) +{ + const ccv_comp_t *r1 = (const ccv_comp_t *)_r1; + const ccv_comp_t *r2 = (const ccv_comp_t *)_r2; + int distance = (int)(r1->rect.width * 0.25 + 0.5); + + return r2->classification.id == r1->classification.id && + r2->rect.x <= r1->rect.x + distance && + r2->rect.x >= r1->rect.x - distance && + r2->rect.y <= r1->rect.y + distance && + r2->rect.y >= r1->rect.y - distance && + r2->rect.width <= (int)(r1->rect.width * 1.5 + 0.5) && + (int)(r2->rect.width * 1.5 + 0.5) >= r1->rect.width; +} + +ccv_array_t *ccv_bbf_detect_objects(ccv_dense_matrix_t *a, ccv_bbf_classifier_cascade_t **_cascade, int count, ccv_bbf_param_t params) +{ + int hr = a->rows / params.size.height; + int wr = a->cols / params.size.width; + double scale = pow(2., 1. / (params.interval + 1.)); + int next = params.interval + 1; + int scale_upto = (int)(log((double)ccv_min(hr, wr)) / log(scale)); + ccv_dense_matrix_t **pyr = (ccv_dense_matrix_t **)alloca((scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *)); + memset(pyr, 0, (scale_upto + next * 2) * 4 * sizeof(ccv_dense_matrix_t *)); + if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width) + ccv_resample(a, &pyr[0], 0, a->rows * _cascade[0]->size.height / params.size.height, a->cols * _cascade[0]->size.width / params.size.width, CCV_INTER_AREA); + else + pyr[0] = a; + int i, j, k, t, x, y, q; + for (i = 1; i < ccv_min(params.interval + 1, scale_upto + next * 2); i++) + ccv_resample(pyr[0], &pyr[i * 4], 0, (int)(pyr[0]->rows / pow(scale, i)), (int)(pyr[0]->cols / pow(scale, i)), CCV_INTER_AREA); + for (i = next; i < scale_upto + next * 2; i++) + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4], 0, 0, 0); + if (params.accurate) + for (i = next * 2; i < scale_upto + next * 2; i++) + { + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 1], 0, 1, 0); + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 2], 0, 0, 1); + ccv_sample_down(pyr[i * 4 - next * 4], &pyr[i * 4 + 3], 0, 1, 1); + } + ccv_array_t *idx_seq; + ccv_array_t *seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + ccv_array_t *seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + ccv_array_t *result_seq = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + /* detect in multi scale */ + for (t = 0; t < count; t++) + { + ccv_bbf_classifier_cascade_t *cascade = _cascade[t]; + float scale_x = (float)params.size.width / (float)cascade->size.width; + float scale_y = (float)params.size.height / (float)cascade->size.height; + ccv_array_clear(seq); + for (i = 0; i < scale_upto; i++) + { + int dx[] = {0, 1, 0, 1}; + int dy[] = {0, 0, 1, 1}; + int i_rows = pyr[i * 4 + next * 8]->rows - (cascade->size.height >> 2); + int steps[] = {pyr[i * 4]->step, pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8]->step}; + int i_cols = pyr[i * 4 + next * 8]->cols - (cascade->size.width >> 2); + int paddings[] = {pyr[i * 4]->step * 4 - i_cols * 4, + pyr[i * 4 + next * 4]->step * 2 - i_cols * 2, + pyr[i * 4 + next * 8]->step - i_cols}; + for (q = 0; q < (params.accurate ? 4 : 1); q++) + { + unsigned char *u8[] = {pyr[i * 4]->data.u8 + dx[q] * 2 + dy[q] * pyr[i * 4]->step * 2, pyr[i * 4 + next * 4]->data.u8 + dx[q] + dy[q] * pyr[i * 4 + next * 4]->step, pyr[i * 4 + next * 8 + q]->data.u8}; + for (y = 0; y < i_rows; y++) + { + for (x = 0; x < i_cols; x++) + { + float sum; + int flag = 1; + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier; + for (j = 0; j < cascade->count; ++j, ++classifier) + { + sum = 0; + float *alpha = classifier->alpha; + ccv_bbf_feature_t *feature = classifier->feature; + for (k = 0; k < classifier->count; ++k, alpha += 2, ++feature) + sum += alpha[_ccv_run_bbf_feature(feature, steps, u8)]; + if (sum < classifier->threshold) + { + flag = 0; + break; + } + } + if (flag) + { + ccv_comp_t comp; + comp.rect = ccv_rect((int)((x * 4 + dx[q] * 2) * scale_x + 0.5), (int)((y * 4 + dy[q] * 2) * scale_y + 0.5), (int)(cascade->size.width * scale_x + 0.5), (int)(cascade->size.height * scale_y + 0.5)); + comp.neighbors = 1; + comp.classification.id = t; + comp.classification.confidence = sum; + ccv_array_push(seq, &comp); + } + u8[0] += 4; + u8[1] += 2; + u8[2] += 1; + } + u8[0] += paddings[0]; + u8[1] += paddings[1]; + u8[2] += paddings[2]; + } + } + scale_x *= scale; + scale_y *= scale; + } + + /* the following code from OpenCV's haar feature implementation */ + if (params.min_neighbors == 0) + { + for (i = 0; i < seq->rnum; i++) + { + ccv_comp_t *comp = (ccv_comp_t *)ccv_array_get(seq, i); + ccv_array_push(result_seq, comp); + } + } + else + { + idx_seq = 0; + ccv_array_clear(seq2); + // group retrieved rectangles in order to filter out noise + int ncomp = ccv_array_group(seq, &idx_seq, _ccv_is_equal_same_class, 0); + ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t)); + memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t)); + + // count number of neighbors + for (i = 0; i < seq->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq, i); + int idx = *(int *)ccv_array_get(idx_seq, i); + + if (comps[idx].neighbors == 0) + comps[idx].classification.confidence = r1.classification.confidence; + + ++comps[idx].neighbors; + + comps[idx].rect.x += r1.rect.x; + comps[idx].rect.y += r1.rect.y; + comps[idx].rect.width += r1.rect.width; + comps[idx].rect.height += r1.rect.height; + comps[idx].classification.id = r1.classification.id; + comps[idx].classification.confidence = ccv_max(comps[idx].classification.confidence, r1.classification.confidence); + } + + // calculate average bounding box + for (i = 0; i < ncomp; i++) + { + int n = comps[i].neighbors; + if (n >= params.min_neighbors) + { + ccv_comp_t comp; + comp.rect.x = (comps[i].rect.x * 2 + n) / (2 * n); + comp.rect.y = (comps[i].rect.y * 2 + n) / (2 * n); + comp.rect.width = (comps[i].rect.width * 2 + n) / (2 * n); + comp.rect.height = (comps[i].rect.height * 2 + n) / (2 * n); + comp.neighbors = comps[i].neighbors; + comp.classification.id = comps[i].classification.id; + comp.classification.confidence = comps[i].classification.confidence; + ccv_array_push(seq2, &comp); + } + } + + // filter out small face rectangles inside large face rectangles + for (i = 0; i < seq2->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(seq2, i); + int flag = 1; + + for (j = 0; j < seq2->rnum; j++) + { + ccv_comp_t r2 = *(ccv_comp_t *)ccv_array_get(seq2, j); + int distance = (int)(r2.rect.width * 0.25 + 0.5); + + if (i != j && + r1.classification.id == r2.classification.id && + r1.rect.x >= r2.rect.x - distance && + r1.rect.y >= r2.rect.y - distance && + r1.rect.x + r1.rect.width <= r2.rect.x + r2.rect.width + distance && + r1.rect.y + r1.rect.height <= r2.rect.y + r2.rect.height + distance && + (r2.neighbors > ccv_max(3, r1.neighbors) || r1.neighbors < 3)) + { + flag = 0; + break; + } + } + + if (flag) + ccv_array_push(result_seq, &r1); + } + ccv_array_free(idx_seq); + ccfree(comps); + } + } + + ccv_array_free(seq); + ccv_array_free(seq2); + + ccv_array_t *result_seq2; + /* the following code from OpenCV's haar feature implementation */ + if (params.flags & CCV_BBF_NO_NESTED) + { + result_seq2 = ccv_array_new(sizeof(ccv_comp_t), 64, 0); + idx_seq = 0; + // group retrieved rectangles in order to filter out noise + int ncomp = ccv_array_group(result_seq, &idx_seq, _ccv_is_equal, 0); + ccv_comp_t *comps = (ccv_comp_t *)ccmalloc((ncomp + 1) * sizeof(ccv_comp_t)); + memset(comps, 0, (ncomp + 1) * sizeof(ccv_comp_t)); + + // count number of neighbors + for (i = 0; i < result_seq->rnum; i++) + { + ccv_comp_t r1 = *(ccv_comp_t *)ccv_array_get(result_seq, i); + int idx = *(int *)ccv_array_get(idx_seq, i); + + if (comps[idx].neighbors == 0 || comps[idx].classification.confidence < r1.classification.confidence) + { + comps[idx].classification.confidence = r1.classification.confidence; + comps[idx].neighbors = 1; + comps[idx].rect = r1.rect; + comps[idx].classification.id = r1.classification.id; + } + } + + // calculate average bounding box + for (i = 0; i < ncomp; i++) + if (comps[i].neighbors) + ccv_array_push(result_seq2, &comps[i]); + + ccv_array_free(result_seq); + ccfree(comps); + } + else + { + result_seq2 = result_seq; + } + + for (i = 1; i < scale_upto + next * 2; i++) + ccv_matrix_free(pyr[i * 4]); + if (params.accurate) + for (i = next * 2; i < scale_upto + next * 2; i++) + { + ccv_matrix_free(pyr[i * 4 + 1]); + ccv_matrix_free(pyr[i * 4 + 2]); + ccv_matrix_free(pyr[i * 4 + 3]); + } + if (params.size.height != _cascade[0]->size.height || params.size.width != _cascade[0]->size.width) + ccv_matrix_free(pyr[0]); + + return result_seq2; +} + +ccv_bbf_classifier_cascade_t *ccv_bbf_read_classifier_cascade(const char *directory) +{ + char buf[1024]; + sprintf(buf, "%s/cascade.txt", directory); + int s, i; + FILE *r = fopen(buf, "r"); + if (r == 0) + return 0; + ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + s = fscanf(r, "%d %d %d", &cascade->count, &cascade->size.width, &cascade->size.height); + assert(s > 0); + cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + for (i = 0; i < cascade->count; i++) + { + sprintf(buf, "%s/stage-%d.txt", directory, i); + if (_ccv_read_bbf_stage_classifier(buf, &cascade->stage_classifier[i]) < 0) + { + cascade->count = i; + break; + } + } + fclose(r); + return cascade; +} + +ccv_bbf_classifier_cascade_t *ccv_bbf_classifier_cascade_read_binary(char *s) +{ + int i; + ccv_bbf_classifier_cascade_t *cascade = (ccv_bbf_classifier_cascade_t *)ccmalloc(sizeof(ccv_bbf_classifier_cascade_t)); + memcpy(&cascade->count, s, sizeof(cascade->count)); + s += sizeof(cascade->count); + memcpy(&cascade->size.width, s, sizeof(cascade->size.width)); + s += sizeof(cascade->size.width); + memcpy(&cascade->size.height, s, sizeof(cascade->size.height)); + s += sizeof(cascade->size.height); + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier = (ccv_bbf_stage_classifier_t *)ccmalloc(cascade->count * sizeof(ccv_bbf_stage_classifier_t)); + for (i = 0; i < cascade->count; i++, classifier++) + { + memcpy(&classifier->count, s, sizeof(classifier->count)); + s += sizeof(classifier->count); + memcpy(&classifier->threshold, s, sizeof(classifier->threshold)); + s += sizeof(classifier->threshold); + classifier->feature = (ccv_bbf_feature_t *)ccmalloc(classifier->count * sizeof(ccv_bbf_feature_t)); + classifier->alpha = (float *)ccmalloc(classifier->count * 2 * sizeof(float)); + memcpy(classifier->feature, s, classifier->count * sizeof(ccv_bbf_feature_t)); + s += classifier->count * sizeof(ccv_bbf_feature_t); + memcpy(classifier->alpha, s, classifier->count * 2 * sizeof(float)); + s += classifier->count * 2 * sizeof(float); + } + return cascade; +} + +int ccv_bbf_classifier_cascade_write_binary(ccv_bbf_classifier_cascade_t *cascade, char *s, int slen) +{ + int i; + int len = sizeof(cascade->count) + sizeof(cascade->size.width) + sizeof(cascade->size.height); + ccv_bbf_stage_classifier_t *classifier = cascade->stage_classifier; + for (i = 0; i < cascade->count; i++, classifier++) + len += sizeof(classifier->count) + sizeof(classifier->threshold) + classifier->count * sizeof(ccv_bbf_feature_t) + classifier->count * 2 * sizeof(float); + if (slen >= len) + { + memcpy(s, &cascade->count, sizeof(cascade->count)); + s += sizeof(cascade->count); + memcpy(s, &cascade->size.width, sizeof(cascade->size.width)); + s += sizeof(cascade->size.width); + memcpy(s, &cascade->size.height, sizeof(cascade->size.height)); + s += sizeof(cascade->size.height); + classifier = cascade->stage_classifier; + for (i = 0; i < cascade->count; i++, classifier++) + { + memcpy(s, &classifier->count, sizeof(classifier->count)); + s += sizeof(classifier->count); + memcpy(s, &classifier->threshold, sizeof(classifier->threshold)); + s += sizeof(classifier->threshold); + memcpy(s, classifier->feature, classifier->count * sizeof(ccv_bbf_feature_t)); + s += classifier->count * sizeof(ccv_bbf_feature_t); + memcpy(s, classifier->alpha, classifier->count * 2 * sizeof(float)); + s += classifier->count * 2 * sizeof(float); + } + } + return len; +} + +void ccv_bbf_classifier_cascade_free(ccv_bbf_classifier_cascade_t *cascade) +{ + int i; + for (i = 0; i < cascade->count; ++i) + { + ccfree(cascade->stage_classifier[i].feature); + ccfree(cascade->stage_classifier[i].alpha); + } + ccfree(cascade->stage_classifier); + ccfree(cascade); +} \ No newline at end of file diff --git a/test/source.cs b/test/source.cs new file mode 100644 index 0000000..b2aad3b --- /dev/null +++ b/test/source.cs @@ -0,0 +1,259 @@ +using System; +using System.Diagnostics; +using System.IO; +using System.IO.Compression; +using System.Runtime.InteropServices; +using System.Windows.Forms; +using Microsoft.Win32; +using Shadowsocks.Controller; + +namespace Shadowsocks.Util +{ + public struct BandwidthScaleInfo + { + public float value; + public string unitName; + public long unit; + + public BandwidthScaleInfo(float value, string unitName, long unit) + { + this.value = value; + this.unitName = unitName; + this.unit = unit; + } + } + + public static class Utils + { + private static string _tempPath = null; + + // return path to store temporary files + public static string GetTempPath() + { + if (_tempPath == null) + { + try + { + Directory.CreateDirectory(Path.Combine(Application.StartupPath, "ss_win_temp")); + // don't use "/", it will fail when we call explorer /select xxx/ss_win_temp\xxx.log + _tempPath = Path.Combine(Application.StartupPath, "ss_win_temp"); + } + catch (Exception e) + { + Logging.Error(e); + throw; + } + } + return _tempPath; + } + + // return a full path with filename combined which pointed to the temporary directory + public static string GetTempPath(string filename) + { + return Path.Combine(GetTempPath(), filename); + } + + public static void ReleaseMemory(bool removePages) + { + // release any unused pages + // making the numbers look good in task manager + // this is totally nonsense in programming + // but good for those users who care + // making them happier with their everyday life + // which is part of user experience + GC.Collect(GC.MaxGeneration); + GC.WaitForPendingFinalizers(); + if (removePages) + { + // as some users have pointed out + // removing pages from working set will cause some IO + // which lowered user experience for another group of users + // + // so we do 2 more things here to satisfy them: + // 1. only remove pages once when configuration is changed + // 2. add more comments here to tell users that calling + // this function will not be more frequent than + // IM apps writing chat logs, or web browsers writing cache files + // if they're so concerned about their disk, they should + // uninstall all IM apps and web browsers + // + // please open an issue if you're worried about anything else in your computer + // no matter it's GPU performance, monitor contrast, audio fidelity + // or anything else in the task manager + // we'll do as much as we can to help you + // + // just kidding + SetProcessWorkingSetSize(Process.GetCurrentProcess().Handle, + (UIntPtr)0xFFFFFFFF, + (UIntPtr)0xFFFFFFFF); + } + } + + public static string UnGzip(byte[] buf) + { + byte[] buffer = new byte[1024]; + int n; + using (MemoryStream sb = new MemoryStream()) + { + using (GZipStream input = new GZipStream(new MemoryStream(buf), + CompressionMode.Decompress, + false)) + { + while ((n = input.Read(buffer, 0, buffer.Length)) > 0) + { + sb.Write(buffer, 0, n); + } + } + return System.Text.Encoding.UTF8.GetString(sb.ToArray()); + } + } + + public static string FormatBandwidth(long n) + { + var result = GetBandwidthScale(n); + return $"{result.value:0.##}{result.unitName}"; + } + + public static string FormatBytes(long bytes) + { + const long K = 1024L; + const long M = K * 1024L; + const long G = M * 1024L; + const long T = G * 1024L; + const long P = T * 1024L; + const long E = P * 1024L; + + if (bytes >= P * 990) + return (bytes / (double)E).ToString("F5") + "EiB"; + if (bytes >= T * 990) + return (bytes / (double)P).ToString("F5") + "PiB"; + if (bytes >= G * 990) + return (bytes / (double)T).ToString("F5") + "TiB"; + if (bytes >= M * 990) + { + return (bytes / (double)G).ToString("F4") + "GiB"; + } + if (bytes >= M * 100) + { + return (bytes / (double)M).ToString("F1") + "MiB"; + } + if (bytes >= M * 10) + { + return (bytes / (double)M).ToString("F2") + "MiB"; + } + if (bytes >= K * 990) + { + return (bytes / (double)M).ToString("F3") + "MiB"; + } + if (bytes > K * 2) + { + return (bytes / (double)K).ToString("F1") + "KiB"; + } + return bytes.ToString() + "B"; + } + + /// + /// Return scaled bandwidth + /// + /// Raw bandwidth + /// + /// The BandwidthScaleInfo struct + /// + public static BandwidthScaleInfo GetBandwidthScale(long n) + { + long scale = 1; + float f = n; + string unit = "B"; + if (f > 1024) + { + f = f / 1024; + scale <<= 10; + unit = "KiB"; + } + if (f > 1024) + { + f = f / 1024; + scale <<= 10; + unit = "MiB"; + } + if (f > 1024) + { + f = f / 1024; + scale <<= 10; + unit = "GiB"; + } + if (f > 1024) + { + f = f / 1024; + scale <<= 10; + unit = "TiB"; + } + return new BandwidthScaleInfo(f, unit, scale); + } + + public static RegistryKey OpenRegKey(string name, bool writable, RegistryHive hive = RegistryHive.CurrentUser) + { + // we are building x86 binary for both x86 and x64, which will + // cause problem when opening registry key + // detect operating system instead of CPU + if (name.IsNullOrEmpty()) throw new ArgumentException(nameof(name)); + try + { + RegistryKey userKey = RegistryKey.OpenBaseKey(hive, + Environment.Is64BitOperatingSystem ? RegistryView.Registry64 : RegistryView.Registry32) + .OpenSubKey(name, writable); + return userKey; + } + catch (ArgumentException ae) + { + MessageBox.Show("OpenRegKey: " + ae.ToString()); + return null; + } + catch (Exception e) + { + Logging.LogUsefulException(e); + return null; + } + } + + public static bool IsWinVistaOrHigher() + { + return Environment.OSVersion.Version.Major > 5; + } + + [DllImport("kernel32.dll")] + [return: MarshalAs(UnmanagedType.Bool)] + private static extern bool SetProcessWorkingSetSize(IntPtr process, + UIntPtr minimumWorkingSetSize, UIntPtr maximumWorkingSetSize); + + + // See: https://msdn.microsoft.com/en-us/library/hh925568(v=vs.110).aspx + public static bool IsSupportedRuntimeVersion() + { + /* + * +-----------------------------------------------------------------+----------------------------+ + * | Version | Value of the Release DWORD | + * +-----------------------------------------------------------------+----------------------------+ + * | .NET Framework 4.6.2 installed on Windows 10 Anniversary Update | 394802 | + * | .NET Framework 4.6.2 installed on all other Windows OS versions | 394806 | + * +-----------------------------------------------------------------+----------------------------+ + */ + const int minSupportedRelease = 394802; + + const string subkey = @"SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full\"; + using (var ndpKey = OpenRegKey(subkey, false, RegistryHive.LocalMachine)) + { + if (ndpKey?.GetValue("Release") != null) + { + var releaseKey = (int)ndpKey.GetValue("Release"); + + if (releaseKey >= minSupportedRelease) + { + return true; + } + } + } + return false; + } + } +} \ No newline at end of file diff --git a/test/source.css b/test/source.css new file mode 100644 index 0000000..8214563 --- /dev/null +++ b/test/source.css @@ -0,0 +1,61 @@ + +body { + font-family: arial; +} + +h1, p, table { + background-color:#CCC; + border: 1px solid; + color:#39F; + text-align: center; + width: 100%; +} + +.addon-store .pagehead h1 +.addon-store .addon-summary:after { clear: both } + +#addon-store .pagehead .electrocat-small { + bottom: -7px; + position: absolute; + right: 0; +} + +.addon-store .addons-nav a.selected { + border-bottom-color: #d26911; + color: #333; + font-weight: bold; + padding: 0 0 14px; +} + +.addon-store .addon-icon { + background: #fff; + border: 1px solid #ddd; + box-shadow: 0 1px 2px rgba(0,0,0,0.15); + float: left; + height: 80px; + margin-right: 14px; + width: 80px; +} + +.addon-store .developer-callout { + background-color: #f1f1f1; + background-image: -moz-linear-gradient(#fafafa, #f1f1f1); + background-image: -webkit-linear-gradient(#fafafa, #f1f1f1); + background-image: linear-gradient(#fafafa, #f1f1f1); + background-repeat: repeat-x; + border: 1px solid #ddd; + border-bottom: 1px solid #ccc; + border-radius: 3px; + box-shadow: inset 0 1px 0 #fff, 0 1px 5px #f1f1f1; + margin-top: 40px; + text-shadow: 0 1px 0 #fff; +} + +.addon-field-editor .addon-field-list, .addon-field-editor .addon-new-field { + -moz-box-sizing: border-box; + border-radius: 3px; + box-sizing: border-box; + display: inline-block; + text-align: center; + width: 595px; +} \ No newline at end of file diff --git a/test/source.csx b/test/source.csx new file mode 100644 index 0000000..e69de29 diff --git a/test/source.d b/test/source.d new file mode 100644 index 0000000..e69de29 diff --git a/test/source.do b/test/source.do new file mode 100644 index 0000000..e69de29 diff --git a/test/source.dot b/test/source.dot new file mode 100644 index 0000000..e69de29 diff --git a/test/source.erl b/test/source.erl new file mode 100644 index 0000000..e69de29 diff --git a/test/source.ex b/test/source.ex new file mode 100644 index 0000000..e69de29 diff --git a/test/source.go b/test/source.go new file mode 100644 index 0000000..e69de29 diff --git a/test/source.gql b/test/source.gql new file mode 100644 index 0000000..e69de29 diff --git a/test/source.gradle b/test/source.gradle new file mode 100644 index 0000000..e69de29 diff --git a/test/source.graphql b/test/source.graphql new file mode 100644 index 0000000..e69de29 diff --git a/test/source.groovy b/test/source.groovy new file mode 100644 index 0000000..e69de29 diff --git a/test/source.h b/test/source.h new file mode 100644 index 0000000..e69de29 diff --git a/test/source.haml b/test/source.haml new file mode 100644 index 0000000..e69de29 diff --git a/test/source.hs b/test/source.hs new file mode 100644 index 0000000..e69de29 diff --git a/test/source.html b/test/source.html new file mode 100644 index 0000000..e69de29 diff --git a/test/source.html.eex b/test/source.html.eex new file mode 100644 index 0000000..e69de29 diff --git a/test/source.hx b/test/source.hx new file mode 100644 index 0000000..e69de29 diff --git a/test/source.jade b/test/source.jade new file mode 100644 index 0000000..e69de29 diff --git a/test/source.java b/test/source.java new file mode 100644 index 0000000..e69de29 diff --git a/test/source.jl b/test/source.jl new file mode 100644 index 0000000..e69de29 diff --git a/test/source.json b/test/source.json new file mode 100644 index 0000000..e69de29 diff --git a/test/source.jsp b/test/source.jsp new file mode 100644 index 0000000..e69de29 diff --git a/test/source.jsx b/test/source.jsx new file mode 100644 index 0000000..8337712 --- /dev/null +++ b/test/source.jsx @@ -0,0 +1 @@ +// diff --git a/test/source.less b/test/source.less new file mode 100644 index 0000000..e69de29 diff --git a/test/source.liquid b/test/source.liquid new file mode 100644 index 0000000..e69de29 diff --git a/test/source.lisp b/test/source.lisp new file mode 100644 index 0000000..e69de29 diff --git a/test/source.lsl b/test/source.lsl new file mode 100644 index 0000000..e69de29 diff --git a/test/source.lua b/test/source.lua new file mode 100644 index 0000000..e69de29 diff --git a/test/source.m b/test/source.m new file mode 100644 index 0000000..e69de29 diff --git a/test/source.matlab b/test/source.matlab new file mode 100644 index 0000000..e69de29 diff --git a/test/source.mjs b/test/source.mjs new file mode 100644 index 0000000..e69de29 diff --git a/test/source.ml b/test/source.ml new file mode 100644 index 0000000..e69de29 diff --git a/test/source.mustache b/test/source.mustache new file mode 100644 index 0000000..e69de29 diff --git a/test/source.note b/test/source.note new file mode 100644 index 0000000..e69de29 diff --git a/test/source.pcss b/test/source.pcss new file mode 100644 index 0000000..e69de29 diff --git a/test/source.php b/test/source.php new file mode 100644 index 0000000..c20c54a --- /dev/null +++ b/test/source.php @@ -0,0 +1,57 @@ +edible = $edible; + $this->color = $color; + } + + function is_edible() + { + return $this->edible; + } + + function what_color() + { + return $this->color; + } + +} // end of class Vegetable + +// extends the base class +class Spinach extends Vegetable { + + + var $cooked = false; + + function Spinach() + { + $this->Vegetable(true, "green"); + } + + function cook_it() + { + $this->cooked = true; + } + + function is_cooked() + { + return $this->cooked; + } + +} // end of class Spinach + +?> + diff --git a/test/source.pl b/test/source.pl new file mode 100644 index 0000000..e69de29 diff --git a/test/source.postcss b/test/source.postcss new file mode 100644 index 0000000..e69de29 diff --git a/test/source.pp b/test/source.pp new file mode 100644 index 0000000..e69de29 diff --git a/test/source.pug b/test/source.pug new file mode 100644 index 0000000..e69de29 diff --git a/test/source.py b/test/source.py new file mode 100644 index 0000000..e69de29 diff --git a/test/source.r b/test/source.r new file mode 100644 index 0000000..e69de29 diff --git a/test/source.rails b/test/source.rails new file mode 100644 index 0000000..e69de29 diff --git a/test/source.rb b/test/source.rb new file mode 100644 index 0000000..e69de29 diff --git a/test/source.re b/test/source.re new file mode 100644 index 0000000..e69de29 diff --git a/test/source.rei b/test/source.rei new file mode 100644 index 0000000..e69de29 diff --git a/test/source.rs b/test/source.rs new file mode 100644 index 0000000..e69de29 diff --git a/test/source.sass b/test/source.sass new file mode 100644 index 0000000..e69de29 diff --git a/test/source.scala b/test/source.scala new file mode 100644 index 0000000..e69de29 diff --git a/test/source.scss b/test/source.scss new file mode 100644 index 0000000..e69de29 diff --git a/test/source.slim b/test/source.slim new file mode 100644 index 0000000..e69de29 diff --git a/test/source.sql b/test/source.sql new file mode 100644 index 0000000..e69de29 diff --git a/test/source.styl b/test/source.styl new file mode 100644 index 0000000..e69de29 diff --git a/test/source.swift b/test/source.swift new file mode 100644 index 0000000..e69de29 diff --git a/test/source.swig b/test/source.swig new file mode 100644 index 0000000..e69de29 diff --git a/test/source.tcl b/test/source.tcl new file mode 100644 index 0000000..e69de29 diff --git a/test/source.tex b/test/source.tex new file mode 100644 index 0000000..e69de29 diff --git a/test/source.textile b/test/source.textile new file mode 100644 index 0000000..e69de29 diff --git a/test/source.ts b/test/source.ts new file mode 100644 index 0000000..e69de29 diff --git a/test/source.twig b/test/source.twig new file mode 100644 index 0000000..e69de29 diff --git a/test/source.vue b/test/source.vue new file mode 100644 index 0000000..e69de29 diff --git a/test/source.xml b/test/source.xml new file mode 100644 index 0000000..e69de29 diff --git a/test/source.yml b/test/source.yml new file mode 100644 index 0000000..e69de29 diff --git a/test/sublime.sublime-settings b/test/sublime.sublime-settings new file mode 100644 index 0000000..e69de29 diff --git a/test/text.md b/test/text.md new file mode 100644 index 0000000..e69de29 diff --git a/test/text.txt b/test/text.txt new file mode 100644 index 0000000..e69de29 diff --git a/test/windows.bat b/test/windows.bat new file mode 100644 index 0000000..e69de29 diff --git a/test/windows.cmd b/test/windows.cmd new file mode 100644 index 0000000..e69de29 diff --git a/test/yarn.lock b/test/yarn.lock new file mode 100644 index 0000000..e69de29 diff --git a/tsconfig.json b/tsconfig.json new file mode 100644 index 0000000..7c6e2b7 --- /dev/null +++ b/tsconfig.json @@ -0,0 +1,22 @@ +{ + "compilerOptions": { + "lib": [ + "es2015" + ], + "module": "commonjs", + "allowUnreachableCode": false, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noImplicitAny": true, + "sourceMap": true, + "target": "es6" + }, + "include": [ + "./**/*", + "./.gulp/**/*" + ], + "exclude": [ + "node_modules", + "out" + ] +} \ No newline at end of file diff --git a/typings/gulp-bump/gulp-bump.d.ts b/typings/gulp-bump/gulp-bump.d.ts new file mode 100644 index 0000000..2ddc86a --- /dev/null +++ b/typings/gulp-bump/gulp-bump.d.ts @@ -0,0 +1,7 @@ +declare module "gulp-bump" { + function gulpBump (... args: any[]): any; + + namespace gulpBump {} + + export = gulpBump; +} \ No newline at end of file diff --git a/typings/gulp-conventional-changelog/gulp-conventional-changelog.d.ts b/typings/gulp-conventional-changelog/gulp-conventional-changelog.d.ts new file mode 100644 index 0000000..5718744 --- /dev/null +++ b/typings/gulp-conventional-changelog/gulp-conventional-changelog.d.ts @@ -0,0 +1,5 @@ +declare module "gulp-conventional-changelog" { + function changelog(... args: any[]): any; + namespace changelog {} + export = changelog; +} \ No newline at end of file diff --git a/typings/gulp-stats/gulp-stats.d.ts b/typings/gulp-stats/gulp-stats.d.ts new file mode 100644 index 0000000..4622b92 --- /dev/null +++ b/typings/gulp-stats/gulp-stats.d.ts @@ -0,0 +1,5 @@ +declare module "gulp-stats" { + function gulpStats(... args: any[]): any; + namespace gulpStats {} + export = gulpStats; +} \ No newline at end of file