From 9690121403d3afc6654cc01fb35af33046392280 Mon Sep 17 00:00:00 2001 From: Ching Date: Wed, 2 Feb 2022 19:04:18 +0800 Subject: [PATCH] feat(init project): add all existing files add all existing files Signed-off-by: Ching --- .gitignore | 132 + .npmignore | 7 + _config.yml | 90 + db.json | 1 + dump.rdb | Bin 0 -> 493592 bytes package-lock.json | 11685 ++++++++++++++++ package.json | 27 + public/2016/02/12/first-post/index.html | 120 + public/2016/02/15/Flask-Day-1/index.html | 145 + public/2016/02/16/Flask-Day-2/index.html | 129 + .../04/25/Django-Manager-Method/index.html | 132 + public/2016/05/04/Tastypie/index.html | 131 + public/2016/05/10/TastyPie-Note-1/index.html | 155 + public/2018/05/16/test/index.html | 6 + .../05/31/bash-function-and-awk/index.html | 130 + .../03/12/Postgresql-Partitioning/index.html | 146 + public/2019/11/14/AWS-KMS/index.html | 121 + public/2020/03/17/leetcode-121/index.html | 125 + public/2020/03/18/leetcode-206/index.html | 128 + public/2020/03/23/leetcode-169/index.html | 126 + public/2020/03/23/leetcode-225/index.html | 122 + public/2020/03/25/leetcode-409/index.html | 123 + public/2020/03/25/leetcode-543/index.html | 125 + public/2020/03/25/leetcode-836/index.html | 122 + public/2020/03/26/leetcode-876/index.html | 124 + public/2020/03/29/leetcode-1013/index.html | 122 + public/2020/03/29/leetcode-914/index.html | 122 + public/2020/03/30/leetcode-1071/index.html | 123 + public/2020/03/30/leetcode-999/index.html | 123 + public/2020/04/01/leetcode-1103/index.html | 122 + public/2020/04/01/leetcode-1160/index.html | 122 + .../leetcode-compress-string-lcci/index.html | 122 + .../index.html | 123 + .../09/leetcode-the-masseuse-lcci/index.html | 126 + .../14/leetcode-add-two-numbers-ii/index.html | 125 + .../04/14/leetcode-design-twitter/index.html | 123 + .../2020/04/16/leetcode-01-matrix/index.html | 128 + .../04/16/leetcode-merge-intervals/index.html | 122 + .../index.html | 122 + .../21/leetcode-number-of-islands/index.html | 122 + public/CNAME | 1 + public/archives/2016/02/index.html | 158 + public/archives/2016/04/index.html | 132 + public/archives/2016/05/index.html | 168 + public/archives/2016/index.html | 222 + public/archives/2018/05/index.html | 130 + public/archives/2018/index.html | 130 + public/archives/2019/03/index.html | 146 + public/archives/2019/11/index.html | 121 + public/archives/2019/index.html | 149 + public/archives/2020/03/index.html | 118 + public/archives/2020/03/page/2/index.html | 118 + public/archives/2020/04/index.html | 118 + public/archives/2020/04/page/2/index.html | 118 + public/archives/2020/index.html | 118 + public/archives/2020/page/2/index.html | 118 + public/archives/2020/page/3/index.html | 118 + public/archives/index.html | 118 + public/archives/page/2/index.html | 118 + public/archives/page/3/index.html | 236 + public/archives/page/4/index.html | 147 + public/atom.xml | 521 + public/categories/leetcode/index.html | 118 + public/categories/leetcode/page/2/index.html | 118 + public/categories/leetcode/page/3/index.html | 118 + public/css/apollo.css | 1 + public/favicon.png | Bin 0 -> 616 bytes public/index.html | 118 + public/logo.png | Bin 0 -> 3001 bytes public/page/2/index.html | 118 + public/page/3/index.html | 236 + public/page/4/index.html | 147 + public/scss/apollo.scss | 10 + public/sitemap.xml | 228 + scaffolds/draft.md | 4 + scaffolds/page.md | 4 + scaffolds/post.md | 6 + source/.MWebMetaData/setting.json | 10 + source/CNAME | 1 + .../2018-05-31-bash-function-and-awk.md | 52 + source/_posts/2019-11-14-AWS-KMS.md | 14 + source/_posts/2020-03-17-leetcode-121.md | 59 + source/_posts/2020-03-18-leetcode-206.md | 88 + source/_posts/2020-03-23-leetcode-169.md | 62 + source/_posts/2020-03-23-leetcode-225.md | 69 + source/_posts/2020-03-25-leetcode-409.md | 49 + source/_posts/2020-03-25-leetcode-543.md | 112 + source/_posts/2020-03-25-leetcode-836.md | 33 + source/_posts/2020-03-26-leetcode-876.md | 67 + source/_posts/2020-03-29-leetcode-1013.md | 45 + source/_posts/2020-03-29-leetcode-914.md | 51 + source/_posts/2020-03-30-leetcode-1071.md | 59 + source/_posts/2020-03-30-leetcode-999.md | 71 + source/_posts/2020-04-01-leetcode-1103.md | 55 + source/_posts/2020-04-01-leetcode-1160.md | 38 + ...020-04-01-leetcode-compress-string-lcci.md | 41 + ...e-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md | 42 + .../2020-04-09-leetcode-the-masseuse-lcci.md | 47 + .../2020-04-14-leetcode-add-two-numbers-ii.md | 115 + .../2020-04-14-leetcode-design-twitter.md | 83 + .../_posts/2020-04-16-leetcode-01-matrix.md | 47 + .../2020-04-16-leetcode-merge-intervals.md | 50 + ...0-04-16-leetcode-string-to-integer-atoi.md | 55 + .../2020-04-21-leetcode-number-of-islands.md | 49 + source/_posts/Django-Manager-Method.md | 53 + source/_posts/Flask-Day-1.md | 120 + source/_posts/Flask-Day-2.md | 80 + source/_posts/Postgresql Partitioning.md | 42 + source/_posts/TastyPie-Note-1.md | 44 + source/_posts/Tastypie.md | 38 + source/_posts/first-post.md | 9 + themes/apollo | 1 + themes/cactus | 1 + themes/landscape/.npmignore | 3 + themes/landscape/Gruntfile.js | 46 + themes/landscape/LICENSE | 7 + themes/landscape/README.md | 111 + themes/landscape/_config.yml | 36 + themes/landscape/languages/default.yml | 19 + themes/landscape/languages/nl.yml | 20 + themes/landscape/languages/no.yml | 19 + themes/landscape/languages/ru.yml | 19 + themes/landscape/languages/zh-CN.yml | 19 + themes/landscape/languages/zh-TW.yml | 19 + .../layout/_partial/after-footer.ejs | 24 + .../layout/_partial/archive-post.ejs | 8 + themes/landscape/layout/_partial/archive.ejs | 33 + themes/landscape/layout/_partial/article.ejs | 44 + themes/landscape/layout/_partial/footer.ejs | 11 + .../layout/_partial/google-analytics.ejs | 14 + themes/landscape/layout/_partial/head.ejs | 36 + themes/landscape/layout/_partial/header.ejs | 32 + .../landscape/layout/_partial/mobile-nav.ejs | 5 + .../layout/_partial/post/category.ejs | 10 + .../landscape/layout/_partial/post/date.ejs | 3 + .../layout/_partial/post/gallery.ejs | 11 + themes/landscape/layout/_partial/post/nav.ejs | 22 + themes/landscape/layout/_partial/post/tag.ejs | 6 + .../landscape/layout/_partial/post/title.ejs | 15 + themes/landscape/layout/_partial/sidebar.ejs | 5 + themes/landscape/layout/_widget/archive.ejs | 8 + themes/landscape/layout/_widget/category.ejs | 8 + .../landscape/layout/_widget/recent_posts.ejs | 14 + themes/landscape/layout/_widget/tag.ejs | 8 + themes/landscape/layout/_widget/tagcloud.ejs | 8 + themes/landscape/layout/archive.ejs | 1 + themes/landscape/layout/category.ejs | 1 + themes/landscape/layout/index.ejs | 1 + themes/landscape/layout/layout.ejs | 18 + themes/landscape/layout/page.ejs | 1 + themes/landscape/layout/post.ejs | 1 + themes/landscape/layout/tag.ejs | 1 + themes/landscape/package.json | 12 + themes/landscape/scripts/fancybox.js | 24 + themes/landscape/source/css/_extend.styl | 63 + .../source/css/_partial/archive.styl | 80 + .../source/css/_partial/article.styl | 357 + .../source/css/_partial/comment.styl | 9 + .../landscape/source/css/_partial/footer.styl | 14 + .../landscape/source/css/_partial/header.styl | 165 + .../source/css/_partial/highlight.styl | 156 + .../landscape/source/css/_partial/mobile.styl | 19 + .../source/css/_partial/sidebar-aside.styl | 27 + .../source/css/_partial/sidebar-bottom.styl | 27 + .../source/css/_partial/sidebar.styl | 35 + themes/landscape/source/css/_util/grid.styl | 38 + themes/landscape/source/css/_util/mixin.styl | 31 + themes/landscape/source/css/_variables.styl | 60 + .../source/css/fonts/FontAwesome.otf | Bin 0 -> 62856 bytes .../source/css/fonts/fontawesome-webfont.eot | Bin 0 -> 38205 bytes .../source/css/fonts/fontawesome-webfont.svg | 414 + .../source/css/fonts/fontawesome-webfont.ttf | Bin 0 -> 80652 bytes .../source/css/fonts/fontawesome-webfont.woff | Bin 0 -> 44432 bytes themes/landscape/source/css/images/banner.jpg | Bin 0 -> 224710 bytes themes/landscape/source/css/style.styl | 89 + themes/landscape/source/fancybox/blank.gif | Bin 0 -> 43 bytes .../source/fancybox/fancybox_loading.gif | Bin 0 -> 6567 bytes .../source/fancybox/fancybox_loading@2x.gif | Bin 0 -> 13984 bytes .../source/fancybox/fancybox_overlay.png | Bin 0 -> 1003 bytes .../source/fancybox/fancybox_sprite.png | Bin 0 -> 1362 bytes .../source/fancybox/fancybox_sprite@2x.png | Bin 0 -> 6553 bytes .../fancybox/helpers/fancybox_buttons.png | Bin 0 -> 1080 bytes .../helpers/jquery.fancybox-buttons.css | 97 + .../helpers/jquery.fancybox-buttons.js | 122 + .../fancybox/helpers/jquery.fancybox-media.js | 199 + .../helpers/jquery.fancybox-thumbs.css | 55 + .../helpers/jquery.fancybox-thumbs.js | 165 + .../source/fancybox/jquery.fancybox.css | 273 + .../source/fancybox/jquery.fancybox.js | 2017 +++ .../source/fancybox/jquery.fancybox.pack.js | 46 + themes/landscape/source/js/script.js | 137 + 191 files changed, 27798 insertions(+) create mode 100644 .gitignore create mode 100644 .npmignore create mode 100644 _config.yml create mode 100644 db.json create mode 100644 dump.rdb create mode 100644 package-lock.json create mode 100644 package.json create mode 100644 public/2016/02/12/first-post/index.html create mode 100644 public/2016/02/15/Flask-Day-1/index.html create mode 100644 public/2016/02/16/Flask-Day-2/index.html create mode 100644 public/2016/04/25/Django-Manager-Method/index.html create mode 100644 public/2016/05/04/Tastypie/index.html create mode 100644 public/2016/05/10/TastyPie-Note-1/index.html create mode 100644 public/2018/05/16/test/index.html create mode 100644 public/2018/05/31/bash-function-and-awk/index.html create mode 100644 public/2019/03/12/Postgresql-Partitioning/index.html create mode 100644 public/2019/11/14/AWS-KMS/index.html create mode 100644 public/2020/03/17/leetcode-121/index.html create mode 100644 public/2020/03/18/leetcode-206/index.html create mode 100644 public/2020/03/23/leetcode-169/index.html create mode 100644 public/2020/03/23/leetcode-225/index.html create mode 100644 public/2020/03/25/leetcode-409/index.html create mode 100644 public/2020/03/25/leetcode-543/index.html create mode 100644 public/2020/03/25/leetcode-836/index.html create mode 100644 public/2020/03/26/leetcode-876/index.html create mode 100644 public/2020/03/29/leetcode-1013/index.html create mode 100644 public/2020/03/29/leetcode-914/index.html create mode 100644 public/2020/03/30/leetcode-1071/index.html create mode 100644 public/2020/03/30/leetcode-999/index.html create mode 100644 public/2020/04/01/leetcode-1103/index.html create mode 100644 public/2020/04/01/leetcode-1160/index.html create mode 100644 public/2020/04/01/leetcode-compress-string-lcci/index.html create mode 100644 public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html create mode 100644 public/2020/04/09/leetcode-the-masseuse-lcci/index.html create mode 100644 public/2020/04/14/leetcode-add-two-numbers-ii/index.html create mode 100644 public/2020/04/14/leetcode-design-twitter/index.html create mode 100644 public/2020/04/16/leetcode-01-matrix/index.html create mode 100644 public/2020/04/16/leetcode-merge-intervals/index.html create mode 100644 public/2020/04/16/leetcode-string-to-integer-atoi/index.html create mode 100644 public/2020/04/21/leetcode-number-of-islands/index.html create mode 100644 public/CNAME create mode 100644 public/archives/2016/02/index.html create mode 100644 public/archives/2016/04/index.html create mode 100644 public/archives/2016/05/index.html create mode 100644 public/archives/2016/index.html create mode 100644 public/archives/2018/05/index.html create mode 100644 public/archives/2018/index.html create mode 100644 public/archives/2019/03/index.html create mode 100644 public/archives/2019/11/index.html create mode 100644 public/archives/2019/index.html create mode 100644 public/archives/2020/03/index.html create mode 100644 public/archives/2020/03/page/2/index.html create mode 100644 public/archives/2020/04/index.html create mode 100644 public/archives/2020/04/page/2/index.html create mode 100644 public/archives/2020/index.html create mode 100644 public/archives/2020/page/2/index.html create mode 100644 public/archives/2020/page/3/index.html create mode 100644 public/archives/index.html create mode 100644 public/archives/page/2/index.html create mode 100644 public/archives/page/3/index.html create mode 100644 public/archives/page/4/index.html create mode 100644 public/atom.xml create mode 100644 public/categories/leetcode/index.html create mode 100644 public/categories/leetcode/page/2/index.html create mode 100644 public/categories/leetcode/page/3/index.html create mode 100644 public/css/apollo.css create mode 100644 public/favicon.png create mode 100644 public/index.html create mode 100644 public/logo.png create mode 100644 public/page/2/index.html create mode 100644 public/page/3/index.html create mode 100644 public/page/4/index.html create mode 100644 public/scss/apollo.scss create mode 100644 public/sitemap.xml create mode 100644 scaffolds/draft.md create mode 100644 scaffolds/page.md create mode 100644 scaffolds/post.md create mode 100644 source/.MWebMetaData/setting.json create mode 100644 source/CNAME create mode 100644 source/_posts/2018-05-31-bash-function-and-awk.md create mode 100644 source/_posts/2019-11-14-AWS-KMS.md create mode 100644 source/_posts/2020-03-17-leetcode-121.md create mode 100644 source/_posts/2020-03-18-leetcode-206.md create mode 100644 source/_posts/2020-03-23-leetcode-169.md create mode 100644 source/_posts/2020-03-23-leetcode-225.md create mode 100644 source/_posts/2020-03-25-leetcode-409.md create mode 100644 source/_posts/2020-03-25-leetcode-543.md create mode 100644 source/_posts/2020-03-25-leetcode-836.md create mode 100644 source/_posts/2020-03-26-leetcode-876.md create mode 100644 source/_posts/2020-03-29-leetcode-1013.md create mode 100644 source/_posts/2020-03-29-leetcode-914.md create mode 100644 source/_posts/2020-03-30-leetcode-1071.md create mode 100644 source/_posts/2020-03-30-leetcode-999.md create mode 100644 source/_posts/2020-04-01-leetcode-1103.md create mode 100644 source/_posts/2020-04-01-leetcode-1160.md create mode 100644 source/_posts/2020-04-01-leetcode-compress-string-lcci.md create mode 100644 source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md create mode 100644 source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md create mode 100644 source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md create mode 100644 source/_posts/2020-04-14-leetcode-design-twitter.md create mode 100644 source/_posts/2020-04-16-leetcode-01-matrix.md create mode 100644 source/_posts/2020-04-16-leetcode-merge-intervals.md create mode 100644 source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md create mode 100644 source/_posts/2020-04-21-leetcode-number-of-islands.md create mode 100644 source/_posts/Django-Manager-Method.md create mode 100644 source/_posts/Flask-Day-1.md create mode 100644 source/_posts/Flask-Day-2.md create mode 100644 source/_posts/Postgresql Partitioning.md create mode 100644 source/_posts/TastyPie-Note-1.md create mode 100644 source/_posts/Tastypie.md create mode 100644 source/_posts/first-post.md create mode 160000 themes/apollo create mode 160000 themes/cactus create mode 100644 themes/landscape/.npmignore create mode 100644 themes/landscape/Gruntfile.js create mode 100644 themes/landscape/LICENSE create mode 100644 themes/landscape/README.md create mode 100644 themes/landscape/_config.yml create mode 100644 themes/landscape/languages/default.yml create mode 100644 themes/landscape/languages/nl.yml create mode 100644 themes/landscape/languages/no.yml create mode 100644 themes/landscape/languages/ru.yml create mode 100644 themes/landscape/languages/zh-CN.yml create mode 100644 themes/landscape/languages/zh-TW.yml create mode 100644 themes/landscape/layout/_partial/after-footer.ejs create mode 100644 themes/landscape/layout/_partial/archive-post.ejs create mode 100644 themes/landscape/layout/_partial/archive.ejs create mode 100644 themes/landscape/layout/_partial/article.ejs create mode 100644 themes/landscape/layout/_partial/footer.ejs create mode 100644 themes/landscape/layout/_partial/google-analytics.ejs create mode 100644 themes/landscape/layout/_partial/head.ejs create mode 100644 themes/landscape/layout/_partial/header.ejs create mode 100644 themes/landscape/layout/_partial/mobile-nav.ejs create mode 100644 themes/landscape/layout/_partial/post/category.ejs create mode 100644 themes/landscape/layout/_partial/post/date.ejs create mode 100644 themes/landscape/layout/_partial/post/gallery.ejs create mode 100644 themes/landscape/layout/_partial/post/nav.ejs create mode 100644 themes/landscape/layout/_partial/post/tag.ejs create mode 100644 themes/landscape/layout/_partial/post/title.ejs create mode 100644 themes/landscape/layout/_partial/sidebar.ejs create mode 100644 themes/landscape/layout/_widget/archive.ejs create mode 100644 themes/landscape/layout/_widget/category.ejs create mode 100644 themes/landscape/layout/_widget/recent_posts.ejs create mode 100644 themes/landscape/layout/_widget/tag.ejs create mode 100644 themes/landscape/layout/_widget/tagcloud.ejs create mode 100644 themes/landscape/layout/archive.ejs create mode 100644 themes/landscape/layout/category.ejs create mode 100644 themes/landscape/layout/index.ejs create mode 100644 themes/landscape/layout/layout.ejs create mode 100644 themes/landscape/layout/page.ejs create mode 100644 themes/landscape/layout/post.ejs create mode 100644 themes/landscape/layout/tag.ejs create mode 100644 themes/landscape/package.json create mode 100644 themes/landscape/scripts/fancybox.js create mode 100644 themes/landscape/source/css/_extend.styl create mode 100644 themes/landscape/source/css/_partial/archive.styl create mode 100644 themes/landscape/source/css/_partial/article.styl create mode 100644 themes/landscape/source/css/_partial/comment.styl create mode 100644 themes/landscape/source/css/_partial/footer.styl create mode 100644 themes/landscape/source/css/_partial/header.styl create mode 100644 themes/landscape/source/css/_partial/highlight.styl create mode 100644 themes/landscape/source/css/_partial/mobile.styl create mode 100644 themes/landscape/source/css/_partial/sidebar-aside.styl create mode 100644 themes/landscape/source/css/_partial/sidebar-bottom.styl create mode 100644 themes/landscape/source/css/_partial/sidebar.styl create mode 100644 themes/landscape/source/css/_util/grid.styl create mode 100644 themes/landscape/source/css/_util/mixin.styl create mode 100644 themes/landscape/source/css/_variables.styl create mode 100644 themes/landscape/source/css/fonts/FontAwesome.otf create mode 100644 themes/landscape/source/css/fonts/fontawesome-webfont.eot create mode 100644 themes/landscape/source/css/fonts/fontawesome-webfont.svg create mode 100644 themes/landscape/source/css/fonts/fontawesome-webfont.ttf create mode 100644 themes/landscape/source/css/fonts/fontawesome-webfont.woff create mode 100644 themes/landscape/source/css/images/banner.jpg create mode 100644 themes/landscape/source/css/style.styl create mode 100644 themes/landscape/source/fancybox/blank.gif create mode 100644 themes/landscape/source/fancybox/fancybox_loading.gif create mode 100644 themes/landscape/source/fancybox/fancybox_loading@2x.gif create mode 100644 themes/landscape/source/fancybox/fancybox_overlay.png create mode 100644 themes/landscape/source/fancybox/fancybox_sprite.png create mode 100644 themes/landscape/source/fancybox/fancybox_sprite@2x.png create mode 100644 themes/landscape/source/fancybox/helpers/fancybox_buttons.png create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.css create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-buttons.js create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-media.js create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.css create mode 100644 themes/landscape/source/fancybox/helpers/jquery.fancybox-thumbs.js create mode 100644 themes/landscape/source/fancybox/jquery.fancybox.css create mode 100644 themes/landscape/source/fancybox/jquery.fancybox.js create mode 100644 themes/landscape/source/fancybox/jquery.fancybox.pack.js create mode 100644 themes/landscape/source/js/script.js diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..1dd2219 --- /dev/null +++ b/.gitignore @@ -0,0 +1,132 @@ +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +.deploy_git/ diff --git a/.npmignore b/.npmignore new file mode 100644 index 0000000..063b0e4 --- /dev/null +++ b/.npmignore @@ -0,0 +1,7 @@ +.DS_Store +Thumbs.db +db.json +*.log +node_modules/ +public/ +.deploy*/ \ No newline at end of file diff --git a/_config.yml b/_config.yml new file mode 100644 index 0000000..8fd74d5 --- /dev/null +++ b/_config.yml @@ -0,0 +1,90 @@ +# Hexo Configuration +## Docs: https://hexo.io/docs/configuration.html +## Source: https://github.com/hexojs/hexo/ + +# Site +title: MarkDown +subtitle: 「靡不有初,鲜克有终」 +description: +author: Ching +language: zh-CN +timezone: Asia/Shanghai + +# URL +## If your site is put in a subdirectory, set url as 'http://yoursite.com/child' and root as '/child/' +url: http://blog.tunpok.com/ +root: / +permalink: :year/:month/:day/:title/ +permalink_defaults: + +# Directory +source_dir: source +public_dir: public +tag_dir: tags +archive_dir: archives +category_dir: categories +code_dir: downloads/code +i18n_dir: :lang +skip_render: + +# Writing +new_post_name: :year-:month-:day-:title.md # File name of new posts +default_layout: post +titlecase: false # Transform title into titlecase +external_link: true # Open external links in new tab +filename_case: 0 +render_drafts: false +post_asset_folder: false +relative_link: false +future: true +highlight: + enable: true + line_number: true + auto_detect: false + tab_replace: + +# Category & Tag +default_category: uncategorized +category_map: +tag_map: + +# Date / Time format +## Hexo uses Moment.js to parse and display date +## You can customize the date format as defined in +## http://momentjs.com/docs/#/displaying/format/ +date_format: YYYY-MM-DD +time_format: HH:mm:ss + +# Pagination +## Set per_page to 0 to disable pagination +per_page: 10 +pagination_dir: page + +# Extensions +## Plugins: https://hexo.io/plugins/ +## Themes: https://hexo.io/themes/ +theme: apollo +# theme: cactus + +# Deployment +## Docs: https://hexo.io/docs/deployment.html +# deploy: +# type: git +# repo: https://github.com/looching/looching.github.io + + +deploy: + type: rsync + host: 104.238.151.113 + user: captain + root: /var/www/tunpok-blog + port: 22 # Default is 22 + delete: true # Default is true + verbose: true # Default is true + ignore_errors: false # Default is false + +mathjax: + tags: none # or 'ams' or 'all' + single_dollars: true # enable single dollar signs as in-line math delimiters + cjk_width: 0.9 # relative CJK char width + normal_width: 0.6 # relative normal (monospace) width diff --git a/db.json b/db.json new file mode 100644 index 0000000..69b95ed --- /dev/null +++ b/db.json @@ -0,0 +1 @@ +{"meta":{"version":1,"warehouse":"2.2.0"},"models":{"Asset":[{"_id":"source/CNAME","path":"CNAME","modified":0,"renderable":0},{"_id":"themes/apollo/source/favicon.png","path":"favicon.png","modified":0,"renderable":1},{"_id":"themes/apollo/source/logo.png","path":"logo.png","modified":0,"renderable":1},{"_id":"themes/apollo/source/scss/apollo.scss","path":"scss/apollo.scss","modified":0,"renderable":1},{"_id":"themes/apollo/source/css/apollo.css","path":"css/apollo.css","modified":0,"renderable":1}],"Cache":[{"_id":"source/CNAME","hash":"c53a99d8555292c2cc8dd02c564b9d5fdfed89cb","modified":1526396315000},{"_id":"themes/apollo/.DS_Store","hash":"695101ad11d1cb210f2667e7bdcdccd7e40391de","modified":1586364749000},{"_id":"themes/apollo/.gitignore","hash":"a006beea0877a0aa3610ee00e73f62cb1d45125b","modified":1526396315000},{"_id":"themes/apollo/README.md","hash":"a6930c691c69ed78584022fbcd0f4245587d09f5","modified":1526396315000},{"_id":"themes/apollo/LICENSE","hash":"6e31ac9076bfc8f09ae47977419eee4edfb63e5b","modified":1526396315000},{"_id":"themes/apollo/_config.yml","hash":"0564002d6a750856deec82fb89f6b2cb41d0a294","modified":1587446398000},{"_id":"themes/apollo/gulpfile.js","hash":"857a026b6643a2cd52c65d4ae0dc7fe9618206ee","modified":1526396315000},{"_id":"themes/apollo/package.json","hash":"9426138c09ebb95969021d951590c0c54b187a43","modified":1526396315000},{"_id":"source/.MWebMetaData/setting.json","hash":"63037ec4e43ae67cbe98b4f81451eef32dccf232","modified":1573529113000},{"_id":"source/_posts/2020-03-17-leetcode-121.md","hash":"62aa9ec2e2aa784728c189d4d7145ebab1380ae3","modified":1584442443000},{"_id":"source/_posts/2018-05-31-bash-function-and-awk.md","hash":"e9e89d931fd9652c4fc39ac49db953d15e55c19c","modified":1573718510000},{"_id":"source/_posts/2019-11-14-AWS-KMS.md","hash":"519de77de3ffdcc67169130e36f8c53e20f3b2b6","modified":1573718604000},{"_id":"source/_posts/2020-03-18-leetcode-206.md","hash":"c80133bf68fc993ddc24517da4bc226764ae2a40","modified":1584546252000},{"_id":"source/_posts/2020-03-23-leetcode-225.md","hash":"aff4492c0c07d0d31b0313b5ef9378279233141b","modified":1584977724000},{"_id":"source/_posts/2020-03-23-leetcode-169.md","hash":"f193c41627501ed7235459d5ad40fd3d6ebf0a71","modified":1584976429000},{"_id":"source/_posts/2020-03-25-leetcode-409.md","hash":"f0e210e4da442e66e4436f7055f673c4655907f0","modified":1585144554000},{"_id":"source/_posts/2020-03-25-leetcode-543.md","hash":"a6e406e0bca5aa834c99625f74ee38ae87324b7f","modified":1586878193000},{"_id":"source/_posts/2020-03-25-leetcode-836.md","hash":"cc9e68c7e2ea013086e1d6ae0c2b212c60cac573","modified":1585147304000},{"_id":"source/_posts/2020-03-29-leetcode-1013.md","hash":"4937a632273d945e4f258ef96d6ca8c2d8fe9f5b","modified":1585487711000},{"_id":"source/_posts/2020-03-26-leetcode-876.md","hash":"4905be27ad818ebc81d3938227d31d760c5631c4","modified":1585228750000},{"_id":"source/_posts/2020-03-29-leetcode-914.md","hash":"a0631cf342a08f5ff9ad4d0ca2bf8372dca60ecc","modified":1585493527000},{"_id":"source/_posts/2020-03-30-leetcode-1071.md","hash":"affa6c07b877b5fa46873eca5ca300db4f24efb6","modified":1585577057000},{"_id":"source/_posts/2020-03-30-leetcode-999.md","hash":"41bd6e2ce8483d5d158b88d28ee63ec1551ca10a","modified":1585573421000},{"_id":"source/_posts/2020-04-01-leetcode-1103.md","hash":"c76f58bceaa6aafb010e7163f3ef893573c2a45f","modified":1586366247000},{"_id":"source/_posts/2020-04-01-leetcode-1160.md","hash":"bb2daed56d6bfb2cd930afb2e3c9b0ebb6e597bd","modified":1585727826000},{"_id":"source/_posts/2020-04-01-leetcode-compress-string-lcci.md","hash":"254b0bffa89a3d5711f8b3f45f1d05f23f27fac9","modified":1585727846000},{"_id":"source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md","hash":"d1801e8c1bfff064a59cd43bc800226a193ef6b0","modified":1586878180000},{"_id":"source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md","hash":"ebed1ea3f1229f6109e812cbb0f7e203f7312e0b","modified":1586878115000},{"_id":"source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md","hash":"914948de11976b4d0db287c5beb1f4e40b71f7a7","modified":1586366044000},{"_id":"source/_posts/2020-04-16-leetcode-01-matrix.md","hash":"e29a270941ba47ad981089856d75640cc468f956","modified":1587011216000},{"_id":"source/_posts/2020-04-14-leetcode-design-twitter.md","hash":"f5e5079109ad996244e2cd9ed7a23976b6fd872c","modified":1586878174000},{"_id":"source/_posts/2020-04-16-leetcode-merge-intervals.md","hash":"4c8e56c27ec095f80ab803a819c83d60ffb6c697","modified":1587036168000},{"_id":"source/_posts/2020-04-21-leetcode-number-of-islands.md","hash":"766d66e49da9072f4e8afa0229b744e9407eed7a","modified":1587444946000},{"_id":"source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md","hash":"903c766c73dd8ed9d1baf081b113113eef0740fa","modified":1587038200000},{"_id":"source/_posts/Postgresql Partitioning.md","hash":"63d88ca7c739c3153d63c7ca0f03c7fbc6708bb0","modified":1573718510000},{"_id":"source/_posts/Django-Manager-Method.md","hash":"5d83851ffbe6d2077a87ef66a7c11e1b13546c1f","modified":1526396315000},{"_id":"source/_posts/Flask-Day-1.md","hash":"19976eabe8d244b085108beb57116b81cabcc693","modified":1526396315000},{"_id":"source/_posts/Flask-Day-2.md","hash":"fea0129a559b2e76aa6927d5df528acd357fe3c9","modified":1526396315000},{"_id":"source/_posts/Tastypie.md","hash":"9b9d53979b98fcdca24c2ad8dc8a78c1dc77a665","modified":1526396315000},{"_id":"source/_posts/first-post.md","hash":"0cfe954d5b7b12d46dd20fe43e95835b89b30163","modified":1526396315000},{"_id":"themes/apollo/.git/HEAD","hash":"acbaef275e46a7f14c1ef456fff2c8bbe8c84724","modified":1526396315000},{"_id":"source/_posts/TastyPie-Note-1.md","hash":"843365f5f5b6142bba6ea900818d19848e3f070b","modified":1526396315000},{"_id":"themes/apollo/.git/config","hash":"e8486e77527181934f2dda23e50b879ab7641244","modified":1526396315000},{"_id":"themes/apollo/.git/description","hash":"9635f1b7e12c045212819dd934d809ef07efa2f4","modified":1526396315000},{"_id":"themes/apollo/.git/index","hash":"3aafcb5c0dca1df92022e4f3167231547c5e79e0","modified":1527846627000},{"_id":"themes/apollo/.git/packed-refs","hash":"0b13c31fe5e09d24b87c9bb547eaa0645fbfd2dc","modified":1526396315000},{"_id":"themes/apollo/doc/doc-en.md","hash":"1bccce1d01f085aedcb01317d2db23ca61351f13","modified":1526396315000},{"_id":"themes/apollo/languages/zh-cn.yml","hash":"9e4b03e14c094000257ea254fd660dde4c7af63c","modified":1526396315000},{"_id":"themes/apollo/doc/doc-zh.md","hash":"3aad2ed65922f6f5dd9731301195474d16a8a9be","modified":1526396315000},{"_id":"themes/apollo/languages/en.yml","hash":"65998758dd27a350b6d4f2dc803970a9c89978da","modified":1526396315000},{"_id":"themes/apollo/layout/index.jade","hash":"58c451042cad5beeb5a76852bba609c651ff3428","modified":1526396315000},{"_id":"themes/apollo/source/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1526399879000},{"_id":"themes/apollo/source/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","modified":1526396315000},{"_id":"themes/apollo/layout/post.jade","hash":"33ab46ab3736e5d51388939858647942ce375b9b","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/commit-msg.sample","hash":"ee1ed5aad98a435f2020b6de35c173b75d9affac","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/applypatch-msg.sample","hash":"86b9655a9ebbde13ac8dd5795eb4d5b539edab0f","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/post-update.sample","hash":"b614c2f63da7dca9f1db2e7ade61ef30448fc96c","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-commit.sample","hash":"36aed8976dcc08b5076844f0ec645b18bc37758f","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-applypatch.sample","hash":"42fa41564917b44183a50c4d94bb03e1768ddad8","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-push.sample","hash":"b4ad74c989616b7395dc6c9fce9871bb1e86dfb5","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/prepare-commit-msg.sample","hash":"2b6275eda365cad50d167fe3a387c9bc9fedd54f","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/pre-rebase.sample","hash":"5885a56ab4fca8075a05a562d005e922cde9853b","modified":1526396315000},{"_id":"themes/apollo/.git/info/exclude","hash":"c879df015d97615050afa7b9641e3352a1e701ac","modified":1526396315000},{"_id":"themes/apollo/.git/hooks/update.sample","hash":"39355a075977d05708ef74e1b66d09a36e486df1","modified":1526396315000},{"_id":"themes/apollo/.git/logs/HEAD","hash":"ff18dd6e76ec3e861fb0bc3789225625abd19928","modified":1526396315000},{"_id":"themes/apollo/layout/mixins/paginator.jade","hash":"f4ee2fb61a32e199b48cf93771749edc8a007391","modified":1526396315000},{"_id":"themes/apollo/layout/mixins/post.jade","hash":"e3c78a617191a2feafd360a5ddbc5cceeae4cf21","modified":1526396315000},{"_id":"themes/apollo/layout/partial/head.jade","hash":"51b2ba6a1cebb275730eb7131eea211c91f0986a","modified":1526396315000},{"_id":"themes/apollo/layout/partial/copyright.jade","hash":"2e2ee43c7241279a32b8c1386a2dea1409ef0e1c","modified":1526396315000},{"_id":"themes/apollo/layout/partial/comment.jade","hash":"ff0a2c269c2434da2ac5529872f1d6184a71f96d","modified":1526396315000},{"_id":"themes/apollo/layout/partial/layout.jade","hash":"d596c281bbba02cf8837f25f8ac0ac06e3d10e72","modified":1526396315000},{"_id":"themes/apollo/layout/partial/nav.jade","hash":"c35d3061da4b053b73150d9741c542d660798270","modified":1526396315000},{"_id":"themes/apollo/source/scss/apollo.scss","hash":"2f0ecd6ea1fec0aad4097dcb509b5ed5d1badd5c","modified":1526396315000},{"_id":"themes/apollo/layout/partial/scripts.jade","hash":"4c83fec1e2fc5cffefafc2e31835e28122c0fdfd","modified":1526396315000},{"_id":"themes/apollo/source/css/apollo.css","hash":"3769b55e027697d6d163ddf82b664b16c767ba9c","modified":1526396315000},{"_id":"themes/apollo/.git/objects/pack/pack-35ea6b850205f59708ed992c93c7cea2251cc278.idx","hash":"6a8c6fe9f118fb534f32f6c5d4811ef895340eba","modified":1526396315000},{"_id":"themes/apollo/.git/refs/heads/master","hash":"d32e5811a7e998bca04209572d5265585c606fdb","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/base.scss","hash":"88b361e68475caddbab763feed5e1db788ac2cd7","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/copyright.scss","hash":"7fc843c37a4dbf9f6e70770398841a73465ec642","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/footer.scss","hash":"094aca6e52f11b139ac7980ca03fa7b9d8fc7b2f","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/header.scss","hash":"d24cc6520f3faa7bb80610b858a92639eadcc289","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/home-post-list.scss","hash":"92858015b8f3dcb4eb91b6dc41563b7aaa91b376","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/mq.scss","hash":"0b9c7097136ac8e4a07d9702fc4dbe0345ac7596","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/post.scss","hash":"3ba64c410edd07e7bf5e9900d9ad9d76f2ff5828","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/normalize.scss","hash":"fd0b27bed6f103ea95b08f698ea663ff576dbcf1","modified":1526396315000},{"_id":"themes/apollo/.git/logs/refs/heads/master","hash":"ff18dd6e76ec3e861fb0bc3789225625abd19928","modified":1526396315000},{"_id":"themes/apollo/.git/refs/remotes/origin/HEAD","hash":"d9427cda09aba1cdde5c69c2b13c905bddb0bc51","modified":1526396315000},{"_id":"themes/apollo/.git/objects/pack/pack-35ea6b850205f59708ed992c93c7cea2251cc278.pack","hash":"b17d2960aef474cbff89c4c250ecaffff7c4790c","modified":1526396315000},{"_id":"themes/apollo/.git/logs/refs/remotes/origin/HEAD","hash":"ff18dd6e76ec3e861fb0bc3789225625abd19928","modified":1526396315000},{"_id":"public/atom.xml","hash":"a586321e90ce8456a406696b75b6c9bb17404570","modified":1587444952445},{"_id":"public/sitemap.xml","hash":"d316f7e351e88d31b23877fd010cb44b8087c840","modified":1587444952445},{"_id":"public/archives/index.html","hash":"fe7770520a4482f260261ffeff1bbee3299b8a23","modified":1587446402798},{"_id":"public/archives/2020/index.html","hash":"251bc2a11c2e05f962224521db20f4e220573608","modified":1587446402799},{"_id":"public/archives/2020/page/3/index.html","hash":"29030651310410cb57239babf6e003a2fdd6e980","modified":1587446402799},{"_id":"public/archives/page/2/index.html","hash":"9e6b4caccf0e9b14c1328a18fa946a8bfba6f2a3","modified":1587446402799},{"_id":"public/archives/2020/03/index.html","hash":"234393043bcd67e4e8efcc18f8b216277df715b0","modified":1587446402799},{"_id":"public/archives/2020/04/index.html","hash":"eb1fb49123a961d0927bc97b5074b0c9da56841b","modified":1587446402799},{"_id":"public/categories/leetcode/index.html","hash":"5fa307b686bfb8d48b609df293f9c817262352c1","modified":1587446402799},{"_id":"public/categories/leetcode/page/3/index.html","hash":"6ca07e52142b74cfbf2848d2c176b7e8fd0cad15","modified":1587446402799},{"_id":"public/index.html","hash":"5bf276e85ab585ee24e3cd01bf7b29508112d3b3","modified":1587446402800},{"_id":"public/page/2/index.html","hash":"4be6e473c0a3556143362acf12d9c6853ff1d1b7","modified":1587446402800},{"_id":"public/archives/2020/page/2/index.html","hash":"7959aa328aeb2c26a7b067bcab175c7447bc9986","modified":1587446402799},{"_id":"public/archives/2020/03/page/2/index.html","hash":"de542e40de5442276152044a8a79b57e334b6f3f","modified":1587446402799},{"_id":"public/categories/leetcode/page/2/index.html","hash":"7333305ab06f4d1b1a2b2a5402434bd74727c1f6","modified":1587446402799},{"_id":"public/2020/04/16/leetcode-string-to-integer-atoi/index.html","hash":"5aab7acb06a04909d65f2b37791fe020ac6b4b34","modified":1587446402800},{"_id":"public/2020/04/16/leetcode-01-matrix/index.html","hash":"a59789fc1b8e3e63ae66c5fe582eafd3d4bf2cf1","modified":1587446402800},{"_id":"public/2020/04/16/leetcode-merge-intervals/index.html","hash":"fe43c579b065f030836acf7adf640709bc382339","modified":1587446402800},{"_id":"public/2020/04/14/leetcode-design-twitter/index.html","hash":"4b22f200f0d627c187aa57b18192c1cf46bff91c","modified":1587446402800},{"_id":"public/2020/04/14/leetcode-add-two-numbers-ii/index.html","hash":"1cf8ed5b32d2522f46e1dbf33b351ccb2469de70","modified":1587446402800},{"_id":"public/2020/04/01/leetcode-1103/index.html","hash":"9df68a878761dd1c23aee8cff693137fba062b42","modified":1587446402800},{"_id":"public/2020/04/01/leetcode-compress-string-lcci/index.html","hash":"1692319e76fdba90f4a4835d07dd68956f2385d5","modified":1587446402800},{"_id":"public/2020/04/01/leetcode-1160/index.html","hash":"0f1c09bb7ac1e6a4ee43d6d729baa7e14fb75f8b","modified":1587446402800},{"_id":"public/2020/03/30/leetcode-999/index.html","hash":"bfb9f5ef24d32860c804e02028a3ec472a7f5c81","modified":1587446402800},{"_id":"public/2020/03/30/leetcode-1071/index.html","hash":"4dd54070b7ced7e45cee66a81a61d329600ffde5","modified":1587446402800},{"_id":"public/2020/03/26/leetcode-876/index.html","hash":"d08a6ebc25c304fdbb77cf5efbff3e3a9c66639e","modified":1587446402800},{"_id":"public/2020/03/29/leetcode-1013/index.html","hash":"68403102195d2c4b807802fc26419888c65b1cba","modified":1587446402800},{"_id":"public/2020/03/25/leetcode-543/index.html","hash":"b94a9b3f588cc5e11f6551737c753a1e2adf307e","modified":1587446402801},{"_id":"public/2020/03/29/leetcode-914/index.html","hash":"de4191f15d4a12e822c66b6d0196ee83482519a9","modified":1587446402800},{"_id":"public/2020/03/25/leetcode-836/index.html","hash":"66f352798839414ea29c6118f75d5af739c9d182","modified":1587446402800},{"_id":"public/2020/03/25/leetcode-409/index.html","hash":"41d70012826b76c402daba4f6875a9b52e55264e","modified":1587446402800},{"_id":"public/2020/03/17/leetcode-121/index.html","hash":"9c27e8c6c17fa24951b9857e5695c116df14b4d9","modified":1587446402801},{"_id":"public/2020/03/23/leetcode-169/index.html","hash":"ce2379b39051685a8e32a853d788517568dc4d5a","modified":1587446402801},{"_id":"public/2020/03/23/leetcode-225/index.html","hash":"73855dc29fed498d3c597a0e859001a611d3c47e","modified":1587446402801},{"_id":"public/2018/05/31/bash-function-and-awk/index.html","hash":"e8123f624cdce6ac8c87574232f17de4bd545fa3","modified":1587446402801},{"_id":"public/2019/03/12/Postgresql-Partitioning/index.html","hash":"a280187102a2eeeb1ef3a01a1aa51d4472b93622","modified":1587446402801},{"_id":"public/2019/11/14/AWS-KMS/index.html","hash":"ed7730b48b5c308a09e34064dada6c739b168649","modified":1587446402801},{"_id":"public/2016/05/04/Tastypie/index.html","hash":"b2279db518bc33249f19423ac18d92c4e516c9a6","modified":1587446402801},{"_id":"public/2016/04/25/Django-Manager-Method/index.html","hash":"5e97665a188021701f6904c80457a774ab7161dc","modified":1587446402801},{"_id":"public/2016/02/16/Flask-Day-2/index.html","hash":"b190b4056ab4d2b631a753ad4dec89e04e50e295","modified":1587446402801},{"_id":"public/2020/03/18/leetcode-206/index.html","hash":"867d48227994566c3bee90c1ea41bc05d8fd96f5","modified":1587446402801},{"_id":"public/2016/02/12/first-post/index.html","hash":"d9dfb8c5405c1df371cbadc058d7ea37735cf332","modified":1587446402801},{"_id":"public/2016/05/10/TastyPie-Note-1/index.html","hash":"ff6cb06b7bc1b9e4ea87caa9d4fde8e6264e699f","modified":1587446402801},{"_id":"public/archives/page/4/index.html","hash":"17c87e84bdd240a8c3872be7f954b117a6a0a64e","modified":1587446402801},{"_id":"public/archives/2016/04/index.html","hash":"ba5405758fae3205d45faebd9b6f6c29fabc6e0d","modified":1587446402801},{"_id":"public/2016/02/15/Flask-Day-1/index.html","hash":"70e1fe2be44fe1a1a2c47154a4ca14b77140ed5f","modified":1587446402801},{"_id":"public/archives/2016/05/index.html","hash":"9776f37ffc779f836f175a1a3cc7093d08db6d88","modified":1587446402801},{"_id":"public/archives/2018/index.html","hash":"f68186fdf1b5d2d4b17d60830ba45974a2a6edea","modified":1587446402801},{"_id":"public/archives/2018/05/index.html","hash":"f68186fdf1b5d2d4b17d60830ba45974a2a6edea","modified":1587446402802},{"_id":"public/archives/2019/index.html","hash":"b0ed0f0a97d72f877e32ca35f2e04446c31e87a5","modified":1587446402802},{"_id":"public/archives/2019/03/index.html","hash":"dea6c71318d3a5e846399723c08dd85e501cc853","modified":1587446402802},{"_id":"public/archives/2019/11/index.html","hash":"72c2812063a41e908ece68f6fb02693dabedb231","modified":1587446402802},{"_id":"public/page/4/index.html","hash":"3491fdf675901b32b4d7add96bf20afe0689f000","modified":1587446402802},{"_id":"public/2020/04/09/leetcode-the-masseuse-lcci/index.html","hash":"7aaf9401283dea109df78b0e9c15e4e1b019a97d","modified":1587446402802},{"_id":"public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html","hash":"03d56ffca8243eb43b68ca87c589cff370c75644","modified":1587446402802},{"_id":"public/archives/page/3/index.html","hash":"aebf39704d5f24dbc364347ad432a7a7f11f6fc3","modified":1587446402802},{"_id":"public/archives/2016/index.html","hash":"7f01421dc66b6f3e2cdece71a3e5e8220a126d03","modified":1587446402802},{"_id":"public/archives/2016/02/index.html","hash":"cb7d38e6a2726a642c10ec7799e1c8c7fbaa21f8","modified":1587446402802},{"_id":"public/page/3/index.html","hash":"823df38f48cc7ece2d0a3feebad02e0987f54ab2","modified":1587446402802},{"_id":"public/archives/2020/04/page/2/index.html","hash":"e2cabbebde42d90c7a379c2407b494ebe9718a58","modified":1587446402799},{"_id":"public/2020/04/21/leetcode-number-of-islands/index.html","hash":"03ccb0bb82762283b2945bb6d4bce77fa0dcb3b7","modified":1587446402800},{"_id":"public/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","modified":1587444954000},{"_id":"public/scss/apollo.scss","hash":"2f0ecd6ea1fec0aad4097dcb509b5ed5d1badd5c","modified":1587444954000},{"_id":"public/CNAME","hash":"c53a99d8555292c2cc8dd02c564b9d5fdfed89cb","modified":1587444954000},{"_id":"public/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1587444954000},{"_id":"public/css/apollo.css","hash":"3769b55e027697d6d163ddf82b664b16c767ba9c","modified":1587444954045}],"Category":[{"name":"leetcode","_id":"ck99fqk4a0002subunok11hn6"}],"Data":[],"Page":[],"Post":[{"title":"leetcode-121","date":"2020-03-17T10:06:45.000Z","_content":"\n### 121. 买卖股票的最佳时机\n\n[题目](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/)\n\n\n\n原始答案:\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n max_sellout = prices[0]\n l = len(prices)\n i = 0\n for buyin in prices:\n if i == l:\n return profit\n if min_buyin <= buyin:\n max_sellout = max(prices[i:])\n p = max_sellout - min_buyin\n if p > profit:\n profit = p\n if buyin < min_buyin:\n min_buyin = buyin\n i += 1\n return profit\n#1880 ms\t14.4 MB\n```\n\n主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。\n\n仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n for i in range(1, len(prices)):\n min_buyin = min(min_buyin, prices[i-1])\n profit = max(prices[i] - min_buyin, profit)\n return profit\n #44 ms\t14.4 MB\n```\n\n\n","source":"_posts/2020-03-17-leetcode-121.md","raw":"---\ntitle: leetcode-121\ndate: 2020-03-17 18:06:45\ntags:\ncategories: leetcode\n---\n\n### 121. 买卖股票的最佳时机\n\n[题目](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/)\n\n\n\n原始答案:\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n max_sellout = prices[0]\n l = len(prices)\n i = 0\n for buyin in prices:\n if i == l:\n return profit\n if min_buyin <= buyin:\n max_sellout = max(prices[i:])\n p = max_sellout - min_buyin\n if p > profit:\n profit = p\n if buyin < min_buyin:\n min_buyin = buyin\n i += 1\n return profit\n#1880 ms\t14.4 MB\n```\n\n主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。\n\n仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样\n\n```python\nclass Solution:\n def maxProfit(self, prices) -> int:\n profit = 0\n if not prices:\n return profit\n min_buyin = prices[0]\n for i in range(1, len(prices)):\n min_buyin = min(min_buyin, prices[i-1])\n profit = max(prices[i] - min_buyin, profit)\n return profit\n #44 ms\t14.4 MB\n```\n\n\n","slug":"leetcode-121","published":1,"updated":"2020-03-17T10:54:03.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk450000subu0lleqph1","content":"

121. 买卖股票的最佳时机

题目

\n\n

原始答案:

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
max_sellout = prices[0]
l = len(prices)
i = 0
for buyin in prices:
if i == l:
return profit
if min_buyin <= buyin:
max_sellout = max(prices[i:])
p = max_sellout - min_buyin
if p > profit:
profit = p
if buyin < min_buyin:
min_buyin = buyin
i += 1
return profit
#1880 ms\t14.4 MB
\n

主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。

\n

仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
for i in range(1, len(prices)):
min_buyin = min(min_buyin, prices[i-1])
profit = max(prices[i] - min_buyin, profit)
return profit
#44 ms\t14.4 MB
\n","site":{"data":{}},"excerpt":"

121. 买卖股票的最佳时机

题目

","more":"

原始答案:

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
max_sellout = prices[0]
l = len(prices)
i = 0
for buyin in prices:
if i == l:
return profit
if min_buyin <= buyin:
max_sellout = max(prices[i:])
p = max_sellout - min_buyin
if p > profit:
profit = p
if buyin < min_buyin:
min_buyin = buyin
i += 1
return profit
#1880 ms\t14.4 MB
\n

主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。

\n

仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
for i in range(1, len(prices)):
min_buyin = min(min_buyin, prices[i-1])
profit = max(prices[i] - min_buyin, profit)
return profit
#44 ms\t14.4 MB
"},{"title":"bash function and awk","date":"2018-05-30T16:00:48.000Z","_content":"\n\n\nI'll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let's see what these functions can do to help me improve my productivity.\n\n\n\n#### bash functions\n\nBash functions are scripts like `alias`, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as `&&` I guess:\n\n```bash\nfunction run {\n source ~/Develop/django/bin/activate\n ./manage.py runserver\n}\n```\n\nI activate django virtural enviroment first and then run django serve.\n\nFunctions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:\n\n```bash\nfunction ba { hgba | grep \"$1\" }\n# hgba is an alias for hg branches\n```\n\nI can just type `ba release` then get current release branch info.\n\n-----\n\nAppend:\n\nI made some updates to the `ba` function and make it auto copying the branch result to my clipboard:\n\n```bash\n\nfunction ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }\n```\n\n\n\n#### awk\n\n`awk` is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. \n\n\n","source":"_posts/2018-05-31-bash-function-and-awk.md","raw":"---\ntitle: bash function and awk\ndate: 2018-05-31 00:00:48\ntags:\n---\n\n\n\nI'll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let's see what these functions can do to help me improve my productivity.\n\n\n\n#### bash functions\n\nBash functions are scripts like `alias`, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as `&&` I guess:\n\n```bash\nfunction run {\n source ~/Develop/django/bin/activate\n ./manage.py runserver\n}\n```\n\nI activate django virtural enviroment first and then run django serve.\n\nFunctions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:\n\n```bash\nfunction ba { hgba | grep \"$1\" }\n# hgba is an alias for hg branches\n```\n\nI can just type `ba release` then get current release branch info.\n\n-----\n\nAppend:\n\nI made some updates to the `ba` function and make it auto copying the branch result to my clipboard:\n\n```bash\n\nfunction ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }\n```\n\n\n\n#### awk\n\n`awk` is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. \n\n\n","slug":"bash-function-and-awk","published":1,"updated":"2019-11-14T08:01:50.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk490001sububwxed4yb","content":"

I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

\n

bash functions

Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

\n
1
2
3
4
function run {
source ~/Develop/django/bin/activate
./manage.py runserver
}
\n

I activate django virtural enviroment first and then run django serve.

\n

Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

\n
1
2
function ba { hgba | grep \"$1\" }
# hgba is an alias for hg branches
\n

I can just type ba release then get current release branch info.

\n
\n

Append:

\n

I made some updates to the ba function and make it auto copying the branch result to my clipboard:

\n
1
2

function ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }
\n

awk

awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

\n","site":{"data":{}},"excerpt":"","more":"

I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

\n

bash functions

Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

\n
1
2
3
4
function run {
source ~/Develop/django/bin/activate
./manage.py runserver
}
\n

I activate django virtural enviroment first and then run django serve.

\n

Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

\n
1
2
function ba { hgba | grep \"$1\" }
# hgba is an alias for hg branches
\n

I can just type ba release then get current release branch info.

\n
\n

Append:

\n

I made some updates to the ba function and make it auto copying the branch result to my clipboard:

\n
1
2

function ba { var=\"$(hgba | grep $1)\" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\\n' | pbcopy && echo $var }
\n

awk

awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

\n"},{"title":"AWS KMS","date":"2019-11-14T07:19:05.000Z","_content":"\nWe used to keep private credentials on production servers without any protection or encryption. Well, luckily we don't have any leak but this practice is not recommended for both security and easy of use reasons.\n\nSince AWS finally provides [KMS(Key Management Service)][1] in our local region, we try to encrypt every private credentials by KMS and store them on S3.\n\n*TBD*\n\n\n[1]: https://www.amazonaws.cn/kms/","source":"_posts/2019-11-14-AWS-KMS.md","raw":"---\ntitle: AWS KMS\ndate: 2019-11-14 15:19:05\ntags:\n---\n\nWe used to keep private credentials on production servers without any protection or encryption. Well, luckily we don't have any leak but this practice is not recommended for both security and easy of use reasons.\n\nSince AWS finally provides [KMS(Key Management Service)][1] in our local region, we try to encrypt every private credentials by KMS and store them on S3.\n\n*TBD*\n\n\n[1]: https://www.amazonaws.cn/kms/","slug":"AWS-KMS","published":1,"updated":"2019-11-14T08:03:24.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4b0003subucvx7m2kw","content":"

We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

\n

Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

\n

TBD

\n","site":{"data":{}},"excerpt":"","more":"

We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

\n

Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

\n

TBD

\n"},{"title":"leetcode-206","date":"2020-03-18T15:33:03.000Z","_content":"\n### 206. 反转链表\n\n[题目](https://leetcode-cn.com/problems/reverse-linked-list/)\n\n\n\n最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n nl = []\n while head.next:\n nl.append(head)\n head = head.next\n nl.append(head)\n l = len(nl)\n for x in range(l):\n if x == 0:\n nl[x].next = None\n continue\n nl[x].next = nl[x-1]\n if x == (l - 1):\n return nl[x]\n```\n\n仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n prev_node = None\n next_node = head.next\n while head:\n next_node = head.next\n head.next = prev_node\n prev_node = head\n head = next_node\n return prev_node\n```\n\n然后是递归的做法,主要思路是一直进到最深一层--也就是链表的最后一个--的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head:\n return head\n if head.next:\n ss = Solution()\n last = ss.reverseList(head.next)\n head.next.next = head\n head.next = None\n return last\n return head\n```\n\n一开始是用list来打草稿,不过想明白递归之后就大同小异了:\n\n```python\ndef a(l:list)->list:\n k=[l[0]]\n\n if l[1:]:\n b=a(l[1:])\n b.extend(k)\n else:\n return [l[0]]\n return b\n```\n\n\n","source":"_posts/2020-03-18-leetcode-206.md","raw":"---\ntitle: leetcode-206\ndate: 2020-03-18 23:33:03\ntags:\ncategories: leetcode\n---\n\n### 206. 反转链表\n\n[题目](https://leetcode-cn.com/problems/reverse-linked-list/)\n\n\n\n最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n nl = []\n while head.next:\n nl.append(head)\n head = head.next\n nl.append(head)\n l = len(nl)\n for x in range(l):\n if x == 0:\n nl[x].next = None\n continue\n nl[x].next = nl[x-1]\n if x == (l - 1):\n return nl[x]\n```\n\n仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head or not head.next:\n return head\n prev_node = None\n next_node = head.next\n while head:\n next_node = head.next\n head.next = prev_node\n prev_node = head\n head = next_node\n return prev_node\n```\n\n然后是递归的做法,主要思路是一直进到最深一层--也就是链表的最后一个--的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。\n\n```python\nclass Solution:\n def reverseList(self, head):\n if not head:\n return head\n if head.next:\n ss = Solution()\n last = ss.reverseList(head.next)\n head.next.next = head\n head.next = None\n return last\n return head\n```\n\n一开始是用list来打草稿,不过想明白递归之后就大同小异了:\n\n```python\ndef a(l:list)->list:\n k=[l[0]]\n\n if l[1:]:\n b=a(l[1:])\n b.extend(k)\n else:\n return [l[0]]\n return b\n```\n\n\n","slug":"leetcode-206","published":1,"updated":"2020-03-18T15:44:12.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4c0004subueeqgf7uv","content":"

206. 反转链表

题目

\n\n

最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
nl = []
while head.next:
nl.append(head)
head = head.next
nl.append(head)
l = len(nl)
for x in range(l):
if x == 0:
nl[x].next = None
continue
nl[x].next = nl[x-1]
if x == (l - 1):
return nl[x]
\n

仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
prev_node = None
next_node = head.next
while head:
next_node = head.next
head.next = prev_node
prev_node = head
head = next_node
return prev_node
\n

然后是递归的做法,主要思路是一直进到最深一层–也就是链表的最后一个–的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def reverseList(self, head):
if not head:
return head
if head.next:
ss = Solution()
last = ss.reverseList(head.next)
head.next.next = head
head.next = None
return last
return head
\n

一开始是用list来打草稿,不过想明白递归之后就大同小异了:

\n
1
2
3
4
5
6
7
8
9
def a(l:list)->list:
k=[l[0]]

if l[1:]:
b=a(l[1:])
b.extend(k)
else:
return [l[0]]
return b
\n","site":{"data":{}},"excerpt":"

206. 反转链表

题目

","more":"

最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
nl = []
while head.next:
nl.append(head)
head = head.next
nl.append(head)
l = len(nl)
for x in range(l):
if x == 0:
nl[x].next = None
continue
nl[x].next = nl[x-1]
if x == (l - 1):
return nl[x]
\n

仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
prev_node = None
next_node = head.next
while head:
next_node = head.next
head.next = prev_node
prev_node = head
head = next_node
return prev_node
\n

然后是递归的做法,主要思路是一直进到最深一层–也就是链表的最后一个–的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def reverseList(self, head):
if not head:
return head
if head.next:
ss = Solution()
last = ss.reverseList(head.next)
head.next.next = head
head.next = None
return last
return head
\n

一开始是用list来打草稿,不过想明白递归之后就大同小异了:

\n
1
2
3
4
5
6
7
8
9
def a(l:list)->list:
k=[l[0]]

if l[1:]:
b=a(l[1:])
b.extend(k)
else:
return [l[0]]
return b
"},{"title":"leetcode-225","date":"2020-03-23T15:35:05.000Z","_content":"\n### 225. 用队列实现栈\n\n[题目](https://leetcode-cn.com/problems/implement-stack-using-queues/)\n\n\n\n\n\n\n\n注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。\n\n```python\nclass MyStack:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.data = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n Push element x onto stack.\n \"\"\"\n self.data.append(x)\n return\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element on top of the stack and returns that element.\n \"\"\"\n return self.data.pop(-1)\n\n\n def top(self) -> int:\n \"\"\"\n Get the top element.\n \"\"\"\n return self.data[-1]\n\n\n def empty(self) -> bool:\n \"\"\"\n Returns whether the stack is empty.\n \"\"\"\n return not bool(self.data)\n\n\n\n# Your MyStack object will be instantiated and called as such:\n# obj = MyStack()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.top()\n# param_4 = obj.empty()\n\n#24 ms\t13.5 MB\n```\n\n","source":"_posts/2020-03-23-leetcode-225.md","raw":"---\ntitle: leetcode-225\ndate: 2020-03-23 23:35:05\ntags:\ncategories: leetcode\n---\n\n### 225. 用队列实现栈\n\n[题目](https://leetcode-cn.com/problems/implement-stack-using-queues/)\n\n\n\n\n\n\n\n注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。\n\n```python\nclass MyStack:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.data = []\n\n\n def push(self, x: int) -> None:\n \"\"\"\n Push element x onto stack.\n \"\"\"\n self.data.append(x)\n return\n\n\n def pop(self) -> int:\n \"\"\"\n Removes the element on top of the stack and returns that element.\n \"\"\"\n return self.data.pop(-1)\n\n\n def top(self) -> int:\n \"\"\"\n Get the top element.\n \"\"\"\n return self.data[-1]\n\n\n def empty(self) -> bool:\n \"\"\"\n Returns whether the stack is empty.\n \"\"\"\n return not bool(self.data)\n\n\n\n# Your MyStack object will be instantiated and called as such:\n# obj = MyStack()\n# obj.push(x)\n# param_2 = obj.pop()\n# param_3 = obj.top()\n# param_4 = obj.empty()\n\n#24 ms\t13.5 MB\n```\n\n","slug":"leetcode-225","published":1,"updated":"2020-03-23T15:35:24.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4d0005subutkoz8ewr","content":"

225. 用队列实现栈

题目

\n\n

注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class MyStack:

def __init__(self):
\"\"\"
Initialize your data structure here.
\"\"\"
self.data = []


def push(self, x: int) -> None:
\"\"\"
Push element x onto stack.
\"\"\"
self.data.append(x)
return


def pop(self) -> int:
\"\"\"
Removes the element on top of the stack and returns that element.
\"\"\"
return self.data.pop(-1)


def top(self) -> int:
\"\"\"
Get the top element.
\"\"\"
return self.data[-1]


def empty(self) -> bool:
\"\"\"
Returns whether the stack is empty.
\"\"\"
return not bool(self.data)



# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

#24 ms\t13.5 MB
\n","site":{"data":{}},"excerpt":"

225. 用队列实现栈

题目

","more":"

注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class MyStack:

def __init__(self):
\"\"\"
Initialize your data structure here.
\"\"\"
self.data = []


def push(self, x: int) -> None:
\"\"\"
Push element x onto stack.
\"\"\"
self.data.append(x)
return


def pop(self) -> int:
\"\"\"
Removes the element on top of the stack and returns that element.
\"\"\"
return self.data.pop(-1)


def top(self) -> int:
\"\"\"
Get the top element.
\"\"\"
return self.data[-1]


def empty(self) -> bool:
\"\"\"
Returns whether the stack is empty.
\"\"\"
return not bool(self.data)



# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

#24 ms\t13.5 MB
"},{"title":"leetcode-169","date":"2020-03-23T15:12:57.000Z","_content":"\n\n### 169. 多数元素\n\n[题目](https://leetcode-cn.com/problems/majority-element/)\n\n\n\n\n\n\n\n一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。\n\n```python\nclass Solution:\n def majorityElement(self, nums) -> int:\n d = {}\n l = len(nums)\n for n in nums:\n if not n in d:\n d[n] = 0\n d[n] = d[n] + 1\n if d[n] > l/2:\n return n\n# 64 ms\t15.1 MB\n```\n\nPython 也有专门计数的库,写起来更简单一点:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n counts = collections.Counter(nums)\n return max(counts.keys(), key=counts.get)\n# 44 ms\t15.1 MB\n```\n\n由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下[蒙特卡罗算法](https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95),后来在官方解答中也看到类似的思路了:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n majority_count = len(nums)//2\n while True:\n candidate = random.choice(nums)\n if sum(1 for elem in nums if elem == candidate) > majority_count:\n return candidate\n\n#作者:LeetCode-Solution\n#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/\n#来源:力扣(LeetCode)\n#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","source":"_posts/2020-03-23-leetcode-169.md","raw":"---\ntitle: leetcode-169\ndate: 2020-03-23 23:12:57\ntags:\ncategories: leetcode\n---\n\n\n### 169. 多数元素\n\n[题目](https://leetcode-cn.com/problems/majority-element/)\n\n\n\n\n\n\n\n一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。\n\n```python\nclass Solution:\n def majorityElement(self, nums) -> int:\n d = {}\n l = len(nums)\n for n in nums:\n if not n in d:\n d[n] = 0\n d[n] = d[n] + 1\n if d[n] > l/2:\n return n\n# 64 ms\t15.1 MB\n```\n\nPython 也有专门计数的库,写起来更简单一点:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n counts = collections.Counter(nums)\n return max(counts.keys(), key=counts.get)\n# 44 ms\t15.1 MB\n```\n\n由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下[蒙特卡罗算法](https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95),后来在官方解答中也看到类似的思路了:\n\n```python\nclass Solution:\n def majorityElement(self, nums):\n majority_count = len(nums)//2\n while True:\n candidate = random.choice(nums)\n if sum(1 for elem in nums if elem == candidate) > majority_count:\n return candidate\n\n#作者:LeetCode-Solution\n#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/\n#来源:力扣(LeetCode)\n#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","slug":"leetcode-169","published":1,"updated":"2020-03-23T15:13:49.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4e0006subugxejhq3n","content":"

169. 多数元素

题目

\n\n

一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def majorityElement(self, nums) -> int:
d = {}
l = len(nums)
for n in nums:
if not n in d:
d[n] = 0
d[n] = d[n] + 1
if d[n] > l/2:
return n
# 64 ms\t15.1 MB
\n

Python 也有专门计数的库,写起来更简单一点:

\n
1
2
3
4
5
class Solution:
def majorityElement(self, nums):
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
# 44 ms\t15.1 MB
\n

由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下蒙特卡罗算法,后来在官方解答中也看到类似的思路了:

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def majorityElement(self, nums):
majority_count = len(nums)//2
while True:
candidate = random.choice(nums)
if sum(1 for elem in nums if elem == candidate) > majority_count:
return candidate

#作者:LeetCode-Solution
#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/
#来源:力扣(LeetCode)
#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n","site":{"data":{}},"excerpt":"

169. 多数元素

题目

","more":"

一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\\cfrac{n}{2}$ 时就可以得出结果。

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def majorityElement(self, nums) -> int:
d = {}
l = len(nums)
for n in nums:
if not n in d:
d[n] = 0
d[n] = d[n] + 1
if d[n] > l/2:
return n
# 64 ms\t15.1 MB
\n

Python 也有专门计数的库,写起来更简单一点:

\n
1
2
3
4
5
class Solution:
def majorityElement(self, nums):
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
# 44 ms\t15.1 MB
\n

由于要找的数出现次数大于 $\\cfrac{n}{2}$,脑子里掠过一下蒙特卡罗算法,后来在官方解答中也看到类似的思路了:

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def majorityElement(self, nums):
majority_count = len(nums)//2
while True:
candidate = random.choice(nums)
if sum(1 for elem in nums if elem == candidate) > majority_count:
return candidate

#作者:LeetCode-Solution
#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/
#来源:力扣(LeetCode)
#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"},{"title":"leetcode-409","date":"2020-03-25T13:55:38.000Z","_content":"\n### 409. 最长回文串\n\n[题目](https://leetcode-cn.com/problems/longest-palindrome/)\n\n\n\n\n\n\n\n\n\n一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。\n\n这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。\n\n\n\n```python\nclass Solution:\n def longestPalindrome(self, s: str) -> int:\n d = {}\n for l in s:\n if not l in d:\n d[l] = 0\n d[l] += 1\n\n i = 0\n odd = False\n for k, v in d.items():\n if v % 2:\n i += (v-1)\n odd = True\n else:\n i += v\n if odd:\n i += 1\n return i\n\n#40 ms\t13.6 MB\n```\n\n","source":"_posts/2020-03-25-leetcode-409.md","raw":"---\ntitle: leetcode-409\ndate: 2020-03-25 21:55:38\ntags:\ncategories: leetcode\n---\n\n### 409. 最长回文串\n\n[题目](https://leetcode-cn.com/problems/longest-palindrome/)\n\n\n\n\n\n\n\n\n\n一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。\n\n这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。\n\n\n\n```python\nclass Solution:\n def longestPalindrome(self, s: str) -> int:\n d = {}\n for l in s:\n if not l in d:\n d[l] = 0\n d[l] += 1\n\n i = 0\n odd = False\n for k, v in d.items():\n if v % 2:\n i += (v-1)\n odd = True\n else:\n i += v\n if odd:\n i += 1\n return i\n\n#40 ms\t13.6 MB\n```\n\n","slug":"leetcode-409","published":1,"updated":"2020-03-25T13:55:54.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4f0007subugdeybnq7","content":"

409. 最长回文串

题目

\n\n

一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。

\n

这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def longestPalindrome(self, s: str) -> int:
d = {}
for l in s:
if not l in d:
d[l] = 0
d[l] += 1

i = 0
odd = False
for k, v in d.items():
if v % 2:
i += (v-1)
odd = True
else:
i += v
if odd:
i += 1
return i

#40 ms\t13.6 MB
\n","site":{"data":{}},"excerpt":"

409. 最长回文串

题目

","more":"

一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。

\n

这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def longestPalindrome(self, s: str) -> int:
d = {}
for l in s:
if not l in d:
d[l] = 0
d[l] += 1

i = 0
odd = False
for k, v in d.items():
if v % 2:
i += (v-1)
odd = True
else:
i += v
if odd:
i += 1
return i

#40 ms\t13.6 MB
"},{"title":"leetcode-543","date":"2020-03-25T11:13:52.000Z","_content":"\n### 543. 二叉树的直径\n\n\n[题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/)\n\n\n\n\n\n\n这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。\n\n```python\n# Definition for a binary tree node.\nclass TreeNode:\n def __init__(self, x):\n self.val = x\n self.left = None\n self.right = None\n\nclass Solution:\n def diameterOfBinaryTree(self, root: TreeNode) -> int:\n if not root:\n return 0\n last_node = -1\n routes = []\n start = root\n node_stack = [root]\n while (start.left or start.right or node_stack):\n if start != node_stack[-1]:\n node_stack.append(start)\n\n if last_node == start.right:\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n continue\n\n if start.left and last_node != start.left:\n start = start.left\n last_node = start\n continue\n\n if start.right:\n start = start.right\n last_node = start\n continue\n\n routes.append(node_stack)\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n\n max_l = 0\n for route in routes:\n for route_ in routes:\n intersection = 0\n if route != route_:\n intersection = len(set(route).intersection(set(route_)))\n if intersection:\n intersection -= 1\n max_l = max(max_l, len(set(route)| set(route_)) - intersection)\n return max_l - 1\n```\n\n\n\nL43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。\n\n\n\n其实以某个点为根节点的树的直径,就是某个节点的**左子树的深度和右子树的深度的和**,用递归来处理这个会比较容易理解\n\n\n\n```python\nclass Solution(object):\n def diameterOfBinaryTree(self, root):\n self.ans = 1\n def depth(node):\n # 访问到空节点了,返回0\n if not node: return 0\n # 左儿子为根的子树的深度\n L = depth(node.left)\n # 右儿子为根的子树的深度\n R = depth(node.right)\n # 计算d_node即L+R+1 并更新ans\n self.ans = max(self.ans, L+R+1)\n # 返回该节点为根的子树的深度\n return max(L, R) + 1\n\n depth(root)\n return self.ans - 1\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","source":"_posts/2020-03-25-leetcode-543.md","raw":"---\ntitle: leetcode-543\ndate: 2020-03-25 19:13:52\ntags:\ncategories: leetcode\n---\n\n### 543. 二叉树的直径\n\n\n[题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/)\n\n\n\n\n\n\n这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。\n\n```python\n# Definition for a binary tree node.\nclass TreeNode:\n def __init__(self, x):\n self.val = x\n self.left = None\n self.right = None\n\nclass Solution:\n def diameterOfBinaryTree(self, root: TreeNode) -> int:\n if not root:\n return 0\n last_node = -1\n routes = []\n start = root\n node_stack = [root]\n while (start.left or start.right or node_stack):\n if start != node_stack[-1]:\n node_stack.append(start)\n\n if last_node == start.right:\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n continue\n\n if start.left and last_node != start.left:\n start = start.left\n last_node = start\n continue\n\n if start.right:\n start = start.right\n last_node = start\n continue\n\n routes.append(node_stack)\n node_stack = node_stack[:-1]\n if not node_stack:\n break\n last_node = start\n start = node_stack[-1]\n\n max_l = 0\n for route in routes:\n for route_ in routes:\n intersection = 0\n if route != route_:\n intersection = len(set(route).intersection(set(route_)))\n if intersection:\n intersection -= 1\n max_l = max(max_l, len(set(route)| set(route_)) - intersection)\n return max_l - 1\n```\n\n\n\nL43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。\n\n\n\n其实以某个点为根节点的树的直径,就是某个节点的**左子树的深度和右子树的深度的和**,用递归来处理这个会比较容易理解\n\n\n\n```python\nclass Solution(object):\n def diameterOfBinaryTree(self, root):\n self.ans = 1\n def depth(node):\n # 访问到空节点了,返回0\n if not node: return 0\n # 左儿子为根的子树的深度\n L = depth(node.left)\n # 右儿子为根的子树的深度\n R = depth(node.right)\n # 计算d_node即L+R+1 并更新ans\n self.ans = max(self.ans, L+R+1)\n # 返回该节点为根的子树的深度\n return max(L, R) + 1\n\n depth(root)\n return self.ans - 1\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n","slug":"leetcode-543","published":1,"updated":"2020-04-14T15:29:53.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4g0009subu00ew2ar1","content":"

543. 二叉树的直径

题目

\n\n

这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None

class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
if not root:
return 0
last_node = -1
routes = []
start = root
node_stack = [root]
while (start.left or start.right or node_stack):
if start != node_stack[-1]:
node_stack.append(start)

if last_node == start.right:
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]
continue

if start.left and last_node != start.left:
start = start.left
last_node = start
continue

if start.right:
start = start.right
last_node = start
continue

routes.append(node_stack)
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]

max_l = 0
for route in routes:
for route_ in routes:
intersection = 0
if route != route_:
intersection = len(set(route).intersection(set(route_)))
if intersection:
intersection -= 1
max_l = max(max_l, len(set(route)| set(route_)) - intersection)
return max_l - 1
\n

L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。

\n

其实以某个点为根节点的树的直径,就是某个节点的左子树的深度和右子树的深度的和,用递归来处理这个会比较容易理解

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def diameterOfBinaryTree(self, root):
self.ans = 1
def depth(node):
# 访问到空节点了,返回0
if not node: return 0
# 左儿子为根的子树的深度
L = depth(node.left)
# 右儿子为根的子树的深度
R = depth(node.right)
# 计算d_node即L+R+1 并更新ans
self.ans = max(self.ans, L+R+1)
# 返回该节点为根的子树的深度
return max(L, R) + 1

depth(root)
return self.ans - 1

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n","site":{"data":{}},"excerpt":"

543. 二叉树的直径

题目

","more":"

这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None

class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
if not root:
return 0
last_node = -1
routes = []
start = root
node_stack = [root]
while (start.left or start.right or node_stack):
if start != node_stack[-1]:
node_stack.append(start)

if last_node == start.right:
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]
continue

if start.left and last_node != start.left:
start = start.left
last_node = start
continue

if start.right:
start = start.right
last_node = start
continue

routes.append(node_stack)
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]

max_l = 0
for route in routes:
for route_ in routes:
intersection = 0
if route != route_:
intersection = len(set(route).intersection(set(route_)))
if intersection:
intersection -= 1
max_l = max(max_l, len(set(route)| set(route_)) - intersection)
return max_l - 1
\n

L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。

\n

其实以某个点为根节点的树的直径,就是某个节点的左子树的深度和右子树的深度的和,用递归来处理这个会比较容易理解

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def diameterOfBinaryTree(self, root):
self.ans = 1
def depth(node):
# 访问到空节点了,返回0
if not node: return 0
# 左儿子为根的子树的深度
L = depth(node.left)
# 右儿子为根的子树的深度
R = depth(node.right)
# 计算d_node即L+R+1 并更新ans
self.ans = max(self.ans, L+R+1)
# 返回该节点为根的子树的深度
return max(L, R) + 1

depth(root)
return self.ans - 1

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"},{"title":"leetcode-836","date":"2020-03-25T14:41:25.000Z","_content":"\n### 836. 矩形重叠\n\n[题目](https://leetcode-cn.com/problems/rectangle-overlap/)\n\n\n\n\n\n\n\n看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。\n\n\n\n```python\nclass Solution:\n def isRectangleOverlap(self, rec1, rec2) -> bool:\n return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))\n and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))\n\ns = Solution()\ns.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])\n\n#40 ms\t13.7 MB\n```\n\n","source":"_posts/2020-03-25-leetcode-836.md","raw":"---\ntitle: leetcode-836\ndate: 2020-03-25 22:41:25\ntags:\ncategories: leetcode\n---\n\n### 836. 矩形重叠\n\n[题目](https://leetcode-cn.com/problems/rectangle-overlap/)\n\n\n\n\n\n\n\n看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。\n\n\n\n```python\nclass Solution:\n def isRectangleOverlap(self, rec1, rec2) -> bool:\n return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))\n and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))\n\ns = Solution()\ns.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])\n\n#40 ms\t13.7 MB\n```\n\n","slug":"leetcode-836","published":1,"updated":"2020-03-25T14:41:44.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4h000bsubu68ng98xy","content":"

836. 矩形重叠

题目

\n\n

看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。

\n
1
2
3
4
5
6
7
8
9
class Solution:
def isRectangleOverlap(self, rec1, rec2) -> bool:
return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))
and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))

s = Solution()
s.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])

#40 ms\t13.7 MB
\n","site":{"data":{}},"excerpt":"

836. 矩形重叠

题目

","more":"

看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。

\n
1
2
3
4
5
6
7
8
9
class Solution:
def isRectangleOverlap(self, rec1, rec2) -> bool:
return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))
and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))

s = Solution()
s.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])

#40 ms\t13.7 MB
"},{"title":"leetcode-1013","date":"2020-03-29T13:09:22.000Z","_content":"\n### 1013. 将数组分成和相等的三个部分\n\n[题目](https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/)\n\n\n\n\n\n\n\n因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。\n\n\n\n```python\nclass Solution:\n def canThreePartsEqualSum(self, A) -> bool:\n if not A:\n return False\n sa = sum(A)\n if sa % 3:\n return False\n s = sa // 3\n s1 = 0\n s2 = 0\n\n\n for i in range(len(A)):\n s1 += A[i]\n if s1 == s and (i+1) < len(A):\n for j in range(len(A[i+1:])):\n s2 += A[i+1+j]\n if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:\n return True\n return False\n#60 ms\t18.7 MB\n```\n\n","source":"_posts/2020-03-29-leetcode-1013.md","raw":"---\ntitle: leetcode-1013\ndate: 2020-03-29 21:09:22\ntags:\ncategories: leetcode\n---\n\n### 1013. 将数组分成和相等的三个部分\n\n[题目](https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/)\n\n\n\n\n\n\n\n因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。\n\n\n\n```python\nclass Solution:\n def canThreePartsEqualSum(self, A) -> bool:\n if not A:\n return False\n sa = sum(A)\n if sa % 3:\n return False\n s = sa // 3\n s1 = 0\n s2 = 0\n\n\n for i in range(len(A)):\n s1 += A[i]\n if s1 == s and (i+1) < len(A):\n for j in range(len(A[i+1:])):\n s2 += A[i+1+j]\n if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:\n return True\n return False\n#60 ms\t18.7 MB\n```\n\n","slug":"leetcode-1013","published":1,"updated":"2020-03-29T13:15:11.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4i000dsubujxdgfcfh","content":"

1013. 将数组分成和相等的三个部分

题目

\n\n

因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def canThreePartsEqualSum(self, A) -> bool:
if not A:
return False
sa = sum(A)
if sa % 3:
return False
s = sa // 3
s1 = 0
s2 = 0


for i in range(len(A)):
s1 += A[i]
if s1 == s and (i+1) < len(A):
for j in range(len(A[i+1:])):
s2 += A[i+1+j]
if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:
return True
return False
#60 ms\t18.7 MB
\n","site":{"data":{}},"excerpt":"

1013. 将数组分成和相等的三个部分

题目

","more":"

因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def canThreePartsEqualSum(self, A) -> bool:
if not A:
return False
sa = sum(A)
if sa % 3:
return False
s = sa // 3
s1 = 0
s2 = 0


for i in range(len(A)):
s1 += A[i]
if s1 == s and (i+1) < len(A):
for j in range(len(A[i+1:])):
s2 += A[i+1+j]
if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:
return True
return False
#60 ms\t18.7 MB
"},{"title":"leetcode-876","date":"2020-03-26T13:18:41.000Z","_content":"\n### 876. 链表的中间结点\n\n\n\n[题目](https://leetcode-cn.com/problems/middle-of-the-linked-list/)\n\n\n\n\n\n\n\n思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。\n\n\n\n```python\n# Definition for singly-linked list.\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n l = []\n n = head\n while n.next:\n l.append(n)\n n = n.next\n l.append(n)\n return l[len(l)//2]\n\n #44 ms\t13.7 MB\n```\n\n\n\n看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。\n\n\n\n```python\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n return slow\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n\n\n","source":"_posts/2020-03-26-leetcode-876.md","raw":"---\ntitle: leetcode-876\ndate: 2020-03-26 21:18:41\ntags:\ncategories: leetcode\n---\n\n### 876. 链表的中间结点\n\n\n\n[题目](https://leetcode-cn.com/problems/middle-of-the-linked-list/)\n\n\n\n\n\n\n\n思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。\n\n\n\n```python\n# Definition for singly-linked list.\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n l = []\n n = head\n while n.next:\n l.append(n)\n n = n.next\n l.append(n)\n return l[len(l)//2]\n\n #44 ms\t13.7 MB\n```\n\n\n\n看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。\n\n\n\n```python\nclass Solution:\n def middleNode(self, head: ListNode) -> ListNode:\n slow = fast = head\n while fast and fast.next:\n slow = slow.next\n fast = fast.next.next\n return slow\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n\n\n\n","slug":"leetcode-876","published":1,"updated":"2020-03-26T13:19:10.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4m000fsubu530zs4nj","content":"

876. 链表的中间结点

题目

\n\n

思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def middleNode(self, head: ListNode) -> ListNode:
l = []
n = head
while n.next:
l.append(n)
n = n.next
l.append(n)
return l[len(l)//2]

#44 ms\t13.7 MB
\n

看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n","site":{"data":{}},"excerpt":"

876. 链表的中间结点

题目

","more":"

思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def middleNode(self, head: ListNode) -> ListNode:
l = []
n = head
while n.next:
l.append(n)
n = n.next
l.append(n)
return l[len(l)//2]

#44 ms\t13.7 MB
\n

看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。

\n
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
"},{"title":"leetcode-914","date":"2020-03-29T14:41:09.000Z","_content":"\n### 914. 卡牌分组\n\n[题目](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/)\n\n\n\n\n\n\n\n将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。\n\n\n\n```python\nclass Solution:\n def hasGroupsSizeX(self, deck) -> bool:\n dc = {}\n max_d = 0\n for d in deck:\n if d not in dc:\n dc[d] = 0\n dc[d] += 1\n if max_d < d:\n max_d = d\n if max_d < dc[d]:\n max_d = dc[d]\n has_x = True\n if max_d == 1:\n max_d = 2\n\n for i in range(2, max_d + 1):\n has_x = True\n for k,v in dc.items():\n if v % i:\n has_x = False\n break\n if has_x and i >= 2:\n return True\n return False\n\n#56 ms\t13.8 MB\n```\n\n","source":"_posts/2020-03-29-leetcode-914.md","raw":"---\ntitle: leetcode-914\ndate: 2020-03-29 22:41:09\ntags:\ncategories: leetcode\n---\n\n### 914. 卡牌分组\n\n[题目](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/)\n\n\n\n\n\n\n\n将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。\n\n\n\n```python\nclass Solution:\n def hasGroupsSizeX(self, deck) -> bool:\n dc = {}\n max_d = 0\n for d in deck:\n if d not in dc:\n dc[d] = 0\n dc[d] += 1\n if max_d < d:\n max_d = d\n if max_d < dc[d]:\n max_d = dc[d]\n has_x = True\n if max_d == 1:\n max_d = 2\n\n for i in range(2, max_d + 1):\n has_x = True\n for k,v in dc.items():\n if v % i:\n has_x = False\n break\n if has_x and i >= 2:\n return True\n return False\n\n#56 ms\t13.8 MB\n```\n\n","slug":"leetcode-914","published":1,"updated":"2020-03-29T14:52:07.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4n000hsubu5guv78od","content":"

914. 卡牌分组

题目

\n\n

将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution:
def hasGroupsSizeX(self, deck) -> bool:
dc = {}
max_d = 0
for d in deck:
if d not in dc:
dc[d] = 0
dc[d] += 1
if max_d < d:
max_d = d
if max_d < dc[d]:
max_d = dc[d]
has_x = True
if max_d == 1:
max_d = 2

for i in range(2, max_d + 1):
has_x = True
for k,v in dc.items():
if v % i:
has_x = False
break
if has_x and i >= 2:
return True
return False

#56 ms\t13.8 MB
\n","site":{"data":{}},"excerpt":"

914. 卡牌分组

题目

","more":"

将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution:
def hasGroupsSizeX(self, deck) -> bool:
dc = {}
max_d = 0
for d in deck:
if d not in dc:
dc[d] = 0
dc[d] += 1
if max_d < d:
max_d = d
if max_d < dc[d]:
max_d = dc[d]
has_x = True
if max_d == 1:
max_d = 2

for i in range(2, max_d + 1):
has_x = True
for k,v in dc.items():
if v % i:
has_x = False
break
if has_x and i >= 2:
return True
return False

#56 ms\t13.8 MB
"},{"title":"leetcode-1071","date":"2020-03-30T14:03:01.000Z","_content":"\n### 1071. 字符串的最大公因子\n\n[题目](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/)\n\n\n\n\n\n\n\n如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。\n\n\n\n```python\nclass Solution:\n def gcdOfStrings(self, str1: str, str2: str) -> str:\n if str1[0] != str2[0]:\n return ''\n\n a = len(str1)\n b = len(str2)\n print(a, b)\n if a < b:\n str1, str2 = str2, str1\n a = len(str1)\n b = len(str2)\n\n if not a%b:\n for x in range(0, a//b):\n if str1[x*b:(x+1)*b] != str2:\n return ''\n return str2\n else:\n for x in range(b, 0, -1):\n print(x)\n if x==b or b%x or a%x:\n continue\n for y in range(0, b//x):\n if str2[y*x:(y+1)*x] != str2[b-x:b]:\n return ''\n for y in range(0, a//x):\n if str1[y*x:(y+1)*x] != str2[0:x]:\n return ''\n return str2[0:x]\n# 44 ms\t13.9 MB\n```\n\n\n\n官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,[可以证明](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/)必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。\n\n","source":"_posts/2020-03-30-leetcode-1071.md","raw":"---\ntitle: leetcode-1071\ndate: 2020-03-30 22:03:01\ntags:\ncategories: leetcode\n---\n\n### 1071. 字符串的最大公因子\n\n[题目](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/)\n\n\n\n\n\n\n\n如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。\n\n\n\n```python\nclass Solution:\n def gcdOfStrings(self, str1: str, str2: str) -> str:\n if str1[0] != str2[0]:\n return ''\n\n a = len(str1)\n b = len(str2)\n print(a, b)\n if a < b:\n str1, str2 = str2, str1\n a = len(str1)\n b = len(str2)\n\n if not a%b:\n for x in range(0, a//b):\n if str1[x*b:(x+1)*b] != str2:\n return ''\n return str2\n else:\n for x in range(b, 0, -1):\n print(x)\n if x==b or b%x or a%x:\n continue\n for y in range(0, b//x):\n if str2[y*x:(y+1)*x] != str2[b-x:b]:\n return ''\n for y in range(0, a//x):\n if str1[y*x:(y+1)*x] != str2[0:x]:\n return ''\n return str2[0:x]\n# 44 ms\t13.9 MB\n```\n\n\n\n官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,[可以证明](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/)必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。\n\n","slug":"leetcode-1071","published":1,"updated":"2020-03-30T14:04:17.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4o000jsubub8g0257f","content":"

1071. 字符串的最大公因子

题目

\n\n

如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def gcdOfStrings(self, str1: str, str2: str) -> str:
if str1[0] != str2[0]:
return ''

a = len(str1)
b = len(str2)
print(a, b)
if a < b:
str1, str2 = str2, str1
a = len(str1)
b = len(str2)

if not a%b:
for x in range(0, a//b):
if str1[x*b:(x+1)*b] != str2:
return ''
return str2
else:
for x in range(b, 0, -1):
print(x)
if x==b or b%x or a%x:
continue
for y in range(0, b//x):
if str2[y*x:(y+1)*x] != str2[b-x:b]:
return ''
for y in range(0, a//x):
if str1[y*x:(y+1)*x] != str2[0:x]:
return ''
return str2[0:x]
# 44 ms\t13.9 MB
\n

官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,可以证明必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。

\n","site":{"data":{}},"excerpt":"

1071. 字符串的最大公因子

题目

","more":"

如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def gcdOfStrings(self, str1: str, str2: str) -> str:
if str1[0] != str2[0]:
return ''

a = len(str1)
b = len(str2)
print(a, b)
if a < b:
str1, str2 = str2, str1
a = len(str1)
b = len(str2)

if not a%b:
for x in range(0, a//b):
if str1[x*b:(x+1)*b] != str2:
return ''
return str2
else:
for x in range(b, 0, -1):
print(x)
if x==b or b%x or a%x:
continue
for y in range(0, b//x):
if str2[y*x:(y+1)*x] != str2[b-x:b]:
return ''
for y in range(0, a//x):
if str1[y*x:(y+1)*x] != str2[0:x]:
return ''
return str2[0:x]
# 44 ms\t13.9 MB
\n

官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,可以证明必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。

"},{"title":"leetcode-999","date":"2020-03-30T13:03:25.000Z","_content":"\n\n### 999. 可以被一步捕获的棋子数\n\n[题目](https://leetcode-cn.com/problems/available-captures-for-rook/)\n\n\n\n\n\n\n\n遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。\n\n\n\n```python\nclass Solution:\n def numRookCaptures(self, board) -> int:\n i = j = 0\n for row in board:\n if 'R' in row:\n break\n i += 1\n j = row.index('R')\n count = 0\n # right\n for x in range(j + 1, 8):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # left\n for x in range(j, 0, -1):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # up\n for x in range(i, 0, -1):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n # down\n for x in range(i+1, 8):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n\n return count\n\n#36 ms\t13.6 MB\n\n```\n\n\n\n问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。\n\n","source":"_posts/2020-03-30-leetcode-999.md","raw":"---\ntitle: leetcode-999\ndate: 2020-03-30 21:03:25\ntags:\ncategories: leetcode\n---\n\n\n### 999. 可以被一步捕获的棋子数\n\n[题目](https://leetcode-cn.com/problems/available-captures-for-rook/)\n\n\n\n\n\n\n\n遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。\n\n\n\n```python\nclass Solution:\n def numRookCaptures(self, board) -> int:\n i = j = 0\n for row in board:\n if 'R' in row:\n break\n i += 1\n j = row.index('R')\n count = 0\n # right\n for x in range(j + 1, 8):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # left\n for x in range(j, 0, -1):\n if row[x] == 'p':\n count += 1\n break\n if row[x] == 'B':\n break\n # up\n for x in range(i, 0, -1):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n # down\n for x in range(i+1, 8):\n if board[x][j] == 'p':\n count += 1\n break\n if board[x][j] == 'B':\n break\n\n return count\n\n#36 ms\t13.6 MB\n\n```\n\n\n\n问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。\n\n","slug":"leetcode-999","published":1,"updated":"2020-03-30T13:03:41.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4p000lsubu6henmdmq","content":"

999. 可以被一步捕获的棋子数

题目

\n\n

遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution:
def numRookCaptures(self, board) -> int:
i = j = 0
for row in board:
if 'R' in row:
break
i += 1
j = row.index('R')
count = 0
# right
for x in range(j + 1, 8):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# left
for x in range(j, 0, -1):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# up
for x in range(i, 0, -1):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break
# down
for x in range(i+1, 8):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break

return count

#36 ms\t13.6 MB
\n

问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。

\n","site":{"data":{}},"excerpt":"

999. 可以被一步捕获的棋子数

题目

","more":"

遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution:
def numRookCaptures(self, board) -> int:
i = j = 0
for row in board:
if 'R' in row:
break
i += 1
j = row.index('R')
count = 0
# right
for x in range(j + 1, 8):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# left
for x in range(j, 0, -1):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# up
for x in range(i, 0, -1):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break
# down
for x in range(i+1, 8):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break

return count

#36 ms\t13.6 MB
\n

问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。

"},{"title":"leetcode-1103","date":"2020-04-01T03:22:20.000Z","mathjax":true,"_content":"\n### 1103. 分糖果 II\n\n[题目](https://leetcode-cn.com/problems/distribute-candies-to-people/)\n\n\n\n\n\n\n\n小学奥数题。主要思路就是等差数列求和 $\\cfrac{(首项 + 末项)×项数}{2}$ 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。\n\n\n\n```python\nclass Solution:\n def distributeCandies(self, candies: int, num_people: int):\n total = 0\n i = 0\n # import ipdb; ipdb.set_trace()\n while total <= candies:\n t = (num_people*i)*num_people + int((1+num_people)*num_people/2)\n if total + t <= candies:\n total += t\n i += 1\n else:\n break\n remaining = candies - total\n print(total, remaining, i)\n l = []\n for n in range(1, num_people+1):\n if not total:\n current_candy = n\n else:\n current_candy = n+i*num_people\n\n n_count = int((0+(i-1))*(i)/2)\n print(current_candy, n_count)\n if remaining >= current_candy:\n l.append(n_count*num_people + n*i + current_candy)\n remaining -= current_candy\n else:\n l.append(n_count*num_people + n*i + remaining)\n remaining = 0\n return l\n# 28 ms\t13.7 MB,\n```\n","source":"_posts/2020-04-01-leetcode-1103.md","raw":"---\ntitle: leetcode-1103\ndate: 2020-04-01 11:22:20\ntags:\ncategories: leetcode\nmathjax: true\n---\n\n### 1103. 分糖果 II\n\n[题目](https://leetcode-cn.com/problems/distribute-candies-to-people/)\n\n\n\n\n\n\n\n小学奥数题。主要思路就是等差数列求和 $\\cfrac{(首项 + 末项)×项数}{2}$ 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。\n\n\n\n```python\nclass Solution:\n def distributeCandies(self, candies: int, num_people: int):\n total = 0\n i = 0\n # import ipdb; ipdb.set_trace()\n while total <= candies:\n t = (num_people*i)*num_people + int((1+num_people)*num_people/2)\n if total + t <= candies:\n total += t\n i += 1\n else:\n break\n remaining = candies - total\n print(total, remaining, i)\n l = []\n for n in range(1, num_people+1):\n if not total:\n current_candy = n\n else:\n current_candy = n+i*num_people\n\n n_count = int((0+(i-1))*(i)/2)\n print(current_candy, n_count)\n if remaining >= current_candy:\n l.append(n_count*num_people + n*i + current_candy)\n remaining -= current_candy\n else:\n l.append(n_count*num_people + n*i + remaining)\n remaining = 0\n return l\n# 28 ms\t13.7 MB,\n```\n","slug":"leetcode-1103","published":1,"updated":"2020-04-08T17:17:27.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4q000nsubuw1s0x6b6","content":"

1103. 分糖果 II

题目

\n\n

小学奥数题。主要思路就是等差数列求和 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def distributeCandies(self, candies: int, num_people: int):
total = 0
i = 0
# import ipdb; ipdb.set_trace()
while total <= candies:
t = (num_people*i)*num_people + int((1+num_people)*num_people/2)
if total + t <= candies:
total += t
i += 1
else:
break
remaining = candies - total
print(total, remaining, i)
l = []
for n in range(1, num_people+1):
if not total:
current_candy = n
else:
current_candy = n+i*num_people

n_count = int((0+(i-1))*(i)/2)
print(current_candy, n_count)
if remaining >= current_candy:
l.append(n_count*num_people + n*i + current_candy)
remaining -= current_candy
else:
l.append(n_count*num_people + n*i + remaining)
remaining = 0
return l
# 28 ms\t13.7 MB,
\n","site":{"data":{}},"excerpt":"

1103. 分糖果 II

题目

","more":"

小学奥数题。主要思路就是等差数列求和 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def distributeCandies(self, candies: int, num_people: int):
total = 0
i = 0
# import ipdb; ipdb.set_trace()
while total <= candies:
t = (num_people*i)*num_people + int((1+num_people)*num_people/2)
if total + t <= candies:
total += t
i += 1
else:
break
remaining = candies - total
print(total, remaining, i)
l = []
for n in range(1, num_people+1):
if not total:
current_candy = n
else:
current_candy = n+i*num_people

n_count = int((0+(i-1))*(i)/2)
print(current_candy, n_count)
if remaining >= current_candy:
l.append(n_count*num_people + n*i + current_candy)
remaining -= current_candy
else:
l.append(n_count*num_people + n*i + remaining)
remaining = 0
return l
# 28 ms\t13.7 MB,
\n"},{"title":"leetcode-1160","date":"2020-03-31T16:18:48.000Z","_content":"\n\n### 1160. 拼写单词\n\n[题目](https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/)\n\n\n\n\n\n\n\n利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word\n\n```python\nclass Solution:\n def countCharacters(self, words, chars: str) -> int:\n\n words_ = ''\n for w in words:\n lchars = list(chars)\n try:\n for l in w:\n lchars.remove(l)\n except:\n continue\n words_ += w\n\n return len(words_)\n# 152 ms\t14.1 MB\n```\n\n","source":"_posts/2020-04-01-leetcode-1160.md","raw":"---\ntitle: leetcode-1160\ndate: 2020-04-01 00:18:48\ntags:\ncategories: leetcode\n---\n\n\n### 1160. 拼写单词\n\n[题目](https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/)\n\n\n\n\n\n\n\n利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word\n\n```python\nclass Solution:\n def countCharacters(self, words, chars: str) -> int:\n\n words_ = ''\n for w in words:\n lchars = list(chars)\n try:\n for l in w:\n lchars.remove(l)\n except:\n continue\n words_ += w\n\n return len(words_)\n# 152 ms\t14.1 MB\n```\n\n","slug":"leetcode-1160","published":1,"updated":"2020-04-01T07:57:06.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4r000psubu38qpnnv7","content":"

1160. 拼写单词

题目

\n\n

利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def countCharacters(self, words, chars: str) -> int:

words_ = ''
for w in words:
lchars = list(chars)
try:
for l in w:
lchars.remove(l)
except:
continue
words_ += w

return len(words_)
# 152 ms\t14.1 MB
\n","site":{"data":{}},"excerpt":"

1160. 拼写单词

题目

","more":"

利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def countCharacters(self, words, chars: str) -> int:

words_ = ''
for w in words:
lchars = list(chars)
try:
for l in w:
lchars.remove(l)
except:
continue
words_ += w

return len(words_)
# 152 ms\t14.1 MB
"},{"title":"leetcode-compress-string-lcci","date":"2020-04-01T07:51:22.000Z","_content":"\n### 面试题 01.06. 字符串压缩\n\n[题目](https://leetcode-cn.com/problems/compress-string-lcci/)\n\n\n\n\n\n遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。\n\n\n\n```python\nclass Solution:\n def compressString(self, S: str) -> str:\n if not S:\n return S\n c = ''\n prev = S[0]\n p_len = 1\n for w in S[1:]:\n if w != prev:\n c += '%s%s' % (prev, p_len)\n prev = w\n p_len = 1\n else:\n p_len += 1\n c += '%s%s' % (prev, p_len)\n if len(S) > len(c):\n return c\n return S\n# 52 ms\t13.8 MB\n```\n\n","source":"_posts/2020-04-01-leetcode-compress-string-lcci.md","raw":"---\ntitle: leetcode-compress-string-lcci\ndate: 2020-04-01 15:51:22\ntags:\ncategories: leetcode\n---\n\n### 面试题 01.06. 字符串压缩\n\n[题目](https://leetcode-cn.com/problems/compress-string-lcci/)\n\n\n\n\n\n遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。\n\n\n\n```python\nclass Solution:\n def compressString(self, S: str) -> str:\n if not S:\n return S\n c = ''\n prev = S[0]\n p_len = 1\n for w in S[1:]:\n if w != prev:\n c += '%s%s' % (prev, p_len)\n prev = w\n p_len = 1\n else:\n p_len += 1\n c += '%s%s' % (prev, p_len)\n if len(S) > len(c):\n return c\n return S\n# 52 ms\t13.8 MB\n```\n\n","slug":"leetcode-compress-string-lcci","published":1,"updated":"2020-04-01T07:57:26.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4s000rsubusdeyspgy","content":"

面试题 01.06. 字符串压缩

题目

\n\n

遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def compressString(self, S: str) -> str:
if not S:
return S
c = ''
prev = S[0]
p_len = 1
for w in S[1:]:
if w != prev:
c += '%s%s' % (prev, p_len)
prev = w
p_len = 1
else:
p_len += 1
c += '%s%s' % (prev, p_len)
if len(S) > len(c):
return c
return S
# 52 ms\t13.8 MB
\n","site":{"data":{}},"excerpt":"

面试题 01.06. 字符串压缩

题目

","more":"

遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def compressString(self, S: str) -> str:
if not S:
return S
c = ''
prev = S[0]
p_len = 1
for w in S[1:]:
if w != prev:
c += '%s%s' % (prev, p_len)
prev = w
p_len = 1
else:
p_len += 1
c += '%s%s' % (prev, p_len)
if len(S) > len(c):
return c
return S
# 52 ms\t13.8 MB
"},{"title":"leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof","date":"2020-04-09T14:14:56.000Z","mathjax":true,"_content":"\n### 面试题57 - II. 和为s的连续正数序列\n\n[题目](https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/)\n\n\n\n\n\n\n\n又是小学奥数。由等差数列求和公式$\\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\\sqrt{2×target} + 1$。\n\n由小到大遍历 $n$,可以求得首项。\n\n```python\nimport math\nclass Solution:\n def findContinuousSequence(self, target: int):\n n = int(math.sqrt(2 * target) + 1)\n if n < 2:\n return []\n sum_list = []\n a = 0\n for i in range(2, n+1):\n a = ((2 * target) / i + 1 - i) / 2\n if a and not a % 1:\n a = int(a)\n s_ = []\n for j in range(0, i):\n s_.append(a + j)\n sum_list.append(s_)\n return sorted(sum_list)\n # 60 ms\t13.7 MB\n```\n","source":"_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md","raw":"---\ntitle: leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof\ndate: 2020-04-09 22:14:56\ntags:\ncategories: leetcode\nmathjax: true\n---\n\n### 面试题57 - II. 和为s的连续正数序列\n\n[题目](https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/)\n\n\n\n\n\n\n\n又是小学奥数。由等差数列求和公式$\\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\\sqrt{2×target} + 1$。\n\n由小到大遍历 $n$,可以求得首项。\n\n```python\nimport math\nclass Solution:\n def findContinuousSequence(self, target: int):\n n = int(math.sqrt(2 * target) + 1)\n if n < 2:\n return []\n sum_list = []\n a = 0\n for i in range(2, n+1):\n a = ((2 * target) / i + 1 - i) / 2\n if a and not a % 1:\n a = int(a)\n s_ = []\n for j in range(0, i):\n s_.append(a + j)\n sum_list.append(s_)\n return sorted(sum_list)\n # 60 ms\t13.7 MB\n```\n","slug":"leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof","published":1,"updated":"2020-04-14T15:29:40.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4t000tsubuyl29244j","content":"

面试题57 - II. 和为s的连续正数序列

题目

\n\n

又是小学奥数。由等差数列求和公式 可知,当首项为 1 的时候项数最多,又由于是连续正整数,,那最大的 就不大于

\n

由小到大遍历 ,可以求得首项。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import math
class Solution:
def findContinuousSequence(self, target: int):
n = int(math.sqrt(2 * target) + 1)
if n < 2:
return []
sum_list = []
a = 0
for i in range(2, n+1):
a = ((2 * target) / i + 1 - i) / 2
if a and not a % 1:
a = int(a)
s_ = []
for j in range(0, i):
s_.append(a + j)
sum_list.append(s_)
return sorted(sum_list)
# 60 ms\t13.7 MB
\n","site":{"data":{}},"excerpt":"

面试题57 - II. 和为s的连续正数序列

题目

","more":"

又是小学奥数。由等差数列求和公式 可知,当首项为 1 的时候项数最多,又由于是连续正整数,,那最大的 就不大于

\n

由小到大遍历 ,可以求得首项。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import math
class Solution:
def findContinuousSequence(self, target: int):
n = int(math.sqrt(2 * target) + 1)
if n < 2:
return []
sum_list = []
a = 0
for i in range(2, n+1):
a = ((2 * target) / i + 1 - i) / 2
if a and not a % 1:
a = int(a)
s_ = []
for j in range(0, i):
s_.append(a + j)
sum_list.append(s_)
return sorted(sum_list)
# 60 ms\t13.7 MB
\n"},{"title":"leetcode-add-two-numbers-ii","date":"2020-04-14T15:22:39.000Z","_content":"\n### 445. 两数相加 II\n\n[题目](https://leetcode-cn.com/problems/add-two-numbers-ii/)\n\n\n\n\n\n\n\n看到顺序的链表就想到用倒序链表的方法做,折腾了半天\n\n\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n def _reverse(l):\n if l.next:\n last = _reverse(l.next)\n l.next.next = l\n l.next = None\n return last\n return l\n\n l1e = _reverse(l1)\n l2e = _reverse(l2)\n new_l = ListNode(0)\n head = new_l\n c = 0\n import ipdb; ipdb.set_trace()\n while l1e and l2e:\n new_val = l1e.val + l2e.val\n if c==1:\n new_val += 1\n c = 0\n if new_val >= 10:\n new_val -= 10\n c = 1\n\n new_l.val = new_val\n next_n = None\n if l1e.next and l2e.next or c:\n next_n = ListNode(c)\n new_l.next = next_n\n new_l = next_n\n l1e = l1e.next\n l2e = l2e.next\n if l2e:\n l1e = l2e\n if not l1e and c:\n l1e = ListNode(0)\n while l1e:\n new_l.val = l1e.val\n new_l.val += c\n c = 0\n if new_l.val >= 10:\n c = 1\n new_l.val -= 10\n l1e = l1e.next\n if l1e:\n new_l.next = ListNode(0)\n new_l = new_l.next\n else:\n new_l.next = ListNode(1)\n\n return _reverse(head)\n\n # 84 ms\t13.9 MB\n```\n\n最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。\n\n```python\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n s1, s2 = [], []\n while l1:\n s1.append(l1.val)\n l1 = l1.next\n while l2:\n s2.append(l2.val)\n l2 = l2.next\n ans = None\n carry = 0\n while s1 or s2 or carry != 0:\n a = 0 if not s1 else s1.pop()\n b = 0 if not s2 else s2.pop()\n cur = a + b + carry\n carry = cur // 10\n cur %= 10\n curnode = ListNode(cur)\n curnode.next = ans\n ans = curnode\n return ans\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n不过就执行效率来看差不多。\n","source":"_posts/2020-04-14-leetcode-add-two-numbers-ii.md","raw":"---\ntitle: leetcode-add-two-numbers-ii\ndate: 2020-04-14 23:22:39\ntags:\ncategories: leetcode\n---\n\n### 445. 两数相加 II\n\n[题目](https://leetcode-cn.com/problems/add-two-numbers-ii/)\n\n\n\n\n\n\n\n看到顺序的链表就想到用倒序链表的方法做,折腾了半天\n\n\n\n```python\nclass ListNode:\n def __init__(self, x):\n self.val = x\n self.next = None\n\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n def _reverse(l):\n if l.next:\n last = _reverse(l.next)\n l.next.next = l\n l.next = None\n return last\n return l\n\n l1e = _reverse(l1)\n l2e = _reverse(l2)\n new_l = ListNode(0)\n head = new_l\n c = 0\n import ipdb; ipdb.set_trace()\n while l1e and l2e:\n new_val = l1e.val + l2e.val\n if c==1:\n new_val += 1\n c = 0\n if new_val >= 10:\n new_val -= 10\n c = 1\n\n new_l.val = new_val\n next_n = None\n if l1e.next and l2e.next or c:\n next_n = ListNode(c)\n new_l.next = next_n\n new_l = next_n\n l1e = l1e.next\n l2e = l2e.next\n if l2e:\n l1e = l2e\n if not l1e and c:\n l1e = ListNode(0)\n while l1e:\n new_l.val = l1e.val\n new_l.val += c\n c = 0\n if new_l.val >= 10:\n c = 1\n new_l.val -= 10\n l1e = l1e.next\n if l1e:\n new_l.next = ListNode(0)\n new_l = new_l.next\n else:\n new_l.next = ListNode(1)\n\n return _reverse(head)\n\n # 84 ms\t13.9 MB\n```\n\n最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。\n\n```python\nclass Solution:\n def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:\n s1, s2 = [], []\n while l1:\n s1.append(l1.val)\n l1 = l1.next\n while l2:\n s2.append(l2.val)\n l2 = l2.next\n ans = None\n carry = 0\n while s1 or s2 or carry != 0:\n a = 0 if not s1 else s1.pop()\n b = 0 if not s2 else s2.pop()\n cur = a + b + carry\n carry = cur // 10\n cur %= 10\n curnode = ListNode(cur)\n curnode.next = ans\n ans = curnode\n return ans\n\n作者:LeetCode-Solution\n链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/\n来源:力扣(LeetCode)\n著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。\n```\n\n不过就执行效率来看差不多。\n","slug":"leetcode-add-two-numbers-ii","published":1,"updated":"2020-04-14T15:28:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4u000vsubuzq7vic3v","content":"

445. 两数相加 II

题目

\n\n

看到顺序的链表就想到用倒序链表的方法做,折腾了半天

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def _reverse(l):
if l.next:
last = _reverse(l.next)
l.next.next = l
l.next = None
return last
return l

l1e = _reverse(l1)
l2e = _reverse(l2)
new_l = ListNode(0)
head = new_l
c = 0
import ipdb; ipdb.set_trace()
while l1e and l2e:
new_val = l1e.val + l2e.val
if c==1:
new_val += 1
c = 0
if new_val >= 10:
new_val -= 10
c = 1

new_l.val = new_val
next_n = None
if l1e.next and l2e.next or c:
next_n = ListNode(c)
new_l.next = next_n
new_l = next_n
l1e = l1e.next
l2e = l2e.next
if l2e:
l1e = l2e
if not l1e and c:
l1e = ListNode(0)
while l1e:
new_l.val = l1e.val
new_l.val += c
c = 0
if new_l.val >= 10:
c = 1
new_l.val -= 10
l1e = l1e.next
if l1e:
new_l.next = ListNode(0)
new_l = new_l.next
else:
new_l.next = ListNode(1)

return _reverse(head)

# 84 ms\t13.9 MB
\n

最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
s1, s2 = [], []
while l1:
s1.append(l1.val)
l1 = l1.next
while l2:
s2.append(l2.val)
l2 = l2.next
ans = None
carry = 0
while s1 or s2 or carry != 0:
a = 0 if not s1 else s1.pop()
b = 0 if not s2 else s2.pop()
cur = a + b + carry
carry = cur // 10
cur %= 10
curnode = ListNode(cur)
curnode.next = ans
ans = curnode
return ans

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n

不过就执行效率来看差不多。

\n","site":{"data":{}},"excerpt":"

445. 两数相加 II

题目

","more":"

看到顺序的链表就想到用倒序链表的方法做,折腾了半天

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def _reverse(l):
if l.next:
last = _reverse(l.next)
l.next.next = l
l.next = None
return last
return l

l1e = _reverse(l1)
l2e = _reverse(l2)
new_l = ListNode(0)
head = new_l
c = 0
import ipdb; ipdb.set_trace()
while l1e and l2e:
new_val = l1e.val + l2e.val
if c==1:
new_val += 1
c = 0
if new_val >= 10:
new_val -= 10
c = 1

new_l.val = new_val
next_n = None
if l1e.next and l2e.next or c:
next_n = ListNode(c)
new_l.next = next_n
new_l = next_n
l1e = l1e.next
l2e = l2e.next
if l2e:
l1e = l2e
if not l1e and c:
l1e = ListNode(0)
while l1e:
new_l.val = l1e.val
new_l.val += c
c = 0
if new_l.val >= 10:
c = 1
new_l.val -= 10
l1e = l1e.next
if l1e:
new_l.next = ListNode(0)
new_l = new_l.next
else:
new_l.next = ListNode(1)

return _reverse(head)

# 84 ms\t13.9 MB
\n

最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
s1, s2 = [], []
while l1:
s1.append(l1.val)
l1 = l1.next
while l2:
s2.append(l2.val)
l2 = l2.next
ans = None
carry = 0
while s1 or s2 or carry != 0:
a = 0 if not s1 else s1.pop()
b = 0 if not s2 else s2.pop()
cur = a + b + carry
carry = cur // 10
cur %= 10
curnode = ListNode(cur)
curnode.next = ans
ans = curnode
return ans

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
\n

不过就执行效率来看差不多。

"},{"title":"leetcode-the-masseuse-lcci","date":"2020-04-08T16:35:26.000Z","mathjax":true,"_content":"\n### 面试题 17.16. 按摩师\n\n[题目](https://leetcode-cn.com/problems/the-masseuse-lcci/)\n\n\n\n\n\n\n\n一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 $i$ 时刻,$dp[i][0]$ 为当前预约不接的情况下最长预约时间,$dp[i][1]$ 则为接受当前预约的最长预约时间。\n\n\n\n那很显然,由于不能接受相邻两个预约,$dp[i][1] = dp[i-1][0] + nums_i$\n\n不接受当前预约的话,上一个预约接不接受都可以,$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$\n\n最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$\n\n\n\n```python\nclass Solution:\n def massage(self, nums) -> int:\n if not nums:\n return 0\n n = len(nums)\n not_choose = 0\n choose = 0\n for n in nums:\n not_choose, choose = max(not_choose, choose), not_choose+n\n return max(not_choose, choose)\n # 52 ms\t13.6 MB\n```\n\n\n\n这种问题原来有个名字叫[动态规划](https://zh.wikipedia.org/wiki/动态规划),上面推导的方程叫[状态转移方程](https://baike.baidu.com/item/状态转移方程),可以找找资料来看一下。\n","source":"_posts/2020-04-09-leetcode-the-masseuse-lcci.md","raw":"---\ntitle: leetcode-the-masseuse-lcci\ndate: 2020-04-09 00:35:26\ntags:\ncategories: leetcode\nmathjax: true\n---\n\n### 面试题 17.16. 按摩师\n\n[题目](https://leetcode-cn.com/problems/the-masseuse-lcci/)\n\n\n\n\n\n\n\n一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 $i$ 时刻,$dp[i][0]$ 为当前预约不接的情况下最长预约时间,$dp[i][1]$ 则为接受当前预约的最长预约时间。\n\n\n\n那很显然,由于不能接受相邻两个预约,$dp[i][1] = dp[i-1][0] + nums_i$\n\n不接受当前预约的话,上一个预约接不接受都可以,$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$\n\n最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$\n\n\n\n```python\nclass Solution:\n def massage(self, nums) -> int:\n if not nums:\n return 0\n n = len(nums)\n not_choose = 0\n choose = 0\n for n in nums:\n not_choose, choose = max(not_choose, choose), not_choose+n\n return max(not_choose, choose)\n # 52 ms\t13.6 MB\n```\n\n\n\n这种问题原来有个名字叫[动态规划](https://zh.wikipedia.org/wiki/动态规划),上面推导的方程叫[状态转移方程](https://baike.baidu.com/item/状态转移方程),可以找找资料来看一下。\n","slug":"leetcode-the-masseuse-lcci","published":1,"updated":"2020-04-08T17:14:04.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4v000xsubu9bmmz6rr","content":"

面试题 17.16. 按摩师

题目

\n\n

一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 时刻, 为当前预约不接的情况下最长预约时间, 则为接受当前预约的最长预约时间。

\n

那很显然,由于不能接受相邻两个预约,

\n

不接受当前预约的话,上一个预约接不接受都可以,

\n

最后只要比较两种情况即可

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def massage(self, nums) -> int:
if not nums:
return 0
n = len(nums)
not_choose = 0
choose = 0
for n in nums:
not_choose, choose = max(not_choose, choose), not_choose+n
return max(not_choose, choose)
# 52 ms\t13.6 MB
\n

这种问题原来有个名字叫动态规划,上面推导的方程叫状态转移方程,可以找找资料来看一下。

\n","site":{"data":{}},"excerpt":"

面试题 17.16. 按摩师

题目

","more":"

一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 时刻, 为当前预约不接的情况下最长预约时间, 则为接受当前预约的最长预约时间。

\n

那很显然,由于不能接受相邻两个预约,

\n

不接受当前预约的话,上一个预约接不接受都可以,

\n

最后只要比较两种情况即可

\n
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def massage(self, nums) -> int:
if not nums:
return 0
n = len(nums)
not_choose = 0
choose = 0
for n in nums:
not_choose, choose = max(not_choose, choose), not_choose+n
return max(not_choose, choose)
# 52 ms\t13.6 MB
\n

这种问题原来有个名字叫动态规划,上面推导的方程叫状态转移方程,可以找找资料来看一下。

\n"},{"title":"leetcode-01-matrix","date":"2020-04-16T04:26:34.000Z","_content":"\n### 542. 01 矩阵\n\n[题目](https://leetcode-cn.com/problems/01-matrix/)\n\n\n\n\n\n\n\n想了两种思路\n\n1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。\n\n ```python\n class Solution:\n def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:\n m, n = len(matrix), len(matrix[0])\n dist = [[0] * n for _ in range(m)]\n zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]\n # 将所有的 0 添加进初始队列中\n q = collections.deque(zeroes_pos)\n seen = set(zeroes_pos)\n\n # 广度优先搜索\n while q:\n i, j = q.popleft()\n for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:\n if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:\n dist[ni][nj] = dist[i][j] + 1\n q.append((ni, nj))\n seen.add((ni, nj))\n\n return dist\n ```\n\n\n\n2. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。\n\n","source":"_posts/2020-04-16-leetcode-01-matrix.md","raw":"---\ntitle: leetcode-01-matrix\ndate: 2020-04-16 12:26:34\ntags:\ncategories: leetcode\n---\n\n### 542. 01 矩阵\n\n[题目](https://leetcode-cn.com/problems/01-matrix/)\n\n\n\n\n\n\n\n想了两种思路\n\n1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。\n\n ```python\n class Solution:\n def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:\n m, n = len(matrix), len(matrix[0])\n dist = [[0] * n for _ in range(m)]\n zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]\n # 将所有的 0 添加进初始队列中\n q = collections.deque(zeroes_pos)\n seen = set(zeroes_pos)\n\n # 广度优先搜索\n while q:\n i, j = q.popleft()\n for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:\n if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:\n dist[ni][nj] = dist[i][j] + 1\n q.append((ni, nj))\n seen.add((ni, nj))\n\n return dist\n ```\n\n\n\n2. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。\n\n","slug":"leetcode-01-matrix","published":1,"updated":"2020-04-16T04:26:56.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4w000zsubuceivn0ao","content":"

542. 01 矩阵

题目

\n\n

想了两种思路

\n
    \n
  1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。

    \n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
    m, n = len(matrix), len(matrix[0])
    dist = [[0] * n for _ in range(m)]
    zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]
    # 将所有的 0 添加进初始队列中
    q = collections.deque(zeroes_pos)
    seen = set(zeroes_pos)

    # 广度优先搜索
    while q:
    i, j = q.popleft()
    for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
    if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:
    dist[ni][nj] = dist[i][j] + 1
    q.append((ni, nj))
    seen.add((ni, nj))

    return dist
    \n
  2. \n
  3. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。

    \n
  4. \n
\n","site":{"data":{}},"excerpt":"

542. 01 矩阵

题目

","more":"

想了两种思路

\n
    \n
  1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。

    \n
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
    m, n = len(matrix), len(matrix[0])
    dist = [[0] * n for _ in range(m)]
    zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]
    # 将所有的 0 添加进初始队列中
    q = collections.deque(zeroes_pos)
    seen = set(zeroes_pos)

    # 广度优先搜索
    while q:
    i, j = q.popleft()
    for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
    if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:
    dist[ni][nj] = dist[i][j] + 1
    q.append((ni, nj))
    seen.add((ni, nj))

    return dist
    \n
  2. \n
  3. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。

    \n
  4. \n
"},{"title":"leetcode-design-twitter","date":"2020-04-14T08:11:41.000Z","_content":"\n### 355. 设计推特\n\n[题目](https://leetcode-cn.com/problems/design-twitter/)\n\n\n\n\n\n做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 `twitterId` 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。\n\n主要的考点应该是 `多路归并` 这个东西。我用的是排序,在数据量大的时候应该会有些问题。\n\n\n\n```python\nclass Twitter:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.tweets = {}\n self.followers = {}\n self._tid = 0\n\n\n def postTweet(self, userId: int, tweetId: int) -> None:\n \"\"\"\n Compose a new tweet.\n \"\"\"\n if not self.tweets.get(userId):\n self.tweets[userId] = []\n self.tweets[userId].append((self._tid, tweetId))\n self._tid += 1\n\n\n def getNewsFeed(self, userId: int) :\n \"\"\"\n Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.\n \"\"\"\n foers = self.followers.get(userId, set())\n foers = foers.union((userId,))\n tweets = []\n for fo in foers:\n tweets.extend(self.tweets.get(fo, [])[-10:])\n return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]\n\n\n def follow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower follows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n self.followers[followerId].add(followeeId)\n\n\n def unfollow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower unfollows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n if followeeId in self.followers[followerId]:\n self.followers[followerId].remove(followeeId)\n\n#100 ms\t19.2 MB\n\n# Your Twitter object will be instantiated and called as such:\n# obj = Twitter()\n# obj.postTweet(userId,tweetId)\n# param_2 = obj.getNewsFeed(userId)\n# obj.follow(followerId,followeeId)\n# obj.unfollow(followerId,followeeId)\n```\n\n","source":"_posts/2020-04-14-leetcode-design-twitter.md","raw":"---\ntitle: leetcode-design-twitter\ndate: 2020-04-14 16:11:41\ntags:\ncategories: leetcode\n---\n\n### 355. 设计推特\n\n[题目](https://leetcode-cn.com/problems/design-twitter/)\n\n\n\n\n\n做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 `twitterId` 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。\n\n主要的考点应该是 `多路归并` 这个东西。我用的是排序,在数据量大的时候应该会有些问题。\n\n\n\n```python\nclass Twitter:\n\n def __init__(self):\n \"\"\"\n Initialize your data structure here.\n \"\"\"\n self.tweets = {}\n self.followers = {}\n self._tid = 0\n\n\n def postTweet(self, userId: int, tweetId: int) -> None:\n \"\"\"\n Compose a new tweet.\n \"\"\"\n if not self.tweets.get(userId):\n self.tweets[userId] = []\n self.tweets[userId].append((self._tid, tweetId))\n self._tid += 1\n\n\n def getNewsFeed(self, userId: int) :\n \"\"\"\n Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.\n \"\"\"\n foers = self.followers.get(userId, set())\n foers = foers.union((userId,))\n tweets = []\n for fo in foers:\n tweets.extend(self.tweets.get(fo, [])[-10:])\n return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]\n\n\n def follow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower follows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n self.followers[followerId].add(followeeId)\n\n\n def unfollow(self, followerId: int, followeeId: int) -> None:\n \"\"\"\n Follower unfollows a followee. If the operation is invalid, it should be a no-op.\n \"\"\"\n if not self.followers.get(followerId):\n self.followers[followerId] = set()\n if followeeId in self.followers[followerId]:\n self.followers[followerId].remove(followeeId)\n\n#100 ms\t19.2 MB\n\n# Your Twitter object will be instantiated and called as such:\n# obj = Twitter()\n# obj.postTweet(userId,tweetId)\n# param_2 = obj.getNewsFeed(userId)\n# obj.follow(followerId,followeeId)\n# obj.unfollow(followerId,followeeId)\n```\n\n","slug":"leetcode-design-twitter","published":1,"updated":"2020-04-14T15:29:34.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4x0011subuv9wxy1bt","content":"

355. 设计推特

题目

\n\n

做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 twitterId 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。

\n

主要的考点应该是 多路归并 这个东西。我用的是排序,在数据量大的时候应该会有些问题。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Twitter:

def __init__(self):
\"\"\"
Initialize your data structure here.
\"\"\"
self.tweets = {}
self.followers = {}
self._tid = 0


def postTweet(self, userId: int, tweetId: int) -> None:
\"\"\"
Compose a new tweet.
\"\"\"
if not self.tweets.get(userId):
self.tweets[userId] = []
self.tweets[userId].append((self._tid, tweetId))
self._tid += 1


def getNewsFeed(self, userId: int) :
\"\"\"
Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
\"\"\"
foers = self.followers.get(userId, set())
foers = foers.union((userId,))
tweets = []
for fo in foers:
tweets.extend(self.tweets.get(fo, [])[-10:])
return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]


def follow(self, followerId: int, followeeId: int) -> None:
\"\"\"
Follower follows a followee. If the operation is invalid, it should be a no-op.
\"\"\"
if not self.followers.get(followerId):
self.followers[followerId] = set()
self.followers[followerId].add(followeeId)


def unfollow(self, followerId: int, followeeId: int) -> None:
\"\"\"
Follower unfollows a followee. If the operation is invalid, it should be a no-op.
\"\"\"
if not self.followers.get(followerId):
self.followers[followerId] = set()
if followeeId in self.followers[followerId]:
self.followers[followerId].remove(followeeId)

#100 ms\t19.2 MB

# Your Twitter object will be instantiated and called as such:
# obj = Twitter()
# obj.postTweet(userId,tweetId)
# param_2 = obj.getNewsFeed(userId)
# obj.follow(followerId,followeeId)
# obj.unfollow(followerId,followeeId)
\n","site":{"data":{}},"excerpt":"

355. 设计推特

题目

","more":"

做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 twitterId 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。

\n

主要的考点应该是 多路归并 这个东西。我用的是排序,在数据量大的时候应该会有些问题。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Twitter:

def __init__(self):
\"\"\"
Initialize your data structure here.
\"\"\"
self.tweets = {}
self.followers = {}
self._tid = 0


def postTweet(self, userId: int, tweetId: int) -> None:
\"\"\"
Compose a new tweet.
\"\"\"
if not self.tweets.get(userId):
self.tweets[userId] = []
self.tweets[userId].append((self._tid, tweetId))
self._tid += 1


def getNewsFeed(self, userId: int) :
\"\"\"
Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
\"\"\"
foers = self.followers.get(userId, set())
foers = foers.union((userId,))
tweets = []
for fo in foers:
tweets.extend(self.tweets.get(fo, [])[-10:])
return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]


def follow(self, followerId: int, followeeId: int) -> None:
\"\"\"
Follower follows a followee. If the operation is invalid, it should be a no-op.
\"\"\"
if not self.followers.get(followerId):
self.followers[followerId] = set()
self.followers[followerId].add(followeeId)


def unfollow(self, followerId: int, followeeId: int) -> None:
\"\"\"
Follower unfollows a followee. If the operation is invalid, it should be a no-op.
\"\"\"
if not self.followers.get(followerId):
self.followers[followerId] = set()
if followeeId in self.followers[followerId]:
self.followers[followerId].remove(followeeId)

#100 ms\t19.2 MB

# Your Twitter object will be instantiated and called as such:
# obj = Twitter()
# obj.postTweet(userId,tweetId)
# param_2 = obj.getNewsFeed(userId)
# obj.follow(followerId,followeeId)
# obj.unfollow(followerId,followeeId)
"},{"title":"leetcode-merge-intervals","date":"2020-04-16T11:22:26.000Z","_content":"\n\n### 56. 合并区间\n\n\n\n[题目](https://leetcode-cn.com/problems/merge-intervals/)\n\n\n\n\n\n\n\n首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。\n\n\n\n```python\nclass Solution:\n def merge(self, intervals):\n if not intervals:\n return []\n intervals.sort()\n merged = []\n l = len(intervals)\n m = intervals[0]\n for x in range(l-1):\n j = intervals[x+1]\n if m[1] >= j[0]:\n if m[1] <= j[1]:\n m = [m[0], j[1]]\n else:\n continue\n else:\n merged.append(m)\n m = j\n if m:\n merged.append(m)\n return merged\n```\n\n\n\n","source":"_posts/2020-04-16-leetcode-merge-intervals.md","raw":"---\ntitle: leetcode-merge-intervals\ndate: 2020-04-16 19:22:26\ntags:\ncategories: leetcode\n---\n\n\n### 56. 合并区间\n\n\n\n[题目](https://leetcode-cn.com/problems/merge-intervals/)\n\n\n\n\n\n\n\n首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。\n\n\n\n```python\nclass Solution:\n def merge(self, intervals):\n if not intervals:\n return []\n intervals.sort()\n merged = []\n l = len(intervals)\n m = intervals[0]\n for x in range(l-1):\n j = intervals[x+1]\n if m[1] >= j[0]:\n if m[1] <= j[1]:\n m = [m[0], j[1]]\n else:\n continue\n else:\n merged.append(m)\n m = j\n if m:\n merged.append(m)\n return merged\n```\n\n\n\n","slug":"leetcode-merge-intervals","published":1,"updated":"2020-04-16T11:22:48.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk4y0013subufp1wokx0","content":"

56. 合并区间

题目

\n\n

首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def merge(self, intervals):
if not intervals:
return []
intervals.sort()
merged = []
l = len(intervals)
m = intervals[0]
for x in range(l-1):
j = intervals[x+1]
if m[1] >= j[0]:
if m[1] <= j[1]:
m = [m[0], j[1]]
else:
continue
else:
merged.append(m)
m = j
if m:
merged.append(m)
return merged
\n","site":{"data":{}},"excerpt":"

56. 合并区间

题目

","more":"

首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def merge(self, intervals):
if not intervals:
return []
intervals.sort()
merged = []
l = len(intervals)
m = intervals[0]
for x in range(l-1):
j = intervals[x+1]
if m[1] >= j[0]:
if m[1] <= j[1]:
m = [m[0], j[1]]
else:
continue
else:
merged.append(m)
m = j
if m:
merged.append(m)
return merged
"},{"title":"leetcode-number-of-islands","date":"2020-04-21T04:55:17.000Z","_content":"\n### 200. 岛屿数量\n\n\n\n[题目](https://leetcode-cn.com/problems/number-of-islands/)\n\n\n\n\n\n\n\n这种矩阵题现在第一反应就是用[广度优先搜索][0]做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。\n\n\n\n```python\nimport collections\nclass Solution:\n def numIslands(self, grid) -> int:\n rows = len(grid)\n if not rows:\n return 0\n cols = len(grid[0])\n islands = 0\n for r in range(rows):\n for l in range(cols):\n if grid[r][l] == '1':\n islands += 1\n grid[r][l] = '0'\n neighbors = collections.deque([(r, l)])\n while neighbors:\n x, y = neighbors.popleft()\n for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:\n if 0<=x_\n\n\n\n这种矩阵题现在第一反应就是用[广度优先搜索][0]做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。\n\n\n\n```python\nimport collections\nclass Solution:\n def numIslands(self, grid) -> int:\n rows = len(grid)\n if not rows:\n return 0\n cols = len(grid[0])\n islands = 0\n for r in range(rows):\n for l in range(cols):\n if grid[r][l] == '1':\n islands += 1\n grid[r][l] = '0'\n neighbors = collections.deque([(r, l)])\n while neighbors:\n x, y = neighbors.popleft()\n for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:\n if 0<=x_200. 岛屿数量

题目

\n\n

这种矩阵题现在第一反应就是用广度优先搜索做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import collections
class Solution:
def numIslands(self, grid) -> int:
rows = len(grid)
if not rows:
return 0
cols = len(grid[0])
islands = 0
for r in range(rows):
for l in range(cols):
if grid[r][l] == '1':
islands += 1
grid[r][l] = '0'
neighbors = collections.deque([(r, l)])
while neighbors:
x, y = neighbors.popleft()
for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:
if 0<=x_<rows and 0<=y_<cols and grid[x_][y_] == '1':
neighbors.append([x_, y_])
grid[x_][y_] = '0'
return islands
\n","site":{"data":{}},"excerpt":"

200. 岛屿数量

题目

","more":"

这种矩阵题现在第一反应就是用广度优先搜索做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import collections
class Solution:
def numIslands(self, grid) -> int:
rows = len(grid)
if not rows:
return 0
cols = len(grid[0])
islands = 0
for r in range(rows):
for l in range(cols):
if grid[r][l] == '1':
islands += 1
grid[r][l] = '0'
neighbors = collections.deque([(r, l)])
while neighbors:
x, y = neighbors.popleft()
for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:
if 0<=x_<rows and 0<=y_<cols and grid[x_][y_] == '1':
neighbors.append([x_, y_])
grid[x_][y_] = '0'
return islands
"},{"title":"leetcode-string-to-integer-atoi","date":"2020-04-16T11:50:10.000Z","_content":"\n### 8. 字符串转换整数 (atoi)\n\n[题目](https://leetcode-cn.com/problems/string-to-integer-atoi/)\n\n\n\n\n\n\n\n没什么好说的,注意各种情况,识别到数字之后就一直要是数字。\n\n\n\n```python\nclass Solution:\n def myAtoi(self, str: str) -> int:\n p = ''\n str = str.lstrip()\n n = ''\n min_int = -2**31\n max_int = 2**31-1\n isnumeric = False\n for x in str:\n if not isnumeric and x == '-':\n p = '-'\n isnumeric = True\n continue\n if not isnumeric and x == '+':\n isnumeric = True\n continue\n if x.isnumeric():\n n += x\n isnumeric = True\n else:\n break\n if not n:\n return 0\n if int(n) > max_int:\n if p:\n return min_int\n else:\n return max_int\n p += n\n return int(p)\n# 32 ms\t13.6 MB\n```\n\n","source":"_posts/2020-04-16-leetcode-string-to-integer-atoi.md","raw":"---\ntitle: leetcode-string-to-integer-atoi\ndate: 2020-04-16 19:50:10\ntags:\ncategories: leetcode\n---\n\n### 8. 字符串转换整数 (atoi)\n\n[题目](https://leetcode-cn.com/problems/string-to-integer-atoi/)\n\n\n\n\n\n\n\n没什么好说的,注意各种情况,识别到数字之后就一直要是数字。\n\n\n\n```python\nclass Solution:\n def myAtoi(self, str: str) -> int:\n p = ''\n str = str.lstrip()\n n = ''\n min_int = -2**31\n max_int = 2**31-1\n isnumeric = False\n for x in str:\n if not isnumeric and x == '-':\n p = '-'\n isnumeric = True\n continue\n if not isnumeric and x == '+':\n isnumeric = True\n continue\n if x.isnumeric():\n n += x\n isnumeric = True\n else:\n break\n if not n:\n return 0\n if int(n) > max_int:\n if p:\n return min_int\n else:\n return max_int\n p += n\n return int(p)\n# 32 ms\t13.6 MB\n```\n\n","slug":"leetcode-string-to-integer-atoi","published":1,"updated":"2020-04-16T11:56:40.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk500017subu3v0ql53e","content":"

8. 字符串转换整数 (atoi)

题目

\n\n

没什么好说的,注意各种情况,识别到数字之后就一直要是数字。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def myAtoi(self, str: str) -> int:
p = ''
str = str.lstrip()
n = ''
min_int = -2**31
max_int = 2**31-1
isnumeric = False
for x in str:
if not isnumeric and x == '-':
p = '-'
isnumeric = True
continue
if not isnumeric and x == '+':
isnumeric = True
continue
if x.isnumeric():
n += x
isnumeric = True
else:
break
if not n:
return 0
if int(n) > max_int:
if p:
return min_int
else:
return max_int
p += n
return int(p)
# 32 ms\t13.6 MB
\n","site":{"data":{}},"excerpt":"

8. 字符串转换整数 (atoi)

题目

","more":"

没什么好说的,注意各种情况,识别到数字之后就一直要是数字。

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def myAtoi(self, str: str) -> int:
p = ''
str = str.lstrip()
n = ''
min_int = -2**31
max_int = 2**31-1
isnumeric = False
for x in str:
if not isnumeric and x == '-':
p = '-'
isnumeric = True
continue
if not isnumeric and x == '+':
isnumeric = True
continue
if x.isnumeric():
n += x
isnumeric = True
else:
break
if not n:
return 0
if int(n) > max_int:
if p:
return min_int
else:
return max_int
p += n
return int(p)
# 32 ms\t13.6 MB
"},{"title":"Postgresql Partitioning","date":"2019-03-11T16:08:48.000Z","_content":"\n`Partitioning` refers to splitting what is logically one large table inot smaller physical pieces.\n\nCurrently, PostgreSQL supports partitioning via table [inheritance](https://www.postgresql.org/docs/9.6/ddl-inherit.html). Each partition must be created as a child table of a single parent table. **The parent table itself is normally empty**; It exists just to represent the entire data set.\n\nThere are two forms of partitioning can be implemented in PostgreSQL:\n\n* Range Partitioning\n\n ​\tThe table is partitioning into \"range\" defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.\n\n* List Partitioning\n\n ​\tThe table is partitioned by explicitly listing which key values appear in each partition.\n\n### Implementing Partitioning\n\n1. Create the \"master\" / \"parent\" table, from which all the partitions will inherit.\n\n ​\tThis table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.\n\n2. Create \"child\" tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. \n\n3. Add table constraints to the partition tables to define the allowed key values in each partitions. \n\n ​\tEnsure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. \n\n4. Create indexes on column(s) for each partitions.\n\n5. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.\n\n6. Ensure hte [constraint_exclusion](https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION) configuration parameter is not disabled in `postgresql.conf`. If it is, queries will not be optimized as desired.\n\n### Trigger\n\nAs we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.\n\n","source":"_posts/Postgresql Partitioning.md","raw":"---\ntitle: Postgresql Partitioning\ndate: 2019-03-12 00:08:48\ntags:\n---\n\n`Partitioning` refers to splitting what is logically one large table inot smaller physical pieces.\n\nCurrently, PostgreSQL supports partitioning via table [inheritance](https://www.postgresql.org/docs/9.6/ddl-inherit.html). Each partition must be created as a child table of a single parent table. **The parent table itself is normally empty**; It exists just to represent the entire data set.\n\nThere are two forms of partitioning can be implemented in PostgreSQL:\n\n* Range Partitioning\n\n ​\tThe table is partitioning into \"range\" defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.\n\n* List Partitioning\n\n ​\tThe table is partitioned by explicitly listing which key values appear in each partition.\n\n### Implementing Partitioning\n\n1. Create the \"master\" / \"parent\" table, from which all the partitions will inherit.\n\n ​\tThis table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.\n\n2. Create \"child\" tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. \n\n3. Add table constraints to the partition tables to define the allowed key values in each partitions. \n\n ​\tEnsure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. \n\n4. Create indexes on column(s) for each partitions.\n\n5. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.\n\n6. Ensure hte [constraint_exclusion](https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION) configuration parameter is not disabled in `postgresql.conf`. If it is, queries will not be optimized as desired.\n\n### Trigger\n\nAs we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.\n\n","slug":"Postgresql-Partitioning","published":1,"updated":"2019-11-14T08:01:50.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk510019subuzokyjrq6","content":"

Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

\n

Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

\n

There are two forms of partitioning can be implemented in PostgreSQL:

\n
    \n
  • Range Partitioning

    \n

    ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

    \n
  • \n
  • List Partitioning

    \n

    ​ The table is partitioned by explicitly listing which key values appear in each partition.

    \n
  • \n
\n

Implementing Partitioning

    \n
  1. Create the “master” / “parent” table, from which all the partitions will inherit.

    \n

    ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

    \n
  2. \n
  3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

    \n
  4. \n
  5. Add table constraints to the partition tables to define the allowed key values in each partitions.

    \n

    ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

    \n
  6. \n
  7. Create indexes on column(s) for each partitions.

    \n
  8. \n
  9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

    \n
  10. \n
  11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

    \n
  12. \n
\n

Trigger

As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

\n","site":{"data":{}},"excerpt":"","more":"

Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

\n

Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

\n

There are two forms of partitioning can be implemented in PostgreSQL:

\n
    \n
  • Range Partitioning

    \n

    ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

    \n
  • \n
  • List Partitioning

    \n

    ​ The table is partitioned by explicitly listing which key values appear in each partition.

    \n
  • \n
\n

Implementing Partitioning

    \n
  1. Create the “master” / “parent” table, from which all the partitions will inherit.

    \n

    ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

    \n
  2. \n
  3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

    \n
  4. \n
  5. Add table constraints to the partition tables to define the allowed key values in each partitions.

    \n

    ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

    \n
  6. \n
  7. Create indexes on column(s) for each partitions.

    \n
  8. \n
  9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

    \n
  10. \n
  11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

    \n
  12. \n
\n

Trigger

As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

\n"},{"title":"Django Manager Method","date":"2016-04-24T16:00:01.000Z","_content":"\n\n\n#### Django Manager\n\nDjango 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。\n\neg.\n\n```python\nfrom django.db import models\n\nclass Person(models.Model):\n\t...\n\tpeople = models.Manager()\n```\n\n上面这个 model,`Person.objects`会产生一个`AttributeError`,但是`Person.people`就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。\n\n#### 自定义 Manager\n\n通常需要自定义 manager 的情况有两点:\n\n1. 需要修改/扩展 Django 的 manager 方法\n2. 需要修改返回的 QuerySet\n\n#### 默认 Manager\n\n如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。\n\n笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。\n\neg.\n\n```python\nclass Book(models.Model):\n\ttitle = models.CharField(max_length=100)\n\tauthor = models.CharField(max_length=50)\n\t\n\tobjects = models.Manager() # default manager\n\tcustom_objects = CustomBOokManager() # custom manager\n```\n\n\n\n[source](http://blog.csdn.net/sicofield/article/details/49283751)\n\n\n\n","source":"_posts/Django-Manager-Method.md","raw":"---\ntitle: Django Manager Method\ndate: 2016-04-25 00:00:01\n---\n\n\n\n#### Django Manager\n\nDjango 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。\n\neg.\n\n```python\nfrom django.db import models\n\nclass Person(models.Model):\n\t...\n\tpeople = models.Manager()\n```\n\n上面这个 model,`Person.objects`会产生一个`AttributeError`,但是`Person.people`就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。\n\n#### 自定义 Manager\n\n通常需要自定义 manager 的情况有两点:\n\n1. 需要修改/扩展 Django 的 manager 方法\n2. 需要修改返回的 QuerySet\n\n#### 默认 Manager\n\n如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。\n\n笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。\n\neg.\n\n```python\nclass Book(models.Model):\n\ttitle = models.CharField(max_length=100)\n\tauthor = models.CharField(max_length=50)\n\t\n\tobjects = models.Manager() # default manager\n\tcustom_objects = CustomBOokManager() # custom manager\n```\n\n\n\n[source](http://blog.csdn.net/sicofield/article/details/49283751)\n\n\n\n","slug":"Django-Manager-Method","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk52001bsubuwh45f7em","content":"

Django Manager

Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

\n

eg.

\n
1
2
3
4
5
from django.db import models

class Person(models.Model):
\t...
\tpeople = models.Manager()
\n

上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

\n

自定义 Manager

通常需要自定义 manager 的情况有两点:

\n
    \n
  1. 需要修改/扩展 Django 的 manager 方法
  2. \n
  3. 需要修改返回的 QuerySet
  4. \n
\n

默认 Manager

如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

\n

笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

\n

eg.

\n
1
2
3
4
5
6
class Book(models.Model):
\ttitle = models.CharField(max_length=100)
\tauthor = models.CharField(max_length=50)
\t
\tobjects = models.Manager() # default manager
\tcustom_objects = CustomBOokManager() # custom manager
\n

source

\n","site":{"data":{}},"excerpt":"","more":"

Django Manager

Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

\n

eg.

\n
1
2
3
4
5
from django.db import models

class Person(models.Model):
\t...
\tpeople = models.Manager()
\n

上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

\n

自定义 Manager

通常需要自定义 manager 的情况有两点:

\n
    \n
  1. 需要修改/扩展 Django 的 manager 方法
  2. \n
  3. 需要修改返回的 QuerySet
  4. \n
\n

默认 Manager

如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

\n

笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

\n

eg.

\n
1
2
3
4
5
6
class Book(models.Model):
\ttitle = models.CharField(max_length=100)
\tauthor = models.CharField(max_length=50)
\t
\tobjects = models.Manager() # default manager
\tcustom_objects = CustomBOokManager() # custom manager
\n

source

\n"},{"title":"Flask Day 1","date":"2016-02-14T17:23:33.000Z","_content":"\n### \"Hello World\" in Flask\n\nCreate a folder named `microblog` (or whatever you want). Then cd into that folder and run following prompt in terminal:\n\n``` bash\n$ python3 -m venv flask\n```\n\nNow you'll have a folder named `flask` inside `microblog`, containing a private version of Python interpreter.\n\nAnd you should install **flask** and extensions by the commands below:\n\n``` bash\n$ flask/bin/pip install flask\n$ flask/bin/pip install flask-login\n$ flask/bin/pip install flask-openid\n$ flask/bin/pip install flask-mail\n$ flask/bin/pip install flask-sqlalchemy\n$ flask/bin/pip install sqlalchemy-migrate\n$ flask/bin/pip install flask-whooshalchemy\n$ flask/bin/pip install flask-wtf\n$ flask/bin/pip install flask-babel\n$ flask/bin/pip install guess_language\n$ flask/bin/pip install flipflop\n$ flask/bin/pip install coverage\n```\n\nAfter that, let's create the basic structure for our application: `app` `app/static` `app/templates` `tmp`.\n\n1. `app` — where the application package is\n2. `static` — stores static files like images, javascripts, and css.\n3. `templates` — where templates will go.\n\nThen you can start with ``__init__.py`` which should put into app folder (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nThe views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.\n\nLet's see what a views function looks like (file `app/views.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nFinally we should create a script to starts up the web server with our application(file `run.py`):\n\n``` python\n#!flask/bin/python\nfrom app import app\napp.run(debug=True)\n```\n\nTo indicating that is an executable file you need to run this in terminal:\n\n``` bash\n$ chmod a+x run.py\n```\n\nNow the file structure should look like:\n\n``` \n microblog\\\n flask\\\n \n app\\\n static\\\n templates\\\n __init__.py\n views.py\n tmp\\\n run.py\n```\n\nThen start to write the template (file `app/templates/index.html`):\n\n``` html\n\n \n \n {{ title }} - microblog\n \n \n \n

Hello, {{ user.nickname }}!

\n \n \n\n```\n\nNow let's write the view function that uses this template (file `app/views.py`):\n\n``` python\nfrom flask import render_template\nfrom app import app\n\n@app.route('/')\n@app.route('/index')\ndef index():\n user = {'nickname': 'ching'} # fake user\n return render_template('index.html',\n title='Home',\n user=user)\n```\n\n`render_template` function is what we import from Flask framework to render the template. It uses [Jinja2](http://jinja.pocoo.org/) templating engine.\n\n","source":"_posts/Flask-Day-1.md","raw":"---\ntitle: Flask Day 1\ndate: 2016-02-15 01:23:33\n---\n\n### \"Hello World\" in Flask\n\nCreate a folder named `microblog` (or whatever you want). Then cd into that folder and run following prompt in terminal:\n\n``` bash\n$ python3 -m venv flask\n```\n\nNow you'll have a folder named `flask` inside `microblog`, containing a private version of Python interpreter.\n\nAnd you should install **flask** and extensions by the commands below:\n\n``` bash\n$ flask/bin/pip install flask\n$ flask/bin/pip install flask-login\n$ flask/bin/pip install flask-openid\n$ flask/bin/pip install flask-mail\n$ flask/bin/pip install flask-sqlalchemy\n$ flask/bin/pip install sqlalchemy-migrate\n$ flask/bin/pip install flask-whooshalchemy\n$ flask/bin/pip install flask-wtf\n$ flask/bin/pip install flask-babel\n$ flask/bin/pip install guess_language\n$ flask/bin/pip install flipflop\n$ flask/bin/pip install coverage\n```\n\nAfter that, let's create the basic structure for our application: `app` `app/static` `app/templates` `tmp`.\n\n1. `app` — where the application package is\n2. `static` — stores static files like images, javascripts, and css.\n3. `templates` — where templates will go.\n\nThen you can start with ``__init__.py`` which should put into app folder (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nThe views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.\n\nLet's see what a views function looks like (file `app/views.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\nfrom app import views\n```\n\nFinally we should create a script to starts up the web server with our application(file `run.py`):\n\n``` python\n#!flask/bin/python\nfrom app import app\napp.run(debug=True)\n```\n\nTo indicating that is an executable file you need to run this in terminal:\n\n``` bash\n$ chmod a+x run.py\n```\n\nNow the file structure should look like:\n\n``` \n microblog\\\n flask\\\n \n app\\\n static\\\n templates\\\n __init__.py\n views.py\n tmp\\\n run.py\n```\n\nThen start to write the template (file `app/templates/index.html`):\n\n``` html\n\n \n \n {{ title }} - microblog\n \n \n \n

Hello, {{ user.nickname }}!

\n \n \n\n```\n\nNow let's write the view function that uses this template (file `app/views.py`):\n\n``` python\nfrom flask import render_template\nfrom app import app\n\n@app.route('/')\n@app.route('/index')\ndef index():\n user = {'nickname': 'ching'} # fake user\n return render_template('index.html',\n title='Home',\n user=user)\n```\n\n`render_template` function is what we import from Flask framework to render the template. It uses [Jinja2](http://jinja.pocoo.org/) templating engine.\n\n","slug":"Flask-Day-1","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk52001dsubuwkxumfmo","content":"

“Hello World” in Flask

Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

\n
1
$ python3 -m venv flask
\n

Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

\n

And you should install flask and extensions by the commands below:

\n
1
2
3
4
5
6
7
8
9
10
11
12
$ flask/bin/pip install flask
$ flask/bin/pip install flask-login
$ flask/bin/pip install flask-openid
$ flask/bin/pip install flask-mail
$ flask/bin/pip install flask-sqlalchemy
$ flask/bin/pip install sqlalchemy-migrate
$ flask/bin/pip install flask-whooshalchemy
$ flask/bin/pip install flask-wtf
$ flask/bin/pip install flask-babel
$ flask/bin/pip install guess_language
$ flask/bin/pip install flipflop
$ flask/bin/pip install coverage
\n

After that, let’s create the basic structure for our application: app app/static app/templates tmp.

\n
    \n
  1. app — where the application package is
  2. \n
  3. static — stores static files like images, javascripts, and css.
  4. \n
  5. templates — where templates will go.
  6. \n
\n

Then you can start with __init__.py which should put into app folder (file app/__init__.py):

\n
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
\n

The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

\n

Let’s see what a views function looks like (file app/views.py):

\n
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
\n

Finally we should create a script to starts up the web server with our application(file run.py):

\n
1
2
3
#!flask/bin/python
from app import app
app.run(debug=True)
\n

To indicating that is an executable file you need to run this in terminal:

\n
1
$ chmod a+x run.py
\n

Now the file structure should look like:

\n
1
2
3
4
5
6
7
8
9
10
microblog\\
flask\\
<virtual environment files>
app\\
static\\
templates\\
__init__.py
views.py
tmp\\
run.py
\n

Then start to write the template (file app/templates/index.html):

\n
1
2
3
4
5
6
7
8
9
10
11
<html>

<head>
<title>{{ title }} - microblog</title>
</head>

<body>
<h1>Hello, {{ user.nickname }}!</h1>
</body>

</html>
\n

Now let’s write the view function that uses this template (file app/views.py):

\n
1
2
3
4
5
6
7
8
9
10
from flask import render_template
from app import app

@app.route('/')
@app.route('/index')
def index():
user = {'nickname': 'ching'} # fake user
return render_template('index.html',
title='Home',
user=user)
\n

render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

\n","site":{"data":{}},"excerpt":"","more":"

“Hello World” in Flask

Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

\n
1
$ python3 -m venv flask
\n

Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

\n

And you should install flask and extensions by the commands below:

\n
1
2
3
4
5
6
7
8
9
10
11
12
$ flask/bin/pip install flask
$ flask/bin/pip install flask-login
$ flask/bin/pip install flask-openid
$ flask/bin/pip install flask-mail
$ flask/bin/pip install flask-sqlalchemy
$ flask/bin/pip install sqlalchemy-migrate
$ flask/bin/pip install flask-whooshalchemy
$ flask/bin/pip install flask-wtf
$ flask/bin/pip install flask-babel
$ flask/bin/pip install guess_language
$ flask/bin/pip install flipflop
$ flask/bin/pip install coverage
\n

After that, let’s create the basic structure for our application: app app/static app/templates tmp.

\n
    \n
  1. app — where the application package is
  2. \n
  3. static — stores static files like images, javascripts, and css.
  4. \n
  5. templates — where templates will go.
  6. \n
\n

Then you can start with __init__.py which should put into app folder (file app/__init__.py):

\n
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
\n

The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

\n

Let’s see what a views function looks like (file app/views.py):

\n
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
\n

Finally we should create a script to starts up the web server with our application(file run.py):

\n
1
2
3
#!flask/bin/python
from app import app
app.run(debug=True)
\n

To indicating that is an executable file you need to run this in terminal:

\n
1
$ chmod a+x run.py
\n

Now the file structure should look like:

\n
1
2
3
4
5
6
7
8
9
10
microblog\\
flask\\
<virtual environment files>
app\\
static\\
templates\\
__init__.py
views.py
tmp\\
run.py
\n

Then start to write the template (file app/templates/index.html):

\n
1
2
3
4
5
6
7
8
9
10
11
<html>

<head>
<title>{{ title }} - microblog</title>
</head>

<body>
<h1>Hello, {{ user.nickname }}!</h1>
</body>

</html>
\n

Now let’s write the view function that uses this template (file app/views.py):

\n
1
2
3
4
5
6
7
8
9
10
from flask import render_template
from app import app

@app.route('/')
@app.route('/index')
def index():
user = {'nickname': 'ching'} # fake user
return render_template('index.html',
title='Home',
user=user)
\n

render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

\n"},{"title":"Flask Day 2","date":"2016-02-16T14:45:06.000Z","_content":"\nTo handle web forms we use [Flask-WTF\t](http://packages.python.org/Flask-WTF). So we need to write a config file (file `config.py`):\n\n``` python\nWTF_CSRF_ENABLED = True\nSECRET_KEY = 'you-will-never-guess'\n```\n\nAnd then you need to use this config (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\napp.config.from_object('config')\n\nfrom app import views\n```\n\nLet's build a simple form (file `app/forms.app`):\n\n``` python\nfrom flask.ext.wtf import Form\nfrom wtforms import StringField, BooleanField\nfrom wtforms.validators import DataRequired\n\nclass LoginForm(Form):\n openid = StringField('openid', validators=[DataRequired()])\n remember_me = BooleanField('remember_me', default=False)\n```\n\nThe `DataRequired()` is a validator that checks the field is empty or not.\n\nAfter that, we need a HTML page to show the form (file `app/templates/login.html`):\n\n``` html\n\n{% extends \"base.html\" %}\n\n{% block content %}\n

Sign In

\n
\n {{ form.hidden_tag() }}\n

\n Please enter your OpenID:
\n {{ form.openid(size=80) }}
\n

\n

{{ form.remember_me }} Remember Me

\n

\n
\n{% endblock %}\n```\n\n\n\nThe final step is to code a view function that renders the template and receiving data from form (file `app/views.py`):\n\n``` python\nfrom flask import render_template, flash, redirect\nfrom app import app\nfrom .forms import LoginForm\n\n# index view function suppressed for brevity\n\napp.route('/login', methods=['GET', 'POST'])\ndef login():\n form = LoginForm()\n if form.validate_on_submit():\n flash('Login requested for OpenID=\"%s\", remember_me=%s' %\n (form.openid.data, str(form.remember_me.data)))\n return redirect('/index')\n return render_template('login.html', \n title='Sign In',\n form=form)\n```\n\n","source":"_posts/Flask-Day-2.md","raw":"---\ntitle: Flask Day 2\ndate: 2016-02-16 22:45:06\n---\n\nTo handle web forms we use [Flask-WTF\t](http://packages.python.org/Flask-WTF). So we need to write a config file (file `config.py`):\n\n``` python\nWTF_CSRF_ENABLED = True\nSECRET_KEY = 'you-will-never-guess'\n```\n\nAnd then you need to use this config (file `app/__init__.py`):\n\n``` python\nfrom flask import Flask\n\napp = Flask(__name__)\napp.config.from_object('config')\n\nfrom app import views\n```\n\nLet's build a simple form (file `app/forms.app`):\n\n``` python\nfrom flask.ext.wtf import Form\nfrom wtforms import StringField, BooleanField\nfrom wtforms.validators import DataRequired\n\nclass LoginForm(Form):\n openid = StringField('openid', validators=[DataRequired()])\n remember_me = BooleanField('remember_me', default=False)\n```\n\nThe `DataRequired()` is a validator that checks the field is empty or not.\n\nAfter that, we need a HTML page to show the form (file `app/templates/login.html`):\n\n``` html\n\n{% extends \"base.html\" %}\n\n{% block content %}\n

Sign In

\n
\n {{ form.hidden_tag() }}\n

\n Please enter your OpenID:
\n {{ form.openid(size=80) }}
\n

\n

{{ form.remember_me }} Remember Me

\n

\n
\n{% endblock %}\n```\n\n\n\nThe final step is to code a view function that renders the template and receiving data from form (file `app/views.py`):\n\n``` python\nfrom flask import render_template, flash, redirect\nfrom app import app\nfrom .forms import LoginForm\n\n# index view function suppressed for brevity\n\napp.route('/login', methods=['GET', 'POST'])\ndef login():\n form = LoginForm()\n if form.validate_on_submit():\n flash('Login requested for OpenID=\"%s\", remember_me=%s' %\n (form.openid.data, str(form.remember_me.data)))\n return redirect('/index')\n return render_template('login.html', \n title='Sign In',\n form=form)\n```\n\n","slug":"Flask-Day-2","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk53001fsubukfg8z46w","content":"

To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

\n
1
2
WTF_CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
\n

And then you need to use this config (file app/__init__.py):

\n
1
2
3
4
5
6
from flask import Flask

app = Flask(__name__)
app.config.from_object('config')

from app import views
\n

Let’s build a simple form (file app/forms.app):

\n
1
2
3
4
5
6
7
from flask.ext.wtf import Form
from wtforms import StringField, BooleanField
from wtforms.validators import DataRequired

class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default=False)
\n

The DataRequired() is a validator that checks the field is empty or not.

\n

After that, we need a HTML page to show the form (file app/templates/login.html):

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- extend from base layout -->
{% extends \"base.html\" %}

{% block content %}
<h1>Sign In</h1>
<form action=\"\" method=\"post\" name=\"login\">
{{ form.hidden_tag() }}
<p>
Please enter your OpenID:<br>
{{ form.openid(size=80) }}<br>
</p>
<p>{{ form.remember_me }} Remember Me</p>
<p><input type=\"submit\" value=\"Sign In\"></p>
</form>
{% endblock %}
\n

The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import render_template, flash, redirect
from app import app
from .forms import LoginForm

# index view function suppressed for brevity

app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID=\"%s\", remember_me=%s' %
(form.openid.data, str(form.remember_me.data)))
return redirect('/index')
return render_template('login.html',
title='Sign In',
form=form)
\n","site":{"data":{}},"excerpt":"","more":"

To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

\n
1
2
WTF_CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
\n

And then you need to use this config (file app/__init__.py):

\n
1
2
3
4
5
6
from flask import Flask

app = Flask(__name__)
app.config.from_object('config')

from app import views
\n

Let’s build a simple form (file app/forms.app):

\n
1
2
3
4
5
6
7
from flask.ext.wtf import Form
from wtforms import StringField, BooleanField
from wtforms.validators import DataRequired

class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default=False)
\n

The DataRequired() is a validator that checks the field is empty or not.

\n

After that, we need a HTML page to show the form (file app/templates/login.html):

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- extend from base layout -->
{% extends \"base.html\" %}

{% block content %}
<h1>Sign In</h1>
<form action=\"\" method=\"post\" name=\"login\">
{{ form.hidden_tag() }}
<p>
Please enter your OpenID:<br>
{{ form.openid(size=80) }}<br>
</p>
<p>{{ form.remember_me }} Remember Me</p>
<p><input type=\"submit\" value=\"Sign In\"></p>
</form>
{% endblock %}
\n

The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

\n
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import render_template, flash, redirect
from app import app
from .forms import LoginForm

# index view function suppressed for brevity

app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID=\"%s\", remember_me=%s' %
(form.openid.data, str(form.remember_me.data)))
return redirect('/index')
return render_template('login.html',
title='Sign In',
form=form)
\n"},{"title":"Tastypie","date":"2016-05-04T04:02:00.000Z","_content":"\n#### Resources in Tastypie\n\nResources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.\n\n\n\nUnderstanding the process of creating a resource.\n\n1. Import ModelResource from Tastypie.\n2. Import models from services app\n3. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. \n\nAdd API URL in the urls.py of app.\n\n\n\n#### Dehydrating the JSON data\n\n![flow](https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800)\n\n\n\nDehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.\n\n##### Dehydrate_field method\n\nThis `dehydrate_field` is uesd to modify field on the response JSON. \n\n##### Dehydrate method\n\nDehydrate method is useful for aadding additional fields to bundle (response data). \n\nSimilarly using `hydrate` method we can alter the bundle data which is generated from request at the time of PUT or POST methods.","source":"_posts/Tastypie.md","raw":"---\ntitle: Tastypie\ndate: 2016-05-04 12:02:00\n---\n\n#### Resources in Tastypie\n\nResources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.\n\n\n\nUnderstanding the process of creating a resource.\n\n1. Import ModelResource from Tastypie.\n2. Import models from services app\n3. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. \n\nAdd API URL in the urls.py of app.\n\n\n\n#### Dehydrating the JSON data\n\n![flow](https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800)\n\n\n\nDehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.\n\n##### Dehydrate_field method\n\nThis `dehydrate_field` is uesd to modify field on the response JSON. \n\n##### Dehydrate method\n\nDehydrate method is useful for aadding additional fields to bundle (response data). \n\nSimilarly using `hydrate` method we can alter the bundle data which is generated from request at the time of PUT or POST methods.","slug":"Tastypie","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk54001hsubuesca2vhc","content":"

Resources in Tastypie

Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

\n

Understanding the process of creating a resource.

\n
    \n
  1. Import ModelResource from Tastypie.
  2. \n
  3. Import models from services app
  4. \n
  5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
  6. \n
\n

Add API URL in the urls.py of app.

\n

Dehydrating the JSON data

\"flow\"

\n

Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

\n
Dehydrate_field method

This dehydrate_field is uesd to modify field on the response JSON.

\n
Dehydrate method

Dehydrate method is useful for aadding additional fields to bundle (response data).

\n

Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

\n","site":{"data":{}},"excerpt":"","more":"

Resources in Tastypie

Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

\n

Understanding the process of creating a resource.

\n
    \n
  1. Import ModelResource from Tastypie.
  2. \n
  3. Import models from services app
  4. \n
  5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
  6. \n
\n

Add API URL in the urls.py of app.

\n

Dehydrating the JSON data

\"flow\"

\n

Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

\n
Dehydrate_field method

This dehydrate_field is uesd to modify field on the response JSON.

\n
Dehydrate method

Dehydrate method is useful for aadding additional fields to bundle (response data).

\n

Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

\n"},{"title":"First Post","date":"2016-02-12T10:00:00.000Z","_content":"\nThis is the very first post I wrote,\n\nwith [Typora](https://www.typora.io/) & [Hexo](https://hexo.io/).\n\n","source":"_posts/first-post.md","raw":"---\ntitle: First Post\ndate: 2016-02-12 18:00:00\n---\n\nThis is the very first post I wrote,\n\nwith [Typora](https://www.typora.io/) & [Hexo](https://hexo.io/).\n\n","slug":"first-post","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk55001isubut7gdk8uj","content":"

This is the very first post I wrote,

\n

with Typora & Hexo.

\n","site":{"data":{}},"excerpt":"","more":"

This is the very first post I wrote,

\n

with Typora & Hexo.

\n"},{"title":"TastyPie Note 1","date":"2016-05-10T09:00:00.000Z","_content":"\n### Flow Through The Request/Response Cycle\n\nTastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.\n\nWalking through what a GET request to a list endpoint looks like:\n\n- The `Resource.urls` are checked by Django's url resolvers.\n\n- On a match for the list view, `Resource.wrap_view('dispatch_list')` is called. `wrap_view` provides basic error handling & allows for returning serilized errors.\n\n- Because dispatch_list was passed to `wrap_view`, `Resource.dispatch_list` is called next. This is a thin wrapper around `Resource.dispatch`.\n\n- `dispatch` does a bunch of havy lifting. It ensures:\n\n - the requested HTTP method is in `allowed_methos` (`method_check`).\n - the class has a method that can handle the request(`get_list`)\n - the user is authenticated(`is_authenticated`)\n - the user has no exceeded their throttle(`throttle_check`).\n\n At this point, `dispatch` actually calls the requested method (`get_list`).\n\n- `get_list` does the actual work of API. It does:\n\n - A fetch of the available objects via `Resource.obj_get_list`. In the case of `ModelResource`, this builds the ORM filters to apply (`ModelResource.build_filters`). It then gets the `QuerySet` via `ModelResource.get_object_list` (which performs `Resource.authorized_read_list` to possibly limit the set the user can work with) and applies the built filters to it.\n - It then sorts the objects based on user input (`ModelResource.apply_sorting`).\n - Then it paginates the results using the supplied `Paginator` & pulls out the data to be serialized.\n - The objects in the page have `full_dehydrate` applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.\n - Finally, it calls `Resource.create_response`.\n\n- `create_response` is a shortcut method that:\n\n - Determines the desired response format (`Resource.determine_format`).\n - Serializes the data given to it in the proper format.\n - Returns a Django `HttpResponse` (200 OK) with the serialized data.\n\n- We bubble back up the call stack to `dispatch`. The last thing `dispatch` does is potentially store that a request occured for future throttling (`Resource.log_throttled_access`) then either returns the `HttpResponse` or wraps whatever data came back in a response (so Django doesn't freak out).\n\n\n\n","source":"_posts/TastyPie-Note-1.md","raw":"---\ntitle: TastyPie Note 1\ndate: 2016-05-10 17:00:00\n---\n\n### Flow Through The Request/Response Cycle\n\nTastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.\n\nWalking through what a GET request to a list endpoint looks like:\n\n- The `Resource.urls` are checked by Django's url resolvers.\n\n- On a match for the list view, `Resource.wrap_view('dispatch_list')` is called. `wrap_view` provides basic error handling & allows for returning serilized errors.\n\n- Because dispatch_list was passed to `wrap_view`, `Resource.dispatch_list` is called next. This is a thin wrapper around `Resource.dispatch`.\n\n- `dispatch` does a bunch of havy lifting. It ensures:\n\n - the requested HTTP method is in `allowed_methos` (`method_check`).\n - the class has a method that can handle the request(`get_list`)\n - the user is authenticated(`is_authenticated`)\n - the user has no exceeded their throttle(`throttle_check`).\n\n At this point, `dispatch` actually calls the requested method (`get_list`).\n\n- `get_list` does the actual work of API. It does:\n\n - A fetch of the available objects via `Resource.obj_get_list`. In the case of `ModelResource`, this builds the ORM filters to apply (`ModelResource.build_filters`). It then gets the `QuerySet` via `ModelResource.get_object_list` (which performs `Resource.authorized_read_list` to possibly limit the set the user can work with) and applies the built filters to it.\n - It then sorts the objects based on user input (`ModelResource.apply_sorting`).\n - Then it paginates the results using the supplied `Paginator` & pulls out the data to be serialized.\n - The objects in the page have `full_dehydrate` applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.\n - Finally, it calls `Resource.create_response`.\n\n- `create_response` is a shortcut method that:\n\n - Determines the desired response format (`Resource.determine_format`).\n - Serializes the data given to it in the proper format.\n - Returns a Django `HttpResponse` (200 OK) with the serialized data.\n\n- We bubble back up the call stack to `dispatch`. The last thing `dispatch` does is potentially store that a request occured for future throttling (`Resource.log_throttled_access`) then either returns the `HttpResponse` or wraps whatever data came back in a response (so Django doesn't freak out).\n\n\n\n","slug":"TastyPie-Note-1","published":1,"updated":"2018-05-15T14:58:35.000Z","comments":1,"layout":"post","photos":[],"link":"","_id":"ck99fqk55001jsubuwea2oyll","content":"

Flow Through The Request/Response Cycle

Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

\n

Walking through what a GET request to a list endpoint looks like:

\n
    \n
  • The Resource.urls are checked by Django’s url resolvers.

    \n
  • \n
  • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

    \n
  • \n
  • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

    \n
  • \n
  • dispatch does a bunch of havy lifting. It ensures:

    \n
      \n
    • the requested HTTP method is in allowed_methos (method_check).
    • \n
    • the class has a method that can handle the request(get_list)
    • \n
    • the user is authenticated(is_authenticated)
    • \n
    • the user has no exceeded their throttle(throttle_check).
    • \n
    \n

    At this point, dispatch actually calls the requested method (get_list).

    \n
  • \n
  • get_list does the actual work of API. It does:

    \n
      \n
    • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
    • \n
    • It then sorts the objects based on user input (ModelResource.apply_sorting).
    • \n
    • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
    • \n
    • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
    • \n
    • Finally, it calls Resource.create_response.
    • \n
    \n
  • \n
  • create_response is a shortcut method that:

    \n
      \n
    • Determines the desired response format (Resource.determine_format).
    • \n
    • Serializes the data given to it in the proper format.
    • \n
    • Returns a Django HttpResponse (200 OK) with the serialized data.
    • \n
    \n
  • \n
  • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

    \n
  • \n
\n","site":{"data":{}},"excerpt":"","more":"

Flow Through The Request/Response Cycle

Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

\n

Walking through what a GET request to a list endpoint looks like:

\n
    \n
  • The Resource.urls are checked by Django’s url resolvers.

    \n
  • \n
  • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

    \n
  • \n
  • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

    \n
  • \n
  • dispatch does a bunch of havy lifting. It ensures:

    \n
      \n
    • the requested HTTP method is in allowed_methos (method_check).
    • \n
    • the class has a method that can handle the request(get_list)
    • \n
    • the user is authenticated(is_authenticated)
    • \n
    • the user has no exceeded their throttle(throttle_check).
    • \n
    \n

    At this point, dispatch actually calls the requested method (get_list).

    \n
  • \n
  • get_list does the actual work of API. It does:

    \n
      \n
    • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
    • \n
    • It then sorts the objects based on user input (ModelResource.apply_sorting).
    • \n
    • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
    • \n
    • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
    • \n
    • Finally, it calls Resource.create_response.
    • \n
    \n
  • \n
  • create_response is a shortcut method that:

    \n
      \n
    • Determines the desired response format (Resource.determine_format).
    • \n
    • Serializes the data given to it in the proper format.
    • \n
    • Returns a Django HttpResponse (200 OK) with the serialized data.
    • \n
    \n
  • \n
  • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

    \n
  • \n
\n"}],"PostAsset":[],"PostCategory":[{"post_id":"ck99fqk4c0004subueeqgf7uv","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4g0008subum8bi5yy7"},{"post_id":"ck99fqk450000subu0lleqph1","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4h000asubur95psr19"},{"post_id":"ck99fqk4d0005subutkoz8ewr","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4i000csubu5besjv4j"},{"post_id":"ck99fqk4e0006subugxejhq3n","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4k000esubuf0s2w57y"},{"post_id":"ck99fqk4f0007subugdeybnq7","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4m000gsubu2arb3a1i"},{"post_id":"ck99fqk4g0009subu00ew2ar1","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4n000isububuqku9dk"},{"post_id":"ck99fqk4h000bsubu68ng98xy","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4o000ksubug8jthkif"},{"post_id":"ck99fqk4i000dsubujxdgfcfh","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4p000msubu7h6jk5hd"},{"post_id":"ck99fqk4m000fsubu530zs4nj","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4q000osubum3njs7uo"},{"post_id":"ck99fqk4n000hsubu5guv78od","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4r000qsubumvevrma1"},{"post_id":"ck99fqk4o000jsubub8g0257f","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4s000ssubui455cch9"},{"post_id":"ck99fqk4p000lsubu6henmdmq","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4t000usubuqhjcb82b"},{"post_id":"ck99fqk4q000nsubuw1s0x6b6","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4v000wsubu51z3nnu6"},{"post_id":"ck99fqk4r000psubu38qpnnv7","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4v000ysubuusbadjsl"},{"post_id":"ck99fqk4s000rsubusdeyspgy","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4w0010subuxxknx1yv"},{"post_id":"ck99fqk4t000tsubuyl29244j","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4x0012subub22ede3m"},{"post_id":"ck99fqk4u000vsubuzq7vic3v","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4y0014sububzo3o42i"},{"post_id":"ck99fqk4v000xsubu9bmmz6rr","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk4z0016subu9ps93wal"},{"post_id":"ck99fqk4w000zsubuceivn0ao","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk500018subu54ngjaza"},{"post_id":"ck99fqk4x0011subuv9wxy1bt","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk51001asubufr4etkmp"},{"post_id":"ck99fqk4y0013subufp1wokx0","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk52001csubu04fhrgz4"},{"post_id":"ck99fqk4y0015subub2p4shuv","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk53001esubuv5io60ug"},{"post_id":"ck99fqk500017subu3v0ql53e","category_id":"ck99fqk4a0002subunok11hn6","_id":"ck99fqk54001gsubuqay6zjd5"}],"PostTag":[],"Tag":[]}} \ No newline at end of file diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..51bd73ab00f71bf70ea8918b9da9177a558be02b GIT binary patch literal 493592 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

VD420T)I$rh^d9G#fT)*KE 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 R_|ox>fAx>oetK~6?*O<8nXCW+ literal 0 HcmV?d00001 diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..b2d5d3c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,11685 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "lockfileVersion": 1, + "requires": true, + "dependencies": { + "JSONStream": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/JSONStream/download/JSONStream-1.3.2.tgz", + "integrity": "sha1-wQI3G27Dp887hHygDCC7D85Mbeo=", + "requires": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "a-sync-waterfall": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/a-sync-waterfall/download/a-sync-waterfall-1.0.0.tgz", + "integrity": "sha1-OOgxnXk3niRiiEW1O5ZyKyng5Hw=" + }, + "abab": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/abab/download/abab-1.0.4.tgz", + "integrity": "sha1-X6rZwsB/YN12dw9xzwJbYqY8/U4=", + "optional": true + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", + "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + }, + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", + "optional": true + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npm.taobao.org/acorn-globals/download/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "optional": true, + "requires": { + "acorn": "^2.1.0" + } + }, + "ajv": { + "version": "5.5.2", + "resolved": "https://registry.npm.taobao.org/ajv/download/ajv-5.5.2.tgz", + "integrity": "sha1-c7Xuyj+rZT49P5Qis0GtQiBdyWU=", + "optional": true, + "requires": { + "co": "^4.6.0", + "fast-deep-equal": "^1.0.0", + "fast-json-stable-stringify": "^2.0.0", + "json-schema-traverse": "^0.3.0" + } + }, + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + } + }, + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", + "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + }, + "ansi-styles": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz", + "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "requires": { + "color-convert": "^1.9.0" + } + }, + "anymatch": { + "version": "1.3.2", + "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz", + "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "requires": { + "micromatch": "^2.1.5", + "normalize-path": "^2.0.0" + } + }, + "aproba": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz", + "integrity": "sha512-Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==" + }, + "archy": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/archy/download/archy-1.0.0.tgz", + "integrity": "sha1-+cjBN1fMHde8N5rHeyxipcKGjEA=" + }, + "are-we-there-yet": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz", + "integrity": "sha512-5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==", + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "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==" + }, + "readable-stream": { + "version": "2.3.6", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz", + "integrity": "sha512-tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~2.0.0", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.1.1", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", + "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "argparse": { + "version": "1.0.9", + "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.9.tgz", + "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "requires": { + "sprintf-js": "~1.0.2" + } + }, + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/arr-diff/download/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + } + }, + "arr-flatten": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/arr-flatten/download/arr-flatten-1.1.0.tgz", + "integrity": "sha1-NgSLv/TntH4TZkQxbJlmnqWukfE=" + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/array-unique/download/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/asap/download/asap-2.0.6.tgz", + "integrity": "sha1-5QNHYR1+aQlDIIu9r+vLwvuGbUY=" + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/asn1/download/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "optional": true + }, + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/assert-plus/download/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + }, + "async": { + "version": "0.2.10", + "resolved": "https://registry.npm.taobao.org/async/download/async-0.2.10.tgz", + "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + }, + "async-each": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz", + "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "aws-sign2": { + "version": "0.7.0", + "resolved": "https://registry.npm.taobao.org/aws-sign2/download/aws-sign2-0.7.0.tgz", + "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg=", + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npm.taobao.org/aws4/download/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "optional": 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=", + "requires": { + "chalk": "^1.1.3", + "esutils": "^2.0.2", + "js-tokens": "^3.0.2" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "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.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "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.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "babel-messages": { + "version": "6.23.0", + "resolved": "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz", + "integrity": "sha1-8830cDhYA1sqKVHG7F7fbGLyYw4=", + "requires": { + "babel-runtime": "^6.22.0" + } + }, + "babel-plugin-syntax-decorators": { + "version": "6.13.0", + "resolved": "https://registry.npmjs.org/babel-plugin-syntax-decorators/-/babel-plugin-syntax-decorators-6.13.0.tgz", + "integrity": "sha1-MSVjtNvePMgGzuPkFszurd0RrAs=" + }, + "babel-plugin-transform-decorators-legacy": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/babel-plugin-transform-decorators-legacy/-/babel-plugin-transform-decorators-legacy-1.3.5.tgz", + "integrity": "sha512-jYHwjzRXRelYQ1uGm353zNzf3QmtdCfvJbuYTZ4gKveK7M9H1fs3a5AKdY1JUDl0z97E30ukORW1dzhWvsabtA==", + "requires": { + "babel-plugin-syntax-decorators": "^6.1.18", + "babel-runtime": "^6.2.0", + "babel-template": "^6.3.0" + } + }, + "babel-polyfill": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz", + "integrity": "sha1-N5k3q8Z9eJWXCtxiHyhM2WbPIVM=", + "requires": { + "babel-runtime": "^6.26.0", + "core-js": "^2.5.0", + "regenerator-runtime": "^0.10.5" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + }, + "regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha1-M2w+/BIgrc7dosn6tntaeVWjNlg=" + } + } + }, + "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.4.0", + "regenerator-runtime": "^0.11.0" + }, + "dependencies": { + "core-js": { + "version": "2.6.11", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz", + "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==" + } + } + }, + "babel-template": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz", + "integrity": "sha1-3gPi0WOWsGn0bdn/+FIfsaDjXgI=", + "requires": { + "babel-runtime": "^6.26.0", + "babel-traverse": "^6.26.0", + "babel-types": "^6.26.0", + "babylon": "^6.18.0", + "lodash": "^4.17.4" + } + }, + "babel-traverse": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz", + "integrity": "sha1-RqnL1+3MYsjlwGTi0tjQ9ANXZu4=", + "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.8", + "globals": "^9.18.0", + "invariant": "^2.2.2", + "lodash": "^4.17.4" + } + }, + "babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=", + "requires": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "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==" + }, + "balanced-match": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/balanced-match/download/balanced-match-1.0.0.tgz", + "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=" + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/bcrypt-pbkdf/download/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "binary-extensions": { + "version": "1.11.0", + "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.11.0.tgz", + "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + }, + "bluebird": { + "version": "3.5.1", + "resolved": "https://registry.npm.taobao.org/bluebird/download/bluebird-3.5.1.tgz", + "integrity": "sha1-2VUfnemPH82h5oPRfukaBgLuLrk=" + }, + "boolbase": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/boolbase/download/boolbase-1.0.0.tgz", + "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=" + }, + "boom": { + "version": "4.3.1", + "resolved": "https://registry.npm.taobao.org/boom/download/boom-4.3.1.tgz", + "integrity": "sha1-T4owBctKfjiJ90kDD9JbluAdLjE=", + "optional": true, + "requires": { + "hoek": "4.x.x" + } + }, + "brace-expansion": { + "version": "1.1.8", + "resolved": "https://registry.npm.taobao.org/brace-expansion/download/brace-expansion-1.1.8.tgz", + "integrity": "sha1-wHshHHyVLsH479Uad+8NHTmQopI=", + "requires": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "braces": { + "version": "1.8.5", + "resolved": "https://registry.npm.taobao.org/braces/download/braces-1.8.5.tgz", + "integrity": "sha1-uneWLhLf+WnWt2cR6RS3N4V79qc=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + } + }, + "browser-fingerprint": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/browser-fingerprint/download/browser-fingerprint-0.0.1.tgz", + "integrity": "sha1-jfPNyiW/fVs1QtYVRdcwBT/OYEo=" + }, + "camel-case": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", + "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "requires": { + "no-case": "^2.2.0", + "upper-case": "^1.1.1" + } + }, + "camelcase": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-2.1.1.tgz", + "integrity": "sha1-fB0W1nmhu+WcoCys7PsBHiAfWh8=" + }, + "canvas": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/canvas/-/canvas-2.4.0.tgz", + "integrity": "sha512-+xxeaKwQJyXHBdMhVhqFoGqNAAUW5vr2DbhQEusER2RR4H2m+Zn2QLKiwp43BabNhQBITQ3bp54+DYrGrI+wmA==", + "requires": { + "nan": "^2.12.1", + "node-pre-gyp": "^0.11.0" + }, + "dependencies": { + "nan": { + "version": "2.13.1", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.1.tgz", + "integrity": "sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==" + } + } + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + } + }, + "chalk": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-2.3.0.tgz", + "integrity": "sha1-tepI78nBeT3MybR2fJORTT8tUro=", + "requires": { + "ansi-styles": "^3.1.0", + "escape-string-regexp": "^1.0.5", + "supports-color": "^4.0.0" + } + }, + "cheerio": { + "version": "0.20.0", + "resolved": "https://registry.npm.taobao.org/cheerio/download/cheerio-0.20.0.tgz", + "integrity": "sha1-XHEPK6uVZTJyhCugHG6mGzVF7DU=", + "requires": { + "css-select": "~1.2.0", + "dom-serializer": "~0.1.0", + "entities": "~1.1.1", + "htmlparser2": "~3.8.1", + "jsdom": "^7.0.2", + "lodash": "^4.1.0" + } + }, + "chokidar": { + "version": "1.7.0", + "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz", + "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^1.0.0", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + } + }, + "chownr": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz", + "integrity": "sha512-j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==" + }, + "cliui": { + "version": "3.2.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-3.2.0.tgz", + "integrity": "sha1-EgYBU3qRbSmUD5NNo7SNWFo5IT0=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wrap-ansi": "^2.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npm.taobao.org/co/download/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "optional": true + }, + "code-point-at": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/code-point-at/download/code-point-at-1.1.0.tgz", + "integrity": "sha1-DQcLTQQ6W+ozovGkDi7bPZpMz3c=" + }, + "color-convert": { + "version": "1.9.1", + "resolved": "https://registry.npm.taobao.org/color-convert/download/color-convert-1.9.1.tgz", + "integrity": "sha1-wSYRB66y8pTr/+ye2eytUppgl+0=", + "requires": { + "color-name": "^1.1.1" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", + "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/combined-stream/download/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "command-exists": { + "version": "1.2.2", + "resolved": "https://registry.npm.taobao.org/command-exists/download/command-exists-1.2.2.tgz", + "integrity": "sha1-EoGcZPr5VEbsCuB/5sr7brNwiyI=" + }, + "commander": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", + "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/concat-map/download/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + }, + "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=" + }, + "core-decorators": { + "version": "0.11.2", + "resolved": "https://registry.npmjs.org/core-decorators/-/core-decorators-0.11.2.tgz", + "integrity": "sha1-GyQzFZQa598a8938tX3+6mPIsXE=" + }, + "core-js": { + "version": "1.2.7", + "resolved": "https://registry.npm.taobao.org/core-js/download/core-js-1.2.7.tgz", + "integrity": "sha1-ZSKUwUZR2yj6k70tX/KYOk8IxjY=" + }, + "core-util-is": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/core-util-is/download/core-util-is-1.0.2.tgz", + "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" + }, + "cross-spawn": { + "version": "4.0.2", + "resolved": "https://registry.npm.taobao.org/cross-spawn/download/cross-spawn-4.0.2.tgz", + "integrity": "sha1-e5JHYhwjrf3ThWAEqCPL45dCTUE=", + "requires": { + "lru-cache": "^4.0.1", + "which": "^1.2.9" + } + }, + "cryptiles": { + "version": "3.1.2", + "resolved": "https://registry.npm.taobao.org/cryptiles/download/cryptiles-3.1.2.tgz", + "integrity": "sha1-qJ+7Ig9c4l7FboxKqKT9e1sNKf4=", + "optional": true, + "requires": { + "boom": "5.x.x" + }, + "dependencies": { + "boom": { + "version": "5.2.0", + "resolved": "https://registry.npm.taobao.org/boom/download/boom-5.2.0.tgz", + "integrity": "sha1-XdnabuOl8wIHdDYpDLcX0/SlTgI=", + "optional": true, + "requires": { + "hoek": "4.x.x" + } + } + } + }, + "css-select": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/css-select/download/css-select-1.2.0.tgz", + "integrity": "sha1-KzoRBTnFNV8c2NMUYj6HCxIeyFg=", + "requires": { + "boolbase": "~1.0.0", + "css-what": "2.1", + "domutils": "1.5.1", + "nth-check": "~1.0.1" + } + }, + "css-what": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/css-what/download/css-what-2.1.0.tgz", + "integrity": "sha1-lGfQMsOM+u+58teVASUwYvh/ob0=" + }, + "cssom": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/cssom/download/cssom-0.3.2.tgz", + "integrity": "sha1-uANhcMefB6kP8vFuIihAJ6JDhIs=", + "optional": true + }, + "cssstyle": { + "version": "0.2.37", + "resolved": "https://registry.npm.taobao.org/cssstyle/download/cssstyle-0.2.37.tgz", + "integrity": "sha1-VBCXI0yyUTyDzu06zdwn/yeYfVQ=", + "optional": true, + "requires": { + "cssom": "0.3.x" + } + }, + "cuid": { + "version": "1.3.8", + "resolved": "https://registry.npm.taobao.org/cuid/download/cuid-1.3.8.tgz", + "integrity": "sha1-S4deCWm612T37AcGz0T1+wgx9rc=", + "requires": { + "browser-fingerprint": "0.0.1", + "core-js": "^1.1.1", + "node-fingerprint": "0.0.2" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npm.taobao.org/dashdash/download/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/decamelize/download/decamelize-1.2.0.tgz", + "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=" + }, + "deep-extend": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", + "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==" + }, + "deep-is": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/deep-is/download/deep-is-0.1.3.tgz", + "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=", + "optional": true + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/delayed-stream/download/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=" + }, + "detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha1-+hN8S9aY7fVc1c0CrFWfkaTEups=" + }, + "dom-serializer": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/dom-serializer/download/dom-serializer-0.1.0.tgz", + "integrity": "sha1-BzxpdUbOB4DOI75KKOKT5AvDDII=", + "requires": { + "domelementtype": "~1.1.1", + "entities": "~1.1.1" + }, + "dependencies": { + "domelementtype": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.1.3.tgz", + "integrity": "sha1-vSh3PiZCiBrsUVRJJCmcXNgiGFs=" + } + } + }, + "domelementtype": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.0.tgz", + "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + }, + "domhandler": { + "version": "2.3.0", + "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.3.0.tgz", + "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "requires": { + "domelementtype": "1" + } + }, + "domutils": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz", + "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "requires": { + "dom-serializer": "0", + "domelementtype": "1" + } + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/ecc-jsbn/download/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "entities": { + "version": "1.1.1", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.1.1.tgz", + "integrity": "sha1-blwtClYhtdra7O+AuQ7ftc13cvA=" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npm.taobao.org/escape-string-regexp/download/escape-string-regexp-1.0.5.tgz", + "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=" + }, + "escodegen": { + "version": "1.9.0", + "resolved": "https://registry.npm.taobao.org/escodegen/download/escodegen-1.9.0.tgz", + "integrity": "sha1-mBGi8mXcHNOJRCDuNxcGS2MriFI=", + "optional": true, + "requires": { + "esprima": "^3.1.3", + "estraverse": "^4.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.5.6" + } + }, + "esm": { + "version": "3.2.25", + "resolved": "https://registry.npmjs.org/esm/-/esm-3.2.25.tgz", + "integrity": "sha512-U1suiZ2oDVWv4zPO56S0NcR5QriEahGtdN2OR6FiOG4WJvcjBVFB0qI4+eKoWFH483PKGuLuu6V8Z4T5g63UVA==" + }, + "esprima": { + "version": "3.1.3", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-3.1.3.tgz", + "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=", + "optional": true + }, + "estraverse": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/estraverse/download/estraverse-4.2.0.tgz", + "integrity": "sha1-De4/7TH81GlhjOc0IJn8GvoL2xM=", + "optional": true + }, + "esutils": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/esutils/download/esutils-2.0.2.tgz", + "integrity": "sha1-Cr9PHKpbyx96nYrMbepPqqBLrJs=" + }, + "expand-brackets": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/expand-brackets/download/expand-brackets-0.1.5.tgz", + "integrity": "sha1-3wcoTjQqgHzXM6xa9yQR5YHRF3s=", + "requires": { + "is-posix-bracket": "^0.1.0" + } + }, + "expand-range": { + "version": "1.8.2", + "resolved": "https://registry.npm.taobao.org/expand-range/download/expand-range-1.8.2.tgz", + "integrity": "sha1-opnv/TNf4nIeuujiV+x5ZE/IUzc=", + "requires": { + "fill-range": "^2.1.0" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/extend/download/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "optional": true + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/extglob/download/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "extsprintf": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/extsprintf/download/extsprintf-1.3.0.tgz", + "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU=", + "optional": true + }, + "fast-deep-equal": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/fast-deep-equal/download/fast-deep-equal-1.0.0.tgz", + "integrity": "sha1-liVqO8l1WV6zbYLpkp0GDYk0Of8=", + "optional": true + }, + "fast-json-stable-stringify": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/fast-json-stable-stringify/download/fast-json-stable-stringify-2.0.0.tgz", + "integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I=", + "optional": true + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npm.taobao.org/fast-levenshtein/download/fast-levenshtein-2.0.6.tgz", + "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=", + "optional": true + }, + "filename-regex": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/filename-regex/download/filename-regex-2.0.1.tgz", + "integrity": "sha1-wcS5vuPglyXdsQa3XB4wH+LxiyY=" + }, + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npm.taobao.org/fill-range/download/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + } + }, + "for-in": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/for-in/download/for-in-1.0.2.tgz", + "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=" + }, + "for-own": { + "version": "0.1.5", + "resolved": "https://registry.npm.taobao.org/for-own/download/for-own-0.1.5.tgz", + "integrity": "sha1-UmXGgaTylNq78XyVCbZ2OqhFEM4=", + "requires": { + "for-in": "^1.0.1" + } + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/forever-agent/download/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "2.3.1", + "resolved": "https://registry.npm.taobao.org/form-data/download/form-data-2.3.1.tgz", + "integrity": "sha1-b7lPvXGIUwbXPRXMSX/kzE7NRL8=", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs-minipass": { + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.5.tgz", + "integrity": "sha512-JhBl0skXjUPCFH7x6x61gQxrKyXsxB5gcgePLZCwfyCGGsTISMoIeObbrvVeP6Xmyaudw4TT43qV2Gz+iyd2oQ==", + "requires": { + "minipass": "^2.2.1" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" + }, + "fsevents": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/fsevents/download/fsevents-1.1.3.tgz", + "integrity": "sha1-EfgjGPX+e7LNIpZaEI6TBiCCFtg=", + "optional": true, + "requires": { + "nan": "^2.3.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=", + "optional": true + }, + "ajv": { + "version": "4.11.8", + "resolved": "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz", + "integrity": "sha1-gv+wKynmYq5TvcIK8VlHcGc5xTY=", + "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=", + "optional": true + }, + "aproba": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/aproba/-/aproba-1.1.1.tgz", + "integrity": "sha1-ldNgDwdxCqDpKYxyatXs8urLq6s=", + "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=", + "optional": true, + "requires": { + "delegates": "^1.0.0", + "readable-stream": "^2.0.6" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "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=", + "optional": true + }, + "asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true + }, + "aws4": { + "version": "1.6.0", + "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.6.0.tgz", + "integrity": "sha1-g+9cqGCysy5KDe7e6MdxudtXRx4=", + "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=", + "optional": true + }, + "bcrypt-pbkdf": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.1.tgz", + "integrity": "sha1-Y7xdy2EzG5K8Bf1SiVPDNGKgb40=", + "optional": true, + "requires": { + "tweetnacl": "^0.14.3" + } + }, + "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=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "brace-expansion": { + "version": "1.1.7", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.7.tgz", + "integrity": "sha1-Pv/DxQ4ABTH7cg6v+A8K6O8jz1k=", + "optional": true, + "requires": { + "balanced-match": "^0.4.1", + "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=", + "optional": true + }, + "caseless": { + "version": "0.12.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz", + "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", + "optional": true + }, + "co": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", + "integrity": "sha1-bqa989hTrlTMuOR7+gvz+QMfsYQ=", + "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=", + "optional": true + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "optional": 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=", + "optional": 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=", + "optional": 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=", + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.14.1", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz", + "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=", + "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=", + "optional": true + } + } + }, + "debug": { + "version": "2.6.8", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.8.tgz", + "integrity": "sha1-5zFTHKLt4n0YgiJCfaF4IdaP9Pw=", + "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=", + "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=", + "optional": true + }, + "delegates": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz", + "integrity": "sha1-hMbhWbgZBP3KWaDvRM2HDTElD5o=", + "optional": true + }, + "detect-libc": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.2.tgz", + "integrity": "sha1-ca1dIEvxempsqPRQxhRUBm70YeE=", + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "extend": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.1.tgz", + "integrity": "sha1-p1Xqe8Gt/MWjHOfnYtuq3F5jZEQ=", + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "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=", + "optional": true, + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.12" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=", + "optional": true + }, + "fstream": { + "version": "1.0.11", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.11.tgz", + "integrity": "sha1-XB+x8RdHcRTwYyoOtLcbPLD9MXE=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.5.tgz", + "integrity": "sha1-nDHa40dnAY/h0kmyTa2mfQktoQU=", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "optional": true, + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "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=", + "optional": true + } + } + }, + "glob": { + "version": "7.1.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz", + "integrity": "sha512-MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==", + "optional": true, + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^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=", + "optional": 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=", + "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=", + "optional": true, + "requires": { + "ajv": "^4.9.1", + "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=", + "optional": true + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "optional": 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=", + "optional": true, + "requires": { + "assert-plus": "^0.2.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=", + "optional": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "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=", + "optional": true, + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=", + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "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=", + "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=", + "optional": true + }, + "jsonify": { + "version": "0.0.0", + "resolved": "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz", + "integrity": "sha1-LHS27kHZPKUbe1qu6PUDYx0lKnM=", + "optional": true + }, + "jsprim": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.0.tgz", + "integrity": "sha1-o7h+QCmNjDgFUtjMdiigu5WiKRg=", + "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=", + "optional": true + } + } + }, + "mime-db": { + "version": "1.27.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.27.0.tgz", + "integrity": "sha1-gg9XIpa70g7CXtVeW13oaeVDbrE=", + "optional": true + }, + "mime-types": { + "version": "2.1.15", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.15.tgz", + "integrity": "sha1-pOv1BkCUVpI3uM9wBGd20J/JKu0=", + "optional": 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==", + "optional": 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=", + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": 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=", + "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==", + "optional": true, + "requires": { + "detect-libc": "^1.0.2", + "hawk": "3.1.3", + "mkdirp": "^0.5.1", + "nopt": "^4.0.1", + "npmlog": "^4.0.2", + "rc": "^1.1.7", + "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=", + "optional": true, + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "npmlog": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.0.tgz", + "integrity": "sha512-ocolIkZYZt8UveuiDS0yAkkIjid1o7lPG8cYm05yNYzBn8ykQtaiPMEGp8fY9tKdDgm8okpdKzkvu1y9hUYugA==", + "optional": true, + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "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=", + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "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=", + "optional": true + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "optional": true, + "requires": { + "wrappy": "1" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=", + "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=", + "optional": true + }, + "osenv": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.4.tgz", + "integrity": "sha1-Qv5tWVPfBsgGS+bxdsPQWqqjRkQ=", + "optional": true, + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "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=", + "optional": true + }, + "performance-now": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz", + "integrity": "sha1-M+8wxcd9TqIcWlOGnZG1bY8lVeU=", + "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=", + "optional": true + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "optional": true + }, + "qs": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz", + "integrity": "sha1-E+JtKK1rD/qpExLNO/cI7TUecjM=", + "optional": true + }, + "rc": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.1.tgz", + "integrity": "sha1-LgPo5C7kULjLPc5lvhv4l04d/ZU=", + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "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=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.2.9", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.2.9.tgz", + "integrity": "sha1-z3jsb0ptHrQ9JkiMrJfwQudLf8g=", + "optional": true, + "requires": { + "buffer-shims": "~1.0.0", + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "string_decoder": "~1.0.0", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.81.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.81.0.tgz", + "integrity": "sha1-xpKJRqDgbF+Nb4qTM0af/aRimKA=", + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "aws4": "^1.2.1", + "caseless": "~0.12.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~2.1.1", + "har-validator": "~4.2.1", + "hawk": "~3.1.3", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "oauth-sign": "~0.8.1", + "performance-now": "^0.2.0", + "qs": "~6.4.0", + "safe-buffer": "^5.0.1", + "stringstream": "~0.0.4", + "tough-cookie": "~2.3.0", + "tunnel-agent": "^0.6.0", + "uuid": "^3.0.0" + } + }, + "rimraf": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.1.tgz", + "integrity": "sha1-wjOOxkPfeht/5cVPqG9XQopV8z0=", + "optional": true, + "requires": { + "glob": "^7.0.5" + } + }, + "safe-buffer": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.0.1.tgz", + "integrity": "sha1-0mPKVGls2KMGtcplUekt5XkY++c=", + "optional": true + }, + "semver": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz", + "integrity": "sha1-myzl094C0XxgEq0yaqa00M9U+U8=", + "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=", + "optional": true + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=", + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.13.0", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.13.0.tgz", + "integrity": "sha1-/yo+T9BEl1Vf7Zezmg/YL6+zozw=", + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jodid25519": "^1.0.0", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + }, + "dependencies": { + "assert-plus": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz", + "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU=", + "optional": true + } + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "optional": true, + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + } + }, + "string_decoder": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.1.tgz", + "integrity": "sha1-YuIA8DmVWmgQ2N8KM//A8BNmLZg=", + "optional": 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=", + "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=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "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=", + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.4.0", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.4.0.tgz", + "integrity": "sha1-I74tf2cagzk3bL2wuP4/3r8xeYQ=", + "optional": true, + "requires": { + "debug": "^2.2.0", + "fstream": "^1.0.10", + "fstream-ignore": "^1.0.5", + "once": "^1.3.3", + "readable-stream": "^2.1.4", + "rimraf": "^2.5.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=", + "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=", + "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=", + "optional": true + }, + "uid-number": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.6.tgz", + "integrity": "sha1-DqEOgDXo61uOREnwbaHHMGY7qoE=", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "uuid": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.0.1.tgz", + "integrity": "sha1-ZUS7ot/ajBzxfmKaOjBeK7H+5sE=", + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "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==", + "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=", + "optional": true + } + } + }, + "gauge": { + "version": "2.7.4", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", + "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "requires": { + "aproba": "^1.0.3", + "console-control-strings": "^1.0.0", + "has-unicode": "^2.0.0", + "object-assign": "^4.1.0", + "signal-exit": "^3.0.0", + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1", + "wide-align": "^1.1.0" + }, + "dependencies": { + "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.0.0" + } + } + } + }, + "getpass": { + "version": "0.1.7", + "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", + "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0" + } + }, + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/glob-base/download/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/glob-parent/download/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "globals": { + "version": "9.18.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz", + "integrity": "sha512-S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==" + }, + "graceful-fs": { + "version": "4.1.11", + "resolved": "https://registry.npm.taobao.org/graceful-fs/download/graceful-fs-4.1.11.tgz", + "integrity": "sha1-Dovf5NHduIVNZOBOp8AOKgJuVlg=" + }, + "har-schema": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/har-schema/download/har-schema-2.0.0.tgz", + "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI=", + "optional": true + }, + "har-validator": { + "version": "5.0.3", + "resolved": "https://registry.npm.taobao.org/har-validator/download/har-validator-5.0.3.tgz", + "integrity": "sha1-ukAsJmGU8VlW7xXg/PJCmT9qff0=", + "optional": true, + "requires": { + "ajv": "^5.1.0", + "har-schema": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/has-ansi/download/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-flag": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/has-flag/download/has-flag-2.0.0.tgz", + "integrity": "sha1-6CB68cx7MNRGzHC3NLXovhj4jVE=" + }, + "has-unicode": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz", + "integrity": "sha1-4Ob+aijPUROIVeCG0Wkedx3iqLk=" + }, + "hawk": { + "version": "6.0.2", + "resolved": "https://registry.npm.taobao.org/hawk/download/hawk-6.0.2.tgz", + "integrity": "sha1-r02RTrBl+bXOTZ0RwcshJu7MMDg=", + "optional": true, + "requires": { + "boom": "4.x.x", + "cryptiles": "3.x.x", + "hoek": "4.x.x", + "sntp": "2.x.x" + } + }, + "hexo": { + "version": "3.5.0", + "resolved": "https://registry.npm.taobao.org/hexo/download/hexo-3.5.0.tgz", + "integrity": "sha1-haJys25ce/6jVx7KBkkQ7RvBLI8=", + "requires": { + "abbrev": "^1.0.7", + "archy": "^1.0.0", + "bluebird": "^3.4.0", + "chalk": "^2.3.0", + "cheerio": "^0.20.0", + "hexo-cli": "^1.0.2", + "hexo-front-matter": "^0.2.2", + "hexo-fs": "^0.2.0", + "hexo-i18n": "^0.2.1", + "hexo-log": "^0.2.0", + "hexo-util": "^0.6.0", + "js-yaml": "^3.6.1", + "lodash": "^4.13.1", + "minimatch": "^3.0.4", + "moment": "^2.19.4", + "moment-timezone": "^0.5.14", + "nunjucks": "^3.0.1", + "pretty-hrtime": "^1.0.2", + "strip-ansi": "^4.0.0", + "strip-indent": "^2.0.0", + "swig-extras": "0.0.1", + "swig-templates": "^2.0.2", + "text-table": "^0.2.0", + "tildify": "^1.2.0", + "titlecase": "^1.1.2", + "warehouse": "^2.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "hexo-cli": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/hexo-cli/download/hexo-cli-1.0.4.tgz", + "integrity": "sha1-yPFCHsJCCdj/x7/upJarmfNBkeE=", + "requires": { + "abbrev": "^1.0.7", + "bluebird": "^3.4.0", + "chalk": "^1.1.3", + "command-exists": "^1.2.0", + "hexo-fs": "^0.2.0", + "hexo-log": "^0.2.0", + "hexo-util": "^0.6.0", + "minimist": "^1.2.0", + "object-assign": "^4.1.0", + "tildify": "^1.2.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "hexo-browsersync": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hexo-browsersync/-/hexo-browsersync-0.2.0.tgz", + "integrity": "sha1-HmwRSgbAqWS/ADPdEXWmQwe2eNg=", + "requires": { + "bluebird": "^2.9.4", + "browser-sync": "^2.0.1", + "connect-injector": "^0.4.2", + "merge": "^1.2.0" + }, + "dependencies": { + "bluebird": { + "version": "2.10.2", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-2.10.2.tgz", + "integrity": "sha1-AkpVFylTCIV/FPkfEQb8O1VfRGs=" + }, + "browser-sync": { + "version": "2.11.1", + "resolved": "https://registry.npmjs.org/browser-sync/-/browser-sync-2.11.1.tgz", + "integrity": "sha1-Alzgd6nWLEoRHnyvD3u4yz9SBb4=", + "requires": { + "async-each-series": "^0.1.1", + "browser-sync-client": "^2.3.3", + "browser-sync-ui": "^0.5.16", + "bs-recipes": "^1.0.5", + "chokidar": "1.4.1", + "connect": "^3.4.0", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.1", + "eazy-logger": "^2.1.2", + "emitter-steward": "^1.0.0", + "foxy": "^11.1.2", + "fs-extra": "^0.26.2", + "immutable": "^3.7.4", + "localtunnel": "^1.7.0", + "lodash": "^3.9.3", + "longest": "^1.0.1", + "meow": "3.3.0", + "micromatch": "2.3.5", + "opn": "^3.0.2", + "portscanner": "^1.0.0", + "query-string": "^2.4.0", + "resp-modifier": "^5.0.0", + "serve-index": "^1.7.0", + "serve-static": "^1.10.0", + "socket.io": "1.3.7", + "ua-parser-js": "^0.7.9", + "ucfirst": "^1.0.0" + }, + "dependencies": { + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha1-dhfBkXQB/Yykooqtzj266Yr+tDI=" + }, + "browser-sync-client": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/browser-sync-client/-/browser-sync-client-2.4.1.tgz", + "integrity": "sha1-xy36igsY8hnJ5JCDGHGZgPUdCrk=", + "requires": { + "etag": "^1.7.0", + "fresh": "^0.3.0" + }, + "dependencies": { + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + } + } + }, + "browser-sync-ui": { + "version": "0.5.18", + "resolved": "https://registry.npmjs.org/browser-sync-ui/-/browser-sync-ui-0.5.18.tgz", + "integrity": "sha1-rXi0NyAYjqHAP/3RQb5kzmyDlgk=", + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1.1.0", + "immutable": "^3.7.6", + "stream-throttle": "^0.1.3", + "weinre": "^2.0.0-pre-I0Z7U9OV" + }, + "dependencies": { + "connect-history-api-fallback": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/connect-history-api-fallback/-/connect-history-api-fallback-1.1.0.tgz", + "integrity": "sha1-Wm3ugtmmSMspEx0/ndQA/6RZN0I=" + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha1-rdV8jXzHOoFjDTHNVdOWHPr7qcM=", + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "dependencies": { + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": ">= 1.0.0" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + } + } + }, + "limiter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/limiter/-/limiter-1.1.0.tgz", + "integrity": "sha1-bivRLKP82qEfIk4uU8iW3z8I2RM=" + } + } + }, + "weinre": { + "version": "2.0.0-pre-I0Z7U9OV", + "resolved": "https://registry.npmjs.org/weinre/-/weinre-2.0.0-pre-I0Z7U9OV.tgz", + "integrity": "sha1-/viqIjkh97QLu71MPtQwL2/QqBM=", + "requires": { + "express": "2.5.x", + "nopt": "3.0.x", + "underscore": "1.7.x" + }, + "dependencies": { + "express": { + "version": "2.5.11", + "resolved": "https://registry.npmjs.org/express/-/express-2.5.11.tgz", + "integrity": "sha1-TOjqHzY15p5J8Ou0l7aksKUc5vA=", + "requires": { + "connect": "1.x", + "mime": "1.2.4", + "mkdirp": "0.3.0", + "qs": "0.4.x" + }, + "dependencies": { + "connect": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-1.9.2.tgz", + "integrity": "sha1-QogKIulDiuWait105Df1iujlKAc=", + "requires": { + "formidable": "1.0.x", + "mime": ">= 0.0.1", + "qs": ">= 0.4.0" + }, + "dependencies": { + "formidable": { + "version": "1.0.17", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-1.0.17.tgz", + "integrity": "sha1-71SRSQ+UM7cF+qdyScmQKa40hVk=" + } + } + }, + "mime": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.2.4.tgz", + "integrity": "sha1-EbX9rynCUJJVF2uArVIClPXekrc=" + }, + "mkdirp": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.0.tgz", + "integrity": "sha1-G79asbqCevI1dRQ0kEJkVfSB/h4=" + }, + "qs": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/qs/-/qs-0.4.2.tgz", + "integrity": "sha1-PKxMhh43GoycR3CsI82o3mObjl8=" + } + } + }, + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "requires": { + "abbrev": "1" + }, + "dependencies": { + "abbrev": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", + "integrity": "sha1-W2A1su6dT7XPhZ8Iqb6BsghJGEM=" + } + } + }, + "underscore": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz", + "integrity": "sha1-a7rwh3UA02vjTsqlhODbn+8DUgk=" + } + } + } + } + }, + "bs-recipes": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/bs-recipes/-/bs-recipes-1.0.5.tgz", + "integrity": "sha1-sSy6lRhqHjfq6446ysw1wwx1VsY=" + }, + "chokidar": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.4.1.tgz", + "integrity": "sha1-3x2QZ2lwGg899JLDfcw8s15kUOQ=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^0.1.6", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "requires": { + "arrify": "^1.0.0", + "micromatch": "^2.1.5" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + } + } + }, + "async-each": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz", + "integrity": "sha1-tn6Z7c3fllQeRK9WKQzX1cbnBDk=" + }, + "fsevents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.7.tgz", + "integrity": "sha1-LZBYW7ysn/U1/xoalLBOu1CAhY8=", + "optional": true, + "requires": { + "nan": "^2.1.0", + "node-pre-gyp": "^0.6.19" + }, + "dependencies": { + "ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz", + "integrity": "sha1-dLLx8YfIVTx/lQFby3YAn7Q9OOA=", + "optional": true + }, + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", + "optional": true + }, + "ansi-styles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", + "integrity": "sha1-mQ90cUaSe1Wakyv5KVkWPWDA0OI=", + "optional": true + }, + "are-we-there-yet": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.5.tgz", + "integrity": "sha1-I58mcG2pAqK/+3LDPeZv39N5isU=", + "optional": true, + "requires": { + "delegates": "^0.1.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "optional": true + }, + "async": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.1.tgz", + "integrity": "sha1-sFcU9LEbNXv3mtr/3QbaQtB2bBA=", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true + }, + "bl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "integrity": "sha1-ramoqJptesYIYvfex9sgeHPgw/U=", + "optional": true, + "requires": { + "readable-stream": "~2.0.0" + } + }, + "block-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz", + "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "optional": true + }, + "chalk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", + "optional": true, + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "optional": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "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=", + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.11.0.tgz", + "integrity": "sha1-ur04ktcatAOUjGornWX33hrOjpI=", + "optional": true, + "requires": { + "assert-plus": "0.1.x" + } + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "optional": true + }, + "deep-extend": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.0.tgz", + "integrity": "sha1-9YtG21jrXWQ5zdDy5sr7Rzn8EoM=", + "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=", + "optional": true + }, + "delegates": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz", + "integrity": "sha1-tLV74RoWU1F6BLJ/CUm9wyff45A=", + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=", + "optional": true + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=", + "optional": true, + "requires": { + "async": "^1.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.3" + } + }, + "fstream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", + "integrity": "sha1-fo16c6uzZH7zbkuKFcqAHboD0Dg=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.3.tgz", + "integrity": "sha1-THTZH6iLIrQvT4ahiigg3XnY/N0=", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + } + } + }, + "gauge": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "integrity": "sha1-BbZzChmo/K08NAoULwlFIio/gVs=", + "optional": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^1.0.0", + "lodash.pad": "^3.0.0", + "lodash.padleft": "^3.0.0", + "lodash.padright": "^3.0.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "optional": 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=", + "optional": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz", + "integrity": "sha1-/iI5t1dJcuZ+QfgIgj+b+kqZHjc=", + "optional": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "optional": true + }, + "har-validator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.3.tgz", + "integrity": "sha1-Wp4SVkpXHPC4Hvk8IVe9FhcWiIM=", + "optional": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.3", + "pinkie-promise": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-unicode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz", + "integrity": "sha1-xG/O6gU+uOx4m/+7ol/KUt/c844=", + "optional": true + }, + "hawk": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.tgz", + "integrity": "sha1-kMkBGIhuIZddGtSumz4oTtGaLeg=", + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "optional": true + }, + "http-signature": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.0.tgz", + "integrity": "sha1-XS1+m270mYCtWxKNjk7wmjHJDZU=", + "optional": true, + "requires": { + "assert-plus": "^0.1.5", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "optional": true + }, + "is-my-json-valid": { + "version": "2.12.3", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.tgz", + "integrity": "sha1-WjnR12stu4MUC70Vex1e5L3IWtY=", + "optional": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "2.0.0", + "xtend": "^4.0.0" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", + "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", + "optional": true + }, + "json-schema": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", + "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", + "optional": 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=", + "optional": true + }, + "jsonpointer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", + "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", + "optional": true + }, + "jsprim": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", + "integrity": "sha1-8gyQaskqvVjjt5rIvHCkiDJRLaE=", + "optional": true, + "requires": { + "extsprintf": "1.0.2", + "json-schema": "0.2.2", + "verror": "1.3.6" + } + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "optional": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "optional": true, + "requires": { + "lodash.repeat": "^3.0.0" + } + }, + "lodash.pad": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "integrity": "sha1-LgeOvDOzMdK6NL+HMq8Sn9XARiQ=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.padleft": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "integrity": "sha1-FQFR8eAkXtuhXVCvLXHx1c/0ZTA=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.padright": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "integrity": "sha1-efd3C6qjlzjAQK61Rl6NiPKqzsA=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + }, + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=", + "optional": true + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "optional": true, + "requires": { + "mime-db": "~1.21.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.19", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.19.tgz", + "integrity": "sha1-hCut/y6cQjxagX4Gj/6PhIfcEBY=", + "optional": true, + "requires": { + "mkdirp": "~0.5.0", + "nopt": "~3.0.1", + "npmlog": "~2.0.0", + "rc": "~1.1.0", + "request": "2.x", + "rimraf": "~2.5.0", + "semver": "~5.1.0", + "tar": "~2.2.0", + "tar-pack": "~3.1.0" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "requires": { + "abbrev": "1" + }, + "dependencies": { + "abbrev": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", + "integrity": "sha1-W2A1su6dT7XPhZ8Iqb6BsghJGEM=", + "optional": true + } + } + } + } + }, + "node-uuid": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", + "optional": true + }, + "npmlog": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.0.tgz", + "integrity": "sha1-QHbCAKPdpREz5vPPBSEwEF94u98=", + "optional": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, + "oauth-sign": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz", + "integrity": "sha1-k4/ch1dlulJxN9iuydF44k3rxVM=", + "optional": true + }, + "once": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz", + "integrity": "sha1-nbV0kzzLCMOnYU0VQDLAnqbzOec=", + "optional": true + }, + "pinkie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz", + "integrity": "sha1-QjbIb8KfJhwgRbvoH3jLsqXoMGw=", + "optional": true + }, + "pinkie-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", + "integrity": "sha1-TINTjeH25mDCngoTRGhE96foglk=", + "optional": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=", + "optional": true + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "optional": true + }, + "rc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", + "integrity": "sha1-Q2UbdrauU7XIAvEVH6P8OwWZack=", + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~1.0.4" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.67.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz", + "integrity": "sha1-ivdHgOK/EeoK6aqWXBHxGv0nJ0I=", + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "bl": "~1.0.0", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc3", + "har-validator": "~2.0.2", + "hawk": "~3.1.0", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.0", + "qs": "~5.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.2.0", + "tunnel-agent": "~0.4.1" + } + }, + "rimraf": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.0.tgz", + "integrity": "sha1-MMCWzfdy4mvz4dLP+EwhllQam7Y=", + "optional": true, + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.3.tgz", + "integrity": "sha1-XwLNiVh85YsVSuCFXeAqLmOYb8o=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "optional": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "optional": true + } + } + } + } + }, + "semver": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=", + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.2.tgz", + "integrity": "sha1-5etD0GYr0gEDcyftuLj2RlasqEI=", + "optional": true, + "requires": { + "asn1": ">=0.2.3 <0.3.0", + "assert-plus": ">=0.2.0 <0.3.0", + "dashdash": ">=1.10.1 <2.0.0", + "ecc-jsbn": ">=0.0.1 <1.0.0", + "jodid25519": ">=1.0.0 <2.0.0", + "jsbn": ">=0.1.0 <0.2.0", + "tweetnacl": ">=0.13.0 <1.0.0" + }, + "dependencies": { + "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=", + "optional": true + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "optional": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "optional": true + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "optional": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.2.tgz", + "integrity": "sha1-FfxXw3kji9NQ73sYKi4rr4Jv4Eg=", + "optional": true, + "requires": { + "debug": "~0.7.2", + "fstream": "~1.0.8", + "fstream-ignore": "~1.0.3", + "once": "~1.1.1", + "readable-stream": "~2.0.4", + "rimraf": "~2.4.4", + "tar": "~2.2.1", + "uid-number": "0.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.3.tgz", + "integrity": "sha1-XwLNiVh85YsVSuCFXeAqLmOYb8o=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "optional": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "optional": true + } + } + } + } + } + } + }, + "tough-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", + "integrity": "sha1-OwUWt5nnDoFkQ2oURuflh3/aEY4=", + "optional": true + }, + "tunnel-agent": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", + "integrity": "sha1-EQTj82rIcSXChycAZ9WC0YEzv+4=", + "optional": true + }, + "tweetnacl": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.2.tgz", + "integrity": "sha1-RTFhdwRp1FzSZsNkBOK8maj6mUQ=", + "optional": true + }, + "uid-number": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz", + "integrity": "sha1-zvsPoTjY2AmNpxpAoNBKgyfW4cw=", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "optional": true + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "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=", + "requires": { + "binary-extensions": "^1.0.0" + }, + "dependencies": { + "binary-extensions": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.4.0.tgz", + "integrity": "sha1-1zPMtiiYbXsybYhlbg3b06rDUbc=" + } + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" + }, + "readdirp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.0.tgz", + "integrity": "sha1-zAm6XRLY/rhkvHX24uvBNwYMvYI=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^2.0.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } + } + } + } + } + }, + "connect": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", + "integrity": "sha1-ohNh0/QJnvdhzabcSpc7seuwo00=", + "requires": { + "debug": "~2.2.0", + "finalhandler": "0.4.1", + "parseurl": "~1.3.1", + "utils-merge": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "finalhandler": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "requires": { + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + } + } + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha1-p2o+0YVb56ASu4rBbLgPPADcKPA=" + }, + "easy-extender": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/easy-extender/-/easy-extender-2.3.2.tgz", + "integrity": "sha1-PTJI/r4rFZYHMW2PnPSRwWZIIh0=", + "requires": { + "lodash": "^3.10.1" + } + }, + "eazy-logger": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/eazy-logger/-/eazy-logger-2.1.2.tgz", + "integrity": "sha1-eBfBQa6395LrwV77cD+uBQdYnC0=", + "requires": { + "lodash": "^3.0.1", + "opt-merger": "^1.1.0", + "tfunk": "^3.0.1" + }, + "dependencies": { + "opt-merger": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/opt-merger/-/opt-merger-1.1.1.tgz", + "integrity": "sha1-30mVcJlBKHqEZ/nOWO4Gv0pk/0E=", + "requires": { + "lodash": "^3.10.1", + "minimist": "^1.1.0" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + } + } + }, + "tfunk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/tfunk/-/tfunk-3.0.1.tgz", + "integrity": "sha1-RHLi6LlXVk+/QpyIkElS6yn+kXg=", + "requires": { + "chalk": "^0.5.1", + "object-path": "^0.9.0" + }, + "dependencies": { + "chalk": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz", + "integrity": "sha1-Zjs6ZItotV0EaQ1JFnqoN4WPIXQ=", + "requires": { + "ansi-styles": "^1.1.0", + "escape-string-regexp": "^1.0.0", + "has-ansi": "^0.1.0", + "strip-ansi": "^0.3.0", + "supports-color": "^0.2.0" + }, + "dependencies": { + "ansi-styles": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz", + "integrity": "sha1-6uy/Zs1waIJ2Cy9GkVgrj1XXp94=" + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + }, + "has-ansi": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz", + "integrity": "sha1-hPJlqujA5qiKEtcCKJS3VoiUxi4=", + "requires": { + "ansi-regex": "^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=" + } + } + }, + "strip-ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz", + "integrity": "sha1-JfSOoiynkYfzF0pNuHWTR7sSYiA=", + "requires": { + "ansi-regex": "^0.2.1" + }, + "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=" + } + } + }, + "supports-color": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz", + "integrity": "sha1-2S3iaU6z9nMjlz1649i1W0wiGQo=" + } + } + }, + "object-path": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/object-path/-/object-path-0.9.2.tgz", + "integrity": "sha1-D9mnT8X60a45aLWGvaXGMr1sBaU=" + } + } + } + } + }, + "emitter-steward": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/emitter-steward/-/emitter-steward-1.0.0.tgz", + "integrity": "sha1-80Ea3pdYp1Zd+Eiy2gy70bRsvWQ=" + }, + "foxy": { + "version": "11.1.4", + "resolved": "https://registry.npmjs.org/foxy/-/foxy-11.1.4.tgz", + "integrity": "sha1-iVxNmuU+5/XMRWuHKewARdVbX+w=", + "requires": { + "connect": "^3.3.5", + "dev-ip": "^1.0.1", + "eazy-logger": "^2.0.0", + "http-proxy": "^1.9.0", + "lodash.merge": "^3.3.1", + "meow": "^3.1.0", + "resp-modifier": "^4.0.2" + }, + "dependencies": { + "http-proxy": { + "version": "1.13.1", + "resolved": "https://registry.npmjs.org/http-proxy/-/http-proxy-1.13.1.tgz", + "integrity": "sha1-0+qlTw2NnURK4NlSPJQ5HLi9akM=", + "requires": { + "eventemitter3": "1.x.x", + "requires-port": "1.x.x" + }, + "dependencies": { + "eventemitter3": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-1.1.1.tgz", + "integrity": "sha1-R3hr2qCHyvext15zq8XH1UAVjNA=" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha1-kl0mAdOaxIXgkc8NpcbmlNw9yv8=" + } + } + }, + "lodash.merge": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-3.3.2.tgz", + "integrity": "sha1-DZDZPtY3sYeEN7s+IWASYNev6ZQ=", + "requires": { + "lodash._arraycopy": "^3.0.0", + "lodash._arrayeach": "^3.0.0", + "lodash._createassigner": "^3.0.0", + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0", + "lodash.isplainobject": "^3.0.0", + "lodash.istypedarray": "^3.0.0", + "lodash.keys": "^3.0.0", + "lodash.keysin": "^3.0.0", + "lodash.toplainobject": "^3.0.0" + }, + "dependencies": { + "lodash._arraycopy": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arraycopy/-/lodash._arraycopy-3.0.0.tgz", + "integrity": "sha1-due3wfH7klRzdIeKVi7Qaj5Q9uE=" + }, + "lodash._arrayeach": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash._arrayeach/-/lodash._arrayeach-3.0.0.tgz", + "integrity": "sha1-urFWsqkNPxu9XGU0AzSeXlkz754=" + }, + "lodash._createassigner": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash._createassigner/-/lodash._createassigner-3.1.1.tgz", + "integrity": "sha1-g4pbri/aymOsIt7o4Z+k5taXCxE=", + "requires": { + "lodash._bindcallback": "^3.0.0", + "lodash._isiterateecall": "^3.0.0", + "lodash.restparam": "^3.0.0" + }, + "dependencies": { + "lodash._bindcallback": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._bindcallback/-/lodash._bindcallback-3.0.1.tgz", + "integrity": "sha1-5THCdkTPi1epnhftlbNcdIeJOS4=" + }, + "lodash._isiterateecall": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash._isiterateecall/-/lodash._isiterateecall-3.0.9.tgz", + "integrity": "sha1-UgOte6Ql+uhCRg5pbbnPPmqsBXw=" + }, + "lodash.restparam": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash.restparam/-/lodash.restparam-3.6.1.tgz", + "integrity": "sha1-k2pOMJ7zMKdkXtQUWYbIWuWyCAU=" + } + } + }, + "lodash._getnative": { + "version": "3.9.1", + "resolved": "https://registry.npmjs.org/lodash._getnative/-/lodash._getnative-3.9.1.tgz", + "integrity": "sha1-VwvH3t5G1hzc3mh9ZdPuy6o6r/U=" + }, + "lodash.isarguments": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/lodash.isarguments/-/lodash.isarguments-3.0.6.tgz", + "integrity": "sha1-Xcr4VVs8zQr7FYErmBnsaMoJggY=" + }, + "lodash.isarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.isarray/-/lodash.isarray-3.0.4.tgz", + "integrity": "sha1-eeTriMNqgSKvhvhEqpvNhRtfu1U=" + }, + "lodash.isplainobject": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-3.2.0.tgz", + "integrity": "sha1-moI4rhayAEMpYM1zRlEtASP79MU=", + "requires": { + "lodash._basefor": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.keysin": "^3.0.0" + }, + "dependencies": { + "lodash._basefor": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash._basefor/-/lodash._basefor-3.0.3.tgz", + "integrity": "sha1-dVC06SGO8J+tJDQ7YSAhx5tMIMI=" + } + } + }, + "lodash.istypedarray": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/lodash.istypedarray/-/lodash.istypedarray-3.0.4.tgz", + "integrity": "sha1-+uW4B/7jyz8Zo903m6vKX1PNtt4=" + }, + "lodash.keys": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/lodash.keys/-/lodash.keys-3.1.2.tgz", + "integrity": "sha1-TbwEcrFWvlCgsoaFXRvQsMZWCYo=", + "requires": { + "lodash._getnative": "^3.0.0", + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.keysin": { + "version": "3.0.8", + "resolved": "https://registry.npmjs.org/lodash.keysin/-/lodash.keysin-3.0.8.tgz", + "integrity": "sha1-IsRJPrvtsUJ5YqVLRFssinZ/tH8=", + "requires": { + "lodash.isarguments": "^3.0.0", + "lodash.isarray": "^3.0.0" + } + }, + "lodash.toplainobject": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/lodash.toplainobject/-/lodash.toplainobject-3.0.0.tgz", + "integrity": "sha1-KHkK2ULSk9eKpmOgfs9/UsoEGY0=", + "requires": { + "lodash._basecopy": "^3.0.0", + "lodash.keysin": "^3.0.0" + }, + "dependencies": { + "lodash._basecopy": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basecopy/-/lodash._basecopy-3.0.1.tgz", + "integrity": "sha1-jaDmqHbPNEwK2KVIghEd08XHyjY=" + } + } + } + } + }, + "resp-modifier": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-4.0.4.tgz", + "integrity": "sha1-jZBcwYxAiUmlVO65yZt1/5zwo/o=", + "requires": { + "minimatch": "^2.0.1" + }, + "dependencies": { + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + } + } + } + } + }, + "fs-extra": { + "version": "0.26.5", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-0.26.5.tgz", + "integrity": "sha1-U6x0Znygg/0twXEsgTA5yjLWmn8=", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^2.1.0", + "klaw": "^1.0.0", + "path-is-absolute": "^1.0.0", + "rimraf": "^2.2.8" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" + }, + "jsonfile": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-2.2.3.tgz", + "integrity": "sha1-4lK5mmr5AdPsQfMyWJyQUJp7xgU=" + }, + "klaw": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/klaw/-/klaw-1.1.3.tgz", + "integrity": "sha1-faM8a0L5s9yc7ADRfxOvAX/MJyE=" + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" + }, + "rimraf": { + "version": "2.5.1", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.1.tgz", + "integrity": "sha1-UuHpRvP5ubDV2JiLoxkaryotvUM=", + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.4.tgz", + "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" + } + } + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=" + } + } + } + } + } + } + } + } + }, + "immutable": { + "version": "3.7.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-3.7.6.tgz", + "integrity": "sha1-E7TTyxK++hVIKib+Gy665kAHHks=" + }, + "localtunnel": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/localtunnel/-/localtunnel-1.8.1.tgz", + "integrity": "sha1-1Rsrt6cGavsFtX/J24RAFQmPLhc=", + "requires": { + "debug": "2.2.0", + "openurl": "1.1.0", + "request": "2.65.0", + "yargs": "3.29.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "openurl": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/openurl/-/openurl-1.1.0.tgz", + "integrity": "sha1-4vIYnZmcBIIyAfCD8PGnzYkDGHo=" + }, + "request": { + "version": "2.65.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.65.0.tgz", + "integrity": "sha1-zBo7xyuWJUc0/DQpbaMi+Uht3ro=", + "requires": { + "aws-sign2": "~0.6.0", + "bl": "~1.0.0", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc3", + "har-validator": "~2.0.2", + "hawk": "~3.1.0", + "http-signature": "~0.11.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.3", + "oauth-sign": "~0.8.0", + "qs": "~5.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.2.0", + "tunnel-agent": "~0.4.1" + }, + "dependencies": { + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=" + }, + "bl": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.3.tgz", + "integrity": "sha1-/FQhoo/UImA2w7OJGmaiW8ZNIm4=", + "requires": { + "readable-stream": "~2.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } + } + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=" + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "requires": { + "delayed-stream": "~1.0.0" + }, + "dependencies": { + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk=" + } + } + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=" + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=" + }, + "form-data": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=", + "requires": { + "async": "^1.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.3" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.2.tgz", + "integrity": "sha1-7GphrlZIDAw8skHJVhjiCJL5Zyo=" + } + } + }, + "har-validator": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.6.tgz", + "integrity": "sha1-zcvAgYgmWtEZtqWnyKtw7s+10n0=", + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.4", + "pinkie-promise": "^2.0.0" + }, + "dependencies": { + "chalk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", + "integrity": "sha1-mQ90cUaSe1Wakyv5KVkWPWDA0OI=" + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + }, + "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.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "requires": { + "graceful-readlink": ">= 1.0.0" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + } + } + }, + "is-my-json-valid": { + "version": "2.12.4", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.4.tgz", + "integrity": "sha1-1O0rwdf4ja+ND3Y7Pj45ppvTeIA=", + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "2.0.0", + "xtend": "^4.0.0" + }, + "dependencies": { + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=" + }, + "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=", + "requires": { + "is-property": "^1.0.0" + }, + "dependencies": { + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=" + } + } + }, + "jsonpointer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", + "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=" + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=" + } + } + }, + "pinkie-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", + "integrity": "sha1-TINTjeH25mDCngoTRGhE96foglk=", + "requires": { + "pinkie": "^2.0.0" + }, + "dependencies": { + "pinkie": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz", + "integrity": "sha1-clVrgM+g1IqXToDnckjoDtT3+HA=" + } + } + } + } + }, + "hawk": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz", + "integrity": "sha1-B4REvXwWQLD+VA0sm3PVlnjo4cQ=", + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + }, + "dependencies": { + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "requires": { + "hoek": "2.x.x" + } + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "requires": { + "boom": "2.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=" + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "requires": { + "hoek": "2.x.x" + } + } + } + }, + "http-signature": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-0.11.0.tgz", + "integrity": "sha1-F5bPZ6ABrVzWhJ3KCZFIXwkIn+Y=", + "requires": { + "asn1": "0.1.11", + "assert-plus": "^0.1.5", + "ctype": "0.5.3" + }, + "dependencies": { + "asn1": { + "version": "0.1.11", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.1.11.tgz", + "integrity": "sha1-VZvhg3bQik7E2+gId9J4GGObLfc=" + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=" + }, + "ctype": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/ctype/-/ctype-0.5.3.tgz", + "integrity": "sha1-gsGMJGH3QRTvFsE1IkrQuRRMoS8=" + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=" + }, + "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=" + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "node-uuid": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=" + }, + "oauth-sign": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.1.tgz", + "integrity": "sha1-GCQ5vbkTeL90YOdcZOpD5kSN7wY=" + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=" + }, + "tough-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", + "integrity": "sha1-OwUWt5nnDoFkQ2oURuflh3/aEY4=" + }, + "tunnel-agent": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", + "integrity": "sha1-EQTj82rIcSXChycAZ9WC0YEzv+4=" + } + } + }, + "yargs": { + "version": "3.29.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.29.0.tgz", + "integrity": "sha1-GquWYOrnnYuPZ1vK7qtu40ws9pw=", + "requires": { + "camelcase": "^1.2.1", + "cliui": "^3.0.3", + "decamelize": "^1.0.0", + "os-locale": "^1.4.0", + "window-size": "^0.1.2", + "y18n": "^3.2.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-3.1.0.tgz", + "integrity": "sha1-o7iAMI4KgZFyHgCBqMKotQbQq/k=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.0", + "wrap-ansi": "^1.0.0" + }, + "dependencies": { + "string-width": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-1.0.1.tgz", + "integrity": "sha1-ySEptvHX9SrPmvQkom44ZKBc6wo=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "code-point-at": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/code-point-at/-/code-point-at-1.0.0.tgz", + "integrity": "sha1-9psZLT99keOC5Lcb3bd4eGGasMY=", + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" + } + } + }, + "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=", + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" + } + } + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "wrap-ansi": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-1.0.0.tgz", + "integrity": "sha1-9XO7nuI89DiR8zYvXzWaHfo4/DQ=", + "requires": { + "string-width": "^1.0.1" + } + } + } + }, + "decamelize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.1.2.tgz", + "integrity": "sha1-3Mk3J74gljLpiwJxjvTLeWAjIvI=", + "requires": { + "escape-string-regexp": "^1.0.4" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + } + } + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/os-locale/-/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.0" + }, + "dependencies": { + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/lcid/-/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + }, + "dependencies": { + "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=" + } + } + } + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "y18n": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-3.2.0.tgz", + "integrity": "sha1-O+xkyTtzDZJKYUjHZXV5MkM+NMg=" + } + } + } + } + }, + "lodash": { + "version": "3.10.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-3.10.1.tgz", + "integrity": "sha1-W/Rejkm6QYnhfUgnid/RW9FAt7Y=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "meow": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/meow/-/meow-3.3.0.tgz", + "integrity": "sha1-+Hd/0Ntn9z0d4b7uCMl8hmXvxu0=", + "requires": { + "camelcase-keys": "^1.0.0", + "indent-string": "^1.1.0", + "minimist": "^1.1.0", + "object-assign": "^3.0.0" + }, + "dependencies": { + "camelcase-keys": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/camelcase-keys/-/camelcase-keys-1.0.0.tgz", + "integrity": "sha1-vRoRv5sxoc5JNJOpMN4aC69K1+w=", + "requires": { + "camelcase": "^1.0.1", + "map-obj": "^1.0.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "map-obj": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/map-obj/-/map-obj-1.0.1.tgz", + "integrity": "sha1-2TPOuSBdgr3PSIb2dCvcK03qFG0=" + } + } + }, + "indent-string": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/indent-string/-/indent-string-1.2.2.tgz", + "integrity": "sha1-25m8xYPrarux5I3LsZmamGBBy2s=", + "requires": { + "get-stdin": "^4.0.1", + "minimist": "^1.1.0", + "repeating": "^1.1.0" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + }, + "repeating": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/repeating/-/repeating-1.1.3.tgz", + "integrity": "sha1-PUEUIYh3U3SU+X93+Xhfq4EPpKw=", + "requires": { + "is-finite": "^1.0.0" + }, + "dependencies": { + "is-finite": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-finite/-/is-finite-1.0.1.tgz", + "integrity": "sha1-ZDhgPq6+J5OUj/SkJi7I2z1iWXs=", + "requires": { + "number-is-nan": "^1.0.0" + }, + "dependencies": { + "number-is-nan": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.0.tgz", + "integrity": "sha1-wCD1KcUoKt/dIz2R1LGBw9aG3Es=" + } + } + } + } + } + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "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=" + } + } + }, + "micromatch": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.5.tgz", + "integrity": "sha1-2N/tieKEGdBzSJvlXDPwsFwnMhc=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.1", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "lazy-cache": "^0.2.3", + "normalize-path": "^2.0.0", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + }, + "dependencies": { + "arr-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", + "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=" + } + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.3.tgz", + "integrity": "sha1-NdTn3aYysz4hXTioqc9DKcnHXSw=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "dependencies": { + "expand-range": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.1.tgz", + "integrity": "sha1-rL1j5W79kTlyK3VfCZudtawfM/Y=", + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.0.0.tgz", + "integrity": "sha1-II3ocr1zeMKpKvlCij9W65GhIsQ=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "randomatic": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", + "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", + "requires": { + "is-number": "^2.0.2", + "kind-of": "^3.0.2" + } + }, + "repeat-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", + "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=" + } + } + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + } + } + }, + "expand-brackets": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.4.tgz", + "integrity": "sha1-eXueSEEBIF9BjOyuxjEsEy9R4q4=" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "filename-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", + "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "kind-of": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", + "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", + "requires": { + "is-buffer": "^1.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.2.tgz", + "integrity": "sha1-+hImWI+gBIsAXEfk+xuxVV1e3qo=" + } + } + }, + "lazy-cache": { + "version": "0.2.7", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-0.2.7.tgz", + "integrity": "sha1-f+3fLctu23fRHvHRF6tf/fCrG2U=" + }, + "normalize-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", + "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=" + }, + "object.omit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", + "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", + "requires": { + "for-own": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.3.tgz", + "integrity": "sha1-YGREzed8LwoRCIFp4uNU6vVudP4=", + "requires": { + "for-in": "^0.1.4" + }, + "dependencies": { + "for-in": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.4.tgz", + "integrity": "sha1-n1z3tP/H4a5lkaTpexd6pZ1w+y4=" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + } + } + }, + "is-dotfile": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=" + } + } + }, + "regex-cache": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.2.tgz", + "integrity": "sha1-bk+Jwma8A8M/0SnAYhhGh/RmNIc=", + "requires": { + "is-equal-shallow": "^0.1.1", + "is-primitive": "^2.0.0" + }, + "dependencies": { + "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=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + } + } + } + } + }, + "opn": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz", + "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=", + "requires": { + "object-assign": "^4.0.1" + }, + "dependencies": { + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "portscanner": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/portscanner/-/portscanner-1.0.0.tgz", + "integrity": "sha1-O1z+OTgotRYKvGAOYnDrwvFZBVg=", + "requires": { + "async": "0.1.15" + }, + "dependencies": { + "async": { + "version": "0.1.15", + "resolved": "https://registry.npmjs.org/async/-/async-0.1.15.tgz", + "integrity": "sha1-IYDqyizypspSgNQcBYW+ybPkm9M=" + } + } + }, + "query-string": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/query-string/-/query-string-2.4.2.tgz", + "integrity": "sha1-fbBmZCCAS6qSrp8miWKFWnYUPfs=", + "requires": { + "strict-uri-encode": "^1.0.0" + }, + "dependencies": { + "strict-uri-encode": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz", + "integrity": "sha1-J5siXfHVgrH1TmWt3UNS4Y+qBxM=" + } + } + }, + "resp-modifier": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/resp-modifier/-/resp-modifier-5.0.2.tgz", + "integrity": "sha1-vwqm2/KM0MoMtsxJD/tVlDoL9Fw=", + "requires": { + "debug": "^2.2.0", + "minimatch": "^2.0.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + } + } + }, + "serve-index": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", + "integrity": "sha1-egV/xu4o3GP2RWbl+lexEahq7NI=", + "requires": { + "accepts": "~1.2.13", + "batch": "0.5.3", + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "http-errors": "~1.3.1", + "mime-types": "~2.1.9", + "parseurl": "~1.3.1" + }, + "dependencies": { + "accepts": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", + "requires": { + "mime-types": "~2.1.6", + "negotiator": "0.5.3" + }, + "dependencies": { + "negotiator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=" + } + } + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + }, + "dependencies": { + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + } + } + }, + "serve-static": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", + "integrity": "sha1-/rgA0OciEk3QsAMzFgwW6cqovLM=", + "requires": { + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", + "send": "0.13.1" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "send": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", + "integrity": "sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=", + "requires": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + } + } + }, + "socket.io": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-1.3.7.tgz", + "integrity": "sha1-k3R6KbyrYmbw++GREsyl4TiM960=", + "requires": { + "debug": "2.1.0", + "engine.io": "1.5.4", + "has-binary-data": "0.1.3", + "socket.io-adapter": "0.3.1", + "socket.io-client": "1.3.7", + "socket.io-parser": "2.2.4" + }, + "dependencies": { + "debug": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.1.0.tgz", + "integrity": "sha1-M6uRVlnYwsyKQUQ9lNbr03aX7SE=", + "requires": { + "ms": "0.6.2" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" + } + } + }, + "engine.io": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-1.5.4.tgz", + "integrity": "sha1-xhQQEpEcNQYxwbOQ9TJOtCAuKfI=", + "requires": { + "base64id": "0.1.0", + "debug": "1.0.3", + "engine.io-parser": "1.2.2", + "ws": "0.8.0" + }, + "dependencies": { + "base64id": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-0.1.0.tgz", + "integrity": "sha1-As4P3u4M709ACA4ec+g08LG/zj8=" + }, + "debug": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.3.tgz", + "integrity": "sha1-/IxrLWACgEtAgcAgjg9kYLofo+Q=", + "requires": { + "ms": "0.6.2" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" + } + } + }, + "engine.io-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.2.tgz", + "integrity": "sha1-zQgQQf7qOcZDI/95uCqQpyr8zN0=", + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.2", + "blob": "0.0.4", + "has-binary": "0.1.6", + "utf8": "2.1.0" + }, + "dependencies": { + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=" + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + }, + "base64-arraybuffer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", + "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=" + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "utf8": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", + "integrity": "sha1-DP7FyAUtRKI+OqqQgQToB1+V39U=" + } + } + }, + "ws": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.0.tgz", + "integrity": "sha1-rGDrrTEhIdAeFswzg9fsZ60PDx8=", + "requires": { + "bufferutil": "1.2.x", + "options": ">=0.0.5", + "ultron": "1.0.x", + "utf-8-validate": "1.2.x" + }, + "dependencies": { + "bufferutil": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", + "integrity": "sha1-N75dNuHgZJIiHmjUdLGsWOUQy9c=", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "^2.0.5" + }, + "dependencies": { + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "utf-8-validate": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", + "integrity": "sha1-RMt8burXPWtARI9x90WQQ1e59yw=", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "^2.0.5" + }, + "dependencies": { + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + } + } + } + } + }, + "has-binary-data": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/has-binary-data/-/has-binary-data-0.1.3.tgz", + "integrity": "sha1-jrsYOItX8ZpSMSdaFvwY1R83mq4=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "socket.io-adapter": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-0.3.1.tgz", + "integrity": "sha1-34H5cLTfZJOQLZPlGce3J1XDqVg=", + "requires": { + "debug": "1.0.2", + "object-keys": "1.0.1", + "socket.io-parser": "2.2.2" + }, + "dependencies": { + "debug": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.2.tgz", + "integrity": "sha1-OElZHBDM5khHbDx8Li40FttZY8Q=", + "requires": { + "ms": "0.6.2" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" + } + } + }, + "object-keys": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.0.1.tgz", + "integrity": "sha1-VYAuhYQsJru167wVer874wJWm6g=" + }, + "socket.io-parser": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.2.tgz", + "integrity": "sha1-PXr2tkSX6Va32f53X5mXFgJ/lBc=", + "requires": { + "benchmark": "1.0.0", + "component-emitter": "1.1.2", + "debug": "0.7.4", + "isarray": "0.0.1", + "json3": "3.2.6" + }, + "dependencies": { + "benchmark": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", + "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=" + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "json3": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", + "integrity": "sha1-9u/JPAagTemuxTBT3yVZuxniA4s=" + } + } + } + } + }, + "socket.io-client": { + "version": "1.3.7", + "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-1.3.7.tgz", + "integrity": "sha1-erfAabjVBCXrJl8DH4Spfm6+cZw=", + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "1.1.2", + "debug": "0.7.4", + "engine.io-client": "1.5.4", + "has-binary": "0.1.6", + "indexof": "0.0.1", + "object-component": "0.0.3", + "parseuri": "0.0.2", + "socket.io-parser": "2.2.4", + "to-array": "0.1.3" + }, + "dependencies": { + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha1-MasayLEpNjRj41s+u2n038+6eUc=" + }, + "component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha1-AMYIq33Nk4l8AAllGx06jh5zu9E=" + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "engine.io-client": { + "version": "1.5.4", + "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-1.5.4.tgz", + "integrity": "sha1-xq1lpldSopy5MMaRHledKyjREGw=", + "requires": { + "component-emitter": "1.1.2", + "component-inherit": "0.0.3", + "debug": "1.0.4", + "engine.io-parser": "1.2.2", + "has-cors": "1.0.3", + "indexof": "0.0.1", + "parsejson": "0.0.1", + "parseqs": "0.0.2", + "parseuri": "0.0.4", + "ws": "0.8.0", + "xmlhttprequest": "https://github.com/rase-/node-XMLHttpRequest/archive/a6b6f2.tar.gz" + }, + "dependencies": { + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha1-ZF/ErfWLcrZJ1crmUTVhnbJv8UM=" + }, + "debug": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-1.0.4.tgz", + "integrity": "sha1-W5wla9VLbsAigxdvqKDt5tFUy/g=", + "requires": { + "ms": "0.6.2" + }, + "dependencies": { + "ms": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.6.2.tgz", + "integrity": "sha1-2JwhJMb9wTU9Zai3e/GqxLGTcIw=" + } + } + }, + "engine.io-parser": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-1.2.2.tgz", + "integrity": "sha1-zQgQQf7qOcZDI/95uCqQpyr8zN0=", + "requires": { + "after": "0.8.1", + "arraybuffer.slice": "0.0.6", + "base64-arraybuffer": "0.1.2", + "blob": "0.0.4", + "has-binary": "0.1.6", + "utf8": "2.1.0" + }, + "dependencies": { + "after": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/after/-/after-0.8.1.tgz", + "integrity": "sha1-q11PuIP1loFtNRX495HAr0ht1ic=" + }, + "arraybuffer.slice": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/arraybuffer.slice/-/arraybuffer.slice-0.0.6.tgz", + "integrity": "sha1-8zshWfBTKj8xB6JywMz70a0peco=" + }, + "base64-arraybuffer": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/base64-arraybuffer/-/base64-arraybuffer-0.1.2.tgz", + "integrity": "sha1-R030qfLaJOBd8xWMOx2zw81GoVQ=" + }, + "blob": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/blob/-/blob-0.0.4.tgz", + "integrity": "sha1-vPEwUspURj8w+fx+lbmkdjCpSSE=" + }, + "utf8": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/utf8/-/utf8-2.1.0.tgz", + "integrity": "sha1-DP7FyAUtRKI+OqqQgQToB1+V39U=" + } + } + }, + "has-cors": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/has-cors/-/has-cors-1.0.3.tgz", + "integrity": "sha1-UCrLmzEE2sM90mMOry+IiwuvTLM=", + "requires": { + "global": "https://github.com/component/global/archive/v2.0.1.tar.gz" + }, + "dependencies": { + "global": { + "version": "https://github.com/component/global/archive/v2.0.1.tar.gz", + "integrity": "sha1-P7JTQ/tm15mRsPSkKc47VEgO7Dw=" + } + } + }, + "parsejson": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/parsejson/-/parsejson-0.0.1.tgz", + "integrity": "sha1-mxDGwNglq1ieaFFTgm3go7oni8w=", + "requires": { + "better-assert": "~1.0.0" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + }, + "dependencies": { + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + } + } + }, + "parseqs": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parseqs/-/parseqs-0.0.2.tgz", + "integrity": "sha1-nf5wss3aw4i95PNbHyQPpYrb5sc=", + "requires": { + "better-assert": "~1.0.0" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + }, + "dependencies": { + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + } + } + }, + "parseuri": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.4.tgz", + "integrity": "sha1-gGWCo5iH4eoY3V4v4OAZAiaOk1A=", + "requires": { + "better-assert": "~1.0.0" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + }, + "dependencies": { + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + } + } + }, + "ws": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-0.8.0.tgz", + "integrity": "sha1-rGDrrTEhIdAeFswzg9fsZ60PDx8=", + "requires": { + "bufferutil": "1.2.x", + "options": ">=0.0.5", + "ultron": "1.0.x", + "utf-8-validate": "1.2.x" + }, + "dependencies": { + "bufferutil": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bufferutil/-/bufferutil-1.2.1.tgz", + "integrity": "sha1-N75dNuHgZJIiHmjUdLGsWOUQy9c=", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "^2.0.5" + }, + "dependencies": { + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + }, + "options": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/options/-/options-0.0.6.tgz", + "integrity": "sha1-7CLTEoBrtT5zF3Pnza788cZDEo8=" + }, + "ultron": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/ultron/-/ultron-1.0.2.tgz", + "integrity": "sha1-rOEWq1V80Zc4ak6I9GhTeMiy5Po=" + }, + "utf-8-validate": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/utf-8-validate/-/utf-8-validate-1.2.1.tgz", + "integrity": "sha1-RMt8burXPWtARI9x90WQQ1e59yw=", + "optional": true, + "requires": { + "bindings": "1.2.x", + "nan": "^2.0.5" + }, + "dependencies": { + "bindings": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.2.1.tgz", + "integrity": "sha1-FK1hE4EtLTfXLme0ystLtyZQXxE=", + "optional": true + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + } + } + }, + "xmlhttprequest": { + "version": "https://github.com/rase-/node-XMLHttpRequest/archive/a6b6f2.tar.gz", + "integrity": "sha1-IMr6XKpV9ttr+u6EnR62DuQ6X8o=" + } + } + }, + "has-binary": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/has-binary/-/has-binary-0.1.6.tgz", + "integrity": "sha1-JTJvOc+k9hath4eJTjryz7x7bhA=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha1-gtwzbSMrkGIXnQWrMpOmYFn9Q10=" + }, + "object-component": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/object-component/-/object-component-0.0.3.tgz", + "integrity": "sha1-8MaapQ78lbhmwYb0AKM3acsvEpE=" + }, + "parseuri": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/parseuri/-/parseuri-0.0.2.tgz", + "integrity": "sha1-20GHjy1pZHGL6HCzFAlz2Ak74VY=", + "requires": { + "better-assert": "~1.0.0" + }, + "dependencies": { + "better-assert": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/better-assert/-/better-assert-1.0.2.tgz", + "integrity": "sha1-QIZrnhueC1W0gYlDEeaPr/rrxSI=", + "requires": { + "callsite": "1.0.0" + }, + "dependencies": { + "callsite": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/callsite/-/callsite-1.0.0.tgz", + "integrity": "sha1-KAOY5dZkvXQDi28JBRU+borxvCA=" + } + } + } + } + }, + "to-array": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/to-array/-/to-array-0.1.3.tgz", + "integrity": "sha1-1F2txjY0F/YPKEdP6lDs3btPSZE=" + } + } + }, + "socket.io-parser": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-2.2.4.tgz", + "integrity": "sha1-+c4ZvxkJYIzrFdl3IeI7/dHnz2U=", + "requires": { + "benchmark": "1.0.0", + "component-emitter": "1.1.2", + "debug": "0.7.4", + "isarray": "0.0.1", + "json3": "3.2.6" + }, + "dependencies": { + "benchmark": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/benchmark/-/benchmark-1.0.0.tgz", + "integrity": "sha1-Lx4vpMNZ8REiqhgwgiGOlX45DHM=" + }, + "component-emitter": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.1.2.tgz", + "integrity": "sha1-KWWU8nU9qmOZbSrwjRWpURbJrsM=" + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "json3": { + "version": "3.2.6", + "resolved": "https://registry.npmjs.org/json3/-/json3-3.2.6.tgz", + "integrity": "sha1-9u/JPAagTemuxTBT3yVZuxniA4s=" + } + } + } + } + }, + "ua-parser-js": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/ua-parser-js/-/ua-parser-js-0.7.10.tgz", + "integrity": "sha1-kXVZ3czgfLwJ7OfYBJXkwmj0758=" + }, + "ucfirst": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ucfirst/-/ucfirst-1.0.0.tgz", + "integrity": "sha1-ThBbZEjQXiZOzsQ14LkZNjxfLy8=" + } + } + }, + "connect-injector": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/connect-injector/-/connect-injector-0.4.2.tgz", + "integrity": "sha1-hJ0eBos2xxNzbtkodKE2v5LkZjM=", + "requires": { + "connect": "^2.7.2", + "debug": "^2.0.0", + "q": "^1.0.1", + "stream-buffers": "^0.2.3", + "uberproto": "^1.1.0", + "underscore": "^1.4.4" + }, + "dependencies": { + "connect": { + "version": "2.30.2", + "resolved": "https://registry.npmjs.org/connect/-/connect-2.30.2.tgz", + "integrity": "sha1-jam8vooFTT0xjXTf7JA7XDmhtgk=", + "requires": { + "basic-auth-connect": "1.0.0", + "body-parser": "~1.13.3", + "bytes": "2.1.0", + "compression": "~1.5.2", + "connect-timeout": "~1.6.2", + "content-type": "~1.0.1", + "cookie": "0.1.3", + "cookie-parser": "~1.3.5", + "cookie-signature": "1.0.6", + "csurf": "~1.8.3", + "debug": "~2.2.0", + "depd": "~1.0.1", + "errorhandler": "~1.4.2", + "express-session": "~1.11.3", + "finalhandler": "0.4.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "method-override": "~2.3.5", + "morgan": "~1.6.1", + "multiparty": "3.3.2", + "on-headers": "~1.0.0", + "parseurl": "~1.3.0", + "pause": "0.1.0", + "qs": "4.0.0", + "response-time": "~2.3.1", + "serve-favicon": "~2.3.0", + "serve-index": "~1.7.2", + "serve-static": "~1.10.0", + "type-is": "~1.6.6", + "utils-merge": "1.0.0", + "vhost": "~3.0.1" + }, + "dependencies": { + "basic-auth-connect": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/basic-auth-connect/-/basic-auth-connect-1.0.0.tgz", + "integrity": "sha1-/bC0OWLKe0BFanwrtI/hc9otISI=" + }, + "body-parser": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.13.3.tgz", + "integrity": "sha1-wIzzMMM1jhUQFqBXRvE/ApyX+pc=", + "requires": { + "bytes": "2.1.0", + "content-type": "~1.0.1", + "debug": "~2.2.0", + "depd": "~1.0.1", + "http-errors": "~1.3.1", + "iconv-lite": "0.4.11", + "on-finished": "~2.3.0", + "qs": "4.0.0", + "raw-body": "~2.1.2", + "type-is": "~1.6.6" + }, + "dependencies": { + "iconv-lite": { + "version": "0.4.11", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.11.tgz", + "integrity": "sha1-LstC/SlHRJIiCaLnxATayHk9it4=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "raw-body": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.1.5.tgz", + "integrity": "sha1-i+jwnd79DXKtmdiDq38Mw1BCCVY=", + "requires": { + "bytes": "2.2.0", + "iconv-lite": "0.4.13", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=" + }, + "iconv-lite": { + "version": "0.4.13", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.13.tgz", + "integrity": "sha1-H4irpKsLFQjoMSrMOTRfNumS4vI=" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + } + } + } + } + }, + "bytes": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.1.0.tgz", + "integrity": "sha1-rJPEEOL/ycx89LRks4KJBn9eR7Q=" + }, + "compression": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.5.2.tgz", + "integrity": "sha1-sDuNhub4rSloPLqN+R3cb/x3s5U=", + "requires": { + "accepts": "~1.2.12", + "bytes": "2.1.0", + "compressible": "~2.0.5", + "debug": "~2.2.0", + "on-headers": "~1.0.0", + "vary": "~1.0.1" + }, + "dependencies": { + "accepts": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", + "requires": { + "mime-types": "~2.1.6", + "negotiator": "0.5.3" + }, + "dependencies": { + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "negotiator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=" + } + } + }, + "compressible": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.7.tgz", + "integrity": "sha1-IFjFJyL9PxU4pPIqsU0GNZBNGa4=", + "requires": { + "mime-db": ">= 1.21.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "vary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" + } + } + }, + "connect-timeout": { + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/connect-timeout/-/connect-timeout-1.6.2.tgz", + "integrity": "sha1-3ppexh4zoStu2qt7XwYumMWZuI4=", + "requires": { + "debug": "~2.2.0", + "http-errors": "~1.3.1", + "ms": "0.7.1", + "on-headers": "~1.0.0" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "content-type": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.1.tgz", + "integrity": "sha1-oZ0iRzJ9wDgFDOYit6FU7FnF5gA=" + }, + "cookie": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.1.3.tgz", + "integrity": "sha1-5zSlwUF/zkctWu+Cw4HKu2TRpDU=" + }, + "cookie-parser": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.3.5.tgz", + "integrity": "sha1-nXVVcPtdF4kHcSJ6AjFNm+fPg1Y=", + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6" + } + }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" + }, + "csurf": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/csurf/-/csurf-1.8.3.tgz", + "integrity": "sha1-I/KhO/HY/OHQyZZYg5RELLqGpWo=", + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6", + "csrf": "~3.0.0", + "http-errors": "~1.3.1" + }, + "dependencies": { + "csrf": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/csrf/-/csrf-3.0.1.tgz", + "integrity": "sha1-mFshjX4uVY7T2YD6OPaUumgnhMI=", + "requires": { + "base64-url": "1.2.1", + "rndm": "1.2.0", + "scmp": "1.0.0", + "uid-safe": "2.1.0" + }, + "dependencies": { + "base64-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz", + "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg=" + }, + "rndm": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/rndm/-/rndm-1.2.0.tgz", + "integrity": "sha1-8z/pz7Urv9UgqhgyO8ZdsRCht2w=" + }, + "scmp": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/scmp/-/scmp-1.0.0.tgz", + "integrity": "sha1-oLJyw/xykvdxFWRvAGGLAmJRTgQ=" + }, + "uid-safe": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.1.0.tgz", + "integrity": "sha1-0AziKutyHf58Jbst9J/QCWbTimQ=", + "requires": { + "base64-url": "1.2.1", + "random-bytes": "~1.0.0" + }, + "dependencies": { + "random-bytes": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/random-bytes/-/random-bytes-1.0.0.tgz", + "integrity": "sha1-T2ih3Arli9P7lYSMMDJNt11kNgs=" + } + } + } + } + } + } + }, + "depd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" + }, + "errorhandler": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/errorhandler/-/errorhandler-1.4.3.tgz", + "integrity": "sha1-t7cO2PNZ6duICS8tIMD4MUIK2D8=", + "requires": { + "accepts": "~1.3.0", + "escape-html": "~1.0.3" + }, + "dependencies": { + "accepts": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.1.tgz", + "integrity": "sha1-3Clfr4UCTgWwT1pvr17sHR/Qd+U=", + "requires": { + "mime-types": "~2.1.9", + "negotiator": "0.6.0" + }, + "dependencies": { + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "negotiator": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.0.tgz", + "integrity": "sha1-M1k6WisM4wyYWEDG9WtvseqeOlU=" + } + } + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + } + } + }, + "express-session": { + "version": "1.11.3", + "resolved": "https://registry.npmjs.org/express-session/-/express-session-1.11.3.tgz", + "integrity": "sha1-XMmPP1/4Ttg1+Ry/CqvQxxB0AK8=", + "requires": { + "cookie": "0.1.3", + "cookie-signature": "1.0.6", + "crc": "3.3.0", + "debug": "~2.2.0", + "depd": "~1.0.1", + "on-headers": "~1.0.0", + "parseurl": "~1.3.0", + "uid-safe": "~2.0.0", + "utils-merge": "1.0.0" + }, + "dependencies": { + "crc": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/crc/-/crc-3.3.0.tgz", + "integrity": "sha1-+mIuG8OIvyVzCQgta2UgDOZwkLo=" + }, + "uid-safe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/uid-safe/-/uid-safe-2.0.0.tgz", + "integrity": "sha1-p/PGymSh9qXQTsDvPkw9U2cxcTc=", + "requires": { + "base64-url": "1.2.1" + }, + "dependencies": { + "base64-url": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/base64-url/-/base64-url-1.2.1.tgz", + "integrity": "sha1-GZ/WYXAqDnt9yubgaYuwicUvbXg=" + } + } + } + } + }, + "finalhandler": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.0.tgz", + "integrity": "sha1-llpS2ejQXSuFdUhUH7ibU6JJfZs=", + "requires": { + "debug": "~2.2.0", + "escape-html": "1.0.2", + "on-finished": "~2.3.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "escape-html": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.2.tgz", + "integrity": "sha1-130y+pjjjC9BroXpJ44ODmuhAiw=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + } + } + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + }, + "dependencies": { + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + }, + "method-override": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/method-override/-/method-override-2.3.5.tgz", + "integrity": "sha1-LNXNv/AMNnPXrjRRGagSpdlbjI4=", + "requires": { + "debug": "~2.2.0", + "methods": "~1.1.1", + "parseurl": "~1.3.0", + "vary": "~1.0.1" + }, + "dependencies": { + "methods": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", + "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" + }, + "vary": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.0.1.tgz", + "integrity": "sha1-meSYFWaihhGN+yuBc1ffeZM3bRA=" + } + } + }, + "morgan": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", + "requires": { + "basic-auth": "~1.0.3", + "debug": "~2.2.0", + "depd": "~1.0.1", + "on-finished": "~2.3.0", + "on-headers": "~1.0.0" + }, + "dependencies": { + "basic-auth": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.3.tgz", + "integrity": "sha1-QfVVI+WJQFA47jVnlYxipe1wVRo=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + } + } + }, + "multiparty": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/multiparty/-/multiparty-3.3.2.tgz", + "integrity": "sha1-Nd5oBNwZZD5SSfPT473GyM4wHT8=", + "requires": { + "readable-stream": "~1.1.9", + "stream-counter": "~0.2.0" + }, + "dependencies": { + "readable-stream": { + "version": "1.1.13", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.13.tgz", + "integrity": "sha1-9u73ZPUUyJ4rniMUanW6EGdW0j4=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "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=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + }, + "stream-counter": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/stream-counter/-/stream-counter-0.2.0.tgz", + "integrity": "sha1-3tJmVWMZyLDiIoErnPOyb6fZR94=", + "requires": { + "readable-stream": "~1.1.8" + } + } + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "pause": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/pause/-/pause-0.1.0.tgz", + "integrity": "sha1-68ikqGGf8LioGsFRPDQ0/0af23Q=" + }, + "qs": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-4.0.0.tgz", + "integrity": "sha1-wx2bdOwn33XlQ6hseHKO2NRiNgc=" + }, + "response-time": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/response-time/-/response-time-2.3.1.tgz", + "integrity": "sha1-K94ZGB3myBq5XjIHoo1h2WWzF5c=", + "requires": { + "depd": "~1.0.1", + "on-headers": "~1.0.0" + } + }, + "serve-favicon": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/serve-favicon/-/serve-favicon-2.3.0.tgz", + "integrity": "sha1-rtNsxoNAaabxicxyIsahqBHcWzk=", + "requires": { + "etag": "~1.7.0", + "fresh": "0.3.0", + "ms": "0.7.1", + "parseurl": "~1.3.0" + }, + "dependencies": { + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "serve-index": { + "version": "1.7.3", + "resolved": "https://registry.npmjs.org/serve-index/-/serve-index-1.7.3.tgz", + "integrity": "sha1-egV/xu4o3GP2RWbl+lexEahq7NI=", + "requires": { + "accepts": "~1.2.13", + "batch": "0.5.3", + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "http-errors": "~1.3.1", + "mime-types": "~2.1.9", + "parseurl": "~1.3.1" + }, + "dependencies": { + "accepts": { + "version": "1.2.13", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.2.13.tgz", + "integrity": "sha1-5fHzkoxtlf2WVYw27D2dDeSm7Oo=", + "requires": { + "mime-types": "~2.1.6", + "negotiator": "0.5.3" + }, + "dependencies": { + "negotiator": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.5.3.tgz", + "integrity": "sha1-Jp1cR2gQ7JLtvntsLygxY4T5p+g=" + } + } + }, + "batch": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/batch/-/batch-0.5.3.tgz", + "integrity": "sha1-PzQU84AyF0O/wQQvmoP/HVgk1GQ=" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + } + } + }, + "serve-static": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", + "integrity": "sha1-/rgA0OciEk3QsAMzFgwW6cqovLM=", + "requires": { + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", + "send": "0.13.1" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "send": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", + "integrity": "sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=", + "requires": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + }, + "dependencies": { + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + } + } + }, + "type-is": { + "version": "1.6.11", + "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.11.tgz", + "integrity": "sha1-QuzeeXDyNjc4uYbANR77papTFkg=", + "requires": { + "media-typer": "0.3.0", + "mime-types": "~2.1.9" + }, + "dependencies": { + "media-typer": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", + "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + } + } + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + }, + "vhost": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vhost/-/vhost-3.0.2.tgz", + "integrity": "sha1-L7HezUxGaqiLD5NBrzPcGv8keNU=" + } + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "q": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/q/-/q-1.4.1.tgz", + "integrity": "sha1-VXBbzZPF82c1MMLCy8DCs63cKG4=" + }, + "stream-buffers": { + "version": "0.2.6", + "resolved": "https://registry.npmjs.org/stream-buffers/-/stream-buffers-0.2.6.tgz", + "integrity": "sha1-GBwI1bs2kARfaUAbmuanoM8zE/w=" + }, + "uberproto": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/uberproto/-/uberproto-1.2.0.tgz", + "integrity": "sha1-YdTqsCT5CcTm6lK+hnxIlKS+63Y=" + }, + "underscore": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.8.3.tgz", + "integrity": "sha1-Tz+1OxBuYJf8+ctBCfKl6b36UCI=" + } + } + }, + "merge": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/merge/-/merge-1.2.0.tgz", + "integrity": "sha1-dTHjnUlJwoGma4xabgJl6LBYlNo=" + } + } + }, + "hexo-bunyan": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/hexo-bunyan/download/hexo-bunyan-1.0.0.tgz", + "integrity": "sha1-shBrJlR7Iy8BlduGPLXV/4Un/TY=", + "requires": { + "moment": "^2.10.6", + "mv": "~2", + "safe-json-stringify": "~1" + } + }, + "hexo-deployer-rsync": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/hexo-deployer-rsync/-/hexo-deployer-rsync-0.1.3.tgz", + "integrity": "sha1-RwfFpHNxywW0dTmqwX4JtnBgqDI=", + "requires": { + "chalk": "^1.1.3", + "hexo-util": "^0.6.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "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.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "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.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "hexo-filter-mathjax": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/hexo-filter-mathjax/-/hexo-filter-mathjax-0.4.1.tgz", + "integrity": "sha512-uUIUhI1S/2bZYAiIX/RtJ3OUt5BGIZVshOulN2jvp4tKGsBC4kH8EGJcN7wwUPhNSEspibqKBhlZnmTr0Ev9FA==", + "requires": { + "mathjax-full": "3.0.1", + "string-width": "4.2.0" + }, + "dependencies": { + "ansi-regex": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz", + "integrity": "sha512-bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==" + }, + "is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" + }, + "string-width": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.0.tgz", + "integrity": "sha512-zUz5JD+tgqtuDjMhwIg5uFVV3dtqZ9yQJlZVfq4I01/K5Paj5UHj7VyrQOJvzawSVlKpObApbfD0Ed6yJc+1eg==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.0" + } + }, + "strip-ansi": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", + "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "requires": { + "ansi-regex": "^5.0.0" + } + } + } + }, + "hexo-front-matter": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/hexo-front-matter/download/hexo-front-matter-0.2.3.tgz", + "integrity": "sha1-x8qO9CDqNr2F6ECKLoyb9J76YF4=", + "requires": { + "js-yaml": "^3.6.1" + } + }, + "hexo-fs": { + "version": "0.2.2", + "resolved": "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-0.2.2.tgz", + "integrity": "sha1-C5e3n2jfEh92XRKRuOkPrjJtAA4=", + "requires": { + "bluebird": "^3.4.0", + "chokidar": "^1.5.2", + "escape-string-regexp": "^1.0.5", + "graceful-fs": "^4.1.4" + } + }, + "hexo-generator-archive": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/hexo-generator-archive/-/hexo-generator-archive-0.1.4.tgz", + "integrity": "sha1-Ft927JGH5RDf9sGSIEsPf3xQYGk=", + "requires": { + "hexo-pagination": "0.0.2", + "object-assign": "^2.0.0" + }, + "dependencies": { + "hexo-pagination": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-0.0.2.tgz", + "integrity": "sha1-jPRwx9sN5bGKOSanbesZQBXffys=", + "requires": { + "utils-merge": "^1.0.0" + }, + "dependencies": { + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" + } + } + }, + "hexo-generator-category": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/hexo-generator-category/-/hexo-generator-category-0.1.3.tgz", + "integrity": "sha1-uealhiUwqDvdfaTIGcG58+TMtLI=", + "requires": { + "hexo-pagination": "0.0.2", + "object-assign": "^2.0.0" + }, + "dependencies": { + "hexo-pagination": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-0.0.2.tgz", + "integrity": "sha1-jPRwx9sN5bGKOSanbesZQBXffys=", + "requires": { + "utils-merge": "^1.0.0" + }, + "dependencies": { + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "object-assign": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-2.1.1.tgz", + "integrity": "sha1-Q8NuXVaf+OSBbE76i+AtJpZ8GKo=" + } + } + }, + "hexo-generator-feed": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/hexo-generator-feed/-/hexo-generator-feed-1.1.0.tgz", + "integrity": "sha1-mti45x7bzT2NF15DZwlzadbyHQI=", + "requires": { + "nunjucks": "^1.3.4", + "object-assign": "^4.0.1" + }, + "dependencies": { + "nunjucks": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-1.3.4.tgz", + "integrity": "sha1-Td0QqDZLGmTT49fSqNQ2gTHTkEI=", + "requires": { + "chokidar": "~0.12.5", + "optimist": "*" + }, + "dependencies": { + "chokidar": { + "version": "0.12.6", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-0.12.6.tgz", + "integrity": "sha1-viBPW5Y04AkxElbl1ujg5QgoTS8=", + "requires": { + "async-each": "~0.1.5", + "fsevents": "~0.3.1", + "readdirp": "~1.3.0" + }, + "dependencies": { + "async-each": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz", + "integrity": "sha1-tn6Z7c3fllQeRK9WKQzX1cbnBDk=" + }, + "fsevents": { + "version": "0.3.8", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-0.3.8.tgz", + "integrity": "sha1-mZLxAyySXIKVVNDVmAHcoDE6U1Y=", + "optional": true, + "requires": { + "nan": "^2.0.2" + }, + "dependencies": { + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + } + } + }, + "readdirp": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-1.3.0.tgz", + "integrity": "sha1-6vGptGO+moGQ/JrhY6oayTSqNAs=", + "requires": { + "graceful-fs": "~2.0.0", + "minimatch": "~0.2.12", + "readable-stream": "~1.0.26-2" + }, + "dependencies": { + "graceful-fs": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-2.0.3.tgz", + "integrity": "sha1-fNLNsiiko/Nule+mzBQt59GhNtA=" + }, + "minimatch": { + "version": "0.2.14", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz", + "integrity": "sha1-x054BXT2PG+aCQ6Q775u9TpqdWo=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + } + } + }, + "readable-stream": { + "version": "1.0.33", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.33.tgz", + "integrity": "sha1-OjYN1mwbHX/UcFOJhg7aHQ9hEmw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + }, + "dependencies": { + "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=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + } + } + } + } + } + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-generator-index": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hexo-generator-index/-/hexo-generator-index-0.2.0.tgz", + "integrity": "sha1-5vyAFOD4mTYvOlqelCjO/rzJHAk=", + "requires": { + "hexo-pagination": "0.0.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "hexo-pagination": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-0.0.2.tgz", + "integrity": "sha1-jPRwx9sN5bGKOSanbesZQBXffys=", + "requires": { + "utils-merge": "^1.0.0" + }, + "dependencies": { + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-generator-sitemap": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/hexo-generator-sitemap/-/hexo-generator-sitemap-1.1.2.tgz", + "integrity": "sha1-ep7ddXj0okTVvnx9NiD5dUyrFlo=", + "requires": { + "minimatch": "^3.0.0", + "nunjucks": "^2.3.0", + "object-assign": "^4.0.1" + }, + "dependencies": { + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "nunjucks": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/nunjucks/-/nunjucks-2.3.0.tgz", + "integrity": "sha1-put8RLoSh28HY6nFm6f9iVn2X9c=", + "requires": { + "asap": "^2.0.3", + "chokidar": "^1.0.0", + "optimist": "*" + }, + "dependencies": { + "asap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.3.tgz", + "integrity": "sha1-H8HRVk7hFiDfym1nAphQkT+fRnk=" + }, + "chokidar": { + "version": "1.4.2", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-1.4.2.tgz", + "integrity": "sha1-Pq6mwomPpyCBhKRT1Iiamt31Z9I=", + "requires": { + "anymatch": "^1.3.0", + "async-each": "^0.1.6", + "fsevents": "^1.0.0", + "glob-parent": "^2.0.0", + "inherits": "^2.0.1", + "is-binary-path": "^1.0.0", + "is-glob": "^2.0.0", + "path-is-absolute": "^1.0.0", + "readdirp": "^2.0.0" + }, + "dependencies": { + "anymatch": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-1.3.0.tgz", + "integrity": "sha1-o+Uvo5FoyCX/V7AkgSbOWo/5VQc=", + "requires": { + "arrify": "^1.0.0", + "micromatch": "^2.1.5" + }, + "dependencies": { + "arrify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz", + "integrity": "sha1-iYUI2iIm84DfkEcoRWhJwVAaSw0=" + }, + "micromatch": { + "version": "2.3.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-2.3.7.tgz", + "integrity": "sha1-Ly6F70YUDb6my1XnObaxGzDqpQk=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + }, + "dependencies": { + "arr-diff": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-2.0.0.tgz", + "integrity": "sha1-jzuCf5Vai9ZpaX5KQlasPOrjVs8=", + "requires": { + "arr-flatten": "^1.0.1" + }, + "dependencies": { + "arr-flatten": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.0.1.tgz", + "integrity": "sha1-5f/lTUXhnzLyFukeuZyM6JK7YEs=" + } + } + }, + "array-unique": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.2.1.tgz", + "integrity": "sha1-odl8yvy8JiXMcPrc6zalDFiwGlM=" + }, + "braces": { + "version": "1.8.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-1.8.3.tgz", + "integrity": "sha1-NdTn3aYysz4hXTioqc9DKcnHXSw=", + "requires": { + "expand-range": "^1.8.1", + "preserve": "^0.2.0", + "repeat-element": "^1.1.2" + }, + "dependencies": { + "expand-range": { + "version": "1.8.1", + "resolved": "https://registry.npmjs.org/expand-range/-/expand-range-1.8.1.tgz", + "integrity": "sha1-rL1j5W79kTlyK3VfCZudtawfM/Y=", + "requires": { + "fill-range": "^2.1.0" + }, + "dependencies": { + "fill-range": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-2.2.3.tgz", + "integrity": "sha1-ULd9/X5Gm8dJJHCWNpn+eoSFpyM=", + "requires": { + "is-number": "^2.1.0", + "isobject": "^2.0.0", + "randomatic": "^1.1.3", + "repeat-element": "^1.1.2", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "isobject": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.0.0.tgz", + "integrity": "sha1-II3ocr1zeMKpKvlCij9W65GhIsQ=", + "requires": { + "isarray": "0.0.1" + }, + "dependencies": { + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + } + } + }, + "randomatic": { + "version": "1.1.5", + "resolved": "https://registry.npmjs.org/randomatic/-/randomatic-1.1.5.tgz", + "integrity": "sha1-Xp718tVzxnvSuBJK6QtRVuRXhAs=", + "requires": { + "is-number": "^2.0.2", + "kind-of": "^3.0.2" + } + }, + "repeat-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", + "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=" + } + } + } + } + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/preserve/-/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + } + } + }, + "expand-brackets": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-0.1.4.tgz", + "integrity": "sha1-eXueSEEBIF9BjOyuxjEsEy9R4q4=" + }, + "extglob": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/extglob/-/extglob-0.3.2.tgz", + "integrity": "sha1-Lhj/PS9JqydlzskCPwEdqo2DSaE=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "filename-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/filename-regex/-/filename-regex-2.0.0.tgz", + "integrity": "sha1-mW4+gEebmLmJfxWopYs9CE6SZ3U=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "kind-of": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", + "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", + "requires": { + "is-buffer": "^1.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.2.tgz", + "integrity": "sha1-+hImWI+gBIsAXEfk+xuxVV1e3qo=" + } + } + }, + "normalize-path": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.0.1.tgz", + "integrity": "sha1-R4hqwWYnYNQmG32XnSQXCdPOP3o=" + }, + "object.omit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/object.omit/-/object.omit-2.0.0.tgz", + "integrity": "sha1-hoWXMz1U5gZilAu0WGBd1q4S/pQ=", + "requires": { + "for-own": "^0.1.3", + "is-extendable": "^0.1.1" + }, + "dependencies": { + "for-own": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/for-own/-/for-own-0.1.3.tgz", + "integrity": "sha1-YGREzed8LwoRCIFp4uNU6vVudP4=", + "requires": { + "for-in": "^0.1.4" + }, + "dependencies": { + "for-in": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/for-in/-/for-in-0.1.4.tgz", + "integrity": "sha1-n1z3tP/H4a5lkaTpexd6pZ1w+y4=" + } + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + } + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/parse-glob/-/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + }, + "dependencies": { + "glob-base": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/glob-base/-/glob-base-0.3.0.tgz", + "integrity": "sha1-27Fk9iIbHAscz4Kuoyi0l98Oo8Q=", + "requires": { + "glob-parent": "^2.0.0", + "is-glob": "^2.0.0" + } + }, + "is-dotfile": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-dotfile/-/is-dotfile-1.0.2.tgz", + "integrity": "sha1-LBMjg/ORmfjtwmjKAbmwB9IFzE0=" + } + } + }, + "regex-cache": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/regex-cache/-/regex-cache-0.4.2.tgz", + "integrity": "sha1-bk+Jwma8A8M/0SnAYhhGh/RmNIc=", + "requires": { + "is-equal-shallow": "^0.1.1", + "is-primitive": "^2.0.0" + }, + "dependencies": { + "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=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is-primitive/-/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + } + } + } + } + } + } + }, + "async-each": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/async-each/-/async-each-0.1.6.tgz", + "integrity": "sha1-tn6Z7c3fllQeRK9WKQzX1cbnBDk=" + }, + "fsevents": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.0.7.tgz", + "integrity": "sha1-LZBYW7ysn/U1/xoalLBOu1CAhY8=", + "optional": true, + "requires": { + "nan": "^2.1.0", + "node-pre-gyp": "^0.6.19" + }, + "dependencies": { + "ansi": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/ansi/-/ansi-0.3.0.tgz", + "integrity": "sha1-dLLx8YfIVTx/lQFby3YAn7Q9OOA=", + "optional": true + }, + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=", + "optional": true + }, + "ansi-styles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", + "integrity": "sha1-mQ90cUaSe1Wakyv5KVkWPWDA0OI=", + "optional": true + }, + "are-we-there-yet": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.0.5.tgz", + "integrity": "sha1-I58mcG2pAqK/+3LDPeZv39N5isU=", + "optional": true, + "requires": { + "delegates": "^0.1.0", + "readable-stream": "^2.0.0 || ^1.1.13" + } + }, + "asn1": { + "version": "0.2.3", + "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz", + "integrity": "sha1-2sh4dxPJlmhJ/IGAd36+nB3fO4Y=", + "optional": true + }, + "assert-plus": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-0.1.5.tgz", + "integrity": "sha1-7nQAlBMALYTOxyGcasgRgS5yMWA=", + "optional": true + }, + "async": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/async/-/async-1.5.1.tgz", + "integrity": "sha1-sFcU9LEbNXv3mtr/3QbaQtB2bBA=", + "optional": true + }, + "aws-sign2": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz", + "integrity": "sha1-FDQt0428yU0OW4fXY81jYSwOeU8=", + "optional": true + }, + "bl": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-1.0.0.tgz", + "integrity": "sha1-ramoqJptesYIYvfex9sgeHPgw/U=", + "optional": true, + "requires": { + "readable-stream": "~2.0.0" + } + }, + "block-stream": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/block-stream/-/block-stream-0.0.8.tgz", + "integrity": "sha1-Boj0baK7+c/wxPaCJaDLlcvopGs=", + "optional": true, + "requires": { + "inherits": "~2.0.0" + } + }, + "boom": { + "version": "2.10.1", + "resolved": "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz", + "integrity": "sha1-OciRjO/1eZ+D+UkqhI9iWt0Mdm8=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "caseless": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.11.0.tgz", + "integrity": "sha1-cVuW6phBWTzDMGeSP17GDr2k99c=", + "optional": true + }, + "chalk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", + "optional": true, + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "combined-stream": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.5.tgz", + "integrity": "sha1-k4NwpXtKUd6ix3wV1cX9+JUWQAk=", + "optional": true, + "requires": { + "delayed-stream": "~1.0.0" + } + }, + "commander": { + "version": "2.9.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.9.0.tgz", + "integrity": "sha1-nJkJQXbhIkDLItbFFGCYQA/g99Q=", + "optional": true, + "requires": { + "graceful-readlink": ">= 1.0.0" + } + }, + "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=", + "optional": true + }, + "cryptiles": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz", + "integrity": "sha1-O9/s3GCBR8HGcgL6KR59ylnqo7g=", + "optional": true, + "requires": { + "boom": "2.x.x" + } + }, + "dashdash": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.11.0.tgz", + "integrity": "sha1-ur04ktcatAOUjGornWX33hrOjpI=", + "optional": true, + "requires": { + "assert-plus": "0.1.x" + } + }, + "debug": { + "version": "0.7.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz", + "integrity": "sha1-BuHqgILCyxTjmAbiLi9vdX+Srzk=", + "optional": true + }, + "deep-extend": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.0.tgz", + "integrity": "sha1-9YtG21jrXWQ5zdDy5sr7Rzn8EoM=", + "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=", + "optional": true + }, + "delegates": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/delegates/-/delegates-0.1.0.tgz", + "integrity": "sha1-tLV74RoWU1F6BLJ/CUm9wyff45A=", + "optional": true + }, + "ecc-jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.1.tgz", + "integrity": "sha1-D8c6ntXw1Tw4GTOYUj735UN3dQU=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=", + "optional": true + }, + "extend": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.0.tgz", + "integrity": "sha1-WkdDU7nzNT3dgXbf03uRyDpG8dQ=", + "optional": true + }, + "extsprintf": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.0.2.tgz", + "integrity": "sha1-4QgOBljjALBilJkMxw4VAiNf1VA=", + "optional": true + }, + "forever-agent": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz", + "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE=", + "optional": true + }, + "form-data": { + "version": "1.0.0-rc3", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-1.0.0-rc3.tgz", + "integrity": "sha1-01vGLn+8KTeuePlIqqDTjZBgdXc=", + "optional": true, + "requires": { + "async": "^1.4.0", + "combined-stream": "^1.0.5", + "mime-types": "^2.1.3" + } + }, + "fstream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/fstream/-/fstream-1.0.8.tgz", + "integrity": "sha1-fo16c6uzZH7zbkuKFcqAHboD0Dg=", + "optional": true, + "requires": { + "graceful-fs": "^4.1.2", + "inherits": "~2.0.0", + "mkdirp": ">=0.5 0", + "rimraf": "2" + } + }, + "fstream-ignore": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/fstream-ignore/-/fstream-ignore-1.0.3.tgz", + "integrity": "sha1-THTZH6iLIrQvT4ahiigg3XnY/N0=", + "optional": true, + "requires": { + "fstream": "^1.0.0", + "inherits": "2", + "minimatch": "^3.0.0" + }, + "dependencies": { + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + } + } + }, + "gauge": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/gauge/-/gauge-1.2.2.tgz", + "integrity": "sha1-BbZzChmo/K08NAoULwlFIio/gVs=", + "optional": true, + "requires": { + "ansi": "^0.3.0", + "has-unicode": "^1.0.0", + "lodash.pad": "^3.0.0", + "lodash.padleft": "^3.0.0", + "lodash.padright": "^3.0.0" + } + }, + "generate-function": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/generate-function/-/generate-function-2.0.0.tgz", + "integrity": "sha1-aFj+fAlpt9TpCTM3ZHrHn2DfvnQ=", + "optional": 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=", + "optional": true, + "requires": { + "is-property": "^1.0.0" + } + }, + "graceful-fs": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.2.tgz", + "integrity": "sha1-/iI5t1dJcuZ+QfgIgj+b+kqZHjc=", + "optional": true + }, + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=", + "optional": true + }, + "har-validator": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-2.0.3.tgz", + "integrity": "sha1-Wp4SVkpXHPC4Hvk8IVe9FhcWiIM=", + "optional": true, + "requires": { + "chalk": "^1.1.1", + "commander": "^2.9.0", + "is-my-json-valid": "^2.12.3", + "pinkie-promise": "^2.0.0" + } + }, + "has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "has-unicode": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/has-unicode/-/has-unicode-1.0.1.tgz", + "integrity": "sha1-xG/O6gU+uOx4m/+7ol/KUt/c844=", + "optional": true + }, + "hawk": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/hawk/-/hawk-3.1.2.tgz", + "integrity": "sha1-kMkBGIhuIZddGtSumz4oTtGaLeg=", + "optional": true, + "requires": { + "boom": "2.x.x", + "cryptiles": "2.x.x", + "hoek": "2.x.x", + "sntp": "1.x.x" + } + }, + "hoek": { + "version": "2.16.3", + "resolved": "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz", + "integrity": "sha1-ILt0A9POo5jpHcRxCo/xuCdKJe0=", + "optional": true + }, + "http-signature": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.1.0.tgz", + "integrity": "sha1-XS1+m270mYCtWxKNjk7wmjHJDZU=", + "optional": true, + "requires": { + "assert-plus": "^0.1.5", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "ini": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.4.tgz", + "integrity": "sha1-BTfLedr1m1mhpRff9wbIbsA5Fi4=", + "optional": true + }, + "is-my-json-valid": { + "version": "2.12.3", + "resolved": "https://registry.npmjs.org/is-my-json-valid/-/is-my-json-valid-2.12.3.tgz", + "integrity": "sha1-WjnR12stu4MUC70Vex1e5L3IWtY=", + "optional": true, + "requires": { + "generate-function": "^2.0.0", + "generate-object-property": "^1.1.0", + "jsonpointer": "2.0.0", + "xtend": "^4.0.0" + } + }, + "is-property": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/is-property/-/is-property-1.0.2.tgz", + "integrity": "sha1-V/4cTkhHTt1lsJkR8msc1Ald2oQ=", + "optional": true + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=", + "optional": true + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "jodid25519": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/jodid25519/-/jodid25519-1.0.2.tgz", + "integrity": "sha1-BtSRIlUJNBlHfUJWM2BuDpB4KWc=", + "optional": true, + "requires": { + "jsbn": "~0.1.0" + } + }, + "jsbn": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.0.tgz", + "integrity": "sha1-ZQmH2g3XT06/WhE3eiqi0nPpff0=", + "optional": true + }, + "json-schema": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.2.tgz", + "integrity": "sha1-UDVPGfYDkXxpX3C4Wvp3w7DyNQY=", + "optional": 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=", + "optional": true + }, + "jsonpointer": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/jsonpointer/-/jsonpointer-2.0.0.tgz", + "integrity": "sha1-OvHdIP6FRjkQ1GmjheMwF9KgMNk=", + "optional": true + }, + "jsprim": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.2.2.tgz", + "integrity": "sha1-8gyQaskqvVjjt5rIvHCkiDJRLaE=", + "optional": true, + "requires": { + "extsprintf": "1.0.2", + "json-schema": "0.2.2", + "verror": "1.3.6" + } + }, + "lodash._basetostring": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash._basetostring/-/lodash._basetostring-3.0.1.tgz", + "integrity": "sha1-0YYdh3+CSlL2aYMtyvPuFVZqB9U=", + "optional": true + }, + "lodash._createpadding": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/lodash._createpadding/-/lodash._createpadding-3.6.1.tgz", + "integrity": "sha1-SQe0OFla3FTuiTVSemxCTALIGoc=", + "optional": true, + "requires": { + "lodash.repeat": "^3.0.0" + } + }, + "lodash.pad": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.pad/-/lodash.pad-3.1.1.tgz", + "integrity": "sha1-LgeOvDOzMdK6NL+HMq8Sn9XARiQ=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.padleft": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padleft/-/lodash.padleft-3.1.1.tgz", + "integrity": "sha1-FQFR8eAkXtuhXVCvLXHx1c/0ZTA=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.padright": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/lodash.padright/-/lodash.padright-3.1.1.tgz", + "integrity": "sha1-efd3C6qjlzjAQK61Rl6NiPKqzsA=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0", + "lodash._createpadding": "^3.0.0" + } + }, + "lodash.repeat": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.repeat/-/lodash.repeat-3.0.1.tgz", + "integrity": "sha1-9LmNx+9nJWzmHnh04YZe2yCODt8=", + "optional": true, + "requires": { + "lodash._basetostring": "^3.0.0" + } + }, + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=", + "optional": true + }, + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "optional": true, + "requires": { + "mime-db": "~1.21.0" + } + }, + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=", + "optional": true + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "optional": true, + "requires": { + "minimist": "0.0.8" + } + }, + "nan": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/nan/-/nan-2.2.0.tgz", + "integrity": "sha1-d5wHE1YpUDz2p7fmqrMwSbPDhTw=", + "optional": true + }, + "node-pre-gyp": { + "version": "0.6.19", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.6.19.tgz", + "integrity": "sha1-hCut/y6cQjxagX4Gj/6PhIfcEBY=", + "optional": true, + "requires": { + "mkdirp": "~0.5.0", + "nopt": "~3.0.1", + "npmlog": "~2.0.0", + "rc": "~1.1.0", + "request": "2.x", + "rimraf": "~2.5.0", + "semver": "~5.1.0", + "tar": "~2.2.0", + "tar-pack": "~3.1.0" + }, + "dependencies": { + "nopt": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz", + "integrity": "sha1-xkZdvwirzU2zWTF/eaxopkayj/k=", + "optional": true, + "requires": { + "abbrev": "1" + }, + "dependencies": { + "abbrev": { + "version": "1.0.7", + "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.0.7.tgz", + "integrity": "sha1-W2A1su6dT7XPhZ8Iqb6BsghJGEM=", + "optional": true + } + } + } + } + }, + "node-uuid": { + "version": "1.4.7", + "resolved": "https://registry.npmjs.org/node-uuid/-/node-uuid-1.4.7.tgz", + "integrity": "sha1-baWhdmjEs91ZYjvaEc9/pMH2Cm8=", + "optional": true + }, + "npmlog": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-2.0.0.tgz", + "integrity": "sha1-QHbCAKPdpREz5vPPBSEwEF94u98=", + "optional": true, + "requires": { + "ansi": "~0.3.0", + "are-we-there-yet": "~1.0.0", + "gauge": "~1.2.0" + } + }, + "oauth-sign": { + "version": "0.8.0", + "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.0.tgz", + "integrity": "sha1-k4/ch1dlulJxN9iuydF44k3rxVM=", + "optional": true + }, + "once": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/once/-/once-1.1.1.tgz", + "integrity": "sha1-nbV0kzzLCMOnYU0VQDLAnqbzOec=", + "optional": true + }, + "pinkie": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/pinkie/-/pinkie-2.0.1.tgz", + "integrity": "sha1-QjbIb8KfJhwgRbvoH3jLsqXoMGw=", + "optional": true + }, + "pinkie-promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.0.tgz", + "integrity": "sha1-TINTjeH25mDCngoTRGhE96foglk=", + "optional": true, + "requires": { + "pinkie": "^2.0.0" + } + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=", + "optional": true + }, + "qs": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-5.2.0.tgz", + "integrity": "sha1-qfMRQq9GjLcrJbMBNrokVoNJFr4=", + "optional": true + }, + "rc": { + "version": "1.1.6", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.1.6.tgz", + "integrity": "sha1-Q2UbdrauU7XIAvEVH6P8OwWZack=", + "optional": true, + "requires": { + "deep-extend": "~0.4.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~1.0.4" + }, + "dependencies": { + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=", + "optional": true + } + } + }, + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "optional": true, + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + } + }, + "request": { + "version": "2.67.0", + "resolved": "https://registry.npmjs.org/request/-/request-2.67.0.tgz", + "integrity": "sha1-ivdHgOK/EeoK6aqWXBHxGv0nJ0I=", + "optional": true, + "requires": { + "aws-sign2": "~0.6.0", + "bl": "~1.0.0", + "caseless": "~0.11.0", + "combined-stream": "~1.0.5", + "extend": "~3.0.0", + "forever-agent": "~0.6.1", + "form-data": "~1.0.0-rc3", + "har-validator": "~2.0.2", + "hawk": "~3.1.0", + "http-signature": "~1.1.0", + "is-typedarray": "~1.0.0", + "isstream": "~0.1.2", + "json-stringify-safe": "~5.0.1", + "mime-types": "~2.1.7", + "node-uuid": "~1.4.7", + "oauth-sign": "~0.8.0", + "qs": "~5.2.0", + "stringstream": "~0.0.4", + "tough-cookie": "~2.2.0", + "tunnel-agent": "~0.4.1" + } + }, + "rimraf": { + "version": "2.5.0", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.5.0.tgz", + "integrity": "sha1-MMCWzfdy4mvz4dLP+EwhllQam7Y=", + "optional": true, + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.3.tgz", + "integrity": "sha1-XwLNiVh85YsVSuCFXeAqLmOYb8o=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "optional": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "optional": true + } + } + } + } + }, + "semver": { + "version": "5.1.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.1.0.tgz", + "integrity": "sha1-hfLPhVBGXE3wAM99hvawVBBqueU=", + "optional": true + }, + "sntp": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz", + "integrity": "sha1-ZUEYTMkK7qbG57NeJlkIJEPGYZg=", + "optional": true, + "requires": { + "hoek": "2.x.x" + } + }, + "sshpk": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.7.2.tgz", + "integrity": "sha1-5etD0GYr0gEDcyftuLj2RlasqEI=", + "optional": true, + "requires": { + "asn1": ">=0.2.3 <0.3.0", + "assert-plus": ">=0.2.0 <0.3.0", + "dashdash": ">=1.10.1 <2.0.0", + "ecc-jsbn": ">=0.0.1 <1.0.0", + "jodid25519": ">=1.0.0 <2.0.0", + "jsbn": ">=0.1.0 <0.2.0", + "tweetnacl": ">=0.13.0 <1.0.0" + }, + "dependencies": { + "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=", + "optional": true + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=", + "optional": true + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npmjs.org/stringstream/-/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "optional": true + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "optional": true, + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "strip-json-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz", + "integrity": "sha1-HhX7ysl9Pumb8tc7TGVrCCu6+5E=", + "optional": true + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=", + "optional": true + }, + "tar": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tar/-/tar-2.2.1.tgz", + "integrity": "sha1-jk0qJWwOIYXGsYrWlK7JaLg8sdE=", + "optional": true, + "requires": { + "block-stream": "*", + "fstream": "^1.0.2", + "inherits": "2" + } + }, + "tar-pack": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/tar-pack/-/tar-pack-3.1.2.tgz", + "integrity": "sha1-FfxXw3kji9NQ73sYKi4rr4Jv4Eg=", + "optional": true, + "requires": { + "debug": "~0.7.2", + "fstream": "~1.0.8", + "fstream-ignore": "~1.0.3", + "once": "~1.1.1", + "readable-stream": "~2.0.4", + "rimraf": "~2.4.4", + "tar": "~2.2.1", + "uid-number": "0.0.3" + }, + "dependencies": { + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "^6.0.1" + }, + "dependencies": { + "glob": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-6.0.3.tgz", + "integrity": "sha1-XwLNiVh85YsVSuCFXeAqLmOYb8o=", + "optional": true, + "requires": { + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "2 || 3", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "dependencies": { + "inflight": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.4.tgz", + "integrity": "sha1-bLtFIevVHODsCpNr/XZX736bFyo=", + "optional": true, + "requires": { + "once": "^1.3.0", + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "inherits": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz", + "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=", + "optional": true + }, + "minimatch": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.0.tgz", + "integrity": "sha1-UjYVelHk8ATBd/s8Un/33Xjw74M=", + "optional": true, + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.2.tgz", + "integrity": "sha1-8hRF0EiLZY4nce/YcO/1HfKfBO8=", + "optional": true, + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=", + "optional": true + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=", + "optional": true + } + } + } + } + }, + "once": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/once/-/once-1.3.3.tgz", + "integrity": "sha1-suJhVXzkwxTsgwTz+oJmPkKXyiA=", + "optional": true, + "requires": { + "wrappy": "1" + }, + "dependencies": { + "wrappy": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.1.tgz", + "integrity": "sha1-HmWWmWXMvC20VIxrhKbyxa7dRzk=", + "optional": true + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=", + "optional": true + } + } + } + } + } + } + }, + "tough-cookie": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.2.1.tgz", + "integrity": "sha1-OwUWt5nnDoFkQ2oURuflh3/aEY4=", + "optional": true + }, + "tunnel-agent": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.4.2.tgz", + "integrity": "sha1-EQTj82rIcSXChycAZ9WC0YEzv+4=", + "optional": true + }, + "tweetnacl": { + "version": "0.13.2", + "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.13.2.tgz", + "integrity": "sha1-RTFhdwRp1FzSZsNkBOK8maj6mUQ=", + "optional": true + }, + "uid-number": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/uid-number/-/uid-number-0.0.3.tgz", + "integrity": "sha1-zvsPoTjY2AmNpxpAoNBKgyfW4cw=", + "optional": true + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=", + "optional": true + }, + "verror": { + "version": "1.3.6", + "resolved": "https://registry.npmjs.org/verror/-/verror-1.3.6.tgz", + "integrity": "sha1-z/XfEpRtKX0rqu+qJoniW+AcAFw=", + "optional": true, + "requires": { + "extsprintf": "1.0.2" + } + }, + "xtend": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz", + "integrity": "sha1-pcbVMr5lbiPbgg77lDofBJmNY68=", + "optional": true + } + } + }, + "glob-parent": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-2.0.0.tgz", + "integrity": "sha1-gTg9ctsFT8zPUzbaqQLxgvbtuyg=", + "requires": { + "is-glob": "^2.0.0" + } + }, + "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=", + "requires": { + "binary-extensions": "^1.0.0" + }, + "dependencies": { + "binary-extensions": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.4.0.tgz", + "integrity": "sha1-1zPMtiiYbXsybYhlbg3b06rDUbc=" + } + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + }, + "dependencies": { + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + } + } + }, + "path-is-absolute": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.0.tgz", + "integrity": "sha1-Jj2tpmqz8vsQv3+dJN2PPlcO+RI=" + }, + "readdirp": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.0.0.tgz", + "integrity": "sha1-zAm6XRLY/rhkvHX24uvBNwYMvYI=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^2.0.10", + "readable-stream": "^2.0.2" + }, + "dependencies": { + "graceful-fs": { + "version": "4.1.3", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.3.tgz", + "integrity": "sha1-kgM84RETxB4mKNYf36QLwQ3AFVw=" + }, + "minimatch": { + "version": "2.0.10", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-2.0.10.tgz", + "integrity": "sha1-jQh8OcazjAAbl/ynzm0OHoCvusc=", + "requires": { + "brace-expansion": "^1.0.0" + }, + "dependencies": { + "brace-expansion": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.3.tgz", + "integrity": "sha1-Rr/1ARXUf8mriYVKu4fZgHihCZE=", + "requires": { + "balanced-match": "^0.3.0", + "concat-map": "0.0.1" + }, + "dependencies": { + "balanced-match": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-0.3.0.tgz", + "integrity": "sha1-qRzdHr7xqGZZ5w/03vAWJfwtZ1Y=" + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" + } + } + } + } + }, + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } + } + } + } + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-generator-tag": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/hexo-generator-tag/-/hexo-generator-tag-0.2.0.tgz", + "integrity": "sha1-xXFYRrtB5X2cIMHWbX2yGhq/emI=", + "requires": { + "hexo-pagination": "0.0.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "hexo-pagination": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/hexo-pagination/-/hexo-pagination-0.0.2.tgz", + "integrity": "sha1-jPRwx9sN5bGKOSanbesZQBXffys=", + "requires": { + "utils-merge": "^1.0.0" + }, + "dependencies": { + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-i18n": { + "version": "0.2.1", + "resolved": "https://registry.npm.taobao.org/hexo-i18n/download/hexo-i18n-0.2.1.tgz", + "integrity": "sha1-hPFBQyvwnYtVjth4xygWS20c1t4=", + "requires": { + "sprintf-js": "^1.0.2" + } + }, + "hexo-inject": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexo-inject/-/hexo-inject-1.0.0.tgz", + "integrity": "sha1-pTVXVgUdWrJ5yCtzfacrEzx+Ju0=", + "requires": { + "babel-plugin-transform-decorators-legacy": "^1.3.4", + "babel-polyfill": "^6.7.2", + "bluebird": "^3.3.4", + "core-decorators": "^0.11.0", + "underscore": "^1.8.3" + } + }, + "hexo-log": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/hexo-log/download/hexo-log-0.2.0.tgz", + "integrity": "sha1-0w/UXhoSqDyIAzWGZASF78XfWm8=", + "requires": { + "chalk": "^1.1.1", + "hexo-bunyan": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-2.2.1.tgz", + "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/chalk/download/chalk-1.1.3.tgz", + "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=", + "requires": { + "ansi-styles": "^2.2.1", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + } + }, + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "hexo-renderer-ejs": { + "version": "0.1.1", + "resolved": "https://registry.npmjs.org/hexo-renderer-ejs/-/hexo-renderer-ejs-0.1.1.tgz", + "integrity": "sha1-QV0voz2ZUHUmpdCjceNoBnibFyw=", + "requires": { + "ejs": "^1.0.0", + "object-assign": "^4.0.1" + }, + "dependencies": { + "ejs": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/ejs/-/ejs-1.0.0.tgz", + "integrity": "sha1-ycYKSKRu5FL7MqccMXuV5aofyz0=" + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + } + } + }, + "hexo-renderer-jade": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/hexo-renderer-jade/-/hexo-renderer-jade-0.1.0.tgz", + "integrity": "sha1-Cf4udkStwLEf8p/TTgKd/LToQOk=", + "requires": { + "jade": "^1.3.1" + }, + "dependencies": { + "jade": { + "version": "1.11.0", + "resolved": "https://registry.npmjs.org/jade/-/jade-1.11.0.tgz", + "integrity": "sha1-nIDlOMEtP7lcjZu5VZ+gzAQEBf0=", + "requires": { + "character-parser": "1.2.1", + "clean-css": "^3.1.9", + "commander": "~2.6.0", + "constantinople": "~3.0.1", + "jstransformer": "0.0.2", + "mkdirp": "~0.5.0", + "transformers": "2.1.0", + "uglify-js": "^2.4.19", + "void-elements": "~2.0.1", + "with": "~4.0.0" + }, + "dependencies": { + "character-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/character-parser/-/character-parser-1.2.1.tgz", + "integrity": "sha1-wN3kqxgnE7kZuXCVmhI+zBow/NY=" + }, + "clean-css": { + "version": "3.4.9", + "resolved": "https://registry.npmjs.org/clean-css/-/clean-css-3.4.9.tgz", + "integrity": "sha1-lUxJw0lodj9QsF/Q3eRGlM+dLrk=", + "requires": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "dependencies": { + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.8.1.tgz", + "integrity": "sha1-Br42f+v9oMMwqh4qBy09yXYkJdQ=", + "requires": { + "graceful-readlink": ">= 1.0.0" + }, + "dependencies": { + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha1-TK+tdrxi8C+gObL5Tpo906ORpyU=" + } + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha1-66T12pwNyZneaAMti092FzZSA2s=", + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" + } + } + } + } + }, + "commander": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.6.0.tgz", + "integrity": "sha1-nfflL7Kgyw+4kFjugMMQQiXzfh0=" + }, + "constantinople": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/constantinople/-/constantinople-3.0.2.tgz", + "integrity": "sha1-S5RdmTeQe82Y7ldRIsOBdRZUQUE=", + "requires": { + "acorn": "^2.1.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + } + } + }, + "jstransformer": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/jstransformer/-/jstransformer-0.0.2.tgz", + "integrity": "sha1-eq4pqQPRls+glz2IXT5HlH7Ndqs=", + "requires": { + "is-promise": "^2.0.0", + "promise": "^6.0.1" + }, + "dependencies": { + "is-promise": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.1.0.tgz", + "integrity": "sha1-eaKp7OfwlugPNtKy87wWwf9L8/o=" + }, + "promise": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-6.1.0.tgz", + "integrity": "sha1-LOcp9rlLRcJoka0GAsXJDgTG7vY=", + "requires": { + "asap": "~1.0.0" + }, + "dependencies": { + "asap": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/asap/-/asap-1.0.0.tgz", + "integrity": "sha1-sqRdpf36ILBJb8N2jMJ8EvqRan0=" + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "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=" + } + } + }, + "transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/transformers/-/transformers-2.1.0.tgz", + "integrity": "sha1-XSPLNVYd2F3Gf7hIIwm0fVPM6ac=", + "requires": { + "css": "~1.0.8", + "promise": "~2.0", + "uglify-js": "~2.2.5" + }, + "dependencies": { + "css": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/css/-/css-1.0.8.tgz", + "integrity": "sha1-k4aBHKgrzMnuf7WnMrHioxfIo+c=", + "requires": { + "css-parse": "1.0.4", + "css-stringify": "1.0.5" + }, + "dependencies": { + "css-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.0.4.tgz", + "integrity": "sha1-OLBQP7+dqfVOnB29pg4UXHcRe90=" + }, + "css-stringify": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/css-stringify/-/css-stringify-1.0.5.tgz", + "integrity": "sha1-sNBClG2ylTu50pKQCmy19tASIDE=" + } + } + }, + "promise": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/promise/-/promise-2.0.0.tgz", + "integrity": "sha1-RmSKqdYFr10ucMMCS/WUNtoCuA4=", + "requires": { + "is-promise": "~1" + }, + "dependencies": { + "is-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-1.0.1.tgz", + "integrity": "sha1-MVc3YcBX4zwukaq56W2gjO++duU=" + } + } + }, + "uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha1-puAqcNg5eSuXgEiLe4sYTAlcmcc=", + "requires": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + }, + "dependencies": { + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha1-yQlBrVnkJzMokjB00s8ufLxuwNk=", + "requires": { + "wordwrap": "~0.0.2" + }, + "dependencies": { + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" + } + } + } + } + } + } + }, + "uglify-js": { + "version": "2.6.1", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-2.6.1.tgz", + "integrity": "sha1-7bvhiIujUl3tOnv4NrMLNAXTFhs=", + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "source-map": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.3.tgz", + "integrity": "sha1-gmdLhacbC+dsPnQW0V6fUlLrO+A=" + }, + "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=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + }, + "dependencies": { + "center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "requires": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", + "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", + "requires": { + "is-buffer": "^1.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.2.tgz", + "integrity": "sha1-+hImWI+gBIsAXEfk+xuxVV1e3qo=" + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "repeat-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", + "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=" + } + } + }, + "lazy-cache": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.3.tgz", + "integrity": "sha1-6XdUYY+ciGu5mbL/aceLgkU9ZnQ=" + } + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + }, + "dependencies": { + "align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "requires": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "dependencies": { + "kind-of": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.0.2.tgz", + "integrity": "sha1-GH20JwRufpCUVpLmdoZovWkA3qA=", + "requires": { + "is-buffer": "^1.0.2" + }, + "dependencies": { + "is-buffer": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.2.tgz", + "integrity": "sha1-+hImWI+gBIsAXEfk+xuxVV1e3qo=" + } + } + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "repeat-string": { + "version": "1.5.2", + "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.5.2.tgz", + "integrity": "sha1-IQZfcHJ60FOg3V6VesngDHVg2Qo=" + } + } + } + } + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + } + } + }, + "decamelize": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.1.2.tgz", + "integrity": "sha1-3Mk3J74gljLpiwJxjvTLeWAjIvI=", + "requires": { + "escape-string-regexp": "^1.0.4" + }, + "dependencies": { + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + } + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + } + } + } + } + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha1-wGavtYK7HLQSjWDqkjkulNXp2+w=" + }, + "with": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/with/-/with-4.0.3.tgz", + "integrity": "sha1-7v0VTp550sjTQXtkeo8U2f7M4U4=", + "requires": { + "acorn": "^1.0.1", + "acorn-globals": "^1.0.3" + }, + "dependencies": { + "acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha1-yM4n3grMdtiW0rH6099YjZ6C8BQ=" + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha1-VbtemGkVB7dFedBRNBMhfDgMVM8=", + "requires": { + "acorn": "^2.1.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=" + } + } + } + } + } + } + } + } + }, + "hexo-renderer-marked": { + "version": "0.2.9", + "resolved": "https://registry.npmjs.org/hexo-renderer-marked/-/hexo-renderer-marked-0.2.9.tgz", + "integrity": "sha1-zSytfgtOGiqWR4dIyIAVBgN0GgU=", + "requires": { + "hexo-util": "^0.5.1", + "marked": "^0.3.5", + "object-assign": "^4.0.1", + "strip-indent": "^1.0.1" + }, + "dependencies": { + "hexo-util": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/hexo-util/-/hexo-util-0.5.2.tgz", + "integrity": "sha1-mHuzD82iPimW2J0KdHT7NVxv/go=", + "requires": { + "bluebird": "^3.0.6", + "camel-case": "^1.2.0", + "cross-spawn": "^2.1.5", + "highlight.js": "^9.0.0", + "html-entities": "^1.2.0", + "striptags": "^2.1.1" + }, + "dependencies": { + "bluebird": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.0.tgz", + "integrity": "sha1-VMqdBB1+XnWTUmR7SZV03fV0qFI=" + }, + "camel-case": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/camel-case/-/camel-case-1.2.2.tgz", + "integrity": "sha1-Gsp8TRlTWaLOmVV5NDPG5VQlEfI=", + "requires": { + "sentence-case": "^1.1.1", + "upper-case": "^1.1.1" + }, + "dependencies": { + "sentence-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sentence-case/-/sentence-case-1.1.3.tgz", + "integrity": "sha1-gDSq/CFFdy06vhUJqkLJ4QQtwTk=", + "requires": { + "lower-case": "^1.1.1" + }, + "dependencies": { + "lower-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/lower-case/-/lower-case-1.1.3.tgz", + "integrity": "sha1-ySOT2XZ5Pu5bpO21g8+OrjW9m/s=" + } + } + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + } + } + }, + "cross-spawn": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-2.1.5.tgz", + "integrity": "sha1-CeHu+3YXJw9PnK1Bdm5/y9LGrmw=", + "requires": { + "cross-spawn-async": "^2.0.0", + "spawn-sync": "^1.0.15" + }, + "dependencies": { + "cross-spawn-async": { + "version": "2.1.8", + "resolved": "https://registry.npmjs.org/cross-spawn-async/-/cross-spawn-async-2.1.8.tgz", + "integrity": "sha1-LYdpsknUDb4jH90NGM6pkDKKryw=", + "requires": { + "lru-cache": "^4.0.0", + "which": "^1.2.4" + }, + "dependencies": { + "lru-cache": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.0.0.tgz", + "integrity": "sha1-tcvwFVbBaWb+vlTO7A+03JDfbCg=", + "requires": { + "pseudomap": "^1.0.1", + "yallist": "^2.0.0" + }, + "dependencies": { + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "yallist": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.0.0.tgz", + "integrity": "sha1-MGxUODXwnuGkyyO3vOmrNByRzdQ=" + } + } + }, + "which": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/which/-/which-1.2.4.tgz", + "integrity": "sha1-FVf5YIBgTlsRs1meufRbUKnv1yI=", + "requires": { + "is-absolute": "^0.1.7", + "isexe": "^1.1.1" + }, + "dependencies": { + "is-absolute": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-0.1.7.tgz", + "integrity": "sha1-hHSREZ/MtftDYhfMc39/qtUPYD8=", + "requires": { + "is-relative": "^0.1.0" + }, + "dependencies": { + "is-relative": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-0.1.3.tgz", + "integrity": "sha1-kF/uiuhvRbPsYUvDwVyGnfCHboI=" + } + } + }, + "isexe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-1.1.2.tgz", + "integrity": "sha1-NvPiLmB1CSD15yQaR2qMakInWtA=" + } + } + } + } + }, + "spawn-sync": { + "version": "1.0.15", + "resolved": "https://registry.npmjs.org/spawn-sync/-/spawn-sync-1.0.15.tgz", + "integrity": "sha1-sAeZVX63+wyDdsKdROih6mfldHY=", + "requires": { + "concat-stream": "^1.4.7", + "os-shim": "^0.1.2" + }, + "dependencies": { + "concat-stream": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.5.1.tgz", + "integrity": "sha1-87gKz54fSOOHXAaItBtsMWAu6hw=", + "requires": { + "inherits": "~2.0.1", + "readable-stream": "~2.0.0", + "typedarray": "~0.0.5" + }, + "dependencies": { + "readable-stream": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.0.5.tgz", + "integrity": "sha1-okJvjc1FUcd6M/lu3yiGojyClmk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "process-nextick-args": "~1.0.6", + "string_decoder": "~0.10.x", + "util-deprecate": "~1.0.1" + }, + "dependencies": { + "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=" + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "process-nextick-args": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-1.0.6.tgz", + "integrity": "sha1-D5awAc6pCxJZLOVm7bl+wR5pvQU=" + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + } + } + }, + "typedarray": { + "version": "0.0.6", + "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", + "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" + } + } + }, + "os-shim": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/os-shim/-/os-shim-0.1.3.tgz", + "integrity": "sha1-a2LDeRz3kJ6jXtRuF2WLtBfLORc=" + } + } + } + } + }, + "highlight.js": { + "version": "9.1.0", + "resolved": "https://registry.npmjs.org/highlight.js/-/highlight.js-9.1.0.tgz", + "integrity": "sha1-65TBJfUrvSXciTVRtFw3xQk/HFw=" + }, + "html-entities": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/html-entities/-/html-entities-1.2.0.tgz", + "integrity": "sha1-QZSMr4XOgv7Tbk5qDtNxpmZDeeI=" + }, + "striptags": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/striptags/-/striptags-2.1.1.tgz", + "integrity": "sha1-53G4sxk7l7vtOS3KWaeCedPIpqY=" + } + } + }, + "marked": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/marked/-/marked-0.3.5.tgz", + "integrity": "sha1-QROhWsXXvKFYpargciRYe5+hW5Q=" + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + }, + "strip-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/strip-indent/-/strip-indent-1.0.1.tgz", + "integrity": "sha1-DHlipq3vp7vUrDZkYKY4VSrhoKI=", + "requires": { + "get-stdin": "^4.0.1" + }, + "dependencies": { + "get-stdin": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/get-stdin/-/get-stdin-4.0.1.tgz", + "integrity": "sha1-uWjGsKBDhDJJAui/Gl3zJXmkUP4=" + } + } + } + } + }, + "hexo-renderer-stylus": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/hexo-renderer-stylus/-/hexo-renderer-stylus-0.3.1.tgz", + "integrity": "sha1-m5E8FSuwN8k/frPmTSSK4hXIohg=", + "requires": { + "nib": "^1.1.0", + "stylus": "^0.53.0" + }, + "dependencies": { + "mkdirp": { + "version": "0.3.5", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz", + "integrity": "sha1-3j5fiWHIjHh+4TaN+EmsRBPsqNc=" + }, + "nib": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/nib/-/nib-1.1.0.tgz", + "integrity": "sha1-UnwZZioQorVl/oXpswnWIqp1V9M=", + "requires": { + "stylus": "0.49.x" + }, + "dependencies": { + "stylus": { + "version": "0.49.3", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.49.3.tgz", + "integrity": "sha1-H72r5HntRghyxxpiUqZ/lQQLpRE=", + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "3.2.x", + "mkdirp": "0.3.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2", + "minimatch": "0.3" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + } + } + } + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" + } + } + } + } + } + } + }, + "stylus": { + "version": "0.53.0", + "resolved": "https://registry.npmjs.org/stylus/-/stylus-0.53.0.tgz", + "integrity": "sha1-a1HnZlCX+N1KaWXhTO6l5Ln9cko=", + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "3.2.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "dependencies": { + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha1-Mh9s9zeCpv91ERE5D8BeLGV9jJs=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "glob": { + "version": "3.2.11", + "resolved": "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz", + "integrity": "sha1-Spc/Y1uRkPcV0QmH1cAP0oFevj0=", + "requires": { + "inherits": "2", + "minimatch": "0.3" + }, + "dependencies": { + "minimatch": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz", + "integrity": "sha1-J12O2qxPG7MyZHIInnlJyDlGmd0=", + "requires": { + "lru-cache": "2", + "sigmund": "~1.0.0" + }, + "dependencies": { + "lru-cache": { + "version": "2.7.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz", + "integrity": "sha1-bUUk6LlV+V1PW1iFHOId1y+06VI=" + }, + "sigmund": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz", + "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=" + } + } + } + } + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "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=" + } + } + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/sax/-/sax-0.5.8.tgz", + "integrity": "sha1-1HLbIo6zMcJQaw6MFVJK25OdEsE=" + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha1-wkvBRspRfBRx9drL4lcbK3+eM0Y=", + "requires": { + "amdefine": ">=0.0.4" + }, + "dependencies": { + "amdefine": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/amdefine/-/amdefine-1.0.0.tgz", + "integrity": "sha1-/RdHRwDLXMnCtwnwvp0jzjwZjDM=" + } + } + } + } + } + } + }, + "hexo-server": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/hexo-server/-/hexo-server-0.1.3.tgz", + "integrity": "sha1-0pxi2kIjj9cOv8wgZcSSDi/tBHc=", + "requires": { + "bluebird": "^3.0.6", + "chalk": "^1.1.1", + "compression": "^1.6.0", + "connect": "3.x", + "mime": "^1.3.4", + "morgan": "^1.6.1", + "object-assign": "^4.0.1", + "opn": "^3.0.3", + "serve-static": "^1.10.0" + }, + "dependencies": { + "bluebird": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/bluebird/-/bluebird-3.3.0.tgz", + "integrity": "sha1-VMqdBB1+XnWTUmR7SZV03fV0qFI=" + }, + "chalk": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.1.tgz", + "integrity": "sha1-UJr7ZwZudJn36zU1x3RFdyri0Bk=", + "requires": { + "ansi-styles": "^2.1.0", + "escape-string-regexp": "^1.0.2", + "has-ansi": "^2.0.0", + "strip-ansi": "^3.0.0", + "supports-color": "^2.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.1.0.tgz", + "integrity": "sha1-mQ90cUaSe1Wakyv5KVkWPWDA0OI=" + }, + "escape-string-regexp": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.4.tgz", + "integrity": "sha1-uF5nm0b3LQP7voo79yWdU1whti8=" + }, + "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.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "strip-ansi": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.0.tgz", + "integrity": "sha1-dRC2ZVZ8qRTMtdfgcnY6yWi+NyQ=", + "requires": { + "ansi-regex": "^2.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.0.0.tgz", + "integrity": "sha1-xQYbbg74qBd15Q9dZhUb9r83EQc=" + } + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=" + } + } + }, + "compression": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/compression/-/compression-1.6.1.tgz", + "integrity": "sha1-G/T5b9cgGaP9EVE7T8Tc070W21U=", + "requires": { + "accepts": "~1.3.1", + "bytes": "2.2.0", + "compressible": "~2.0.7", + "debug": "~2.2.0", + "on-headers": "~1.0.1", + "vary": "~1.1.0" + }, + "dependencies": { + "accepts": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.1.tgz", + "integrity": "sha1-3Clfr4UCTgWwT1pvr17sHR/Qd+U=", + "requires": { + "mime-types": "~2.1.9", + "negotiator": "0.6.0" + }, + "dependencies": { + "mime-types": { + "version": "2.1.9", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.9.tgz", + "integrity": "sha1-37OWdktf33W+NLH0EEvDaH+2Nfg=", + "requires": { + "mime-db": "~1.21.0" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "negotiator": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.0.tgz", + "integrity": "sha1-M1k6WisM4wyYWEDG9WtvseqeOlU=" + } + } + }, + "bytes": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-2.2.0.tgz", + "integrity": "sha1-/TVGSkA/b5EXwt42Cez/nK4ABYg=" + }, + "compressible": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/compressible/-/compressible-2.0.7.tgz", + "integrity": "sha1-IFjFJyL9PxU4pPIqsU0GNZBNGa4=", + "requires": { + "mime-db": ">= 1.21.0 < 2" + }, + "dependencies": { + "mime-db": { + "version": "1.21.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.21.0.tgz", + "integrity": "sha1-m1I54zU89usBWgDYkCYQJ8NtS6w=" + } + } + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + }, + "vary": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.0.tgz", + "integrity": "sha1-4eWv+70WrnaN0mdDlLmtMCJlMUA=" + } + } + }, + "connect": { + "version": "3.4.1", + "resolved": "https://registry.npmjs.org/connect/-/connect-3.4.1.tgz", + "integrity": "sha1-ohNh0/QJnvdhzabcSpc7seuwo00=", + "requires": { + "debug": "~2.2.0", + "finalhandler": "0.4.1", + "parseurl": "~1.3.1", + "utils-merge": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "finalhandler": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-0.4.1.tgz", + "integrity": "sha1-haF8bFmpRxfSYtYSMNSw6+PUoU0=", + "requires": { + "debug": "~2.2.0", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" + } + } + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "utils-merge": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.0.tgz", + "integrity": "sha1-ApT7kiu5N1FTVBxPcJYjHyh8ivg=" + } + } + }, + "mime": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/mime/-/mime-1.3.4.tgz", + "integrity": "sha1-EV+eO2s9rylZmDyzjxSaLUDrXVM=" + }, + "morgan": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.6.1.tgz", + "integrity": "sha1-X9gYOYxoGcuiinzWZk8pL+HAu/I=", + "requires": { + "basic-auth": "~1.0.3", + "debug": "~2.2.0", + "depd": "~1.0.1", + "on-finished": "~2.3.0", + "on-headers": "~1.0.0" + }, + "dependencies": { + "basic-auth": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/basic-auth/-/basic-auth-1.0.3.tgz", + "integrity": "sha1-QfVVI+WJQFA47jVnlYxipe1wVRo=" + }, + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + }, + "dependencies": { + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + } + } + }, + "depd": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.0.1.tgz", + "integrity": "sha1-gK7GTJ1tl+ZcwqnKqTwKpqv3Oqo=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "on-headers": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.1.tgz", + "integrity": "sha1-ko9dD0cNSTQmUepnlLCFfBAGk/c=" + } + } + }, + "object-assign": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.0.1.tgz", + "integrity": "sha1-mVBEVsNZi1ytT8WcJuipuxB/4L0=" + }, + "opn": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/opn/-/opn-3.0.3.tgz", + "integrity": "sha1-ttmec5n3jWXDuq/+8fsojpuFJDo=", + "requires": { + "object-assign": "^4.0.1" + } + }, + "serve-static": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.10.2.tgz", + "integrity": "sha1-/rgA0OciEk3QsAMzFgwW6cqovLM=", + "requires": { + "escape-html": "~1.0.3", + "parseurl": "~1.3.1", + "send": "0.13.1" + }, + "dependencies": { + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" + }, + "parseurl": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.1.tgz", + "integrity": "sha1-yKuMkiO6NIiKpkopeyiFO+wY2lY=" + }, + "send": { + "version": "0.13.1", + "resolved": "https://registry.npmjs.org/send/-/send-0.13.1.tgz", + "integrity": "sha1-ow1fTILIqbrprQCh2bG9vm8Zntc=", + "requires": { + "debug": "~2.2.0", + "depd": "~1.1.0", + "destroy": "~1.0.4", + "escape-html": "~1.0.3", + "etag": "~1.7.0", + "fresh": "0.3.0", + "http-errors": "~1.3.1", + "mime": "1.3.4", + "ms": "0.7.1", + "on-finished": "~2.3.0", + "range-parser": "~1.0.3", + "statuses": "~1.2.1" + }, + "dependencies": { + "debug": { + "version": "2.2.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.2.0.tgz", + "integrity": "sha1-+HBX6ZWxofauaklgZkE3vFbwOdo=", + "requires": { + "ms": "0.7.1" + } + }, + "depd": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.0.tgz", + "integrity": "sha1-4b2Cxqq2ztlluXuIsX7T5SjKGMM=" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" + }, + "etag": { + "version": "1.7.0", + "resolved": "https://registry.npmjs.org/etag/-/etag-1.7.0.tgz", + "integrity": "sha1-A9MLX2fdbmMtKUXTDWZScxo01dg=" + }, + "fresh": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.3.0.tgz", + "integrity": "sha1-ZR+DjiJCTnVm3hYdg1jKoZn4PU8=" + }, + "http-errors": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.3.1.tgz", + "integrity": "sha1-GX4izevUGYWF6GlO9nhhl7ke2UI=", + "requires": { + "inherits": "~2.0.1", + "statuses": "1" + } + }, + "ms": { + "version": "0.7.1", + "resolved": "https://registry.npmjs.org/ms/-/ms-0.7.1.tgz", + "integrity": "sha1-nNE8A62/8ltl7/3nzoZO6VIBcJg=" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", + "requires": { + "ee-first": "1.1.1" + }, + "dependencies": { + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" + } + } + }, + "range-parser": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.0.3.tgz", + "integrity": "sha1-aHKCNTXGkuLCoBA4Jq/YLC4P8XU=" + }, + "statuses": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.2.1.tgz", + "integrity": "sha1-3e1FzBglbVHtQK7BQkidXGECbSg=" + } + } + } + } + } + } + }, + "hexo-util": { + "version": "0.6.3", + "resolved": "https://registry.npm.taobao.org/hexo-util/download/hexo-util-0.6.3.tgz", + "integrity": "sha1-FqKt5Fe++VWvDf0io/5vCkmpE3w=", + "requires": { + "bluebird": "^3.4.0", + "camel-case": "^3.0.0", + "cross-spawn": "^4.0.0", + "highlight.js": "^9.4.0", + "html-entities": "^1.2.0", + "striptags": "^2.1.1" + } + }, + "highlight.js": { + "version": "9.12.0", + "resolved": "https://registry.npm.taobao.org/highlight.js/download/highlight.js-9.12.0.tgz", + "integrity": "sha1-5tnb5Xy+/mB1HwKvM2GVhwyQwB4=" + }, + "hoek": { + "version": "4.2.0", + "resolved": "https://registry.npm.taobao.org/hoek/download/hoek-4.2.0.tgz", + "integrity": "sha1-ctnQdU9/4lyi0BrY+PmpRJqJUm0=", + "optional": true + }, + "html-entities": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/html-entities/download/html-entities-1.2.1.tgz", + "integrity": "sha1-DfKTUfByEWNRXfueVUPl9u7VFi8=" + }, + "htmlparser2": { + "version": "3.8.3", + "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.8.3.tgz", + "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "requires": { + "domelementtype": "1", + "domhandler": "2.3", + "domutils": "1.5", + "entities": "1.0", + "readable-stream": "1.1" + }, + "dependencies": { + "entities": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/entities/download/entities-1.0.0.tgz", + "integrity": "sha1-sph6o4ITR/zeZCsk/fyeT7cSvyY=" + } + } + }, + "http-signature": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/http-signature/download/http-signature-1.2.0.tgz", + "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "jsprim": "^1.2.2", + "sshpk": "^1.7.0" + } + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + }, + "ignore-walk": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.1.tgz", + "integrity": "sha512-DTVlMx3IYPe0/JJcYP7Gxg7ttZZu3IInhuEhbchuqneY9wWe5Ojy2mXLBaQFUQmo0AW2r3qG7m1mg86js+gnlQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "inflight": { + "version": "1.0.6", + "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", + "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "requires": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npm.taobao.org/inherits/download/inherits-2.0.3.tgz", + "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" + }, + "ini": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz", + "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==" + }, + "invariant": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz", + "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==", + "requires": { + "loose-envify": "^1.0.0" + } + }, + "invert-kv": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/invert-kv/download/invert-kv-1.0.0.tgz", + "integrity": "sha1-EEqOSqym09jNFXqO+L+rLXo//bY=" + }, + "is-binary-path": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/is-binary-path/download/is-binary-path-1.0.1.tgz", + "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=", + "requires": { + "binary-extensions": "^1.0.0" + } + }, + "is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npm.taobao.org/is-buffer/download/is-buffer-1.1.6.tgz", + "integrity": "sha1-76ouqdqg16suoTqXsritUf776L4=" + }, + "is-dotfile": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/is-dotfile/download/is-dotfile-1.0.3.tgz", + "integrity": "sha1-pqLzL/0t+wT1yiXs0Pa4PPeYoeE=" + }, + "is-equal-shallow": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/is-equal-shallow/download/is-equal-shallow-0.1.3.tgz", + "integrity": "sha1-IjgJj8Ih3gvPpdnqxMRdY4qhxTQ=", + "requires": { + "is-primitive": "^2.0.0" + } + }, + "is-extendable": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-extendable/download/is-extendable-0.1.1.tgz", + "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=" + }, + "is-extglob": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-extglob/download/is-extglob-1.0.0.tgz", + "integrity": "sha1-rEaBd8SUNAWgkvyPKXYMb/xiBsA=" + }, + "is-fullwidth-code-point": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-fullwidth-code-point/download/is-fullwidth-code-point-1.0.0.tgz", + "integrity": "sha1-754xOG8DGn8NZDr4L95QxFfvAMs=", + "requires": { + "number-is-nan": "^1.0.0" + } + }, + "is-glob": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/is-glob/download/is-glob-2.0.1.tgz", + "integrity": "sha1-0Jb5JqPe1WAPP9/ZEZjLCIjC2GM=", + "requires": { + "is-extglob": "^1.0.0" + } + }, + "is-number": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz", + "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "requires": { + "kind-of": "^3.0.2" + } + }, + "is-plain-object": { + "version": "2.0.4", + "resolved": "https://registry.npm.taobao.org/is-plain-object/download/is-plain-object-2.0.4.tgz", + "integrity": "sha1-LBY7P6+xtgbZ0Xko8FwqHDjgdnc=", + "requires": { + "isobject": "^3.0.1" + }, + "dependencies": { + "isobject": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-3.0.1.tgz", + "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=" + } + } + }, + "is-posix-bracket": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/is-posix-bracket/download/is-posix-bracket-0.1.1.tgz", + "integrity": "sha1-MzTceXdDaOkvAW5vvAqI9c1ua8Q=" + }, + "is-primitive": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/is-primitive/download/is-primitive-2.0.0.tgz", + "integrity": "sha1-IHurkWOEmcB7Kt8kCkGochADRXU=" + }, + "is-typedarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/is-typedarray/download/is-typedarray-1.0.0.tgz", + "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo=", + "optional": true + }, + "isarray": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", + "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + }, + "isexe": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", + "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + }, + "isobject": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", + "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "requires": { + "isarray": "1.0.0" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + } + } + }, + "isstream": { + "version": "0.1.2", + "resolved": "https://registry.npm.taobao.org/isstream/download/isstream-0.1.2.tgz", + "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo=", + "optional": true + }, + "js-tokens": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", + "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + }, + "js-yaml": { + "version": "3.10.0", + "resolved": "https://registry.npm.taobao.org/js-yaml/download/js-yaml-3.10.0.tgz", + "integrity": "sha1-LnhEFka9RoLpY/IrbpKCPDCcYtw=", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "dependencies": { + "esprima": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz", + "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=" + } + } + }, + "jsbn": { + "version": "0.1.1", + "resolved": "https://registry.npm.taobao.org/jsbn/download/jsbn-0.1.1.tgz", + "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM=", + "optional": true + }, + "jsdom": { + "version": "7.2.2", + "resolved": "https://registry.npm.taobao.org/jsdom/download/jsdom-7.2.2.tgz", + "integrity": "sha1-QLQCdwwr2iNGkJa+6Rq2deOx/G4=", + "optional": true, + "requires": { + "abab": "^1.0.0", + "acorn": "^2.4.0", + "acorn-globals": "^1.0.4", + "cssom": ">= 0.3.0 < 0.4.0", + "cssstyle": ">= 0.2.29 < 0.3.0", + "escodegen": "^1.6.1", + "nwmatcher": ">= 1.3.7 < 2.0.0", + "parse5": "^1.5.1", + "request": "^2.55.0", + "sax": "^1.1.4", + "symbol-tree": ">= 3.1.0 < 4.0.0", + "tough-cookie": "^2.2.0", + "webidl-conversions": "^2.0.0", + "whatwg-url-compat": "~0.6.5", + "xml-name-validator": ">= 2.0.1 < 3.0.0" + } + }, + "json-schema": { + "version": "0.2.3", + "resolved": "https://registry.npm.taobao.org/json-schema/download/json-schema-0.2.3.tgz", + "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM=", + "optional": true + }, + "json-schema-traverse": { + "version": "0.3.1", + "resolved": "https://registry.npm.taobao.org/json-schema-traverse/download/json-schema-traverse-0.3.1.tgz", + "integrity": "sha1-NJptRMU6Ud6JtAgFxdXlm0F9M0A=", + "optional": true + }, + "json-stringify-safe": { + "version": "5.0.1", + "resolved": "https://registry.npm.taobao.org/json-stringify-safe/download/json-stringify-safe-5.0.1.tgz", + "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus=", + "optional": true + }, + "jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz", + "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + }, + "jsprim": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", + "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", + "optional": true, + "requires": { + "assert-plus": "1.0.0", + "extsprintf": "1.3.0", + "json-schema": "0.2.3", + "verror": "1.10.0" + } + }, + "kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + }, + "lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/lazy-cache/download/lazy-cache-1.0.4.tgz", + "integrity": "sha1-odePw6UEdMuAhF07O24dpJpEbo4=" + }, + "lcid": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/lcid/download/lcid-1.0.0.tgz", + "integrity": "sha1-MIrMr6C8SDo4Z7S28rlQYlHRuDU=", + "requires": { + "invert-kv": "^1.0.0" + } + }, + "levn": { + "version": "0.3.0", + "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", + "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + } + }, + "lodash": { + "version": "4.17.5", + "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.5.tgz", + "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE=" + }, + "longest": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/longest/download/longest-1.0.1.tgz", + "integrity": "sha1-MKCy2jj3N3DoKUoNIuZiXtd9AJc=" + }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, + "lower-case": { + "version": "1.1.4", + "resolved": "https://registry.npm.taobao.org/lower-case/download/lower-case-1.1.4.tgz", + "integrity": "sha1-miyr0bno4K6ZOkv31YdcOcQujqw=" + }, + "lru-cache": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/lru-cache/download/lru-cache-4.1.1.tgz", + "integrity": "sha1-Yi4y6CSItJJ5EUpPns9F581rulU=", + "requires": { + "pseudomap": "^1.0.2", + "yallist": "^2.1.2" + } + }, + "markdown": { + "version": "0.5.0", + "resolved": "https://registry.npm.taobao.org/markdown/download/markdown-0.5.0.tgz", + "integrity": "sha1-KCBbVlqK51kt4gdGPWY33BgnIrI=", + "requires": { + "nopt": "~2.1.1" + } + }, + "mathjax-full": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mathjax-full/-/mathjax-full-3.0.1.tgz", + "integrity": "sha512-KE4z2FF9PzKIHnK0HsMkThqLaOi+2DqN2T+QqqP465+vmCzftZyqXr7e6fp60xPC4nXTeMM1rcbBQJ9yjqwPAw==", + "requires": { + "esm": "^3.2.25", + "mj-context-menu": "^0.2.2", + "speech-rule-engine": "^3.0.0-beta.8" + } + }, + "micromatch": { + "version": "2.3.11", + "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz", + "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "requires": { + "arr-diff": "^2.0.0", + "array-unique": "^0.2.1", + "braces": "^1.8.2", + "expand-brackets": "^0.1.4", + "extglob": "^0.3.1", + "filename-regex": "^2.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.1", + "kind-of": "^3.0.2", + "normalize-path": "^2.0.1", + "object.omit": "^2.0.0", + "parse-glob": "^3.0.4", + "regex-cache": "^0.4.2" + } + }, + "mime-db": { + "version": "1.30.0", + "resolved": "https://registry.npm.taobao.org/mime-db/download/mime-db-1.30.0.tgz", + "integrity": "sha1-dMZD2i3Z1qRTmZY0ZbJtXKfXHwE=", + "optional": true + }, + "mime-types": { + "version": "2.1.17", + "resolved": "https://registry.npm.taobao.org/mime-types/download/mime-types-2.1.17.tgz", + "integrity": "sha1-Cdejk/A+mVp5+K+Fe3Cp4KsWVXo=", + "optional": true, + "requires": { + "mime-db": "~1.30.0" + } + }, + "minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", + "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "requires": { + "brace-expansion": "^1.1.7" + } + }, + "minimist": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-1.2.0.tgz", + "integrity": "sha1-o1AIsg9BOD7sH7kU9M1d95omQoQ=" + }, + "minipass": { + "version": "2.3.5", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-2.3.5.tgz", + "integrity": "sha512-Gi1W4k059gyRbyVUZQ4mEqLm0YIUiGYfvxhF6SIlk3ui1WVxMTGfGdQ2SInh3PDrRTVvPKgULkpJtT4RH10+VA==", + "requires": { + "safe-buffer": "^5.1.2", + "yallist": "^3.0.0" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "minizlib": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-1.2.1.tgz", + "integrity": "sha512-7+4oTUOWKg7AuL3vloEWekXY2/D20cevzsrNT2kGWm+39J9hGTCBv8VI5Pm5lXZ/o3/mdR4f8rflAPhnQb8mPA==", + "requires": { + "minipass": "^2.2.1" + } + }, + "mj-context-menu": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/mj-context-menu/-/mj-context-menu-0.2.2.tgz", + "integrity": "sha512-OHlnKQqfFPEYZGdz2JWL0obrr82vVilha0WCUZslYfN+v+oz4VpmERnoHdTUWvOUVHNYjFkpOYnLEeHnt1BdsQ==" + }, + "mkdirp": { + "version": "0.5.1", + "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", + "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "requires": { + "minimist": "0.0.8" + }, + "dependencies": { + "minimist": { + "version": "0.0.8", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.8.tgz", + "integrity": "sha1-hX/Kv8M5fSYluCKCYuhqp6ARsF0=" + } + } + }, + "moment": { + "version": "2.20.1", + "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.20.1.tgz", + "integrity": "sha1-1usaRsvMFKKy+UNBEsH/iQfzE/0=" + }, + "moment-timezone": { + "version": "0.5.14", + "resolved": "https://registry.npm.taobao.org/moment-timezone/download/moment-timezone-0.5.14.tgz", + "integrity": "sha1-TrOP+VOLgBCLpGekWPPtQmjM/LE=", + "requires": { + "moment": ">= 2.9.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" + }, + "mv": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/mv/download/mv-2.1.1.tgz", + "integrity": "sha1-rmzg1vbV4KT32JN5jQPB6pVZtqI=", + "optional": true, + "requires": { + "mkdirp": "~0.5.1", + "ncp": "~2.0.0", + "rimraf": "~2.4.0" + } + }, + "nan": { + "version": "2.8.0", + "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.8.0.tgz", + "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", + "optional": true + }, + "ncp": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/ncp/download/ncp-2.0.0.tgz", + "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", + "optional": true + }, + "needle": { + "version": "2.2.4", + "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", + "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "requires": { + "debug": "^2.1.2", + "iconv-lite": "^0.4.4", + "sax": "^1.2.4" + } + }, + "no-case": { + "version": "2.3.2", + "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", + "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "requires": { + "lower-case": "^1.1.1" + } + }, + "node-fingerprint": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/node-fingerprint/download/node-fingerprint-0.0.2.tgz", + "integrity": "sha1-Mcur63GmeufdWn3AQuUcPHWGhQE=" + }, + "node-pre-gyp": { + "version": "0.11.0", + "resolved": "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz", + "integrity": "sha512-TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==", + "requires": { + "detect-libc": "^1.0.2", + "mkdirp": "^0.5.1", + "needle": "^2.2.1", + "nopt": "^4.0.1", + "npm-packlist": "^1.1.6", + "npmlog": "^4.0.2", + "rc": "^1.2.7", + "rimraf": "^2.6.1", + "semver": "^5.3.0", + "tar": "^4" + }, + "dependencies": { + "glob": { + "version": "7.1.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", + "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "requires": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.4", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + } + }, + "nopt": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz", + "integrity": "sha1-0NRoWv1UFRk8jHUFYC0NF81kR00=", + "requires": { + "abbrev": "1", + "osenv": "^0.1.4" + } + }, + "rimraf": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz", + "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==", + "requires": { + "glob": "^7.1.3" + } + } + } + }, + "nopt": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/nopt/download/nopt-2.1.2.tgz", + "integrity": "sha1-bMzZd7gBMqB3MdbozljCyDA8+a8=", + "requires": { + "abbrev": "1" + } + }, + "normalize-path": { + "version": "2.1.1", + "resolved": "https://registry.npm.taobao.org/normalize-path/download/normalize-path-2.1.1.tgz", + "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=", + "requires": { + "remove-trailing-separator": "^1.0.1" + } + }, + "npm-bundled": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.0.6.tgz", + "integrity": "sha512-8/JCaftHwbd//k6y2rEWp6k1wxVfpFzB6t1p825+cUb7Ym2XQfhwIC5KwhrvzZRJu+LtDE585zVaS32+CGtf0g==" + }, + "npm-packlist": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.1.tgz", + "integrity": "sha512-+TcdO7HJJ8peiiYhvPxsEDhF3PJFGUGRcFsGve3vxvxdcpO2Z4Z7rkosRM0kWj6LfbK/P0gu3dzk5RU1ffvFcw==", + "requires": { + "ignore-walk": "^3.0.1", + "npm-bundled": "^1.0.1" + } + }, + "npmlog": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz", + "integrity": "sha512-2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==", + "requires": { + "are-we-there-yet": "~1.1.2", + "console-control-strings": "~1.1.0", + "gauge": "~2.7.3", + "set-blocking": "~2.0.0" + } + }, + "nth-check": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/nth-check/download/nth-check-1.0.1.tgz", + "integrity": "sha1-mSms32KPwsQQmN6rgqxYDPFJquQ=", + "requires": { + "boolbase": "~1.0.0" + } + }, + "number-is-nan": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/number-is-nan/download/number-is-nan-1.0.1.tgz", + "integrity": "sha1-CXtgK1NCKlIsGvuHkDGDNpQaAR0=" + }, + "nunjucks": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/nunjucks/download/nunjucks-3.0.1.tgz", + "integrity": "sha1-TedKPlULr2+jNwMj89HHwqhr3E0=", + "requires": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "chokidar": "^1.6.0", + "yargs": "^3.32.0" + } + }, + "nwmatcher": { + "version": "1.4.3", + "resolved": "https://registry.npm.taobao.org/nwmatcher/download/nwmatcher-1.4.3.tgz", + "integrity": "sha1-ZDSOOz2A8DW0CsEVY9J4+LctuJw=", + "optional": true + }, + "oauth-sign": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/oauth-sign/download/oauth-sign-0.8.2.tgz", + "integrity": "sha1-Rqarfwrq2N6unsBWV4C31O/rnUM=", + "optional": true + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npm.taobao.org/object-assign/download/object-assign-4.1.1.tgz", + "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=" + }, + "object.omit": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/object.omit/download/object.omit-2.0.1.tgz", + "integrity": "sha1-Gpx0SCnznbuFjHbKNXmuKlTr0fo=", + "requires": { + "for-own": "^0.1.4", + "is-extendable": "^0.1.1" + } + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/once/download/once-1.4.0.tgz", + "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", + "requires": { + "wrappy": "1" + } + }, + "optimist": { + "version": "0.6.1", + "resolved": "https://registry.npm.taobao.org/optimist/download/optimist-0.6.1.tgz", + "integrity": "sha1-2j6nRob6IaGaERwybpDrFaAZZoY=", + "requires": { + "minimist": "~0.0.1", + "wordwrap": "~0.0.2" + }, + "dependencies": { + "minimist": { + "version": "0.0.10", + "resolved": "https://registry.npm.taobao.org/minimist/download/minimist-0.0.10.tgz", + "integrity": "sha1-3j+YVD2/lggr5IrRoMfNqDYwHc8=" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.3.tgz", + "integrity": "sha1-o9XabNXAvAAI03I0u68b7WMFkQc=" + } + } + }, + "optionator": { + "version": "0.8.2", + "resolved": "https://registry.npm.taobao.org/optionator/download/optionator-0.8.2.tgz", + "integrity": "sha1-NkxeQJ0/TWMB1sC0wFu6UBgK62Q=", + "optional": true, + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.4", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "wordwrap": "~1.0.0" + } + }, + "os-homedir": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/os-homedir/download/os-homedir-1.0.2.tgz", + "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=" + }, + "os-locale": { + "version": "1.4.0", + "resolved": "https://registry.npm.taobao.org/os-locale/download/os-locale-1.4.0.tgz", + "integrity": "sha1-IPnxeuKe00XoveWDsT0gCYA8FNk=", + "requires": { + "lcid": "^1.0.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=" + }, + "osenv": { + "version": "0.1.5", + "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz", + "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==", + "requires": { + "os-homedir": "^1.0.0", + "os-tmpdir": "^1.0.0" + } + }, + "parse-glob": { + "version": "3.0.4", + "resolved": "https://registry.npm.taobao.org/parse-glob/download/parse-glob-3.0.4.tgz", + "integrity": "sha1-ssN2z7EfNVE7rdFz7wu246OIORw=", + "requires": { + "glob-base": "^0.3.0", + "is-dotfile": "^1.0.0", + "is-extglob": "^1.0.0", + "is-glob": "^2.0.0" + } + }, + "parse5": { + "version": "1.5.1", + "resolved": "https://registry.npm.taobao.org/parse5/download/parse5-1.5.1.tgz", + "integrity": "sha1-m387DeMr543CQBsXVzzK8Pb1nZQ=", + "optional": true + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/path-is-absolute/download/path-is-absolute-1.0.1.tgz", + "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" + }, + "performance-now": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/performance-now/download/performance-now-2.1.0.tgz", + "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns=", + "optional": true + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/prelude-ls/download/prelude-ls-1.1.2.tgz", + "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=", + "optional": true + }, + "preserve": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/preserve/download/preserve-0.2.0.tgz", + "integrity": "sha1-gV7R9uvGWSb4ZbMQwHE7yzMVzks=" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/pretty-hrtime/download/pretty-hrtime-1.0.3.tgz", + "integrity": "sha1-t+PqQkNaTJsnWdmeDyAesZWALuE=" + }, + "process-nextick-args": { + "version": "1.0.7", + "resolved": "https://registry.npm.taobao.org/process-nextick-args/download/process-nextick-args-1.0.7.tgz", + "integrity": "sha1-FQ4gt1ZZCtP5EJPyWk8q2L/zC6M=" + }, + "pseudomap": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/pseudomap/download/pseudomap-1.0.2.tgz", + "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=" + }, + "punycode": { + "version": "1.4.1", + "resolved": "https://registry.npm.taobao.org/punycode/download/punycode-1.4.1.tgz", + "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=", + "optional": true + }, + "qs": { + "version": "6.5.1", + "resolved": "https://registry.npm.taobao.org/qs/download/qs-6.5.1.tgz", + "integrity": "sha1-NJzfbu+J7EXBLX1es/wMhwNDptg=", + "optional": true + }, + "randomatic": { + "version": "1.1.7", + "resolved": "https://registry.npm.taobao.org/randomatic/download/randomatic-1.1.7.tgz", + "integrity": "sha1-x6vpzIuHwLqodrGf3oP9RkeX44w=", + "requires": { + "is-number": "^3.0.0", + "kind-of": "^4.0.0" + }, + "dependencies": { + "is-number": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-3.0.0.tgz", + "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=", + "requires": { + "kind-of": "^3.0.2" + }, + "dependencies": { + "kind-of": { + "version": "3.2.2", + "resolved": "http://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", + "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "kind-of": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-4.0.0.tgz", + "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=", + "requires": { + "is-buffer": "^1.1.5" + } + } + } + }, + "rc": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", + "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", + "requires": { + "deep-extend": "^0.6.0", + "ini": "~1.3.0", + "minimist": "^1.2.0", + "strip-json-comments": "~2.0.1" + } + }, + "readable-stream": { + "version": "1.1.14", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-1.1.14.tgz", + "integrity": "sha1-fPTFTvZI44EwhMY23SB54WbAgdk=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.1", + "isarray": "0.0.1", + "string_decoder": "~0.10.x" + } + }, + "readdirp": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/readdirp/download/readdirp-2.1.0.tgz", + "integrity": "sha1-TtCtBg3zBzMAxIRANz9y0cxkLXg=", + "requires": { + "graceful-fs": "^4.1.2", + "minimatch": "^3.0.2", + "readable-stream": "^2.0.2", + "set-immediate-shim": "^1.0.1" + }, + "dependencies": { + "isarray": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", + "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + }, + "readable-stream": { + "version": "2.3.3", + "resolved": "https://registry.npm.taobao.org/readable-stream/download/readable-stream-2.3.3.tgz", + "integrity": "sha1-No8lEtefnUb9/HE0mueHi7weuVw=", + "requires": { + "core-util-is": "~1.0.0", + "inherits": "~2.0.3", + "isarray": "~1.0.0", + "process-nextick-args": "~1.0.6", + "safe-buffer": "~5.1.1", + "string_decoder": "~1.0.3", + "util-deprecate": "~1.0.1" + } + }, + "string_decoder": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-1.0.3.tgz", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", + "requires": { + "safe-buffer": "~5.1.0" + } + } + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "regex-cache": { + "version": "0.4.4", + "resolved": "https://registry.npm.taobao.org/regex-cache/download/regex-cache-0.4.4.tgz", + "integrity": "sha1-db3FiioUls7EihKDW8VMjVYjNt0=", + "requires": { + "is-equal-shallow": "^0.1.3" + } + }, + "remove-trailing-separator": { + "version": "1.1.0", + "resolved": "https://registry.npm.taobao.org/remove-trailing-separator/download/remove-trailing-separator-1.1.0.tgz", + "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" + }, + "repeat-element": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/repeat-element/download/repeat-element-1.1.2.tgz", + "integrity": "sha1-7wiaF40Ug7quTZPrmLT55OEdmQo=" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npm.taobao.org/repeat-string/download/repeat-string-1.6.1.tgz", + "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=" + }, + "request": { + "version": "2.83.0", + "resolved": "https://registry.npm.taobao.org/request/download/request-2.83.0.tgz", + "integrity": "sha1-ygtl2gLtYpNYh4COb1EDgQNOM1Y=", + "optional": true, + "requires": { + "aws-sign2": "~0.7.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.3.1", + "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.17", + "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.1.0" + } + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npm.taobao.org/right-align/download/right-align-0.1.3.tgz", + "integrity": "sha1-YTObci/mo1FWiSENJOFMlhSGE+8=", + "requires": { + "align-text": "^0.1.1" + } + }, + "rimraf": { + "version": "2.4.5", + "resolved": "https://registry.npm.taobao.org/rimraf/download/rimraf-2.4.5.tgz", + "integrity": "sha1-7nEM5dk6j9uFb7Xqj/Di11k0sto=", + "optional": true, + "requires": { + "glob": "^6.0.1" + } + }, + "safe-buffer": { + "version": "5.1.1", + "resolved": "https://registry.npm.taobao.org/safe-buffer/download/safe-buffer-5.1.1.tgz", + "integrity": "sha1-iTMSr2myEj3vcfV4iQAWce6yyFM=" + }, + "safe-json-stringify": { + "version": "1.0.4", + "resolved": "https://registry.npm.taobao.org/safe-json-stringify/download/safe-json-stringify-1.0.4.tgz", + "integrity": "sha1-gaCY9Efku8P/MxKiQ1IbwGDvWRE=", + "optional": true + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npm.taobao.org/sax/download/sax-1.2.4.tgz", + "integrity": "sha1-KBYjTiN4vdxOU1T6tcqold9xANk=" + }, + "semver": { + "version": "5.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz", + "integrity": "sha512-RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=" + }, + "set-immediate-shim": { + "version": "1.0.1", + "resolved": "https://registry.npm.taobao.org/set-immediate-shim/download/set-immediate-shim-1.0.1.tgz", + "integrity": "sha1-SysbJ+uAip+NzEgaWOXlb1mfP2E=" + }, + "signal-exit": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz", + "integrity": "sha1-tf3AjxKH6hF4Yo5BXiUTK3NkbG0=" + }, + "sntp": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/sntp/download/sntp-2.1.0.tgz", + "integrity": "sha1-LGzsFP7cIiJznK+bXD2F0cxaLMg=", + "optional": true, + "requires": { + "hoek": "4.x.x" + } + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npm.taobao.org/source-map/download/source-map-0.5.7.tgz", + "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=" + }, + "speech-rule-engine": { + "version": "3.0.0-beta.8", + "resolved": "https://registry.npmjs.org/speech-rule-engine/-/speech-rule-engine-3.0.0-beta.8.tgz", + "integrity": "sha512-gnNap93Xrz5ngIqa/BOaJGatC64B7dqDrXK/pr4yAaZAcW6tKVO5PwaTvw9QqVab86ad5scpA39Nxwhlb11tTg==", + "requires": { + "commander": "*", + "wicked-good-xpath": "*", + "xmldom-sre": "^0.1.31" + } + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npm.taobao.org/sprintf-js/download/sprintf-js-1.0.3.tgz", + "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=" + }, + "sshpk": { + "version": "1.13.1", + "resolved": "https://registry.npm.taobao.org/sshpk/download/sshpk-1.13.1.tgz", + "integrity": "sha1-US322mKHFEMW3EwY/hzx2UBzm+M=", + "optional": true, + "requires": { + "asn1": "~0.2.3", + "assert-plus": "^1.0.0", + "bcrypt-pbkdf": "^1.0.0", + "dashdash": "^1.12.0", + "ecc-jsbn": "~0.1.1", + "getpass": "^0.1.1", + "jsbn": "~0.1.0", + "tweetnacl": "~0.14.0" + } + }, + "string-width": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/string-width/download/string-width-1.0.2.tgz", + "integrity": "sha1-EYvfW4zcUaKn5w0hHgfisLmxB9M=", + "requires": { + "code-point-at": "^1.0.0", + "is-fullwidth-code-point": "^1.0.0", + "strip-ansi": "^3.0.0" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "string_decoder": { + "version": "0.10.31", + "resolved": "https://registry.npm.taobao.org/string_decoder/download/string_decoder-0.10.31.tgz", + "integrity": "sha1-YuIDvEF2bGwoyfyEMB2rHFMQ+pQ=" + }, + "stringstream": { + "version": "0.0.5", + "resolved": "https://registry.npm.taobao.org/stringstream/download/stringstream-0.0.5.tgz", + "integrity": "sha1-TkhM1N5aC7vuGORjB3EKioFiGHg=", + "optional": true + }, + "strip-ansi": { + "version": "4.0.0", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-4.0.0.tgz", + "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=", + "requires": { + "ansi-regex": "^3.0.0" + }, + "dependencies": { + "ansi-regex": { + "version": "3.0.0", + "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-3.0.0.tgz", + "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=" + } + } + }, + "strip-indent": { + "version": "2.0.0", + "resolved": "https://registry.npm.taobao.org/strip-indent/download/strip-indent-2.0.0.tgz", + "integrity": "sha1-XvjbKV0B5u1sv3qrlpmNeCJSe2g=" + }, + "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=" + }, + "striptags": { + "version": "2.2.1", + "resolved": "https://registry.npm.taobao.org/striptags/download/striptags-2.2.1.tgz", + "integrity": "sha1-TEULcI1BuL85zyTEn/I0/Gqr/TI=" + }, + "supports-color": { + "version": "4.5.0", + "resolved": "https://registry.npm.taobao.org/supports-color/download/supports-color-4.5.0.tgz", + "integrity": "sha1-vnoN5ITexcXN34s9WRJQRJEvY1s=", + "requires": { + "has-flag": "^2.0.0" + } + }, + "swig-extras": { + "version": "0.0.1", + "resolved": "https://registry.npm.taobao.org/swig-extras/download/swig-extras-0.0.1.tgz", + "integrity": "sha1-tQP+3jcqucJMasaMr2VrzvGHIyg=", + "requires": { + "markdown": "~0.5.0" + } + }, + "swig-templates": { + "version": "2.0.2", + "resolved": "https://registry.npm.taobao.org/swig-templates/download/swig-templates-2.0.2.tgz", + "integrity": "sha1-0lAqcwMBk1b06nbqkGXU9Yr2q3U=", + "requires": { + "optimist": "~0.6", + "uglify-js": "2.6.0" + } + }, + "symbol-tree": { + "version": "3.2.2", + "resolved": "https://registry.npm.taobao.org/symbol-tree/download/symbol-tree-3.2.2.tgz", + "integrity": "sha1-rifbOPZgp64uHDt9G8KQgZuFGeY=", + "optional": true + }, + "tar": { + "version": "4.4.8", + "resolved": "https://registry.npmjs.org/tar/-/tar-4.4.8.tgz", + "integrity": "sha512-LzHF64s5chPQQS0IYBn9IN5h3i98c12bo4NCO7e0sGM2llXQ3p2FGC5sdENN4cTW48O915Sh+x+EXx7XW96xYQ==", + "requires": { + "chownr": "^1.1.1", + "fs-minipass": "^1.2.5", + "minipass": "^2.3.4", + "minizlib": "^1.1.1", + "mkdirp": "^0.5.0", + "safe-buffer": "^5.1.2", + "yallist": "^3.0.2" + }, + "dependencies": { + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "yallist": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.0.3.tgz", + "integrity": "sha512-S+Zk8DEWE6oKpV+vI3qWkaK+jSbIK86pCwe2IF/xwIpQ8jEuxpw9NyaGjmp9+BoJv5FV2piqCDcoCtStppiq2A==" + } + } + }, + "text-table": { + "version": "0.2.0", + "resolved": "https://registry.npm.taobao.org/text-table/download/text-table-0.2.0.tgz", + "integrity": "sha1-f17oI66AUgfACvLfSoTsP8+lcLQ=" + }, + "through": { + "version": "2.3.8", + "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", + "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + }, + "tildify": { + "version": "1.2.0", + "resolved": "https://registry.npm.taobao.org/tildify/download/tildify-1.2.0.tgz", + "integrity": "sha1-3OwD9V3Km3qj5bBPIYF+tW5jWIo=", + "requires": { + "os-homedir": "^1.0.0" + } + }, + "titlecase": { + "version": "1.1.2", + "resolved": "https://registry.npm.taobao.org/titlecase/download/titlecase-1.1.2.tgz", + "integrity": "sha1-eBE9EQgIa4MmMxoyR96o9aSeqFM=" + }, + "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=" + }, + "tough-cookie": { + "version": "2.3.3", + "resolved": "https://registry.npm.taobao.org/tough-cookie/download/tough-cookie-2.3.3.tgz", + "integrity": "sha1-C2GKVWW23qkL80JdBNVe3EdadWE=", + "optional": true, + "requires": { + "punycode": "^1.4.1" + } + }, + "tr46": { + "version": "0.0.3", + "resolved": "https://registry.npm.taobao.org/tr46/download/tr46-0.0.3.tgz", + "integrity": "sha1-gYT9NH2snNwYWZLzpmIuFLnZq2o=", + "optional": true + }, + "tunnel-agent": { + "version": "0.6.0", + "resolved": "https://registry.npm.taobao.org/tunnel-agent/download/tunnel-agent-0.6.0.tgz", + "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=", + "optional": true, + "requires": { + "safe-buffer": "^5.0.1" + } + }, + "tweetnacl": { + "version": "0.14.5", + "resolved": "https://registry.npm.taobao.org/tweetnacl/download/tweetnacl-0.14.5.tgz", + "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q=", + "optional": true + }, + "type-check": { + "version": "0.3.2", + "resolved": "https://registry.npm.taobao.org/type-check/download/type-check-0.3.2.tgz", + "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=", + "optional": true, + "requires": { + "prelude-ls": "~1.1.2" + } + }, + "uglify-js": { + "version": "2.6.0", + "resolved": "https://registry.npm.taobao.org/uglify-js/download/uglify-js-2.6.0.tgz", + "integrity": "sha1-JeqhzDVQ45QQzu+v0c+7a20V8AE=", + "requires": { + "async": "~0.2.6", + "source-map": "~0.5.1", + "uglify-to-browserify": "~1.0.0", + "yargs": "~3.10.0" + }, + "dependencies": { + "camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", + "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + }, + "cliui": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", + "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "requires": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "window-size": { + "version": "0.1.0", + "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.0.tgz", + "integrity": "sha1-VDjNLqk7IC76Ohn+iIeu58lPnJ0=" + }, + "wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", + "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + }, + "yargs": { + "version": "3.10.0", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz", + "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "requires": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + } + } + }, + "uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/uglify-to-browserify/download/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha1-bgkk1r2mta/jSeOabWMoUKD4grc=" + }, + "underscore": { + "version": "1.9.2", + "resolved": "https://registry.npmjs.org/underscore/-/underscore-1.9.2.tgz", + "integrity": "sha512-D39qtimx0c1fI3ya1Lnhk3E9nONswSKhnffBI0gME9C99fYOkNi04xs8K6pePLhvl1frbDemkaBQ5ikWllR2HQ==" + }, + "upper-case": { + "version": "1.1.3", + "resolved": "https://registry.npm.taobao.org/upper-case/download/upper-case-1.1.3.tgz", + "integrity": "sha1-9rRQHC7EzdJrp4vnIilh3ndiFZg=" + }, + "util-deprecate": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/util-deprecate/download/util-deprecate-1.0.2.tgz", + "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" + }, + "uuid": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/uuid/download/uuid-3.2.1.tgz", + "integrity": "sha1-EsUou51Y0LkmXZovbw/ovhf/HxQ=", + "optional": true + }, + "verror": { + "version": "1.10.0", + "resolved": "https://registry.npm.taobao.org/verror/download/verror-1.10.0.tgz", + "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=", + "optional": true, + "requires": { + "assert-plus": "^1.0.0", + "core-util-is": "1.0.2", + "extsprintf": "^1.2.0" + } + }, + "warehouse": { + "version": "2.2.0", + "resolved": "https://registry.npm.taobao.org/warehouse/download/warehouse-2.2.0.tgz", + "integrity": "sha1-XQnWSUKZK+Zn2PfIagnCuK6gQGI=", + "requires": { + "JSONStream": "^1.0.7", + "bluebird": "^3.2.2", + "cuid": "~1.3.8", + "graceful-fs": "^4.1.3", + "is-plain-object": "^2.0.1", + "lodash": "^4.2.1" + } + }, + "webidl-conversions": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/webidl-conversions/download/webidl-conversions-2.0.1.tgz", + "integrity": "sha1-O/glj30xjHRDw28uFpQCoaZwNQY=", + "optional": true + }, + "whatwg-url-compat": { + "version": "0.6.5", + "resolved": "https://registry.npm.taobao.org/whatwg-url-compat/download/whatwg-url-compat-0.6.5.tgz", + "integrity": "sha1-AImBEa9om7CXVBzVpFymyHmERb8=", + "optional": true, + "requires": { + "tr46": "~0.0.1" + } + }, + "which": { + "version": "1.3.0", + "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.0.tgz", + "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "requires": { + "isexe": "^2.0.0" + } + }, + "wicked-good-xpath": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/wicked-good-xpath/-/wicked-good-xpath-1.3.0.tgz", + "integrity": "sha1-gbDpXoZQ5JyUsiKY//hoa1VTz2w=" + }, + "wide-align": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz", + "integrity": "sha512-QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==", + "requires": { + "string-width": "^1.0.2 || 2" + } + }, + "window-size": { + "version": "0.1.4", + "resolved": "https://registry.npm.taobao.org/window-size/download/window-size-0.1.4.tgz", + "integrity": "sha1-+OGqHuWlPsW/FR/6CXQqatdpeHY=" + }, + "wordwrap": { + "version": "1.0.0", + "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-1.0.0.tgz", + "integrity": "sha1-J1hIEIkUVqQXHI0CJkQa3pDLyus=", + "optional": true + }, + "wrap-ansi": { + "version": "2.1.0", + "resolved": "https://registry.npm.taobao.org/wrap-ansi/download/wrap-ansi-2.1.0.tgz", + "integrity": "sha1-2Pw9KE3QV5T+hJc8rs3Rz4JP3YU=", + "requires": { + "string-width": "^1.0.1", + "strip-ansi": "^3.0.1" + }, + "dependencies": { + "strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npm.taobao.org/strip-ansi/download/strip-ansi-3.0.1.tgz", + "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=", + "requires": { + "ansi-regex": "^2.0.0" + } + } + } + }, + "wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", + "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + }, + "xml-name-validator": { + "version": "2.0.1", + "resolved": "https://registry.npm.taobao.org/xml-name-validator/download/xml-name-validator-2.0.1.tgz", + "integrity": "sha1-TYuPHszTQZqjYgYb7O9RXh5VljU=", + "optional": true + }, + "xmldom-sre": { + "version": "0.1.31", + "resolved": "https://registry.npmjs.org/xmldom-sre/-/xmldom-sre-0.1.31.tgz", + "integrity": "sha512-f9s+fUkX04BxQf+7mMWAp5zk61pciie+fFLC9hX9UVvCeJQfNHRHXpeo5MPcR0EUf57PYLdt+ZO4f3Ipk2oZUw==" + }, + "y18n": { + "version": "3.2.1", + "resolved": "https://registry.npm.taobao.org/y18n/download/y18n-3.2.1.tgz", + "integrity": "sha1-bRX7qITAhnnA136I53WegR4H+kE=" + }, + "yallist": { + "version": "2.1.2", + "resolved": "https://registry.npm.taobao.org/yallist/download/yallist-2.1.2.tgz", + "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=" + }, + "yargs": { + "version": "3.32.0", + "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.32.0.tgz", + "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "requires": { + "camelcase": "^2.0.1", + "cliui": "^3.0.3", + "decamelize": "^1.1.1", + "os-locale": "^1.4.0", + "string-width": "^1.0.1", + "window-size": "^0.1.4", + "y18n": "^3.2.0" + } + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..2696930 --- /dev/null +++ b/package.json @@ -0,0 +1,27 @@ +{ + "name": "hexo-site", + "version": "0.0.0", + "private": true, + "hexo": { + "version": "3.5.0" + }, + "dependencies": { + "canvas": "^2.4.0", + "hexo": "^3.5.0", + "hexo-browsersync": "^0.2.0", + "hexo-deployer-rsync": "^0.1.3", + "hexo-filter-mathjax": "^0.4.1", + "hexo-generator-archive": "^0.1.4", + "hexo-generator-category": "^0.1.3", + "hexo-generator-feed": "^1.1.0", + "hexo-generator-index": "^0.2.0", + "hexo-generator-sitemap": "^1.1.2", + "hexo-generator-tag": "^0.2.0", + "hexo-inject": "^1.0.0", + "hexo-renderer-ejs": "^0.1.1", + "hexo-renderer-jade": "^0.1.0", + "hexo-renderer-marked": "^0.2.9", + "hexo-renderer-stylus": "^0.3.0", + "hexo-server": "^0.1.3" + } +} diff --git a/public/2016/02/12/first-post/index.html b/public/2016/02/12/first-post/index.html new file mode 100644 index 0000000..ffdd6a0 --- /dev/null +++ b/public/2016/02/12/first-post/index.html @@ -0,0 +1,120 @@ + First Post · MarkDown

First Post

This is the very first post I wrote,

+

with Typora & Hexo.

+
\ No newline at end of file diff --git a/public/2016/02/15/Flask-Day-1/index.html b/public/2016/02/15/Flask-Day-1/index.html new file mode 100644 index 0000000..29aa144 --- /dev/null +++ b/public/2016/02/15/Flask-Day-1/index.html @@ -0,0 +1,145 @@ + Flask Day 1 · MarkDown

Flask Day 1

“Hello World” in Flask

Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

+
1
$ python3 -m venv flask
+

Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

+

And you should install flask and extensions by the commands below:

+
1
2
3
4
5
6
7
8
9
10
11
12
$ flask/bin/pip install flask
$ flask/bin/pip install flask-login
$ flask/bin/pip install flask-openid
$ flask/bin/pip install flask-mail
$ flask/bin/pip install flask-sqlalchemy
$ flask/bin/pip install sqlalchemy-migrate
$ flask/bin/pip install flask-whooshalchemy
$ flask/bin/pip install flask-wtf
$ flask/bin/pip install flask-babel
$ flask/bin/pip install guess_language
$ flask/bin/pip install flipflop
$ flask/bin/pip install coverage
+

After that, let’s create the basic structure for our application: app app/static app/templates tmp.

+
    +
  1. app — where the application package is
  2. +
  3. static — stores static files like images, javascripts, and css.
  4. +
  5. templates — where templates will go.
  6. +
+

Then you can start with __init__.py which should put into app folder (file app/__init__.py):

+
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
+

The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

+

Let’s see what a views function looks like (file app/views.py):

+
1
2
3
4
from flask import Flask

app = Flask(__name__)
from app import views
+

Finally we should create a script to starts up the web server with our application(file run.py):

+
1
2
3
#!flask/bin/python
from app import app
app.run(debug=True)
+

To indicating that is an executable file you need to run this in terminal:

+
1
$ chmod a+x run.py
+

Now the file structure should look like:

+
1
2
3
4
5
6
7
8
9
10
microblog\
flask\
<virtual environment files>
app\
static\
templates\
__init__.py
views.py
tmp\
run.py
+

Then start to write the template (file app/templates/index.html):

+
1
2
3
4
5
6
7
8
9
10
11
<html>

<head>
<title>{{ title }} - microblog</title>
</head>

<body>
<h1>Hello, {{ user.nickname }}!</h1>
</body>

</html>
+

Now let’s write the view function that uses this template (file app/views.py):

+
1
2
3
4
5
6
7
8
9
10
from flask import render_template
from app import app

@app.route('/')
@app.route('/index')
def index():
user = {'nickname': 'ching'} # fake user
return render_template('index.html',
title='Home',
user=user)
+

render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

+
\ No newline at end of file diff --git a/public/2016/02/16/Flask-Day-2/index.html b/public/2016/02/16/Flask-Day-2/index.html new file mode 100644 index 0000000..890d67a --- /dev/null +++ b/public/2016/02/16/Flask-Day-2/index.html @@ -0,0 +1,129 @@ + Flask Day 2 · MarkDown

Flask Day 2

To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

+
1
2
WTF_CSRF_ENABLED = True
SECRET_KEY = 'you-will-never-guess'
+

And then you need to use this config (file app/__init__.py):

+
1
2
3
4
5
6
from flask import Flask

app = Flask(__name__)
app.config.from_object('config')

from app import views
+

Let’s build a simple form (file app/forms.app):

+
1
2
3
4
5
6
7
from flask.ext.wtf import Form
from wtforms import StringField, BooleanField
from wtforms.validators import DataRequired

class LoginForm(Form):
openid = StringField('openid', validators=[DataRequired()])
remember_me = BooleanField('remember_me', default=False)
+

The DataRequired() is a validator that checks the field is empty or not.

+

After that, we need a HTML page to show the form (file app/templates/login.html):

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<!-- extend from base layout -->
{% extends "base.html" %}

{% block content %}
<h1>Sign In</h1>
<form action="" method="post" name="login">
{{ form.hidden_tag() }}
<p>
Please enter your OpenID:<br>
{{ form.openid(size=80) }}<br>
</p>
<p>{{ form.remember_me }} Remember Me</p>
<p><input type="submit" value="Sign In"></p>
</form>
{% endblock %}
+

The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from flask import render_template, flash, redirect
from app import app
from .forms import LoginForm

# index view function suppressed for brevity

app.route('/login', methods=['GET', 'POST'])
def login():
form = LoginForm()
if form.validate_on_submit():
flash('Login requested for OpenID="%s", remember_me=%s' %
(form.openid.data, str(form.remember_me.data)))
return redirect('/index')
return render_template('login.html',
title='Sign In',
form=form)
+
\ No newline at end of file diff --git a/public/2016/04/25/Django-Manager-Method/index.html b/public/2016/04/25/Django-Manager-Method/index.html new file mode 100644 index 0000000..2b1f4eb --- /dev/null +++ b/public/2016/04/25/Django-Manager-Method/index.html @@ -0,0 +1,132 @@ + Django Manager Method · MarkDown

Django Manager Method

Django Manager

Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

+

eg.

+
1
2
3
4
5
from django.db import models

class Person(models.Model):
...
people = models.Manager()
+

上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

+

自定义 Manager

通常需要自定义 manager 的情况有两点:

+
    +
  1. 需要修改/扩展 Django 的 manager 方法
  2. +
  3. 需要修改返回的 QuerySet
  4. +
+

默认 Manager

如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

+

笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

+

eg.

+
1
2
3
4
5
6
class Book(models.Model):
title = models.CharField(max_length=100)
author = models.CharField(max_length=50)

objects = models.Manager() # default manager
custom_objects = CustomBOokManager() # custom manager
+

source

+
\ No newline at end of file diff --git a/public/2016/05/04/Tastypie/index.html b/public/2016/05/04/Tastypie/index.html new file mode 100644 index 0000000..9706ca0 --- /dev/null +++ b/public/2016/05/04/Tastypie/index.html @@ -0,0 +1,131 @@ + Tastypie · MarkDown

Tastypie

Resources in Tastypie

Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

+

Understanding the process of creating a resource.

+
    +
  1. Import ModelResource from Tastypie.
  2. +
  3. Import models from services app
  4. +
  5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
  6. +
+

Add API URL in the urls.py of app.

+

Dehydrating the JSON data

flow

+

Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

+
Dehydrate_field method

This dehydrate_field is uesd to modify field on the response JSON.

+
Dehydrate method

Dehydrate method is useful for aadding additional fields to bundle (response data).

+

Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

+
\ No newline at end of file diff --git a/public/2016/05/10/TastyPie-Note-1/index.html b/public/2016/05/10/TastyPie-Note-1/index.html new file mode 100644 index 0000000..150f3be --- /dev/null +++ b/public/2016/05/10/TastyPie-Note-1/index.html @@ -0,0 +1,155 @@ + TastyPie Note 1 · MarkDown

TastyPie Note 1

Flow Through The Request/Response Cycle

Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

+

Walking through what a GET request to a list endpoint looks like:

+
    +
  • The Resource.urls are checked by Django’s url resolvers.

    +
  • +
  • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

    +
  • +
  • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

    +
  • +
  • dispatch does a bunch of havy lifting. It ensures:

    +
      +
    • the requested HTTP method is in allowed_methos (method_check).
    • +
    • the class has a method that can handle the request(get_list)
    • +
    • the user is authenticated(is_authenticated)
    • +
    • the user has no exceeded their throttle(throttle_check).
    • +
    +

    At this point, dispatch actually calls the requested method (get_list).

    +
  • +
  • get_list does the actual work of API. It does:

    +
      +
    • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
    • +
    • It then sorts the objects based on user input (ModelResource.apply_sorting).
    • +
    • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
    • +
    • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
    • +
    • Finally, it calls Resource.create_response.
    • +
    +
  • +
  • create_response is a shortcut method that:

    +
      +
    • Determines the desired response format (Resource.determine_format).
    • +
    • Serializes the data given to it in the proper format.
    • +
    • Returns a Django HttpResponse (200 OK) with the serialized data.
    • +
    +
  • +
  • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

    +
  • +
+
\ No newline at end of file diff --git a/public/2018/05/16/test/index.html b/public/2018/05/16/test/index.html new file mode 100644 index 0000000..f3cd306 --- /dev/null +++ b/public/2018/05/16/test/index.html @@ -0,0 +1,6 @@ + test · MarkDown

test

test title


+

fadafasd

+

fasdasf

+
+

fasdf

+
\ No newline at end of file diff --git a/public/2018/05/31/bash-function-and-awk/index.html b/public/2018/05/31/bash-function-and-awk/index.html new file mode 100644 index 0000000..50860ea --- /dev/null +++ b/public/2018/05/31/bash-function-and-awk/index.html @@ -0,0 +1,130 @@ + bash function and awk · MarkDown

bash function and awk

I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

+

bash functions

Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

+
1
2
3
4
function run {
source ~/Develop/django/bin/activate
./manage.py runserver
}
+

I activate django virtural enviroment first and then run django serve.

+

Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

+
1
2
function ba { hgba | grep "$1" }
# hgba is an alias for hg branches
+

I can just type ba release then get current release branch info.

+
+

Append:

+

I made some updates to the ba function and make it auto copying the branch result to my clipboard:

+
1
2

function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
+

awk

awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

+
\ No newline at end of file diff --git a/public/2019/03/12/Postgresql-Partitioning/index.html b/public/2019/03/12/Postgresql-Partitioning/index.html new file mode 100644 index 0000000..06b5740 --- /dev/null +++ b/public/2019/03/12/Postgresql-Partitioning/index.html @@ -0,0 +1,146 @@ + Postgresql Partitioning · MarkDown

Postgresql Partitioning

Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

+

Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

+

There are two forms of partitioning can be implemented in PostgreSQL:

+
    +
  • Range Partitioning

    +

    ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

    +
  • +
  • List Partitioning

    +

    ​ The table is partitioned by explicitly listing which key values appear in each partition.

    +
  • +
+

Implementing Partitioning

    +
  1. Create the “master” / “parent” table, from which all the partitions will inherit.

    +

    ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

    +
  2. +
  3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

    +
  4. +
  5. Add table constraints to the partition tables to define the allowed key values in each partitions.

    +

    ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

    +
  6. +
  7. Create indexes on column(s) for each partitions.

    +
  8. +
  9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

    +
  10. +
  11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

    +
  12. +
+

Trigger

As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

+
\ No newline at end of file diff --git a/public/2019/11/14/AWS-KMS/index.html b/public/2019/11/14/AWS-KMS/index.html new file mode 100644 index 0000000..20494a8 --- /dev/null +++ b/public/2019/11/14/AWS-KMS/index.html @@ -0,0 +1,121 @@ + AWS KMS · MarkDown

AWS KMS

We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

+

Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

+

TBD

+
\ No newline at end of file diff --git a/public/2020/03/17/leetcode-121/index.html b/public/2020/03/17/leetcode-121/index.html new file mode 100644 index 0000000..cf8c4db --- /dev/null +++ b/public/2020/03/17/leetcode-121/index.html @@ -0,0 +1,125 @@ + leetcode-121 · MarkDown

leetcode-121

121. 买卖股票的最佳时机

题目

+ +

原始答案:

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
max_sellout = prices[0]
l = len(prices)
i = 0
for buyin in prices:
if i == l:
return profit
if min_buyin <= buyin:
max_sellout = max(prices[i:])
p = max_sellout - min_buyin
if p > profit:
profit = p
if buyin < min_buyin:
min_buyin = buyin
i += 1
return profit
#1880 ms 14.4 MB
+

主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。

+

仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样

+
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def maxProfit(self, prices) -> int:
profit = 0
if not prices:
return profit
min_buyin = prices[0]
for i in range(1, len(prices)):
min_buyin = min(min_buyin, prices[i-1])
profit = max(prices[i] - min_buyin, profit)
return profit
#44 ms 14.4 MB
+
\ No newline at end of file diff --git a/public/2020/03/18/leetcode-206/index.html b/public/2020/03/18/leetcode-206/index.html new file mode 100644 index 0000000..e05764d --- /dev/null +++ b/public/2020/03/18/leetcode-206/index.html @@ -0,0 +1,128 @@ + leetcode-206 · MarkDown

leetcode-206

206. 反转链表

题目

+ +

最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
nl = []
while head.next:
nl.append(head)
head = head.next
nl.append(head)
l = len(nl)
for x in range(l):
if x == 0:
nl[x].next = None
continue
nl[x].next = nl[x-1]
if x == (l - 1):
return nl[x]
+

仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了:

+
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def reverseList(self, head):
if not head or not head.next:
return head
prev_node = None
next_node = head.next
while head:
next_node = head.next
head.next = prev_node
prev_node = head
head = next_node
return prev_node
+

然后是递归的做法,主要思路是一直进到最深一层–也就是链表的最后一个–的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。

+
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def reverseList(self, head):
if not head:
return head
if head.next:
ss = Solution()
last = ss.reverseList(head.next)
head.next.next = head
head.next = None
return last
return head
+

一开始是用list来打草稿,不过想明白递归之后就大同小异了:

+
1
2
3
4
5
6
7
8
9
def a(l:list)->list:
k=[l[0]]

if l[1:]:
b=a(l[1:])
b.extend(k)
else:
return [l[0]]
return b
+
\ No newline at end of file diff --git a/public/2020/03/23/leetcode-169/index.html b/public/2020/03/23/leetcode-169/index.html new file mode 100644 index 0000000..a6956c9 --- /dev/null +++ b/public/2020/03/23/leetcode-169/index.html @@ -0,0 +1,126 @@ + leetcode-169 · MarkDown

leetcode-169

169. 多数元素

题目

+ +

一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\cfrac{n}{2}$ 时就可以得出结果。

+
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def majorityElement(self, nums) -> int:
d = {}
l = len(nums)
for n in nums:
if not n in d:
d[n] = 0
d[n] = d[n] + 1
if d[n] > l/2:
return n
# 64 ms 15.1 MB
+

Python 也有专门计数的库,写起来更简单一点:

+
1
2
3
4
5
class Solution:
def majorityElement(self, nums):
counts = collections.Counter(nums)
return max(counts.keys(), key=counts.get)
# 44 ms 15.1 MB
+

由于要找的数出现次数大于 $\cfrac{n}{2}$,脑子里掠过一下蒙特卡罗算法,后来在官方解答中也看到类似的思路了:

+
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def majorityElement(self, nums):
majority_count = len(nums)//2
while True:
candidate = random.choice(nums)
if sum(1 for elem in nums if elem == candidate) > majority_count:
return candidate

#作者:LeetCode-Solution
#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/
#来源:力扣(LeetCode)
#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+
\ No newline at end of file diff --git a/public/2020/03/23/leetcode-225/index.html b/public/2020/03/23/leetcode-225/index.html new file mode 100644 index 0000000..02b6a24 --- /dev/null +++ b/public/2020/03/23/leetcode-225/index.html @@ -0,0 +1,122 @@ + leetcode-225 · MarkDown

leetcode-225

225. 用队列实现栈

题目

+ +

注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
class MyStack:

def __init__(self):
"""
Initialize your data structure here.
"""
self.data = []


def push(self, x: int) -> None:
"""
Push element x onto stack.
"""
self.data.append(x)
return


def pop(self) -> int:
"""
Removes the element on top of the stack and returns that element.
"""
return self.data.pop(-1)


def top(self) -> int:
"""
Get the top element.
"""
return self.data[-1]


def empty(self) -> bool:
"""
Returns whether the stack is empty.
"""
return not bool(self.data)



# Your MyStack object will be instantiated and called as such:
# obj = MyStack()
# obj.push(x)
# param_2 = obj.pop()
# param_3 = obj.top()
# param_4 = obj.empty()

#24 ms 13.5 MB
+
\ No newline at end of file diff --git a/public/2020/03/25/leetcode-409/index.html b/public/2020/03/25/leetcode-409/index.html new file mode 100644 index 0000000..ceb8262 --- /dev/null +++ b/public/2020/03/25/leetcode-409/index.html @@ -0,0 +1,123 @@ + leetcode-409 · MarkDown

leetcode-409

409. 最长回文串

题目

+ +

一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。

+

这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def longestPalindrome(self, s: str) -> int:
d = {}
for l in s:
if not l in d:
d[l] = 0
d[l] += 1

i = 0
odd = False
for k, v in d.items():
if v % 2:
i += (v-1)
odd = True
else:
i += v
if odd:
i += 1
return i

#40 ms 13.6 MB
+
\ No newline at end of file diff --git a/public/2020/03/25/leetcode-543/index.html b/public/2020/03/25/leetcode-543/index.html new file mode 100644 index 0000000..7ef6f85 --- /dev/null +++ b/public/2020/03/25/leetcode-543/index.html @@ -0,0 +1,125 @@ + leetcode-543 · MarkDown

leetcode-543

543. 二叉树的直径

题目

+ +

这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# Definition for a binary tree node.
class TreeNode:
def __init__(self, x):
self.val = x
self.left = None
self.right = None

class Solution:
def diameterOfBinaryTree(self, root: TreeNode) -> int:
if not root:
return 0
last_node = -1
routes = []
start = root
node_stack = [root]
while (start.left or start.right or node_stack):
if start != node_stack[-1]:
node_stack.append(start)

if last_node == start.right:
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]
continue

if start.left and last_node != start.left:
start = start.left
last_node = start
continue

if start.right:
start = start.right
last_node = start
continue

routes.append(node_stack)
node_stack = node_stack[:-1]
if not node_stack:
break
last_node = start
start = node_stack[-1]

max_l = 0
for route in routes:
for route_ in routes:
intersection = 0
if route != route_:
intersection = len(set(route).intersection(set(route_)))
if intersection:
intersection -= 1
max_l = max(max_l, len(set(route)| set(route_)) - intersection)
return max_l - 1
+

L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。

+

其实以某个点为根节点的树的直径,就是某个节点的左子树的深度和右子树的深度的和,用递归来处理这个会比较容易理解

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
class Solution(object):
def diameterOfBinaryTree(self, root):
self.ans = 1
def depth(node):
# 访问到空节点了,返回0
if not node: return 0
# 左儿子为根的子树的深度
L = depth(node.left)
# 右儿子为根的子树的深度
R = depth(node.right)
# 计算d_node即L+R+1 并更新ans
self.ans = max(self.ans, L+R+1)
# 返回该节点为根的子树的深度
return max(L, R) + 1

depth(root)
return self.ans - 1

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+
\ No newline at end of file diff --git a/public/2020/03/25/leetcode-836/index.html b/public/2020/03/25/leetcode-836/index.html new file mode 100644 index 0000000..25944b8 --- /dev/null +++ b/public/2020/03/25/leetcode-836/index.html @@ -0,0 +1,122 @@ + leetcode-836 · MarkDown

leetcode-836

836. 矩形重叠

题目

+ +

看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。

+
1
2
3
4
5
6
7
8
9
class Solution:
def isRectangleOverlap(self, rec1, rec2) -> bool:
return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0]))
and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1])))

s = Solution()
s.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3])

#40 ms 13.7 MB
+
\ No newline at end of file diff --git a/public/2020/03/26/leetcode-876/index.html b/public/2020/03/26/leetcode-876/index.html new file mode 100644 index 0000000..189c66d --- /dev/null +++ b/public/2020/03/26/leetcode-876/index.html @@ -0,0 +1,124 @@ + leetcode-876 · MarkDown

leetcode-876

876. 链表的中间结点

题目

+ +

思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
# Definition for singly-linked list.
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def middleNode(self, head: ListNode) -> ListNode:
l = []
n = head
while n.next:
l.append(n)
n = n.next
l.append(n)
return l[len(l)//2]

#44 ms 13.7 MB
+

看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。

+
1
2
3
4
5
6
7
8
9
10
11
12
class Solution:
def middleNode(self, head: ListNode) -> ListNode:
slow = fast = head
while fast and fast.next:
slow = slow.next
fast = fast.next.next
return slow

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+
\ No newline at end of file diff --git a/public/2020/03/29/leetcode-1013/index.html b/public/2020/03/29/leetcode-1013/index.html new file mode 100644 index 0000000..cc4514f --- /dev/null +++ b/public/2020/03/29/leetcode-1013/index.html @@ -0,0 +1,122 @@ + leetcode-1013 · MarkDown

leetcode-1013

1013. 将数组分成和相等的三个部分

题目

+ +

因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def canThreePartsEqualSum(self, A) -> bool:
if not A:
return False
sa = sum(A)
if sa % 3:
return False
s = sa // 3
s1 = 0
s2 = 0


for i in range(len(A)):
s1 += A[i]
if s1 == s and (i+1) < len(A):
for j in range(len(A[i+1:])):
s2 += A[i+1+j]
if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s:
return True
return False
#60 ms 18.7 MB
+
\ No newline at end of file diff --git a/public/2020/03/29/leetcode-914/index.html b/public/2020/03/29/leetcode-914/index.html new file mode 100644 index 0000000..c7c5317 --- /dev/null +++ b/public/2020/03/29/leetcode-914/index.html @@ -0,0 +1,122 @@ + leetcode-914 · MarkDown

leetcode-914

914. 卡牌分组

题目

+ +

将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
class Solution:
def hasGroupsSizeX(self, deck) -> bool:
dc = {}
max_d = 0
for d in deck:
if d not in dc:
dc[d] = 0
dc[d] += 1
if max_d < d:
max_d = d
if max_d < dc[d]:
max_d = dc[d]
has_x = True
if max_d == 1:
max_d = 2

for i in range(2, max_d + 1):
has_x = True
for k,v in dc.items():
if v % i:
has_x = False
break
if has_x and i >= 2:
return True
return False

#56 ms 13.8 MB
+
\ No newline at end of file diff --git a/public/2020/03/30/leetcode-1071/index.html b/public/2020/03/30/leetcode-1071/index.html new file mode 100644 index 0000000..0871898 --- /dev/null +++ b/public/2020/03/30/leetcode-1071/index.html @@ -0,0 +1,123 @@ + leetcode-1071 · MarkDown

leetcode-1071

1071. 字符串的最大公因子

题目

+ +

如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def gcdOfStrings(self, str1: str, str2: str) -> str:
if str1[0] != str2[0]:
return ''

a = len(str1)
b = len(str2)
print(a, b)
if a < b:
str1, str2 = str2, str1
a = len(str1)
b = len(str2)

if not a%b:
for x in range(0, a//b):
if str1[x*b:(x+1)*b] != str2:
return ''
return str2
else:
for x in range(b, 0, -1):
print(x)
if x==b or b%x or a%x:
continue
for y in range(0, b//x):
if str2[y*x:(y+1)*x] != str2[b-x:b]:
return ''
for y in range(0, a//x):
if str1[y*x:(y+1)*x] != str2[0:x]:
return ''
return str2[0:x]
# 44 ms 13.9 MB
+

官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,可以证明必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。

+
\ No newline at end of file diff --git a/public/2020/03/30/leetcode-999/index.html b/public/2020/03/30/leetcode-999/index.html new file mode 100644 index 0000000..92c4c9b --- /dev/null +++ b/public/2020/03/30/leetcode-999/index.html @@ -0,0 +1,123 @@ + leetcode-999 · MarkDown

leetcode-999

999. 可以被一步捕获的棋子数

题目

+ +

遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
class Solution:
def numRookCaptures(self, board) -> int:
i = j = 0
for row in board:
if 'R' in row:
break
i += 1
j = row.index('R')
count = 0
# right
for x in range(j + 1, 8):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# left
for x in range(j, 0, -1):
if row[x] == 'p':
count += 1
break
if row[x] == 'B':
break
# up
for x in range(i, 0, -1):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break
# down
for x in range(i+1, 8):
if board[x][j] == 'p':
count += 1
break
if board[x][j] == 'B':
break

return count

#36 ms 13.6 MB
+

问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。

+
\ No newline at end of file diff --git a/public/2020/04/01/leetcode-1103/index.html b/public/2020/04/01/leetcode-1103/index.html new file mode 100644 index 0000000..c2a16a2 --- /dev/null +++ b/public/2020/04/01/leetcode-1103/index.html @@ -0,0 +1,122 @@ + leetcode-1103 · MarkDown

leetcode-1103

1103. 分糖果 II

题目

+ +

小学奥数题。主要思路就是等差数列求和 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def distributeCandies(self, candies: int, num_people: int):
total = 0
i = 0
# import ipdb; ipdb.set_trace()
while total <= candies:
t = (num_people*i)*num_people + int((1+num_people)*num_people/2)
if total + t <= candies:
total += t
i += 1
else:
break
remaining = candies - total
print(total, remaining, i)
l = []
for n in range(1, num_people+1):
if not total:
current_candy = n
else:
current_candy = n+i*num_people

n_count = int((0+(i-1))*(i)/2)
print(current_candy, n_count)
if remaining >= current_candy:
l.append(n_count*num_people + n*i + current_candy)
remaining -= current_candy
else:
l.append(n_count*num_people + n*i + remaining)
remaining = 0
return l
# 28 ms 13.7 MB,
+
\ No newline at end of file diff --git a/public/2020/04/01/leetcode-1160/index.html b/public/2020/04/01/leetcode-1160/index.html new file mode 100644 index 0000000..8ca9277 --- /dev/null +++ b/public/2020/04/01/leetcode-1160/index.html @@ -0,0 +1,122 @@ + leetcode-1160 · MarkDown

leetcode-1160

1160. 拼写单词

题目

+ +

利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
class Solution:
def countCharacters(self, words, chars: str) -> int:

words_ = ''
for w in words:
lchars = list(chars)
try:
for l in w:
lchars.remove(l)
except:
continue
words_ += w

return len(words_)
# 152 ms 14.1 MB
+
\ No newline at end of file diff --git a/public/2020/04/01/leetcode-compress-string-lcci/index.html b/public/2020/04/01/leetcode-compress-string-lcci/index.html new file mode 100644 index 0000000..1d54f2f --- /dev/null +++ b/public/2020/04/01/leetcode-compress-string-lcci/index.html @@ -0,0 +1,122 @@ + leetcode-compress-string-lcci · MarkDown

leetcode-compress-string-lcci

面试题 01.06. 字符串压缩

题目

+ +

遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
class Solution:
def compressString(self, S: str) -> str:
if not S:
return S
c = ''
prev = S[0]
p_len = 1
for w in S[1:]:
if w != prev:
c += '%s%s' % (prev, p_len)
prev = w
p_len = 1
else:
p_len += 1
c += '%s%s' % (prev, p_len)
if len(S) > len(c):
return c
return S
# 52 ms 13.8 MB
+
\ No newline at end of file diff --git a/public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html b/public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html new file mode 100644 index 0000000..c6367ef --- /dev/null +++ b/public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html @@ -0,0 +1,123 @@ + leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof · MarkDown

leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof

面试题57 - II. 和为s的连续正数序列

题目

+ +

又是小学奥数。由等差数列求和公式 可知,当首项为 1 的时候项数最多,又由于是连续正整数,,那最大的 就不大于

+

由小到大遍历 ,可以求得首项。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import math
class Solution:
def findContinuousSequence(self, target: int):
n = int(math.sqrt(2 * target) + 1)
if n < 2:
return []
sum_list = []
a = 0
for i in range(2, n+1):
a = ((2 * target) / i + 1 - i) / 2
if a and not a % 1:
a = int(a)
s_ = []
for j in range(0, i):
s_.append(a + j)
sum_list.append(s_)
return sorted(sum_list)
# 60 ms 13.7 MB
+
\ No newline at end of file diff --git a/public/2020/04/09/leetcode-the-masseuse-lcci/index.html b/public/2020/04/09/leetcode-the-masseuse-lcci/index.html new file mode 100644 index 0000000..8e0e735 --- /dev/null +++ b/public/2020/04/09/leetcode-the-masseuse-lcci/index.html @@ -0,0 +1,126 @@ + leetcode-the-masseuse-lcci · MarkDown

leetcode-the-masseuse-lcci

面试题 17.16. 按摩师

题目

+ +

一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 时刻, 为当前预约不接的情况下最长预约时间, 则为接受当前预约的最长预约时间。

+

那很显然,由于不能接受相邻两个预约,

+

不接受当前预约的话,上一个预约接不接受都可以,

+

最后只要比较两种情况即可

+
1
2
3
4
5
6
7
8
9
10
11
class Solution:
def massage(self, nums) -> int:
if not nums:
return 0
n = len(nums)
not_choose = 0
choose = 0
for n in nums:
not_choose, choose = max(not_choose, choose), not_choose+n
return max(not_choose, choose)
# 52 ms 13.6 MB
+

这种问题原来有个名字叫动态规划,上面推导的方程叫状态转移方程,可以找找资料来看一下。

+
\ No newline at end of file diff --git a/public/2020/04/14/leetcode-add-two-numbers-ii/index.html b/public/2020/04/14/leetcode-add-two-numbers-ii/index.html new file mode 100644 index 0000000..af69e6e --- /dev/null +++ b/public/2020/04/14/leetcode-add-two-numbers-ii/index.html @@ -0,0 +1,125 @@ + leetcode-add-two-numbers-ii · MarkDown

leetcode-add-two-numbers-ii

445. 两数相加 II

题目

+ +

看到顺序的链表就想到用倒序链表的方法做,折腾了半天

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class ListNode:
def __init__(self, x):
self.val = x
self.next = None

class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
def _reverse(l):
if l.next:
last = _reverse(l.next)
l.next.next = l
l.next = None
return last
return l

l1e = _reverse(l1)
l2e = _reverse(l2)
new_l = ListNode(0)
head = new_l
c = 0
import ipdb; ipdb.set_trace()
while l1e and l2e:
new_val = l1e.val + l2e.val
if c==1:
new_val += 1
c = 0
if new_val >= 10:
new_val -= 10
c = 1

new_l.val = new_val
next_n = None
if l1e.next and l2e.next or c:
next_n = ListNode(c)
new_l.next = next_n
new_l = next_n
l1e = l1e.next
l2e = l2e.next
if l2e:
l1e = l2e
if not l1e and c:
l1e = ListNode(0)
while l1e:
new_l.val = l1e.val
new_l.val += c
c = 0
if new_l.val >= 10:
c = 1
new_l.val -= 10
l1e = l1e.next
if l1e:
new_l.next = ListNode(0)
new_l = new_l.next
else:
new_l.next = ListNode(1)

return _reverse(head)

# 84 ms 13.9 MB
+

最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Solution:
def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode:
s1, s2 = [], []
while l1:
s1.append(l1.val)
l1 = l1.next
while l2:
s2.append(l2.val)
l2 = l2.next
ans = None
carry = 0
while s1 or s2 or carry != 0:
a = 0 if not s1 else s1.pop()
b = 0 if not s2 else s2.pop()
cur = a + b + carry
carry = cur // 10
cur %= 10
curnode = ListNode(cur)
curnode.next = ans
ans = curnode
return ans

作者:LeetCode-Solution
链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/
来源:力扣(LeetCode)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+

不过就执行效率来看差不多。

+
\ No newline at end of file diff --git a/public/2020/04/14/leetcode-design-twitter/index.html b/public/2020/04/14/leetcode-design-twitter/index.html new file mode 100644 index 0000000..05857eb --- /dev/null +++ b/public/2020/04/14/leetcode-design-twitter/index.html @@ -0,0 +1,123 @@ + leetcode-design-twitter · MarkDown

leetcode-design-twitter

355. 设计推特

题目

+ +

做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 twitterId 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。

+

主要的考点应该是 多路归并 这个东西。我用的是排序,在数据量大的时候应该会有些问题。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
class Twitter:

def __init__(self):
"""
Initialize your data structure here.
"""
self.tweets = {}
self.followers = {}
self._tid = 0


def postTweet(self, userId: int, tweetId: int) -> None:
"""
Compose a new tweet.
"""
if not self.tweets.get(userId):
self.tweets[userId] = []
self.tweets[userId].append((self._tid, tweetId))
self._tid += 1


def getNewsFeed(self, userId: int) :
"""
Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.
"""
foers = self.followers.get(userId, set())
foers = foers.union((userId,))
tweets = []
for fo in foers:
tweets.extend(self.tweets.get(fo, [])[-10:])
return [tw[1] for tw in sorted(tweets, reverse=True)[:10]]


def follow(self, followerId: int, followeeId: int) -> None:
"""
Follower follows a followee. If the operation is invalid, it should be a no-op.
"""
if not self.followers.get(followerId):
self.followers[followerId] = set()
self.followers[followerId].add(followeeId)


def unfollow(self, followerId: int, followeeId: int) -> None:
"""
Follower unfollows a followee. If the operation is invalid, it should be a no-op.
"""
if not self.followers.get(followerId):
self.followers[followerId] = set()
if followeeId in self.followers[followerId]:
self.followers[followerId].remove(followeeId)

#100 ms 19.2 MB

# Your Twitter object will be instantiated and called as such:
# obj = Twitter()
# obj.postTweet(userId,tweetId)
# param_2 = obj.getNewsFeed(userId)
# obj.follow(followerId,followeeId)
# obj.unfollow(followerId,followeeId)
+
\ No newline at end of file diff --git a/public/2020/04/16/leetcode-01-matrix/index.html b/public/2020/04/16/leetcode-01-matrix/index.html new file mode 100644 index 0000000..232e7b8 --- /dev/null +++ b/public/2020/04/16/leetcode-01-matrix/index.html @@ -0,0 +1,128 @@ + leetcode-01-matrix · MarkDown

leetcode-01-matrix

542. 01 矩阵

题目

+ +

想了两种思路

+
    +
  1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    class Solution:
    def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]:
    m, n = len(matrix), len(matrix[0])
    dist = [[0] * n for _ in range(m)]
    zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0]
    # 将所有的 0 添加进初始队列中
    q = collections.deque(zeroes_pos)
    seen = set(zeroes_pos)

    # 广度优先搜索
    while q:
    i, j = q.popleft()
    for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]:
    if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen:
    dist[ni][nj] = dist[i][j] + 1
    q.append((ni, nj))
    seen.add((ni, nj))

    return dist
    +
  2. +
  3. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。

    +
  4. +
+
\ No newline at end of file diff --git a/public/2020/04/16/leetcode-merge-intervals/index.html b/public/2020/04/16/leetcode-merge-intervals/index.html new file mode 100644 index 0000000..989db1e --- /dev/null +++ b/public/2020/04/16/leetcode-merge-intervals/index.html @@ -0,0 +1,122 @@ + leetcode-merge-intervals · MarkDown

leetcode-merge-intervals

56. 合并区间

题目

+ +

首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Solution:
def merge(self, intervals):
if not intervals:
return []
intervals.sort()
merged = []
l = len(intervals)
m = intervals[0]
for x in range(l-1):
j = intervals[x+1]
if m[1] >= j[0]:
if m[1] <= j[1]:
m = [m[0], j[1]]
else:
continue
else:
merged.append(m)
m = j
if m:
merged.append(m)
return merged
+
\ No newline at end of file diff --git a/public/2020/04/16/leetcode-string-to-integer-atoi/index.html b/public/2020/04/16/leetcode-string-to-integer-atoi/index.html new file mode 100644 index 0000000..eb7feb3 --- /dev/null +++ b/public/2020/04/16/leetcode-string-to-integer-atoi/index.html @@ -0,0 +1,122 @@ + leetcode-string-to-integer-atoi · MarkDown

leetcode-string-to-integer-atoi

8. 字符串转换整数 (atoi)

题目

+ +

没什么好说的,注意各种情况,识别到数字之后就一直要是数字。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
class Solution:
def myAtoi(self, str: str) -> int:
p = ''
str = str.lstrip()
n = ''
min_int = -2**31
max_int = 2**31-1
isnumeric = False
for x in str:
if not isnumeric and x == '-':
p = '-'
isnumeric = True
continue
if not isnumeric and x == '+':
isnumeric = True
continue
if x.isnumeric():
n += x
isnumeric = True
else:
break
if not n:
return 0
if int(n) > max_int:
if p:
return min_int
else:
return max_int
p += n
return int(p)
# 32 ms 13.6 MB
+
\ No newline at end of file diff --git a/public/2020/04/21/leetcode-number-of-islands/index.html b/public/2020/04/21/leetcode-number-of-islands/index.html new file mode 100644 index 0000000..38c4715 --- /dev/null +++ b/public/2020/04/21/leetcode-number-of-islands/index.html @@ -0,0 +1,122 @@ + leetcode-number-of-islands · MarkDown

leetcode-number-of-islands

200. 岛屿数量

题目

+ +

这种矩阵题现在第一反应就是用广度优先搜索做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。

+
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import collections
class Solution:
def numIslands(self, grid) -> int:
rows = len(grid)
if not rows:
return 0
cols = len(grid[0])
islands = 0
for r in range(rows):
for l in range(cols):
if grid[r][l] == '1':
islands += 1
grid[r][l] = '0'
neighbors = collections.deque([(r, l)])
while neighbors:
x, y = neighbors.popleft()
for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]:
if 0<=x_<rows and 0<=y_<cols and grid[x_][y_] == '1':
neighbors.append([x_, y_])
grid[x_][y_] = '0'
return islands
+
\ No newline at end of file diff --git a/public/CNAME b/public/CNAME new file mode 100644 index 0000000..bc9fd8c --- /dev/null +++ b/public/CNAME @@ -0,0 +1 @@ +blog.tunpok.com diff --git a/public/archives/2016/02/index.html b/public/archives/2016/02/index.html new file mode 100644 index 0000000..f5a7462 --- /dev/null +++ b/public/archives/2016/02/index.html @@ -0,0 +1,158 @@ + MarkDown
  • Flask Day 2

    To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

    +
    1
    2
    WTF_CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'
    +

    And then you need to use this config (file app/__init__.py):

    +
    1
    2
    3
    4
    5
    6
    from flask import Flask

    app = Flask(__name__)
    app.config.from_object('config')

    from app import views
    +

    Let’s build a simple form (file app/forms.app):

    +
    1
    2
    3
    4
    5
    6
    7
    from flask.ext.wtf import Form
    from wtforms import StringField, BooleanField
    from wtforms.validators import DataRequired

    class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)
    +

    The DataRequired() is a validator that checks the field is empty or not.

    +

    After that, we need a HTML page to show the form (file app/templates/login.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- extend from base layout -->
    {% extends "base.html" %}

    {% block content %}
    <h1>Sign In</h1>
    <form action="" method="post" name="login">
    {{ form.hidden_tag() }}
    <p>
    Please enter your OpenID:<br>
    {{ form.openid(size=80) }}<br>
    </p>
    <p>{{ form.remember_me }} Remember Me</p>
    <p><input type="submit" value="Sign In"></p>
    </form>
    {% endblock %}
    +

    The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from flask import render_template, flash, redirect
    from app import app
    from .forms import LoginForm

    # index view function suppressed for brevity

    app.route('/login', methods=['GET', 'POST'])
    def login():
    form = LoginForm()
    if form.validate_on_submit():
    flash('Login requested for OpenID="%s", remember_me=%s' %
    (form.openid.data, str(form.remember_me.data)))
    return redirect('/index')
    return render_template('login.html',
    title='Sign In',
    form=form)
    +
  • Flask Day 1

    “Hello World” in Flask

    Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

    +
    1
    $ python3 -m venv flask
    +

    Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

    +

    And you should install flask and extensions by the commands below:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ flask/bin/pip install flask
    $ flask/bin/pip install flask-login
    $ flask/bin/pip install flask-openid
    $ flask/bin/pip install flask-mail
    $ flask/bin/pip install flask-sqlalchemy
    $ flask/bin/pip install sqlalchemy-migrate
    $ flask/bin/pip install flask-whooshalchemy
    $ flask/bin/pip install flask-wtf
    $ flask/bin/pip install flask-babel
    $ flask/bin/pip install guess_language
    $ flask/bin/pip install flipflop
    $ flask/bin/pip install coverage
    +

    After that, let’s create the basic structure for our application: app app/static app/templates tmp.

    +
      +
    1. app — where the application package is
    2. +
    3. static — stores static files like images, javascripts, and css.
    4. +
    5. templates — where templates will go.
    6. +
    +

    Then you can start with __init__.py which should put into app folder (file app/__init__.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

    +

    Let’s see what a views function looks like (file app/views.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    Finally we should create a script to starts up the web server with our application(file run.py):

    +
    1
    2
    3
    #!flask/bin/python
    from app import app
    app.run(debug=True)
    +

    To indicating that is an executable file you need to run this in terminal:

    +
    1
    $ chmod a+x run.py
    +

    Now the file structure should look like:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    microblog\
    flask\
    <virtual environment files>
    app\
    static\
    templates\
    __init__.py
    views.py
    tmp\
    run.py
    +

    Then start to write the template (file app/templates/index.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>

    <head>
    <title>{{ title }} - microblog</title>
    </head>

    <body>
    <h1>Hello, {{ user.nickname }}!</h1>
    </body>

    </html>
    +

    Now let’s write the view function that uses this template (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import render_template
    from app import app

    @app.route('/')
    @app.route('/index')
    def index():
    user = {'nickname': 'ching'} # fake user
    return render_template('index.html',
    title='Home',
    user=user)
    +

    render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

    +
\ No newline at end of file diff --git a/public/archives/2016/04/index.html b/public/archives/2016/04/index.html new file mode 100644 index 0000000..e777061 --- /dev/null +++ b/public/archives/2016/04/index.html @@ -0,0 +1,132 @@ + MarkDown
  • Django Manager Method

    Django Manager

    Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

    +

    eg.

    +
    1
    2
    3
    4
    5
    from django.db import models

    class Person(models.Model):
    ...
    people = models.Manager()
    +

    上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

    +

    自定义 Manager

    通常需要自定义 manager 的情况有两点:

    +
      +
    1. 需要修改/扩展 Django 的 manager 方法
    2. +
    3. 需要修改返回的 QuerySet
    4. +
    +

    默认 Manager

    如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

    +

    笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

    +

    eg.

    +
    1
    2
    3
    4
    5
    6
    class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # default manager
    custom_objects = CustomBOokManager() # custom manager
    +

    source

    +
\ No newline at end of file diff --git a/public/archives/2016/05/index.html b/public/archives/2016/05/index.html new file mode 100644 index 0000000..a467293 --- /dev/null +++ b/public/archives/2016/05/index.html @@ -0,0 +1,168 @@ + MarkDown
  • TastyPie Note 1

    Flow Through The Request/Response Cycle

    Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

    +

    Walking through what a GET request to a list endpoint looks like:

    +
      +
    • The Resource.urls are checked by Django’s url resolvers.

      +
    • +
    • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

      +
    • +
    • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

      +
    • +
    • dispatch does a bunch of havy lifting. It ensures:

      +
        +
      • the requested HTTP method is in allowed_methos (method_check).
      • +
      • the class has a method that can handle the request(get_list)
      • +
      • the user is authenticated(is_authenticated)
      • +
      • the user has no exceeded their throttle(throttle_check).
      • +
      +

      At this point, dispatch actually calls the requested method (get_list).

      +
    • +
    • get_list does the actual work of API. It does:

      +
        +
      • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
      • +
      • It then sorts the objects based on user input (ModelResource.apply_sorting).
      • +
      • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
      • +
      • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
      • +
      • Finally, it calls Resource.create_response.
      • +
      +
    • +
    • create_response is a shortcut method that:

      +
        +
      • Determines the desired response format (Resource.determine_format).
      • +
      • Serializes the data given to it in the proper format.
      • +
      • Returns a Django HttpResponse (200 OK) with the serialized data.
      • +
      +
    • +
    • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

      +
    • +
    +
  • Tastypie

    Resources in Tastypie

    Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

    +

    Understanding the process of creating a resource.

    +
      +
    1. Import ModelResource from Tastypie.
    2. +
    3. Import models from services app
    4. +
    5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
    6. +
    +

    Add API URL in the urls.py of app.

    +

    Dehydrating the JSON data

    flow

    +

    Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

    +
    Dehydrate_field method

    This dehydrate_field is uesd to modify field on the response JSON.

    +
    Dehydrate method

    Dehydrate method is useful for aadding additional fields to bundle (response data).

    +

    Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

    +
\ No newline at end of file diff --git a/public/archives/2016/index.html b/public/archives/2016/index.html new file mode 100644 index 0000000..9176c86 --- /dev/null +++ b/public/archives/2016/index.html @@ -0,0 +1,222 @@ + MarkDown
  • TastyPie Note 1

    Flow Through The Request/Response Cycle

    Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

    +

    Walking through what a GET request to a list endpoint looks like:

    +
      +
    • The Resource.urls are checked by Django’s url resolvers.

      +
    • +
    • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

      +
    • +
    • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

      +
    • +
    • dispatch does a bunch of havy lifting. It ensures:

      +
        +
      • the requested HTTP method is in allowed_methos (method_check).
      • +
      • the class has a method that can handle the request(get_list)
      • +
      • the user is authenticated(is_authenticated)
      • +
      • the user has no exceeded their throttle(throttle_check).
      • +
      +

      At this point, dispatch actually calls the requested method (get_list).

      +
    • +
    • get_list does the actual work of API. It does:

      +
        +
      • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
      • +
      • It then sorts the objects based on user input (ModelResource.apply_sorting).
      • +
      • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
      • +
      • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
      • +
      • Finally, it calls Resource.create_response.
      • +
      +
    • +
    • create_response is a shortcut method that:

      +
        +
      • Determines the desired response format (Resource.determine_format).
      • +
      • Serializes the data given to it in the proper format.
      • +
      • Returns a Django HttpResponse (200 OK) with the serialized data.
      • +
      +
    • +
    • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

      +
    • +
    +
  • Tastypie

    Resources in Tastypie

    Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

    +

    Understanding the process of creating a resource.

    +
      +
    1. Import ModelResource from Tastypie.
    2. +
    3. Import models from services app
    4. +
    5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
    6. +
    +

    Add API URL in the urls.py of app.

    +

    Dehydrating the JSON data

    flow

    +

    Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

    +
    Dehydrate_field method

    This dehydrate_field is uesd to modify field on the response JSON.

    +
    Dehydrate method

    Dehydrate method is useful for aadding additional fields to bundle (response data).

    +

    Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

    +
  • Django Manager Method

    Django Manager

    Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

    +

    eg.

    +
    1
    2
    3
    4
    5
    from django.db import models

    class Person(models.Model):
    ...
    people = models.Manager()
    +

    上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

    +

    自定义 Manager

    通常需要自定义 manager 的情况有两点:

    +
      +
    1. 需要修改/扩展 Django 的 manager 方法
    2. +
    3. 需要修改返回的 QuerySet
    4. +
    +

    默认 Manager

    如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

    +

    笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

    +

    eg.

    +
    1
    2
    3
    4
    5
    6
    class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # default manager
    custom_objects = CustomBOokManager() # custom manager
    +

    source

    +
  • Flask Day 2

    To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

    +
    1
    2
    WTF_CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'
    +

    And then you need to use this config (file app/__init__.py):

    +
    1
    2
    3
    4
    5
    6
    from flask import Flask

    app = Flask(__name__)
    app.config.from_object('config')

    from app import views
    +

    Let’s build a simple form (file app/forms.app):

    +
    1
    2
    3
    4
    5
    6
    7
    from flask.ext.wtf import Form
    from wtforms import StringField, BooleanField
    from wtforms.validators import DataRequired

    class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)
    +

    The DataRequired() is a validator that checks the field is empty or not.

    +

    After that, we need a HTML page to show the form (file app/templates/login.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- extend from base layout -->
    {% extends "base.html" %}

    {% block content %}
    <h1>Sign In</h1>
    <form action="" method="post" name="login">
    {{ form.hidden_tag() }}
    <p>
    Please enter your OpenID:<br>
    {{ form.openid(size=80) }}<br>
    </p>
    <p>{{ form.remember_me }} Remember Me</p>
    <p><input type="submit" value="Sign In"></p>
    </form>
    {% endblock %}
    +

    The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from flask import render_template, flash, redirect
    from app import app
    from .forms import LoginForm

    # index view function suppressed for brevity

    app.route('/login', methods=['GET', 'POST'])
    def login():
    form = LoginForm()
    if form.validate_on_submit():
    flash('Login requested for OpenID="%s", remember_me=%s' %
    (form.openid.data, str(form.remember_me.data)))
    return redirect('/index')
    return render_template('login.html',
    title='Sign In',
    form=form)
    +
  • Flask Day 1

    “Hello World” in Flask

    Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

    +
    1
    $ python3 -m venv flask
    +

    Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

    +

    And you should install flask and extensions by the commands below:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ flask/bin/pip install flask
    $ flask/bin/pip install flask-login
    $ flask/bin/pip install flask-openid
    $ flask/bin/pip install flask-mail
    $ flask/bin/pip install flask-sqlalchemy
    $ flask/bin/pip install sqlalchemy-migrate
    $ flask/bin/pip install flask-whooshalchemy
    $ flask/bin/pip install flask-wtf
    $ flask/bin/pip install flask-babel
    $ flask/bin/pip install guess_language
    $ flask/bin/pip install flipflop
    $ flask/bin/pip install coverage
    +

    After that, let’s create the basic structure for our application: app app/static app/templates tmp.

    +
      +
    1. app — where the application package is
    2. +
    3. static — stores static files like images, javascripts, and css.
    4. +
    5. templates — where templates will go.
    6. +
    +

    Then you can start with __init__.py which should put into app folder (file app/__init__.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

    +

    Let’s see what a views function looks like (file app/views.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    Finally we should create a script to starts up the web server with our application(file run.py):

    +
    1
    2
    3
    #!flask/bin/python
    from app import app
    app.run(debug=True)
    +

    To indicating that is an executable file you need to run this in terminal:

    +
    1
    $ chmod a+x run.py
    +

    Now the file structure should look like:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    microblog\
    flask\
    <virtual environment files>
    app\
    static\
    templates\
    __init__.py
    views.py
    tmp\
    run.py
    +

    Then start to write the template (file app/templates/index.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>

    <head>
    <title>{{ title }} - microblog</title>
    </head>

    <body>
    <h1>Hello, {{ user.nickname }}!</h1>
    </body>

    </html>
    +

    Now let’s write the view function that uses this template (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import render_template
    from app import app

    @app.route('/')
    @app.route('/index')
    def index():
    user = {'nickname': 'ching'} # fake user
    return render_template('index.html',
    title='Home',
    user=user)
    +

    render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

    +
\ No newline at end of file diff --git a/public/archives/2018/05/index.html b/public/archives/2018/05/index.html new file mode 100644 index 0000000..556b39a --- /dev/null +++ b/public/archives/2018/05/index.html @@ -0,0 +1,130 @@ + MarkDown
  • bash function and awk

    I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

    +

    bash functions

    Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

    +
    1
    2
    3
    4
    function run {
    source ~/Develop/django/bin/activate
    ./manage.py runserver
    }
    +

    I activate django virtural enviroment first and then run django serve.

    +

    Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

    +
    1
    2
    function ba { hgba | grep "$1" }
    # hgba is an alias for hg branches
    +

    I can just type ba release then get current release branch info.

    +
    +

    Append:

    +

    I made some updates to the ba function and make it auto copying the branch result to my clipboard:

    +
    1
    2

    function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
    +

    awk

    awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

    +
\ No newline at end of file diff --git a/public/archives/2018/index.html b/public/archives/2018/index.html new file mode 100644 index 0000000..556b39a --- /dev/null +++ b/public/archives/2018/index.html @@ -0,0 +1,130 @@ + MarkDown
  • bash function and awk

    I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

    +

    bash functions

    Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

    +
    1
    2
    3
    4
    function run {
    source ~/Develop/django/bin/activate
    ./manage.py runserver
    }
    +

    I activate django virtural enviroment first and then run django serve.

    +

    Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

    +
    1
    2
    function ba { hgba | grep "$1" }
    # hgba is an alias for hg branches
    +

    I can just type ba release then get current release branch info.

    +
    +

    Append:

    +

    I made some updates to the ba function and make it auto copying the branch result to my clipboard:

    +
    1
    2

    function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
    +

    awk

    awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

    +
\ No newline at end of file diff --git a/public/archives/2019/03/index.html b/public/archives/2019/03/index.html new file mode 100644 index 0000000..f8211f2 --- /dev/null +++ b/public/archives/2019/03/index.html @@ -0,0 +1,146 @@ + MarkDown
  • Postgresql Partitioning

    Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

    +

    Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

    +

    There are two forms of partitioning can be implemented in PostgreSQL:

    +
      +
    • Range Partitioning

      +

      ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

      +
    • +
    • List Partitioning

      +

      ​ The table is partitioned by explicitly listing which key values appear in each partition.

      +
    • +
    +

    Implementing Partitioning

      +
    1. Create the “master” / “parent” table, from which all the partitions will inherit.

      +

      ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

      +
    2. +
    3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

      +
    4. +
    5. Add table constraints to the partition tables to define the allowed key values in each partitions.

      +

      ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

      +
    6. +
    7. Create indexes on column(s) for each partitions.

      +
    8. +
    9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

      +
    10. +
    11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

      +
    12. +
    +

    Trigger

    As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

    +
\ No newline at end of file diff --git a/public/archives/2019/11/index.html b/public/archives/2019/11/index.html new file mode 100644 index 0000000..3bd95e0 --- /dev/null +++ b/public/archives/2019/11/index.html @@ -0,0 +1,121 @@ + MarkDown
  • AWS KMS

    We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

    +

    Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

    +

    TBD

    +
\ No newline at end of file diff --git a/public/archives/2019/index.html b/public/archives/2019/index.html new file mode 100644 index 0000000..d04f525 --- /dev/null +++ b/public/archives/2019/index.html @@ -0,0 +1,149 @@ + MarkDown
  • AWS KMS

    We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

    +

    Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

    +

    TBD

    +
  • Postgresql Partitioning

    Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

    +

    Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

    +

    There are two forms of partitioning can be implemented in PostgreSQL:

    +
      +
    • Range Partitioning

      +

      ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

      +
    • +
    • List Partitioning

      +

      ​ The table is partitioned by explicitly listing which key values appear in each partition.

      +
    • +
    +

    Implementing Partitioning

      +
    1. Create the “master” / “parent” table, from which all the partitions will inherit.

      +

      ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

      +
    2. +
    3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

      +
    4. +
    5. Add table constraints to the partition tables to define the allowed key values in each partitions.

      +

      ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

      +
    6. +
    7. Create indexes on column(s) for each partitions.

      +
    8. +
    9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

      +
    10. +
    11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

      +
    12. +
    +

    Trigger

    As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

    +
\ No newline at end of file diff --git a/public/archives/2020/03/index.html b/public/archives/2020/03/index.html new file mode 100644 index 0000000..dbc6343 --- /dev/null +++ b/public/archives/2020/03/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/03/page/2/index.html b/public/archives/2020/03/page/2/index.html new file mode 100644 index 0000000..50cad29 --- /dev/null +++ b/public/archives/2020/03/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/04/index.html b/public/archives/2020/04/index.html new file mode 100644 index 0000000..96dba0a --- /dev/null +++ b/public/archives/2020/04/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/04/page/2/index.html b/public/archives/2020/04/page/2/index.html new file mode 100644 index 0000000..0c96e94 --- /dev/null +++ b/public/archives/2020/04/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/index.html b/public/archives/2020/index.html new file mode 100644 index 0000000..caf4158 --- /dev/null +++ b/public/archives/2020/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/page/2/index.html b/public/archives/2020/page/2/index.html new file mode 100644 index 0000000..a1382a9 --- /dev/null +++ b/public/archives/2020/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/2020/page/3/index.html b/public/archives/2020/page/3/index.html new file mode 100644 index 0000000..0359242 --- /dev/null +++ b/public/archives/2020/page/3/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/index.html b/public/archives/index.html new file mode 100644 index 0000000..5f799b2 --- /dev/null +++ b/public/archives/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/page/2/index.html b/public/archives/page/2/index.html new file mode 100644 index 0000000..203d934 --- /dev/null +++ b/public/archives/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/archives/page/3/index.html b/public/archives/page/3/index.html new file mode 100644 index 0000000..d63c43d --- /dev/null +++ b/public/archives/page/3/index.html @@ -0,0 +1,236 @@ + MarkDown
  • AWS KMS

    We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

    +

    Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

    +

    TBD

    +
  • Postgresql Partitioning

    Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

    +

    Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

    +

    There are two forms of partitioning can be implemented in PostgreSQL:

    +
      +
    • Range Partitioning

      +

      ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

      +
    • +
    • List Partitioning

      +

      ​ The table is partitioned by explicitly listing which key values appear in each partition.

      +
    • +
    +

    Implementing Partitioning

      +
    1. Create the “master” / “parent” table, from which all the partitions will inherit.

      +

      ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

      +
    2. +
    3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

      +
    4. +
    5. Add table constraints to the partition tables to define the allowed key values in each partitions.

      +

      ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

      +
    6. +
    7. Create indexes on column(s) for each partitions.

      +
    8. +
    9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

      +
    10. +
    11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

      +
    12. +
    +

    Trigger

    As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

    +
  • bash function and awk

    I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

    +

    bash functions

    Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

    +
    1
    2
    3
    4
    function run {
    source ~/Develop/django/bin/activate
    ./manage.py runserver
    }
    +

    I activate django virtural enviroment first and then run django serve.

    +

    Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

    +
    1
    2
    function ba { hgba | grep "$1" }
    # hgba is an alias for hg branches
    +

    I can just type ba release then get current release branch info.

    +
    +

    Append:

    +

    I made some updates to the ba function and make it auto copying the branch result to my clipboard:

    +
    1
    2

    function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
    +

    awk

    awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

    +
  • TastyPie Note 1

    Flow Through The Request/Response Cycle

    Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

    +

    Walking through what a GET request to a list endpoint looks like:

    +
      +
    • The Resource.urls are checked by Django’s url resolvers.

      +
    • +
    • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

      +
    • +
    • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

      +
    • +
    • dispatch does a bunch of havy lifting. It ensures:

      +
        +
      • the requested HTTP method is in allowed_methos (method_check).
      • +
      • the class has a method that can handle the request(get_list)
      • +
      • the user is authenticated(is_authenticated)
      • +
      • the user has no exceeded their throttle(throttle_check).
      • +
      +

      At this point, dispatch actually calls the requested method (get_list).

      +
    • +
    • get_list does the actual work of API. It does:

      +
        +
      • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
      • +
      • It then sorts the objects based on user input (ModelResource.apply_sorting).
      • +
      • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
      • +
      • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
      • +
      • Finally, it calls Resource.create_response.
      • +
      +
    • +
    • create_response is a shortcut method that:

      +
        +
      • Determines the desired response format (Resource.determine_format).
      • +
      • Serializes the data given to it in the proper format.
      • +
      • Returns a Django HttpResponse (200 OK) with the serialized data.
      • +
      +
    • +
    • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

      +
    • +
    +
  • Tastypie

    Resources in Tastypie

    Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

    +

    Understanding the process of creating a resource.

    +
      +
    1. Import ModelResource from Tastypie.
    2. +
    3. Import models from services app
    4. +
    5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
    6. +
    +

    Add API URL in the urls.py of app.

    +

    Dehydrating the JSON data

    flow

    +

    Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

    +
    Dehydrate_field method

    This dehydrate_field is uesd to modify field on the response JSON.

    +
    Dehydrate method

    Dehydrate method is useful for aadding additional fields to bundle (response data).

    +

    Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

    +
  • Django Manager Method

    Django Manager

    Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

    +

    eg.

    +
    1
    2
    3
    4
    5
    from django.db import models

    class Person(models.Model):
    ...
    people = models.Manager()
    +

    上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

    +

    自定义 Manager

    通常需要自定义 manager 的情况有两点:

    +
      +
    1. 需要修改/扩展 Django 的 manager 方法
    2. +
    3. 需要修改返回的 QuerySet
    4. +
    +

    默认 Manager

    如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

    +

    笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

    +

    eg.

    +
    1
    2
    3
    4
    5
    6
    class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # default manager
    custom_objects = CustomBOokManager() # custom manager
    +

    source

    +
  • Flask Day 2

    To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

    +
    1
    2
    WTF_CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'
    +

    And then you need to use this config (file app/__init__.py):

    +
    1
    2
    3
    4
    5
    6
    from flask import Flask

    app = Flask(__name__)
    app.config.from_object('config')

    from app import views
    +

    Let’s build a simple form (file app/forms.app):

    +
    1
    2
    3
    4
    5
    6
    7
    from flask.ext.wtf import Form
    from wtforms import StringField, BooleanField
    from wtforms.validators import DataRequired

    class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)
    +

    The DataRequired() is a validator that checks the field is empty or not.

    +

    After that, we need a HTML page to show the form (file app/templates/login.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- extend from base layout -->
    {% extends "base.html" %}

    {% block content %}
    <h1>Sign In</h1>
    <form action="" method="post" name="login">
    {{ form.hidden_tag() }}
    <p>
    Please enter your OpenID:<br>
    {{ form.openid(size=80) }}<br>
    </p>
    <p>{{ form.remember_me }} Remember Me</p>
    <p><input type="submit" value="Sign In"></p>
    </form>
    {% endblock %}
    +

    The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from flask import render_template, flash, redirect
    from app import app
    from .forms import LoginForm

    # index view function suppressed for brevity

    app.route('/login', methods=['GET', 'POST'])
    def login():
    form = LoginForm()
    if form.validate_on_submit():
    flash('Login requested for OpenID="%s", remember_me=%s' %
    (form.openid.data, str(form.remember_me.data)))
    return redirect('/index')
    return render_template('login.html',
    title='Sign In',
    form=form)
    +
\ No newline at end of file diff --git a/public/archives/page/4/index.html b/public/archives/page/4/index.html new file mode 100644 index 0000000..815557f --- /dev/null +++ b/public/archives/page/4/index.html @@ -0,0 +1,147 @@ + MarkDown
  • Flask Day 1

    “Hello World” in Flask

    Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

    +
    1
    $ python3 -m venv flask
    +

    Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

    +

    And you should install flask and extensions by the commands below:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ flask/bin/pip install flask
    $ flask/bin/pip install flask-login
    $ flask/bin/pip install flask-openid
    $ flask/bin/pip install flask-mail
    $ flask/bin/pip install flask-sqlalchemy
    $ flask/bin/pip install sqlalchemy-migrate
    $ flask/bin/pip install flask-whooshalchemy
    $ flask/bin/pip install flask-wtf
    $ flask/bin/pip install flask-babel
    $ flask/bin/pip install guess_language
    $ flask/bin/pip install flipflop
    $ flask/bin/pip install coverage
    +

    After that, let’s create the basic structure for our application: app app/static app/templates tmp.

    +
      +
    1. app — where the application package is
    2. +
    3. static — stores static files like images, javascripts, and css.
    4. +
    5. templates — where templates will go.
    6. +
    +

    Then you can start with __init__.py which should put into app folder (file app/__init__.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

    +

    Let’s see what a views function looks like (file app/views.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    Finally we should create a script to starts up the web server with our application(file run.py):

    +
    1
    2
    3
    #!flask/bin/python
    from app import app
    app.run(debug=True)
    +

    To indicating that is an executable file you need to run this in terminal:

    +
    1
    $ chmod a+x run.py
    +

    Now the file structure should look like:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    microblog\
    flask\
    <virtual environment files>
    app\
    static\
    templates\
    __init__.py
    views.py
    tmp\
    run.py
    +

    Then start to write the template (file app/templates/index.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>

    <head>
    <title>{{ title }} - microblog</title>
    </head>

    <body>
    <h1>Hello, {{ user.nickname }}!</h1>
    </body>

    </html>
    +

    Now let’s write the view function that uses this template (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import render_template
    from app import app

    @app.route('/')
    @app.route('/index')
    def index():
    user = {'nickname': 'ching'} # fake user
    return render_template('index.html',
    title='Home',
    user=user)
    +

    render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

    +
\ No newline at end of file diff --git a/public/atom.xml b/public/atom.xml new file mode 100644 index 0000000..fc20171 --- /dev/null +++ b/public/atom.xml @@ -0,0 +1,521 @@ + + + MarkDown + 「靡不有初,鲜克有终」 + + + + 2020-04-21T04:55:46.000Z + http://blog.tunpok.com/ + + + Ching + + + + Hexo + + + leetcode-number-of-islands + + http://blog.tunpok.com/2020/04/21/leetcode-number-of-islands/ + 2020-04-21T04:55:17.000Z + 2020-04-21T04:55:46.000Z + + <h3 id="200-__u5C9B_u5C7F_u6570_u91CF"><a href="#200-__u5C9B_u5C7F_u6570_u91CF" class="headerlink" title="200. 岛屿数量"></a>200. 岛屿数量</h3><p><a href="https://leetcode-cn.com/problems/number-of-islands/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>这种矩阵题现在第一反应就是用<a href="(https://zh.wikipedia.org/zh-cn/%E5%B9%BF%E5%BA%A6%E4%BC%98%E5%85%88%E6%90%9C%E7%B4%A2)">广度优先搜索</a>做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> collections</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">numIslands</span><span class="params">(self, grid)</span> -&gt; int:</span></span><br><span class="line"> rows = len(grid)</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> rows:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> cols = len(grid[<span class="number">0</span>])</span><br><span class="line"> islands = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> r <span class="keyword">in</span> range(rows):</span><br><span class="line"> <span class="keyword">for</span> l <span class="keyword">in</span> range(cols):</span><br><span class="line"> <span class="keyword">if</span> grid[r][l] == <span class="string">'1'</span>:</span><br><span class="line"> islands += <span class="number">1</span></span><br><span class="line"> grid[r][l] = <span class="string">'0'</span></span><br><span class="line"> neighbors = collections.deque([(r, l)])</span><br><span class="line"> <span class="keyword">while</span> neighbors:</span><br><span class="line"> x, y = neighbors.popleft()</span><br><span class="line"> <span class="keyword">for</span> x_, y_ <span class="keyword">in</span> [[x<span class="number">-1</span>, y], [x+<span class="number">1</span>, y], [x, y<span class="number">-1</span>], [x, y+<span class="number">1</span>]]:</span><br><span class="line"> <span class="keyword">if</span> <span class="number">0</span>&lt;=x_&lt;rows <span class="keyword">and</span> <span class="number">0</span>&lt;=y_&lt;cols <span class="keyword">and</span> grid[x_][y_] == <span class="string">'1'</span>:</span><br><span class="line"> neighbors.append([x_, y_])</span><br><span class="line"> grid[x_][y_] = <span class="string">'0'</span></span><br><span class="line"> <span class="keyword">return</span> islands</span><br></pre></td></tr></table></figure> + + + + + <h3 id="200-__u5C9B_u5C7F_u6570_u91CF"><a href="#200-__u5C9B_u5C7F_u6570_u91CF" class="headerlink" title="200. 岛屿数量"></a>200. 岛屿数量</h3><p><a href="https://leetcode-cn.com/problems/number-of-islands/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-string-to-integer-atoi + + http://blog.tunpok.com/2020/04/16/leetcode-string-to-integer-atoi/ + 2020-04-16T11:50:10.000Z + 2020-04-16T11:56:40.000Z + + <h3 id="8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29"><a href="#8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29" class="headerlink" title="8. 字符串转换整数 (atoi)"></a>8. 字符串转换整数 (atoi)</h3><p><a href="https://leetcode-cn.com/problems/string-to-integer-atoi/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>没什么好说的,注意各种情况,识别到数字之后就一直要是数字。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">myAtoi</span><span class="params">(self, str: str)</span> -&gt; int:</span></span><br><span class="line"> p = <span class="string">''</span></span><br><span class="line"> str = str.lstrip()</span><br><span class="line"> n = <span class="string">''</span></span><br><span class="line"> min_int = <span class="number">-2</span>**<span class="number">31</span></span><br><span class="line"> max_int = <span class="number">2</span>**<span class="number">31</span><span class="number">-1</span></span><br><span class="line"> isnumeric = <span class="keyword">False</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> str:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> isnumeric <span class="keyword">and</span> x == <span class="string">'-'</span>:</span><br><span class="line"> p = <span class="string">'-'</span></span><br><span class="line"> isnumeric = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> isnumeric <span class="keyword">and</span> x == <span class="string">'+'</span>:</span><br><span class="line"> isnumeric = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">if</span> x.isnumeric():</span><br><span class="line"> n += x</span><br><span class="line"> isnumeric = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> n:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> int(n) &gt; max_int:</span><br><span class="line"> <span class="keyword">if</span> p:</span><br><span class="line"> <span class="keyword">return</span> min_int</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">return</span> max_int</span><br><span class="line"> p += n</span><br><span class="line"> <span class="keyword">return</span> int(p)</span><br><span class="line"><span class="comment"># 32 ms 13.6 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29"><a href="#8-__u5B57_u7B26_u4E32_u8F6C_u6362_u6574_u6570__28atoi_29" class="headerlink" title="8. 字符串转换整数 (atoi)"></a>8. 字符串转换整数 (atoi)</h3><p><a href="https://leetcode-cn.com/problems/string-to-integer-atoi/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-merge-intervals + + http://blog.tunpok.com/2020/04/16/leetcode-merge-intervals/ + 2020-04-16T11:22:26.000Z + 2020-04-16T11:22:48.000Z + + <h3 id="56-__u5408_u5E76_u533A_u95F4"><a href="#56-__u5408_u5E76_u533A_u95F4" class="headerlink" title="56. 合并区间"></a>56. 合并区间</h3><p><a href="https://leetcode-cn.com/problems/merge-intervals/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">merge</span><span class="params">(self, intervals)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> intervals:</span><br><span class="line"> <span class="keyword">return</span> []</span><br><span class="line"> intervals.sort()</span><br><span class="line"> merged = []</span><br><span class="line"> l = len(intervals)</span><br><span class="line"> m = intervals[<span class="number">0</span>]</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(l<span class="number">-1</span>):</span><br><span class="line"> j = intervals[x+<span class="number">1</span>]</span><br><span class="line"> <span class="keyword">if</span> m[<span class="number">1</span>] &gt;= j[<span class="number">0</span>]:</span><br><span class="line"> <span class="keyword">if</span> m[<span class="number">1</span>] &lt;= j[<span class="number">1</span>]:</span><br><span class="line"> m = [m[<span class="number">0</span>], j[<span class="number">1</span>]]</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> merged.append(m)</span><br><span class="line"> m = j</span><br><span class="line"> <span class="keyword">if</span> m:</span><br><span class="line"> merged.append(m)</span><br><span class="line"> <span class="keyword">return</span> merged</span><br></pre></td></tr></table></figure> + + + + + <h3 id="56-__u5408_u5E76_u533A_u95F4"><a href="#56-__u5408_u5E76_u533A_u95F4" class="headerlink" title="56. 合并区间"></a>56. 合并区间</h3><p><a href="https://leetcode-cn.com/problems/merge-intervals/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-01-matrix + + http://blog.tunpok.com/2020/04/16/leetcode-01-matrix/ + 2020-04-16T04:26:34.000Z + 2020-04-16T04:26:56.000Z + + <h3 id="542-_01__u77E9_u9635"><a href="#542-_01__u77E9_u9635" class="headerlink" title="542. 01 矩阵"></a>542. 01 矩阵</h3><p><a href="https://leetcode-cn.com/problems/01-matrix/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>想了两种思路</p> +<ol> +<li><p>0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">updateMatrix</span><span class="params">(self, matrix: List[List[int]])</span> -&gt; List[List[int]]:</span></span><br><span class="line"> m, n = len(matrix), len(matrix[<span class="number">0</span>])</span><br><span class="line"> dist = [[<span class="number">0</span>] * n <span class="keyword">for</span> _ <span class="keyword">in</span> range(m)]</span><br><span class="line"> zeroes_pos = [(i, j) <span class="keyword">for</span> i <span class="keyword">in</span> range(m) <span class="keyword">for</span> j <span class="keyword">in</span> range(n) <span class="keyword">if</span> matrix[i][j] == <span class="number">0</span>]</span><br><span class="line"> <span class="comment"># 将所有的 0 添加进初始队列中</span></span><br><span class="line"> q = collections.deque(zeroes_pos)</span><br><span class="line"> seen = set(zeroes_pos)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 广度优先搜索</span></span><br><span class="line"> <span class="keyword">while</span> q:</span><br><span class="line"> i, j = q.popleft()</span><br><span class="line"> <span class="keyword">for</span> ni, nj <span class="keyword">in</span> [(i - <span class="number">1</span>, j), (i + <span class="number">1</span>, j), (i, j - <span class="number">1</span>), (i, j + <span class="number">1</span>)]:</span><br><span class="line"> <span class="keyword">if</span> <span class="number">0</span> &lt;= ni &lt; m <span class="keyword">and</span> <span class="number">0</span> &lt;= nj &lt; n <span class="keyword">and</span> (ni, nj) <span class="keyword">not</span> <span class="keyword">in</span> seen:</span><br><span class="line"> dist[ni][nj] = dist[i][j] + <span class="number">1</span></span><br><span class="line"> q.append((ni, nj))</span><br><span class="line"> seen.add((ni, nj))</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> dist</span><br></pre></td></tr></table></figure> +</li> +<li><p>从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。</p> +</li> +</ol> + + + + + <h3 id="542-_01__u77E9_u9635"><a href="#542-_01__u77E9_u9635" class="headerlink" title="542. 01 矩阵"></a>542. 01 矩阵</h3><p><a href="https://leetcode-cn.com/problems/01-matrix/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-add-two-numbers-ii + + http://blog.tunpok.com/2020/04/14/leetcode-add-two-numbers-ii/ + 2020-04-14T15:22:39.000Z + 2020-04-14T15:28:35.000Z + + <h3 id="445-__u4E24_u6570_u76F8_u52A0_II"><a href="#445-__u4E24_u6570_u76F8_u52A0_II" class="headerlink" title="445. 两数相加 II"></a>445. 两数相加 II</h3><p><a href="https://leetcode-cn.com/problems/add-two-numbers-ii/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>看到顺序的链表就想到用倒序链表的方法做,折腾了半天</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ListNode</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x)</span>:</span></span><br><span class="line"> self.val = x</span><br><span class="line"> self.next = <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">addTwoNumbers</span><span class="params">(self, l1: ListNode, l2: ListNode)</span> -&gt; ListNode:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">_reverse</span><span class="params">(l)</span>:</span></span><br><span class="line"> <span class="keyword">if</span> l.next:</span><br><span class="line"> last = _reverse(l.next)</span><br><span class="line"> l.next.next = l</span><br><span class="line"> l.next = <span class="keyword">None</span></span><br><span class="line"> <span class="keyword">return</span> last</span><br><span class="line"> <span class="keyword">return</span> l</span><br><span class="line"></span><br><span class="line"> l1e = _reverse(l1)</span><br><span class="line"> l2e = _reverse(l2)</span><br><span class="line"> new_l = ListNode(<span class="number">0</span>)</span><br><span class="line"> head = new_l</span><br><span class="line"> c = <span class="number">0</span></span><br><span class="line"> <span class="keyword">import</span> ipdb; ipdb.set_trace()</span><br><span class="line"> <span class="keyword">while</span> l1e <span class="keyword">and</span> l2e:</span><br><span class="line"> new_val = l1e.val + l2e.val</span><br><span class="line"> <span class="keyword">if</span> c==<span class="number">1</span>:</span><br><span class="line"> new_val += <span class="number">1</span></span><br><span class="line"> c = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> new_val &gt;= <span class="number">10</span>:</span><br><span class="line"> new_val -= <span class="number">10</span></span><br><span class="line"> c = <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> new_l.val = new_val</span><br><span class="line"> next_n = <span class="keyword">None</span></span><br><span class="line"> <span class="keyword">if</span> l1e.next <span class="keyword">and</span> l2e.next <span class="keyword">or</span> c:</span><br><span class="line"> next_n = ListNode(c)</span><br><span class="line"> new_l.next = next_n</span><br><span class="line"> new_l = next_n</span><br><span class="line"> l1e = l1e.next</span><br><span class="line"> l2e = l2e.next</span><br><span class="line"> <span class="keyword">if</span> l2e:</span><br><span class="line"> l1e = l2e</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> l1e <span class="keyword">and</span> c:</span><br><span class="line"> l1e = ListNode(<span class="number">0</span>)</span><br><span class="line"> <span class="keyword">while</span> l1e:</span><br><span class="line"> new_l.val = l1e.val</span><br><span class="line"> new_l.val += c</span><br><span class="line"> c = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> new_l.val &gt;= <span class="number">10</span>:</span><br><span class="line"> c = <span class="number">1</span></span><br><span class="line"> new_l.val -= <span class="number">10</span></span><br><span class="line"> l1e = l1e.next</span><br><span class="line"> <span class="keyword">if</span> l1e:</span><br><span class="line"> new_l.next = ListNode(<span class="number">0</span>)</span><br><span class="line"> new_l = new_l.next</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> new_l.next = ListNode(<span class="number">1</span>)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> _reverse(head)</span><br><span class="line"></span><br><span class="line"> <span class="comment"># 84 ms 13.9 MB</span></span><br></pre></td></tr></table></figure> +<p>最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">addTwoNumbers</span><span class="params">(self, l1: ListNode, l2: ListNode)</span> -&gt; ListNode:</span></span><br><span class="line"> s1, s2 = [], []</span><br><span class="line"> <span class="keyword">while</span> l1:</span><br><span class="line"> s1.append(l1.val)</span><br><span class="line"> l1 = l1.next</span><br><span class="line"> <span class="keyword">while</span> l2:</span><br><span class="line"> s2.append(l2.val)</span><br><span class="line"> l2 = l2.next</span><br><span class="line"> ans = <span class="keyword">None</span></span><br><span class="line"> carry = <span class="number">0</span></span><br><span class="line"> <span class="keyword">while</span> s1 <span class="keyword">or</span> s2 <span class="keyword">or</span> carry != <span class="number">0</span>:</span><br><span class="line"> a = <span class="number">0</span> <span class="keyword">if</span> <span class="keyword">not</span> s1 <span class="keyword">else</span> s1.pop()</span><br><span class="line"> b = <span class="number">0</span> <span class="keyword">if</span> <span class="keyword">not</span> s2 <span class="keyword">else</span> s2.pop()</span><br><span class="line"> cur = a + b + carry</span><br><span class="line"> carry = cur // <span class="number">10</span></span><br><span class="line"> cur %= <span class="number">10</span></span><br><span class="line"> curnode = ListNode(cur)</span><br><span class="line"> curnode.next = ans</span><br><span class="line"> ans = curnode</span><br><span class="line"> <span class="keyword">return</span> ans</span><br><span class="line"></span><br><span class="line">作者:LeetCode-Solution</span><br><span class="line">链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/</span><br><span class="line">来源:力扣(LeetCode)</span><br><span class="line">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure> +<p>不过就执行效率来看差不多。</p> + + + + + <h3 id="445-__u4E24_u6570_u76F8_u52A0_II"><a href="#445-__u4E24_u6570_u76F8_u52A0_II" class="headerlink" title="445. 两数相加 II"></a>445. 两数相加 II</h3><p><a href="https://leetcode-cn.com/problems/add-two-numbers-ii/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-design-twitter + + http://blog.tunpok.com/2020/04/14/leetcode-design-twitter/ + 2020-04-14T08:11:41.000Z + 2020-04-14T15:29:34.000Z + + <h3 id="355-__u8BBE_u8BA1_u63A8_u7279"><a href="#355-__u8BBE_u8BA1_u63A8_u7279" class="headerlink" title="355. 设计推特"></a>355. 设计推特</h3><p><a href="https://leetcode-cn.com/problems/design-twitter/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 <code>twitterId</code> 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。</p> +<p>主要的考点应该是 <code>多路归并</code> 这个东西。我用的是排序,在数据量大的时候应该会有些问题。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Twitter</span>:</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Initialize your data structure here.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> self.tweets = &#123;&#125;</span><br><span class="line"> self.followers = &#123;&#125;</span><br><span class="line"> self._tid = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">postTweet</span><span class="params">(self, userId: int, tweetId: int)</span> -&gt; <span class="keyword">None</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Compose a new tweet.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.tweets.get(userId):</span><br><span class="line"> self.tweets[userId] = []</span><br><span class="line"> self.tweets[userId].append((self._tid, tweetId))</span><br><span class="line"> self._tid += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">getNewsFeed</span><span class="params">(self, userId: int)</span> :</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> foers = self.followers.get(userId, set())</span><br><span class="line"> foers = foers.union((userId,))</span><br><span class="line"> tweets = []</span><br><span class="line"> <span class="keyword">for</span> fo <span class="keyword">in</span> foers:</span><br><span class="line"> tweets.extend(self.tweets.get(fo, [])[<span class="number">-10</span>:])</span><br><span class="line"> <span class="keyword">return</span> [tw[<span class="number">1</span>] <span class="keyword">for</span> tw <span class="keyword">in</span> sorted(tweets, reverse=<span class="keyword">True</span>)[:<span class="number">10</span>]]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">follow</span><span class="params">(self, followerId: int, followeeId: int)</span> -&gt; <span class="keyword">None</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Follower follows a followee. If the operation is invalid, it should be a no-op.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.followers.get(followerId):</span><br><span class="line"> self.followers[followerId] = set()</span><br><span class="line"> self.followers[followerId].add(followeeId)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">unfollow</span><span class="params">(self, followerId: int, followeeId: int)</span> -&gt; <span class="keyword">None</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Follower unfollows a followee. If the operation is invalid, it should be a no-op.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> self.followers.get(followerId):</span><br><span class="line"> self.followers[followerId] = set()</span><br><span class="line"> <span class="keyword">if</span> followeeId <span class="keyword">in</span> self.followers[followerId]:</span><br><span class="line"> self.followers[followerId].remove(followeeId)</span><br><span class="line"></span><br><span class="line"><span class="comment">#100 ms 19.2 MB</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># Your Twitter object will be instantiated and called as such:</span></span><br><span class="line"><span class="comment"># obj = Twitter()</span></span><br><span class="line"><span class="comment"># obj.postTweet(userId,tweetId)</span></span><br><span class="line"><span class="comment"># param_2 = obj.getNewsFeed(userId)</span></span><br><span class="line"><span class="comment"># obj.follow(followerId,followeeId)</span></span><br><span class="line"><span class="comment"># obj.unfollow(followerId,followeeId)</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="355-__u8BBE_u8BA1_u63A8_u7279"><a href="#355-__u8BBE_u8BA1_u63A8_u7279" class="headerlink" title="355. 设计推特"></a>355. 设计推特</h3><p><a href="https://leetcode-cn.com/problems/design-twitter/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof + + http://blog.tunpok.com/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/ + 2020-04-09T14:14:56.000Z + 2020-04-14T15:29:40.000Z + + <h3 id="u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217"><a href="#u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217" class="headerlink" title="面试题57 - II. 和为s的连续正数序列"></a>面试题57 - II. 和为s的连续正数序列</h3><p><a href="https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>又是小学奥数。由等差数列求和公式<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -1.625ex" xmlns="http://www.w3.org/2000/svg" width="20.379ex" height="4.656ex" role="img" focusable="false" viewbox="0 -1340 9007.3 2058.1" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mfrac"><g data-mml-node="mrow" transform="translate(220, 590) scale(0.707)"><g data-mml-node="mpadded"><g data-mml-node="mrow"/></g><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mo"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mo" transform="translate(389, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">首</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text></g><g data-mml-node="mo" transform="translate(2466.8, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mo" transform="translate(3522.6, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">末</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text></g><g data-mml-node="mo" transform="translate(5322.6, 0)"><use xlink:href="#MJX-TEX-N-29"/></g><g data-mml-node="mo" transform="translate(5711.6, 0)"><use xlink:href="#MJX-TEX-N-D7"/></g><g data-mml-node="mo" transform="translate(6767.3, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">数</text></g></g></g></g><g data-mml-node="mrow" transform="translate(4253.7, -506) scale(0.707)"><g data-mml-node="mpadded"><g data-mml-node="mrow"/></g><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mn"><use xlink:href="#MJX-TEX-N-32"/></g></g></g></g><rect width="8767.3" height="60" x="120" y="220"/></g></g></g></svg></mjx-container> 可知,当首项为 1 的时候项数最多,又由于是连续正整数,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="27.37ex" height="2.452ex" role="img" focusable="false" viewbox="0 -833.9 12097.6 1083.9" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msup"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mn" transform="translate(600, 363) scale(0.707)"><use xlink:href="#MJX-TEX-N-32"/></g></g><g data-mml-node="mo" transform="translate(1281.3, 0)"><use xlink:href="#MJX-TEX-N-3C"/></g><g data-mml-node="mo" transform="translate(2337.1, 0)"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mn" transform="translate(2726.1, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(3448.3, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mi" transform="translate(4448.6, 0)"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mo" transform="translate(5048.6, 0)"><use xlink:href="#MJX-TEX-N-29"/></g><g data-mml-node="mo" transform="translate(5659.8, 0)"><use xlink:href="#MJX-TEX-N-D7"/></g><g data-mml-node="mi" transform="translate(6660, 0)"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mo" transform="translate(7537.8, 0)"><use xlink:href="#MJX-TEX-N-3C"/></g><g data-mml-node="mo" transform="translate(8593.6, 0)"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mi" transform="translate(8982.6, 0)"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mo" transform="translate(9804.8, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mn" transform="translate(10805, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="msup" transform="translate(11305, 0)"><g data-mml-node="mo"><use xlink:href="#MJX-TEX-N-29"/></g><g data-mml-node="mn" transform="translate(389, 363) scale(0.707)"><use xlink:href="#MJX-TEX-N-32"/></g></g></g></g></svg></mjx-container>,那最大的 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex" xmlns="http://www.w3.org/2000/svg" width="1.357ex" height="1.025ex" role="img" focusable="false" viewbox="0 -442 600 453" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-6E"/></g></g></g></svg></mjx-container> 就不大于 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.683ex" xmlns="http://www.w3.org/2000/svg" width="16.086ex" height="2.851ex" role="img" focusable="false" viewbox="0 -958 7109.9 1260" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="msqrt"><g transform="translate(1020, 0)"><g data-mml-node="mn"><use xlink:href="#MJX-TEX-N-32"/></g><g data-mml-node="mo" transform="translate(722.2, 0)"><use xlink:href="#MJX-TEX-N-D7"/></g><g data-mml-node="mi" transform="translate(1722.4, 0)"><use xlink:href="#MJX-TEX-I-74"/></g><g data-mml-node="mi" transform="translate(2083.4, 0)"><use xlink:href="#MJX-TEX-I-61"/></g><g data-mml-node="mi" transform="translate(2612.4, 0)"><use xlink:href="#MJX-TEX-I-72"/></g><g data-mml-node="mi" transform="translate(3063.4, 0)"><use xlink:href="#MJX-TEX-I-67"/></g><g data-mml-node="mi" transform="translate(3540.4, 0)"><use xlink:href="#MJX-TEX-I-65"/></g><g data-mml-node="mi" transform="translate(4006.4, 0)"><use xlink:href="#MJX-TEX-I-74"/></g></g><g data-mml-node="mo" transform="translate(0, 48)"><use xlink:href="#MJX-TEX-SO-221A"/></g><rect width="4367.4" height="60" x="1020" y="838"/></g><g data-mml-node="mo" transform="translate(5609.7, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mn" transform="translate(6609.9, 0)"><use xlink:href="#MJX-TEX-N-31"/></g></g></g></svg></mjx-container>。</p> +<p>由小到大遍历 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex" xmlns="http://www.w3.org/2000/svg" width="1.357ex" height="1.025ex" role="img" focusable="false" viewbox="0 -442 600 453" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-6E"/></g></g></g></svg></mjx-container>,可以求得首项。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> math</span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">findContinuousSequence</span><span class="params">(self, target: int)</span>:</span></span><br><span class="line"> n = int(math.sqrt(<span class="number">2</span> * target) + <span class="number">1</span>)</span><br><span class="line"> <span class="keyword">if</span> n &lt; <span class="number">2</span>:</span><br><span class="line"> <span class="keyword">return</span> []</span><br><span class="line"> sum_list = []</span><br><span class="line"> a = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">2</span>, n+<span class="number">1</span>):</span><br><span class="line"> a = ((<span class="number">2</span> * target) / i + <span class="number">1</span> - i) / <span class="number">2</span></span><br><span class="line"> <span class="keyword">if</span> a <span class="keyword">and</span> <span class="keyword">not</span> a % <span class="number">1</span>:</span><br><span class="line"> a = int(a)</span><br><span class="line"> s_ = []</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> range(<span class="number">0</span>, i):</span><br><span class="line"> s_.append(a + j)</span><br><span class="line"> sum_list.append(s_)</span><br><span class="line"> <span class="keyword">return</span> sorted(sum_list)</span><br><span class="line"> <span class="comment"># 60 ms 13.7 MB</span></span><br></pre></td></tr></table></figure> +<svg style="display: none" id="MJX-SVG-global-cache"><defs><path id="MJX-TEX-N-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"/><path id="MJX-TEX-N-2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"/><path id="MJX-TEX-N-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"/><path id="MJX-TEX-N-D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z"/><path id="MJX-TEX-N-32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"/><path id="MJX-TEX-I-6E" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-N-3C" d="M694 -11T694 -19T688 -33T678 -40Q671 -40 524 29T234 166L90 235Q83 240 83 250Q83 261 91 266Q664 540 678 540Q681 540 687 534T694 519T687 505Q686 504 417 376L151 250L417 124Q686 -4 687 -5Q694 -11 694 -19Z"/><path id="MJX-TEX-N-31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"/><path id="MJX-TEX-SO-221A" d="M263 249Q264 249 315 130T417 -108T470 -228L725 302Q981 837 982 839Q989 850 1001 850Q1008 850 1013 844T1020 832V826L741 243Q645 43 540 -176Q479 -303 469 -324T453 -348Q449 -350 436 -350L424 -349L315 -96Q206 156 205 156L171 130Q138 104 137 104L111 130L263 249Z"/><path id="MJX-TEX-I-74" d="M26 385Q19 392 19 395Q19 399 22 411T27 425Q29 430 36 430T87 431H140L159 511Q162 522 166 540T173 566T179 586T187 603T197 615T211 624T229 626Q247 625 254 615T261 596Q261 589 252 549T232 470L222 433Q222 431 272 431H323Q330 424 330 420Q330 398 317 385H210L174 240Q135 80 135 68Q135 26 162 26Q197 26 230 60T283 144Q285 150 288 151T303 153H307Q322 153 322 145Q322 142 319 133Q314 117 301 95T267 48T216 6T155 -11Q125 -11 98 4T59 56Q57 64 57 83V101L92 241Q127 382 128 383Q128 385 77 385H26Z"/><path id="MJX-TEX-I-61" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"/><path id="MJX-TEX-I-72" d="M21 287Q22 290 23 295T28 317T38 348T53 381T73 411T99 433T132 442Q161 442 183 430T214 408T225 388Q227 382 228 382T236 389Q284 441 347 441H350Q398 441 422 400Q430 381 430 363Q430 333 417 315T391 292T366 288Q346 288 334 299T322 328Q322 376 378 392Q356 405 342 405Q286 405 239 331Q229 315 224 298T190 165Q156 25 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 114 189T154 366Q154 405 128 405Q107 405 92 377T68 316T57 280Q55 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-67" d="M311 43Q296 30 267 15T206 0Q143 0 105 45T66 160Q66 265 143 353T314 442Q361 442 401 394L404 398Q406 401 409 404T418 412T431 419T447 422Q461 422 470 413T480 394Q480 379 423 152T363 -80Q345 -134 286 -169T151 -205Q10 -205 10 -137Q10 -111 28 -91T74 -71Q89 -71 102 -80T116 -111Q116 -121 114 -130T107 -144T99 -154T92 -162L90 -164H91Q101 -167 151 -167Q189 -167 211 -155Q234 -144 254 -122T282 -75Q288 -56 298 -13Q311 35 311 43ZM384 328L380 339Q377 350 375 354T369 368T359 382T346 393T328 402T306 405Q262 405 221 352Q191 313 171 233T151 117Q151 38 213 38Q269 38 323 108L331 118L384 328Z"/><path id="MJX-TEX-I-65" d="M39 168Q39 225 58 272T107 350T174 402T244 433T307 442H310Q355 442 388 420T421 355Q421 265 310 237Q261 224 176 223Q139 223 138 221Q138 219 132 186T125 128Q125 81 146 54T209 26T302 45T394 111Q403 121 406 121Q410 121 419 112T429 98T420 82T390 55T344 24T281 -1T205 -11Q126 -11 83 42T39 168ZM373 353Q367 405 305 405Q272 405 244 391T199 357T170 316T154 280T149 261Q149 260 169 260Q282 260 327 284T373 353Z"/></defs></svg> + + + + <h3 id="u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217"><a href="#u9762_u8BD5_u989857_-_II-__u548C_u4E3As_u7684_u8FDE_u7EED_u6B63_u6570_u5E8F_u5217" class="headerlink" title="面试题57 - II. 和为s的连续正数序列"></a>面试题57 - II. 和为s的连续正数序列</h3><p><a href="https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-the-masseuse-lcci + + http://blog.tunpok.com/2020/04/09/leetcode-the-masseuse-lcci/ + 2020-04-08T16:35:26.000Z + 2020-04-08T17:14:04.000Z + + <h3 id="u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08"><a href="#u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08" class="headerlink" title="面试题 17.16. 按摩师"></a>面试题 17.16. 按摩师</h3><p><a href="https://leetcode-cn.com/problems/the-masseuse-lcci/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.025ex" xmlns="http://www.w3.org/2000/svg" width="0.781ex" height="1.52ex" role="img" focusable="false" viewbox="0 -661 345 672" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-69"/></g></g></g></svg></mjx-container> 时刻,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="6.742ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 2980 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(520, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(1023, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(1301, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(1646, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(1924, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(2202, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(2702, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g></g></g></svg></mjx-container> 为当前预约不接的情况下最长预约时间,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="6.742ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 2980 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(520, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(1023, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(1301, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(1646, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(1924, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(2202, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(2702, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g></g></g></svg></mjx-container> 则为接受当前预约的最长预约时间。</p> +<p>那很显然,由于不能接受相邻两个预约,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="29.528ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 13051.4 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(520, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(1023, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(1301, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(1646, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(1924, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(2202, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(2702, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(3257.8, 0)"><use xlink:href="#MJX-TEX-N-3D"/></g><g data-mml-node="mi" transform="translate(4313.6, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(4833.6, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(5336.6, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(5614.6, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(6181.8, 0)"><use xlink:href="#MJX-TEX-N-2212"/></g><g data-mml-node="mn" transform="translate(7182, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(7682, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(7960, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(8238, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(8738, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(9238.2, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mi" transform="translate(10238.4, 0)"><use xlink:href="#MJX-TEX-I-6E"/></g><g data-mml-node="mi" transform="translate(10838.4, 0)"><use xlink:href="#MJX-TEX-I-75"/></g><g data-mml-node="mi" transform="translate(11410.4, 0)"><use xlink:href="#MJX-TEX-I-6D"/></g><g data-mml-node="msub" transform="translate(12288.4, 0)"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-73"/></g><g data-mml-node="mi" transform="translate(469, -150) scale(0.707)"><use xlink:href="#MJX-TEX-I-69"/></g></g></g></g></svg></mjx-container></p> +<p>不接受当前预约的话,上一个预约接不接受都可以,<mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="38.281ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 16920.1 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(520, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(1023, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(1301, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(1646, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(1924, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(2202, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(2702, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(3257.8, 0)"><use xlink:href="#MJX-TEX-N-3D"/></g><g data-mml-node="mi" transform="translate(4313.6, 0)"><use xlink:href="#MJX-TEX-I-6D"/></g><g data-mml-node="mi" transform="translate(5191.6, 0)"><use xlink:href="#MJX-TEX-I-61"/></g><g data-mml-node="mi" transform="translate(5720.6, 0)"><use xlink:href="#MJX-TEX-I-78"/></g><g data-mml-node="mo" transform="translate(6292.6, 0)"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mi" transform="translate(6681.6, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(7201.6, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(7704.6, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(7982.6, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(8549.8, 0)"><use xlink:href="#MJX-TEX-N-2212"/></g><g data-mml-node="mn" transform="translate(9550, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(10050, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(10328, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(10606, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(11106, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(11384, 0)"><use xlink:href="#MJX-TEX-N-2C"/></g><g data-mml-node="mi" transform="translate(11828.7, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(12348.7, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(12851.7, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(13129.7, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(13696.9, 0)"><use xlink:href="#MJX-TEX-N-2212"/></g><g data-mml-node="mn" transform="translate(14697.1, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(15197.1, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(15475.1, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(15753.1, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(16253.1, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(16531.1, 0)"><use xlink:href="#MJX-TEX-N-29"/></g></g></g></svg></mjx-container></p> +<p>最后只要比较两种情况即可 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -0.566ex" xmlns="http://www.w3.org/2000/svg" width="20.728ex" height="2.262ex" role="img" focusable="false" viewbox="0 -750 9161.7 1000" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mi"><use xlink:href="#MJX-TEX-I-6D"/></g><g data-mml-node="mi" transform="translate(878, 0)"><use xlink:href="#MJX-TEX-I-61"/></g><g data-mml-node="mi" transform="translate(1407, 0)"><use xlink:href="#MJX-TEX-I-78"/></g><g data-mml-node="mo" transform="translate(1979, 0)"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mi" transform="translate(2368, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(2888, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(3391, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(3669, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(4014, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(4292, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(4570, 0)"><use xlink:href="#MJX-TEX-N-30"/></g><g data-mml-node="mo" transform="translate(5070, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(5348, 0)"><use xlink:href="#MJX-TEX-N-2C"/></g><g data-mml-node="mi" transform="translate(5792.7, 0)"><use xlink:href="#MJX-TEX-I-64"/></g><g data-mml-node="mi" transform="translate(6312.7, 0)"><use xlink:href="#MJX-TEX-I-70"/></g><g data-mml-node="mo" transform="translate(6815.7, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mi" transform="translate(7093.7, 0)"><use xlink:href="#MJX-TEX-I-69"/></g><g data-mml-node="mo" transform="translate(7438.7, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(7716.7, 0)"><use xlink:href="#MJX-TEX-N-5B"/></g><g data-mml-node="mn" transform="translate(7994.7, 0)"><use xlink:href="#MJX-TEX-N-31"/></g><g data-mml-node="mo" transform="translate(8494.7, 0)"><use xlink:href="#MJX-TEX-N-5D"/></g><g data-mml-node="mo" transform="translate(8772.7, 0)"><use xlink:href="#MJX-TEX-N-29"/></g></g></g></svg></mjx-container></p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">massage</span><span class="params">(self, nums)</span> -&gt; int:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> nums:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> n = len(nums)</span><br><span class="line"> not_choose = <span class="number">0</span></span><br><span class="line"> choose = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> n <span class="keyword">in</span> nums:</span><br><span class="line"> not_choose, choose = max(not_choose, choose), not_choose+n</span><br><span class="line"> <span class="keyword">return</span> max(not_choose, choose)</span><br><span class="line"> <span class="comment"># 52 ms 13.6 MB</span></span><br></pre></td></tr></table></figure> +<p>这种问题原来有个名字叫<a href="https://zh.wikipedia.org/wiki/动态规划" target="_blank" rel="noopener">动态规划</a>,上面推导的方程叫<a href="https://baike.baidu.com/item/状态转移方程" target="_blank" rel="noopener">状态转移方程</a>,可以找找资料来看一下。</p> +<svg style="display: none" id="MJX-SVG-global-cache"><defs><path id="MJX-TEX-I-69" d="M184 600Q184 624 203 642T247 661Q265 661 277 649T290 619Q290 596 270 577T226 557Q211 557 198 567T184 600ZM21 287Q21 295 30 318T54 369T98 420T158 442Q197 442 223 419T250 357Q250 340 236 301T196 196T154 83Q149 61 149 51Q149 26 166 26Q175 26 185 29T208 43T235 78T260 137Q263 149 265 151T282 153Q302 153 302 143Q302 135 293 112T268 61T223 11T161 -11Q129 -11 102 10T74 74Q74 91 79 106T122 220Q160 321 166 341T173 380Q173 404 156 404H154Q124 404 99 371T61 287Q60 286 59 284T58 281T56 279T53 278T49 278T41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-64" d="M366 683Q367 683 438 688T511 694Q523 694 523 686Q523 679 450 384T375 83T374 68Q374 26 402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487H491Q506 153 506 145Q506 140 503 129Q490 79 473 48T445 8T417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157Q33 205 53 255T101 341Q148 398 195 420T280 442Q336 442 364 400Q369 394 369 396Q370 400 396 505T424 616Q424 629 417 632T378 637H357Q351 643 351 645T353 664Q358 683 366 683ZM352 326Q329 405 277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q233 26 290 98L298 109L352 326Z"/><path id="MJX-TEX-I-70" d="M23 287Q24 290 25 295T30 317T40 348T55 381T75 411T101 433T134 442Q209 442 230 378L240 387Q302 442 358 442Q423 442 460 395T497 281Q497 173 421 82T249 -10Q227 -10 210 -4Q199 1 187 11T168 28L161 36Q160 35 139 -51T118 -138Q118 -144 126 -145T163 -148H188Q194 -155 194 -157T191 -175Q188 -187 185 -190T172 -194Q170 -194 161 -194T127 -193T65 -192Q-5 -192 -24 -194H-32Q-39 -187 -39 -183Q-37 -156 -26 -148H-6Q28 -147 33 -136Q36 -130 94 103T155 350Q156 355 156 364Q156 405 131 405Q109 405 94 377T71 316T59 280Q57 278 43 278H29Q23 284 23 287ZM178 102Q200 26 252 26Q282 26 310 49T356 107Q374 141 392 215T411 325V331Q411 405 350 405Q339 405 328 402T306 393T286 380T269 365T254 350T243 336T235 326L232 322Q232 321 229 308T218 264T204 212Q178 106 178 102Z"/><path id="MJX-TEX-N-5B" d="M118 -250V750H255V710H158V-210H255V-250H118Z"/><path id="MJX-TEX-N-5D" d="M22 710V750H159V-250H22V-210H119V710H22Z"/><path id="MJX-TEX-N-30" d="M96 585Q152 666 249 666Q297 666 345 640T423 548Q460 465 460 320Q460 165 417 83Q397 41 362 16T301 -15T250 -22Q224 -22 198 -16T137 16T82 83Q39 165 39 320Q39 494 96 585ZM321 597Q291 629 250 629Q208 629 178 597Q153 571 145 525T137 333Q137 175 145 125T181 46Q209 16 250 16Q290 16 318 46Q347 76 354 130T362 333Q362 478 354 524T321 597Z"/><path id="MJX-TEX-N-31" d="M213 578L200 573Q186 568 160 563T102 556H83V602H102Q149 604 189 617T245 641T273 663Q275 666 285 666Q294 666 302 660V361L303 61Q310 54 315 52T339 48T401 46H427V0H416Q395 3 257 3Q121 3 100 0H88V46H114Q136 46 152 46T177 47T193 50T201 52T207 57T213 61V578Z"/><path id="MJX-TEX-N-3D" d="M56 347Q56 360 70 367H707Q722 359 722 347Q722 336 708 328L390 327H72Q56 332 56 347ZM56 153Q56 168 72 173H708Q722 163 722 153Q722 140 707 133H70Q56 140 56 153Z"/><path id="MJX-TEX-N-2212" d="M84 237T84 250T98 270H679Q694 262 694 250T679 230H98Q84 237 84 250Z"/><path id="MJX-TEX-N-2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"/><path id="MJX-TEX-I-6E" d="M21 287Q22 293 24 303T36 341T56 388T89 425T135 442Q171 442 195 424T225 390T231 369Q231 367 232 367L243 378Q304 442 382 442Q436 442 469 415T503 336T465 179T427 52Q427 26 444 26Q450 26 453 27Q482 32 505 65T540 145Q542 153 560 153Q580 153 580 145Q580 144 576 130Q568 101 554 73T508 17T439 -10Q392 -10 371 17T350 73Q350 92 386 193T423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 180T152 343Q153 348 153 366Q153 405 129 405Q91 405 66 305Q60 285 60 284Q58 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-75" d="M21 287Q21 295 30 318T55 370T99 420T158 442Q204 442 227 417T250 358Q250 340 216 246T182 105Q182 62 196 45T238 27T291 44T328 78L339 95Q341 99 377 247Q407 367 413 387T427 416Q444 431 463 431Q480 431 488 421T496 402L420 84Q419 79 419 68Q419 43 426 35T447 26Q469 29 482 57T512 145Q514 153 532 153Q551 153 551 144Q550 139 549 130T540 98T523 55T498 17T462 -8Q454 -10 438 -10Q372 -10 347 46Q345 45 336 36T318 21T296 6T267 -6T233 -11Q189 -11 155 7Q103 38 103 113Q103 170 138 262T173 379Q173 380 173 381Q173 390 173 393T169 400T158 404H154Q131 404 112 385T82 344T65 302T57 280Q55 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-6D" d="M21 287Q22 293 24 303T36 341T56 388T88 425T132 442T175 435T205 417T221 395T229 376L231 369Q231 367 232 367L243 378Q303 442 384 442Q401 442 415 440T441 433T460 423T475 411T485 398T493 385T497 373T500 364T502 357L510 367Q573 442 659 442Q713 442 746 415T780 336Q780 285 742 178T704 50Q705 36 709 31T724 26Q752 26 776 56T815 138Q818 149 821 151T837 153Q857 153 857 145Q857 144 853 130Q845 101 831 73T785 17T716 -10Q669 -10 648 17T627 73Q627 92 663 193T700 345Q700 404 656 404H651Q565 404 506 303L499 291L466 157Q433 26 428 16Q415 -11 385 -11Q372 -11 364 -4T353 8T350 18Q350 29 384 161L420 307Q423 322 423 345Q423 404 379 404H374Q288 404 229 303L222 291L189 157Q156 26 151 16Q138 -11 108 -11Q95 -11 87 -5T76 7T74 17Q74 30 112 181Q151 335 151 342Q154 357 154 369Q154 405 129 405Q107 405 92 377T69 316T57 280Q55 278 41 278H27Q21 284 21 287Z"/><path id="MJX-TEX-I-73" d="M131 289Q131 321 147 354T203 415T300 442Q362 442 390 415T419 355Q419 323 402 308T364 292Q351 292 340 300T328 326Q328 342 337 354T354 372T367 378Q368 378 368 379Q368 382 361 388T336 399T297 405Q249 405 227 379T204 326Q204 301 223 291T278 274T330 259Q396 230 396 163Q396 135 385 107T352 51T289 7T195 -10Q118 -10 86 19T53 87Q53 126 74 143T118 160Q133 160 146 151T160 120Q160 94 142 76T111 58Q109 57 108 57T107 55Q108 52 115 47T146 34T201 27Q237 27 263 38T301 66T318 97T323 122Q323 150 302 164T254 181T195 196T148 231Q131 256 131 289Z"/><path id="MJX-TEX-I-61" d="M33 157Q33 258 109 349T280 441Q331 441 370 392Q386 422 416 422Q429 422 439 414T449 394Q449 381 412 234T374 68Q374 43 381 35T402 26Q411 27 422 35Q443 55 463 131Q469 151 473 152Q475 153 483 153H487Q506 153 506 144Q506 138 501 117T481 63T449 13Q436 0 417 -8Q409 -10 393 -10Q359 -10 336 5T306 36L300 51Q299 52 296 50Q294 48 292 46Q233 -10 172 -10Q117 -10 75 30T33 157ZM351 328Q351 334 346 350T323 385T277 405Q242 405 210 374T160 293Q131 214 119 129Q119 126 119 118T118 106Q118 61 136 44T179 26Q217 26 254 59T298 110Q300 114 325 217T351 328Z"/><path id="MJX-TEX-I-78" d="M52 289Q59 331 106 386T222 442Q257 442 286 424T329 379Q371 442 430 442Q467 442 494 420T522 361Q522 332 508 314T481 292T458 288Q439 288 427 299T415 328Q415 374 465 391Q454 404 425 404Q412 404 406 402Q368 386 350 336Q290 115 290 78Q290 50 306 38T341 26Q378 26 414 59T463 140Q466 150 469 151T485 153H489Q504 153 504 145Q504 144 502 134Q486 77 440 33T333 -11Q263 -11 227 52Q186 -10 133 -10H127Q78 -10 57 16T35 71Q35 103 54 123T99 143Q142 143 142 101Q142 81 130 66T107 46T94 41L91 40Q91 39 97 36T113 29T132 26Q168 26 194 71Q203 87 217 139T245 247T261 313Q266 340 266 352Q266 380 251 392T217 404Q177 404 142 372T93 290Q91 281 88 280T72 278H58Q52 284 52 289Z"/><path id="MJX-TEX-N-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"/><path id="MJX-TEX-N-2C" d="M78 35T78 60T94 103T137 121Q165 121 187 96T210 8Q210 -27 201 -60T180 -117T154 -158T130 -185T117 -194Q113 -194 104 -185T95 -172Q95 -168 106 -156T131 -126T157 -76T173 -3V9L172 8Q170 7 167 6T161 3T152 1T140 0Q113 0 96 17Z"/><path id="MJX-TEX-N-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"/></defs></svg> + + + + <h3 id="u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08"><a href="#u9762_u8BD5_u9898_17-16-__u6309_u6469_u5E08" class="headerlink" title="面试题 17.16. 按摩师"></a>面试题 17.16. 按摩师</h3><p><a href="https://leetcode-cn.com/problems/the-masseuse-lcci/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-compress-string-lcci + + http://blog.tunpok.com/2020/04/01/leetcode-compress-string-lcci/ + 2020-04-01T07:51:22.000Z + 2020-04-01T07:57:26.000Z + + <h3 id="u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29"><a href="#u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29" class="headerlink" title="面试题 01.06. 字符串压缩"></a>面试题 01.06. 字符串压缩</h3><p><a href="https://leetcode-cn.com/problems/compress-string-lcci/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">compressString</span><span class="params">(self, S: str)</span> -&gt; str:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> S:</span><br><span class="line"> <span class="keyword">return</span> S</span><br><span class="line"> c = <span class="string">''</span></span><br><span class="line"> prev = S[<span class="number">0</span>]</span><br><span class="line"> p_len = <span class="number">1</span></span><br><span class="line"> <span class="keyword">for</span> w <span class="keyword">in</span> S[<span class="number">1</span>:]:</span><br><span class="line"> <span class="keyword">if</span> w != prev:</span><br><span class="line"> c += <span class="string">'%s%s'</span> % (prev, p_len)</span><br><span class="line"> prev = w</span><br><span class="line"> p_len = <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> p_len += <span class="number">1</span></span><br><span class="line"> c += <span class="string">'%s%s'</span> % (prev, p_len)</span><br><span class="line"> <span class="keyword">if</span> len(S) &gt; len(c):</span><br><span class="line"> <span class="keyword">return</span> c</span><br><span class="line"> <span class="keyword">return</span> S</span><br><span class="line"><span class="comment"># 52 ms 13.8 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29"><a href="#u9762_u8BD5_u9898_01-06-__u5B57_u7B26_u4E32_u538B_u7F29" class="headerlink" title="面试题 01.06. 字符串压缩"></a>面试题 01.06. 字符串压缩</h3><p><a href="https://leetcode-cn.com/problems/compress-string-lcci/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-1103 + + http://blog.tunpok.com/2020/04/01/leetcode-1103/ + 2020-04-01T03:22:20.000Z + 2020-04-08T17:17:27.000Z + + <h3 id="1103-__u5206_u7CD6_u679C_II"><a href="#1103-__u5206_u7CD6_u679C_II" class="headerlink" title="1103. 分糖果 II"></a>1103. 分糖果 II</h3><p><a href="https://leetcode-cn.com/problems/distribute-candies-to-people/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>小学奥数题。主要思路就是等差数列求和 <mjx-container class="MathJax" jax="SVG"><svg style="vertical-align: -1.625ex" xmlns="http://www.w3.org/2000/svg" width="20.379ex" height="4.656ex" role="img" focusable="false" viewbox="0 -1340 9007.3 2058.1" xmlns:xlink="http://www.w3.org/1999/xlink"><g stroke="currentColor" fill="currentColor" stroke-width="0" transform="matrix(1 0 0 -1 0 0)"><g data-mml-node="math"><g data-mml-node="mfrac"><g data-mml-node="mrow" transform="translate(220, 590) scale(0.707)"><g data-mml-node="mpadded"><g data-mml-node="mrow"/></g><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mo"><use xlink:href="#MJX-TEX-N-28"/></g><g data-mml-node="mo" transform="translate(389, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">首</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text></g><g data-mml-node="mo" transform="translate(2466.8, 0)"><use xlink:href="#MJX-TEX-N-2B"/></g><g data-mml-node="mo" transform="translate(3522.6, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">末</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text></g><g data-mml-node="mo" transform="translate(5322.6, 0)"><use xlink:href="#MJX-TEX-N-29"/></g><g data-mml-node="mo" transform="translate(5711.6, 0)"><use xlink:href="#MJX-TEX-N-D7"/></g><g data-mml-node="mo" transform="translate(6767.3, 0)"><text data-variant="normal" transform="matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">项</text><text data-variant="normal" transform="translate(900, 0) matrix(1 0 0 -1 0 0)" font-size="884px" font-family="serif">数</text></g></g></g></g><g data-mml-node="mrow" transform="translate(4253.7, -506) scale(0.707)"><g data-mml-node="mpadded"><g data-mml-node="mrow"/></g><g data-mml-node="mstyle" transform="scale(1.414)"><g data-mml-node="TeXAtom" data-mjx-texclass="ORD"><g data-mml-node="mn"><use xlink:href="#MJX-TEX-N-32"/></g></g></g></g><rect width="8767.3" height="60" x="120" y="220"/></g></g></g></svg></mjx-container> 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">distributeCandies</span><span class="params">(self, candies: int, num_people: int)</span>:</span></span><br><span class="line"> total = <span class="number">0</span></span><br><span class="line"> i = <span class="number">0</span></span><br><span class="line"> <span class="comment"># import ipdb; ipdb.set_trace()</span></span><br><span class="line"> <span class="keyword">while</span> total &lt;= candies:</span><br><span class="line"> t = (num_people*i)*num_people + int((<span class="number">1</span>+num_people)*num_people/<span class="number">2</span>)</span><br><span class="line"> <span class="keyword">if</span> total + t &lt;= candies:</span><br><span class="line"> total += t</span><br><span class="line"> i += <span class="number">1</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> remaining = candies - total</span><br><span class="line"> print(total, remaining, i)</span><br><span class="line"> l = []</span><br><span class="line"> <span class="keyword">for</span> n <span class="keyword">in</span> range(<span class="number">1</span>, num_people+<span class="number">1</span>):</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> total:</span><br><span class="line"> current_candy = n</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> current_candy = n+i*num_people</span><br><span class="line"></span><br><span class="line"> n_count = int((<span class="number">0</span>+(i<span class="number">-1</span>))*(i)/<span class="number">2</span>)</span><br><span class="line"> print(current_candy, n_count)</span><br><span class="line"> <span class="keyword">if</span> remaining &gt;= current_candy:</span><br><span class="line"> l.append(n_count*num_people + n*i + current_candy)</span><br><span class="line"> remaining -= current_candy</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> l.append(n_count*num_people + n*i + remaining)</span><br><span class="line"> remaining = <span class="number">0</span></span><br><span class="line"> <span class="keyword">return</span> l</span><br><span class="line"><span class="comment"># 28 ms 13.7 MB,</span></span><br></pre></td></tr></table></figure> +<svg style="display: none" id="MJX-SVG-global-cache"><defs><path id="MJX-TEX-N-28" d="M94 250Q94 319 104 381T127 488T164 576T202 643T244 695T277 729T302 750H315H319Q333 750 333 741Q333 738 316 720T275 667T226 581T184 443T167 250T184 58T225 -81T274 -167T316 -220T333 -241Q333 -250 318 -250H315H302L274 -226Q180 -141 137 -14T94 250Z"/><path id="MJX-TEX-N-2B" d="M56 237T56 250T70 270H369V420L370 570Q380 583 389 583Q402 583 409 568V270H707Q722 262 722 250T707 230H409V-68Q401 -82 391 -82H389H387Q375 -82 369 -68V230H70Q56 237 56 250Z"/><path id="MJX-TEX-N-29" d="M60 749L64 750Q69 750 74 750H86L114 726Q208 641 251 514T294 250Q294 182 284 119T261 12T224 -76T186 -143T145 -194T113 -227T90 -246Q87 -249 86 -250H74Q66 -250 63 -250T58 -247T55 -238Q56 -237 66 -225Q221 -64 221 250T66 725Q56 737 55 738Q55 746 60 749Z"/><path id="MJX-TEX-N-D7" d="M630 29Q630 9 609 9Q604 9 587 25T493 118L389 222L284 117Q178 13 175 11Q171 9 168 9Q160 9 154 15T147 29Q147 36 161 51T255 146L359 250L255 354Q174 435 161 449T147 471Q147 480 153 485T168 490Q173 490 175 489Q178 487 284 383L389 278L493 382Q570 459 587 475T609 491Q630 491 630 471Q630 464 620 453T522 355L418 250L522 145Q606 61 618 48T630 29Z"/><path id="MJX-TEX-N-32" d="M109 429Q82 429 66 447T50 491Q50 562 103 614T235 666Q326 666 387 610T449 465Q449 422 429 383T381 315T301 241Q265 210 201 149L142 93L218 92Q375 92 385 97Q392 99 409 186V189H449V186Q448 183 436 95T421 3V0H50V19V31Q50 38 56 46T86 81Q115 113 136 137Q145 147 170 174T204 211T233 244T261 278T284 308T305 340T320 369T333 401T340 431T343 464Q343 527 309 573T212 619Q179 619 154 602T119 569T109 550Q109 549 114 549Q132 549 151 535T170 489Q170 464 154 447T109 429Z"/></defs></svg> + + + + <h3 id="1103-__u5206_u7CD6_u679C_II"><a href="#1103-__u5206_u7CD6_u679C_II" class="headerlink" title="1103. 分糖果 II"></a>1103. 分糖果 II</h3><p><a href="https://leetcode-cn.com/problems/distribute-candies-to-people/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-1160 + + http://blog.tunpok.com/2020/04/01/leetcode-1160/ + 2020-03-31T16:18:48.000Z + 2020-04-01T07:57:06.000Z + + <h3 id="1160-__u62FC_u5199_u5355_u8BCD"><a href="#1160-__u62FC_u5199_u5355_u8BCD" class="headerlink" title="1160. 拼写单词"></a>1160. 拼写单词</h3><p><a href="https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">countCharacters</span><span class="params">(self, words, chars: str)</span> -&gt; int:</span></span><br><span class="line"></span><br><span class="line"> words_ = <span class="string">''</span></span><br><span class="line"> <span class="keyword">for</span> w <span class="keyword">in</span> words:</span><br><span class="line"> lchars = list(chars)</span><br><span class="line"> <span class="keyword">try</span>:</span><br><span class="line"> <span class="keyword">for</span> l <span class="keyword">in</span> w:</span><br><span class="line"> lchars.remove(l)</span><br><span class="line"> <span class="keyword">except</span>:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> words_ += w</span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> len(words_)</span><br><span class="line"><span class="comment"># 152 ms 14.1 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="1160-__u62FC_u5199_u5355_u8BCD"><a href="#1160-__u62FC_u5199_u5355_u8BCD" class="headerlink" title="1160. 拼写单词"></a>1160. 拼写单词</h3><p><a href="https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-1071 + + http://blog.tunpok.com/2020/03/30/leetcode-1071/ + 2020-03-30T14:03:01.000Z + 2020-03-30T14:04:17.000Z + + <h3 id="1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50"><a href="#1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50" class="headerlink" title="1071. 字符串的最大公因子"></a>1071. 字符串的最大公因子</h3><p><a href="https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">gcdOfStrings</span><span class="params">(self, str1: str, str2: str)</span> -&gt; str:</span></span><br><span class="line"> <span class="keyword">if</span> str1[<span class="number">0</span>] != str2[<span class="number">0</span>]:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">''</span></span><br><span class="line"></span><br><span class="line"> a = len(str1)</span><br><span class="line"> b = len(str2)</span><br><span class="line"> print(a, b)</span><br><span class="line"> <span class="keyword">if</span> a &lt; b:</span><br><span class="line"> str1, str2 = str2, str1</span><br><span class="line"> a = len(str1)</span><br><span class="line"> b = len(str2)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> a%b:</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(<span class="number">0</span>, a//b):</span><br><span class="line"> <span class="keyword">if</span> str1[x*b:(x+<span class="number">1</span>)*b] != str2:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">''</span></span><br><span class="line"> <span class="keyword">return</span> str2</span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(b, <span class="number">0</span>, <span class="number">-1</span>):</span><br><span class="line"> print(x)</span><br><span class="line"> <span class="keyword">if</span> x==b <span class="keyword">or</span> b%x <span class="keyword">or</span> a%x:</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"> <span class="keyword">for</span> y <span class="keyword">in</span> range(<span class="number">0</span>, b//x):</span><br><span class="line"> <span class="keyword">if</span> str2[y*x:(y+<span class="number">1</span>)*x] != str2[b-x:b]:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">''</span></span><br><span class="line"> <span class="keyword">for</span> y <span class="keyword">in</span> range(<span class="number">0</span>, a//x):</span><br><span class="line"> <span class="keyword">if</span> str1[y*x:(y+<span class="number">1</span>)*x] != str2[<span class="number">0</span>:x]:</span><br><span class="line"> <span class="keyword">return</span> <span class="string">''</span></span><br><span class="line"> <span class="keyword">return</span> str2[<span class="number">0</span>:x]</span><br><span class="line"><span class="comment"># 44 ms 13.9 MB</span></span><br></pre></td></tr></table></figure> +<p>官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,<a href="https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/" target="_blank" rel="noopener">可以证明</a>必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。</p> + + + + + <h3 id="1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50"><a href="#1071-__u5B57_u7B26_u4E32_u7684_u6700_u5927_u516C_u56E0_u5B50" class="headerlink" title="1071. 字符串的最大公因子"></a>1071. 字符串的最大公因子</h3><p><a href="https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-999 + + http://blog.tunpok.com/2020/03/30/leetcode-999/ + 2020-03-30T13:03:25.000Z + 2020-03-30T13:03:41.000Z + + <h3 id="999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570"><a href="#999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570" class="headerlink" title="999. 可以被一步捕获的棋子数"></a>999. 可以被一步捕获的棋子数</h3><p><a href="https://leetcode-cn.com/problems/available-captures-for-rook/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">numRookCaptures</span><span class="params">(self, board)</span> -&gt; int:</span></span><br><span class="line"> i = j = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> row <span class="keyword">in</span> board:</span><br><span class="line"> <span class="keyword">if</span> <span class="string">'R'</span> <span class="keyword">in</span> row:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> i += <span class="number">1</span></span><br><span class="line"> j = row.index(<span class="string">'R'</span>)</span><br><span class="line"> count = <span class="number">0</span></span><br><span class="line"> <span class="comment"># right</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(j + <span class="number">1</span>, <span class="number">8</span>):</span><br><span class="line"> <span class="keyword">if</span> row[x] == <span class="string">'p'</span>:</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> row[x] == <span class="string">'B'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="comment"># left</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(j, <span class="number">0</span>, <span class="number">-1</span>):</span><br><span class="line"> <span class="keyword">if</span> row[x] == <span class="string">'p'</span>:</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> row[x] == <span class="string">'B'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="comment"># up</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(i, <span class="number">0</span>, <span class="number">-1</span>):</span><br><span class="line"> <span class="keyword">if</span> board[x][j] == <span class="string">'p'</span>:</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> board[x][j] == <span class="string">'B'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="comment"># down</span></span><br><span class="line"> <span class="keyword">for</span> x <span class="keyword">in</span> range(i+<span class="number">1</span>, <span class="number">8</span>):</span><br><span class="line"> <span class="keyword">if</span> board[x][j] == <span class="string">'p'</span>:</span><br><span class="line"> count += <span class="number">1</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> board[x][j] == <span class="string">'B'</span>:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">return</span> count</span><br><span class="line"></span><br><span class="line"><span class="comment">#36 ms 13.6 MB</span></span><br></pre></td></tr></table></figure> +<p>问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。</p> + + + + + <h3 id="999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570"><a href="#999-__u53EF_u4EE5_u88AB_u4E00_u6B65_u6355_u83B7_u7684_u68CB_u5B50_u6570" class="headerlink" title="999. 可以被一步捕获的棋子数"></a>999. 可以被一步捕获的棋子数</h3><p><a href="https://leetcode-cn.com/problems/available-captures-for-rook/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-914 + + http://blog.tunpok.com/2020/03/29/leetcode-914/ + 2020-03-29T14:41:09.000Z + 2020-03-29T14:52:07.000Z + + <h3 id="914-__u5361_u724C_u5206_u7EC4"><a href="#914-__u5361_u724C_u5206_u7EC4" class="headerlink" title="914. 卡牌分组"></a>914. 卡牌分组</h3><p><a href="https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">hasGroupsSizeX</span><span class="params">(self, deck)</span> -&gt; bool:</span></span><br><span class="line"> dc = &#123;&#125;</span><br><span class="line"> max_d = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> d <span class="keyword">in</span> deck:</span><br><span class="line"> <span class="keyword">if</span> d <span class="keyword">not</span> <span class="keyword">in</span> dc:</span><br><span class="line"> dc[d] = <span class="number">0</span></span><br><span class="line"> dc[d] += <span class="number">1</span></span><br><span class="line"> <span class="keyword">if</span> max_d &lt; d:</span><br><span class="line"> max_d = d</span><br><span class="line"> <span class="keyword">if</span> max_d &lt; dc[d]:</span><br><span class="line"> max_d = dc[d]</span><br><span class="line"> has_x = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">if</span> max_d == <span class="number">1</span>:</span><br><span class="line"> max_d = <span class="number">2</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">2</span>, max_d + <span class="number">1</span>):</span><br><span class="line"> has_x = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">for</span> k,v <span class="keyword">in</span> dc.items():</span><br><span class="line"> <span class="keyword">if</span> v % i:</span><br><span class="line"> has_x = <span class="keyword">False</span></span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> <span class="keyword">if</span> has_x <span class="keyword">and</span> i &gt;= <span class="number">2</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#56 ms 13.8 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="914-__u5361_u724C_u5206_u7EC4"><a href="#914-__u5361_u724C_u5206_u7EC4" class="headerlink" title="914. 卡牌分组"></a>914. 卡牌分组</h3><p><a href="https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-1013 + + http://blog.tunpok.com/2020/03/29/leetcode-1013/ + 2020-03-29T13:09:22.000Z + 2020-03-29T13:15:11.000Z + + <h3 id="1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206"><a href="#1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206" class="headerlink" title="1013. 将数组分成和相等的三个部分"></a>1013. 将数组分成和相等的三个部分</h3><p><a href="https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">canThreePartsEqualSum</span><span class="params">(self, A)</span> -&gt; bool:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> A:</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span></span><br><span class="line"> sa = sum(A)</span><br><span class="line"> <span class="keyword">if</span> sa % <span class="number">3</span>:</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span></span><br><span class="line"> s = sa // <span class="number">3</span></span><br><span class="line"> s1 = <span class="number">0</span></span><br><span class="line"> s2 = <span class="number">0</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="keyword">for</span> i <span class="keyword">in</span> range(len(A)):</span><br><span class="line"> s1 += A[i]</span><br><span class="line"> <span class="keyword">if</span> s1 == s <span class="keyword">and</span> (i+<span class="number">1</span>) &lt; len(A):</span><br><span class="line"> <span class="keyword">for</span> j <span class="keyword">in</span> range(len(A[i+<span class="number">1</span>:])):</span><br><span class="line"> s2 += A[i+<span class="number">1</span>+j]</span><br><span class="line"> <span class="keyword">if</span> s2 == s <span class="keyword">and</span> j+<span class="number">1</span> &lt; len(A[i+<span class="number">1</span>:]) <span class="keyword">and</span> sum(A[i+j+<span class="number">2</span>:])== s:</span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">False</span></span><br><span class="line"><span class="comment">#60 ms 18.7 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206"><a href="#1013-__u5C06_u6570_u7EC4_u5206_u6210_u548C_u76F8_u7B49_u7684_u4E09_u4E2A_u90E8_u5206" class="headerlink" title="1013. 将数组分成和相等的三个部分"></a>1013. 将数组分成和相等的三个部分</h3><p><a href="https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-876 + + http://blog.tunpok.com/2020/03/26/leetcode-876/ + 2020-03-26T13:18:41.000Z + 2020-03-26T13:19:10.000Z + + <h3 id="876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9"><a href="#876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9" class="headerlink" title="876. 链表的中间结点"></a>876. 链表的中间结点</h3><p><a href="https://leetcode-cn.com/problems/middle-of-the-linked-list/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Definition for singly-linked list.</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">ListNode</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x)</span>:</span></span><br><span class="line"> self.val = x</span><br><span class="line"> self.next = <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">middleNode</span><span class="params">(self, head: ListNode)</span> -&gt; ListNode:</span></span><br><span class="line"> l = []</span><br><span class="line"> n = head</span><br><span class="line"> <span class="keyword">while</span> n.next:</span><br><span class="line"> l.append(n)</span><br><span class="line"> n = n.next</span><br><span class="line"> l.append(n)</span><br><span class="line"> <span class="keyword">return</span> l[len(l)//<span class="number">2</span>]</span><br><span class="line"></span><br><span class="line"> <span class="comment">#44 ms 13.7 MB</span></span><br></pre></td></tr></table></figure> +<p>看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">middleNode</span><span class="params">(self, head: ListNode)</span> -&gt; ListNode:</span></span><br><span class="line"> slow = fast = head</span><br><span class="line"> <span class="keyword">while</span> fast <span class="keyword">and</span> fast.next:</span><br><span class="line"> slow = slow.next</span><br><span class="line"> fast = fast.next.next</span><br><span class="line"> <span class="keyword">return</span> slow</span><br><span class="line"></span><br><span class="line">作者:LeetCode-Solution</span><br><span class="line">链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/</span><br><span class="line">来源:力扣(LeetCode)</span><br><span class="line">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure> + + + + + <h3 id="876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9"><a href="#876-__u94FE_u8868_u7684_u4E2D_u95F4_u7ED3_u70B9" class="headerlink" title="876. 链表的中间结点"></a>876. 链表的中间结点</h3><p><a href="https://leetcode-cn.com/problems/middle-of-the-linked-list/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-836 + + http://blog.tunpok.com/2020/03/25/leetcode-836/ + 2020-03-25T14:41:25.000Z + 2020-03-25T14:41:44.000Z + + <h3 id="836-__u77E9_u5F62_u91CD_u53E0"><a href="#836-__u77E9_u5F62_u91CD_u53E0" class="headerlink" title="836. 矩形重叠"></a>836. 矩形重叠</h3><p><a href="https://leetcode-cn.com/problems/rectangle-overlap/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">isRectangleOverlap</span><span class="params">(self, rec1, rec2)</span> -&gt; bool:</span></span><br><span class="line"> <span class="keyword">return</span> ((min(rec1[<span class="number">2</span>], rec2[<span class="number">2</span>]) &gt; max(rec1[<span class="number">0</span>], rec2[<span class="number">0</span>]))</span><br><span class="line"> <span class="keyword">and</span> (min(rec1[<span class="number">3</span>], rec2[<span class="number">3</span>]) &gt; max(rec1[<span class="number">1</span>], rec2[<span class="number">1</span>])))</span><br><span class="line"></span><br><span class="line">s = Solution()</span><br><span class="line">s.isRectangleOverlap(rec1 = [<span class="number">0</span>,<span class="number">0</span>,<span class="number">2</span>,<span class="number">2</span>], rec2 = [<span class="number">1</span>,<span class="number">1</span>,<span class="number">3</span>,<span class="number">3</span>])</span><br><span class="line"></span><br><span class="line"><span class="comment">#40 ms 13.7 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="836-__u77E9_u5F62_u91CD_u53E0"><a href="#836-__u77E9_u5F62_u91CD_u53E0" class="headerlink" title="836. 矩形重叠"></a>836. 矩形重叠</h3><p><a href="https://leetcode-cn.com/problems/rectangle-overlap/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-409 + + http://blog.tunpok.com/2020/03/25/leetcode-409/ + 2020-03-25T13:55:38.000Z + 2020-03-25T13:55:54.000Z + + <h3 id="409-__u6700_u957F_u56DE_u6587_u4E32"><a href="#409-__u6700_u957F_u56DE_u6587_u4E32" class="headerlink" title="409. 最长回文串"></a>409. 最长回文串</h3><p><a href="https://leetcode-cn.com/problems/longest-palindrome/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。</p> +<p>这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">longestPalindrome</span><span class="params">(self, s: str)</span> -&gt; int:</span></span><br><span class="line"> d = &#123;&#125;</span><br><span class="line"> <span class="keyword">for</span> l <span class="keyword">in</span> s:</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> l <span class="keyword">in</span> d:</span><br><span class="line"> d[l] = <span class="number">0</span></span><br><span class="line"> d[l] += <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> i = <span class="number">0</span></span><br><span class="line"> odd = <span class="keyword">False</span></span><br><span class="line"> <span class="keyword">for</span> k, v <span class="keyword">in</span> d.items():</span><br><span class="line"> <span class="keyword">if</span> v % <span class="number">2</span>:</span><br><span class="line"> i += (v<span class="number">-1</span>)</span><br><span class="line"> odd = <span class="keyword">True</span></span><br><span class="line"> <span class="keyword">else</span>:</span><br><span class="line"> i += v</span><br><span class="line"> <span class="keyword">if</span> odd:</span><br><span class="line"> i += <span class="number">1</span></span><br><span class="line"> <span class="keyword">return</span> i</span><br><span class="line"></span><br><span class="line"><span class="comment">#40 ms 13.6 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="409-__u6700_u957F_u56DE_u6587_u4E32"><a href="#409-__u6700_u957F_u56DE_u6587_u4E32" class="headerlink" title="409. 最长回文串"></a>409. 最长回文串</h3><p><a href="https://leetcode-cn.com/problems/longest-palindrome/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-543 + + http://blog.tunpok.com/2020/03/25/leetcode-543/ + 2020-03-25T11:13:52.000Z + 2020-04-14T15:29:53.000Z + + <h3 id="543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84"><a href="#543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84" class="headerlink" title="543. 二叉树的直径"></a>543. 二叉树的直径</h3><p><a href="https://leetcode-cn.com/problems/diameter-of-binary-tree/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment"># Definition for a binary tree node.</span></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">TreeNode</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self, x)</span>:</span></span><br><span class="line"> self.val = x</span><br><span class="line"> self.left = <span class="keyword">None</span></span><br><span class="line"> self.right = <span class="keyword">None</span></span><br><span class="line"></span><br><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">diameterOfBinaryTree</span><span class="params">(self, root: TreeNode)</span> -&gt; int:</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> root:</span><br><span class="line"> <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> last_node = <span class="number">-1</span></span><br><span class="line"> routes = []</span><br><span class="line"> start = root</span><br><span class="line"> node_stack = [root]</span><br><span class="line"> <span class="keyword">while</span> (start.left <span class="keyword">or</span> start.right <span class="keyword">or</span> node_stack):</span><br><span class="line"> <span class="keyword">if</span> start != node_stack[<span class="number">-1</span>]:</span><br><span class="line"> node_stack.append(start)</span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> last_node == start.right:</span><br><span class="line"> node_stack = node_stack[:<span class="number">-1</span>]</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> node_stack:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> last_node = start</span><br><span class="line"> start = node_stack[<span class="number">-1</span>]</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> start.left <span class="keyword">and</span> last_node != start.left:</span><br><span class="line"> start = start.left</span><br><span class="line"> last_node = start</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"> <span class="keyword">if</span> start.right:</span><br><span class="line"> start = start.right</span><br><span class="line"> last_node = start</span><br><span class="line"> <span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"> routes.append(node_stack)</span><br><span class="line"> node_stack = node_stack[:<span class="number">-1</span>]</span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> node_stack:</span><br><span class="line"> <span class="keyword">break</span></span><br><span class="line"> last_node = start</span><br><span class="line"> start = node_stack[<span class="number">-1</span>]</span><br><span class="line"></span><br><span class="line"> max_l = <span class="number">0</span></span><br><span class="line"> <span class="keyword">for</span> route <span class="keyword">in</span> routes:</span><br><span class="line"> <span class="keyword">for</span> route_ <span class="keyword">in</span> routes:</span><br><span class="line"> intersection = <span class="number">0</span></span><br><span class="line"> <span class="keyword">if</span> route != route_:</span><br><span class="line"> intersection = len(set(route).intersection(set(route_)))</span><br><span class="line"> <span class="keyword">if</span> intersection:</span><br><span class="line"> intersection -= <span class="number">1</span></span><br><span class="line"> max_l = max(max_l, len(set(route)| set(route_)) - intersection)</span><br><span class="line"> <span class="keyword">return</span> max_l - <span class="number">1</span></span><br></pre></td></tr></table></figure> +<p>L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。</p> +<p>其实以某个点为根节点的树的直径,就是某个节点的<strong>左子树的深度和右子树的深度的和</strong>,用递归来处理这个会比较容易理解</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">Solution</span><span class="params">(object)</span>:</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">diameterOfBinaryTree</span><span class="params">(self, root)</span>:</span></span><br><span class="line"> self.ans = <span class="number">1</span></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">depth</span><span class="params">(node)</span>:</span></span><br><span class="line"> <span class="comment"># 访问到空节点了,返回0</span></span><br><span class="line"> <span class="keyword">if</span> <span class="keyword">not</span> node: <span class="keyword">return</span> <span class="number">0</span></span><br><span class="line"> <span class="comment"># 左儿子为根的子树的深度</span></span><br><span class="line"> L = depth(node.left)</span><br><span class="line"> <span class="comment"># 右儿子为根的子树的深度</span></span><br><span class="line"> R = depth(node.right)</span><br><span class="line"> <span class="comment"># 计算d_node即L+R+1 并更新ans</span></span><br><span class="line"> self.ans = max(self.ans, L+R+<span class="number">1</span>)</span><br><span class="line"> <span class="comment"># 返回该节点为根的子树的深度</span></span><br><span class="line"> <span class="keyword">return</span> max(L, R) + <span class="number">1</span></span><br><span class="line"></span><br><span class="line"> depth(root)</span><br><span class="line"> <span class="keyword">return</span> self.ans - <span class="number">1</span></span><br><span class="line"></span><br><span class="line">作者:LeetCode-Solution</span><br><span class="line">链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/</span><br><span class="line">来源:力扣(LeetCode)</span><br><span class="line">著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。</span><br></pre></td></tr></table></figure> + + + + + <h3 id="543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84"><a href="#543-__u4E8C_u53C9_u6811_u7684_u76F4_u5F84" class="headerlink" title="543. 二叉树的直径"></a>543. 二叉树的直径</h3><p><a href="https://leetcode-cn.com/problems/diameter-of-binary-tree/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + + leetcode-225 + + http://blog.tunpok.com/2020/03/23/leetcode-225/ + 2020-03-23T15:35:05.000Z + 2020-03-23T15:35:24.000Z + + <h3 id="225-__u7528_u961F_u5217_u5B9E_u73B0_u6808"><a href="#225-__u7528_u961F_u5217_u5B9E_u73B0_u6808" class="headerlink" title="225. 用队列实现栈"></a>225. 用队列实现栈</h3><p><a href="https://leetcode-cn.com/problems/implement-stack-using-queues/" target="_blank" rel="noopener">题目</a></p> +<a id="more"></a> +<p>注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。</p> +<figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br></pre></td><td class="code"><pre><span class="line"><span class="class"><span class="keyword">class</span> <span class="title">MyStack</span>:</span></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">__init__</span><span class="params">(self)</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Initialize your data structure here.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> self.data = []</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">push</span><span class="params">(self, x: int)</span> -&gt; <span class="keyword">None</span>:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Push element x onto stack.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> self.data.append(x)</span><br><span class="line"> <span class="keyword">return</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">pop</span><span class="params">(self)</span> -&gt; int:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Removes the element on top of the stack and returns that element.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">return</span> self.data.pop(<span class="number">-1</span>)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">top</span><span class="params">(self)</span> -&gt; int:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Get the top element.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">return</span> self.data[<span class="number">-1</span>]</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"> <span class="function"><span class="keyword">def</span> <span class="title">empty</span><span class="params">(self)</span> -&gt; bool:</span></span><br><span class="line"> <span class="string">"""</span></span><br><span class="line"><span class="string"> Returns whether the stack is empty.</span></span><br><span class="line"><span class="string"> """</span></span><br><span class="line"> <span class="keyword">return</span> <span class="keyword">not</span> bool(self.data)</span><br><span class="line"></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="comment"># Your MyStack object will be instantiated and called as such:</span></span><br><span class="line"><span class="comment"># obj = MyStack()</span></span><br><span class="line"><span class="comment"># obj.push(x)</span></span><br><span class="line"><span class="comment"># param_2 = obj.pop()</span></span><br><span class="line"><span class="comment"># param_3 = obj.top()</span></span><br><span class="line"><span class="comment"># param_4 = obj.empty()</span></span><br><span class="line"></span><br><span class="line"><span class="comment">#24 ms 13.5 MB</span></span><br></pre></td></tr></table></figure> + + + + + <h3 id="225-__u7528_u961F_u5217_u5B9E_u73B0_u6808"><a href="#225-__u7528_u961F_u5217_u5B9E_u73B0_u6808" class="headerlink" title="225. 用队列实现栈"></a>225. 用队列实现栈</h3><p><a href="https://leetcode-cn.com/problems/implement-stack-using-queues/" target="_blank" rel="noopener">题目</a></p> + + + + + + + + + diff --git a/public/categories/leetcode/index.html b/public/categories/leetcode/index.html new file mode 100644 index 0000000..0356b98 --- /dev/null +++ b/public/categories/leetcode/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/categories/leetcode/page/2/index.html b/public/categories/leetcode/page/2/index.html new file mode 100644 index 0000000..f73cc41 --- /dev/null +++ b/public/categories/leetcode/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/categories/leetcode/page/3/index.html b/public/categories/leetcode/page/3/index.html new file mode 100644 index 0000000..ec42c2f --- /dev/null +++ b/public/categories/leetcode/page/3/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/css/apollo.css b/public/css/apollo.css new file mode 100644 index 0000000..375a69b --- /dev/null +++ b/public/css/apollo.css @@ -0,0 +1 @@ +/*! normalize.css v3.0.3 | MIT License | github.com/necolas/normalize.css */html{font-family:sans-serif;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}audio,canvas,progress,video{display:inline-block;vertical-align:baseline}audio:not([controls]){display:none;height:0}[hidden],template{display:none}a{background-color:transparent}a:active,a:hover{outline:0}abbr[title]{border-bottom:1px dotted}b,strong{font-weight:bold}dfn{font-style:italic}h1{font-size:2em;margin:0.67em 0}mark{background:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sup{top:-0.5em}sub{bottom:-0.25em}img{border:0}svg:not(:root){overflow:hidden}figure{margin:1em 40px}hr{box-sizing:content-box;height:0}pre{overflow:auto}code,kbd,pre,samp{font-family:monospace, monospace;font-size:1em}button,input,optgroup,select,textarea{color:inherit;font:inherit;margin:0}button{overflow:visible}button,select{text-transform:none}button,html input[type="button"],input[type="reset"],input[type="submit"]{-webkit-appearance:button;cursor:pointer}button[disabled],html input[disabled]{cursor:default}button::-moz-focus-inner,input::-moz-focus-inner{border:0;padding:0}input{line-height:normal}input[type="checkbox"],input[type="radio"]{box-sizing:border-box;padding:0}input[type="number"]::-webkit-inner-spin-button,input[type="number"]::-webkit-outer-spin-button{height:auto}input[type="search"]{-webkit-appearance:textfield;box-sizing:content-box}input[type="search"]::-webkit-search-cancel-button,input[type="search"]::-webkit-search-decoration{-webkit-appearance:none}fieldset{border:1px solid #c0c0c0;margin:0 2px;padding:0.35em 0.625em 0.75em}legend{border:0;padding:0}textarea{overflow:auto}optgroup{font-weight:bold}table{border-collapse:collapse;border-spacing:0}td,th{padding:0}body{margin:0;color:#34495e;font-size:15px;line-height:1.6;font-family:'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif}ul.nav,ul.post-list{margin:0;padding:0;list-style-type:none}a,a:active{color:#2c3e50;text-decoration:none}a.nav-list-link.active,a.nav-list-link:hover,a.post-title-link:hover{border-bottom:2px solid #42b983}hr{border:0}code{margin:0 2px;padding:3px 5px;color:#e96900;border-radius:2px;white-space:inherit}table{width:100%}table thead{background-color:#ddd}table thead th{padding:5px}table tbody tr:nth-child(2n){background-color:#eee}table tbody td{padding:5px}header{height:60px}header .logo-link{float:left}header .nav{float:right;left:80px}header .logo-link img{height:60px}header .nav-list-item{display:inline-block;padding:19px 10px}header .nav-list-item a{font-size:16px;line-height:1.4}.home.post-list{margin:2em 0}.home.post-list .post-list-item{padding:1em 0 2em;border-bottom:1px solid #ddd}.home.post-list .post-content h2:before,.home.post-list .post-content h3:before,.home.post-list .post-content h4:before,.home.post-list .post-content h5:before,.home.post-list .post-content h6:before{content:''}.home.post-list .post-content>ul{list-style:initial}.home.post-list .read-more{color:#42b983}.post{padding-top:1em}.post-block .post-title{margin:0.65em 0;color:#2c3e50;font-size:1.5em}.post-block .post-time{color:#7f8c8d;margin:1.2em 0}.post-content h2,.post-content h3,.post-content h4,.post-content h5,.post-content h6{position:relative;margin:1em 0}.post-content h2:before,.post-content h3:before,.post-content h4:before,.post-content h5:before,.post-content h6:before{content:"#";color:#42b983;position:absolute;left:-0.7em;top:-4px;font-size:1.2em;font-weight:bold}.post-content h2,.post-content h3{font-size:22px}.post-content h4,.post-content h5,.post-content h6{font-size:18px}.post-content a{color:#42b983}.post-content blockquote{margin:2em 0;padding-left:20px;border-left:4px solid #42b983}.post-content img{display:block;max-width:100%;margin:1em auto}.post-content .tip{position:relative;margin:2em 0;padding:12px 24px 12px 30px;border-left:4px solid #f66;border-top-right-radius:2px;border-bottom-right-radius:2px;background-color:#f8f8f8}.post-content .tip br{display:none}.post-content .tip:before{position:absolute;top:14px;left:-12px;content:"!";width:20px;height:20px;border-radius:100%;color:#fff;font-size:14px;line-height:20px;font-weight:bold;text-align:center;background-color:#f66;font-family:'Dosis', 'Source Sans Pro', 'Helvetica Neue', Arial, sans-serif}code,pre{font-size:0.8em;background-color:#f8f8f8;font-family:'Roboto Mono', Monaco, courier, monospace}.highlight{position:relative;margin:1em 0;border-radius:2px;line-height:1.1em;background-color:#f8f8f8;overflow-x:auto}.highlight table,.highlight tr,.highlight td{width:100%;border-collapse:collapse;padding:0;margin:0}.highlight .gutter{display:none}.highlight .code pre{padding:1.2em 1.4em;line-height:1.5em;margin:0}.highlight.html .code:after,.highlight.js .code:after,.highlight.bash .code:after,.highlight.css .code:after,.highlight.scss .code:after,.highlight.diff .code:after,.highlight.java .code:after,.highlight.xml .code:after,.highlight.python .code:after,.highlight.json .code:after,.highlight.swift .code:after,.highlight.ruby .code:after,.highlight.perl .code:after,.highlight.php .code:after,.highlight.c .code:after{position:absolute;top:0;right:0;color:#ccc;text-align:right;font-size:0.75em;padding:5px 10px 0;line-height:15px;height:15px;font-weight:600}.highlight.html .code:after{content:"HTML"}.highlight.js .code:after{content:"JS"}.highlight.bash .code:after{content:"BASH"}.highlight.css .code:after{content:"CSS"}.highlight.scss .code:after{content:"SCSS"}.highlight.diff .code:after{content:"DIFF"}.highlight.java .code:after{content:"JAVA"}.highlight.xml .code:after{content:"XML"}.highlight.python .code:after{content:"PYTHON"}.highlight.json .code:after{content:"JSON"}.highlight.swift .code:after{content:"SWIFT"}.highlight.ruby .code:after{content:"RUBY"}.highlight.perl .code:after{content:"PERL"}.highlight.php .code:after{content:"PHP"}.highlight.c .code:after{content:"C"}.highlight.java .code:after{content:"JAVA"}pre{color:#525252}pre .function .keyword,pre .constant{color:#0092db}pre .keyword,pre .attribute{color:#e96900}pre .number,pre .literal{color:#ae81ff}pre .tag,pre .tag .title,pre .change,pre .winutils,pre .flow,pre .lisp .title,pre .clojure .built_in,pre .nginx .title,pre .tex .special{color:#2973b7}pre .symbol,pre .symbol .string,pre .value,pre .regexp{color:#42b983}pre .title{color:#83B917}pre .tag .value,pre .string,pre .subst,pre .haskell .type,pre .preprocessor,pre .ruby .class .parent,pre .built_in,pre .sql .aggregate,pre .django .template_tag,pre .django .variable,pre .smalltalk .class,pre .javadoc,pre .django .filter .argument,pre .smalltalk .localvars,pre .smalltalk .array,pre .attr_selector,pre .pseudo,pre .addition,pre .stream,pre .envvar,pre .apache .tag,pre .apache .cbracket,pre .tex .command,pre .prompt{color:#42b983}pre .comment,pre .java .annotation,pre .python .decorator,pre .template_comment,pre .pi,pre .doctype,pre .shebang,pre .apache .sqbracket,pre .tex .formula{color:#b3b3b3}pre .deletion{color:#BA4545}pre .coffeescript .javascript,pre .javascript .xml,pre .tex .formula,pre .xml .javascript,pre .xml .vbscript,pre .xml .css,pre .xml .cdata{opacity:0.5}.paginator{margin:4em 0;text-align:center}.paginator .prev,.paginator .next{display:inline-block;margin:0 4px;padding:4px 12px;border-radius:4px;border-bottom:4px solid #3aa373;font-size:14px;color:#fff;background-color:#4fc08d}.paginator .prev:hover,.paginator .next:hover{background-color:#22bd77}.ds-thread,#disqus_thread{margin-bottom:2em}section.container{margin:2em 10px}@media screen and (min-width: 700px){body{width:700px;margin:0 auto}header{padding:20px 100px}}@media screen and (max-width: 700px){body{width:100%}header{padding:20px 40px}header a.logo-link,header ul.nav.nav-list{float:none;display:block;text-align:center}.post-content h2,.post-content h3,.post-content h4,.post-content h5,.post-content h6{max-width:300px;left:15px}.ds-thread,#disqus_thread{margin:2em 10px}}.copyright{margin:4em 0;border-top:1px solid #ddd;text-align:center}.copyright p,.copyright a{color:#aaa;font-size:14px;font-weight:100}.copyright a:hover{color:#888} diff --git a/public/favicon.png b/public/favicon.png new file mode 100644 index 0000000000000000000000000000000000000000..fc0bd8bd229b6a6f9f86776834e43526490d5a48 GIT binary patch literal 616 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbKJOS+@4BLl<6e(pbstU$g(vPY0F z14ES>14Ba#1H&(%P{RubhEf9thF1v;3|2E37{m+a>aDXa%`Nma)o^Zxz&p@IIMuFh=-mjPvgC}T!r+U(Z!8I4JEnt<%= zIjyS7@-|Ox0bmN-k|Ns9#?|$VS&@;>>L4Lsuv8=6}!X7{_W0JSKi<7{0+b=*4dx@v7EBhl> zenB1MIrn@%0EK!zT^vIsE~lQq&c~!E;u@HfAbG?pOy=t?!Rq(_{`*VrcroKlT@1gv zWs6If>Lg7s&19XqC#6nQ+UU1vd`Mauvr_6qeSq_d`h^!=GCppbvPt+v9{)oAX2l+c z1e=Wpb64*4R{oLIsQdNQp{U%Ls_caA_A(nM+ugo+`s=epy}y-ZYH#uCw@hdJ^iNyP z_CKS8mDEDJ)s?^qWKb<}jVMV;EJ?LWE=mPb3`Pcq7P MarkDown
\ No newline at end of file diff --git a/public/logo.png b/public/logo.png new file mode 100644 index 0000000000000000000000000000000000000000..97c62308eb5e060db5913b4972cd4b451da5baba GIT binary patch literal 3001 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 literal 0 HcmV?d00001 diff --git a/public/page/2/index.html b/public/page/2/index.html new file mode 100644 index 0000000..4b3037c --- /dev/null +++ b/public/page/2/index.html @@ -0,0 +1,118 @@ + MarkDown
\ No newline at end of file diff --git a/public/page/3/index.html b/public/page/3/index.html new file mode 100644 index 0000000..45cda11 --- /dev/null +++ b/public/page/3/index.html @@ -0,0 +1,236 @@ + MarkDown
  • AWS KMS

    We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don’t have any leak but this practice is not recommended for both security and easy of use reasons.

    +

    Since AWS finally provides KMS(Key Management Service) in our local region, we try to encrypt every private credentials by KMS and store them on S3.

    +

    TBD

    +
  • Postgresql Partitioning

    Partitioning refers to splitting what is logically one large table inot smaller physical pieces.

    +

    Currently, PostgreSQL supports partitioning via table inheritance. Each partition must be created as a child table of a single parent table. The parent table itself is normally empty; It exists just to represent the entire data set.

    +

    There are two forms of partitioning can be implemented in PostgreSQL:

    +
      +
    • Range Partitioning

      +

      ​ The table is partitioning into “range” defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers.

      +
    • +
    • List Partitioning

      +

      ​ The table is partitioned by explicitly listing which key values appear in each partition.

      +
    • +
    +

    Implementing Partitioning

      +
    1. Create the “master” / “parent” table, from which all the partitions will inherit.

      +

      ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either.

      +
    2. +
    3. Create “child” tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master.

      +
    4. +
    5. Add table constraints to the partition tables to define the allowed key values in each partitions.

      +

      ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning.

      +
    6. +
    7. Create indexes on column(s) for each partitions.

      +
    8. +
    9. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

      +
    10. +
    11. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

      +
    12. +
    +

    Trigger

    As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed.

    +
  • bash function and awk

    I’ll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let’s see what these functions can do to help me improve my productivity.

    +

    bash functions

    Bash functions are scripts like alias, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as && I guess:

    +
    1
    2
    3
    4
    function run {
    source ~/Develop/django/bin/activate
    ./manage.py runserver
    }
    +

    I activate django virtural enviroment first and then run django serve.

    +

    Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work:

    +
    1
    2
    function ba { hgba | grep "$1" }
    # hgba is an alias for hg branches
    +

    I can just type ba release then get current release branch info.

    +
    +

    Append:

    +

    I made some updates to the ba function and make it auto copying the branch result to my clipboard:

    +
    1
    2

    function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var }
    +

    awk

    awk is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python.

    +
  • TastyPie Note 1

    Flow Through The Request/Response Cycle

    Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself.

    +

    Walking through what a GET request to a list endpoint looks like:

    +
      +
    • The Resource.urls are checked by Django’s url resolvers.

      +
    • +
    • On a match for the list view, Resource.wrap_view('dispatch_list') is called. wrap_view provides basic error handling & allows for returning serilized errors.

      +
    • +
    • Because dispatch_list was passed to wrap_view, Resource.dispatch_list is called next. This is a thin wrapper around Resource.dispatch.

      +
    • +
    • dispatch does a bunch of havy lifting. It ensures:

      +
        +
      • the requested HTTP method is in allowed_methos (method_check).
      • +
      • the class has a method that can handle the request(get_list)
      • +
      • the user is authenticated(is_authenticated)
      • +
      • the user has no exceeded their throttle(throttle_check).
      • +
      +

      At this point, dispatch actually calls the requested method (get_list).

      +
    • +
    • get_list does the actual work of API. It does:

      +
        +
      • A fetch of the available objects via Resource.obj_get_list. In the case of ModelResource, this builds the ORM filters to apply (ModelResource.build_filters). It then gets the QuerySet via ModelResource.get_object_list (which performs Resource.authorized_read_list to possibly limit the set the user can work with) and applies the built filters to it.
      • +
      • It then sorts the objects based on user input (ModelResource.apply_sorting).
      • +
      • Then it paginates the results using the supplied Paginator & pulls out the data to be serialized.
      • +
      • The objects in the page have full_dehydrate applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports.
      • +
      • Finally, it calls Resource.create_response.
      • +
      +
    • +
    • create_response is a shortcut method that:

      +
        +
      • Determines the desired response format (Resource.determine_format).
      • +
      • Serializes the data given to it in the proper format.
      • +
      • Returns a Django HttpResponse (200 OK) with the serialized data.
      • +
      +
    • +
    • We bubble back up the call stack to dispatch. The last thing dispatch does is potentially store that a request occured for future throttling (Resource.log_throttled_access) then either returns the HttpResponse or wraps whatever data came back in a response (so Django doesn’t freak out).

      +
    • +
    +
  • Tastypie

    Resources in Tastypie

    Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response.

    +

    Understanding the process of creating a resource.

    +
      +
    1. Import ModelResource from Tastypie.
    2. +
    3. Import models from services app
    4. +
    5. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
    6. +
    +

    Add API URL in the urls.py of app.

    +

    Dehydrating the JSON data

    flow

    +

    Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods.

    +
    Dehydrate_field method

    This dehydrate_field is uesd to modify field on the response JSON.

    +
    Dehydrate method

    Dehydrate method is useful for aadding additional fields to bundle (response data).

    +

    Similarly using hydrate method we can alter the bundle data which is generated from request at the time of PUT or POST methods.

    +
  • Django Manager Method

    Django Manager

    Django 里会为每一个 model 生成一个 Manager,默认名字为 objects,一般情况下对 model 进行的处理都是通过 model.objects.XXX( ) 来进行的。其实是调用了 model 的 manager 的方法,而 manager 之中的方法是 QuerySet 方法的代理,QuerySet 方法是对数据库操作的封装。

    +

    eg.

    +
    1
    2
    3
    4
    5
    from django.db import models

    class Person(models.Model):
    ...
    people = models.Manager()
    +

    上面这个 model,Person.objects会产生一个AttributeError,但是Person.people就可以正常操作。因为默认的 manager 已经变成 people,objects 这个 manager 没有重新声明,不起作用。

    +

    自定义 Manager

    通常需要自定义 manager 的情况有两点:

    +
      +
    1. 需要修改/扩展 Django 的 manager 方法
    2. +
    3. 需要修改返回的 QuerySet
    4. +
    +

    默认 Manager

    如果使用自定义的 manager 需要注意的是,Django 将 model 中定义的第一个 manager 认为是默认 manager,而且 Django 框架中会用到默认 manager。

    +

    笨方法是使用自定义 manager 的时候,对于 model 依然提供 objects 这个默认 manager,并放在第一个。

    +

    eg.

    +
    1
    2
    3
    4
    5
    6
    class Book(models.Model):
    title = models.CharField(max_length=100)
    author = models.CharField(max_length=50)

    objects = models.Manager() # default manager
    custom_objects = CustomBOokManager() # custom manager
    +

    source

    +
  • Flask Day 2

    To handle web forms we use Flask-WTF . So we need to write a config file (file config.py):

    +
    1
    2
    WTF_CSRF_ENABLED = True
    SECRET_KEY = 'you-will-never-guess'
    +

    And then you need to use this config (file app/__init__.py):

    +
    1
    2
    3
    4
    5
    6
    from flask import Flask

    app = Flask(__name__)
    app.config.from_object('config')

    from app import views
    +

    Let’s build a simple form (file app/forms.app):

    +
    1
    2
    3
    4
    5
    6
    7
    from flask.ext.wtf import Form
    from wtforms import StringField, BooleanField
    from wtforms.validators import DataRequired

    class LoginForm(Form):
    openid = StringField('openid', validators=[DataRequired()])
    remember_me = BooleanField('remember_me', default=False)
    +

    The DataRequired() is a validator that checks the field is empty or not.

    +

    After that, we need a HTML page to show the form (file app/templates/login.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <!-- extend from base layout -->
    {% extends "base.html" %}

    {% block content %}
    <h1>Sign In</h1>
    <form action="" method="post" name="login">
    {{ form.hidden_tag() }}
    <p>
    Please enter your OpenID:<br>
    {{ form.openid(size=80) }}<br>
    </p>
    <p>{{ form.remember_me }} Remember Me</p>
    <p><input type="submit" value="Sign In"></p>
    </form>
    {% endblock %}
    +

    The final step is to code a view function that renders the template and receiving data from form (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    from flask import render_template, flash, redirect
    from app import app
    from .forms import LoginForm

    # index view function suppressed for brevity

    app.route('/login', methods=['GET', 'POST'])
    def login():
    form = LoginForm()
    if form.validate_on_submit():
    flash('Login requested for OpenID="%s", remember_me=%s' %
    (form.openid.data, str(form.remember_me.data)))
    return redirect('/index')
    return render_template('login.html',
    title='Sign In',
    form=form)
    +
\ No newline at end of file diff --git a/public/page/4/index.html b/public/page/4/index.html new file mode 100644 index 0000000..d1353e3 --- /dev/null +++ b/public/page/4/index.html @@ -0,0 +1,147 @@ + MarkDown
  • Flask Day 1

    “Hello World” in Flask

    Create a folder named microblog (or whatever you want). Then cd into that folder and run following prompt in terminal:

    +
    1
    $ python3 -m venv flask
    +

    Now you’ll have a folder named flask inside microblog, containing a private version of Python interpreter.

    +

    And you should install flask and extensions by the commands below:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ flask/bin/pip install flask
    $ flask/bin/pip install flask-login
    $ flask/bin/pip install flask-openid
    $ flask/bin/pip install flask-mail
    $ flask/bin/pip install flask-sqlalchemy
    $ flask/bin/pip install sqlalchemy-migrate
    $ flask/bin/pip install flask-whooshalchemy
    $ flask/bin/pip install flask-wtf
    $ flask/bin/pip install flask-babel
    $ flask/bin/pip install guess_language
    $ flask/bin/pip install flipflop
    $ flask/bin/pip install coverage
    +

    After that, let’s create the basic structure for our application: app app/static app/templates tmp.

    +
      +
    1. app — where the application package is
    2. +
    3. static — stores static files like images, javascripts, and css.
    4. +
    5. templates — where templates will go.
    6. +
    +

    Then you can start with __init__.py which should put into app folder (file app/__init__.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    The views are the handlers that response to requests from web browsers or other clients. Each view function is mapped to one or more request URLs.

    +

    Let’s see what a views function looks like (file app/views.py):

    +
    1
    2
    3
    4
    from flask import Flask

    app = Flask(__name__)
    from app import views
    +

    Finally we should create a script to starts up the web server with our application(file run.py):

    +
    1
    2
    3
    #!flask/bin/python
    from app import app
    app.run(debug=True)
    +

    To indicating that is an executable file you need to run this in terminal:

    +
    1
    $ chmod a+x run.py
    +

    Now the file structure should look like:

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    microblog\
    flask\
    <virtual environment files>
    app\
    static\
    templates\
    __init__.py
    views.py
    tmp\
    run.py
    +

    Then start to write the template (file app/templates/index.html):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <html>

    <head>
    <title>{{ title }} - microblog</title>
    </head>

    <body>
    <h1>Hello, {{ user.nickname }}!</h1>
    </body>

    </html>
    +

    Now let’s write the view function that uses this template (file app/views.py):

    +
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    from flask import render_template
    from app import app

    @app.route('/')
    @app.route('/index')
    def index():
    user = {'nickname': 'ching'} # fake user
    return render_template('index.html',
    title='Home',
    user=user)
    +

    render_template function is what we import from Flask framework to render the template. It uses Jinja2 templating engine.

    +
\ No newline at end of file diff --git a/public/scss/apollo.scss b/public/scss/apollo.scss new file mode 100644 index 0000000..b9ddbf2 --- /dev/null +++ b/public/scss/apollo.scss @@ -0,0 +1,10 @@ +@charset "utf-8"; + +@import "_partial/normalize"; +@import "_partial/base"; +@import "_partial/header"; +@import "_partial/home-post-list"; +@import "_partial/post"; +@import "_partial/footer"; +@import "_partial/mq"; +@import "_partial/copyright"; \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml new file mode 100644 index 0000000..0822543 --- /dev/null +++ b/public/sitemap.xml @@ -0,0 +1,228 @@ + + + + + http://blog.tunpok.com/2020/04/21/leetcode-number-of-islands/ + + 2020-04-21T04:55:46.000Z + + + + + http://blog.tunpok.com/2020/04/16/leetcode-string-to-integer-atoi/ + + 2020-04-16T11:56:40.000Z + + + + + http://blog.tunpok.com/2020/04/16/leetcode-merge-intervals/ + + 2020-04-16T11:22:48.000Z + + + + + http://blog.tunpok.com/2020/04/16/leetcode-01-matrix/ + + 2020-04-16T04:26:56.000Z + + + + + http://blog.tunpok.com/2020/03/25/leetcode-543/ + + 2020-04-14T15:29:53.000Z + + + + + http://blog.tunpok.com/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/ + + 2020-04-14T15:29:40.000Z + + + + + http://blog.tunpok.com/2020/04/14/leetcode-design-twitter/ + + 2020-04-14T15:29:34.000Z + + + + + http://blog.tunpok.com/2020/04/14/leetcode-add-two-numbers-ii/ + + 2020-04-14T15:28:35.000Z + + + + + http://blog.tunpok.com/2020/04/01/leetcode-1103/ + + 2020-04-08T17:17:27.000Z + + + + + http://blog.tunpok.com/2020/04/09/leetcode-the-masseuse-lcci/ + + 2020-04-08T17:14:04.000Z + + + + + http://blog.tunpok.com/2020/04/01/leetcode-compress-string-lcci/ + + 2020-04-01T07:57:26.000Z + + + + + http://blog.tunpok.com/2020/04/01/leetcode-1160/ + + 2020-04-01T07:57:06.000Z + + + + + http://blog.tunpok.com/2020/03/30/leetcode-1071/ + + 2020-03-30T14:04:17.000Z + + + + + http://blog.tunpok.com/2020/03/30/leetcode-999/ + + 2020-03-30T13:03:41.000Z + + + + + http://blog.tunpok.com/2020/03/29/leetcode-914/ + + 2020-03-29T14:52:07.000Z + + + + + http://blog.tunpok.com/2020/03/29/leetcode-1013/ + + 2020-03-29T13:15:11.000Z + + + + + http://blog.tunpok.com/2020/03/26/leetcode-876/ + + 2020-03-26T13:19:10.000Z + + + + + http://blog.tunpok.com/2020/03/25/leetcode-836/ + + 2020-03-25T14:41:44.000Z + + + + + http://blog.tunpok.com/2020/03/25/leetcode-409/ + + 2020-03-25T13:55:54.000Z + + + + + http://blog.tunpok.com/2020/03/23/leetcode-225/ + + 2020-03-23T15:35:24.000Z + + + + + http://blog.tunpok.com/2020/03/23/leetcode-169/ + + 2020-03-23T15:13:49.000Z + + + + + http://blog.tunpok.com/2020/03/18/leetcode-206/ + + 2020-03-18T15:44:12.000Z + + + + + http://blog.tunpok.com/2020/03/17/leetcode-121/ + + 2020-03-17T10:54:03.000Z + + + + + http://blog.tunpok.com/2019/11/14/AWS-KMS/ + + 2019-11-14T08:03:24.000Z + + + + + http://blog.tunpok.com/2018/05/31/bash-function-and-awk/ + + 2019-11-14T08:01:50.000Z + + + + + http://blog.tunpok.com/2019/03/12/Postgresql-Partitioning/ + + 2019-11-14T08:01:50.000Z + + + + + http://blog.tunpok.com/2016/04/25/Django-Manager-Method/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/02/15/Flask-Day-1/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/02/16/Flask-Day-2/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/05/04/Tastypie/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/02/12/first-post/ + + 2018-05-15T14:58:35.000Z + + + + + http://blog.tunpok.com/2016/05/10/TastyPie-Note-1/ + + 2018-05-15T14:58:35.000Z + + + + diff --git a/scaffolds/draft.md b/scaffolds/draft.md new file mode 100644 index 0000000..498e95b --- /dev/null +++ b/scaffolds/draft.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +tags: +--- diff --git a/scaffolds/page.md b/scaffolds/page.md new file mode 100644 index 0000000..f01ba3c --- /dev/null +++ b/scaffolds/page.md @@ -0,0 +1,4 @@ +--- +title: {{ title }} +date: {{ date }} +--- diff --git a/scaffolds/post.md b/scaffolds/post.md new file mode 100644 index 0000000..47e6b91 --- /dev/null +++ b/scaffolds/post.md @@ -0,0 +1,6 @@ +--- +title: {{ title }} +date: {{ date }} +tags: +categories: +--- diff --git a/source/.MWebMetaData/setting.json b/source/.MWebMetaData/setting.json new file mode 100644 index 0000000..8fc031b --- /dev/null +++ b/source/.MWebMetaData/setting.json @@ -0,0 +1,10 @@ +{ + "name" : "hexo_blog_tunpok", + "fileExtension" : ".md", + "autoUploadInsertedImageKey" : "looching-https:\/\/looching.imgur.com\/", + "autoUploadInsertedImage" : false, + "folderType" : 11, + "mediaFloder" : "media", + "orderBy" : 0, + "newlinesToBR" : 0 +} \ No newline at end of file diff --git a/source/CNAME b/source/CNAME new file mode 100644 index 0000000..bc9fd8c --- /dev/null +++ b/source/CNAME @@ -0,0 +1 @@ +blog.tunpok.com diff --git a/source/_posts/2018-05-31-bash-function-and-awk.md b/source/_posts/2018-05-31-bash-function-and-awk.md new file mode 100644 index 0000000..874ffcc --- /dev/null +++ b/source/_posts/2018-05-31-bash-function-and-awk.md @@ -0,0 +1,52 @@ +--- +title: bash function and awk +date: 2018-05-31 00:00:48 +tags: +--- + + + +I'll come across many hg branch-switching or log searching tasks during my work. Using bash functions and awk greatly reduce the time I spend on dealing with these tasks. So let's see what these functions can do to help me improve my productivity. + + + +#### bash functions + +Bash functions are scripts like `alias`, but can do much a lot than aliasThe first kind of usages of function is to run several scripts continuously, the same as `&&` I guess: + +```bash +function run { + source ~/Develop/django/bin/activate + ./manage.py runserver +} +``` + +I activate django virtural enviroment first and then run django serve. + +Functions, like in any other languages, can take parameters and returns a result. So I can use this ability to do a liitle more complex work: + +```bash +function ba { hgba | grep "$1" } +# hgba is an alias for hg branches +``` + +I can just type `ba release` then get current release branch info. + +----- + +Append: + +I made some updates to the `ba` function and make it auto copying the branch result to my clipboard: + +```bash + +function ba { var="$(hgba | grep $1)" && echo $var | awk -F ':' END{print} | awk -F ':' '{print $NF}' | tr -d '\n' | pbcopy && echo $var } +``` + + + +#### awk + +`awk` is a command I just know recently. I need to process a bunch of logs and analyze them. What I used to do is download the logs, grep things I want into a txt file and then process the txt file with python. + + diff --git a/source/_posts/2019-11-14-AWS-KMS.md b/source/_posts/2019-11-14-AWS-KMS.md new file mode 100644 index 0000000..73a8723 --- /dev/null +++ b/source/_posts/2019-11-14-AWS-KMS.md @@ -0,0 +1,14 @@ +--- +title: AWS KMS +date: 2019-11-14 15:19:05 +tags: +--- + +We used to keep private credentials on production servers without any protection or encryption. Well, luckily we don't have any leak but this practice is not recommended for both security and easy of use reasons. + +Since AWS finally provides [KMS(Key Management Service)][1] in our local region, we try to encrypt every private credentials by KMS and store them on S3. + +*TBD* + + +[1]: https://www.amazonaws.cn/kms/ \ No newline at end of file diff --git a/source/_posts/2020-03-17-leetcode-121.md b/source/_posts/2020-03-17-leetcode-121.md new file mode 100644 index 0000000..8afe2a0 --- /dev/null +++ b/source/_posts/2020-03-17-leetcode-121.md @@ -0,0 +1,59 @@ +--- +title: leetcode-121 +date: 2020-03-17 18:06:45 +tags: +categories: leetcode +--- + +### 121. 买卖股票的最佳时机 + +[题目](https://leetcode-cn.com/problems/best-time-to-buy-and-sell-stock/) + + + +原始答案: + +```python +class Solution: + def maxProfit(self, prices) -> int: + profit = 0 + if not prices: + return profit + min_buyin = prices[0] + max_sellout = prices[0] + l = len(prices) + i = 0 + for buyin in prices: + if i == l: + return profit + if min_buyin <= buyin: + max_sellout = max(prices[i:]) + p = max_sellout - min_buyin + if p > profit: + profit = p + if buyin < min_buyin: + min_buyin = buyin + i += 1 + return profit +#1880 ms 14.4 MB +``` + +主要思路是找到波谷,如果当前价格比前一天要低,则还是在去往波谷的路上;当价格比前一天高或相同时,则到达了一个波谷,计算波谷和之后的波峰的差,就是这一段的利润。将从头至尾过一次,就能找到所有波谷和其后波峰的差,返回最大的即可。但是这个明显地在重复max,时间复杂度是O(n^2),看起来就很傻逼。 + +仔细想想,其实并不需要直接找出波谷后的波峰,只要在for loop时保持波谷为最低的那个,就能算出每一个后续与波谷的差,找最大差即可。改了下代码变成这样 + +```python +class Solution: + def maxProfit(self, prices) -> int: + profit = 0 + if not prices: + return profit + min_buyin = prices[0] + for i in range(1, len(prices)): + min_buyin = min(min_buyin, prices[i-1]) + profit = max(prices[i] - min_buyin, profit) + return profit + #44 ms 14.4 MB +``` + + diff --git a/source/_posts/2020-03-18-leetcode-206.md b/source/_posts/2020-03-18-leetcode-206.md new file mode 100644 index 0000000..c88df6b --- /dev/null +++ b/source/_posts/2020-03-18-leetcode-206.md @@ -0,0 +1,88 @@ +--- +title: leetcode-206 +date: 2020-03-18 23:33:03 +tags: +categories: leetcode +--- + +### 206. 反转链表 + +[题目](https://leetcode-cn.com/problems/reverse-linked-list/) + + + +最简单的思路是遍历链表一个列表去做存储,通过倒序读取列表的同时改写链表。 + +```python +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + +class Solution: + def reverseList(self, head): + if not head or not head.next: + return head + nl = [] + while head.next: + nl.append(head) + head = head.next + nl.append(head) + l = len(nl) + for x in range(l): + if x == 0: + nl[x].next = None + continue + nl[x].next = nl[x-1] + if x == (l - 1): + return nl[x] +``` + +仔细想想自己又傻逼了,何必要遍历两次呢,在第一遍遍历的同时就能操作了: + +```python +class Solution: + def reverseList(self, head): + if not head or not head.next: + return head + prev_node = None + next_node = head.next + while head: + next_node = head.next + head.next = prev_node + prev_node = head + head = next_node + return prev_node +``` + +然后是递归的做法,主要思路是一直进到最深一层--也就是链表的最后一个--的时候开始返回,同时修改那一层的两个 node。一开始踩了一个坑是返回了每一个node,结果最后回到第一层的时候得到的是链表的末端,其实只需要修改链表,并不需要返回 node,所以一开始到达链表末端的时候直接返回那一个node就可以了。 + +```python +class Solution: + def reverseList(self, head): + if not head: + return head + if head.next: + ss = Solution() + last = ss.reverseList(head.next) + head.next.next = head + head.next = None + return last + return head +``` + +一开始是用list来打草稿,不过想明白递归之后就大同小异了: + +```python +def a(l:list)->list: + k=[l[0]] + + if l[1:]: + b=a(l[1:]) + b.extend(k) + else: + return [l[0]] + return b +``` + + diff --git a/source/_posts/2020-03-23-leetcode-169.md b/source/_posts/2020-03-23-leetcode-169.md new file mode 100644 index 0000000..0ced4b2 --- /dev/null +++ b/source/_posts/2020-03-23-leetcode-169.md @@ -0,0 +1,62 @@ +--- +title: leetcode-169 +date: 2020-03-23 23:12:57 +tags: +categories: leetcode +--- + + +### 169. 多数元素 + +[题目](https://leetcode-cn.com/problems/majority-element/) + + + + + + + +一开始的思路是遍历一遍整个列表,用一个字典去记录每个元素出现的次数,当次数大于 $\cfrac{n}{2}$ 时就可以得出结果。 + +```python +class Solution: + def majorityElement(self, nums) -> int: + d = {} + l = len(nums) + for n in nums: + if not n in d: + d[n] = 0 + d[n] = d[n] + 1 + if d[n] > l/2: + return n +# 64 ms 15.1 MB +``` + +Python 也有专门计数的库,写起来更简单一点: + +```python +class Solution: + def majorityElement(self, nums): + counts = collections.Counter(nums) + return max(counts.keys(), key=counts.get) +# 44 ms 15.1 MB +``` + +由于要找的数出现次数大于 $\cfrac{n}{2}$,脑子里掠过一下[蒙特卡罗算法](https://zh.wikipedia.org/wiki/%E8%92%99%E5%9C%B0%E5%8D%A1%E7%BE%85%E6%96%B9%E6%B3%95),后来在官方解答中也看到类似的思路了: + +```python +class Solution: + def majorityElement(self, nums): + majority_count = len(nums)//2 + while True: + candidate = random.choice(nums) + if sum(1 for elem in nums if elem == candidate) > majority_count: + return candidate + +#作者:LeetCode-Solution +#链接:https://leetcode-cn.com/problems/majority-element/solution/duo-shu-yuan-su-by-leetcode-solution/ +#来源:力扣(LeetCode) +#著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 +``` + + diff --git a/source/_posts/2020-03-23-leetcode-225.md b/source/_posts/2020-03-23-leetcode-225.md new file mode 100644 index 0000000..2784356 --- /dev/null +++ b/source/_posts/2020-03-23-leetcode-225.md @@ -0,0 +1,69 @@ +--- +title: leetcode-225 +date: 2020-03-23 23:35:05 +tags: +categories: leetcode +--- + +### 225. 用队列实现栈 + +[题目](https://leetcode-cn.com/problems/implement-stack-using-queues/) + + + + + + + +注意栈是 FILO(First In Last Out),Python 的 list 是 FIFO(First In First Out)。 + +```python +class MyStack: + + def __init__(self): + """ + Initialize your data structure here. + """ + self.data = [] + + + def push(self, x: int) -> None: + """ + Push element x onto stack. + """ + self.data.append(x) + return + + + def pop(self) -> int: + """ + Removes the element on top of the stack and returns that element. + """ + return self.data.pop(-1) + + + def top(self) -> int: + """ + Get the top element. + """ + return self.data[-1] + + + def empty(self) -> bool: + """ + Returns whether the stack is empty. + """ + return not bool(self.data) + + + +# Your MyStack object will be instantiated and called as such: +# obj = MyStack() +# obj.push(x) +# param_2 = obj.pop() +# param_3 = obj.top() +# param_4 = obj.empty() + +#24 ms 13.5 MB +``` + diff --git a/source/_posts/2020-03-25-leetcode-409.md b/source/_posts/2020-03-25-leetcode-409.md new file mode 100644 index 0000000..51cf8ea --- /dev/null +++ b/source/_posts/2020-03-25-leetcode-409.md @@ -0,0 +1,49 @@ +--- +title: leetcode-409 +date: 2020-03-25 21:55:38 +tags: +categories: leetcode +--- + +### 409. 最长回文串 + +[题目](https://leetcode-cn.com/problems/longest-palindrome/) + + + + + + + + + +一开始理解错题目了,以为是寻找字符串中的最长回文串,结果是构造。但是原理基本一样,由于回文中心对称,所以是由多个偶数个相同字母和至多一个奇数个相同字母组成。 + +这样只要数给出的字符串中有几个偶数个相同字母和几个奇数个相同字母就可以了。奇数个相同字母可以减少一个当偶数个用,最后再加回去一个。 + + + +```python +class Solution: + def longestPalindrome(self, s: str) -> int: + d = {} + for l in s: + if not l in d: + d[l] = 0 + d[l] += 1 + + i = 0 + odd = False + for k, v in d.items(): + if v % 2: + i += (v-1) + odd = True + else: + i += v + if odd: + i += 1 + return i + +#40 ms 13.6 MB +``` + diff --git a/source/_posts/2020-03-25-leetcode-543.md b/source/_posts/2020-03-25-leetcode-543.md new file mode 100644 index 0000000..bec6212 --- /dev/null +++ b/source/_posts/2020-03-25-leetcode-543.md @@ -0,0 +1,112 @@ +--- +title: leetcode-543 +date: 2020-03-25 19:13:52 +tags: +categories: leetcode +--- + +### 543. 二叉树的直径 + + +[题目](https://leetcode-cn.com/problems/diameter-of-binary-tree/) + + + + + + +这题做出来了但是没有通过运行时间的测试,主要还是没想明白二叉树的直径到底是什么东西,用了个蠢办法。 + +```python +# Definition for a binary tree node. +class TreeNode: + def __init__(self, x): + self.val = x + self.left = None + self.right = None + +class Solution: + def diameterOfBinaryTree(self, root: TreeNode) -> int: + if not root: + return 0 + last_node = -1 + routes = [] + start = root + node_stack = [root] + while (start.left or start.right or node_stack): + if start != node_stack[-1]: + node_stack.append(start) + + if last_node == start.right: + node_stack = node_stack[:-1] + if not node_stack: + break + last_node = start + start = node_stack[-1] + continue + + if start.left and last_node != start.left: + start = start.left + last_node = start + continue + + if start.right: + start = start.right + last_node = start + continue + + routes.append(node_stack) + node_stack = node_stack[:-1] + if not node_stack: + break + last_node = start + start = node_stack[-1] + + max_l = 0 + for route in routes: + for route_ in routes: + intersection = 0 + if route != route_: + intersection = len(set(route).intersection(set(route_))) + if intersection: + intersection -= 1 + max_l = max(max_l, len(set(route)| set(route_)) - intersection) + return max_l - 1 +``` + + + +L43 之前做的是以深度优先的方式遍历一遍树,得出每个点的路径。后面的是将所有路径组合在一起得出任意两个点间的路径,算出最大长度。 + + + +其实以某个点为根节点的树的直径,就是某个节点的**左子树的深度和右子树的深度的和**,用递归来处理这个会比较容易理解 + + + +```python +class Solution(object): + def diameterOfBinaryTree(self, root): + self.ans = 1 + def depth(node): + # 访问到空节点了,返回0 + if not node: return 0 + # 左儿子为根的子树的深度 + L = depth(node.left) + # 右儿子为根的子树的深度 + R = depth(node.right) + # 计算d_node即L+R+1 并更新ans + self.ans = max(self.ans, L+R+1) + # 返回该节点为根的子树的深度 + return max(L, R) + 1 + + depth(root) + return self.ans - 1 + +作者:LeetCode-Solution +链接:https://leetcode-cn.com/problems/diameter-of-binary-tree/solution/er-cha-shu-de-zhi-jing-by-leetcode-solution/ +来源:力扣(LeetCode) +著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 +``` + + diff --git a/source/_posts/2020-03-25-leetcode-836.md b/source/_posts/2020-03-25-leetcode-836.md new file mode 100644 index 0000000..77d82f8 --- /dev/null +++ b/source/_posts/2020-03-25-leetcode-836.md @@ -0,0 +1,33 @@ +--- +title: leetcode-836 +date: 2020-03-25 22:41:25 +tags: +categories: leetcode +--- + +### 836. 矩形重叠 + +[题目](https://leetcode-cn.com/problems/rectangle-overlap/) + + + + + + + +看两个矩形有没有重叠,就看两个矩形在坐标轴上的投影有没有重叠。 + + + +```python +class Solution: + def isRectangleOverlap(self, rec1, rec2) -> bool: + return ((min(rec1[2], rec2[2]) > max(rec1[0], rec2[0])) + and (min(rec1[3], rec2[3]) > max(rec1[1], rec2[1]))) + +s = Solution() +s.isRectangleOverlap(rec1 = [0,0,2,2], rec2 = [1,1,3,3]) + +#40 ms 13.7 MB +``` + diff --git a/source/_posts/2020-03-26-leetcode-876.md b/source/_posts/2020-03-26-leetcode-876.md new file mode 100644 index 0000000..0bb9a44 --- /dev/null +++ b/source/_posts/2020-03-26-leetcode-876.md @@ -0,0 +1,67 @@ +--- +title: leetcode-876 +date: 2020-03-26 21:18:41 +tags: +categories: leetcode +--- + +### 876. 链表的中间结点 + + + +[题目](https://leetcode-cn.com/problems/middle-of-the-linked-list/) + + + + + + + +思路是遍历一遍得到整个链表,讲每个 node 放进一个 list,就可以通过下标得到中间的。 + + + +```python +# Definition for singly-linked list. +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + +class Solution: + def middleNode(self, head: ListNode) -> ListNode: + l = [] + n = head + while n.next: + l.append(n) + n = n.next + l.append(n) + return l[len(l)//2] + + #44 ms 13.7 MB +``` + + + +看官方解答,还有一个骚操作,通过两个速度不一样的指针,一个一次走一步,一个两次走一步,快的走到底时,慢的就在中间了。 + + + +```python +class Solution: + def middleNode(self, head: ListNode) -> ListNode: + slow = fast = head + while fast and fast.next: + slow = slow.next + fast = fast.next.next + return slow + +作者:LeetCode-Solution +链接:https://leetcode-cn.com/problems/middle-of-the-linked-list/solution/lian-biao-de-zhong-jian-jie-dian-by-leetcode-solut/ +来源:力扣(LeetCode) +著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 +``` + + + + diff --git a/source/_posts/2020-03-29-leetcode-1013.md b/source/_posts/2020-03-29-leetcode-1013.md new file mode 100644 index 0000000..9634b17 --- /dev/null +++ b/source/_posts/2020-03-29-leetcode-1013.md @@ -0,0 +1,45 @@ +--- +title: leetcode-1013 +date: 2020-03-29 21:09:22 +tags: +categories: leetcode +--- + +### 1013. 将数组分成和相等的三个部分 + +[题目](https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/) + + + + + + + +因为是整数数组,如果能均分成三份,则数组和肯定是3的倍数。然后遍历数组逐端求和使得和为 sum(A)/3。 + + + +```python +class Solution: + def canThreePartsEqualSum(self, A) -> bool: + if not A: + return False + sa = sum(A) + if sa % 3: + return False + s = sa // 3 + s1 = 0 + s2 = 0 + + + for i in range(len(A)): + s1 += A[i] + if s1 == s and (i+1) < len(A): + for j in range(len(A[i+1:])): + s2 += A[i+1+j] + if s2 == s and j+1 < len(A[i+1:]) and sum(A[i+j+2:])== s: + return True + return False +#60 ms 18.7 MB +``` + diff --git a/source/_posts/2020-03-29-leetcode-914.md b/source/_posts/2020-03-29-leetcode-914.md new file mode 100644 index 0000000..16f2556 --- /dev/null +++ b/source/_posts/2020-03-29-leetcode-914.md @@ -0,0 +1,51 @@ +--- +title: leetcode-914 +date: 2020-03-29 22:41:09 +tags: +categories: leetcode +--- + +### 914. 卡牌分组 + +[题目](https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/) + + + + + + + +将大牌堆分成多个牌数量相等的小牌堆,就是求每张牌数量的公约数。先遍历一遍得到每张牌的数量,然后找出比2大的公约数即可。 + + + +```python +class Solution: + def hasGroupsSizeX(self, deck) -> bool: + dc = {} + max_d = 0 + for d in deck: + if d not in dc: + dc[d] = 0 + dc[d] += 1 + if max_d < d: + max_d = d + if max_d < dc[d]: + max_d = dc[d] + has_x = True + if max_d == 1: + max_d = 2 + + for i in range(2, max_d + 1): + has_x = True + for k,v in dc.items(): + if v % i: + has_x = False + break + if has_x and i >= 2: + return True + return False + +#56 ms 13.8 MB +``` + diff --git a/source/_posts/2020-03-30-leetcode-1071.md b/source/_posts/2020-03-30-leetcode-1071.md new file mode 100644 index 0000000..8a7c6ed --- /dev/null +++ b/source/_posts/2020-03-30-leetcode-1071.md @@ -0,0 +1,59 @@ +--- +title: leetcode-1071 +date: 2020-03-30 22:03:01 +tags: +categories: leetcode +--- + +### 1071. 字符串的最大公因子 + +[题目](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/) + + + + + + + +如果存在这样字符串,那它最大的长度就是这两个字符串长度的最大公约数。 + + + +```python +class Solution: + def gcdOfStrings(self, str1: str, str2: str) -> str: + if str1[0] != str2[0]: + return '' + + a = len(str1) + b = len(str2) + print(a, b) + if a < b: + str1, str2 = str2, str1 + a = len(str1) + b = len(str2) + + if not a%b: + for x in range(0, a//b): + if str1[x*b:(x+1)*b] != str2: + return '' + return str2 + else: + for x in range(b, 0, -1): + print(x) + if x==b or b%x or a%x: + continue + for y in range(0, b//x): + if str2[y*x:(y+1)*x] != str2[b-x:b]: + return '' + for y in range(0, a//x): + if str1[y*x:(y+1)*x] != str2[0:x]: + return '' + return str2[0:x] +# 44 ms 13.9 MB +``` + + + +官方解答中还给了一种巧妙的解法,如果 str1 + str2 == str2 + str1 的话,[可以证明](https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/solution/zi-fu-chuan-de-zui-da-gong-yin-zi-by-leetcode-solu/)必定存在这样一个字符串,其长度为两个字符串长度的最大公约数。 + diff --git a/source/_posts/2020-03-30-leetcode-999.md b/source/_posts/2020-03-30-leetcode-999.md new file mode 100644 index 0000000..57d9a73 --- /dev/null +++ b/source/_posts/2020-03-30-leetcode-999.md @@ -0,0 +1,71 @@ +--- +title: leetcode-999 +date: 2020-03-30 21:03:25 +tags: +categories: leetcode +--- + + +### 999. 可以被一步捕获的棋子数 + +[题目](https://leetcode-cn.com/problems/available-captures-for-rook/) + + + + + + + +遍历一遍找到车的坐标,然后按上下左右四个方向循环一下看碰到的第一个棋子是什么。 + + + +```python +class Solution: + def numRookCaptures(self, board) -> int: + i = j = 0 + for row in board: + if 'R' in row: + break + i += 1 + j = row.index('R') + count = 0 + # right + for x in range(j + 1, 8): + if row[x] == 'p': + count += 1 + break + if row[x] == 'B': + break + # left + for x in range(j, 0, -1): + if row[x] == 'p': + count += 1 + break + if row[x] == 'B': + break + # up + for x in range(i, 0, -1): + if board[x][j] == 'p': + count += 1 + break + if board[x][j] == 'B': + break + # down + for x in range(i+1, 8): + if board[x][j] == 'p': + count += 1 + break + if board[x][j] == 'B': + break + + return count + +#36 ms 13.6 MB + +``` + + + +问题不难,官方解答中给了一个方向数组的概念,上下左右是 (0, 1) (0, -1) (-1, 0) (1, 0),有点像向量的意思。走的路线等于方向数组乘以步数。 + diff --git a/source/_posts/2020-04-01-leetcode-1103.md b/source/_posts/2020-04-01-leetcode-1103.md new file mode 100644 index 0000000..a1bd225 --- /dev/null +++ b/source/_posts/2020-04-01-leetcode-1103.md @@ -0,0 +1,55 @@ +--- +title: leetcode-1103 +date: 2020-04-01 11:22:20 +tags: +categories: leetcode +mathjax: true +--- + +### 1103. 分糖果 II + +[题目](https://leetcode-cn.com/problems/distribute-candies-to-people/) + + + + + + + +小学奥数题。主要思路就是等差数列求和 $\cfrac{(首项 + 末项)×项数}{2}$ 。可以用公式把每一个位置获得的总糖果数表示出来。我的方法稍微蠢了点,算了每一轮的总糖果数,其实可以直接求总共发了多少次糖果,除以每轮的人数就可以得出发了多少轮。 + + + +```python +class Solution: + def distributeCandies(self, candies: int, num_people: int): + total = 0 + i = 0 + # import ipdb; ipdb.set_trace() + while total <= candies: + t = (num_people*i)*num_people + int((1+num_people)*num_people/2) + if total + t <= candies: + total += t + i += 1 + else: + break + remaining = candies - total + print(total, remaining, i) + l = [] + for n in range(1, num_people+1): + if not total: + current_candy = n + else: + current_candy = n+i*num_people + + n_count = int((0+(i-1))*(i)/2) + print(current_candy, n_count) + if remaining >= current_candy: + l.append(n_count*num_people + n*i + current_candy) + remaining -= current_candy + else: + l.append(n_count*num_people + n*i + remaining) + remaining = 0 + return l +# 28 ms 13.7 MB, +``` diff --git a/source/_posts/2020-04-01-leetcode-1160.md b/source/_posts/2020-04-01-leetcode-1160.md new file mode 100644 index 0000000..fae8842 --- /dev/null +++ b/source/_posts/2020-04-01-leetcode-1160.md @@ -0,0 +1,38 @@ +--- +title: leetcode-1160 +date: 2020-04-01 00:18:48 +tags: +categories: leetcode +--- + + +### 1160. 拼写单词 + +[题目](https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/) + + + + + + + +利用列表 remove 方法,检查 chars 中是否有足够的字母拼写 word + +```python +class Solution: + def countCharacters(self, words, chars: str) -> int: + + words_ = '' + for w in words: + lchars = list(chars) + try: + for l in w: + lchars.remove(l) + except: + continue + words_ += w + + return len(words_) +# 152 ms 14.1 MB +``` + diff --git a/source/_posts/2020-04-01-leetcode-compress-string-lcci.md b/source/_posts/2020-04-01-leetcode-compress-string-lcci.md new file mode 100644 index 0000000..3427631 --- /dev/null +++ b/source/_posts/2020-04-01-leetcode-compress-string-lcci.md @@ -0,0 +1,41 @@ +--- +title: leetcode-compress-string-lcci +date: 2020-04-01 15:51:22 +tags: +categories: leetcode +--- + +### 面试题 01.06. 字符串压缩 + +[题目](https://leetcode-cn.com/problems/compress-string-lcci/) + + + + + +遍历一遍字符串,遇到跟上一个字符不同的字符时记录上一个字符的重复长度。 + + + +```python +class Solution: + def compressString(self, S: str) -> str: + if not S: + return S + c = '' + prev = S[0] + p_len = 1 + for w in S[1:]: + if w != prev: + c += '%s%s' % (prev, p_len) + prev = w + p_len = 1 + else: + p_len += 1 + c += '%s%s' % (prev, p_len) + if len(S) > len(c): + return c + return S +# 52 ms 13.8 MB +``` + diff --git a/source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md b/source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md new file mode 100644 index 0000000..0223380 --- /dev/null +++ b/source/_posts/2020-04-09-leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof.md @@ -0,0 +1,42 @@ +--- +title: leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof +date: 2020-04-09 22:14:56 +tags: +categories: leetcode +mathjax: true +--- + +### 面试题57 - II. 和为s的连续正数序列 + +[题目](https://leetcode-cn.com/problems/he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/) + + + + + + + +又是小学奥数。由等差数列求和公式$\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\sqrt{2×target} + 1$。 + +由小到大遍历 $n$,可以求得首项。 + +```python +import math +class Solution: + def findContinuousSequence(self, target: int): + n = int(math.sqrt(2 * target) + 1) + if n < 2: + return [] + sum_list = [] + a = 0 + for i in range(2, n+1): + a = ((2 * target) / i + 1 - i) / 2 + if a and not a % 1: + a = int(a) + s_ = [] + for j in range(0, i): + s_.append(a + j) + sum_list.append(s_) + return sorted(sum_list) + # 60 ms 13.7 MB +``` diff --git a/source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md b/source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md new file mode 100644 index 0000000..55a0fcb --- /dev/null +++ b/source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md @@ -0,0 +1,47 @@ +--- +title: leetcode-the-masseuse-lcci +date: 2020-04-09 00:35:26 +tags: +categories: leetcode +mathjax: true +--- + +### 面试题 17.16. 按摩师 + +[题目](https://leetcode-cn.com/problems/the-masseuse-lcci/) + + + + + + + +一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 $i$ 时刻,$dp[i][0]$ 为当前预约不接的情况下最长预约时间,$dp[i][1]$ 则为接受当前预约的最长预约时间。 + + + +那很显然,由于不能接受相邻两个预约,$dp[i][1] = dp[i-1][0] + nums_i$ + +不接受当前预约的话,上一个预约接不接受都可以,$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$ + +最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$ + + + +```python +class Solution: + def massage(self, nums) -> int: + if not nums: + return 0 + n = len(nums) + not_choose = 0 + choose = 0 + for n in nums: + not_choose, choose = max(not_choose, choose), not_choose+n + return max(not_choose, choose) + # 52 ms 13.6 MB +``` + + + +这种问题原来有个名字叫[动态规划](https://zh.wikipedia.org/wiki/动态规划),上面推导的方程叫[状态转移方程](https://baike.baidu.com/item/状态转移方程),可以找找资料来看一下。 diff --git a/source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md b/source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md new file mode 100644 index 0000000..680eb9c --- /dev/null +++ b/source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md @@ -0,0 +1,115 @@ +--- +title: leetcode-add-two-numbers-ii +date: 2020-04-14 23:22:39 +tags: +categories: leetcode +--- + +### 445. 两数相加 II + +[题目](https://leetcode-cn.com/problems/add-two-numbers-ii/) + + + + + + + +看到顺序的链表就想到用倒序链表的方法做,折腾了半天 + + + +```python +class ListNode: + def __init__(self, x): + self.val = x + self.next = None + +class Solution: + def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: + def _reverse(l): + if l.next: + last = _reverse(l.next) + l.next.next = l + l.next = None + return last + return l + + l1e = _reverse(l1) + l2e = _reverse(l2) + new_l = ListNode(0) + head = new_l + c = 0 + import ipdb; ipdb.set_trace() + while l1e and l2e: + new_val = l1e.val + l2e.val + if c==1: + new_val += 1 + c = 0 + if new_val >= 10: + new_val -= 10 + c = 1 + + new_l.val = new_val + next_n = None + if l1e.next and l2e.next or c: + next_n = ListNode(c) + new_l.next = next_n + new_l = next_n + l1e = l1e.next + l2e = l2e.next + if l2e: + l1e = l2e + if not l1e and c: + l1e = ListNode(0) + while l1e: + new_l.val = l1e.val + new_l.val += c + c = 0 + if new_l.val >= 10: + c = 1 + new_l.val -= 10 + l1e = l1e.next + if l1e: + new_l.next = ListNode(0) + new_l = new_l.next + else: + new_l.next = ListNode(1) + + return _reverse(head) + + # 84 ms 13.9 MB +``` + +最后面各种进位的处理应该还可以更清晰优雅一些,但是懒得搞了,感觉很蠢。翻了答案看到了小 tips,需要倒序处理的情况可以用栈。 + +```python +class Solution: + def addTwoNumbers(self, l1: ListNode, l2: ListNode) -> ListNode: + s1, s2 = [], [] + while l1: + s1.append(l1.val) + l1 = l1.next + while l2: + s2.append(l2.val) + l2 = l2.next + ans = None + carry = 0 + while s1 or s2 or carry != 0: + a = 0 if not s1 else s1.pop() + b = 0 if not s2 else s2.pop() + cur = a + b + carry + carry = cur // 10 + cur %= 10 + curnode = ListNode(cur) + curnode.next = ans + ans = curnode + return ans + +作者:LeetCode-Solution +链接:https://leetcode-cn.com/problems/add-two-numbers-ii/solution/liang-shu-xiang-jia-ii-by-leetcode-solution/ +来源:力扣(LeetCode) +著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 +``` + +不过就执行效率来看差不多。 diff --git a/source/_posts/2020-04-14-leetcode-design-twitter.md b/source/_posts/2020-04-14-leetcode-design-twitter.md new file mode 100644 index 0000000..110aa46 --- /dev/null +++ b/source/_posts/2020-04-14-leetcode-design-twitter.md @@ -0,0 +1,83 @@ +--- +title: leetcode-design-twitter +date: 2020-04-14 16:11:41 +tags: +categories: leetcode +--- + +### 355. 设计推特 + +[题目](https://leetcode-cn.com/problems/design-twitter/) + + + + + +做出来倒是很简单,由于没有并发和特别的条件,测试数据量也不大。一开始搞错了,以为传入的 `twitterId` 就是自增的 id,结果其实是每条推的内容,所以增加了一个计数器去标记 id。 + +主要的考点应该是 `多路归并` 这个东西。我用的是排序,在数据量大的时候应该会有些问题。 + + + +```python +class Twitter: + + def __init__(self): + """ + Initialize your data structure here. + """ + self.tweets = {} + self.followers = {} + self._tid = 0 + + + def postTweet(self, userId: int, tweetId: int) -> None: + """ + Compose a new tweet. + """ + if not self.tweets.get(userId): + self.tweets[userId] = [] + self.tweets[userId].append((self._tid, tweetId)) + self._tid += 1 + + + def getNewsFeed(self, userId: int) : + """ + Retrieve the 10 most recent tweet ids in the user's news feed. Each item in the news feed must be posted by users who the user followed or by the user herself. Tweets must be ordered from most recent to least recent. + """ + foers = self.followers.get(userId, set()) + foers = foers.union((userId,)) + tweets = [] + for fo in foers: + tweets.extend(self.tweets.get(fo, [])[-10:]) + return [tw[1] for tw in sorted(tweets, reverse=True)[:10]] + + + def follow(self, followerId: int, followeeId: int) -> None: + """ + Follower follows a followee. If the operation is invalid, it should be a no-op. + """ + if not self.followers.get(followerId): + self.followers[followerId] = set() + self.followers[followerId].add(followeeId) + + + def unfollow(self, followerId: int, followeeId: int) -> None: + """ + Follower unfollows a followee. If the operation is invalid, it should be a no-op. + """ + if not self.followers.get(followerId): + self.followers[followerId] = set() + if followeeId in self.followers[followerId]: + self.followers[followerId].remove(followeeId) + +#100 ms 19.2 MB + +# Your Twitter object will be instantiated and called as such: +# obj = Twitter() +# obj.postTweet(userId,tweetId) +# param_2 = obj.getNewsFeed(userId) +# obj.follow(followerId,followeeId) +# obj.unfollow(followerId,followeeId) +``` + diff --git a/source/_posts/2020-04-16-leetcode-01-matrix.md b/source/_posts/2020-04-16-leetcode-01-matrix.md new file mode 100644 index 0000000..dca4cdb --- /dev/null +++ b/source/_posts/2020-04-16-leetcode-01-matrix.md @@ -0,0 +1,47 @@ +--- +title: leetcode-01-matrix +date: 2020-04-16 12:26:34 +tags: +categories: leetcode +--- + +### 542. 01 矩阵 + +[题目](https://leetcode-cn.com/problems/01-matrix/) + + + + + + + +想了两种思路 + +1. 0 位置的上下左右是 1, 上下左右中有跟 1 相邻的就是 2,以此类推,从 0 的坐标开始往上下左右四个方向扩散。如果我们把同意个距离的看作是一层,可以用一个队列依次存放每一层的坐标,直至每个坐标都被计算过。 + + ```python + class Solution: + def updateMatrix(self, matrix: List[List[int]]) -> List[List[int]]: + m, n = len(matrix), len(matrix[0]) + dist = [[0] * n for _ in range(m)] + zeroes_pos = [(i, j) for i in range(m) for j in range(n) if matrix[i][j] == 0] + # 将所有的 0 添加进初始队列中 + q = collections.deque(zeroes_pos) + seen = set(zeroes_pos) + + # 广度优先搜索 + while q: + i, j = q.popleft() + for ni, nj in [(i - 1, j), (i + 1, j), (i, j - 1), (i, j + 1)]: + if 0 <= ni < m and 0 <= nj < n and (ni, nj) not in seen: + dist[ni][nj] = dist[i][j] + 1 + q.append((ni, nj)) + seen.add((ni, nj)) + + return dist + ``` + + + +2. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。 + diff --git a/source/_posts/2020-04-16-leetcode-merge-intervals.md b/source/_posts/2020-04-16-leetcode-merge-intervals.md new file mode 100644 index 0000000..aaf5cad --- /dev/null +++ b/source/_posts/2020-04-16-leetcode-merge-intervals.md @@ -0,0 +1,50 @@ +--- +title: leetcode-merge-intervals +date: 2020-04-16 19:22:26 +tags: +categories: leetcode +--- + + +### 56. 合并区间 + + + +[题目](https://leetcode-cn.com/problems/merge-intervals/) + + + + + + + +首先将区间按起点由小到大排序,这样相邻的两个就能通过终点判断是否重合。 + + + +```python +class Solution: + def merge(self, intervals): + if not intervals: + return [] + intervals.sort() + merged = [] + l = len(intervals) + m = intervals[0] + for x in range(l-1): + j = intervals[x+1] + if m[1] >= j[0]: + if m[1] <= j[1]: + m = [m[0], j[1]] + else: + continue + else: + merged.append(m) + m = j + if m: + merged.append(m) + return merged +``` + + + diff --git a/source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md b/source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md new file mode 100644 index 0000000..c0c95a2 --- /dev/null +++ b/source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md @@ -0,0 +1,55 @@ +--- +title: leetcode-string-to-integer-atoi +date: 2020-04-16 19:50:10 +tags: +categories: leetcode +--- + +### 8. 字符串转换整数 (atoi) + +[题目](https://leetcode-cn.com/problems/string-to-integer-atoi/) + + + + + + + +没什么好说的,注意各种情况,识别到数字之后就一直要是数字。 + + + +```python +class Solution: + def myAtoi(self, str: str) -> int: + p = '' + str = str.lstrip() + n = '' + min_int = -2**31 + max_int = 2**31-1 + isnumeric = False + for x in str: + if not isnumeric and x == '-': + p = '-' + isnumeric = True + continue + if not isnumeric and x == '+': + isnumeric = True + continue + if x.isnumeric(): + n += x + isnumeric = True + else: + break + if not n: + return 0 + if int(n) > max_int: + if p: + return min_int + else: + return max_int + p += n + return int(p) +# 32 ms 13.6 MB +``` + diff --git a/source/_posts/2020-04-21-leetcode-number-of-islands.md b/source/_posts/2020-04-21-leetcode-number-of-islands.md new file mode 100644 index 0000000..36fdd8a --- /dev/null +++ b/source/_posts/2020-04-21-leetcode-number-of-islands.md @@ -0,0 +1,49 @@ +--- +title: leetcode-number-of-islands +date: 2020-04-21 12:55:17 +tags: +categories: leetcode +--- + +### 200. 岛屿数量 + + + +[题目](https://leetcode-cn.com/problems/number-of-islands/) + + + + + + + +这种矩阵题现在第一反应就是用[广度优先搜索][0]做,类似之前算和0之间的距离那题。遍历矩阵,遇到 1 就将 1 改成 0,然后广度优先搜索找出 1 相邻的所有 1,这就是一个岛屿,以此类推。 + + + +```python +import collections +class Solution: + def numIslands(self, grid) -> int: + rows = len(grid) + if not rows: + return 0 + cols = len(grid[0]) + islands = 0 + for r in range(rows): + for l in range(cols): + if grid[r][l] == '1': + islands += 1 + grid[r][l] = '0' + neighbors = collections.deque([(r, l)]) + while neighbors: + x, y = neighbors.popleft() + for x_, y_ in [[x-1, y], [x+1, y], [x, y-1], [x, y+1]]: + if 0<=x_ + app\ + static\ + templates\ + __init__.py + views.py + tmp\ + run.py +``` + +Then start to write the template (file `app/templates/index.html`): + +``` html + + + + {{ title }} - microblog + + + +

Hello, {{ user.nickname }}!

+ + + +``` + +Now let's write the view function that uses this template (file `app/views.py`): + +``` python +from flask import render_template +from app import app + +@app.route('/') +@app.route('/index') +def index(): + user = {'nickname': 'ching'} # fake user + return render_template('index.html', + title='Home', + user=user) +``` + +`render_template` function is what we import from Flask framework to render the template. It uses [Jinja2](http://jinja.pocoo.org/) templating engine. + diff --git a/source/_posts/Flask-Day-2.md b/source/_posts/Flask-Day-2.md new file mode 100644 index 0000000..5edbbda --- /dev/null +++ b/source/_posts/Flask-Day-2.md @@ -0,0 +1,80 @@ +--- +title: Flask Day 2 +date: 2016-02-16 22:45:06 +--- + +To handle web forms we use [Flask-WTF ](http://packages.python.org/Flask-WTF). So we need to write a config file (file `config.py`): + +``` python +WTF_CSRF_ENABLED = True +SECRET_KEY = 'you-will-never-guess' +``` + +And then you need to use this config (file `app/__init__.py`): + +``` python +from flask import Flask + +app = Flask(__name__) +app.config.from_object('config') + +from app import views +``` + +Let's build a simple form (file `app/forms.app`): + +``` python +from flask.ext.wtf import Form +from wtforms import StringField, BooleanField +from wtforms.validators import DataRequired + +class LoginForm(Form): + openid = StringField('openid', validators=[DataRequired()]) + remember_me = BooleanField('remember_me', default=False) +``` + +The `DataRequired()` is a validator that checks the field is empty or not. + +After that, we need a HTML page to show the form (file `app/templates/login.html`): + +``` html + +{% extends "base.html" %} + +{% block content %} +

Sign In

+
+ {{ form.hidden_tag() }} +

+ Please enter your OpenID:
+ {{ form.openid(size=80) }}
+

+

{{ form.remember_me }} Remember Me

+

+
+{% endblock %} +``` + + + +The final step is to code a view function that renders the template and receiving data from form (file `app/views.py`): + +``` python +from flask import render_template, flash, redirect +from app import app +from .forms import LoginForm + +# index view function suppressed for brevity + +app.route('/login', methods=['GET', 'POST']) +def login(): + form = LoginForm() + if form.validate_on_submit(): + flash('Login requested for OpenID="%s", remember_me=%s' % + (form.openid.data, str(form.remember_me.data))) + return redirect('/index') + return render_template('login.html', + title='Sign In', + form=form) +``` + diff --git a/source/_posts/Postgresql Partitioning.md b/source/_posts/Postgresql Partitioning.md new file mode 100644 index 0000000..28b9cf3 --- /dev/null +++ b/source/_posts/Postgresql Partitioning.md @@ -0,0 +1,42 @@ +--- +title: Postgresql Partitioning +date: 2019-03-12 00:08:48 +tags: +--- + +`Partitioning` refers to splitting what is logically one large table inot smaller physical pieces. + +Currently, PostgreSQL supports partitioning via table [inheritance](https://www.postgresql.org/docs/9.6/ddl-inherit.html). Each partition must be created as a child table of a single parent table. **The parent table itself is normally empty**; It exists just to represent the entire data set. + +There are two forms of partitioning can be implemented in PostgreSQL: + +* Range Partitioning + + ​ The table is partitioning into "range" defined by a key column or a set of columns, with no overlap between the ranges of values assigned to different partitions. eg. partition by date ranges or by identifiers. + +* List Partitioning + + ​ The table is partitioned by explicitly listing which key values appear in each partition. + +### Implementing Partitioning + +1. Create the "master" / "parent" table, from which all the partitions will inherit. + + ​ This table will not contain any data. Do not define any check on this table, unless you intend them to be applied equally to all partitions. There is no point in defining any indexes or unique constraints on it either. + +2. Create "child" tables that each inherit form the master table. Normally, these tables will not add any columns to the set inherited from the master. + +3. Add table constraints to the partition tables to define the allowed key values in each partitions. + + ​ Ensure that the constraints guarantee that there is no overlap between the key values premitted in different partitions. And there is no difference in syntax between range and list partitioning. + +4. Create indexes on column(s) for each partitions. + +5. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition. + +6. Ensure hte [constraint_exclusion](https://www.postgresql.org/docs/9.6/runtime-config-query.html#GUC-CONSTRAINT-EXCLUSION) configuration parameter is not disabled in `postgresql.conf`. If it is, queries will not be optimized as desired. + +### Trigger + +As we are creating new table and hopping data insered to right partition, a trigger function and a trigger are needed. + diff --git a/source/_posts/TastyPie-Note-1.md b/source/_posts/TastyPie-Note-1.md new file mode 100644 index 0000000..afe04f2 --- /dev/null +++ b/source/_posts/TastyPie-Note-1.md @@ -0,0 +1,44 @@ +--- +title: TastyPie Note 1 +date: 2016-05-10 17:00:00 +--- + +### Flow Through The Request/Response Cycle + +Tastypie can be thought of as a set of class-based view that provide the API functionality. All routing/middleware/response-handling aspectss are the same as a typical Django app. Where the differs is in the view itself. + +Walking through what a GET request to a list endpoint looks like: + +- The `Resource.urls` are checked by Django's url resolvers. + +- On a match for the list view, `Resource.wrap_view('dispatch_list')` is called. `wrap_view` provides basic error handling & allows for returning serilized errors. + +- Because dispatch_list was passed to `wrap_view`, `Resource.dispatch_list` is called next. This is a thin wrapper around `Resource.dispatch`. + +- `dispatch` does a bunch of havy lifting. It ensures: + + - the requested HTTP method is in `allowed_methos` (`method_check`). + - the class has a method that can handle the request(`get_list`) + - the user is authenticated(`is_authenticated`) + - the user has no exceeded their throttle(`throttle_check`). + + At this point, `dispatch` actually calls the requested method (`get_list`). + +- `get_list` does the actual work of API. It does: + + - A fetch of the available objects via `Resource.obj_get_list`. In the case of `ModelResource`, this builds the ORM filters to apply (`ModelResource.build_filters`). It then gets the `QuerySet` via `ModelResource.get_object_list` (which performs `Resource.authorized_read_list` to possibly limit the set the user can work with) and applies the built filters to it. + - It then sorts the objects based on user input (`ModelResource.apply_sorting`). + - Then it paginates the results using the supplied `Paginator` & pulls out the data to be serialized. + - The objects in the page have `full_dehydrate` applied to each of them, causing Tastypie to traslate the raw object data into the fields the endpoint supports. + - Finally, it calls `Resource.create_response`. + +- `create_response` is a shortcut method that: + + - Determines the desired response format (`Resource.determine_format`). + - Serializes the data given to it in the proper format. + - Returns a Django `HttpResponse` (200 OK) with the serialized data. + +- We bubble back up the call stack to `dispatch`. The last thing `dispatch` does is potentially store that a request occured for future throttling (`Resource.log_throttled_access`) then either returns the `HttpResponse` or wraps whatever data came back in a response (so Django doesn't freak out). + + + diff --git a/source/_posts/Tastypie.md b/source/_posts/Tastypie.md new file mode 100644 index 0000000..1df0f9b --- /dev/null +++ b/source/_posts/Tastypie.md @@ -0,0 +1,38 @@ +--- +title: Tastypie +date: 2016-05-04 12:02:00 +--- + +#### Resources in Tastypie + +Resources are the heart of Tastypie. By defining a resource we can actually convert a model into an API stream. The data is automatically converted into API response. + + + +Understanding the process of creating a resource. + +1. Import ModelResource from Tastypie. +2. Import models from services app +3. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource. + +Add API URL in the urls.py of app. + + + +#### Dehydrating the JSON data + +![flow](https://impythonist.files.wordpress.com/2016/04/tastypie_ill.png?w=800) + + + +Dehydration in Tastypie means making alterations before sending data to the client. Suppose we need to send capitalized product names instead of small letters. Now we see two kinds of dehydrate methods. + +##### Dehydrate_field method + +This `dehydrate_field` is uesd to modify field on the response JSON. + +##### Dehydrate method + +Dehydrate method is useful for aadding additional fields to bundle (response data). + +Similarly using `hydrate` method we can alter the bundle data which is generated from request at the time of PUT or POST methods. \ No newline at end of file diff --git a/source/_posts/first-post.md b/source/_posts/first-post.md new file mode 100644 index 0000000..01aa9d0 --- /dev/null +++ b/source/_posts/first-post.md @@ -0,0 +1,9 @@ +--- +title: First Post +date: 2016-02-12 18:00:00 +--- + +This is the very first post I wrote, + +with [Typora](https://www.typora.io/) & [Hexo](https://hexo.io/). + diff --git a/themes/apollo b/themes/apollo new file mode 160000 index 0000000..d09de66 --- /dev/null +++ b/themes/apollo @@ -0,0 +1 @@ +Subproject commit d09de66c52d7e3eccbc909f86e96919c54ce78ff diff --git a/themes/cactus b/themes/cactus new file mode 160000 index 0000000..e893629 --- /dev/null +++ b/themes/cactus @@ -0,0 +1 @@ +Subproject commit e8936294b7d09234ecb61bbdcd337b59e67fd3f0 diff --git a/themes/landscape/.npmignore b/themes/landscape/.npmignore new file mode 100644 index 0000000..6e3a08a --- /dev/null +++ b/themes/landscape/.npmignore @@ -0,0 +1,3 @@ +.DS_Store +node_modules +tmp \ No newline at end of file diff --git a/themes/landscape/Gruntfile.js b/themes/landscape/Gruntfile.js new file mode 100644 index 0000000..59fd5df --- /dev/null +++ b/themes/landscape/Gruntfile.js @@ -0,0 +1,46 @@ +module.exports = function(grunt){ + grunt.initConfig({ + gitclone: { + fontawesome: { + options: { + repository: 'https://github.com/FortAwesome/Font-Awesome.git', + directory: 'tmp/fontawesome' + }, + }, + fancybox: { + options: { + repository: 'https://github.com/fancyapps/fancyBox.git', + directory: 'tmp/fancybox' + } + } + }, + copy: { + fontawesome: { + expand: true, + cwd: 'tmp/fontawesome/fonts/', + src: ['**'], + dest: 'source/css/fonts/' + }, + fancybox: { + expand: true, + cwd: 'tmp/fancybox/source/', + src: ['**'], + dest: 'source/fancybox/' + } + }, + _clean: { + tmp: ['tmp'], + fontawesome: ['source/css/fonts'], + fancybox: ['source/fancybox'] + } + }); + + require('load-grunt-tasks')(grunt); + + grunt.renameTask('clean', '_clean'); + + grunt.registerTask('fontawesome', ['gitclone:fontawesome', 'copy:fontawesome', '_clean:tmp']); + grunt.registerTask('fancybox', ['gitclone:fancybox', 'copy:fancybox', '_clean:tmp']); + grunt.registerTask('default', ['gitclone', 'copy', '_clean:tmp']); + grunt.registerTask('clean', ['_clean']); +}; \ No newline at end of file diff --git a/themes/landscape/LICENSE b/themes/landscape/LICENSE new file mode 100644 index 0000000..9ce4d32 --- /dev/null +++ b/themes/landscape/LICENSE @@ -0,0 +1,7 @@ +Copyright (c) 2013 Tommy Chen + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. \ No newline at end of file diff --git a/themes/landscape/README.md b/themes/landscape/README.md new file mode 100644 index 0000000..8295fbe --- /dev/null +++ b/themes/landscape/README.md @@ -0,0 +1,111 @@ +# Landscape + +A brand new default theme for [Hexo]. + +- [Preview](http://hexo.io/hexo-theme-landscape/) + +## Installation + +### Install + +``` bash +$ git clone https://github.com/hexojs/hexo-theme-landscape.git themes/landscape +``` + +**Landscape requires Hexo 2.4 and above.** + +### Enable + +Modify `theme` setting in `_config.yml` to `landscape`. + +### Update + +``` bash +cd themes/landscape +git pull +``` + +## Configuration + +``` yml +# Header +menu: + Home: / + Archives: /archives +rss: /atom.xml + +# Content +excerpt_link: Read More +fancybox: true + +# Sidebar +sidebar: right +widgets: +- category +- tag +- tagcloud +- archives +- recent_posts + +# Miscellaneous +google_analytics: +favicon: /favicon.png +twitter: +google_plus: +``` + +- **menu** - Navigation menu +- **rss** - RSS link +- **excerpt_link** - "Read More" link at the bottom of excerpted articles. `false` to hide the link. +- **fancybox** - Enable [Fancybox] +- **sidebar** - Sidebar style. You can choose `left`, `right`, `bottom` or `false`. +- **widgets** - Widgets displaying in sidebar +- **google_analytics** - Google Analytics ID +- **favicon** - Favicon path +- **twitter** - Twiiter ID +- **google_plus** - Google+ ID + +## Features + +### Fancybox + +Landscape uses [Fancybox] to showcase your photos. You can use Markdown syntax or fancybox tag plugin to add your photos. + +``` +![img caption](img url) + +{% fancybox img_url [img_thumbnail] [img_caption] %} +``` + +### Sidebar + +You can put your sidebar in left side, right side or bottom of your site by editing `sidebar` setting. + +Landscape provides 5 built-in widgets: + +- category +- tag +- tagcloud +- archives +- recent_posts + +All of them are enabled by default. You can edit them in `widget` setting. + +## Development + +### Requirements + +- [Grunt] 0.4+ +- Hexo 2.4+ + +### Grunt tasks + +- **default** - Download [Fancybox] and [Font Awesome]. +- **fontawesome** - Only download [Font Awesome]. +- **fancybox** - Only download [Fancybox]. +- **clean** - Clean temporarily files and downloaded files. + +[Hexo]: http://zespia.tw/hexo/ +[Fancybox]: http://fancyapps.com/fancybox/ +[Font Awesome]: http://fontawesome.io/ +[Grunt]: http://gruntjs.com/ diff --git a/themes/landscape/_config.yml b/themes/landscape/_config.yml new file mode 100644 index 0000000..4c1bb96 --- /dev/null +++ b/themes/landscape/_config.yml @@ -0,0 +1,36 @@ +# Header +menu: + Home: / + Archives: /archives +rss: /atom.xml + +# Content +excerpt_link: Read More +fancybox: true + +# Sidebar +sidebar: right +widgets: +- category +- tag +- tagcloud +- archive +- recent_posts + +# display widgets at the bottom of index pages (pagination == 2) +index_widgets: +# - category +# - tagcloud +# - archive + +# widget behavior +archive_type: 'monthly' +show_count: false + +# Miscellaneous +google_analytics: +favicon: /favicon.png +twitter: +google_plus: +fb_admins: +fb_app_id: diff --git a/themes/landscape/languages/default.yml b/themes/landscape/languages/default.yml new file mode 100644 index 0000000..3ef7e92 --- /dev/null +++ b/themes/landscape/languages/default.yml @@ -0,0 +1,19 @@ +categories: Categories +search: Search +tags: Tags +tagcloud: Tag Cloud +tweets: Tweets +prev: Prev +next: Next +comment: Comments +archive_a: Archives +archive_b: "Archives: %s" +page: Page %d +recent_posts: Recent Posts +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/nl.yml b/themes/landscape/languages/nl.yml new file mode 100644 index 0000000..568d33e --- /dev/null +++ b/themes/landscape/languages/nl.yml @@ -0,0 +1,20 @@ + +categories: Categorieën +search: Zoeken +tags: Labels +tagcloud: Tag Cloud +tweets: Tweets +prev: Vorige +next: Volgende +comment: Commentaren +archive_a: Archieven +archive_b: "Archieven: %s" +page: Pagina %d +recent_posts: Recente berichten +newer: Nieuwer +older: Ouder +share: Delen +powered_by: Powered by +rss_feed: RSS Feed +category: Categorie +tag: Label diff --git a/themes/landscape/languages/no.yml b/themes/landscape/languages/no.yml new file mode 100644 index 0000000..b997691 --- /dev/null +++ b/themes/landscape/languages/no.yml @@ -0,0 +1,19 @@ +categories: Kategorier +search: Søk +tags: Tags +tagcloud: Tag Cloud +tweets: Tweets +prev: Forrige +next: Neste +comment: Kommentarer +archive_a: Arkiv +archive_b: "Arkiv: %s" +page: Side %d +recent_posts: Siste innlegg +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/ru.yml b/themes/landscape/languages/ru.yml new file mode 100644 index 0000000..625a83c --- /dev/null +++ b/themes/landscape/languages/ru.yml @@ -0,0 +1,19 @@ +categories: Категории +search: Поиск +tags: Метки +tagcloud: Облако меток +tweets: Твиты +prev: Назад +next: Вперед +comment: Комментарии +archive_a: Архив +archive_b: "Архив: %s" +page: Страница %d +recent_posts: Недавние записи +newer: Следующий +older: Предыдущий +share: Поделиться +powered_by: Создано с помощью +rss_feed: RSS-каналы +category: Категория +tag: Метка \ No newline at end of file diff --git a/themes/landscape/languages/zh-CN.yml b/themes/landscape/languages/zh-CN.yml new file mode 100644 index 0000000..51e1321 --- /dev/null +++ b/themes/landscape/languages/zh-CN.yml @@ -0,0 +1,19 @@ +categories: 分类 +search: 搜索 +tags: 标签 +tagcloud: 标签云 +tweets: 推文 +prev: 上一页 +next: 下一页 +comment: 留言 +archive_a: 归档 +archive_b: 归档:%s +page: 第 %d 页 +recent_posts: 最新文章 +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/languages/zh-TW.yml b/themes/landscape/languages/zh-TW.yml new file mode 100644 index 0000000..76d2916 --- /dev/null +++ b/themes/landscape/languages/zh-TW.yml @@ -0,0 +1,19 @@ +categories: 分類 +search: 搜尋 +tags: 標籤 +tagcloud: 標籤雲 +tweets: 推文 +prev: 上一頁 +next: 下一頁 +comment: 留言 +archive_a: 彙整 +archive_b: 彙整:%s +page: 第 %d 頁 +recent_posts: 最新文章 +newer: Newer +older: Older +share: Share +powered_by: Powered by +rss_feed: RSS Feed +category: Category +tag: Tag \ No newline at end of file diff --git a/themes/landscape/layout/_partial/after-footer.ejs b/themes/landscape/layout/_partial/after-footer.ejs new file mode 100644 index 0000000..3ddfbee --- /dev/null +++ b/themes/landscape/layout/_partial/after-footer.ejs @@ -0,0 +1,24 @@ +<% if (config.disqus_shortname){ %> + +<% } %> + + + +<% if (theme.fancybox){ %> + <%- css('fancybox/jquery.fancybox') %> + <%- js('fancybox/jquery.fancybox.pack') %> +<% } %> + +<%- js('js/script') %> diff --git a/themes/landscape/layout/_partial/archive-post.ejs b/themes/landscape/layout/_partial/archive-post.ejs new file mode 100644 index 0000000..36f2cc3 --- /dev/null +++ b/themes/landscape/layout/_partial/archive-post.ejs @@ -0,0 +1,8 @@ +
+
+
+ <%- partial('post/date', {class_name: 'archive-article-date', date_format: 'MMM D'}) %> + <%- partial('post/title', {class_name: 'archive-article-title'}) %> +
+
+
\ No newline at end of file diff --git a/themes/landscape/layout/_partial/archive.ejs b/themes/landscape/layout/_partial/archive.ejs new file mode 100644 index 0000000..7d7c8ba --- /dev/null +++ b/themes/landscape/layout/_partial/archive.ejs @@ -0,0 +1,33 @@ +<% if (pagination == 2){ %> + <% page.posts.each(function(post){ %> + <%- partial('article', {post: post, index: true}) %> + <% }) %> +<% } else { %> + <% var last; %> + <% page.posts.each(function(post, i){ %> + <% var year = post.date.year(); %> + <% if (last != year){ %> + <% if (last != null){ %> + + <% } %> + <% last = year; %> +
+ +
+ <% } %> + <%- partial('archive-post', {post: post, even: i % 2 == 0}) %> + <% }) %> + <% if (page.posts.length){ %> +
+ <% } %> +<% } %> +<% if (page.total > 1){ %> + +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/article.ejs b/themes/landscape/layout/_partial/article.ejs new file mode 100644 index 0000000..0f951a9 --- /dev/null +++ b/themes/landscape/layout/_partial/article.ejs @@ -0,0 +1,44 @@ +
+ +
+ <%- partial('post/gallery') %> + <% if (post.link || post.title){ %> +
+ <%- partial('post/title', {class_name: 'article-title'}) %> +
+ <% } %> +
+ <% if (post.excerpt && index){ %> + <%- post.excerpt %> + <% if (theme.excerpt_link){ %> +

+ <%= theme.excerpt_link %> +

+ <% } %> + <% } else { %> + <%- post.content %> + <% } %> +
+ +
+ <% if (!index){ %> + <%- partial('post/nav') %> + <% } %> +
+ +<% if (!index && post.comments && config.disqus_shortname){ %> +
+
+ +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/footer.ejs b/themes/landscape/layout/_partial/footer.ejs new file mode 100644 index 0000000..3aca618 --- /dev/null +++ b/themes/landscape/layout/_partial/footer.ejs @@ -0,0 +1,11 @@ +
+ <% if (theme.sidebar === 'bottom'){ %> + <%- partial('_partial/sidebar') %> + <% } %> +
+ +
+
\ No newline at end of file diff --git a/themes/landscape/layout/_partial/google-analytics.ejs b/themes/landscape/layout/_partial/google-analytics.ejs new file mode 100644 index 0000000..84e75f0 --- /dev/null +++ b/themes/landscape/layout/_partial/google-analytics.ejs @@ -0,0 +1,14 @@ +<% if (theme.google_analytics){ %> + + + +<% } %> diff --git a/themes/landscape/layout/_partial/head.ejs b/themes/landscape/layout/_partial/head.ejs new file mode 100644 index 0000000..5288d16 --- /dev/null +++ b/themes/landscape/layout/_partial/head.ejs @@ -0,0 +1,36 @@ + + + + + <% + var title = page.title; + + if (is_archive()){ + title = __('archive_a'); + + if (is_month()){ + title += ': ' + page.year + '/' + page.month; + } else if (is_year()){ + title += ': ' + page.year; + } + } else if (is_category()){ + title = __('category') + ': ' + page.category; + } else if (is_tag()){ + title = __('tag') + ': ' + page.tag; + } + %> + <% if (title){ %><%= title %> | <% } %><%= config.title %> + + <%- open_graph({twitter_id: theme.twitter, google_plus: theme.google_plus, fb_admins: theme.fb_admins, fb_app_id: theme.fb_app_id}) %> + <% if (theme.rss){ %> + + <% } %> + <% if (theme.favicon){ %> + + <% } %> + <% if (config.highlight.enable){ %> + + <% } %> + <%- css('css/style') %> + <%- partial('google-analytics') %> + diff --git a/themes/landscape/layout/_partial/header.ejs b/themes/landscape/layout/_partial/header.ejs new file mode 100644 index 0000000..aa4aad6 --- /dev/null +++ b/themes/landscape/layout/_partial/header.ejs @@ -0,0 +1,32 @@ + \ No newline at end of file diff --git a/themes/landscape/layout/_partial/mobile-nav.ejs b/themes/landscape/layout/_partial/mobile-nav.ejs new file mode 100644 index 0000000..7c1d2af --- /dev/null +++ b/themes/landscape/layout/_partial/mobile-nav.ejs @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/category.ejs b/themes/landscape/layout/_partial/post/category.ejs new file mode 100644 index 0000000..db2ed48 --- /dev/null +++ b/themes/landscape/layout/_partial/post/category.ejs @@ -0,0 +1,10 @@ +<% if (post.categories && post.categories.length){ %> + +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/date.ejs b/themes/landscape/layout/_partial/post/date.ejs new file mode 100644 index 0000000..3f49613 --- /dev/null +++ b/themes/landscape/layout/_partial/post/date.ejs @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/gallery.ejs b/themes/landscape/layout/_partial/post/gallery.ejs new file mode 100644 index 0000000..886c8ec --- /dev/null +++ b/themes/landscape/layout/_partial/post/gallery.ejs @@ -0,0 +1,11 @@ +<% if (post.photos && post.photos.length){ %> +
+
+ <% post.photos.forEach(function(photo, i){ %> + + + + <% }) %> +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/nav.ejs b/themes/landscape/layout/_partial/post/nav.ejs new file mode 100644 index 0000000..720798a --- /dev/null +++ b/themes/landscape/layout/_partial/post/nav.ejs @@ -0,0 +1,22 @@ +<% if (post.prev || post.next){ %> + +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/tag.ejs b/themes/landscape/layout/_partial/post/tag.ejs new file mode 100644 index 0000000..e0f327f --- /dev/null +++ b/themes/landscape/layout/_partial/post/tag.ejs @@ -0,0 +1,6 @@ +<% if (post.tags && post.tags.length){ %> + <%- list_tags(post.tags, { + show_count: false, + class: 'article-tag' + }) %> +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/post/title.ejs b/themes/landscape/layout/_partial/post/title.ejs new file mode 100644 index 0000000..69d646f --- /dev/null +++ b/themes/landscape/layout/_partial/post/title.ejs @@ -0,0 +1,15 @@ +<% if (post.link){ %> +

+ +

+<% } else if (post.title){ %> + <% if (index){ %> +

+ <%= post.title %> +

+ <% } else { %> +

+ <%= post.title %> +

+ <% } %> +<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_partial/sidebar.ejs b/themes/landscape/layout/_partial/sidebar.ejs new file mode 100644 index 0000000..c1e48e5 --- /dev/null +++ b/themes/landscape/layout/_partial/sidebar.ejs @@ -0,0 +1,5 @@ + \ No newline at end of file diff --git a/themes/landscape/layout/_widget/archive.ejs b/themes/landscape/layout/_widget/archive.ejs new file mode 100644 index 0000000..a20c58c --- /dev/null +++ b/themes/landscape/layout/_widget/archive.ejs @@ -0,0 +1,8 @@ +<% if (site.posts.length){ %> +
+

<%= __('archive_a') %>

+
+ <%- list_archives({show_count: theme.show_count, type: theme.archive_type}) %> +
+
+<% } %> diff --git a/themes/landscape/layout/_widget/category.ejs b/themes/landscape/layout/_widget/category.ejs new file mode 100644 index 0000000..8d9e5e9 --- /dev/null +++ b/themes/landscape/layout/_widget/category.ejs @@ -0,0 +1,8 @@ +<% if (site.categories.length){ %> +
+

<%= __('categories') %>

+
+ <%- list_categories({show_count: theme.show_count}) %> +
+
+<% } %> diff --git a/themes/landscape/layout/_widget/recent_posts.ejs b/themes/landscape/layout/_widget/recent_posts.ejs new file mode 100644 index 0000000..7a38547 --- /dev/null +++ b/themes/landscape/layout/_widget/recent_posts.ejs @@ -0,0 +1,14 @@ +<% if (site.posts.length){ %> +
+

<%= __('recent_posts') %>

+
+ +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/_widget/tag.ejs b/themes/landscape/layout/_widget/tag.ejs new file mode 100644 index 0000000..ea5fb2c --- /dev/null +++ b/themes/landscape/layout/_widget/tag.ejs @@ -0,0 +1,8 @@ +<% if (site.tags.length){ %> +
+

<%= __('tags') %>

+
+ <%- list_tags({show_count: theme.show_count}) %> +
+
+<% } %> diff --git a/themes/landscape/layout/_widget/tagcloud.ejs b/themes/landscape/layout/_widget/tagcloud.ejs new file mode 100644 index 0000000..5feb435 --- /dev/null +++ b/themes/landscape/layout/_widget/tagcloud.ejs @@ -0,0 +1,8 @@ +<% if (site.tags.length){ %> +
+

<%= __('tagcloud') %>

+
+ <%- tagcloud() %> +
+
+<% } %> \ No newline at end of file diff --git a/themes/landscape/layout/archive.ejs b/themes/landscape/layout/archive.ejs new file mode 100644 index 0000000..52f9b21 --- /dev/null +++ b/themes/landscape/layout/archive.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: config.archive, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/layout/category.ejs b/themes/landscape/layout/category.ejs new file mode 100644 index 0000000..3ffe252 --- /dev/null +++ b/themes/landscape/layout/category.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: config.category, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/layout/index.ejs b/themes/landscape/layout/index.ejs new file mode 100644 index 0000000..60a2c68 --- /dev/null +++ b/themes/landscape/layout/index.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: 2, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/layout/layout.ejs b/themes/landscape/layout/layout.ejs new file mode 100644 index 0000000..cf88daf --- /dev/null +++ b/themes/landscape/layout/layout.ejs @@ -0,0 +1,18 @@ +<%- partial('_partial/head') %> + +
+
+ <%- partial('_partial/header', null, {cache: !config.relative_link}) %> +
+
<%- body %>
+ <% if (theme.sidebar && theme.sidebar !== 'bottom'){ %> + <%- partial('_partial/sidebar', null, {cache: !config.relative_link}) %> + <% } %> +
+ <%- partial('_partial/footer', null, {cache: !config.relative_link}) %> +
+ <%- partial('_partial/mobile-nav', null, {cache: !config.relative_link}) %> + <%- partial('_partial/after-footer') %> +
+ + \ No newline at end of file diff --git a/themes/landscape/layout/page.ejs b/themes/landscape/layout/page.ejs new file mode 100644 index 0000000..bea6318 --- /dev/null +++ b/themes/landscape/layout/page.ejs @@ -0,0 +1 @@ +<%- partial('_partial/article', {post: page, index: false}) %> \ No newline at end of file diff --git a/themes/landscape/layout/post.ejs b/themes/landscape/layout/post.ejs new file mode 100644 index 0000000..bea6318 --- /dev/null +++ b/themes/landscape/layout/post.ejs @@ -0,0 +1 @@ +<%- partial('_partial/article', {post: page, index: false}) %> \ No newline at end of file diff --git a/themes/landscape/layout/tag.ejs b/themes/landscape/layout/tag.ejs new file mode 100644 index 0000000..048cdb0 --- /dev/null +++ b/themes/landscape/layout/tag.ejs @@ -0,0 +1 @@ +<%- partial('_partial/archive', {pagination: config.tag, index: true}) %> \ No newline at end of file diff --git a/themes/landscape/package.json b/themes/landscape/package.json new file mode 100644 index 0000000..a11e9f6 --- /dev/null +++ b/themes/landscape/package.json @@ -0,0 +1,12 @@ +{ + "name": "hexo-theme-landscape", + "version": "0.0.1", + "private": true, + "devDependencies": { + "grunt": "~0.4.2", + "load-grunt-tasks": "~0.2.0", + "grunt-git": "~0.2.2", + "grunt-contrib-clean": "~0.5.0", + "grunt-contrib-copy": "~0.4.1" + } +} diff --git a/themes/landscape/scripts/fancybox.js b/themes/landscape/scripts/fancybox.js new file mode 100644 index 0000000..83f1fdc --- /dev/null +++ b/themes/landscape/scripts/fancybox.js @@ -0,0 +1,24 @@ +var rUrl = /((([A-Za-z]{3,9}:(?:\/\/)?)(?:[-;:&=\+\$,\w]+@)?[A-Za-z0-9.-]+|(?:www.|[-;:&=\+\$,\w]+@)[A-Za-z0-9.-]+)((?:\/[\+~%\/.\w-_]*)?\??(?:[-\+=&;%@.\w_]*)#?(?:[.\!\/\\w]*))?)/; + +/** +* Fancybox tag +* +* Syntax: +* {% fancybox /path/to/image [/path/to/thumbnail] [title] %} +*/ + +hexo.extend.tag.register('fancybox', function(args){ + var original = args.shift(), + thumbnail = ''; + + if (args.length && rUrl.test(args[0])){ + thumbnail = args.shift(); + } + + var title = args.join(' '); + + return '' + + '' + title + '' + '' + + (title ? '' + title + '' : ''); +}); \ No newline at end of file diff --git a/themes/landscape/source/css/_extend.styl b/themes/landscape/source/css/_extend.styl new file mode 100644 index 0000000..96a1817 --- /dev/null +++ b/themes/landscape/source/css/_extend.styl @@ -0,0 +1,63 @@ +$block-caption + text-decoration: none + text-transform: uppercase + letter-spacing: 2px + color: color-grey + margin-bottom: 1em + margin-left: 5px + line-height: 1em + text-shadow: 0 1px #fff + font-weight: bold + +$block + background: #fff + box-shadow: 1px 2px 3px #ddd + border: 1px solid color-border + border-radius: 3px + +$base-style + h1 + font-size: 2em + h2 + font-size: 1.5em + h3 + font-size: 1.3em + h4 + font-size: 1.2em + h5 + font-size: 1em + h6 + font-size: 1em + color: color-grey + hr + border: 1px dashed color-border + strong + font-weight: bold + em, cite + font-style: italic + sup, sub + font-size: 0.75em + line-height: 0 + position: relative + vertical-align: baseline + sup + top: -0.5em + sub + bottom: -0.2em + small + font-size: 0.85em + acronym, abbr + border-bottom: 1px dotted + ul, ol, dl + margin: 0 20px + line-height: line-height + ul, ol + ul, ol + margin-top: 0 + margin-bottom: 0 + ul + list-style: disc + ol + list-style: decimal + dt + font-weight: bold \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/archive.styl b/themes/landscape/source/css/_partial/archive.styl new file mode 100644 index 0000000..90ef053 --- /dev/null +++ b/themes/landscape/source/css/_partial/archive.styl @@ -0,0 +1,80 @@ +.archives-wrap + margin: block-margin 0 + +.archives + clearfix() + +.archive-year-wrap + margin-bottom: 1em + +.archive-year + @extend $block-caption + +.archives + column-gap: 10px + @media mq-tablet + column-count: 2 + @media mq-normal + column-count: 3 + +.archive-article + avoid-column-break() + +.archive-article-inner + @extend $block + padding: 10px + margin-bottom: 15px + +.archive-article-title + text-decoration: none + font-weight: bold + color: color-default + transition: color 0.2s + line-height: line-height + &:hover + color: color-link + +.archive-article-footer + margin-top: 1em + +.archive-article-date + color: color-grey + text-decoration: none + font-size: 0.85em + line-height: 1em + margin-bottom: 0.5em + display: block + +#page-nav + clearfix() + margin: block-margin auto + background: #fff + box-shadow: 1px 2px 3px #ddd + border: 1px solid color-border + border-radius: 3px + text-align: center + color: color-grey + overflow: hidden + a, span + padding: 10px 20px + line-height: 1 + height: 2ex + a + color: color-grey + text-decoration: none + &:hover + background: color-grey + color: #fff + .prev + float: left + .next + float: right + .page-number + display: inline-block + @media mq-mobile + display: none + .current + color: color-default + font-weight: bold + .space + color: color-border \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/article.styl b/themes/landscape/source/css/_partial/article.styl new file mode 100644 index 0000000..46094f9 --- /dev/null +++ b/themes/landscape/source/css/_partial/article.styl @@ -0,0 +1,357 @@ +.article + margin: block-margin 0 + +.article-inner + @extend $block + overflow: hidden + +.article-meta + clearfix() + +.article-date + @extend $block-caption + float: left + +.article-category + float: left + line-height: 1em + color: #ccc + text-shadow: 0 1px #fff + margin-left: 8px + &:before + content: "\2022" + +.article-category-link + @extend $block-caption + margin: 0 12px 1em + +.article-header + padding: article-padding article-padding 0 + +.article-title + text-decoration: none + font-size: 2em + font-weight: bold + color: color-default + line-height: line-height-title + transition: color 0.2s + a&:hover + color: color-link + +.article-entry + @extend $base-style + clearfix() + color: color-default + padding: 0 article-padding + p, table + line-height: line-height + margin: line-height 0 + h1, h2, h3, h4, h5, h6 + font-weight: bold + h1, h2, h3, h4, h5, h6 + line-height: line-height-title + margin: line-height-title 0 + a + color: color-link + text-decoration: none + &:hover + text-decoration: underline + ul, ol, dl + margin-top: line-height + margin-bottom: line-height + img, video + max-width: 100% + height: auto + display: block + margin: auto + iframe + border: none + table + width: 100% + border-collapse: collapse + border-spacing: 0 + th + font-weight: bold + border-bottom: 3px solid color-border + padding-bottom: 0.5em + td + border-bottom: 1px solid color-border + padding: 10px 0 + blockquote + font-family: font-serif + font-size: 1.4em + margin: line-height 20px + text-align: center + footer + font-size: font-size + margin: line-height 0 + font-family: font-sans + cite + &:before + content: "—" + padding: 0 0.5em + .pullquote + text-align: left + width: 45% + margin: 0 + &.left + margin-left: 0.5em + margin-right: 1em + &.right + margin-right: 0.5em + margin-left: 1em + .caption + color: color-grey + display: block + font-size: 0.9em + margin-top: 0.5em + position: relative + text-align: center + // http://webdesignerwall.com/tutorials/css-elastic-videos + .video-container + position: relative + padding-top: (9 / 16 * 100)% // 16:9 ratio + height: 0 + overflow: hidden + iframe, object, embed + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + margin-top: 0 + +.article-more-link a + display: inline-block + line-height: 1em + padding: 6px 15px + border-radius: 15px + background: color-background + color: color-grey + text-shadow: 0 1px #fff + text-decoration: none + &:hover + background: color-link + color: #fff + text-decoration: none + text-shadow: 0 1px darken(color-link, 20%) + +.article-footer + clearfix() + font-size: 0.85em + line-height: line-height + border-top: 1px solid color-border + padding-top: line-height + margin: 0 article-padding article-padding + a + color: color-grey + text-decoration: none + &:hover + color: color-default + +.article-tag-list-item + float: left + margin-right: 10px + +.article-tag-list-link + &:before + content: "#" + +.article-comment-link + float: right + &:before + content: "\f075" + font-family: font-icon + padding-right: 8px + +.article-share-link + cursor: pointer + float: right + margin-left: 20px + &:before + content: "\f064" + font-family: font-icon + padding-right: 6px + +#article-nav + clearfix() + position: relative + @media mq-normal + margin: block-margin 0 + &:before + absolute-center(8px) + content: "" + border-radius: 50% + background: color-border + box-shadow: 0 1px 2px #fff + +.article-nav-link-wrap + text-decoration: none + text-shadow: 0 1px #fff + color: color-grey + box-sizing: border-box + margin-top: block-margin + text-align: center + display: block + &:hover + color: color-default + @media mq-normal + width: 50% + margin-top: 0 + +#article-nav-newer + @media mq-normal + float: left + text-align: right + padding-right: 20px + +#article-nav-older + @media mq-normal + float: right + text-align: left + padding-left: 20px + +.article-nav-caption + text-transform: uppercase + letter-spacing: 2px + color: color-border + line-height: 1em + font-weight: bold + #article-nav-newer & + margin-right: -2px + +.article-nav-title + font-size: 0.85em + line-height: line-height + margin-top: 0.5em + +.article-share-box + position: absolute + display: none + background: #fff + box-shadow: 1px 2px 10px rgba(0, 0, 0, 0.2) + border-radius: 3px + margin-left: -145px + overflow: hidden + z-index: 1 + &.on + display: block + +.article-share-input + width: 100% + background: none + box-sizing: border-box + font: 14px font-sans + padding: 0 15px + color: color-default + outline: none + border: 1px solid color-border + border-radius: 3px 3px 0 0 + height: 36px + line-height: 36px + +.article-share-links + clearfix() + background: color-background + +$article-share-link + width: 50px + height: 36px + display: block + float: left + position: relative + color: #999 + text-shadow: 0 1px #fff + &:before + font-size: 20px + font-family: font-icon + absolute-center(@font-size) + text-align: center + &:hover + color: #fff + +.article-share-twitter + @extend $article-share-link + &:before + content: "\f099" + &:hover + background: color-twitter + text-shadow: 0 1px darken(color-twitter, 20%) + +.article-share-facebook + @extend $article-share-link + &:before + content: "\f09a" + &:hover + background: color-facebook + text-shadow: 0 1px darken(color-facebook, 20%) + +.article-share-pinterest + @extend $article-share-link + &:before + content: "\f0d2" + &:hover + background: color-pinterest + text-shadow: 0 1px darken(color-pinterest, 20%) + +.article-share-google + @extend $article-share-link + &:before + content: "\f0d5" + &:hover + background: color-google + text-shadow: 0 1px darken(color-google, 20%) + +.article-gallery + background: #000 + position: relative + +.article-gallery-photos + position: relative + overflow: hidden + +.article-gallery-img + display: none + max-width: 100% + &:first-child + display: block + &.loaded + position: absolute + display: block + img + display: block + max-width: 100% + margin: 0 auto +/* +$article-gallery-ctrl + position: absolute + top: 0 + height: 100% + width: 60px + color: #fff + text-shadow: 0 0 3px rgba(0, 0, 0, 0.3) + opacity: 0.3 + transition: opacity 0.2s + cursor: pointer + &:hover + opacity: 0.8 + &:before + font-size: 30px + font-family: font-icon + position: absolute + top: 50% + margin-top: @font-size * -0.5 + +.article-gallery-prev + @extend $article-gallery-ctrl + left: 0 + &:before + content: "\f053" + left: 15px + +.article-gallery-next + @extend $article-gallery-ctrl + right: 0 + &:before + content: "\f054" + right: 15px*/ \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/comment.styl b/themes/landscape/source/css/_partial/comment.styl new file mode 100644 index 0000000..296b7dd --- /dev/null +++ b/themes/landscape/source/css/_partial/comment.styl @@ -0,0 +1,9 @@ +#comments + background: #fff + box-shadow: 1px 2px 3px #ddd + padding: article-padding + border: 1px solid color-border + border-radius: 3px + margin: block-margin 0 + a + color: color-link \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/footer.styl b/themes/landscape/source/css/_partial/footer.styl new file mode 100644 index 0000000..fe2fd24 --- /dev/null +++ b/themes/landscape/source/css/_partial/footer.styl @@ -0,0 +1,14 @@ +#footer + background: color-footer-background + padding: 50px 0 + border-top: 1px solid color-border + color: color-grey + a + color: color-link + text-decoration: none + &:hover + text-decoration: underline + +#footer-info + line-height: line-height + font-size: 0.85em \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/header.styl b/themes/landscape/source/css/_partial/header.styl new file mode 100644 index 0000000..d18ebc8 --- /dev/null +++ b/themes/landscape/source/css/_partial/header.styl @@ -0,0 +1,165 @@ +#header + height: banner-height + position: relative + border-bottom: 1px solid color-border + &:before, &:after + content: "" + position: absolute + left: 0 + right: 0 + height: 40px + &:before + top: 0 + background: linear-gradient(rgba(0, 0, 0, 0.2), transparent) + &:after + bottom: 0 + background: linear-gradient(transparent, rgba(0, 0, 0, 0.2)) + +#header-outer + height: 100% + position: relative + +#header-inner + position: relative + overflow: hidden + +#banner + position: absolute + top: 0 + left: 0 + width: 100% + height: 100% + background: url(banner-url) center #000 + background-size: cover + z-index: -1 + +#header-title + text-align: center + height: logo-size + position: absolute + top: 50% + left: 0 + margin-top: logo-size * -0.5 + +$logo-text + text-decoration: none + color: #fff + font-weight: 300 + text-shadow: 0 1px 4px rgba(0, 0, 0, 0.3) + +#logo + @extend $logo-text + font-size: logo-size + line-height: logo-size + letter-spacing: 2px + +#subtitle + @extend $logo-text + font-size: subtitle-size + line-height: subtitle-size + letter-spacing: 1px + +#subtitle-wrap + margin-top: subtitle-size + +#main-nav + float: left + margin-left: -15px + +$nav-link + float: left + color: #fff + opacity: 0.6 + text-decoration: none + text-shadow: 0 1px rgba(0, 0, 0, 0.2) + transition: opacity 0.2s + display: block + padding: 20px 15px + &:hover + opacity: 1 + +.nav-icon + @extend $nav-link + font-family: font-icon + text-align: center + font-size: font-size + width: font-size + height: font-size + padding: 20px 15px + position: relative + cursor: pointer + +.main-nav-link + @extend $nav-link + font-weight: 300 + letter-spacing: 1px + @media mq-mobile + display: none + +#main-nav-toggle + display: none + &:before + content: "\f0c9" + @media mq-mobile + display: block + +#sub-nav + float: right + margin-right: -15px + +#nav-rss-link + &:before + content: "\f09e" + +#nav-search-btn + &:before + content: "\f002" + +#search-form-wrap + position: absolute + top: 15px + width: 150px + height: 30px + right: -150px + opacity: 0 + transition: 0.2s ease-out + &.on + opacity: 1 + right: 0 + @media mq-mobile + width: 100% + right: -100% + +.search-form + position: absolute + top: 0 + left: 0 + right: 0 + background: #fff + padding: 5px 15px + border-radius: 15px + box-shadow: 0 0 10px rgba(0, 0, 0, 0.3) + +.search-form-input + border: none + background: none + color: color-default + width: 100% + font: 13px font-sans + outline: none + &::-webkit-search-results-decoration + &::-webkit-search-cancel-button + -webkit-appearance: none + +.search-form-submit + position: absolute + top: 50% + right: 10px + margin-top: -7px + font: 13px font-icon + border: none + background: none + color: #bbb + cursor: pointer + &:hover, &:focus + color: #777 \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/highlight.styl b/themes/landscape/source/css/_partial/highlight.styl new file mode 100644 index 0000000..ccc352c --- /dev/null +++ b/themes/landscape/source/css/_partial/highlight.styl @@ -0,0 +1,156 @@ +// https://github.com/chriskempson/tomorrow-theme +highlight-background = #2d2d2d +highlight-current-line = #393939 +highlight-selection = #515151 +highlight-foreground = #cccccc +highlight-comment = #999999 +highlight-red = #f2777a +highlight-orange = #f99157 +highlight-yellow = #ffcc66 +highlight-green = #99cc99 +highlight-aqua = #66cccc +highlight-blue = #6699cc +highlight-purple = #cc99cc + +$code-block + background: highlight-background + margin: 0 article-padding * -1 + padding: 15px article-padding + border-style: solid + border-color: color-border + border-width: 1px 0 + overflow: auto + color: highlight-foreground + line-height: font-size * line-height + +$line-numbers + color: #666 + font-size: 0.85em + +.article-entry + pre, code + font-family: font-mono + code + background: color-background + text-shadow: 0 1px #fff + padding: 0 0.3em + pre + @extend $code-block + code + background: none + text-shadow: none + padding: 0 + .highlight + @extend $code-block + pre + border: none + margin: 0 + padding: 0 + table + margin: 0 + width: auto + td + border: none + padding: 0 + figcaption + clearfix() + font-size: 0.85em + color: highlight-comment + line-height: 1em + margin-bottom: 1em + a + float: right + .gutter pre + @extend $line-numbers + text-align: right + padding-right: 20px + .line + height: font-size * line-height + .gist + margin: 0 article-padding * -1 + border-style: solid + border-color: color-border + border-width: 1px 0 + background: highlight-background + padding: 15px article-padding 15px 0 + .gist-file + border: none + font-family: font-mono + margin: 0 + .gist-data + background: none + border: none + .line-numbers + @extend $line-numbers + background: none + border: none + padding: 0 20px 0 0 + .line-data + padding: 0 !important + .highlight + margin: 0 + padding: 0 + border: none + .gist-meta + background: highlight-background + color: highlight-comment + font: 0.85em font-sans + text-shadow: 0 0 + padding: 0 + margin-top: 1em + margin-left: article-padding + a + color: color-link + font-weight: normal + &:hover + text-decoration: underline + +pre + .comment + .title + color: highlight-comment + .variable + .attribute + .tag + .regexp + .ruby .constant + .xml .tag .title + .xml .pi + .xml .doctype + .html .doctype + .css .id + .css .class + .css .pseudo + color: highlight-red + .number + .preprocessor + .built_in + .literal + .params + .constant + color: highlight-orange + .class + .ruby .class .title + .css .rules .attribute + color: highlight-green + .string + .value + .inheritance + .header + .ruby .symbol + .xml .cdata + color: highlight-green + .css .hexcolor + color: highlight-aqua + .function + .python .decorator + .python .title + .ruby .function .title + .ruby .title .keyword + .perl .sub + .javascript .title + .coffeescript .title + color: highlight-blue + .keyword + .javascript .function + color: highlight-purple \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/mobile.styl b/themes/landscape/source/css/_partial/mobile.styl new file mode 100644 index 0000000..eb68b3a --- /dev/null +++ b/themes/landscape/source/css/_partial/mobile.styl @@ -0,0 +1,19 @@ +@media mq-mobile + #mobile-nav + position: absolute + top: 0 + left: 0 + width: mobile-nav-width + height: 100% + background: color-mobile-nav-background + border-right: 1px solid #fff + +@media mq-mobile + .mobile-nav-link + display: block + color: color-grey + text-decoration: none + padding: 15px 20px + font-weight: bold + &:hover + color: #fff diff --git a/themes/landscape/source/css/_partial/sidebar-aside.styl b/themes/landscape/source/css/_partial/sidebar-aside.styl new file mode 100644 index 0000000..838b167 --- /dev/null +++ b/themes/landscape/source/css/_partial/sidebar-aside.styl @@ -0,0 +1,27 @@ +#sidebar + @media mq-normal + column(sidebar-column) + +.widget-wrap + margin: block-margin 0 + +.widget-title + @extend $block-caption + +.widget + color: color-sidebar-text + text-shadow: 0 1px #fff + background: color-widget-background + box-shadow: 0 -1px 4px color-widget-border inset + border: 1px solid color-widget-border + padding: 15px + border-radius: 3px + a + color: color-link + text-decoration: none + &:hover + text-decoration: underline + ul, ol, dl + ul, ol, dl + margin-left: 15px + list-style: disc \ No newline at end of file diff --git a/themes/landscape/source/css/_partial/sidebar-bottom.styl b/themes/landscape/source/css/_partial/sidebar-bottom.styl new file mode 100644 index 0000000..e2403fd --- /dev/null +++ b/themes/landscape/source/css/_partial/sidebar-bottom.styl @@ -0,0 +1,27 @@ +.widget-wrap + margin-bottom: block-margin !important + @media mq-normal + column(main-column) + +.widget-title + color: #ccc + text-transform: uppercase + letter-spacing: 2px + margin-bottom: .5em + line-height: 1em + font-weight: bold + +.widget + color: color-grey + ul, ol + li + display: inline-block + zoom:1 + *display:inline + padding-right: .75em +/* Having problems getting balanced white space between items + li:before + content: " | " + li:first-child:before + content: none + */ diff --git a/themes/landscape/source/css/_partial/sidebar.styl b/themes/landscape/source/css/_partial/sidebar.styl new file mode 100644 index 0000000..e43d66a --- /dev/null +++ b/themes/landscape/source/css/_partial/sidebar.styl @@ -0,0 +1,35 @@ +if sidebar is bottom + @import "sidebar-bottom" +else + @import "sidebar-aside" + +.widget + @extend $base-style + line-height: line-height + word-wrap: break-word + font-size: 0.9em + ul, ol + list-style: none + margin: 0 + ul, ol + margin: 0 20px + ul + list-style: disc + ol + list-style: decimal + +.category-list-count +.tag-list-count +.archive-list-count + padding-left: 5px + color: color-grey + font-size: 0.85em + &:before + content: "(" + &:after + content: ")" + +.tagcloud + a + margin-right: 5px + display: inline-block diff --git a/themes/landscape/source/css/_util/grid.styl b/themes/landscape/source/css/_util/grid.styl new file mode 100644 index 0000000..2a14dd2 --- /dev/null +++ b/themes/landscape/source/css/_util/grid.styl @@ -0,0 +1,38 @@ +///////////////// +// Semantic.gs // for Stylus: http://learnboost.github.com/stylus/ +///////////////// + +// Utility function — you should never need to modify this +// _gridsystem-width = (column-width + gutter-width) * columns +gridsystem-width(_columns = columns) + (column-width + gutter-width) * _columns + +// Set @total-width to 100% for a fluid layout +// total-width = gridsystem-width(columns) +total-width = 100% + +////////// +// GRID // +////////// + +body + clearfix() + width: 100% + +row(_columns = columns) + clearfix() + display: block + width: total-width * ((gutter-width + gridsystem-width(_columns)) / gridsystem-width(_columns)) + margin: 0 total-width * (((gutter-width * .5) / gridsystem-width(_columns)) * -1) + +column(x, _columns = columns) + display: inline + float: left + width: total-width * ((((gutter-width + column-width) * x) - gutter-width) / gridsystem-width(_columns)) + margin: 0 total-width * ((gutter-width * .5) / gridsystem-width(_columns)) + +push(offset = 1) + margin-left: total-width * (((gutter-width + column-width) * offset) / gridsystem-width(columns)) + +pull(offset = 1) + margin-right: total-width * (((gutter-width + column-width) * offset) / gridsystem-width(columns)) \ No newline at end of file diff --git a/themes/landscape/source/css/_util/mixin.styl b/themes/landscape/source/css/_util/mixin.styl new file mode 100644 index 0000000..b56f037 --- /dev/null +++ b/themes/landscape/source/css/_util/mixin.styl @@ -0,0 +1,31 @@ +// http://www.zeldman.com/2012/03/01/replacing-the-9999px-hack-new-image-replacement/ +hide-text() + text-indent: 100% + white-space: nowrap + overflow: hidden + +// http://codepen.io/shshaw/full/gEiDt +absolute-center(width, height = width) + // margin: auto + // position: absolute + // top: 50% + // top: 0 + // left: 0 + // bottom: 0 + // right: 0 + // width: width + // height: height + // overflow: auto + width: width + height: height + position: absolute + top: 50% + left: 50% + margin-top: width * -0.5 + margin-left: height * -0.5 + +avoid-column-break() + vendor("column-break-inside", avoid, only: webkit) + page-break-inside: avoid // for firefox + overflow: hidden // fix for firefox + break-inside: avoid-column diff --git a/themes/landscape/source/css/_variables.styl b/themes/landscape/source/css/_variables.styl new file mode 100644 index 0000000..1215bb1 --- /dev/null +++ b/themes/landscape/source/css/_variables.styl @@ -0,0 +1,60 @@ +// Config +support-for-ie = false +vendor-prefixes = webkit moz ms official + +// Colors +color-default = #555 +color-grey = #999 +color-border = #ddd +color-link = #258fb8 +color-background = #eee +color-sidebar-text = #777 +color-widget-background = #ddd +color-widget-border = #ccc +color-footer-background = #262a30 +color-mobile-nav-background = #191919 +color-twitter = #00aced +color-facebook = #3b5998 +color-pinterest = #cb2027 +color-google = #dd4b39 + +// Fonts +font-sans = "Helvetica Neue", Helvetica, Arial, sans-serif +font-serif = Georgia, "Times New Roman", serif +font-mono = "Source Code Pro", Consolas, Monaco, Menlo, Consolas, monospace +font-icon = FontAwesome +font-icon-path = "fonts/fontawesome-webfont" +font-icon-version = "4.0.3" +font-size = 14px +line-height = 1.6em +line-height-title = 1.1em + +// Header +logo-size = 40px +subtitle-size = 16px +banner-height = 300px +banner-url = "images/banner.jpg" + +sidebar = hexo-config("sidebar") + +// Layout +block-margin = 50px +article-padding = 20px +mobile-nav-width = 280px +main-column = 9 +sidebar-column = 3 + +if sidebar and sidebar isnt bottom + _sidebar-column = sidebar-column +else + _sidebar-column = 0 + +// Grids +column-width = 80px +gutter-width = 20px +columns = main-column + _sidebar-column + +// Media queries +mq-mobile = "screen and (max-width: 479px)" +mq-tablet = "screen and (min-width: 480px) and (max-width: 767px)" +mq-normal = "screen and (min-width: 768px)" \ No newline at end of file diff --git a/themes/landscape/source/css/fonts/FontAwesome.otf b/themes/landscape/source/css/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..8b0f54e47e1d356dcf1496942a50e228e0f1ee14 GIT binary patch literal 62856 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