diff --git a/_config.yml b/_config.yml index 8fd74d5..d9d9488 100644 --- a/_config.yml +++ b/_config.yml @@ -31,7 +31,8 @@ skip_render: 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 +# external_link: +# enable: true # Open external links in new tab filename_case: 0 render_drafts: false post_asset_folder: false @@ -72,19 +73,26 @@ theme: apollo # 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 type: rsync - host: 104.238.151.113 - user: captain - root: /var/www/tunpok-blog + host: 173.82.143.112 + user: root + root: /root/deploy/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 +# 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 index 69b95ed..39a1c3c 100644 --- a/db.json +++ b/db.json @@ -1 +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

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

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 +{"meta":{"version":1,"warehouse":"4.0.0"},"models":{"Asset":[{"_id":"source/CNAME","path":"CNAME","modified":0,"renderable":0},{"_id":"themes/cactus/source/css/rtl.styl","path":"css/rtl.styl","modified":0,"renderable":1},{"_id":"themes/cactus/source/css/style.styl","path":"css/style.styl","modified":0,"renderable":1},{"_id":"themes/cactus/source/images/apple-touch-icon.png","path":"images/apple-touch-icon.png","modified":0,"renderable":1},{"_id":"themes/cactus/source/images/favicon-192x192_1.png","path":"images/favicon-192x192_1.png","modified":0,"renderable":1},{"_id":"themes/cactus/source/images/favicon.png","path":"images/favicon.png","modified":0,"renderable":1},{"_id":"themes/cactus/source/images/favicon1.ico","path":"images/favicon1.ico","modified":0,"renderable":1},{"_id":"themes/cactus/source/images/logo.png","path":"images/logo.png","modified":0,"renderable":1},{"_id":"themes/cactus/source/images/logo1.png","path":"images/logo1.png","modified":0,"renderable":1},{"_id":"themes/cactus/source/js/main.js","path":"js/main.js","modified":0,"renderable":1},{"_id":"themes/cactus/source/js/search.js","path":"js/search.js","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/clipboard/clipboard.min.js","path":"lib/clipboard/clipboard.min.js","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/jquery/jquery.min.js","path":"lib/jquery/jquery.min.js","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Bold.ttf","path":"lib/meslo-LG/MesloLGL-Bold.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-BoldItalic.ttf","path":"lib/meslo-LG/MesloLGL-BoldItalic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Italic.ttf","path":"lib/meslo-LG/MesloLGL-Italic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Regular.ttf","path":"lib/meslo-LG/MesloLGL-Regular.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Bold.ttf","path":"lib/meslo-LG/MesloLGM-Bold.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-BoldItalic.ttf","path":"lib/meslo-LG/MesloLGM-BoldItalic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Italic.ttf","path":"lib/meslo-LG/MesloLGM-Italic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Regular.ttf","path":"lib/meslo-LG/MesloLGM-Regular.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Bold.ttf","path":"lib/meslo-LG/MesloLGS-Bold.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-BoldItalic.ttf","path":"lib/meslo-LG/MesloLGS-BoldItalic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Italic.ttf","path":"lib/meslo-LG/MesloLGS-Italic.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Regular.ttf","path":"lib/meslo-LG/MesloLGS-Regular.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.eot","path":"lib/vazir-font/Vazir-Black.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.ttf","path":"lib/vazir-font/Vazir-Black.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.woff","path":"lib/vazir-font/Vazir-Black.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.woff2","path":"lib/vazir-font/Vazir-Black.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.eot","path":"lib/vazir-font/Vazir-Bold.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.ttf","path":"lib/vazir-font/Vazir-Bold.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.woff","path":"lib/vazir-font/Vazir-Bold.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.woff2","path":"lib/vazir-font/Vazir-Bold.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.eot","path":"lib/vazir-font/Vazir-Light.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.ttf","path":"lib/vazir-font/Vazir-Light.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.woff","path":"lib/vazir-font/Vazir-Light.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.woff2","path":"lib/vazir-font/Vazir-Light.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.eot","path":"lib/vazir-font/Vazir-Medium.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.ttf","path":"lib/vazir-font/Vazir-Medium.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.woff","path":"lib/vazir-font/Vazir-Medium.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.woff2","path":"lib/vazir-font/Vazir-Medium.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.eot","path":"lib/vazir-font/Vazir-Thin.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.ttf","path":"lib/vazir-font/Vazir-Thin.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.woff","path":"lib/vazir-font/Vazir-Thin.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.woff2","path":"lib/vazir-font/Vazir-Thin.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.eot","path":"lib/vazir-font/Vazir.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.ttf","path":"lib/vazir-font/Vazir.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.woff","path":"lib/vazir-font/Vazir.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.woff2","path":"lib/vazir-font/Vazir.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/vazir-font/font-face.css","path":"lib/vazir-font/font-face.css","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/css/all.min.css","path":"lib/font-awesome/css/all.min.css","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.eot","path":"lib/font-awesome/webfonts/fa-brands-400.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.svg","path":"lib/font-awesome/webfonts/fa-brands-400.svg","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.ttf","path":"lib/font-awesome/webfonts/fa-brands-400.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.woff","path":"lib/font-awesome/webfonts/fa-brands-400.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.woff2","path":"lib/font-awesome/webfonts/fa-brands-400.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.eot","path":"lib/font-awesome/webfonts/fa-regular-400.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.svg","path":"lib/font-awesome/webfonts/fa-regular-400.svg","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.ttf","path":"lib/font-awesome/webfonts/fa-regular-400.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.woff","path":"lib/font-awesome/webfonts/fa-regular-400.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.woff2","path":"lib/font-awesome/webfonts/fa-regular-400.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.eot","path":"lib/font-awesome/webfonts/fa-solid-900.eot","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.svg","path":"lib/font-awesome/webfonts/fa-solid-900.svg","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.ttf","path":"lib/font-awesome/webfonts/fa-solid-900.ttf","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.woff","path":"lib/font-awesome/webfonts/fa-solid-900.woff","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.woff2","path":"lib/font-awesome/webfonts/fa-solid-900.woff2","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/justified-gallery/css/justifiedGallery.min.css","path":"lib/justified-gallery/css/justifiedGallery.min.css","modified":0,"renderable":1},{"_id":"themes/cactus/source/lib/justified-gallery/js/jquery.justifiedGallery.min.js","path":"lib/justified-gallery/js/jquery.justifiedGallery.min.js","modified":0,"renderable":1},{"_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/css/apollo.css","path":"css/apollo.css","modified":0,"renderable":1},{"_id":"themes/apollo/source/scss/apollo.scss","path":"scss/apollo.scss","modified":0,"renderable":1}],"Cache":[{"_id":"source/.DS_Store","hash":"0fd915d713a298cca20a36e7532b2e9a9561e869","modified":1643801896000},{"_id":"source/.MWebMetaData/setting.json","hash":"63037ec4e43ae67cbe98b4f81451eef32dccf232","modified":1573529113000},{"_id":"source/CNAME","hash":"c53a99d8555292c2cc8dd02c564b9d5fdfed89cb","modified":1526396315000},{"_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-17-leetcode-121.md","hash":"62aa9ec2e2aa784728c189d4d7145ebab1380ae3","modified":1584442443000},{"_id":"source/_posts/2020-03-18-leetcode-206.md","hash":"c80133bf68fc993ddc24517da4bc226764ae2a40","modified":1584546252000},{"_id":"source/_posts/2020-03-23-leetcode-169.md","hash":"f193c41627501ed7235459d5ad40fd3d6ebf0a71","modified":1584976429000},{"_id":"source/_posts/2020-03-23-leetcode-225.md","hash":"aff4492c0c07d0d31b0313b5ef9378279233141b","modified":1584977724000},{"_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-26-leetcode-876.md","hash":"4905be27ad818ebc81d3938227d31d760c5631c4","modified":1585228750000},{"_id":"source/_posts/2020-03-29-leetcode-1013.md","hash":"4937a632273d945e4f258ef96d6ca8c2d8fe9f5b","modified":1585487711000},{"_id":"source/_posts/2020-03-29-leetcode-914.md","hash":"a0631cf342a08f5ff9ad4d0ca2bf8372dca60ecc","modified":1585493527000},{"_id":"source/_posts/2020-04-01-leetcode-1160.md","hash":"bb2daed56d6bfb2cd930afb2e3c9b0ebb6e597bd","modified":1585727826000},{"_id":"source/_posts/2020-03-30-leetcode-999.md","hash":"41bd6e2ce8483d5d158b88d28ee63ec1551ca10a","modified":1585573421000},{"_id":"source/_posts/2020-03-30-leetcode-1071.md","hash":"affa6c07b877b5fa46873eca5ca300db4f24efb6","modified":1585577057000},{"_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-01-leetcode-1103.md","hash":"c76f58bceaa6aafb010e7163f3ef893573c2a45f","modified":1586366247000},{"_id":"source/_posts/2020-04-09-leetcode-the-masseuse-lcci.md","hash":"914948de11976b4d0db287c5beb1f4e40b71f7a7","modified":1586366044000},{"_id":"source/_posts/2020-04-14-leetcode-add-two-numbers-ii.md","hash":"ebed1ea3f1229f6109e812cbb0f7e203f7312e0b","modified":1586878115000},{"_id":"source/_posts/2020-04-14-leetcode-design-twitter.md","hash":"f5e5079109ad996244e2cd9ed7a23976b6fd872c","modified":1586878174000},{"_id":"source/_posts/2020-04-16-leetcode-01-matrix.md","hash":"e29a270941ba47ad981089856d75640cc468f956","modified":1587011216000},{"_id":"source/_posts/2020-04-16-leetcode-merge-intervals.md","hash":"4c8e56c27ec095f80ab803a819c83d60ffb6c697","modified":1587036168000},{"_id":"source/_posts/2020-04-16-leetcode-string-to-integer-atoi.md","hash":"903c766c73dd8ed9d1baf081b113113eef0740fa","modified":1587038200000},{"_id":"source/_posts/2020-04-21-leetcode-number-of-islands.md","hash":"766d66e49da9072f4e8afa0229b744e9407eed7a","modified":1587446224000},{"_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-Note-1.md","hash":"843365f5f5b6142bba6ea900818d19848e3f070b","modified":1526396315000},{"_id":"source/_posts/Postgresql Partitioning.md","hash":"63d88ca7c739c3153d63c7ca0f03c7fbc6708bb0","modified":1573718510000},{"_id":"source/_posts/first-post.md","hash":"0cfe954d5b7b12d46dd20fe43e95835b89b30163","modified":1526396315000},{"_id":"source/_posts/Tastypie.md","hash":"9b9d53979b98fcdca24c2ad8dc8a78c1dc77a665","modified":1526396315000},{"_id":"themes/cactus/.gitignore","hash":"c5345a2c5fa6c136dbe2020a405e541b4755a259","modified":1586364490000},{"_id":"themes/cactus/.DS_Store","hash":"756a1af7848df24265ee385361483a08a155a16f","modified":1586364824000},{"_id":"themes/cactus/.jshintrc","hash":"2548bd6ce44422edc7e6f9f68061ab47f26c4f57","modified":1586364490000},{"_id":"themes/cactus/.stylintrc","hash":"eb5f48e83657928cb0cbee031373b2cd36ca0083","modified":1586364490000},{"_id":"themes/cactus/LICENSE","hash":"346ece39a983b0e7858c11f785cd846cef9eb875","modified":1586364490000},{"_id":"themes/cactus/package.json","hash":"a6060fadd36114d8cb74e7ff4c7d073901b5edcd","modified":1586364490000},{"_id":"themes/cactus/README.md","hash":"812091a58d1d20467eede2d8b3d7bcf0fc0e8a50","modified":1586364490000},{"_id":"themes/cactus/_config.yml","hash":"d8d12e022d9e23e1ccc0fd523e73215c137ba509","modified":1586365427000},{"_id":"themes/cactus/gulpfile.js","hash":"0e55606323a45873506c08be6528478c08373e1e","modified":1586364490000},{"_id":"themes/cactus/languages/de.yml","hash":"43b2f4e078b042aaae0377a4235216a51ed82e0d","modified":1586364490000},{"_id":"themes/cactus/languages/ca.yml","hash":"b79dd2c21dc6697c635e92db1f661a4b8d5d2305","modified":1586364490000},{"_id":"themes/cactus/languages/default.yml","hash":"703548ad90034d4e5207a27eb50f726dc27e4c0c","modified":1586364490000},{"_id":"themes/cactus/languages/en.yml","hash":"703548ad90034d4e5207a27eb50f726dc27e4c0c","modified":1586364490000},{"_id":"themes/cactus/languages/fa.yml","hash":"63f32e50953af1c4bd0308a4fca5862b5287c2cb","modified":1586364490000},{"_id":"themes/cactus/languages/es.yml","hash":"2b1fc8b0d636123e9ee39017fa20053bd1913a5a","modified":1586364490000},{"_id":"themes/cactus/languages/fr.yml","hash":"5c07406998f19d219a5a7b65c0d88b6b023f85b2","modified":1586364490000},{"_id":"themes/cactus/languages/it.yml","hash":"62800bcae1f2d2454f87f4bcf4d7593848424f61","modified":1586364490000},{"_id":"themes/cactus/languages/kr.yml","hash":"651fb83991c91b13b53ed55740e5402cf0f1c5e8","modified":1586364490000},{"_id":"themes/cactus/languages/nl.yml","hash":"ac0573352ad2c737a7686bcca498b985e7bd6447","modified":1586364490000},{"_id":"themes/cactus/languages/pl.yml","hash":"8a2d6dc874d86c38d42c2c861c39590647b5d536","modified":1586364490000},{"_id":"themes/cactus/languages/pt-br.yml","hash":"4859aba788a050c2d5d0b997693b0c8c24b349f7","modified":1586364490000},{"_id":"themes/cactus/languages/ru.yml","hash":"81b57fcd1977ef534f4bf303dbc1b4710cc7f057","modified":1586364490000},{"_id":"themes/cactus/languages/tr.yml","hash":"2702914007e6bade9d6861078c0e179ac05bf48c","modified":1586364490000},{"_id":"themes/cactus/languages/zh-TW.yml","hash":"2f4e050c9b35a67f4a7278cec3a949533c2ac16a","modified":1586364490000},{"_id":"themes/cactus/languages/zh-CN.yml","hash":"8f81faaad9a0615b09dbc23868484a55ec958f6f","modified":1586364490000},{"_id":"themes/cactus/languages/vi.yml","hash":"f84893c3ec3e45875c90069e14b17ed3016ed973","modified":1586364490000},{"_id":"themes/cactus/layout/layout.ejs","hash":"8504004f2ed78914f806c6699d9bd722318cbe56","modified":1586364490000},{"_id":"themes/cactus/layout/page.ejs","hash":"c5465d5315a7544aa466b01fd8cfb62917a8bb1d","modified":1586364490000},{"_id":"themes/cactus/layout/archive.ejs","hash":"53de8817e37be01b3ba8fa5ca31b9cafa2f3c011","modified":1586364490000},{"_id":"themes/cactus/scripts/merge-configs.js","hash":"2048c3415d96b17b9d84aa44bc0c25f1210525f8","modified":1586364490000},{"_id":"themes/cactus/scripts/meta.js","hash":"fa6055a39851c9953d033e70c1614547b94dce60","modified":1586364490000},{"_id":"themes/cactus/layout/index.ejs","hash":"1fd8aad25b2893a26b4483b91a341907e55c16be","modified":1586364490000},{"_id":"themes/cactus/scripts/page_title.js","hash":"fa662dbdb82779af1b95e35ed7ccdf4866a53dee","modified":1586364490000},{"_id":"themes/cactus/scripts/thumbnail.js","hash":"df8829fd8c3119650037eba5ec11bdce06acff9d","modified":1586364490000},{"_id":"themes/cactus/layout/post.ejs","hash":"a7d164ce888a60cd3eddd9c04bc6762428fa66bb","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/footer.ejs","hash":"116424c97ec87f0d8124095e73d458eb6f4f12a0","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/comments.ejs","hash":"4cf8d0059e5f8bc8ae1dd1a426293583fd398052","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/head.ejs","hash":"b7db191b7ad066b1f3f9c34d8a4b77e1ee815215","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/header.ejs","hash":"6b534801486f6baa989bd351915a9156b838b777","modified":1586364490000},{"_id":"themes/cactus/source/.DS_Store","hash":"ef18a83fb5d2b7d3a80bed260a120425acfd2d38","modified":1586364754000},{"_id":"themes/cactus/layout/_partial/pagination.ejs","hash":"23bf862b3b8a3cd831850504d9b5a24d21b005e7","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/scripts.ejs","hash":"18b9f77b9429722b54162add341e4d0b3de6a62a","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/search.ejs","hash":"8b4bf9cf5db0ce762a31fc3baae0f2fc004bece4","modified":1586364490000},{"_id":"themes/cactus/source/css/_extend.styl","hash":"b6a4e5905a7515dda66919167531a5ab2b3d1fe2","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/styles.ejs","hash":"be1b54388eb02176dd4722285dda19e3dce2e62e","modified":1586364490000},{"_id":"themes/cactus/source/css/_mixins.styl","hash":"1a9e309523df9685e8d088dcff0a809c58e2c392","modified":1586364490000},{"_id":"themes/cactus/source/css/_fonts.styl","hash":"354809b5a64e8a47a66c66fd1a28ac597c1460a6","modified":1586364490000},{"_id":"themes/cactus/source/css/_variables.styl","hash":"02079fb71b7d1c01d15fa512a1948ad4cbb416b5","modified":1586364490000},{"_id":"themes/cactus/source/css/rtl.styl","hash":"ff8700e1626feeb53d905a2df2777bda7d1eca50","modified":1586364490000},{"_id":"themes/cactus/source/css/style.styl","hash":"18b22cfdc7457d81db7694aef5850cc36ff87a77","modified":1586364490000},{"_id":"themes/cactus/source/css/_util.styl","hash":"2bfeb2e2605dd5235693b00c71a212646d2e0410","modified":1586364490000},{"_id":"themes/cactus/source/images/apple-touch-icon.png","hash":"57e2def34682655f41a0be2d083f16765ba7858b","modified":1586364490000},{"_id":"themes/cactus/source/images/favicon-192x192_1.png","hash":"96e6fcbbb13a5914a6131391e210eb7dfd13d692","modified":1586364490000},{"_id":"themes/cactus/source/images/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","modified":1526396315000},{"_id":"themes/cactus/source/images/favicon1.ico","hash":"189f9842bcb79a6f8f9e8445bc8bbd773443826b","modified":1586364490000},{"_id":"themes/cactus/source/images/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1526399879000},{"_id":"themes/cactus/layout/_partial/post/actions_mobile.ejs","hash":"79b234ff3c264e66b2e71c819228e62bf92b48e4","modified":1586364490000},{"_id":"themes/cactus/source/js/main.js","hash":"584c5a69ac81a483a1c4377a2e2cf326c2795e7b","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/post/actions_desktop.ejs","hash":"38aadd1ed890303dde582b722486138afee09b0a","modified":1586364490000},{"_id":"themes/cactus/source/js/search.js","hash":"62df6eeb66e002a600317a288e3f8fcd0e9c5492","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/post/date.ejs","hash":"6f2d1aa9562df343b797d25705f1945323c465fb","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/post/category.ejs","hash":"b5bfa049f17868fb09d9d2a7e1d5279fa0381d37","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/post/gallery.ejs","hash":"9aecd8908e8a684f33dc20c02497c0f1774137c7","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/post/share.ejs","hash":"1a294382bd14d979525b8ed934d807bc7d083e4d","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/post/title.ejs","hash":"a060f1c6e3718494a6b1d0e1981ea0bf4e549828","modified":1586364490000},{"_id":"themes/cactus/layout/_partial/post/tag.ejs","hash":"e08fae30da060f49c087f6c121868b08eb55c795","modified":1586364490000},{"_id":"themes/cactus/source/css/_colors/classic.styl","hash":"0f0ec41a4165814ce69688425d5ac4d701b7cc70","modified":1586364490000},{"_id":"themes/cactus/source/css/_colors/dark.styl","hash":"9c9655b42b85f754b8a573a1d4634c23c680e1bf","modified":1586364490000},{"_id":"themes/cactus/source/css/_colors/light.styl","hash":"d09f781cb02394850737b3a9efc6693307d5bf09","modified":1586364490000},{"_id":"themes/cactus/source/css/_colors/white.styl","hash":"2b25ad24573bded8b42f9d80112eab9fadbed1a5","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/arta.styl","hash":"b3e81e3e694ceb8deed178adb8b91013c5120e30","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/androidstudio.styl","hash":"2af0861725f97f0ee2ded67c3d2d4548c62b2d16","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/agate.styl","hash":"53027913ed8d4f75ac3e49e76aad824f0df62da3","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/arduino-light.styl","hash":"15e8572585cd708221c513dea4bdd89d8fe56c10","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-cave-dark.styl","hash":"ce63dd8548688d88254405eedfa75b1d7c82449e","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-dune-dark.styl","hash":"c196ff0ee064af0e507823694ae39020addfc280","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/ascetic.styl","hash":"32cff3bef6fac3760fe78f203096477052a90552","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-cave-light.styl","hash":"a5be0744a7ecf4a08f600ade4cfd555afc67bc15","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-estuary-dark.styl","hash":"0bb16a4eff93688f40787abc2f9e56e7d5cc93e7","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-estuary-light.styl","hash":"344276ca9b27e51d4c907f76afe5d13cf8e60bdf","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-dune-light.styl","hash":"931435fbc6f974e8ce9e32722680035d248a9dc1","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-forest-dark.styl","hash":"effbc5d75fa87203c847039869c22031b40d5b7d","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-heath-dark.styl","hash":"9a2e9a1d0a01bbdf158560c3ed1c134e098b2c68","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-forest-light.styl","hash":"95228d9f2102fad425536aac44b80b2cba1f5950","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-lakeside-dark.styl","hash":"10ee3882fca7b97a37bd309d2d35fce9868647bb","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-plateau-light.styl","hash":"d1a05fdd1ededc9063d181ab25bad55a164aeb4a","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-heath-light.styl","hash":"8c8c2e445abef85273be966d59770e9ced6aac21","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-lakeside-light.styl","hash":"2c54cb9bdb259ae3b5b29f63ac2469ed34b08578","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-plateau-dark.styl","hash":"84c80e6f67f62fce958d25817c277d2360272617","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-savanna-light.styl","hash":"f8244c93711c7cb59dd79d2df966806b30d171ea","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-sulphurpool-dark.styl","hash":"538a14321193cd8abf2ddc484306631e54149ffb","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-seaside-light.styl","hash":"0597342da6e2d0c5bdcc7d42dabb07322b1a4177","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-seaside-dark.styl","hash":"2edf385215bbe1985b1a10106525d362667d28c2","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-sulphurpool-light.styl","hash":"efa52713efc468abeeb2b9299704371583b857de","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/brown-papersq.png","hash":"3a1332ede3a75a3d24f60b6ed69035b72da5e182","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/color-brewer.styl","hash":"2a439d6214430e2f45dd4939b4dfe1fe1a20aa0f","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/brown-paper.styl","hash":"c2326ba20a5020a66ca7895258d18833327d4334","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/codepen-embed.styl","hash":"8b7b34484f76a6c2c3b1a9e49abb9b382f439ae8","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/darkula.styl","hash":"9717efa9194837ba3fb4d762997d33075dcf8bfa","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/docco.styl","hash":"b1c176378bb275f2e8caa759f36294e42d614bf1","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/far.styl","hash":"aaac3028f5e33123cd123a583cddc9290c45ec8e","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/dark.styl","hash":"f5e6e75958de59e87fc6be3a1668e870e20bc836","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/github-gist.styl","hash":"48211a03d33e7f7ada0b261162bea06676155a71","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/github.styl","hash":"3336aeba324c6d34a6fd41fef9b47bc598f7064c","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/googlecode.styl","hash":"bda816beee7b439814b514e6869dc678822be1bc","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/foundation.styl","hash":"bf8ddc94b4ad995b8b8805b5a4cf95004553fdac","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/highlightjs.styl","hash":"0e198b7a59191c7a39b641a4ddd22c948edb9358","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/hopscotch.styl","hash":"1378a6bc67a32c0cbff72ab771268b53f9aa586d","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/grayscale.styl","hash":"bf37d8b8d1e602126c51526f0cc28807440228ed","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/gruvbox-dark.styl","hash":"76b744c14fd5600bea64731c05df97c2df75523f","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/idea.styl","hash":"a02967cb51c16a34e0ee895d33ded2b823d35b21","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/hybrid.styl","hash":"b8eb5c69d12f2ee5ebc50265ae271699d7f1a8d3","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/kimbie.dark.styl","hash":"45dbb168f22d739d0109745d2decd66b5f94e786","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/atelier-savanna-dark.styl","hash":"e32c1c70def8060fce5e790979a126da650ac642","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/index.styl","hash":"002d5596f6379cc87dbd43d9145bc764aa666be1","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/ir-black.styl","hash":"53e5d74326a4527b92272bbd6946d4fec92720e8","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/mono-blue.styl","hash":"4c89a6ae29de67c0700585af82a60607e85df928","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/kimbie.light.styl","hash":"61f8baed25be05288c8604d5070afbcd9f183f49","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/kimbie.styl","hash":"51b889ca7c6fe178cfbbe28d875a6ea427184441","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/magula.styl","hash":"16d323f989b1420a0f72ef989242ece9bf17a456","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/monokai-sublime.styl","hash":"c385b11345894be7e6ce3c5f08663e199933b8e4","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/monokai.styl","hash":"f87be027848ea6bee623a08ad1e17b2f5b7937ee","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/paraiso-dark.styl","hash":"f1537bd868579fa018ecdbfd2eb922dcf3ba2cac","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/obsidian.styl","hash":"199e28326be8590883f0813ebbd54fcfaa4750fd","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/paraiso.styl","hash":"75f181eece6b71d033ea0c8d6cf00ae7efb9e29b","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/paraiso-light.styl","hash":"d224d1df0eb3395d9eea1344cee945c228af2911","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/railscasts.styl","hash":"b6674db9210e0c4444e4835fff2d1361f3ebd64c","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/rainbow.styl","hash":"c0cf97aae3e10fdcd10414547a711c9effbc39b8","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/pojoaque.jpg","hash":"c5fe6533b88b21f8d90d3d03954c6b29baa67791","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/pojoaque.styl","hash":"4e7b6b046b8575ac749f6aec4e953a62ada27a36","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/school-book.png","hash":"711ec983c874e093bb89eb77afcbdf6741fa61ee","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/solarized-dark.styl","hash":"90c9da5aa594383697e5b18892a7f95beb053f55","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/school-book.styl","hash":"d43560fe519a931ce6da7d57416d7aa148441b83","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/tomorrow-night-blue.styl","hash":"f24c17d0ab815dcfaab3438cb9fe2ab4839f5e0d","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/solarized-light.styl","hash":"aa0dd3fd25c464183b59c5575c9bee8756b397f2","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/sunburst.styl","hash":"af3eec0fd56151e55bbd49c31b151f36717611d8","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/tomorrow-night-bright.styl","hash":"7674fecb6d27350727dc0d2dc93bc018382ebbd0","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/tomorrow-night.styl","hash":"16ba09b2db501e4e3e2e7d62595d9bf935bf27c4","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/tomorrow.styl","hash":"15779cf6846725c7c35fc56cac39047d7e0aec1c","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/tomorrow-night-eighties.styl","hash":"28d751075ebabf7d0327a36f725076fe82fdf626","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/zenburn.styl","hash":"68ff9332ccc03f9389b15b713415cde016f8088f","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/xcode.styl","hash":"5e8532ae8366dcf6a4ef5e4813dc3d42ab3d0a50","modified":1586364490000},{"_id":"themes/cactus/source/css/_highlight/vs.styl","hash":"959a746f4b37aacb5d1d6ff1d57e0c045289d75d","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/categories.styl","hash":"a43f00e61b3507f130b8a3f8108a4eeca147c2a0","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/comments.styl","hash":"1e90f1fb9d4c155df518cacb5a537e9de9c042c1","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/archive.styl","hash":"ef8fc52337c4c7b010cad7c427cb78009b30f9d8","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/article.styl","hash":"c6a3c395ceb4aacba8c995bcde7b58a7ca501919","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/header.styl","hash":"519af79eb34ee922b48e6c19aa8f4856e3f76486","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/index.styl","hash":"59c99f4ea3a73bf47ce030df166c5e33d5de31fb","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/pagination.styl","hash":"950bf517bbe7adb9a9aa4eb5ddec74ffc7598787","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/footer.styl","hash":"14dda7f155bb21e6cd33ca3d8daa5b489b4707b3","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/tooltip.styl","hash":"2daff581ec3efaec840cbfdee512195919c32629","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/search.styl","hash":"159be002780c62a77f46947cf854a7342fba24f4","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/tags.styl","hash":"d571d5c7c960300d29c5f0ec3fe1140322ecd6b3","modified":1586364490000},{"_id":"themes/cactus/source/lib/clipboard/clipboard.min.js","hash":"ee60ca5ba9401456105ef703a98092369b579c80","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.woff","hash":"9e8d954c46eaad8b8234fa906e9a268ee354dced","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.woff2","hash":"f1c5d7523d21c2bf820d827c9d5df4184c3866dc","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.woff","hash":"9376516725e502f4375e06cc4fa7d940e2c93251","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.woff2","hash":"8d4810991aa94f958aff20a9cd381caf338e3061","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.woff","hash":"cba77d3d16f7565f9ea79bd7657f4e00c7fe851f","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.woff2","hash":"e520d5f6bf7ea3c1e4f2aef2abbbc6a6f9b697cb","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.woff2","hash":"976b7aa7c2c2c049c548a25b5914cfbda74b0453","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.woff","hash":"2e8e3c873e6d98acc3c10aa84997104b276e1e68","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.woff","hash":"f231111b3c778b7a5898ea88c0f150c0e72be468","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.woff2","hash":"baa42f95b41411b9aeaa6c7594e5ccee10d42ac4","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.woff","hash":"c798391d624b9bb44497a87ffc4f7eb52042dceb","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/font-face.css","hash":"2a95709b15ee45fc2328051038ceedddf83235bb","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.woff2","hash":"dc3c0ed67c9abb062b562e8553776f614d2946c2","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/post/actions_desktop.styl","hash":"ae3d9090bf4d934d443c0a431cb09d009743155a","modified":1586364490000},{"_id":"themes/cactus/source/css/_partial/post/actions_mobile.styl","hash":"0d2966c1d870392476864af8ee3ba312ba30cb82","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/css/all.min.css","hash":"703603273f5d5d52eb456d6385e1a68294fbd568","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.eot","hash":"3ad44eb5c276d1435408f253ca78da729a1aca90","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.ttf","hash":"114f35e6d9053caca2ef6d1e34fea3f87a59245b","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.woff","hash":"f3f0ea4847825806062a9b7a0f629671eb6b6408","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.woff2","hash":"830f8653e5f4a5331ac0b47c5701f65fe9f1bb32","modified":1586364490000},{"_id":"themes/cactus/source/lib/justified-gallery/css/justifiedGallery.min.css","hash":"92bb6e468a1db7fbd99ccb960e15e28572254263","modified":1586364490000},{"_id":"themes/cactus/source/lib/justified-gallery/js/jquery.justifiedGallery.min.js","hash":"82ab395176c927ffbb2f7c95132ee0a06cd5d64a","modified":1586364490000},{"_id":"themes/cactus/source/lib/jquery/jquery.min.js","hash":"88523924351bac0b5d560fe0c5781e2556e7693d","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.eot","hash":"603acd29416644e4b4fb8646abeada1865ba6869","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Black.ttf","hash":"23ee4a19421de9a0ca9dddc5435a8efe5bf28d87","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.eot","hash":"9ef82b07f3adad7d644c9c3a6d35a0c727bd64e8","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Bold.ttf","hash":"658c1da4f2a0124f6340058daa6873a86e6ba4fc","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.eot","hash":"32f51bf715663f5ca419e138617fc05f7055aef5","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Light.ttf","hash":"b2372b67b9519fb4fa8e05de6c0ddae56845ff79","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.eot","hash":"2c0ebb336dd012da8d575cae0ee4d048b65fe6e1","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.ttf","hash":"31cdbcc7215d01c9dd2beb8a28f8b7a7de75b9f4","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Medium.eot","hash":"17be9f699c30f0384004b46e991db8ac38a9992e","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir-Thin.ttf","hash":"d53fcc2e2d6c9c77613afcd34058be1b75bb0fef","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.eot","hash":"bd3a7cb9eb70d36b4cfba8c5a05d234aefeefe3c","modified":1586364490000},{"_id":"themes/cactus/source/lib/vazir-font/Vazir.ttf","hash":"c7a3f2f4d56c4c4ec69d395baf39b55198da0254","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.woff","hash":"91daac2bfba5e6a1a15ce44c53eab524d01c7fb0","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.woff2","hash":"f356aa2e4d9b7245985d312d3bfba180f774e3b7","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.ttf","hash":"f34ee061900ecd1ed3d3fd9f8f47f4e84c6d56bf","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.eot","hash":"d4987ee41e0e4142d561f76b8ea8e034c4d5d9d2","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-regular-400.svg","hash":"1622937e49766e21eacf4ac7065b711f0fe580e1","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.eot","hash":"be6b63d528286b1be2328d871c9bae95d8d57174","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.woff","hash":"61f40daca6978e6e7ab761e748c2dd9d236c7586","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.woff2","hash":"b2c74520c3f506efbfefca867918e5ae28bd5222","modified":1586364490000},{"_id":"themes/cactus/package-lock.json","hash":"0532b7d430d6fb7949574e484c443a6e49cd57f2","modified":1586364621000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.ttf","hash":"91b40a8f284159d9fff81dc522670ef68d562682","modified":1586364490000},{"_id":"themes/cactus/source/images/logo1.png","hash":"0e3029251dfda26adee2761f71377297e8c26871","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-BoldItalic.ttf","hash":"b7d24ab1e4fad720f31a2b0cca1904ce1740d846","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-BoldItalic.ttf","hash":"b542b9591fbf33925d93f0695b6e123a9f0cfd43","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-BoldItalic.ttf","hash":"926035f0156cccf1b0ca507347f39bf9c510f51e","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Italic.ttf","hash":"9a23c6898b0943bd3d96c04df9a0f66e919451d8","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Italic.ttf","hash":"93ebc5098cf57a32b7b8d297681f31692c09bdfa","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Bold.ttf","hash":"34f7db59f1d023294e69976aa20b7d52b86165a4","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGL-Regular.ttf","hash":"6c090d6bff3928fbf8a5f4104e58ed7f421aea7c","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Bold.ttf","hash":"58be4b7760e9a84daa81929d046f9a15c4fd1c1a","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGM-Regular.ttf","hash":"20ce1fc7ae1254558ca044ae48283faaa58897e5","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Italic.ttf","hash":"9d757cc9f928fc83b2133283dd639c12b11d94ad","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Bold.ttf","hash":"f9918fb93d6ab6850f5d38069a999c311af78816","modified":1586364490000},{"_id":"themes/cactus/source/lib/meslo-LG/MesloLGS-Regular.ttf","hash":"de559f8d70d5b1ab2810597bfd0b1b9506f3ef01","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-brands-400.svg","hash":"29e6c7e5a4d63d2c9563cd208456cb4f8a357868","modified":1586364490000},{"_id":"themes/cactus/source/lib/font-awesome/webfonts/fa-solid-900.svg","hash":"3a090431fdec61a25ed69b9e6f35a6656bde1595","modified":1586364490000},{"_id":"public/atom.xml","hash":"0e25bc11068585536a912e69be4229856dbb6af7","modified":1643806078381},{"_id":"public/sitemap.xml","hash":"3c734bc4b87ae2946d39391347d50e05c8442d74","modified":1643806078381},{"_id":"public/2020/04/01/leetcode-1160/index.html","hash":"8f469bd63daf27c7da251442d5f7ba2b504d6616","modified":1643806141607},{"_id":"public/2020/03/25/leetcode-836/index.html","hash":"8807f4b237fbce468b945e6edb39921e14c6552c","modified":1643806141607},{"_id":"public/2019/11/14/AWS-KMS/index.html","hash":"1ed394edc0e6d9dc203e26a1015329370f36201c","modified":1643806141607},{"_id":"public/2016/05/04/Tastypie/index.html","hash":"1834bfd3877af668ed0eca2e35a389e78599ea7e","modified":1643806141607},{"_id":"public/2016/02/12/first-post/index.html","hash":"2443d0627ef1a5150422dc663343b940a01237df","modified":1643806141607},{"_id":"public/archives/index.html","hash":"81b914cc3802e42ade0cc1230893516ac860382d","modified":1643806141607},{"_id":"public/archives/page/2/index.html","hash":"4775ee7f3f43e8286b27e5007f9eedab1727bda6","modified":1643806141607},{"_id":"public/archives/page/3/index.html","hash":"9a195bad710d321b8e67c05f1adb91b8c9272806","modified":1643806141607},{"_id":"public/archives/page/4/index.html","hash":"1ab9cbad55ffa1c089adbbfd04f2ceb0dc57ef8d","modified":1643806141607},{"_id":"public/archives/2016/index.html","hash":"1749c01364867910490bc83df7eb07494c94738e","modified":1643806141607},{"_id":"public/archives/2016/02/index.html","hash":"1e8afe6528d9ac283c63fca06a7cdb106494b327","modified":1643806141607},{"_id":"public/archives/2016/04/index.html","hash":"0c7df63fd74a120f715ebdd9ee6c99f10ad1c55d","modified":1643806141607},{"_id":"public/archives/2016/05/index.html","hash":"47ce0e0bf78a465959038f28513cfc33ec4668b0","modified":1643806141607},{"_id":"public/archives/2018/index.html","hash":"1ca8cd87f8c14c13f6124043e55346db31b19e71","modified":1643806141607},{"_id":"public/archives/2018/05/index.html","hash":"1ca8cd87f8c14c13f6124043e55346db31b19e71","modified":1643806141607},{"_id":"public/archives/2019/index.html","hash":"a22372a5ab8d10f61837ed8440aff3cb5235533f","modified":1643806141607},{"_id":"public/archives/2019/03/index.html","hash":"a3d4430a99e52f75e228941d977c72de93f15794","modified":1643806141607},{"_id":"public/archives/2019/11/index.html","hash":"2d78814814683d005f4e7cdd502500f2f8efa101","modified":1643806141607},{"_id":"public/archives/2020/index.html","hash":"23ed91004f74b33c0ab5f4fd527e8daaf7dfb361","modified":1643806141607},{"_id":"public/archives/2020/page/2/index.html","hash":"96832c8b5ec4f28a10a14a5215f8cc356d7e35c1","modified":1643806141607},{"_id":"public/archives/2020/page/3/index.html","hash":"a40327402fdfc9d2aa750c0a6a3556269ea79280","modified":1643806141607},{"_id":"public/archives/2020/03/index.html","hash":"4da3784358eb3b0e575b78b775a202fa666602c5","modified":1643806141607},{"_id":"public/archives/2020/03/page/2/index.html","hash":"1c315725ff26e66af21557615778fed5e69cfd74","modified":1643806141607},{"_id":"public/archives/2020/04/index.html","hash":"a7b500728bf65980780d09b3e1769906ec8404e8","modified":1643806141607},{"_id":"public/archives/2020/04/page/2/index.html","hash":"cfcfb92db535e9155a1af2436c9beff415b442ae","modified":1643806141607},{"_id":"public/index.html","hash":"a63a96f9eb123422b7d421c493277c65b248c12c","modified":1643806141607},{"_id":"public/page/2/index.html","hash":"c0838eca970fb5c3394b966b31471b7cca030c5f","modified":1643806141607},{"_id":"public/page/3/index.html","hash":"5460c74b13b72f1099b4a2793e40237b4c30e2f8","modified":1643806141607},{"_id":"public/page/4/index.html","hash":"fc50ea6020c4d6ea9522ec0f9517e8488d75542b","modified":1643806141607},{"_id":"public/categories/leetcode/index.html","hash":"af08ad58dff4adea2882a9e605d04e8842c1020a","modified":1643806141607},{"_id":"public/categories/leetcode/page/2/index.html","hash":"4d6487300c567a30ce87cafb3df10730acbab5ed","modified":1643806141607},{"_id":"public/categories/leetcode/page/3/index.html","hash":"090d4fa77d70076262436cdfa9fdf1eaa947d22e","modified":1643806141607},{"_id":"public/2020/04/21/leetcode-number-of-islands/index.html","hash":"ea6c137052db37c8fb0c918633840486ee53ed6d","modified":1643806141607},{"_id":"public/2020/04/16/leetcode-string-to-integer-atoi/index.html","hash":"1624977ae890bcc7e18e3d65359f5008abd25bdc","modified":1643806141607},{"_id":"public/2020/04/16/leetcode-merge-intervals/index.html","hash":"5ced27adefccc176e03113f5429c7f2acd3658a6","modified":1643806141607},{"_id":"public/2020/04/16/leetcode-01-matrix/index.html","hash":"20d6b013f76196432f12bf90920df0e1d1a713dd","modified":1643806141607},{"_id":"public/2020/04/14/leetcode-add-two-numbers-ii/index.html","hash":"763baaca67a29c97099737b3869045789889518e","modified":1643806141607},{"_id":"public/2020/04/14/leetcode-design-twitter/index.html","hash":"869aa55021adbaa1f49a08981f7bdb1cd3c3cd09","modified":1643806141607},{"_id":"public/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/index.html","hash":"8944afa7b922b7581dc48f565d0c0682e4e33b01","modified":1643806141607},{"_id":"public/2020/04/09/leetcode-the-masseuse-lcci/index.html","hash":"16fe763275cd1bf066930bccda5cddb1e50ceee1","modified":1643806141607},{"_id":"public/2020/04/01/leetcode-compress-string-lcci/index.html","hash":"b4a07de4caf11fffe6c463ef3506038678a5f99c","modified":1643806141607},{"_id":"public/2020/04/01/leetcode-1103/index.html","hash":"13cc17cd1e0a9ad4ee7f76762da0d8af5a0cd974","modified":1643806141607},{"_id":"public/2020/03/30/leetcode-1071/index.html","hash":"008f5776405472e600a006b0be5c3842de776f20","modified":1643806141607},{"_id":"public/2020/03/30/leetcode-999/index.html","hash":"811f0edfbd4f21d50ed0d6cef710820153cf9671","modified":1643806141607},{"_id":"public/2020/03/29/leetcode-914/index.html","hash":"50f0756572d56e086a0eb84a11130b0bca9745c7","modified":1643806141607},{"_id":"public/2020/03/29/leetcode-1013/index.html","hash":"ff3bcbf6ed6a12cccf01d515d03ad748dce63dda","modified":1643806141607},{"_id":"public/2020/03/26/leetcode-876/index.html","hash":"8806e63418a055f1e2e39ab317990c1be90cd2d2","modified":1643806141607},{"_id":"public/2020/03/25/leetcode-409/index.html","hash":"739cb7dc594462a134eae30e651b0111410c33eb","modified":1643806141607},{"_id":"public/2020/03/25/leetcode-543/index.html","hash":"0916b1136201a829609e0262e4974a34d771c76c","modified":1643806141607},{"_id":"public/2020/03/23/leetcode-225/index.html","hash":"31d532b186b06f41a82f001bce3d67405d27af79","modified":1643806141607},{"_id":"public/2020/03/23/leetcode-169/index.html","hash":"738d35b7ef0b0a134eb2e9e4422e440b4574162a","modified":1643806141607},{"_id":"public/2020/03/18/leetcode-206/index.html","hash":"fb260b8f1058a539f6d37bd02df9fb987d336b5c","modified":1643806141607},{"_id":"public/2020/03/17/leetcode-121/index.html","hash":"8e3206b45b09bdaa1cc366aaf1097817fd21523e","modified":1643806141607},{"_id":"public/2019/03/12/Postgresql-Partitioning/index.html","hash":"67da3bcc846e53b66b21dd2fa1b019b36328033c","modified":1643806141607},{"_id":"public/2018/05/31/bash-function-and-awk/index.html","hash":"344776516da52f5305719d3000f5221cd252649e","modified":1643806141607},{"_id":"public/2016/05/10/TastyPie-Note-1/index.html","hash":"418811bcf1457197d88e02cc40f656f84270c1eb","modified":1643806141607},{"_id":"public/2016/04/25/Django-Manager-Method/index.html","hash":"15ec602e90adfb5b89b390aad06c213ce2cedfc3","modified":1643806141607},{"_id":"public/2016/02/16/Flask-Day-2/index.html","hash":"f65806d8afd698a4690ab3d886077e204f3e377f","modified":1643806141607},{"_id":"public/2016/02/15/Flask-Day-1/index.html","hash":"bf7fc9b626b61764b7b6331a83ebeafc3eec4b19","modified":1643806141607},{"_id":"public/CNAME","hash":"c53a99d8555292c2cc8dd02c564b9d5fdfed89cb","modified":1643806078381},{"_id":"public/images/apple-touch-icon.png","hash":"57e2def34682655f41a0be2d083f16765ba7858b","modified":1643806078381},{"_id":"public/images/favicon-192x192_1.png","hash":"96e6fcbbb13a5914a6131391e210eb7dfd13d692","modified":1643806078381},{"_id":"public/images/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1643806078381},{"_id":"public/images/favicon1.ico","hash":"189f9842bcb79a6f8f9e8445bc8bbd773443826b","modified":1643806078381},{"_id":"public/images/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Black.woff2","hash":"f1c5d7523d21c2bf820d827c9d5df4184c3866dc","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Black.woff","hash":"9e8d954c46eaad8b8234fa906e9a268ee354dced","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Bold.woff2","hash":"8d4810991aa94f958aff20a9cd381caf338e3061","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Bold.woff","hash":"9376516725e502f4375e06cc4fa7d940e2c93251","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Light.woff","hash":"cba77d3d16f7565f9ea79bd7657f4e00c7fe851f","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Light.woff2","hash":"e520d5f6bf7ea3c1e4f2aef2abbbc6a6f9b697cb","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Medium.woff","hash":"2e8e3c873e6d98acc3c10aa84997104b276e1e68","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Medium.woff2","hash":"976b7aa7c2c2c049c548a25b5914cfbda74b0453","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Thin.woff","hash":"f231111b3c778b7a5898ea88c0f150c0e72be468","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Thin.woff2","hash":"baa42f95b41411b9aeaa6c7594e5ccee10d42ac4","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir.woff","hash":"c798391d624b9bb44497a87ffc4f7eb52042dceb","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir.woff2","hash":"dc3c0ed67c9abb062b562e8553776f614d2946c2","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.eot","hash":"3ad44eb5c276d1435408f253ca78da729a1aca90","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.ttf","hash":"114f35e6d9053caca2ef6d1e34fea3f87a59245b","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.woff","hash":"f3f0ea4847825806062a9b7a0f629671eb6b6408","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.woff2","hash":"830f8653e5f4a5331ac0b47c5701f65fe9f1bb32","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Black.eot","hash":"603acd29416644e4b4fb8646abeada1865ba6869","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Black.ttf","hash":"23ee4a19421de9a0ca9dddc5435a8efe5bf28d87","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Bold.eot","hash":"9ef82b07f3adad7d644c9c3a6d35a0c727bd64e8","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Bold.ttf","hash":"658c1da4f2a0124f6340058daa6873a86e6ba4fc","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Light.eot","hash":"32f51bf715663f5ca419e138617fc05f7055aef5","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Light.ttf","hash":"b2372b67b9519fb4fa8e05de6c0ddae56845ff79","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Medium.eot","hash":"17be9f699c30f0384004b46e991db8ac38a9992e","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Medium.ttf","hash":"31cdbcc7215d01c9dd2beb8a28f8b7a7de75b9f4","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Thin.eot","hash":"2c0ebb336dd012da8d575cae0ee4d048b65fe6e1","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir-Thin.ttf","hash":"d53fcc2e2d6c9c77613afcd34058be1b75bb0fef","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir.eot","hash":"bd3a7cb9eb70d36b4cfba8c5a05d234aefeefe3c","modified":1643806078381},{"_id":"public/lib/vazir-font/Vazir.ttf","hash":"c7a3f2f4d56c4c4ec69d395baf39b55198da0254","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.woff","hash":"91daac2bfba5e6a1a15ce44c53eab524d01c7fb0","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.woff2","hash":"f356aa2e4d9b7245985d312d3bfba180f774e3b7","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.woff","hash":"61f40daca6978e6e7ab761e748c2dd9d236c7586","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.woff2","hash":"b2c74520c3f506efbfefca867918e5ae28bd5222","modified":1643806078381},{"_id":"public/js/main.js","hash":"584c5a69ac81a483a1c4377a2e2cf326c2795e7b","modified":1643806078381},{"_id":"public/css/rtl.css","hash":"9589fac02a34fd9084f805f801889028756bbb65","modified":1643806078381},{"_id":"public/js/search.js","hash":"62df6eeb66e002a600317a288e3f8fcd0e9c5492","modified":1643806078381},{"_id":"public/lib/clipboard/clipboard.min.js","hash":"ee60ca5ba9401456105ef703a98092369b579c80","modified":1643806078381},{"_id":"public/lib/vazir-font/font-face.css","hash":"2a95709b15ee45fc2328051038ceedddf83235bb","modified":1643806078381},{"_id":"public/lib/justified-gallery/css/justifiedGallery.min.css","hash":"92bb6e468a1db7fbd99ccb960e15e28572254263","modified":1643806078381},{"_id":"public/css/style.css","hash":"68a6ef22062706e8edcd72f3dd3c3fccf8bb0acf","modified":1643806078381},{"_id":"public/lib/jquery/jquery.min.js","hash":"88523924351bac0b5d560fe0c5781e2556e7693d","modified":1643806078381},{"_id":"public/lib/font-awesome/css/all.min.css","hash":"703603273f5d5d52eb456d6385e1a68294fbd568","modified":1643806078381},{"_id":"public/lib/justified-gallery/js/jquery.justifiedGallery.min.js","hash":"82ab395176c927ffbb2f7c95132ee0a06cd5d64a","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.eot","hash":"d4987ee41e0e4142d561f76b8ea8e034c4d5d9d2","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.ttf","hash":"f34ee061900ecd1ed3d3fd9f8f47f4e84c6d56bf","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-regular-400.svg","hash":"1622937e49766e21eacf4ac7065b711f0fe580e1","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.eot","hash":"be6b63d528286b1be2328d871c9bae95d8d57174","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.ttf","hash":"91b40a8f284159d9fff81dc522670ef68d562682","modified":1643806078381},{"_id":"public/images/logo1.png","hash":"0e3029251dfda26adee2761f71377297e8c26871","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGL-BoldItalic.ttf","hash":"b7d24ab1e4fad720f31a2b0cca1904ce1740d846","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGM-BoldItalic.ttf","hash":"b542b9591fbf33925d93f0695b6e123a9f0cfd43","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGS-BoldItalic.ttf","hash":"926035f0156cccf1b0ca507347f39bf9c510f51e","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGL-Italic.ttf","hash":"9a23c6898b0943bd3d96c04df9a0f66e919451d8","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGM-Italic.ttf","hash":"93ebc5098cf57a32b7b8d297681f31692c09bdfa","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGS-Italic.ttf","hash":"9d757cc9f928fc83b2133283dd639c12b11d94ad","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGL-Bold.ttf","hash":"34f7db59f1d023294e69976aa20b7d52b86165a4","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGM-Bold.ttf","hash":"58be4b7760e9a84daa81929d046f9a15c4fd1c1a","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGL-Regular.ttf","hash":"6c090d6bff3928fbf8a5f4104e58ed7f421aea7c","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGM-Regular.ttf","hash":"20ce1fc7ae1254558ca044ae48283faaa58897e5","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGS-Bold.ttf","hash":"f9918fb93d6ab6850f5d38069a999c311af78816","modified":1643806078381},{"_id":"public/lib/meslo-LG/MesloLGS-Regular.ttf","hash":"de559f8d70d5b1ab2810597bfd0b1b9506f3ef01","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-brands-400.svg","hash":"29e6c7e5a4d63d2c9563cd208456cb4f8a357868","modified":1643806078381},{"_id":"public/lib/font-awesome/webfonts/fa-solid-900.svg","hash":"3a090431fdec61a25ed69b9e6f35a6656bde1595","modified":1643806078381},{"_id":"themes/apollo/.gitignore","hash":"a006beea0877a0aa3610ee00e73f62cb1d45125b","modified":1526396315000},{"_id":"themes/apollo/.DS_Store","hash":"13b009303b30410ac745affa15af9f745c21ee18","modified":1643804650000},{"_id":"themes/apollo/LICENSE","hash":"6e31ac9076bfc8f09ae47977419eee4edfb63e5b","modified":1526396315000},{"_id":"themes/apollo/README.md","hash":"a6930c691c69ed78584022fbcd0f4245587d09f5","modified":1526396315000},{"_id":"themes/apollo/package.json","hash":"9426138c09ebb95969021d951590c0c54b187a43","modified":1526396315000},{"_id":"themes/apollo/_config.yml","hash":"377274354f711554647da8bc1b14f503bb88f30a","modified":1643801181000},{"_id":"themes/apollo/gulpfile.js","hash":"857a026b6643a2cd52c65d4ae0dc7fe9618206ee","modified":1526396315000},{"_id":"themes/apollo/doc/doc-zh.md","hash":"3aad2ed65922f6f5dd9731301195474d16a8a9be","modified":1526396315000},{"_id":"themes/apollo/doc/doc-en.md","hash":"1bccce1d01f085aedcb01317d2db23ca61351f13","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/languages/zh-cn.yml","hash":"9e4b03e14c094000257ea254fd660dde4c7af63c","modified":1526396315000},{"_id":"themes/apollo/layout/post.jade","hash":"33ab46ab3736e5d51388939858647942ce375b9b","modified":1526396315000},{"_id":"themes/apollo/source/.DS_Store","hash":"66d61162ad1404b19cf509935337bfadc555f698","modified":1643805487000},{"_id":"themes/apollo/source/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1526399879000},{"_id":"themes/apollo/source/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","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/comment.jade","hash":"ff0a2c269c2434da2ac5529872f1d6184a71f96d","modified":1526396315000},{"_id":"themes/apollo/layout/partial/copyright.jade","hash":"2e2ee43c7241279a32b8c1386a2dea1409ef0e1c","modified":1526396315000},{"_id":"themes/apollo/layout/partial/layout.jade","hash":"d596c281bbba02cf8837f25f8ac0ac06e3d10e72","modified":1526396315000},{"_id":"themes/apollo/layout/partial/head.jade","hash":"51b2ba6a1cebb275730eb7131eea211c91f0986a","modified":1526396315000},{"_id":"themes/apollo/layout/partial/nav.jade","hash":"c35d3061da4b053b73150d9741c542d660798270","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/source/scss/apollo.scss","hash":"2f0ecd6ea1fec0aad4097dcb509b5ed5d1badd5c","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/copyright.scss","hash":"7fc843c37a4dbf9f6e70770398841a73465ec642","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/base.scss","hash":"88b361e68475caddbab763feed5e1db788ac2cd7","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/normalize.scss","hash":"fd0b27bed6f103ea95b08f698ea663ff576dbcf1","modified":1526396315000},{"_id":"themes/apollo/source/scss/_partial/post.scss","hash":"3ba64c410edd07e7bf5e9900d9ad9d76f2ff5828","modified":1526396315000},{"_id":"public/scss/apollo.scss","hash":"2f0ecd6ea1fec0aad4097dcb509b5ed5d1badd5c","modified":1643806141607},{"_id":"public/logo.png","hash":"42de93a9e76ef2a1a3e42526169a9d1c844a3f5d","modified":1643806141607},{"_id":"public/favicon.png","hash":"a72e4ae6672cdf2b1e3b018bbca3e3911771d873","modified":1643806141607},{"_id":"public/css/apollo.css","hash":"3769b55e027697d6d163ddf82b664b16c767ba9c","modified":1643806141607}],"Category":[{"name":"leetcode","_id":"ckz5jp4ek000406bu75n353r6"}],"Data":[],"Page":[],"Post":[{"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":"ckz5jp4ed000006bubw7dc4x0","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\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\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\n\n\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\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\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\n\n\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":"ckz5jp4eh000106bug1lkgscw","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-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":"ckz5jp4ei000206bu9ihe546j","content":"

121. 买卖股票的最佳时机

题目

\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
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\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\n\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\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":"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":"ckz5jp4ej000306bu7wmw0ixc","content":"

206. 反转链表

题目

\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
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

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

\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\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\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\n\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

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

\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\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\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-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":"ckz5jp4el000506buepplezim","content":"

169. 多数元素

题目

\n\n\n\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\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\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\n\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\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\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-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":"ckz5jp4em000606bucmwi4201","content":"

225. 用队列实现栈

题目

\n\n\n\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\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-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":"ckz5jp4en000706bu5sima4rw","content":"

409. 最长回文串

题目

\n\n\n\n\n\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\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":"ckz5jp4eo000906bu3vey615r","content":"

543. 二叉树的直径

题目

\n\n\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
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\n\n\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\n\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\n\n\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":"ckz5jp4ep000a06bu919m5okb","content":"

836. 矩形重叠

题目

\n\n\n\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\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-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":"ckz5jp4eq000d06buc4l8dt1y","content":"

876. 链表的中间结点

题目

\n\n\n\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\n\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\n\n\n\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\n\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-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":"ckz5jp4er000f06bu4wd90wvr","content":"

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

题目

\n\n\n\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\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-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":"ckz5jp4es000h06bu7ejv64za","content":"

914. 卡牌分组

题目

\n\n\n\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\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":"ckz5jp4es000j06bueoh9d45t","content":"

1071. 字符串的最大公因子

题目

\n\n\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
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\n\n\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\n\n\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":"ckz5jp4et000l06bu48331vg9","content":"

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

题目

\n\n\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
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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\n\n\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
42
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\n\n\n

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

"},{"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":"ckz5jp4et000n06buf90af6uw","content":"

1160. 拼写单词

题目

\n\n\n\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\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-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":"ckz5jp4eu000p06bu1msh1j2y","content":"

1103. 分糖果 II

题目

\n\n\n\n\n

小学奥数题。主要思路就是等差数列求和 $\\cfrac{(首项 + 末项)×项数}{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
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":"

小学奥数题。主要思路就是等差数列求和 $\\cfrac{(首项 + 末项)×项数}{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
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,
"},{"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":"ckz5jp4ev000r06bu4tfwh2lm","content":"

面试题 01.06. 字符串压缩

题目

\n\n\n\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\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":"ckz5jp4ev000t06bu5pud8ubs","content":"

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

题目

\n\n\n\n\n

又是小学奥数。由等差数列求和公式$\\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\\sqrt{2×target} + 1$。

\n

由小到大遍历 $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":"

又是小学奥数。由等差数列求和公式$\\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\\sqrt{2×target} + 1$。

\n

由小到大遍历 $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
"},{"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":"ckz5jp4ew000v06bu1vkmeymd","content":"

面试题 17.16. 按摩师

题目

\n\n\n\n\n

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

\n

那很显然,由于不能接受相邻两个预约,$dp[i][1] = dp[i-1][0] + nums_i$

\n

不接受当前预约的话,上一个预约接不接受都可以,$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$

\n

最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$

\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\n\n

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

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

面试题 17.16. 按摩师

题目

","more":"

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

\n

那很显然,由于不能接受相邻两个预约,$dp[i][1] = dp[i-1][0] + nums_i$

\n

不接受当前预约的话,上一个预约接不接受都可以,$dp[i][0] = max(dp[i-1][0], dp[i-1][1])$

\n

最后只要比较两种情况即可 $max(dp[i][0], dp[i][1])$

\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\n\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":"ckz5jp4ew000x06bu0uf34mxy","content":"

445. 两数相加 II

题目

\n\n\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
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\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

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

\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\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

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

"},{"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":"ckz5jp4ex000z06bu9tny14ki","content":"

355. 设计推特

题目

\n\n\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\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-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":"ckz5jp4ex001106bu206u6p4j","content":"

542. 01 矩阵

题目

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

    \n
  4. \n
"},{"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":"ckz5jp4ey001306bu4c1i8oh9","content":"

56. 合并区间

题目

\n\n\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 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\n\n\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-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":"ckz5jp4ez001506buelvh4zsh","content":"

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

题目

\n\n\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
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\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":"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\n\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\n\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":"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":"ckz5jp4f0001906buajnqc4xt","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\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\n\n\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\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\n\n\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":"ckz5jp4f0001b06buahre6urw","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\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\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\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\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\n

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

\n
1
$ chmod a+x run.py
\n\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\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\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\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\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\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\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\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\n

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

\n
1
$ chmod a+x run.py
\n\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\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\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\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":"ckz5jp4f1001d06bu3hinek4a","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\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\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\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\n\n\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\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\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\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\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\n\n\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\n"},{"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":"ckz5jp4f1001f06bucv4vaiul","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":"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":"ckz5jp4f2001h06buhylj8wa3","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"},{"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":"ckz5jp4f2001j06bu8i8u14qr","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":"ckz5jp4f3001l06bug0sehfcn","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"}],"PostAsset":[],"PostCategory":[{"post_id":"ckz5jp4em000606bucmwi4201","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4eq000b06bu4mxq2sr2"},{"post_id":"ckz5jp4ei000206bu9ihe546j","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4er000e06buhg3y6agh"},{"post_id":"ckz5jp4en000706bu5sima4rw","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4er000g06bu0xpe1176"},{"post_id":"ckz5jp4eo000906bu3vey615r","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4es000i06bu9y3j2jzn"},{"post_id":"ckz5jp4ej000306bu7wmw0ixc","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4et000k06bu4syvd3x8"},{"post_id":"ckz5jp4ep000a06bu919m5okb","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4et000m06bu7oayaupt"},{"post_id":"ckz5jp4eq000d06buc4l8dt1y","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4eu000o06bua47y2zhd"},{"post_id":"ckz5jp4el000506buepplezim","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4eu000q06buhgbi1e2m"},{"post_id":"ckz5jp4er000f06bu4wd90wvr","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4ev000s06bu6try7obu"},{"post_id":"ckz5jp4es000h06bu7ejv64za","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4ew000u06bu1rfh4h2e"},{"post_id":"ckz5jp4es000j06bueoh9d45t","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4ew000w06buepvuahoj"},{"post_id":"ckz5jp4et000l06bu48331vg9","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4ex000y06bubme916p1"},{"post_id":"ckz5jp4et000n06buf90af6uw","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4ex001006bu8rioe7ik"},{"post_id":"ckz5jp4eu000p06bu1msh1j2y","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4ey001206bu1n1d4oag"},{"post_id":"ckz5jp4ev000r06bu4tfwh2lm","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4ey001406bu8xiqbp6c"},{"post_id":"ckz5jp4ev000t06bu5pud8ubs","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4ez001606bu9zu71hx9"},{"post_id":"ckz5jp4ew000v06bu1vkmeymd","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4ez001806bu9tdp5243"},{"post_id":"ckz5jp4ew000x06bu0uf34mxy","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4f0001a06bu92w3ga6b"},{"post_id":"ckz5jp4ex000z06bu9tny14ki","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4f1001c06bu4zbdgtp5"},{"post_id":"ckz5jp4ex001106bu206u6p4j","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4f1001e06bu3615h7fq"},{"post_id":"ckz5jp4ey001306bu4c1i8oh9","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4f2001g06bu2weo00up"},{"post_id":"ckz5jp4ez001506buelvh4zsh","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4f2001i06buddhk9ju5"},{"post_id":"ckz5jp4ez001706bucs5fe377","category_id":"ckz5jp4ek000406bu75n353r6","_id":"ckz5jp4f3001k06buah8d7ki1"}],"PostTag":[],"Tag":[]}} \ No newline at end of file diff --git a/package-lock.json b/package-lock.json index b2d5d3c..a3b1333 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,352 +1,4967 @@ { - "name": "hexo-site", - "version": "0.0.0", - "lockfileVersion": 1, + "name": "tunpok", + "version": "1.0.0", + "lockfileVersion": 2, "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" + "packages": { + "": { + "name": "tunpok", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "hexo": "^6.0.0", + "hexo-browsersync": "^0.3.0", + "hexo-cli": "^4.3.0", + "hexo-deployer-rsync": "^1.0.0", + "hexo-generator-archive": "^1.0.0", + "hexo-generator-category": "^1.0.0", + "hexo-generator-feed": "^3.0.0", + "hexo-generator-index": "^2.0.0", + "hexo-generator-sitemap": "^2.2.0", + "hexo-generator-tag": "^1.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-renderer-jade": "^0.5.0", + "hexo-renderer-marked": "^5.0.0", + "hexo-renderer-stylus": "^2.0.0", + "hexo-server": "^3.0.0", + "hexo-theme-landscape": "^0.0.3" + }, + "devDependencies": {} + }, + "node_modules/@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==", + "engines": { + "node": ">= 10" } }, - "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=" + "node_modules/@types/babel-types": { + "version": "7.0.11", + "resolved": "https://registry.npmmirror.com/@types/babel-types/-/babel-types-7.0.11.tgz", + "integrity": "sha512-pkPtJUUY+Vwv6B1inAz55rQvivClHJxc9aVEPPmaq2cbyeMLCiDpbKpcKyX4LAwpNGi+SHBv0tHv6+0gXv0P2A==" }, - "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 + "node_modules/@types/babylon": { + "version": "6.16.6", + "resolved": "https://registry.npmmirror.com/@types/babylon/-/babylon-6.16.6.tgz", + "integrity": "sha512-G4yqdVlhr6YhzLXFKy5F7HtRBU8Y23+iWy7UKthMq/OSQnL1hbsoeXESQ2LY8zEDlknipDG3nRGhUC9tkwvy/w==", + "dependencies": { + "@types/babel-types": "*" + } }, - "abbrev": { + "node_modules/a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "node_modules/abab": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "node_modules/abbrev": { "version": "1.1.1", - "resolved": "https://registry.npm.taobao.org/abbrev/download/abbrev-1.1.1.tgz", - "integrity": "sha1-+PLIh60Qv2f2NPAFtph/7TF5qsg=" + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" }, - "acorn": { - "version": "2.7.0", - "resolved": "https://registry.npm.taobao.org/acorn/download/acorn-2.7.0.tgz", - "integrity": "sha1-q259nYhqrKiwhbwzEreaGYQz8Oc=", - "optional": true + "node_modules/accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "dependencies": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + }, + "engines": { + "node": ">= 0.6" + } }, - "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": { + "node_modules/acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "dependencies": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + } + }, + "node_modules/acorn-globals/node_modules/acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/after": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/after/-/after-0.8.2.tgz", + "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==" + }, + "node_modules/agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "dependencies": { + "debug": "4" + }, + "engines": { + "node": ">= 6.0.0" + } + }, + "node_modules/align-text": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", + "dependencies": { + "kind-of": "^3.0.2", + "longest": "^1.0.1", + "repeat-string": "^1.5.2" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==", + "engines": { + "node": ">=0.4.2" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/anymatch": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/archy": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" + }, + "node_modules/argparse": { + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", + "dependencies": { + "sprintf-js": "~1.0.2" + } + }, + "node_modules/arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmmirror.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" + }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, + "node_modules/async": { + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" + }, + "node_modules/async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" + }, + "node_modules/atob": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==", + "bin": { + "atob": "bin/atob.js" + }, + "engines": { + "node": ">= 4.5.0" + } + }, + "node_modules/axios": { + "version": "0.21.4", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", + "dependencies": { + "follow-redirects": "^1.14.0" + } + }, + "node_modules/babel-runtime": { + "version": "6.26.0", + "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", + "dependencies": { + "core-js": "^2.4.0", + "regenerator-runtime": "^0.11.0" + } + }, + "node_modules/babel-types": { + "version": "6.26.0", + "resolved": "https://registry.npmmirror.com/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", + "dependencies": { + "babel-runtime": "^6.26.0", + "esutils": "^2.0.2", + "lodash": "^4.17.4", + "to-fast-properties": "^1.0.3" + } + }, + "node_modules/babylon": { + "version": "6.18.0", + "resolved": "https://registry.npmmirror.com/babylon/-/babylon-6.18.0.tgz", + "integrity": "sha512-q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==", + "bin": { + "babylon": "bin/babylon.js" + } + }, + "node_modules/backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "node_modules/base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==", + "engines": { + "node": ">= 0.6.0" + } + }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, + "node_modules/basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", + "dependencies": { + "safe-buffer": "5.1.2" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/batch": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, + "node_modules/binary-extensions": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==", + "engines": { + "node": ">=8" + } + }, + "node_modules/blob": { + "version": "0.0.5", + "resolved": "https://registry.npmmirror.com/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" + }, + "node_modules/bluebird": { + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" + }, + "node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/braces": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", + "dependencies": { + "fill-range": "^7.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" + }, + "node_modules/browser-sync": { + "version": "2.27.7", + "resolved": "https://registry.npmmirror.com/browser-sync/-/browser-sync-2.27.7.tgz", + "integrity": "sha512-9ElnnA/u+s2Jd+IgY+2SImB+sAEIteHsMG0NR96m7Ph/wztpvJCUpyC2on1KqmG9iAp941j+5jfmd34tEguGbg==", + "dependencies": { + "browser-sync-client": "^2.27.7", + "browser-sync-ui": "^2.27.7", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "3.1.0", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.4.0", + "ua-parser-js": "1.0.2", + "yargs": "^15.4.1" + }, + "bin": { + "browser-sync": "dist/bin.js" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/browser-sync-client": { + "version": "2.27.7", + "resolved": "https://registry.npmmirror.com/browser-sync-client/-/browser-sync-client-2.27.7.tgz", + "integrity": "sha512-wKg9UP9a4sCIkBBAXUdbkdWFJzfSAQizGh+nC19W9y9zOo9s5jqeYRFUUbs7x5WKhjtspT+xetVp9AtBJ6BmWg==", + "dependencies": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/browser-sync-ui": { + "version": "2.27.7", + "resolved": "https://registry.npmmirror.com/browser-sync-ui/-/browser-sync-ui-2.27.7.tgz", + "integrity": "sha512-Bt4OQpx9p18OIzk0KKyu7jqlvmjacasUlk8ARY3uuIyiFWSBiRgr2i6XY8dEMF14DtbooaEBOpHEu9VCYvMcCw==", + "dependencies": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.4.0", + "stream-throttle": "^0.1.3" + } + }, + "node_modules/browser-sync/node_modules/connect": { + "version": "3.6.6", + "resolved": "https://registry.npmmirror.com/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/browser-sync/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/browser-sync/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/browser-sync/node_modules/finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/browser-sync/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/browser-sync/node_modules/http-errors/node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/browser-sync/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/browser-sync/node_modules/mime": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==", + "bin": { + "mime": "cli.js" + } + }, + "node_modules/browser-sync/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/browser-sync/node_modules/send": { + "version": "0.16.2", + "resolved": "https://registry.npmmirror.com/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/browser-sync/node_modules/send/node_modules/statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/browser-sync/node_modules/serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/browser-sync/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/browser-sync/node_modules/statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==" + }, + "node_modules/bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw==" + }, + "node_modules/bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "dependencies": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "node_modules/camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "dependencies": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "node_modules/camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", + "engines": { + "node": ">=6" + } + }, + "node_modules/center-align": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", + "dependencies": { + "align-text": "^0.1.3", + "lazy-cache": "^1.0.3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/character-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/character-parser/-/character-parser-1.2.1.tgz", + "integrity": "sha512-6OEBVBlf/y8LaAphnbAnt743O3zMhlBer+FO5D40H6wqAdU9B1TvuApkejgLW0cvv0tEZNLktv1AnRI+C87ueQ==" + }, + "node_modules/chokidar": { + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==", + "dependencies": { + "commander": "2.8.x", + "source-map": "0.4.x" + }, + "bin": { + "cleancss": "bin/cleancss" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/clean-css/node_modules/commander": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.8.1.tgz", + "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", + "dependencies": { + "graceful-readlink": ">= 1.0.0" + }, + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/clean-css/node_modules/source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } + }, + "node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/command-exists": { + "version": "1.2.9", + "resolved": "https://registry.npmmirror.com/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" + }, + "node_modules/commander": { + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==", + "engines": { + "node": ">= 6" + } + }, + "node_modules/component-bind": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" + }, + "node_modules/component-emitter": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" + }, + "node_modules/component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" + }, + "node_modules/compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", + "dependencies": { + "mime-db": ">= 1.43.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/compression": { + "version": "1.7.4", + "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", + "dependencies": { + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/compression/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/compression/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "node_modules/connect": { + "version": "3.7.0", + "resolved": "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "dependencies": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==", + "engines": { + "node": ">=0.8" + } + }, + "node_modules/connect-injector": { + "version": "0.4.4", + "resolved": "https://registry.npmmirror.com/connect-injector/-/connect-injector-0.4.4.tgz", + "integrity": "sha512-hdBG8nXop42y2gWCqOV8y1O3uVk4cIU+SoxLCPyCUKRImyPiScoNiSulpHjoktRU1BdI0UzoUdxUa87thrcmHw==", + "dependencies": { + "debug": "^2.0.0", + "q": "^1.0.1", + "stream-buffers": "^0.2.3", + "uberproto": "^1.1.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/connect-injector/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect-injector/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/connect/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/connect/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/constantinople": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/constantinople/-/constantinople-3.0.2.tgz", + "integrity": "sha512-UnEggAQrmhxuTxlb7n1OsTtagNXWUv2CRlOogZhWOU4jLK4EJEbF8UDSNxuGu+jVtWNtO2j51ab2H1wlBIzF/w==", + "deprecated": "Please update to at least constantinople 3.1.1", + "dependencies": { "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=", + "node_modules/constantinople/node_modules/acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==", + "deprecated": "core-js@<3.4 is no longer maintained and not recommended for usage due to the number of issues. Because of the V8 engine whims, feature detection in old core-js versions could cause a slowdown up to 100x even if nothing is polyfilled. Please, upgrade your dependencies to the actual version of core-js.", + "hasInstallScript": true + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/css": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "dependencies": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "node_modules/css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha512-OI38lO4JQQX2GSisTqwiSFxiWNmLajXdW4tCCxAuiwGKjusHALQadSHBSxGlU8lrFp47IkLuU2AfSYz31qpETQ==" + }, + "node_modules/css-stringify": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/css-stringify/-/css-stringify-1.0.5.tgz", + "integrity": "sha512-aIThpcErhG5EyHorGqNlTh0TduNBqLrrXLO3x5rku3ZKBxuVfY+T7noyM2G2X/01iQANqJUb6d3+FLoa+N7Xwg==" + }, + "node_modules/cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "node_modules/cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "dependencies": { + "cssom": "~0.3.6" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cssstyle/node_modules/cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + }, + "node_modules/cuid": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/cuid/-/cuid-2.1.8.tgz", + "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==" + }, + "node_modules/data-urls": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-3.0.1.tgz", + "integrity": "sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==", + "dependencies": { + "abab": "^2.0.3", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/debug": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "node_modules/decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "node_modules/deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==", + "engines": { + "node": ">=8" + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "node_modules/dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==", + "bin": { + "dev-ip": "lib/dev-ip.js" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "node_modules/doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + }, + "node_modules/dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "node_modules/domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "node_modules/domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "dependencies": { + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "dependencies": { + "domelementtype": "^2.2.0" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/dompurify": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-2.3.5.tgz", + "integrity": "sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==" + }, + "node_modules/domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "dependencies": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "node_modules/easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "dependencies": { + "lodash": "^4.17.10" + }, + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/eazy-logger": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/eazy-logger/-/eazy-logger-3.1.0.tgz", + "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "dependencies": { + "tfunk": "^4.0.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "node_modules/ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "dependencies": { + "jake": "^10.6.1" + }, + "bin": { + "ejs": "bin/cli.js" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "node_modules/encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/engine.io": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/engine.io-client": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-3.5.2.tgz", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", + "dependencies": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", + "yeast": "0.1.2" + } + }, + "node_modules/engine.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/engine.io-client/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/engine.io-client/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmmirror.com/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "dependencies": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "node_modules/engine.io/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "7.4.6", + "resolved": "https://registry.npmmirror.com/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "engines": { + "node": ">=8.3.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "node_modules/escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "node_modules/fast-equals": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/fast-equals/-/fast-equals-2.0.4.tgz", + "integrity": "sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w==" + }, + "node_modules/fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "node_modules/filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/FileList/-/FileList-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "dependencies": { + "minimatch": "^3.0.4" + } + }, + "node_modules/fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "dependencies": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.14.7", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "dependencies": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "node_modules/fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "node_modules/fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "hasInstallScript": true, "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "dependencies": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" + } + }, + "node_modules/glob": { + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.0.6.tgz", + "integrity": "sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q==", + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.0.2", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.9", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" + }, + "node_modules/graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" + }, + "node_modules/has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", + "dependencies": { + "function-bind": "^1.1.1" + }, + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/has-ansi": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-ansi/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "dependencies": { + "isarray": "2.0.1" + } + }, + "node_modules/has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" + }, + "node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "engines": { + "node": ">=8" + } + }, + "node_modules/has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "dependencies": { + "has-symbols": "^1.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/hexo": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/hexo/-/hexo-6.0.0.tgz", + "integrity": "sha512-ffSOhOEwPCJt2Ch4DdCdX39WBv8IX8I8I7md08RMDYc6jqxmE2mpuU8wzFYEJ/FQVjrt/EsQ/qfKAz3zAW/hvw==", + "dependencies": { + "abbrev": "^1.1.1", + "archy": "^1.0.0", + "bluebird": "^3.5.2", + "hexo-cli": "^4.0.0", + "hexo-front-matter": "^2.0.0", + "hexo-fs": "^3.1.0", + "hexo-i18n": "^1.0.0", + "hexo-log": "^3.0.0", + "hexo-util": "^2.4.0", + "js-yaml": "^4.0.0", + "micromatch": "^4.0.2", + "moize": "^6.1.0", + "moment": "^2.22.2", + "moment-timezone": "^0.5.21", + "nunjucks": "^3.2.1", + "picocolors": "^1.0.0", + "pretty-hrtime": "^1.0.3", + "resolve": "^1.8.1", + "strip-ansi": "^6.0.0", + "text-table": "^0.2.0", + "tildify": "^2.0.0", + "titlecase": "^1.1.2", + "warehouse": "^4.0.0" + }, + "bin": { + "hexo": "bin/hexo" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/hexo-browsersync": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/hexo-browsersync/-/hexo-browsersync-0.3.0.tgz", + "integrity": "sha512-5grkDUG/jci1LgImUFHTGMhXRYFKYuBVVf1L62UAhd/IC/L3EfGtKXyPVqvxyVb4Pc5STY5tQR46xoBJLlWJNw==", + "dependencies": { + "browser-sync": "^2.18.13", + "connect-injector": "^0.4.4" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/hexo-cli": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/hexo-cli/-/hexo-cli-4.3.0.tgz", + "integrity": "sha512-lr46h1tK1RNQJAQZbzKYAWGsmqF5DLrW6xKEakqv/o9JqgdeempBjIm7HqjcZEUBpWij4EO65X6YJiDmT9LR7g==", + "dependencies": { + "abbrev": "^1.1.1", + "bluebird": "^3.5.5", + "chalk": "^4.0.0", + "command-exists": "^1.2.8", + "hexo-fs": "^3.0.1", + "hexo-log": "^2.0.0", + "hexo-util": "^2.0.0", + "minimist": "^1.2.5", + "resolve": "^1.11.0", + "tildify": "^2.0.0" + }, + "bin": { + "hexo": "bin/hexo" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-cli/node_modules/hexo-log": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-log/-/hexo-log-2.0.0.tgz", + "integrity": "sha512-U7zdDae74pXcyhQEyNmpJdq3UI6zWKxQ7/zLoMr/d3CBRdIfB5yO8DWqKUnewfibYv0gODyTWUIhxQDWuwloow==", + "dependencies": { + "chalk": "^4.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-deployer-rsync": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-deployer-rsync/-/hexo-deployer-rsync-1.0.0.tgz", + "integrity": "sha512-hylGRNEHctWsjHs67VZefvrOGwzcZ4gPQ7RdVJdbWYA/OQ75IE52vDe+N9jpcfOWl8Tkv8fbX1Afuh44cv2DUw==", + "dependencies": { + "chalk": "^2.4.1", + "hexo-util": "^1.0.0" + }, + "engines": { + "node": ">= 8.6.0" + } + }, + "node_modules/hexo-deployer-rsync/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hexo-deployer-rsync/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hexo-deployer-rsync/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/hexo-deployer-rsync/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/hexo-deployer-rsync/node_modules/domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "dependencies": { + "domelementtype": "^2.0.1" + }, + "engines": { + "node": ">= 4" + } + }, + "node_modules/hexo-deployer-rsync/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/hexo-deployer-rsync/node_modules/hexo-util": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/hexo-util/-/hexo-util-1.9.1.tgz", + "integrity": "sha512-B6+nVi4Zpy7NPzlIcTLn9YBGb2Ly0q11mRzg6DyFWg0IfcrfF4tlWO0vRXqJVhvRyg+tIfUihmgypkiUW1IjNQ==", + "dependencies": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^9.13.1", + "htmlparser2": "^4.0.0", + "prismjs": "^1.17.1", + "punycode.js": "^2.1.0", + "strip-indent": "^3.0.0", + "striptags": "^3.1.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-deployer-rsync/node_modules/highlight.js": { + "version": "9.18.5", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-9.18.5.tgz", + "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==", + "deprecated": "Support has ended for 9.x series. Upgrade to @latest", + "hasInstallScript": true, + "engines": { + "node": "*" + } + }, + "node_modules/hexo-deployer-rsync/node_modules/htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "node_modules/hexo-deployer-rsync/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/hexo-front-matter": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-front-matter/-/hexo-front-matter-2.0.0.tgz", + "integrity": "sha512-IR3tjAyK2Ga/0a/WDAoNy5+n3ju2/mkuAsCDEeGgGLf5+7kkiOkkG/FrnueuYgz0h2MPfWDLBiDsSTCmB0sLCA==", + "dependencies": { + "js-yaml": "^3.13.1" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-front-matter/node_modules/js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "dependencies": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/hexo-fs": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/hexo-fs/-/hexo-fs-3.1.0.tgz", + "integrity": "sha512-SfoDH7zlU9Iop+bAfEONXezbNIkpVX1QqjNCBYpapilZR+xVOCfTEdlNixanrKBbLGPb2fXqrdDBFgrKuiVGQQ==", + "dependencies": { + "bluebird": "^3.5.1", + "chokidar": "^3.0.0", + "graceful-fs": "^4.1.11", + "hexo-util": "^2.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-generator-archive": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-archive/-/hexo-generator-archive-1.0.0.tgz", + "integrity": "sha512-24TeanDGpMBUIq37DHpSESQbeN6ssZ06edsGSI76tN4Yit50TgsgzP5g5DSu0yJk0jUtHJntysWE8NYAlFXibA==", + "dependencies": { + "hexo-pagination": "1.0.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-generator-category": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-category/-/hexo-generator-category-1.0.0.tgz", + "integrity": "sha512-kmtwT1SHYL2ismbGnYQXNtqLFSeTdtHNbJIqno3LKROpCK8ybST5QVXF1bZI9LkFcXV/H8ilt8gfg4/dNNcQQQ==", + "dependencies": { + "hexo-pagination": "1.0.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-generator-feed": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-feed/-/hexo-generator-feed-3.0.0.tgz", + "integrity": "sha512-Jo35VSRSNeMitS2JmjCq3OHAXXYU4+JIODujHtubdG/NRj2++b3Tgyz9pwTmROx6Yxr2php/hC8og5AGZHh8UQ==", + "dependencies": { + "hexo-util": "^2.1.0", + "nunjucks": "^3.0.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-generator-index": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-index/-/hexo-generator-index-2.0.0.tgz", + "integrity": "sha512-q/29Vj9BZs0dwBcF+s9IT8ymS4aYZsDwBEYDnh96C8tsX+KPY5v6TzCdttz58BchifaJpP/l9mi6u9rZuYqA0g==", + "dependencies": { + "hexo-pagination": "1.0.0", + "timsort": "^0.3.0" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-generator-sitemap": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-sitemap/-/hexo-generator-sitemap-2.2.0.tgz", + "integrity": "sha512-WoS/GpdrazoiFuhZXS3Qnb22L0uaiKHHWefcsoE7JLjh8WsksFom4v2FoNhr1RIYwFV7SudQFs91P5xcW+Gfow==", + "dependencies": { + "hexo-util": "^2.1.0", + "micromatch": "^4.0.2", + "nunjucks": "^3.1.6" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-generator-tag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-tag/-/hexo-generator-tag-1.0.0.tgz", + "integrity": "sha512-JDoB2T1EncRlyGSjuAhkGxRfKkN8tq0i8tFlk9I4q2L6iYxPaUnFenhji0oxufTADC16/IchuPjmMk//dt8Msg==", + "dependencies": { + "hexo-pagination": "1.0.0" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-i18n": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-i18n/-/hexo-i18n-1.0.0.tgz", + "integrity": "sha512-yw90JHr7ybUHN/QOkpHmlWJj1luVk5/v8CUU5NRA0n4TFp6av8NT7ujZ10GDawgnQEdMHnN5PUfAbNIVGR6axg==", + "dependencies": { + "sprintf-js": "^1.0.3" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-log": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-log/-/hexo-log-3.0.0.tgz", + "integrity": "sha512-fd87qXYznpNTa8SLov+wjDsrPssk4yKSgdIQg1wJPcuthy8ngvbXYdqaJ4vWMSADZ+D257EmKXTJHJyaxJQhVw==", + "dependencies": { + "nanocolors": "^0.2.12" + }, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/hexo-pagination": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-pagination/-/hexo-pagination-1.0.0.tgz", + "integrity": "sha512-miEVFgxchPr2qNWxw0JWpJ9R/Yaf7HjHBZVjvCCcqfbsLyYtCvIfJDxcEwz1sDOC/fLzYPqNnhUI73uNxBHRSA==", + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-renderer-ejs": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-ejs/-/hexo-renderer-ejs-2.0.0.tgz", + "integrity": "sha512-qCjE1IdwgDgv65qyb0KMVCwCdSVAkH0vwAe9XihjvaKWkmb9dtt8DgErOdqCXn0HReSyWiEVP2BrLRj3gyHwOQ==", + "dependencies": { + "ejs": "^3.1.6" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/hexo-renderer-jade": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-jade/-/hexo-renderer-jade-0.5.0.tgz", + "integrity": "sha512-C1EmmsmGTbE5mTf4863IQyXO7CzO4jBfUsY+msiSH0sFqeq5XUVN0YGgrLZUfctW/6in5AppsbPqiJvdmMwtVg==", + "deprecated": "hexo-renderer-jade has been deprecated. Please install hexo-renderer-pug and rename all *.jade files to *.pug.", + "dependencies": { + "jade": "^1.11.0", + "pug": "^2.0.1" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/hexo-renderer-marked": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-marked/-/hexo-renderer-marked-5.0.0.tgz", + "integrity": "sha512-lifWMCvefTq3IlH+urQDPFX4gXquFAqDwOQBdqpwcPyhaiVHu0ZweeZ24IeZtCLRYP+zEgsksCPYrGl9hDDJHg==", + "dependencies": { + "dompurify": "^2.3.0", + "hexo-util": "^2.5.0", + "jsdom": "^19.0.0", + "marked": "^4.0.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/hexo-renderer-stylus": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/hexo-renderer-stylus/-/hexo-renderer-stylus-2.0.1.tgz", + "integrity": "sha512-1S4AG8RtzWqVrqKIYv2AJ4UYms5SHDjkdYS7IiGwgUejL24agbTktpAbnH2cG1JWZ15SRqYN0UGB9aAoSAgvEA==", + "dependencies": { + "nib": "^1.1.2", + "stylus": "^0.54.8" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/hexo-server": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-server/-/hexo-server-3.0.0.tgz", + "integrity": "sha512-u4s0ty9Aew6jV+a9oMrXBwhrRpUQ0U8PWM/88a5aHgDru58VY81mVrxOFxs788NAsWQ8OvsJtF5m7mnXoRnSIA==", + "dependencies": { + "bluebird": "^3.5.5", + "compression": "^1.7.4", + "connect": "^3.7.0", + "mime": "^3.0.0", + "morgan": "^1.9.1", + "open": "^8.0.9", + "picocolors": "^1.0.0", + "serve-static": "^1.14.1" + }, + "engines": { + "node": ">=12.13.0" + } + }, + "node_modules/hexo-theme-landscape": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/hexo-theme-landscape/-/hexo-theme-landscape-0.0.3.tgz", + "integrity": "sha512-b0Di+TUVs4ESrNX4ULEh9uQmADpO6kr10rIJ2OGZM8suNQNFKdxn+vJUjnLfKkCPJAfVmS7/S83KCNYe4tpoNw==" + }, + "node_modules/hexo-util": { + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/hexo-util/-/hexo-util-2.5.0.tgz", + "integrity": "sha512-l0zkqcg2524KPO84HQe0JROpPlCM/dEnCJaJrZ1qsq+3+/YxhDa0zxiGtUVY1dtrWzOK/V11Zj+UEklhGP8Jeg==", + "dependencies": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^10.7.1", + "htmlparser2": "^6.0.0", + "prismjs": "^1.17.1", + "strip-indent": "^3.0.0" + }, + "engines": { + "node": ">=12.4.0" + } + }, + "node_modules/highlight.js": { + "version": "10.7.3", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==", + "engines": { + "node": "*" + } + }, + "node_modules/html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "dependencies": { + "whatwg-encoding": "^2.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/htmlparser2": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", + "dependencies": { + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "node_modules/http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.1" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-errors/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", + "dependencies": { + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + }, + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "dependencies": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "dependencies": { + "agent-base": "6", + "debug": "4" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/iconv-lite": { + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" + }, + "node_modules/inflight": { + "version": "1.0.6", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", + "dependencies": { + "once": "^1.3.0", + "wrappy": "1" + } + }, + "node_modules/inherits": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-buffer": { + "version": "1.1.6", + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" + }, + "node_modules/is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", + "dependencies": { + "has": "^1.0.3" + } + }, + "node_modules/is-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha512-vyMeQMq+AiH5uUnoBfMTwf18tO3bM6k1QXBE9D6ueAAquEfCZe3AJPtud9g6qS0+4X8xA7ndpZiDyeb2l2qOBw==", + "dependencies": { + "acorn": "~4.0.2", + "object-assign": "^4.0.1" + } + }, + "node_modules/is-expression/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", + "dependencies": { + "lodash.isfinite": "^3.3.2" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "node_modules/is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", + "dependencies": { + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "dependencies": { + "is-docker": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/isarray": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" + }, + "node_modules/jade": { + "version": "1.11.0", + "resolved": "https://registry.npmmirror.com/jade/-/jade-1.11.0.tgz", + "integrity": "sha512-J76sbGKeLtu7uwW97Ntzb1UvGnpKTDplYa9ROr2gNRhM+SxvlBSG0Ees3TQ8+7ya2UVkzMEeFxhRhEpN68s7Tg==", + "deprecated": "Jade has been renamed to pug, please install the latest version of pug instead of jade", + "dependencies": { + "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" + }, + "bin": { + "jade": "bin/jade.js" + } + }, + "node_modules/jade/node_modules/commander": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.6.0.tgz", + "integrity": "sha512-PhbTMT+ilDXZKqH8xbvuUY2ZEQNef0Q7DKxgoEKb4ccytsdvVVJmYqR0sGbi96nxU6oGrwEIQnclpK2NBZuQlg==", + "engines": { + "node": ">= 0.6.x" + } + }, + "node_modules/jake": { + "version": "10.8.2", + "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "dependencies": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "bin": { + "jake": "bin/cli.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jake/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "dependencies": { + "color-convert": "^1.9.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jake/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "dependencies": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/jake/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "dependencies": { + "color-name": "1.1.3" + } + }, + "node_modules/jake/node_modules/color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "node_modules/jake/node_modules/has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/jake/node_modules/supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "dependencies": { + "has-flag": "^3.0.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/js-yaml/node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" + }, + "node_modules/jsdom": { + "version": "19.0.0", + "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", + "dependencies": { + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "peerDependencies": { + "canvas": "^2.5.0" + }, + "peerDependenciesMeta": { + "canvas": { + "optional": true + } + } + }, + "node_modules/jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/jsonparse": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==", + "engines": [ + "node >= 0.2.0" + ] + }, + "node_modules/JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", + "dependencies": { + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + }, + "bin": { + "JSONStream": "bin.js" + }, + "engines": { + "node": "*" + } + }, + "node_modules/jstransformer": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/jstransformer/-/jstransformer-0.0.2.tgz", + "integrity": "sha512-b7tmf91j1ChMuYhwbPBnNgB62dmHuqiHpOdd6QLKzde8HydZqm+ud3qWreGWecSxPBFFNOf1Ozjx0xo2plFdHA==", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^6.0.1" + } + }, + "node_modules/kind-of": { + "version": "3.2.2", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", + "dependencies": { + "is-buffer": "^1.1.5" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lazy-cache": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/levn": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", + "dependencies": { + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "node_modules/localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "dependencies": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "bin": { + "lt": "bin/lt.js" + }, + "engines": { + "node": ">=8.3.0" + } + }, + "node_modules/localtunnel/node_modules/debug": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/localtunnel/node_modules/yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "dependencies": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "dependencies": { + "p-locate": "^4.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "node_modules/lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" + }, + "node_modules/longest": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/lower-case": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", + "dependencies": { + "tslib": "^2.0.3" + } + }, + "node_modules/marked": { + "version": "4.0.12", + "resolved": "https://registry.npmmirror.com/marked/-/marked-4.0.12.tgz", + "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==", + "bin": { + "marked": "bin/marked.js" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/micro-memoize": { + "version": "4.0.9", + "resolved": "https://registry.npmmirror.com/micro-memoize/-/micro-memoize-4.0.9.tgz", + "integrity": "sha512-Z2uZi/IUMGQDCXASdujXRqrXXEwSY0XffUrAOllhqzQI3wpUyZbiZTiE2JuYC0HSG2G7DbCS5jZmsEKEGZuemg==" + }, + "node_modules/micromatch": { + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", + "dependencies": { + "braces": "^3.0.1", + "picomatch": "^2.2.3" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mime-db": { + "version": "1.51.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.34", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", + "dependencies": { + "mime-db": "1.51.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==", + "engines": { + "node": ">=4" + } + }, + "node_modules/minimatch": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, + "node_modules/minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "node_modules/mitt": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" + }, + "node_modules/mkdirp": { + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", + "dependencies": { + "minimist": "^1.2.5" + }, + "bin": { + "mkdirp": "bin/cmd.js" + } + }, + "node_modules/moize": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/moize/-/moize-6.1.0.tgz", + "integrity": "sha512-WrMcM+C2Jy+qyOC/UMhA3BCHGowxV34dhDZnDNfxsREW/8N+33SFjmc23Q61Xv1WUthUA1vYopTitP1sZ5jkeg==", + "dependencies": { + "fast-equals": "^2.0.1", + "micro-memoize": "^4.0.9" + } + }, + "node_modules/moment": { + "version": "2.29.1", + "resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==", + "engines": { + "node": "*" + } + }, + "node_modules/moment-timezone": { + "version": "0.5.34", + "resolved": "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.34.tgz", + "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", + "dependencies": { + "moment": ">= 2.9.0" + }, + "engines": { + "node": "*" + } + }, + "node_modules/morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "dependencies": { + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/morgan/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/morgan/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" + }, + "node_modules/nanocolors": { + "version": "0.2.13", + "resolved": "https://registry.npmmirror.com/nanocolors/-/nanocolors-0.2.13.tgz", + "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==" + }, + "node_modules/negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/nib": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/nib/-/nib-1.1.2.tgz", + "integrity": "sha512-xBpZ9XU0vLOxp0GBTuUHt6Kcl37ZpC/rXPpKcK4LYOUnSmqp2CXkcNiJxf9bgNZeivYR6bxsaZkNHZ9deEMupQ==", + "dependencies": { + "stylus": "0.54.5" + }, + "engines": { + "node": "*" + } + }, + "node_modules/nib/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/nib/node_modules/stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmmirror.com/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha512-4Yzg9aqLf3f4sDvO3x+Fbp2V634j9ikFGCFokIPYi+7Y4IG/nxAiPUs95MRlo+lPdTsxAs9wCzEclmPccItISA==", + "dependencies": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/no-case": { + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", + "dependencies": { + "lower-case": "^2.0.2", + "tslib": "^2.0.3" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/nunjucks": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/nunjucks/-/nunjucks-3.2.3.tgz", + "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", + "dependencies": { + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + }, + "bin": { + "nunjucks-precompile": "bin/precompile" + }, + "engines": { + "node": ">= 6.9.0" + }, + "peerDependencies": { + "chokidar": "^3.3.0" + }, + "peerDependenciesMeta": { + "chokidar": { + "optional": true + } + } + }, + "node_modules/nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "node_modules/object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "dependencies": { + "ee-first": "1.1.1" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/open": { + "version": "8.4.0", + "resolved": "https://registry.npmmirror.com/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "dependencies": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==" + }, + "node_modules/opn": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "dependencies": { + "is-wsl": "^1.1.0" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/opn/node_modules/is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==", + "engines": { + "node": ">=4" + } + }, + "node_modules/optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmmirror.com/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", + "dependencies": { + "wordwrap": "~0.0.2" + } + }, + "node_modules/optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "dependencies": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "dependencies": { + "p-try": "^2.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "dependencies": { + "p-limit": "^2.2.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "node_modules/parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + }, + "node_modules/parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, + "node_modules/parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "dependencies": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "node_modules/path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "engines": { + "node": ">=8" + } + }, + "node_modules/path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "node_modules/picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "engines": { + "node": ">=8.6" + } + }, + "node_modules/portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha512-CUxI7PHXrWJTIPmQs1YJFyD4uesS3om2jVcgS3T1eYPyd60s1l0m7tf35Fn5KRAtV51SAD7BmImaOGf6vwhiFQ==", + "dependencies": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + }, + "engines": { + "node": ">=0.4", + "npm": ">=1.0.0" + } + }, + "node_modules/portscanner/node_modules/async": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + }, + "node_modules/prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/promise": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/promise/-/promise-6.1.0.tgz", + "integrity": "sha512-O+uwGKreKNKkshzZv2P7N64lk6EP17iXBn0PbUnNQhk+Q0AHLstiTrjkx3v5YBd3cxUe7Sq6KyRhl/A0xUjk7Q==", + "dependencies": { + "asap": "~1.0.0" + } + }, + "node_modules/promise/node_modules/asap": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/asap/-/asap-1.0.0.tgz", + "integrity": "sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==" + }, + "node_modules/psl": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "node_modules/pug": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pug/-/pug-2.0.4.tgz", + "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", + "dependencies": { + "pug-code-gen": "^2.0.2", + "pug-filters": "^3.1.1", + "pug-lexer": "^4.1.0", + "pug-linker": "^3.0.6", + "pug-load": "^2.0.12", + "pug-parser": "^5.0.1", + "pug-runtime": "^2.0.5", + "pug-strip-comments": "^1.0.4" + } + }, + "node_modules/pug-attrs": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pug-attrs/-/pug-attrs-2.0.4.tgz", + "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "dependencies": { + "constantinople": "^3.0.1", + "js-stringify": "^1.0.1", + "pug-runtime": "^2.0.5" + } + }, + "node_modules/pug-code-gen": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pug-code-gen/-/pug-code-gen-2.0.3.tgz", + "integrity": "sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==", + "dependencies": { + "constantinople": "^3.1.2", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.1", + "pug-attrs": "^2.0.4", + "pug-error": "^1.3.3", + "pug-runtime": "^2.0.5", + "void-elements": "^2.0.1", + "with": "^5.0.0" + } + }, + "node_modules/pug-code-gen/node_modules/acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pug-code-gen/node_modules/acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==", + "dependencies": { + "acorn": "^4.0.4" + } + }, + "node_modules/pug-code-gen/node_modules/acorn-globals/node_modules/acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/pug-code-gen/node_modules/constantinople": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/constantinople/-/constantinople-3.1.2.tgz", + "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "dependencies": { + "@types/babel-types": "^7.0.0", + "@types/babylon": "^6.16.2", + "babel-types": "^6.26.0", + "babylon": "^6.18.0" + } + }, + "node_modules/pug-code-gen/node_modules/with": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/with/-/with-5.1.1.tgz", + "integrity": "sha512-uAnSsFGfSpF6DNhBXStvlZILfHJfJu4eUkfbRGk94kGO1Ta7bg6FwfvoOhhyHAJuFbCw+0xk4uJ3u57jLvlCJg==", + "dependencies": { + "acorn": "^3.1.0", + "acorn-globals": "^3.0.0" + } + }, + "node_modules/pug-error": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/pug-error/-/pug-error-1.3.3.tgz", + "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==" + }, + "node_modules/pug-filters": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/pug-filters/-/pug-filters-3.1.1.tgz", + "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", + "dependencies": { + "clean-css": "^4.1.11", + "constantinople": "^3.0.1", + "jstransformer": "1.0.0", + "pug-error": "^1.3.3", + "pug-walk": "^1.1.8", + "resolve": "^1.1.6", + "uglify-js": "^2.6.1" + } + }, + "node_modules/pug-filters/node_modules/clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "dependencies": { + "source-map": "~0.6.0" + }, + "engines": { + "node": ">= 4.0" + } + }, + "node_modules/pug-filters/node_modules/jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "dependencies": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "node_modules/pug-filters/node_modules/promise": { + "version": "7.3.1", + "resolved": "https://registry.npmmirror.com/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "dependencies": { + "asap": "~2.0.3" + } + }, + "node_modules/pug-lexer": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/pug-lexer/-/pug-lexer-4.1.0.tgz", + "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", + "dependencies": { + "character-parser": "^2.1.1", + "is-expression": "^3.0.0", + "pug-error": "^1.3.3" + } + }, + "node_modules/pug-lexer/node_modules/character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "dependencies": { + "is-regex": "^1.0.3" + } + }, + "node_modules/pug-linker": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/pug-linker/-/pug-linker-3.0.6.tgz", + "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", + "dependencies": { + "pug-error": "^1.3.3", + "pug-walk": "^1.1.8" + } + }, + "node_modules/pug-load": { + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/pug-load/-/pug-load-2.0.12.tgz", + "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "dependencies": { + "object-assign": "^4.1.0", + "pug-walk": "^1.1.8" + } + }, + "node_modules/pug-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/pug-parser/-/pug-parser-5.0.1.tgz", + "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", + "dependencies": { + "pug-error": "^1.3.3", + "token-stream": "0.0.1" + } + }, + "node_modules/pug-runtime": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/pug-runtime/-/pug-runtime-2.0.5.tgz", + "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==" + }, + "node_modules/pug-strip-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", + "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "dependencies": { + "pug-error": "^1.3.3" + } + }, + "node_modules/pug-walk": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/pug-walk/-/pug-walk-1.1.8.tgz", + "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==" + }, + "node_modules/punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==", + "engines": { + "node": ">=6" + } + }, + "node_modules/punycode.js": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.1.0.tgz", + "integrity": "sha512-LvGUJ9QHiESLM4yn8JuJWicstRcJKRmP46psQw1HvCZ9puLFwYMKJWvkAkP3OHBVzNzZGx/D53EYJrIaKd9gZQ==", + "engines": { + "node": ">=6" + } + }, + "node_modules/q": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==", + "engines": { + "node": ">=0.6.0", + "teleport": ">=0.2.0" + } + }, + "node_modules/qs": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.2.3.tgz", + "integrity": "sha512-AY4g8t3LMboim0t6XWFdz6J5OuJ1ZNYu54SXihS/OMpgyCqYmcAJnWqkNSOjSjWmq3xxy+GF9uWQI2lI/7tKIA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/raw-body": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "dependencies": { + "bytes": "3.1.1", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/raw-body/node_modules/iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "node_modules/repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==", + "engines": { + "node": ">=0.10" + } + }, + "node_modules/require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "node_modules/requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "node_modules/resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "dependencies": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + }, + "bin": { + "resolve": "bin/resolve" + } + }, + "node_modules/resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==", + "deprecated": "https://github.com/lydell/resolve-url#deprecated" + }, + "node_modules/resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "dependencies": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/resp-modifier/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/resp-modifier/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "node_modules/right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "dependencies": { + "align-text": "^0.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/rx": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==" + }, + "node_modules/rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "dependencies": { + "symbol-observable": "1.0.1" + }, + "engines": { + "npm": ">=2.0.0" + } + }, + "node_modules/safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "node_modules/safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "node_modules/sax": { + "version": "0.5.8", + "resolved": "https://registry.npmmirror.com/sax/-/sax-0.5.8.tgz", + "integrity": "sha512-c0YL9VcSfcdH3F1Qij9qpYJFpKFKMXNOkLWFssBL3RuF7ZS8oZhllR2rWlCRjDTJsfq3R6wbSsaRU6o0rkEdNw==" + }, + "node_modules/saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "dependencies": { + "xmlchars": "^2.2.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==", + "bin": { + "semver": "bin/semver.js" + } + }, + "node_modules/send": { + "version": "0.17.2", + "resolved": "https://registry.npmmirror.com/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "dependencies": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/send/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/send/node_modules/debug/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/send/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/send/node_modules/mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/send/node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + }, + "node_modules/serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "dependencies": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/serve-index/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/serve-index/node_modules/depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "dependencies": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/serve-index/node_modules/inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "node_modules/serve-index/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/serve-index/node_modules/setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "node_modules/serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "dependencies": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, + "node_modules/set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "node_modules/setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "engines": { + "node": ">=8" + } + }, + "node_modules/socket.io": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/socket.io/-/socket.io-2.4.0.tgz", + "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", + "dependencies": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" + }, + "node_modules/socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "dependencies": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + } + }, + "node_modules/socket.io-client/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/socket.io-client/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "dependencies": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/socket.io-parser/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/socket.io-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/socket.io/node_modules/component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==" + }, + "node_modules/socket.io/node_modules/debug": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "deprecated": "Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797)", + "dependencies": { + "ms": "^2.1.1" + } + }, + "node_modules/socket.io/node_modules/socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "dependencies": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "deprecated": "See https://github.com/lydell/source-map-resolve#deprecated", + "dependencies": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "node_modules/source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==", + "deprecated": "See https://github.com/lydell/source-map-url#deprecated" + }, + "node_modules/sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "node_modules/statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/stream-buffers": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/stream-buffers/-/stream-buffers-0.2.6.tgz", + "integrity": "sha512-ZRpmWyuCdg0TtNKk8bEqvm13oQvXMmzXDsfD4cBgcx5LouborvU5pm3JMkdTP3HcszyUI08AM1dHMXA5r2g6Sg==", + "engines": { + "node": ">= 0.3.0" + } + }, + "node_modules/stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "dependencies": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "bin": { + "throttleproxy": "bin/throttleproxy.js" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/stream-throttle/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "dependencies": { + "min-indent": "^1.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/striptags": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/striptags/-/striptags-3.2.0.tgz", + "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==" + }, + "node_modules/stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmmirror.com/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "dependencies": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "bin": { + "stylus": "bin/stylus" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus/node_modules/css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", + "dependencies": { + "css": "^2.0.0" + } + }, + "node_modules/stylus/node_modules/debug": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/stylus/node_modules/glob": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", + "dependencies": { + "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" + }, + "engines": { + "node": "*" + } + }, + "node_modules/stylus/node_modules/mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", + "bin": { + "mkdirp": "bin/cmd.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/stylus/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "node_modules/stylus/node_modules/sax": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" + }, + "node_modules/stylus/node_modules/source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==", + "engines": { + "node": ">= 8" + } + }, + "node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/symbol-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/symbol-tree": { + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" + }, + "node_modules/text-table": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "node_modules/tfunk": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/tfunk/-/tfunk-4.0.0.tgz", + "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", + "dependencies": { + "chalk": "^1.1.3", + "dlv": "^1.1.3" + } + }, + "node_modules/tfunk/node_modules/ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "dependencies": { + "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" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/strip-ansi": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "dependencies": { + "ansi-regex": "^2.0.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/tfunk/node_modules/supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" + }, + "node_modules/tildify": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==", + "engines": { + "node": ">=8" + } + }, + "node_modules/timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==" + }, + "node_modules/titlecase": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/titlecase/-/titlecase-1.1.3.tgz", + "integrity": "sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw==", + "bin": { + "to-title-case": "bin.js" + } + }, + "node_modules/to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==" + }, + "node_modules/to-fast-properties": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", + "engines": { + "node": ">=0.6" + } + }, + "node_modules/token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg==" + }, + "node_modules/tough-cookie": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", + "dependencies": { + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/tr46": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", + "dependencies": { + "punycode": "^2.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/transformers/-/transformers-2.1.0.tgz", + "integrity": "sha512-zJf5m2EIOngmBbDe2fhTPpCjzM2qkZVqrFJZc2jaln+KBeEaYKhS2QMOIkfVrNUyoOwqgbTwOHATzr3jZRQDyg==", + "deprecated": "Deprecated, use jstransformer", + "dependencies": { + "css": "~1.0.8", + "promise": "~2.0", + "uglify-js": "~2.2.5" + } + }, + "node_modules/transformers/node_modules/css": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/css/-/css-1.0.8.tgz", + "integrity": "sha512-qmTYWhHk910nQWnGqMAiWWPQlB6tESiWgNebQJmiozOAGcBAQ1+U/UzUOkhdrcshlkSRRiKWodwmVvO0OmnIGg==", + "dependencies": { + "css-parse": "1.0.4", + "css-stringify": "1.0.5" + } + }, + "node_modules/transformers/node_modules/css-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/css-parse/-/css-parse-1.0.4.tgz", + "integrity": "sha512-pfstzKVRZiHprDXdsmtfH1HYUEw22lzjuHdnpe1hscwoQvgW2C5zDQIBE0RKoALEReTn9W1ECdY8uaT/kO4VfA==" + }, + "node_modules/transformers/node_modules/is-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-1.0.1.tgz", + "integrity": "sha512-mjWH5XxnhMA8cFnDchr6qRP9S/kLntKuEfIYku+PaN1CnS8v+OG9O/BKpRCVRJvpIkgAZm0Pf5Is3iSSOILlcg==" + }, + "node_modules/transformers/node_modules/promise": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/promise/-/promise-2.0.0.tgz", + "integrity": "sha512-OgMc+sxI3zWF8D5BJGtA0z7/IsrDy1/0cPaDv6HPpqa2fSTo7AdON5U10NbZCUeF+zCAj3PtfPE50Hf02386aA==", + "dependencies": { + "is-promise": "~1" + } + }, + "node_modules/transformers/node_modules/source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "dependencies": { + "amdefine": ">=0.0.4" + }, + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/transformers/node_modules/uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha512-viLk+/8G0zm2aKt1JJAVcz5J/5ytdiNaIsKgrre3yvSUjwVG6ZUujGH7E2TiPigZUwLYCe7eaIUEP2Zka2VJPA==", + "dependencies": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" + }, + "node_modules/type-check": { + "version": "0.3.2", + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", + "dependencies": { + "prelude-ls": "~1.1.2" + }, + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/ua-parser-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz", + "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==", + "engines": { + "node": "*" + } + }, + "node_modules/uberproto": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/uberproto/-/uberproto-1.2.0.tgz", + "integrity": "sha512-pGtPAQmLwh+R9w81WVHzui1FfedpQWQpiaIIfPCwhtsBez4q6DYbJFfyXPVHPUTNFnedAvNEnkoFiLuhXIR94w==", + "engines": { + "node": "*" + } + }, + "node_modules/uglify-js": { + "version": "2.8.29", + "resolved": "https://registry.npmmirror.com/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", + "dependencies": { + "source-map": "~0.5.1", + "yargs": "~3.10.0" + }, + "bin": { + "uglifyjs": "bin/uglifyjs" + }, + "engines": { + "node": ">=0.8.0" + }, + "optionalDependencies": { + "uglify-to-browserify": "~1.0.0" + } + }, + "node_modules/uglify-js/node_modules/camelcase": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js/node_modules/cliui": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", + "dependencies": { + "center-align": "^0.1.1", + "right-align": "^0.1.1", + "wordwrap": "0.0.2" + } + }, + "node_modules/uglify-js/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/uglify-js/node_modules/wordwrap": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/uglify-js/node_modules/yargs": { + "version": "3.10.0", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", + "dependencies": { + "camelcase": "^1.0.2", + "cliui": "^2.1.0", + "decamelize": "^1.0.0", + "window-size": "0.1.0" + } + }, + "node_modules/uglify-to-browserify": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", + "optional": true + }, + "node_modules/universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==", + "engines": { + "node": ">= 4.0.0" + } + }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==", + "deprecated": "Please see https://github.com/lydell/urix#deprecated" + }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", + "dependencies": { + "browser-process-hrtime": "^1.0.0" + } + }, + "node_modules/w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "dependencies": { + "xml-name-validator": "^4.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/warehouse": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/warehouse/-/warehouse-4.0.0.tgz", + "integrity": "sha512-9i6/JiHzjnyene5Pvvl2D2Pd18no129YGy0C0P7x18iTz/SeO9nOBioR64XoCy5xKwBKQtl3MU361qpr0V9uXw==", + "dependencies": { + "bluebird": "^3.2.2", + "cuid": "^2.1.4", + "graceful-fs": "^4.1.3", + "is-plain-object": "^3.0.0", + "JSONStream": "^1.0.7", + "rfdc": "^1.1.4" + }, + "engines": { + "node": ">=10.13.0" + } + }, + "node_modules/webidl-conversions": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", + "dependencies": { + "iconv-lite": "0.6.3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==", + "engines": { + "node": ">=12" + } + }, + "node_modules/whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "dependencies": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" + }, + "node_modules/window-size": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==", + "engines": { + "node": ">= 0.8.0" + } + }, + "node_modules/with": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/with/-/with-4.0.3.tgz", + "integrity": "sha512-mJZFpyEc1JTAdxhi/vhVeAM2S7vsltEKDiexDDo1HuAzlYKhcVUU6cwY8cHrFYdt82ZNkfKCeyhA3IYFegI0Kg==", + "dependencies": { + "acorn": "^1.0.1", + "acorn-globals": "^1.0.3" + } + }, + "node_modules/with/node_modules/acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha512-FsqWmApWGMGLKKNpHt12PMc5AK7BaZee0WRh04fCysmTzHe+rrKOa2MKjORhnzfpe4r0JnfdqHn02iDA9Dqj2A==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/with/node_modules/acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha512-j3/4pkfih8W4NK22gxVSXcEonTpAHOHh0hu5BoZrKcOsW/4oBPxTi4Yk3SAj+FhC1f3+bRTkXdm4019gw1vg9g==", + "dependencies": { + "acorn": "^2.1.0" + } + }, + "node_modules/with/node_modules/acorn-globals/node_modules/acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "node_modules/ws": { + "version": "8.4.2", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "node_modules/xml-name-validator": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==", + "engines": { + "node": ">=12" + } + }, + "node_modules/xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "node_modules/xmlhttprequest-ssl": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs": { + "version": "15.4.1", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", + "dependencies": { + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==", + "engines": { + "node": ">=10" + } + }, + "node_modules/yargs/node_modules/cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "node_modules/yargs/node_modules/wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/yargs/node_modules/y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "node_modules/yargs/node_modules/yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "dependencies": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" + } + }, + "dependencies": { + "@tootallnate/once": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/@tootallnate/once/-/once-2.0.0.tgz", + "integrity": "sha512-XCuKFP5PS55gnMVu3dty8KPatLqUoy/ZYzDzAGCQ8JNFCkLXzmI7vNHCR+XpbZaMWQK/vQubr7PkYq8g470J/A==" + }, + "@types/babel-types": { + "version": "7.0.11", + "resolved": "https://registry.npmmirror.com/@types/babel-types/-/babel-types-7.0.11.tgz", + "integrity": "sha512-pkPtJUUY+Vwv6B1inAz55rQvivClHJxc9aVEPPmaq2cbyeMLCiDpbKpcKyX4LAwpNGi+SHBv0tHv6+0gXv0P2A==" + }, + "@types/babylon": { + "version": "6.16.6", + "resolved": "https://registry.npmmirror.com/@types/babylon/-/babylon-6.16.6.tgz", + "integrity": "sha512-G4yqdVlhr6YhzLXFKy5F7HtRBU8Y23+iWy7UKthMq/OSQnL1hbsoeXESQ2LY8zEDlknipDG3nRGhUC9tkwvy/w==", "requires": { - "co": "^4.6.0", - "fast-deep-equal": "^1.0.0", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.3.0" + "@types/babel-types": "*" + } + }, + "a-sync-waterfall": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/a-sync-waterfall/-/a-sync-waterfall-1.0.1.tgz", + "integrity": "sha512-RYTOHHdWipFUliRFMCS4X2Yn2X8M87V/OpSqWzKKOGhzqyUxzyVmhHDH9sAvG+ZuQf/TAOFsLCpMw09I1ufUnA==" + }, + "abab": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/abab/-/abab-2.0.5.tgz", + "integrity": "sha512-9IK9EadsbHo6jLWIpxpR6pL0sazTXV6+SQv25ZB+F7Bj9mJNaOc4nCRabwd5M/JwmUa8idz6Eci6eKfJryPs6Q==" + }, + "abbrev": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/abbrev/-/abbrev-1.1.1.tgz", + "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==" + }, + "accepts": { + "version": "1.3.7", + "resolved": "https://registry.npmmirror.com/accepts/-/accepts-1.3.7.tgz", + "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", + "requires": { + "mime-types": "~2.1.24", + "negotiator": "0.6.2" + } + }, + "acorn": { + "version": "8.7.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-8.7.0.tgz", + "integrity": "sha512-V/LGr1APy+PXIwKebEWrkZPwoeoF+w1jiOBUmuxuiUIaOHtob8Qc9BTrYo7VuI5fR8tqsy+buA2WFooR5olqvQ==" + }, + "acorn-globals": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-6.0.0.tgz", + "integrity": "sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==", + "requires": { + "acorn": "^7.1.1", + "acorn-walk": "^7.1.1" + }, + "dependencies": { + "acorn": { + "version": "7.4.1", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-7.4.1.tgz", + "integrity": "sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==" + } + } + }, + "acorn-walk": { + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/acorn-walk/-/acorn-walk-7.2.0.tgz", + "integrity": "sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==" + }, + "after": { + "version": "0.8.2", + "resolved": "https://registry.npmmirror.com/after/-/after-0.8.2.tgz", + "integrity": "sha512-QbJ0NTQ/I9DI3uSJA4cbexiwQeRAfjPScqIbSjUDd9TOrcg6pTkdgziesOqxBMBzit8vFCTwrP27t13vFOORRA==" + }, + "agent-base": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/agent-base/-/agent-base-6.0.2.tgz", + "integrity": "sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==", + "requires": { + "debug": "4" } }, "align-text": { "version": "0.1.4", - "resolved": "https://registry.npm.taobao.org/align-text/download/align-text-0.1.4.tgz", - "integrity": "sha1-DNkKVhCT810KmSVsIrcGlDP60Rc=", + "resolved": "https://registry.npmmirror.com/align-text/-/align-text-0.1.4.tgz", + "integrity": "sha512-GrTZLRpmp6wIC2ztrWW9MjjTgSKccffgFagbNDOX95/dcjEcYZibYTeaOntySQLcdw1ztBoFkviiUvTMbb9MYg==", "requires": { "kind-of": "^3.0.2", "longest": "^1.0.1", "repeat-string": "^1.5.2" } }, + "amdefine": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/amdefine/-/amdefine-1.0.1.tgz", + "integrity": "sha512-S2Hw0TtNkMJhIabBwIojKL9YHO5T0n5eNqWJ7Lrlel/zDbftQpxpapi8tZs3X1HWa+u+QeydGmzzNU0m09+Rcg==" + }, "ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npm.taobao.org/ansi-regex/download/ansi-regex-2.1.1.tgz", - "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=" + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==" }, "ansi-styles": { - "version": "3.2.0", - "resolved": "https://registry.npm.taobao.org/ansi-styles/download/ansi-styles-3.2.0.tgz", - "integrity": "sha1-wVm41b4PnlpvNG2rlPFs4CIWG4g=", + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "requires": { - "color-convert": "^1.9.0" + "color-convert": "^2.0.1" } }, "anymatch": { - "version": "1.3.2", - "resolved": "https://registry.npm.taobao.org/anymatch/download/anymatch-1.3.2.tgz", - "integrity": "sha1-VT3Lj5HjyImEXf26NMd3IbkLnXo=", + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/anymatch/-/anymatch-3.1.2.tgz", + "integrity": "sha512-P43ePfOAIupkguHUycrc4qJ9kz8ZiuOUijaETwX7THt0Y/GNK7v0aa8rY816xWjZ7rJdA5XdMcpVFTKMq+RvWg==", "requires": { - "micromatch": "^2.1.5", - "normalize-path": "^2.0.0" + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" } }, - "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" - } - } - } + "resolved": "https://registry.npmmirror.com/archy/-/archy-1.0.0.tgz", + "integrity": "sha512-Xg+9RwCg/0p32teKdGMPTPnVXKD0w3DfHnFTficozsAgsvq2XenPJq/MYpzzQ/v8zrOyJn6Ds39VA4JIDwFfqw==" }, "argparse": { - "version": "1.0.9", - "resolved": "https://registry.npm.taobao.org/argparse/download/argparse-1.0.9.tgz", - "integrity": "sha1-c9g7wmP4bpf4zE9rrhsOkKfSLIY=", + "version": "1.0.10", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-1.0.10.tgz", + "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", "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=" + "arraybuffer.slice": { + "version": "0.0.7", + "resolved": "https://registry.npmmirror.com/arraybuffer.slice/-/arraybuffer.slice-0.0.7.tgz", + "integrity": "sha512-wGUIVQXuehL5TCqQun8OW81jGzAWycqzFF8lFp+GOM5BXLYj3bKNsYC4daB7n6XjCqxQA/qgTJ+8ANR3acjrog==" }, "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 + "resolved": "https://registry.npmmirror.com/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" }, "async": { - "version": "0.2.10", - "resolved": "https://registry.npm.taobao.org/async/download/async-0.2.10.tgz", - "integrity": "sha1-trvgsGdLnXGXCMo43owjfLUmw9E=" + "version": "0.9.2", + "resolved": "https://registry.npmmirror.com/async/-/async-0.9.2.tgz", + "integrity": "sha512-l6ToIJIotphWahxxHyzK9bnLR6kM4jJIIgLShZeqLY7iboHoGkdgFl7W2/Ivi4SkMJYGKqW8vSuk0uKUj6qsSw==" }, - "async-each": { - "version": "1.0.1", - "resolved": "https://registry.npm.taobao.org/async-each/download/async-each-1.0.1.tgz", - "integrity": "sha1-GdOGodntxufByF04iu28xW0zYC0=" + "async-each-series": { + "version": "0.1.1", + "resolved": "https://registry.npmmirror.com/async-each-series/-/async-each-series-0.1.1.tgz", + "integrity": "sha512-p4jj6Fws4Iy2m0iCmI2am2ZNZCgbdgE+P8F/8csmn2vx7ixXrO2zGcuNsD46X5uZSVecmkEy/M06X2vG8KD6dQ==" }, "asynckit": { "version": "0.4.0", - "resolved": "https://registry.npm.taobao.org/asynckit/download/asynckit-0.4.0.tgz", - "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k=", - "optional": true + "resolved": "https://registry.npmmirror.com/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==" }, - "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 + "atob": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/atob/-/atob-2.1.2.tgz", + "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==" }, - "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=", + "axios": { + "version": "0.21.4", + "resolved": "https://registry.npmmirror.com/axios/-/axios-0.21.4.tgz", + "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", "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=" - } + "follow-redirects": "^1.14.0" } }, "babel-runtime": { "version": "6.26.0", - "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", - "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=", + "resolved": "https://registry.npmmirror.com/babel-runtime/-/babel-runtime-6.26.0.tgz", + "integrity": "sha512-ITKNuq2wKlW1fJg9sSW52eepoYgZBggvOAHC0u/CYu/qxQ9EVzThCgR69BnSXLHjy2f7SY5zaQ4yt7H9ZVxY2g==", "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=", + "resolved": "https://registry.npmmirror.com/babel-types/-/babel-types-6.26.0.tgz", + "integrity": "sha512-zhe3V/26rCWsEZK8kZN+HaQj5yQ1CilTObixFzKW1UWjqG7618Twz6YEsCnjfg5gBcJh02DrpCkS9h98ZqDY+g==", "requires": { "babel-runtime": "^6.26.0", "esutils": "^2.0.2", @@ -356,10426 +4971,3061 @@ }, "babylon": { "version": "6.18.0", - "resolved": "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz", + "resolved": "https://registry.npmmirror.com/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=" + "backo2": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/backo2/-/backo2-1.0.2.tgz", + "integrity": "sha512-zj6Z6M7Eq+PBZ7PQxl5NT665MvJdAkzp0f60nAJ+sLaSCBPMwVak5ZegFbgVCzFcCJTKFoMizvM5Ld7+JrRJHA==" }, - "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, + "balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" + }, + "base64-arraybuffer": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/base64-arraybuffer/-/base64-arraybuffer-0.1.4.tgz", + "integrity": "sha512-a1eIFi4R9ySrbiMuyTGx5e92uRH5tQY6kArNcFaKBUleIoLjdjBg7Zxm3Mqm3Kmkf27HLR/1fnxX9q8GQ7Iavg==" + }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, + "basic-auth": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/basic-auth/-/basic-auth-2.0.1.tgz", + "integrity": "sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==", "requires": { - "tweetnacl": "^0.14.3" + "safe-buffer": "5.1.2" } }, + "batch": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/batch/-/batch-0.6.1.tgz", + "integrity": "sha512-x+VAiMRL6UPkx+kudNvxTl6hB2XNNCG2r+7wixVfIYwu/2HKRXimwQyaumLjMveWvT2Hkd/cAJw+QBMfJ/EKVw==" + }, "binary-extensions": { - "version": "1.11.0", - "resolved": "https://registry.npm.taobao.org/binary-extensions/download/binary-extensions-1.11.0.tgz", - "integrity": "sha1-RqoXUftqL5PuXmibsQh9SxTGwgU=" + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/binary-extensions/-/binary-extensions-2.2.0.tgz", + "integrity": "sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==" + }, + "blob": { + "version": "0.0.5", + "resolved": "https://registry.npmmirror.com/blob/-/blob-0.0.5.tgz", + "integrity": "sha512-gaqbzQPqOoamawKg0LGVd7SzLgXS+JH61oWprSLH+P+abTczqJbhTR8CmJ2u9/bUYNmHTGJx/UEmn6doAvvuig==" }, "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" - } + "version": "3.7.2", + "resolved": "https://registry.npmmirror.com/bluebird/-/bluebird-3.7.2.tgz", + "integrity": "sha512-XpNj6GDQzdfW+r2Wnn7xiSAd7TM3jzkxGXBGTtWKuSXv1xUV+azxAm8jdWZN06QTQk+2N2XB9jRDkvbmQmcRtg==" }, "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=", + "version": "1.1.11", + "resolved": "https://registry.npmmirror.com/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", "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=", + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/braces/-/braces-3.0.2.tgz", + "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", "requires": { - "expand-range": "^1.8.1", - "preserve": "^0.2.0", - "repeat-element": "^1.1.2" + "fill-range": "^7.0.1" } }, - "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=" + "browser-process-hrtime": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz", + "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==" }, - "camel-case": { - "version": "3.0.0", - "resolved": "https://registry.npm.taobao.org/camel-case/download/camel-case-3.0.0.tgz", - "integrity": "sha1-yjw2iKTpzzpM2nd9xNy8cTJJz3M=", + "browser-sync": { + "version": "2.27.7", + "resolved": "https://registry.npmmirror.com/browser-sync/-/browser-sync-2.27.7.tgz", + "integrity": "sha512-9ElnnA/u+s2Jd+IgY+2SImB+sAEIteHsMG0NR96m7Ph/wztpvJCUpyC2on1KqmG9iAp941j+5jfmd34tEguGbg==", "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" + "browser-sync-client": "^2.27.7", + "browser-sync-ui": "^2.27.7", + "bs-recipes": "1.3.4", + "bs-snippet-injector": "^2.0.1", + "chokidar": "^3.5.1", + "connect": "3.6.6", + "connect-history-api-fallback": "^1", + "dev-ip": "^1.0.1", + "easy-extender": "^2.3.4", + "eazy-logger": "3.1.0", + "etag": "^1.8.1", + "fresh": "^0.5.2", + "fs-extra": "3.0.1", + "http-proxy": "^1.18.1", + "immutable": "^3", + "localtunnel": "^2.0.1", + "micromatch": "^4.0.2", + "opn": "5.3.0", + "portscanner": "2.1.1", + "qs": "6.2.3", + "raw-body": "^2.3.2", + "resp-modifier": "6.0.2", + "rx": "4.1.0", + "send": "0.16.2", + "serve-index": "1.9.1", + "serve-static": "1.13.2", + "server-destroy": "1.0.1", + "socket.io": "2.4.0", + "ua-parser-js": "1.0.2", + "yargs": "^15.4.1" }, "dependencies": { - "nan": { - "version": "2.13.1", - "resolved": "https://registry.npmjs.org/nan/-/nan-2.13.1.tgz", - "integrity": "sha512-I6YB/YEuDeUZMmhscXKxGgZlFnhsn5y0hgOZBadkzfTRrZBtJDZeg6eQf7PYMIEclwmorTKK8GztsyOUSVBREA==" + "connect": { + "version": "3.6.6", + "resolved": "https://registry.npmmirror.com/connect/-/connect-3.6.6.tgz", + "integrity": "sha512-OO7axMmPpu/2XuX1+2Yrg0ddju31B6xLZMWkJ5rYBu4YRmRVlOjvlY6kw2FJKiAzyxGwnrDUAG4s1Pf0sbBMCQ==", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.0", + "parseurl": "~1.3.2", + "utils-merge": "1.0.1" + } + }, + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "finalhandler": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.0.tgz", + "integrity": "sha512-ejnvM9ZXYzp6PUPUyQBMBf0Co5VX2gr5H2VQe2Ui2jWXNlxv+PYZo8wpAymJNJdLsG1R4p+M4aynF8KuoUEwRw==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.1", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.2", + "statuses": "~1.3.1", + "unpipe": "~1.0.0" + } + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + }, + "dependencies": { + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + } + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "mime": { + "version": "1.4.1", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.4.1.tgz", + "integrity": "sha512-KI1+qOZu5DcW6wayYHSzR/tXKCDC5Om4s1z2QJjDULzLcmf3DvzS7oluY4HCTrc+9FiKmWUgeNLg7W3uIQvxtQ==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "send": { + "version": "0.16.2", + "resolved": "https://registry.npmmirror.com/send/-/send-0.16.2.tgz", + "integrity": "sha512-E64YFPUssFHEFBvpbbjr44NCLtI1AohxQ8ZSiJjQLskAdKuriYEP6VyGEsRDH8ScozGpkaX1BGvhanqCwkcEZw==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "~1.6.2", + "mime": "1.4.1", + "ms": "2.0.0", + "on-finished": "~2.3.0", + "range-parser": "~1.2.0", + "statuses": "~1.4.0" + }, + "dependencies": { + "statuses": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.4.0.tgz", + "integrity": "sha512-zhSCtt8v2NDrRlPQpCNtw/heZLtfUDqxBM1udqikb/Hbk52LK4nQSwr10u77iopCW5LsyHpuXS0GnEc48mLeew==" + } + } + }, + "serve-static": { + "version": "1.13.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.13.2.tgz", + "integrity": "sha512-p/tdJrO4U387R9oMjb1oj7qSMaMfmOyd4j9hOFoxZe2baQszgHcSWjuya/CiT5kgZZKRudHNOA0pYXOl8rQ5nw==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.2", + "send": "0.16.2" + } + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + }, + "statuses": { + "version": "1.3.1", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.3.1.tgz", + "integrity": "sha512-wuTCPGlJONk/a1kqZ4fQM2+908lC7fa7nPYpTC1EhnvqLX/IICbeP1OZGDtA374trpSq68YubKUMo8oRhN46yg==" } } }, - "caseless": { - "version": "0.12.0", - "resolved": "https://registry.npm.taobao.org/caseless/download/caseless-0.12.0.tgz", - "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw=", - "optional": true + "browser-sync-client": { + "version": "2.27.7", + "resolved": "https://registry.npmmirror.com/browser-sync-client/-/browser-sync-client-2.27.7.tgz", + "integrity": "sha512-wKg9UP9a4sCIkBBAXUdbkdWFJzfSAQizGh+nC19W9y9zOo9s5jqeYRFUUbs7x5WKhjtspT+xetVp9AtBJ6BmWg==", + "requires": { + "etag": "1.8.1", + "fresh": "0.5.2", + "mitt": "^1.1.3", + "rxjs": "^5.5.6" + } + }, + "browser-sync-ui": { + "version": "2.27.7", + "resolved": "https://registry.npmmirror.com/browser-sync-ui/-/browser-sync-ui-2.27.7.tgz", + "integrity": "sha512-Bt4OQpx9p18OIzk0KKyu7jqlvmjacasUlk8ARY3uuIyiFWSBiRgr2i6XY8dEMF14DtbooaEBOpHEu9VCYvMcCw==", + "requires": { + "async-each-series": "0.1.1", + "connect-history-api-fallback": "^1", + "immutable": "^3", + "server-destroy": "1.0.1", + "socket.io-client": "^2.4.0", + "stream-throttle": "^0.1.3" + } + }, + "bs-recipes": { + "version": "1.3.4", + "resolved": "https://registry.npmmirror.com/bs-recipes/-/bs-recipes-1.3.4.tgz", + "integrity": "sha512-BXvDkqhDNxXEjeGM8LFkSbR+jzmP/CYpCiVKYn+soB1dDldeU15EBNDkwVXndKuX35wnNUaPd0qSoQEAkmQtMw==" + }, + "bs-snippet-injector": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/bs-snippet-injector/-/bs-snippet-injector-2.0.1.tgz", + "integrity": "sha512-4u8IgB+L9L+S5hknOj3ddNSb42436gsnGm1AuM15B7CdbkpQTyVWgIM5/JUBiKiRwGOR86uo0Lu/OsX+SAlJmw==" + }, + "bytes": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.0.0.tgz", + "integrity": "sha512-pMhOfFDPiv9t5jjIXkHosWmkSyQbvsgEVNkz0ERHbuLh2T/7j4Mqqpz523Fe8MVY89KC6Sh/QfS2sM+SjgFDcw==" + }, + "call-bind": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/call-bind/-/call-bind-1.0.2.tgz", + "integrity": "sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==", + "requires": { + "function-bind": "^1.1.1", + "get-intrinsic": "^1.0.2" + } + }, + "camel-case": { + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/camel-case/-/camel-case-4.1.2.tgz", + "integrity": "sha512-gxGWBrTT1JuMx6R+o5PTXMmUnhnVzLQ9SNutD4YqKtI6ap897t3tKECYla6gCWEkplXnlNybEkZg9GEGxKFCgw==", + "requires": { + "pascal-case": "^3.1.2", + "tslib": "^2.0.3" + } + }, + "camelcase": { + "version": "5.3.1", + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-5.3.1.tgz", + "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==" }, "center-align": { "version": "0.1.3", - "resolved": "https://registry.npm.taobao.org/center-align/download/center-align-0.1.3.tgz", - "integrity": "sha1-qg0yYptu6XIgBBHL1EYckHvCt60=", + "resolved": "https://registry.npmmirror.com/center-align/-/center-align-0.1.3.tgz", + "integrity": "sha512-Baz3aNe2gd2LP2qk5U+sDk/m4oSuwSDcBfayTCTBoWpfIGO5XFxPmjILQII4NGiZjD6DoDI6kf7gKaxkf7s3VQ==", "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=", + "version": "4.1.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "requires": { - "ansi-styles": "^3.1.0", - "escape-string-regexp": "^1.0.5", - "supports-color": "^4.0.0" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.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" - } + "character-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/character-parser/-/character-parser-1.2.1.tgz", + "integrity": "sha512-6OEBVBlf/y8LaAphnbAnt743O3zMhlBer+FO5D40H6wqAdU9B1TvuApkejgLW0cvv0tEZNLktv1AnRI+C87ueQ==" }, "chokidar": { - "version": "1.7.0", - "resolved": "https://registry.npm.taobao.org/chokidar/download/chokidar-1.7.0.tgz", - "integrity": "sha1-eY5ol3gVHIB2tLNg5e3SjNortGg=", + "version": "3.5.3", + "resolved": "https://registry.npmmirror.com/chokidar/-/chokidar-3.5.3.tgz", + "integrity": "sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==", "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" + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "fsevents": "~2.3.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.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=", + "clean-css": { + "version": "3.4.28", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-3.4.28.tgz", + "integrity": "sha512-aTWyttSdI2mYi07kWqHi24NUU9YlELFKGOAgFzZjDN1064DMAOy2FBuoyGmkKRlXkbpXd0EVHmiVkbKhKoirTw==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1", - "wrap-ansi": "^2.0.0" + "commander": "2.8.x", + "source-map": "0.4.x" }, "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=", + "commander": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.8.1.tgz", + "integrity": "sha512-+pJLBFVk+9ZZdlAOB5WuIElVPPth47hILFkmGym57aq8kwxsowvByvB0DHs1vQAhyMZzdcpTtF0VDKGkSDR4ZQ==", "requires": { - "ansi-regex": "^2.0.0" + "graceful-readlink": ">= 1.0.0" + } + }, + "source-map": { + "version": "0.4.4", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.4.4.tgz", + "integrity": "sha512-Y8nIfcb1s/7DcobUz1yOO1GSp7gyL+D9zLHDehT7iRESqGSxjJ448Sg7rvfgsRJCnKLdSl11uGf0s9X80cH0/A==", + "requires": { + "amdefine": ">=0.0.4" } } } }, - "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=" + "cliui": { + "version": "7.0.4", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-7.0.4.tgz", + "integrity": "sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^7.0.0" + } }, "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=", + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", "requires": { - "color-name": "^1.1.1" + "color-name": "~1.1.4" } }, "color-name": { - "version": "1.1.3", - "resolved": "https://registry.npm.taobao.org/color-name/download/color-name-1.1.3.tgz", - "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=" + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "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, + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", "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=" + "version": "1.2.9", + "resolved": "https://registry.npmmirror.com/command-exists/-/command-exists-1.2.9.tgz", + "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==" }, "commander": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-5.0.0.tgz", - "integrity": "sha512-JrDGPAKjMGSP1G0DUoaceEJ3DZgAfr/q6X7FVk4+U5KxUSKviYGM2k6zWkfyyBHy5rAtzgYJFa1ro2O9PtoxwQ==" + "version": "5.1.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-5.1.0.tgz", + "integrity": "sha512-P0CysNDQ7rtVw4QIQtm+MRxV66vKFSvlsQvGYXZWR3qFU0jlMKHZZZgw8e+8DSah4UDKMqnknRDQz+xuQXQ/Zg==" }, - "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": { + "component-bind": { "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 + "resolved": "https://registry.npmmirror.com/component-bind/-/component-bind-1.0.0.tgz", + "integrity": "sha512-WZveuKPeKAG9qY+FkYDeADzdHyTYdIboXS59ixDeRJL5ZhxpqUnxSOwop4FQjMsiYm3/Or8cegVbpAHNA7pHxw==" }, - "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": { + "component-emitter": { "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-1.3.0.tgz", - "integrity": "sha1-sXrtguirWeUt2cGbF1bg/BhyBMI=" + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.3.0.tgz", + "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==" }, - "domhandler": { - "version": "2.3.0", - "resolved": "https://registry.npm.taobao.org/domhandler/download/domhandler-2.3.0.tgz", - "integrity": "sha1-LeWaCCLVAn+r/28DLCsloqir5zg=", + "component-inherit": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/component-inherit/-/component-inherit-0.0.3.tgz", + "integrity": "sha512-w+LhYREhatpVqTESyGFg3NlP6Iu0kEKUHETY9GoZP/pQyW4mHFZuFWRUCIqVPZ36ueVLtoOEZaAqbCF2RDndaA==" + }, + "compressible": { + "version": "2.0.18", + "resolved": "https://registry.npmmirror.com/compressible/-/compressible-2.0.18.tgz", + "integrity": "sha512-AF3r7P5dWxL8MxyITRMlORQNaOA2IkAFaTr4k7BUumjPtRpGDTZpl0Pb1XCO6JeDCBdp126Cgs9sMxqSjgYyRg==", "requires": { - "domelementtype": "1" + "mime-db": ">= 1.43.0 < 2" } }, - "domutils": { - "version": "1.5.1", - "resolved": "https://registry.npm.taobao.org/domutils/download/domutils-1.5.1.tgz", - "integrity": "sha1-3NhIiib1Y9YQeeSMn3t+Mjc2gs8=", + "compression": { + "version": "1.7.4", + "resolved": "https://registry.npmmirror.com/compression/-/compression-1.7.4.tgz", + "integrity": "sha512-jaSIDzP9pZVS4ZfQ+TzvtiWhdpFhE2RDHz8QJkpX9SIpLq88VueF5jJw6t+6CUQcAoA6t+x89MLrWAqpfDE8iQ==", "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" + "accepts": "~1.3.5", + "bytes": "3.0.0", + "compressible": "~2.0.16", + "debug": "2.6.9", + "on-headers": "~1.0.2", + "safe-buffer": "5.1.2", + "vary": "~1.1.2" }, "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, + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "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, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "concat-map": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/concat-map/-/concat-map-0.0.1.tgz", + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" + }, + "connect": { + "version": "3.7.0", + "resolved": "https://registry.npmmirror.com/connect/-/connect-3.7.0.tgz", + "integrity": "sha512-ZqRXc+tZukToSNmh5C2iWMSoV3X1YUcPbqEM4DkEG5tNQXrQUZCNVGGv3IuicnkMtPfGf3Xtp8WCXs295iQ1pQ==", + "requires": { + "debug": "2.6.9", + "finalhandler": "1.1.2", + "parseurl": "~1.3.3", + "utils-merge": "1.0.1" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "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": "2.0.0" } }, "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 + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, - "gauge": { - "version": "2.7.4", - "resolved": "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz", - "integrity": "sha1-LANAXHU4w51+s3sxcCLjJfsBi/c=", + "connect-history-api-fallback": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz", + "integrity": "sha512-e54B99q/OUoH64zYYRf3HBP5z24G38h5D3qXu23JGRoigpX5Ss4r9ZnDk3g0Z8uQC2x2lPaJ+UlWBc1ZWBWdLg==" + }, + "connect-injector": { + "version": "0.4.4", + "resolved": "https://registry.npmmirror.com/connect-injector/-/connect-injector-0.4.4.tgz", + "integrity": "sha512-hdBG8nXop42y2gWCqOV8y1O3uVk4cIU+SoxLCPyCUKRImyPiScoNiSulpHjoktRU1BdI0UzoUdxUa87thrcmHw==", "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" + "debug": "^2.0.0", + "q": "^1.0.1", + "stream-buffers": "^0.2.3", + "uberproto": "^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=", + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", "requires": { - "ansi-regex": "^2.0.0" + "ms": "2.0.0" } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" } } }, - "getpass": { - "version": "0.1.7", - "resolved": "https://registry.npm.taobao.org/getpass/download/getpass-0.1.7.tgz", - "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=", - "optional": true, + "constantinople": { + "version": "3.0.2", + "resolved": "https://registry.npmmirror.com/constantinople/-/constantinople-3.0.2.tgz", + "integrity": "sha512-UnEggAQrmhxuTxlb7n1OsTtagNXWUv2CRlOogZhWOU4jLK4EJEbF8UDSNxuGu+jVtWNtO2j51ab2H1wlBIzF/w==", "requires": { - "assert-plus": "^1.0.0" + "acorn": "^2.1.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==" + } + } + }, + "cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-ZwrFkGJxUR3EIoXtO+yVE69Eb7KlixbaeAWfBQB9vVsNn/o+Yw69gBWSSDK825hQNdN+wF8zELf3dFNl/kxkUA==" + }, + "core-js": { + "version": "2.6.12", + "resolved": "https://registry.npmmirror.com/core-js/-/core-js-2.6.12.tgz", + "integrity": "sha512-Kb2wC0fvsWfQrgk8HU5lW6U/Lcs8+9aaYcy4ZFc6DDlo4nZ7n70dEgE5rtR0oG6ufKDUnrwfWL1mXR5ljDatrQ==" + }, + "cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmmirror.com/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "requires": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + } + }, + "css": { + "version": "2.2.4", + "resolved": "https://registry.npmmirror.com/css/-/css-2.2.4.tgz", + "integrity": "sha512-oUnjmWpy0niI3x/mPL8dVEI1l7MnG3+HHyRPHf+YFSbK+svOhXpmSOcDURUh2aOCgl2grzrOPt1nHLuCVFULLw==", + "requires": { + "inherits": "^2.0.3", + "source-map": "^0.6.1", + "source-map-resolve": "^0.5.2", + "urix": "^0.1.0" + } + }, + "css-parse": { + "version": "1.7.0", + "resolved": "https://registry.npmmirror.com/css-parse/-/css-parse-1.7.0.tgz", + "integrity": "sha512-OI38lO4JQQX2GSisTqwiSFxiWNmLajXdW4tCCxAuiwGKjusHALQadSHBSxGlU8lrFp47IkLuU2AfSYz31qpETQ==" + }, + "css-stringify": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/css-stringify/-/css-stringify-1.0.5.tgz", + "integrity": "sha512-aIThpcErhG5EyHorGqNlTh0TduNBqLrrXLO3x5rku3ZKBxuVfY+T7noyM2G2X/01iQANqJUb6d3+FLoa+N7Xwg==" + }, + "cssom": { + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.5.0.tgz", + "integrity": "sha512-iKuQcq+NdHqlAcwUY0o/HL69XQrUaQdMjmStJ8JFmUaiiQErlhrmuigkg/CU4E2J0IyUKUrMAgl36TvN67MqTw==" + }, + "cssstyle": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/cssstyle/-/cssstyle-2.3.0.tgz", + "integrity": "sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==", + "requires": { + "cssom": "~0.3.6" + }, + "dependencies": { + "cssom": { + "version": "0.3.8", + "resolved": "https://registry.npmmirror.com/cssom/-/cssom-0.3.8.tgz", + "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==" + } + } + }, + "cuid": { + "version": "2.1.8", + "resolved": "https://registry.npmmirror.com/cuid/-/cuid-2.1.8.tgz", + "integrity": "sha512-xiEMER6E7TlTPnDxrM4eRiC6TRgjNX9xzEZ5U/Se2YJKr7Mq4pJn/2XEHjl3STcSh96GmkHPcBXLES8M29wyyg==" + }, + "data-urls": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/data-urls/-/data-urls-3.0.1.tgz", + "integrity": "sha512-Ds554NeT5Gennfoo9KN50Vh6tpgtvYEwraYjejXnyTpu1C7oXKxdFk75REooENHE8ndTVOJuv+BEs4/J/xcozw==", + "requires": { + "abab": "^2.0.3", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0" + } + }, + "debug": { + "version": "4.3.3", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.3.tgz", + "integrity": "sha512-/zxw5+vh1Tfv+4Qn7a5nsbcJKPaSvCDhojn6FEl9vupwK2VCSDtEiEtqr8DFtzYFOdz63LBkxec7DYuc2jon6Q==", + "requires": { + "ms": "2.1.2" + } + }, + "decamelize": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/decamelize/-/decamelize-1.2.0.tgz", + "integrity": "sha512-z2S+W9X73hAUUki+N+9Za2lBlun89zigOyGrsax+KUQ6wKW4ZoWpEYBkGhQjwAjjDCkWxhY0VKEhk8wzY7F5cA==" + }, + "decimal.js": { + "version": "10.3.1", + "resolved": "https://registry.npmmirror.com/decimal.js/-/decimal.js-10.3.1.tgz", + "integrity": "sha512-V0pfhfr8suzyPGOx3nmq4aHqabehUZn6Ch9kyFpV79TGDTWFmHqUqXdabR7QHqxzrYolF4+tVmJhUG4OURg5dQ==" + }, + "decode-uri-component": { + "version": "0.2.0", + "resolved": "https://registry.npmmirror.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz", + "integrity": "sha512-hjf+xovcEn31w/EUYdTXQh/8smFL/dzYjohQGEIgjyNavaJfBY2p5F527Bo1VPATxv0VYTUC2bOcXvqFwk78Og==" + }, + "deep-is": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/deep-is/-/deep-is-0.1.4.tgz", + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" + }, + "deepmerge": { + "version": "4.2.2", + "resolved": "https://registry.npmmirror.com/deepmerge/-/deepmerge-4.2.2.tgz", + "integrity": "sha512-FJ3UgI4gIl+PHZm53knsuSFpE+nESMr7M4v9QcgB7S63Kj/6WqMiFQJpBBYz1Pt+66bZpP3Q7Lye0Oo9MPKEdg==" + }, + "define-lazy-prop": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/define-lazy-prop/-/define-lazy-prop-2.0.0.tgz", + "integrity": "sha512-Ds09qNh8yw3khSjiJjiUInaGX9xlqZDY7JVryGxdxV7NPeuqQfplOpQ66yJFZut3jLa5zOwkXw1g9EI2uKh4Og==" + }, + "delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==" + }, + "depd": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/depd/-/depd-2.0.0.tgz", + "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==" + }, + "destroy": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/destroy/-/destroy-1.0.4.tgz", + "integrity": "sha512-3NdhDuEXnfun/z7x9GOElY49LoqVHoGScmOKwmxhsS8N5Y+Z8KyPPDnaSzqWgYt/ji4mqwfTS34Htrk0zPIXVg==" + }, + "dev-ip": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/dev-ip/-/dev-ip-1.0.1.tgz", + "integrity": "sha512-LmVkry/oDShEgSZPNgqCIp2/TlqtExeGmymru3uCELnfyjY11IzpAproLYs+1X88fXO6DBoYP3ul2Xo2yz2j6A==" + }, + "dlv": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/dlv/-/dlv-1.1.3.tgz", + "integrity": "sha512-+HlytyjlPKnIG8XuRG8WvmBP8xs8P71y+SKKS6ZXWoEgLuePxtDoUEiH7WkdePWrQ5JBpE6aoVqfZfJUQkjXwA==" + }, + "doctypes": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/doctypes/-/doctypes-1.1.0.tgz", + "integrity": "sha512-LLBi6pEqS6Do3EKQ3J0NqHWV5hhb78Pi8vvESYwyOy2c31ZEZVdtitdzsQsKb7878PEERhzUk0ftqGhG6Mz+pQ==" + }, + "dom-serializer": { + "version": "1.3.2", + "resolved": "https://registry.npmmirror.com/dom-serializer/-/dom-serializer-1.3.2.tgz", + "integrity": "sha512-5c54Bk5Dw4qAxNOI1pFEizPSjVsx5+bpJKmL2kPn8JhBUq2q09tTCa3mjijun2NfK78NMouDYNMBkOrPZiS+ig==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^4.2.0", + "entities": "^2.0.0" + } + }, + "domelementtype": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/domelementtype/-/domelementtype-2.2.0.tgz", + "integrity": "sha512-DtBMo82pv1dFtUmHyr48beiuq792Sxohr+8Hm9zoxklYPfa6n0Z3Byjj2IV7bmr2IyqClnqEQhfgHJJ5QF0R5A==" + }, + "domexception": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/domexception/-/domexception-4.0.0.tgz", + "integrity": "sha512-A2is4PLG+eeSfoTMA95/s4pvAoSo2mKtiM5jlHkAVewmiO8ISFTFKZjH7UAM1Atli/OT/7JHOrJRJiMKUZKYBw==", + "requires": { + "webidl-conversions": "^7.0.0" + } + }, + "domhandler": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-4.3.0.tgz", + "integrity": "sha512-fC0aXNQXqKSFTr2wDNZDhsEYjCiYsDWl3D01kwt25hm1YIPyDGHvvi3rw+PLqHAl/m71MaiF7d5zvBr0p5UB2g==", + "requires": { + "domelementtype": "^2.2.0" + } + }, + "dompurify": { + "version": "2.3.5", + "resolved": "https://registry.npmmirror.com/dompurify/-/dompurify-2.3.5.tgz", + "integrity": "sha512-kD+f8qEaa42+mjdOpKeztu9Mfx5bv9gVLO6K9jRx4uGvh6Wv06Srn4jr1wPNY2OOUGGSKHNFN+A8MA3v0E0QAQ==" + }, + "domutils": { + "version": "2.8.0", + "resolved": "https://registry.npmmirror.com/domutils/-/domutils-2.8.0.tgz", + "integrity": "sha512-w96Cjofp72M5IIhpjgobBimYEfoPjx1Vx0BSX9P30WBdZW2WIKU0T1Bd0kz2eNZ9ikjKgHbEyKx8BB6H1L3h3A==", + "requires": { + "dom-serializer": "^1.0.1", + "domelementtype": "^2.2.0", + "domhandler": "^4.2.0" + } + }, + "easy-extender": { + "version": "2.3.4", + "resolved": "https://registry.npmmirror.com/easy-extender/-/easy-extender-2.3.4.tgz", + "integrity": "sha512-8cAwm6md1YTiPpOvDULYJL4ZS6WfM5/cTeVVh4JsvyYZAoqlRVUpHL9Gr5Fy7HA6xcSZicUia3DeAgO3Us8E+Q==", + "requires": { + "lodash": "^4.17.10" + } + }, + "eazy-logger": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/eazy-logger/-/eazy-logger-3.1.0.tgz", + "integrity": "sha512-/snsn2JqBtUSSstEl4R0RKjkisGHAhvYj89i7r3ytNUKW12y178KDZwXLXIgwDqLW6E/VRMT9qfld7wvFae8bQ==", + "requires": { + "tfunk": "^4.0.0" + } + }, + "ee-first": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/ee-first/-/ee-first-1.1.1.tgz", + "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==" + }, + "ejs": { + "version": "3.1.6", + "resolved": "https://registry.npmmirror.com/ejs/-/ejs-3.1.6.tgz", + "integrity": "sha512-9lt9Zse4hPucPkoP7FHDF0LQAlGyF9JVpnClFLFH3aSSbxmyoqINRpp/9wePWJTUl4KOQwRL72Iw3InHPDkoGw==", + "requires": { + "jake": "^10.6.1" + } + }, + "emoji-regex": { + "version": "8.0.0", + "resolved": "https://registry.npmmirror.com/emoji-regex/-/emoji-regex-8.0.0.tgz", + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" + }, + "encodeurl": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/encodeurl/-/encodeurl-1.0.2.tgz", + "integrity": "sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==" + }, + "engine.io": { + "version": "3.5.0", + "resolved": "https://registry.npmmirror.com/engine.io/-/engine.io-3.5.0.tgz", + "integrity": "sha512-21HlvPUKaitDGE4GXNtQ7PLP0Sz4aWLddMPw2VTyFz1FVZqu/kZsJUO8WNpKuE/OCL7nkfRaOui2ZCJloGznGA==", + "requires": { + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "debug": "~4.1.0", + "engine.io-parser": "~2.2.0", + "ws": "~7.4.2" + }, + "dependencies": { + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmmirror.com/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} + } + } + }, + "engine.io-client": { + "version": "3.5.2", + "resolved": "https://registry.npmmirror.com/engine.io-client/-/engine.io-client-3.5.2.tgz", + "integrity": "sha512-QEqIp+gJ/kMHeUun7f5Vv3bteRHppHH/FMBQX/esFj/fuYfjyUKWGMo3VCvIP/V8bE9KcjHmRZrhIz2Z9oNsDA==", + "requires": { + "component-emitter": "~1.3.0", + "component-inherit": "0.0.3", + "debug": "~3.1.0", + "engine.io-parser": "~2.2.0", + "has-cors": "1.1.0", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "ws": "~7.4.2", + "xmlhttprequest-ssl": "~1.6.2", + "yeast": "0.1.2" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "ws": { + "version": "7.4.6", + "resolved": "https://registry.npmmirror.com/ws/-/ws-7.4.6.tgz", + "integrity": "sha512-YmhHDO4MzaDLB+M9ym/mDA5z0naX8j7SIlT8f8z+I0VtzsRbekxEutHSme7NPS2qE8StCYQNUnfWdXta/Yu85A==", + "requires": {} + } + } + }, + "engine.io-parser": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/engine.io-parser/-/engine.io-parser-2.2.1.tgz", + "integrity": "sha512-x+dN/fBH8Ro8TFwJ+rkB2AmuVw9Yu2mockR/p3W8f8YtExwFgDvBDi0GWyb4ZLkpahtDGZgtr3zLovanJghPqg==", + "requires": { + "after": "0.8.2", + "arraybuffer.slice": "~0.0.7", + "base64-arraybuffer": "0.1.4", + "blob": "0.0.5", + "has-binary2": "~1.0.2" + } + }, + "entities": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/entities/-/entities-2.2.0.tgz", + "integrity": "sha512-p92if5Nz619I0w+akJrLZH0MX0Pb5DX39XOwQTtXSdQQOaYH03S1uIQp4mhOZtAXrxq4ViO67YTiLBo2638o9A==" + }, + "escalade": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/escalade/-/escalade-3.1.1.tgz", + "integrity": "sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==" + }, + "escape-html": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/escape-html/-/escape-html-1.0.3.tgz", + "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==" + }, + "escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmmirror.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==" + }, + "escodegen": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/escodegen/-/escodegen-2.0.0.tgz", + "integrity": "sha512-mmHKys/C8BFUGI+MAWNcSYoORYLMdPzjrknd2Vc+bUsjN5bXcr8EhrNB+UTqfL1y3I9c4fw2ihgtMPQLBRiQxw==", + "requires": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2", + "optionator": "^0.8.1", + "source-map": "~0.6.1" + } + }, + "esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmmirror.com/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==" + }, + "estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==" + }, + "esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==" + }, + "etag": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/etag/-/etag-1.8.1.tgz", + "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==" + }, + "eventemitter3": { + "version": "4.0.7", + "resolved": "https://registry.npmmirror.com/eventemitter3/-/eventemitter3-4.0.7.tgz", + "integrity": "sha512-8guHBZCwKnFhYdHr2ysuRWErTwhoN2X8XELRlrRwpmfeY2jjuUN4taQMsULKUVo1K4DvZl+0pgfyoysHxvmvEw==" + }, + "fast-equals": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/fast-equals/-/fast-equals-2.0.4.tgz", + "integrity": "sha512-caj/ZmjHljPrZtbzJ3kfH5ia/k4mTJe/qSiXAGzxZWRZgsgDV0cvNaQULqUX8t0/JVlzzEdYOwCN5DmzTxoD4w==" + }, + "fast-levenshtein": { + "version": "2.0.6", + "resolved": "https://registry.npmmirror.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" + }, + "filelist": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/FileList/-/FileList-1.0.2.tgz", + "integrity": "sha512-z7O0IS8Plc39rTCq6i6iHxk43duYOn8uFJiWSewIq0Bww1RNybVHSCjahmcC87ZqAm4OTvFzlzeGu3XAzG1ctQ==", + "requires": { + "minimatch": "^3.0.4" + } + }, + "fill-range": { + "version": "7.0.1", + "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", + "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", + "requires": { + "to-regex-range": "^5.0.1" + } + }, + "finalhandler": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/finalhandler/-/finalhandler-1.1.2.tgz", + "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "~2.3.0", + "parseurl": "~1.3.3", + "statuses": "~1.5.0", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-up": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/find-up/-/find-up-4.1.0.tgz", + "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", + "requires": { + "locate-path": "^5.0.0", + "path-exists": "^4.0.0" + } + }, + "follow-redirects": { + "version": "1.14.7", + "resolved": "https://registry.npmmirror.com/follow-redirects/-/follow-redirects-1.14.7.tgz", + "integrity": "sha512-+hbxoLbFMbRKDwohX8GkTataGqO6Jb7jGwpAlwgy2bIz25XtRm7KEzJM76R1WiNT5SwZkX4Y75SwBolkpmE7iQ==" + }, + "form-data": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/form-data/-/form-data-4.0.0.tgz", + "integrity": "sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==", + "requires": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "mime-types": "^2.1.12" + } + }, + "fresh": { + "version": "0.5.2", + "resolved": "https://registry.npmmirror.com/fresh/-/fresh-0.5.2.tgz", + "integrity": "sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==" + }, + "fs-extra": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/fs-extra/-/fs-extra-3.0.1.tgz", + "integrity": "sha512-V3Z3WZWVUYd8hoCL5xfXJCaHWYzmtwW5XWYSlLgERi8PWd8bx1kUHUk8L1BT57e49oKnDDD180mjfrHc1yA9rg==", + "requires": { + "graceful-fs": "^4.1.2", + "jsonfile": "^3.0.0", + "universalify": "^0.1.0" + } + }, + "fs.realpath": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/fs.realpath/-/fs.realpath-1.0.0.tgz", + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" + }, + "fsevents": { + "version": "2.3.2", + "resolved": "https://registry.npmmirror.com/fsevents/-/fsevents-2.3.2.tgz", + "integrity": "sha512-xiqMQR4xAeHTuB9uWm+fFRcIOgKBMiOBP+eXiyT7jsgVCq1bkVygt00oASowB7EdtpOHaaPgKt812P9ab+DDKA==", + "optional": true + }, + "function-bind": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/function-bind/-/function-bind-1.1.1.tgz", + "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==" + }, + "get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==" + }, + "get-intrinsic": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/get-intrinsic/-/get-intrinsic-1.1.1.tgz", + "integrity": "sha512-kWZrnVM42QCiEA2Ig1bG8zjoIMOgxWwYCEeNdwY6Tv/cOSeGpcoX4pXHfKUxNKVoArnrEr2e9srnAxxGIraS9Q==", + "requires": { + "function-bind": "^1.1.1", + "has": "^1.0.3", + "has-symbols": "^1.0.1" } }, "glob": { - "version": "6.0.4", - "resolved": "https://registry.npm.taobao.org/glob/download/glob-6.0.4.tgz", - "integrity": "sha1-DwiGD2oVUSey+t1PnOJLGqtuTSI=", - "optional": true, + "version": "7.0.6", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.0.6.tgz", + "integrity": "sha512-f8c0rE8JiCxpa52kWPAOa3ZaYEnzofDzCQLCn3Vdk0Z5OVLq3BsRFJI4S4ykpeVW6QMGBUkMeUpoEgWnMTnw5Q==", "requires": { + "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "2 || 3", + "minimatch": "^3.0.2", "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=", + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", "requires": { - "is-glob": "^2.0.0" + "is-glob": "^4.0.1" } }, - "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=" + "version": "4.2.9", + "resolved": "https://registry.npmmirror.com/graceful-fs/-/graceful-fs-4.2.9.tgz", + "integrity": "sha512-NtNxqUcXgpW2iMrfqSfR73Glt39K+BLwWsPs94yR63v45T0Wbej7eRmL5cWfwEgqXnmjQp3zaJTshdRW/qC2ZQ==" }, - "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 + "graceful-readlink": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/graceful-readlink/-/graceful-readlink-1.0.1.tgz", + "integrity": "sha512-8tLu60LgxF6XpdbK8OW3FA+IfTNBn1ZHGHKF4KQbEeSkajYw5PlYJcKluntgegDPTg8UkHjpet1T82vk6TQ68w==" }, - "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, + "has": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has/-/has-1.0.3.tgz", + "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==", "requires": { - "ajv": "^5.1.0", - "har-schema": "^2.0.0" + "function-bind": "^1.1.1" } }, "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=", + "resolved": "https://registry.npmmirror.com/has-ansi/-/has-ansi-2.0.0.tgz", + "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", "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==", + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + } + } + }, + "has-binary2": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/has-binary2/-/has-binary2-1.0.3.tgz", + "integrity": "sha512-G1LWKhDSvhGeAQ8mPVQlqNcOB2sJdwATtZKl2pDKKHfpf/rYj24lkinxf69blJbnsvtqqNU+L3SL50vzZhXOnw==", + "requires": { + "isarray": "2.0.1" + } + }, + "has-cors": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/has-cors/-/has-cors-1.1.0.tgz", + "integrity": "sha512-g5VNKdkFuUuVCP9gYfDJHjK2nqdQJ7aDLTnycnc2+RvsOQbuLdF5pm7vuE5J76SEBIQjs4kQY/BWq74JUmjbXA==" + }, + "has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==" + }, + "has-symbols": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/has-symbols/-/has-symbols-1.0.2.tgz", + "integrity": "sha512-chXa79rL/UC2KlX17jo3vRGz0azaWEx5tGqZg5pO3NUyEJVB17dMruQlzCCOfUvElghKcm5194+BCRvi2Rv/Gw==" + }, + "has-tostringtag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/has-tostringtag/-/has-tostringtag-1.0.0.tgz", + "integrity": "sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==", + "requires": { + "has-symbols": "^1.0.2" + } + }, + "hexo": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/hexo/-/hexo-6.0.0.tgz", + "integrity": "sha512-ffSOhOEwPCJt2Ch4DdCdX39WBv8IX8I8I7md08RMDYc6jqxmE2mpuU8wzFYEJ/FQVjrt/EsQ/qfKAz3zAW/hvw==", + "requires": { + "abbrev": "^1.1.1", + "archy": "^1.0.0", + "bluebird": "^3.5.2", + "hexo-cli": "^4.0.0", + "hexo-front-matter": "^2.0.0", + "hexo-fs": "^3.1.0", + "hexo-i18n": "^1.0.0", + "hexo-log": "^3.0.0", + "hexo-util": "^2.4.0", + "js-yaml": "^4.0.0", + "micromatch": "^4.0.2", + "moize": "^6.1.0", + "moment": "^2.22.2", + "moment-timezone": "^0.5.21", + "nunjucks": "^3.2.1", + "picocolors": "^1.0.0", + "pretty-hrtime": "^1.0.3", + "resolve": "^1.8.1", + "strip-ansi": "^6.0.0", + "text-table": "^0.2.0", + "tildify": "^2.0.0", + "titlecase": "^1.1.2", + "warehouse": "^4.0.0" + } + }, + "hexo-browsersync": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/hexo-browsersync/-/hexo-browsersync-0.3.0.tgz", + "integrity": "sha512-5grkDUG/jci1LgImUFHTGMhXRYFKYuBVVf1L62UAhd/IC/L3EfGtKXyPVqvxyVb4Pc5STY5tQR46xoBJLlWJNw==", + "requires": { + "browser-sync": "^2.18.13", + "connect-injector": "^0.4.4" + } + }, + "hexo-cli": { + "version": "4.3.0", + "resolved": "https://registry.npmmirror.com/hexo-cli/-/hexo-cli-4.3.0.tgz", + "integrity": "sha512-lr46h1tK1RNQJAQZbzKYAWGsmqF5DLrW6xKEakqv/o9JqgdeempBjIm7HqjcZEUBpWij4EO65X6YJiDmT9LR7g==", + "requires": { + "abbrev": "^1.1.1", + "bluebird": "^3.5.5", + "chalk": "^4.0.0", + "command-exists": "^1.2.8", + "hexo-fs": "^3.0.1", + "hexo-log": "^2.0.0", + "hexo-util": "^2.0.0", + "minimist": "^1.2.5", + "resolve": "^1.11.0", + "tildify": "^2.0.0" + }, + "dependencies": { + "hexo-log": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-log/-/hexo-log-2.0.0.tgz", + "integrity": "sha512-U7zdDae74pXcyhQEyNmpJdq3UI6zWKxQ7/zLoMr/d3CBRdIfB5yO8DWqKUnewfibYv0gODyTWUIhxQDWuwloow==", "requires": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.0" + "chalk": "^4.0.0" + } + } + } + }, + "hexo-deployer-rsync": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-deployer-rsync/-/hexo-deployer-rsync-1.0.0.tgz", + "integrity": "sha512-hylGRNEHctWsjHs67VZefvrOGwzcZ4gPQ7RdVJdbWYA/OQ75IE52vDe+N9jpcfOWl8Tkv8fbX1Afuh44cv2DUw==", + "requires": { + "chalk": "^2.4.1", + "hexo-util": "^1.0.0" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" } }, - "strip-ansi": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz", - "integrity": "sha512-AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==", + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "requires": { - "ansi-regex": "^5.0.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "domhandler": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/domhandler/-/domhandler-3.3.0.tgz", + "integrity": "sha512-J1C5rIANUbuYK+FuFL98650rihynUOEzRLxW+90bKZRWB6A1X1Tf82GxR1qAWLyfNPRvjqfip3Q5tdYlmAa9lA==", + "requires": { + "domelementtype": "^2.0.1" + } + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "hexo-util": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/hexo-util/-/hexo-util-1.9.1.tgz", + "integrity": "sha512-B6+nVi4Zpy7NPzlIcTLn9YBGb2Ly0q11mRzg6DyFWg0IfcrfF4tlWO0vRXqJVhvRyg+tIfUihmgypkiUW1IjNQ==", + "requires": { + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^9.13.1", + "htmlparser2": "^4.0.0", + "prismjs": "^1.17.1", + "punycode.js": "^2.1.0", + "strip-indent": "^3.0.0", + "striptags": "^3.1.1" + } + }, + "highlight.js": { + "version": "9.18.5", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-9.18.5.tgz", + "integrity": "sha512-a5bFyofd/BHCX52/8i8uJkjr9DYwXIPnM/plwI6W7ezItLGqzt7X2G2nXuYSfsIJdkwwj/g9DG1LkcGJI/dDoA==" + }, + "htmlparser2": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-4.1.0.tgz", + "integrity": "sha512-4zDq1a1zhE4gQso/c5LP1OtrhYTncXNSpvJYtWJBtXAETPlMfi3IFNjGuQbYLuVY4ZR0QMqRVvo4Pdy9KLyP8Q==", + "requires": { + "domelementtype": "^2.0.1", + "domhandler": "^3.0.0", + "domutils": "^2.0.0", + "entities": "^2.0.0" + } + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.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=", + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-front-matter/-/hexo-front-matter-2.0.0.tgz", + "integrity": "sha512-IR3tjAyK2Ga/0a/WDAoNy5+n3ju2/mkuAsCDEeGgGLf5+7kkiOkkG/FrnueuYgz0h2MPfWDLBiDsSTCmB0sLCA==", "requires": { - "js-yaml": "^3.6.1" + "js-yaml": "^3.13.1" + }, + "dependencies": { + "js-yaml": { + "version": "3.14.1", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-3.14.1.tgz", + "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", + "requires": { + "argparse": "^1.0.7", + "esprima": "^4.0.0" + } + } } }, "hexo-fs": { - "version": "0.2.2", - "resolved": "https://registry.npm.taobao.org/hexo-fs/download/hexo-fs-0.2.2.tgz", - "integrity": "sha1-C5e3n2jfEh92XRKRuOkPrjJtAA4=", + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/hexo-fs/-/hexo-fs-3.1.0.tgz", + "integrity": "sha512-SfoDH7zlU9Iop+bAfEONXezbNIkpVX1QqjNCBYpapilZR+xVOCfTEdlNixanrKBbLGPb2fXqrdDBFgrKuiVGQQ==", "requires": { - "bluebird": "^3.4.0", - "chokidar": "^1.5.2", - "escape-string-regexp": "^1.0.5", - "graceful-fs": "^4.1.4" + "bluebird": "^3.5.1", + "chokidar": "^3.0.0", + "graceful-fs": "^4.1.11", + "hexo-util": "^2.0.0" } }, "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=", + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-archive/-/hexo-generator-archive-1.0.0.tgz", + "integrity": "sha512-24TeanDGpMBUIq37DHpSESQbeN6ssZ06edsGSI76tN4Yit50TgsgzP5g5DSu0yJk0jUtHJntysWE8NYAlFXibA==", "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-pagination": "1.0.0" } }, "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=", + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-category/-/hexo-generator-category-1.0.0.tgz", + "integrity": "sha512-kmtwT1SHYL2ismbGnYQXNtqLFSeTdtHNbJIqno3LKROpCK8ybST5QVXF1bZI9LkFcXV/H8ilt8gfg4/dNNcQQQ==", "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-pagination": "1.0.0" } }, "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=", + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-feed/-/hexo-generator-feed-3.0.0.tgz", + "integrity": "sha512-Jo35VSRSNeMitS2JmjCq3OHAXXYU4+JIODujHtubdG/NRj2++b3Tgyz9pwTmROx6Yxr2php/hC8og5AGZHh8UQ==", "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-util": "^2.1.0", + "nunjucks": "^3.0.0" } }, "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=", + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-index/-/hexo-generator-index-2.0.0.tgz", + "integrity": "sha512-q/29Vj9BZs0dwBcF+s9IT8ymS4aYZsDwBEYDnh96C8tsX+KPY5v6TzCdttz58BchifaJpP/l9mi6u9rZuYqA0g==", "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-pagination": "1.0.0", + "timsort": "^0.3.0" } }, "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=", + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-sitemap/-/hexo-generator-sitemap-2.2.0.tgz", + "integrity": "sha512-WoS/GpdrazoiFuhZXS3Qnb22L0uaiKHHWefcsoE7JLjh8WsksFom4v2FoNhr1RIYwFV7SudQFs91P5xcW+Gfow==", "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-util": "^2.1.0", + "micromatch": "^4.0.2", + "nunjucks": "^3.1.6" } }, "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=", + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-generator-tag/-/hexo-generator-tag-1.0.0.tgz", + "integrity": "sha512-JDoB2T1EncRlyGSjuAhkGxRfKkN8tq0i8tFlk9I4q2L6iYxPaUnFenhji0oxufTADC16/IchuPjmMk//dt8Msg==", "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-pagination": "1.0.0" } }, "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=", + "resolved": "https://registry.npmmirror.com/hexo-i18n/-/hexo-i18n-1.0.0.tgz", + "integrity": "sha512-yw90JHr7ybUHN/QOkpHmlWJj1luVk5/v8CUU5NRA0n4TFp6av8NT7ujZ10GDawgnQEdMHnN5PUfAbNIVGR6axg==", "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" + "sprintf-js": "^1.0.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=", + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-log/-/hexo-log-3.0.0.tgz", + "integrity": "sha512-fd87qXYznpNTa8SLov+wjDsrPssk4yKSgdIQg1wJPcuthy8ngvbXYdqaJ4vWMSADZ+D257EmKXTJHJyaxJQhVw==", "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=" - } + "nanocolors": "^0.2.12" } }, + "hexo-pagination": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/hexo-pagination/-/hexo-pagination-1.0.0.tgz", + "integrity": "sha512-miEVFgxchPr2qNWxw0JWpJ9R/Yaf7HjHBZVjvCCcqfbsLyYtCvIfJDxcEwz1sDOC/fLzYPqNnhUI73uNxBHRSA==" + }, "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=", + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-ejs/-/hexo-renderer-ejs-2.0.0.tgz", + "integrity": "sha512-qCjE1IdwgDgv65qyb0KMVCwCdSVAkH0vwAe9XihjvaKWkmb9dtt8DgErOdqCXn0HReSyWiEVP2BrLRj3gyHwOQ==", "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=" - } + "ejs": "^3.1.6" } }, "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=", + "version": "0.5.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-jade/-/hexo-renderer-jade-0.5.0.tgz", + "integrity": "sha512-C1EmmsmGTbE5mTf4863IQyXO7CzO4jBfUsY+msiSH0sFqeq5XUVN0YGgrLZUfctW/6in5AppsbPqiJvdmMwtVg==", "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=" - } - } - } - } - } - } - } + "jade": "^1.11.0", + "pug": "^2.0.1" } }, "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=", + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/hexo-renderer-marked/-/hexo-renderer-marked-5.0.0.tgz", + "integrity": "sha512-lifWMCvefTq3IlH+urQDPFX4gXquFAqDwOQBdqpwcPyhaiVHu0ZweeZ24IeZtCLRYP+zEgsksCPYrGl9hDDJHg==", "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=" - } - } - } + "dompurify": "^2.3.0", + "hexo-util": "^2.5.0", + "jsdom": "^19.0.0", + "marked": "^4.0.1" } }, "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=", + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/hexo-renderer-stylus/-/hexo-renderer-stylus-2.0.1.tgz", + "integrity": "sha512-1S4AG8RtzWqVrqKIYv2AJ4UYms5SHDjkdYS7IiGwgUejL24agbTktpAbnH2cG1JWZ15SRqYN0UGB9aAoSAgvEA==", "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=" - } - } - } - } - } + "nib": "^1.1.2", + "stylus": "^0.54.8" } }, "hexo-server": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/hexo-server/-/hexo-server-0.1.3.tgz", - "integrity": "sha1-0pxi2kIjj9cOv8wgZcSSDi/tBHc=", + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/hexo-server/-/hexo-server-3.0.0.tgz", + "integrity": "sha512-u4s0ty9Aew6jV+a9oMrXBwhrRpUQ0U8PWM/88a5aHgDru58VY81mVrxOFxs788NAsWQ8OvsJtF5m7mnXoRnSIA==", "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=" - } - } - } - } - } + "bluebird": "^3.5.5", + "compression": "^1.7.4", + "connect": "^3.7.0", + "mime": "^3.0.0", + "morgan": "^1.9.1", + "open": "^8.0.9", + "picocolors": "^1.0.0", + "serve-static": "^1.14.1" } }, + "hexo-theme-landscape": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/hexo-theme-landscape/-/hexo-theme-landscape-0.0.3.tgz", + "integrity": "sha512-b0Di+TUVs4ESrNX4ULEh9uQmADpO6kr10rIJ2OGZM8suNQNFKdxn+vJUjnLfKkCPJAfVmS7/S83KCNYe4tpoNw==" + }, "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=", + "version": "2.5.0", + "resolved": "https://registry.npmmirror.com/hexo-util/-/hexo-util-2.5.0.tgz", + "integrity": "sha512-l0zkqcg2524KPO84HQe0JROpPlCM/dEnCJaJrZ1qsq+3+/YxhDa0zxiGtUVY1dtrWzOK/V11Zj+UEklhGP8Jeg==", "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" + "bluebird": "^3.5.2", + "camel-case": "^4.0.0", + "cross-spawn": "^7.0.0", + "deepmerge": "^4.2.2", + "highlight.js": "^10.7.1", + "htmlparser2": "^6.0.0", + "prismjs": "^1.17.1", + "strip-indent": "^3.0.0" } }, "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=" + "version": "10.7.3", + "resolved": "https://registry.npmmirror.com/highlight.js/-/highlight.js-10.7.3.tgz", + "integrity": "sha512-tzcUFauisWKNHaRkN4Wjl/ZA07gENAjFl3J/c480dprkGTg5EQstgaNFqBfUqCq54kZRIEcreTsAgF/m2quD7A==" }, - "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=" + "html-encoding-sniffer": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/html-encoding-sniffer/-/html-encoding-sniffer-3.0.0.tgz", + "integrity": "sha512-oWv4T4yJ52iKrufjnyZPkrN0CH3QnrUqdB6In1g5Fe1mia8GmF36gnfNySxoZtxD5+NmYw1EElVXiBk93UeskA==", + "requires": { + "whatwg-encoding": "^2.0.0" + } }, "htmlparser2": { - "version": "3.8.3", - "resolved": "https://registry.npm.taobao.org/htmlparser2/download/htmlparser2-3.8.3.tgz", - "integrity": "sha1-mWwosZFRaovoZQGn15dX5ccMEGg=", + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/htmlparser2/-/htmlparser2-6.1.0.tgz", + "integrity": "sha512-gyyPk6rgonLFEDGoeRgQNaEUvdJ4ktTmmUh/h2t7s+M8oPpIPxgNACWa+6ESR57kXstwqPiCut0V8NRpcwgU7A==", "requires": { - "domelementtype": "1", - "domhandler": "2.3", - "domutils": "1.5", - "entities": "1.0", - "readable-stream": "1.1" + "domelementtype": "^2.0.1", + "domhandler": "^4.0.0", + "domutils": "^2.5.2", + "entities": "^2.0.0" + } + }, + "http-errors": { + "version": "1.8.1", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.8.1.tgz", + "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.4", + "setprototypeof": "1.2.0", + "statuses": ">= 1.5.0 < 2", + "toidentifier": "1.0.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=" + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" } } }, - "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, + "http-proxy": { + "version": "1.18.1", + "resolved": "https://registry.npmmirror.com/http-proxy/-/http-proxy-1.18.1.tgz", + "integrity": "sha512-7mz/721AbnJwIVbnaSv1Cz3Am0ZLT/UBwkC92VlxhXv/k/BBQfM2fXElQNC27BVGr0uwUpplYPQM9LnaBMR5NQ==", "requires": { - "assert-plus": "^1.0.0", - "jsprim": "^1.2.2", - "sshpk": "^1.7.0" + "eventemitter3": "^4.0.0", + "follow-redirects": "^1.0.0", + "requires-port": "^1.0.0" + } + }, + "http-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/http-proxy-agent/-/http-proxy-agent-5.0.0.tgz", + "integrity": "sha512-n2hY8YdoRE1i7r6M0w9DIw5GgZN0G25P8zLCRQ8rjXtTU3vsNFBI/vWK/UIeE6g5MUUz6avwAPXmL6Fy9D/90w==", + "requires": { + "@tootallnate/once": "2", + "agent-base": "6", + "debug": "4" + } + }, + "https-proxy-agent": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/https-proxy-agent/-/https-proxy-agent-5.0.0.tgz", + "integrity": "sha512-EkYm5BcKUGiduxzSt3Eppko+PiNWNEpa4ySk9vTC6wDsQJW9rHSa+UhGNJoRYp7bz6Ht1eaRIa6QaJqO5rCFbA==", + "requires": { + "agent-base": "6", + "debug": "4" } }, "iconv-lite": { - "version": "0.4.24", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", - "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "version": "0.6.3", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.6.3.tgz", + "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", "requires": { - "safer-buffer": ">= 2.1.2 < 3" + "safer-buffer": ">= 2.1.2 < 3.0.0" } }, - "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" - } + "immutable": { + "version": "3.8.2", + "resolved": "https://registry.npmmirror.com/immutable/-/immutable-3.8.2.tgz", + "integrity": "sha512-15gZoQ38eYjEjxkorfbcgBKBL6R7T459OuK+CpcWt7O3KF4uPCx2tD0uFETlUDIyo+1789crbMhTvQBSR5yBMg==" + }, + "indexof": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/indexof/-/indexof-0.0.1.tgz", + "integrity": "sha512-i0G7hLJ1z0DE8dsqJa2rycj9dBmNKgXBvotXtZYXakU9oivfB9Uj2ZBC27qqef2U58/ZLwalxa1X/RDCdkHtVg==" }, "inflight": { "version": "1.0.6", - "resolved": "https://registry.npm.taobao.org/inflight/download/inflight-1.0.6.tgz", - "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", + "resolved": "https://registry.npmmirror.com/inflight/-/inflight-1.0.6.tgz", + "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", "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=" + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.4.tgz", + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "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=", + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", "requires": { - "binary-extensions": "^1.0.0" + "binary-extensions": "^2.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=" + "resolved": "https://registry.npmmirror.com/is-buffer/-/is-buffer-1.1.6.tgz", + "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==" }, - "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=", + "is-core-module": { + "version": "2.8.1", + "resolved": "https://registry.npmmirror.com/is-core-module/-/is-core-module-2.8.1.tgz", + "integrity": "sha512-SdNCUs284hr40hFTFP6l0IfZ/RSrMXF3qgoRHd3/79unUTvrFO/JoXwkGm+5J/Oe3E/b5GsnG330uUNgRpu1PA==", "requires": { - "is-primitive": "^2.0.0" + "has": "^1.0.3" } }, - "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-docker": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/is-docker/-/is-docker-2.2.1.tgz", + "integrity": "sha512-F+i2BKsFrH66iaUFc0woD8sLy8getkwTwtOBjvs56Cx4CgJDeKQeqfz8wAYiSb8JOprWhHH5p77PbmYCvvUuXQ==" + }, + "is-expression": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-expression/-/is-expression-3.0.0.tgz", + "integrity": "sha512-vyMeQMq+AiH5uUnoBfMTwf18tO3bM6k1QXBE9D6ueAAquEfCZe3AJPtud9g6qS0+4X8xA7ndpZiDyeb2l2qOBw==", + "requires": { + "acorn": "~4.0.2", + "object-assign": "^4.0.1" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==" + } + } }, "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=" + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==" }, "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" - } + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", + "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==" }, "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=", + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", "requires": { - "is-extglob": "^1.0.0" + "is-extglob": "^2.1.1" } }, "is-number": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/is-number/download/is-number-2.1.0.tgz", - "integrity": "sha1-Afy7s5NGOlSPL0ZszhbezknbkI8=", + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==" + }, + "is-number-like": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/is-number-like/-/is-number-like-1.0.8.tgz", + "integrity": "sha512-6rZi3ezCyFcn5L71ywzz2bS5b2Igl1En3eTlZlvKjpz1n3IZLAYMbKYAIQgFmEu0GENg92ziU/faEOA/aixjbA==", "requires": { - "kind-of": "^3.0.2" + "lodash.isfinite": "^3.3.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=", + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==" + }, + "is-potential-custom-element-name": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-potential-custom-element-name/-/is-potential-custom-element-name-1.0.1.tgz", + "integrity": "sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==" + }, + "is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, + "is-regex": { + "version": "1.1.4", + "resolved": "https://registry.npmmirror.com/is-regex/-/is-regex-1.1.4.tgz", + "integrity": "sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==", "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=" - } + "call-bind": "^1.0.2", + "has-tostringtag": "^1.0.0" } }, - "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 + "is-wsl": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-2.2.0.tgz", + "integrity": "sha512-fKzAra0rGJUUBwGBgNkHZuToZcn+TtXHpeCgmkMJMMYx1sQDYaCSyjJBSCa2nH1DGm7s3n1oBnohoVTBaN7Lww==", + "requires": { + "is-docker": "^2.0.0" + } }, "isarray": { - "version": "0.0.1", - "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-0.0.1.tgz", - "integrity": "sha1-ihis/Kmo9Bd+Cav8YDiTmwXR7t8=" + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/isarray/-/isarray-2.0.1.tgz", + "integrity": "sha512-c2cu3UxbI+b6kR3fy0nRnAhodsvR9dx7U5+znCOzdj6IfP3upFURTr0Xl5BlQZNKZjEtxrmVyfSdeE3O57smoQ==" }, "isexe": { "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/isexe/download/isexe-2.0.0.tgz", - "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=" + "resolved": "https://registry.npmmirror.com/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, - "isobject": { - "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/isobject/download/isobject-2.1.0.tgz", - "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=", + "jade": { + "version": "1.11.0", + "resolved": "https://registry.npmmirror.com/jade/-/jade-1.11.0.tgz", + "integrity": "sha512-J76sbGKeLtu7uwW97Ntzb1UvGnpKTDplYa9ROr2gNRhM+SxvlBSG0Ees3TQ8+7ya2UVkzMEeFxhRhEpN68s7Tg==", "requires": { - "isarray": "1.0.0" + "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": { - "isarray": { - "version": "1.0.0", - "resolved": "https://registry.npm.taobao.org/isarray/download/isarray-1.0.0.tgz", - "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" + "commander": { + "version": "2.6.0", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.6.0.tgz", + "integrity": "sha512-PhbTMT+ilDXZKqH8xbvuUY2ZEQNef0Q7DKxgoEKb4ccytsdvVVJmYqR0sGbi96nxU6oGrwEIQnclpK2NBZuQlg==" } } }, - "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 + "jake": { + "version": "10.8.2", + "resolved": "https://registry.npmmirror.com/jake/-/jake-10.8.2.tgz", + "integrity": "sha512-eLpKyrfG3mzvGE2Du8VoPbeSkRry093+tyNjdYaBbJS9v17knImYGNXQCUV0gLxQtF82m3E8iRb/wdSQZLoq7A==", + "requires": { + "async": "0.9.x", + "chalk": "^2.4.2", + "filelist": "^1.0.1", + "minimatch": "^3.0.4" + }, + "dependencies": { + "ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", + "requires": { + "color-convert": "^1.9.0" + } + }, + "chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", + "requires": { + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" + } + }, + "color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmmirror.com/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", + "requires": { + "color-name": "1.1.3" + } + }, + "color-name": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" + }, + "has-flag": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==" + }, + "supports-color": { + "version": "5.5.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", + "requires": { + "has-flag": "^3.0.0" + } + } + } }, - "js-tokens": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz", - "integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=" + "js-stringify": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/js-stringify/-/js-stringify-1.0.2.tgz", + "integrity": "sha512-rtS5ATOo2Q5k1G+DADISilDA6lv79zIiwFd6CcjuIxGKLFm5C+RLImRscVap9k55i+MOZwgliw+NejvkLuGD5g==" }, "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=", + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", "requires": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" + "argparse": "^2.0.1" }, "dependencies": { - "esprima": { - "version": "4.0.0", - "resolved": "https://registry.npm.taobao.org/esprima/download/esprima-4.0.0.tgz", - "integrity": "sha1-RJnt3NERDgshi6zy+n9/WfVcqAQ=" + "argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" } } }, - "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, + "version": "19.0.0", + "resolved": "https://registry.npmmirror.com/jsdom/-/jsdom-19.0.0.tgz", + "integrity": "sha512-RYAyjCbxy/vri/CfnjUWJQQtZ3LKlLnDqj+9XLNnJPgEGeirZs3hllKR20re8LUZ6o1b1X4Jat+Qd26zmP41+A==", "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" + "abab": "^2.0.5", + "acorn": "^8.5.0", + "acorn-globals": "^6.0.0", + "cssom": "^0.5.0", + "cssstyle": "^2.3.0", + "data-urls": "^3.0.1", + "decimal.js": "^10.3.1", + "domexception": "^4.0.0", + "escodegen": "^2.0.0", + "form-data": "^4.0.0", + "html-encoding-sniffer": "^3.0.0", + "http-proxy-agent": "^5.0.0", + "https-proxy-agent": "^5.0.0", + "is-potential-custom-element-name": "^1.0.1", + "nwsapi": "^2.2.0", + "parse5": "6.0.1", + "saxes": "^5.0.1", + "symbol-tree": "^3.2.4", + "tough-cookie": "^4.0.0", + "w3c-hr-time": "^1.0.2", + "w3c-xmlserializer": "^3.0.0", + "webidl-conversions": "^7.0.0", + "whatwg-encoding": "^2.0.0", + "whatwg-mimetype": "^3.0.0", + "whatwg-url": "^10.0.0", + "ws": "^8.2.3", + "xml-name-validator": "^4.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 + "jsonfile": { + "version": "3.0.1", + "resolved": "https://registry.npmmirror.com/jsonfile/-/jsonfile-3.0.1.tgz", + "integrity": "sha512-oBko6ZHlubVB5mRFkur5vgYR1UyqX+S6Y/oCfLhqNdcc2fYFlDpIoNc7AfKS1KOGcnNAkvsr0grLck9ANM815w==", + "requires": { + "graceful-fs": "^4.1.6" + } }, "jsonparse": { "version": "1.3.1", - "resolved": "https://registry.npm.taobao.org/jsonparse/download/jsonparse-1.3.1.tgz", - "integrity": "sha1-P02uSpH6wxX3EGL4UhzCOfE2YoA=" + "resolved": "https://registry.npmmirror.com/jsonparse/-/jsonparse-1.3.1.tgz", + "integrity": "sha512-POQXvpdL69+CluYsillJ7SUhKvytYjW9vG/GKpnf+xP8UWgYEM/RaMzHHofbALDiKbbP1W8UEYmgGl39WkPZsg==" }, - "jsprim": { - "version": "1.4.1", - "resolved": "https://registry.npm.taobao.org/jsprim/download/jsprim-1.4.1.tgz", - "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=", - "optional": true, + "JSONStream": { + "version": "1.3.5", + "resolved": "https://registry.npmmirror.com/JSONStream/-/JSONStream-1.3.5.tgz", + "integrity": "sha512-E+iruNOY8VV9s4JEbe1aNEm6MiszPRr/UfcHMz0TQh1BXSxHK+ASV1R6W4HpjBhSeS+54PIsAMCBmwD06LLsqQ==", "requires": { - "assert-plus": "1.0.0", - "extsprintf": "1.3.0", - "json-schema": "0.2.3", - "verror": "1.10.0" + "jsonparse": "^1.2.0", + "through": ">=2.2.7 <3" + } + }, + "jstransformer": { + "version": "0.0.2", + "resolved": "https://registry.npmmirror.com/jstransformer/-/jstransformer-0.0.2.tgz", + "integrity": "sha512-b7tmf91j1ChMuYhwbPBnNgB62dmHuqiHpOdd6QLKzde8HydZqm+ud3qWreGWecSxPBFFNOf1Ozjx0xo2plFdHA==", + "requires": { + "is-promise": "^2.0.0", + "promise": "^6.0.1" } }, "kind-of": { "version": "3.2.2", - "resolved": "https://registry.npm.taobao.org/kind-of/download/kind-of-3.2.2.tgz", - "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=", + "resolved": "https://registry.npmmirror.com/kind-of/-/kind-of-3.2.2.tgz", + "integrity": "sha512-NOW9QQXMoZGg/oqnVNoNTTIFEIid1627WCffUBJEdMxYApq7mNE7CpzucIPc+ZQg25Phej7IJSmX3hO+oblOtQ==", "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" - } + "resolved": "https://registry.npmmirror.com/lazy-cache/-/lazy-cache-1.0.4.tgz", + "integrity": "sha512-RE2g0b5VGZsOCFOCgP7omTRYFqydmZkBwl5oNnQ1lDYC57uyO9KqNnNVxT7COSHTxrRCWVcAVOcbjk+tvh/rgQ==" }, "levn": { "version": "0.3.0", - "resolved": "https://registry.npm.taobao.org/levn/download/levn-0.3.0.tgz", - "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=", - "optional": true, + "resolved": "https://registry.npmmirror.com/levn/-/levn-0.3.0.tgz", + "integrity": "sha512-0OO4y2iOHix2W6ujICbKIaEQXvFQHue65vUG3pb5EUomzPI90z9hsA1VsO/dbIIpC53J8gxM9Q4Oho0jrCM/yA==", "requires": { "prelude-ls": "~1.1.2", "type-check": "~0.3.2" } }, + "limiter": { + "version": "1.1.5", + "resolved": "https://registry.npmmirror.com/limiter/-/limiter-1.1.5.tgz", + "integrity": "sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==" + }, + "localtunnel": { + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/localtunnel/-/localtunnel-2.0.2.tgz", + "integrity": "sha512-n418Cn5ynvJd7m/N1d9WVJISLJF/ellZnfsLnx8WBWGzxv/ntNcFkJ1o6se5quUhCplfLGBNL5tYHiq5WF3Nug==", + "requires": { + "axios": "0.21.4", + "debug": "4.3.2", + "openurl": "1.1.1", + "yargs": "17.1.1" + }, + "dependencies": { + "debug": { + "version": "4.3.2", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.3.2.tgz", + "integrity": "sha512-mOp8wKcvj7XxC78zLgw/ZA+6TSgkoE2C/ienthhRD298T7UNwAg9diBpLRxC0mOezLl4B0xV7M0cCO6P/O0Xhw==", + "requires": { + "ms": "2.1.2" + } + }, + "yargs": { + "version": "17.1.1", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-17.1.1.tgz", + "integrity": "sha512-c2k48R0PwKIqKhPMWjeiF6y2xY/gPMUlro0sgxqXpbOIohWiLNXWslsootttv7E1e73QPAMQSg5FeySbVcpsPQ==", + "requires": { + "cliui": "^7.0.2", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.0", + "y18n": "^5.0.5", + "yargs-parser": "^20.2.2" + } + } + } + }, + "locate-path": { + "version": "5.0.0", + "resolved": "https://registry.npmmirror.com/locate-path/-/locate-path-5.0.0.tgz", + "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", + "requires": { + "p-locate": "^4.1.0" + } + }, "lodash": { - "version": "4.17.5", - "resolved": "https://registry.npm.taobao.org/lodash/download/lodash-4.17.5.tgz", - "integrity": "sha1-maktZcAnLevoyWtgV7yPv6O+1RE=" + "version": "4.17.21", + "resolved": "https://registry.npmmirror.com/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, + "lodash.isfinite": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/lodash.isfinite/-/lodash.isfinite-3.3.2.tgz", + "integrity": "sha512-7FGG40uhC8Mm633uKW1r58aElFlBlxCrg9JfSi3P6aYiWmfiWF0PgMd86ZUsxE5GwWPdHoS2+48bwTh2VPkIQA==" }, "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" - } + "resolved": "https://registry.npmmirror.com/longest/-/longest-1.0.1.tgz", + "integrity": "sha512-k+yt5n3l48JU4k8ftnKG6V7u32wyH2NfKzeMto9F/QRE0amxy/LayxwlvjjkZEIzqR+19IrtFO8p5kB9QaYUFg==" }, "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=", + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/lower-case/-/lower-case-2.0.2.tgz", + "integrity": "sha512-7fm3l3NAF9WfN6W3JOmf5drwpVqX78JtoGJ3A6W0a6ZnldM41w2fV5D490psKFTpMds8TJse/eHLFFsNHHjHgg==", "requires": { - "pseudomap": "^1.0.2", - "yallist": "^2.1.2" + "tslib": "^2.0.3" } }, - "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" - } + "marked": { + "version": "4.0.12", + "resolved": "https://registry.npmmirror.com/marked/-/marked-4.0.12.tgz", + "integrity": "sha512-hgibXWrEDNBWgGiK18j/4lkS6ihTe9sxtV4Q1OQppb/0zzyPSzoFANBa5MfsG/zgsWklmNnhm0XACZOH/0HBiQ==" }, - "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" - } + "micro-memoize": { + "version": "4.0.9", + "resolved": "https://registry.npmmirror.com/micro-memoize/-/micro-memoize-4.0.9.tgz", + "integrity": "sha512-Z2uZi/IUMGQDCXASdujXRqrXXEwSY0XffUrAOllhqzQI3wpUyZbiZTiE2JuYC0HSG2G7DbCS5jZmsEKEGZuemg==" }, "micromatch": { - "version": "2.3.11", - "resolved": "https://registry.npm.taobao.org/micromatch/download/micromatch-2.3.11.tgz", - "integrity": "sha1-hmd8l9FyCzY0MdBNDRUpO9OMFWU=", + "version": "4.0.4", + "resolved": "https://registry.npmmirror.com/micromatch/-/micromatch-4.0.4.tgz", + "integrity": "sha512-pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==", "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" + "braces": "^3.0.1", + "picomatch": "^2.2.3" } }, + "mime": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==" + }, "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 + "version": "1.51.0", + "resolved": "https://registry.npmmirror.com/mime-db/-/mime-db-1.51.0.tgz", + "integrity": "sha512-5y8A56jg7XVQx2mbv1lu49NR4dokRnhZYTtL+KGfaa27uq4pSTXkwQkFJl4pkRMyNFz/EtYDSkiiEHx3F7UN6g==" }, "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, + "version": "2.1.34", + "resolved": "https://registry.npmmirror.com/mime-types/-/mime-types-2.1.34.tgz", + "integrity": "sha512-6cP692WwGIs9XXdOO4++N+7qjqv0rqxxVvJ3VHPh/Sc9mVZcQP+ZGhkKiTvWMQRr2tbHkJP/Yn7Y0npb3ZBs4A==", "requires": { - "mime-db": "~1.30.0" + "mime-db": "1.51.0" } }, + "min-indent": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/min-indent/-/min-indent-1.0.1.tgz", + "integrity": "sha512-I9jwMn07Sy/IwOj3zVkVik2JTvgpaykDZEigL6Rx6N9LbMywwUSMtxET+7lVoDLLd3O3IXwJwvuuns8UB/HeAg==" + }, "minimatch": { "version": "3.0.4", - "resolved": "https://registry.npm.taobao.org/minimatch/download/minimatch-3.0.4.tgz", - "integrity": "sha1-UWbihkV/AzBgZL5Ul+jbsMPTIIM=", + "resolved": "https://registry.npmmirror.com/minimatch/-/minimatch-3.0.4.tgz", + "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", "requires": { "brace-expansion": "^1.1.7" } }, "minimist": { + "version": "1.2.5", + "resolved": "https://registry.npmmirror.com/minimist/-/minimist-1.2.5.tgz", + "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" + }, + "mitt": { "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==" + "resolved": "https://registry.npmmirror.com/mitt/-/mitt-1.2.0.tgz", + "integrity": "sha512-r6lj77KlwqLhIUku9UWYes7KJtsczvolZkzp8hbaDPPaE24OmWl5s539Mytlj22siEQKosZ26qCBgda2PKwoJw==" }, "mkdirp": { - "version": "0.5.1", - "resolved": "https://registry.npm.taobao.org/mkdirp/download/mkdirp-0.5.1.tgz", - "integrity": "sha1-MAV0OOrGz3+MR2fzhkjWaX11yQM=", + "version": "0.5.5", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-0.5.5.tgz", + "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==", "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=" - } + "minimist": "^1.2.5" + } + }, + "moize": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/moize/-/moize-6.1.0.tgz", + "integrity": "sha512-WrMcM+C2Jy+qyOC/UMhA3BCHGowxV34dhDZnDNfxsREW/8N+33SFjmc23Q61Xv1WUthUA1vYopTitP1sZ5jkeg==", + "requires": { + "fast-equals": "^2.0.1", + "micro-memoize": "^4.0.9" } }, "moment": { - "version": "2.20.1", - "resolved": "https://registry.npm.taobao.org/moment/download/moment-2.20.1.tgz", - "integrity": "sha1-1usaRsvMFKKy+UNBEsH/iQfzE/0=" + "version": "2.29.1", + "resolved": "https://registry.npmmirror.com/moment/-/moment-2.29.1.tgz", + "integrity": "sha512-kHmoybcPV8Sqy59DwNDY3Jefr64lK/by/da0ViFcuA4DH0vQg5Q6Ze5VimxkfQNSC+Mls/Kx53s7TjP1RhFEDQ==" }, "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=", + "version": "0.5.34", + "resolved": "https://registry.npmmirror.com/moment-timezone/-/moment-timezone-0.5.34.tgz", + "integrity": "sha512-3zAEHh2hKUs3EXLESx/wsgw6IQdusOT8Bxm3D9UrHPQR7zlMmzwybC8zHEM1tQ4LJwP7fcxrWr8tuBg05fFCbg==", "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, + "morgan": { + "version": "1.10.0", + "resolved": "https://registry.npmmirror.com/morgan/-/morgan-1.10.0.tgz", + "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", "requires": { - "mkdirp": "~0.5.1", - "ncp": "~2.0.0", - "rimraf": "~2.4.0" + "basic-auth": "~2.0.1", + "debug": "2.6.9", + "depd": "~2.0.0", + "on-finished": "~2.3.0", + "on-headers": "~1.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } } }, - "nan": { - "version": "2.8.0", - "resolved": "https://registry.npm.taobao.org/nan/download/nan-2.8.0.tgz", - "integrity": "sha1-7XFfP+neArV6XmJS2QqWZ14fCFo=", - "optional": true + "ms": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, - "ncp": { - "version": "2.0.0", - "resolved": "https://registry.npm.taobao.org/ncp/download/ncp-2.0.0.tgz", - "integrity": "sha1-GVoh1sRuNh0vsSgbo4uR6d9727M=", - "optional": true + "nanocolors": { + "version": "0.2.13", + "resolved": "https://registry.npmmirror.com/nanocolors/-/nanocolors-0.2.13.tgz", + "integrity": "sha512-0n3mSAQLPpGLV9ORXT5+C/D4mwew7Ebws69Hx4E2sgz2ZA5+32Q80B9tL8PbL7XHnRDiAxH/pnrUJ9a4fkTNTA==" }, - "needle": { - "version": "2.2.4", - "resolved": "https://registry.npmjs.org/needle/-/needle-2.2.4.tgz", - "integrity": "sha512-HyoqEb4wr/rsoaIDfTH2aVL9nWtQqba2/HvMv+++m8u0dz808MaagKILxtfeSN7QU7nvbQ79zk3vYOJp9zsNEA==", + "negotiator": { + "version": "0.6.2", + "resolved": "https://registry.npmmirror.com/negotiator/-/negotiator-0.6.2.tgz", + "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" + }, + "nib": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/nib/-/nib-1.1.2.tgz", + "integrity": "sha512-xBpZ9XU0vLOxp0GBTuUHt6Kcl37ZpC/rXPpKcK4LYOUnSmqp2CXkcNiJxf9bgNZeivYR6bxsaZkNHZ9deEMupQ==", "requires": { - "debug": "^2.1.2", - "iconv-lite": "^0.4.4", - "sax": "^1.2.4" + "stylus": "0.54.5" + }, + "dependencies": { + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "stylus": { + "version": "0.54.5", + "resolved": "https://registry.npmmirror.com/stylus/-/stylus-0.54.5.tgz", + "integrity": "sha512-4Yzg9aqLf3f4sDvO3x+Fbp2V634j9ikFGCFokIPYi+7Y4IG/nxAiPUs95MRlo+lPdTsxAs9wCzEclmPccItISA==", + "requires": { + "css-parse": "1.7.x", + "debug": "*", + "glob": "7.0.x", + "mkdirp": "0.5.x", + "sax": "0.5.x", + "source-map": "0.1.x" + } + } } }, "no-case": { - "version": "2.3.2", - "resolved": "https://registry.npm.taobao.org/no-case/download/no-case-2.3.2.tgz", - "integrity": "sha1-YLgTOWvjmz8SiKTB7V0efSi0ZKw=", + "version": "3.0.4", + "resolved": "https://registry.npmmirror.com/no-case/-/no-case-3.0.4.tgz", + "integrity": "sha512-fgAN3jGAh+RoxUGZHTSOLJIqUc2wmoBwGR4tbpNAKmmovFoWq0OdRkb0VkldReO2a2iBT/OEulG9XSUc10r3zg==", "requires": { - "lower-case": "^1.1.1" + "lower-case": "^2.0.2", + "tslib": "^2.0.3" } }, - "node-fingerprint": { - "version": "0.0.2", - "resolved": "https://registry.npm.taobao.org/node-fingerprint/download/node-fingerprint-0.0.2.tgz", - "integrity": "sha1-Mcur63GmeufdWn3AQuUcPHWGhQE=" + "normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==" }, - "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==", + "nunjucks": { + "version": "3.2.3", + "resolved": "https://registry.npmmirror.com/nunjucks/-/nunjucks-3.2.3.tgz", + "integrity": "sha512-psb6xjLj47+fE76JdZwskvwG4MYsQKXUtMsPh6U0YMvmyjRtKRFcxnlXGWglNybtNTNVmGdp94K62/+NjF5FDQ==", "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" + "a-sync-waterfall": "^1.0.0", + "asap": "^2.0.3", + "commander": "^5.1.0" + } + }, + "nwsapi": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/nwsapi/-/nwsapi-2.2.0.tgz", + "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==" + }, + "object-assign": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/object-assign/-/object-assign-4.1.1.tgz", + "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==" + }, + "on-finished": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/on-finished/-/on-finished-2.3.0.tgz", + "integrity": "sha512-ikqdkGAAyf/X/gPhXGvfgAytDZtDbr+bkNUJ0N9h5MI/dmdgCs3l6hoHrcUv41sRKew3jIwrp4qQDXiK99Utww==", + "requires": { + "ee-first": "1.1.1" + } + }, + "on-headers": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/on-headers/-/on-headers-1.0.2.tgz", + "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==" + }, + "once": { + "version": "1.4.0", + "resolved": "https://registry.npmmirror.com/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "requires": { + "wrappy": "1" + } + }, + "open": { + "version": "8.4.0", + "resolved": "https://registry.npmmirror.com/open/-/open-8.4.0.tgz", + "integrity": "sha512-XgFPPM+B28FtCCgSb9I+s9szOC1vZRSwgWsRUA5ylIxRTgKozqjOCrVOqGsYABPYK5qnfqClxZTFBa8PKt2v6Q==", + "requires": { + "define-lazy-prop": "^2.0.0", + "is-docker": "^2.1.1", + "is-wsl": "^2.2.0" + } + }, + "openurl": { + "version": "1.1.1", + "resolved": "https://registry.npmmirror.com/openurl/-/openurl-1.1.1.tgz", + "integrity": "sha512-d/gTkTb1i1GKz5k3XE3XFV/PxQ1k45zDqGP2OA7YhgsaLoqm6qRvARAZOFer1fcXritWlGBRCu/UgeS4HAnXAA==" + }, + "opn": { + "version": "5.3.0", + "resolved": "https://registry.npmmirror.com/opn/-/opn-5.3.0.tgz", + "integrity": "sha512-bYJHo/LOmoTd+pfiYhfZDnf9zekVJrY+cnS2a5F2x+w5ppvTqObojTP7WiFG+kVZs9Inw+qQ/lw7TroWwhdd2g==", + "requires": { + "is-wsl": "^1.1.0" }, "dependencies": { + "is-wsl": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/is-wsl/-/is-wsl-1.1.0.tgz", + "integrity": "sha512-gfygJYZ2gLTDlmbWMI0CE2MwnFzSN/2SZfkMlItC4K/JBlsWVDB0bO6XhqcY13YXE7iMcAJnzTCJjPiTeJJ0Mw==" + } + } + }, + "optimist": { + "version": "0.3.7", + "resolved": "https://registry.npmmirror.com/optimist/-/optimist-0.3.7.tgz", + "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", + "requires": { + "wordwrap": "~0.0.2" + } + }, + "optionator": { + "version": "0.8.3", + "resolved": "https://registry.npmmirror.com/optionator/-/optionator-0.8.3.tgz", + "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==", + "requires": { + "deep-is": "~0.1.3", + "fast-levenshtein": "~2.0.6", + "levn": "~0.3.0", + "prelude-ls": "~1.1.2", + "type-check": "~0.3.2", + "word-wrap": "~1.2.3" + } + }, + "p-limit": { + "version": "2.3.0", + "resolved": "https://registry.npmmirror.com/p-limit/-/p-limit-2.3.0.tgz", + "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", + "requires": { + "p-try": "^2.0.0" + } + }, + "p-locate": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/p-locate/-/p-locate-4.1.0.tgz", + "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", + "requires": { + "p-limit": "^2.2.0" + } + }, + "p-try": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/p-try/-/p-try-2.2.0.tgz", + "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==" + }, + "parse5": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/parse5/-/parse5-6.0.1.tgz", + "integrity": "sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==" + }, + "parseqs": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/parseqs/-/parseqs-0.0.6.tgz", + "integrity": "sha512-jeAGzMDbfSHHA091hr0r31eYfTig+29g3GKKE/PPbEQ65X0lmMwlEoqmhzu0iztID5uJpZsFlUPDP8ThPL7M8w==" + }, + "parseuri": { + "version": "0.0.6", + "resolved": "https://registry.npmmirror.com/parseuri/-/parseuri-0.0.6.tgz", + "integrity": "sha512-AUjen8sAkGgao7UyCX6Ahv0gIK2fABKmYjvP4xmy5JaKvcbTRueIqIPHLAfq30xJddqSE033IOMUSOMCcK3Sow==" + }, + "parseurl": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/parseurl/-/parseurl-1.3.3.tgz", + "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" + }, + "pascal-case": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/pascal-case/-/pascal-case-3.1.2.tgz", + "integrity": "sha512-uWlGT3YSnK9x3BQJaOdcZwrnV6hPpd8jFH1/ucpiLRPh/2zCVJKS19E4GvYHvaCcACn3foXZ0cLB9Wrx1KGe5g==", + "requires": { + "no-case": "^3.0.4", + "tslib": "^2.0.3" + } + }, + "path-exists": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/path-exists/-/path-exists-4.0.0.tgz", + "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==" + }, + "path-is-absolute": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz", + "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" + }, + "path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==" + }, + "path-parse": { + "version": "1.0.7", + "resolved": "https://registry.npmmirror.com/path-parse/-/path-parse-1.0.7.tgz", + "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" + }, + "picocolors": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/picocolors/-/picocolors-1.0.0.tgz", + "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==" + }, + "picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==" + }, + "portscanner": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/portscanner/-/portscanner-2.1.1.tgz", + "integrity": "sha512-CUxI7PHXrWJTIPmQs1YJFyD4uesS3om2jVcgS3T1eYPyd60s1l0m7tf35Fn5KRAtV51SAD7BmImaOGf6vwhiFQ==", + "requires": { + "async": "1.5.2", + "is-number-like": "^1.0.3" + }, + "dependencies": { + "async": { + "version": "1.5.2", + "resolved": "https://registry.npmmirror.com/async/-/async-1.5.2.tgz", + "integrity": "sha512-nSVgobk4rv61R9PUSDtYt7mPVB2olxNR5RWJcAsH676/ef11bUZwvu7+RGYrYauVdDPcO519v68wRhXQtxsV9w==" + } + } + }, + "prelude-ls": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/prelude-ls/-/prelude-ls-1.1.2.tgz", + "integrity": "sha512-ESF23V4SKG6lVSGZgYNpbsiaAkdab6ZgOxe52p7+Kid3W3u3bxR4Vfd/o21dmN7jSt0IwgZ4v5MUd26FEtXE9w==" + }, + "pretty-hrtime": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/pretty-hrtime/-/pretty-hrtime-1.0.3.tgz", + "integrity": "sha512-66hKPCr+72mlfiSjlEB1+45IjXSqvVAIy6mocupoww4tBFE9R9IhwwUGoI4G++Tc9Aq+2rxOt0RFU6gPcrte0A==" + }, + "prismjs": { + "version": "1.26.0", + "resolved": "https://registry.npmmirror.com/prismjs/-/prismjs-1.26.0.tgz", + "integrity": "sha512-HUoH9C5Z3jKkl3UunCyiD5jwk0+Hz0fIgQ2nbwU2Oo/ceuTAQAg+pPVnfdt2TJWRVLcxKh9iuoYDUSc8clb5UQ==" + }, + "promise": { + "version": "6.1.0", + "resolved": "https://registry.npmmirror.com/promise/-/promise-6.1.0.tgz", + "integrity": "sha512-O+uwGKreKNKkshzZv2P7N64lk6EP17iXBn0PbUnNQhk+Q0AHLstiTrjkx3v5YBd3cxUe7Sq6KyRhl/A0xUjk7Q==", + "requires": { + "asap": "~1.0.0" + }, + "dependencies": { + "asap": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/asap/-/asap-1.0.0.tgz", + "integrity": "sha512-Ej9qjcXY+8Tuy1cNqiwNMwFRXOy9UwgTeMA8LxreodygIPV48lx8PU1ecFxb5ZeU1DpMKxiq6vGLTxcitWZPbA==" + } + } + }, + "psl": { + "version": "1.8.0", + "resolved": "https://registry.npmmirror.com/psl/-/psl-1.8.0.tgz", + "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==" + }, + "pug": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pug/-/pug-2.0.4.tgz", + "integrity": "sha512-XhoaDlvi6NIzL49nu094R2NA6P37ijtgMDuWE+ofekDChvfKnzFal60bhSdiy8y2PBO6fmz3oMEIcfpBVRUdvw==", + "requires": { + "pug-code-gen": "^2.0.2", + "pug-filters": "^3.1.1", + "pug-lexer": "^4.1.0", + "pug-linker": "^3.0.6", + "pug-load": "^2.0.12", + "pug-parser": "^5.0.1", + "pug-runtime": "^2.0.5", + "pug-strip-comments": "^1.0.4" + } + }, + "pug-attrs": { + "version": "2.0.4", + "resolved": "https://registry.npmmirror.com/pug-attrs/-/pug-attrs-2.0.4.tgz", + "integrity": "sha512-TaZ4Z2TWUPDJcV3wjU3RtUXMrd3kM4Wzjbe3EWnSsZPsJ3LDI0F3yCnf2/W7PPFF+edUFQ0HgDL1IoxSz5K8EQ==", + "requires": { + "constantinople": "^3.0.1", + "js-stringify": "^1.0.1", + "pug-runtime": "^2.0.5" + } + }, + "pug-code-gen": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/pug-code-gen/-/pug-code-gen-2.0.3.tgz", + "integrity": "sha512-r9sezXdDuZJfW9J91TN/2LFbiqDhmltTFmGpHTsGdrNGp3p4SxAjjXEfnuK2e4ywYsRIVP0NeLbSAMHUcaX1EA==", + "requires": { + "constantinople": "^3.1.2", + "doctypes": "^1.1.0", + "js-stringify": "^1.0.1", + "pug-attrs": "^2.0.4", + "pug-error": "^1.3.3", + "pug-runtime": "^2.0.5", + "void-elements": "^2.0.1", + "with": "^5.0.0" + }, + "dependencies": { + "acorn": { + "version": "3.3.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-3.3.0.tgz", + "integrity": "sha512-OLUyIIZ7mF5oaAUT1w0TFqQS81q3saT46x8t7ukpPjMNk+nbs4ZHhs7ToV8EWnLYLepjETXd4XaCE4uxkMeqUw==" + }, + "acorn-globals": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-3.1.0.tgz", + "integrity": "sha512-uWttZCk96+7itPxK8xCzY86PnxKTMrReKDqrHzv42VQY0K30PUO8WY13WMOuI+cOdX4EIdzdvQ8k6jkuGRFMYw==", + "requires": { + "acorn": "^4.0.4" + }, + "dependencies": { + "acorn": { + "version": "4.0.13", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-4.0.13.tgz", + "integrity": "sha512-fu2ygVGuMmlzG8ZeRJ0bvR41nsAkxxhbyk8bZ1SS521Z7vmgJFTQQlfz/Mp/nJexGBz+v8sC9bM6+lNgskt4Ug==" + } + } + }, + "constantinople": { + "version": "3.1.2", + "resolved": "https://registry.npmmirror.com/constantinople/-/constantinople-3.1.2.tgz", + "integrity": "sha512-yePcBqEFhLOqSBtwYOGGS1exHo/s1xjekXiinh4itpNQGCu4KA1euPh1fg07N2wMITZXQkBz75Ntdt1ctGZouw==", + "requires": { + "@types/babel-types": "^7.0.0", + "@types/babylon": "^6.16.2", + "babel-types": "^6.26.0", + "babylon": "^6.18.0" + } + }, + "with": { + "version": "5.1.1", + "resolved": "https://registry.npmmirror.com/with/-/with-5.1.1.tgz", + "integrity": "sha512-uAnSsFGfSpF6DNhBXStvlZILfHJfJu4eUkfbRGk94kGO1Ta7bg6FwfvoOhhyHAJuFbCw+0xk4uJ3u57jLvlCJg==", + "requires": { + "acorn": "^3.1.0", + "acorn-globals": "^3.0.0" + } + } + } + }, + "pug-error": { + "version": "1.3.3", + "resolved": "https://registry.npmmirror.com/pug-error/-/pug-error-1.3.3.tgz", + "integrity": "sha512-qE3YhESP2mRAWMFJgKdtT5D7ckThRScXRwkfo+Erqga7dyJdY3ZquspprMCj/9sJ2ijm5hXFWQE/A3l4poMWiQ==" + }, + "pug-filters": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/pug-filters/-/pug-filters-3.1.1.tgz", + "integrity": "sha512-lFfjNyGEyVWC4BwX0WyvkoWLapI5xHSM3xZJFUhx4JM4XyyRdO8Aucc6pCygnqV2uSgJFaJWW3Ft1wCWSoQkQg==", + "requires": { + "clean-css": "^4.1.11", + "constantinople": "^3.0.1", + "jstransformer": "1.0.0", + "pug-error": "^1.3.3", + "pug-walk": "^1.1.8", + "resolve": "^1.1.6", + "uglify-js": "^2.6.1" + }, + "dependencies": { + "clean-css": { + "version": "4.2.4", + "resolved": "https://registry.npmmirror.com/clean-css/-/clean-css-4.2.4.tgz", + "integrity": "sha512-EJUDT7nDVFDvaQgAo2G/PJvxmp1o/c6iXLbswsBbUFXi1Nr+AjA2cKmfbKDMjMvzEe75g3P6JkaDDAKk96A85A==", + "requires": { + "source-map": "~0.6.0" + } + }, + "jstransformer": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/jstransformer/-/jstransformer-1.0.0.tgz", + "integrity": "sha512-C9YK3Rf8q6VAPDCCU9fnqo3mAfOH6vUGnMcP4AQAYIEpWtfGLpwOTmZ+igtdK5y+VvI2n3CyYSzy4Qh34eq24A==", + "requires": { + "is-promise": "^2.0.0", + "promise": "^7.0.1" + } + }, + "promise": { + "version": "7.3.1", + "resolved": "https://registry.npmmirror.com/promise/-/promise-7.3.1.tgz", + "integrity": "sha512-nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==", + "requires": { + "asap": "~2.0.3" + } + } + } + }, + "pug-lexer": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/pug-lexer/-/pug-lexer-4.1.0.tgz", + "integrity": "sha512-i55yzEBtjm0mlplW4LoANq7k3S8gDdfC6+LThGEvsK4FuobcKfDAwt6V4jKPH9RtiE3a2Akfg5UpafZ1OksaPA==", + "requires": { + "character-parser": "^2.1.1", + "is-expression": "^3.0.0", + "pug-error": "^1.3.3" + }, + "dependencies": { + "character-parser": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/character-parser/-/character-parser-2.2.0.tgz", + "integrity": "sha512-+UqJQjFEFaTAs3bNsF2j2kEN1baG/zghZbdqoYEDxGZtJo9LBzl1A+m0D4n3qKx8N2FNv8/Xp6yV9mQmBuptaw==", + "requires": { + "is-regex": "^1.0.3" + } + } + } + }, + "pug-linker": { + "version": "3.0.6", + "resolved": "https://registry.npmmirror.com/pug-linker/-/pug-linker-3.0.6.tgz", + "integrity": "sha512-bagfuHttfQOpANGy1Y6NJ+0mNb7dD2MswFG2ZKj22s8g0wVsojpRlqveEQHmgXXcfROB2RT6oqbPYr9EN2ZWzg==", + "requires": { + "pug-error": "^1.3.3", + "pug-walk": "^1.1.8" + } + }, + "pug-load": { + "version": "2.0.12", + "resolved": "https://registry.npmmirror.com/pug-load/-/pug-load-2.0.12.tgz", + "integrity": "sha512-UqpgGpyyXRYgJs/X60sE6SIf8UBsmcHYKNaOccyVLEuT6OPBIMo6xMPhoJnqtB3Q3BbO4Z3Bjz5qDsUWh4rXsg==", + "requires": { + "object-assign": "^4.1.0", + "pug-walk": "^1.1.8" + } + }, + "pug-parser": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/pug-parser/-/pug-parser-5.0.1.tgz", + "integrity": "sha512-nGHqK+w07p5/PsPIyzkTQfzlYfuqoiGjaoqHv1LjOv2ZLXmGX1O+4Vcvps+P4LhxZ3drYSljjq4b+Naid126wA==", + "requires": { + "pug-error": "^1.3.3", + "token-stream": "0.0.1" + } + }, + "pug-runtime": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/pug-runtime/-/pug-runtime-2.0.5.tgz", + "integrity": "sha512-P+rXKn9un4fQY77wtpcuFyvFaBww7/91f3jHa154qU26qFAnOe6SW1CbIDcxiG5lLK9HazYrMCCuDvNgDQNptw==" + }, + "pug-strip-comments": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/pug-strip-comments/-/pug-strip-comments-1.0.4.tgz", + "integrity": "sha512-i5j/9CS4yFhSxHp5iKPHwigaig/VV9g+FgReLJWWHEHbvKsbqL0oP/K5ubuLco6Wu3Kan5p7u7qk8A4oLLh6vw==", + "requires": { + "pug-error": "^1.3.3" + } + }, + "pug-walk": { + "version": "1.1.8", + "resolved": "https://registry.npmmirror.com/pug-walk/-/pug-walk-1.1.8.tgz", + "integrity": "sha512-GMu3M5nUL3fju4/egXwZO0XLi6fW/K3T3VTgFQ14GxNi8btlxgT5qZL//JwZFm/2Fa64J/PNS8AZeys3wiMkVA==" + }, + "punycode": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/punycode/-/punycode-2.1.1.tgz", + "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==" + }, + "punycode.js": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/punycode.js/-/punycode.js-2.1.0.tgz", + "integrity": "sha512-LvGUJ9QHiESLM4yn8JuJWicstRcJKRmP46psQw1HvCZ9puLFwYMKJWvkAkP3OHBVzNzZGx/D53EYJrIaKd9gZQ==" + }, + "q": { + "version": "1.5.1", + "resolved": "https://registry.npmmirror.com/q/-/q-1.5.1.tgz", + "integrity": "sha512-kV/CThkXo6xyFEZUugw/+pIOywXcDbFYgSct5cT3gqlbkBE1SJdwy6UQoZvodiWF/ckQLZyDE/Bu1M6gVu5lVw==" + }, + "qs": { + "version": "6.2.3", + "resolved": "https://registry.npmmirror.com/qs/-/qs-6.2.3.tgz", + "integrity": "sha512-AY4g8t3LMboim0t6XWFdz6J5OuJ1ZNYu54SXihS/OMpgyCqYmcAJnWqkNSOjSjWmq3xxy+GF9uWQI2lI/7tKIA==" + }, + "range-parser": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/range-parser/-/range-parser-1.2.1.tgz", + "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" + }, + "raw-body": { + "version": "2.4.2", + "resolved": "https://registry.npmmirror.com/raw-body/-/raw-body-2.4.2.tgz", + "integrity": "sha512-RPMAFUJP19WIet/99ngh6Iv8fzAbqum4Li7AD6DtGaW2RpMB/11xDoalPiJMTbu6I3hkbMVkATvZrqb9EEqeeQ==", + "requires": { + "bytes": "3.1.1", + "http-errors": "1.8.1", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "dependencies": { + "bytes": { + "version": "3.1.1", + "resolved": "https://registry.npmmirror.com/bytes/-/bytes-3.1.1.tgz", + "integrity": "sha512-dWe4nWO/ruEOY7HkUJ5gFt1DCFV9zPRoJr8pV0/ASQermOZjtq8jMjOprC0Kd10GLN+l7xaUPvxzJFWtxGu8Fg==" + }, + "iconv-lite": { + "version": "0.4.24", + "resolved": "https://registry.npmmirror.com/iconv-lite/-/iconv-lite-0.4.24.tgz", + "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", + "requires": { + "safer-buffer": ">= 2.1.2 < 3" + } + } + } + }, + "readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmmirror.com/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "requires": { + "picomatch": "^2.2.1" + } + }, + "regenerator-runtime": { + "version": "0.11.1", + "resolved": "https://registry.npmmirror.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz", + "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==" + }, + "repeat-string": { + "version": "1.6.1", + "resolved": "https://registry.npmmirror.com/repeat-string/-/repeat-string-1.6.1.tgz", + "integrity": "sha512-PV0dzCYDNfRi1jCDbJzpW7jNNDRuCOG/jI5ctQcGKt/clZD+YcPS3yIlWuTJMmESC8aevCFmWJy5wjAFgNqN6w==" + }, + "require-directory": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/require-directory/-/require-directory-2.1.1.tgz", + "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==" + }, + "require-main-filename": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/require-main-filename/-/require-main-filename-2.0.0.tgz", + "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==" + }, + "requires-port": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/requires-port/-/requires-port-1.0.0.tgz", + "integrity": "sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==" + }, + "resolve": { + "version": "1.22.0", + "resolved": "https://registry.npmmirror.com/resolve/-/resolve-1.22.0.tgz", + "integrity": "sha512-Hhtrw0nLeSrFQ7phPp4OOcVjLPIeMnRlr5mcnVuMe7M/7eBn98A3hmFRLoFo3DLZkivSYwhRUJTyPyWAk56WLw==", + "requires": { + "is-core-module": "^2.8.1", + "path-parse": "^1.0.7", + "supports-preserve-symlinks-flag": "^1.0.0" + } + }, + "resolve-url": { + "version": "0.2.1", + "resolved": "https://registry.npmmirror.com/resolve-url/-/resolve-url-0.2.1.tgz", + "integrity": "sha512-ZuF55hVUQaaczgOIwqWzkEcEidmlD/xl44x1UZnhOXcYuFN2S6+rcxpG+C1N3So0wvNI3DmJICUFfu2SxhBmvg==" + }, + "resp-modifier": { + "version": "6.0.2", + "resolved": "https://registry.npmmirror.com/resp-modifier/-/resp-modifier-6.0.2.tgz", + "integrity": "sha512-U1+0kWC/+4ncRFYqQWTx/3qkfE6a4B/h3XXgmXypfa0SPZ3t7cbbaFk297PjQS/yov24R18h6OZe6iZwj3NSLw==", + "requires": { + "debug": "^2.2.0", + "minimatch": "^3.0.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "rfdc": { + "version": "1.3.0", + "resolved": "https://registry.npmmirror.com/rfdc/-/rfdc-1.3.0.tgz", + "integrity": "sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==" + }, + "right-align": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/right-align/-/right-align-0.1.3.tgz", + "integrity": "sha512-yqINtL/G7vs2v+dFIZmFUDbnVyFUJFKd6gK22Kgo6R4jfJGFtisKyncWDDULgjfqf4ASQuIQyjJ7XZ+3aWpsAg==", + "requires": { + "align-text": "^0.1.1" + } + }, + "rx": { + "version": "4.1.0", + "resolved": "https://registry.npmmirror.com/rx/-/rx-4.1.0.tgz", + "integrity": "sha512-CiaiuN6gapkdl+cZUr67W6I8jquN4lkak3vtIsIWCl4XIPP8ffsoyN6/+PuGXnQy8Cu8W2y9Xxh31Rq4M6wUug==" + }, + "rxjs": { + "version": "5.5.12", + "resolved": "https://registry.npmmirror.com/rxjs/-/rxjs-5.5.12.tgz", + "integrity": "sha512-xx2itnL5sBbqeeiVgNPVuQQ1nC8Jp2WfNJhXWHmElW9YmrpS9UVnNzhP3EH3HFqexO5Tlp8GhYY+WEcqcVMvGw==", + "requires": { + "symbol-observable": "1.0.1" + } + }, + "safe-buffer": { + "version": "5.1.2", + "resolved": "https://registry.npmmirror.com/safe-buffer/-/safe-buffer-5.1.2.tgz", + "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" + }, + "safer-buffer": { + "version": "2.1.2", + "resolved": "https://registry.npmmirror.com/safer-buffer/-/safer-buffer-2.1.2.tgz", + "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" + }, + "sax": { + "version": "0.5.8", + "resolved": "https://registry.npmmirror.com/sax/-/sax-0.5.8.tgz", + "integrity": "sha512-c0YL9VcSfcdH3F1Qij9qpYJFpKFKMXNOkLWFssBL3RuF7ZS8oZhllR2rWlCRjDTJsfq3R6wbSsaRU6o0rkEdNw==" + }, + "saxes": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/saxes/-/saxes-5.0.1.tgz", + "integrity": "sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==", + "requires": { + "xmlchars": "^2.2.0" + } + }, + "semver": { + "version": "6.3.0", + "resolved": "https://registry.npmmirror.com/semver/-/semver-6.3.0.tgz", + "integrity": "sha512-b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==" + }, + "send": { + "version": "0.17.2", + "resolved": "https://registry.npmmirror.com/send/-/send-0.17.2.tgz", + "integrity": "sha512-UJYB6wFSJE3G00nEivR5rgWp8c2xXvJ3OPWPhmuteU0IKj8nKbG3DrjiOmLwpnHGYWAVwA69zmTm++YG0Hmwww==", + "requires": { + "debug": "2.6.9", + "depd": "~1.1.2", + "destroy": "~1.0.4", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "fresh": "0.5.2", + "http-errors": "1.8.1", + "mime": "1.6.0", + "ms": "2.1.3", + "on-finished": "~2.3.0", + "range-parser": "~1.2.1", + "statuses": "~1.5.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + }, + "dependencies": { + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "mime": { + "version": "1.6.0", + "resolved": "https://registry.npmmirror.com/mime/-/mime-1.6.0.tgz", + "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" + }, + "ms": { + "version": "2.1.3", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" + } + } + }, + "serve-index": { + "version": "1.9.1", + "resolved": "https://registry.npmmirror.com/serve-index/-/serve-index-1.9.1.tgz", + "integrity": "sha512-pXHfKNP4qujrtteMrSBb0rc8HJ9Ms/GrXwcUtUtD5s4ewDJI8bT3Cz2zTVRMKtri49pLx2e0Ya8ziP5Ya2pZZw==", + "requires": { + "accepts": "~1.3.4", + "batch": "0.6.1", + "debug": "2.6.9", + "escape-html": "~1.0.3", + "http-errors": "~1.6.2", + "mime-types": "~2.1.17", + "parseurl": "~1.3.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmmirror.com/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "depd": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/depd/-/depd-1.1.2.tgz", + "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==" + }, + "http-errors": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/http-errors/-/http-errors-1.6.3.tgz", + "integrity": "sha512-lks+lVC8dgGyh97jxvxeYTWQFvh4uw4yC12gVl63Cg30sjPX4wuGcdkICVXDAESr6OJGjqGA8Iz5mkeN6zlD7A==", + "requires": { + "depd": "~1.1.2", + "inherits": "2.0.3", + "setprototypeof": "1.1.0", + "statuses": ">= 1.4.0 < 2" + } + }, + "inherits": { + "version": "2.0.3", + "resolved": "https://registry.npmmirror.com/inherits/-/inherits-2.0.3.tgz", + "integrity": "sha512-x00IRNXNy63jwGkJmzPigoySHbaqpNuzKbBOmzK+g2OdZpQ9w+sxCN+VSB3ja7IAge2OP2qpfxTjeNcyjmW1uw==" + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "setprototypeof": { + "version": "1.1.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.1.0.tgz", + "integrity": "sha512-BvE/TwpZX4FXExxOxZyRGQQv651MSwmWKZGqvmPcRIjDqWub67kTKuIMx43cZZrS/cBBzwBcNDWoFxt2XEFIpQ==" + } + } + }, + "serve-static": { + "version": "1.14.2", + "resolved": "https://registry.npmmirror.com/serve-static/-/serve-static-1.14.2.tgz", + "integrity": "sha512-+TMNA9AFxUEGuC0z2mevogSnn9MXKb4fa7ngeRMJaaGv8vTwnIEkKi+QGvPt33HSnf8pRS+WGM0EbMtCJLKMBQ==", + "requires": { + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "parseurl": "~1.3.3", + "send": "0.17.2" + } + }, + "server-destroy": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/server-destroy/-/server-destroy-1.0.1.tgz", + "integrity": "sha512-rb+9B5YBIEzYcD6x2VKidaa+cqYBJQKnU4oe4E3ANwRRN56yk/ua1YCJT1n21NTS8w6CcOclAKNP3PhdCXKYtQ==" + }, + "set-blocking": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/set-blocking/-/set-blocking-2.0.0.tgz", + "integrity": "sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==" + }, + "setprototypeof": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/setprototypeof/-/setprototypeof-1.2.0.tgz", + "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==" + }, + "shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "requires": { + "shebang-regex": "^3.0.0" + } + }, + "shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==" + }, + "socket.io": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/socket.io/-/socket.io-2.4.0.tgz", + "integrity": "sha512-9UPJ1UTvKayuQfVv2IQ3k7tCQC/fboDyIK62i99dAQIyHKaBsNdTpwHLgKJ6guRWxRtC9H+138UwpaGuQO9uWQ==", + "requires": { + "debug": "~4.1.0", + "engine.io": "~3.5.0", + "has-binary2": "~1.0.2", + "socket.io-adapter": "~1.1.0", + "socket.io-client": "2.4.0", + "socket.io-parser": "~3.4.0" + }, + "dependencies": { + "component-emitter": { + "version": "1.2.1", + "resolved": "https://registry.npmmirror.com/component-emitter/-/component-emitter-1.2.1.tgz", + "integrity": "sha512-jPatnhd33viNplKjqXKRkGU345p263OIWzDL2wH3LGIGp5Kojo+uXizHmOADRvhGFFTnJqX3jBAKP6vvmSDKcA==" + }, + "debug": { + "version": "4.1.1", + "resolved": "https://registry.npmmirror.com/debug/-/debug-4.1.1.tgz", + "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==", + "requires": { + "ms": "^2.1.1" + } + }, + "socket.io-parser": { + "version": "3.4.1", + "resolved": "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-3.4.1.tgz", + "integrity": "sha512-11hMgzL+WCLWf1uFtHSNvliI++tcRUWdoeYuwIl+Axvwy9z2gQM+7nJyN3STj1tLj5JyIUH8/gpDGxzAlDdi0A==", + "requires": { + "component-emitter": "1.2.1", + "debug": "~4.1.0", + "isarray": "2.0.1" + } + } + } + }, + "socket.io-adapter": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/socket.io-adapter/-/socket.io-adapter-1.1.2.tgz", + "integrity": "sha512-WzZRUj1kUjrTIrUKpZLEzFZ1OLj5FwLlAFQs9kuZJzJi5DKdU7FsWc36SNmA8iDOtwBQyT8FkrriRM8vXLYz8g==" + }, + "socket.io-client": { + "version": "2.4.0", + "resolved": "https://registry.npmmirror.com/socket.io-client/-/socket.io-client-2.4.0.tgz", + "integrity": "sha512-M6xhnKQHuuZd4Ba9vltCLT9oa+YvTsP8j9NcEiLElfIg8KeYPyhWOes6x4t+LTAC8enQbE/995AdTem2uNyKKQ==", + "requires": { + "backo2": "1.0.2", + "component-bind": "1.0.0", + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "engine.io-client": "~3.5.0", + "has-binary2": "~1.0.2", + "indexof": "0.0.1", + "parseqs": "0.0.6", + "parseuri": "0.0.6", + "socket.io-parser": "~3.3.0", + "to-array": "0.1.4" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "socket.io-parser": { + "version": "3.3.2", + "resolved": "https://registry.npmmirror.com/socket.io-parser/-/socket.io-parser-3.3.2.tgz", + "integrity": "sha512-FJvDBuOALxdCI9qwRrO/Rfp9yfndRtc1jSgVgV8FDraihmSP/MLGD5PEuJrNfjALvcQ+vMDM/33AWOYP/JSjDg==", + "requires": { + "component-emitter": "~1.3.0", + "debug": "~3.1.0", + "isarray": "2.0.1" + }, + "dependencies": { + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==" + }, + "source-map-resolve": { + "version": "0.5.3", + "resolved": "https://registry.npmmirror.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz", + "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==", + "requires": { + "atob": "^2.1.2", + "decode-uri-component": "^0.2.0", + "resolve-url": "^0.2.1", + "source-map-url": "^0.4.0", + "urix": "^0.1.0" + } + }, + "source-map-url": { + "version": "0.4.1", + "resolved": "https://registry.npmmirror.com/source-map-url/-/source-map-url-0.4.1.tgz", + "integrity": "sha512-cPiFOTLUKvJFIg4SKVScy4ilPPW6rFgMgfuZJPNoDuMs3nC1HbMUycBoJw77xFIp6z1UJQJOfx6C9GMH80DiTw==" + }, + "sprintf-js": { + "version": "1.0.3", + "resolved": "https://registry.npmmirror.com/sprintf-js/-/sprintf-js-1.0.3.tgz", + "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==" + }, + "statuses": { + "version": "1.5.0", + "resolved": "https://registry.npmmirror.com/statuses/-/statuses-1.5.0.tgz", + "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==" + }, + "stream-buffers": { + "version": "0.2.6", + "resolved": "https://registry.npmmirror.com/stream-buffers/-/stream-buffers-0.2.6.tgz", + "integrity": "sha512-ZRpmWyuCdg0TtNKk8bEqvm13oQvXMmzXDsfD4cBgcx5LouborvU5pm3JMkdTP3HcszyUI08AM1dHMXA5r2g6Sg==" + }, + "stream-throttle": { + "version": "0.1.3", + "resolved": "https://registry.npmmirror.com/stream-throttle/-/stream-throttle-0.1.3.tgz", + "integrity": "sha512-889+B9vN9dq7/vLbGyuHeZ6/ctf5sNuGWsDy89uNxkFTAgzy0eK7+w5fL3KLNRTkLle7EgZGvHUphZW0Q26MnQ==", + "requires": { + "commander": "^2.2.0", + "limiter": "^1.0.5" + }, + "dependencies": { + "commander": { + "version": "2.20.3", + "resolved": "https://registry.npmmirror.com/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==" + } + } + }, + "string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmmirror.com/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "requires": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + } + }, + "strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmmirror.com/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "requires": { + "ansi-regex": "^5.0.1" + } + }, + "strip-indent": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/strip-indent/-/strip-indent-3.0.0.tgz", + "integrity": "sha512-laJTa3Jb+VQpaC6DseHhF7dXVqHTfJPCRDaEbid/drOhgitgYku/letMUqOXFoWV0zIIUbjpdH2t+tYj4bQMRQ==", + "requires": { + "min-indent": "^1.0.0" + } + }, + "striptags": { + "version": "3.2.0", + "resolved": "https://registry.npmmirror.com/striptags/-/striptags-3.2.0.tgz", + "integrity": "sha512-g45ZOGzHDMe2bdYMdIvdAfCQkCTDMGBazSw1ypMowwGIee7ZQ5dU0rBJ8Jqgl+jAKIv4dbeE1jscZq9wid1Tkw==" + }, + "stylus": { + "version": "0.54.8", + "resolved": "https://registry.npmmirror.com/stylus/-/stylus-0.54.8.tgz", + "integrity": "sha512-vr54Or4BZ7pJafo2mpf0ZcwA74rpuYCZbxrHBsH8kbcXOwSfvBFwsRfpGO5OD5fhG5HDCFW737PKaawI7OqEAg==", + "requires": { + "css-parse": "~2.0.0", + "debug": "~3.1.0", + "glob": "^7.1.6", + "mkdirp": "~1.0.4", + "safer-buffer": "^2.1.2", + "sax": "~1.2.4", + "semver": "^6.3.0", + "source-map": "^0.7.3" + }, + "dependencies": { + "css-parse": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/css-parse/-/css-parse-2.0.0.tgz", + "integrity": "sha512-UNIFik2RgSbiTwIW1IsFwXWn6vs+bYdq83LKTSOsx7NJR7WII9dxewkHLltfTLVppoUApHV0118a4RZRI9FLwA==", + "requires": { + "css": "^2.0.0" + } + }, + "debug": { + "version": "3.1.0", + "resolved": "https://registry.npmmirror.com/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", + "requires": { + "ms": "2.0.0" + } + }, "glob": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz", - "integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==", + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/glob/-/glob-7.2.0.tgz", + "integrity": "sha512-lmLf6gtyrPq8tTjSmrO94wBeQbFR3HbLHbuyD69wuyQkImp2hWqMGB47OX65FBkPffO641IP9jWa1z4ivqG26Q==", "requires": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -10785,703 +8035,252 @@ "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" - } + "mkdirp": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/mkdirp/-/mkdirp-1.0.4.tgz", + "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==" }, - "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=" + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, - "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" - } - } - } + "sax": { + "version": "1.2.4", + "resolved": "https://registry.npmmirror.com/sax/-/sax-1.2.4.tgz", + "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==" }, - "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" - } + "source-map": { + "version": "0.7.3", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.7.3.tgz", + "integrity": "sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==" } } }, - "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=", + "version": "7.2.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "requires": { - "has-flag": "^2.0.0" + "has-flag": "^4.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" - } + "supports-preserve-symlinks-flag": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", + "integrity": "sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==" }, - "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-observable": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/symbol-observable/-/symbol-observable-1.0.1.tgz", + "integrity": "sha512-Kb3PrPYz4HanVF1LVGuAdW6LoVgIwjUYJGzFe7NDrBLCN4lsV/5J0MFurV+ygS4bRVwrCEt2c7MQ1R2a72oJDw==" }, "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==" - } - } + "version": "3.2.4", + "resolved": "https://registry.npmmirror.com/symbol-tree/-/symbol-tree-3.2.4.tgz", + "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==" }, "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=" + "resolved": "https://registry.npmmirror.com/text-table/-/text-table-0.2.0.tgz", + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" + }, + "tfunk": { + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/tfunk/-/tfunk-4.0.0.tgz", + "integrity": "sha512-eJQ0dGfDIzWNiFNYFVjJ+Ezl/GmwHaFTBTjrtqNPW0S7cuVDBrZrmzUz6VkMeCR4DZFqhd4YtLwsw3i2wYHswQ==", + "requires": { + "chalk": "^1.1.3", + "dlv": "^1.1.3" + }, + "dependencies": { + "ansi-regex": { + "version": "2.1.1", + "resolved": "https://registry.npmmirror.com/ansi-regex/-/ansi-regex-2.1.1.tgz", + "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==" + }, + "ansi-styles": { + "version": "2.2.1", + "resolved": "https://registry.npmmirror.com/ansi-styles/-/ansi-styles-2.2.1.tgz", + "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==" + }, + "chalk": { + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/chalk/-/chalk-1.1.3.tgz", + "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", + "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.npmmirror.com/strip-ansi/-/strip-ansi-3.0.1.tgz", + "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", + "requires": { + "ansi-regex": "^2.0.0" + } + }, + "supports-color": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/supports-color/-/supports-color-2.0.0.tgz", + "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==" + } + } }, "through": { "version": "2.3.8", - "resolved": "https://registry.npm.taobao.org/through/download/through-2.3.8.tgz", - "integrity": "sha1-DdTJ/6q8NXlgsbckEV1+Doai4fU=" + "resolved": "https://registry.npmmirror.com/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "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" - } + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/tildify/-/tildify-2.0.0.tgz", + "integrity": "sha512-Cc+OraorugtXNfs50hU9KS369rFXCfgGLpfCfvlc+Ud5u6VWmUQsOAa9HbTvheQdYnrdJqqv1e5oIqXppMYnSw==" + }, + "timsort": { + "version": "0.3.0", + "resolved": "https://registry.npmmirror.com/timsort/-/timsort-0.3.0.tgz", + "integrity": "sha512-qsdtZH+vMoCARQtyod4imc2nIJwg9Cc7lPRrw9CzF8ZKR0khdr8+2nX80PBhET3tcyTtJDxAffGh2rXH4tyU8A==" }, "titlecase": { - "version": "1.1.2", - "resolved": "https://registry.npm.taobao.org/titlecase/download/titlecase-1.1.2.tgz", - "integrity": "sha1-eBE9EQgIa4MmMxoyR96o9aSeqFM=" + "version": "1.1.3", + "resolved": "https://registry.npmmirror.com/titlecase/-/titlecase-1.1.3.tgz", + "integrity": "sha512-pQX4oiemzjBEELPqgK4WE+q0yhAqjp/yzusGtlSJsOuiDys0RQxggepYmo0BuegIDppYS3b3cpdegRwkpyN3hw==" + }, + "to-array": { + "version": "0.1.4", + "resolved": "https://registry.npmmirror.com/to-array/-/to-array-0.1.4.tgz", + "integrity": "sha512-LhVdShQD/4Mk4zXNroIQZJC+Ap3zgLcDuwEdcmLv9CCO73NWockQDwyUnW/m8VX/EElfL6FcYx7EeutN4HJA6A==" }, "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=" + "resolved": "https://registry.npmmirror.com/to-fast-properties/-/to-fast-properties-1.0.3.tgz", + "integrity": "sha512-lxrWP8ejsq+7E3nNjwYmUBMAgjMTZoTI+sdBOpvNyijeDLa29LUn9QaoXAHv4+Z578hbmHHJKZknzxVtvo77og==" + }, + "to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmmirror.com/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "requires": { + "is-number": "^7.0.0" + } + }, + "toidentifier": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/toidentifier/-/toidentifier-1.0.1.tgz", + "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==" + }, + "token-stream": { + "version": "0.0.1", + "resolved": "https://registry.npmmirror.com/token-stream/-/token-stream-0.0.1.tgz", + "integrity": "sha512-nfjOAu/zAWmX9tgwi5NRp7O7zTDUD1miHiB40klUnAh9qnL1iXdgzcz/i5dMaL5jahcBAaSfmNOBBJBLJW8TEg==" }, "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, + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/tough-cookie/-/tough-cookie-4.0.0.tgz", + "integrity": "sha512-tHdtEpQCMrc1YLrMaqXXcj6AxhYi/xgit6mZu1+EDWUn+qhUf8wMQoFIy9NXuq23zAwtcB0t/MjACGR18pcRbg==", "requires": { - "punycode": "^1.4.1" + "psl": "^1.1.33", + "punycode": "^2.1.1", + "universalify": "^0.1.2" } }, "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, + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/tr46/-/tr46-3.0.0.tgz", + "integrity": "sha512-l7FvfAHlcmulp8kr+flpQZmVwtu7nfRV7NZujtN0OqES8EL4O4e0qqzL0DC5gAvx/ZC/9lk6rhcUwYvkBnBnYA==", "requires": { - "safe-buffer": "^5.0.1" + "punycode": "^2.1.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 + "transformers": { + "version": "2.1.0", + "resolved": "https://registry.npmmirror.com/transformers/-/transformers-2.1.0.tgz", + "integrity": "sha512-zJf5m2EIOngmBbDe2fhTPpCjzM2qkZVqrFJZc2jaln+KBeEaYKhS2QMOIkfVrNUyoOwqgbTwOHATzr3jZRQDyg==", + "requires": { + "css": "~1.0.8", + "promise": "~2.0", + "uglify-js": "~2.2.5" + }, + "dependencies": { + "css": { + "version": "1.0.8", + "resolved": "https://registry.npmmirror.com/css/-/css-1.0.8.tgz", + "integrity": "sha512-qmTYWhHk910nQWnGqMAiWWPQlB6tESiWgNebQJmiozOAGcBAQ1+U/UzUOkhdrcshlkSRRiKWodwmVvO0OmnIGg==", + "requires": { + "css-parse": "1.0.4", + "css-stringify": "1.0.5" + } + }, + "css-parse": { + "version": "1.0.4", + "resolved": "https://registry.npmmirror.com/css-parse/-/css-parse-1.0.4.tgz", + "integrity": "sha512-pfstzKVRZiHprDXdsmtfH1HYUEw22lzjuHdnpe1hscwoQvgW2C5zDQIBE0RKoALEReTn9W1ECdY8uaT/kO4VfA==" + }, + "is-promise": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/is-promise/-/is-promise-1.0.1.tgz", + "integrity": "sha512-mjWH5XxnhMA8cFnDchr6qRP9S/kLntKuEfIYku+PaN1CnS8v+OG9O/BKpRCVRJvpIkgAZm0Pf5Is3iSSOILlcg==" + }, + "promise": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/promise/-/promise-2.0.0.tgz", + "integrity": "sha512-OgMc+sxI3zWF8D5BJGtA0z7/IsrDy1/0cPaDv6HPpqa2fSTo7AdON5U10NbZCUeF+zCAj3PtfPE50Hf02386aA==", + "requires": { + "is-promise": "~1" + } + }, + "source-map": { + "version": "0.1.43", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.1.43.tgz", + "integrity": "sha512-VtCvB9SIQhk3aF6h+N85EaqIaBFIAfZ9Cu+NJHHVvc8BbEcnvDcFw6sqQ2dQrT6SlOrZq3tIvyD9+EGq/lJryQ==", + "requires": { + "amdefine": ">=0.0.4" + } + }, + "uglify-js": { + "version": "2.2.5", + "resolved": "https://registry.npmmirror.com/uglify-js/-/uglify-js-2.2.5.tgz", + "integrity": "sha512-viLk+/8G0zm2aKt1JJAVcz5J/5ytdiNaIsKgrre3yvSUjwVG6ZUujGH7E2TiPigZUwLYCe7eaIUEP2Zka2VJPA==", + "requires": { + "optimist": "~0.3.5", + "source-map": "~0.1.7" + } + } + } + }, + "tslib": { + "version": "2.3.1", + "resolved": "https://registry.npmmirror.com/tslib/-/tslib-2.3.1.tgz", + "integrity": "sha512-77EbyPPpMz+FRFRuAFlWMtmgUWGe9UOG2Z25NqCwiIjRhOf5iKGuzSe5P2w1laq+FkRy4p+PCuVkJSGkzTEKVw==" }, "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, + "resolved": "https://registry.npmmirror.com/type-check/-/type-check-0.3.2.tgz", + "integrity": "sha512-ZCmOJdvOWDBYJlzAoFkC+Q0+bUyEOS1ltgp1MGU03fqHG+dbi9tBFU2Rd9QKiDZFAYrhPh2JUf7rZRIuHRKtOg==", "requires": { "prelude-ls": "~1.1.2" } }, + "ua-parser-js": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/ua-parser-js/-/ua-parser-js-1.0.2.tgz", + "integrity": "sha512-00y/AXhx0/SsnI51fTc0rLRmafiGOM4/O+ny10Ps7f+j/b8p/ZY11ytMgznXkOVo4GQ+KwQG5UQLkLGirsACRg==" + }, + "uberproto": { + "version": "1.2.0", + "resolved": "https://registry.npmmirror.com/uberproto/-/uberproto-1.2.0.tgz", + "integrity": "sha512-pGtPAQmLwh+R9w81WVHzui1FfedpQWQpiaIIfPCwhtsBez4q6DYbJFfyXPVHPUTNFnedAvNEnkoFiLuhXIR94w==" + }, "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=", + "version": "2.8.29", + "resolved": "https://registry.npmmirror.com/uglify-js/-/uglify-js-2.8.29.tgz", + "integrity": "sha512-qLq/4y2pjcU3vhlhseXGGJ7VbFO4pBANu0kwl8VCa9KEI0V8VfZIx2Fy3w01iSTA/pGwKZSmu/+I4etLNDdt5w==", "requires": { - "async": "~0.2.6", "source-map": "~0.5.1", "uglify-to-browserify": "~1.0.0", "yargs": "~3.10.0" @@ -11489,33 +8288,33 @@ "dependencies": { "camelcase": { "version": "1.2.1", - "resolved": "https://registry.npm.taobao.org/camelcase/download/camelcase-1.2.1.tgz", - "integrity": "sha1-m7UwTS4LVmmLLHWLCKPqqdqlijk=" + "resolved": "https://registry.npmmirror.com/camelcase/-/camelcase-1.2.1.tgz", + "integrity": "sha512-wzLkDa4K/mzI1OSITC+DUyjgIl/ETNHE9QvYgy6J6Jvqyyz4C0Xfd+lQhb19sX2jMpZV4IssUn0VDVmglV+s4g==" }, "cliui": { "version": "2.1.0", - "resolved": "https://registry.npm.taobao.org/cliui/download/cliui-2.1.0.tgz", - "integrity": "sha1-S0dXYP+AJkx2LDoXGQMukcf+oNE=", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-2.1.0.tgz", + "integrity": "sha512-GIOYRizG+TGoc7Wgc1LiOTLare95R3mzKgoln+Q/lE4ceiYH19gUpl0l0Ffq4lJDEf3FxujMe6IBfOCs7pfqNA==", "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=" + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmmirror.com/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" }, "wordwrap": { "version": "0.0.2", - "resolved": "https://registry.npm.taobao.org/wordwrap/download/wordwrap-0.0.2.tgz", - "integrity": "sha1-t5Zpu0LstAn4PVg8rVLKF+qhZD8=" + "resolved": "https://registry.npmmirror.com/wordwrap/-/wordwrap-0.0.2.tgz", + "integrity": "sha512-xSBsCeh+g+dinoBv3GAOWM4LcVVO68wLXRanibtBSdUvkGWQRGeE9P7IwU9EmDDi4jA6L44lz15CGMwdw9N5+Q==" }, "yargs": { "version": "3.10.0", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.10.0.tgz", - "integrity": "sha1-9+572FfdfB0tOMDnTvvWgdFDH9E=", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-3.10.0.tgz", + "integrity": "sha512-QFzUah88GAGy9lyDKGBqZdkYApt63rCXYBGYnEP4xDJPXNqXXnBDACnbrXnViV6jRSqAePwrATi2i8mfYm4L1A==", "requires": { "camelcase": "^1.0.2", "cliui": "^2.1.0", @@ -11527,159 +8326,259 @@ }, "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=", + "resolved": "https://registry.npmmirror.com/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz", + "integrity": "sha512-vb2s1lYx2xBtUgy+ta+b2J/GLVUR+wmpINwHePmPRhOsIVCG2wDzKJ0n14GslH1BifsqVzSOwQhRaCAsZ/nI4Q==", "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, + "universalify": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/universalify/-/universalify-0.1.2.tgz", + "integrity": "sha512-rBJeI5CXAlmy1pV+617WB9J63U6XcazHHF2f2dbJix4XzpUF0RS3Zbj0FGIOCAva5P/d/GBOYaACQ1w+0azUkg==" + }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmmirror.com/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, + "urix": { + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/urix/-/urix-0.1.0.tgz", + "integrity": "sha512-Am1ousAhSLBeB9cG/7k7r2R0zj50uDRlZHPGbazid5s9rlF1F/QKYObEKSIunSjIOkJZqwRRLpvewjEkM7pSqg==" + }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmmirror.com/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, + "vary": { + "version": "1.1.2", + "resolved": "https://registry.npmmirror.com/vary/-/vary-1.1.2.tgz", + "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==" + }, + "void-elements": { + "version": "2.0.1", + "resolved": "https://registry.npmmirror.com/void-elements/-/void-elements-2.0.1.tgz", + "integrity": "sha512-qZKX4RnBzH2ugr8Lxa7x+0V6XD9Sb/ouARtiasEQCHB1EVU4NXtmHsDDrx1dO4ne5fc3J6EW05BP1Dl0z0iung==" + }, + "w3c-hr-time": { + "version": "1.0.2", + "resolved": "https://registry.npmmirror.com/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz", + "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==", "requires": { - "assert-plus": "^1.0.0", - "core-util-is": "1.0.2", - "extsprintf": "^1.2.0" + "browser-process-hrtime": "^1.0.0" + } + }, + "w3c-xmlserializer": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/w3c-xmlserializer/-/w3c-xmlserializer-3.0.0.tgz", + "integrity": "sha512-3WFqGEgSXIyGhOmAFtlicJNMjEps8b1MG31NCA0/vOF9+nKMUW1ckhi9cnNHmf88Rzw5V+dwIwsm2C7X8k9aQg==", + "requires": { + "xml-name-validator": "^4.0.0" } }, "warehouse": { - "version": "2.2.0", - "resolved": "https://registry.npm.taobao.org/warehouse/download/warehouse-2.2.0.tgz", - "integrity": "sha1-XQnWSUKZK+Zn2PfIagnCuK6gQGI=", + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/warehouse/-/warehouse-4.0.0.tgz", + "integrity": "sha512-9i6/JiHzjnyene5Pvvl2D2Pd18no129YGy0C0P7x18iTz/SeO9nOBioR64XoCy5xKwBKQtl3MU361qpr0V9uXw==", "requires": { - "JSONStream": "^1.0.7", "bluebird": "^3.2.2", - "cuid": "~1.3.8", + "cuid": "^2.1.4", "graceful-fs": "^4.1.3", - "is-plain-object": "^2.0.1", - "lodash": "^4.2.1" + "is-plain-object": "^3.0.0", + "JSONStream": "^1.0.7", + "rfdc": "^1.1.4" } }, "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 + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/webidl-conversions/-/webidl-conversions-7.0.0.tgz", + "integrity": "sha512-VwddBukDzu71offAQR975unBIGqfKZpM+8ZX6ySk8nYhVoo5CYaZyzt3YBvYtRtO+aoGlqxPg/B87NGVZ/fu6g==" }, - "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, + "whatwg-encoding": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-encoding/-/whatwg-encoding-2.0.0.tgz", + "integrity": "sha512-p41ogyeMUrw3jWclHWTQg1k05DSVXPLcVxRTYsXUk+ZooOCZLcoYgPZ/HL/D/N+uQPOtcp1me1WhBEaX02mhWg==", "requires": { - "tr46": "~0.0.1" + "iconv-lite": "0.6.3" + } + }, + "whatwg-mimetype": { + "version": "3.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-mimetype/-/whatwg-mimetype-3.0.0.tgz", + "integrity": "sha512-nt+N2dzIutVRxARx1nghPKGv1xHikU7HKdfafKkLNLindmPU/ch3U31NOCGGA/dmPcmb1VlofO0vnKAcsm0o/Q==" + }, + "whatwg-url": { + "version": "10.0.0", + "resolved": "https://registry.npmmirror.com/whatwg-url/-/whatwg-url-10.0.0.tgz", + "integrity": "sha512-CLxxCmdUby142H5FZzn4D8ikO1cmypvXVQktsgosNy4a4BHrDHeciBBGZhb0bNoR5/MltoCatso+vFjjGx8t0w==", + "requires": { + "tr46": "^3.0.0", + "webidl-conversions": "^7.0.0" } }, "which": { - "version": "1.3.0", - "resolved": "https://registry.npm.taobao.org/which/download/which-1.3.0.tgz", - "integrity": "sha1-/wS9/AEO5UfXgL7DjhrBwnd9JTo=", + "version": "2.0.2", + "resolved": "https://registry.npmmirror.com/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", "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" - } + "which-module": { + "version": "2.0.0", + "resolved": "https://registry.npmmirror.com/which-module/-/which-module-2.0.0.tgz", + "integrity": "sha512-B+enWhmw6cjfVC7kS8Pj9pCrKSc5txArRyaYGe088shv/FGWH+0Rjx/xPgtsWfsUtS27FkP697E4DDhgrgoc0Q==" }, "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=" + "version": "0.1.0", + "resolved": "https://registry.npmmirror.com/window-size/-/window-size-0.1.0.tgz", + "integrity": "sha512-1pTPQDKTdd61ozlKGNCjhNRd+KPmgLSGa3mZTHoOliaGcESD8G1PXhh7c1fgiPjVbNVfgy2Faw4BI8/m0cC8Mg==" }, - "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=", + "with": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/with/-/with-4.0.3.tgz", + "integrity": "sha512-mJZFpyEc1JTAdxhi/vhVeAM2S7vsltEKDiexDDo1HuAzlYKhcVUU6cwY8cHrFYdt82ZNkfKCeyhA3IYFegI0Kg==", "requires": { - "string-width": "^1.0.1", - "strip-ansi": "^3.0.1" + "acorn": "^1.0.1", + "acorn-globals": "^1.0.3" }, "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=", + "acorn": { + "version": "1.2.2", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-1.2.2.tgz", + "integrity": "sha512-FsqWmApWGMGLKKNpHt12PMc5AK7BaZee0WRh04fCysmTzHe+rrKOa2MKjORhnzfpe4r0JnfdqHn02iDA9Dqj2A==" + }, + "acorn-globals": { + "version": "1.0.9", + "resolved": "https://registry.npmmirror.com/acorn-globals/-/acorn-globals-1.0.9.tgz", + "integrity": "sha512-j3/4pkfih8W4NK22gxVSXcEonTpAHOHh0hu5BoZrKcOsW/4oBPxTi4Yk3SAj+FhC1f3+bRTkXdm4019gw1vg9g==", "requires": { - "ansi-regex": "^2.0.0" + "acorn": "^2.1.0" + }, + "dependencies": { + "acorn": { + "version": "2.7.0", + "resolved": "https://registry.npmmirror.com/acorn/-/acorn-2.7.0.tgz", + "integrity": "sha512-pXK8ez/pVjqFdAgBkF1YPVRacuLQ9EXBKaKWaeh58WNfMkCmZhOZzu+NtKSPD5PHmCCHheQ5cD29qM1K4QTxIg==" + } } } } }, + "word-wrap": { + "version": "1.2.3", + "resolved": "https://registry.npmmirror.com/word-wrap/-/word-wrap-1.2.3.tgz", + "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==" + }, + "wordwrap": { + "version": "0.0.3", + "resolved": "https://registry.npmmirror.com/wordwrap/-/wordwrap-0.0.3.tgz", + "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==" + }, + "wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, "wrappy": { "version": "1.0.2", - "resolved": "https://registry.npm.taobao.org/wrappy/download/wrappy-1.0.2.tgz", - "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" + "resolved": "https://registry.npmmirror.com/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" + }, + "ws": { + "version": "8.4.2", + "resolved": "https://registry.npmmirror.com/ws/-/ws-8.4.2.tgz", + "integrity": "sha512-Kbk4Nxyq7/ZWqr/tarI9yIt/+iNNFOjBXEWgTb4ydaNHBNGgvf2QHbS9fdfsndfjFlFwEd4Al+mw83YkaD10ZA==", + "requires": {} }, "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 + "version": "4.0.0", + "resolved": "https://registry.npmmirror.com/xml-name-validator/-/xml-name-validator-4.0.0.tgz", + "integrity": "sha512-ICP2e+jsHvAj2E2lIHxa5tjXRlKDJo4IdvPvCXbXQGdzSfmSpNVyIKMvoZHjDY9DP0zV17iI85o90vRFXNccRw==" }, - "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==" + "xmlchars": { + "version": "2.2.0", + "resolved": "https://registry.npmmirror.com/xmlchars/-/xmlchars-2.2.0.tgz", + "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==" + }, + "xmlhttprequest-ssl": { + "version": "1.6.3", + "resolved": "https://registry.npmmirror.com/xmlhttprequest-ssl/-/xmlhttprequest-ssl-1.6.3.tgz", + "integrity": "sha512-3XfeQE/wNkvrIktn2Kf0869fC0BN6UpydVasGIeSm2B1Llihf7/0UfZM+eCkOw3P7bP4+qPgqhm7ZoxuJtFU0Q==" }, "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=" + "version": "5.0.8", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==" }, "yargs": { - "version": "3.32.0", - "resolved": "https://registry.npm.taobao.org/yargs/download/yargs-3.32.0.tgz", - "integrity": "sha1-AwiOnr+edWtpdRYR0qXvWRSCyZU=", + "version": "15.4.1", + "resolved": "https://registry.npmmirror.com/yargs/-/yargs-15.4.1.tgz", + "integrity": "sha512-aePbxDmcYW++PaqBsJ+HYUFwCdv4LVvdnhBy78E57PIor8/OVvhMrADFFEDh8DHDFRv/O9i3lPhsENjO7QX0+A==", "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" + "cliui": "^6.0.0", + "decamelize": "^1.2.0", + "find-up": "^4.1.0", + "get-caller-file": "^2.0.1", + "require-directory": "^2.1.1", + "require-main-filename": "^2.0.0", + "set-blocking": "^2.0.0", + "string-width": "^4.2.0", + "which-module": "^2.0.0", + "y18n": "^4.0.0", + "yargs-parser": "^18.1.2" + }, + "dependencies": { + "cliui": { + "version": "6.0.0", + "resolved": "https://registry.npmmirror.com/cliui/-/cliui-6.0.0.tgz", + "integrity": "sha512-t6wbgtoCXvAzst7QgXxJYqPt0usEfbgQdftEPbLL/cvv6HPE5VgvqCuAIDR0NgU52ds6rFwqrgakNLrHEjCbrQ==", + "requires": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.0", + "wrap-ansi": "^6.2.0" + } + }, + "wrap-ansi": { + "version": "6.2.0", + "resolved": "https://registry.npmmirror.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz", + "integrity": "sha512-r6lPcBGxZXlIcymEu7InxDMhdW0KDxpLgoFLcguasxCaJ/SOIZwINatK9KY/tf+ZrlywOKU0UDj3ATXUBfxJXA==", + "requires": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + } + }, + "y18n": { + "version": "4.0.3", + "resolved": "https://registry.npmmirror.com/y18n/-/y18n-4.0.3.tgz", + "integrity": "sha512-JKhqTOwSrqNA1NY5lSztJ1GrBiUodLMmIZuLiDaMRJ+itFd+ABVE8XBjOvIWL+rSqNDC74LCSFmlb/U4UZ4hJQ==" + }, + "yargs-parser": { + "version": "18.1.3", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-18.1.3.tgz", + "integrity": "sha512-o50j0JeToy/4K6OZcaQmW6lyXXKhq7csREXcDwk2omFPJEwUNOVtJKvmDr9EI1fAJZUyZcRF7kxGBWmRXudrCQ==", + "requires": { + "camelcase": "^5.0.0", + "decamelize": "^1.2.0" + } + } } + }, + "yargs-parser": { + "version": "20.2.9", + "resolved": "https://registry.npmmirror.com/yargs-parser/-/yargs-parser-20.2.9.tgz", + "integrity": "sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==" + }, + "yeast": { + "version": "0.1.2", + "resolved": "https://registry.npmmirror.com/yeast/-/yeast-0.1.2.tgz", + "integrity": "sha512-8HFIh676uyGYP6wP13R/j6OJ/1HwJ46snpvzE7aHAN3Ryqh2yX6Xox2B4CUmTwwOIzlG3Bs7ocsP5dZH/R1Qbg==" } } } diff --git a/package.json b/package.json index 2696930..20bbee0 100644 --- a/package.json +++ b/package.json @@ -1,27 +1,40 @@ { - "name": "hexo-site", - "version": "0.0.0", - "private": true, - "hexo": { - "version": "3.5.0" - }, + "name": "tunpok", + "version": "1.0.0", + "description": "", + "main": "index.js", "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" - } + "hexo": "^6.0.0", + "hexo-browsersync": "^0.3.0", + "hexo-cli": "^4.3.0", + "hexo-deployer-rsync": "^1.0.0", + "hexo-generator-archive": "^1.0.0", + "hexo-generator-category": "^1.0.0", + "hexo-generator-feed": "^3.0.0", + "hexo-generator-index": "^2.0.0", + "hexo-generator-sitemap": "^2.2.0", + "hexo-generator-tag": "^1.0.0", + "hexo-renderer-ejs": "^2.0.0", + "hexo-renderer-jade": "^0.5.0", + "hexo-renderer-marked": "^5.0.0", + "hexo-renderer-stylus": "^2.0.0", + "hexo-server": "^3.0.0", + "hexo-theme-landscape": "^0.0.3" + }, + "devDependencies": {}, + "scripts": { + "build": "hexo generate", + "clean": "hexo clean", + "deploy": "hexo deploy", + "server": "hexo server" + }, + "hexo": { + "version": "6.0.0" + }, + "repository": { + "type": "git", + "url": "git@git.tunpok.com:ching/blog.git" + }, + "author": "", + "license": "ISC" } diff --git a/public/2016/02/12/first-post/index.html b/public/2016/02/12/first-post/index.html index ffdd6a0..1522487 100644 --- a/public/2016/02/12/first-post/index.html +++ b/public/2016/02/12/first-post/index.html @@ -1,120 +1,4 @@ - First Post · MarkDown

First Post

This is the very first post I wrote,

-

with Typora & Hexo.

-
\ No newline at end of file + 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 index 29aa144..bcc65a0 100644 --- a/public/2016/02/15/Flask-Day-1/index.html +++ b/public/2016/02/15/Flask-Day-1/index.html @@ -1,125 +1,11 @@ - 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. @@ -128,18 +14,25 @@ mjx-container + br {

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)
+
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
+
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 +
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 index 890d67a..f9ee3df 100644 --- a/public/2016/02/16/Flask-Day-2/index.html +++ b/public/2016/02/16/Flask-Day-2/index.html @@ -1,129 +1,20 @@ - 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
+
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)
+
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 %}
+
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 +
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 index 2b1f4eb..670dac8 100644 --- a/public/2016/04/25/Django-Manager-Method/index.html +++ b/public/2016/04/25/Django-Manager-Method/index.html @@ -1,132 +1,20 @@ - 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 的情况有两点:

+

自定义 Manager

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

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

默认 Manager

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

+

默认 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 +
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 index 9706ca0..a82131c 100644 --- a/public/2016/05/04/Tastypie/index.html +++ b/public/2016/05/04/Tastypie/index.html @@ -1,131 +1,15 @@ - 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.

+ 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. Import models from services app
  3. -
  4. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
  5. +
  6. 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

+

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).

+
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 +
\ 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 index 150f3be..4dff030 100644 --- a/public/2016/05/10/TastyPie-Note-1/index.html +++ b/public/2016/05/10/TastyPie-Note-1/index.html @@ -1,122 +1,6 @@ - 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:

+ 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.

  • @@ -152,4 +36,4 @@ mjx-container + br {
  • 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 +
\ No newline at end of file diff --git a/public/2018/05/16/test/index.html b/public/2018/05/16/test/index.html deleted file mode 100644 index f3cd306..0000000 --- a/public/2018/05/16/test/index.html +++ /dev/null @@ -1,6 +0,0 @@ - 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 index 50860ea..0427cec 100644 --- a/public/2018/05/31/bash-function-and-awk/index.html +++ b/public/2018/05/31/bash-function-and-awk/index.html @@ -1,130 +1,19 @@ - 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:

+ 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
+
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 }
+
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 +
\ 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 index 06b5740..19d14ef 100644 --- a/public/2019/03/12/Postgresql-Partitioning/index.html +++ b/public/2019/03/12/Postgresql-Partitioning/index.html @@ -1,122 +1,6 @@ - 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.

+ 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

    @@ -126,8 +10,8 @@ mjx-container + br {

    ​ 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.

    +

    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.

      @@ -139,8 +23,8 @@ mjx-container + br {
    3. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

    4. -
    5. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

      +
    6. Ensure hte 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.

    -
\ No newline at end of file +
\ 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 index 20494a8..da2eff3 100644 --- a/public/2019/11/14/AWS-KMS/index.html +++ b/public/2019/11/14/AWS-KMS/index.html @@ -1,121 +1,5 @@ - 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.

+ 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 +
\ 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 index cf8c4db..3c714d7 100644 --- a/public/2020/03/17/leetcode-121/index.html +++ b/public/2020/03/17/leetcode-121/index.html @@ -1,125 +1,13 @@ - 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
+
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 +
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 index e05764d..edb831e 100644 --- a/public/2020/03/18/leetcode-206/index.html +++ b/public/2020/03/18/leetcode-206/index.html @@ -1,128 +1,18 @@ - 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
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
+
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
+
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 +
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 index a6956c9..fa3f36d 100644 --- a/public/2020/03/23/leetcode-169/index.html +++ b/public/2020/03/23/leetcode-169/index.html @@ -1,126 +1,17 @@ - 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
+
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 +
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 index 02b6a24..fb7e20a 100644 --- a/public/2020/03/23/leetcode-225/index.html +++ b/public/2020/03/23/leetcode-225/index.html @@ -1,122 +1,10 @@ - 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 +
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 index ceb8262..1482d29 100644 --- a/public/2020/03/25/leetcode-409/index.html +++ b/public/2020/03/25/leetcode-409/index.html @@ -1,123 +1,13 @@ - 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 +
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 index 7ef6f85..adb577d 100644 --- a/public/2020/03/25/leetcode-543/index.html +++ b/public/2020/03/25/leetcode-543/index.html @@ -1,125 +1,17 @@ - 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
+
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 +
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 index 25944b8..b418b3a 100644 --- a/public/2020/03/25/leetcode-836/index.html +++ b/public/2020/03/25/leetcode-836/index.html @@ -1,122 +1,10 @@ - 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 +
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 index 189c66d..68c16ac 100644 --- a/public/2020/03/26/leetcode-876/index.html +++ b/public/2020/03/26/leetcode-876/index.html @@ -1,124 +1,18 @@ - 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
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 +
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 index cc4514f..6cdda80 100644 --- a/public/2020/03/29/leetcode-1013/index.html +++ b/public/2020/03/29/leetcode-1013/index.html @@ -1,122 +1,10 @@ - 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 + \ 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 index c7c5317..d364a11 100644 --- a/public/2020/03/29/leetcode-914/index.html +++ b/public/2020/03/29/leetcode-914/index.html @@ -1,122 +1,10 @@ - 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 +
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 index 0871898..68029fb 100644 --- a/public/2020/03/30/leetcode-1071/index.html +++ b/public/2020/03/30/leetcode-1071/index.html @@ -1,123 +1,13 @@ - 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 +
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 index 92c4c9b..80ab113 100644 --- a/public/2020/03/30/leetcode-999/index.html +++ b/public/2020/03/30/leetcode-999/index.html @@ -1,123 +1,13 @@ - 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
+
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
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 + \ 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 index c2a16a2..dc9f69c 100644 --- a/public/2020/04/01/leetcode-1103/index.html +++ b/public/2020/04/01/leetcode-1103/index.html @@ -1,122 +1,9 @@ - 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 +

小学奥数题。主要思路就是等差数列求和 $\cfrac{(首项 + 末项)×项数}{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
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 index 8ca9277..bd39a08 100644 --- a/public/2020/04/01/leetcode-1160/index.html +++ b/public/2020/04/01/leetcode-1160/index.html @@ -1,122 +1,10 @@ - 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 +
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 index 1d54f2f..4185ba7 100644 --- a/public/2020/04/01/leetcode-compress-string-lcci/index.html +++ b/public/2020/04/01/leetcode-compress-string-lcci/index.html @@ -1,122 +1,10 @@ - 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 +
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 index c6367ef..e45cc03 100644 --- 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 @@ -1,123 +1,10 @@ - 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 +

又是小学奥数。由等差数列求和公式$\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\sqrt{2×target} + 1$。

+

由小到大遍历 $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 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 index 8e0e735..e9ad941 100644 --- a/public/2020/04/09/leetcode-the-masseuse-lcci/index.html +++ b/public/2020/04/09/leetcode-the-masseuse-lcci/index.html @@ -1,126 +1,16 @@ - 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 +

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

+ \ 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 index af69e6e..7b61fe4 100644 --- a/public/2020/04/14/leetcode-add-two-numbers-ii/index.html +++ b/public/2020/04/14/leetcode-add-two-numbers-ii/index.html @@ -1,125 +1,14 @@ - 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
+
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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
+
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 + \ 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 index 05857eb..70a4ff6 100644 --- a/public/2020/04/14/leetcode-design-twitter/index.html +++ b/public/2020/04/14/leetcode-design-twitter/index.html @@ -1,123 +1,10 @@ - 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 +
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 index 232e7b8..eccabc8 100644 --- a/public/2020/04/16/leetcode-01-matrix/index.html +++ b/public/2020/04/16/leetcode-01-matrix/index.html @@ -1,128 +1,17 @@ - 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
    +
    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. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。

-
\ No newline at end of file + \ 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 index 989db1e..594cbb9 100644 --- a/public/2020/04/16/leetcode-merge-intervals/index.html +++ b/public/2020/04/16/leetcode-merge-intervals/index.html @@ -1,122 +1,12 @@ - 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 +
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 index eb7feb3..97a424e 100644 --- a/public/2020/04/16/leetcode-string-to-integer-atoi/index.html +++ b/public/2020/04/16/leetcode-string-to-integer-atoi/index.html @@ -1,122 +1,10 @@ - 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 +
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 index 38c4715..3864051 100644 --- a/public/2020/04/21/leetcode-number-of-islands/index.html +++ b/public/2020/04/21/leetcode-number-of-islands/index.html @@ -1,122 +1,11 @@ - 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 +
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/archives/2016/02/index.html b/public/archives/2016/02/index.html index f5a7462..6cbc279 100644 --- a/public/archives/2016/02/index.html +++ b/public/archives/2016/02/index.html @@ -1,136 +1,29 @@ - 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
    +
    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)
    +
    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 %}
    +
    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
    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. @@ -139,20 +32,27 @@ mjx-container + br {

    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)
    +
    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
    +
    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.

    +
    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 +

with Typora & Hexo.

+
\ No newline at end of file diff --git a/public/archives/2016/04/index.html b/public/archives/2016/04/index.html index e777061..b80cb75 100644 --- a/public/archives/2016/04/index.html +++ b/public/archives/2016/04/index.html @@ -1,132 +1,20 @@ - 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 的情况有两点:

    +

    自定义 Manager

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

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

    默认 Manager

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

    +

    默认 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 +
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 index a467293..c9e8b54 100644 --- a/public/archives/2016/05/index.html +++ b/public/archives/2016/05/index.html @@ -1,122 +1,6 @@ - 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:

    + 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.

      • @@ -152,17 +36,17 @@ mjx-container + br {
      • 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.

      +
    • 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. Import models from services app
      3. -
      4. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
      5. +
      6. 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

      +

      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).

      +
      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 +
\ No newline at end of file diff --git a/public/archives/2016/index.html b/public/archives/2016/index.html index 9176c86..815d668 100644 --- a/public/archives/2016/index.html +++ b/public/archives/2016/index.html @@ -1,122 +1,6 @@ - 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:

    + 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.

      • @@ -152,49 +36,62 @@ mjx-container + br {
      • 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.

      +
    • 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. Import models from services app
      3. -
      4. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
      5. +
      6. 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

      +

      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).

      +
      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 方法是对数据库操作的封装。

      +
    • 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()
      +
      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 的情况有两点:

      +

      自定义 Manager

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

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

      默认 Manager

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

      +

      默认 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'
      +
      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
      +
      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)
      +
      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 %}
      +
      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
      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. @@ -203,20 +100,27 @@ mjx-container + br {

      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)
      +
      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
      +
      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.

      +
      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 +

    with Typora & Hexo.

    +
\ No newline at end of file diff --git a/public/archives/2018/05/index.html b/public/archives/2018/05/index.html index 556b39a..9eb85e0 100644 --- a/public/archives/2018/05/index.html +++ b/public/archives/2018/05/index.html @@ -1,130 +1,19 @@ - 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:

    + 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
      +
      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 }
      +
      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 +
\ No newline at end of file diff --git a/public/archives/2018/index.html b/public/archives/2018/index.html index 556b39a..9eb85e0 100644 --- a/public/archives/2018/index.html +++ b/public/archives/2018/index.html @@ -1,130 +1,19 @@ - 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:

    + 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
      +
      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 }
      +
      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 +
\ No newline at end of file diff --git a/public/archives/2019/03/index.html b/public/archives/2019/03/index.html index f8211f2..cf510f2 100644 --- a/public/archives/2019/03/index.html +++ b/public/archives/2019/03/index.html @@ -1,122 +1,6 @@ - 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.

    + 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

        @@ -126,8 +10,8 @@ mjx-container + br {

        ​ 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.

        +

        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.

          @@ -139,8 +23,8 @@ mjx-container + br {
        3. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

        4. -
        5. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

          +
        6. Ensure hte 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.

        -
    \ No newline at end of file +
\ No newline at end of file diff --git a/public/archives/2019/11/index.html b/public/archives/2019/11/index.html index 3bd95e0..6787c53 100644 --- a/public/archives/2019/11/index.html +++ b/public/archives/2019/11/index.html @@ -1,121 +1,5 @@ - 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.

    + 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 +
\ No newline at end of file diff --git a/public/archives/2019/index.html b/public/archives/2019/index.html index d04f525..f027b96 100644 --- a/public/archives/2019/index.html +++ b/public/archives/2019/index.html @@ -1,125 +1,9 @@ - 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.

    + 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.

      +

      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

        @@ -129,8 +13,8 @@ mjx-container + br {

        ​ 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.

        +

        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.

          @@ -142,8 +26,8 @@ mjx-container + br {
        3. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

        4. -
        5. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

          +
        6. Ensure hte 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.

        -
    \ No newline at end of file +
\ No newline at end of file diff --git a/public/archives/2020/03/index.html b/public/archives/2020/03/index.html index dbc6343..baf6a19 100644 --- a/public/archives/2020/03/index.html +++ b/public/archives/2020/03/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + 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 index 50cad29..4209062 100644 --- a/public/archives/2020/03/page/2/index.html +++ b/public/archives/2020/03/page/2/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + MarkDown +
\ No newline at end of file diff --git a/public/archives/2020/04/index.html b/public/archives/2020/04/index.html index 96dba0a..0d551f5 100644 --- a/public/archives/2020/04/index.html +++ b/public/archives/2020/04/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + 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 index 0c96e94..bf50062 100644 --- a/public/archives/2020/04/page/2/index.html +++ b/public/archives/2020/04/page/2/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + MarkDown +
\ No newline at end of file diff --git a/public/archives/2020/index.html b/public/archives/2020/index.html index caf4158..2ea9358 100644 --- a/public/archives/2020/index.html +++ b/public/archives/2020/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + 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 index a1382a9..e339045 100644 --- a/public/archives/2020/page/2/index.html +++ b/public/archives/2020/page/2/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + 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 index 0359242..0e07943 100644 --- a/public/archives/2020/page/3/index.html +++ b/public/archives/2020/page/3/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + MarkDown +
\ No newline at end of file diff --git a/public/archives/index.html b/public/archives/index.html index 5f799b2..777f0e1 100644 --- a/public/archives/index.html +++ b/public/archives/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + MarkDown +
\ No newline at end of file diff --git a/public/archives/page/2/index.html b/public/archives/page/2/index.html index 203d934..b02daeb 100644 --- a/public/archives/page/2/index.html +++ b/public/archives/page/2/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + MarkDown +
\ No newline at end of file diff --git a/public/archives/page/3/index.html b/public/archives/page/3/index.html index d63c43d..0ecb25f 100644 --- a/public/archives/page/3/index.html +++ b/public/archives/page/3/index.html @@ -1,125 +1,9 @@ - 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.

    + 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.

      +

      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

        @@ -129,8 +13,8 @@ mjx-container + br {

        ​ 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.

        +

        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.

          @@ -142,23 +26,28 @@ mjx-container + br {
        3. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

        4. -
        5. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

          +
        6. Ensure hte 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.

    • 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:

      +

      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
      +
      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 }
      +
      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.

      +
    • 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.

        @@ -195,42 +84,53 @@ mjx-container + br {
      • 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.

      +
    • 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. Import models from services app
      3. -
      4. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
      5. +
      6. 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

      +

      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).

      +
      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 方法是对数据库操作的封装。

      +
    • 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()
      +
      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 的情况有两点:

      +

      自定义 Manager

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

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

      默认 Manager

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

      +

      默认 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'
      +
      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
      +
      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)
      +
      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 %}
      +
      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 +
    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 index 815557f..cadf6d2 100644 --- a/public/archives/page/4/index.html +++ b/public/archives/page/4/index.html @@ -1,125 +1,11 @@ - 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. @@ -128,20 +14,27 @@ mjx-container + br {

    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)
    +
    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
    +
    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.

    +
    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 +

with Typora & Hexo.

+ \ No newline at end of file diff --git a/public/atom.xml b/public/atom.xml index fc20171..b74f101 100644 --- a/public/atom.xml +++ b/public/atom.xml @@ -1,11 +1,12 @@ MarkDown + 「靡不有初,鲜克有终」 - + - 2020-04-21T04:55:46.000Z + 2020-04-21T05:17:04.000Z http://blog.tunpok.com/ @@ -13,28 +14,23 @@ - Hexo + 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 + 2020-04-21T05:17:04.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> - + 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
]]>
- - <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> + <h3 id="200-岛屿数量"><a href="#200-岛屿数量" class="headerlink" title="200. 岛屿数量"></a>200. 岛屿数量</h3><p><a href="https://leetcode-cn.com/problems/number-of-islands/">题目</a></p> - - + +
@@ -46,19 +42,14 @@ 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> - + 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 ms13.6 MB
]]>
- - <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> + <h3 id="8-字符串转换整数-atoi"><a href="#8-字符串转换整数-atoi" class="headerlink" title="8. 字符串转换整数 (atoi)"></a>8. 字符串转换整数 (atoi)</h3><p><a href="https://leetcode-cn.com/problems/string-to-integer-atoi/">题目</a></p> - - + + @@ -70,19 +61,14 @@ 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> - + 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
]]>
- - <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> + <h3 id="56-合并区间"><a href="#56-合并区间" class="headerlink" title="56. 合并区间"></a>56. 合并区间</h3><p><a href="https://leetcode-cn.com/problems/merge-intervals/">题目</a></p> - - + + @@ -94,25 +80,14 @@ 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> - + 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. 从左上角开往右下角遍历矩阵,当前坐标的距离由左和上两个位置的值确定。遍历一遍后,再反过来从右下角开始往左上角遍历,当前坐标的距离根据右和下两个位置的值确定,比较这两次得出的值中较小的一个即为该点的距离。

]]>
- - <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> + <h3 id="542-01-矩阵"><a href="#542-01-矩阵" class="headerlink" title="542. 01 矩阵"></a>542. 01 矩阵</h3><p><a href="https://leetcode-cn.com/problems/01-matrix/">题目</a></p> - - + + @@ -124,22 +99,14 @@ 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> - + 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 ms13.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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

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

]]>
- - <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> + <h3 id="445-两数相加-II"><a href="#445-两数相加-II" class="headerlink" title="445. 两数相加 II"></a>445. 两数相加 II</h3><p><a href="https://leetcode-cn.com/problems/add-two-numbers-ii/">题目</a></p> - - + + @@ -151,20 +118,14 @@ 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> - + 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 ms19.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)
]]>
- - <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> + <h3 id="355-设计推特"><a href="#355-设计推特" class="headerlink" title="355. 设计推特"></a>355. 设计推特</h3><p><a href="https://leetcode-cn.com/problems/design-twitter/">题目</a></p> - - + + @@ -176,20 +137,14 @@ 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> + 面试题57 - II. 和为s的连续正数序列

题目

又是小学奥数。由等差数列求和公式$\cfrac{(首项 + 末项)×项数}{2}$ 可知,当首项为 1 的时候项数最多,又由于是连续正整数,$n^2 < (1+n)×n < (n+1)^2 $,那最大的 $n$ 就不大于 $\sqrt{2×target} + 1$。

由小到大遍历 $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 ms13.7 MB
]]>
- - <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> + <h3 id="面试题57-II-和为s的连续正数序列"><a href="#面试题57-II-和为s的连续正数序列" 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/">题目</a></p> - - + + @@ -201,23 +156,14 @@ 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> + 面试题 17.16. 按摩师

题目

一开始以为是用递归,想了半天没想出来,偷看了一下答案。答案的思路跟递归类似,假设在当前 $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])$

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 ms13.6 MB

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

]]>
- - <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> + <h3 id="面试题-17-16-按摩师"><a href="#面试题-17-16-按摩师" class="headerlink" title="面试题 17.16. 按摩师"></a>面试题 17.16. 按摩师</h3><p><a href="https://leetcode-cn.com/problems/the-masseuse-lcci/">题目</a></p> - - + + @@ -229,19 +175,14 @@ 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> - + 面试题 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 ms13.8 MB
]]>
- - <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> + <h3 id="面试题-01-06-字符串压缩"><a href="#面试题-01-06-字符串压缩" class="headerlink" title="面试题 01.06. 字符串压缩"></a>面试题 01.06. 字符串压缩</h3><p><a href="https://leetcode-cn.com/problems/compress-string-lcci/">题目</a></p> - - + + @@ -253,19 +194,14 @@ 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> + 1103. 分糖果 II

题目

小学奥数题。主要思路就是等差数列求和 $\cfrac{(首项 + 末项)×项数}{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
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 ms13.7 MB,
]]>
- - <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> + <h3 id="1103-分糖果-II"><a href="#1103-分糖果-II" class="headerlink" title="1103. 分糖果 II"></a>1103. 分糖果 II</h3><p><a href="https://leetcode-cn.com/problems/distribute-candies-to-people/">题目</a></p> - - + + @@ -277,19 +213,14 @@ 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> - + 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 ms14.1 MB
]]>
- - <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> + <h3 id="1160-拼写单词"><a href="#1160-拼写单词" class="headerlink" title="1160. 拼写单词"></a>1160. 拼写单词</h3><p><a href="https://leetcode-cn.com/problems/find-words-that-can-be-formed-by-characters/">题目</a></p> - - + + @@ -301,20 +232,14 @@ 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> - + 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 ms13.9 MB

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

]]>
- - <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> + <h3 id="1071-字符串的最大公因子"><a href="#1071-字符串的最大公因子" class="headerlink" title="1071. 字符串的最大公因子"></a>1071. 字符串的最大公因子</h3><p><a href="https://leetcode-cn.com/problems/greatest-common-divisor-of-strings/">题目</a></p> - - + + @@ -326,20 +251,14 @@ 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> - + 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
42
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 ms13.6 MB

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

]]>
- - <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> + <h3 id="999-可以被一步捕获的棋子数"><a href="#999-可以被一步捕获的棋子数" class="headerlink" title="999. 可以被一步捕获的棋子数"></a>999. 可以被一步捕获的棋子数</h3><p><a href="https://leetcode-cn.com/problems/available-captures-for-rook/">题目</a></p> - - + + @@ -351,19 +270,14 @@ 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> - + 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 ms13.8 MB
]]>
- - <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> + <h3 id="914-卡牌分组"><a href="#914-卡牌分组" class="headerlink" title="914. 卡牌分组"></a>914. 卡牌分组</h3><p><a href="https://leetcode-cn.com/problems/x-of-a-kind-in-a-deck-of-cards/">题目</a></p> - - + + @@ -375,19 +289,14 @@ 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> - + 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 ms18.7 MB
]]>
- - <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> + <h3 id="1013-将数组分成和相等的三个部分"><a href="#1013-将数组分成和相等的三个部分" class="headerlink" title="1013. 将数组分成和相等的三个部分"></a>1013. 将数组分成和相等的三个部分</h3><p><a href="https://leetcode-cn.com/problems/partition-array-into-three-parts-with-equal-sum/">题目</a></p> - - + + @@ -399,21 +308,14 @@ 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> - + 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 ms13.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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
]]>
- - <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> + <h3 id="876-链表的中间结点"><a href="#876-链表的中间结点" class="headerlink" title="876. 链表的中间结点"></a>876. 链表的中间结点</h3><p><a href="https://leetcode-cn.com/problems/middle-of-the-linked-list/">题目</a></p> - - + + @@ -425,19 +327,14 @@ 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> - + 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 ms13.7 MB
]]>
- - <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> + <h3 id="836-矩形重叠"><a href="#836-矩形重叠" class="headerlink" title="836. 矩形重叠"></a>836. 矩形重叠</h3><p><a href="https://leetcode-cn.com/problems/rectangle-overlap/">题目</a></p> - - + + @@ -449,20 +346,14 @@ 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> - + 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 ms13.6 MB
]]>
- - <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> + <h3 id="409-最长回文串"><a href="#409-最长回文串" class="headerlink" title="409. 最长回文串"></a>409. 最长回文串</h3><p><a href="https://leetcode-cn.com/problems/longest-palindrome/">题目</a></p> - - + + @@ -474,22 +365,14 @@ 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> - + 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)
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
]]>
- - <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> + <h3 id="543-二叉树的直径"><a href="#543-二叉树的直径" class="headerlink" title="543. 二叉树的直径"></a>543. 二叉树的直径</h3><p><a href="https://leetcode-cn.com/problems/diameter-of-binary-tree/">题目</a></p> - - + + @@ -501,19 +384,14 @@ 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> - + 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 ms13.5 MB
]]>
- - <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> + <h3 id="225-用队列实现栈"><a href="#225-用队列实现栈" class="headerlink" title="225. 用队列实现栈"></a>225. 用队列实现栈</h3><p><a href="https://leetcode-cn.com/problems/implement-stack-using-queues/">题目</a></p> - - + + diff --git a/public/categories/leetcode/index.html b/public/categories/leetcode/index.html index 0356b98..6af8b20 100644 --- a/public/categories/leetcode/index.html +++ b/public/categories/leetcode/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + 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 index f73cc41..c3e5ac0 100644 --- a/public/categories/leetcode/page/2/index.html +++ b/public/categories/leetcode/page/2/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + 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 index ec42c2f..28f1136 100644 --- a/public/categories/leetcode/page/3/index.html +++ b/public/categories/leetcode/page/3/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + MarkDown +
\ No newline at end of file diff --git a/public/css/rtl.css b/public/css/rtl.css new file mode 100644 index 0000000..42e8406 --- /dev/null +++ b/public/css/rtl.css @@ -0,0 +1,73 @@ +@font-face { + font-family: Vazir; + src: url("../lib/vazir-font/Vazir.eot"); + src: url("../lib/vazir-font/Vazir.eot?#iefix") format('embedded-opentype'), url("../lib/vazir-font/Vazir.woff2") format('woff2'), url("../lib/vazir-font/Vazir.woff") format('woff'), url("../lib/vazir-font/Vazir.ttf") format('truetype'); + font-weight: normal; +} +@font-face { + font-family: Vazir; + src: url("../lib/vazir-font/Vazir-Bold.eot"); + src: url("../lib/vazir-font/Vazir-Bold.eot?#iefix") format('embedded-opentype'), url("../lib/vazir-font/Vazir-Bold.woff2") format('woff2'), url("../lib/vazir-font/Vazir-Bold.woff") format('woff'), url("../lib/vazir-font/Vazir-Bold.ttf") format('truetype'); + font-weight: bold; +} +@font-face { + font-family: Vazir; + src: url("../lib/vazir-font/Vazir-Light.eot"); + src: url("../lib/vazir-font/Vazir-Light.eot?#iefix") format('embedded-opentype'), url("../lib/vazir-font/Vazir-Light.woff2") format('woff2'), url("../lib/vazir-font/Vazir-Light.woff") format('woff'), url("../lib/vazir-font/Vazir-Light.ttf") format('truetype'); + font-weight: 300; +} +.rtl { + font-family: Vazir, sans-serif; + direction: rtl; +} +.rtl #nav li { + margin-right: 0px !important; + padding-left: 15px; + border-right: 0px !important; + border-left: 1px dotted; +} +.rtl #nav li:last-child { + margin-right: 15px !important; + border-left: 0 !important; +} +.rtl #header #logo { + float: right; + margin-right: 0; + margin-left: 20px; +} +.rtl #footer li { + margin-right: 0px; + padding-left: 15px; + border-right: 0px; + border-left: 1px dotted; +} +.rtl #footer li:last-child { + margin-right: 15px !important; + border-left: 0 !important; +} +.rtl #footer #logo { + float: right; +} +.rtl article .content h2:before { + right: -1rem; +} +.rtl .post-list .post-item .meta { + margin-left: 16px; + margin-right: inherit; +} +@media screen and (min-width: 480px) { + .rtl .post-list .post-item .meta { + text-align: left; + } +} +@media screen and (max-width: 480px) { + .rtl #header #title { + margin-left: 5rem; + margin-right: 0; + } + .rtl #header #nav ul li { + left: 1rem; + right: auto; + border: 0; + } +} diff --git a/public/css/style.css b/public/css/style.css new file mode 100644 index 0000000..a96c7d8 --- /dev/null +++ b/public/css/style.css @@ -0,0 +1,1648 @@ +.inline { + display: inline; +} +.block { + display: block; +} +.inline-block { + display: inline-block; +} +.table { + display: table; +} +.table-cell { + display: table-cell; +} +.overflow-hidden { + overflow: hidden; +} +.overflow-scroll { + overflow: scroll; +} +.overflow-auto { + overflow: auto; +} +.clearfix:before, +.clearfix:after { + display: table; + content: " "; +} +.clearfix:after { + clear: both; +} +.left { + float: left; +} +.right { + float: right; +} +.fit { + max-width: 100%; +} +.truncate { + display: inline-block; + overflow: hidden; + text-overflow: ellipsis; + white-space: nowrap; +} +.max-width-1 { + max-width: 24rem; +} +.max-width-2 { + max-width: 32rem; +} +.max-width-3 { + max-width: 48rem; +} +.max-width-4 { + max-width: 64rem; +} +.border-box { + box-sizing: border-box; +} +.m0 { + margin: 0; +} +.mt0 { + margin-top: 0; +} +.mr0 { + margin-right: 0; +} +.mb0 { + margin-bottom: 0; +} +.ml0 { + margin-left: 0; +} +.mx0 { + margin-right: 0; + margin-left: 0; +} +.my0 { + margin-top: 0; + margin-bottom: 0; +} +.m1 { + margin: 0.5rem; +} +.mt1 { + margin-top: 0.5rem; +} +.mr1 { + margin-right: 0.5rem; +} +.mb1 { + margin-bottom: 0.5rem; +} +.ml1 { + margin-left: 0.5rem; +} +.mx1 { + margin-right: 0.5rem; + margin-left: 0.5rem; +} +.my1 { + margin-top: 0.5rem; + margin-bottom: 0.5rem; +} +.m2 { + margin: 1rem; +} +.mt2 { + margin-top: 1rem; +} +.mr2 { + margin-right: 1rem; +} +.mb2 { + margin-bottom: 1rem; +} +.ml2 { + margin-left: 1rem; +} +.mx2 { + margin-right: 1rem; + margin-left: 1rem; +} +.my2 { + margin-top: 1rem; + margin-bottom: 1rem; +} +.m3 { + margin: 2rem; +} +.mt3 { + margin-top: 2rem; +} +.mr3 { + margin-right: 2rem; +} +.mb3 { + margin-bottom: 2rem; +} +.ml3 { + margin-left: 2rem; +} +.mx3 { + margin-right: 2rem; + margin-left: 2rem; +} +.my3 { + margin-top: 2rem; + margin-bottom: 2rem; +} +.m4 { + margin: 4rem; +} +.mt4 { + margin-top: 4rem; +} +.mr4 { + margin-right: 4rem; +} +.mb4 { + margin-bottom: 4rem; +} +.ml4 { + margin-left: 4rem; +} +.mx4 { + margin-right: 4rem; + margin-left: 4rem; +} +.my4 { + margin-top: 4rem; + margin-bottom: 4rem; +} +.mxn1 { + margin-right: -0.5rem; + margin-left: -0.5rem; +} +.mxn2 { + margin-right: -1rem; + margin-left: -1rem; +} +.mxn3 { + margin-right: -2rem; + margin-left: -2rem; +} +.mxn4 { + margin-right: -4rem; + margin-left: -4rem; +} +.ml-auto { + margin-left: auto; +} +.mr-auto { + margin-right: auto; +} +.mx-auto { + margin-right: auto; + margin-left: auto; +} +.p0 { + padding: 0; +} +.pt0 { + padding-top: 0; +} +.pr0 { + padding-right: 0; +} +.pb0 { + padding-bottom: 0; +} +.pl0 { + padding-left: 0; +} +.px0 { + padding-right: 0; + padding-left: 0; +} +.py0 { + padding-top: 0; + padding-bottom: 0; +} +.p1 { + padding: 0.5rem; +} +.pt1 { + padding-top: 0.5rem; +} +.pr1 { + padding-right: 0.5rem; +} +.pb1 { + padding-bottom: 0.5rem; +} +.pl1 { + padding-left: 0.5rem; +} +.py1 { + padding-top: 0.5rem; + padding-bottom: 0.5rem; +} +.px1 { + padding-right: 0.5rem; + padding-left: 0.5rem; +} +.p2 { + padding: 1rem; +} +.pt2 { + padding-top: 1rem; +} +.pr2 { + padding-right: 1rem; +} +.pb2 { + padding-bottom: 1rem; +} +.pl2 { + padding-left: 1rem; +} +.py2 { + padding-top: 1rem; + padding-bottom: 1rem; +} +.px2 { + padding-right: 1rem; + padding-left: 1rem; +} +.p3 { + padding: 2rem; +} +.pt3 { + padding-top: 2rem; +} +.pr3 { + padding-right: 2rem; +} +.pb3 { + padding-bottom: 2rem; +} +.pl3 { + padding-left: 2rem; +} +.py3 { + padding-top: 2rem; + padding-bottom: 2rem; +} +.px3 { + padding-right: 2rem; + padding-left: 2rem; +} +.p4 { + padding: 4rem; +} +.pt4 { + padding-top: 4rem; +} +.pr4 { + padding-right: 4rem; +} +.pb4 { + padding-bottom: 4rem; +} +.pl4 { + padding-left: 4rem; +} +.py4 { + padding-top: 4rem; + padding-bottom: 4rem; +} +.px4 { + padding-right: 4rem; + padding-left: 4rem; +} +body h1, +body .h1 { + display: block; + margin-top: 3rem; + margin-bottom: 1rem; + color: #d44375; + letter-spacing: 0.01em; + font-weight: 700; + font-style: normal; + font-size: 1.5em; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} +body h2, +body .h2 { + position: relative; + display: block; + margin-top: 2rem; + margin-bottom: 0.5rem; + color: #111; + text-transform: none; + letter-spacing: normal; + font-weight: bold; + font-size: 1rem; +} +body h3 { + color: #111; + text-decoration: underline; + font-weight: bold; + font-size: 0.9rem; +} +body h4, +body h5, +body h6 { + display: inline; + text-decoration: none; + color: #666; + font-weight: bold; + font-size: 0.9rem; +} +body h3, +body h4, +body h5, +body h6 { + margin-top: 0.9rem; + margin-bottom: 0.5rem; +} +body hr { + border: 0.5px dashed #666; + opacity: 0.5; + margin: 0; + margin-top: 20px; + margin-bottom: 20px; +} +body strong { + font-weight: bold; +} +body em, +body cite { + font-style: italic; +} +body sup, +body sub { + position: relative; + vertical-align: baseline; + font-size: 0.75em; + line-height: 0; +} +body sup { + top: -0.5em; +} +body sub { + bottom: -0.2em; +} +body small { + font-size: 0.85em; +} +body acronym, +body abbr { + border-bottom: 1px dotted; +} +body ul, +body ol, +body dl { + line-height: 1.725; +} +body ul ul, +body ol ul, +body ul ol, +body ol ol { + margin-top: 0; + margin-bottom: 0; +} +body ol { + list-style: decimal; +} +body dt { + font-weight: bold; +} +body table { + width: 100%; + border-collapse: collapse; + text-align: left; + font-size: 12px; + overflow: auto; + display: block; +} +body th { + padding: 8px; + border-bottom: 1px dashed #666; + color: #111; + font-weight: bold; + font-size: 13px; +} +body td { + padding: 0 8px; + border-bottom: none; +} +@font-face { + font-style: normal; + font-family: "Meslo LG"; + src: local("Meslo LG S"), url("../lib/meslo-LG/MesloLGS-Regular.ttf") format("truetype"); +} +*, +*:before, +*:after { + box-sizing: border-box; +} +html { + margin: 0; + padding: 0; + height: 100%; + border-top: 2px solid #363533; + -webkit-text-size-adjust: 100%; + -ms-text-size-adjust: 100%; +} +body { + margin: 0; + height: 100%; + background-color: #e2e0de; + color: #363533; + font-display: swap; + font-weight: 400; + font-size: 14px; + font-family: "Menlo", "Meslo LG", monospace; + line-height: 1.725; + text-rendering: geometricPrecision; + flex: 1; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} +.content { + position: relative; + display: flex; + flex-direction: column; + min-height: 100%; + overflow-wrap: break-word; +} +.content p { + hyphens: auto; + -moz-hyphens: auto; + -ms-hyphens: auto; + -webkit-hyphens: auto; +} +.content code { + hyphens: manual; + -moz-hyphens: manual; + -ms-hyphens: manual; + -webkit-hyphens: manual; +} +.content a { + color: #363533; + text-decoration: none; + background-image: linear-gradient(transparent, transparent 5px, #363533 5px, #363533); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +.content a:hover { + background-image: linear-gradient(transparent, transparent 4px, #2bbc8a 4px, #2bbc8a); +} +.content a.icon { + background: none; +} +.content a.icon:hover { + color: #2bbc8a; +} +.content h1 a, +.content .h1 a, +.content h2 a, +.content h3 a, +.content h4 a, +.content h5 a, +.content h6 a { + background: none; + color: inherit; + text-decoration: none; +} +.content h1 a:hover, +.content .h1 a:hover, +.content h2 a:hover, +.content h3 a:hover, +.content h4 a:hover, +.content h5 a:hover, +.content h6 a:hover { + background-image: linear-gradient(transparent, transparent 6px, #2bbc8a 6px, #2bbc8a); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +.content h6 a { + background: none; + color: inherit; + text-decoration: none; +} +.content h6 a:hover { + background-image: linear-gradient(transparent, transparent 6px, #2bbc8a 6px, #2bbc8a); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +@media (min-width: 540px) { + .image-wrap { + flex-direction: row; + margin-bottom: 2rem; + } + .image-wrap .image-block { + flex: 1 0 35%; + margin-right: 2rem; + } + .image-wrap p { + flex: 1 0 65%; + } +} +.max-width { + max-width: 48rem; +} +@media (max-width: 480px) { + .px3 { + padding-right: 1rem; + padding-left: 1rem; + } + .my4 { + margin-top: 2rem; + margin-bottom: 2rem; + } +} +@media (min-width: 480px) { + p { + text-align: justify; + } +} +#header { + margin: 0 auto 2rem; + width: 100%; +} +#header h1, +#header .h1 { + margin-top: 0; + margin-bottom: 0; + color: #363533; + letter-spacing: 0.01em; + font-weight: 700; + font-style: normal; + font-size: 1.5rem; + line-height: 2rem; + -moz-osx-font-smoothing: grayscale; + -webkit-font-smoothing: antialiased; +} +#header a { + background: none; + color: inherit; + text-decoration: none; +} +#header #logo { + display: inline-block; + float: left; + margin-right: 20px; + width: 50px; + height: 50px; + border-radius: 5px; + filter: grayscale(100%); + background-size: 50px 50px; + background-repeat: no-repeat; + -webkit-filter: grayscale(100%); +} +#header #nav { + color: #d44375; + letter-spacing: 0.01em; + font-weight: 200; + font-style: normal; + font-size: 0.8rem; +} +#header #nav ul { + margin: 0; + padding: 0; + list-style-type: none; + line-height: 15px; +} +#header #nav ul a { + margin-right: 15px; + color: #d44375; +} +#header #nav ul a:hover { + background-image: linear-gradient(transparent, transparent 5px, #d44375 5px, #d44375); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +#header #nav ul li { + display: inline-block; + margin-right: 15px; + border-right: 1px dotted; + border-color: #d44375; + vertical-align: middle; +} +#header #nav ul .icon { + display: none; +} +#header #nav ul li:last-child { + margin-right: 0; + border-right: 0; +} +#header #nav ul li:last-child a { + margin-right: 0; +} +#header:hover #logo { + filter: none; + -webkit-filter: none; +} +@media screen and (max-width: 480px) { + #header #title { + display: table; + margin-right: 5rem; + min-height: 50px; + } + #header #title h1 { + display: table-cell; + vertical-align: middle; + } + #header #nav ul a:hover { + background: none; + } + #header #nav ul li { + display: none; + border-right: 0; + } + #header #nav ul li.icon { + position: absolute; + top: 77px; + right: 1rem; + display: inline-block; + } + #header #nav ul.responsive li { + display: block; + } + #header #nav li:not(:first-child) { + padding-top: 1rem; + padding-left: 70px; + font-size: 1rem; + } +} +#header-post { + position: fixed; + top: 2rem; + right: 0; + display: inline-block; + float: right; + z-index: 100; +} +#header-post a { + background: none; + color: inherit; + text-decoration: none; +} +#header-post a.icon { + background: none; +} +#header-post a.icon:hover { + color: #2bbc8a; +} +#header-post ol { + list-style-type: none; +} +#header-post ul { + display: inline-block; + margin: 0; + padding: 0; + list-style-type: none; +} +#header-post ul li { + display: inline-block; + margin-right: 15px; + vertical-align: middle; +} +#header-post ul li:last-child { + margin-right: 0; +} +#header-post #menu-icon { + float: right; + margin-right: 2rem; + margin-left: 15px; +} +#header-post #menu-icon:hover { + color: #d44375; +} +#header-post #menu-icon-tablet { + float: right; + margin-right: 2rem; + margin-left: 15px; +} +#header-post #menu-icon-tablet:hover { + color: #d44375; +} +#header-post #top-icon-tablet { + position: fixed; + right: 2rem; + bottom: 2rem; + margin-right: 2rem; + margin-left: 15px; +} +#header-post #top-icon-tablet:hover { + color: #d44375; +} +#header-post .active { + color: #d44375; +} +#header-post #menu { + visibility: hidden; + margin-right: 2rem; +} +#header-post #nav { + color: #d44375; + letter-spacing: 0.01em; + font-weight: 200; + font-style: normal; + font-size: 0.8rem; +} +#header-post #nav ul { + line-height: 15px; +} +#header-post #nav ul a { + margin-right: 15px; + color: #d44375; +} +#header-post #nav ul a:hover { + background-image: linear-gradient(transparent, transparent 5px, #d44375 5px, #d44375); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +#header-post #nav ul li { + border-right: 1px dotted #d44375; +} +#header-post #nav ul li:last-child { + margin-right: 0; + border-right: 0; +} +#header-post #nav ul li:last-child a { + margin-right: 0; +} +#header-post #actions { + float: right; + margin-top: 2rem; + margin-right: 2rem; + width: 100%; + text-align: right; +} +#header-post #actions ul { + display: block; +} +#header-post #actions .info { + display: block; + font-style: italic; +} +#header-post #share { + clear: both; + padding-top: 1rem; + padding-right: 2rem; + text-align: right; +} +#header-post #share li { + display: block; + margin: 0; +} +#header-post #toc { + float: right; + clear: both; + overflow: auto; + margin-top: 1rem; + padding-right: 2rem; + max-width: 20em; + max-height: calc(95vh - 7rem); + text-align: right; +} +#header-post #toc a:hover { + color: #2bbc8a; +} +#header-post #toc .toc-level-1 > .toc-link { + display: none; +} +#header-post #toc .toc-level-2 { + color: #363533; + font-size: 0.8rem; +} +#header-post #toc .toc-level-2:before { + color: #d44375; + content: "#"; +} +#header-post #toc .toc-level-3 { + color: #666; + font-size: 0.7rem; +} +#header-post #toc .toc-level-4 { + color: #525252; + font-size: 0.4rem; +} +#header-post #toc .toc-level-5 { + display: none; +} +#header-post #toc .toc-level-6 { + display: none; +} +#header-post #toc .toc-number { + display: none; +} +@media screen and (max-width: 500px) { + #header-post { + display: none; + } +} +@media screen and (max-width: 900px) { + #header-post #menu-icon { + display: none; + } + #header-post #actions { + display: none; + } +} +@media screen and (max-width: 1199px) { + #header-post #toc { + display: none; + } +} +@media screen and (min-width: 900px) { + #header-post #menu-icon-tablet { + display: none !important; + } + #header-post #top-icon-tablet { + display: none !important; + } +} +@media screen and (min-width: 1199px) { + #header-post #actions { + width: auto; + } + #header-post #actions ul { + display: inline-block; + float: right; + } + #header-post #actions .info { + display: inline; + float: left; + margin-right: 2rem; + font-style: italic; + } +} +@media print { + #header-post { + display: none; + } + #footer-post-container { + display: none; + } +} +#footer-post { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 5000000; + width: 100%; + border-top: 1px solid #666; + background: #dedcd9; + transition: opacity 0.2s; +} +#footer-post a { + background: none; + color: inherit; + text-decoration: none; +} +#footer-post a.icon { + background: none; +} +#footer-post a.icon:hover { + color: #2bbc8a; +} +#footer-post #nav-footer { + padding-right: 1rem; + padding-left: 1rem; + background: #cdcac6; + text-align: center; +} +#footer-post #nav-footer a { + color: #d44375; + font-size: 1em; +} +#footer-post #nav-footer a:hover { + background-image: linear-gradient(transparent, transparent 5px, #d44375 5px, #d44375); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +#footer-post #nav-footer ul { + display: table; + margin: 0; + padding: 0; + width: 100%; + list-style-type: none; +} +#footer-post #nav-footer ul li { + display: inline-table; + padding: 10px; + width: 20%; + vertical-align: middle; +} +#footer-post #actions-footer { + overflow: auto; + margin-top: 1rem; + margin-bottom: 1rem; + padding-right: 1rem; + padding-left: 1rem; + width: 100%; + text-align: center; + white-space: nowrap; +} +#footer-post #actions-footer a { + display: inline-block; + padding-left: 1rem; + color: #d44375; +} +#footer-post #share-footer { + padding-right: 1rem; + padding-left: 1rem; + background: #cdcac6; + text-align: center; +} +#footer-post #share-footer ul { + display: table; + margin: 0; + padding: 0; + width: 100%; + list-style-type: none; +} +#footer-post #share-footer ul li { + display: inline-table; + padding: 10px; + width: 20%; + vertical-align: middle; +} +#footer-post #toc-footer { + clear: both; + padding-top: 1rem; + padding-bottom: 1rem; + background: #cdcac6; + text-align: left; +} +#footer-post #toc-footer ol { + margin: 0; + padding-left: 20px; + list-style-type: none; +} +#footer-post #toc-footer ol li { + line-height: 30px; +} +#footer-post #toc-footer a:hover { + color: #2bbc8a; +} +#footer-post #toc-footer .toc-level-1 > .toc-link { + display: none; +} +#footer-post #toc-footer .toc-level-2 { + color: #363533; + font-size: 0.8rem; +} +#footer-post #toc-footer .toc-level-2:before { + color: #d44375; + content: "#"; +} +#footer-post #toc-footer .toc-level-3 { + color: #666; + font-size: 0.7rem; + line-height: 15px; +} +#footer-post #toc-footer .toc-level-4 { + display: none; +} +#footer-post #toc-footer .toc-level-5 { + display: none; +} +#footer-post #toc-footer .toc-level-6 { + display: none; +} +#footer-post #toc-footer .toc-number { + display: none; +} +@media screen and (min-width: 500px) { + #footer-post-container { + display: none; + } +} +.post-list { + padding: 0; +} +.post-list .post-item { + margin-bottom: 1rem; + margin-left: 0; + list-style-type: none; +} +.post-list .post-item .meta { + display: block; + margin-right: 16px; + min-width: 100px; + color: #666; + font-size: 14px; +} +@media (min-width: 480px) { + .post-list .post-item { + display: flex; + margin-bottom: 5px; + } + .post-list .post-item .meta { + text-align: left; + } +} +.project-list { + padding: 0; + list-style: none; +} +.project-list .project-item { + margin-bottom: 5px; +} +.project-list .project-item p { + display: inline; +} +article header .posttitle { + margin-top: 0; + margin-bottom: 0; + text-transform: none; + font-size: 1.5em; + line-height: 1.25; +} +article header .meta { + margin-top: 0; + margin-bottom: 1rem; +} +article header .meta * { + color: #666; + font-size: 0.85rem; +} +article header .author { + text-transform: uppercase; + letter-spacing: 0.01em; + font-weight: 700; +} +article header .postdate { + display: inline; +} +article .content h2:before { + position: absolute; + top: -4px; + left: -1rem; + color: #d44375; + content: "#"; + font-weight: bold; + font-size: 1.2rem; +} +article .content img, +article .content video { + display: block; + margin: auto; + max-width: 100%; + height: auto; +} +article .content .video-container { + position: relative; + overflow: hidden; + padding-top: 56.25%; + height: 0; +} +article .content .video-container iframe, +article .content .video-container object, +article .content .video-container embed { + position: absolute; + top: 0; + left: 0; + margin-top: 0; + width: 100%; + height: 100%; +} +article .content blockquote { + margin: 1rem 10px; + padding: 0.5em 10px; + background: inherit; + color: #ab2251; + quotes: "\201C" "\201D" "\2018" "\2019"; + font-weight: bold; +} +article .content blockquote p { + margin: 0; +} +article .content blockquote:before { + margin-right: 0.25em; + color: #ab2251; + content: "\201C"; + vertical-align: -0.4em; + font-size: 2em; + line-height: 0.1em; +} +article .content blockquote footer { + margin: line-height 0; + color: #666; + font-size: 11px; +} +article .content blockquote footer a { + background-image: linear-gradient(transparent, transparent 5px, #666 5px, #666); + color: #666; +} +article .content blockquote footer a:hover { + background-image: linear-gradient(transparent, transparent 4px, #858585 4px, #858585); + color: #858585; +} +article .content blockquote footer cite:before { + padding: 0 0.5em; + content: "—"; +} +article .content .pullquote { + margin: 0; + width: 45%; + text-align: left; +} +article .content .pullquote.left { + margin-right: 1em; + margin-left: 0.5em; +} +article .content .pullquote.right { + margin-right: 0.5em; + margin-left: 1em; +} +article .content .caption { + position: relative; + display: block; + margin-top: 0.5em; + color: #666; + text-align: center; + font-size: 0.9em; +} +.posttitle { + text-transform: none; + font-size: 1.5em; + line-height: 1.25; +} +.article-tag .tag-link { + background-image: linear-gradient(transparent, transparent 10px, #2bbc8a 10px, #2bbc8a); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +.article-tag .tag-link:before { + content: "#"; +} +.article-category .category-link { + background-image: linear-gradient(transparent, transparent 10px, #2bbc8a 10px, #2bbc8a); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +@media (min-width: 480px) { + .article-tag, + .article-category { + display: inline; + } + .article-tag:before, + .article-category:before { + content: "|"; + } +} +#archive .post-list { + padding: 0; +} +#archive .post-list .post-item { + margin-bottom: 1rem; + margin-left: 0; + list-style-type: none; +} +#archive .post-list .post-item .meta { + display: block; + margin-right: 16px; + min-width: 100px; + color: #666; + font-size: 14px; +} +@media (min-width: 480px) { + #archive .post-list .post-item { + display: flex; + margin-bottom: 5px; + margin-left: 1rem; + } + #archive .post-list .post-item .meta { + text-align: left; + } +} +.blog-post-comments { + margin-top: 4rem; +} +#footer { + position: absolute; + bottom: 0; + margin-bottom: 10px; + width: 100%; + color: #666; + vertical-align: top; + text-align: center; + font-size: 11px; +} +#footer ul { + margin: 0; + padding: 0; + list-style: none; +} +#footer li { + display: inline-block; + margin-right: 15px; + border-right: 1px solid; + border-color: #666; + vertical-align: middle; +} +#footer li a { + margin-right: 15px; +} +#footer li:last-child { + margin-right: 0; + border-right: 0; +} +#footer li:last-child a { + margin-right: 0; +} +#footer a { + color: #666; + text-decoration: underline; + background-image: none; +} +#footer a:hover { + color: #858585; +} +#footer .footer-left { + height: 20px; + vertical-align: middle; + line-height: 20px; +} +@media (min-width: 39rem) { + #footer { + display: flex; + flex-flow: row wrap; + justify-content: space-between; + align-items: center; + align-content: center; + margin-bottom: 20px; + } + #footer .footer-left { + align-self: flex-start; + margin-right: 20px; + } + #footer .footer-right { + align-self: flex-end; + } +} +.pagination { + display: inline-block; + margin-top: 2rem; + width: 100%; + text-align: center; +} +.pagination .page-number { + color: #363533; + font-size: 0.8rem; +} +.pagination a { + padding: 4px 6px; + border-radius: 5px; + background-image: none; + color: #363533; + text-decoration: none; +} +.pagination a:hover { + background-image: none; +} +.pagination a:hover:not(.active) { + color: #111; +} +.search-input { + padding: 4px 7px; + width: 100%; + outline: none; + border: solid 1px #666; + border-radius: 5px; + background-color: #e2e0de; + color: #363533; + font-size: 1.2rem; + -webkit-border-radius: 5px; + -moz-border-radius: 5px; +} +.search-input:focus { + border: solid 1px #d44375; +} +#search-result ul.search-result-list { + padding: 0; + list-style-type: none; +} +#search-result li { + margin: 2em auto; +} +#search-result a.search-result-title { + background-image: none; + color: #363533; + text-transform: capitalize; + font-weight: bold; + line-height: 1.2; +} +#search-result p.search-result { + overflow: hidden; + margin: 0.4em auto; + max-height: 13em; + text-align: justify; + font-size: 0.8em; +} +#search-result em.search-keyword { + border-bottom: 1px dashed #2bbc8a; + color: #2bbc8a; + font-weight: bold; +} +.search-no-result { + display: none; + padding-bottom: 0.5em; + color: #363533; +} +#tag-cloud .tag-cloud-title { + color: #666; +} +#tag-cloud .tag-cloud-tags { + clear: both; + text-align: center; +} +#tag-cloud .tag-cloud-tags a { + display: inline-block; + margin: 10px; +} +.tooltipped { + position: relative; +} +.tooltipped::after { + position: absolute; + z-index: 1000000; + display: none; + padding: 0.2em 0.5em; + -webkit-font-smoothing: subpixel-antialiased; + color: #e2e0de; + font-display: swap; + font-weight: 400; + font-size: 11.200000000000001px; + font-family: "Menlo", "Meslo LG", monospace; + line-height: 1.725; + text-rendering: geometricPrecision; + text-align: center; + word-wrap: break-word; + white-space: pre; + content: attr(aria-label); + background: #363533; + border-radius: 3px; + opacity: 0; +} +.tooltipped::before { + position: absolute; + z-index: 1000001; + display: none; + width: 0; + height: 0; + color: #363533; + pointer-events: none; + content: ''; + border: 6px solid transparent; + opacity: 0; +} +.tooltipped:hover::before, +.tooltipped:active::before, +.tooltipped:focus::before, +.tooltipped:hover::after, +.tooltipped:active::after, +.tooltipped:focus::after { + display: inline-block; + text-decoration: none; + animation-name: tooltip-appear; + animation-duration: 0.1s; + animation-fill-mode: forwards; + animation-timing-function: ease-in; +} +.tooltipped-s::after, +.tooltipped-sw::after { + top: 100%; + right: 50%; + margin-top: 6px; +} +.tooltipped-s::before, +.tooltipped-sw::before { + top: auto; + right: 50%; + bottom: -7px; + margin-right: -6px; + border-bottom-color: #363533; +} +.tooltipped-sw::after { + margin-right: -16px; +} +.tooltipped-s::after { + transform: translateX(50%); +} +@-moz-keyframes tooltip-appear { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@-webkit-keyframes tooltip-appear { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@-o-keyframes tooltip-appear { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes tooltip-appear { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +#categories .category-list-title { + color: #666; +} +#categories .category-list .category-list-item .category-list-count { + color: #666; +} +#categories .category-list .category-list-item .category-list-count:before { + content: " ("; +} +#categories .category-list .category-list-item .category-list-count:after { + content: ")"; +} +.highlight { + color: #333; + background: #f8f8f8; +} +.highlight .code .comment, +.highlight .code .quote { + color: #998; + font-style: italic; +} +.highlight .code .keyword, +.highlight .code .selector-tag, +.highlight .code .subst { + color: #333; + font-weight: bold; +} +.highlight .code .number, +.highlight .code .literal, +.highlight .code .variable, +.highlight .code .template-variable, +.highlight .code .tag .attr { + color: #008080; +} +.highlight .code .string, +.highlight .code .doctag { + color: #d14; +} +.highlight .code .title, +.highlight .code .section, +.highlight .code .selector-id { + color: #900; + font-weight: bold; +} +.highlight .code .subst { + font-weight: normal; +} +.highlight .code .type, +.highlight .code .class .title { + color: #458; + font-weight: bold; +} +.highlight .code .tag, +.highlight .code .name, +.highlight .code .attribute { + color: #000080; + font-weight: normal; +} +.highlight .code .regexp, +.highlight .code .link { + color: #009926; +} +.highlight .code .symbol, +.highlight .code .bullet { + color: #990073; +} +.highlight .code .built_in, +.highlight .code .builtin-name { + color: #0086b3; +} +.highlight .code .meta { + color: #999; + font-weight: bold; +} +.highlight .code .deletion { + background: #fdd; +} +.highlight .code .addition { + background: #dfd; +} +.highlight .code .emphasis { + font-style: italic; +} +.highlight .code .strong { + font-weight: bold; +} +pre { + overflow-x: auto; + padding: 10px 15px; + padding-bottom: 0; + border: 1px dotted #666; + border-radius: 4px; + font-size: 13px; + font-family: "Menlo", "Meslo LG", monospace; + line-height: 22px; + -webkit-border-radius: 4px; +} +pre code { + display: block; + padding: 0; + border: none; +} +code { + padding: 0 5px; + border: 1px dotted #666; + border-radius: 2px; + -webkit-border-radius: 2px; +} +.highlight { + overflow-x: auto; + margin: 1rem 0; + padding: 10px 15px; + border-radius: 4px; + background: #dedcd9; + font-family: "Menlo", "Meslo LG", monospace; + -webkit-border-radius: 4px; +} +.highlight figcaption { + margin: -5px 0 5px; + color: #757575; + font-size: 0.9em; + zoom: 1; +} +.highlight figcaption a { + float: right; + color: #757575; + font-style: italic; + font-size: 0.8em; + background-image: linear-gradient(transparent, transparent 10px, #2bbc8a 10px, #2bbc8a); + background-position: bottom; + background-size: 100% 6px; + background-repeat: repeat-x; +} +.highlight figcaption a:hover { + color: #919191; +} +.highlight figcaption:before, +.highlight figcaption content: "" { + display: table; +} +.highlight figcaption:after { + clear: both; +} +.highlight:hover .btn-copy { + opacity: 1; +} +.highlight .btn-copy { + font-size: 1.2rem; + position: absolute; + right: 20px; + opacity: 0; + transition: opacity 0.2s ease-in; +} +.highlight .btn-copy:hover { + color: #d44375; +} +.highlight pre { + margin: 0; + padding: 0; + border: none; + background: none; +} +.highlight table { + width: auto; +} +.highlight td.gutter { + text-align: right; + opacity: 0.2; +} +.highlight .line { + height: 22px; +} diff --git a/public/images/apple-touch-icon.png b/public/images/apple-touch-icon.png new file mode 100644 index 0000000..cb2dfbb Binary files /dev/null and b/public/images/apple-touch-icon.png differ diff --git a/public/images/favicon-192x192_1.png b/public/images/favicon-192x192_1.png new file mode 100644 index 0000000..899779b Binary files /dev/null and b/public/images/favicon-192x192_1.png differ diff --git a/public/images/favicon.png b/public/images/favicon.png new file mode 100644 index 0000000..fc0bd8b Binary files /dev/null and b/public/images/favicon.png differ diff --git a/public/images/favicon1.ico b/public/images/favicon1.ico new file mode 100644 index 0000000..84a85d3 Binary files /dev/null and b/public/images/favicon1.ico differ diff --git a/public/images/logo.png b/public/images/logo.png new file mode 100644 index 0000000..97c6230 Binary files /dev/null and b/public/images/logo.png differ diff --git a/public/images/logo1.png b/public/images/logo1.png new file mode 100644 index 0000000..43a6ef0 Binary files /dev/null and b/public/images/logo1.png differ diff --git a/public/index.html b/public/index.html index 7ba8455..f166d2d 100644 --- a/public/index.html +++ b/public/index.html @@ -1,118 +1,2 @@ - MarkDown
\ No newline at end of file + MarkDown +
\ No newline at end of file diff --git a/public/js/main.js b/public/js/main.js new file mode 100644 index 0000000..3559fc5 --- /dev/null +++ b/public/js/main.js @@ -0,0 +1,113 @@ +/** + * Sets up Justified Gallery. + */ +if (!!$.prototype.justifiedGallery) { + var options = { + rowHeight: 140, + margins: 4, + lastRow: "justify" + }; + $(".article-gallery").justifiedGallery(options); +} + +$(document).ready(function() { + + /** + * Shows the responsive navigation menu on mobile. + */ + $("#header > #nav > ul > .icon").click(function() { + $("#header > #nav > ul").toggleClass("responsive"); + }); + + + /** + * Controls the different versions of the menu in blog post articles + * for Desktop, tablet and mobile. + */ + if ($(".post").length) { + var menu = $("#menu"); + var nav = $("#menu > #nav"); + var menuIcon = $("#menu-icon, #menu-icon-tablet"); + + /** + * Display the menu on hi-res laptops and desktops. + */ + if ($(document).width() >= 1440) { + menu.css("visibility", "visible"); + menuIcon.addClass("active"); + } + + /** + * Display the menu if the menu icon is clicked. + */ + menuIcon.click(function() { + if (menu.css("visibility") === "hidden") { + menu.css("visibility", "visible"); + menuIcon.addClass("active"); + } else { + menu.css("visibility", "hidden"); + menuIcon.removeClass("active"); + } + return false; + }); + + /** + * Add a scroll listener to the menu to hide/show the navigation links. + */ + if (menu.length) { + $(window).on("scroll", function() { + var topDistance = menu.offset().top; + + // hide only the navigation links on desktop + if (!nav.is(":visible") && topDistance < 50) { + nav.show(); + } else if (nav.is(":visible") && topDistance > 100) { + nav.hide(); + } + + // on tablet, hide the navigation icon as well and show a "scroll to top + // icon" instead + if ( ! $( "#menu-icon" ).is(":visible") && topDistance < 50 ) { + $("#menu-icon-tablet").show(); + $("#top-icon-tablet").hide(); + } else if (! $( "#menu-icon" ).is(":visible") && topDistance > 100) { + $("#menu-icon-tablet").hide(); + $("#top-icon-tablet").show(); + } + }); + } + + /** + * Show mobile navigation menu after scrolling upwards, + * hide it again after scrolling downwards. + */ + if ($( "#footer-post").length) { + var lastScrollTop = 0; + $(window).on("scroll", function() { + var topDistance = $(window).scrollTop(); + + if (topDistance > lastScrollTop){ + // downscroll -> show menu + $("#footer-post").hide(); + } else { + // upscroll -> hide menu + $("#footer-post").show(); + } + lastScrollTop = topDistance; + + // close all submenu"s on scroll + $("#nav-footer").hide(); + $("#toc-footer").hide(); + $("#share-footer").hide(); + + // show a "navigation" icon when close to the top of the page, + // otherwise show a "scroll to the top" icon + if (topDistance < 50) { + $("#actions-footer > #top").hide(); + } else if (topDistance > 100) { + $("#actions-footer > #top").show(); + } + }); + } + } +}); diff --git a/public/js/search.js b/public/js/search.js new file mode 100644 index 0000000..bb052f3 --- /dev/null +++ b/public/js/search.js @@ -0,0 +1,157 @@ +// A local search script with the help of +// [hexo-generator-search](https://github.com/PaicHyperionDev/hexo-generator-search) +// Copyright (C) 2015 +// Joseph Pan +// Shuhao Mao +// This library is free software; you can redistribute it and/or modify +// it under the terms of the GNU Lesser General Public License as +// published by the Free Software Foundation; either version 2.1 of the +// License, or (at your option) any later version. +// +// This library is distributed in the hope that it will be useful, but +// WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +// Lesser General Public License for more details. +// +// You should have received a copy of the GNU Lesser General Public +// License along with this library; if not, write to the Free Software +// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA +// 02110-1301 USA +// +// Modified by: +// Pieter Robberechts + +/*exported searchFunc*/ +var searchFunc = function(path, searchId, contentId) { + + function stripHtml(html) { + html = html.replace(//gi, ""); + html = html.replace(//gi, ""); + html = html.replace(//gi, ""); + html = html.replace(/<\/div>/ig, "\n"); + html = html.replace(/<\/li>/ig, "\n"); + html = html.replace(/
  • /ig, " * "); + html = html.replace(/<\/ul>/ig, "\n"); + html = html.replace(/<\/p>/ig, "\n"); + html = html.replace(//gi, "\n"); + html = html.replace(/<[^>]+>/ig, ""); + return html; + } + + function getAllCombinations(keywords) { + var i, j, result = []; + + for (i = 0; i < keywords.length; i++) { + for (j = i + 1; j < keywords.length + 1; j++) { + result.push(keywords.slice(i, j).join(" ")); + } + } + return result; + } + + $.ajax({ + url: path, + dataType: "xml", + success: function(xmlResponse) { + // get the contents from search data + var datas = $("entry", xmlResponse).map(function() { + return { + title: $("title", this).text(), + content: $("content", this).text(), + url: $("link", this).attr("href") + }; + }).get(); + + var $input = document.getElementById(searchId); + if (!$input) { return; } + var $resultContent = document.getElementById(contentId); + + $input.addEventListener("input", function(){ + var resultList = []; + var keywords = getAllCombinations(this.value.trim().toLowerCase().split(" ")) + .sort(function(a,b) { return b.split(" ").length - a.split(" ").length; }); + $resultContent.innerHTML = ""; + if (this.value.trim().length <= 0) { + return; + } + // perform local searching + datas.forEach(function(data) { + var matches = 0; + if (!data.title || data.title.trim() === "") { + data.title = "Untitled"; + } + var dataTitle = data.title.trim().toLowerCase(); + var dataContent = stripHtml(data.content.trim()); + var dataUrl = data.url; + var indexTitle = -1; + var indexContent = -1; + var firstOccur = -1; + // only match artiles with not empty contents + if (dataContent !== "") { + keywords.forEach(function(keyword) { + indexTitle = dataTitle.indexOf(keyword); + indexContent = dataContent.indexOf(keyword); + + if( indexTitle >= 0 || indexContent >= 0 ){ + matches += 1; + if (indexContent < 0) { + indexContent = 0; + } + if (firstOccur < 0) { + firstOccur = indexContent; + } + } + }); + } + // show search results + if (matches > 0) { + var searchResult = {}; + searchResult.rank = matches; + searchResult.str = "
  • "+ dataTitle +""; + if (firstOccur >= 0) { + // cut out 100 characters + var start = firstOccur - 20; + var end = firstOccur + 80; + + if(start < 0){ + start = 0; + } + + if(start == 0){ + end = 100; + } + + if(end > dataContent.length){ + end = dataContent.length; + } + + var matchContent = dataContent.substr(start, end); + + // highlight all keywords + var regS = new RegExp(keywords.join("|"), "gi"); + matchContent = matchContent.replace(regS, function(keyword) { + return ""+keyword+""; + }); + + searchResult.str += "

    " + matchContent +"...

    "; + } + searchResult.str += "
  • "; + resultList.push(searchResult); + } + }); + + if (resultList.length) { + resultList.sort(function(a, b) { + return b.rank - a.rank; + }); + var result ="
      "; + for (var i = 0; i < resultList.length; i++) { + result += resultList[i].str; + } + result += "
    "; + $resultContent.innerHTML = result; + } + }); + } + }); +}; diff --git a/public/lib/clipboard/clipboard.min.js b/public/lib/clipboard/clipboard.min.js new file mode 100644 index 0000000..02c549e --- /dev/null +++ b/public/lib/clipboard/clipboard.min.js @@ -0,0 +1,7 @@ +/*! + * clipboard.js v2.0.4 + * https://zenorocha.github.io/clipboard.js + * + * Licensed MIT © Zeno Rocha + */ +!function(t,e){"object"==typeof exports&&"object"==typeof module?module.exports=e():"function"==typeof define&&define.amd?define([],e):"object"==typeof exports?exports.ClipboardJS=e():t.ClipboardJS=e()}(this,function(){return function(n){var o={};function r(t){if(o[t])return o[t].exports;var e=o[t]={i:t,l:!1,exports:{}};return n[t].call(e.exports,e,e.exports,r),e.l=!0,e.exports}return r.m=n,r.c=o,r.d=function(t,e,n){r.o(t,e)||Object.defineProperty(t,e,{enumerable:!0,get:n})},r.r=function(t){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(t,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(t,"__esModule",{value:!0})},r.t=function(e,t){if(1&t&&(e=r(e)),8&t)return e;if(4&t&&"object"==typeof e&&e&&e.__esModule)return e;var n=Object.create(null);if(r.r(n),Object.defineProperty(n,"default",{enumerable:!0,value:e}),2&t&&"string"!=typeof e)for(var o in e)r.d(n,o,function(t){return e[t]}.bind(null,o));return n},r.n=function(t){var e=t&&t.__esModule?function(){return t.default}:function(){return t};return r.d(e,"a",e),e},r.o=function(t,e){return Object.prototype.hasOwnProperty.call(t,e)},r.p="",r(r.s=0)}([function(t,e,n){"use strict";var r="function"==typeof Symbol&&"symbol"==typeof Symbol.iterator?function(t){return typeof t}:function(t){return t&&"function"==typeof Symbol&&t.constructor===Symbol&&t!==Symbol.prototype?"symbol":typeof t},i=function(){function o(t,e){for(var n=0;nli{position:relative}.fa-li{left:-2em;position:absolute;text-align:center;width:2em;line-height:inherit}.fa-border{border:.08em solid #eee;border-radius:.1em;padding:.2em .25em .15em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left,.fab.fa-pull-left,.fal.fa-pull-left,.far.fa-pull-left,.fas.fa-pull-left{margin-right:.3em}.fa.fa-pull-right,.fab.fa-pull-right,.fal.fa-pull-right,.far.fa-pull-right,.fas.fa-pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s linear infinite;animation:fa-spin 2s linear infinite}.fa-pulse{-webkit-animation:fa-spin 1s steps(8) infinite;animation:fa-spin 1s steps(8) infinite}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scaleX(-1);transform:scaleX(-1)}.fa-flip-vertical{-webkit-transform:scaleY(-1);transform:scaleY(-1)}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical,.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)"}.fa-flip-both,.fa-flip-horizontal.fa-flip-vertical{-webkit-transform:scale(-1);transform:scale(-1)}:root .fa-flip-both,:root .fa-flip-horizontal,:root .fa-flip-vertical,:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270{-webkit-filter:none;filter:none}.fa-stack{display:inline-block;height:2em;line-height:2em;position:relative;vertical-align:middle;width:2.5em}.fa-stack-1x,.fa-stack-2x{left:0;position:absolute;text-align:center;width:100%}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-500px:before{content:"\f26e"}.fa-accessible-icon:before{content:"\f368"}.fa-accusoft:before{content:"\f369"}.fa-acquisitions-incorporated:before{content:"\f6af"}.fa-ad:before{content:"\f641"}.fa-address-book:before{content:"\f2b9"}.fa-address-card:before{content:"\f2bb"}.fa-adjust:before{content:"\f042"}.fa-adn:before{content:"\f170"}.fa-adobe:before{content:"\f778"}.fa-adversal:before{content:"\f36a"}.fa-affiliatetheme:before{content:"\f36b"}.fa-air-freshener:before{content:"\f5d0"}.fa-airbnb:before{content:"\f834"}.fa-algolia:before{content:"\f36c"}.fa-align-center:before{content:"\f037"}.fa-align-justify:before{content:"\f039"}.fa-align-left:before{content:"\f036"}.fa-align-right:before{content:"\f038"}.fa-alipay:before{content:"\f642"}.fa-allergies:before{content:"\f461"}.fa-amazon:before{content:"\f270"}.fa-amazon-pay:before{content:"\f42c"}.fa-ambulance:before{content:"\f0f9"}.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-amilia:before{content:"\f36d"}.fa-anchor:before{content:"\f13d"}.fa-android:before{content:"\f17b"}.fa-angellist:before{content:"\f209"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-down:before{content:"\f107"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angry:before{content:"\f556"}.fa-angrycreative:before{content:"\f36e"}.fa-angular:before{content:"\f420"}.fa-ankh:before{content:"\f644"}.fa-app-store:before{content:"\f36f"}.fa-app-store-ios:before{content:"\f370"}.fa-apper:before{content:"\f371"}.fa-apple:before{content:"\f179"}.fa-apple-alt:before{content:"\f5d1"}.fa-apple-pay:before{content:"\f415"}.fa-archive:before{content:"\f187"}.fa-archway:before{content:"\f557"}.fa-arrow-alt-circle-down:before{content:"\f358"}.fa-arrow-alt-circle-left:before{content:"\f359"}.fa-arrow-alt-circle-right:before{content:"\f35a"}.fa-arrow-alt-circle-up:before{content:"\f35b"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-down:before{content:"\f063"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrows-alt:before{content:"\f0b2"}.fa-arrows-alt-h:before{content:"\f337"}.fa-arrows-alt-v:before{content:"\f338"}.fa-artstation:before{content:"\f77a"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asterisk:before{content:"\f069"}.fa-asymmetrik:before{content:"\f372"}.fa-at:before{content:"\f1fa"}.fa-atlas:before{content:"\f558"}.fa-atlassian:before{content:"\f77b"}.fa-atom:before{content:"\f5d2"}.fa-audible:before{content:"\f373"}.fa-audio-description:before{content:"\f29e"}.fa-autoprefixer:before{content:"\f41c"}.fa-avianex:before{content:"\f374"}.fa-aviato:before{content:"\f421"}.fa-award:before{content:"\f559"}.fa-aws:before{content:"\f375"}.fa-baby:before{content:"\f77c"}.fa-baby-carriage:before{content:"\f77d"}.fa-backspace:before{content:"\f55a"}.fa-backward:before{content:"\f04a"}.fa-bacon:before{content:"\f7e5"}.fa-bahai:before{content:"\f666"}.fa-balance-scale:before{content:"\f24e"}.fa-balance-scale-left:before{content:"\f515"}.fa-balance-scale-right:before{content:"\f516"}.fa-ban:before{content:"\f05e"}.fa-band-aid:before{content:"\f462"}.fa-bandcamp:before{content:"\f2d5"}.fa-barcode:before{content:"\f02a"}.fa-bars:before{content:"\f0c9"}.fa-baseball-ball:before{content:"\f433"}.fa-basketball-ball:before{content:"\f434"}.fa-bath:before{content:"\f2cd"}.fa-battery-empty:before{content:"\f244"}.fa-battery-full:before{content:"\f240"}.fa-battery-half:before{content:"\f242"}.fa-battery-quarter:before{content:"\f243"}.fa-battery-three-quarters:before{content:"\f241"}.fa-battle-net:before{content:"\f835"}.fa-bed:before{content:"\f236"}.fa-beer:before{content:"\f0fc"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-bell:before{content:"\f0f3"}.fa-bell-slash:before{content:"\f1f6"}.fa-bezier-curve:before{content:"\f55b"}.fa-bible:before{content:"\f647"}.fa-bicycle:before{content:"\f206"}.fa-biking:before{content:"\f84a"}.fa-bimobject:before{content:"\f378"}.fa-binoculars:before{content:"\f1e5"}.fa-biohazard:before{content:"\f780"}.fa-birthday-cake:before{content:"\f1fd"}.fa-bitbucket:before{content:"\f171"}.fa-bitcoin:before{content:"\f379"}.fa-bity:before{content:"\f37a"}.fa-black-tie:before{content:"\f27e"}.fa-blackberry:before{content:"\f37b"}.fa-blender:before{content:"\f517"}.fa-blender-phone:before{content:"\f6b6"}.fa-blind:before{content:"\f29d"}.fa-blog:before{content:"\f781"}.fa-blogger:before{content:"\f37c"}.fa-blogger-b:before{content:"\f37d"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-bold:before{content:"\f032"}.fa-bolt:before{content:"\f0e7"}.fa-bomb:before{content:"\f1e2"}.fa-bone:before{content:"\f5d7"}.fa-bong:before{content:"\f55c"}.fa-book:before{content:"\f02d"}.fa-book-dead:before{content:"\f6b7"}.fa-book-medical:before{content:"\f7e6"}.fa-book-open:before{content:"\f518"}.fa-book-reader:before{content:"\f5da"}.fa-bookmark:before{content:"\f02e"}.fa-bootstrap:before{content:"\f836"}.fa-border-all:before{content:"\f84c"}.fa-border-none:before{content:"\f850"}.fa-border-style:before{content:"\f853"}.fa-bowling-ball:before{content:"\f436"}.fa-box:before{content:"\f466"}.fa-box-open:before{content:"\f49e"}.fa-boxes:before{content:"\f468"}.fa-braille:before{content:"\f2a1"}.fa-brain:before{content:"\f5dc"}.fa-bread-slice:before{content:"\f7ec"}.fa-briefcase:before{content:"\f0b1"}.fa-briefcase-medical:before{content:"\f469"}.fa-broadcast-tower:before{content:"\f519"}.fa-broom:before{content:"\f51a"}.fa-brush:before{content:"\f55d"}.fa-btc:before{content:"\f15a"}.fa-buffer:before{content:"\f837"}.fa-bug:before{content:"\f188"}.fa-building:before{content:"\f1ad"}.fa-bullhorn:before{content:"\f0a1"}.fa-bullseye:before{content:"\f140"}.fa-burn:before{content:"\f46a"}.fa-buromobelexperte:before{content:"\f37f"}.fa-bus:before{content:"\f207"}.fa-bus-alt:before{content:"\f55e"}.fa-business-time:before{content:"\f64a"}.fa-buy-n-large:before{content:"\f8a6"}.fa-buysellads:before{content:"\f20d"}.fa-calculator:before{content:"\f1ec"}.fa-calendar:before{content:"\f133"}.fa-calendar-alt:before{content:"\f073"}.fa-calendar-check:before{content:"\f274"}.fa-calendar-day:before{content:"\f783"}.fa-calendar-minus:before{content:"\f272"}.fa-calendar-plus:before{content:"\f271"}.fa-calendar-times:before{content:"\f273"}.fa-calendar-week:before{content:"\f784"}.fa-camera:before{content:"\f030"}.fa-camera-retro:before{content:"\f083"}.fa-campground:before{content:"\f6bb"}.fa-canadian-maple-leaf:before{content:"\f785"}.fa-candy-cane:before{content:"\f786"}.fa-cannabis:before{content:"\f55f"}.fa-capsules:before{content:"\f46b"}.fa-car:before{content:"\f1b9"}.fa-car-alt:before{content:"\f5de"}.fa-car-battery:before{content:"\f5df"}.fa-car-crash:before{content:"\f5e1"}.fa-car-side:before{content:"\f5e4"}.fa-caravan:before{content:"\f8ff"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-caret-square-down:before{content:"\f150"}.fa-caret-square-left:before{content:"\f191"}.fa-caret-square-right:before{content:"\f152"}.fa-caret-square-up:before{content:"\f151"}.fa-caret-up:before{content:"\f0d8"}.fa-carrot:before{content:"\f787"}.fa-cart-arrow-down:before{content:"\f218"}.fa-cart-plus:before{content:"\f217"}.fa-cash-register:before{content:"\f788"}.fa-cat:before{content:"\f6be"}.fa-cc-amazon-pay:before{content:"\f42d"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-apple-pay:before{content:"\f416"}.fa-cc-diners-club:before{content:"\f24c"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-cc-visa:before{content:"\f1f0"}.fa-centercode:before{content:"\f380"}.fa-centos:before{content:"\f789"}.fa-certificate:before{content:"\f0a3"}.fa-chair:before{content:"\f6c0"}.fa-chalkboard:before{content:"\f51b"}.fa-chalkboard-teacher:before{content:"\f51c"}.fa-charging-station:before{content:"\f5e7"}.fa-chart-area:before{content:"\f1fe"}.fa-chart-bar:before{content:"\f080"}.fa-chart-line:before{content:"\f201"}.fa-chart-pie:before{content:"\f200"}.fa-check:before{content:"\f00c"}.fa-check-circle:before{content:"\f058"}.fa-check-double:before{content:"\f560"}.fa-check-square:before{content:"\f14a"}.fa-cheese:before{content:"\f7ef"}.fa-chess:before{content:"\f439"}.fa-chess-bishop:before{content:"\f43a"}.fa-chess-board:before{content:"\f43c"}.fa-chess-king:before{content:"\f43f"}.fa-chess-knight:before{content:"\f441"}.fa-chess-pawn:before{content:"\f443"}.fa-chess-queen:before{content:"\f445"}.fa-chess-rook:before{content:"\f447"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-down:before{content:"\f078"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-chevron-up:before{content:"\f077"}.fa-child:before{content:"\f1ae"}.fa-chrome:before{content:"\f268"}.fa-chromecast:before{content:"\f838"}.fa-church:before{content:"\f51d"}.fa-circle:before{content:"\f111"}.fa-circle-notch:before{content:"\f1ce"}.fa-city:before{content:"\f64f"}.fa-clinic-medical:before{content:"\f7f2"}.fa-clipboard:before{content:"\f328"}.fa-clipboard-check:before{content:"\f46c"}.fa-clipboard-list:before{content:"\f46d"}.fa-clock:before{content:"\f017"}.fa-clone:before{content:"\f24d"}.fa-closed-captioning:before{content:"\f20a"}.fa-cloud:before{content:"\f0c2"}.fa-cloud-download-alt:before{content:"\f381"}.fa-cloud-meatball:before{content:"\f73b"}.fa-cloud-moon:before{content:"\f6c3"}.fa-cloud-moon-rain:before{content:"\f73c"}.fa-cloud-rain:before{content:"\f73d"}.fa-cloud-showers-heavy:before{content:"\f740"}.fa-cloud-sun:before{content:"\f6c4"}.fa-cloud-sun-rain:before{content:"\f743"}.fa-cloud-upload-alt:before{content:"\f382"}.fa-cloudscale:before{content:"\f383"}.fa-cloudsmith:before{content:"\f384"}.fa-cloudversify:before{content:"\f385"}.fa-cocktail:before{content:"\f561"}.fa-code:before{content:"\f121"}.fa-code-branch:before{content:"\f126"}.fa-codepen:before{content:"\f1cb"}.fa-codiepie:before{content:"\f284"}.fa-coffee:before{content:"\f0f4"}.fa-cog:before{content:"\f013"}.fa-cogs:before{content:"\f085"}.fa-coins:before{content:"\f51e"}.fa-columns:before{content:"\f0db"}.fa-comment:before{content:"\f075"}.fa-comment-alt:before{content:"\f27a"}.fa-comment-dollar:before{content:"\f651"}.fa-comment-dots:before{content:"\f4ad"}.fa-comment-medical:before{content:"\f7f5"}.fa-comment-slash:before{content:"\f4b3"}.fa-comments:before{content:"\f086"}.fa-comments-dollar:before{content:"\f653"}.fa-compact-disc:before{content:"\f51f"}.fa-compass:before{content:"\f14e"}.fa-compress:before{content:"\f066"}.fa-compress-alt:before{content:"\f422"}.fa-compress-arrows-alt:before{content:"\f78c"}.fa-concierge-bell:before{content:"\f562"}.fa-confluence:before{content:"\f78d"}.fa-connectdevelop:before{content:"\f20e"}.fa-contao:before{content:"\f26d"}.fa-cookie:before{content:"\f563"}.fa-cookie-bite:before{content:"\f564"}.fa-copy:before{content:"\f0c5"}.fa-copyright:before{content:"\f1f9"}.fa-cotton-bureau:before{content:"\f89e"}.fa-couch:before{content:"\f4b8"}.fa-cpanel:before{content:"\f388"}.fa-creative-commons:before{content:"\f25e"}.fa-creative-commons-by:before{content:"\f4e7"}.fa-creative-commons-nc:before{content:"\f4e8"}.fa-creative-commons-nc-eu:before{content:"\f4e9"}.fa-creative-commons-nc-jp:before{content:"\f4ea"}.fa-creative-commons-nd:before{content:"\f4eb"}.fa-creative-commons-pd:before{content:"\f4ec"}.fa-creative-commons-pd-alt:before{content:"\f4ed"}.fa-creative-commons-remix:before{content:"\f4ee"}.fa-creative-commons-sa:before{content:"\f4ef"}.fa-creative-commons-sampling:before{content:"\f4f0"}.fa-creative-commons-sampling-plus:before{content:"\f4f1"}.fa-creative-commons-share:before{content:"\f4f2"}.fa-creative-commons-zero:before{content:"\f4f3"}.fa-credit-card:before{content:"\f09d"}.fa-critical-role:before{content:"\f6c9"}.fa-crop:before{content:"\f125"}.fa-crop-alt:before{content:"\f565"}.fa-cross:before{content:"\f654"}.fa-crosshairs:before{content:"\f05b"}.fa-crow:before{content:"\f520"}.fa-crown:before{content:"\f521"}.fa-crutch:before{content:"\f7f7"}.fa-css3:before{content:"\f13c"}.fa-css3-alt:before{content:"\f38b"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-cut:before{content:"\f0c4"}.fa-cuttlefish:before{content:"\f38c"}.fa-d-and-d:before{content:"\f38d"}.fa-d-and-d-beyond:before{content:"\f6ca"}.fa-dashcube:before{content:"\f210"}.fa-database:before{content:"\f1c0"}.fa-deaf:before{content:"\f2a4"}.fa-delicious:before{content:"\f1a5"}.fa-democrat:before{content:"\f747"}.fa-deploydog:before{content:"\f38e"}.fa-deskpro:before{content:"\f38f"}.fa-desktop:before{content:"\f108"}.fa-dev:before{content:"\f6cc"}.fa-deviantart:before{content:"\f1bd"}.fa-dharmachakra:before{content:"\f655"}.fa-dhl:before{content:"\f790"}.fa-diagnoses:before{content:"\f470"}.fa-diaspora:before{content:"\f791"}.fa-dice:before{content:"\f522"}.fa-dice-d20:before{content:"\f6cf"}.fa-dice-d6:before{content:"\f6d1"}.fa-dice-five:before{content:"\f523"}.fa-dice-four:before{content:"\f524"}.fa-dice-one:before{content:"\f525"}.fa-dice-six:before{content:"\f526"}.fa-dice-three:before{content:"\f527"}.fa-dice-two:before{content:"\f528"}.fa-digg:before{content:"\f1a6"}.fa-digital-ocean:before{content:"\f391"}.fa-digital-tachograph:before{content:"\f566"}.fa-directions:before{content:"\f5eb"}.fa-discord:before{content:"\f392"}.fa-discourse:before{content:"\f393"}.fa-divide:before{content:"\f529"}.fa-dizzy:before{content:"\f567"}.fa-dna:before{content:"\f471"}.fa-dochub:before{content:"\f394"}.fa-docker:before{content:"\f395"}.fa-dog:before{content:"\f6d3"}.fa-dollar-sign:before{content:"\f155"}.fa-dolly:before{content:"\f472"}.fa-dolly-flatbed:before{content:"\f474"}.fa-donate:before{content:"\f4b9"}.fa-door-closed:before{content:"\f52a"}.fa-door-open:before{content:"\f52b"}.fa-dot-circle:before{content:"\f192"}.fa-dove:before{content:"\f4ba"}.fa-download:before{content:"\f019"}.fa-draft2digital:before{content:"\f396"}.fa-drafting-compass:before{content:"\f568"}.fa-dragon:before{content:"\f6d5"}.fa-draw-polygon:before{content:"\f5ee"}.fa-dribbble:before{content:"\f17d"}.fa-dribbble-square:before{content:"\f397"}.fa-dropbox:before{content:"\f16b"}.fa-drum:before{content:"\f569"}.fa-drum-steelpan:before{content:"\f56a"}.fa-drumstick-bite:before{content:"\f6d7"}.fa-drupal:before{content:"\f1a9"}.fa-dumbbell:before{content:"\f44b"}.fa-dumpster:before{content:"\f793"}.fa-dumpster-fire:before{content:"\f794"}.fa-dungeon:before{content:"\f6d9"}.fa-dyalog:before{content:"\f399"}.fa-earlybirds:before{content:"\f39a"}.fa-ebay:before{content:"\f4f4"}.fa-edge:before{content:"\f282"}.fa-edit:before{content:"\f044"}.fa-egg:before{content:"\f7fb"}.fa-eject:before{content:"\f052"}.fa-elementor:before{content:"\f430"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-ello:before{content:"\f5f1"}.fa-ember:before{content:"\f423"}.fa-empire:before{content:"\f1d1"}.fa-envelope:before{content:"\f0e0"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-text:before{content:"\f658"}.fa-envelope-square:before{content:"\f199"}.fa-envira:before{content:"\f299"}.fa-equals:before{content:"\f52c"}.fa-eraser:before{content:"\f12d"}.fa-erlang:before{content:"\f39d"}.fa-ethereum:before{content:"\f42e"}.fa-ethernet:before{content:"\f796"}.fa-etsy:before{content:"\f2d7"}.fa-euro-sign:before{content:"\f153"}.fa-evernote:before{content:"\f839"}.fa-exchange-alt:before{content:"\f362"}.fa-exclamation:before{content:"\f12a"}.fa-exclamation-circle:before{content:"\f06a"}.fa-exclamation-triangle:before{content:"\f071"}.fa-expand:before{content:"\f065"}.fa-expand-alt:before{content:"\f424"}.fa-expand-arrows-alt:before{content:"\f31e"}.fa-expeditedssl:before{content:"\f23e"}.fa-external-link-alt:before{content:"\f35d"}.fa-external-link-square-alt:before{content:"\f360"}.fa-eye:before{content:"\f06e"}.fa-eye-dropper:before{content:"\f1fb"}.fa-eye-slash:before{content:"\f070"}.fa-facebook:before{content:"\f09a"}.fa-facebook-f:before{content:"\f39e"}.fa-facebook-messenger:before{content:"\f39f"}.fa-facebook-square:before{content:"\f082"}.fa-fan:before{content:"\f863"}.fa-fantasy-flight-games:before{content:"\f6dc"}.fa-fast-backward:before{content:"\f049"}.fa-fast-forward:before{content:"\f050"}.fa-fax:before{content:"\f1ac"}.fa-feather:before{content:"\f52d"}.fa-feather-alt:before{content:"\f56b"}.fa-fedex:before{content:"\f797"}.fa-fedora:before{content:"\f798"}.fa-female:before{content:"\f182"}.fa-fighter-jet:before{content:"\f0fb"}.fa-figma:before{content:"\f799"}.fa-file:before{content:"\f15b"}.fa-file-alt:before{content:"\f15c"}.fa-file-archive:before{content:"\f1c6"}.fa-file-audio:before{content:"\f1c7"}.fa-file-code:before{content:"\f1c9"}.fa-file-contract:before{content:"\f56c"}.fa-file-csv:before{content:"\f6dd"}.fa-file-download:before{content:"\f56d"}.fa-file-excel:before{content:"\f1c3"}.fa-file-export:before{content:"\f56e"}.fa-file-image:before{content:"\f1c5"}.fa-file-import:before{content:"\f56f"}.fa-file-invoice:before{content:"\f570"}.fa-file-invoice-dollar:before{content:"\f571"}.fa-file-medical:before{content:"\f477"}.fa-file-medical-alt:before{content:"\f478"}.fa-file-pdf:before{content:"\f1c1"}.fa-file-powerpoint:before{content:"\f1c4"}.fa-file-prescription:before{content:"\f572"}.fa-file-signature:before{content:"\f573"}.fa-file-upload:before{content:"\f574"}.fa-file-video:before{content:"\f1c8"}.fa-file-word:before{content:"\f1c2"}.fa-fill:before{content:"\f575"}.fa-fill-drip:before{content:"\f576"}.fa-film:before{content:"\f008"}.fa-filter:before{content:"\f0b0"}.fa-fingerprint:before{content:"\f577"}.fa-fire:before{content:"\f06d"}.fa-fire-alt:before{content:"\f7e4"}.fa-fire-extinguisher:before{content:"\f134"}.fa-firefox:before{content:"\f269"}.fa-firefox-browser:before{content:"\f907"}.fa-first-aid:before{content:"\f479"}.fa-first-order:before{content:"\f2b0"}.fa-first-order-alt:before{content:"\f50a"}.fa-firstdraft:before{content:"\f3a1"}.fa-fish:before{content:"\f578"}.fa-fist-raised:before{content:"\f6de"}.fa-flag:before{content:"\f024"}.fa-flag-checkered:before{content:"\f11e"}.fa-flag-usa:before{content:"\f74d"}.fa-flask:before{content:"\f0c3"}.fa-flickr:before{content:"\f16e"}.fa-flipboard:before{content:"\f44d"}.fa-flushed:before{content:"\f579"}.fa-fly:before{content:"\f417"}.fa-folder:before{content:"\f07b"}.fa-folder-minus:before{content:"\f65d"}.fa-folder-open:before{content:"\f07c"}.fa-folder-plus:before{content:"\f65e"}.fa-font:before{content:"\f031"}.fa-font-awesome:before{content:"\f2b4"}.fa-font-awesome-alt:before{content:"\f35c"}.fa-font-awesome-flag:before{content:"\f425"}.fa-font-awesome-logo-full:before{content:"\f4e6"}.fa-fonticons:before{content:"\f280"}.fa-fonticons-fi:before{content:"\f3a2"}.fa-football-ball:before{content:"\f44e"}.fa-fort-awesome:before{content:"\f286"}.fa-fort-awesome-alt:before{content:"\f3a3"}.fa-forumbee:before{content:"\f211"}.fa-forward:before{content:"\f04e"}.fa-foursquare:before{content:"\f180"}.fa-free-code-camp:before{content:"\f2c5"}.fa-freebsd:before{content:"\f3a4"}.fa-frog:before{content:"\f52e"}.fa-frown:before{content:"\f119"}.fa-frown-open:before{content:"\f57a"}.fa-fulcrum:before{content:"\f50b"}.fa-funnel-dollar:before{content:"\f662"}.fa-futbol:before{content:"\f1e3"}.fa-galactic-republic:before{content:"\f50c"}.fa-galactic-senate:before{content:"\f50d"}.fa-gamepad:before{content:"\f11b"}.fa-gas-pump:before{content:"\f52f"}.fa-gavel:before{content:"\f0e3"}.fa-gem:before{content:"\f3a5"}.fa-genderless:before{content:"\f22d"}.fa-get-pocket:before{content:"\f265"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-ghost:before{content:"\f6e2"}.fa-gift:before{content:"\f06b"}.fa-gifts:before{content:"\f79c"}.fa-git:before{content:"\f1d3"}.fa-git-alt:before{content:"\f841"}.fa-git-square:before{content:"\f1d2"}.fa-github:before{content:"\f09b"}.fa-github-alt:before{content:"\f113"}.fa-github-square:before{content:"\f092"}.fa-gitkraken:before{content:"\f3a6"}.fa-gitlab:before{content:"\f296"}.fa-gitter:before{content:"\f426"}.fa-glass-cheers:before{content:"\f79f"}.fa-glass-martini:before{content:"\f000"}.fa-glass-martini-alt:before{content:"\f57b"}.fa-glass-whiskey:before{content:"\f7a0"}.fa-glasses:before{content:"\f530"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-globe:before{content:"\f0ac"}.fa-globe-africa:before{content:"\f57c"}.fa-globe-americas:before{content:"\f57d"}.fa-globe-asia:before{content:"\f57e"}.fa-globe-europe:before{content:"\f7a2"}.fa-gofore:before{content:"\f3a7"}.fa-golf-ball:before{content:"\f450"}.fa-goodreads:before{content:"\f3a8"}.fa-goodreads-g:before{content:"\f3a9"}.fa-google:before{content:"\f1a0"}.fa-google-drive:before{content:"\f3aa"}.fa-google-play:before{content:"\f3ab"}.fa-google-plus:before{content:"\f2b3"}.fa-google-plus-g:before{content:"\f0d5"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-wallet:before{content:"\f1ee"}.fa-gopuram:before{content:"\f664"}.fa-graduation-cap:before{content:"\f19d"}.fa-gratipay:before{content:"\f184"}.fa-grav:before{content:"\f2d6"}.fa-greater-than:before{content:"\f531"}.fa-greater-than-equal:before{content:"\f532"}.fa-grimace:before{content:"\f57f"}.fa-grin:before{content:"\f580"}.fa-grin-alt:before{content:"\f581"}.fa-grin-beam:before{content:"\f582"}.fa-grin-beam-sweat:before{content:"\f583"}.fa-grin-hearts:before{content:"\f584"}.fa-grin-squint:before{content:"\f585"}.fa-grin-squint-tears:before{content:"\f586"}.fa-grin-stars:before{content:"\f587"}.fa-grin-tears:before{content:"\f588"}.fa-grin-tongue:before{content:"\f589"}.fa-grin-tongue-squint:before{content:"\f58a"}.fa-grin-tongue-wink:before{content:"\f58b"}.fa-grin-wink:before{content:"\f58c"}.fa-grip-horizontal:before{content:"\f58d"}.fa-grip-lines:before{content:"\f7a4"}.fa-grip-lines-vertical:before{content:"\f7a5"}.fa-grip-vertical:before{content:"\f58e"}.fa-gripfire:before{content:"\f3ac"}.fa-grunt:before{content:"\f3ad"}.fa-guitar:before{content:"\f7a6"}.fa-gulp:before{content:"\f3ae"}.fa-h-square:before{content:"\f0fd"}.fa-hacker-news:before{content:"\f1d4"}.fa-hacker-news-square:before{content:"\f3af"}.fa-hackerrank:before{content:"\f5f7"}.fa-hamburger:before{content:"\f805"}.fa-hammer:before{content:"\f6e3"}.fa-hamsa:before{content:"\f665"}.fa-hand-holding:before{content:"\f4bd"}.fa-hand-holding-heart:before{content:"\f4be"}.fa-hand-holding-usd:before{content:"\f4c0"}.fa-hand-lizard:before{content:"\f258"}.fa-hand-middle-finger:before{content:"\f806"}.fa-hand-paper:before{content:"\f256"}.fa-hand-peace:before{content:"\f25b"}.fa-hand-point-down:before{content:"\f0a7"}.fa-hand-point-left:before{content:"\f0a5"}.fa-hand-point-right:before{content:"\f0a4"}.fa-hand-point-up:before{content:"\f0a6"}.fa-hand-pointer:before{content:"\f25a"}.fa-hand-rock:before{content:"\f255"}.fa-hand-scissors:before{content:"\f257"}.fa-hand-spock:before{content:"\f259"}.fa-hands:before{content:"\f4c2"}.fa-hands-helping:before{content:"\f4c4"}.fa-handshake:before{content:"\f2b5"}.fa-hanukiah:before{content:"\f6e6"}.fa-hard-hat:before{content:"\f807"}.fa-hashtag:before{content:"\f292"}.fa-hat-cowboy:before{content:"\f8c0"}.fa-hat-cowboy-side:before{content:"\f8c1"}.fa-hat-wizard:before{content:"\f6e8"}.fa-hdd:before{content:"\f0a0"}.fa-heading:before{content:"\f1dc"}.fa-headphones:before{content:"\f025"}.fa-headphones-alt:before{content:"\f58f"}.fa-headset:before{content:"\f590"}.fa-heart:before{content:"\f004"}.fa-heart-broken:before{content:"\f7a9"}.fa-heartbeat:before{content:"\f21e"}.fa-helicopter:before{content:"\f533"}.fa-highlighter:before{content:"\f591"}.fa-hiking:before{content:"\f6ec"}.fa-hippo:before{content:"\f6ed"}.fa-hips:before{content:"\f452"}.fa-hire-a-helper:before{content:"\f3b0"}.fa-history:before{content:"\f1da"}.fa-hockey-puck:before{content:"\f453"}.fa-holly-berry:before{content:"\f7aa"}.fa-home:before{content:"\f015"}.fa-hooli:before{content:"\f427"}.fa-hornbill:before{content:"\f592"}.fa-horse:before{content:"\f6f0"}.fa-horse-head:before{content:"\f7ab"}.fa-hospital:before{content:"\f0f8"}.fa-hospital-alt:before{content:"\f47d"}.fa-hospital-symbol:before{content:"\f47e"}.fa-hot-tub:before{content:"\f593"}.fa-hotdog:before{content:"\f80f"}.fa-hotel:before{content:"\f594"}.fa-hotjar:before{content:"\f3b1"}.fa-hourglass:before{content:"\f254"}.fa-hourglass-end:before{content:"\f253"}.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-start:before{content:"\f251"}.fa-house-damage:before{content:"\f6f1"}.fa-houzz:before{content:"\f27c"}.fa-hryvnia:before{content:"\f6f2"}.fa-html5:before{content:"\f13b"}.fa-hubspot:before{content:"\f3b2"}.fa-i-cursor:before{content:"\f246"}.fa-ice-cream:before{content:"\f810"}.fa-icicles:before{content:"\f7ad"}.fa-icons:before{content:"\f86d"}.fa-id-badge:before{content:"\f2c1"}.fa-id-card:before{content:"\f2c2"}.fa-id-card-alt:before{content:"\f47f"}.fa-ideal:before{content:"\f913"}.fa-igloo:before{content:"\f7ae"}.fa-image:before{content:"\f03e"}.fa-images:before{content:"\f302"}.fa-imdb:before{content:"\f2d8"}.fa-inbox:before{content:"\f01c"}.fa-indent:before{content:"\f03c"}.fa-industry:before{content:"\f275"}.fa-infinity:before{content:"\f534"}.fa-info:before{content:"\f129"}.fa-info-circle:before{content:"\f05a"}.fa-instagram:before{content:"\f16d"}.fa-intercom:before{content:"\f7af"}.fa-internet-explorer:before{content:"\f26b"}.fa-invision:before{content:"\f7b0"}.fa-ioxhost:before{content:"\f208"}.fa-italic:before{content:"\f033"}.fa-itch-io:before{content:"\f83a"}.fa-itunes:before{content:"\f3b4"}.fa-itunes-note:before{content:"\f3b5"}.fa-java:before{content:"\f4e4"}.fa-jedi:before{content:"\f669"}.fa-jedi-order:before{content:"\f50e"}.fa-jenkins:before{content:"\f3b6"}.fa-jira:before{content:"\f7b1"}.fa-joget:before{content:"\f3b7"}.fa-joint:before{content:"\f595"}.fa-joomla:before{content:"\f1aa"}.fa-journal-whills:before{content:"\f66a"}.fa-js:before{content:"\f3b8"}.fa-js-square:before{content:"\f3b9"}.fa-jsfiddle:before{content:"\f1cc"}.fa-kaaba:before{content:"\f66b"}.fa-kaggle:before{content:"\f5fa"}.fa-key:before{content:"\f084"}.fa-keybase:before{content:"\f4f5"}.fa-keyboard:before{content:"\f11c"}.fa-keycdn:before{content:"\f3ba"}.fa-khanda:before{content:"\f66d"}.fa-kickstarter:before{content:"\f3bb"}.fa-kickstarter-k:before{content:"\f3bc"}.fa-kiss:before{content:"\f596"}.fa-kiss-beam:before{content:"\f597"}.fa-kiss-wink-heart:before{content:"\f598"}.fa-kiwi-bird:before{content:"\f535"}.fa-korvue:before{content:"\f42f"}.fa-landmark:before{content:"\f66f"}.fa-language:before{content:"\f1ab"}.fa-laptop:before{content:"\f109"}.fa-laptop-code:before{content:"\f5fc"}.fa-laptop-medical:before{content:"\f812"}.fa-laravel:before{content:"\f3bd"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-laugh:before{content:"\f599"}.fa-laugh-beam:before{content:"\f59a"}.fa-laugh-squint:before{content:"\f59b"}.fa-laugh-wink:before{content:"\f59c"}.fa-layer-group:before{content:"\f5fd"}.fa-leaf:before{content:"\f06c"}.fa-leanpub:before{content:"\f212"}.fa-lemon:before{content:"\f094"}.fa-less:before{content:"\f41d"}.fa-less-than:before{content:"\f536"}.fa-less-than-equal:before{content:"\f537"}.fa-level-down-alt:before{content:"\f3be"}.fa-level-up-alt:before{content:"\f3bf"}.fa-life-ring:before{content:"\f1cd"}.fa-lightbulb:before{content:"\f0eb"}.fa-line:before{content:"\f3c0"}.fa-link:before{content:"\f0c1"}.fa-linkedin:before{content:"\f08c"}.fa-linkedin-in:before{content:"\f0e1"}.fa-linode:before{content:"\f2b8"}.fa-linux:before{content:"\f17c"}.fa-lira-sign:before{content:"\f195"}.fa-list:before{content:"\f03a"}.fa-list-alt:before{content:"\f022"}.fa-list-ol:before{content:"\f0cb"}.fa-list-ul:before{content:"\f0ca"}.fa-location-arrow:before{content:"\f124"}.fa-lock:before{content:"\f023"}.fa-lock-open:before{content:"\f3c1"}.fa-long-arrow-alt-down:before{content:"\f309"}.fa-long-arrow-alt-left:before{content:"\f30a"}.fa-long-arrow-alt-right:before{content:"\f30b"}.fa-long-arrow-alt-up:before{content:"\f30c"}.fa-low-vision:before{content:"\f2a8"}.fa-luggage-cart:before{content:"\f59d"}.fa-lyft:before{content:"\f3c3"}.fa-magento:before{content:"\f3c4"}.fa-magic:before{content:"\f0d0"}.fa-magnet:before{content:"\f076"}.fa-mail-bulk:before{content:"\f674"}.fa-mailchimp:before{content:"\f59e"}.fa-male:before{content:"\f183"}.fa-mandalorian:before{content:"\f50f"}.fa-map:before{content:"\f279"}.fa-map-marked:before{content:"\f59f"}.fa-map-marked-alt:before{content:"\f5a0"}.fa-map-marker:before{content:"\f041"}.fa-map-marker-alt:before{content:"\f3c5"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-markdown:before{content:"\f60f"}.fa-marker:before{content:"\f5a1"}.fa-mars:before{content:"\f222"}.fa-mars-double:before{content:"\f227"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mask:before{content:"\f6fa"}.fa-mastodon:before{content:"\f4f6"}.fa-maxcdn:before{content:"\f136"}.fa-mdb:before{content:"\f8ca"}.fa-medal:before{content:"\f5a2"}.fa-medapps:before{content:"\f3c6"}.fa-medium:before{content:"\f23a"}.fa-medium-m:before{content:"\f3c7"}.fa-medkit:before{content:"\f0fa"}.fa-medrt:before{content:"\f3c8"}.fa-meetup:before{content:"\f2e0"}.fa-megaport:before{content:"\f5a3"}.fa-meh:before{content:"\f11a"}.fa-meh-blank:before{content:"\f5a4"}.fa-meh-rolling-eyes:before{content:"\f5a5"}.fa-memory:before{content:"\f538"}.fa-mendeley:before{content:"\f7b3"}.fa-menorah:before{content:"\f676"}.fa-mercury:before{content:"\f223"}.fa-meteor:before{content:"\f753"}.fa-microblog:before{content:"\f91a"}.fa-microchip:before{content:"\f2db"}.fa-microphone:before{content:"\f130"}.fa-microphone-alt:before{content:"\f3c9"}.fa-microphone-alt-slash:before{content:"\f539"}.fa-microphone-slash:before{content:"\f131"}.fa-microscope:before{content:"\f610"}.fa-microsoft:before{content:"\f3ca"}.fa-minus:before{content:"\f068"}.fa-minus-circle:before{content:"\f056"}.fa-minus-square:before{content:"\f146"}.fa-mitten:before{content:"\f7b5"}.fa-mix:before{content:"\f3cb"}.fa-mixcloud:before{content:"\f289"}.fa-mizuni:before{content:"\f3cc"}.fa-mobile:before{content:"\f10b"}.fa-mobile-alt:before{content:"\f3cd"}.fa-modx:before{content:"\f285"}.fa-monero:before{content:"\f3d0"}.fa-money-bill:before{content:"\f0d6"}.fa-money-bill-alt:before{content:"\f3d1"}.fa-money-bill-wave:before{content:"\f53a"}.fa-money-bill-wave-alt:before{content:"\f53b"}.fa-money-check:before{content:"\f53c"}.fa-money-check-alt:before{content:"\f53d"}.fa-monument:before{content:"\f5a6"}.fa-moon:before{content:"\f186"}.fa-mortar-pestle:before{content:"\f5a7"}.fa-mosque:before{content:"\f678"}.fa-motorcycle:before{content:"\f21c"}.fa-mountain:before{content:"\f6fc"}.fa-mouse:before{content:"\f8cc"}.fa-mouse-pointer:before{content:"\f245"}.fa-mug-hot:before{content:"\f7b6"}.fa-music:before{content:"\f001"}.fa-napster:before{content:"\f3d2"}.fa-neos:before{content:"\f612"}.fa-network-wired:before{content:"\f6ff"}.fa-neuter:before{content:"\f22c"}.fa-newspaper:before{content:"\f1ea"}.fa-nimblr:before{content:"\f5a8"}.fa-node:before{content:"\f419"}.fa-node-js:before{content:"\f3d3"}.fa-not-equal:before{content:"\f53e"}.fa-notes-medical:before{content:"\f481"}.fa-npm:before{content:"\f3d4"}.fa-ns8:before{content:"\f3d5"}.fa-nutritionix:before{content:"\f3d6"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-oil-can:before{content:"\f613"}.fa-old-republic:before{content:"\f510"}.fa-om:before{content:"\f679"}.fa-opencart:before{content:"\f23d"}.fa-openid:before{content:"\f19b"}.fa-opera:before{content:"\f26a"}.fa-optin-monster:before{content:"\f23c"}.fa-orcid:before{content:"\f8d2"}.fa-osi:before{content:"\f41a"}.fa-otter:before{content:"\f700"}.fa-outdent:before{content:"\f03b"}.fa-page4:before{content:"\f3d7"}.fa-pagelines:before{content:"\f18c"}.fa-pager:before{content:"\f815"}.fa-paint-brush:before{content:"\f1fc"}.fa-paint-roller:before{content:"\f5aa"}.fa-palette:before{content:"\f53f"}.fa-palfed:before{content:"\f3d8"}.fa-pallet:before{content:"\f482"}.fa-paper-plane:before{content:"\f1d8"}.fa-paperclip:before{content:"\f0c6"}.fa-parachute-box:before{content:"\f4cd"}.fa-paragraph:before{content:"\f1dd"}.fa-parking:before{content:"\f540"}.fa-passport:before{content:"\f5ab"}.fa-pastafarianism:before{content:"\f67b"}.fa-paste:before{content:"\f0ea"}.fa-patreon:before{content:"\f3d9"}.fa-pause:before{content:"\f04c"}.fa-pause-circle:before{content:"\f28b"}.fa-paw:before{content:"\f1b0"}.fa-paypal:before{content:"\f1ed"}.fa-peace:before{content:"\f67c"}.fa-pen:before{content:"\f304"}.fa-pen-alt:before{content:"\f305"}.fa-pen-fancy:before{content:"\f5ac"}.fa-pen-nib:before{content:"\f5ad"}.fa-pen-square:before{content:"\f14b"}.fa-pencil-alt:before{content:"\f303"}.fa-pencil-ruler:before{content:"\f5ae"}.fa-penny-arcade:before{content:"\f704"}.fa-people-carry:before{content:"\f4ce"}.fa-pepper-hot:before{content:"\f816"}.fa-percent:before{content:"\f295"}.fa-percentage:before{content:"\f541"}.fa-periscope:before{content:"\f3da"}.fa-person-booth:before{content:"\f756"}.fa-phabricator:before{content:"\f3db"}.fa-phoenix-framework:before{content:"\f3dc"}.fa-phoenix-squadron:before{content:"\f511"}.fa-phone:before{content:"\f095"}.fa-phone-alt:before{content:"\f879"}.fa-phone-slash:before{content:"\f3dd"}.fa-phone-square:before{content:"\f098"}.fa-phone-square-alt:before{content:"\f87b"}.fa-phone-volume:before{content:"\f2a0"}.fa-photo-video:before{content:"\f87c"}.fa-php:before{content:"\f457"}.fa-pied-piper:before{content:"\f2ae"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-pied-piper-hat:before{content:"\f4e5"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-square:before{content:"\f91e"}.fa-piggy-bank:before{content:"\f4d3"}.fa-pills:before{content:"\f484"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-p:before{content:"\f231"}.fa-pinterest-square:before{content:"\f0d3"}.fa-pizza-slice:before{content:"\f818"}.fa-place-of-worship:before{content:"\f67f"}.fa-plane:before{content:"\f072"}.fa-plane-arrival:before{content:"\f5af"}.fa-plane-departure:before{content:"\f5b0"}.fa-play:before{content:"\f04b"}.fa-play-circle:before{content:"\f144"}.fa-playstation:before{content:"\f3df"}.fa-plug:before{content:"\f1e6"}.fa-plus:before{content:"\f067"}.fa-plus-circle:before{content:"\f055"}.fa-plus-square:before{content:"\f0fe"}.fa-podcast:before{content:"\f2ce"}.fa-poll:before{content:"\f681"}.fa-poll-h:before{content:"\f682"}.fa-poo:before{content:"\f2fe"}.fa-poo-storm:before{content:"\f75a"}.fa-poop:before{content:"\f619"}.fa-portrait:before{content:"\f3e0"}.fa-pound-sign:before{content:"\f154"}.fa-power-off:before{content:"\f011"}.fa-pray:before{content:"\f683"}.fa-praying-hands:before{content:"\f684"}.fa-prescription:before{content:"\f5b1"}.fa-prescription-bottle:before{content:"\f485"}.fa-prescription-bottle-alt:before{content:"\f486"}.fa-print:before{content:"\f02f"}.fa-procedures:before{content:"\f487"}.fa-product-hunt:before{content:"\f288"}.fa-project-diagram:before{content:"\f542"}.fa-pushed:before{content:"\f3e1"}.fa-puzzle-piece:before{content:"\f12e"}.fa-python:before{content:"\f3e2"}.fa-qq:before{content:"\f1d6"}.fa-qrcode:before{content:"\f029"}.fa-question:before{content:"\f128"}.fa-question-circle:before{content:"\f059"}.fa-quidditch:before{content:"\f458"}.fa-quinscape:before{content:"\f459"}.fa-quora:before{content:"\f2c4"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-quran:before{content:"\f687"}.fa-r-project:before{content:"\f4f7"}.fa-radiation:before{content:"\f7b9"}.fa-radiation-alt:before{content:"\f7ba"}.fa-rainbow:before{content:"\f75b"}.fa-random:before{content:"\f074"}.fa-raspberry-pi:before{content:"\f7bb"}.fa-ravelry:before{content:"\f2d9"}.fa-react:before{content:"\f41b"}.fa-reacteurope:before{content:"\f75d"}.fa-readme:before{content:"\f4d5"}.fa-rebel:before{content:"\f1d0"}.fa-receipt:before{content:"\f543"}.fa-record-vinyl:before{content:"\f8d9"}.fa-recycle:before{content:"\f1b8"}.fa-red-river:before{content:"\f3e3"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-alien:before{content:"\f281"}.fa-reddit-square:before{content:"\f1a2"}.fa-redhat:before{content:"\f7bc"}.fa-redo:before{content:"\f01e"}.fa-redo-alt:before{content:"\f2f9"}.fa-registered:before{content:"\f25d"}.fa-remove-format:before{content:"\f87d"}.fa-renren:before{content:"\f18b"}.fa-reply:before{content:"\f3e5"}.fa-reply-all:before{content:"\f122"}.fa-replyd:before{content:"\f3e6"}.fa-republican:before{content:"\f75e"}.fa-researchgate:before{content:"\f4f8"}.fa-resolving:before{content:"\f3e7"}.fa-restroom:before{content:"\f7bd"}.fa-retweet:before{content:"\f079"}.fa-rev:before{content:"\f5b2"}.fa-ribbon:before{content:"\f4d6"}.fa-ring:before{content:"\f70b"}.fa-road:before{content:"\f018"}.fa-robot:before{content:"\f544"}.fa-rocket:before{content:"\f135"}.fa-rocketchat:before{content:"\f3e8"}.fa-rockrms:before{content:"\f3e9"}.fa-route:before{content:"\f4d7"}.fa-rss:before{content:"\f09e"}.fa-rss-square:before{content:"\f143"}.fa-ruble-sign:before{content:"\f158"}.fa-ruler:before{content:"\f545"}.fa-ruler-combined:before{content:"\f546"}.fa-ruler-horizontal:before{content:"\f547"}.fa-ruler-vertical:before{content:"\f548"}.fa-running:before{content:"\f70c"}.fa-rupee-sign:before{content:"\f156"}.fa-sad-cry:before{content:"\f5b3"}.fa-sad-tear:before{content:"\f5b4"}.fa-safari:before{content:"\f267"}.fa-salesforce:before{content:"\f83b"}.fa-sass:before{content:"\f41e"}.fa-satellite:before{content:"\f7bf"}.fa-satellite-dish:before{content:"\f7c0"}.fa-save:before{content:"\f0c7"}.fa-schlix:before{content:"\f3ea"}.fa-school:before{content:"\f549"}.fa-screwdriver:before{content:"\f54a"}.fa-scribd:before{content:"\f28a"}.fa-scroll:before{content:"\f70e"}.fa-sd-card:before{content:"\f7c2"}.fa-search:before{content:"\f002"}.fa-search-dollar:before{content:"\f688"}.fa-search-location:before{content:"\f689"}.fa-search-minus:before{content:"\f010"}.fa-search-plus:before{content:"\f00e"}.fa-searchengin:before{content:"\f3eb"}.fa-seedling:before{content:"\f4d8"}.fa-sellcast:before{content:"\f2da"}.fa-sellsy:before{content:"\f213"}.fa-server:before{content:"\f233"}.fa-servicestack:before{content:"\f3ec"}.fa-shapes:before{content:"\f61f"}.fa-share:before{content:"\f064"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-share-square:before{content:"\f14d"}.fa-shekel-sign:before{content:"\f20b"}.fa-shield-alt:before{content:"\f3ed"}.fa-ship:before{content:"\f21a"}.fa-shipping-fast:before{content:"\f48b"}.fa-shirtsinbulk:before{content:"\f214"}.fa-shoe-prints:before{content:"\f54b"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-shopping-cart:before{content:"\f07a"}.fa-shopware:before{content:"\f5b5"}.fa-shower:before{content:"\f2cc"}.fa-shuttle-van:before{content:"\f5b6"}.fa-sign:before{content:"\f4d9"}.fa-sign-in-alt:before{content:"\f2f6"}.fa-sign-language:before{content:"\f2a7"}.fa-sign-out-alt:before{content:"\f2f5"}.fa-signal:before{content:"\f012"}.fa-signature:before{content:"\f5b7"}.fa-sim-card:before{content:"\f7c4"}.fa-simplybuilt:before{content:"\f215"}.fa-sistrix:before{content:"\f3ee"}.fa-sitemap:before{content:"\f0e8"}.fa-sith:before{content:"\f512"}.fa-skating:before{content:"\f7c5"}.fa-sketch:before{content:"\f7c6"}.fa-skiing:before{content:"\f7c9"}.fa-skiing-nordic:before{content:"\f7ca"}.fa-skull:before{content:"\f54c"}.fa-skull-crossbones:before{content:"\f714"}.fa-skyatlas:before{content:"\f216"}.fa-skype:before{content:"\f17e"}.fa-slack:before{content:"\f198"}.fa-slack-hash:before{content:"\f3ef"}.fa-slash:before{content:"\f715"}.fa-sleigh:before{content:"\f7cc"}.fa-sliders-h:before{content:"\f1de"}.fa-slideshare:before{content:"\f1e7"}.fa-smile:before{content:"\f118"}.fa-smile-beam:before{content:"\f5b8"}.fa-smile-wink:before{content:"\f4da"}.fa-smog:before{content:"\f75f"}.fa-smoking:before{content:"\f48d"}.fa-smoking-ban:before{content:"\f54d"}.fa-sms:before{content:"\f7cd"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-snowboarding:before{content:"\f7ce"}.fa-snowflake:before{content:"\f2dc"}.fa-snowman:before{content:"\f7d0"}.fa-snowplow:before{content:"\f7d2"}.fa-socks:before{content:"\f696"}.fa-solar-panel:before{content:"\f5ba"}.fa-sort:before{content:"\f0dc"}.fa-sort-alpha-down:before{content:"\f15d"}.fa-sort-alpha-down-alt:before{content:"\f881"}.fa-sort-alpha-up:before{content:"\f15e"}.fa-sort-alpha-up-alt:before{content:"\f882"}.fa-sort-amount-down:before{content:"\f160"}.fa-sort-amount-down-alt:before{content:"\f884"}.fa-sort-amount-up:before{content:"\f161"}.fa-sort-amount-up-alt:before{content:"\f885"}.fa-sort-down:before{content:"\f0dd"}.fa-sort-numeric-down:before{content:"\f162"}.fa-sort-numeric-down-alt:before{content:"\f886"}.fa-sort-numeric-up:before{content:"\f163"}.fa-sort-numeric-up-alt:before{content:"\f887"}.fa-sort-up:before{content:"\f0de"}.fa-soundcloud:before{content:"\f1be"}.fa-sourcetree:before{content:"\f7d3"}.fa-spa:before{content:"\f5bb"}.fa-space-shuttle:before{content:"\f197"}.fa-speakap:before{content:"\f3f3"}.fa-speaker-deck:before{content:"\f83c"}.fa-spell-check:before{content:"\f891"}.fa-spider:before{content:"\f717"}.fa-spinner:before{content:"\f110"}.fa-splotch:before{content:"\f5bc"}.fa-spotify:before{content:"\f1bc"}.fa-spray-can:before{content:"\f5bd"}.fa-square:before{content:"\f0c8"}.fa-square-full:before{content:"\f45c"}.fa-square-root-alt:before{content:"\f698"}.fa-squarespace:before{content:"\f5be"}.fa-stack-exchange:before{content:"\f18d"}.fa-stack-overflow:before{content:"\f16c"}.fa-stackpath:before{content:"\f842"}.fa-stamp:before{content:"\f5bf"}.fa-star:before{content:"\f005"}.fa-star-and-crescent:before{content:"\f699"}.fa-star-half:before{content:"\f089"}.fa-star-half-alt:before{content:"\f5c0"}.fa-star-of-david:before{content:"\f69a"}.fa-star-of-life:before{content:"\f621"}.fa-staylinked:before{content:"\f3f5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-steam-symbol:before{content:"\f3f6"}.fa-step-backward:before{content:"\f048"}.fa-step-forward:before{content:"\f051"}.fa-stethoscope:before{content:"\f0f1"}.fa-sticker-mule:before{content:"\f3f7"}.fa-sticky-note:before{content:"\f249"}.fa-stop:before{content:"\f04d"}.fa-stop-circle:before{content:"\f28d"}.fa-stopwatch:before{content:"\f2f2"}.fa-store:before{content:"\f54e"}.fa-store-alt:before{content:"\f54f"}.fa-strava:before{content:"\f428"}.fa-stream:before{content:"\f550"}.fa-street-view:before{content:"\f21d"}.fa-strikethrough:before{content:"\f0cc"}.fa-stripe:before{content:"\f429"}.fa-stripe-s:before{content:"\f42a"}.fa-stroopwafel:before{content:"\f551"}.fa-studiovinari:before{content:"\f3f8"}.fa-stumbleupon:before{content:"\f1a4"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-subscript:before{content:"\f12c"}.fa-subway:before{content:"\f239"}.fa-suitcase:before{content:"\f0f2"}.fa-suitcase-rolling:before{content:"\f5c1"}.fa-sun:before{content:"\f185"}.fa-superpowers:before{content:"\f2dd"}.fa-superscript:before{content:"\f12b"}.fa-supple:before{content:"\f3f9"}.fa-surprise:before{content:"\f5c2"}.fa-suse:before{content:"\f7d6"}.fa-swatchbook:before{content:"\f5c3"}.fa-swift:before{content:"\f8e1"}.fa-swimmer:before{content:"\f5c4"}.fa-swimming-pool:before{content:"\f5c5"}.fa-symfony:before{content:"\f83d"}.fa-synagogue:before{content:"\f69b"}.fa-sync:before{content:"\f021"}.fa-sync-alt:before{content:"\f2f1"}.fa-syringe:before{content:"\f48e"}.fa-table:before{content:"\f0ce"}.fa-table-tennis:before{content:"\f45d"}.fa-tablet:before{content:"\f10a"}.fa-tablet-alt:before{content:"\f3fa"}.fa-tablets:before{content:"\f490"}.fa-tachometer-alt:before{content:"\f3fd"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-tape:before{content:"\f4db"}.fa-tasks:before{content:"\f0ae"}.fa-taxi:before{content:"\f1ba"}.fa-teamspeak:before{content:"\f4f9"}.fa-teeth:before{content:"\f62e"}.fa-teeth-open:before{content:"\f62f"}.fa-telegram:before{content:"\f2c6"}.fa-telegram-plane:before{content:"\f3fe"}.fa-temperature-high:before{content:"\f769"}.fa-temperature-low:before{content:"\f76b"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-tenge:before{content:"\f7d7"}.fa-terminal:before{content:"\f120"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-th:before{content:"\f00a"}.fa-th-large:before{content:"\f009"}.fa-th-list:before{content:"\f00b"}.fa-the-red-yeti:before{content:"\f69d"}.fa-theater-masks:before{content:"\f630"}.fa-themeco:before{content:"\f5c6"}.fa-themeisle:before{content:"\f2b2"}.fa-thermometer:before{content:"\f491"}.fa-thermometer-empty:before{content:"\f2cb"}.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-think-peaks:before{content:"\f731"}.fa-thumbs-down:before{content:"\f165"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbtack:before{content:"\f08d"}.fa-ticket-alt:before{content:"\f3ff"}.fa-times:before{content:"\f00d"}.fa-times-circle:before{content:"\f057"}.fa-tint:before{content:"\f043"}.fa-tint-slash:before{content:"\f5c7"}.fa-tired:before{content:"\f5c8"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-toilet:before{content:"\f7d8"}.fa-toilet-paper:before{content:"\f71e"}.fa-toolbox:before{content:"\f552"}.fa-tools:before{content:"\f7d9"}.fa-tooth:before{content:"\f5c9"}.fa-torah:before{content:"\f6a0"}.fa-torii-gate:before{content:"\f6a1"}.fa-tractor:before{content:"\f722"}.fa-trade-federation:before{content:"\f513"}.fa-trademark:before{content:"\f25c"}.fa-traffic-light:before{content:"\f637"}.fa-trailer:before{content:"\f941"}.fa-train:before{content:"\f238"}.fa-tram:before{content:"\f7da"}.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-trash:before{content:"\f1f8"}.fa-trash-alt:before{content:"\f2ed"}.fa-trash-restore:before{content:"\f829"}.fa-trash-restore-alt:before{content:"\f82a"}.fa-tree:before{content:"\f1bb"}.fa-trello:before{content:"\f181"}.fa-tripadvisor:before{content:"\f262"}.fa-trophy:before{content:"\f091"}.fa-truck:before{content:"\f0d1"}.fa-truck-loading:before{content:"\f4de"}.fa-truck-monster:before{content:"\f63b"}.fa-truck-moving:before{content:"\f4df"}.fa-truck-pickup:before{content:"\f63c"}.fa-tshirt:before{content:"\f553"}.fa-tty:before{content:"\f1e4"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-tv:before{content:"\f26c"}.fa-twitch:before{content:"\f1e8"}.fa-twitter:before{content:"\f099"}.fa-twitter-square:before{content:"\f081"}.fa-typo3:before{content:"\f42b"}.fa-uber:before{content:"\f402"}.fa-ubuntu:before{content:"\f7df"}.fa-uikit:before{content:"\f403"}.fa-umbraco:before{content:"\f8e8"}.fa-umbrella:before{content:"\f0e9"}.fa-umbrella-beach:before{content:"\f5ca"}.fa-underline:before{content:"\f0cd"}.fa-undo:before{content:"\f0e2"}.fa-undo-alt:before{content:"\f2ea"}.fa-uniregistry:before{content:"\f404"}.fa-unity:before{content:"\f949"}.fa-universal-access:before{content:"\f29a"}.fa-university:before{content:"\f19c"}.fa-unlink:before{content:"\f127"}.fa-unlock:before{content:"\f09c"}.fa-unlock-alt:before{content:"\f13e"}.fa-untappd:before{content:"\f405"}.fa-upload:before{content:"\f093"}.fa-ups:before{content:"\f7e0"}.fa-usb:before{content:"\f287"}.fa-user:before{content:"\f007"}.fa-user-alt:before{content:"\f406"}.fa-user-alt-slash:before{content:"\f4fa"}.fa-user-astronaut:before{content:"\f4fb"}.fa-user-check:before{content:"\f4fc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-clock:before{content:"\f4fd"}.fa-user-cog:before{content:"\f4fe"}.fa-user-edit:before{content:"\f4ff"}.fa-user-friends:before{content:"\f500"}.fa-user-graduate:before{content:"\f501"}.fa-user-injured:before{content:"\f728"}.fa-user-lock:before{content:"\f502"}.fa-user-md:before{content:"\f0f0"}.fa-user-minus:before{content:"\f503"}.fa-user-ninja:before{content:"\f504"}.fa-user-nurse:before{content:"\f82f"}.fa-user-plus:before{content:"\f234"}.fa-user-secret:before{content:"\f21b"}.fa-user-shield:before{content:"\f505"}.fa-user-slash:before{content:"\f506"}.fa-user-tag:before{content:"\f507"}.fa-user-tie:before{content:"\f508"}.fa-user-times:before{content:"\f235"}.fa-users:before{content:"\f0c0"}.fa-users-cog:before{content:"\f509"}.fa-usps:before{content:"\f7e1"}.fa-ussunnah:before{content:"\f407"}.fa-utensil-spoon:before{content:"\f2e5"}.fa-utensils:before{content:"\f2e7"}.fa-vaadin:before{content:"\f408"}.fa-vector-square:before{content:"\f5cb"}.fa-venus:before{content:"\f221"}.fa-venus-double:before{content:"\f226"}.fa-venus-mars:before{content:"\f228"}.fa-viacoin:before{content:"\f237"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-vial:before{content:"\f492"}.fa-vials:before{content:"\f493"}.fa-viber:before{content:"\f409"}.fa-video:before{content:"\f03d"}.fa-video-slash:before{content:"\f4e2"}.fa-vihara:before{content:"\f6a7"}.fa-vimeo:before{content:"\f40a"}.fa-vimeo-square:before{content:"\f194"}.fa-vimeo-v:before{content:"\f27d"}.fa-vine:before{content:"\f1ca"}.fa-vk:before{content:"\f189"}.fa-vnv:before{content:"\f40b"}.fa-voicemail:before{content:"\f897"}.fa-volleyball-ball:before{content:"\f45f"}.fa-volume-down:before{content:"\f027"}.fa-volume-mute:before{content:"\f6a9"}.fa-volume-off:before{content:"\f026"}.fa-volume-up:before{content:"\f028"}.fa-vote-yea:before{content:"\f772"}.fa-vr-cardboard:before{content:"\f729"}.fa-vuejs:before{content:"\f41f"}.fa-walking:before{content:"\f554"}.fa-wallet:before{content:"\f555"}.fa-warehouse:before{content:"\f494"}.fa-water:before{content:"\f773"}.fa-wave-square:before{content:"\f83e"}.fa-waze:before{content:"\f83f"}.fa-weebly:before{content:"\f5cc"}.fa-weibo:before{content:"\f18a"}.fa-weight:before{content:"\f496"}.fa-weight-hanging:before{content:"\f5cd"}.fa-weixin:before{content:"\f1d7"}.fa-whatsapp:before{content:"\f232"}.fa-whatsapp-square:before{content:"\f40c"}.fa-wheelchair:before{content:"\f193"}.fa-whmcs:before{content:"\f40d"}.fa-wifi:before{content:"\f1eb"}.fa-wikipedia-w:before{content:"\f266"}.fa-wind:before{content:"\f72e"}.fa-window-close:before{content:"\f410"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-windows:before{content:"\f17a"}.fa-wine-bottle:before{content:"\f72f"}.fa-wine-glass:before{content:"\f4e3"}.fa-wine-glass-alt:before{content:"\f5ce"}.fa-wix:before{content:"\f5cf"}.fa-wizards-of-the-coast:before{content:"\f730"}.fa-wolf-pack-battalion:before{content:"\f514"}.fa-won-sign:before{content:"\f159"}.fa-wordpress:before{content:"\f19a"}.fa-wordpress-simple:before{content:"\f411"}.fa-wpbeginner:before{content:"\f297"}.fa-wpexplorer:before{content:"\f2de"}.fa-wpforms:before{content:"\f298"}.fa-wpressr:before{content:"\f3e4"}.fa-wrench:before{content:"\f0ad"}.fa-x-ray:before{content:"\f497"}.fa-xbox:before{content:"\f412"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-y-combinator:before{content:"\f23b"}.fa-yahoo:before{content:"\f19e"}.fa-yammer:before{content:"\f840"}.fa-yandex:before{content:"\f413"}.fa-yandex-international:before{content:"\f414"}.fa-yarn:before{content:"\f7e3"}.fa-yelp:before{content:"\f1e9"}.fa-yen-sign:before{content:"\f157"}.fa-yin-yang:before{content:"\f6ad"}.fa-yoast:before{content:"\f2b1"}.fa-youtube:before{content:"\f167"}.fa-youtube-square:before{content:"\f431"}.fa-zhihu:before{content:"\f63f"}.sr-only{border:0;clip:rect(0,0,0,0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.sr-only-focusable:active,.sr-only-focusable:focus{clip:auto;height:auto;margin:0;overflow:visible;position:static;width:auto}@font-face{font-family:"Font Awesome 5 Brands";font-style:normal;font-weight:normal;font-display:auto;src:url(../webfonts/fa-brands-400.eot);src:url(../webfonts/fa-brands-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-brands-400.woff2) format("woff2"),url(../webfonts/fa-brands-400.woff) format("woff"),url(../webfonts/fa-brands-400.ttf) format("truetype"),url(../webfonts/fa-brands-400.svg#fontawesome) format("svg")}.fab{font-family:"Font Awesome 5 Brands"}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:400;font-display:auto;src:url(../webfonts/fa-regular-400.eot);src:url(../webfonts/fa-regular-400.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-regular-400.woff2) format("woff2"),url(../webfonts/fa-regular-400.woff) format("woff"),url(../webfonts/fa-regular-400.ttf) format("truetype"),url(../webfonts/fa-regular-400.svg#fontawesome) format("svg")}.far{font-weight:400}@font-face{font-family:"Font Awesome 5 Free";font-style:normal;font-weight:900;font-display:auto;src:url(../webfonts/fa-solid-900.eot);src:url(../webfonts/fa-solid-900.eot?#iefix) format("embedded-opentype"),url(../webfonts/fa-solid-900.woff2) format("woff2"),url(../webfonts/fa-solid-900.woff) format("woff"),url(../webfonts/fa-solid-900.ttf) format("truetype"),url(../webfonts/fa-solid-900.svg#fontawesome) format("svg")}.fa,.far,.fas{font-family:"Font Awesome 5 Free"}.fa,.fas{font-weight:900} \ No newline at end of file diff --git a/public/lib/font-awesome/webfonts/fa-brands-400.eot b/public/lib/font-awesome/webfonts/fa-brands-400.eot new file mode 100644 index 0000000..baf4057 Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-brands-400.eot differ diff --git a/public/lib/font-awesome/webfonts/fa-brands-400.svg b/public/lib/font-awesome/webfonts/fa-brands-400.svg new file mode 100644 index 0000000..843c1c7 --- /dev/null +++ b/public/lib/font-awesome/webfonts/fa-brands-400.svg @@ -0,0 +1,3535 @@ + + + + + +Created by FontForge 20190801 at Tue Dec 10 16:09:21 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/lib/font-awesome/webfonts/fa-brands-400.ttf b/public/lib/font-awesome/webfonts/fa-brands-400.ttf new file mode 100644 index 0000000..9916328 Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-brands-400.ttf differ diff --git a/public/lib/font-awesome/webfonts/fa-brands-400.woff b/public/lib/font-awesome/webfonts/fa-brands-400.woff new file mode 100644 index 0000000..f9e3bcd Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-brands-400.woff differ diff --git a/public/lib/font-awesome/webfonts/fa-brands-400.woff2 b/public/lib/font-awesome/webfonts/fa-brands-400.woff2 new file mode 100644 index 0000000..51c07ae Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-brands-400.woff2 differ diff --git a/public/lib/font-awesome/webfonts/fa-regular-400.eot b/public/lib/font-awesome/webfonts/fa-regular-400.eot new file mode 100644 index 0000000..04e25cb Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-regular-400.eot differ diff --git a/public/lib/font-awesome/webfonts/fa-regular-400.svg b/public/lib/font-awesome/webfonts/fa-regular-400.svg new file mode 100644 index 0000000..f1f7e6c --- /dev/null +++ b/public/lib/font-awesome/webfonts/fa-regular-400.svg @@ -0,0 +1,803 @@ + + + + + +Created by FontForge 20190801 at Tue Dec 10 16:09:21 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/lib/font-awesome/webfonts/fa-regular-400.ttf b/public/lib/font-awesome/webfonts/fa-regular-400.ttf new file mode 100644 index 0000000..9c6249c Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-regular-400.ttf differ diff --git a/public/lib/font-awesome/webfonts/fa-regular-400.woff b/public/lib/font-awesome/webfonts/fa-regular-400.woff new file mode 100644 index 0000000..2873e43 Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-regular-400.woff differ diff --git a/public/lib/font-awesome/webfonts/fa-regular-400.woff2 b/public/lib/font-awesome/webfonts/fa-regular-400.woff2 new file mode 100644 index 0000000..a34bd65 Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-regular-400.woff2 differ diff --git a/public/lib/font-awesome/webfonts/fa-solid-900.eot b/public/lib/font-awesome/webfonts/fa-solid-900.eot new file mode 100644 index 0000000..39716a7 Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-solid-900.eot differ diff --git a/public/lib/font-awesome/webfonts/fa-solid-900.svg b/public/lib/font-awesome/webfonts/fa-solid-900.svg new file mode 100644 index 0000000..cfd0e2f --- /dev/null +++ b/public/lib/font-awesome/webfonts/fa-solid-900.svg @@ -0,0 +1,4700 @@ + + + + + +Created by FontForge 20190801 at Tue Dec 10 16:09:21 2019 + By Robert Madole +Copyright (c) Font Awesome + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/lib/font-awesome/webfonts/fa-solid-900.ttf b/public/lib/font-awesome/webfonts/fa-solid-900.ttf new file mode 100644 index 0000000..ac4baa2 Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-solid-900.ttf differ diff --git a/public/lib/font-awesome/webfonts/fa-solid-900.woff b/public/lib/font-awesome/webfonts/fa-solid-900.woff new file mode 100644 index 0000000..23002f8 Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-solid-900.woff differ diff --git a/public/lib/font-awesome/webfonts/fa-solid-900.woff2 b/public/lib/font-awesome/webfonts/fa-solid-900.woff2 new file mode 100644 index 0000000..b37f209 Binary files /dev/null and b/public/lib/font-awesome/webfonts/fa-solid-900.woff2 differ diff --git a/public/lib/jquery/jquery.min.js b/public/lib/jquery/jquery.min.js new file mode 100644 index 0000000..a1c07fd --- /dev/null +++ b/public/lib/jquery/jquery.min.js @@ -0,0 +1,2 @@ +/*! jQuery v3.4.1 | (c) JS Foundation and other contributors | jquery.org/license */ +!function(e,t){"use strict";"object"==typeof module&&"object"==typeof module.exports?module.exports=e.document?t(e,!0):function(e){if(!e.document)throw new Error("jQuery requires a window with a document");return t(e)}:t(e)}("undefined"!=typeof window?window:this,function(C,e){"use strict";var t=[],E=C.document,r=Object.getPrototypeOf,s=t.slice,g=t.concat,u=t.push,i=t.indexOf,n={},o=n.toString,v=n.hasOwnProperty,a=v.toString,l=a.call(Object),y={},m=function(e){return"function"==typeof e&&"number"!=typeof e.nodeType},x=function(e){return null!=e&&e===e.window},c={type:!0,src:!0,nonce:!0,noModule:!0};function b(e,t,n){var r,i,o=(n=n||E).createElement("script");if(o.text=e,t)for(r in c)(i=t[r]||t.getAttribute&&t.getAttribute(r))&&o.setAttribute(r,i);n.head.appendChild(o).parentNode.removeChild(o)}function w(e){return null==e?e+"":"object"==typeof e||"function"==typeof e?n[o.call(e)]||"object":typeof e}var f="3.4.1",k=function(e,t){return new k.fn.init(e,t)},p=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g;function d(e){var t=!!e&&"length"in e&&e.length,n=w(e);return!m(e)&&!x(e)&&("array"===n||0===t||"number"==typeof t&&0+~]|"+M+")"+M+"*"),U=new RegExp(M+"|>"),X=new RegExp($),V=new RegExp("^"+I+"$"),G={ID:new RegExp("^#("+I+")"),CLASS:new RegExp("^\\.("+I+")"),TAG:new RegExp("^("+I+"|[*])"),ATTR:new RegExp("^"+W),PSEUDO:new RegExp("^"+$),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+M+"*(even|odd|(([+-]|)(\\d*)n|)"+M+"*(?:([+-]|)"+M+"*(\\d+)|))"+M+"*\\)|)","i"),bool:new RegExp("^(?:"+R+")$","i"),needsContext:new RegExp("^"+M+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+M+"*((?:-\\d)?\\d*)"+M+"*\\)|)(?=[^-]|$)","i")},Y=/HTML$/i,Q=/^(?:input|select|textarea|button)$/i,J=/^h\d$/i,K=/^[^{]+\{\s*\[native \w/,Z=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,ee=/[+~]/,te=new RegExp("\\\\([\\da-f]{1,6}"+M+"?|("+M+")|.)","ig"),ne=function(e,t,n){var r="0x"+t-65536;return r!=r||n?t:r<0?String.fromCharCode(r+65536):String.fromCharCode(r>>10|55296,1023&r|56320)},re=/([\0-\x1f\x7f]|^-?\d)|^-$|[^\0-\x1f\x7f-\uFFFF\w-]/g,ie=function(e,t){return t?"\0"===e?"\ufffd":e.slice(0,-1)+"\\"+e.charCodeAt(e.length-1).toString(16)+" ":"\\"+e},oe=function(){T()},ae=be(function(e){return!0===e.disabled&&"fieldset"===e.nodeName.toLowerCase()},{dir:"parentNode",next:"legend"});try{H.apply(t=O.call(m.childNodes),m.childNodes),t[m.childNodes.length].nodeType}catch(e){H={apply:t.length?function(e,t){L.apply(e,O.call(t))}:function(e,t){var n=e.length,r=0;while(e[n++]=t[r++]);e.length=n-1}}}function se(t,e,n,r){var i,o,a,s,u,l,c,f=e&&e.ownerDocument,p=e?e.nodeType:9;if(n=n||[],"string"!=typeof t||!t||1!==p&&9!==p&&11!==p)return n;if(!r&&((e?e.ownerDocument||e:m)!==C&&T(e),e=e||C,E)){if(11!==p&&(u=Z.exec(t)))if(i=u[1]){if(9===p){if(!(a=e.getElementById(i)))return n;if(a.id===i)return n.push(a),n}else if(f&&(a=f.getElementById(i))&&y(e,a)&&a.id===i)return n.push(a),n}else{if(u[2])return H.apply(n,e.getElementsByTagName(t)),n;if((i=u[3])&&d.getElementsByClassName&&e.getElementsByClassName)return H.apply(n,e.getElementsByClassName(i)),n}if(d.qsa&&!A[t+" "]&&(!v||!v.test(t))&&(1!==p||"object"!==e.nodeName.toLowerCase())){if(c=t,f=e,1===p&&U.test(t)){(s=e.getAttribute("id"))?s=s.replace(re,ie):e.setAttribute("id",s=k),o=(l=h(t)).length;while(o--)l[o]="#"+s+" "+xe(l[o]);c=l.join(","),f=ee.test(t)&&ye(e.parentNode)||e}try{return H.apply(n,f.querySelectorAll(c)),n}catch(e){A(t,!0)}finally{s===k&&e.removeAttribute("id")}}}return g(t.replace(B,"$1"),e,n,r)}function ue(){var r=[];return function e(t,n){return r.push(t+" ")>b.cacheLength&&delete e[r.shift()],e[t+" "]=n}}function le(e){return e[k]=!0,e}function ce(e){var t=C.createElement("fieldset");try{return!!e(t)}catch(e){return!1}finally{t.parentNode&&t.parentNode.removeChild(t),t=null}}function fe(e,t){var n=e.split("|"),r=n.length;while(r--)b.attrHandle[n[r]]=t}function pe(e,t){var n=t&&e,r=n&&1===e.nodeType&&1===t.nodeType&&e.sourceIndex-t.sourceIndex;if(r)return r;if(n)while(n=n.nextSibling)if(n===t)return-1;return e?1:-1}function de(t){return function(e){return"input"===e.nodeName.toLowerCase()&&e.type===t}}function he(n){return function(e){var t=e.nodeName.toLowerCase();return("input"===t||"button"===t)&&e.type===n}}function ge(t){return function(e){return"form"in e?e.parentNode&&!1===e.disabled?"label"in e?"label"in e.parentNode?e.parentNode.disabled===t:e.disabled===t:e.isDisabled===t||e.isDisabled!==!t&&ae(e)===t:e.disabled===t:"label"in e&&e.disabled===t}}function ve(a){return le(function(o){return o=+o,le(function(e,t){var n,r=a([],e.length,o),i=r.length;while(i--)e[n=r[i]]&&(e[n]=!(t[n]=e[n]))})})}function ye(e){return e&&"undefined"!=typeof e.getElementsByTagName&&e}for(e in d=se.support={},i=se.isXML=function(e){var t=e.namespaceURI,n=(e.ownerDocument||e).documentElement;return!Y.test(t||n&&n.nodeName||"HTML")},T=se.setDocument=function(e){var t,n,r=e?e.ownerDocument||e:m;return r!==C&&9===r.nodeType&&r.documentElement&&(a=(C=r).documentElement,E=!i(C),m!==C&&(n=C.defaultView)&&n.top!==n&&(n.addEventListener?n.addEventListener("unload",oe,!1):n.attachEvent&&n.attachEvent("onunload",oe)),d.attributes=ce(function(e){return e.className="i",!e.getAttribute("className")}),d.getElementsByTagName=ce(function(e){return e.appendChild(C.createComment("")),!e.getElementsByTagName("*").length}),d.getElementsByClassName=K.test(C.getElementsByClassName),d.getById=ce(function(e){return a.appendChild(e).id=k,!C.getElementsByName||!C.getElementsByName(k).length}),d.getById?(b.filter.ID=function(e){var t=e.replace(te,ne);return function(e){return e.getAttribute("id")===t}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n=t.getElementById(e);return n?[n]:[]}}):(b.filter.ID=function(e){var n=e.replace(te,ne);return function(e){var t="undefined"!=typeof e.getAttributeNode&&e.getAttributeNode("id");return t&&t.value===n}},b.find.ID=function(e,t){if("undefined"!=typeof t.getElementById&&E){var n,r,i,o=t.getElementById(e);if(o){if((n=o.getAttributeNode("id"))&&n.value===e)return[o];i=t.getElementsByName(e),r=0;while(o=i[r++])if((n=o.getAttributeNode("id"))&&n.value===e)return[o]}return[]}}),b.find.TAG=d.getElementsByTagName?function(e,t){return"undefined"!=typeof t.getElementsByTagName?t.getElementsByTagName(e):d.qsa?t.querySelectorAll(e):void 0}:function(e,t){var n,r=[],i=0,o=t.getElementsByTagName(e);if("*"===e){while(n=o[i++])1===n.nodeType&&r.push(n);return r}return o},b.find.CLASS=d.getElementsByClassName&&function(e,t){if("undefined"!=typeof t.getElementsByClassName&&E)return t.getElementsByClassName(e)},s=[],v=[],(d.qsa=K.test(C.querySelectorAll))&&(ce(function(e){a.appendChild(e).innerHTML="",e.querySelectorAll("[msallowcapture^='']").length&&v.push("[*^$]="+M+"*(?:''|\"\")"),e.querySelectorAll("[selected]").length||v.push("\\["+M+"*(?:value|"+R+")"),e.querySelectorAll("[id~="+k+"-]").length||v.push("~="),e.querySelectorAll(":checked").length||v.push(":checked"),e.querySelectorAll("a#"+k+"+*").length||v.push(".#.+[+~]")}),ce(function(e){e.innerHTML="";var t=C.createElement("input");t.setAttribute("type","hidden"),e.appendChild(t).setAttribute("name","D"),e.querySelectorAll("[name=d]").length&&v.push("name"+M+"*[*^$|!~]?="),2!==e.querySelectorAll(":enabled").length&&v.push(":enabled",":disabled"),a.appendChild(e).disabled=!0,2!==e.querySelectorAll(":disabled").length&&v.push(":enabled",":disabled"),e.querySelectorAll("*,:x"),v.push(",.*:")})),(d.matchesSelector=K.test(c=a.matches||a.webkitMatchesSelector||a.mozMatchesSelector||a.oMatchesSelector||a.msMatchesSelector))&&ce(function(e){d.disconnectedMatch=c.call(e,"*"),c.call(e,"[s!='']:x"),s.push("!=",$)}),v=v.length&&new RegExp(v.join("|")),s=s.length&&new RegExp(s.join("|")),t=K.test(a.compareDocumentPosition),y=t||K.test(a.contains)?function(e,t){var n=9===e.nodeType?e.documentElement:e,r=t&&t.parentNode;return e===r||!(!r||1!==r.nodeType||!(n.contains?n.contains(r):e.compareDocumentPosition&&16&e.compareDocumentPosition(r)))}:function(e,t){if(t)while(t=t.parentNode)if(t===e)return!0;return!1},D=t?function(e,t){if(e===t)return l=!0,0;var n=!e.compareDocumentPosition-!t.compareDocumentPosition;return n||(1&(n=(e.ownerDocument||e)===(t.ownerDocument||t)?e.compareDocumentPosition(t):1)||!d.sortDetached&&t.compareDocumentPosition(e)===n?e===C||e.ownerDocument===m&&y(m,e)?-1:t===C||t.ownerDocument===m&&y(m,t)?1:u?P(u,e)-P(u,t):0:4&n?-1:1)}:function(e,t){if(e===t)return l=!0,0;var n,r=0,i=e.parentNode,o=t.parentNode,a=[e],s=[t];if(!i||!o)return e===C?-1:t===C?1:i?-1:o?1:u?P(u,e)-P(u,t):0;if(i===o)return pe(e,t);n=e;while(n=n.parentNode)a.unshift(n);n=t;while(n=n.parentNode)s.unshift(n);while(a[r]===s[r])r++;return r?pe(a[r],s[r]):a[r]===m?-1:s[r]===m?1:0}),C},se.matches=function(e,t){return se(e,null,null,t)},se.matchesSelector=function(e,t){if((e.ownerDocument||e)!==C&&T(e),d.matchesSelector&&E&&!A[t+" "]&&(!s||!s.test(t))&&(!v||!v.test(t)))try{var n=c.call(e,t);if(n||d.disconnectedMatch||e.document&&11!==e.document.nodeType)return n}catch(e){A(t,!0)}return 0":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(e){return e[1]=e[1].replace(te,ne),e[3]=(e[3]||e[4]||e[5]||"").replace(te,ne),"~="===e[2]&&(e[3]=" "+e[3]+" "),e.slice(0,4)},CHILD:function(e){return e[1]=e[1].toLowerCase(),"nth"===e[1].slice(0,3)?(e[3]||se.error(e[0]),e[4]=+(e[4]?e[5]+(e[6]||1):2*("even"===e[3]||"odd"===e[3])),e[5]=+(e[7]+e[8]||"odd"===e[3])):e[3]&&se.error(e[0]),e},PSEUDO:function(e){var t,n=!e[6]&&e[2];return G.CHILD.test(e[0])?null:(e[3]?e[2]=e[4]||e[5]||"":n&&X.test(n)&&(t=h(n,!0))&&(t=n.indexOf(")",n.length-t)-n.length)&&(e[0]=e[0].slice(0,t),e[2]=n.slice(0,t)),e.slice(0,3))}},filter:{TAG:function(e){var t=e.replace(te,ne).toLowerCase();return"*"===e?function(){return!0}:function(e){return e.nodeName&&e.nodeName.toLowerCase()===t}},CLASS:function(e){var t=p[e+" "];return t||(t=new RegExp("(^|"+M+")"+e+"("+M+"|$)"))&&p(e,function(e){return t.test("string"==typeof e.className&&e.className||"undefined"!=typeof e.getAttribute&&e.getAttribute("class")||"")})},ATTR:function(n,r,i){return function(e){var t=se.attr(e,n);return null==t?"!="===r:!r||(t+="","="===r?t===i:"!="===r?t!==i:"^="===r?i&&0===t.indexOf(i):"*="===r?i&&-1:\x20\t\r\n\f]*)[\x20\t\r\n\f]*\/?>(?:<\/\1>|)$/i;function j(e,n,r){return m(n)?k.grep(e,function(e,t){return!!n.call(e,t,e)!==r}):n.nodeType?k.grep(e,function(e){return e===n!==r}):"string"!=typeof n?k.grep(e,function(e){return-1)[^>]*|#([\w-]+))$/;(k.fn.init=function(e,t,n){var r,i;if(!e)return this;if(n=n||q,"string"==typeof e){if(!(r="<"===e[0]&&">"===e[e.length-1]&&3<=e.length?[null,e,null]:L.exec(e))||!r[1]&&t)return!t||t.jquery?(t||n).find(e):this.constructor(t).find(e);if(r[1]){if(t=t instanceof k?t[0]:t,k.merge(this,k.parseHTML(r[1],t&&t.nodeType?t.ownerDocument||t:E,!0)),D.test(r[1])&&k.isPlainObject(t))for(r in t)m(this[r])?this[r](t[r]):this.attr(r,t[r]);return this}return(i=E.getElementById(r[2]))&&(this[0]=i,this.length=1),this}return e.nodeType?(this[0]=e,this.length=1,this):m(e)?void 0!==n.ready?n.ready(e):e(k):k.makeArray(e,this)}).prototype=k.fn,q=k(E);var H=/^(?:parents|prev(?:Until|All))/,O={children:!0,contents:!0,next:!0,prev:!0};function P(e,t){while((e=e[t])&&1!==e.nodeType);return e}k.fn.extend({has:function(e){var t=k(e,this),n=t.length;return this.filter(function(){for(var e=0;e\x20\t\r\n\f]*)/i,he=/^$|^module$|\/(?:java|ecma)script/i,ge={option:[1,""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};function ve(e,t){var n;return n="undefined"!=typeof e.getElementsByTagName?e.getElementsByTagName(t||"*"):"undefined"!=typeof e.querySelectorAll?e.querySelectorAll(t||"*"):[],void 0===t||t&&A(e,t)?k.merge([e],n):n}function ye(e,t){for(var n=0,r=e.length;nx",y.noCloneChecked=!!me.cloneNode(!0).lastChild.defaultValue;var Te=/^key/,Ce=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,Ee=/^([^.]*)(?:\.(.+)|)/;function ke(){return!0}function Se(){return!1}function Ne(e,t){return e===function(){try{return E.activeElement}catch(e){}}()==("focus"===t)}function Ae(e,t,n,r,i,o){var a,s;if("object"==typeof t){for(s in"string"!=typeof n&&(r=r||n,n=void 0),t)Ae(e,s,n,r,t[s],o);return e}if(null==r&&null==i?(i=n,r=n=void 0):null==i&&("string"==typeof n?(i=r,r=void 0):(i=r,r=n,n=void 0)),!1===i)i=Se;else if(!i)return e;return 1===o&&(a=i,(i=function(e){return k().off(e),a.apply(this,arguments)}).guid=a.guid||(a.guid=k.guid++)),e.each(function(){k.event.add(this,t,i,r,n)})}function De(e,i,o){o?(Q.set(e,i,!1),k.event.add(e,i,{namespace:!1,handler:function(e){var t,n,r=Q.get(this,i);if(1&e.isTrigger&&this[i]){if(r.length)(k.event.special[i]||{}).delegateType&&e.stopPropagation();else if(r=s.call(arguments),Q.set(this,i,r),t=o(this,i),this[i](),r!==(n=Q.get(this,i))||t?Q.set(this,i,!1):n={},r!==n)return e.stopImmediatePropagation(),e.preventDefault(),n.value}else r.length&&(Q.set(this,i,{value:k.event.trigger(k.extend(r[0],k.Event.prototype),r.slice(1),this)}),e.stopImmediatePropagation())}})):void 0===Q.get(e,i)&&k.event.add(e,i,ke)}k.event={global:{},add:function(t,e,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.get(t);if(v){n.handler&&(n=(o=n).handler,i=o.selector),i&&k.find.matchesSelector(ie,i),n.guid||(n.guid=k.guid++),(u=v.events)||(u=v.events={}),(a=v.handle)||(a=v.handle=function(e){return"undefined"!=typeof k&&k.event.triggered!==e.type?k.event.dispatch.apply(t,arguments):void 0}),l=(e=(e||"").match(R)||[""]).length;while(l--)d=g=(s=Ee.exec(e[l])||[])[1],h=(s[2]||"").split(".").sort(),d&&(f=k.event.special[d]||{},d=(i?f.delegateType:f.bindType)||d,f=k.event.special[d]||{},c=k.extend({type:d,origType:g,data:r,handler:n,guid:n.guid,selector:i,needsContext:i&&k.expr.match.needsContext.test(i),namespace:h.join(".")},o),(p=u[d])||((p=u[d]=[]).delegateCount=0,f.setup&&!1!==f.setup.call(t,r,h,a)||t.addEventListener&&t.addEventListener(d,a)),f.add&&(f.add.call(t,c),c.handler.guid||(c.handler.guid=n.guid)),i?p.splice(p.delegateCount++,0,c):p.push(c),k.event.global[d]=!0)}},remove:function(e,t,n,r,i){var o,a,s,u,l,c,f,p,d,h,g,v=Q.hasData(e)&&Q.get(e);if(v&&(u=v.events)){l=(t=(t||"").match(R)||[""]).length;while(l--)if(d=g=(s=Ee.exec(t[l])||[])[1],h=(s[2]||"").split(".").sort(),d){f=k.event.special[d]||{},p=u[d=(r?f.delegateType:f.bindType)||d]||[],s=s[2]&&new RegExp("(^|\\.)"+h.join("\\.(?:.*\\.|)")+"(\\.|$)"),a=o=p.length;while(o--)c=p[o],!i&&g!==c.origType||n&&n.guid!==c.guid||s&&!s.test(c.namespace)||r&&r!==c.selector&&("**"!==r||!c.selector)||(p.splice(o,1),c.selector&&p.delegateCount--,f.remove&&f.remove.call(e,c));a&&!p.length&&(f.teardown&&!1!==f.teardown.call(e,h,v.handle)||k.removeEvent(e,d,v.handle),delete u[d])}else for(d in u)k.event.remove(e,d+t[l],n,r,!0);k.isEmptyObject(u)&&Q.remove(e,"handle events")}},dispatch:function(e){var t,n,r,i,o,a,s=k.event.fix(e),u=new Array(arguments.length),l=(Q.get(this,"events")||{})[s.type]||[],c=k.event.special[s.type]||{};for(u[0]=s,t=1;t\x20\t\r\n\f]*)[^>]*)\/>/gi,qe=/\s*$/g;function Oe(e,t){return A(e,"table")&&A(11!==t.nodeType?t:t.firstChild,"tr")&&k(e).children("tbody")[0]||e}function Pe(e){return e.type=(null!==e.getAttribute("type"))+"/"+e.type,e}function Re(e){return"true/"===(e.type||"").slice(0,5)?e.type=e.type.slice(5):e.removeAttribute("type"),e}function Me(e,t){var n,r,i,o,a,s,u,l;if(1===t.nodeType){if(Q.hasData(e)&&(o=Q.access(e),a=Q.set(t,o),l=o.events))for(i in delete a.handle,a.events={},l)for(n=0,r=l[i].length;n")},clone:function(e,t,n){var r,i,o,a,s,u,l,c=e.cloneNode(!0),f=oe(e);if(!(y.noCloneChecked||1!==e.nodeType&&11!==e.nodeType||k.isXMLDoc(e)))for(a=ve(c),r=0,i=(o=ve(e)).length;r").attr(n.scriptAttrs||{}).prop({charset:n.scriptCharset,src:n.url}).on("load error",i=function(e){r.remove(),i=null,e&&t("error"===e.type?404:200,e.type)}),E.head.appendChild(r[0])},abort:function(){i&&i()}}});var Vt,Gt=[],Yt=/(=)\?(?=&|$)|\?\?/;k.ajaxSetup({jsonp:"callback",jsonpCallback:function(){var e=Gt.pop()||k.expando+"_"+kt++;return this[e]=!0,e}}),k.ajaxPrefilter("json jsonp",function(e,t,n){var r,i,o,a=!1!==e.jsonp&&(Yt.test(e.url)?"url":"string"==typeof e.data&&0===(e.contentType||"").indexOf("application/x-www-form-urlencoded")&&Yt.test(e.data)&&"data");if(a||"jsonp"===e.dataTypes[0])return r=e.jsonpCallback=m(e.jsonpCallback)?e.jsonpCallback():e.jsonpCallback,a?e[a]=e[a].replace(Yt,"$1"+r):!1!==e.jsonp&&(e.url+=(St.test(e.url)?"&":"?")+e.jsonp+"="+r),e.converters["script json"]=function(){return o||k.error(r+" was not called"),o[0]},e.dataTypes[0]="json",i=C[r],C[r]=function(){o=arguments},n.always(function(){void 0===i?k(C).removeProp(r):C[r]=i,e[r]&&(e.jsonpCallback=t.jsonpCallback,Gt.push(r)),o&&m(i)&&i(o[0]),o=i=void 0}),"script"}),y.createHTMLDocument=((Vt=E.implementation.createHTMLDocument("").body).innerHTML="
    ",2===Vt.childNodes.length),k.parseHTML=function(e,t,n){return"string"!=typeof e?[]:("boolean"==typeof t&&(n=t,t=!1),t||(y.createHTMLDocument?((r=(t=E.implementation.createHTMLDocument("")).createElement("base")).href=E.location.href,t.head.appendChild(r)):t=E),o=!n&&[],(i=D.exec(e))?[t.createElement(i[1])]:(i=we([e],t,o),o&&o.length&&k(o).remove(),k.merge([],i.childNodes)));var r,i,o},k.fn.load=function(e,t,n){var r,i,o,a=this,s=e.indexOf(" ");return-1").append(k.parseHTML(e)).find(r):e)}).always(n&&function(e,t){a.each(function(){n.apply(this,o||[e.responseText,t,e])})}),this},k.each(["ajaxStart","ajaxStop","ajaxComplete","ajaxError","ajaxSuccess","ajaxSend"],function(e,t){k.fn[t]=function(e){return this.on(t,e)}}),k.expr.pseudos.animated=function(t){return k.grep(k.timers,function(e){return t===e.elem}).length},k.offset={setOffset:function(e,t,n){var r,i,o,a,s,u,l=k.css(e,"position"),c=k(e),f={};"static"===l&&(e.style.position="relative"),s=c.offset(),o=k.css(e,"top"),u=k.css(e,"left"),("absolute"===l||"fixed"===l)&&-1<(o+u).indexOf("auto")?(a=(r=c.position()).top,i=r.left):(a=parseFloat(o)||0,i=parseFloat(u)||0),m(t)&&(t=t.call(e,n,k.extend({},s))),null!=t.top&&(f.top=t.top-s.top+a),null!=t.left&&(f.left=t.left-s.left+i),"using"in t?t.using.call(e,f):c.css(f)}},k.fn.extend({offset:function(t){if(arguments.length)return void 0===t?this:this.each(function(e){k.offset.setOffset(this,t,e)});var e,n,r=this[0];return r?r.getClientRects().length?(e=r.getBoundingClientRect(),n=r.ownerDocument.defaultView,{top:e.top+n.pageYOffset,left:e.left+n.pageXOffset}):{top:0,left:0}:void 0},position:function(){if(this[0]){var e,t,n,r=this[0],i={top:0,left:0};if("fixed"===k.css(r,"position"))t=r.getBoundingClientRect();else{t=this.offset(),n=r.ownerDocument,e=r.offsetParent||n.documentElement;while(e&&(e===n.body||e===n.documentElement)&&"static"===k.css(e,"position"))e=e.parentNode;e&&e!==r&&1===e.nodeType&&((i=k(e).offset()).top+=k.css(e,"borderTopWidth",!0),i.left+=k.css(e,"borderLeftWidth",!0))}return{top:t.top-i.top-k.css(r,"marginTop",!0),left:t.left-i.left-k.css(r,"marginLeft",!0)}}},offsetParent:function(){return this.map(function(){var e=this.offsetParent;while(e&&"static"===k.css(e,"position"))e=e.offsetParent;return e||ie})}}),k.each({scrollLeft:"pageXOffset",scrollTop:"pageYOffset"},function(t,i){var o="pageYOffset"===i;k.fn[t]=function(e){return _(this,function(e,t,n){var r;if(x(e)?r=e:9===e.nodeType&&(r=e.defaultView),void 0===n)return r?r[i]:e[t];r?r.scrollTo(o?r.pageXOffset:n,o?n:r.pageYOffset):e[t]=n},t,e,arguments.length)}}),k.each(["top","left"],function(e,n){k.cssHooks[n]=ze(y.pixelPosition,function(e,t){if(t)return t=_e(e,n),$e.test(t)?k(e).position()[n]+"px":t})}),k.each({Height:"height",Width:"width"},function(a,s){k.each({padding:"inner"+a,content:s,"":"outer"+a},function(r,o){k.fn[o]=function(e,t){var n=arguments.length&&(r||"boolean"!=typeof e),i=r||(!0===e||!0===t?"margin":"border");return _(this,function(e,t,n){var r;return x(e)?0===o.indexOf("outer")?e["inner"+a]:e.document.documentElement["client"+a]:9===e.nodeType?(r=e.documentElement,Math.max(e.body["scroll"+a],r["scroll"+a],e.body["offset"+a],r["offset"+a],r["client"+a])):void 0===n?k.css(e,t,i):k.style(e,t,n,i)},s,n?e:void 0,n)}})}),k.each("blur focus focusin focusout resize scroll click dblclick mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave change select submit keydown keypress keyup contextmenu".split(" "),function(e,n){k.fn[n]=function(e,t){return 0 a, +.justified-gallery > div, +.justified-gallery > figure { + position: absolute; + display: inline-block; + overflow: hidden; + /* background: #888888; To have gray placeholders while the gallery is loading with waitThumbnailsLoad = false */ + filter: "alpha(opacity=10)"; + opacity: 0.1; + margin: 0; + padding: 0; +} +.justified-gallery > a > img, +.justified-gallery > div > img, +.justified-gallery > figure > img, +.justified-gallery > a > a > img, +.justified-gallery > div > a > img, +.justified-gallery > figure > a > img { + position: absolute; + top: 50%; + left: 50%; + margin: 0; + padding: 0; + border: none; + filter: "alpha(opacity=0)"; + opacity: 0; +} +.justified-gallery > a > .caption, +.justified-gallery > div > .caption, +.justified-gallery > figure > .caption { + display: none; + position: absolute; + bottom: 0; + padding: 5px; + background-color: #000000; + left: 0; + right: 0; + margin: 0; + color: white; + font-size: 12px; + font-weight: 300; + font-family: sans-serif; +} +.justified-gallery > a > .caption.caption-visible, +.justified-gallery > div > .caption.caption-visible, +.justified-gallery > figure > .caption.caption-visible { + display: initial; + filter: "alpha(opacity=70)"; + opacity: 0.7; + -webkit-transition: opacity 500ms ease-in; + -moz-transition: opacity 500ms ease-in; + -o-transition: opacity 500ms ease-in; + transition: opacity 500ms ease-in; +} +.justified-gallery > .entry-visible { + filter: "alpha(opacity=100)"; + opacity: 1; + background: none; +} +.justified-gallery > .entry-visible > img, +.justified-gallery > .entry-visible > a > img { + filter: "alpha(opacity=100)"; + opacity: 1; + -webkit-transition: opacity 500ms ease-in; + -moz-transition: opacity 500ms ease-in; + -o-transition: opacity 500ms ease-in; + transition: opacity 500ms ease-in; +} +.justified-gallery > .jg-filtered { + display: none; +} +.justified-gallery > .spinner { + position: absolute; + bottom: 0; + margin-left: -24px; + padding: 10px 0 10px 0; + left: 50%; + filter: "alpha(opacity=100)"; + opacity: 1; + overflow: initial; +} +.justified-gallery > .spinner > span { + display: inline-block; + filter: "alpha(opacity=0)"; + opacity: 0; + width: 8px; + height: 8px; + margin: 0 4px 0 4px; + background-color: #000; + border-radius: 6px; +} diff --git a/public/lib/justified-gallery/js/jquery.justifiedGallery.min.js b/public/lib/justified-gallery/js/jquery.justifiedGallery.min.js new file mode 100644 index 0000000..bda51a1 --- /dev/null +++ b/public/lib/justified-gallery/js/jquery.justifiedGallery.min.js @@ -0,0 +1,8 @@ +/*! + * justifiedGallery - v3.7.0 + * http://miromannino.github.io/Justified-Gallery/ + * Copyright (c) 2018 Miro Mannino + * Licensed under the MIT license. + */ + +!function(e){"function"==typeof define&&define.amd?define(["jquery"],e):"object"==typeof module&&module.exports?module.exports=function(t,i){return void 0===i&&(i="undefined"!=typeof window?require("jquery"):require("jquery")(t)),e(i),i}:e(jQuery)}(function(g){var r=function(t,i){this.settings=i,this.checkSettings(),this.imgAnalyzerTimeout=null,this.entries=null,this.buildingRow={entriesBuff:[],width:0,height:0,aspectRatio:0},this.lastFetchedEntry=null,this.lastAnalyzedIndex=-1,this.yield={every:2,flushed:0},this.border=0<=i.border?i.border:i.margins,this.maxRowHeight=this.retrieveMaxRowHeight(),this.suffixRanges=this.retrieveSuffixRanges(),this.offY=this.border,this.rows=0,this.spinner={phase:0,timeSlot:150,$el:g('
    '),intervalId:null},this.scrollBarOn=!1,this.checkWidthIntervalId=null,this.galleryWidth=t.width(),this.$gallery=t};r.prototype.getSuffix=function(t,i){var e,s;for(e=i .caption");return 0===i.length?null:i},r.prototype.displayEntry=function(t,i,e,s,n,r){t.width(s),t.height(r),t.css("top",e),t.css("left",i);var o=this.imgFromEntry(t);if(null!==o){o.css("width",s),o.css("height",n),o.css("margin-left",-s/2),o.css("margin-top",-n/2);var a=o.attr("src"),h=this.newSrc(a,s,n,o[0]);o.one("error",function(){o.attr("src",o.data("jg.originalSrc"))});var l=function(){a!==h&&o.attr("src",h)};"skipped"===t.data("jg.loaded")?this.onImageEvent(a,g.proxy(function(){this.showImg(t,l),t.data("jg.loaded",!0)},this)):this.showImg(t,l)}else this.showImg(t);this.displayEntryCaption(t)},r.prototype.displayEntryCaption=function(t){var i=this.imgFromEntry(t);if(null!==i&&this.settings.captions){var e=this.captionFromEntry(t);if(null===e){var s=i.attr("alt");this.isValidCaption(s)||(s=t.attr("title")),this.isValidCaption(s)&&(e=g('
    '+s+"
    "),t.append(e),t.data("jg.createdCaption",!0))}null!==e&&(this.settings.cssAnimation||e.stop().fadeTo(0,this.settings.captionSettings.nonVisibleOpacity),this.addCaptionEventsHandlers(t))}else this.removeCaptionEventsHandlers(t)},r.prototype.isValidCaption=function(t){return void 0!==t&&0this.settings.justifyThreshold;if(t&&"hide"===this.settings.lastRow&&!u){for(i=0;i img, > a > img").fadeTo(0,0));return-1}for(t&&!u&&"justify"!==this.settings.lastRow&&"hide"!==this.settings.lastRow&&(o=!1,0this.settings.justifyThreshold)),i=0;ig(window).height()}r.prototype.rememberGalleryHeight=function(){i=this.$gallery.height(),this.$gallery.height(i)},r.prototype.setGalleryTempHeight=function(t){i=Math.max(t,i),this.$gallery.height(i)},r.prototype.setGalleryFinalHeight=function(t){i=t,this.$gallery.height(t)},r.prototype.checkWidth=function(){this.checkWidthIntervalId=setInterval(g.proxy(function(){if(this.$gallery.is(":visible")){var t=parseFloat(this.$gallery.width());e()===this.scrollBarOn?Math.abs(t-this.galleryWidth)>this.settings.refreshSensitivity&&(this.galleryWidth=t,this.rewind(),this.rememberGalleryHeight(),this.startImgAnalyzer(!0)):(this.scrollBarOn=e(),this.galleryWidth=t)}},this),this.settings.refreshTime)},r.prototype.isSpinnerActive=function(){return null!==this.spinner.intervalId},r.prototype.getSpinnerHeight=function(){return this.spinner.$el.innerHeight()},r.prototype.stopLoadingSpinnerAnimation=function(){clearInterval(this.spinner.intervalId),this.spinner.intervalId=null,this.setGalleryTempHeight(this.$gallery.height()-this.getSpinnerHeight()),this.spinner.$el.detach()},r.prototype.startLoadingSpinnerAnimation=function(){var t=this.spinner,i=t.$el.find("span");clearInterval(t.intervalId),this.$gallery.append(t.$el),this.setGalleryTempHeight(this.offY+this.buildingRow.height+this.getSpinnerHeight()),t.intervalId=setInterval(function(){t.phase=this.yield.every))return void this.startImgAnalyzer(t);this.buildingRow.entriesBuff.push(e),this.buildingRow.aspectRatio+=n,this.buildingRow.width+=n*this.settings.rowHeight,this.lastAnalyzedIndex=i}else if("error"!==e.data("jg.loaded"))return}0 img, > a > img",triggerEvent:function(t){this.$gallery.trigger(t)}},g.fn.justifiedGallery=function(n){return this.each(function(t,i){var e=g(i);e.addClass("justified-gallery");var s=e.data("jg.controller");if(void 0===s){if(null!=n&&"object"!==g.type(n)){if("destroy"===n)return;throw"The argument must be an object"}s=new r(e,g.extend({},r.prototype.defaults,n)),e.data("jg.controller",s)}else if("norewind"===n);else{if("destroy"===n)return void s.destroy();s.updateSettings(n),s.rewind()}s.updateEntries("norewind"===n)&&s.init()})}}); \ No newline at end of file diff --git a/public/lib/meslo-LG/MesloLGL-Bold.ttf b/public/lib/meslo-LG/MesloLGL-Bold.ttf new file mode 100644 index 0000000..e657edc Binary files /dev/null and b/public/lib/meslo-LG/MesloLGL-Bold.ttf differ diff --git a/public/lib/meslo-LG/MesloLGL-BoldItalic.ttf b/public/lib/meslo-LG/MesloLGL-BoldItalic.ttf new file mode 100644 index 0000000..c698219 Binary files /dev/null and b/public/lib/meslo-LG/MesloLGL-BoldItalic.ttf differ diff --git a/public/lib/meslo-LG/MesloLGL-Italic.ttf b/public/lib/meslo-LG/MesloLGL-Italic.ttf new file mode 100644 index 0000000..86b31c9 Binary files /dev/null and b/public/lib/meslo-LG/MesloLGL-Italic.ttf differ diff --git a/public/lib/meslo-LG/MesloLGL-Regular.ttf b/public/lib/meslo-LG/MesloLGL-Regular.ttf new file mode 100644 index 0000000..448dd23 Binary files /dev/null and b/public/lib/meslo-LG/MesloLGL-Regular.ttf differ diff --git a/public/lib/meslo-LG/MesloLGM-Bold.ttf b/public/lib/meslo-LG/MesloLGM-Bold.ttf new file mode 100644 index 0000000..6bb1c6f Binary files /dev/null and b/public/lib/meslo-LG/MesloLGM-Bold.ttf differ diff --git a/public/lib/meslo-LG/MesloLGM-BoldItalic.ttf b/public/lib/meslo-LG/MesloLGM-BoldItalic.ttf new file mode 100644 index 0000000..da487d8 Binary files /dev/null and b/public/lib/meslo-LG/MesloLGM-BoldItalic.ttf differ diff --git a/public/lib/meslo-LG/MesloLGM-Italic.ttf b/public/lib/meslo-LG/MesloLGM-Italic.ttf new file mode 100644 index 0000000..61c0bae Binary files /dev/null and b/public/lib/meslo-LG/MesloLGM-Italic.ttf differ diff --git a/public/lib/meslo-LG/MesloLGM-Regular.ttf b/public/lib/meslo-LG/MesloLGM-Regular.ttf new file mode 100644 index 0000000..5e56307 Binary files /dev/null and b/public/lib/meslo-LG/MesloLGM-Regular.ttf differ diff --git a/public/lib/meslo-LG/MesloLGS-Bold.ttf b/public/lib/meslo-LG/MesloLGS-Bold.ttf new file mode 100644 index 0000000..0c7fc81 Binary files /dev/null and b/public/lib/meslo-LG/MesloLGS-Bold.ttf differ diff --git a/public/lib/meslo-LG/MesloLGS-BoldItalic.ttf b/public/lib/meslo-LG/MesloLGS-BoldItalic.ttf new file mode 100644 index 0000000..1ddb55a Binary files /dev/null and b/public/lib/meslo-LG/MesloLGS-BoldItalic.ttf differ diff --git a/public/lib/meslo-LG/MesloLGS-Italic.ttf b/public/lib/meslo-LG/MesloLGS-Italic.ttf new file mode 100644 index 0000000..ed3a85c Binary files /dev/null and b/public/lib/meslo-LG/MesloLGS-Italic.ttf differ diff --git a/public/lib/meslo-LG/MesloLGS-Regular.ttf b/public/lib/meslo-LG/MesloLGS-Regular.ttf new file mode 100644 index 0000000..6cb44f4 Binary files /dev/null and b/public/lib/meslo-LG/MesloLGS-Regular.ttf differ diff --git a/public/lib/vazir-font/Vazir-Black.eot b/public/lib/vazir-font/Vazir-Black.eot new file mode 100644 index 0000000..8350249 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Black.eot differ diff --git a/public/lib/vazir-font/Vazir-Black.ttf b/public/lib/vazir-font/Vazir-Black.ttf new file mode 100644 index 0000000..644c312 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Black.ttf differ diff --git a/public/lib/vazir-font/Vazir-Black.woff b/public/lib/vazir-font/Vazir-Black.woff new file mode 100644 index 0000000..a1585a9 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Black.woff differ diff --git a/public/lib/vazir-font/Vazir-Black.woff2 b/public/lib/vazir-font/Vazir-Black.woff2 new file mode 100644 index 0000000..98e2f9d Binary files /dev/null and b/public/lib/vazir-font/Vazir-Black.woff2 differ diff --git a/public/lib/vazir-font/Vazir-Bold.eot b/public/lib/vazir-font/Vazir-Bold.eot new file mode 100644 index 0000000..5160645 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Bold.eot differ diff --git a/public/lib/vazir-font/Vazir-Bold.ttf b/public/lib/vazir-font/Vazir-Bold.ttf new file mode 100644 index 0000000..b911f30 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Bold.ttf differ diff --git a/public/lib/vazir-font/Vazir-Bold.woff b/public/lib/vazir-font/Vazir-Bold.woff new file mode 100644 index 0000000..07ec94e Binary files /dev/null and b/public/lib/vazir-font/Vazir-Bold.woff differ diff --git a/public/lib/vazir-font/Vazir-Bold.woff2 b/public/lib/vazir-font/Vazir-Bold.woff2 new file mode 100644 index 0000000..0d4369b Binary files /dev/null and b/public/lib/vazir-font/Vazir-Bold.woff2 differ diff --git a/public/lib/vazir-font/Vazir-Light.eot b/public/lib/vazir-font/Vazir-Light.eot new file mode 100644 index 0000000..6d8cdc4 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Light.eot differ diff --git a/public/lib/vazir-font/Vazir-Light.ttf b/public/lib/vazir-font/Vazir-Light.ttf new file mode 100644 index 0000000..8713297 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Light.ttf differ diff --git a/public/lib/vazir-font/Vazir-Light.woff b/public/lib/vazir-font/Vazir-Light.woff new file mode 100644 index 0000000..aea8932 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Light.woff differ diff --git a/public/lib/vazir-font/Vazir-Light.woff2 b/public/lib/vazir-font/Vazir-Light.woff2 new file mode 100644 index 0000000..8c60c30 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Light.woff2 differ diff --git a/public/lib/vazir-font/Vazir-Medium.eot b/public/lib/vazir-font/Vazir-Medium.eot new file mode 100644 index 0000000..bae211a Binary files /dev/null and b/public/lib/vazir-font/Vazir-Medium.eot differ diff --git a/public/lib/vazir-font/Vazir-Medium.ttf b/public/lib/vazir-font/Vazir-Medium.ttf new file mode 100644 index 0000000..0dd1a63 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Medium.ttf differ diff --git a/public/lib/vazir-font/Vazir-Medium.woff b/public/lib/vazir-font/Vazir-Medium.woff new file mode 100644 index 0000000..589c9c2 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Medium.woff differ diff --git a/public/lib/vazir-font/Vazir-Medium.woff2 b/public/lib/vazir-font/Vazir-Medium.woff2 new file mode 100644 index 0000000..bfadb5f Binary files /dev/null and b/public/lib/vazir-font/Vazir-Medium.woff2 differ diff --git a/public/lib/vazir-font/Vazir-Thin.eot b/public/lib/vazir-font/Vazir-Thin.eot new file mode 100644 index 0000000..d4b6dd7 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Thin.eot differ diff --git a/public/lib/vazir-font/Vazir-Thin.ttf b/public/lib/vazir-font/Vazir-Thin.ttf new file mode 100644 index 0000000..31b92ed Binary files /dev/null and b/public/lib/vazir-font/Vazir-Thin.ttf differ diff --git a/public/lib/vazir-font/Vazir-Thin.woff b/public/lib/vazir-font/Vazir-Thin.woff new file mode 100644 index 0000000..813a033 Binary files /dev/null and b/public/lib/vazir-font/Vazir-Thin.woff differ diff --git a/public/lib/vazir-font/Vazir-Thin.woff2 b/public/lib/vazir-font/Vazir-Thin.woff2 new file mode 100644 index 0000000..7afdaca Binary files /dev/null and b/public/lib/vazir-font/Vazir-Thin.woff2 differ diff --git a/public/lib/vazir-font/Vazir.eot b/public/lib/vazir-font/Vazir.eot new file mode 100644 index 0000000..9c62ad9 Binary files /dev/null and b/public/lib/vazir-font/Vazir.eot differ diff --git a/public/lib/vazir-font/Vazir.ttf b/public/lib/vazir-font/Vazir.ttf new file mode 100644 index 0000000..f97b3de Binary files /dev/null and b/public/lib/vazir-font/Vazir.ttf differ diff --git a/public/lib/vazir-font/Vazir.woff b/public/lib/vazir-font/Vazir.woff new file mode 100644 index 0000000..0a5cfc2 Binary files /dev/null and b/public/lib/vazir-font/Vazir.woff differ diff --git a/public/lib/vazir-font/Vazir.woff2 b/public/lib/vazir-font/Vazir.woff2 new file mode 100644 index 0000000..133feb7 Binary files /dev/null and b/public/lib/vazir-font/Vazir.woff2 differ diff --git a/public/lib/vazir-font/font-face.css b/public/lib/vazir-font/font-face.css new file mode 100644 index 0000000..fff8885 --- /dev/null +++ b/public/lib/vazir-font/font-face.css @@ -0,0 +1,59 @@ +@font-face { + font-family: Vazir; + src: url('Vazir.eot'); + src: url('Vazir.eot?#iefix') format('embedded-opentype'), + url('Vazir.woff2') format('woff2'), + url('Vazir.woff') format('woff'), + url('Vazir.ttf') format('truetype'); + font-weight: normal; +} + +@font-face { + font-family: Vazir; + src: url('Vazir-Bold.eot'); + src: url('Vazir-Bold.eot?#iefix') format('embedded-opentype'), + url('Vazir-Bold.woff2') format('woff2'), + url('Vazir-Bold.woff') format('woff'), + url('Vazir-Bold.ttf') format('truetype'); + font-weight: bold; +} + +@font-face { + font-family: Vazir; + src: url('Vazir-Thin.eot'); + src: url('Vazir-Thin.eot?#iefix') format('embedded-opentype'), + url('Vazir-Thin.woff2') format('woff2'), + url('Vazir-Thin.woff') format('woff'), + url('Vazir-Thin.ttf') format('truetype'); + font-weight: 100; +} + +@font-face { + font-family: Vazir; + src: url('Vazir-Light.eot'); + src: url('Vazir-Light.eot?#iefix') format('embedded-opentype'), + url('Vazir-Light.woff2') format('woff2'), + url('Vazir-Light.woff') format('woff'), + url('Vazir-Light.ttf') format('truetype'); + font-weight: 300; +} + +@font-face { + font-family: Vazir; + src: url('Vazir-Medium.eot'); + src: url('Vazir-Medium.eot?#iefix') format('embedded-opentype'), + url('Vazir-Medium.woff2') format('woff2'), + url('Vazir-Medium.woff') format('woff'), + url('Vazir-Medium.ttf') format('truetype'); + font-weight: 500; +} + +@font-face { + font-family: Vazir; + src: url('Vazir-Black.eot'); + src: url('Vazir-Black.eot?#iefix') format('embedded-opentype'), + url('Vazir-Black.woff2') format('woff2'), + url('Vazir-Black.woff') format('woff'), + url('Vazir-Black.ttf') format('truetype'); + font-weight: 900; +} \ No newline at end of file diff --git a/public/page/2/index.html b/public/page/2/index.html index 4b3037c..2fcbd96 100644 --- a/public/page/2/index.html +++ b/public/page/2/index.html @@ -1,118 +1,2 @@ - MarkDown
    \ No newline at end of file + MarkDown +
    \ No newline at end of file diff --git a/public/page/3/index.html b/public/page/3/index.html index 45cda11..c60d03b 100644 --- a/public/page/3/index.html +++ b/public/page/3/index.html @@ -1,125 +1,9 @@ - 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.

      + 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.

        +

        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

          @@ -129,8 +13,8 @@ mjx-container + br {

          ​ 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.

          +

          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.

            @@ -142,23 +26,28 @@ mjx-container + br {
          3. Optionally, define a trigger or rule to redirect data inserted into the master table to the appropriate partition.

          4. -
          5. Ensure hte constraint_exclusion configuration parameter is not disabled in postgresql.conf. If it is, queries will not be optimized as desired.

            +
          6. Ensure hte 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.

      • 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:

        +

        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
        +
        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 }
        +
        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.

        +
      • 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.

          @@ -195,42 +84,53 @@ mjx-container + br {
        • 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.

        +
      • 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. Import models from services app
        3. -
        4. Create custom resource by inheriting ModelResource and link app model in inner Meta class of resource.
        5. +
        6. 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

        +

        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).

        +
        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 方法是对数据库操作的封装。

        +
      • 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()
        +
        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 的情况有两点:

        +

        自定义 Manager

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

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

        默认 Manager

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

        +

        默认 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'
        +
        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
        +
        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)
        +
        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 %}
        +
        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 +
      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 index d1353e3..dac9a6a 100644 --- a/public/page/4/index.html +++ b/public/page/4/index.html @@ -1,125 +1,11 @@ - 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. @@ -128,20 +14,27 @@ mjx-container + br {

      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)
      +
      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
      +
      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.

      +
      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 +

    with Typora & Hexo.

    + \ No newline at end of file diff --git a/public/sitemap.xml b/public/sitemap.xml index 0822543..c7cec6b 100644 --- a/public/sitemap.xml +++ b/public/sitemap.xml @@ -4,225 +4,307 @@ http://blog.tunpok.com/2020/04/21/leetcode-number-of-islands/ - 2020-04-21T04:55:46.000Z + 2020-04-21 + monthly + 0.6 http://blog.tunpok.com/2020/04/16/leetcode-string-to-integer-atoi/ - 2020-04-16T11:56:40.000Z + 2020-04-16 + monthly + 0.6 http://blog.tunpok.com/2020/04/16/leetcode-merge-intervals/ - 2020-04-16T11:22:48.000Z + 2020-04-16 + monthly + 0.6 http://blog.tunpok.com/2020/04/16/leetcode-01-matrix/ - 2020-04-16T04:26:56.000Z + 2020-04-16 + monthly + 0.6 http://blog.tunpok.com/2020/03/25/leetcode-543/ - 2020-04-14T15:29:53.000Z + 2020-04-14 + monthly + 0.6 http://blog.tunpok.com/2020/04/09/leetcode-he-wei-sde-lian-xu-zheng-shu-xu-lie-lcof/ - 2020-04-14T15:29:40.000Z + 2020-04-14 + monthly + 0.6 http://blog.tunpok.com/2020/04/14/leetcode-design-twitter/ - 2020-04-14T15:29:34.000Z + 2020-04-14 + monthly + 0.6 http://blog.tunpok.com/2020/04/14/leetcode-add-two-numbers-ii/ - 2020-04-14T15:28:35.000Z + 2020-04-14 + monthly + 0.6 http://blog.tunpok.com/2020/04/01/leetcode-1103/ - 2020-04-08T17:17:27.000Z + 2020-04-08 + monthly + 0.6 http://blog.tunpok.com/2020/04/09/leetcode-the-masseuse-lcci/ - 2020-04-08T17:14:04.000Z + 2020-04-08 + monthly + 0.6 http://blog.tunpok.com/2020/04/01/leetcode-compress-string-lcci/ - 2020-04-01T07:57:26.000Z + 2020-04-01 + monthly + 0.6 http://blog.tunpok.com/2020/04/01/leetcode-1160/ - 2020-04-01T07:57:06.000Z + 2020-04-01 + monthly + 0.6 http://blog.tunpok.com/2020/03/30/leetcode-1071/ - 2020-03-30T14:04:17.000Z + 2020-03-30 + monthly + 0.6 http://blog.tunpok.com/2020/03/30/leetcode-999/ - 2020-03-30T13:03:41.000Z + 2020-03-30 + monthly + 0.6 http://blog.tunpok.com/2020/03/29/leetcode-914/ - 2020-03-29T14:52:07.000Z + 2020-03-29 + monthly + 0.6 http://blog.tunpok.com/2020/03/29/leetcode-1013/ - 2020-03-29T13:15:11.000Z + 2020-03-29 + monthly + 0.6 http://blog.tunpok.com/2020/03/26/leetcode-876/ - 2020-03-26T13:19:10.000Z + 2020-03-26 + monthly + 0.6 http://blog.tunpok.com/2020/03/25/leetcode-836/ - 2020-03-25T14:41:44.000Z + 2020-03-25 + monthly + 0.6 http://blog.tunpok.com/2020/03/25/leetcode-409/ - 2020-03-25T13:55:54.000Z + 2020-03-25 + monthly + 0.6 http://blog.tunpok.com/2020/03/23/leetcode-225/ - 2020-03-23T15:35:24.000Z + 2020-03-23 + monthly + 0.6 http://blog.tunpok.com/2020/03/23/leetcode-169/ - 2020-03-23T15:13:49.000Z + 2020-03-23 + monthly + 0.6 http://blog.tunpok.com/2020/03/18/leetcode-206/ - 2020-03-18T15:44:12.000Z + 2020-03-18 + monthly + 0.6 http://blog.tunpok.com/2020/03/17/leetcode-121/ - 2020-03-17T10:54:03.000Z + 2020-03-17 + monthly + 0.6 http://blog.tunpok.com/2019/11/14/AWS-KMS/ - 2019-11-14T08:03:24.000Z + 2019-11-14 + monthly + 0.6 http://blog.tunpok.com/2018/05/31/bash-function-and-awk/ - 2019-11-14T08:01:50.000Z + 2019-11-14 + monthly + 0.6 http://blog.tunpok.com/2019/03/12/Postgresql-Partitioning/ - 2019-11-14T08:01:50.000Z + 2019-11-14 + monthly + 0.6 http://blog.tunpok.com/2016/04/25/Django-Manager-Method/ - 2018-05-15T14:58:35.000Z + 2018-05-15 + monthly + 0.6 http://blog.tunpok.com/2016/02/15/Flask-Day-1/ - 2018-05-15T14:58:35.000Z + 2018-05-15 + monthly + 0.6 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 + 2018-05-15 + monthly + 0.6 http://blog.tunpok.com/2016/05/10/TastyPie-Note-1/ - 2018-05-15T14:58:35.000Z + 2018-05-15 + monthly + 0.6 + + + + http://blog.tunpok.com/2016/05/04/Tastypie/ + + 2018-05-15 + + monthly + 0.6 + + + + http://blog.tunpok.com/2016/02/12/first-post/ + + 2018-05-15 + + monthly + 0.6 + + + + + http://blog.tunpok.com/ + 2022-02-02 + daily + 1.0 + + + + + + + http://blog.tunpok.com/categories/leetcode/ + 2022-02-02 + weekly + 0.2