aboutsummaryrefslogtreecommitdiff
path: root/systems
diff options
context:
space:
mode:
Diffstat (limited to 'systems')
-rw-r--r--systems/backup-2/base.nix164
-rw-r--r--systems/backup-2/databases/mariadb_replication.nix271
-rw-r--r--systems/backup-2/databases/openldap_replication.nix165
-rw-r--r--systems/backup-2/databases/postgresql_replication.nix203
-rw-r--r--systems/backup-2/databases/redis_replication.nix171
-rw-r--r--systems/backup-2/databases/utils.nix30
-rw-r--r--systems/backup-2/flake.lock1159
-rw-r--r--systems/backup-2/flake.nix51
-rw-r--r--systems/backup-2/mail/relay.nix196
-rw-r--r--systems/backup-2/monitoring.nix117
-rw-r--r--systems/dilion/base.nix309
-rw-r--r--systems/dilion/flake.lock695
-rw-r--r--systems/dilion/flake.nix43
-rw-r--r--systems/dilion/monitoring.nix43
-rw-r--r--systems/dilion/ssh_ldap_regular.sh19
-rw-r--r--systems/dilion/vms.nix200
-rw-r--r--systems/dilion/vms/base_configuration.nix27
-rw-r--r--systems/dilion/vms/base_image.nix98
-rw-r--r--systems/dilion/vms/buildbot_configuration.nix73
-rw-r--r--systems/eldiron/base.nix371
-rw-r--r--systems/eldiron/buildbot/default.nix310
-rw-r--r--systems/eldiron/coturn.nix73
-rw-r--r--systems/eldiron/databases/default.nix56
-rw-r--r--systems/eldiron/databases/mariadb.nix188
-rw-r--r--systems/eldiron/databases/openldap/default.nix304
-rw-r--r--systems/eldiron/databases/postgresql.nix236
-rw-r--r--systems/eldiron/databases/redis.nix138
-rw-r--r--systems/eldiron/dns.nix290
-rw-r--r--systems/eldiron/duply_backup.nix151
-rw-r--r--systems/eldiron/ejabberd/default.nix141
-rw-r--r--systems/eldiron/ejabberd/ejabberd.yml231
-rwxr-xr-xsystems/eldiron/ejabberd/warn_xmpp_email.py112
-rw-r--r--systems/eldiron/flake.lock2758
-rw-r--r--systems/eldiron/flake.nix90
-rw-r--r--systems/eldiron/ftp.nix339
-rwxr-xr-xsystems/eldiron/ftp_sync.sh47
-rw-r--r--systems/eldiron/gemini/default.nix50
-rw-r--r--systems/eldiron/gemini/public/index.gmi70
-rw-r--r--systems/eldiron/gitolite/default.nix127
-rwxr-xr-xsystems/eldiron/gitolite/gitolite_ldap_groups.sh15
-rw-r--r--systems/eldiron/gitolite/ldap_gitolite.sh28
-rw-r--r--systems/eldiron/irc.nix80
-rw-r--r--systems/eldiron/mail/default.nix44
-rw-r--r--systems/eldiron/mail/dovecot.nix348
-rw-r--r--systems/eldiron/mail/postfix.nix497
-rw-r--r--systems/eldiron/mail/rspamd.nix88
-rwxr-xr-xsystems/eldiron/mail/scan_reported_mails21
-rwxr-xr-xsystems/eldiron/mail/sieve_bin/imapsieve_copy8
-rw-r--r--systems/eldiron/mail/sieve_scripts/backup.sieve7
-rw-r--r--systems/eldiron/mail/sieve_scripts/report_ham.sieve11
-rw-r--r--systems/eldiron/mail/sieve_scripts/report_spam.sieve3
-rw-r--r--systems/eldiron/mail/sympa.nix232
-rw-r--r--systems/eldiron/monitoring.nix51
-rw-r--r--systems/eldiron/mpd.nix60
-rw-r--r--systems/eldiron/pub/default.nix100
-rw-r--r--systems/eldiron/pub/ldap_pub.sh38
-rw-r--r--systems/eldiron/pub/restrict71
-rw-r--r--systems/eldiron/pub/tmux.restrict.conf43
-rw-r--r--systems/eldiron/tasks/default.nix384
-rw-r--r--systems/eldiron/tasks/www/index.php168
-rw-r--r--systems/eldiron/vpn/default.nix92
-rwxr-xr-xsystems/eldiron/vpn/tinc/host-down7
-rwxr-xr-xsystems/eldiron/vpn/tinc/host-up11
-rwxr-xr-xsystems/eldiron/vpn/tinc/tinc-down12
-rwxr-xr-xsystems/eldiron/vpn/tinc/tinc-up14
-rw-r--r--systems/eldiron/vpn/tinc/tinc.conf11
-rw-r--r--systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html1
-rw-r--r--systems/eldiron/websites/_www/index.htm9
-rw-r--r--systems/eldiron/websites/_www/maintenance_immae.html58
-rw-r--r--systems/eldiron/websites/_www/nossl.html11
-rw-r--r--systems/eldiron/websites/assets/default.nix98
-rw-r--r--systems/eldiron/websites/assets/static/favicon.pngbin0 -> 1734 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logger.pngbin0 -> 3340 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logger.txt3
-rw-r--r--systems/eldiron/websites/assets/static/logo.jpgbin0 -> 6931 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logo.txt7
-rw-r--r--systems/eldiron/websites/assets/static/logo_big.jpgbin0 -> 16390 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logo_big.txt7
-rw-r--r--systems/eldiron/websites/assets/static/logo_center.jpgbin0 -> 29509 bytes
-rw-r--r--systems/eldiron/websites/assets/static/logo_center.txt8
-rw-r--r--systems/eldiron/websites/assets/static/monitoring.pngbin0 -> 57395 bytes
-rw-r--r--systems/eldiron/websites/assets/static/monitoring.txt3
-rw-r--r--systems/eldiron/websites/assets/static/photos/ct.jpgbin0 -> 55914 bytes
-rw-r--r--systems/eldiron/websites/assets/static/photos/fretlink.jpgbin0 -> 1520106 bytes
-rw-r--r--systems/eldiron/websites/assets/static/photos/raton.jpgbin0 -> 17614 bytes
-rw-r--r--systems/eldiron/websites/cloud/add-htaccess.php70
-rw-r--r--systems/eldiron/websites/cloud/default.nix151
-rw-r--r--systems/eldiron/websites/cloud/farm.nix221
-rw-r--r--systems/eldiron/websites/commento/default.nix84
-rw-r--r--systems/eldiron/websites/cryptpad/default.nix89
-rw-r--r--systems/eldiron/websites/cryptpad/farm.nix186
-rw-r--r--systems/eldiron/websites/dav/davical.nix128
-rw-r--r--systems/eldiron/websites/dav/default.nix140
-rw-r--r--systems/eldiron/websites/dav/www/index.html42
-rw-r--r--systems/eldiron/websites/db/default.nix32
-rw-r--r--systems/eldiron/websites/default.nix319
-rw-r--r--systems/eldiron/websites/diaspora/default.nix224
-rw-r--r--systems/eldiron/websites/ether/default.nix251
-rw-r--r--systems/eldiron/websites/games/codenames/codenames.patch8306
-rw-r--r--systems/eldiron/websites/games/codenames/default.nix76
-rw-r--r--systems/eldiron/websites/games/codenames/deps.nix11
-rw-r--r--systems/eldiron/websites/games/codenames/elm-srcs.nix77
-rw-r--r--systems/eldiron/websites/games/codenames/frontend.nix22
-rw-r--r--systems/eldiron/websites/games/codenames/greenapid.nix18
-rw-r--r--systems/eldiron/websites/games/codenames/greenapid.patch39
-rw-r--r--systems/eldiron/websites/games/codenames/immae-assets.patch15
-rw-r--r--systems/eldiron/websites/games/codenames/node-packages.nix7622
-rw-r--r--systems/eldiron/websites/games/codenames/registry.datbin0 -> 105421 bytes
-rw-r--r--systems/eldiron/websites/games/codenames/shell.nix50
-rw-r--r--systems/eldiron/websites/games/codenames/wordlists/french.txt694
-rw-r--r--systems/eldiron/websites/games/terraforming-mars/default.nix75
-rw-r--r--systems/eldiron/websites/games/terraforming-mars/immae-assets.patch13
-rw-r--r--systems/eldiron/websites/games/terraforming-mars/node-packages.nix4353
-rw-r--r--systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix39
-rw-r--r--systems/eldiron/websites/git/cgit_js.html16
-rw-r--r--systems/eldiron/websites/git/default.nix98
-rw-r--r--systems/eldiron/websites/git/gitweb.nix124
-rw-r--r--systems/eldiron/websites/git/mantisbt.nix86
-rw-r--r--systems/eldiron/websites/im/default.nix118
-rw-r--r--systems/eldiron/websites/im/www/converse.html57
-rw-r--r--systems/eldiron/websites/im/www/index.html47
-rw-r--r--systems/eldiron/websites/immae/matrix/client11
-rw-r--r--systems/eldiron/websites/immae/matrix/server3
-rw-r--r--systems/eldiron/websites/immae/production.nix107
-rw-r--r--systems/eldiron/websites/immae/release.nix40
-rw-r--r--systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt23
-rw-r--r--systems/eldiron/websites/kanboard/farm.nix183
-rw-r--r--systems/eldiron/websites/mail/default.nix141
-rw-r--r--systems/eldiron/websites/mail/mta-sts.nix42
-rw-r--r--systems/eldiron/websites/mail/rainloop.nix54
-rw-r--r--systems/eldiron/websites/mail/roundcubemail.nix119
-rw-r--r--systems/eldiron/websites/mail/www/index.html74
-rw-r--r--systems/eldiron/websites/mastodon/default.nix174
-rw-r--r--systems/eldiron/websites/mgoblin/default.nix173
-rw-r--r--systems/eldiron/websites/moomin.txt16
-rw-r--r--systems/eldiron/websites/nossl/index.html11
-rw-r--r--systems/eldiron/websites/peertube/default.nix147
-rw-r--r--systems/eldiron/websites/performance/default.nix93
-rw-r--r--systems/eldiron/websites/stats/default.nix51
-rw-r--r--systems/eldiron/websites/tools/adminer.nix83
-rw-r--r--systems/eldiron/websites/tools/default.nix547
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports.nix61
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports/api.php122
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports/app.js103
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports/default.css130
-rw-r--r--systems/eldiron/websites/tools/dmarc_reports/index.html128
-rw-r--r--systems/eldiron/websites/tools/dokuwiki.nix106
-rw-r--r--systems/eldiron/websites/tools/grocy.nix48
-rw-r--r--systems/eldiron/websites/tools/kanboard.nix81
-rw-r--r--systems/eldiron/websites/tools/landing.nix38
-rw-r--r--systems/eldiron/websites/tools/landing/ldap_password.php170
-rw-r--r--systems/eldiron/websites/tools/landing/ldap_ssh_keys.php343
-rw-r--r--systems/eldiron/websites/tools/landing/myip.php1
-rw-r--r--systems/eldiron/websites/tools/landing/node-packages.nix130
-rw-r--r--systems/eldiron/websites/tools/landing/yarn-packages.nix9357
-rw-r--r--systems/eldiron/websites/tools/ldap.nix77
-rw-r--r--systems/eldiron/websites/tools/phpbb.nix69
-rw-r--r--systems/eldiron/websites/tools/rompr.nix86
-rw-r--r--systems/eldiron/websites/tools/shaarli.nix102
-rw-r--r--systems/eldiron/websites/tools/ttrss.nix167
-rw-r--r--systems/eldiron/websites/tools/wallabag.nix180
-rw-r--r--systems/eldiron/websites/tools/webhooks.nix25
-rw-r--r--systems/eldiron/websites/tools/ympd.nix54
-rw-r--r--systems/eldiron/websites/tools/yourls.nix118
-rw-r--r--systems/eldiron/websites/visio/default.nix63
-rw-r--r--systems/eldiron/websites/vpn/default.nix13
-rw-r--r--systems/eldiron/websites/vpn/www/index.html91
-rw-r--r--systems/eldiron/websites/vpn/www/style.css61
-rw-r--r--systems/eldiron/webstats/default.nix80
-rw-r--r--systems/eldiron/webstats/goaccess.conf100
-rw-r--r--systems/monitoring-1/base.nix75
-rw-r--r--systems/monitoring-1/flake.lock790
-rw-r--r--systems/monitoring-1/flake.nix45
-rw-r--r--systems/monitoring-1/monitoring-master.nix87
-rw-r--r--systems/monitoring-1/monitoring.nix61
-rw-r--r--systems/monitoring-1/monitoring/master.nix43
-rw-r--r--systems/monitoring-1/monitoring/phare.nix20
-rw-r--r--systems/monitoring-1/monitoring/ulminfo-fr.nix20
-rw-r--r--systems/monitoring-1/status.nix84
-rwxr-xr-xsystems/monitoring-1/status/app.py414
-rw-r--r--systems/monitoring-1/status_engine.nix123
-rw-r--r--systems/quatresaisons/flake.lock767
-rw-r--r--systems/quatresaisons/flake.nix49
-rw-r--r--systems/zoldene/Immae.pub322
-rw-r--r--systems/zoldene/base.nix122
-rw-r--r--systems/zoldene/disko.nix87
-rw-r--r--systems/zoldene/flake.lock560
-rw-r--r--systems/zoldene/flake.nix29
-rw-r--r--systems/zoldene/logging.nix138
189 files changed, 54690 insertions, 0 deletions
diff --git a/systems/backup-2/base.nix b/systems/backup-2/base.nix
new file mode 100644
index 0000000..97a364c
--- /dev/null
+++ b/systems/backup-2/base.nix
@@ -0,0 +1,164 @@
1{ config, pkgs, resources, name, lib, nixpkgs, secrets, ... }:
2{
3 # ssh-keyscan backup-2 | nix-shell -p ssh-to-age --run ssh-to-age
4 secrets.ageKeys = [ "age1kk3nr27qu42j28mcfdag5lhq0zu2pky7gfanvne8l4z2ctevjpgskmw0sr" ];
5 secrets.keys = {
6 "rsync_backup/identity" = {
7 user = "backup";
8 group = "backup";
9 permissions = "0400";
10 text = config.myEnv.rsync_backup.ssh_key.private;
11 };
12 "rsync_backup/identity.pub" = {
13 user = "backup";
14 group = "backup";
15 permissions = "0444";
16 text = config.myEnv.rsync_backup.ssh_key.public;
17 };
18 };
19 boot.kernelPackages = pkgs.linuxPackages_latest;
20
21 nixpkgs.config.permittedInsecurePackages = [
22 "python-2.7.18.6" # for nagios-cli
23 ];
24
25 imports =
26 [
27 secrets.nixosModules.users-config-backup-2
28 (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix")
29 ./databases/mariadb_replication.nix
30 ./databases/openldap_replication.nix
31 ./databases/postgresql_replication.nix
32 ./databases/redis_replication.nix
33 ./mail/relay.nix
34 ./monitoring.nix
35 ];
36
37 fileSystems = {
38 "/backup2" = {
39 fsType = "ext4";
40 device = "UUID=b9425333-f567-435d-94d8-b26c22d93426";
41 };
42 "/" = { device = "/dev/sda1"; fsType = "ext4"; };
43 };
44
45 networking = {
46 firewall.enable = true;
47 interfaces."ens3".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
48 (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or []))
49 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips));
50 interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
51 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
52 config.hostEnv.ips);
53 defaultGateway6 = { address = "fe80::1"; interface = "ens3"; };
54 };
55
56 boot.loader.grub.device = "nodev";
57
58 security.acme.certs."${name}" = {
59 group = config.services.nginx.group;
60 };
61 services.nginx = {
62 enable = true;
63 recommendedOptimisation = true;
64 recommendedGzipSettings = true;
65 recommendedProxySettings = true;
66 };
67 networking.firewall.allowedTCPPorts = [ 80 443 ];
68
69 services.cron = {
70 mailto = "cron@immae.eu";
71 enable = true;
72 };
73
74 myServices.chatonsProperties.hostings.rsync-backup = {
75 file.datetime = "2022-08-27T16:00:00";
76 hosting = {
77 name = "Rsync backups";
78 description = "Remote initiated rsync backups";
79 website = "backup-2.v.immae.eu";
80 status.level = "OK";
81 status.description = "OK";
82 registration.load = "OPEN";
83 install.type = "PACKAGE";
84 };
85 software = {
86 name = "rsync";
87 website = "https://rsync.samba.org/";
88 license.url = "https://rsync.samba.org/GPL.html";
89 license.name = "GNU General Public License version 3";
90 version = pkgs.rsync.version;
91 source.url = "https://github.com/WayneD/rsync";
92 };
93 };
94
95 services.rsyncBackup = {
96 mountpoint = "/backup2";
97 profiles = config.myEnv.rsync_backup.profiles;
98 ssh_key_public = config.secrets.fullPaths."rsync_backup/identity.pub";
99 ssh_key_private = config.secrets.fullPaths."rsync_backup/identity";
100 };
101
102 myServices.mailRelay.enable = true;
103 myServices.mailBackup.enable = true;
104 myServices.monitoring.enable = true;
105 myServices.databasesReplication = {
106 postgresql = {
107 enable = true;
108 base = "/backup2";
109 mainPackage = pkgs.postgresql;
110 hosts = {
111 eldiron = {
112 slot = "backup_2";
113 connection = "postgresql://backup-2:${config.hostEnv.ldap.password}@eldiron.immae.eu";
114 package = pkgs.postgresql;
115 };
116 };
117 };
118 mariadb = {
119 enable = true;
120 base = "/backup2";
121 hosts = {
122 eldiron = {
123 serverId = 2;
124 # mysql resolves "backup-2" host and checks the ip, but uses /etc/hosts which only contains ip4
125 host = lib.head config.myEnv.servers.eldiron.ips.main.ip4;
126 port = config.myEnv.databases.mysql.port;
127 user = "backup-2";
128 password = config.hostEnv.ldap.password;
129 dumpUser = "root";
130 dumpPassword = config.myEnv.databases.mysql.systemUsers.root;
131 };
132 };
133 };
134 redis = {
135 enable = true;
136 base = "/backup2";
137 hosts = {
138 eldiron = {
139 host = "127.0.0.1";
140 port = "16379";
141 };
142 };
143 };
144 openldap = {
145 enable = true;
146 base = "/backup2";
147 hosts = {
148 eldiron = {
149 url = "ldaps://${config.myEnv.ldap.host}:636";
150 dn = config.myEnv.ldap.replication_dn;
151 password = config.myEnv.ldap.replication_pw;
152 base = config.myEnv.ldap.base;
153 };
154 };
155 };
156 };
157
158 # This value determines the NixOS release with which your system is
159 # to be compatible, in order to avoid breaking some software such as
160 # database servers. You should change this only after NixOS release
161 # notes say you should.
162 # https://nixos.org/nixos/manual/release-notes.html
163 system.stateVersion = "23.05"; # Did you read the comment?
164}
diff --git a/systems/backup-2/databases/mariadb_replication.nix b/systems/backup-2/databases/mariadb_replication.nix
new file mode 100644
index 0000000..8d2b457
--- /dev/null
+++ b/systems/backup-2/databases/mariadb_replication.nix
@@ -0,0 +1,271 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.mariadb;
4in
5{
6 options.myServices.databasesReplication.mariadb = {
7 enable = lib.mkEnableOption "Enable mariadb replication";
8 base = lib.mkOption {
9 type = lib.types.path;
10 description = ''
11 Base path to put the replications
12 '';
13 };
14 hosts = lib.mkOption {
15 default = {};
16 description = ''
17 Hosts to backup
18 '';
19 type = lib.types.attrsOf (lib.types.submodule {
20 options = {
21 package = lib.mkOption {
22 type = lib.types.package;
23 default = pkgs.mariadb;
24 description = ''
25 Mariadb package for this host
26 '';
27 };
28 serverId = lib.mkOption {
29 type = lib.types.int;
30 description = ''
31 Server id to use for replication cluster (must be unique among the cluster!)
32 '';
33 };
34 host = lib.mkOption {
35 type = lib.types.str;
36 description = ''
37 Host to connect to
38 '';
39 };
40 port = lib.mkOption {
41 type = lib.types.int;
42 description = ''
43 Port to connect to
44 '';
45 };
46 user = lib.mkOption {
47 type = lib.types.str;
48 description = ''
49 User to connect as
50 '';
51 };
52 password = lib.mkOption {
53 type = lib.types.str;
54 description = ''
55 Password to use
56 '';
57 };
58 dumpUser = lib.mkOption {
59 type = lib.types.str;
60 description = ''
61 User who can do a dump
62 '';
63 };
64 dumpPassword = lib.mkOption {
65 type = lib.types.str;
66 description = ''
67 Password for the dump user
68 '';
69 };
70 };
71 });
72 };
73 };
74
75 config = lib.mkIf cfg.enable {
76 myServices.chatonsProperties.hostings.mysql-replication = {
77 file.datetime = "2022-08-27T15:00:00";
78 hosting = {
79 name = "Mysql replication";
80 description = "Replication of mysql database";
81 website = "db-1.immae.eu";
82 status.level = "OK";
83 status.description = "OK";
84 registration.load = "OPEN";
85 install.type = "PACKAGE";
86 };
87 software = {
88 name = "MariaDB";
89 website = "https://mariadb.org/";
90 license.url = "https://github.com/MariaDB/server/blob/10.11/COPYING";
91 license.name = "GNU General Public License v2.0";
92 version = pkgs.mariadb.version;
93 source.url = "https://github.com/MariaDB/server";
94 };
95 };
96 users.users.mysql = {
97 description = "MySQL server user";
98 group = "mysql";
99 uid = config.ids.uids.mysql;
100 extraGroups = [ "keys" ];
101 };
102 users.groups.mysql.gid = config.ids.gids.mysql;
103
104 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (name: hcfg: [
105 (lib.nameValuePair "mysql_replication/${name}/slave_init_commands" {
106 user = "mysql";
107 group = "mysql";
108 permissions = "0400";
109 text = ''
110 CHANGE MASTER TO master_host="${hcfg.host}", master_port=${builtins.toString hcfg.port}, master_user="${hcfg.user}", master_password="${hcfg.password}", master_ssl=1, master_use_gtid=slave_pos;
111 START SLAVE;
112 '';
113 })
114 (lib.nameValuePair "mysql_replication/${name}/mysqldump_remote" {
115 permissions = "0400";
116 user = "root";
117 group = "root";
118 text = ''
119 [mysqldump]
120 user = ${hcfg.user}
121 password = ${hcfg.password}
122 '';
123 })
124 (lib.nameValuePair "mysql_replication/${name}/mysqldump" {
125 permissions = "0400";
126 user = "root";
127 group = "root";
128 text = ''
129 [mysqldump]
130 user = ${hcfg.dumpUser}
131 password = ${hcfg.dumpPassword}
132 '';
133 })
134 (lib.nameValuePair "mysql_replication/${name}/client" {
135 permissions = "0400";
136 user = "mysql";
137 group = "mysql";
138 text = ''
139 [client]
140 user = ${hcfg.dumpUser}
141 password = ${hcfg.dumpPassword}
142 '';
143 })
144 ]) cfg.hosts));
145
146 services.cron = {
147 enable = true;
148 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
149 let
150 dataDir = "${cfg.base}/${name}/mysql";
151 backupDir = "${cfg.base}/${name}/mysql_backup";
152 backup_script = pkgs.writeScript "backup_mysql_${name}" ''
153 #!${pkgs.stdenv.shell}
154
155 set -euo pipefail
156
157 filename=${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).sql
158 ${hcfg.package}/bin/mysqldump \
159 --defaults-file=${config.secrets.fullPaths."mysql_replication/${name}/mysqldump"} \
160 -S /run/mysqld_${name}/mysqld.sock \
161 --gtid \
162 --master-data \
163 --flush-privileges \
164 --ignore-database=netdata \
165 --all-databases > $filename
166 ${pkgs.gzip}/bin/gzip $filename
167 '';
168 u = pkgs.callPackage ./utils.nix {};
169 cleanup_script = pkgs.writeScript "cleanup_mysql_${name}" (u.exponentialDumps "sql.gz" backupDir);
170 in [
171 "0 22,4,10,16 * * * root ${backup_script}"
172 "0 3 * * * root ${cleanup_script}"
173 ]) cfg.hosts);
174 };
175
176 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
177 lib.attrsets.nameValuePair "mysql_replication_${name}" {
178 deps = [ "users" "groups" ];
179 text = ''
180 install -m 0700 -o mysql -g mysql -d ${cfg.base}/${name}/mysql
181 install -m 0700 -o mysql -g mysql -d ${cfg.base}/${name}/mysql_backup
182 '';
183 }) cfg.hosts;
184
185 environment.etc = lib.attrsets.mapAttrs' (name: hcfg:
186 lib.attrsets.nameValuePair "mysql/${name}_my.cnf" {
187 text = ''
188 [mysqld]
189 skip-networking
190 socket = /run/mysqld_${name}/mysqld.sock
191 datadir = ${cfg.base}/${name}/mysql/
192 log-bin = mariadb-bin
193 server-id = ${builtins.toString hcfg.serverId}
194 '';
195 }
196 ) cfg.hosts;
197
198 systemd.services = lib.attrsets.mapAttrs' (name: hcfg:
199 let
200 dataDir = "${cfg.base}/${name}/mysql";
201 in
202 lib.attrsets.nameValuePair "mysql_backup_${name}" {
203 description = "Mysql replication for ${name}";
204 wantedBy = [ "multi-user.target" ];
205 after = [ "network.target" ];
206 restartTriggers = [ config.environment.etc."mysql/${name}_my.cnf".source ];
207 unitConfig.RequiresMountsFor = dataDir;
208
209 preStart = ''
210 if ! test -e ${dataDir}/mysql; then
211 if ! test -e ${dataDir}/initial.sql; then
212 ${hcfg.package}/bin/mysqldump \
213 --defaults-file=${config.secrets.fullPaths."mysql_replication/${name}/mysqldump_remote"} \
214 -h ${hcfg.host} \
215 -P ${builtins.toString hcfg.port} \
216 --ssl \
217 --gtid \
218 --flush-privileges \
219 --master-data \
220 --all-databases > ${dataDir}/initial.sql
221 fi
222
223 ${hcfg.package}/bin/mysql_install_db \
224 --defaults-file=/etc/mysql/${name}_my.cnf \
225 --user=mysql \
226 --datadir=${dataDir} \
227 --basedir=${hcfg.package}
228 fi
229 '';
230
231 serviceConfig = {
232 User = "mysql";
233 Group = "mysql";
234 RuntimeDirectory = "mysqld_${name}";
235 RuntimeDirectoryMode = "0755";
236 SupplementaryGroups = "keys";
237 PermissionsStartOnly = true;
238 Type = "notify";
239
240 ExecStart = "${hcfg.package}/bin/mysqld --defaults-file=/etc/mysql/${name}_my.cnf --user=mysql --datadir=${dataDir} --basedir=${hcfg.package}";
241 ExecStartPost =
242 let
243 sql_before = pkgs.writeText "mysql-initial-before" ''
244 DROP DATABASE test;
245 INSTALL SONAME 'auth_pam';
246 '';
247 setupScript = pkgs.writeScript "mysql-setup" ''
248 #!${pkgs.runtimeShell} -e
249
250 if test -e ${dataDir}/initial.sql; then
251 cat \
252 ${sql_before} \
253 ${dataDir}/initial.sql \
254 ${config.secrets.fullPaths."mysql_replication/${name}/slave_init_commands"} \
255 | ${hcfg.package}/bin/mysql \
256 --defaults-file=/etc/mysql/${name}_my.cnf \
257 -S /run/mysqld_${name}/mysqld.sock \
258 --user=root
259 rm -f ${dataDir}/initial.sql
260 fi
261 '';
262 in
263 "+${setupScript}";
264 # initial dump can take a long time
265 TimeoutStartSec="infinity";
266 TimeoutStopSec = 120;
267 };
268 }) cfg.hosts;
269 };
270}
271
diff --git a/systems/backup-2/databases/openldap_replication.nix b/systems/backup-2/databases/openldap_replication.nix
new file mode 100644
index 0000000..b962224
--- /dev/null
+++ b/systems/backup-2/databases/openldap_replication.nix
@@ -0,0 +1,165 @@
1{ pkgs, config, lib, openldap, ... }:
2let
3 cfg = config.myServices.databasesReplication.openldap;
4 ldapConfig = hcfg: name: pkgs.writeText "slapd.conf" ''
5 include ${pkgs.openldap}/etc/schema/core.schema
6 include ${pkgs.openldap}/etc/schema/cosine.schema
7 include ${pkgs.openldap}/etc/schema/inetorgperson.schema
8 include ${pkgs.openldap}/etc/schema/nis.schema
9 include ${openldap.immae-schema}
10 pidfile /run/slapd_${name}/slapd.pid
11 argsfile /run/slapd_${name}/slapd.args
12
13 moduleload back_mdb
14 backend mdb
15 database mdb
16
17 suffix "${hcfg.base}"
18 rootdn "cn=root,${hcfg.base}"
19 directory ${cfg.base}/${name}/openldap
20
21 index objectClass eq
22 index uid pres,eq
23 index entryUUID eq
24
25 include ${config.secrets.fullPaths."openldap_replication/${name}/replication_config"}
26 '';
27in
28{
29 options.myServices.databasesReplication.openldap = {
30 enable = lib.mkEnableOption "Enable openldap replication";
31 base = lib.mkOption {
32 type = lib.types.path;
33 description = ''
34 Base path to put the replications
35 '';
36 };
37 hosts = lib.mkOption {
38 default = {};
39 description = ''
40 Hosts to backup
41 '';
42 type = lib.types.attrsOf (lib.types.submodule {
43 options = {
44 package = lib.mkOption {
45 type = lib.types.package;
46 default = pkgs.openldap;
47 description = ''
48 Openldap package for this host
49 '';
50 };
51 url = lib.mkOption {
52 type = lib.types.str;
53 description = ''
54 Host to connect to
55 '';
56 };
57 base = lib.mkOption {
58 type = lib.types.str;
59 description = ''
60 Base DN to replicate
61 '';
62 };
63 dn = lib.mkOption {
64 type = lib.types.str;
65 description = ''
66 DN to use
67 '';
68 };
69 password = lib.mkOption {
70 type = lib.types.str;
71 description = ''
72 Password to use
73 '';
74 };
75 };
76 });
77 };
78 };
79
80 config = lib.mkIf cfg.enable {
81 users.users.openldap = {
82 description = "Openldap database user";
83 group = "openldap";
84 uid = config.ids.uids.openldap;
85 extraGroups = [ "keys" ];
86 };
87 users.groups.openldap.gid = config.ids.gids.openldap;
88
89 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (name: hcfg: [
90 (lib.nameValuePair "openldap_replication/${name}/replication_config" {
91 user = "openldap";
92 group = "openldap";
93 permissions = "0400";
94 text = ''
95 syncrepl rid=000
96 provider=${hcfg.url}
97 type=refreshAndPersist
98 searchbase="${hcfg.base}"
99 retry="5 10 300 +"
100 attrs="*,+"
101 schemachecking=off
102 bindmethod=simple
103 binddn="${hcfg.dn}"
104 credentials="${hcfg.password}"
105 '';
106 })
107 (lib.nameValuePair "openldap_replication/${name}/replication_password" {
108 user = "openldap";
109 group = "openldap";
110 permissions = "0400";
111 text = hcfg.password;
112 })
113 ]) cfg.hosts));
114
115 services.cron = {
116 enable = true;
117 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
118 let
119 dataDir = "${cfg.base}/${name}/openldap";
120 backupDir = "${cfg.base}/${name}/openldap_backup";
121 backup_script = pkgs.writeScript "backup_openldap_${name}" ''
122 #!${pkgs.stdenv.shell}
123
124 ${hcfg.package}/bin/slapcat -b "${hcfg.base}" -f ${ldapConfig hcfg name} -l ${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).ldif
125 '';
126 u = pkgs.callPackage ./utils.nix {};
127 cleanup_script = pkgs.writeScript "cleanup_openldap_${name}" (u.exponentialDumps "ldif" backupDir);
128 in [
129 "0 22,4,10,16 * * * root ${backup_script}"
130 "0 3 * * * root ${cleanup_script}"
131 ]) cfg.hosts);
132 };
133
134 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
135 lib.attrsets.nameValuePair "openldap_replication_${name}" {
136 deps = [ "users" "groups" ];
137 text = ''
138 install -m 0700 -o openldap -g openldap -d ${cfg.base}/${name}/openldap
139 install -m 0700 -o openldap -g openldap -d ${cfg.base}/${name}/openldap_backup
140 '';
141 }) cfg.hosts;
142
143 systemd.services = lib.attrsets.mapAttrs' (name: hcfg:
144 let
145 dataDir = "${cfg.base}/${name}/openldap";
146 in
147 lib.attrsets.nameValuePair "openldap_backup_${name}" {
148 description = "Openldap replication for ${name}";
149 wantedBy = [ "multi-user.target" ];
150 after = [ "network.target" ];
151 unitConfig.RequiresMountsFor = dataDir;
152
153 preStart = ''
154 mkdir -p /run/slapd_${name}
155 chown -R "openldap:openldap" /run/slapd_${name}
156 '';
157
158 serviceConfig = {
159 ExecStart = "${hcfg.package}/libexec/slapd -d 0 -u openldap -g openldap -f ${ldapConfig hcfg name}";
160 };
161 }) cfg.hosts;
162 };
163}
164
165
diff --git a/systems/backup-2/databases/postgresql_replication.nix b/systems/backup-2/databases/postgresql_replication.nix
new file mode 100644
index 0000000..5351a4f
--- /dev/null
+++ b/systems/backup-2/databases/postgresql_replication.nix
@@ -0,0 +1,203 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.postgresql;
4in
5{
6 options.myServices.databasesReplication.postgresql = {
7 enable = lib.mkEnableOption "Enable postgresql replication";
8 base = lib.mkOption {
9 type = lib.types.path;
10 description = ''
11 Base path to put the replications
12 '';
13 };
14 mainPackage = lib.mkOption {
15 type = lib.types.package;
16 default = pkgs.postgresql;
17 description = ''
18 Postgresql package available in shell
19 '';
20 };
21 hosts = lib.mkOption {
22 default = {};
23 description = ''
24 Hosts to backup
25 '';
26 type = lib.types.attrsOf (lib.types.submodule {
27 options = {
28 package = lib.mkOption {
29 type = lib.types.package;
30 default = pkgs.postgresql;
31 description = ''
32 Postgresql package for this host
33 '';
34 };
35 slot = lib.mkOption {
36 type = lib.types.str;
37 description = ''
38 Slot to use for replication
39 '';
40 };
41 connection = lib.mkOption {
42 type = lib.types.str;
43 description = ''
44 Connection string to access the psql master
45 '';
46 };
47 };
48 });
49 };
50 };
51
52 config = lib.mkIf cfg.enable {
53 myServices.chatonsProperties.hostings.postgresql-replication = {
54 file.datetime = "2022-08-27T15:00:00";
55 hosting = {
56 name = "PostgreSQL replication";
57 description = "Replication of PostgreSQL database";
58 website = "db-1.immae.eu";
59 status.level = "OK";
60 status.description = "OK";
61 registration.load = "OPEN";
62 install.type = "PACKAGE";
63 };
64 software = {
65 name = "PostgreSQL";
66 website = "https://www.postgresql.org/";
67 license.url = "https://www.postgresql.org/about/licence/";
68 license.name = "The PostgreSQL Licence";
69 version = pkgs.postgresql.version;
70 source.url = "https://git.postgresql.org/gitweb/?p=postgresql.git;a=summary";
71 };
72 };
73 users.users.postgres = {
74 name = "postgres";
75 uid = config.ids.uids.postgres;
76 group = "postgres";
77 description = "PostgreSQL server user";
78 home = "/var/lib/postgresql";
79 useDefaultShell = true;
80 extraGroups = [ "keys" ];
81 };
82 users.groups.postgres.gid = config.ids.gids.postgres;
83 environment.systemPackages = [ cfg.mainPackage ];
84
85 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (name: hcfg: [
86 (lib.nameValuePair "postgresql_replication/${name}/recovery.conf" {
87 user = "postgres";
88 group = "postgres";
89 permissions = "0400";
90 text = ''
91 standby_mode = on
92 primary_conninfo = '${hcfg.connection}?sslmode=require'
93 primary_slot_name = '${hcfg.slot}'
94 '';
95 })
96 (lib.nameValuePair "postgresql_replication/${name}/connection_string" {
97 user = "postgres";
98 group = "postgres";
99 permissions = "0400";
100 text = hcfg.connection;
101 })
102 (lib.nameValuePair "postgresql_replication/${name}/postgresql.conf" {
103 user = "postgres";
104 group = "postgres";
105 permissions = "0400";
106 text = let
107 dataDir = "${cfg.base}/${name}/postgresql";
108 in ''
109 listen_addresses = '''
110 unix_socket_directories = '${dataDir}'
111 data_directory = '${dataDir}'
112 wal_level = logical
113 max_connections = 300
114 '';
115 })
116 ]) cfg.hosts));
117
118 services.cron = {
119 enable = true;
120 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
121 let
122 dataDir = "${cfg.base}/${name}/postgresql";
123 backupDir = "${cfg.base}/${name}/postgresql_backup";
124 backup_script = pkgs.writeScript "backup_psql_${name}" ''
125 #!${pkgs.stdenv.shell}
126
127 set -euo pipefail
128
129 resume_replication() {
130 ${hcfg.package}/bin/psql -h ${dataDir} -c "SELECT pg_wal_replay_resume();" >/dev/null || echo "impossible to resume replication"
131 }
132
133 trap resume_replication EXIT
134
135 ${hcfg.package}/bin/psql -h ${dataDir} -c "SELECT pg_wal_replay_pause();" >/dev/null || (echo "impossible to pause replication" && false)
136
137 ${hcfg.package}/bin/pg_dumpall -h ${dataDir} -f ${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).sql
138 '';
139 u = pkgs.callPackage ./utils.nix {};
140 cleanup_script = pkgs.writeScript "cleanup_postgresql_${name}" (u.keepLastNDumps "sql" backupDir 6);
141 in [
142 "0 22,4,10,16 * * * postgres ${backup_script}"
143 "0 3 * * * postgres ${cleanup_script}"
144 ]) cfg.hosts);
145 };
146
147 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
148 lib.attrsets.nameValuePair "psql_replication_${name}" {
149 deps = [ "users" ];
150 text = ''
151 install -m 0700 -o postgres -g postgres -d ${cfg.base}/${name}/postgresql
152 install -m 0700 -o postgres -g postgres -d ${cfg.base}/${name}/postgresql_backup
153 '';
154 }) cfg.hosts;
155
156 systemd.services = lib.attrsets.mapAttrs' (name: hcfg:
157 let
158 dataDir = "${cfg.base}/${name}/postgresql";
159 in
160 lib.attrsets.nameValuePair "postgresql_backup_${name}" {
161 description = "Postgresql replication for ${name}";
162 wantedBy = [ "multi-user.target" ];
163 after = [ "network.target" ];
164
165 environment.PGDATA = dataDir;
166 path = [ hcfg.package ];
167
168 preStart = ''
169 if ! test -e ${dataDir}/PG_VERSION; then
170 mkdir -m 0700 -p ${dataDir}
171 chown -R postgres:postgres ${dataDir}
172 fi
173 '';
174 script = let
175 fp = n: config.secrets.fullPaths."postgresql_replication/${name}/${n}";
176 in ''
177 if ! test -e ${dataDir}/PG_VERSION; then
178 pg_basebackup -d $(cat ${fp "connection_string"}) -D ${dataDir} -S ${hcfg.slot}
179 fi
180 ln -sfn ${fp "recovery.conf"} ${dataDir}/recovery.conf
181 ln -sfn ${fp "postgresql.conf"} ${dataDir}/postgresql.conf
182
183 exec postgres
184 '';
185
186 serviceConfig = {
187 ExecReload = "${pkgs.coreutils}/bin/kill -HUP $MAINPID";
188 User = "postgres";
189 Group = "postgres";
190 PermissionsStartOnly = true;
191 RuntimeDirectory = "postgresql";
192 Type = "notify";
193
194 KillSignal = "SIGINT";
195 KillMode = "mixed";
196 # basebackup can take a long time
197 TimeoutStartSec="infinity";
198 TimeoutStopSec = 120;
199 };
200 unitConfig.RequiresMountsFor = dataDir;
201 }) cfg.hosts;
202 };
203}
diff --git a/systems/backup-2/databases/redis_replication.nix b/systems/backup-2/databases/redis_replication.nix
new file mode 100644
index 0000000..53fa904
--- /dev/null
+++ b/systems/backup-2/databases/redis_replication.nix
@@ -0,0 +1,171 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.databasesReplication.redis;
4in
5{
6 options.myServices.databasesReplication.redis = {
7 enable = lib.mkEnableOption "Enable redis replication";
8 base = lib.mkOption {
9 type = lib.types.path;
10 description = ''
11 Base path to put the replications
12 '';
13 };
14 hosts = lib.mkOption {
15 default = {};
16 description = ''
17 Hosts to backup
18 '';
19 type = lib.types.attrsOf (lib.types.submodule {
20 options = {
21 package = lib.mkOption {
22 type = lib.types.package;
23 default = pkgs.redis;
24 description = ''
25 Redis package for this host
26 '';
27 };
28 host = lib.mkOption {
29 type = lib.types.str;
30 description = ''
31 Host to connect to
32 '';
33 };
34 port = lib.mkOption {
35 type = lib.types.str;
36 description = ''
37 Port to connect to
38 '';
39 };
40 password = lib.mkOption {
41 type = lib.types.nullOr lib.types.str;
42 default = null;
43 description = ''
44 Password to use
45 '';
46 };
47 };
48 });
49 };
50 };
51
52 config = lib.mkIf cfg.enable {
53 users.users.redis = {
54 description = "Redis database user";
55 group = "redis";
56 uid = config.ids.uids.redis;
57 extraGroups = [ "keys" ];
58 };
59 users.groups.redis.gid = config.ids.gids.redis;
60
61 services.spiped = { # sync from eldiron
62 enable = true;
63 config.redis = {
64 encrypt = true;
65 source = "127.0.0.1:16379";
66 target = "${lib.head config.myEnv.servers.eldiron.ips.main.ip4}:16379";
67 keyfile = config.secrets.fullPaths."redis/spiped_eldiron_keyfile";
68 };
69 };
70
71 secrets.keys = lib.mapAttrs' (name: hcfg:
72 lib.nameValuePair "redis_replication/${name}/config" {
73 user = "redis";
74 group = "redis";
75 permissions = "0400";
76 text = ''
77 pidfile ${cfg.base}/${name}/redis/redis.pid
78 port 0
79 unixsocket /run/redis_${name}/redis.sock
80 loglevel notice
81 logfile /dev/null
82 syslog-enabled yes
83 databases 16
84 save 900 1
85 save 300 10
86 save 60 10000
87 dbfilename dump.rdb
88 dir ${cfg.base}/${name}/redis/
89 slaveof ${hcfg.host} ${hcfg.port}
90 ${if hcfg.password != null then "masterauth ${hcfg.password}" else ""}
91 appendOnly no
92 appendfsync everysec
93 slowlog-log-slower-than 10000
94 slowlog-max-len 128
95 unixsocketperm 777
96 maxclients 1024
97 '';
98 }
99 ) cfg.hosts // {
100 "redis/spiped_eldiron_keyfile" = { # For eldiron only
101 user = "spiped";
102 group = "spiped";
103 permissions = "0400";
104 text = config.myEnv.databases.redis.spiped_key;
105 };
106 };
107
108 services.cron = {
109 enable = true;
110 systemCronJobs = lib.flatten (lib.mapAttrsToList (name: hcfg:
111 let
112 dataDir = "${cfg.base}/${name}/redis";
113 backupDir = "${cfg.base}/${name}/redis_backup";
114 backup_script = pkgs.writeScript "backup_redis_${name}" ''
115 #!${pkgs.stdenv.shell}
116
117 ${pkgs.coreutils}/bin/cp ${cfg.base}/${name}/redis/dump.rdb \
118 ${backupDir}/$(${pkgs.coreutils}/bin/date -Iminutes).rdb
119 '';
120 u = pkgs.callPackage ./utils.nix {};
121 cleanup_script = pkgs.writeScript "cleanup_redis_${name}" (u.exponentialDumps "rdb" backupDir);
122 in [
123 "0 22,4,10,16 * * * root ${backup_script}"
124 "0 3 * * * root ${cleanup_script}"
125 ]) cfg.hosts);
126 };
127
128 system.activationScripts = lib.attrsets.mapAttrs' (name: hcfg:
129 lib.attrsets.nameValuePair "redis_replication_${name}" {
130 deps = [ "users" "groups" ];
131 text = ''
132 install -m 0700 -o redis -g redis -d ${cfg.base}/${name}/redis
133 install -m 0700 -o redis -g redis -d ${cfg.base}/${name}/redis_backup
134 '';
135 }) cfg.hosts;
136
137 systemd.services = {
138 spiped_redis = { # For eldiron
139 description = "Secure pipe 'redis'";
140 after = [ "network.target" ];
141 wantedBy = [ "multi-user.target" ];
142
143 serviceConfig = {
144 Restart = "always";
145 User = "spiped";
146 PermissionsStartOnly = true;
147 SupplementaryGroups = "keys";
148 };
149
150 script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`";
151 };
152 } // lib.attrsets.mapAttrs' (name: hcfg:
153 let
154 dataDir = "${cfg.base}/${name}/redis";
155 in
156 lib.attrsets.nameValuePair "redis_backup_${name}" {
157 description = "Redis replication for ${name}";
158 wantedBy = [ "multi-user.target" ];
159 after = [ "network.target" ];
160 unitConfig.RequiresMountsFor = dataDir;
161
162 serviceConfig = {
163 ExecStart = "${hcfg.package}/bin/redis-server ${config.secrets.fullPaths."redis_replication/${name}/config"}";
164 User = "redis";
165 RuntimeDirectory = "redis_${name}";
166 };
167 }) cfg.hosts;
168 };
169}
170
171
diff --git a/systems/backup-2/databases/utils.nix b/systems/backup-2/databases/utils.nix
new file mode 100644
index 0000000..1b3190f
--- /dev/null
+++ b/systems/backup-2/databases/utils.nix
@@ -0,0 +1,30 @@
1{ pkgs }:
2{
3 keepLastNDumps = ext: backupDir: n: ''
4 #!${pkgs.stdenv.shell}
5
6 cd ${backupDir}
7 ${pkgs.coreutils}/bin/rm -f \
8 $(${pkgs.coreutils}/bin/ls -1 *.${ext} \
9 | ${pkgs.coreutils}/bin/sort -r \
10 | ${pkgs.gnused}/bin/sed -e '1,${builtins.toString n}d')
11 '';
12 exponentialDumps = ext: backupDir: let
13 log2rotateSrc = builtins.fetchGit {
14 url = "https://github.com/avian2/pylog2rotate";
15 ref = "master";
16 rev = "061f0564757289d3bea553b16f8fd5c4a0319c5e";
17 };
18 log2rotate = pkgs.writeScript "log2rotate" ''
19 #!${pkgs.python38}/bin/python
20
21 ${builtins.readFile "${log2rotateSrc}/log2rotate.py"}
22 '';
23 in ''
24 #!${pkgs.stdenv.shell}
25
26 cd ${backupDir}
27 ${pkgs.coreutils}/bin/rm -f $(ls -1 *.${ext} | grep -v 'T22:' | sort -r | sed -e '1,12d')
28 ${pkgs.coreutils}/bin/rm -f $(ls -1 *T22*.${ext} | ${log2rotate} --skip 7 --fuzz 7 --delete --format='%Y-%m-%dT%H:%M+00:00.${ext}')
29 '';
30}
diff --git a/systems/backup-2/flake.lock b/systems/backup-2/flake.lock
new file mode 100644
index 0000000..46003ba
--- /dev/null
+++ b/systems/backup-2/flake.lock
@@ -0,0 +1,1159 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_6",
6 "nixpkgs": "nixpkgs_10"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "chatons": {
20 "inputs": {
21 "environment": "environment"
22 },
23 "locked": {
24 "lastModified": 1,
25 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
26 "path": "../../flakes/private/chatons",
27 "type": "path"
28 },
29 "original": {
30 "path": "../../flakes/private/chatons",
31 "type": "path"
32 }
33 },
34 "colmena": {
35 "inputs": {
36 "flake-compat": "flake-compat",
37 "flake-utils": "flake-utils_3",
38 "nixpkgs": "nixpkgs_3",
39 "stable": "stable"
40 },
41 "locked": {
42 "lastModified": 1687954574,
43 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
44 "owner": "immae",
45 "repo": "colmena",
46 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
47 "type": "github"
48 },
49 "original": {
50 "owner": "immae",
51 "ref": "add-lib-get-flake",
52 "repo": "colmena",
53 "type": "github"
54 }
55 },
56 "disko": {
57 "inputs": {
58 "nixpkgs": "nixpkgs_4"
59 },
60 "locked": {
61 "lastModified": 1687968164,
62 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
63 "owner": "nix-community",
64 "repo": "disko",
65 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
66 "type": "github"
67 },
68 "original": {
69 "owner": "nix-community",
70 "repo": "disko",
71 "type": "github"
72 }
73 },
74 "environment": {
75 "locked": {
76 "lastModified": 1,
77 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
78 "path": "../environment",
79 "type": "path"
80 },
81 "original": {
82 "path": "../environment",
83 "type": "path"
84 }
85 },
86 "environment_2": {
87 "locked": {
88 "lastModified": 1,
89 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
90 "path": "../../flakes/private/environment",
91 "type": "path"
92 },
93 "original": {
94 "path": "../../flakes/private/environment",
95 "type": "path"
96 }
97 },
98 "environment_3": {
99 "locked": {
100 "lastModified": 1,
101 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
102 "path": "../environment",
103 "type": "path"
104 },
105 "original": {
106 "path": "../environment",
107 "type": "path"
108 }
109 },
110 "environment_4": {
111 "locked": {
112 "lastModified": 1,
113 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
114 "path": "../environment",
115 "type": "path"
116 },
117 "original": {
118 "path": "../environment",
119 "type": "path"
120 }
121 },
122 "environment_5": {
123 "locked": {
124 "lastModified": 1,
125 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
126 "path": "../environment",
127 "type": "path"
128 },
129 "original": {
130 "path": "../environment",
131 "type": "path"
132 }
133 },
134 "environment_6": {
135 "locked": {
136 "lastModified": 1,
137 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
138 "path": "../environment",
139 "type": "path"
140 },
141 "original": {
142 "path": "../environment",
143 "type": "path"
144 }
145 },
146 "environment_7": {
147 "locked": {
148 "lastModified": 1,
149 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
150 "path": "../environment",
151 "type": "path"
152 },
153 "original": {
154 "path": "../environment",
155 "type": "path"
156 }
157 },
158 "files-watcher": {
159 "locked": {
160 "lastModified": 1,
161 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
162 "path": "../../files-watcher",
163 "type": "path"
164 },
165 "original": {
166 "path": "../../files-watcher",
167 "type": "path"
168 }
169 },
170 "files-watcher_2": {
171 "locked": {
172 "lastModified": 1,
173 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
174 "path": "../../files-watcher",
175 "type": "path"
176 },
177 "original": {
178 "path": "../../files-watcher",
179 "type": "path"
180 }
181 },
182 "files-watcher_3": {
183 "locked": {
184 "lastModified": 1,
185 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
186 "path": "../../files-watcher",
187 "type": "path"
188 },
189 "original": {
190 "path": "../../files-watcher",
191 "type": "path"
192 }
193 },
194 "flake-compat": {
195 "flake": false,
196 "locked": {
197 "lastModified": 1650374568,
198 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
199 "owner": "edolstra",
200 "repo": "flake-compat",
201 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
202 "type": "github"
203 },
204 "original": {
205 "owner": "edolstra",
206 "repo": "flake-compat",
207 "type": "github"
208 }
209 },
210 "flake-parts": {
211 "inputs": {
212 "nixpkgs-lib": "nixpkgs-lib_2"
213 },
214 "locked": {
215 "lastModified": 1687762428,
216 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
217 "owner": "hercules-ci",
218 "repo": "flake-parts",
219 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
220 "type": "github"
221 },
222 "original": {
223 "owner": "hercules-ci",
224 "repo": "flake-parts",
225 "type": "github"
226 }
227 },
228 "flake-parts_2": {
229 "inputs": {
230 "nixpkgs-lib": "nixpkgs-lib_3"
231 },
232 "locked": {
233 "lastModified": 1675295133,
234 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
235 "owner": "hercules-ci",
236 "repo": "flake-parts",
237 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
238 "type": "github"
239 },
240 "original": {
241 "owner": "hercules-ci",
242 "repo": "flake-parts",
243 "type": "github"
244 }
245 },
246 "flake-utils": {
247 "locked": {
248 "lastModified": 1609246779,
249 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
250 "owner": "numtide",
251 "repo": "flake-utils",
252 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
253 "type": "github"
254 },
255 "original": {
256 "owner": "numtide",
257 "repo": "flake-utils",
258 "type": "github"
259 }
260 },
261 "flake-utils_2": {
262 "locked": {
263 "lastModified": 1609246779,
264 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
265 "owner": "numtide",
266 "repo": "flake-utils",
267 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
268 "type": "github"
269 },
270 "original": {
271 "owner": "numtide",
272 "repo": "flake-utils",
273 "type": "github"
274 }
275 },
276 "flake-utils_3": {
277 "locked": {
278 "lastModified": 1659877975,
279 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
280 "owner": "numtide",
281 "repo": "flake-utils",
282 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
283 "type": "github"
284 },
285 "original": {
286 "owner": "numtide",
287 "repo": "flake-utils",
288 "type": "github"
289 }
290 },
291 "flake-utils_4": {
292 "locked": {
293 "lastModified": 1609246779,
294 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
295 "owner": "numtide",
296 "repo": "flake-utils",
297 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
298 "type": "github"
299 },
300 "original": {
301 "owner": "numtide",
302 "repo": "flake-utils",
303 "type": "github"
304 }
305 },
306 "flake-utils_5": {
307 "locked": {
308 "lastModified": 1609246779,
309 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
310 "owner": "numtide",
311 "repo": "flake-utils",
312 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
313 "type": "github"
314 },
315 "original": {
316 "owner": "numtide",
317 "repo": "flake-utils",
318 "type": "github"
319 }
320 },
321 "flake-utils_6": {
322 "locked": {
323 "lastModified": 1667395993,
324 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
325 "owner": "numtide",
326 "repo": "flake-utils",
327 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
328 "type": "github"
329 },
330 "original": {
331 "owner": "numtide",
332 "repo": "flake-utils",
333 "type": "github"
334 }
335 },
336 "loginctl-linger": {
337 "locked": {
338 "lastModified": 1,
339 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
340 "path": "../../flakes/loginctl-linger",
341 "type": "path"
342 },
343 "original": {
344 "path": "../../flakes/loginctl-linger",
345 "type": "path"
346 }
347 },
348 "mail-relay": {
349 "inputs": {
350 "environment": "environment_3",
351 "secrets": "secrets"
352 },
353 "locked": {
354 "lastModified": 1,
355 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
356 "path": "../../flakes/private/mail-relay",
357 "type": "path"
358 },
359 "original": {
360 "path": "../../flakes/private/mail-relay",
361 "type": "path"
362 }
363 },
364 "milters": {
365 "inputs": {
366 "environment": "environment_4",
367 "files-watcher": "files-watcher",
368 "openarc": "openarc",
369 "opendmarc": "opendmarc",
370 "secrets": "secrets_2"
371 },
372 "locked": {
373 "lastModified": 1,
374 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
375 "path": "../../flakes/private/milters",
376 "type": "path"
377 },
378 "original": {
379 "path": "../../flakes/private/milters",
380 "type": "path"
381 }
382 },
383 "monitoring": {
384 "inputs": {
385 "environment": "environment_5",
386 "naemon": "naemon",
387 "nixpkgs-lib": "nixpkgs-lib",
388 "secrets": "secrets_3"
389 },
390 "locked": {
391 "lastModified": 1,
392 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
393 "path": "../../flakes/private/monitoring",
394 "type": "path"
395 },
396 "original": {
397 "path": "../../flakes/private/monitoring",
398 "type": "path"
399 }
400 },
401 "my-lib": {
402 "inputs": {
403 "colmena": "colmena",
404 "disko": "disko",
405 "flake-parts": "flake-parts",
406 "nixos-anywhere": "nixos-anywhere",
407 "nixpkgs": "nixpkgs_6"
408 },
409 "locked": {
410 "lastModified": 1,
411 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
412 "path": "../../flakes/lib",
413 "type": "path"
414 },
415 "original": {
416 "path": "../../flakes/lib",
417 "type": "path"
418 }
419 },
420 "mypackages": {
421 "inputs": {
422 "flake-parts": "flake-parts_2",
423 "nixpkgs": "nixpkgs_11",
424 "webapps-ttrss": "webapps-ttrss"
425 },
426 "locked": {
427 "lastModified": 1,
428 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
429 "path": "../../mypackages",
430 "type": "path"
431 },
432 "original": {
433 "path": "../../mypackages",
434 "type": "path"
435 }
436 },
437 "myuids": {
438 "locked": {
439 "lastModified": 1,
440 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
441 "path": "../myuids",
442 "type": "path"
443 },
444 "original": {
445 "path": "../myuids",
446 "type": "path"
447 }
448 },
449 "myuids_2": {
450 "locked": {
451 "lastModified": 1,
452 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
453 "path": "../myuids",
454 "type": "path"
455 },
456 "original": {
457 "path": "../myuids",
458 "type": "path"
459 }
460 },
461 "myuids_3": {
462 "locked": {
463 "lastModified": 1,
464 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
465 "path": "../../flakes/myuids",
466 "type": "path"
467 },
468 "original": {
469 "path": "../../flakes/myuids",
470 "type": "path"
471 }
472 },
473 "myuids_4": {
474 "locked": {
475 "lastModified": 1,
476 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
477 "path": "../myuids",
478 "type": "path"
479 },
480 "original": {
481 "path": "../myuids",
482 "type": "path"
483 }
484 },
485 "myuids_5": {
486 "locked": {
487 "lastModified": 1,
488 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
489 "path": "../myuids",
490 "type": "path"
491 },
492 "original": {
493 "path": "../myuids",
494 "type": "path"
495 }
496 },
497 "myuids_6": {
498 "locked": {
499 "lastModified": 1,
500 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
501 "path": "../../myuids",
502 "type": "path"
503 },
504 "original": {
505 "path": "../../myuids",
506 "type": "path"
507 }
508 },
509 "naemon": {
510 "locked": {
511 "lastModified": 1,
512 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
513 "path": "../../naemon",
514 "type": "path"
515 },
516 "original": {
517 "path": "../../naemon",
518 "type": "path"
519 }
520 },
521 "nixos-2305": {
522 "locked": {
523 "lastModified": 1687938137,
524 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
525 "owner": "NixOS",
526 "repo": "nixpkgs",
527 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
528 "type": "github"
529 },
530 "original": {
531 "owner": "NixOS",
532 "ref": "release-23.05",
533 "repo": "nixpkgs",
534 "type": "github"
535 }
536 },
537 "nixos-anywhere": {
538 "inputs": {
539 "disko": [
540 "my-lib",
541 "disko"
542 ],
543 "flake-parts": [
544 "my-lib",
545 "flake-parts"
546 ],
547 "nixos-2305": "nixos-2305",
548 "nixos-images": "nixos-images",
549 "nixpkgs": "nixpkgs_5",
550 "treefmt-nix": "treefmt-nix"
551 },
552 "locked": {
553 "lastModified": 1689945193,
554 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
555 "owner": "numtide",
556 "repo": "nixos-anywhere",
557 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
558 "type": "github"
559 },
560 "original": {
561 "owner": "numtide",
562 "repo": "nixos-anywhere",
563 "type": "github"
564 }
565 },
566 "nixos-images": {
567 "inputs": {
568 "nixos-2305": [
569 "my-lib",
570 "nixos-anywhere",
571 "nixos-2305"
572 ],
573 "nixos-unstable": [
574 "my-lib",
575 "nixos-anywhere",
576 "nixpkgs"
577 ]
578 },
579 "locked": {
580 "lastModified": 1686819168,
581 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
582 "owner": "nix-community",
583 "repo": "nixos-images",
584 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
585 "type": "github"
586 },
587 "original": {
588 "owner": "nix-community",
589 "repo": "nixos-images",
590 "type": "github"
591 }
592 },
593 "nixpkgs": {
594 "locked": {
595 "lastModified": 1597943282,
596 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
597 "owner": "NixOS",
598 "repo": "nixpkgs",
599 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
600 "type": "github"
601 },
602 "original": {
603 "owner": "NixOS",
604 "repo": "nixpkgs",
605 "type": "github"
606 }
607 },
608 "nixpkgs-lib": {
609 "locked": {
610 "dir": "lib",
611 "lastModified": 1691269286,
612 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
613 "owner": "NixOS",
614 "repo": "nixpkgs",
615 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
616 "type": "github"
617 },
618 "original": {
619 "dir": "lib",
620 "owner": "NixOS",
621 "repo": "nixpkgs",
622 "type": "github"
623 }
624 },
625 "nixpkgs-lib_2": {
626 "locked": {
627 "dir": "lib",
628 "lastModified": 1685564631,
629 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
630 "owner": "NixOS",
631 "repo": "nixpkgs",
632 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
633 "type": "github"
634 },
635 "original": {
636 "dir": "lib",
637 "owner": "NixOS",
638 "ref": "nixos-unstable",
639 "repo": "nixpkgs",
640 "type": "github"
641 }
642 },
643 "nixpkgs-lib_3": {
644 "locked": {
645 "dir": "lib",
646 "lastModified": 1675183161,
647 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
648 "owner": "NixOS",
649 "repo": "nixpkgs",
650 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
651 "type": "github"
652 },
653 "original": {
654 "dir": "lib",
655 "owner": "NixOS",
656 "ref": "nixos-unstable",
657 "repo": "nixpkgs",
658 "type": "github"
659 }
660 },
661 "nixpkgs_10": {
662 "locked": {
663 "lastModified": 1687502512,
664 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
665 "owner": "NixOS",
666 "repo": "nixpkgs",
667 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
668 "type": "github"
669 },
670 "original": {
671 "owner": "NixOS",
672 "ref": "nixos-unstable",
673 "repo": "nixpkgs",
674 "type": "github"
675 }
676 },
677 "nixpkgs_11": {
678 "locked": {
679 "lastModified": 1646497237,
680 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
681 "owner": "nixos",
682 "repo": "nixpkgs",
683 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
684 "type": "github"
685 },
686 "original": {
687 "owner": "nixos",
688 "repo": "nixpkgs",
689 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
690 "type": "github"
691 }
692 },
693 "nixpkgs_2": {
694 "locked": {
695 "lastModified": 1597943282,
696 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
697 "owner": "NixOS",
698 "repo": "nixpkgs",
699 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
700 "type": "github"
701 },
702 "original": {
703 "owner": "NixOS",
704 "repo": "nixpkgs",
705 "type": "github"
706 }
707 },
708 "nixpkgs_3": {
709 "locked": {
710 "lastModified": 1683408522,
711 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
712 "owner": "NixOS",
713 "repo": "nixpkgs",
714 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
715 "type": "github"
716 },
717 "original": {
718 "owner": "NixOS",
719 "ref": "nixos-unstable",
720 "repo": "nixpkgs",
721 "type": "github"
722 }
723 },
724 "nixpkgs_4": {
725 "locked": {
726 "lastModified": 1687701825,
727 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
728 "owner": "NixOS",
729 "repo": "nixpkgs",
730 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
731 "type": "github"
732 },
733 "original": {
734 "owner": "NixOS",
735 "ref": "nixpkgs-unstable",
736 "repo": "nixpkgs",
737 "type": "github"
738 }
739 },
740 "nixpkgs_5": {
741 "locked": {
742 "lastModified": 1687893427,
743 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
744 "owner": "nixos",
745 "repo": "nixpkgs",
746 "rev": "4b14ab2a916508442e685089672681dff46805be",
747 "type": "github"
748 },
749 "original": {
750 "owner": "nixos",
751 "ref": "nixos-unstable-small",
752 "repo": "nixpkgs",
753 "type": "github"
754 }
755 },
756 "nixpkgs_6": {
757 "locked": {
758 "lastModified": 1648725829,
759 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
760 "owner": "NixOS",
761 "repo": "nixpkgs",
762 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
763 "type": "github"
764 },
765 "original": {
766 "owner": "NixOS",
767 "repo": "nixpkgs",
768 "type": "github"
769 }
770 },
771 "nixpkgs_7": {
772 "locked": {
773 "lastModified": 1693158576,
774 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
775 "owner": "nixos",
776 "repo": "nixpkgs",
777 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
778 "type": "github"
779 },
780 "original": {
781 "owner": "nixos",
782 "ref": "nixos-unstable",
783 "repo": "nixpkgs",
784 "type": "github"
785 }
786 },
787 "nixpkgs_8": {
788 "locked": {
789 "lastModified": 1597943282,
790 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
791 "owner": "NixOS",
792 "repo": "nixpkgs",
793 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
794 "type": "github"
795 },
796 "original": {
797 "owner": "NixOS",
798 "repo": "nixpkgs",
799 "type": "github"
800 }
801 },
802 "nixpkgs_9": {
803 "locked": {
804 "lastModified": 1597943282,
805 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
806 "owner": "NixOS",
807 "repo": "nixpkgs",
808 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
809 "type": "github"
810 },
811 "original": {
812 "owner": "NixOS",
813 "repo": "nixpkgs",
814 "type": "github"
815 }
816 },
817 "openarc": {
818 "inputs": {
819 "flake-utils": "flake-utils",
820 "myuids": "myuids",
821 "nixpkgs": "nixpkgs",
822 "openarc": "openarc_2"
823 },
824 "locked": {
825 "lastModified": 1,
826 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
827 "path": "../../openarc",
828 "type": "path"
829 },
830 "original": {
831 "path": "../../openarc",
832 "type": "path"
833 }
834 },
835 "openarc_2": {
836 "flake": false,
837 "locked": {
838 "lastModified": 1537545083,
839 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
840 "owner": "trusteddomainproject",
841 "repo": "OpenARC",
842 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
843 "type": "github"
844 },
845 "original": {
846 "owner": "trusteddomainproject",
847 "repo": "OpenARC",
848 "type": "github"
849 }
850 },
851 "openarc_3": {
852 "inputs": {
853 "files-watcher": "files-watcher_2",
854 "openarc": "openarc_4",
855 "secrets": "secrets_4"
856 },
857 "locked": {
858 "lastModified": 1,
859 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
860 "path": "../../flakes/private/openarc",
861 "type": "path"
862 },
863 "original": {
864 "path": "../../flakes/private/openarc",
865 "type": "path"
866 }
867 },
868 "openarc_4": {
869 "inputs": {
870 "flake-utils": "flake-utils_4",
871 "myuids": "myuids_4",
872 "nixpkgs": "nixpkgs_8",
873 "openarc": "openarc_5"
874 },
875 "locked": {
876 "lastModified": 1,
877 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
878 "path": "../../openarc",
879 "type": "path"
880 },
881 "original": {
882 "path": "../../openarc",
883 "type": "path"
884 }
885 },
886 "openarc_5": {
887 "flake": false,
888 "locked": {
889 "lastModified": 1537545083,
890 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
891 "owner": "trusteddomainproject",
892 "repo": "OpenARC",
893 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
894 "type": "github"
895 },
896 "original": {
897 "owner": "trusteddomainproject",
898 "repo": "OpenARC",
899 "type": "github"
900 }
901 },
902 "opendmarc": {
903 "inputs": {
904 "flake-utils": "flake-utils_2",
905 "myuids": "myuids_2",
906 "nixpkgs": "nixpkgs_2"
907 },
908 "locked": {
909 "lastModified": 1,
910 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
911 "path": "../../opendmarc",
912 "type": "path"
913 },
914 "original": {
915 "path": "../../opendmarc",
916 "type": "path"
917 }
918 },
919 "opendmarc_2": {
920 "inputs": {
921 "environment": "environment_6",
922 "files-watcher": "files-watcher_3",
923 "opendmarc": "opendmarc_3",
924 "secrets": "secrets_5"
925 },
926 "locked": {
927 "lastModified": 1,
928 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
929 "path": "../../flakes/private/opendmarc",
930 "type": "path"
931 },
932 "original": {
933 "path": "../../flakes/private/opendmarc",
934 "type": "path"
935 }
936 },
937 "opendmarc_3": {
938 "inputs": {
939 "flake-utils": "flake-utils_5",
940 "myuids": "myuids_5",
941 "nixpkgs": "nixpkgs_9"
942 },
943 "locked": {
944 "lastModified": 1,
945 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
946 "path": "../../opendmarc",
947 "type": "path"
948 },
949 "original": {
950 "path": "../../opendmarc",
951 "type": "path"
952 }
953 },
954 "openldap": {
955 "locked": {
956 "lastModified": 1,
957 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
958 "path": "../../flakes/private/openldap",
959 "type": "path"
960 },
961 "original": {
962 "path": "../../flakes/private/openldap",
963 "type": "path"
964 }
965 },
966 "root": {
967 "inputs": {
968 "chatons": "chatons",
969 "environment": "environment_2",
970 "loginctl-linger": "loginctl-linger",
971 "mail-relay": "mail-relay",
972 "milters": "milters",
973 "monitoring": "monitoring",
974 "my-lib": "my-lib",
975 "myuids": "myuids_3",
976 "nixpkgs": "nixpkgs_7",
977 "openarc": "openarc_3",
978 "opendmarc": "opendmarc_2",
979 "openldap": "openldap",
980 "rsync_backup": "rsync_backup",
981 "secrets": "secrets_6",
982 "system": "system"
983 }
984 },
985 "rsync_backup": {
986 "locked": {
987 "lastModified": 1,
988 "narHash": "sha256-TxLsFx4DTTScMHkvR0pJgzYea6ILiu1Dl6LA67LtYGo=",
989 "path": "../../flakes/rsync_backup",
990 "type": "path"
991 },
992 "original": {
993 "path": "../../flakes/rsync_backup",
994 "type": "path"
995 }
996 },
997 "secrets": {
998 "locked": {
999 "lastModified": 1,
1000 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1001 "path": "../../secrets",
1002 "type": "path"
1003 },
1004 "original": {
1005 "path": "../../secrets",
1006 "type": "path"
1007 }
1008 },
1009 "secrets-public": {
1010 "locked": {
1011 "lastModified": 1,
1012 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1013 "path": "../../secrets",
1014 "type": "path"
1015 },
1016 "original": {
1017 "path": "../../secrets",
1018 "type": "path"
1019 }
1020 },
1021 "secrets_2": {
1022 "locked": {
1023 "lastModified": 1,
1024 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1025 "path": "../../secrets",
1026 "type": "path"
1027 },
1028 "original": {
1029 "path": "../../secrets",
1030 "type": "path"
1031 }
1032 },
1033 "secrets_3": {
1034 "locked": {
1035 "lastModified": 1,
1036 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1037 "path": "../../secrets",
1038 "type": "path"
1039 },
1040 "original": {
1041 "path": "../../secrets",
1042 "type": "path"
1043 }
1044 },
1045 "secrets_4": {
1046 "locked": {
1047 "lastModified": 1,
1048 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1049 "path": "../../secrets",
1050 "type": "path"
1051 },
1052 "original": {
1053 "path": "../../secrets",
1054 "type": "path"
1055 }
1056 },
1057 "secrets_5": {
1058 "locked": {
1059 "lastModified": 1,
1060 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1061 "path": "../../secrets",
1062 "type": "path"
1063 },
1064 "original": {
1065 "path": "../../secrets",
1066 "type": "path"
1067 }
1068 },
1069 "secrets_6": {
1070 "locked": {
1071 "lastModified": 1,
1072 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
1073 "path": "../../flakes/secrets",
1074 "type": "path"
1075 },
1076 "original": {
1077 "path": "../../flakes/secrets",
1078 "type": "path"
1079 }
1080 },
1081 "stable": {
1082 "locked": {
1083 "lastModified": 1669735802,
1084 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
1085 "owner": "NixOS",
1086 "repo": "nixpkgs",
1087 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
1088 "type": "github"
1089 },
1090 "original": {
1091 "owner": "NixOS",
1092 "ref": "nixos-22.11",
1093 "repo": "nixpkgs",
1094 "type": "github"
1095 }
1096 },
1097 "system": {
1098 "inputs": {
1099 "backports": "backports",
1100 "environment": "environment_7",
1101 "mypackages": "mypackages",
1102 "myuids": "myuids_6",
1103 "secrets-public": "secrets-public"
1104 },
1105 "locked": {
1106 "lastModified": 1,
1107 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
1108 "path": "../../flakes/private/system",
1109 "type": "path"
1110 },
1111 "original": {
1112 "path": "../../flakes/private/system",
1113 "type": "path"
1114 }
1115 },
1116 "treefmt-nix": {
1117 "inputs": {
1118 "nixpkgs": [
1119 "my-lib",
1120 "nixos-anywhere",
1121 "nixpkgs"
1122 ]
1123 },
1124 "locked": {
1125 "lastModified": 1687940979,
1126 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
1127 "owner": "numtide",
1128 "repo": "treefmt-nix",
1129 "rev": "0a4f06c27610a99080b69433873885df82003aae",
1130 "type": "github"
1131 },
1132 "original": {
1133 "owner": "numtide",
1134 "repo": "treefmt-nix",
1135 "type": "github"
1136 }
1137 },
1138 "webapps-ttrss": {
1139 "flake": false,
1140 "locked": {
1141 "lastModified": 1546759381,
1142 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
1143 "ref": "master",
1144 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
1145 "revCount": 9256,
1146 "type": "git",
1147 "url": "https://git.tt-rss.org/fox/tt-rss.git"
1148 },
1149 "original": {
1150 "ref": "master",
1151 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
1152 "type": "git",
1153 "url": "https://git.tt-rss.org/fox/tt-rss.git"
1154 }
1155 }
1156 },
1157 "root": "root",
1158 "version": 7
1159}
diff --git a/systems/backup-2/flake.nix b/systems/backup-2/flake.nix
new file mode 100644
index 0000000..e6807d6
--- /dev/null
+++ b/systems/backup-2/flake.nix
@@ -0,0 +1,51 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4
5 my-lib.url = "path:../../flakes/lib";
6
7 openldap.url = "path:../../flakes/private/openldap";
8 monitoring.url = "path:../../flakes/private/monitoring";
9 mail-relay.url = "path:../../flakes/private/mail-relay";
10 milters.url = "path:../../flakes/private/milters";
11 openarc.url = "path:../../flakes/private/openarc";
12 opendmarc.url = "path:../../flakes/private/opendmarc";
13 chatons.url = "path:../../flakes/private/chatons";
14 environment.url = "path:../../flakes/private/environment";
15 system.url = "path:../../flakes/private/system";
16
17 myuids.url = "path:../../flakes/myuids";
18 secrets.url = "path:../../flakes/secrets";
19 rsync_backup.url = "path:../../flakes/rsync_backup";
20 loginctl-linger.url = "path:../../flakes/loginctl-linger";
21 };
22 outputs = inputs@{ self, my-lib, nixpkgs, ...}:
23 my-lib.lib.mkColmenaFlake {
24 name = "backup-2";
25 inherit self nixpkgs;
26 system = "x86_64-linux";
27 targetHost = "95.217.19.143";
28 targetUser = "root";
29 nixosModules = {
30 base = ./base.nix;
31 system = inputs.system.nixosModule;
32 mail-relay = inputs.mail-relay.nixosModule;
33 milters = inputs.milters.nixosModule;
34 openarc = inputs.openarc.nixosModule;
35 opendmarc = inputs.opendmarc.nixosModule;
36 chatons = inputs.chatons.nixosModule;
37 monitoring = inputs.monitoring.nixosModule;
38 environment = inputs.environment.nixosModule;
39
40 myuids = inputs.myuids.nixosModule;
41 secrets = inputs.secrets.nixosModule;
42 rsync_backup = inputs.rsync_backup.nixosModule;
43 loginctl-linger = inputs.loginctl-linger.nixosModule;
44 };
45 moduleArgs = {
46 nixpkgs = inputs.nixpkgs;
47 openldap = inputs.openldap;
48 monitoring = inputs.monitoring;
49 };
50 };
51}
diff --git a/systems/backup-2/mail/relay.nix b/systems/backup-2/mail/relay.nix
new file mode 100644
index 0000000..1b7e25e
--- /dev/null
+++ b/systems/backup-2/mail/relay.nix
@@ -0,0 +1,196 @@
1{ lib, pkgs, config, name, nodes, ... }:
2let
3 getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) (lib.filterAttrs (n: v: v.receive) p.emailPolicies);
4 bydomain = builtins.mapAttrs (n: getDomains) nodes.eldiron.config.myServices.dns.zones;
5 receiving_domains = lib.flatten (builtins.attrValues bydomain);
6in
7{
8 options.myServices.mailBackup.enable = lib.mkEnableOption "enable MX backup services";
9 config = lib.mkIf config.myServices.mailBackup.enable {
10 myServices.mail.milters.enable = true;
11 security.acme.certs."mail" = {
12 postRun = ''
13 systemctl restart postfix.service
14 '';
15 domain = config.hostEnv.fqdn;
16 extraDomainNames = let
17 zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) nodes.eldiron.config.myServices.dns.zones);
18 mxs = map (n: "${config.myEnv.servers."${name}".mx.subdomain}.${n}") zonesWithMx;
19 in mxs;
20 };
21 secrets.keys = {
22 "postfix/mysql_alias_maps" = {
23 user = config.services.postfix.user;
24 group = config.services.postfix.group;
25 permissions = "0440";
26 text = ''
27 # We need to specify that option to trigger ssl connection
28 tls_ciphers = TLSv1.2
29 user = ${config.myEnv.mail.postfix.mysql.user}
30 password = ${config.myEnv.mail.postfix.mysql.password}
31 hosts = ${config.myEnv.mail.postfix.mysql.remoteHost}
32 dbname = ${config.myEnv.mail.postfix.mysql.database}
33 query = SELECT DISTINCT 1
34 FROM forwardings
35 WHERE
36 ((regex = 1 AND '%s' REGEXP CONCAT('^',source,'$') ) OR (regex = 0 AND source = '%s'))
37 AND active = 1
38 AND '%s' NOT IN
39 (
40 SELECT source
41 FROM forwardings_blacklisted
42 WHERE source = '%s'
43 ) UNION
44 SELECT 'devnull@immae.eu'
45 FROM forwardings_blacklisted
46 WHERE source = '%s'
47 '';
48 };
49 "postfix/ldap_mailboxes" = {
50 user = config.services.postfix.user;
51 group = config.services.postfix.group;
52 permissions = "0440";
53 text = ''
54 server_host = ldaps://${config.myEnv.mail.dovecot.ldap.host}:636
55 search_base = ${config.myEnv.mail.dovecot.ldap.base}
56 query_filter = ${config.myEnv.mail.dovecot.ldap.postfix_mailbox_filter}
57 bind_dn = ${config.myEnv.mail.dovecot.ldap.dn}
58 bind_pw = ${config.myEnv.mail.dovecot.ldap.password}
59 result_attribute = immaePostfixAddress
60 result_format = dummy
61 version = 3
62 '';
63 };
64 "postfix/sympa_mailbox_maps" = {
65 user = config.services.postfix.user;
66 group = config.services.postfix.group;
67 permissions = "0440";
68 text = ''
69 hosts = ${config.myEnv.mail.sympa.postgresql.host}
70 user = ${config.myEnv.mail.sympa.postgresql.user}
71 password = ${config.myEnv.mail.sympa.postgresql.password}
72 dbname = ${config.myEnv.mail.sympa.postgresql.database}
73 query = SELECT DISTINCT 1 FROM list_table WHERE '%s' IN (
74 CONCAT(name_list, '@', robot_list),
75 CONCAT(name_list, '-request@', robot_list),
76 CONCAT(name_list, '-editor@', robot_list),
77 CONCAT(name_list, '-unsubscribe@', robot_list),
78 CONCAT(name_list, '-owner@', robot_list),
79 CONCAT('sympa-request@', robot_list),
80 CONCAT('sympa-owner@', robot_list),
81 CONCAT('sympa@', robot_list),
82 CONCAT('listmaster@', robot_list),
83 CONCAT('bounce@', robot_list),
84 CONCAT('abuse-feedback-report@', robot_list)
85 )
86 '';
87 };
88 "postfix/ldap_ejabberd_users_immae_fr" = {
89 user = config.services.postfix.user;
90 group = config.services.postfix.group;
91 permissions = "0440";
92 text = ''
93 server_host = ldaps://${config.myEnv.jabber.ldap.host}:636
94 search_base = ${config.myEnv.jabber.ldap.base}
95 query_filter = ${config.myEnv.jabber.postfix_user_filter}
96 domain = immae.fr
97 bind_dn = ${config.myEnv.jabber.ldap.dn}
98 bind_pw = ${config.myEnv.jabber.ldap.password}
99 result_attribute = immaeXmppUid
100 result_format = ejabberd@localhost
101 version = 3
102 '';
103 };
104 };
105
106 networking.firewall.allowedTCPPorts = [ 25 ];
107
108 users.users."${config.services.postfix.user}".extraGroups = [ "keys" ];
109 services.filesWatcher.postfix = {
110 restart = true;
111 paths = [
112 config.secrets.fullPaths."postfix/mysql_alias_maps"
113 config.secrets.fullPaths."postfix/sympa_mailbox_maps"
114 config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"
115 config.secrets.fullPaths."postfix/ldap_mailboxes"
116 ];
117 };
118 services.postfix = {
119 mapFiles = let
120 virtual_map = {
121 virtual = let
122 cfg = config.myEnv.monitoring.email_check.eldiron;
123 address = "${cfg.mail_address}@${cfg.mail_domain}";
124 aliases = config.myEnv.mail.postfix.common_aliases;
125 in pkgs.writeText "postfix-virtual" (
126 builtins.concatStringsSep "\n" (
127 [ "${address} 1"
128 ] ++
129 map (a: "${a} 1") config.myEnv.mail.postfix.other_aliases ++
130 lib.lists.flatten (map (domain: map (alias: "${alias}@${domain} 1") aliases) receiving_domains)
131 )
132 );
133 };
134 in
135 virtual_map;
136 config = {
137 ### postfix module overrides
138 readme_directory = "${pkgs.postfix}/share/postfix/doc";
139 smtp_tls_CAfile = lib.mkForce "";
140 smtp_tls_cert_file = lib.mkForce "";
141 smtp_tls_key_file = lib.mkForce "";
142
143 message_size_limit = "1073741824"; # Don't put 0 here, it's not equivalent to "unlimited"
144 mailbox_size_limit = "1073741825"; # Workaround, local delivered mails should all go through scripts
145 alias_database = "\$alias_maps";
146
147 ### Relay domains
148 relay_domains = receiving_domains;
149 relay_recipient_maps = let
150 virtual_alias_maps = [
151 "hash:/etc/postfix/virtual"
152 "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}"
153 "ldap:${config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"}"
154 ];
155 virtual_mailbox_maps = [
156 "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}"
157 "pgsql:${config.secrets.fullPaths."postfix/sympa_mailbox_maps"}"
158 ];
159 in
160 virtual_alias_maps ++ virtual_mailbox_maps;
161 smtpd_relay_restrictions = [
162 "defer_unauth_destination"
163 ];
164
165 ### Additional smtpd configuration
166 smtpd_tls_received_header = "yes";
167 smtpd_tls_loglevel = "1";
168
169 ### Email sending configuration
170 smtp_tls_security_level = "may";
171 smtp_tls_loglevel = "1";
172
173 ### Force ip bind for smtp
174 smtp_bind_address = builtins.head config.myEnv.servers."${name}".ips.main.ip4;
175 smtp_bind_address6 = builtins.head config.myEnv.servers."${name}".ips.main.ip6;
176
177 smtpd_milters = [
178 "unix:${config.myServices.mail.milters.sockets.opendkim}"
179 "unix:${config.myServices.mail.milters.sockets.openarc}"
180 "unix:${config.myServices.mail.milters.sockets.opendmarc}"
181 ];
182 };
183 enable = true;
184 enableSmtp = true;
185 enableSubmission = false;
186 destination = ["localhost"];
187 # This needs to reverse DNS
188 hostname = config.hostEnv.fqdn;
189 setSendmail = false;
190 sslCert = "/var/lib/acme/mail/fullchain.pem";
191 sslKey = "/var/lib/acme/mail/key.pem";
192 recipientDelimiter = "+";
193 };
194 };
195}
196
diff --git a/systems/backup-2/monitoring.nix b/systems/backup-2/monitoring.nix
new file mode 100644
index 0000000..6d769e3
--- /dev/null
+++ b/systems/backup-2/monitoring.nix
@@ -0,0 +1,117 @@
1{ config, pkgs, lib, name, openldap, monitoring, ... }:
2let
3 hostFQDN = config.hostEnv.fqdn;
4 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
5in
6{
7 config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "file_date" "mysql" "openldap" "redis" "emails" "notify-secondary"];
8 config.myServices.monitoring.objects = lib.mkMerge [
9 (monitoring.lib.objectsCommon {
10 inherit hostFQDN;
11 hostName = name;
12 master = false;
13 processWarn = "60"; processAlert = "70";
14 loadWarn = "4.0"; loadAlert = "6.0";
15 load15Warn = "1.0"; load15Alert = "1.0";
16 interface = builtins.head (builtins.attrNames config.networking.interfaces);
17 })
18
19 {
20 service = [
21 (emailCheck "backup-2" hostFQDN // {
22 __passive_servicegroups = "webstatus-email";
23 })
24 {
25 service_description = "Size on /backup2 partition";
26 use = "local-service";
27 check_command = ["check_local_disk" "10%" "5%" "/backup2"];
28 __passive_servicegroups = "webstatus-resources";
29 }
30 {
31 service_description = "Last backup in /backup2/phare is not too old";
32 use = "local-service";
33 check_command = ["check_last_file_date" "/backup2/phare" "14" "backup"];
34 __passive_servicegroups = "webstatus-backup";
35 }
36 {
37 service_description = "Last backup in /backup2/dilion is not too old";
38 use = "local-service";
39 check_command = ["check_last_file_date" "/backup2/dilion" "14" "backup"];
40 __passive_servicegroups = "webstatus-backup";
41 }
42 {
43 service_description = "Last backup in /backup2/ulminfo is not too old";
44 use = "local-service";
45 check_command = ["check_last_file_date" "/backup2/ulminfo" "14" "backup"];
46 __passive_servicegroups = "webstatus-backup";
47 }
48 {
49 service_description = "Last postgresql dump in /backup2/eldiron/postgresql_backup is not too old";
50 use = "local-service";
51 check_command = ["check_last_file_date" "/backup2/eldiron/postgresql_backup" "7" "postgres"];
52 __passive_servicegroups = "webstatus-databases,webstatus-backup";
53 }
54 {
55 service_description = "Redis replication for eldiron is up to date";
56 use = "local-service";
57 check_command = ["check_redis_replication" "/run/redis_eldiron/redis.sock"];
58 __passive_servicegroups = "webstatus-databases";
59 }
60 {
61 service_description = "Last redis dump in /backup2/eldiron/redis_backup is not too old";
62 use = "local-service";
63 check_command = ["check_last_file_date" "/backup2/eldiron/redis_backup" "7" "redis"];
64 __passive_servicegroups = "webstatus-databases,webstatus-backup";
65 }
66 {
67 service_description = "Mysql replication for eldiron is up to date";
68 use = "local-service";
69 check_command = ["check_mysql_replication" "/run/mysqld_eldiron/mysqld.sock" config.secrets.fullPaths."mysql_replication/eldiron/client"];
70 __passive_servicegroups = "webstatus-databases";
71 }
72 {
73 service_description = "Last mysql dump in /backup2/eldiron/mysql_backup is not too old";
74 use = "local-service";
75 check_command = ["check_last_file_date" "/backup2/eldiron/mysql_backup" "7" "mysql"];
76 __passive_servicegroups = "webstatus-databases,webstatus-backup";
77 }
78 {
79 service_description = "Openldap replication for eldiron is up to date";
80 use = "local-service";
81 check_command = let
82 name = "eldiron";
83 hcfg = config.myServices.databasesReplication.openldap.hosts.eldiron;
84 base = config.myServices.databasesReplication.openldap.base;
85 ldapConfig = pkgs.writeText "slapd.conf" ''
86 include ${pkgs.openldap}/etc/schema/core.schema
87 include ${pkgs.openldap}/etc/schema/cosine.schema
88 include ${pkgs.openldap}/etc/schema/inetorgperson.schema
89 include ${pkgs.openldap}/etc/schema/nis.schema
90 include ${openldap.immae-schema}
91 moduleload back_mdb
92 backend mdb
93 database mdb
94
95 suffix "${hcfg.base}"
96 directory ${base}/${name}/openldap
97 '';
98 in [
99 "check_openldap_replication"
100 hcfg.url
101 hcfg.dn
102 config.secrets.fullPaths."openldap_replication/eldiron/replication_password"
103 hcfg.base
104 "${ldapConfig}"
105 ];
106 __passive_servicegroups = "webstatus-databases";
107 }
108 {
109 service_description = "Last openldap dump in /backup2/eldiron/openldap_backup is not too old";
110 use = "local-service";
111 check_command = ["check_last_file_date" "/backup2/eldiron/openldap_backup" "7" "openldap"];
112 __passive_servicegroups = "webstatus-databases,webstatus-backup";
113 }
114 ];
115 }
116 ];
117}
diff --git a/systems/dilion/base.nix b/systems/dilion/base.nix
new file mode 100644
index 0000000..ac4bdaf
--- /dev/null
+++ b/systems/dilion/base.nix
@@ -0,0 +1,309 @@
1{ config, pkgs, name, lib, pkgs-no-overlay, secrets, ... }:
2{
3 # ssh-keyscan dilion | nix-shell -p ssh-to-age --run ssh-to-age
4 secrets.ageKeys = [ "age1x49n6qa0arkdpq8530s7umgm0gqkq90exv4jep97q30rfnzknpaqate06a" ];
5 boot = {
6 loader = {
7 grub = {
8 devices = [ "/dev/sda" "/dev/sdb" "/dev/sdc" "/dev/sdd" ];
9 };
10 timeout = 1;
11 };
12 blacklistedKernelModules = [ "nvidiafb" ];
13 supportedFilesystems = [ "zfs" ];
14 kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
15 kernelModules = [ "kvm-intel" ];
16 initrd.availableKernelModules = [ "ahci" "sd_mod" ];
17 initrd.secrets = {
18 "/boot/pass.key" = "/boot/pass.key";
19 };
20 kernel.sysctl."vm.nr_hugepages" = 256; # for xmr-stak
21 # available in nixos-20.09
22 #zfs.requestEncryptionCredentials = [ "zpool/root" ];
23 };
24 powerManagement.cpuFreqGovernor = "powersave";
25 hardware.enableRedistributableFirmware = true;
26
27 swapDevices = [ { label = "swap"; } ];
28 fileSystems = {
29 "/" = { fsType = "zfs"; device = "zpool/root"; };
30 "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/fd1c511e-2bc0-49d5-b8bb-95e7e8c8c816"; };
31 "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; };
32 "/home" = { fsType = "zfs"; device = "zpool/root/home"; };
33 "/home/immae" = { fsType = "zfs"; device = "zpool/root/home/immae"; };
34 "/tmp" = { fsType = "zfs"; device = "zpool/root/tmp"; };
35 "/var" = { fsType = "zfs"; device = "zpool/root/var"; };
36 "/data" = { fsType = "ext4"; label = "data"; };
37 "/nix" = { fsType = "ext4"; label = "nix"; };
38 };
39
40 services.udev.extraRules = ''
41 ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="10:bf:48:7f:e6:3b", NAME="eth0"
42 '';
43
44 nixpkgs.config.permittedInsecurePackages = [
45 "python-2.7.18.6" # for nagios-cli
46 ];
47
48 networking = {
49 hostId = "27c3048d"; # generated with head -c4 /dev/urandom | od -A none -t x4
50 firewall.enable = false;
51 interfaces."eth0".ipv4.addresses =
52 [ { address = lib.head config.hostEnv.ips.main.ip4; prefixLength = 27; } ]
53 ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
54 (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or []))
55 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips));
56 interfaces."eth0".ipv6.addresses =
57 [ { address = "2a01:4f8:141:53e7::"; prefixLength = 64; } ]
58 ++ pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
59 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
60 config.hostEnv.ips);
61 defaultGateway = { address = "176.9.10.225"; interface = "eth0"; };
62 defaultGateway6 = { address = "fe80::1"; interface = "eth0"; };
63 nameservers = [
64 "213.133.98.98"
65 "213.133.99.99"
66 "213.133.100.100"
67 "2a01:4f8:0:a0a1::add:1010"
68 "2a01:4f8:0:a102::add:9999"
69 "2a01:4f8:0:a111::add:9898"
70 ];
71 };
72
73 myServices.ssh.modules.regular.snippet = builtins.readFile ./ssh_ldap_regular.sh;
74
75 imports = [
76 secrets.nixosModules.users-config-dilion
77 ./monitoring.nix
78 ./vms.nix
79 ];
80
81 myServices.vms.libvirt-guests = {
82 buildbot = {
83 pool = "zfspool";
84 network = "immae";
85 cpus = 1;
86 memory = 3;
87 diskSize = 10;
88 destroyVolumeOnExit = true;
89 };
90 };
91 myServices.vms.libvirt-images = {
92 nixos = ./vms/base_configuration.nix;
93 buildbot = ./vms/buildbot_configuration.nix;
94 };
95 myServices.vms.libvirt-networks.immae = {
96 bridgeNumber = 1;
97 ipRange = "192.168.100";
98 };
99 myServices.vms.libvirt-pools = {
100 niximages = {
101 type = "dir";
102 target = "/etc/libvirtd/base-images";
103 };
104 buildbot-disks = rec {
105 type = "dir";
106 target = "/var/lib/libvirt/images/buildbot-disks";
107 preStart = ''
108 mkdir -p ${target}
109 '';
110 };
111 zfspool = {
112 # pool-define-as --name zfspool --source-name zpool/libvirt --type zfs
113 type = "zfs";
114 xml = ''
115 <source>
116 <name>zpool/libvirt</name>
117 </source>
118 '';
119 };
120 };
121
122 system.nssModules = [ pkgs.libvirt ];
123 system.nssDatabases.hosts = lib.mkForce [ "files" "libvirt_guest" "mymachines" "dns" "myhostname" ];
124 programs.zsh.enable = true;
125
126 users.users.libvirt = {
127 hashedPassword = "!";
128 shell = pkgs.bashInteractive;
129 isSystemUser = true;
130 group = "libvirtd";
131 packages = [ pkgs.libressl.nc ];
132 openssh.authorizedKeys.keys = [
133 config.myEnv.buildbot.ssh_key.public
134 config.myEnv.sshd.rootKeys.ismael_flony
135 ];
136 };
137
138 users.groups.backup = {};
139 users.users.backup = {
140 hashedPassword = "!";
141 isSystemUser = true;
142 extraGroups = [ "keys" ];
143 group = "backup";
144 shell = pkgs.bashInteractive;
145 openssh.authorizedKeys.keys = let
146 zreplConfig = "/etc/zrepl/zrepl.yml";
147 in
148 ["command=\"${pkgs.zrepl}/bin/zrepl stdinserver --config ${zreplConfig} eldiron\",restrict ${config.myEnv.zrepl_backup.ssh_key.public}"];
149 };
150 security.sudo.extraRules = pkgs.lib.mkAfter [
151 {
152 commands = [
153 { command = "/home/immae/.nix-profile/root_scripts/*"; options = [ "NOPASSWD" ]; }
154 ];
155 users = [ "immae" ];
156 runAs = "root";
157 }
158 ];
159
160 virtualisation.docker.enable = true;
161 virtualisation.docker.storageDriver = "zfs";
162 virtualisation.libvirtd.enable = true;
163 virtualisation.libvirtd.qemu.package = pkgs-no-overlay.qemu;
164 systemd.services.libvirtd.path = lib.mkAfter [ config.boot.zfs.package ];
165 users.groups.immae = {};
166 users.extraUsers.immae.extraGroups = [ "immae" "libvirtd" "docker" ];
167 systemd.services.libvirtd.postStart = ''
168 install -m 0770 -g libvirtd -d /var/lib/libvirt/images
169 '';
170
171 time.timeZone = "Europe/Paris";
172 nix = {
173 settings = {
174 sandbox = "relaxed";
175 max-jobs = 8;
176 substituters = [ "https://hydra.iohk.io" "https://cache.nixos.org" ];
177 trusted-public-keys = [ "hydra.iohk.io:f/Ea+s+dFdN+3Y/G+FDgSq+a5NEWhJGzdjvKNGv0/EQ=" ];
178 trusted-users = [ "root" "@wheel"] ;
179 };
180 extraOptions = ''
181 keep-outputs = true
182 keep-derivations = true
183 allow-unsafe-native-code-during-evaluation = true
184 experimental-features = nix-command flakes
185 #Assumed in NUR
186 allow-import-from-derivation = true
187 '';
188 };
189
190 security.pki.certificateFiles = [
191 (pkgs.fetchurl {
192 url = "http://downloads.e.eriomem.net/eriomemca.pem";
193 sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
194 })
195 ];
196
197 myServices.monitoring.enable = true;
198 security.acme.certs."${name}-immae" = {
199 group = "immae";
200 domain = "dilion.immae.eu";
201 };
202 security.acme.certs."${name}" = {
203 group = config.services.nginx.group;
204 extraDomainNames = [
205 "dilion.immae.dev"
206 ];
207 };
208 systemd.services.nginx.serviceConfig.ProtectHome = "read-only";
209 services.nginx = {
210 enable = true;
211 recommendedOptimisation = true;
212 recommendedGzipSettings = true;
213 recommendedProxySettings = true;
214 virtualHosts = {
215 "dilion.immae.dev" = {
216 acmeRoot = config.security.acme.defaults.webroot;
217 useACMEHost = name;
218 forceSSL = true;
219 locations."/".root = "/home/immae/www";
220 };
221 };
222 };
223
224 secrets.keys = {
225 "zrepl/${name}.key" = {
226 permissions = "0400";
227 text = config.myEnv.zrepl_backup.certs."${name}".key;
228 user = "backup";
229 group = "root";
230 };
231 } // builtins.listToAttrs (map (x: lib.attrsets.nameValuePair "zrepl/certificates/${x}.crt" {
232 permissions = "0400";
233 text = config.myEnv.zrepl_backup.certs."${x}".certificate;
234 user = "backup";
235 group = "root";
236 }) (builtins.attrNames config.myEnv.zrepl_backup.certs));
237
238 environment.etc."mdadm.conf" = {
239 enable = true;
240 mode = "0644";
241 user = "root";
242 text = "MAILADDR ${config.myEnv.monitoring.email}";
243 };
244
245
246 systemd.services.zrepl.serviceConfig.User = "backup";
247 systemd.services.zrepl.path = [ pkgs.openssh ];
248 # pour eldiron:
249 # zfs allow backup create,mount,receive,destroy,rename,snapshot,hold,bookmark,release zpool/backup
250 # pour flony:
251 # zfs allow backup hold,release,bookmark,snapshot,send zpool
252 services.zrepl = {
253 enable = true;
254 settings = {
255 global.control.sockpath = "/run/zrepl/control";
256 global.serve.stdinserver.sockdir = "/run/zrepl/stdinserver";
257 jobs = [
258 {
259 type = "sink";
260 # must not change
261 name = "backup-from-eldiron";
262 root_fs = "zpool/backup";
263 serve.type = "tls";
264 serve.listen = ":19000";
265 serve.ca = config.secrets.fullPaths."zrepl/certificates/eldiron.crt";
266 serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt";
267 serve.key = config.secrets.fullPaths."zrepl/dilion.key";
268 serve.client_cns = [ "eldiron" ];
269 }
270 {
271 type = "source";
272 # must not change
273 name = "backup-to-wd-zpool";
274 # not encrypted!
275 serve.type = "tls";
276 serve.listen = ":19001";
277 serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt";
278 serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt";
279 serve.key = config.secrets.fullPaths."zrepl/dilion.key";
280 serve.client_cns = [ "flony" ];
281 filesystems."zpool/libvirt<" = true;
282 filesystems."zpool/root<" = true;
283 snapshotting.type = "manual";
284 }
285 {
286 type = "source";
287 # must not change
288 name = "backup-to-wd-zpool-docker";
289 # not encrypted!
290 serve.type = "tls";
291 serve.listen = ":19002";
292 serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt";
293 serve.cert = config.secrets.fullPaths."zrepl/certificates/dilion.crt";
294 serve.key = config.secrets.fullPaths."zrepl/dilion.key";
295 serve.client_cns = [ "flony" ];
296 filesystems."zpool/docker<" = true;
297 snapshotting.type = "manual";
298 }
299 ];
300 };
301 };
302 # This value determines the NixOS release with which your system is
303 # to be compatible, in order to avoid breaking some software such as
304 # database servers. You should change this only after NixOS release
305 # notes say you should.
306 # https://nixos.org/nixos/manual/release-notes.html
307 system.stateVersion = "23.05"; # Did you read the comment?
308}
309
diff --git a/systems/dilion/flake.lock b/systems/dilion/flake.lock
new file mode 100644
index 0000000..6da2d47
--- /dev/null
+++ b/systems/dilion/flake.lock
@@ -0,0 +1,695 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_2",
6 "nixpkgs": "nixpkgs_6"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "colmena": {
20 "inputs": {
21 "flake-compat": "flake-compat",
22 "flake-utils": "flake-utils",
23 "nixpkgs": "nixpkgs",
24 "stable": "stable"
25 },
26 "locked": {
27 "lastModified": 1687954574,
28 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
29 "owner": "immae",
30 "repo": "colmena",
31 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
32 "type": "github"
33 },
34 "original": {
35 "owner": "immae",
36 "ref": "add-lib-get-flake",
37 "repo": "colmena",
38 "type": "github"
39 }
40 },
41 "disko": {
42 "inputs": {
43 "nixpkgs": "nixpkgs_2"
44 },
45 "locked": {
46 "lastModified": 1687968164,
47 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
48 "owner": "nix-community",
49 "repo": "disko",
50 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
51 "type": "github"
52 },
53 "original": {
54 "owner": "nix-community",
55 "repo": "disko",
56 "type": "github"
57 }
58 },
59 "environment": {
60 "locked": {
61 "lastModified": 1,
62 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
63 "path": "../../flakes/private/environment",
64 "type": "path"
65 },
66 "original": {
67 "path": "../../flakes/private/environment",
68 "type": "path"
69 }
70 },
71 "environment_2": {
72 "locked": {
73 "lastModified": 1,
74 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
75 "path": "../environment",
76 "type": "path"
77 },
78 "original": {
79 "path": "../environment",
80 "type": "path"
81 }
82 },
83 "environment_3": {
84 "locked": {
85 "lastModified": 1,
86 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
87 "path": "../environment",
88 "type": "path"
89 },
90 "original": {
91 "path": "../environment",
92 "type": "path"
93 }
94 },
95 "environment_4": {
96 "locked": {
97 "lastModified": 1,
98 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
99 "path": "../environment",
100 "type": "path"
101 },
102 "original": {
103 "path": "../environment",
104 "type": "path"
105 }
106 },
107 "files-watcher": {
108 "locked": {
109 "lastModified": 1,
110 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
111 "path": "../../flakes/files-watcher",
112 "type": "path"
113 },
114 "original": {
115 "path": "../../flakes/files-watcher",
116 "type": "path"
117 }
118 },
119 "flake-compat": {
120 "flake": false,
121 "locked": {
122 "lastModified": 1650374568,
123 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
124 "owner": "edolstra",
125 "repo": "flake-compat",
126 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
127 "type": "github"
128 },
129 "original": {
130 "owner": "edolstra",
131 "repo": "flake-compat",
132 "type": "github"
133 }
134 },
135 "flake-parts": {
136 "inputs": {
137 "nixpkgs-lib": "nixpkgs-lib_2"
138 },
139 "locked": {
140 "lastModified": 1687762428,
141 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
142 "owner": "hercules-ci",
143 "repo": "flake-parts",
144 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
145 "type": "github"
146 },
147 "original": {
148 "owner": "hercules-ci",
149 "repo": "flake-parts",
150 "type": "github"
151 }
152 },
153 "flake-parts_2": {
154 "inputs": {
155 "nixpkgs-lib": "nixpkgs-lib_3"
156 },
157 "locked": {
158 "lastModified": 1675295133,
159 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
160 "owner": "hercules-ci",
161 "repo": "flake-parts",
162 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
163 "type": "github"
164 },
165 "original": {
166 "owner": "hercules-ci",
167 "repo": "flake-parts",
168 "type": "github"
169 }
170 },
171 "flake-utils": {
172 "locked": {
173 "lastModified": 1659877975,
174 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
175 "owner": "numtide",
176 "repo": "flake-utils",
177 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
178 "type": "github"
179 },
180 "original": {
181 "owner": "numtide",
182 "repo": "flake-utils",
183 "type": "github"
184 }
185 },
186 "flake-utils_2": {
187 "locked": {
188 "lastModified": 1667395993,
189 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
190 "owner": "numtide",
191 "repo": "flake-utils",
192 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
193 "type": "github"
194 },
195 "original": {
196 "owner": "numtide",
197 "repo": "flake-utils",
198 "type": "github"
199 }
200 },
201 "loginctl-linger": {
202 "locked": {
203 "lastModified": 1,
204 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
205 "path": "../../flakes/loginctl-linger",
206 "type": "path"
207 },
208 "original": {
209 "path": "../../flakes/loginctl-linger",
210 "type": "path"
211 }
212 },
213 "monitoring": {
214 "inputs": {
215 "environment": "environment_2",
216 "naemon": "naemon",
217 "nixpkgs-lib": "nixpkgs-lib",
218 "secrets": "secrets"
219 },
220 "locked": {
221 "lastModified": 1,
222 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
223 "path": "../../flakes/private/monitoring",
224 "type": "path"
225 },
226 "original": {
227 "path": "../../flakes/private/monitoring",
228 "type": "path"
229 }
230 },
231 "my-lib": {
232 "inputs": {
233 "colmena": "colmena",
234 "disko": "disko",
235 "flake-parts": "flake-parts",
236 "nixos-anywhere": "nixos-anywhere",
237 "nixpkgs": "nixpkgs_4"
238 },
239 "locked": {
240 "lastModified": 1,
241 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
242 "path": "../../flakes/lib",
243 "type": "path"
244 },
245 "original": {
246 "path": "../../flakes/lib",
247 "type": "path"
248 }
249 },
250 "mypackages": {
251 "inputs": {
252 "flake-parts": "flake-parts_2",
253 "nixpkgs": "nixpkgs_7",
254 "webapps-ttrss": "webapps-ttrss"
255 },
256 "locked": {
257 "lastModified": 1,
258 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
259 "path": "../../mypackages",
260 "type": "path"
261 },
262 "original": {
263 "path": "../../mypackages",
264 "type": "path"
265 }
266 },
267 "myuids": {
268 "locked": {
269 "lastModified": 1,
270 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
271 "path": "../../flakes/myuids",
272 "type": "path"
273 },
274 "original": {
275 "path": "../../flakes/myuids",
276 "type": "path"
277 }
278 },
279 "myuids_2": {
280 "locked": {
281 "lastModified": 1,
282 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
283 "path": "../../myuids",
284 "type": "path"
285 },
286 "original": {
287 "path": "../../myuids",
288 "type": "path"
289 }
290 },
291 "naemon": {
292 "locked": {
293 "lastModified": 1,
294 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
295 "path": "../../naemon",
296 "type": "path"
297 },
298 "original": {
299 "path": "../../naemon",
300 "type": "path"
301 }
302 },
303 "nixos-2305": {
304 "locked": {
305 "lastModified": 1687938137,
306 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
307 "owner": "NixOS",
308 "repo": "nixpkgs",
309 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
310 "type": "github"
311 },
312 "original": {
313 "owner": "NixOS",
314 "ref": "release-23.05",
315 "repo": "nixpkgs",
316 "type": "github"
317 }
318 },
319 "nixos-anywhere": {
320 "inputs": {
321 "disko": [
322 "my-lib",
323 "disko"
324 ],
325 "flake-parts": [
326 "my-lib",
327 "flake-parts"
328 ],
329 "nixos-2305": "nixos-2305",
330 "nixos-images": "nixos-images",
331 "nixpkgs": "nixpkgs_3",
332 "treefmt-nix": "treefmt-nix"
333 },
334 "locked": {
335 "lastModified": 1689945193,
336 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
337 "owner": "numtide",
338 "repo": "nixos-anywhere",
339 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
340 "type": "github"
341 },
342 "original": {
343 "owner": "numtide",
344 "repo": "nixos-anywhere",
345 "type": "github"
346 }
347 },
348 "nixos-images": {
349 "inputs": {
350 "nixos-2305": [
351 "my-lib",
352 "nixos-anywhere",
353 "nixos-2305"
354 ],
355 "nixos-unstable": [
356 "my-lib",
357 "nixos-anywhere",
358 "nixpkgs"
359 ]
360 },
361 "locked": {
362 "lastModified": 1686819168,
363 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
364 "owner": "nix-community",
365 "repo": "nixos-images",
366 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
367 "type": "github"
368 },
369 "original": {
370 "owner": "nix-community",
371 "repo": "nixos-images",
372 "type": "github"
373 }
374 },
375 "nixpkgs": {
376 "locked": {
377 "lastModified": 1683408522,
378 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
379 "owner": "NixOS",
380 "repo": "nixpkgs",
381 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
382 "type": "github"
383 },
384 "original": {
385 "owner": "NixOS",
386 "ref": "nixos-unstable",
387 "repo": "nixpkgs",
388 "type": "github"
389 }
390 },
391 "nixpkgs-lib": {
392 "locked": {
393 "dir": "lib",
394 "lastModified": 1691269286,
395 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
396 "owner": "NixOS",
397 "repo": "nixpkgs",
398 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
399 "type": "github"
400 },
401 "original": {
402 "dir": "lib",
403 "owner": "NixOS",
404 "repo": "nixpkgs",
405 "type": "github"
406 }
407 },
408 "nixpkgs-lib_2": {
409 "locked": {
410 "dir": "lib",
411 "lastModified": 1685564631,
412 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
413 "owner": "NixOS",
414 "repo": "nixpkgs",
415 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
416 "type": "github"
417 },
418 "original": {
419 "dir": "lib",
420 "owner": "NixOS",
421 "ref": "nixos-unstable",
422 "repo": "nixpkgs",
423 "type": "github"
424 }
425 },
426 "nixpkgs-lib_3": {
427 "locked": {
428 "dir": "lib",
429 "lastModified": 1675183161,
430 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
431 "owner": "NixOS",
432 "repo": "nixpkgs",
433 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
434 "type": "github"
435 },
436 "original": {
437 "dir": "lib",
438 "owner": "NixOS",
439 "ref": "nixos-unstable",
440 "repo": "nixpkgs",
441 "type": "github"
442 }
443 },
444 "nixpkgs_2": {
445 "locked": {
446 "lastModified": 1687701825,
447 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
448 "owner": "NixOS",
449 "repo": "nixpkgs",
450 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
451 "type": "github"
452 },
453 "original": {
454 "owner": "NixOS",
455 "ref": "nixpkgs-unstable",
456 "repo": "nixpkgs",
457 "type": "github"
458 }
459 },
460 "nixpkgs_3": {
461 "locked": {
462 "lastModified": 1687893427,
463 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
464 "owner": "nixos",
465 "repo": "nixpkgs",
466 "rev": "4b14ab2a916508442e685089672681dff46805be",
467 "type": "github"
468 },
469 "original": {
470 "owner": "nixos",
471 "ref": "nixos-unstable-small",
472 "repo": "nixpkgs",
473 "type": "github"
474 }
475 },
476 "nixpkgs_4": {
477 "locked": {
478 "lastModified": 1648725829,
479 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
480 "owner": "NixOS",
481 "repo": "nixpkgs",
482 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
483 "type": "github"
484 },
485 "original": {
486 "owner": "NixOS",
487 "repo": "nixpkgs",
488 "type": "github"
489 }
490 },
491 "nixpkgs_5": {
492 "locked": {
493 "lastModified": 1693158576,
494 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
495 "owner": "nixos",
496 "repo": "nixpkgs",
497 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
498 "type": "github"
499 },
500 "original": {
501 "owner": "nixos",
502 "ref": "nixos-unstable",
503 "repo": "nixpkgs",
504 "type": "github"
505 }
506 },
507 "nixpkgs_6": {
508 "locked": {
509 "lastModified": 1687502512,
510 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
511 "owner": "NixOS",
512 "repo": "nixpkgs",
513 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
514 "type": "github"
515 },
516 "original": {
517 "owner": "NixOS",
518 "ref": "nixos-unstable",
519 "repo": "nixpkgs",
520 "type": "github"
521 }
522 },
523 "nixpkgs_7": {
524 "locked": {
525 "lastModified": 1646497237,
526 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
527 "owner": "nixos",
528 "repo": "nixpkgs",
529 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
530 "type": "github"
531 },
532 "original": {
533 "owner": "nixos",
534 "repo": "nixpkgs",
535 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
536 "type": "github"
537 }
538 },
539 "root": {
540 "inputs": {
541 "environment": "environment",
542 "files-watcher": "files-watcher",
543 "loginctl-linger": "loginctl-linger",
544 "monitoring": "monitoring",
545 "my-lib": "my-lib",
546 "myuids": "myuids",
547 "nixpkgs": "nixpkgs_5",
548 "secrets": "secrets_2",
549 "ssh": "ssh",
550 "system": "system"
551 }
552 },
553 "secrets": {
554 "locked": {
555 "lastModified": 1,
556 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
557 "path": "../../secrets",
558 "type": "path"
559 },
560 "original": {
561 "path": "../../secrets",
562 "type": "path"
563 }
564 },
565 "secrets-public": {
566 "locked": {
567 "lastModified": 1,
568 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
569 "path": "../../secrets",
570 "type": "path"
571 },
572 "original": {
573 "path": "../../secrets",
574 "type": "path"
575 }
576 },
577 "secrets_2": {
578 "locked": {
579 "lastModified": 1,
580 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
581 "path": "../../flakes/secrets",
582 "type": "path"
583 },
584 "original": {
585 "path": "../../flakes/secrets",
586 "type": "path"
587 }
588 },
589 "secrets_3": {
590 "locked": {
591 "lastModified": 1,
592 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
593 "path": "../../secrets",
594 "type": "path"
595 },
596 "original": {
597 "path": "../../secrets",
598 "type": "path"
599 }
600 },
601 "ssh": {
602 "inputs": {
603 "environment": "environment_3",
604 "secrets": "secrets_3"
605 },
606 "locked": {
607 "lastModified": 1,
608 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
609 "path": "../../flakes/private/ssh",
610 "type": "path"
611 },
612 "original": {
613 "path": "../../flakes/private/ssh",
614 "type": "path"
615 }
616 },
617 "stable": {
618 "locked": {
619 "lastModified": 1669735802,
620 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
621 "owner": "NixOS",
622 "repo": "nixpkgs",
623 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
624 "type": "github"
625 },
626 "original": {
627 "owner": "NixOS",
628 "ref": "nixos-22.11",
629 "repo": "nixpkgs",
630 "type": "github"
631 }
632 },
633 "system": {
634 "inputs": {
635 "backports": "backports",
636 "environment": "environment_4",
637 "mypackages": "mypackages",
638 "myuids": "myuids_2",
639 "secrets-public": "secrets-public"
640 },
641 "locked": {
642 "lastModified": 1,
643 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
644 "path": "../../flakes/private/system",
645 "type": "path"
646 },
647 "original": {
648 "path": "../../flakes/private/system",
649 "type": "path"
650 }
651 },
652 "treefmt-nix": {
653 "inputs": {
654 "nixpkgs": [
655 "my-lib",
656 "nixos-anywhere",
657 "nixpkgs"
658 ]
659 },
660 "locked": {
661 "lastModified": 1687940979,
662 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
663 "owner": "numtide",
664 "repo": "treefmt-nix",
665 "rev": "0a4f06c27610a99080b69433873885df82003aae",
666 "type": "github"
667 },
668 "original": {
669 "owner": "numtide",
670 "repo": "treefmt-nix",
671 "type": "github"
672 }
673 },
674 "webapps-ttrss": {
675 "flake": false,
676 "locked": {
677 "lastModified": 1546759381,
678 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
679 "ref": "master",
680 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
681 "revCount": 9256,
682 "type": "git",
683 "url": "https://git.tt-rss.org/fox/tt-rss.git"
684 },
685 "original": {
686 "ref": "master",
687 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
688 "type": "git",
689 "url": "https://git.tt-rss.org/fox/tt-rss.git"
690 }
691 }
692 },
693 "root": "root",
694 "version": 7
695}
diff --git a/systems/dilion/flake.nix b/systems/dilion/flake.nix
new file mode 100644
index 0000000..9747086
--- /dev/null
+++ b/systems/dilion/flake.nix
@@ -0,0 +1,43 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4
5 my-lib.url = "path:../../flakes/lib";
6
7 monitoring.url = "path:../../flakes/private/monitoring";
8 ssh.url = "path:../../flakes/private/ssh";
9 environment.url = "path:../../flakes/private/environment";
10 system.url = "path:../../flakes/private/system";
11
12 myuids.url = "path:../../flakes/myuids";
13 secrets.url = "path:../../flakes/secrets";
14 files-watcher.url = "path:../../flakes/files-watcher";
15 loginctl-linger.url = "path:../../flakes/loginctl-linger";
16 };
17 outputs = inputs@{ self, my-lib, nixpkgs, ...}:
18 my-lib.lib.mkColmenaFlake {
19 name = "dilion";
20 inherit self nixpkgs;
21 system = "x86_64-linux";
22 targetHost = "176.9.10.233";
23 targetUser = "root";
24 nixosModules = {
25 base = ./base.nix;
26 system = inputs.system.nixosModule;
27 monitoring = inputs.monitoring.nixosModule;
28 environment = inputs.environment.nixosModule;
29 ssh = inputs.ssh.nixosModule;
30
31 myuids = inputs.myuids.nixosModule;
32 secrets = inputs.secrets.nixosModule;
33 files-watcher = inputs.files-watcher.nixosModule;
34 loginctl-linger = inputs.loginctl-linger.nixosModule;
35 };
36 moduleArgs = {
37 nixpkgs = inputs.nixpkgs;
38 monitoring = inputs.monitoring;
39 environment = inputs.environment;
40 pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux;
41 };
42 };
43}
diff --git a/systems/dilion/monitoring.nix b/systems/dilion/monitoring.nix
new file mode 100644
index 0000000..af7f224
--- /dev/null
+++ b/systems/dilion/monitoring.nix
@@ -0,0 +1,43 @@
1{ lib, pkgs, config, name, monitoring, ... }:
2let
3 hostFQDN = config.hostEnv.fqdn;
4 zfs_snapshot = name: {
5 service_description = "ZFS snapshot ${name} happened not too long ago";
6 use = "local-service";
7 check_command = ["check_zfs_snapshot" name];
8 __passive_servicegroups = "webstatus-resources";
9 };
10in
11{
12 config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "mdadm" "zfs" "notify-secondary"];
13 config.myServices.monitoring.objects = lib.mkMerge [
14 (monitoring.lib.objectsCommon {
15 inherit hostFQDN;
16 hostName = name;
17 master = false;
18 processWarn = "250"; processAlert = "400";
19 loadWarn = "1.0"; loadAlert = "1.2";
20 interface = builtins.head (builtins.attrNames config.networking.interfaces);
21 })
22
23 {
24 service = [
25 {
26 service_description = "No mdadm array is degraded";
27 use = "local-service";
28 check_command = ["check_mdadm"];
29 __passive_servicegroups = "webstatus-resources";
30 }
31 {
32 service_description = "No ZFS pool is degraded";
33 use = "local-service";
34 check_command = ["check_zfs"];
35 __passive_servicegroups = "webstatus-resources";
36 }
37 (zfs_snapshot "zpool/backup/eldiron/zpool/root")
38 (zfs_snapshot "zpool/backup/eldiron/zpool/root/etc")
39 (zfs_snapshot "zpool/backup/eldiron/zpool/root/var")
40 ];
41 }
42 ];
43}
diff --git a/systems/dilion/ssh_ldap_regular.sh b/systems/dilion/ssh_ldap_regular.sh
new file mode 100644
index 0000000..4c2f47e
--- /dev/null
+++ b/systems/dilion/ssh_ldap_regular.sh
@@ -0,0 +1,19 @@
1### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
2LDAP_MEMBER="cn=users,cn=ssh,ou=services,dc=immae,dc=eu"
3
4ldap_search '(&(memberOf='$LDAP_MEMBER')('$KEY'=*)(uid='$user'))' $KEY | \
5 while read line ;
6 do
7 if [ ! -z "$line" ]; then
8 if [[ $line == dn* ]]; then
9 user=$(sed -n 's/.*uid=\([^,]*\).*/\1/p' <<< "$line")
10 elif [[ $line == $KEY* ]]; then
11 key=$(clean_key_line ssh "$line")
12 if [ ! -z "$key" ]; then
13 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
14 echo $key
15 fi
16 fi
17 fi
18 fi
19 done
diff --git a/systems/dilion/vms.nix b/systems/dilion/vms.nix
new file mode 100644
index 0000000..189e5ff
--- /dev/null
+++ b/systems/dilion/vms.nix
@@ -0,0 +1,200 @@
1# inspired from https://nixos.wiki/wiki/Virtualization_in_NixOS
2{ config, pkgs, lib, pkgs-no-overlay, ... }@args:
3let
4 toImage = f: "${import ./vms/base_image.nix f (args // { myEnv = config.myEnv; })}/nixos.qcow2";
5in
6{
7 options = {
8 myServices.vms.libvirt-guests = lib.mkOption {
9 type = lib.types.attrsOf (lib.types.submodule {
10 options = {
11 network = lib.mkOption { type = lib.types.str; description = "network to attach the guest to"; };
12 pool = lib.mkOption { type = lib.types.str; description = "pool to attach the guest to"; };
13 cpus = lib.mkOption { type = lib.types.int; default = 1; description = "number of cpus to assign"; };
14 memory = lib.mkOption { type = lib.types.int; description = "memory in GiB to assign"; };
15 diskSize = lib.mkOption { type = lib.types.int; description = "disk size in GiB"; };
16 destroyVolumeOnExit = lib.mkOption { type = lib.types.bool; description = "Whether to destroy the volume on exit"; default = false; };
17 extraDevicesXML = lib.mkOption { type = lib.types.lines; description = "Extra device configuration"; default = ""; };
18 preStart = lib.mkOption { type = lib.types.lines; default = ""; description = "Script to run as prestart"; };
19 };
20 });
21 default = {};
22 description = "Libvirt guests to start";
23 };
24 myServices.vms.libvirt-networks = lib.mkOption {
25 type = lib.types.attrsOf (lib.types.submodule {
26 options = {
27 bridgeNumber = lib.mkOption { type = lib.types.int; description = "bridge interface to create virbr<nbr>"; };
28 ipRange = lib.mkOption { type = lib.types.str; example = "192.168.100"; description = "ip4 prefix to use"; };
29 };
30 });
31 description = "Libvirt networks to configure";
32 default = {};
33 };
34 myServices.vms.libvirt-pools = lib.mkOption {
35 type = lib.types.attrsOf (lib.types.submodule {
36 options = {
37 type = lib.mkOption { type = lib.types.enum [ "dir" "zfs" ]; description = "Pool type"; };
38 target = lib.mkOption { type = lib.types.nullOr lib.types.path; default = null; description = "where to find images"; };
39 preStart = lib.mkOption { type = lib.types.lines; default = ""; description = "Script to run as prestart"; };
40 xml = lib.mkOption { type = lib.types.lines; default = ""; description = "Additional configuration"; };
41 };
42 });
43 };
44 myServices.vms.libvirt-images = lib.mkOption {
45 type = lib.types.attrsOf lib.types.path;
46 default = {};
47 description = "Attrs of images to create in /etc/libvirtd/base-images";
48 };
49 };
50 config = lib.mkMerge [
51 # Define images
52 {
53 environment.etc = lib.mapAttrs'
54 (n: v: lib.nameValuePair "libvirtd/base-images/${n}.qcow2" { source = toImage v; })
55 config.myServices.vms.libvirt-images;
56 }
57
58 # Define networks
59 {
60 systemd.services = lib.mapAttrs' (name: network: lib.nameValuePair "libvirtd-network-${name}" {
61 after = [ "libvirtd.service" ];
62 requires = [ "libvirtd.service" ];
63 wantedBy = [ "multi-user.target" ];
64 serviceConfig = {
65 Type = "oneshot";
66 RemainAfterExit = "yes";
67 };
68 path = [ config.boot.zfs.package ];
69 script = let
70 xml = pkgs.writeText "libvirt-network-${name}.xml" ''
71 <network>
72 <name>${name}</name>
73 <uuid>UUID</uuid>
74 <forward mode='nat' />
75 <bridge name='virbr${builtins.toString network.bridgeNumber}' />
76 <domain name='${name}' localOnly='yes'/>
77 <ip address='${network.ipRange}.1' netmask='255.255.255.0'>
78 <dhcp>
79 <range start='${network.ipRange}.2' end='${network.ipRange}.254'/>
80 </dhcp>
81 </ip>
82 </network>
83 '';
84 in ''
85 uuid="$(${pkgs.libvirt}/bin/virsh net-uuid '${name}' || true)"
86 ${pkgs.libvirt}/bin/virsh net-define <(sed "s/UUID/$uuid/" '${xml}')
87 ${pkgs.libvirt}/bin/virsh net-start '${name}'
88 '';
89 preStop = ''
90 ${pkgs.libvirt}/bin/virsh net-destroy '${name}'
91 '';
92 }) config.myServices.vms.libvirt-networks;
93 }
94
95 # Define pools
96 {
97 systemd.services = lib.mapAttrs' (name: pool: lib.nameValuePair "libvirtd-pool-${name}" {
98 after = [ "libvirtd.service" ];
99 requires = [ "libvirtd.service" ];
100 wantedBy = [ "multi-user.target" ];
101 serviceConfig = {
102 Type = "oneshot";
103 RemainAfterExit = "yes";
104 };
105 path = [ config.boot.zfs.package ];
106 script = let
107 xml = pkgs.writeText "libvirt-pool-${name}.xml" ''
108 <pool type="${pool.type}">
109 <name>${name}</name>
110 <uuid>UUID</uuid>
111 ${pool.xml}
112 ${if pool.target != null then ''
113 <target>
114 <path>${pool.target}</path>
115 </target>
116 '' else ""}
117 </pool>
118 '';
119 in pool.preStart + ''
120 uuid="$(${pkgs.libvirt}/bin/virsh pool-uuid '${name}' || true)"
121 ${pkgs.libvirt}/bin/virsh pool-define <(sed "s/UUID/$uuid/" '${xml}')
122 ${pkgs.libvirt}/bin/virsh pool-start '${name}' || true
123 '';
124 }) config.myServices.vms.libvirt-pools;
125 }
126
127 # Define guests
128 {
129 systemd.services = lib.mapAttrs' (name: guest: lib.nameValuePair "libvirtd-guest-${name}" {
130 after = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ];
131 requires = [ "libvirtd.service" "libvirtd-pool-${guest.pool}.service" "libvirtd-network-${guest.network}.service" ];
132 wantedBy = [ "multi-user.target" ];
133 serviceConfig = {
134 Type = "oneshot";
135 RemainAfterExit = "yes";
136 };
137 path = [ config.boot.zfs.package ];
138 script =
139 let
140 xml = pkgs.writeText "libvirt-guest-${name}.xml"
141 ''
142 <domain type="kvm">
143 <name>${name}</name>
144 <uuid>UUID</uuid>
145 <memory unit="GiB">${builtins.toString guest.memory}</memory>
146 <vcpu>${builtins.toString guest.cpus}</vcpu>
147 <os>
148 <type arch="x86_64">hvm</type>
149 </os>
150 <devices>
151 <emulator>/run/current-system/sw/bin/qemu-system-x86_64</emulator>
152 <disk type="volume">
153 <source pool="${guest.pool}" volume="guest-${name}" />
154 <target dev="vda" bus="virtio"/>
155 </disk>
156 ${guest.extraDevicesXML}
157 <input type="keyboard" bus="usb"/>
158 <graphics type="vnc" port="-1" autoport="yes"/>
159 <interface type="network">
160 <source network="${guest.network}" />
161 </interface>
162 </devices>
163 <features>
164 <acpi/>
165 </features>
166 </domain>
167 '';
168 in
169 guest.preStart + ''
170 if ! ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then
171 ${pkgs.libvirt}/bin/virsh vol-create-as --pool ${guest.pool} --name 'guest-${name}' --capacity '${builtins.toString guest.diskSize}GiB'
172 volume_path=$(${pkgs.libvirt}/bin/virsh vol-path --pool ${guest.pool} --vol 'guest-${name}')
173 ${pkgs-no-overlay.qemu}/bin/qemu-img convert /etc/libvirtd/base-images/nixos.qcow2 $volume_path
174 fi
175 uuid="$(${pkgs.libvirt}/bin/virsh domuuid '${name}' || true)"
176 ${pkgs.libvirt}/bin/virsh define <(sed "s/UUID/$uuid/" '${xml}')
177 ${pkgs.libvirt}/bin/virsh start '${name}'
178 '';
179 preStop = ''
180 ${pkgs.libvirt}/bin/virsh shutdown '${name}'
181 let "timeout = $(date +%s) + 10"
182 while [ "$(${pkgs.libvirt}/bin/virsh list --name | grep --count '^${name}$')" -gt 0 ]; do
183 if [ "$(date +%s)" -ge "$timeout" ]; then
184 # Meh, we warned it...
185 ${pkgs.libvirt}/bin/virsh destroy '${name}'
186 else
187 # The machine is still running, let's give it some time to shut down
188 sleep 0.5
189 fi
190 done
191 '' + lib.optionalString guest.destroyVolumeOnExit ''
192 if ${pkgs.libvirt}/bin/virsh vol-key 'guest-${name}' --pool ${guest.pool} &> /dev/null; then
193 ${pkgs.libvirt}/bin/virsh vol-wipe --pool ${guest.pool} --vol 'guest-${name}' || true
194 ${pkgs.libvirt}/bin/virsh vol-delete --pool ${guest.pool} --vol 'guest-${name}'
195 fi
196 '';
197 }) config.myServices.vms.libvirt-guests;
198 }
199 ];
200}
diff --git a/systems/dilion/vms/base_configuration.nix b/systems/dilion/vms/base_configuration.nix
new file mode 100644
index 0000000..7b67886
--- /dev/null
+++ b/systems/dilion/vms/base_configuration.nix
@@ -0,0 +1,27 @@
1{ lib, config, environment, ... }@args:
2{
3 options.myEnv = (environment.nixosModule (args // { name = "dummy"; })).options.myEnv;
4 config = {
5 # This value determines the NixOS release with which your system is
6 # to be compatible, in order to avoid breaking some software such as
7 # database servers. You should change this only after NixOS release
8 # notes say you should.
9 # https://nixos.org/nixos/manual/release-notes.html
10 system.stateVersion = lib.mkDefault "23.05"; # Did you read the comment?
11
12 fileSystems."/".device = "/dev/disk/by-label/nixos";
13 boot.initrd.availableKernelModules = [ "xhci_pci" "ehci_pci" "ahci" "usbhid" "usb_storage" "sd_mod" "virtio_balloon" "virtio_blk" "virtio_pci" "virtio_ring" ];
14 boot.loader = {
15 grub = {
16 device = "/dev/vda";
17 };
18 timeout = 0;
19 };
20 services.openssh.enable = true;
21 networking.firewall.allowedTCPPorts = [ 22 ];
22 users = {
23 mutableUsers = false;
24 users.root.openssh.authorizedKeys.keys = [ config.myEnv.sshd.rootKeys.immae_dilion ];
25 };
26 };
27}
diff --git a/systems/dilion/vms/base_image.nix b/systems/dilion/vms/base_image.nix
new file mode 100644
index 0000000..46b90eb
--- /dev/null
+++ b/systems/dilion/vms/base_image.nix
@@ -0,0 +1,98 @@
1configuration_file: { pkgs, myEnv, nixpkgs, environment, pkgs-no-overlay, ... }:
2let
3 config = (import (nixpkgs + "/nixos/lib/eval-config.nix") {
4 inherit (pkgs) system;
5 modules = [ {
6 _module.args.environment = environment;
7 myEnv = myEnv;
8 imports = [
9 (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix")
10 configuration_file
11 ];
12
13 # We want our template image to be as small as possible, but the deployed image should be able to be
14 # of any size. Hence we resize on the first boot.
15 systemd.services.resize-main-fs = {
16 wantedBy = [ "multi-user.target" ];
17 serviceConfig.Type = "oneshot";
18 script =
19 ''
20 # Resize main partition to fill whole disk
21 echo ", +" | ${pkgs.utillinux}/bin/sfdisk /dev/vda --no-reread -N 1
22 ${pkgs.parted}/bin/partprobe
23 # Resize filesystem
24 ${pkgs.e2fsprogs}/bin/resize2fs /dev/vda1
25 '';
26 };
27 } ];
28 }).config;
29in pkgs-no-overlay.vmTools.runInLinuxVM (
30 pkgs.runCommand "nixos-base-image"
31 {
32 memSize = 768;
33 preVM =
34 ''
35 mkdir $out
36 diskImage=image.qcow2
37 ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img create -f qcow2 $diskImage 2G
38 mv closure xchg/
39 '';
40 postVM =
41 ''
42 echo compressing VM image...
43 ${pkgs-no-overlay.vmTools.qemu}/bin/qemu-img convert -c $diskImage -O qcow2 $out/nixos.qcow2
44 '';
45 buildInputs = [ pkgs.utillinux pkgs.perl pkgs.parted pkgs.e2fsprogs ];
46 exportReferencesGraph =
47 [ "closure" config.system.build.toplevel ];
48 }
49 ''
50 # Create the partition
51 parted /dev/vda mklabel msdos
52 parted /dev/vda -- mkpart primary ext4 1M -1s
53
54 # Format the partition
55 mkfs.ext4 -L nixos /dev/vda1
56 mkdir /mnt
57 mount /dev/vda1 /mnt
58
59 for dir in dev proc sys; do
60 mkdir /mnt/$dir
61 mount --bind /$dir /mnt/$dir
62 done
63
64 storePaths=$(perl ${pkgs.pathsFromGraph} /tmp/xchg/closure)
65 echo filling Nix store...
66 mkdir -p /mnt/nix/store
67 set -f
68 cp -prd $storePaths /mnt/nix/store
69 # The permissions will be set up incorrectly if the host machine is not running NixOS
70 chown -R 0:30000 /mnt/nix/store
71
72 mkdir -p /mnt/etc/nix
73 echo 'build-users-group = ' > /mnt/etc/nix/nix.conf
74
75 # Register the paths in the Nix database.
76 export USER=root
77 printRegistration=1 perl ${pkgs.pathsFromGraph} /tmp/xchg/closure | \
78 chroot /mnt ${config.nix.package.out}/bin/nix-store --load-db
79
80 # Create the system profile to allow nixos-rebuild to work.
81 chroot /mnt ${config.nix.package.out}/bin/nix-env \
82 -p /nix/var/nix/profiles/system --set ${config.system.build.toplevel}
83
84 # `nixos-rebuild' requires an /etc/NIXOS.
85 mkdir -p /mnt/etc/nixos
86 touch /mnt/etc/NIXOS
87
88 # `switch-to-configuration' requires a /bin/sh
89 mkdir -p /mnt/bin
90 ln -s ${config.system.build.binsh}/bin/sh /mnt/bin/sh
91
92 # Generate the GRUB menu.
93 chroot /mnt ${config.system.build.toplevel}/bin/switch-to-configuration boot
94
95 umount /mnt/{proc,dev,sys}
96 umount /mnt
97 ''
98)
diff --git a/systems/dilion/vms/buildbot_configuration.nix b/systems/dilion/vms/buildbot_configuration.nix
new file mode 100644
index 0000000..622f8ba
--- /dev/null
+++ b/systems/dilion/vms/buildbot_configuration.nix
@@ -0,0 +1,73 @@
1{ pkgs, config, lib, ... }:
2{
3 imports = [
4 ./base_configuration.nix
5 ];
6 # This value determines the NixOS release with which your system is
7 # to be compatible, in order to avoid breaking some software such as
8 # database servers. You should change this only after NixOS release
9 # notes say you should.
10 # https://nixos.org/nixos/manual/release-notes.html
11 system.stateVersion = "23.05"; # Did you read the comment?
12
13 systemd.services.buildbot-worker.serviceConfig.ExecStartPre = let
14 cfg = config.services.buildbot-worker;
15 script = pkgs.writeScript "decode-dmi" ''
16 #!${pkgs.stdenv.shell}
17
18 mkdir -vp "${cfg.buildbotDir}"
19 varfile=${cfg.buildbotDir}/variables
20 rm $varfile || true
21 echo "[DEFAULT]" > $varfile
22 strings=$(${pkgs.dmidecode}/bin/dmidecode --oem-string count)
23 for i in $(seq 1 $strings); do
24 ${pkgs.dmidecode}/bin/dmidecode --oem-string $i >> $varfile
25 done
26 chown -R ${cfg.user}:${cfg.group} ${cfg.buildbotDir}
27 '';
28 in
29 lib.mkForce ["+${script}"];
30 systemd.services.buildbot-worker.serviceConfig.ExecStart = let
31 cfg = config.services.buildbot-worker;
32 tacFile = pkgs.writeText "buildbot-worker.tac" ''
33 import os
34 from io import open
35
36 from buildbot_worker.bot import Worker
37 from twisted.application import service
38
39 basedir = '${cfg.buildbotDir}'
40
41 # note: this line is matched against to check that this is a worker
42 # directory; do not edit it.
43 application = service.Application('buildbot-worker')
44
45 import configparser
46 config = config = configparser.ConfigParser()
47 config.read("${cfg.buildbotDir}/variables")
48 master_url_split = config["DEFAULT"]["buildbot_master_url"].split(':')
49 buildmaster_host = master_url_split[0]
50 port = int(master_url_split[1])
51 workername = config["DEFAULT"]["buildbot_worker_name"]
52
53 with open('${cfg.workerPassFile}', 'r', encoding='utf-8') as passwd_file:
54 passwd = passwd_file.read().strip('\r\n')
55 keepalive = ${toString cfg.keepalive}
56 umask = None
57 maxdelay = 300
58 numcpus = None
59 allow_shutdown = None
60
61 s = Worker(buildmaster_host, port, workername, passwd, basedir,
62 keepalive, umask=umask, maxdelay=maxdelay,
63 numcpus=numcpus, allow_shutdown=allow_shutdown)
64 s.setServiceParent(application)
65 '';
66 in
67 lib.mkForce "${cfg.package.pythonModule.pkgs.twisted}/bin/twistd --nodaemon --pidfile= --logfile - --python ${tacFile}";
68 services.buildbot-worker = {
69 enable = true;
70 workerPass = config.myEnv.buildbot.workerPassword;
71 packages = [ pkgs.git pkgs.gzip pkgs.openssh ];
72 };
73}
diff --git a/systems/eldiron/base.nix b/systems/eldiron/base.nix
new file mode 100644
index 0000000..cda518e
--- /dev/null
+++ b/systems/eldiron/base.nix
@@ -0,0 +1,371 @@
1{ config, pkgs, lib, php, name, secrets, ... }:
2{
3 # ssh-keyscan eldiron | nix-shell -p ssh-to-age --run ssh-to-age
4 secrets.ageKeys = [ "age1dxr5lhvtnjssfaqpnf6qx80h8gfwkxg3tdf35m6n9wljmk7wadfs3kmahj" ];
5 boot = {
6 kernelModules = [ "kvm-intel" ];
7 blacklistedKernelModules = [ "nvidiafb" ];
8 loader.timeout = 1;
9 loader.grub.devices = [ "/dev/sda" "/dev/sdc" ];
10 kernel.sysctl = {
11 # https://github.com/Netflix/security-bulletins/blob/master/advisories/third-party/2019-001.md
12 "net.ipv4.tcp_sack" = 0;
13 };
14 supportedFilesystems = [ "zfs" ];
15 kernelParams = ["zfs.zfs_arc_max=6442450944"];
16 kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
17 initrd.availableKernelModules = [ "ahci" "sd_mod" ];
18 initrd.secrets = {
19 "/boot/pass.key" = "/boot/pass.key";
20 };
21 };
22 services.udev.extraRules = ''
23 ACTION=="add", SUBSYSTEM=="net", ATTR{address}=="c8:60:00:56:a0:88", NAME="eth0"
24 '';
25 nix.settings.max-jobs = 8;
26 nixpkgs.config.permittedInsecurePackages = [
27 "python-2.7.18.6" # for nagios-cli
28 "nodejs-16.20.2" # for landing page building
29 ];
30
31 nixpkgs.overlays = [
32 php.overlays.php
33 ];
34 powerManagement.cpuFreqGovernor = "powersave";
35
36 security.acme.certs."${name}".postRun = builtins.concatStringsSep "\n" [
37 (lib.optionalString config.services.websites.env.production.enable "/run/current-system/sw/bin/machinectl shell httpd-production /usr/bin/env systemctl reload httpd.service")
38 (lib.optionalString config.services.websites.env.integration.enable "/run/current-system/sw/bin/machinectl shell httpd-integration /usr/bin/env systemctl reload httpd.service")
39 ];
40
41 fileSystems = {
42 # pools:
43 # zpool: ashift=12
44 # zfast: ashift=12
45 # zfs:
46 # zpool/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
47 # zpool/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
48 # zpool/root/var: atime=on
49 # zfast/: acltype=posixacl ; xattr=sa ; atime=off ; mountpoint=legacy
50 # zfast/root: encryption=on ; keyformat=passphrase ; keylocation=file:///boot/pass.key
51 # zfast/root/etc: ø
52 # zfast/root/nix: ø
53 # zfast/root/tmp: async=disabled
54 # zfast/root/var: atime=on
55 # zfast/root/var/lib: ø
56 # zfast/root/var/lib/mysql: logbias=throughput ; atime=off ; primarycache=metadata
57 # zfast/root/var/lib/postgresql: recordsize=8K ; atime=off ; logbias=throughput
58 # zfast/root/var/lib/postgresql/11.0: ø
59 # zfast/root/var/lib/postgresql/11.0/pg_wal: ø
60 "/" = { fsType = "zfs"; device = "zpool/root"; };
61 "/boot" = { fsType = "ext4"; device = "/dev/disk/by-uuid/e6bb18fb-ff56-4b5f-ae9f-e60d40dc0622"; };
62 "/etc" = { fsType = "zfs"; device = "zpool/root/etc"; };
63 "/nix" = { fsType = "zfs"; device = "zfast/root/nix"; };
64 "/tmp" = { fsType = "zfs"; device = "zfast/root/tmp"; };
65 "/var" = { fsType = "zfs"; device = "zpool/root/var"; };
66 "/var/lib/mysql" = { fsType = "zfs"; device = "zfast/root/var/lib/mysql"; };
67 "/var/lib/postgresql" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql"; };
68 "/var/lib/postgresql/11.0" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0"; };
69 "/var/lib/postgresql/11.0/pg_wal" = { fsType = "zfs"; device = "zfast/root/var/lib/postgresql/11.0/pg_wal"; };
70 };
71 swapDevices = [ { label = "swap1"; } { label = "swap2"; } ];
72 hardware.enableRedistributableFirmware = true;
73
74 services.zfs = {
75 autoScrub = {
76 enable = false;
77 };
78 };
79 networking = {
80 hostId = "8262ca33"; # generated with head -c4 /dev/urandom | od -A none -t x4
81 firewall.enable = true;
82 firewall.allowedTCPPorts = [ config.myEnv.ports.zrepl_flony ];
83 # FIXME: on next reboot, remove the /27 and the localCommands
84 interfaces."eth0".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
85 (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or []))
86 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips))
87 ++ [ { address = lib.head config.hostEnv.ips.main.ip4; prefixLength = 27; } ];
88 interfaces."eth0".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
89 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
90 config.hostEnv.ips);
91 defaultGateway = "176.9.151.65";
92 localCommands = ''
93 # FIXME: Those commands were added by nixops and may not be
94 # actually needed
95 ip -6 addr add '2a01:4f8:160:3445::/64' dev 'eth0' || true
96 ip -4 route change '176.9.151.64/27' via '176.9.151.65' dev 'eth0' || true
97 ip -6 route add default via 'fe80::1' dev eth0 || true
98 '';
99 nameservers = [
100 "213.133.98.98"
101 "213.133.99.99"
102 "213.133.100.100"
103 "2a01:4f8:0:a0a1::add:1010"
104 "2a01:4f8:0:a102::add:9999"
105 "2a01:4f8:0:a111::add:9898"
106 ];
107 };
108
109 imports = [
110 secrets.nixosModules.users-config-eldiron
111 ./databases
112 ./databases/mariadb.nix
113 ./databases/openldap
114 ./databases/postgresql.nix
115 ./databases/redis.nix
116
117
118 ./monitoring.nix
119 ./ejabberd
120 ./buildbot
121 ./coturn.nix
122 ./dns.nix
123 ./duply_backup.nix
124 ./gemini
125 ./gitolite
126 ./mail
127 ./websites
128 ./webstats
129 ./irc.nix
130 ./pub
131 ./tasks
132 ./ftp.nix
133 ./mpd.nix
134 ./vpn
135 ];
136
137 myServices.buildbot.enable = true;
138 myServices.databases.enable = true;
139 myServices.gitolite.enable = true;
140 myServices.monitoring.enable = true;
141 myServices.irc.enable = true;
142 myServices.pub.enable = true;
143 myServices.tasks.enable = true;
144 myServices.mpd.enable = true;
145 myServices.dns.enable = true;
146 myServices.websites.enable = true;
147 myServices.gemini.enable = true;
148 myServices.mail.enable = true;
149 myServices.ejabberd.enable = true;
150 myServices.vpn.enable = true;
151 myServices.ftp.enable = true;
152
153 myServices.chatonsProperties.hostings.infogerance = {
154 file.datetime = "2022-08-27T18:50:00";
155 hosting = {
156 name = "Infogérance";
157 description = "Administration de serveurs";
158 website = "https://www.immae.eu/";
159 logo = "https://assets.immae.eu/logo.jpg";
160 type = "HOSTEDSERVER";
161 status.level = "OK";
162 status.description = "OK";
163 registration.load = "OPEN";
164 install.type = "PACKAGE";
165 };
166 };
167
168 services.netdata.enable = true;
169 services.netdata.config.global."memory mode" = "none";
170 services.netdata.config.health."enabled" = "no";
171 services.netdata.config.web.mode = "none";
172 users.users."${config.services.netdata.user}".extraGroups = [ "keys" ];
173 services.netdata.configDir."stream.conf" = config.secrets.fullPaths."netdata-stream.conf";
174 secrets.keys = {
175 "ldap/pam_pgsql" = {
176 user = "root";
177 group = "root";
178 permissions = "0400";
179 text = ''
180 database = immae
181 user = immae_auth_read
182 password = {{ .postgresql.immae_auth_read }}
183 table = ldap_users
184 user_column = login
185 pw_type = function
186 auth_query = SELECT (mechanism = 'SSHA' AND password = encode(digest( %p || salt, 'sha1'), 'hex')) FROM ldap_users WHERE login = %u OR login || '@' || realm = %u
187 #pwd_query = WITH newsalt as (select gen_random_bytes(4)) UPDATE ldap_users SET password = encode(digest( %p || (SELECT * FROM newsalt), 'sha1'), 'hex'), salt = (SELECT * FROM newsalt), mechanism = 'SSHA' WHERE login = %u OR login || '@' || realm = %u
188 '';
189 };
190
191 "netdata-stream.conf" = {
192 user = config.services.netdata.user;
193 group = config.services.netdata.group;
194 permissions = "0400";
195 text = ''
196 [stream]
197 enabled = yes
198 destination = ${config.myEnv.monitoring.netdata_aggregator}
199 api key = ${config.myEnv.monitoring.netdata_keys.eldiron}
200 '';
201 };
202 "zrepl_backup/identity" = {
203 user = "root";
204 group = "root";
205 permissions = "0400";
206 text = config.myEnv.zrepl_backup.ssh_key.private;
207 };
208 "zrepl/${name}.key" = {
209 permissions = "0400";
210 text = config.myEnv.zrepl_backup.certs."${name}".key;
211 user = "root";
212 group = "root";
213 };
214 } // builtins.listToAttrs (map (x: lib.attrsets.nameValuePair "zrepl/certificates/${x}.crt" {
215 permissions = "0400";
216 text = config.myEnv.zrepl_backup.certs."${x}".certificate;
217 user = "root";
218 group = "root";
219 }) (builtins.attrNames config.myEnv.zrepl_backup.certs));
220
221 programs.ssh.knownHosts.dilion = {
222 extraHostNames = ["dilion.immae.eu"];
223 publicKey = config.myEnv.servers.dilion.hostKey;
224 };
225
226 services.cron = {
227 enable = true;
228 mailto = "cron@immae.eu";
229 systemCronJobs = [
230 ''
231 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "immae.eu.*Recipient address rejected"
232 # Need a way to blacklist properly
233 # 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtpd -g "NOQUEUE:"
234 0 0 * * * root journalctl -q --since="25 hours ago" -u postfix -t postfix/smtp -g "status=bounced"
235 ''
236 ];
237 };
238
239 environment.systemPackages = [ pkgs.bindfs ];
240
241 environment.etc."mdadm.conf" = {
242 enable = true;
243 mode = "0644";
244 user = "root";
245 text = "MAILADDR ${config.myEnv.monitoring.email}";
246 };
247
248 systemd.services.zrepl.path = [ pkgs.openssh ];
249 services.zrepl = {
250 enable = true;
251 settings = {
252 jobs = [
253 {
254 type = "push";
255 # must not change
256 name = "backup-to-dilion";
257 filesystems."zpool/root" = true;
258 filesystems."zpool/root/etc" = true;
259 filesystems."zpool/root/var<" = true;
260 connect = {
261 address = "dilion.immae.eu:19000";
262 type = "tls";
263 server_cn = "dilion";
264 ca = config.secrets.fullPaths."zrepl/certificates/dilion.crt";
265 cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt";
266 key = config.secrets.fullPaths."zrepl/eldiron.key";
267 };
268 snapshotting = {
269 type = "periodic";
270 prefix = "zrepl_";
271 interval = "1h";
272 # hooks = [
273 # {
274 # type = "mysql-lock-tables";
275 # dsn = "${config.myEnv.zrepl_backup.mysql.user}:${config.myEnv.zrepl_backup.mysql.password}@tcp(localhost)/";
276 # filesystems."zpool/root/var" = true;
277 # }
278 # {
279 # type = "command";
280 # path = pkgs.writeScript "redis-dump" ''
281 # #!${pkgs.stdenv.shell}
282 # ${pkgs.redis}/bin/redis-cli bgsave
283 # '';
284 # err_is_fatal = false;
285 # filesystems."zpool/root/var" = true;
286 # }
287 # ];
288 };
289 send.encrypted = true;
290 pruning.keep_sender = [
291 { type = "regex"; regex = "^manual_.*"; }
292 { type = "grid"; grid = "24x1h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; }
293 ];
294 pruning.keep_receiver = [
295 { type = "regex"; regex = "^manual_.*"; }
296 { type = "grid"; grid = "6x4h | 7x1d | 4x7d | 6x30d"; regex = "^zrepl_.*"; }
297 ];
298 }
299 {
300 type = "source";
301 # must not change
302 name = "backup-to-wd-zpool";
303 serve.type = "tls";
304 serve.listen = ":${builtins.toString config.myEnv.ports.zrepl_flony}";
305 serve.ca = config.secrets.fullPaths."zrepl/certificates/flony.crt";
306 serve.cert = config.secrets.fullPaths."zrepl/certificates/eldiron.crt";
307 serve.key = config.secrets.fullPaths."zrepl/eldiron.key";
308 serve.client_cns = [ "flony" ];
309 filesystems."zpool/root" = true;
310 filesystems."zpool/root/etc" = true;
311 filesystems."zpool/root/var<" = true;
312 filesystems."zfast/root/var<" = true;
313 send.encrypted = true;
314 snapshotting.type = "manual";
315 }
316 ];
317 };
318 };
319
320 environment.etc."fail2ban/filter.d/postgresql.conf".text = ''
321 [Definition]
322 failregex = <HOST> \S+ FATAL: password authentication failed for user .+$
323 <HOST> \S+ FATAL: PAM authentication failed for user.+$
324 <HOST> \S+ FATAL: no pg_hba.conf entry for host.+$
325 '';
326 environment.etc."fail2ban/filter.d/mysqld-auth.local".text = ''
327 [Definition]
328 _daemon = mysql[-\w]*
329 '';
330 services.fail2ban.jails.dovecot = ''
331 enabled = true
332 '';
333 services.fail2ban.jails.postfix-sasl = ''
334 enabled = true
335 '';
336 services.fail2ban.jails.proftpd = ''
337 enabled = true
338 '';
339 services.fail2ban.jails.postgresql = ''
340 enabled = true
341 port = 5432
342 logpath = %(syslog_daemon)s
343 backend = %(default_backend)s
344 journalmatch = _SYSTEMD_UNIT=postgresql.service + _COMM=postgres
345 '';
346 services.fail2ban.jails.mysqld-auth = ''
347 enabled = true
348 journalmatch = _SYSTEMD_UNIT=mysql.service + _COMM=mysqld
349 '';
350 # This value determines the NixOS release with which your system is
351 # to be compatible, in order to avoid breaking some software such as
352 # database servers. You should change this only after NixOS release
353 # notes say you should.
354 # https://nixos.org/nixos/manual/release-notes.html
355 system.stateVersion = "23.05"; # Did you read the comment?
356
357 security.pam.services.ldap.text = ''
358 # Authentication from ldap for pgsql
359 auth required ${pkgs.pam_pgsql}/lib/security/pam_pgsql.so config_file=/var/secrets/ldap/pam_pgsql
360 account required ${pkgs.pam_pgsql}/lib/security/pam_pgsql.so config_file=/var/secrets/ldap/pam_pgsql
361 '';
362 services.saslauthd = {
363 enable = true;
364 mechanism = "pam";
365 };
366 environment.etc."sasl2/slapd.conf".text = ''
367 mech_list: plain
368 pwcheck_method: saslauthd
369 saslauthd_path: /run/saslauthd/mux
370 '';
371}
diff --git a/systems/eldiron/buildbot/default.nix b/systems/eldiron/buildbot/default.nix
new file mode 100644
index 0000000..e86b081
--- /dev/null
+++ b/systems/eldiron/buildbot/default.nix
@@ -0,0 +1,310 @@
1{ lib, pkgs, config, buildbot, ... }:
2let
3 varDir = "/var/lib/buildbot";
4 bb-python = buildbot.pythonModule;
5in
6{
7 options = {
8 myServices.buildbot.enable = lib.mkOption {
9 type = lib.types.bool;
10 default = false;
11 description = ''
12 Whether to enable buildbot.
13 '';
14 };
15 };
16
17 config = lib.mkIf config.myServices.buildbot.enable {
18 myEnv.buildbot.projects.test = {
19 name = "test";
20 workerPort = config.myEnv.ports.buildbot_test;
21 packages = [ pkgs.git pkgs.gzip pkgs.openssh ];
22 pythonPathHome = false;
23 secrets = {
24 apprise_webhooks = builtins.concatStringsSep "\n" [
25 "{{ .apprise_webhooks.matrix_immae_eu_alert }}"
26 ];
27 notify_xmpp_password = "{{ .xmpp.notify_bot }}";
28 };
29 activationScript = ''
30 install -m 0755 -o buildbot -g buildbot -d /var/lib/ftp/release.immae.eu/test
31 '';
32 webhookTokens = [
33 "{{ .buildbot.webhookTokens.Immae }}"
34 "{{ .buildbot.webhookTokens.Immae }}"
35 ];
36 };
37
38 myServices.chatonsProperties.hostings.buildbot = {
39 file.datetime = "2022-08-21T10:37:00";
40 hosting = {
41 name = "Buildbot";
42 description = "Python-based continuous integration testing framework";
43 type = "INSTANCE";
44 website = "https://git.immae.eu";
45 logo = "https://www.buildbot.net/img/icon.png";
46 status.level = "OK";
47 status.description = "OK";
48 registration.load = "OPEN";
49 install.type = "PACKAGE";
50 guide.user = "https://www.immae.eu/docs/forge-logicielle.html";
51 };
52 software = {
53 name = "Buildbot";
54 website = "https://www.buildbot.net/";
55 license.url = "https://github.com/buildbot/buildbot/blob/master/LICENSE";
56 license.name = "GNU General Public License v2.0";
57 version = pkgs.buildbot.version;
58 source.url = "https://github.com/buildbot/buildbot";
59 };
60 };
61 nixpkgs.overlays = [
62 (self: super: {
63 follow-systemd-unit = self.writeScriptBin "follow-systemd-unit" ''
64 #!${self.stdenv.shell}
65
66 set -euo pipefail
67
68 service=$1
69 before_invocation_id=$2
70
71 get_id() {
72 systemctl show -p InvocationID --value "$service"
73 }
74
75 while [ "$(get_id)" = "$before_invocation_id" ]; do sleep 1; done
76
77 invocation_id="$(get_id)"
78 cursor="$(mktemp)"
79 trap "rm -f $cursor" EXIT
80
81 get_logs() {
82 journalctl --quiet --cursor-file=$cursor INVOCATION_ID=$invocation_id + _SYSTEMD_INVOCATION_ID=$invocation_id
83 }
84
85 while [ -n "$(systemctl show -p Job --value "$service")" ]; do
86 get_logs
87 done
88 get_logs
89 '';
90 })
91 ];
92 ids.uids.buildbot = config.myEnv.buildbot.user.uid;
93 ids.gids.buildbot = config.myEnv.buildbot.user.gid;
94
95 users.groups.buildbot.gid = config.ids.gids.buildbot;
96 users.users.buildbot = {
97 name = "buildbot";
98 uid = config.ids.uids.buildbot;
99 group = "buildbot";
100 description = "Buildbot user";
101 home = varDir;
102 extraGroups = [ "keys" "systemd-journal" ];
103 useDefaultShell = true;
104 openssh.authorizedKeys.keys = [ config.myEnv.buildbot.ssh_key.public ];
105 };
106
107 services.websites.env.tools.watchPaths = lib.attrsets.mapAttrsToList
108 (k: project: config.secrets.fullPaths."buildbot/${project.name}/webhook-httpd-include")
109 config.myEnv.buildbot.projects;
110
111 services.websites.env.tools.vhostConfs.git.extraConfig = lib.attrsets.mapAttrsToList (k: project: ''
112 RedirectMatch permanent "^/buildbot/${project.name}$" "/buildbot/${project.name}/"
113 RewriteEngine On
114 RewriteRule ^/buildbot/${project.name}/ws(.*)$ unix:///run/buildbot/${project.name}.sock|ws://git.immae.eu/ws$1 [P,NE,QSA,L]
115 ProxyPass /buildbot/${project.name}/ unix:///run/buildbot/${project.name}.sock|http://${project.name}-git.immae.eu/
116 ProxyPassReverse /buildbot/${project.name}/ unix:///run/buildbot/${project.name}.sock|http://${project.name}-git.immae.eu/
117 <Location /buildbot/${project.name}/>
118 Use LDAPConnect
119 Require ldap-group cn=users,ou=${project.name},cn=buildbot,ou=services,dc=immae,dc=eu
120
121 SetEnvIf X-Url-Scheme https HTTPS=1
122 ProxyPreserveHost On
123 </Location>
124 <Location /buildbot/${project.name}/change_hook/base>
125 <RequireAny>
126 Require local
127 Require ldap-group cn=users,ou=${project.name},cn=buildbot,ou=services,dc=immae,dc=eu
128 Include ${config.secrets.fullPaths."buildbot/${project.name}/webhook-httpd-include"}
129 </RequireAny>
130 </Location>
131 '') config.myEnv.buildbot.projects;
132
133 system.activationScripts = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
134 deps = [ "users" "wrappers" ];
135 text = ''
136 install -m 755 -o buildbot -g buildbot -d ${varDir}/${project.name}
137
138 ${project.activationScript}
139 '';
140 }) config.myEnv.buildbot.projects;
141
142 secrets.keys = lib.listToAttrs (
143 lib.lists.flatten (
144 lib.attrsets.mapAttrsToList (k: project:
145 lib.attrsets.mapAttrsToList (k: v:
146 (lib.nameValuePair "buildbot/${project.name}/${k}" {
147 permissions = "0600";
148 user = "buildbot";
149 group = "buildbot";
150 text = v;
151 })
152 ) project.secrets
153 ++ [
154 (lib.nameValuePair "buildbot/${project.name}/webhook-httpd-include" {
155 permissions = "0600";
156 user = "wwwrun";
157 group = "wwwrun";
158 text = lib.optionalString (project.webhookTokens != null) ''
159 Require expr "req('Access-Key') in { ${builtins.concatStringsSep ", " (map (x: "'${x}'") project.webhookTokens)} }"
160 '';
161 })
162 (lib.nameValuePair "buildbot/${project.name}/environment_file" {
163 permissions = "0600";
164 user = "buildbot";
165 group = "buildbot";
166 keyDependencies = [ (buildbot.buildbot_config project).src ] ++ project.secretsDeps;
167 text = let
168 project_env = with lib.attrsets;
169 mapAttrs' (k: v: nameValuePair "BUILDBOT_${k}" v) project.environment //
170 {
171 BUILDBOT_PROJECT_DIR = (buildbot.buildbot_config project).src;
172 BUILDBOT_WORKER_PORT = builtins.toString project.workerPort;
173 BUILDBOT_HOST = config.hostEnv.fqdn;
174 BUILDBOT_VIRT_URL = "qemu+ssh://libvirt@dilion.immae.eu/system";
175 };
176 in builtins.concatStringsSep "\n"
177 (lib.mapAttrsToList (envK: envV: "${envK}=${envV}") project_env);
178 })
179 ]
180 ) config.myEnv.buildbot.projects
181 )
182 ) // {
183 "buildbot/ldap" = {
184 permissions = "0600";
185 user = "buildbot";
186 group = "buildbot";
187 text = config.myEnv.buildbot.ldap.password;
188 };
189 "buildbot/worker_password" = {
190 permissions = "0600";
191 user = "buildbot";
192 group = "buildbot";
193 text = config.myEnv.buildbot.workerPassword;
194 };
195 "buildbot/ssh_key" = {
196 permissions = "0600";
197 user = "buildbot";
198 group = "buildbot";
199 text = config.myEnv.buildbot.ssh_key.private;
200 };
201 "buildbot/ssh_known_hosts" = {
202 permissions = "0644";
203 user = "buildbot";
204 group = "buildbot";
205 text = ''
206 git.immae.eu ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF
207 eldiron ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIIFbhFTl2A2RJn5L51yxJM4XfCS2ZaiSX/jo9jFSdghF
208 phare.normalesup.org ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIN2GomItXICXpCtCFRMT2xuerqx2nLMO/3mNUuWyzFr1
209 '';
210 };
211 };
212
213 services.filesWatcher = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
214 restart = true;
215 paths = [
216 config.secrets.fullPaths."buildbot/ldap"
217 config.secrets.fullPaths."buildbot/worker_password"
218 config.secrets.fullPaths."buildbot/ssh_key"
219 config.secrets.fullPaths."buildbot/${project.name}/environment_file"
220 ] ++ lib.attrsets.mapAttrsToList (k: v: config.secrets.fullPaths."buildbot/${project.name}/${k}") project.secrets;
221 }) config.myEnv.buildbot.projects;
222
223 systemd.slices.buildbot = {
224 description = "buildbot slice";
225 };
226
227 networking.firewall.allowedTCPPorts = lib.attrsets.mapAttrsToList (k: v: v.workerPort) config.myEnv.buildbot.projects;
228 systemd.services = lib.attrsets.mapAttrs' (k: project: lib.attrsets.nameValuePair "buildbot-${project.name}" {
229 description = "Buildbot Continuous Integration Server ${project.name}.";
230 after = [ "network-online.target" ];
231 wantedBy = [ "multi-user.target" ];
232 path = project.packages;
233 preStart = let
234 master-cfg = "${buildbot.buildbot_common}/${bb-python.pythonForBuild.sitePackages}/buildbot_common/master.cfg";
235 tac_file = pkgs.writeText "buildbot.tac" ''
236 import os
237
238 from twisted.application import service
239 from buildbot.master import BuildMaster
240
241 basedir = '${varDir}/${project.name}'
242 rotateLength = 10000000
243 maxRotatedFiles = 10
244 configfile = '${master-cfg}'
245
246 # Default umask for server
247 umask = None
248
249 # if this is a relocatable tac file, get the directory containing the TAC
250 if basedir == '.':
251 import os
252 basedir = os.path.abspath(os.path.dirname(__file__))
253
254 # note: this line is matched against to check that this is a buildmaster
255 # directory; do not edit it.
256 application = service.Application('buildmaster')
257 from twisted.python.logfile import LogFile
258 from twisted.python.log import ILogObserver, FileLogObserver
259 logfile = LogFile.fromFullPath(os.path.join(basedir, "twistd.log"), rotateLength=rotateLength,
260 maxRotatedFiles=maxRotatedFiles)
261 application.setComponent(ILogObserver, FileLogObserver(logfile).emit)
262
263 m = BuildMaster(basedir, configfile, umask)
264 m.setServiceParent(application)
265 m.log_rotation.rotateLength = rotateLength
266 m.log_rotation.maxRotatedFiles = maxRotatedFiles
267 '';
268 in ''
269 if [ ! -f ${varDir}/${project.name}/buildbot.tac ]; then
270 ${buildbot}/bin/buildbot create-master -c "${master-cfg}" "${varDir}/${project.name}"
271 rm -f ${varDir}/${project.name}/master.cfg.sample
272 rm -f ${varDir}/${project.name}/buildbot.tac
273 fi
274 ln -sf ${tac_file} ${varDir}/${project.name}/buildbot.tac
275 # different buildbots may be trying that simultaneously, add the || true to avoid complaining in case of race
276 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_key"} ${varDir}/buildbot_key || true
277 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ssh_known_hosts"} ${varDir}/buildbot_hosts || true
278 buildbot_secrets=${varDir}/${project.name}/secrets
279 install -m 0700 -o buildbot -g buildbot -d $buildbot_secrets
280 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/ldap"} $buildbot_secrets/ldap
281 install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/worker_password"} $buildbot_secrets/worker_password
282 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList
283 (k: v: "install -Dm600 -o buildbot -g buildbot -T ${config.secrets.fullPaths."buildbot/${project.name}/${k}"} $buildbot_secrets/${k}") project.secrets
284 )}
285 ${buildbot}/bin/buildbot upgrade-master ${varDir}/${project.name}
286 '';
287 environment = let
288 HOME = "${varDir}/${project.name}";
289 PYTHONPATH = "${bb-python.withPackages (self:
290 buildbot.common_packages self ++
291 [ (buildbot.buildbot_config project) ]
292 )}/${bb-python.sitePackages}${if project.pythonPathHome then ":${varDir}/${project.name}/.local/${bb-python.sitePackages}" else ""}";
293 in { inherit PYTHONPATH HOME; };
294
295 serviceConfig = {
296 Slice = "buildbot.slice";
297 Type = "forking";
298 User = "buildbot";
299 Group = "buildbot";
300 RuntimeDirectory = "buildbot";
301 RuntimeDirectoryPreserve = "yes";
302 StateDirectory = "buildbot";
303 SupplementaryGroups = "keys";
304 WorkingDirectory = "${varDir}/${project.name}";
305 ExecStart = "${buildbot}/bin/buildbot start";
306 EnvironmentFile = config.secrets.fullPaths."buildbot/${project.name}/environment_file";
307 };
308 }) config.myEnv.buildbot.projects;
309 };
310}
diff --git a/systems/eldiron/coturn.nix b/systems/eldiron/coturn.nix
new file mode 100644
index 0000000..d8b02c5
--- /dev/null
+++ b/systems/eldiron/coturn.nix
@@ -0,0 +1,73 @@
1{ config, name, lib, pkgs, ... }:
2{
3 config = lib.mkIf (name == "eldiron") {
4 myServices.chatonsProperties.services.coturn = {
5 file.datetime = "2022-08-27T19:00:00";
6 service = {
7 name = "Coturn";
8 description = "coturn TURN server";
9 status.level = "OK";
10 status.description = "OK";
11 registration."" = ["MEMBER" "CLIENT"];
12 registration.load = "FULL";
13 install.type = "PACKAGE";
14 };
15 software = {
16 name = "coturn";
17 website = "https://github.com/coturn/coturn";
18 license.url = "https://github.com/coturn/coturn/blob/master/LICENSE";
19 license.name = "3-Clause BSD License";
20 version = pkgs.coturn.version;
21 source.url = "https://github.com/coturn/coturn";
22 };
23 };
24 networking.firewall.allowedTCPPorts = [
25 config.services.coturn.alt-listening-port
26 config.services.coturn.alt-tls-listening-port
27 config.services.coturn.listening-port
28 config.services.coturn.tls-listening-port
29 ];
30 networking.firewall.allowedTCPPortRanges = [
31 { from = config.services.coturn.min-port; to = config.services.coturn.max-port; }
32 ];
33 networking.firewall.allowedUDPPortRanges = [
34 { from = config.services.coturn.min-port; to = config.services.coturn.max-port; }
35 ];
36 networking.firewall.allowedUDPPorts = [
37 config.services.coturn.alt-listening-port
38 config.services.coturn.alt-tls-listening-port
39 config.services.coturn.listening-port
40 config.services.coturn.tls-listening-port
41 ];
42 #users.users.turnserver.extraGroups = [ "keys" ];
43 services.coturn = {
44 enable = true;
45 no-cli = true;
46 no-tls = true;
47 no-dtls = true;
48 use-auth-secret = true;
49 lt-cred-mech = true;
50 realm = "eldiron.immae.eu";
51 extraConfig = ''
52 fingerprint
53 total-quota=0
54 bps-capacity=0
55 stale-nonce
56 no-multicast-peers
57 '';
58 static-auth-secret = config.myEnv.coturn.auth_access_key;
59 #cert = "/var/lib/acme/eldiron/fullchain.pem";
60 #pkey = "/var/lib/acme/eldiron/key.pem";
61 listening-ips = [
62 "127.0.0.1"
63 "::1"
64 ] ++ config.myEnv.servers.eldiron.ips.main.ip4
65 ++ config.myEnv.servers.eldiron.ips.main.ip6;
66 relay-ips = [
67 "127.0.0.1"
68 "::1"
69 ] ++ config.myEnv.servers.eldiron.ips.main.ip4
70 ++ config.myEnv.servers.eldiron.ips.main.ip6;
71 };
72 };
73}
diff --git a/systems/eldiron/databases/default.nix b/systems/eldiron/databases/default.nix
new file mode 100644
index 0000000..d8d3048
--- /dev/null
+++ b/systems/eldiron/databases/default.nix
@@ -0,0 +1,56 @@
1{ lib, config, secrets, ... }:
2let
3 cfg = config.myServices.databases;
4in
5{
6 options.myServices = {
7 databases.enable = lib.mkEnableOption "my databases service";
8 };
9
10 config.myServices.dns.zones."immae.eu".subdomains.db-1 = lib.mkIf cfg.enable (with config.myServices.dns.helpers; ips servers.eldiron.ips.main);
11 config.myServices.databases = lib.mkIf cfg.enable {
12
13 mariadb = {
14 enable = true;
15 ldapConfig = {
16 inherit (config.myEnv.ldap) host base;
17 inherit (config.myEnv.databases.mysql.pam) dn filter password;
18 };
19 replicationLdapConfig = {
20 inherit (config.myEnv.ldap) host base;
21 inherit (config.myEnv.servers.eldiron.ldap) dn password;
22 };
23 credentials.root = config.myEnv.databases.mysql.systemUsers.root;
24 };
25
26 openldap = {
27 accessFile = secrets.ldap-conf;
28 baseDn = config.myEnv.ldap.base;
29 rootDn = config.myEnv.ldap.root_dn;
30 rootPw = config.myEnv.ldap.root_pw;
31 enable = true;
32 };
33
34 postgresql = {
35 ldapConfig = {
36 inherit (config.myEnv.ldap) host base;
37 inherit (config.myEnv.databases.postgresql.pam) dn filter password;
38 };
39 replicationLdapConfig = {
40 inherit (config.myEnv.ldap) host base;
41 inherit (config.myEnv.servers.eldiron.ldap) dn password;
42 };
43 authorizedHosts = {
44 };
45 replicationHosts = {
46 backup-2 = {
47 ip4 = config.myEnv.servers.backup-2.ips.main.ip4;
48 ip6 = config.myEnv.servers.backup-2.ips.main.ip6;
49 };
50 };
51 enable = true;
52 };
53
54 redis.enable = true;
55 };
56}
diff --git a/systems/eldiron/databases/mariadb.nix b/systems/eldiron/databases/mariadb.nix
new file mode 100644
index 0000000..b4a6917
--- /dev/null
+++ b/systems/eldiron/databases/mariadb.nix
@@ -0,0 +1,188 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.databases.mariadb;
4in {
5 options.myServices.databases = {
6 mariadb = {
7 enable = lib.mkOption {
8 default = false;
9 example = true;
10 description = "Whether to enable mariadb database";
11 type = lib.types.bool;
12 };
13 package = lib.mkOption {
14 type = lib.types.package;
15 default = pkgs.mariadb;
16 description = ''
17 Mariadb package to use.
18 '';
19 };
20 credentials = lib.mkOption {
21 default = {};
22 description = "Credentials";
23 type = lib.types.attrsOf lib.types.str;
24 };
25 ldapConfig = lib.mkOption {
26 description = "LDAP configuration to allow PAM identification via LDAP";
27 type = lib.types.submodule {
28 options = {
29 host = lib.mkOption { type = lib.types.str; };
30 base = lib.mkOption { type = lib.types.str; };
31 dn = lib.mkOption { type = lib.types.str; };
32 password = lib.mkOption { type = lib.types.str; };
33 filter = lib.mkOption { type = lib.types.str; };
34 };
35 };
36 };
37 replicationLdapConfig = lib.mkOption {
38 description = "LDAP configuration to allow replication";
39 type = lib.types.submodule {
40 options = {
41 host = lib.mkOption { type = lib.types.str; };
42 base = lib.mkOption { type = lib.types.str; };
43 dn = lib.mkOption { type = lib.types.str; };
44 password = lib.mkOption { type = lib.types.str; };
45 };
46 };
47 };
48 dataDir = lib.mkOption {
49 type = lib.types.path;
50 default = "/var/lib/mysql";
51 description = ''
52 The directory where Mariadb stores its data.
53 '';
54 };
55 # Output variables
56 socketsDir = lib.mkOption {
57 type = lib.types.path;
58 default = "/run/mysqld";
59 description = ''
60 The directory where Mariadb puts sockets.
61 '';
62 };
63 sockets = lib.mkOption {
64 type = lib.types.attrsOf lib.types.path;
65 default = {
66 mysqld = "${cfg.socketsDir}/mysqld.sock";
67 };
68 readOnly = true;
69 description = ''
70 Mariadb sockets
71 '';
72 };
73 };
74 };
75
76 config = lib.mkIf cfg.enable {
77 networking.firewall.allowedTCPPorts = [ config.myEnv.databases.mysql.port ];
78
79 # for adminer, ssl is implemented with mysqli only, which is
80 # currently disabled because it’s not compatible with pam.
81 # Thus we need to generate two users for each 'remote': one remote
82 # with SSL, and one localhost without SSL.
83 # User identified by LDAP:
84 # CREATE USER foo@% IDENTIFIED VIA pam USING 'mysql' REQUIRE SSL;
85 # CREATE USER foo@localhost IDENTIFIED VIA pam USING 'mysql';
86
87 # To create a user (host) for replication:
88 # CREATE USER 'host'@'%' IDENTIFIED VIA pam USING 'mysql_replication' REQUIRE SSL;
89 # GRANT REPLICATION SLAVE, REPLICATION CLIENT, RELOAD, LOCK TABLES, SELECT, SHOW VIEW ON *.* TO 'host'@'%';
90 # (the lock/select grant permits to let the replication host handle
91 # the initial fetch of the database)
92 # % should be valid for both localhost (for cron dumps) and the origin host.
93 services.mysql = {
94 enable = true;
95 package = cfg.package;
96 dataDir = cfg.dataDir;
97 settings = {
98 mysqld = {
99 port = config.myEnv.databases.mysql.port;
100 ssl_ca = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
101 ssl_key = "${config.security.acme.certs.mysql.directory}/key.pem";
102 ssl_cert = "${config.security.acme.certs.mysql.directory}/fullchain.pem";
103
104 # for replication
105 log-bin = "mariadb-bin";
106 server-id = "1";
107
108 # this introduces a small delay before storing on disk, but
109 # makes it order of magnitudes quicker
110 innodb_flush_log_at_trx_commit = "0";
111
112 # This is necessary since the default ("dialog") is not
113 # supported by php's mysqlnd plugin (in mysqli). But with that
114 # change only regular login+password schemes can work (no
115 # "fancy" authentication methods like fprintd or keys)
116 pam_use_cleartext_plugin = true;
117 };
118 };
119 };
120
121 users.users.mysql.extraGroups = [ "keys" ];
122 security.acme.certs."mysql" = {
123 group = "mysql";
124 domain = "db-1.immae.eu";
125 postRun = ''
126 systemctl restart mysql.service
127 '';
128 };
129
130 secrets.keys = {
131 "mysql/mysqldump" = {
132 permissions = "0400";
133 user = "root";
134 group = "root";
135 text = ''
136 [mysqldump]
137 user = root
138 password = ${cfg.credentials.root}
139 '';
140 };
141 "mysql/pam" = {
142 permissions = "0400";
143 user = "mysql";
144 group = "mysql";
145 text = with cfg.ldapConfig; ''
146 host ${host}
147 base ${base}
148 binddn ${dn}
149 bindpw ${password}
150 pam_filter ${filter}
151 ssl start_tls
152 '';
153 };
154 "mysql/pam_replication" = {
155 permissions = "0400";
156 user = "mysql";
157 group = "mysql";
158 text = with cfg.replicationLdapConfig; ''
159 host ${host}
160 base ${base}
161 binddn ${dn}
162 bindpw ${password}
163 pam_login_attribute cn
164 ssl start_tls
165 '';
166 };
167 };
168
169 security.pam.services = let
170 pam_ldap = "${pkgs.pam_ldap}/lib/security/pam_ldap.so";
171 in {
172 mysql = {
173 text = ''
174 # https://mariadb.com/kb/en/mariadb/pam-authentication-plugin/
175 auth required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam"}
176 account required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam"}
177 '';
178 };
179 mysql_replication = {
180 text = ''
181 auth required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam_replication"}
182 account required ${pam_ldap} config=${config.secrets.fullPaths."mysql/pam_replication"}
183 '';
184 };
185 };
186
187 };
188}
diff --git a/systems/eldiron/databases/openldap/default.nix b/systems/eldiron/databases/openldap/default.nix
new file mode 100644
index 0000000..7cd15da
--- /dev/null
+++ b/systems/eldiron/databases/openldap/default.nix
@@ -0,0 +1,304 @@
1{ lib, pkgs, config, openldap, ... }:
2let
3 cfg = config.myServices.databases.openldap;
4in
5{
6 options.myServices.databases = {
7 openldap = {
8 enable = lib.mkOption {
9 default = false;
10 example = true;
11 description = "Whether to enable ldap";
12 type = lib.types.bool;
13 };
14 baseDn = lib.mkOption {
15 type = lib.types.str;
16 description = ''
17 Base DN for LDAP
18 '';
19 };
20 rootDn = lib.mkOption {
21 type = lib.types.str;
22 description = ''
23 Root DN
24 '';
25 };
26 rootPw = lib.mkOption {
27 type = lib.types.str;
28 description = ''
29 Root (Hashed) password
30 '';
31 };
32 accessFile = lib.mkOption {
33 type = lib.types.path;
34 description = ''
35 The file path that defines the access
36 '';
37 };
38 dataDir = lib.mkOption {
39 type = lib.types.path;
40 default = "/var/lib/openldap/mdb";
41 description = ''
42 The directory where Openldap stores its data.
43 '';
44 };
45 socketsDir = lib.mkOption {
46 type = lib.types.path;
47 default = "/run/openldap";
48 description = ''
49 The directory where Openldap puts sockets and pid files.
50 '';
51 };
52 # Output variables
53 pids = lib.mkOption {
54 type = lib.types.attrsOf lib.types.path;
55 default = {
56 pid = "${cfg.socketsDir}/slapd.pid";
57 args = "${cfg.socketsDir}/slapd.args";
58 };
59 readOnly = true;
60 description = ''
61 Slapd pid files
62 '';
63 };
64 };
65 };
66
67 config = lib.mkIf cfg.enable {
68 myServices.dns.zones."immae.eu".subdomains.ldap =
69 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
70
71 nixpkgs.overlays = [
72 (self: super: {
73 openldap_libressl_cyrus = (self.openldap.override {
74 openssl = self.libressl;
75 cyrus_sasl = self.cyrus_sasl.overrideAttrs (old: {
76 configureFlags = old.configureFlags ++ [ "--with-configdir=/etc/sasl2" ];
77 });
78 }).overrideAttrs (old: {
79 configureFlags = old.configureFlags ++ [ "--with-cyrus-sasl" "--enable-spasswd" ];
80 });
81 })
82 ];
83
84 secrets.keys = {
85 "ldap/password" = {
86 permissions = "0400";
87 user = "openldap";
88 group = "openldap";
89 text = "${cfg.rootPw}";
90 };
91 "ldap/access" = {
92 permissions = "0400";
93 user = "openldap";
94 group = "openldap";
95 text = builtins.readFile cfg.accessFile;
96 };
97 "ldap" = {
98 permissions = "0500";
99 user = "openldap";
100 group = "openldap";
101 isDir = true;
102 };
103 };
104 users.users.openldap.extraGroups = [ "keys" ];
105 networking.firewall.allowedTCPPorts = [ 636 389 ];
106
107 security.acme.certs."ldap" = {
108 group = "openldap";
109 domain = "ldap.immae.eu";
110 postRun = ''
111 systemctl restart openldap.service
112 '';
113 };
114
115 services.filesWatcher.openldap = {
116 restart = true;
117 paths = [ config.secrets.fullPaths."ldap" ];
118 };
119
120 services.openldap = {
121 enable = true;
122 urlList = [ "ldap://" "ldaps://" ];
123 package = pkgs.openldap_libressl_cyrus;
124 settings = {
125 attrs = {
126 olcPidFile = cfg.pids.pid;
127 olcArgsFile = cfg.pids.args;
128 olcLogLevel = "none";
129 olcTLSCertificateFile = "${config.security.acme.certs.ldap.directory}/cert.pem";
130 olcTLSCertificateKeyFile = "${config.security.acme.certs.ldap.directory}/key.pem";
131 olcTLSCACertificateFile = "${config.security.acme.certs.ldap.directory}/fullchain.pem";
132 olcTLSCACertificatePath = "${pkgs.cacert.unbundled}/etc/ssl/certs/";
133 # This makes openldap crash
134 # olcTLSCipherSuite = "DEFAULT";
135 #olcSaslHost = "kerberos.immae.eu";
136 # Map sasl "dn" to ldap dn
137 #olcAuthzRegexp = ''{0}"uid=([^,]*)(,cn=IMMAE.EU)?,cn=(gssapi|gss-spnego),cn=auth" "uid=$1,ou=users,dc=immae,dc=eu"'';
138 };
139 children = {
140 "cn=module{0}" = {
141 attrs = {
142 cn = "module{0}";
143 objectClass = [ "olcModuleList" ];
144 olcModuleLoad = [ "{0}back_mdb" "{1}memberof" "{2}syncprov" ];
145 };
146 };
147 "cn=schema".includes = map (schema:
148 "${config.services.openldap.package}/etc/schema/${schema}.ldif"
149 ) [ "core" "cosine" "inetorgperson" "nis" ] ++ [
150 "${openldap.immae-ldif}"
151 ];
152 "olcDatabase={0}config" = {
153 attrs = {
154 objectClass = "olcDatabaseConfig";
155 olcDatabase = "{0}config";
156 olcAccess = ["{0}to * by * none"];
157 };
158 };
159 "olcDatabase={1}mdb" = {
160 attrs = {
161 objectClass = [ "olcDatabaseConfig" "olcMdbConfig" ];
162 olcDatabase = "{1}mdb";
163 olcDbIndex = [
164 "objectClass eq"
165 "uid pres,eq"
166 "mail pres,eq,sub"
167 "cn pres,eq,sub"
168 "sn pres,eq,sub"
169 "dc eq"
170 "member eq"
171 "memberOf eq"
172 ];
173 olcAccess = let
174 join = builtins.replaceStrings ["\n"] [" "];
175 in [
176 # First matching "to" + "by" wins
177 #### Replication needs full access
178 (join ''{0}to *
179 by dn.base="uid=ldap_replication,cn=ldap,ou=services,dc=immae,dc=eu" read
180 by * break
181 '')
182 #### Prevent modification of SASL passwords
183 (join ''{1}to attrs=userPassword val.regex="^.SASL..+"
184 by self read
185 by anonymous auth
186 by * none
187 '')
188 #### Oneself needs access to users password
189 (join ''{2}to attrs=userPassword,shadowLastChange
190 by self write
191 by anonymous auth
192 by * none
193 '')
194 #### Should be write, but disabled during migration to psql
195 (join ''{3}to attrs=immaeSshKey
196 by self read
197 by * break
198 '')
199
200 #### Anyone can auth, and I can see myself
201 (join ''{4}to *
202 by self read
203 by anonymous auth
204 by * break
205 '')
206
207 #### Specific access for phpldapadmin
208 (join ''{5}to filter="(uid=*)" attrs=entry,uid
209 by dn.base="cn=phpldapadmin,ou=services,dc=immae,dc=eu" read
210 by * break
211 '')
212
213 #### Hosts
214 # The attributes are available to every host
215 (join ''{6}to dn.one="ou=hosts,dc=immae,dc=eu"
216 by dn.subtree="ou=hosts,dc=immae,dc=eu" read
217 by dn.base="dc=immae,dc=eu" search
218 by * break
219 '')
220 #### /Hosts
221
222 #### Local services
223 # this/-* & user : all your ancestors have access to you
224 # this/memberOf/-* & user : all those whom you belong to (in a group),
225 # and their ancestors, have access to you
226 # user/immaeAccessWriteDn*/member & this : you have write access to the
227 # members of your immaeAccessDn
228 # attributes
229 # user/immaeAccessDn*/member & this : you have access to the members
230 # of your immaeAccessDn attributes
231 # user/immaeAccessReadSubtree* & this/-* : you have access to the
232 # childrens of your immaeAccessReadSubtree
233 # attributes
234 # this/memberOf/-* & user/immaeAccessReadSubtree*: you have access to
235 # the members of the childrens of your
236 # immaeAccessReadSubtree attributes
237 # http://www.openldap.org/faq/data/cache/1133.html
238 (join ''{7}to dn.subtree="dc=immae,dc=eu"
239 by dn.subtree="ou=external_services,dc=immae,dc=eu" break
240 by set.exact="this/-* & user" read
241 by set.exact="this/memberOf/-* & user" read
242 by set.exact="user/immaeAccessWriteDn*/member & this" write
243 by set.exact="user/immaeAccessDn*/member & this" read
244 by set.exact="user/immaeAccessReadSubtree* & this/-*" read
245 by set.exact="this/memberOf/-* & user/immaeAccessReadSubtree*" read
246 by users search
247 by * break
248 '')
249 #### /Local services
250
251 #### External services
252 # http://www.openldap.org/faq/data/cache/429.html
253 # FIXME: Find a way to whitelist?
254 (join ''{8}to attrs=immaeSshKey
255 by dn.subtree="ou=external_services,dc=immae,dc=eu" none
256 '')
257 (join ''{9}to dn.subtree="dc=immae,dc=eu"
258 by set.exact="this/-* & user" read
259 by set.exact="this/memberOf/-* & user" read
260 by set.exact="user/immaeAccessDn*/member & this/-*" read
261 by users search
262 by * none
263 '')
264 #### /External services
265 ];
266 olcDbDirectory = cfg.dataDir;
267 olcRootDN = cfg.rootDn;
268 olcRootPW.path = config.secrets.fullPaths."ldap/password";
269 olcSuffix = cfg.baseDn;
270 };
271 children = {
272 "olcOverlay={0}memberof" = {
273 attrs = {
274 objectClass = [ "olcOverlayConfig" "olcMemberOf" ];
275 olcOverlay = "{0}memberof";
276 };
277 };
278 "olcOverlay={1}syncprov" = {
279 attrs = {
280 objectClass = [ "olcOverlayConfig" "olcSyncProvConfig" ];
281 olcOverlay = "{1}syncprov";
282 olcSpCheckpoint = "100 10";
283 };
284 };
285 };
286 };
287 };
288 };
289 };
290 myServices.monitoring.fromMasterActivatedPlugins = [ "tcp" ];
291 myServices.monitoring.fromMasterObjects.service = [
292 {
293 service_description = "ldap SSL is up to date";
294 host_name = config.hostEnv.fqdn;
295 use = "external-service";
296 check_command = ["check_tcp_ssl" "636"];
297
298 servicegroups = "webstatus-ssl";
299 _webstatus_name = "LDAP";
300 _webstatus_url = "ldap.immae.eu";
301 }
302 ];
303 };
304}
diff --git a/systems/eldiron/databases/postgresql.nix b/systems/eldiron/databases/postgresql.nix
new file mode 100644
index 0000000..721059a
--- /dev/null
+++ b/systems/eldiron/databases/postgresql.nix
@@ -0,0 +1,236 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.databases.postgresql;
4in {
5 options.myServices.databases = {
6 postgresql = {
7 enable = lib.mkOption {
8 default = false;
9 example = true;
10 description = "Whether to enable postgresql database";
11 type = lib.types.bool;
12 };
13 package = lib.mkOption {
14 type = lib.types.package;
15 default = pkgs.postgresql;
16 description = ''
17 Postgresql package to use.
18 '';
19 };
20 ldapConfig = lib.mkOption {
21 description = "LDAP configuration to allow PAM identification via LDAP";
22 type = lib.types.submodule {
23 options = {
24 host = lib.mkOption { type = lib.types.str; };
25 base = lib.mkOption { type = lib.types.str; };
26 dn = lib.mkOption { type = lib.types.str; };
27 password = lib.mkOption { type = lib.types.str; };
28 filter = lib.mkOption { type = lib.types.str; };
29 };
30 };
31 };
32 replicationLdapConfig = lib.mkOption {
33 description = "LDAP configuration to allow replication";
34 type = lib.types.submodule {
35 options = {
36 host = lib.mkOption { type = lib.types.str; };
37 base = lib.mkOption { type = lib.types.str; };
38 dn = lib.mkOption { type = lib.types.str; };
39 password = lib.mkOption { type = lib.types.str; };
40 };
41 };
42 };
43 authorizedHosts = lib.mkOption {
44 default = {};
45 description = "Hosts to allow connections from";
46 type = lib.types.attrsOf (lib.types.listOf (lib.types.submodule {
47 options = {
48 method = lib.mkOption {
49 default = "md5";
50 type = lib.types.str;
51 };
52 username = lib.mkOption {
53 default = "all";
54 type = lib.types.str;
55 };
56 database = lib.mkOption {
57 default = "all";
58 type = lib.types.str;
59 };
60 ip4 = lib.mkOption {
61 default = [];
62 type = lib.types.listOf lib.types.str;
63 };
64 ip6 = lib.mkOption {
65 default = [];
66 type = lib.types.listOf lib.types.str;
67 };
68 };
69 }));
70 };
71 replicationHosts = lib.mkOption {
72 default = {};
73 description = "Hosts to allow replication from";
74 type = lib.types.attrsOf (lib.types.submodule {
75 options = {
76 ip4 = lib.mkOption {
77 type = lib.types.listOf lib.types.str;
78 };
79 ip6 = lib.mkOption {
80 type = lib.types.listOf lib.types.str;
81 };
82 };
83 });
84 };
85 # Output variables
86 socketsDir = lib.mkOption {
87 type = lib.types.path;
88 default = "/run/postgresql";
89 description = ''
90 The directory where Postgresql puts sockets.
91 '';
92 readOnly = true;
93 };
94 };
95 };
96
97 config = lib.mkIf cfg.enable {
98 networking.firewall.allowedTCPPorts = [ 5432 ];
99
100 security.acme.certs."postgresql" = {
101 group = "postgres";
102 domain = "db-1.immae.eu";
103 postRun = ''
104 systemctl reload postgresql.service
105 '';
106 };
107
108 systemd.services.postgresql.serviceConfig = {
109 SupplementaryGroups = "keys";
110 ExecStartPre = [ ("+" + (pkgs.writeShellScript "postgresql-fix-cert" ''
111 # postgresql complains:
112 # private key file "${config.security.acme.certs.postgresql.directory}/key.pem" must be owned by the database user or root
113 cp -f "${config.security.acme.certs.postgresql.directory}/key.pem" "${config.services.postgresql.dataDir}/key.pem"
114 chown postgres:postgres "${config.services.postgresql.dataDir}/key.pem"
115 chmod go-r "${config.services.postgresql.dataDir}/key.pem"
116 '')) ];
117 };
118 systemd.services.postgresql.postStart = lib.mkAfter ''
119 # This line is already defined in 19.09
120 PSQL="psql --port=5432"
121
122 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _: ''
123 $PSQL -tAc "SELECT 1 FROM pg_roles WHERE rolname='${role}'" \
124 | grep -q 1 \
125 || $PSQL -tAc 'CREATE USER "${role}" WITH REPLICATION'
126 '') cfg.replicationHosts)}
127
128 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (role: _:
129 let
130 sname = builtins.replaceStrings ["-"] ["_"] role;
131 in
132 ''
133 $PSQL -tAc "SELECT 1 FROM pg_replication_slots WHERE slot_name='${sname}'" \
134 | grep -q 1 \
135 || $PSQL -tAc "SELECT * FROM pg_create_physical_replication_slot('${sname}')"
136 '') cfg.replicationHosts)}
137 '';
138
139 services.postgresql = {
140 enable = true;
141 package = cfg.package;
142 enableTCPIP = true;
143 checkConfig = false;
144 logLinePrefix = "%h %q%u@%d "; # Default: '%m [%p] ', already stored independently by journald. %h needed for fail2ban
145 settings = {
146 max_connections = 300;
147 wal_level = "logical";
148 shared_buffers = "512MB";
149 work_mem = "10MB";
150 max_wal_size = "1GB";
151 min_wal_size = "80MB";
152 log_timezone = "Europe/Paris";
153 datestyle = "iso, mdy";
154 timezone = "Europe/Paris";
155 lc_messages = "en_US.UTF-8";
156 lc_monetary = "en_US.UTF-8";
157 lc_numeric = "en_US.UTF-8";
158 lc_time = "en_US.UTF-8";
159 default_text_search_config = "pg_catalog.english";
160 # this introduces a small delay before storing on disk, but
161 # makes it order of magnitudes quicker
162 synchronous_commit = "off";
163 ssl = "on";
164 ssl_cert_file = "${config.security.acme.certs.postgresql.directory}/fullchain.pem";
165 ssl_key_file = "${config.services.postgresql.dataDir}/key.pem";
166 };
167 authentication = let
168 hosts = builtins.concatStringsSep "\n" (
169 lib.lists.flatten (lib.mapAttrsToList (k: vs: map (v:
170 map (ip6: "hostssl ${v.database} ${v.username} ${ip6} ${v.method}") v.ip6
171 ++ map (ip4: "hostssl ${v.database} ${v.username} ${ip4}/32 ${v.method}") v.ip4
172 ) vs) cfg.authorizedHosts
173 ));
174 replication = builtins.concatStringsSep "\n" (
175 lib.lists.flatten (lib.mapAttrsToList (k: v:
176 map (ip6: "hostssl replication ${k} ${ip6}/128 pam pamservice=postgresql_replication") v.ip6
177 ++ map (ip4: "hostssl replication ${k} ${ip4}/32 pam pamservice=postgresql_replication") v.ip4
178 ) cfg.replicationHosts
179 ));
180 in ''
181 local all postgres ident
182 local all all md5
183 ${hosts}
184 hostssl all all all pam
185 ${replication}
186 '';
187 };
188
189 secrets.keys = {
190 "postgresql/pam" = {
191 permissions = "0400";
192 group = "postgres";
193 user = "postgres";
194 text = with cfg.ldapConfig; ''
195 host ${host}
196 base ${base}
197 binddn ${dn}
198 bindpw ${password}
199 pam_filter ${filter}
200 ssl start_tls
201 '';
202 };
203 "postgresql/pam_replication" = {
204 permissions = "0400";
205 group = "postgres";
206 user = "postgres";
207 text = with cfg.replicationLdapConfig; ''
208 host ${host}
209 base ${base}
210 binddn ${dn}
211 bindpw ${password}
212 pam_login_attribute cn
213 ssl start_tls
214 '';
215 };
216 };
217
218 security.pam.services = let
219 pam_ldap = "${pkgs.pam_ldap}/lib/security/pam_ldap.so";
220 in {
221 postgresql = {
222 text = ''
223 auth required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam"}
224 account required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam"}
225 '';
226 };
227 postgresql_replication = {
228 text = ''
229 auth required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam_replication"}
230 account required ${pam_ldap} config=${config.secrets.fullPaths."postgresql/pam_replication"}
231 '';
232 };
233 };
234 };
235}
236
diff --git a/systems/eldiron/databases/redis.nix b/systems/eldiron/databases/redis.nix
new file mode 100644
index 0000000..1f57aa9
--- /dev/null
+++ b/systems/eldiron/databases/redis.nix
@@ -0,0 +1,138 @@
1{ lib, config, pkgs, ... }:
2let
3 cfg = config.myServices.databases.redis;
4in {
5 options.myServices.databases.redis = {
6 enable = lib.mkOption {
7 default = false;
8 example = true;
9 description = "Whether to enable redis database";
10 type = lib.types.bool;
11 };
12 socketsDir = lib.mkOption {
13 type = lib.types.path;
14 default = "/run/redis";
15 description = ''
16 The directory where Redis puts sockets.
17 '';
18 };
19 # Output variables
20 sockets = lib.mkOption {
21 type = lib.types.attrsOf lib.types.path;
22 default = {
23 redis = "${cfg.socketsDir}/redis.sock";
24 };
25 readOnly = true;
26 description = ''
27 Redis sockets
28 '';
29 };
30 };
31
32 config = lib.mkIf cfg.enable {
33 users.users.redis.uid = config.ids.uids.redis;
34 users.groups.redis.gid = config.ids.gids.redis;
35 services.redis.servers."" = {
36 enable = true;
37 bind = "127.0.0.1";
38 unixSocket = cfg.sockets.redis;
39 unixSocketPerm = 777;
40 maxclients = 1024;
41 };
42 systemd.services.redis.serviceConfig.Slice = "redis.slice";
43 systemd.services.redis.serviceConfig.RuntimeDirectoryMode = lib.mkForce "0755";
44 services.redis.servers."php-sessions" = {
45 enable = true;
46 maxclients = 1024;
47 unixSocketPerm = 777;
48 user = "wwwrun";
49 };
50
51 services.spiped = {
52 enable = true;
53 config.redis = {
54 decrypt = true;
55 source = "0.0.0.0:16379";
56 target = "/run/redis/redis.sock";
57 keyfile = config.secrets.fullPaths."redis/spiped_keyfile";
58 };
59 };
60 systemd.services.spiped_redis = {
61 description = "Secure pipe 'redis'";
62 after = [ "network.target" ];
63 wantedBy = [ "multi-user.target" ];
64
65 serviceConfig = {
66 Slice = "redis.slice";
67 Restart = "always";
68 User = "spiped";
69 PermissionsStartOnly = true;
70 SupplementaryGroups = "keys";
71 };
72
73 script = "exec ${pkgs.spiped}/bin/spiped -F `cat /etc/spiped/redis.spec`";
74 };
75
76 #services.filesWatcher.predixy = {
77 # restart = true;
78 # paths = [ config.secrets.fullPaths."redis/predixy.conf" ];
79 #};
80
81 networking.firewall.allowedTCPPorts = [ 16379 ];
82 secrets.keys = {
83 #"redis/predixy.conf" = {
84 # user = "redis";
85 # group = "redis";
86 # permissions = "0400";
87 # text = ''
88 # Name Predixy
89 # Bind 127.0.0.1:7617
90 # ClientTimeout 300
91 # WorkerThreads 1
92
93 # Authority {
94 # Auth "${config.myEnv.databases.redis.predixy.read}" {
95 # Mode read
96 # }
97 # }
98
99 # StandaloneServerPool {
100 # Databases 16
101 # RefreshMethod fixed
102 # Group shard001 {
103 # + ${config.myEnv.databases.redis.socket}
104 # }
105 # }
106 # '';
107 #};
108 "redis/spiped_keyfile" = {
109 user = "spiped";
110 group = "spiped";
111 permissions = "0400";
112 text = config.myEnv.databases.redis.spiped_key;
113 };
114 };
115
116 systemd.slices.redis = {
117 description = "Redis slice";
118 };
119
120 #systemd.services.predixy = {
121 # description = "Redis proxy";
122 # wantedBy = [ "multi-user.target" ];
123 # after = [ "redis.service" ];
124
125 # serviceConfig = {
126 # Slice = "redis.slice";
127 # User = "redis";
128 # Group = "redis";
129 # SupplementaryGroups = "keys";
130 # Type = "simple";
131
132 # ExecStart = "${pkgs.predixy}/bin/predixy ${config.secrets.fullPaths."redis/predixy.conf"}";
133 # };
134
135 #};
136 };
137}
138
diff --git a/systems/eldiron/dns.nix b/systems/eldiron/dns.nix
new file mode 100644
index 0000000..486fcc1
--- /dev/null
+++ b/systems/eldiron/dns.nix
@@ -0,0 +1,290 @@
1{ lib, pkgs, config, dns-nix, ... }:
2{
3 options.myServices.dns = {
4 enable = lib.mkEnableOption "enable DNS resolver";
5 helpers = lib.mkOption {
6 readOnly = true;
7 description = ''
8 Some useful constants or functions for zones definition
9 '';
10 default = rec {
11 servers = config.myEnv.servers;
12 ips = i: { A = i.ip4; AAAA = i.ip6; };
13 letsencrypt = [ { tag = "issue"; value = "letsencrypt.org"; issuerCritical = false; } ];
14 toKV = a: builtins.concatStringsSep ";" (builtins.attrValues (builtins.mapAttrs (n: v: "${n}=${v}") a));
15 mailMX = {
16 hasEmail = true;
17 subdomains = let
18 mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers;
19 in
20 lib.mapAttrs' (n: v: lib.nameValuePair v.mx.subdomain (ips v.ips.main)) mxes;
21 };
22 zoneHeader = {
23 TTL = 3*60*60;
24 SOA = {
25 # yyyymmdd?? (increment ?? at each change)
26 serial = 2022121902; # Don't change this value, it is replaced automatically!
27 refresh = 10800;
28 retry = 3600;
29 expire = 604800;
30 minimum = 10800; # negative cache ttl
31 adminEmail = "hostmaster@immae.eu"; #email-address s/@/./
32 nameServer = "ns1.immae.eu.";
33 };
34 };
35 mailSend = {
36 # DKIM
37 subdomains._domainkey.subdomains.eldiron.TXT = [
38 (toKV config.myEnv.mail.dkim.eldiron.public)
39 ];
40 # old key, may still be used by verifiers
41 subdomains._domainkey.subdomains.immae_eu.TXT = [
42 (toKV config.myEnv.mail.dkim.immae_eu.public)
43 ];
44 };
45 mailCommon = name: {
46 MX = let
47 mxes = lib.filterAttrs (n: v: v ? mx && v.mx.enable) servers;
48 in
49 lib.mapAttrsToList (n: v: { preference = v.mx.priority; exchange = "${v.mx.subdomain}.${name}."; }) mxes;
50
51 # https://tools.ietf.org/html/rfc6186
52 SRV = [
53 { service = "submission"; proto = "tcp"; priority = 0; weight = 1; port = 587; target = "smtp.immae.eu."; }
54 { service = "submissions"; proto = "tcp"; priority = 0; weight = 1; port = 465; target = "smtp.immae.eu."; }
55
56 { service = "imap"; proto = "tcp"; priority = 0; weight = 1; port = 143; target = "imap.immae.eu."; }
57 { service = "imaps"; proto = "tcp"; priority = 0; weight = 1; port = 993; target = "imap.immae.eu."; }
58 { service = "sieve"; proto = "tcp"; priority = 0; weight = 1; port = 4190; target = "imap.immae.eu."; }
59
60 { service = "pop3"; proto = "tcp"; priority = 10; weight = 1; port = 110; target = "pop3.immae.eu."; }
61 { service = "pop3s"; proto = "tcp"; priority = 10; weight = 1; port = 995; target = "pop3.immae.eu."; }
62 ];
63
64 subdomains = {
65 # MTA-STS
66 # https://blog.delouw.ch/2018/12/16/using-mta-sts-to-enhance-email-transport-security-and-privacy/
67 # https://support.google.com/a/answer/9261504
68 _mta-sts.TXT = [ (toKV { v = "STSv1"; id = "20200109150200Z"; }) ]; # Don't change this value, it is updated automatically!
69 _tls.subdomains._smtp.TXT = [ (toKV { v = "TLSRPTv1"; "rua" = "mailto:postmaster+mta-sts@immae.eu"; }) ];
70 mta-sts = ips servers.eldiron.ips.main;
71
72 # DMARC
73 _dmarc.TXT = [ (toKV { v = "DMARC1"; p = "none"; adkim = "r"; aspf = "r"; fo = "1"; rua = "mailto:postmaster+rua@immae.eu"; ruf = "mailto:postmaster+ruf@immae.eu"; }) ];
74 };
75
76 # SPF
77 TXT = [ (toKV { v = "spf1 mx ~all"; }) ];
78 };
79 };
80 };
81 zones = lib.mkOption {
82 type = lib.types.attrsOf (dns-nix.lib.types.zone.substSubModules (
83 dns-nix.lib.types.zone.getSubModules ++ [
84 ({ name, ... }: {
85 options = {
86 hasEmail = lib.mkEnableOption "This domain has e-mails configuration";
87 emailPolicies = lib.mkOption {
88 default = {};
89 type = lib.types.attrsOf (lib.types.submodule {
90 options = {
91 receive = lib.mkEnableOption "Configure this domain to receive e-mail";
92 };
93 });
94 apply = builtins.mapAttrs (n: v: v // {
95 domain = name;
96 fqdn = if n == "" then name else "${n}.${name}";
97 });
98 };
99 extraConfig = lib.mkOption {
100 type = lib.types.lines;
101 description = "Extra zone configuration for bind";
102 example = ''
103 notify yes;
104 '';
105 default = "";
106 };
107 slaves = lib.mkOption {
108 type = lib.types.listOf lib.types.str;
109 description = "NS slave groups of this zone";
110 default = [];
111 };
112 ns = lib.mkOption {
113 type = lib.types.listOf lib.types.str;
114 default = [];
115 };
116 };
117 })
118 ]));
119 apply = let
120 toNS = n: builtins.map (d: "${d}.") (builtins.concatMap (s: builtins.attrNames config.myEnv.dns.ns."${s}") n);
121 in
122 builtins.mapAttrs (n: v: v // { NS = v.NS or [] ++ toNS (v.ns); });
123 default = {};
124 description = ''
125 attrset of zones to configure
126 '';
127 };
128 };
129 config = let
130 cfg = config.services.bind;
131 in lib.mkIf config.myServices.dns.enable {
132 myServices.chatonsProperties.hostings.dns-secondaire = {
133 file.datetime = "2022-08-22T02:00:00";
134 hosting = {
135 name = "DNS secondaire";
136 description = "DNS secondaire";
137 website = "ns1.immae.eu";
138 status.level = "OK";
139 status.description = "OK";
140 registration.load = "OPEN";
141 install.type = "PACKAGE";
142 };
143 software = {
144 name = "bind9";
145 website = pkgs.bind.meta.homepage;
146 license.url = pkgs.bind.meta.license.url;
147 license.name = pkgs.bind.meta.license.fullName;
148 version = pkgs.bind.version;
149 source.url = "https://www.isc.org/download/";
150 };
151 };
152 myServices.dns.zones = with config.myServices.dns.helpers; {
153 "imsite.eu" = lib.mkMerge [
154 zoneHeader
155 (ips servers.eldiron.ips.main)
156 {
157 ns = [ "immae" ];
158 CAA = letsencrypt;
159 }
160 ];
161 "immae.dev" = lib.mkMerge [
162 {
163 extraConfig = ''
164 notify yes;
165 '';
166 slaves = [ "raito" ];
167 }
168 zoneHeader
169 (ips servers.eldiron.ips.integration)
170 {
171 ns = [ "immae" "raito" ];
172 CAA = letsencrypt;
173 }
174 ];
175 "immae.eu" = lib.mkMerge [
176 {
177 extraConfig = ''
178 notify yes;
179 '';
180 slaves = [ "raito" ];
181 }
182 zoneHeader
183 (ips servers.eldiron.ips.production)
184 {
185 ns = [ "immae" "raito" ];
186 CAA = letsencrypt;
187
188 # ns1 has glue records in gandi.net
189 subdomains.ns1 = ips servers.eldiron.ips.main;
190 # raito / kurisu.dual.lahfa.xyz ; replace with eldiron in case of problem
191 subdomains.ns2.A = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip4;
192 subdomains.ns2.AAAA = builtins.map (address: { inherit address; ttl = 600; }) servers.eldiron.ips.main.ip6;
193 }
194 {
195 # Machines local users
196 emailPolicies.localhost.receive = false;
197 subdomains.localhost = lib.mkMerge [ (mailCommon "immae.eu") mailSend ];
198 emailPolicies.eldiron.receive = true;
199 subdomains.eldiron = lib.mkMerge [ (mailCommon "immae.eu") mailSend ];
200 }
201 {
202 # For each server "server" and each server ip group "ipgroup",
203 # define ipgroup.server.immae.eu
204 # "main" is set as server.immae.eu instead
205 # if main has an "alias", it is duplicated with this alias.
206 # If the server is a vm, use the v.immae.eu namespace (only main is created)
207 subdomains = let
208 vms = lib.filterAttrs (n: v: v.isVm) servers;
209 bms = lib.filterAttrs (n: v: !v.isVm) servers;
210 toIps = type: builtins.mapAttrs (n: v: ips v.ips."${type}");
211 in
212 lib.mkMerge [
213 (toIps "main" bms)
214
215 { v.subdomains = toIps "main" vms; }
216
217 (lib.mapAttrs (_: v: {
218 subdomains = lib.mapAttrs'
219 (n': v': lib.nameValuePair "${if v'.alias == null then n' else v'.alias}" (ips v'))
220 (lib.filterAttrs (n': v': n' != "main" || v'.alias != null) v.ips);
221 }) bms)
222 ];
223 }
224 {
225 # Outils
226 subdomains = {
227 status = ips servers.monitoring-1.ips.main;
228 };
229 }
230 ];
231 };
232 networking.firewall.allowedUDPPorts = [ 53 ];
233 networking.firewall.allowedTCPPorts = [ 53 ];
234 users.users.named.extraGroups = [ "keys" ];
235 services.bind = {
236 enable = true;
237 cacheNetworks = ["any"];
238 extraOptions = ''
239 allow-recursion { 127.0.0.1; };
240 allow-transfer { none; };
241
242 notify-source ${lib.head config.myEnv.servers.eldiron.ips.main.ip4};
243 notify-source-v6 ${lib.head config.myEnv.servers.eldiron.ips.main.ip6};
244 version none;
245 hostname none;
246 server-id none;
247 '';
248 zones =
249 builtins.mapAttrs (name: v: {
250 master = true;
251 extraConfig = v.extraConfig;
252 masters = [];
253 slaves =
254 lib.flatten (map (n: builtins.attrValues config.myEnv.dns.ns.${n}) v.slaves);
255 file = pkgs.runCommand "${name}.zone" {
256 text = v;
257 passAsFile = [ "text" ];
258 # Automatically change the increment when relevant change
259 # happened (both serial and mta-sts)
260 } ''
261 mv "$textPath" $out
262 increment=$(( 100*($(date -u +%-H) * 60 + $(date -u +%-M))/1440 ))
263 sed -i -e "s/2022121902/$(date -u +%Y%m%d)$increment/g" $out
264 sed -i -e "s/20200109150200Z/$(date -u +%Y%m%d%H%M%SZ)/g" $out
265 '';
266 }) config.myServices.dns.zones;
267 };
268 myServices.monitoring.fromMasterActivatedPlugins = [ "dns" ];
269 myServices.monitoring.fromMasterObjects.service = lib.mkMerge (lib.mapAttrsToList (name: z:
270 lib.optional (builtins.elem "immae" z.ns) {
271 service_description = "eldiron dns is active and authoritative for ${name}";
272 host_name = config.hostEnv.fqdn;
273 use = "dns-service";
274 check_command = ["check_dns" name "-A"];
275
276 servicegroups = "webstatus-dns";
277 _webstatus_name = name;
278 } ++
279 lib.optional (builtins.elem "raito" z.ns) {
280 service_description = "raito dns is active and authoritative for ${name}";
281 host_name = config.hostEnv.fqdn;
282 use = "dns-service";
283 check_command = ["check_external_dns" "kurisu.dual.lahfa.xyz" name "-A"];
284
285 servicegroups = "webstatus-dns";
286 _webstatus_name = "${name} (Secondary DNS Raito)";
287 }
288 ) config.myServices.dns.zones);
289 };
290}
diff --git a/systems/eldiron/duply_backup.nix b/systems/eldiron/duply_backup.nix
new file mode 100644
index 0000000..590d125
--- /dev/null
+++ b/systems/eldiron/duply_backup.nix
@@ -0,0 +1,151 @@
1{ lib, pkgs, config, name, ... }:
2
3let
4 cfg = config.myEnv.backup;
5 varDir = "/var/lib/duply";
6 duplyProfile = profile: remote: prefix: ''
7 GPG_PW="${cfg.password}"
8 TARGET="${cfg.remotes.${remote}.remote profile.bucket}${prefix}"
9 export AWS_ACCESS_KEY_ID="${cfg.remotes.${remote}.accessKeyId}"
10 export AWS_SECRET_ACCESS_KEY="${cfg.remotes.${remote}.secretAccessKey}"
11 SOURCE="${profile.rootDir}"
12 FILENAME=".duplicity-ignore"
13 DUPL_PARAMS="$DUPL_PARAMS --exclude-if-present '$FILENAME'"
14 VERBOSITY=4
15 ARCH_DIR="${varDir}/caches"
16
17 # Do a full backup after 1 month
18 MAX_FULLBKP_AGE=1M
19 DUPL_PARAMS="$DUPL_PARAMS --allow-source-mismatch --exclude-other-filesystems --full-if-older-than $MAX_FULLBKP_AGE "
20 # Backups older than 2months are deleted
21 MAX_AGE=2M
22 # Keep 2 full backups
23 MAX_FULL_BACKUPS=2
24 MAX_FULLS_WITH_INCRS=2
25 '';
26 action = "bkp_purge_purgeFull_purgeIncr";
27 varName = k: remoteName:
28 if remoteName == "eriomem" then k else remoteName + "_" + k;
29in
30{
31 options = {
32 services.duplyBackup.enable = lib.mkOption {
33 type = lib.types.bool;
34 default = false;
35 description = ''
36 Whether to enable remote backups.
37 '';
38 };
39 services.duplyBackup.profiles = lib.mkOption {
40 type = lib.types.attrsOf (lib.types.submodule {
41 options = {
42 rootDir = lib.mkOption {
43 type = lib.types.path;
44 description = ''
45 Path to backup
46 '';
47 };
48 bucket = lib.mkOption {
49 type = lib.types.str;
50 default = "immae-${name}";
51 description = ''
52 Bucket to use
53 '';
54 };
55 remotes = lib.mkOption {
56 type = lib.types.listOf lib.types.str;
57 default = ["eriomem"];
58 description = ''
59 Remotes to use for backup
60 '';
61 };
62 excludeFile = lib.mkOption {
63 type = lib.types.lines;
64 default = "";
65 description = ''
66 Content to put in exclude file
67 '';
68 };
69 };
70 });
71 };
72 };
73
74 config = lib.mkIf config.services.duplyBackup.enable {
75 system.activationScripts.backup = ''
76 install -m 0700 -o root -g root -d ${varDir} ${varDir}/caches
77 '';
78 secrets.keys = lib.listToAttrs (lib.flatten (lib.mapAttrsToList (k: v:
79 map (remote: [
80 (lib.nameValuePair "backup/${varName k remote}/conf" {
81 permissions = "0400";
82 text = duplyProfile v remote "${k}/";
83 })
84 (lib.nameValuePair "backup/${varName k remote}/exclude" {
85 permissions = "0400";
86 text = v.excludeFile;
87 })
88 (lib.nameValuePair "backup/${varName k remote}" {
89 permissions = "0500";
90 isDir = true;
91 })
92 ]) v.remotes) config.services.duplyBackup.profiles));
93
94 services.cron = {
95 enable = true;
96 systemCronJobs = let
97 backups = pkgs.writeScript "backups" ''
98 #!${pkgs.stdenv.shell}
99
100 ${builtins.concatStringsSep "\n" (lib.flatten (lib.mapAttrsToList (k: v:
101 map (remote: [
102 ''
103 touch ${varDir}/${varName k remote}.log
104 ${pkgs.duply}/bin/duply ${config.secrets.fullPaths."backup/${varName k remote}"}/ ${action} --force >> ${varDir}/${varName k remote}.log
105 [[ $? = 0 ]] || echo -e "Error when doing backup for ${varName k remote}, see above\n---------------------------------------" >&2
106 ''
107 ]) v.remotes
108 ) config.services.duplyBackup.profiles))}
109 '';
110 in
111 [
112 "0 2 * * * root ${backups}"
113 ];
114
115 };
116
117 security.pki.certificateFiles = [
118 (pkgs.fetchurl {
119 url = "http://downloads.e.eriomem.net/eriomemca.pem";
120 sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
121 })
122 ];
123
124 myServices.monitoring.fromMasterActivatedPlugins = [ "eriomem" ];
125 myServices.monitoring.fromMasterObjects.service = [
126 {
127 service_description = "eriomem backup is up and not full";
128 host_name = config.hostEnv.fqdn;
129 use = "external-service";
130 check_command = "check_backup_eriomem";
131
132 check_interval = 120;
133 notification_interval = "1440";
134
135 servicegroups = "webstatus-backup";
136 }
137
138 {
139 service_description = "ovh backup is up and not full";
140 host_name = config.hostEnv.fqdn;
141 use = "external-service";
142 check_command = "check_ok";
143
144 check_interval = 120;
145 notification_interval = "1440";
146
147 servicegroups = "webstatus-backup";
148 }
149 ];
150 };
151}
diff --git a/systems/eldiron/ejabberd/default.nix b/systems/eldiron/ejabberd/default.nix
new file mode 100644
index 0000000..5268516
--- /dev/null
+++ b/systems/eldiron/ejabberd/default.nix
@@ -0,0 +1,141 @@
1{ lib, pkgs, config, mypackages-lib, ... }:
2let
3 cfg = config.myServices.ejabberd;
4in
5{
6 options.myServices = {
7 ejabberd.enable = lib.mkOption {
8 type = lib.types.bool;
9 default = false;
10 description = ''
11 Whether to enable ejabberd service.
12 '';
13 };
14 };
15
16 config = lib.mkIf cfg.enable {
17 myServices.dns.zones."immae.fr" = with config.myServices.dns.helpers;
18 lib.mkMerge [
19 {
20 extraConfig = ''
21 notify yes;
22 '';
23 slaves = [ "raito" ];
24 emailPolicies."".receive = true;
25 }
26 zoneHeader
27 mailMX
28 (mailCommon "immae.fr")
29 (ips servers.eldiron.ips.main)
30 {
31 ns = [ "immae" "raito" ];
32 CAA = letsencrypt;
33 subdomains.www = ips servers.eldiron.ips.production;
34 subdomains.im = ips servers.eldiron.ips.main;
35 subdomains.conference = ips servers.eldiron.ips.main;
36 subdomains.pubsub = ips servers.eldiron.ips.main;
37 subdomains.proxy = ips servers.eldiron.ips.main;
38 subdomains.upload = ips servers.eldiron.ips.main;
39 subdomains._xmppconnect.TXT = [
40 "_xmpp-client-xbosh=https://im.immae.fr/bosh"
41 "_xmpp-client-websocket=wss://im.immae.fr/ws"
42 ];
43 }
44 ];
45
46 security.acme.certs = {
47 "ejabberd" = {
48 group = "ejabberd";
49 domain = "eldiron.immae.eu";
50 keyType = "rsa4096";
51 postRun = ''
52 systemctl restart ejabberd.service
53 '';
54 extraDomainNames = [ "immae.fr" "conference.immae.fr" "proxy.immae.fr" "pubsub.immae.fr" "upload.immae.fr" ];
55 };
56 };
57 networking.firewall.allowedTCPPorts = [ 5222 5269 ];
58 myServices.websites.tools.im.enable = true;
59 systemd.services.ejabberd.postStop = ''
60 rm /var/log/ejabberd/erl_crash*.dump
61 '';
62 secrets.keys = {
63 "ejabberd/psql.yml" = {
64 permissions = "0400";
65 user = "ejabberd";
66 group = "ejabberd";
67 text = ''
68 sql_type: pgsql
69 sql_server: "localhost"
70 sql_database: "${config.myEnv.jabber.postgresql.database}"
71 sql_username: "${config.myEnv.jabber.postgresql.user}"
72 sql_password: "${config.myEnv.jabber.postgresql.password}"
73 '';
74 };
75 "ejabberd/host.yml" = {
76 permissions = "0400";
77 user = "ejabberd";
78 group = "ejabberd";
79 text = ''
80 host_config:
81 "immae.fr":
82 domain_certfile: "${config.security.acme.certs.ejabberd.directory}/full.pem"
83 auth_method: [ldap]
84 ldap_servers: ["${config.myEnv.jabber.ldap.host}"]
85 ldap_encrypt: tls
86 ldap_rootdn: "${config.myEnv.jabber.ldap.dn}"
87 ldap_password: "${config.myEnv.jabber.ldap.password}"
88 ldap_base: "${config.myEnv.jabber.ldap.base}"
89 ldap_uids:
90 uid: "%u"
91 immaeXmppUid: "%u"
92 ldap_filter: "${config.myEnv.jabber.ldap.filter}"
93 '';
94 };
95 };
96 users.users.ejabberd.extraGroups = [ "keys" ];
97 services.ejabberd = {
98 package = pkgs.ejabberd.override { withPgsql = true; };
99 imagemagick = true;
100 enable = true;
101 ctlConfig = ''
102 ERLANG_NODE=ejabberd@localhost
103 '';
104 configFile = pkgs.runCommand "ejabberd.yml" {
105 certificatePrivateKeyAndFullChain = "${config.security.acme.certs.ejabberd.directory}/full.pem";
106 certificateCA = "${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt";
107 sql_config_file = config.secrets.fullPaths."ejabberd/psql.yml";
108 host_config_file = config.secrets.fullPaths."ejabberd/host.yml";
109 } ''
110 substituteAll ${./ejabberd.yml} $out
111 '';
112 };
113 secrets.keys."postfix/scripts/ejabberd-env" = {
114 user = "postfixscripts";
115 group = "root";
116 permissions = "0400";
117 text = builtins.toJSON {
118 jid = "notify_bot@immae.fr";
119 password = "{{ .xmpp.notify_bot }}";
120 };
121 };
122 services.postfix.extraAliases = let
123 nixpkgs = builtins.fetchTarball {
124 url = "https://github.com/NixOS/nixpkgs/archive/840c782d507d60aaa49aa9e3f6d0b0e780912742.tar.gz";
125 sha256 = "14q3kvnmgz19pgwyq52gxx0cs90ddf24pnplmq33pdddbb6c51zn";
126 };
127 pkgs' = import nixpkgs { inherit (pkgs) system; overlays = []; };
128 warn_xmpp_email = scriptEnv: pkgs'.runCommand "warn_xmpp_email" {
129 inherit scriptEnv;
130 pythonEnv = pkgs'.python3.withPackages (ps: [
131 ps.unidecode ps.slixmpp
132 ]);
133 } ''
134 substituteAll ${./warn_xmpp_email.py} $out
135 chmod a+x $out
136 '';
137 in ''
138 ejabberd: "|${mypackages-lib.postfixScript pkgs "ejabberd" (warn_xmpp_email config.secrets.fullPaths."postfix/scripts/ejabberd-env")}"
139 '';
140 };
141}
diff --git a/systems/eldiron/ejabberd/ejabberd.yml b/systems/eldiron/ejabberd/ejabberd.yml
new file mode 100644
index 0000000..82ac35b
--- /dev/null
+++ b/systems/eldiron/ejabberd/ejabberd.yml
@@ -0,0 +1,231 @@
1###
2### ejabberd configuration file
3###
4### The parameters used in this configuration file are explained at
5###
6### https://docs.ejabberd.im/admin/configuration
7###
8### The configuration file is written in YAML.
9### *******************************************************
10### ******* !!! WARNING !!! *******
11### ******* YAML IS INDENTATION SENSITIVE *******
12### ******* MAKE SURE YOU INDENT SECTIONS CORRECTLY *******
13### *******************************************************
14### Refer to http://en.wikipedia.org/wiki/YAML for the brief description.
15### However, ejabberd treats different literals as different types:
16###
17### - unquoted or single-quoted strings. They are called "atoms".
18### Example: dog, 'Jupiter', '3.14159', YELLOW
19###
20### - numeric literals. Example: 3, -45.0, .0
21###
22### - quoted or folded strings.
23### Examples of quoted string: "Lizzard", "orange".
24### Example of folded string:
25### > Art thou not Romeo,
26### and a Montague?
27###
28
29hosts:
30 - "immae.fr"
31
32loglevel: 4
33log_rotate_size: 10485760
34log_rotate_date: ""
35log_rotate_count: 1
36log_rate_limit: 100
37
38certfiles:
39 - "@certificatePrivateKeyAndFullChain@"
40
41listen:
42 -
43 port: 5222
44 ip: "::"
45 module: ejabberd_c2s
46 max_stanza_size: 262144
47 shaper: c2s_shaper
48 access: c2s
49 starttls_required: true
50 -
51 port: 5269
52 ip: "::"
53 module: ejabberd_s2s_in
54 max_stanza_size: 524288
55 -
56 port: 5280
57 ip: "127.0.0.1"
58 module: ejabberd_http
59 request_handlers:
60 "/admin": ejabberd_web_admin
61 "/api": mod_http_api
62 "/bosh": mod_bosh
63 "/captcha": ejabberd_captcha
64 "/upload": mod_http_upload
65 "/ws": ejabberd_http_ws
66 tls: false
67
68s2s_use_starttls: optional
69s2s_cafile: "@certificateCA@"
70
71default_db: sql
72include_config_file: @sql_config_file@
73include_config_file: @host_config_file@
74new_sql_schema: true
75
76acl:
77 admin:
78 - user: "ismael@immae.fr"
79 local:
80 user_regexp: ""
81 loopback:
82 ip:
83 - "127.0.0.0/8"
84 - "::1/128"
85 - "::FFFF:127.0.0.1/128"
86
87access_rules:
88 local:
89 - allow: local
90 c2s:
91 - deny: blocked
92 - allow
93 announce:
94 - allow: admin
95 configure:
96 - allow: admin
97 muc_admin:
98 - allow: admin
99 muc_create:
100 - allow: local
101 muc:
102 - allow
103 pubsub_createnode:
104 - allow: local
105 register:
106 - deny
107 trusted_network:
108 - allow: loopback
109
110api_permissions:
111 "console commands":
112 from:
113 - ejabberd_ctl
114 who: all
115 what: "*"
116 "admin access":
117 who:
118 - acl: admin
119 - oauth:
120 - scope: "ejabberd:admin"
121 - acl: admin
122 what:
123 - "*"
124 - "!stop"
125 - "!start"
126 "public commands":
127 who:
128 - ip:
129 - "0.0.0.0"
130 - "::"
131 what:
132 - "status"
133 - "connected_users_number"
134
135shaper:
136 normal: 1000
137 fast: 50000
138
139shaper_rules:
140 max_user_sessions: 10
141 max_user_offline_messages:
142 - 5000: admin
143 - 100
144 c2s_shaper:
145 - none: admin
146 - normal
147 s2s_shaper: fast
148
149modules:
150 mod_adhoc: {}
151 mod_admin_extra: {}
152 mod_announce:
153 access: announce
154 mod_avatar: {}
155 mod_blocking: {}
156 mod_bosh: {}
157 mod_caps: {}
158 mod_carboncopy: {}
159 mod_client_state: {}
160 mod_configure: {}
161 mod_disco: {}
162 mod_fail2ban: {}
163 mod_http_api: {}
164 mod_http_upload:
165 put_url: "https://im.immae.fr/upload"
166 custom_headers:
167 "Access-Control-Allow-Origin": "*"
168 "Access-Control-Allow-Methods": "OPTIONS, HEAD, GET, PUT, POST"
169 "Access-Control-Allow-Headers": "Content-Type"
170 mod_last: {}
171 mod_mam:
172 default: always
173 mod_muc:
174 access:
175 - allow
176 access_admin:
177 - allow: admin
178 access_create: muc_create
179 access_persistent: muc_create
180 default_room_options:
181 mam: true
182 mod_muc_admin: {}
183 mod_offline:
184 access_max_user_messages: max_user_offline_messages
185 mod_ping: {}
186 mod_privacy: {}
187 mod_private: {}
188 mod_proxy65:
189 access: local
190 max_connections: 5
191 mod_pubsub:
192 access_createnode: pubsub_createnode
193 plugins:
194 - "flat"
195 - "pep"
196 force_node_config:
197 ## Change from "whitelist" to "open" to enable OMEMO support
198 ## See https://github.com/processone/ejabberd/issues/2425
199 "eu.siacs.conversations.axolotl.*":
200 access_model: open
201 ## Avoid buggy clients to make their bookmarks public
202 "storage:bookmarks":
203 access_model: whitelist
204 mod_push: {}
205 mod_push_keepalive: {}
206 mod_register:
207 ## Only accept registration requests from the "trusted"
208 ## network (see access_rules section above).
209 ## Think twice before enabling registration from any
210 ## address. See the Jabber SPAM Manifesto for details:
211 ## https://github.com/ge0rg/jabber-spam-fighting-manifesto
212 ip_access: trusted_network
213 access: register
214 mod_roster:
215 versioning: true
216 mod_s2s_dialback: {}
217 mod_shared_roster: {}
218 mod_stats: {}
219 mod_stream_mgmt:
220 resend_on_timeout: if_offline
221 mod_time: {}
222 mod_vcard: {}
223 mod_vcard_xupdate: {}
224 mod_version:
225 show_os: false
226
227### Local Variables:
228### mode: yaml
229### End:
230### vim: set filetype=yaml tabstop=8
231
diff --git a/systems/eldiron/ejabberd/warn_xmpp_email.py b/systems/eldiron/ejabberd/warn_xmpp_email.py
new file mode 100755
index 0000000..d482b43
--- /dev/null
+++ b/systems/eldiron/ejabberd/warn_xmpp_email.py
@@ -0,0 +1,112 @@
1#!@pythonEnv@/bin/python3
2
3import sys
4import json
5import slixmpp
6import asyncio
7import logging
8import io
9
10CONFIG = json.load(open("@scriptEnv@", "r"))
11
12def sanitize(string):
13 import re
14 from unidecode import unidecode
15 return re.compile(r"[^-.A-Za-z0-9_]").sub("_", unidecode(string))
16
17def parse_email():
18 import email
19 from email.header import decode_header
20
21 mail = email.message_from_file(sys.stdin)
22 try:
23 d = decode_header(mail["subject"])[0]
24 if d[1] is not None:
25 subject = d[0].decode(d[1])
26 else:
27 subject = d[0]
28 except Exception as e:
29 subject = mail["subject"]
30 sender = mail["from"]
31 recipient = mail["X-Original-To"]
32
33 body = ""
34 html = None
35 files = {}
36 for part in mail.walk():
37 if part.get_content_type() == "text/plain":
38 body += "\n-------------------\n"
39 try:
40 body += part.get_payload(decode=True).decode(encoding=part.get_content_charset() or "utf-8")
41 except Exception as e:
42 body += part.get_payload(decode=False)
43 elif part.get_content_type() == "text/html":
44 html = part.get_payload(decode=True)
45 elif part.get_content_type() != "text/html" and\
46 part.get_content_maintype() != "multipart":
47
48 filename = part.get_filename() or "{}.dat".format(part["Content-ID"])
49 files[sanitize(filename)] = (part.get_content_type(), part.get_payload(decode=True))
50
51 return [body, html, subject, sender, recipient, files]
52
53[body, html, subject, sender, recipient, files] = parse_email()
54
55class Bot(slixmpp.ClientXMPP):
56 def __init__(self, jid, password, body, html, subject, sender, recipient, files):
57 super().__init__(jid, password)
58
59 self.got_error = False
60 self.body = body
61 self.html = html
62 self.subject = subject
63 self.sender = sender
64 self.recipient = recipient
65 self.files = files
66 self.register_plugin('xep_0363')
67 self.add_event_handler("session_start", self.session_start)
68 self.add_event_handler("message", self.message)
69
70 @asyncio.coroutine
71 def session_start(self, event):
72 files = []
73 if self.html is not None:
74 url = yield from self['xep_0363'].upload_file(
75 "mail.html",
76 content_type="text/html",
77 input_file=io.BytesIO(self.html))
78 files.append(("HTML version", url))
79 for f in self.files:
80 url = yield from self['xep_0363'].upload_file(
81 f,
82 content_type=self.files[f][0],
83 input_file=io.BytesIO(self.files[f][1])
84 )
85 files.append((f, url))
86
87 text = """
88New e-mail message from {sender}
89Subject: {subject}
90{body}
91""".format(sender=self.sender, subject=self.subject, body=self.body)
92 if len(files) > 0:
93 text += "\n\nAttachments:"
94 for f in files:
95 text += "\n{}: {}".format(f[0], f[1])
96 self.send_message(mto=self.recipient, mbody=text, msubject=self.subject, mtype='message')
97 yield from asyncio.sleep(5)
98 self.disconnect()
99
100 @asyncio.coroutine
101 def message(self, msg):
102 if msg["type"] == "error":
103 self.got_error = True
104
105logging.basicConfig(level=logging.DEBUG, format='%(levelname)-8s %(message)s')
106xmpp = Bot(CONFIG["jid"], CONFIG["password"], body, html, subject, sender, recipient, files)
107xmpp.connect()
108xmpp.process(forever=False)
109if xmpp.got_error:
110 sys.exit(1)
111else:
112 sys.exit(0)
diff --git a/systems/eldiron/flake.lock b/systems/eldiron/flake.lock
new file mode 100644
index 0000000..99a5c92
--- /dev/null
+++ b/systems/eldiron/flake.lock
@@ -0,0 +1,2758 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_12",
6 "nixpkgs": "nixpkgs_15"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "buildslist": {
20 "flake": false,
21 "locked": {
22 "lastModified": 1585697026,
23 "narHash": "sha256-7CO89q6Bmg59eN5tFGYaqJR/rpJrLu7dpulXgJUv/0E=",
24 "ref": "master",
25 "rev": "fb8641f2badcec9f232cc5f727009911fc1c89b0",
26 "revCount": 4,
27 "type": "git",
28 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
29 },
30 "original": {
31 "type": "git",
32 "url": "https://git.immae.eu/perso/Immae/Projets/Buildbot/buildslist"
33 }
34 },
35 "colmena": {
36 "inputs": {
37 "flake-compat": "flake-compat",
38 "flake-utils": "flake-utils_2",
39 "nixpkgs": "nixpkgs",
40 "stable": "stable"
41 },
42 "locked": {
43 "lastModified": 1687954574,
44 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
45 "owner": "immae",
46 "repo": "colmena",
47 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
48 "type": "github"
49 },
50 "original": {
51 "owner": "immae",
52 "ref": "add-lib-get-flake",
53 "repo": "colmena",
54 "type": "github"
55 }
56 },
57 "copanier": {
58 "flake": false,
59 "locked": {
60 "lastModified": 1633895178,
61 "narHash": "sha256-0xrh12eBSVpgVeniSbKQAuGBhIyVB/rB/H3Tt7EJ1vQ=",
62 "owner": "spiral-project",
63 "repo": "copanier",
64 "rev": "d1b92cc639f4d25ad31baf4a6579a33c44a0d837",
65 "type": "github"
66 },
67 "original": {
68 "owner": "spiral-project",
69 "repo": "copanier",
70 "type": "github"
71 }
72 },
73 "diaspora": {
74 "flake": false,
75 "locked": {
76 "lastModified": 1551139311,
77 "narHash": "sha256-Fyv7Af68YccJL2OGz6l9d71UmnLB+LstlWbOlgFZtgo=",
78 "owner": "diaspora",
79 "repo": "diaspora",
80 "rev": "663da1ef2573863eb870e0edbd50050f261f3d30",
81 "type": "github"
82 },
83 "original": {
84 "owner": "diaspora",
85 "ref": "v0.7.10.0",
86 "repo": "diaspora",
87 "type": "github"
88 }
89 },
90 "disko": {
91 "inputs": {
92 "nixpkgs": "nixpkgs_2"
93 },
94 "locked": {
95 "lastModified": 1687968164,
96 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
97 "owner": "nix-community",
98 "repo": "disko",
99 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
100 "type": "github"
101 },
102 "original": {
103 "owner": "nix-community",
104 "repo": "disko",
105 "type": "github"
106 }
107 },
108 "dns-nix": {
109 "inputs": {
110 "flake-utils": "flake-utils",
111 "nixpkgs": [
112 "nixpkgs"
113 ]
114 },
115 "locked": {
116 "lastModified": 1635273082,
117 "narHash": "sha256-EHiDP2jEa7Ai5ZwIf5uld9RVFcV77+2SUxjQXwJsJa0=",
118 "owner": "kirelagin",
119 "repo": "dns.nix",
120 "rev": "c7b9645da9c0ddce4f9de4ef27ec01bb8108039a",
121 "type": "github"
122 },
123 "original": {
124 "owner": "kirelagin",
125 "repo": "dns.nix",
126 "type": "github"
127 }
128 },
129 "environment": {
130 "locked": {
131 "lastModified": 1,
132 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
133 "path": "../environment",
134 "type": "path"
135 },
136 "original": {
137 "path": "../environment",
138 "type": "path"
139 }
140 },
141 "environment_2": {
142 "locked": {
143 "lastModified": 1,
144 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
145 "path": "../environment",
146 "type": "path"
147 },
148 "original": {
149 "path": "../environment",
150 "type": "path"
151 }
152 },
153 "environment_3": {
154 "locked": {
155 "lastModified": 1,
156 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
157 "path": "../environment",
158 "type": "path"
159 },
160 "original": {
161 "path": "../environment",
162 "type": "path"
163 }
164 },
165 "environment_4": {
166 "locked": {
167 "lastModified": 1,
168 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
169 "path": "../environment",
170 "type": "path"
171 },
172 "original": {
173 "path": "../environment",
174 "type": "path"
175 }
176 },
177 "environment_5": {
178 "locked": {
179 "lastModified": 1,
180 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
181 "path": "../environment",
182 "type": "path"
183 },
184 "original": {
185 "path": "../environment",
186 "type": "path"
187 }
188 },
189 "environment_6": {
190 "locked": {
191 "lastModified": 1,
192 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
193 "path": "../environment",
194 "type": "path"
195 },
196 "original": {
197 "path": "../environment",
198 "type": "path"
199 }
200 },
201 "etherpad-lite": {
202 "flake": false,
203 "locked": {
204 "lastModified": 1587951095,
205 "narHash": "sha256-PjAkvkC7tJzRECUqOvuWfoZTz8QqDXk6oXEN3ig24rQ=",
206 "owner": "ether",
207 "repo": "etherpad-lite",
208 "rev": "62101147a0c3495dc80daa87ab53a3366321a205",
209 "type": "github"
210 },
211 "original": {
212 "owner": "ether",
213 "ref": "1.8.3",
214 "repo": "etherpad-lite",
215 "type": "github"
216 }
217 },
218 "files-watcher": {
219 "locked": {
220 "lastModified": 1,
221 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
222 "path": "../../files-watcher",
223 "type": "path"
224 },
225 "original": {
226 "path": "../../files-watcher",
227 "type": "path"
228 }
229 },
230 "files-watcher_2": {
231 "locked": {
232 "lastModified": 1,
233 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
234 "path": "../../files-watcher",
235 "type": "path"
236 },
237 "original": {
238 "path": "../../files-watcher",
239 "type": "path"
240 }
241 },
242 "files-watcher_3": {
243 "locked": {
244 "lastModified": 1,
245 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
246 "path": "../../files-watcher",
247 "type": "path"
248 },
249 "original": {
250 "path": "../../files-watcher",
251 "type": "path"
252 }
253 },
254 "files-watcher_4": {
255 "locked": {
256 "lastModified": 1,
257 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
258 "path": "../files-watcher",
259 "type": "path"
260 },
261 "original": {
262 "path": "../files-watcher",
263 "type": "path"
264 }
265 },
266 "flake-compat": {
267 "flake": false,
268 "locked": {
269 "lastModified": 1650374568,
270 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
271 "owner": "edolstra",
272 "repo": "flake-compat",
273 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
274 "type": "github"
275 },
276 "original": {
277 "owner": "edolstra",
278 "repo": "flake-compat",
279 "type": "github"
280 }
281 },
282 "flake-parts": {
283 "inputs": {
284 "nixpkgs-lib": "nixpkgs-lib"
285 },
286 "locked": {
287 "lastModified": 1687762428,
288 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
289 "owner": "hercules-ci",
290 "repo": "flake-parts",
291 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
292 "type": "github"
293 },
294 "original": {
295 "owner": "hercules-ci",
296 "repo": "flake-parts",
297 "type": "github"
298 }
299 },
300 "flake-parts_2": {
301 "inputs": {
302 "nixpkgs-lib": "nixpkgs-lib_3"
303 },
304 "locked": {
305 "lastModified": 1675295133,
306 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
307 "owner": "hercules-ci",
308 "repo": "flake-parts",
309 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
310 "type": "github"
311 },
312 "original": {
313 "owner": "hercules-ci",
314 "repo": "flake-parts",
315 "type": "github"
316 }
317 },
318 "flake-parts_3": {
319 "inputs": {
320 "nixpkgs-lib": "nixpkgs-lib_4"
321 },
322 "locked": {
323 "lastModified": 1675295133,
324 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
325 "owner": "hercules-ci",
326 "repo": "flake-parts",
327 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
328 "type": "github"
329 },
330 "original": {
331 "owner": "hercules-ci",
332 "repo": "flake-parts",
333 "type": "github"
334 }
335 },
336 "flake-parts_4": {
337 "inputs": {
338 "nixpkgs-lib": "nixpkgs-lib_5"
339 },
340 "locked": {
341 "lastModified": 1675295133,
342 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
343 "owner": "hercules-ci",
344 "repo": "flake-parts",
345 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
346 "type": "github"
347 },
348 "original": {
349 "owner": "hercules-ci",
350 "repo": "flake-parts",
351 "type": "github"
352 }
353 },
354 "flake-parts_5": {
355 "inputs": {
356 "nixpkgs-lib": "nixpkgs-lib_6"
357 },
358 "locked": {
359 "lastModified": 1675295133,
360 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
361 "owner": "hercules-ci",
362 "repo": "flake-parts",
363 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
364 "type": "github"
365 },
366 "original": {
367 "owner": "hercules-ci",
368 "repo": "flake-parts",
369 "type": "github"
370 }
371 },
372 "flake-parts_6": {
373 "inputs": {
374 "nixpkgs-lib": "nixpkgs-lib_7"
375 },
376 "locked": {
377 "lastModified": 1675295133,
378 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
379 "owner": "hercules-ci",
380 "repo": "flake-parts",
381 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
382 "type": "github"
383 },
384 "original": {
385 "owner": "hercules-ci",
386 "repo": "flake-parts",
387 "type": "github"
388 }
389 },
390 "flake-utils": {
391 "locked": {
392 "lastModified": 1614513358,
393 "narHash": "sha256-LakhOx3S1dRjnh0b5Dg3mbZyH0ToC9I8Y2wKSkBaTzU=",
394 "owner": "numtide",
395 "repo": "flake-utils",
396 "rev": "5466c5bbece17adaab2d82fae80b46e807611bf3",
397 "type": "github"
398 },
399 "original": {
400 "owner": "numtide",
401 "repo": "flake-utils",
402 "type": "github"
403 }
404 },
405 "flake-utils_10": {
406 "locked": {
407 "lastModified": 1610051610,
408 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
409 "owner": "numtide",
410 "repo": "flake-utils",
411 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
412 "type": "github"
413 },
414 "original": {
415 "owner": "numtide",
416 "repo": "flake-utils",
417 "type": "github"
418 }
419 },
420 "flake-utils_11": {
421 "locked": {
422 "lastModified": 1648297722,
423 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
424 "owner": "numtide",
425 "repo": "flake-utils",
426 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
427 "type": "github"
428 },
429 "original": {
430 "owner": "numtide",
431 "repo": "flake-utils",
432 "type": "github"
433 }
434 },
435 "flake-utils_12": {
436 "locked": {
437 "lastModified": 1667395993,
438 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
439 "owner": "numtide",
440 "repo": "flake-utils",
441 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
442 "type": "github"
443 },
444 "original": {
445 "owner": "numtide",
446 "repo": "flake-utils",
447 "type": "github"
448 }
449 },
450 "flake-utils_13": {
451 "locked": {
452 "lastModified": 1631561581,
453 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
454 "owner": "numtide",
455 "repo": "flake-utils",
456 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
457 "type": "github"
458 },
459 "original": {
460 "owner": "numtide",
461 "repo": "flake-utils",
462 "type": "github"
463 }
464 },
465 "flake-utils_14": {
466 "locked": {
467 "lastModified": 1648297722,
468 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
469 "owner": "numtide",
470 "repo": "flake-utils",
471 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
472 "type": "github"
473 },
474 "original": {
475 "owner": "numtide",
476 "repo": "flake-utils",
477 "type": "github"
478 }
479 },
480 "flake-utils_15": {
481 "locked": {
482 "lastModified": 1648297722,
483 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
484 "owner": "numtide",
485 "repo": "flake-utils",
486 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
487 "type": "github"
488 },
489 "original": {
490 "owner": "numtide",
491 "repo": "flake-utils",
492 "type": "github"
493 }
494 },
495 "flake-utils_16": {
496 "locked": {
497 "lastModified": 1648297722,
498 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
499 "owner": "numtide",
500 "repo": "flake-utils",
501 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
502 "type": "github"
503 },
504 "original": {
505 "owner": "numtide",
506 "repo": "flake-utils",
507 "type": "github"
508 }
509 },
510 "flake-utils_17": {
511 "locked": {
512 "lastModified": 1648297722,
513 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
514 "owner": "numtide",
515 "repo": "flake-utils",
516 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
517 "type": "github"
518 },
519 "original": {
520 "owner": "numtide",
521 "repo": "flake-utils",
522 "type": "github"
523 }
524 },
525 "flake-utils_18": {
526 "locked": {
527 "lastModified": 1649676176,
528 "narHash": "sha256-OWKJratjt2RW151VUlJPRALb7OU2S5s+f0vLj4o1bHM=",
529 "owner": "numtide",
530 "repo": "flake-utils",
531 "rev": "a4b154ebbdc88c8498a5c7b01589addc9e9cb678",
532 "type": "github"
533 },
534 "original": {
535 "owner": "numtide",
536 "repo": "flake-utils",
537 "type": "github"
538 }
539 },
540 "flake-utils_19": {
541 "locked": {
542 "lastModified": 1609246779,
543 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
544 "owner": "numtide",
545 "repo": "flake-utils",
546 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
547 "type": "github"
548 },
549 "original": {
550 "owner": "numtide",
551 "repo": "flake-utils",
552 "type": "github"
553 }
554 },
555 "flake-utils_2": {
556 "locked": {
557 "lastModified": 1659877975,
558 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
559 "owner": "numtide",
560 "repo": "flake-utils",
561 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
562 "type": "github"
563 },
564 "original": {
565 "owner": "numtide",
566 "repo": "flake-utils",
567 "type": "github"
568 }
569 },
570 "flake-utils_20": {
571 "locked": {
572 "lastModified": 1609246779,
573 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
574 "owner": "numtide",
575 "repo": "flake-utils",
576 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
577 "type": "github"
578 },
579 "original": {
580 "owner": "numtide",
581 "repo": "flake-utils",
582 "type": "github"
583 }
584 },
585 "flake-utils_21": {
586 "locked": {
587 "lastModified": 1610051610,
588 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
589 "owner": "numtide",
590 "repo": "flake-utils",
591 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
592 "type": "github"
593 },
594 "original": {
595 "owner": "numtide",
596 "repo": "flake-utils",
597 "type": "github"
598 }
599 },
600 "flake-utils_22": {
601 "locked": {
602 "lastModified": 1648297722,
603 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
604 "owner": "numtide",
605 "repo": "flake-utils",
606 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
607 "type": "github"
608 },
609 "original": {
610 "owner": "numtide",
611 "repo": "flake-utils",
612 "type": "github"
613 }
614 },
615 "flake-utils_23": {
616 "locked": {
617 "lastModified": 1648297722,
618 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
619 "owner": "numtide",
620 "repo": "flake-utils",
621 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
622 "type": "github"
623 },
624 "original": {
625 "owner": "numtide",
626 "repo": "flake-utils",
627 "type": "github"
628 }
629 },
630 "flake-utils_3": {
631 "locked": {
632 "lastModified": 1648297722,
633 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
634 "owner": "numtide",
635 "repo": "flake-utils",
636 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
637 "type": "github"
638 },
639 "original": {
640 "owner": "numtide",
641 "repo": "flake-utils",
642 "type": "github"
643 }
644 },
645 "flake-utils_4": {
646 "locked": {
647 "lastModified": 1609246779,
648 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
649 "owner": "numtide",
650 "repo": "flake-utils",
651 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
652 "type": "github"
653 },
654 "original": {
655 "owner": "numtide",
656 "repo": "flake-utils",
657 "type": "github"
658 }
659 },
660 "flake-utils_5": {
661 "locked": {
662 "lastModified": 1609246779,
663 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
664 "owner": "numtide",
665 "repo": "flake-utils",
666 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
667 "type": "github"
668 },
669 "original": {
670 "owner": "numtide",
671 "repo": "flake-utils",
672 "type": "github"
673 }
674 },
675 "flake-utils_6": {
676 "locked": {
677 "lastModified": 1609246779,
678 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
679 "owner": "numtide",
680 "repo": "flake-utils",
681 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
682 "type": "github"
683 },
684 "original": {
685 "owner": "numtide",
686 "repo": "flake-utils",
687 "type": "github"
688 }
689 },
690 "flake-utils_7": {
691 "locked": {
692 "lastModified": 1609246779,
693 "narHash": "sha256-eq6ZXE/VWo3EMC65jmIT6H/rrUc9UWOWVujkzav025k=",
694 "owner": "numtide",
695 "repo": "flake-utils",
696 "rev": "08c7ad4a0844adc4a7f9f5bb3beae482e789afa4",
697 "type": "github"
698 },
699 "original": {
700 "owner": "numtide",
701 "repo": "flake-utils",
702 "type": "github"
703 }
704 },
705 "flake-utils_8": {
706 "locked": {
707 "lastModified": 1631561581,
708 "narHash": "sha256-3VQMV5zvxaVLvqqUrNz3iJelLw30mIVSfZmAaauM3dA=",
709 "owner": "numtide",
710 "repo": "flake-utils",
711 "rev": "7e5bf3925f6fbdfaf50a2a7ca0be2879c4261d19",
712 "type": "github"
713 },
714 "original": {
715 "owner": "numtide",
716 "repo": "flake-utils",
717 "type": "github"
718 }
719 },
720 "flake-utils_9": {
721 "locked": {
722 "lastModified": 1610051610,
723 "narHash": "sha256-U9rPz/usA1/Aohhk7Cmc2gBrEEKRzcW4nwPWMPwja4Y=",
724 "owner": "numtide",
725 "repo": "flake-utils",
726 "rev": "3982c9903e93927c2164caa727cd3f6a0e6d14cc",
727 "type": "github"
728 },
729 "original": {
730 "owner": "numtide",
731 "repo": "flake-utils",
732 "type": "github"
733 }
734 },
735 "grocy": {
736 "flake": false,
737 "locked": {
738 "lastModified": 1585166193,
739 "narHash": "sha256-rq1Fma/VgU01qXQmCghrt5k+LXWYt8z9b0NvGA7+/Y8=",
740 "owner": "grocy",
741 "repo": "grocy",
742 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
743 "type": "github"
744 },
745 "original": {
746 "owner": "grocy",
747 "repo": "grocy",
748 "rev": "d7738aa1ec330c81f11e4976681df0299d4ed35a",
749 "type": "github"
750 }
751 },
752 "mastodon": {
753 "flake": false,
754 "locked": {
755 "lastModified": 1582790581,
756 "narHash": "sha256-YImWfvsJQzJHyKoWI6OP6BA+NvmHF2RiwJqOg0NUN/U=",
757 "owner": "tootsuite",
758 "repo": "mastodon",
759 "rev": "9bace2dd88d127d396794375c8fcb2132619a799",
760 "type": "github"
761 },
762 "original": {
763 "owner": "tootsuite",
764 "ref": "v2.9.4",
765 "repo": "mastodon",
766 "type": "github"
767 }
768 },
769 "mediagoblin": {
770 "flake": false,
771 "locked": {
772 "lastModified": 1531090939,
773 "narHash": "sha256-vSajRbuE/bu2HVsUZm25fkm/vNLXKDIK7Xn8kyKJ5Ps=",
774 "ref": "stable",
775 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
776 "revCount": 4805,
777 "submodules": true,
778 "type": "git",
779 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
780 },
781 "original": {
782 "ref": "stable",
783 "rev": "cd465ebfec837a75a44c4ebd727dffe2fff6d850",
784 "submodules": true,
785 "type": "git",
786 "url": "https://git.savannah.gnu.org/git/mediagoblin.git"
787 }
788 },
789 "my-lib": {
790 "inputs": {
791 "colmena": "colmena",
792 "disko": "disko",
793 "flake-parts": "flake-parts",
794 "nixos-anywhere": "nixos-anywhere",
795 "nixpkgs": "nixpkgs_4"
796 },
797 "locked": {
798 "lastModified": 1,
799 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
800 "path": "../../flakes/lib",
801 "type": "path"
802 },
803 "original": {
804 "path": "../../flakes/lib",
805 "type": "path"
806 }
807 },
808 "mypackages": {
809 "inputs": {
810 "flake-parts": "flake-parts_2",
811 "nixpkgs": "nixpkgs_16",
812 "webapps-ttrss": "webapps-ttrss"
813 },
814 "locked": {
815 "lastModified": 1,
816 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
817 "path": "../../mypackages",
818 "type": "path"
819 },
820 "original": {
821 "path": "../../mypackages",
822 "type": "path"
823 }
824 },
825 "mypackages_2": {
826 "inputs": {
827 "flake-parts": "flake-parts_3",
828 "nixpkgs": "nixpkgs_19",
829 "webapps-ttrss": "webapps-ttrss_2"
830 },
831 "locked": {
832 "lastModified": 1,
833 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
834 "path": "../mypackages",
835 "type": "path"
836 },
837 "original": {
838 "path": "../mypackages",
839 "type": "path"
840 }
841 },
842 "mypackages_3": {
843 "inputs": {
844 "flake-parts": "flake-parts_4",
845 "nixpkgs": "nixpkgs_21",
846 "webapps-ttrss": "webapps-ttrss_3"
847 },
848 "locked": {
849 "lastModified": 1,
850 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
851 "path": "../mypackages",
852 "type": "path"
853 },
854 "original": {
855 "path": "../mypackages",
856 "type": "path"
857 }
858 },
859 "mypackages_4": {
860 "inputs": {
861 "flake-parts": "flake-parts_6",
862 "nixpkgs": "nixpkgs_29",
863 "webapps-ttrss": "webapps-ttrss_5"
864 },
865 "locked": {
866 "lastModified": 1,
867 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
868 "path": "../mypackages",
869 "type": "path"
870 },
871 "original": {
872 "path": "../mypackages",
873 "type": "path"
874 }
875 },
876 "myuids": {
877 "locked": {
878 "lastModified": 1,
879 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
880 "path": "../myuids",
881 "type": "path"
882 },
883 "original": {
884 "path": "../myuids",
885 "type": "path"
886 }
887 },
888 "myuids_10": {
889 "locked": {
890 "lastModified": 1,
891 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
892 "path": "../myuids",
893 "type": "path"
894 },
895 "original": {
896 "path": "../myuids",
897 "type": "path"
898 }
899 },
900 "myuids_11": {
901 "locked": {
902 "lastModified": 1,
903 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
904 "path": "../myuids",
905 "type": "path"
906 },
907 "original": {
908 "path": "../myuids",
909 "type": "path"
910 }
911 },
912 "myuids_12": {
913 "locked": {
914 "lastModified": 1,
915 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
916 "path": "../myuids",
917 "type": "path"
918 },
919 "original": {
920 "path": "../myuids",
921 "type": "path"
922 }
923 },
924 "myuids_13": {
925 "locked": {
926 "lastModified": 1,
927 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
928 "path": "../myuids",
929 "type": "path"
930 },
931 "original": {
932 "path": "../myuids",
933 "type": "path"
934 }
935 },
936 "myuids_14": {
937 "locked": {
938 "lastModified": 1,
939 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
940 "path": "../myuids",
941 "type": "path"
942 },
943 "original": {
944 "path": "../myuids",
945 "type": "path"
946 }
947 },
948 "myuids_2": {
949 "locked": {
950 "lastModified": 1,
951 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
952 "path": "../myuids",
953 "type": "path"
954 },
955 "original": {
956 "path": "../myuids",
957 "type": "path"
958 }
959 },
960 "myuids_3": {
961 "locked": {
962 "lastModified": 1,
963 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
964 "path": "../myuids",
965 "type": "path"
966 },
967 "original": {
968 "path": "../myuids",
969 "type": "path"
970 }
971 },
972 "myuids_4": {
973 "locked": {
974 "lastModified": 1,
975 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
976 "path": "../myuids",
977 "type": "path"
978 },
979 "original": {
980 "path": "../myuids",
981 "type": "path"
982 }
983 },
984 "myuids_5": {
985 "locked": {
986 "lastModified": 1,
987 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
988 "path": "../myuids",
989 "type": "path"
990 },
991 "original": {
992 "path": "../myuids",
993 "type": "path"
994 }
995 },
996 "myuids_6": {
997 "locked": {
998 "lastModified": 1,
999 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
1000 "path": "../myuids",
1001 "type": "path"
1002 },
1003 "original": {
1004 "path": "../myuids",
1005 "type": "path"
1006 }
1007 },
1008 "myuids_7": {
1009 "locked": {
1010 "lastModified": 1,
1011 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
1012 "path": "../../myuids",
1013 "type": "path"
1014 },
1015 "original": {
1016 "path": "../../myuids",
1017 "type": "path"
1018 }
1019 },
1020 "myuids_8": {
1021 "locked": {
1022 "lastModified": 1,
1023 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
1024 "path": "../myuids",
1025 "type": "path"
1026 },
1027 "original": {
1028 "path": "../myuids",
1029 "type": "path"
1030 }
1031 },
1032 "myuids_9": {
1033 "locked": {
1034 "lastModified": 1,
1035 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
1036 "path": "../myuids",
1037 "type": "path"
1038 },
1039 "original": {
1040 "path": "../myuids",
1041 "type": "path"
1042 }
1043 },
1044 "naemon": {
1045 "locked": {
1046 "lastModified": 1,
1047 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
1048 "path": "../../naemon",
1049 "type": "path"
1050 },
1051 "original": {
1052 "path": "../../naemon",
1053 "type": "path"
1054 }
1055 },
1056 "nixos-2305": {
1057 "locked": {
1058 "lastModified": 1687938137,
1059 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
1060 "owner": "NixOS",
1061 "repo": "nixpkgs",
1062 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
1063 "type": "github"
1064 },
1065 "original": {
1066 "owner": "NixOS",
1067 "ref": "release-23.05",
1068 "repo": "nixpkgs",
1069 "type": "github"
1070 }
1071 },
1072 "nixos-anywhere": {
1073 "inputs": {
1074 "disko": [
1075 "my-lib",
1076 "disko"
1077 ],
1078 "flake-parts": [
1079 "my-lib",
1080 "flake-parts"
1081 ],
1082 "nixos-2305": "nixos-2305",
1083 "nixos-images": "nixos-images",
1084 "nixpkgs": "nixpkgs_3",
1085 "treefmt-nix": "treefmt-nix"
1086 },
1087 "locked": {
1088 "lastModified": 1689945193,
1089 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
1090 "owner": "numtide",
1091 "repo": "nixos-anywhere",
1092 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
1093 "type": "github"
1094 },
1095 "original": {
1096 "owner": "numtide",
1097 "repo": "nixos-anywhere",
1098 "type": "github"
1099 }
1100 },
1101 "nixos-images": {
1102 "inputs": {
1103 "nixos-2305": [
1104 "my-lib",
1105 "nixos-anywhere",
1106 "nixos-2305"
1107 ],
1108 "nixos-unstable": [
1109 "my-lib",
1110 "nixos-anywhere",
1111 "nixpkgs"
1112 ]
1113 },
1114 "locked": {
1115 "lastModified": 1686819168,
1116 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
1117 "owner": "nix-community",
1118 "repo": "nixos-images",
1119 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
1120 "type": "github"
1121 },
1122 "original": {
1123 "owner": "nix-community",
1124 "repo": "nixos-images",
1125 "type": "github"
1126 }
1127 },
1128 "nixpkgs": {
1129 "locked": {
1130 "lastModified": 1683408522,
1131 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
1132 "owner": "NixOS",
1133 "repo": "nixpkgs",
1134 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
1135 "type": "github"
1136 },
1137 "original": {
1138 "owner": "NixOS",
1139 "ref": "nixos-unstable",
1140 "repo": "nixpkgs",
1141 "type": "github"
1142 }
1143 },
1144 "nixpkgs-4": {
1145 "flake": false,
1146 "locked": {
1147 "lastModified": 1646497237,
1148 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1149 "owner": "NixOS",
1150 "repo": "nixpkgs",
1151 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1152 "type": "github"
1153 },
1154 "original": {
1155 "owner": "NixOS",
1156 "repo": "nixpkgs",
1157 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1158 "type": "github"
1159 }
1160 },
1161 "nixpkgs-lib": {
1162 "locked": {
1163 "dir": "lib",
1164 "lastModified": 1685564631,
1165 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
1166 "owner": "NixOS",
1167 "repo": "nixpkgs",
1168 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
1169 "type": "github"
1170 },
1171 "original": {
1172 "dir": "lib",
1173 "owner": "NixOS",
1174 "ref": "nixos-unstable",
1175 "repo": "nixpkgs",
1176 "type": "github"
1177 }
1178 },
1179 "nixpkgs-lib_2": {
1180 "locked": {
1181 "dir": "lib",
1182 "lastModified": 1691269286,
1183 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
1184 "owner": "NixOS",
1185 "repo": "nixpkgs",
1186 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
1187 "type": "github"
1188 },
1189 "original": {
1190 "dir": "lib",
1191 "owner": "NixOS",
1192 "repo": "nixpkgs",
1193 "type": "github"
1194 }
1195 },
1196 "nixpkgs-lib_3": {
1197 "locked": {
1198 "dir": "lib",
1199 "lastModified": 1675183161,
1200 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1201 "owner": "NixOS",
1202 "repo": "nixpkgs",
1203 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1204 "type": "github"
1205 },
1206 "original": {
1207 "dir": "lib",
1208 "owner": "NixOS",
1209 "ref": "nixos-unstable",
1210 "repo": "nixpkgs",
1211 "type": "github"
1212 }
1213 },
1214 "nixpkgs-lib_4": {
1215 "locked": {
1216 "dir": "lib",
1217 "lastModified": 1675183161,
1218 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1219 "owner": "NixOS",
1220 "repo": "nixpkgs",
1221 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1222 "type": "github"
1223 },
1224 "original": {
1225 "dir": "lib",
1226 "owner": "NixOS",
1227 "ref": "nixos-unstable",
1228 "repo": "nixpkgs",
1229 "type": "github"
1230 }
1231 },
1232 "nixpkgs-lib_5": {
1233 "locked": {
1234 "dir": "lib",
1235 "lastModified": 1675183161,
1236 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1237 "owner": "NixOS",
1238 "repo": "nixpkgs",
1239 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1240 "type": "github"
1241 },
1242 "original": {
1243 "dir": "lib",
1244 "owner": "NixOS",
1245 "ref": "nixos-unstable",
1246 "repo": "nixpkgs",
1247 "type": "github"
1248 }
1249 },
1250 "nixpkgs-lib_6": {
1251 "locked": {
1252 "dir": "lib",
1253 "lastModified": 1675183161,
1254 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1255 "owner": "NixOS",
1256 "repo": "nixpkgs",
1257 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1258 "type": "github"
1259 },
1260 "original": {
1261 "dir": "lib",
1262 "owner": "NixOS",
1263 "ref": "nixos-unstable",
1264 "repo": "nixpkgs",
1265 "type": "github"
1266 }
1267 },
1268 "nixpkgs-lib_7": {
1269 "locked": {
1270 "dir": "lib",
1271 "lastModified": 1675183161,
1272 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
1273 "owner": "NixOS",
1274 "repo": "nixpkgs",
1275 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
1276 "type": "github"
1277 },
1278 "original": {
1279 "dir": "lib",
1280 "owner": "NixOS",
1281 "ref": "nixos-unstable",
1282 "repo": "nixpkgs",
1283 "type": "github"
1284 }
1285 },
1286 "nixpkgs_10": {
1287 "locked": {
1288 "lastModified": 1597943282,
1289 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1290 "owner": "NixOS",
1291 "repo": "nixpkgs",
1292 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1293 "type": "github"
1294 },
1295 "original": {
1296 "owner": "NixOS",
1297 "repo": "nixpkgs",
1298 "type": "github"
1299 }
1300 },
1301 "nixpkgs_11": {
1302 "locked": {
1303 "lastModified": 1631570365,
1304 "narHash": "sha256-vc6bfo0hijpicdUDiui2DvZXmpIP2iqOFZRcpMOuYPo=",
1305 "owner": "NixOS",
1306 "repo": "nixpkgs",
1307 "rev": "df7113c0727881519248d4c7d080324e0ee3327b",
1308 "type": "github"
1309 },
1310 "original": {
1311 "owner": "NixOS",
1312 "repo": "nixpkgs",
1313 "type": "github"
1314 }
1315 },
1316 "nixpkgs_12": {
1317 "locked": {
1318 "lastModified": 1611097871,
1319 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
1320 "owner": "NixOS",
1321 "repo": "nixpkgs",
1322 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
1323 "type": "github"
1324 },
1325 "original": {
1326 "owner": "NixOS",
1327 "repo": "nixpkgs",
1328 "type": "github"
1329 }
1330 },
1331 "nixpkgs_13": {
1332 "locked": {
1333 "lastModified": 1611097871,
1334 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
1335 "owner": "NixOS",
1336 "repo": "nixpkgs",
1337 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
1338 "type": "github"
1339 },
1340 "original": {
1341 "owner": "NixOS",
1342 "repo": "nixpkgs",
1343 "type": "github"
1344 }
1345 },
1346 "nixpkgs_14": {
1347 "flake": false,
1348 "locked": {
1349 "lastModified": 1596265691,
1350 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1351 "owner": "NixOS",
1352 "repo": "nixpkgs",
1353 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1354 "type": "github"
1355 },
1356 "original": {
1357 "owner": "NixOS",
1358 "repo": "nixpkgs",
1359 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1360 "type": "github"
1361 }
1362 },
1363 "nixpkgs_15": {
1364 "locked": {
1365 "lastModified": 1687502512,
1366 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
1367 "owner": "NixOS",
1368 "repo": "nixpkgs",
1369 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
1370 "type": "github"
1371 },
1372 "original": {
1373 "owner": "NixOS",
1374 "ref": "nixos-unstable",
1375 "repo": "nixpkgs",
1376 "type": "github"
1377 }
1378 },
1379 "nixpkgs_16": {
1380 "locked": {
1381 "lastModified": 1646497237,
1382 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1383 "owner": "nixos",
1384 "repo": "nixpkgs",
1385 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1386 "type": "github"
1387 },
1388 "original": {
1389 "owner": "nixos",
1390 "repo": "nixpkgs",
1391 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1392 "type": "github"
1393 }
1394 },
1395 "nixpkgs_17": {
1396 "locked": {
1397 "lastModified": 1633901457,
1398 "narHash": "sha256-GNJLwKENqEA4xlzkWI76VLHBAua4LUIlTeeiH4FR7Gc=",
1399 "owner": "NixOS",
1400 "repo": "nixpkgs",
1401 "rev": "f358794824b4595d77fec93732485d329ed7b0e0",
1402 "type": "github"
1403 },
1404 "original": {
1405 "owner": "NixOS",
1406 "repo": "nixpkgs",
1407 "type": "github"
1408 }
1409 },
1410 "nixpkgs_18": {
1411 "flake": false,
1412 "locked": {
1413 "lastModified": 1596265691,
1414 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1415 "owner": "NixOS",
1416 "repo": "nixpkgs",
1417 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1418 "type": "github"
1419 },
1420 "original": {
1421 "owner": "NixOS",
1422 "repo": "nixpkgs",
1423 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1424 "type": "github"
1425 }
1426 },
1427 "nixpkgs_19": {
1428 "locked": {
1429 "lastModified": 1646497237,
1430 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1431 "owner": "nixos",
1432 "repo": "nixpkgs",
1433 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1434 "type": "github"
1435 },
1436 "original": {
1437 "owner": "nixos",
1438 "repo": "nixpkgs",
1439 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1440 "type": "github"
1441 }
1442 },
1443 "nixpkgs_2": {
1444 "locked": {
1445 "lastModified": 1687701825,
1446 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
1447 "owner": "NixOS",
1448 "repo": "nixpkgs",
1449 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
1450 "type": "github"
1451 },
1452 "original": {
1453 "owner": "NixOS",
1454 "ref": "nixpkgs-unstable",
1455 "repo": "nixpkgs",
1456 "type": "github"
1457 }
1458 },
1459 "nixpkgs_20": {
1460 "flake": false,
1461 "locked": {
1462 "lastModified": 1596265691,
1463 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1464 "owner": "NixOS",
1465 "repo": "nixpkgs",
1466 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1467 "type": "github"
1468 },
1469 "original": {
1470 "owner": "NixOS",
1471 "repo": "nixpkgs",
1472 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1473 "type": "github"
1474 }
1475 },
1476 "nixpkgs_21": {
1477 "locked": {
1478 "lastModified": 1646497237,
1479 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1480 "owner": "nixos",
1481 "repo": "nixpkgs",
1482 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1483 "type": "github"
1484 },
1485 "original": {
1486 "owner": "nixos",
1487 "repo": "nixpkgs",
1488 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1489 "type": "github"
1490 }
1491 },
1492 "nixpkgs_22": {
1493 "flake": false,
1494 "locked": {
1495 "lastModified": 1596265691,
1496 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1497 "owner": "NixOS",
1498 "repo": "nixpkgs",
1499 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1500 "type": "github"
1501 },
1502 "original": {
1503 "owner": "NixOS",
1504 "repo": "nixpkgs",
1505 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1506 "type": "github"
1507 }
1508 },
1509 "nixpkgs_23": {
1510 "flake": false,
1511 "locked": {
1512 "lastModified": 1596265691,
1513 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1514 "owner": "NixOS",
1515 "repo": "nixpkgs",
1516 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1517 "type": "github"
1518 },
1519 "original": {
1520 "owner": "NixOS",
1521 "repo": "nixpkgs",
1522 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1523 "type": "github"
1524 }
1525 },
1526 "nixpkgs_24": {
1527 "flake": false,
1528 "locked": {
1529 "lastModified": 1596265691,
1530 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1531 "owner": "NixOS",
1532 "repo": "nixpkgs",
1533 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1534 "type": "github"
1535 },
1536 "original": {
1537 "owner": "NixOS",
1538 "repo": "nixpkgs",
1539 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1540 "type": "github"
1541 }
1542 },
1543 "nixpkgs_25": {
1544 "locked": {
1545 "lastModified": 1646497237,
1546 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1547 "owner": "nixos",
1548 "repo": "nixpkgs",
1549 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1550 "type": "github"
1551 },
1552 "original": {
1553 "owner": "nixos",
1554 "repo": "nixpkgs",
1555 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1556 "type": "github"
1557 }
1558 },
1559 "nixpkgs_26": {
1560 "locked": {
1561 "lastModified": 1597943282,
1562 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1563 "owner": "NixOS",
1564 "repo": "nixpkgs",
1565 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1566 "type": "github"
1567 },
1568 "original": {
1569 "owner": "NixOS",
1570 "repo": "nixpkgs",
1571 "type": "github"
1572 }
1573 },
1574 "nixpkgs_27": {
1575 "locked": {
1576 "lastModified": 1597943282,
1577 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1578 "owner": "NixOS",
1579 "repo": "nixpkgs",
1580 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1581 "type": "github"
1582 },
1583 "original": {
1584 "owner": "NixOS",
1585 "repo": "nixpkgs",
1586 "type": "github"
1587 }
1588 },
1589 "nixpkgs_28": {
1590 "locked": {
1591 "lastModified": 1611097871,
1592 "narHash": "sha256-Q6bUkno5JNt0OoyXThFDrKArFBp/GryvJhwEgVzGSuk=",
1593 "owner": "NixOS",
1594 "repo": "nixpkgs",
1595 "rev": "31f5dd3f3655fbedac19f64f77844aa5ed79501c",
1596 "type": "github"
1597 },
1598 "original": {
1599 "owner": "NixOS",
1600 "repo": "nixpkgs",
1601 "type": "github"
1602 }
1603 },
1604 "nixpkgs_29": {
1605 "locked": {
1606 "lastModified": 1646497237,
1607 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
1608 "owner": "nixos",
1609 "repo": "nixpkgs",
1610 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1611 "type": "github"
1612 },
1613 "original": {
1614 "owner": "nixos",
1615 "repo": "nixpkgs",
1616 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
1617 "type": "github"
1618 }
1619 },
1620 "nixpkgs_3": {
1621 "locked": {
1622 "lastModified": 1687893427,
1623 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
1624 "owner": "nixos",
1625 "repo": "nixpkgs",
1626 "rev": "4b14ab2a916508442e685089672681dff46805be",
1627 "type": "github"
1628 },
1629 "original": {
1630 "owner": "nixos",
1631 "ref": "nixos-unstable-small",
1632 "repo": "nixpkgs",
1633 "type": "github"
1634 }
1635 },
1636 "nixpkgs_30": {
1637 "flake": false,
1638 "locked": {
1639 "lastModified": 1596265691,
1640 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1641 "owner": "NixOS",
1642 "repo": "nixpkgs",
1643 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1644 "type": "github"
1645 },
1646 "original": {
1647 "owner": "NixOS",
1648 "repo": "nixpkgs",
1649 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1650 "type": "github"
1651 }
1652 },
1653 "nixpkgs_31": {
1654 "flake": false,
1655 "locked": {
1656 "lastModified": 1596265691,
1657 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1658 "owner": "NixOS",
1659 "repo": "nixpkgs",
1660 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1661 "type": "github"
1662 },
1663 "original": {
1664 "owner": "NixOS",
1665 "repo": "nixpkgs",
1666 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1667 "type": "github"
1668 }
1669 },
1670 "nixpkgs_4": {
1671 "locked": {
1672 "lastModified": 1648725829,
1673 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
1674 "owner": "NixOS",
1675 "repo": "nixpkgs",
1676 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
1677 "type": "github"
1678 },
1679 "original": {
1680 "owner": "NixOS",
1681 "repo": "nixpkgs",
1682 "type": "github"
1683 }
1684 },
1685 "nixpkgs_5": {
1686 "locked": {
1687 "lastModified": 1693158576,
1688 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
1689 "owner": "nixos",
1690 "repo": "nixpkgs",
1691 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
1692 "type": "github"
1693 },
1694 "original": {
1695 "owner": "nixos",
1696 "ref": "nixos-unstable",
1697 "repo": "nixpkgs",
1698 "type": "github"
1699 }
1700 },
1701 "nixpkgs_6": {
1702 "flake": false,
1703 "locked": {
1704 "lastModified": 1596265691,
1705 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
1706 "owner": "NixOS",
1707 "repo": "nixpkgs",
1708 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1709 "type": "github"
1710 },
1711 "original": {
1712 "owner": "NixOS",
1713 "repo": "nixpkgs",
1714 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
1715 "type": "github"
1716 }
1717 },
1718 "nixpkgs_7": {
1719 "locked": {
1720 "lastModified": 1597943282,
1721 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1722 "owner": "NixOS",
1723 "repo": "nixpkgs",
1724 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1725 "type": "github"
1726 },
1727 "original": {
1728 "owner": "NixOS",
1729 "repo": "nixpkgs",
1730 "type": "github"
1731 }
1732 },
1733 "nixpkgs_8": {
1734 "locked": {
1735 "lastModified": 1597943282,
1736 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1737 "owner": "NixOS",
1738 "repo": "nixpkgs",
1739 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1740 "type": "github"
1741 },
1742 "original": {
1743 "owner": "NixOS",
1744 "repo": "nixpkgs",
1745 "type": "github"
1746 }
1747 },
1748 "nixpkgs_9": {
1749 "locked": {
1750 "lastModified": 1597943282,
1751 "narHash": "sha256-G/VQBlqO7YeFOSvn29RqdvABZxmQBtiRYVA6kjqWZ6o=",
1752 "owner": "NixOS",
1753 "repo": "nixpkgs",
1754 "rev": "c59ea8b8a0e7f927e7291c14ea6cd1bd3a16ff38",
1755 "type": "github"
1756 },
1757 "original": {
1758 "owner": "NixOS",
1759 "repo": "nixpkgs",
1760 "type": "github"
1761 }
1762 },
1763 "openarc": {
1764 "inputs": {
1765 "flake-utils": "flake-utils_4",
1766 "myuids": "myuids",
1767 "nixpkgs": "nixpkgs_7",
1768 "openarc": "openarc_2"
1769 },
1770 "locked": {
1771 "lastModified": 1,
1772 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
1773 "path": "../../openarc",
1774 "type": "path"
1775 },
1776 "original": {
1777 "path": "../../openarc",
1778 "type": "path"
1779 }
1780 },
1781 "openarc_2": {
1782 "flake": false,
1783 "locked": {
1784 "lastModified": 1537545083,
1785 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
1786 "owner": "trusteddomainproject",
1787 "repo": "OpenARC",
1788 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
1789 "type": "github"
1790 },
1791 "original": {
1792 "owner": "trusteddomainproject",
1793 "repo": "OpenARC",
1794 "type": "github"
1795 }
1796 },
1797 "openarc_3": {
1798 "inputs": {
1799 "flake-utils": "flake-utils_6",
1800 "myuids": "myuids_3",
1801 "nixpkgs": "nixpkgs_9",
1802 "openarc": "openarc_4"
1803 },
1804 "locked": {
1805 "lastModified": 1,
1806 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
1807 "path": "../../openarc",
1808 "type": "path"
1809 },
1810 "original": {
1811 "path": "../../openarc",
1812 "type": "path"
1813 }
1814 },
1815 "openarc_4": {
1816 "flake": false,
1817 "locked": {
1818 "lastModified": 1537545083,
1819 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
1820 "owner": "trusteddomainproject",
1821 "repo": "OpenARC",
1822 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
1823 "type": "github"
1824 },
1825 "original": {
1826 "owner": "trusteddomainproject",
1827 "repo": "OpenARC",
1828 "type": "github"
1829 }
1830 },
1831 "openarc_5": {
1832 "flake": false,
1833 "locked": {
1834 "lastModified": 1537545083,
1835 "narHash": "sha256-xUSRARC7875vFjtZ66t8KBlKmkEdIZblWHc4zqGZAQQ=",
1836 "owner": "trusteddomainproject",
1837 "repo": "OpenARC",
1838 "rev": "355ee2a1ca85acccce494478991983b54f794f4e",
1839 "type": "github"
1840 },
1841 "original": {
1842 "owner": "trusteddomainproject",
1843 "repo": "OpenARC",
1844 "type": "github"
1845 }
1846 },
1847 "opendmarc": {
1848 "inputs": {
1849 "flake-utils": "flake-utils_5",
1850 "myuids": "myuids_2",
1851 "nixpkgs": "nixpkgs_8"
1852 },
1853 "locked": {
1854 "lastModified": 1,
1855 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
1856 "path": "../../opendmarc",
1857 "type": "path"
1858 },
1859 "original": {
1860 "path": "../../opendmarc",
1861 "type": "path"
1862 }
1863 },
1864 "opendmarc_2": {
1865 "inputs": {
1866 "flake-utils": "flake-utils_7",
1867 "myuids": "myuids_4",
1868 "nixpkgs": "nixpkgs_10"
1869 },
1870 "locked": {
1871 "lastModified": 1,
1872 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
1873 "path": "../../opendmarc",
1874 "type": "path"
1875 },
1876 "original": {
1877 "path": "../../opendmarc",
1878 "type": "path"
1879 }
1880 },
1881 "paste": {
1882 "inputs": {
1883 "flake-utils": "flake-utils_8",
1884 "nixpkgs": "nixpkgs_11"
1885 },
1886 "locked": {
1887 "lastModified": 1,
1888 "narHash": "sha256-a6rqBy5/ePeKhqag8K7FtOHpYLur3Z6Yzk7uCqH522A=",
1889 "path": "../../paste",
1890 "type": "path"
1891 },
1892 "original": {
1893 "path": "../../paste",
1894 "type": "path"
1895 }
1896 },
1897 "peertube": {
1898 "flake": false,
1899 "locked": {
1900 "lastModified": 1611184594,
1901 "narHash": "sha256-1N59Dmo9zny+bZWRPiR7fXConECAw9OFcVIWMp2wois=",
1902 "ref": "gitolite_local/open_instance",
1903 "rev": "f49b8d9b697f098490e81ce0afd889ba37dcb2f3",
1904 "revCount": 6316,
1905 "type": "git",
1906 "url": "https://git.immae.eu/github/Chocobozzz/PeerTube.git"
1907 },
1908 "original": {
1909 "owner": "Chocobozzz",
1910 "ref": "v3.0.1",
1911 "repo": "PeerTube",
1912 "type": "github"
1913 }
1914 },
1915 "peertube_2": {
1916 "flake": false,
1917 "locked": {
1918 "lastModified": 1610436329,
1919 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
1920 "owner": "Chocobozzz",
1921 "repo": "PeerTube",
1922 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
1923 "type": "github"
1924 },
1925 "original": {
1926 "owner": "Chocobozzz",
1927 "ref": "v3.0.1",
1928 "repo": "PeerTube",
1929 "type": "github"
1930 }
1931 },
1932 "peertube_3": {
1933 "flake": false,
1934 "locked": {
1935 "lastModified": 1610436329,
1936 "narHash": "sha256-bIXt5bQiBBlNDFXYzcdQA8qp4nse5epUx/XQOguDOX8=",
1937 "owner": "Chocobozzz",
1938 "repo": "PeerTube",
1939 "rev": "69e0e678beb7f1a3b6753eeff585a14f9a61ea86",
1940 "type": "github"
1941 },
1942 "original": {
1943 "owner": "Chocobozzz",
1944 "ref": "v3.0.1",
1945 "repo": "PeerTube",
1946 "type": "github"
1947 }
1948 },
1949 "peertube_open_instance": {
1950 "inputs": {
1951 "flake-utils": "flake-utils_9",
1952 "myuids": "myuids_5",
1953 "nixpkgs": "nixpkgs_12",
1954 "peertube": "peertube"
1955 },
1956 "locked": {
1957 "lastModified": 1,
1958 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
1959 "path": "./../../peertube",
1960 "type": "path"
1961 },
1962 "original": {
1963 "path": "./../../peertube",
1964 "type": "path"
1965 }
1966 },
1967 "peertube_origin": {
1968 "inputs": {
1969 "flake-utils": "flake-utils_10",
1970 "myuids": "myuids_6",
1971 "nixpkgs": "nixpkgs_13",
1972 "peertube": "peertube_2"
1973 },
1974 "locked": {
1975 "lastModified": 1,
1976 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
1977 "path": "./../../peertube",
1978 "type": "path"
1979 },
1980 "original": {
1981 "path": "./../../peertube",
1982 "type": "path"
1983 }
1984 },
1985 "private-buildbot": {
1986 "inputs": {
1987 "buildslist": "buildslist",
1988 "flake-utils": "flake-utils_3",
1989 "nixpkgs": "nixpkgs_6"
1990 },
1991 "locked": {
1992 "lastModified": 1,
1993 "narHash": "sha256-LZRLA37RiN1VyKRqoAdZa9oc61PfQX7dCANSFuwuSa8=",
1994 "path": "../../flakes/private/buildbot",
1995 "type": "path"
1996 },
1997 "original": {
1998 "path": "../../flakes/private/buildbot",
1999 "type": "path"
2000 }
2001 },
2002 "private-chatons": {
2003 "inputs": {
2004 "environment": "environment"
2005 },
2006 "locked": {
2007 "lastModified": 1,
2008 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
2009 "path": "../../flakes/private/chatons",
2010 "type": "path"
2011 },
2012 "original": {
2013 "path": "../../flakes/private/chatons",
2014 "type": "path"
2015 }
2016 },
2017 "private-environment": {
2018 "locked": {
2019 "lastModified": 1,
2020 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
2021 "path": "../../flakes/private/environment",
2022 "type": "path"
2023 },
2024 "original": {
2025 "path": "../../flakes/private/environment",
2026 "type": "path"
2027 }
2028 },
2029 "private-milters": {
2030 "inputs": {
2031 "environment": "environment_2",
2032 "files-watcher": "files-watcher",
2033 "openarc": "openarc",
2034 "opendmarc": "opendmarc",
2035 "secrets": "secrets"
2036 },
2037 "locked": {
2038 "lastModified": 1,
2039 "narHash": "sha256-+FlrtZ2sR58VeLsYFeQ6ccaAiGQRFoc9ofs/X/S0Bkg=",
2040 "path": "../../flakes/private/milters",
2041 "type": "path"
2042 },
2043 "original": {
2044 "path": "../../flakes/private/milters",
2045 "type": "path"
2046 }
2047 },
2048 "private-monitoring": {
2049 "inputs": {
2050 "environment": "environment_3",
2051 "naemon": "naemon",
2052 "nixpkgs-lib": "nixpkgs-lib_2",
2053 "secrets": "secrets_2"
2054 },
2055 "locked": {
2056 "lastModified": 1,
2057 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
2058 "path": "../../flakes/private/monitoring",
2059 "type": "path"
2060 },
2061 "original": {
2062 "path": "../../flakes/private/monitoring",
2063 "type": "path"
2064 }
2065 },
2066 "private-openarc": {
2067 "inputs": {
2068 "files-watcher": "files-watcher_2",
2069 "openarc": "openarc_3",
2070 "secrets": "secrets_3"
2071 },
2072 "locked": {
2073 "lastModified": 1,
2074 "narHash": "sha256-08NmS2KKpthWHC7ob5cu1RBKA7JaPEMqcL5HHwH3vLA=",
2075 "path": "../../flakes/private/openarc",
2076 "type": "path"
2077 },
2078 "original": {
2079 "path": "../../flakes/private/openarc",
2080 "type": "path"
2081 }
2082 },
2083 "private-opendmarc": {
2084 "inputs": {
2085 "environment": "environment_4",
2086 "files-watcher": "files-watcher_3",
2087 "opendmarc": "opendmarc_2",
2088 "secrets": "secrets_4"
2089 },
2090 "locked": {
2091 "lastModified": 1,
2092 "narHash": "sha256-2lx6oVf/3OuqWdP8dHlA6f6+npwx6N/oFv/WkqIbV1Q=",
2093 "path": "../../flakes/private/opendmarc",
2094 "type": "path"
2095 },
2096 "original": {
2097 "path": "../../flakes/private/opendmarc",
2098 "type": "path"
2099 }
2100 },
2101 "private-openldap": {
2102 "locked": {
2103 "lastModified": 1,
2104 "narHash": "sha256-Z4Gg8wU/wVVQDFwWAC9k1LW+yg0xI1iNhKB51K9Gq4c=",
2105 "path": "../../flakes/private/openldap",
2106 "type": "path"
2107 },
2108 "original": {
2109 "path": "../../flakes/private/openldap",
2110 "type": "path"
2111 }
2112 },
2113 "private-paste": {
2114 "inputs": {
2115 "paste": "paste"
2116 },
2117 "locked": {
2118 "lastModified": 1,
2119 "narHash": "sha256-w8WnrSJj05Y8hJsJfY46sI6PUSg2xo5h9t0zWP4woog=",
2120 "path": "../../flakes/private/paste",
2121 "type": "path"
2122 },
2123 "original": {
2124 "path": "../../flakes/private/paste",
2125 "type": "path"
2126 }
2127 },
2128 "private-peertube": {
2129 "inputs": {
2130 "peertube_open_instance": "peertube_open_instance",
2131 "peertube_origin": "peertube_origin"
2132 },
2133 "locked": {
2134 "lastModified": 1,
2135 "narHash": "sha256-1MpzxwaZ+TZJzBf+Do/PFdI9khD1GSvfjuSC0h2Hk58=",
2136 "path": "../../flakes/private/peertube",
2137 "type": "path"
2138 },
2139 "original": {
2140 "path": "../../flakes/private/peertube",
2141 "type": "path"
2142 }
2143 },
2144 "private-php": {
2145 "inputs": {
2146 "flake-utils": "flake-utils_11",
2147 "nixpkgs": "nixpkgs_14",
2148 "nixpkgs-4": "nixpkgs-4"
2149 },
2150 "locked": {
2151 "lastModified": 1,
2152 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
2153 "path": "../../flakes/private/php",
2154 "type": "path"
2155 },
2156 "original": {
2157 "path": "../../flakes/private/php",
2158 "type": "path"
2159 }
2160 },
2161 "private-ssh": {
2162 "inputs": {
2163 "environment": "environment_5",
2164 "secrets": "secrets_5"
2165 },
2166 "locked": {
2167 "lastModified": 1,
2168 "narHash": "sha256-ckUFmIHxrUuBMxOHhzgT+4sX/ek/Op0PjdyL3NyU/Mc=",
2169 "path": "../../flakes/private/ssh",
2170 "type": "path"
2171 },
2172 "original": {
2173 "path": "../../flakes/private/ssh",
2174 "type": "path"
2175 }
2176 },
2177 "private-system": {
2178 "inputs": {
2179 "backports": "backports",
2180 "environment": "environment_6",
2181 "mypackages": "mypackages",
2182 "myuids": "myuids_7",
2183 "secrets-public": "secrets-public"
2184 },
2185 "locked": {
2186 "lastModified": 1,
2187 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
2188 "path": "../../flakes/private/system",
2189 "type": "path"
2190 },
2191 "original": {
2192 "path": "../../flakes/private/system",
2193 "type": "path"
2194 }
2195 },
2196 "public-copanier": {
2197 "inputs": {
2198 "copanier": "copanier",
2199 "flake-utils": "flake-utils_13",
2200 "nixpkgs": "nixpkgs_17"
2201 },
2202 "locked": {
2203 "lastModified": 1,
2204 "narHash": "sha256-v7ZhvU3UAmA7EtPWutYddHE84qbqWx/ugtFAEgpD4H0=",
2205 "path": "../../flakes/copanier",
2206 "type": "path"
2207 },
2208 "original": {
2209 "path": "../../flakes/copanier",
2210 "type": "path"
2211 }
2212 },
2213 "public-diaspora": {
2214 "inputs": {
2215 "diaspora": "diaspora",
2216 "flake-utils": "flake-utils_14",
2217 "myuids": "myuids_8",
2218 "nixpkgs": "nixpkgs_18"
2219 },
2220 "locked": {
2221 "lastModified": 1,
2222 "narHash": "sha256-S+ZZI5/WNGE9m5yRkOM3LlJUTrjtjzcBRLNrHi0fx6M=",
2223 "path": "../../flakes/diaspora",
2224 "type": "path"
2225 },
2226 "original": {
2227 "path": "../../flakes/diaspora",
2228 "type": "path"
2229 }
2230 },
2231 "public-etherpad-lite": {
2232 "inputs": {
2233 "etherpad-lite": "etherpad-lite",
2234 "flake-utils": "flake-utils_15",
2235 "mypackages": "mypackages_2",
2236 "nixpkgs": "nixpkgs_20"
2237 },
2238 "locked": {
2239 "lastModified": 1,
2240 "narHash": "sha256-j6p9rVNwD0C3VN65VdnF3yG8fy5S8aAsi2kRXWPd3VE=",
2241 "path": "../../flakes/etherpad-lite",
2242 "type": "path"
2243 },
2244 "original": {
2245 "path": "../../flakes/etherpad-lite",
2246 "type": "path"
2247 }
2248 },
2249 "public-fiche": {
2250 "locked": {
2251 "lastModified": 1,
2252 "narHash": "sha256-oIMKN1dD4K+5pOGugNaNNdJme5NYlYtnNd3ivvyVoJI=",
2253 "path": "../../flakes/fiche",
2254 "type": "path"
2255 },
2256 "original": {
2257 "path": "../../flakes/fiche",
2258 "type": "path"
2259 }
2260 },
2261 "public-files-watcher": {
2262 "locked": {
2263 "lastModified": 1,
2264 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
2265 "path": "../../flakes/files-watcher",
2266 "type": "path"
2267 },
2268 "original": {
2269 "path": "../../flakes/files-watcher",
2270 "type": "path"
2271 }
2272 },
2273 "public-grocy": {
2274 "inputs": {
2275 "flake-utils": "flake-utils_16",
2276 "grocy": "grocy",
2277 "mypackages": "mypackages_3",
2278 "nixpkgs": "nixpkgs_22"
2279 },
2280 "locked": {
2281 "lastModified": 1,
2282 "narHash": "sha256-Xv5wFz3A1f+jkJ1hxb6DwisBwsZxaQccp/Kwe5lqwy0=",
2283 "path": "../../flakes/grocy",
2284 "type": "path"
2285 },
2286 "original": {
2287 "path": "../../flakes/grocy",
2288 "type": "path"
2289 }
2290 },
2291 "public-loginctl-linger": {
2292 "locked": {
2293 "lastModified": 1,
2294 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
2295 "path": "../../flakes/loginctl-linger",
2296 "type": "path"
2297 },
2298 "original": {
2299 "path": "../../flakes/loginctl-linger",
2300 "type": "path"
2301 }
2302 },
2303 "public-mastodon": {
2304 "inputs": {
2305 "flake-utils": "flake-utils_17",
2306 "mastodon": "mastodon",
2307 "myuids": "myuids_9",
2308 "nixpkgs": "nixpkgs_23"
2309 },
2310 "locked": {
2311 "lastModified": 1,
2312 "narHash": "sha256-5bh3eTXdSac7Kw17+6EVmjNZpPIdGc7a3E5lb7wYn2U=",
2313 "path": "../../flakes/mastodon",
2314 "type": "path"
2315 },
2316 "original": {
2317 "path": "../../flakes/mastodon",
2318 "type": "path"
2319 }
2320 },
2321 "public-mediagoblin": {
2322 "inputs": {
2323 "flake-utils": "flake-utils_18",
2324 "mediagoblin": "mediagoblin",
2325 "myuids": "myuids_10",
2326 "nixpkgs": "nixpkgs_24"
2327 },
2328 "locked": {
2329 "lastModified": 1,
2330 "narHash": "sha256-CVFwdH+i6K9dxyniI6nUeLiNZoD17uKT1Q8/4MaiTGU=",
2331 "path": "../../flakes/mediagoblin",
2332 "type": "path"
2333 },
2334 "original": {
2335 "path": "../../flakes/mediagoblin",
2336 "type": "path"
2337 }
2338 },
2339 "public-multi-apache-container": {
2340 "inputs": {
2341 "files-watcher": "files-watcher_4",
2342 "myuids": "myuids_11"
2343 },
2344 "locked": {
2345 "lastModified": 1,
2346 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
2347 "path": "../../flakes/multi-apache-container",
2348 "type": "path"
2349 },
2350 "original": {
2351 "path": "../../flakes/multi-apache-container",
2352 "type": "path"
2353 }
2354 },
2355 "public-mypackages": {
2356 "inputs": {
2357 "flake-parts": "flake-parts_5",
2358 "nixpkgs": "nixpkgs_25",
2359 "webapps-ttrss": "webapps-ttrss_4"
2360 },
2361 "locked": {
2362 "lastModified": 1,
2363 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
2364 "path": "../../flakes/mypackages",
2365 "type": "path"
2366 },
2367 "original": {
2368 "path": "../../flakes/mypackages",
2369 "type": "path"
2370 }
2371 },
2372 "public-myuids": {
2373 "locked": {
2374 "lastModified": 1,
2375 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
2376 "path": "../../flakes/myuids",
2377 "type": "path"
2378 },
2379 "original": {
2380 "path": "../../flakes/myuids",
2381 "type": "path"
2382 }
2383 },
2384 "public-openarc": {
2385 "inputs": {
2386 "flake-utils": "flake-utils_19",
2387 "myuids": "myuids_12",
2388 "nixpkgs": "nixpkgs_26",
2389 "openarc": "openarc_5"
2390 },
2391 "locked": {
2392 "lastModified": 1,
2393 "narHash": "sha256-+X3x0t7DSYBvgFAUGNnMV4F/vQOUWE+9Q4Az6V8/iTw=",
2394 "path": "../../flakes/openarc",
2395 "type": "path"
2396 },
2397 "original": {
2398 "path": "../../flakes/openarc",
2399 "type": "path"
2400 }
2401 },
2402 "public-opendmarc": {
2403 "inputs": {
2404 "flake-utils": "flake-utils_20",
2405 "myuids": "myuids_13",
2406 "nixpkgs": "nixpkgs_27"
2407 },
2408 "locked": {
2409 "lastModified": 1,
2410 "narHash": "sha256-dDS9a1XujZU6KVCgz2RKbx2T3yT1k7z0EknUh1OyMdQ=",
2411 "path": "../../flakes/opendmarc",
2412 "type": "path"
2413 },
2414 "original": {
2415 "path": "../../flakes/opendmarc",
2416 "type": "path"
2417 }
2418 },
2419 "public-peertube": {
2420 "inputs": {
2421 "flake-utils": "flake-utils_21",
2422 "myuids": "myuids_14",
2423 "nixpkgs": "nixpkgs_28",
2424 "peertube": "peertube_3"
2425 },
2426 "locked": {
2427 "lastModified": 1,
2428 "narHash": "sha256-l+XpuMrH6I51hk37REAPVSLlbvCdad3kcDGioodzPR4=",
2429 "path": "../../flakes/peertube",
2430 "type": "path"
2431 },
2432 "original": {
2433 "path": "../../flakes/peertube",
2434 "type": "path"
2435 }
2436 },
2437 "public-secrets": {
2438 "locked": {
2439 "lastModified": 1,
2440 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2441 "path": "../../flakes/secrets",
2442 "type": "path"
2443 },
2444 "original": {
2445 "path": "../../flakes/secrets",
2446 "type": "path"
2447 }
2448 },
2449 "public-surfer": {
2450 "inputs": {
2451 "flake-utils": "flake-utils_22",
2452 "mypackages": "mypackages_4",
2453 "nixpkgs": "nixpkgs_30",
2454 "surfer": "surfer"
2455 },
2456 "locked": {
2457 "lastModified": 1,
2458 "narHash": "sha256-67TqavMsANZI6X15AFUQZ2zHSmoWJc80XaXwEGhWsRg=",
2459 "path": "../../flakes/surfer",
2460 "type": "path"
2461 },
2462 "original": {
2463 "path": "../../flakes/surfer",
2464 "type": "path"
2465 }
2466 },
2467 "public-taskwarrior-web": {
2468 "inputs": {
2469 "flake-utils": "flake-utils_23",
2470 "nixpkgs": "nixpkgs_31",
2471 "taskwarrior-web": "taskwarrior-web"
2472 },
2473 "locked": {
2474 "lastModified": 1,
2475 "narHash": "sha256-0u83WrBwbIpuyy82UK3EUqC/dgoCoDzptRe+G4VhKXo=",
2476 "path": "../../flakes/taskwarrior-web",
2477 "type": "path"
2478 },
2479 "original": {
2480 "path": "../../flakes/taskwarrior-web",
2481 "type": "path"
2482 }
2483 },
2484 "root": {
2485 "inputs": {
2486 "dns-nix": "dns-nix",
2487 "my-lib": "my-lib",
2488 "nixpkgs": "nixpkgs_5",
2489 "private-buildbot": "private-buildbot",
2490 "private-chatons": "private-chatons",
2491 "private-environment": "private-environment",
2492 "private-milters": "private-milters",
2493 "private-monitoring": "private-monitoring",
2494 "private-openarc": "private-openarc",
2495 "private-opendmarc": "private-opendmarc",
2496 "private-openldap": "private-openldap",
2497 "private-paste": "private-paste",
2498 "private-peertube": "private-peertube",
2499 "private-php": "private-php",
2500 "private-ssh": "private-ssh",
2501 "private-system": "private-system",
2502 "public-copanier": "public-copanier",
2503 "public-diaspora": "public-diaspora",
2504 "public-etherpad-lite": "public-etherpad-lite",
2505 "public-fiche": "public-fiche",
2506 "public-files-watcher": "public-files-watcher",
2507 "public-grocy": "public-grocy",
2508 "public-loginctl-linger": "public-loginctl-linger",
2509 "public-mastodon": "public-mastodon",
2510 "public-mediagoblin": "public-mediagoblin",
2511 "public-multi-apache-container": "public-multi-apache-container",
2512 "public-mypackages": "public-mypackages",
2513 "public-myuids": "public-myuids",
2514 "public-openarc": "public-openarc",
2515 "public-opendmarc": "public-opendmarc",
2516 "public-peertube": "public-peertube",
2517 "public-secrets": "public-secrets",
2518 "public-surfer": "public-surfer",
2519 "public-taskwarrior-web": "public-taskwarrior-web"
2520 }
2521 },
2522 "secrets": {
2523 "locked": {
2524 "lastModified": 1,
2525 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2526 "path": "../../secrets",
2527 "type": "path"
2528 },
2529 "original": {
2530 "path": "../../secrets",
2531 "type": "path"
2532 }
2533 },
2534 "secrets-public": {
2535 "locked": {
2536 "lastModified": 1,
2537 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2538 "path": "../../secrets",
2539 "type": "path"
2540 },
2541 "original": {
2542 "path": "../../secrets",
2543 "type": "path"
2544 }
2545 },
2546 "secrets_2": {
2547 "locked": {
2548 "lastModified": 1,
2549 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2550 "path": "../../secrets",
2551 "type": "path"
2552 },
2553 "original": {
2554 "path": "../../secrets",
2555 "type": "path"
2556 }
2557 },
2558 "secrets_3": {
2559 "locked": {
2560 "lastModified": 1,
2561 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2562 "path": "../../secrets",
2563 "type": "path"
2564 },
2565 "original": {
2566 "path": "../../secrets",
2567 "type": "path"
2568 }
2569 },
2570 "secrets_4": {
2571 "locked": {
2572 "lastModified": 1,
2573 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2574 "path": "../../secrets",
2575 "type": "path"
2576 },
2577 "original": {
2578 "path": "../../secrets",
2579 "type": "path"
2580 }
2581 },
2582 "secrets_5": {
2583 "locked": {
2584 "lastModified": 1,
2585 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
2586 "path": "../../secrets",
2587 "type": "path"
2588 },
2589 "original": {
2590 "path": "../../secrets",
2591 "type": "path"
2592 }
2593 },
2594 "stable": {
2595 "locked": {
2596 "lastModified": 1669735802,
2597 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
2598 "owner": "NixOS",
2599 "repo": "nixpkgs",
2600 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
2601 "type": "github"
2602 },
2603 "original": {
2604 "owner": "NixOS",
2605 "ref": "nixos-22.11",
2606 "repo": "nixpkgs",
2607 "type": "github"
2608 }
2609 },
2610 "surfer": {
2611 "flake": false,
2612 "locked": {
2613 "lastModified": 1588637864,
2614 "narHash": "sha256-B1Sbu1YSHj+ONSoT5v6bVlAHJWtceUV4O5huGhc8b0U=",
2615 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
2616 "revCount": 318,
2617 "type": "git",
2618 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
2619 },
2620 "original": {
2621 "rev": "476177380452c9c7c5b1624805feedc824c5995e",
2622 "type": "git",
2623 "url": "https://git.immae.eu/perso/Immae/Projets/Nodejs/Surfer.git"
2624 }
2625 },
2626 "taskwarrior-web": {
2627 "flake": false,
2628 "locked": {
2629 "lastModified": 1546434241,
2630 "narHash": "sha256-BLPBglkV1HCJECSIdyMEergChiV+rwNOClYJnzlZGQk=",
2631 "owner": "theunraveler",
2632 "repo": "taskwarrior-web",
2633 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
2634 "type": "github"
2635 },
2636 "original": {
2637 "owner": "theunraveler",
2638 "repo": "taskwarrior-web",
2639 "rev": "a79cfe2b42791b62364118e58b21b892fff6ded8",
2640 "type": "github"
2641 }
2642 },
2643 "treefmt-nix": {
2644 "inputs": {
2645 "nixpkgs": [
2646 "my-lib",
2647 "nixos-anywhere",
2648 "nixpkgs"
2649 ]
2650 },
2651 "locked": {
2652 "lastModified": 1687940979,
2653 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
2654 "owner": "numtide",
2655 "repo": "treefmt-nix",
2656 "rev": "0a4f06c27610a99080b69433873885df82003aae",
2657 "type": "github"
2658 },
2659 "original": {
2660 "owner": "numtide",
2661 "repo": "treefmt-nix",
2662 "type": "github"
2663 }
2664 },
2665 "webapps-ttrss": {
2666 "flake": false,
2667 "locked": {
2668 "lastModified": 1546759381,
2669 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2670 "ref": "master",
2671 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2672 "revCount": 9256,
2673 "type": "git",
2674 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2675 },
2676 "original": {
2677 "ref": "master",
2678 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2679 "type": "git",
2680 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2681 }
2682 },
2683 "webapps-ttrss_2": {
2684 "flake": false,
2685 "locked": {
2686 "lastModified": 1546759381,
2687 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2688 "ref": "master",
2689 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2690 "revCount": 9256,
2691 "type": "git",
2692 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2693 },
2694 "original": {
2695 "ref": "master",
2696 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2697 "type": "git",
2698 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2699 }
2700 },
2701 "webapps-ttrss_3": {
2702 "flake": false,
2703 "locked": {
2704 "lastModified": 1546759381,
2705 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2706 "ref": "master",
2707 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2708 "revCount": 9256,
2709 "type": "git",
2710 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2711 },
2712 "original": {
2713 "ref": "master",
2714 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2715 "type": "git",
2716 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2717 }
2718 },
2719 "webapps-ttrss_4": {
2720 "flake": false,
2721 "locked": {
2722 "lastModified": 1546759381,
2723 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2724 "ref": "master",
2725 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2726 "revCount": 9256,
2727 "type": "git",
2728 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2729 },
2730 "original": {
2731 "ref": "master",
2732 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2733 "type": "git",
2734 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2735 }
2736 },
2737 "webapps-ttrss_5": {
2738 "flake": false,
2739 "locked": {
2740 "lastModified": 1546759381,
2741 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
2742 "ref": "master",
2743 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2744 "revCount": 9256,
2745 "type": "git",
2746 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2747 },
2748 "original": {
2749 "ref": "master",
2750 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
2751 "type": "git",
2752 "url": "https://git.tt-rss.org/fox/tt-rss.git"
2753 }
2754 }
2755 },
2756 "root": "root",
2757 "version": 7
2758}
diff --git a/systems/eldiron/flake.nix b/systems/eldiron/flake.nix
new file mode 100644
index 0000000..790b638
--- /dev/null
+++ b/systems/eldiron/flake.nix
@@ -0,0 +1,90 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4 dns-nix.url = "github:kirelagin/dns.nix";
5 dns-nix.inputs.nixpkgs.follows = "nixpkgs";
6
7 my-lib.url = "path:../../flakes/lib";
8
9 public-etherpad-lite.url = "path:../../flakes/etherpad-lite";
10 public-grocy.url = "path:../../flakes/grocy";
11 public-openarc.url = "path:../../flakes/openarc";
12 public-opendmarc.url = "path:../../flakes/opendmarc";
13 public-peertube.url = "path:../../flakes/peertube";
14 public-diaspora.url = "path:../../flakes/diaspora";
15 public-mastodon.url = "path:../../flakes/mastodon";
16 public-mediagoblin.url = "path:../../flakes/mediagoblin";
17 public-surfer.url = "path:../../flakes/surfer";
18 public-myuids.url = "path:../../flakes/myuids";
19 public-copanier.url = "path:../../flakes/copanier";
20 public-secrets.url = "path:../../flakes/secrets";
21 public-files-watcher.url = "path:../../flakes/files-watcher";
22 public-fiche.url = "path:../../flakes/fiche";
23 public-mypackages.url = "path:../../flakes/mypackages";
24 public-loginctl-linger.url = "path:../../flakes/loginctl-linger";
25 public-multi-apache-container.url = "path:../../flakes/multi-apache-container";
26 public-taskwarrior-web.url = "path:../../flakes/taskwarrior-web";
27
28 private-peertube.url = "path:../../flakes/private/peertube";
29 private-buildbot.url = "path:../../flakes/private/buildbot";
30 private-php.url = "path:../../flakes/private/php";
31 private-environment.url = "path:../../flakes/private/environment";
32 private-openarc.url = "path:../../flakes/private/openarc";
33 private-openldap.url = "path:../../flakes/private/openldap";
34 private-opendmarc.url = "path:../../flakes/private/opendmarc";
35 private-milters.url = "path:../../flakes/private/milters";
36 private-monitoring.url = "path:../../flakes/private/monitoring";
37 private-paste.url = "path:../../flakes/private/paste";
38 private-ssh.url = "path:../../flakes/private/ssh";
39 private-chatons.url = "path:../../flakes/private/chatons";
40 private-system.url = "path:../../flakes/private/system";
41 };
42 outputs = inputs@{ self, my-lib, nixpkgs, dns-nix, ...}:
43 my-lib.lib.mkColmenaFlake {
44 name = "eldiron";
45 inherit self nixpkgs;
46 system = "x86_64-linux";
47 targetHost = "176.9.151.89";
48 targetUser = "root";
49 nixosModules = with inputs; {
50 base = ./base.nix;
51 myuids = public-myuids.nixosModule;
52 secrets = public-secrets.nixosModule;
53 loginctl-linger = public-loginctl-linger.nixosModule;
54 files-watcher = public-files-watcher.nixosModule;
55 multi-apache-container = public-multi-apache-container.nixosModule;
56 etherpad-lite = public-etherpad-lite.nixosModule;
57 mastodon = public-mastodon.nixosModule;
58 mediagoblin = public-mediagoblin.nixosModule;
59 peertube = public-peertube.nixosModule;
60 diaspora = public-diaspora.nixosModule;
61 fiche = public-fiche.nixosModule;
62
63 environment = private-environment.nixosModule;
64 openarc = private-openarc.nixosModule;
65 opendmarc = private-opendmarc.nixosModule;
66 ssh = private-ssh.nixosModule;
67 chatons = private-chatons.nixosModule;
68 system = private-system.nixosModule;
69 monitoring = private-monitoring.nixosModule;
70 paste = private-paste.nixosModule;
71 milters = private-milters.nixosModule;
72 };
73 moduleArgs = with inputs; {
74 dns-nix = dns-nix;
75 nixpkgsRaw = nixpkgs.legacyPackages.x86_64-linux;
76 mypackages-lib = public-mypackages.lib.x86_64-linux;
77 etherpad-lite = public-etherpad-lite.defaultPackage.x86_64-linux;
78 taskwarrior-web = public-taskwarrior-web.defaultPackage.x86_64-linux;
79 copanier = public-copanier.defaultPackage.x86_64-linux;
80 grocy = public-grocy.defaultPackage.x86_64-linux;
81 surfer = public-surfer.defaultPackage.x86_64-linux;
82 mediagoblin = public-mediagoblin.defaultPackage.x86_64-linux;
83 buildbot = private-buildbot.packages.x86_64-linux.buildbot-full;
84 openldap = private-openldap;
85 monitoring = private-monitoring;
86 peertube = private-peertube.packages.x86_64-linux;
87 php = private-php;
88 };
89 };
90}
diff --git a/systems/eldiron/ftp.nix b/systems/eldiron/ftp.nix
new file mode 100644
index 0000000..6aa1afc
--- /dev/null
+++ b/systems/eldiron/ftp.nix
@@ -0,0 +1,339 @@
1{ lib, pkgs, config, ... }:
2let
3 package = pkgs.pure-ftpd.override { ldapFtpId = "immaeFtp"; };
4 pure-ftpd-enabled = config.myServices.ftp.pure-ftpd.enable;
5 proftpd-enabled = config.myServices.ftp.proftpd.enable;
6in
7{
8 options = {
9 myServices.ftp.enable = lib.mkOption {
10 type = lib.types.bool;
11 default = false;
12 description = ''
13 Whether to enable ftp.
14 '';
15 };
16 myServices.ftp.pure-ftpd.enable = lib.mkOption {
17 type = lib.types.bool;
18 default = false;
19 description = ''
20 Whether to enable pure-ftpd.
21 '';
22 };
23 myServices.ftp.proftpd.enable = lib.mkOption {
24 type = lib.types.bool;
25 default = true;
26 description = ''
27 Whether to enable proftpd.
28 '';
29 };
30 };
31
32 config = lib.mkIf config.myServices.ftp.enable {
33 myServices.dns.zones."immae.eu".subdomains.ftp =
34 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
35
36 myServices.chatonsProperties.services.espace-de-stockage = {
37 file.datetime = "2022-08-22T01:00:00";
38 service = {
39 name = "Espace de stockage";
40 description = "Compte FTP/SFTP";
41 logo = if pure-ftpd-enabled
42 then "https://www.pureftpd.org/project/pure-ftpd/images/favicon.png"
43 else if proftpd-enabled
44 then "http://proftpd.org/proftpd.png"
45 else "";
46 website = "ftp.immae.eu";
47 status.level = "OK";
48 status.description = "OK";
49 registration."" = ["MEMBER" "CLIENT"];
50 registration.load = "OPEN";
51 install.type = "PACKAGE";
52 };
53 software = if pure-ftpd-enabled then {
54 name = "Pure-ftpd";
55 website = "https://www.pureftpd.org/project/pure-ftpd/";
56 license.url = "https://github.com/jedisct1/pure-ftpd/blob/master/COPYING";
57 license.name = "MIT Licence";
58 version = package.version;
59 source.url = "https://github.com/jedisct1/pure-ftpd/";
60 modules = "openssh";
61 } else if proftpd-enabled then {
62 name = "ProFTPD";
63 website = "http://proftpd.org/";
64 license.url = "https://github.com/proftpd/proftpd/blob/master/COPYING";
65 license.name = "GNU General Public License v2.0";
66 version = pkgs.proftpd.version;
67 source.url = "https://github.com/proftpd/proftpd/";
68 modules = "openssh";
69 } else {};
70 };
71 #myServices.chatonsProperties.services.ftp = {
72 # file.datetime = "2022-08-22T01:00:00";
73 # service = {
74 # name = "Comptes FTP";
75 # description = "Compte FTP/SFTP";
76 # logo = if pure-ftpd-enabled
77 # then "https://www.pureftpd.org/project/pure-ftpd/images/favicon.png"
78 # else if proftpd-enabled
79 # then "http://proftpd.org/proftpd.png"
80 # else "";
81 # website = "ftp.immae.eu";
82 # status.level = "OK";
83 # status.description = "OK";
84 # registration."" = ["MEMBER" "CLIENT"];
85 # registration.load = "OPEN";
86 # install.type = "PACKAGE";
87 # };
88 # software = if pure-ftpd-enabled then {
89 # name = "Pure-ftpd";
90 # website = "https://www.pureftpd.org/project/pure-ftpd/";
91 # license.url = "https://github.com/jedisct1/pure-ftpd/blob/master/COPYING";
92 # license.name = "MIT Licence";
93 # version = package.version;
94 # source.url = "https://github.com/jedisct1/pure-ftpd/";
95 # } else if proftpd-enabled then {
96 # name = "ProFTPD";
97 # website = "http://proftpd.org/";
98 # license.url = "https://github.com/proftpd/proftpd/blob/master/COPYING";
99 # license.name = "GNU General Public License v2.0";
100 # version = pkgs.proftpd.version;
101 # source.url = "https://github.com/proftpd/proftpd/";
102 # } else {};
103 #};
104 security.acme.certs."ftp" = {
105 domain = "eldiron.immae.eu";
106 # FIXME: make it global
107 extraLegoRunFlags = ["--preferred-chain" "ISRG Root X1"];
108 extraLegoRenewFlags = ["--preferred-chain" "ISRG Root X1"];
109 postRun = (lib.optionalString pure-ftpd-enabled ''
110 systemctl restart pure-ftpd.service
111 '') + (lib.optionalString proftpd-enabled ''
112 systemctl restart proftpd.service
113 '');
114 extraDomainNames = [ "ftp.immae.eu" ];
115 };
116
117 networking = {
118 firewall = {
119 allowedTCPPorts = [ 21 115 ];
120 allowedTCPPortRanges = [ { from = 40000; to = 50000; } ];
121 };
122 };
123
124 users.users.ftp = {
125 uid = config.ids.uids.ftp; # 8
126 group = "ftp";
127 description = "Anonymous FTP user";
128 home = "/homeless-shelter";
129 extraGroups = [ "keys" ];
130 };
131
132 users.groups.ftp.gid = config.ids.gids.ftp;
133
134 system.activationScripts.ftp = ''
135 install -m 0755 -o ftp -g ftp -d /var/lib/ftp
136 '' + (lib.optionalString proftpd-enabled ''
137 install -m 0755 -o nobody -g nogroup -d /var/lib/proftpd/authorized_keys
138 '');
139
140 secrets.keys."pure-ftpd-ldap" = lib.mkIf pure-ftpd-enabled {
141 permissions = "0400";
142 user = "ftp";
143 group = "ftp";
144 text = ''
145 LDAPServer ${config.myEnv.ftp.ldap.host}
146 LDAPPort 389
147 LDAPUseTLS True
148 LDAPBaseDN ${config.myEnv.ftp.ldap.base}
149 LDAPBindDN ${config.myEnv.ftp.ldap.dn}
150 LDAPBindPW ${config.myEnv.ftp.ldap.password}
151 LDAPDefaultUID 500
152 LDAPForceDefaultUID False
153 LDAPDefaultGID 100
154 LDAPForceDefaultGID False
155 LDAPFilter ${config.myEnv.ftp.ldap.pure-ftpd_filter}
156
157 LDAPAuthMethod BIND
158
159 # Pas de possibilite de donner l'Uid/Gid !
160 # Compile dans pure-ftpd directement avec immaeFtpUid / immaeFtpGid
161 LDAPHomeDir immaeFtpDirectory
162 '';
163 };
164 secrets.keys."proftpd-ldap.conf" = lib.mkIf proftpd-enabled {
165 permissions = "0400";
166 user = "ftp";
167 group = "ftp";
168 text = ''
169 LDAPServer ldaps://${config.myEnv.ftp.ldap.host}:636/??sub
170 LDAPUseTLS on
171 LDAPAuthBinds on
172 LDAPBindDN "${config.myEnv.ftp.ldap.dn}" "${config.myEnv.ftp.ldap.password}"
173 LDAPSearchScope subtree
174 LDAPAuthBinds on
175 LDAPDefaultGID 100
176 LDAPDefaultUID 500
177 LDAPForceDefaultUID off
178 LDAPForceDefaultGID off
179 LDAPAttr gidNumber immaeFtpGid
180 LDAPAttr uidNumber immaeFtpUid
181 LDAPAttr homeDirectory immaeFtpDirectory
182 LDAPUsers "${config.myEnv.ftp.ldap.base}" "${config.myEnv.ftp.ldap.proftpd_filter}"
183 LDAPGroups "${config.myEnv.ftp.ldap.base}"
184 '';
185 };
186
187 services.filesWatcher.pure-ftpd = lib.mkIf pure-ftpd-enabled {
188 restart = true;
189 paths = [ config.secrets.fullPaths."pure-ftpd-ldap" ];
190 };
191 services.filesWatcher.proftpd = lib.mkIf proftpd-enabled {
192 restart = true;
193 paths = [ config.secrets.fullPaths."proftpd-ldap.conf" ];
194 };
195
196 systemd.services.pure-ftpd = let
197 configFile = pkgs.writeText "pure-ftpd.conf" ''
198 PassivePortRange 40000 50000
199 Bind 42
200 ChrootEveryone yes
201 CreateHomeDir yes
202 BrokenClientsCompatibility yes
203 MaxClientsNumber 50
204 Daemonize yes
205 MaxClientsPerIP 8
206 VerboseLog no
207 DisplayDotFiles yes
208 AnonymousOnly no
209 NoAnonymous no
210 SyslogFacility ftp
211 DontResolve yes
212 MaxIdleTime 15
213 LDAPConfigFile ${config.secrets.fullPaths."pure-ftpd-ldap"}
214 LimitRecursion 10000 8
215 AnonymousCanCreateDirs no
216 MaxLoad 4
217 AntiWarez yes
218 Umask 133:022
219 # ftp
220 MinUID 8
221 AllowUserFXP no
222 AllowAnonymousFXP no
223 ProhibitDotFilesWrite no
224 ProhibitDotFilesRead no
225 AutoRename no
226 AnonymousCantUpload no
227 MaxDiskUsage 99
228 CustomerProof yes
229 TLS 1
230 CertFile ${config.security.acme.certs.ftp.directory}/full.pem
231 '';
232 in lib.mkIf pure-ftpd-enabled {
233 description = "Pure-FTPd server";
234 wantedBy = [ "multi-user.target" ];
235 after = [ "network.target" ];
236
237 serviceConfig.ExecStart = "${package}/bin/pure-ftpd ${configFile}";
238 serviceConfig.Type = "forking";
239 serviceConfig.PIDFile = "/run/pure-ftpd.pid";
240 };
241
242 systemd.services.proftpd = let
243 configFile = pkgs.writeText "proftpd.conf" ''
244 ServerName "ProFTPD"
245 ServerType standalone
246 DefaultServer on
247
248 Port 21
249 UseIPv6 on
250 Umask 022
251 MaxInstances 30
252 MaxClients 50
253 MaxClientsPerHost 8
254
255 # Set the user and group under which the server will run.
256 User ftp
257 Group ftp
258
259 CreateHome on
260 DefaultRoot ~
261
262 AllowOverwrite on
263
264 TLSEngine on
265 TLSRequired off
266 TLSProtocol TLSv1.1 TLSv1.2 TLSv1.3
267
268 TLSCertificateChainFile ${config.security.acme.certs.ftp.directory}/fullchain.pem
269 TLSECCertificateFile ${config.security.acme.certs.ftp.directory}/cert.pem
270 TLSECCertificateKeyFile ${config.security.acme.certs.ftp.directory}/key.pem
271 TLSRenegotiate none
272 PidFile /run/proftpd/proftpd.pid
273
274 ScoreboardFile /run/proftpd/proftpd.scoreboard
275
276 PassivePorts 40000 50000
277 #DebugLevel 10
278 Include ${config.secrets.fullPaths."proftpd-ldap.conf"}
279
280 RequireValidShell off
281
282 # Bar use of SITE CHMOD by default
283 <Limit SITE_CHMOD>
284 DenyAll
285 </Limit>
286
287 <VirtualHost 0.0.0.0>
288 Umask 022
289 Port 115
290 SFTPEngine on
291 CreateHome on
292 DefaultRoot ~
293
294 AllowOverwrite on
295
296 SFTPHostKey /etc/ssh/ssh_host_ed25519_key
297 SFTPHostKey /etc/ssh/ssh_host_rsa_key
298 Include ${config.secrets.fullPaths."proftpd-ldap.conf"}
299 RequireValidShell off
300 SFTPAuthorizedUserKeys file:/var/lib/proftpd/authorized_keys/%u
301 SFTPAuthMethods password publickey
302
303 SFTPOptions IgnoreSFTPSetOwners
304 AllowChrootSymlinks off
305 </VirtualHost>
306 '';
307 in lib.mkIf proftpd-enabled {
308 description = "ProFTPD server";
309 wantedBy = [ "multi-user.target" ];
310 after = [ "network.target" ];
311
312 serviceConfig.ExecStart = "${pkgs.proftpd}/bin/proftpd -c ${configFile}";
313 serviceConfig.Type = "forking";
314 serviceConfig.PIDFile = "/run/proftpd/proftpd.pid";
315 serviceConfig.RuntimeDirectory = "proftpd";
316 };
317
318 services.cron.systemCronJobs = lib.mkIf proftpd-enabled [
319 "*/2 * * * * nobody ${./ftp_sync.sh}"
320 ];
321
322 myServices.monitoring.fromMasterActivatedPlugins = [ "ftp" ];
323 myServices.monitoring.fromMasterObjects.service = [
324 {
325 service_description = "ftp has access to database for authentication";
326 host_name = config.hostEnv.fqdn;
327 use = "external-service";
328 check_command = "check_ftp_database";
329
330 servicegroups = "webstatus-remote-services";
331 _webstatus_name = "FTP";
332 _webstatus_url = "ftp.immae.eu";
333 }
334
335 ];
336
337 };
338
339}
diff --git a/systems/eldiron/ftp_sync.sh b/systems/eldiron/ftp_sync.sh
new file mode 100755
index 0000000..aff7178
--- /dev/null
+++ b/systems/eldiron/ftp_sync.sh
@@ -0,0 +1,47 @@
1#!/usr/bin/env bash
2
3LDAPSEARCH=ldapsearch
4
5LDAP_BIND="cn=ssh,ou=services,dc=immae,dc=eu"
6LDAP_PASS=$(cat /etc/ssh/ldap_password)
7LDAP_HOST="ldap://ldap.immae.eu"
8LDAP_BASE="dc=immae,dc=eu"
9LDAP_FILTER="(memberOf=cn=users,cn=ftp,ou=services,dc=immae,dc=eu)"
10
11handle_keys() {
12 uids="$1"
13 keys="$2"
14 if [ -n "$uids" ]; then
15 for uid in $uids; do
16 echo "$keys" | while read key; do
17 if [ -n "$key" ]; then
18 ssh-keygen -e -f <(echo "$key")
19 fi
20 done > /var/lib/proftpd/authorized_keys/$uid
21 done
22 fi
23}
24
25mkdir -p /var/lib/proftpd/authorized_keys
26
27while read i; do
28 if [[ "$i" =~ ^dn: ]]; then
29 handle_keys "$uids" "$keys"
30 uids=""
31 keys=""
32 fi;
33 if [[ "$i" =~ ^uid: ]]; then
34 uids="$uids ${i#uid: }"
35 fi
36 if [[ "$i" =~ ^immaeSshKey: ]]; then
37 key="${i#immaeSshKey: }"
38 if [[ "$key" =~ ^ssh- ]]; then
39 keys="$keys
40$key"
41 elif echo "$key" | cut -d" " -f1 | grep -q "\bftp\b"; then
42 keys="$keys
43$(echo "$key" | cut -d" " -f2-)"
44 fi
45 fi
46done < <(ldapsearch -H "$LDAP_HOST" -ZZ -LLL -D "$LDAP_BIND" -w "$LDAP_PASS" -b "$LDAP_BASE" -x -o ldif-wrap=no "$LDAP_FILTER" uid immaeSshKey)
47handle_keys "$uids" "$keys"
diff --git a/systems/eldiron/gemini/default.nix b/systems/eldiron/gemini/default.nix
new file mode 100644
index 0000000..600afbc
--- /dev/null
+++ b/systems/eldiron/gemini/default.nix
@@ -0,0 +1,50 @@
1{ lib, config, pkgs, ... }:
2let
3 configFile = pkgs.writeText "config.yaml" ''
4 listen: ":1965"
5 hosts:
6 immae.eu:
7 cert: /var/lib/acme/immae/full.pem
8 key: /var/lib/acme/immae/key.pem
9 paths:
10 - path: /
11 root: ${./public}
12 '';
13in
14{
15 options.myServices.gemini.enable = lib.mkEnableOption "enable Gemini capsule";
16 config = lib.mkIf config.myServices.gemini.enable {
17 security.acme.certs.immae.postRun = ''
18 systemctl restart gemini.service
19 '';
20 myServices.chatonsProperties.hostings.gemini = {
21 file.datetime = "2022-08-27T18:00:00";
22 hosting = {
23 name = "Hébergement Gemini";
24 description = "Hébergement de capsules Gemini";
25 type = "INSTANCE";
26 website = "gemini://immae.eu";
27 status.level = "OK";
28 status.description = "OK";
29 registration.load = "OPEN";
30 install.type = "PACKAGE";
31 };
32 software = {
33 name = "twins";
34 website = "https://code.rocketnine.space/tslocum/twins";
35 license.url = "https://code.rocketnine.space/tslocum/twins/src/branch/master/LICENSE";
36 license.name = "MIT License";
37 version = pkgs.twins.version;
38 source.url = "https://code.rocketnine.space/tslocum/twins";
39 };
40 };
41 networking.firewall.allowedTCPPorts = [ 1965 ];
42 systemd.services.gemini = {
43 description = "Gemini capsule server";
44 wantedBy = [ "multi-user.target" ];
45 after = [ "network.target" ];
46 serviceConfig.ExecStart = "${pkgs.twins}/bin/twins -config ${configFile}";
47 serviceConfig.Type = "simple";
48 };
49 };
50}
diff --git a/systems/eldiron/gemini/public/index.gmi b/systems/eldiron/gemini/public/index.gmi
new file mode 100644
index 0000000..034a0d9
--- /dev/null
+++ b/systems/eldiron/gemini/public/index.gmi
@@ -0,0 +1,70 @@
1# Immae
2
3## Présentation
4
5Dans le but de promouvoir la décentralisation des données personnelles et l’usage de logiciels open source, je propose un hébergement de divers services utiles. Ces services sont basés sur du code libre et déployés sur des systèmes libres également.
6
7Je suis un particulier, et dans la mesure de mes capacités, j’essaye toujours de fournir des services à ma famille et à mes amis proches en remplacement de services non libres fournis par les géants du web. J’ai décidé de faire le nécessaire pour étendre ces services à un public plus large, avec pour but de conserver une qualité suffisante.
8
9Lorsque c’est possible, les programmes que je développe sont également libres de droits (ce n’est pas toujours dépendant de ma volonté ou tributaire de ma disponibilité pour rendre le code accessible)
10
11Depuis juin 2019 je fais partie du collectif CHATONS, dont je respecte en particulier la charte:
12=> https://chatons.org CHATONS
13
14## Tarifs
15
16Je ne cherche pas à faire de profits en proposant ces services. Cependant, l’hébergement de ces services n’est pas gratuit, et maintenir ces services à un niveau de qualité suffisant demande de l’investissement en temps. Ainsi, selon l’usage désiré, le niveau de personnalisation et support dont vous avez besoin et les moyens à votre disposition et votre volonté, une participation pourra être demandée afin d’y accéder.
17=> https://www.immae.eu/licences_et_tip.html Tips
18
19## Services proposés
20
21Voici une liste non exhaustive de services que je propose :
22
23* Mastodon
24* Nextcloud
25* Calendrier/Contacts et synchronisation
26* Hébergement de vidéos (Mediagoblin)
27* Hébergement de vidéos (Peertube)
28* Kanboard
29* Flux RSS
30* "Lire plus tard" (wallabag)
31* Partage de liens (Shaarli)
32* Raccourcisseur d’URLs
33* Édition de texte collaborative
34* Réseau social
35* Hébergement de dépôts git privés et publics, gestion d’issues
36* Messagerie instantanée (XMPP/Jabber)
37* Comptes e-mails avec domaines personnalisés, IMAP/SMTP, MX backup
38* Hébergement et administration de sites web privés
39* Comptes shell protégés
40
41Un tableau de bord des services est disponible :
42=> https://tools.immae.eu Tableau de bord des services
43
44Je propose également de l’aide à distance (ou de visu si la distance est faible), pour l’usage de ces outils ou d’autres problèmes liés à l’informatique.
45
46Si vous ne voyez pas ce que vous voulez dans la liste, nous pourrons essayer de trouver une solution ensemble. Je suis ouvert aussi bien sûr à la création de nouveaux services (la liste est encore incomplète et d’autres services sont déjà prévus), dans le cadre défini en haut : basé sur des applications libres.
47
48=> https://status.immae.eu État des services
49
50## Comment faire ?
51
52Vous devez commencer par accepter les conditions générales dgutilisation :
53=> https://www.immae.eu/CGU Conditions générales d’utilisation
54Elles ne contiennent rien d’inhabituel mais elles ont été écrites par moi-même, donc sans jargon juridique. Elles vous permettront de décider si les garanties proposées sont en accord avec ce que vous pouvez vous permettre.
55
56Ensuite, contactez-moi avec vos vœux :
57=> https://www.immae.eu/contacts_fr.html Page de contact
58
59## Infrastructure et open source
60
61Dans le but de pouvoir décemment offrir une qualité de service suffisante sans pour autant y passer mes journées, l’installation des services est gérée via NixOS, permettant d’assurer la reproductibilité et l’automatisation des installations.
62
63Cette configuration est stockée publiquement dans un dépôt git, réutilisable et améliorable librement (avec probablement quelques ajustements).
64=> https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/ Dépôt git de la configuration
65
66
67=> https://www.immae.eu/contacts_fr.html Page de contact
68=> https://www.immae.eu/CGU Conditions générales d’utilisation
69=> https://www.immae.eu/mentions.html Mentions légales
70=> https://www.immae.eu/licences_et_tip.html Quelques informations sur les licences utilisées et tips
diff --git a/systems/eldiron/gitolite/default.nix b/systems/eldiron/gitolite/default.nix
new file mode 100644
index 0000000..1885234
--- /dev/null
+++ b/systems/eldiron/gitolite/default.nix
@@ -0,0 +1,127 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.gitolite;
4in {
5 options.myServices.gitolite = {
6 enable = lib.mkEnableOption "my gitolite service";
7 gitoliteDir = lib.mkOption {
8 type = lib.types.str;
9 default = "/var/lib/gitolite";
10 };
11 };
12
13 config = lib.mkIf cfg.enable {
14 myServices.dns.zones."immae.eu".subdomains.git =
15 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
16
17 myServices.chatonsProperties.services.gitolite = {
18 file.datetime = "2022-08-21T10:01:00";
19 service = {
20 name = "Gitolite";
21 description = "Gitolite allows you to setup git hosting on a central server, with fine-grained access control and many more powerful features.";
22 website = "https://git.immae.eu";
23 logo = "https://git.immae.eu/cgit-css/favicon.ico";
24 status.level = "OK";
25 status.description = "OK";
26 registration."" = ["MEMBER" "CLIENT"];
27 registration.load = "OPEN";
28 install.type = "PACKAGE";
29 guide.user = "https://www.immae.eu/docs/forge-logicielle.html";
30 };
31 software = {
32 name = "Gitolite";
33 website = "https://gitolite.com/gitolite/";
34 license.url = "https://github.com/sitaramc/gitolite/blob/master/COPYING";
35 license.name = "GNU General Public License v2.0";
36 version = pkgs.gitolite.version;
37 source.url = "https://github.com/sitaramc/gitolite";
38 };
39 };
40 myServices.ssh.modules.gitolite = {
41 snippet = builtins.readFile ./ldap_gitolite.sh;
42 dependencies = [ pkgs.gitolite ];
43 vars.ldap_group = "cn=users,cn=gitolite,ou=services,dc=immae,dc=eu";
44 vars.shell_path = "${pkgs.gitolite}/bin/gitolite-shell";
45 vars.services = let
46 toLine = login: key: ''command="${pkgs.gitolite}/bin/gitolite-shell ${login}",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty ${key}'';
47 in builtins.concatStringsSep "\n" [
48 (toLine "naemon" config.myEnv.monitoring.ssh_public_key)
49 (toLine "buildbot" config.myEnv.buildbot.ssh_key.public)
50 ];
51 };
52 networking.firewall.allowedTCPPorts = [ 9418 ];
53
54 secrets.keys."gitolite/ldap_password" = {
55 user = "gitolite";
56 group = "gitolite";
57 permissions = "0400";
58 text = config.myEnv.tools.gitolite.ldap.password;
59 };
60
61 services.gitDaemon = {
62 enable = true;
63 user = "gitolite";
64 group = "gitolite";
65 basePath = "${cfg.gitoliteDir}/repositories";
66 };
67
68 system.activationScripts.gitolite = let
69 deps = [ pkgs.openldap pkgs.stdenv.shellPackage pkgs.gnugrep pkgs.coreutils ];
70 gitolite_ldap_groups = pkgs.runCommand "gitolite_ldap_groups.sh" {
71 buildInputs = [ pkgs.makeWrapper ];
72 } ''
73 makeWrapper "${./gitolite_ldap_groups.sh}" "$out" \
74 --prefix PATH : ${lib.makeBinPath deps} \
75 --set LDAP_PASS_PATH ${config.secrets.fullPaths."gitolite/ldap_password"}
76 '';
77 in {
78 deps = [ "users" ];
79 text = ''
80 if [ -d ${cfg.gitoliteDir} ]; then
81 ln -sf ${gitolite_ldap_groups} ${cfg.gitoliteDir}/gitolite_ldap_groups.sh
82 chmod g+rx ${cfg.gitoliteDir}
83 fi
84 if [ -f ${cfg.gitoliteDir}/projects.list ]; then
85 chmod g+r ${cfg.gitoliteDir}/projects.list
86 fi
87 '';
88 };
89
90 users.users.wwwrun.extraGroups = [ "gitolite" ];
91 users.users.gitolite.extraGroups = [ "keys" ];
92
93 users.users.gitolite.packages = let
94 python-packages = python-packages: with python-packages; [
95 simplejson
96 apprise
97 sleekxmpp
98 urllib3
99 pyyaml
100 ];
101 in
102 [
103 # For some reason it absolutely wants to include "doc" output
104 ((pkgs.python39.withPackages python-packages) // { doc = ""; })
105 pkgs.nettools
106 pkgs.findutils
107 ];
108 # Installation: https://git.immae.eu/mantisbt/view.php?id=93
109 services.gitolite = {
110 enable = true;
111 adminPubkey = config.myEnv.sshd.rootKeys.immae_dilion;
112 };
113 myServices.monitoring.fromMasterActivatedPlugins = [ "git" ];
114 myServices.monitoring.fromMasterObjects.service = [
115 {
116 service_description = "gitolite is working";
117 host_name = config.hostEnv.fqdn;
118 use = "external-web-service";
119 check_command = "check_git";
120
121 servicegroups = "webstatus-remote-services";
122 _webstatus_name = "Git";
123 _webstatus_url = "git.immae.eu";
124 }
125 ];
126 };
127}
diff --git a/systems/eldiron/gitolite/gitolite_ldap_groups.sh b/systems/eldiron/gitolite/gitolite_ldap_groups.sh
new file mode 100755
index 0000000..ffa2dab
--- /dev/null
+++ b/systems/eldiron/gitolite/gitolite_ldap_groups.sh
@@ -0,0 +1,15 @@
1#!/usr/bin/env bash
2
3uid_param="$1"
4ldap_host="ldap://ldap.immae.eu"
5ldap_binddn="cn=gitolite,ou=services,dc=immae,dc=eu"
6ldap_bindpw="$(cat $LDAP_PASS_PATH)"
7ldap_searchbase="dc=immae,dc=eu"
8ldap_scope="subtree"
9
10ldap_options="-H ${ldap_host} -ZZ -x -D ${ldap_binddn} -w ${ldap_bindpw} -b ${ldap_searchbase} -s ${ldap_scope}"
11
12ldap_filter="(&(memberOf=cn=groups,cn=gitolite,ou=services,dc=immae,dc=eu)(|(member=uid=${uid_param},ou=users,dc=immae,dc=eu)(member=uid=${uid_param},ou=group_users,dc=immae,dc=eu)))"
13ldap_result=$(ldapsearch ${ldap_options} -LLL "${ldap_filter}" cn | grep 'cn:' | cut -d' ' -f2)
14
15echo "$ldap_result"
diff --git a/systems/eldiron/gitolite/ldap_gitolite.sh b/systems/eldiron/gitolite/ldap_gitolite.sh
new file mode 100644
index 0000000..75a39bf
--- /dev/null
+++ b/systems/eldiron/gitolite/ldap_gitolite.sh
@@ -0,0 +1,28 @@
1### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
2LDAP_GITOLITE_MEMBER="@gitolite_ldap_group@"
3GITOLITE_SHELL="@gitolite_shell_path@"
4
5if [[ $user == gitolite ]]; then
6 allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \
7 ldap_search '(memberOf='$LDAP_GITOLITE_MEMBER')' '' \
8 | grep ^dn \
9 | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \
10 | paste -sd,)
11
12 psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'git' = ANY(usage) AND login IN ($allowed_logins);" | while IFS='|' read user key; do
13 if [[ $user == "immae" ]] || [[ $user == "denise" ]]; then
14 # Capitalize first letter (backward compatibility)
15 user=$(sed -r 's/^([a-z])/\U\1/' <<< "$user")
16 fi
17 if [ ! -z "$key" ]; then
18 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
19 echo -n 'command="'$GITOLITE_SHELL' '$user'",no-port-forwarding,no-X11-forwarding,no-agent-forwarding,no-pty '
20 echo $key
21 fi
22 fi
23 done
24cat <<EOF
25@gitolite_services@
26EOF
27 exit 0
28fi
diff --git a/systems/eldiron/irc.nix b/systems/eldiron/irc.nix
new file mode 100644
index 0000000..c48a4b3
--- /dev/null
+++ b/systems/eldiron/irc.nix
@@ -0,0 +1,80 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.irc;
4in
5{
6 options.myServices = {
7 irc.enable = lib.mkOption {
8 type = lib.types.bool;
9 default = false;
10 description = ''
11 Whether to enable irc stuff.
12 '';
13 };
14 };
15
16 config = lib.mkIf cfg.enable {
17 myServices.dns.zones."immae.eu".subdomains.irc =
18 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
19
20 myServices.chatonsProperties.services.bitlbee = {
21 file.datetime = "2022-08-27T19:00:00";
22 service = {
23 name = "Bitlbee";
24 description = "An IRC to other chat networks gateway";
25 logo = "https://www.bitlbee.org/style/logo.png";
26 website = "irc.immae.eu";
27 status.level = "OK";
28 status.description = "OK";
29 registration."" = ["MEMBER" "CLIENT"];
30 registration.load = "FULL";
31 install.type = "PACKAGE";
32 };
33 software = {
34 name = "BitlBee";
35 website = "https://www.bitlbee.org/";
36 license.url = "https://github.com/bitlbee/bitlbee/blob/master/COPYING";
37 license.name = "GNU General Public License v2.0";
38 version = pkgs.bitlbee.version;
39 source.url = "https://github.com/bitlbee/bitlbee";
40 modules = map (a: a.pname) config.services.bitlbee.plugins
41 ++ map (a: a.pname) config.services.bitlbee.libpurple_plugins;
42 };
43 };
44 security.acme.certs."irc" = {
45 domain = "irc.immae.eu";
46 postRun = ''
47 systemctl restart stunnel.service
48 '';
49 };
50
51 networking.firewall.allowedTCPPorts = [ 6697 ];
52 services.bitlbee = with pkgs; {
53 enable = true;
54 authMode = "Registered";
55 libpurple_plugins = [
56 purple-hangouts
57 purple-matrix
58 purple-facebook
59 purple-googlechat
60 ];
61 plugins = [
62 bitlbee-mastodon
63 bitlbee-facebook
64 bitlbee-discord
65 bitlbee-steam
66 ];
67 };
68
69 services.stunnel = {
70 enable = true;
71 servers = {
72 bitlbee = {
73 accept = 6697;
74 connect = 6667;
75 cert = "${config.security.acme.certs.irc.directory}/full.pem";
76 };
77 };
78 };
79 };
80}
diff --git a/systems/eldiron/mail/default.nix b/systems/eldiron/mail/default.nix
new file mode 100644
index 0000000..4e13f6a
--- /dev/null
+++ b/systems/eldiron/mail/default.nix
@@ -0,0 +1,44 @@
1{ lib, pkgs, config, ... }:
2{
3 imports = [
4 ./postfix.nix
5 ./dovecot.nix
6 ./rspamd.nix
7 ./sympa.nix
8 ];
9
10 options.myServices.mail.enable = lib.mkEnableOption "enable Mail services";
11 config = lib.mkIf config.myServices.mail.enable {
12 myServices.mail.milters.enable = true;
13 security.acme.certs."mail" = {
14 postRun = lib.mkBefore ''
15 cp -f fullchain.pem /etc/dovecot/fullchain.pem
16 chown :dovecot2 /etc/dovecot/fullchain.pem
17 chmod a+r /etc/dovecot/fullchain.pem
18 '';
19 domain = config.hostEnv.fqdn;
20 extraDomainNames = let
21 zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) config.myServices.dns.zones);
22 mxs = map (n: "${config.hostEnv.mx.subdomain}.${n}") zonesWithMx;
23 in mxs;
24 };
25 # This is for clients that don’t support elliptic curves (e.g.
26 # printer)
27 security.acme.certs."mail-rsa" = {
28 postRun = lib.mkBefore ''
29 cp -f fullchain.pem /etc/dovecot/fullchain-rsa.pem
30 chown :dovecot2 /etc/dovecot/fullchain-rsa.pem
31 chmod a+r /etc/dovecot/fullchain-rsa.pem
32 '';
33 domain = config.hostEnv.fqdn;
34 keyType = "rsa4096";
35 extraDomainNames = let
36 zonesWithMx = builtins.attrNames (lib.filterAttrs (n: v: v.hasEmail) config.myServices.dns.zones);
37 mxs = map (n: "${config.hostEnv.mx.subdomain}.${n}") zonesWithMx;
38 in mxs;
39 };
40 systemd.slices.mail = {
41 description = "Mail slice";
42 };
43 };
44}
diff --git a/systems/eldiron/mail/dovecot.nix b/systems/eldiron/mail/dovecot.nix
new file mode 100644
index 0000000..a1282e3
--- /dev/null
+++ b/systems/eldiron/mail/dovecot.nix
@@ -0,0 +1,348 @@
1{ lib, pkgs, config, ... }:
2let
3 sieve_bin = pkgs.runCommand "sieve_bin" {
4 buildInputs = [ pkgs.makeWrapper ];
5 } ''
6 cp -a ${./sieve_bin} $out
7 chmod -R u+w $out
8 patchShebangs $out
9 for i in $out/*; do
10 wrapProgram "$i" --prefix PATH : ${lib.makeBinPath [ pkgs.coreutils ]}
11 done
12 '';
13in
14{
15 config = lib.mkIf config.myServices.mail.enable {
16 myServices.dns.zones."immae.eu".subdomains =
17 with config.myServices.dns.helpers;
18 {
19 imap = ips servers.eldiron.ips.main;
20 pop3 = ips servers.eldiron.ips.main;
21 };
22
23 myServices.chatonsProperties.services.email = {
24 file.datetime = "2022-08-22T01:00:00";
25 service = {
26 name = "E-mail account";
27 description = "Compte e-mail avec configuration imap et smtp/pop3";
28 logo = "https://www.dovecot.org/wp-content/uploads/2021/09/favicon.ico";
29 website = "https://mail.immae.eu/";
30 status.level = "OK";
31 status.description = "OK";
32 registration."" = ["MEMBER" "CLIENT"];
33 registration.load = "OPEN";
34 install.type = "PACKAGE";
35 };
36 software = {
37 name = "Dovecot";
38 website = "https://www.dovecot.org/";
39 license.url = "https://github.com/dovecot/core/blob/main/COPYING";
40 license.name = "MIT and LGPLv2.1 Licenses";
41 version = pkgs.dovecot.version;
42 source.url = "https://github.com/dovecot/core";
43 modules = ["roundcube" "rainloop"] ++ map (a: a.pname) config.services.dovecot2.modules;
44 };
45 };
46 systemd.services.dovecot2.serviceConfig.Slice = "mail.slice";
47 secrets.keys."dovecot/ldap" = {
48 user = config.services.dovecot2.user;
49 group = config.services.dovecot2.group;
50 permissions = "0400";
51 text = ''
52 hosts = ${config.myEnv.mail.dovecot.ldap.host}
53 tls = yes
54
55 dn = ${config.myEnv.mail.dovecot.ldap.dn}
56 dnpass = ${config.myEnv.mail.dovecot.ldap.password}
57
58 auth_bind = yes
59
60 ldap_version = 3
61
62 base = ${config.myEnv.mail.dovecot.ldap.base}
63 scope = subtree
64
65 pass_filter = ${config.myEnv.mail.dovecot.ldap.filter}
66 pass_attrs = ${config.myEnv.mail.dovecot.ldap.pass_attrs}
67
68 user_attrs = ${config.myEnv.mail.dovecot.ldap.user_attrs}
69 user_filter = ${config.myEnv.mail.dovecot.ldap.filter}
70 iterate_attrs = ${config.myEnv.mail.dovecot.ldap.iterate_attrs}
71 iterate_filter = ${config.myEnv.mail.dovecot.ldap.iterate_filter}
72 '';
73 };
74
75 users.users.vhost = {
76 group = "vhost";
77 uid = config.ids.uids.vhost;
78 };
79 users.groups.vhost.gid = config.ids.gids.vhost;
80 users.users."${config.services.dovecot2.user}".extraGroups = [ "acme" ];
81
82 nixpkgs.overlays = [
83 (self: super: {
84 dovecot = super.dovecot.override { openldap = self.openldap_libressl_cyrus; };
85 })
86 ];
87
88 # https://blog.zeninc.net/index.php?post/2018/04/01/Un-annuaire-pour-les-gouverner-tous.......
89 services.dovecot2 = {
90 enable = true;
91 enablePAM = false;
92 enablePop3 = true;
93 enableImap = true;
94 enableLmtp = true;
95 protocols = [ "sieve" ];
96 modules = [
97 pkgs.dovecot_pigeonhole
98 pkgs.dovecot_fts_xapian
99 ];
100 mailUser = "vhost";
101 mailGroup = "vhost";
102 createMailUser = false;
103 mailboxes = {
104 Trash = { auto = "subscribe"; specialUse = "Trash"; };
105 Junk = { auto = "subscribe"; specialUse = "Junk"; };
106 Sent = { auto = "subscribe"; specialUse = "Sent"; };
107 Drafts = { auto = "subscribe"; specialUse = "Drafts"; };
108 };
109 mailLocation = "mbox:~/Mail:INBOX=~/Mail/Inbox:INDEX=~/.imap";
110 sslServerCert = "/etc/dovecot/fullchain.pem";
111 sslServerKey = "/var/lib/acme/mail/key.pem";
112 sslCACert = "/etc/dovecot/fullchain.pem";
113 extraConfig = builtins.concatStringsSep "\n" [
114 # For printer which doesn’t support elliptic curve
115 ''
116 ssl_alt_cert = </etc/dovecot/fullchain-rsa.pem
117 ssl_alt_key = </var/lib/acme/mail-rsa/key.pem
118 ''
119
120 ''
121 postmaster_address = postmaster@immae.eu
122 mail_attribute_dict = file:%h/dovecot-attributes
123 imap_idle_notify_interval = 20 mins
124 namespace inbox {
125 type = private
126 separator = /
127 inbox = yes
128 list = yes
129 }
130 ''
131
132 # ACL
133 ''
134 mail_plugins = $mail_plugins acl
135 plugin {
136 acl = vfile:${pkgs.writeText "dovecot-acl" ''
137 Backup/* owner lrp
138 ''}
139 acl_globals_only = yes
140 }
141 ''
142
143 # Full text search
144 ''
145 # needs to be bigger than any mailbox size
146 default_vsz_limit = 2GB
147 mail_plugins = $mail_plugins fts fts_xapian
148 plugin {
149 plugin = fts fts_xapian
150 fts = xapian
151 fts_xapian = partial=2 full=20
152 fts_autoindex = yes
153 fts_autoindex_exclude = \Junk
154 fts_autoindex_exclude2 = \Trash
155 fts_autoindex_exclude3 = Virtual/*
156 }
157 ''
158
159 # Antispam
160 # https://docs.iredmail.org/dovecot.imapsieve.html
161 ''
162 # imap_sieve plugin added below
163
164 plugin {
165 sieve_plugins = sieve_imapsieve sieve_extprograms
166 imapsieve_url = sieve://127.0.0.1:4190
167
168 sieve_before = file:${./sieve_scripts}/backup.sieve;bindir=/var/lib/vhost/.sieve_bin
169
170 # From elsewhere to Junk folder
171 imapsieve_mailbox1_name = Junk
172 imapsieve_mailbox1_causes = COPY APPEND
173 imapsieve_mailbox1_before = file:${./sieve_scripts}/report_spam.sieve;bindir=/var/lib/vhost/.imapsieve_bin
174
175 # From Junk folder to elsewhere
176 imapsieve_mailbox2_name = *
177 imapsieve_mailbox2_from = Junk
178 imapsieve_mailbox2_causes = COPY
179 imapsieve_mailbox2_before = file:${./sieve_scripts}/report_ham.sieve;bindir=/var/lib/vhost/.imapsieve_bin
180
181 # From anywhere to NoJunk folder
182 imapsieve_mailbox3_name = NoJunk
183 imapsieve_mailbox3_causes = COPY APPEND
184 imapsieve_mailbox3_before = file:${./sieve_scripts}/report_ham.sieve;bindir=/var/lib/vhost/.imapsieve_bin
185
186 sieve_pipe_bin_dir = ${sieve_bin}
187
188 sieve_global_extensions = +vnd.dovecot.pipe +vnd.dovecot.environment
189 }
190 ''
191 # Services to listen
192 ''
193 service imap-login {
194 inet_listener imap {
195 }
196 inet_listener imaps {
197 }
198 }
199 service pop3-login {
200 inet_listener pop3 {
201 }
202 inet_listener pop3s {
203 }
204 }
205 service imap {
206 }
207 service pop3 {
208 }
209 service auth {
210 unix_listener auth-userdb {
211 }
212 unix_listener ${config.services.postfix.config.queue_directory}/private/auth {
213 mode = 0666
214 }
215 }
216 service auth-worker {
217 }
218 service dict {
219 unix_listener dict {
220 }
221 }
222 service stats {
223 unix_listener stats-reader {
224 user = vhost
225 group = vhost
226 mode = 0660
227 }
228 unix_listener stats-writer {
229 user = vhost
230 group = vhost
231 mode = 0660
232 }
233 }
234 ''
235
236 # Authentification
237 ''
238 first_valid_uid = ${toString config.ids.uids.vhost}
239 disable_plaintext_auth = yes
240 passdb {
241 driver = ldap
242 args = ${config.secrets.fullPaths."dovecot/ldap"}
243 }
244 userdb {
245 driver = ldap
246 args = ${config.secrets.fullPaths."dovecot/ldap"}
247 }
248 ''
249
250 # Zlib
251 ''
252 mail_plugins = $mail_plugins zlib
253 plugin {
254 zlib_save_level = 6
255 zlib_save = gz
256 }
257 ''
258
259 # Sieve
260 ''
261 plugin {
262 sieve = file:~/sieve;bindir=~/.sieve-bin;active=~/.dovecot.sieve
263 }
264 service managesieve-login {
265 }
266 service managesieve {
267 }
268 ''
269
270 # Virtual mailboxes
271 ''
272 mail_plugins = $mail_plugins virtual
273 namespace Virtual {
274 prefix = Virtual/
275 location = virtual:~/Virtual
276 }
277 ''
278
279 # Protocol specific configuration
280 # Needs to come last if there are mail_plugins entries
281 ''
282 protocol imap {
283 mail_plugins = $mail_plugins imap_sieve imap_acl
284 }
285 protocol lda {
286 mail_plugins = $mail_plugins sieve
287 }
288 ''
289 ];
290 };
291 networking.firewall.allowedTCPPorts = [ 110 143 993 995 4190 ];
292 system.activationScripts.dovecot = {
293 deps = [ "users" ];
294 text =''
295 install -m 0755 -o vhost -g vhost -d /var/lib/vhost
296 '';
297 };
298
299 services.cron.systemCronJobs = let
300 cron_script = pkgs.writeScriptBin "cleanup-imap-folders" ''
301 ${pkgs.dovecot}/bin/doveadm expunge -A MAILBOX "Backup/*" NOT FLAGGED BEFORE 8w 2>&1 > /dev/null | grep -v "Mailbox doesn't exist:" | grep -v "Info: Opening DB"
302 ${pkgs.dovecot}/bin/doveadm expunge -A MAILBOX Junk SEEN NOT FLAGGED BEFORE 4w 2>&1 > /dev/null | grep -v "Mailbox doesn't exist:" | grep -v "Info: Opening DB"
303 ${pkgs.dovecot}/bin/doveadm expunge -A MAILBOX Trash NOT FLAGGED BEFORE 4w 2>&1 > /dev/null | grep -v "Mailbox doesn't exist:" | grep -v "Info: Opening DB"
304 '';
305 in
306 [
307 "0 2 * * * root ${cron_script}/bin/cleanup-imap-folders"
308 ];
309 security.acme.certs."mail-rsa" = {
310 postRun = ''
311 systemctl restart dovecot2.service
312 '';
313 extraDomainNames = [ "imap.immae.eu" "pop3.immae.eu" ];
314 };
315 security.acme.certs."mail" = {
316 postRun = ''
317 systemctl restart dovecot2.service
318 '';
319 extraDomainNames = [ "imap.immae.eu" "pop3.immae.eu" ];
320 };
321 myServices.monitoring.fromMasterActivatedPlugins = [ "imap" "tcp" ];
322 myServices.monitoring.fromMasterObjects.service = [
323 {
324 service_description = "imap connection works";
325 host_name = config.hostEnv.fqdn;
326 use = "external-service";
327 check_command = "check_imap_connection";
328
329 servicegroups = "webstatus-remote-services,webstatus-email";
330 _webstatus_name = "IMAP";
331 _webstatus_url = "imap.immae.eu";
332 }
333
334 {
335 service_description = "imap SSL is up to date";
336 host_name = config.hostEnv.fqdn;
337 use = "external-service";
338 check_command = ["check_tcp_ssl" "993"];
339
340 servicegroups = "webstatus-ssl";
341 _webstatus_name = "IMAP";
342 _webstatus_url = "imap.immae.eu";
343 }
344
345 ];
346 };
347}
348
diff --git a/systems/eldiron/mail/postfix.nix b/systems/eldiron/mail/postfix.nix
new file mode 100644
index 0000000..f95ee1b
--- /dev/null
+++ b/systems/eldiron/mail/postfix.nix
@@ -0,0 +1,497 @@
1{ lib, pkgs, config, options, ... }:
2let
3 getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) (lib.filterAttrs (n: v: v.receive) p.emailPolicies);
4 bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones;
5 receiving_domains = lib.flatten (builtins.attrValues bydomain);
6in
7{
8 options.services.postfix.submissionOptions' = options.services.postfix.submissionOptions // {
9 type = with lib.types; attrsOf (either str (listOf str));
10 apply = builtins.mapAttrs (n: v: if builtins.isList v then builtins.concatStringsSep "," v else v);
11 };
12 config = lib.mkIf config.myServices.mail.enable {
13 myServices.dns.zones."immae.eu" = with config.myServices.dns.helpers; lib.mkMerge [
14 mailMX
15 (mailCommon "immae.eu")
16 mailSend
17 {
18 # Virtual forwards and mailboxes for real users
19 emailPolicies."mail".receive = true;
20 # multi-domain generic mails:
21 # hostmaster, cron, httpd, naemon, postmaster
22 # system virtual mailboxes:
23 # devnull, printer, testconnect
24 emailPolicies."".receive = true;
25 subdomains.mail = lib.mkMerge [ (mailCommon "immae.eu") mailSend ];
26 subdomains.smtp = ips servers.eldiron.ips.main;
27
28 # DMARC reports
29 subdomains._dmarc.subdomains._report.subdomains = let
30 getDomains = p: lib.mapAttrsToList (n: v: v.fqdn) p.emailPolicies;
31 bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones;
32 hostsWithMail = lib.flatten (builtins.attrValues bydomain);
33 nvpairs = builtins.map (e: { name = e; value = { TXT = [ "v=DMARC1;" ]; }; }) hostsWithMail;
34 in
35 builtins.listToAttrs nvpairs;
36 }
37 ];
38
39 myServices.chatonsProperties.hostings.mx-backup = {
40 file.datetime = "2022-08-22T01:00:00";
41 hosting = {
42 name = "MX Backup";
43 description = "Serveur e-mail secondaire";
44 logo = "https://www.postfix.org/favicon.ico";
45 website = "https://mail.immae.eu/";
46 status.level = "OK";
47 status.description = "OK";
48 registration.load = "OPEN";
49 install.type = "PACKAGE";
50 };
51 software = {
52 name = "Postfix";
53 website = "http://www.postfix.org/";
54 license.url = "http://postfix.mirrors.ovh.net/postfix-release/LICENSE";
55 license.name = "Eclipse Public license (EPL 2.0) and IBM Public License (IPL 1.0)";
56 version = pkgs.postfix.version;
57 source.url = "http://www.postfix.org/download.html";
58 };
59 };
60 secrets.keys = {
61 "postfix/mysql_alias_maps" = {
62 user = config.services.postfix.user;
63 group = config.services.postfix.group;
64 permissions = "0440";
65 text = ''
66 # We need to specify that option to trigger ssl connection
67 tls_ciphers = TLSv1.2
68 user = ${config.myEnv.mail.postfix.mysql.user}
69 password = ${config.myEnv.mail.postfix.mysql.password}
70 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
71 dbname = ${config.myEnv.mail.postfix.mysql.database}
72 query = SELECT DISTINCT destination
73 FROM forwardings
74 WHERE
75 ((regex = 1 AND '%s' REGEXP CONCAT('^',source,'$') ) OR (regex = 0 AND source = '%s'))
76 AND active = 1
77 AND '%s' NOT IN
78 (
79 SELECT source
80 FROM forwardings_blacklisted
81 WHERE source = '%s'
82 ) UNION
83 SELECT 'devnull@immae.eu'
84 FROM forwardings_blacklisted
85 WHERE source = '%s'
86 '';
87 };
88 "postfix/ldap_mailboxes" = {
89 user = config.services.postfix.user;
90 group = config.services.postfix.group;
91 permissions = "0440";
92 text = ''
93 server_host = ldaps://${config.myEnv.mail.dovecot.ldap.host}:636
94 search_base = ${config.myEnv.mail.dovecot.ldap.base}
95 query_filter = ${config.myEnv.mail.dovecot.ldap.postfix_mailbox_filter}
96 bind_dn = ${config.myEnv.mail.dovecot.ldap.dn}
97 bind_pw = ${config.myEnv.mail.dovecot.ldap.password}
98 result_attribute = immaePostfixAddress
99 result_format = dummy
100 version = 3
101 '';
102 };
103 "postfix/mysql_sender_login_maps" = {
104 user = config.services.postfix.user;
105 group = config.services.postfix.group;
106 permissions = "0440";
107 text = ''
108 # We need to specify that option to trigger ssl connection
109 tls_ciphers = TLSv1.2
110 user = ${config.myEnv.mail.postfix.mysql.user}
111 password = ${config.myEnv.mail.postfix.mysql.password}
112 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
113 dbname = ${config.myEnv.mail.postfix.mysql.database}
114 query = SELECT DISTINCT destination
115 FROM forwardings
116 WHERE
117 (
118 (regex = 1 AND CONCAT(SUBSTRING_INDEX('%u', '+', 1), '@%d') REGEXP CONCAT('^',source,'$') )
119 OR
120 (regex = 0 AND source = CONCAT(SUBSTRING_INDEX('%u', '+', 1), '@%d'))
121 )
122 AND active = 1
123 UNION SELECT CONCAT(SUBSTRING_INDEX('%u', '+', 1), '@%d') AS destination
124 '';
125 };
126 "postfix/mysql_sender_relays_maps" = {
127 user = config.services.postfix.user;
128 group = config.services.postfix.group;
129 permissions = "0440";
130 text = ''
131 # We need to specify that option to trigger ssl connection
132 tls_ciphers = TLSv1.2
133 user = ${config.myEnv.mail.postfix.mysql.user}
134 password = ${config.myEnv.mail.postfix.mysql.password}
135 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
136 dbname = ${config.myEnv.mail.postfix.mysql.database}
137 # INSERT INTO sender_relays
138 # (`from`, owner, relay, login, password, regex, active)
139 # VALUES
140 # ( 'sender@otherhost.org'
141 # , 'me@mail.immae.eu'
142 # , '[otherhost.org]:587'
143 # , 'otherhostlogin'
144 # , AES_ENCRYPT('otherhostpassword', '${config.myEnv.mail.postfix.mysql.password_encrypt}')
145 # , '0'
146 # , '1');
147
148 query = SELECT DISTINCT `owner`
149 FROM sender_relays
150 WHERE
151 ((regex = 1 AND '%s' REGEXP CONCAT('^',`from`,'$') ) OR (regex = 0 AND `from` = '%s'))
152 AND active = 1
153 '';
154 };
155 "postfix/mysql_sender_relays_hosts" = {
156 user = config.services.postfix.user;
157 group = config.services.postfix.group;
158 permissions = "0440";
159 text = ''
160 # We need to specify that option to trigger ssl connection
161 tls_ciphers = TLSv1.2
162 user = ${config.myEnv.mail.postfix.mysql.user}
163 password = ${config.myEnv.mail.postfix.mysql.password}
164 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
165 dbname = ${config.myEnv.mail.postfix.mysql.database}
166
167 query = SELECT DISTINCT relay
168 FROM sender_relays
169 WHERE
170 ((regex = 1 AND '%s' REGEXP CONCAT('^',`from`,'$') ) OR (regex = 0 AND `from` = '%s'))
171 AND active = 1
172 '';
173 };
174 "postfix/mysql_sender_relays_creds" = {
175 user = config.services.postfix.user;
176 group = config.services.postfix.group;
177 permissions = "0440";
178 text = ''
179 # We need to specify that option to trigger ssl connection
180 tls_ciphers = TLSv1.2
181 user = ${config.myEnv.mail.postfix.mysql.user}
182 password = ${config.myEnv.mail.postfix.mysql.password}
183 hosts = unix:${config.myEnv.mail.postfix.mysql.socket}
184 dbname = ${config.myEnv.mail.postfix.mysql.database}
185
186 query = SELECT DISTINCT CONCAT(`login`, ':', AES_DECRYPT(`password`, '${config.myEnv.mail.postfix.mysql.password_encrypt}'))
187 FROM sender_relays
188 WHERE
189 ((regex = 1 AND '%s' REGEXP CONCAT('^',`from`,'$') ) OR (regex = 0 AND `from` = '%s'))
190 AND active = 1
191 '';
192 };
193 "postfix/ldap_ejabberd_users_immae_fr" = {
194 user = config.services.postfix.user;
195 group = config.services.postfix.group;
196 permissions = "0440";
197 text = ''
198 server_host = ldaps://${config.myEnv.jabber.ldap.host}:636
199 search_base = ${config.myEnv.jabber.ldap.base}
200 query_filter = ${config.myEnv.jabber.postfix_user_filter}
201 domain = immae.fr
202 bind_dn = ${config.myEnv.jabber.ldap.dn}
203 bind_pw = ${config.myEnv.jabber.ldap.password}
204 result_attribute = immaeXmppUid
205 result_format = ejabberd@localhost
206 version = 3
207 '';
208 };
209 };
210
211 networking.firewall.allowedTCPPorts = [ 25 465 587 ];
212
213 users.users.postfixscripts = {
214 group = "keys";
215 uid = config.ids.uids.postfixscripts;
216 description = "Postfix scripts user";
217 };
218 users.users."${config.services.postfix.user}".extraGroups = [ "keys" ];
219 services.filesWatcher.postfix = {
220 restart = true;
221 paths = [
222 config.secrets.fullPaths."postfix/mysql_alias_maps"
223 config.secrets.fullPaths."postfix/ldap_mailboxes"
224 config.secrets.fullPaths."postfix/mysql_sender_login_maps"
225 config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"
226 ];
227 };
228 services.postfix = {
229 extraAliases = let
230 testmail = pkgs.writeScript "testmail" ''
231 #! ${pkgs.stdenv.shell}
232 ${pkgs.coreutils}/bin/touch \
233 "/var/lib/naemon/checks/email/$(${pkgs.procmail}/bin/formail -x To: | ${pkgs.coreutils}/bin/tr -d ' <>')"
234 '';
235 in
236 ''testmail: "|${testmail}"'';
237 mapFiles = let
238 virtual_map = {
239 virtual = let
240 cfg = config.myEnv.monitoring.email_check.eldiron;
241 address = "${cfg.mail_address}@${cfg.mail_domain}";
242 aliases = config.myEnv.mail.postfix.common_aliases;
243 admins = builtins.concatStringsSep "," config.myEnv.mail.postfix.admins;
244 in pkgs.writeText "postfix-virtual" (
245 builtins.concatStringsSep "\n" (
246 [ "${address} testmail@localhost"
247 ] ++
248 map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases
249 ++ lib.lists.flatten (
250 map (domain:
251 map (alias: "${alias}@${domain} ${admins}") aliases
252 ) receiving_domains
253 )
254 ));
255 };
256 sasl_access = {
257 host_sender_login = with lib.attrsets; let
258 addresses = zipAttrs (lib.flatten (mapAttrsToList
259 (n: v: (map (e: { "${e}" = "${n}@immae.eu"; }) v.emails)) config.myEnv.servers));
260 aliases = config.myEnv.mail.postfix.common_aliases;
261 joined = builtins.concatStringsSep ",";
262 admins = joined config.myEnv.mail.postfix.admins;
263 in pkgs.writeText "host-sender-login"
264 (builtins.concatStringsSep "\n" (
265 mapAttrsToList (n: v: "${n} ${joined v}") addresses
266 ++ lib.lists.flatten (
267 map (domain:
268 map (alias: "${alias}@${domain} ${admins}") aliases
269 ) receiving_domains
270 )
271 ++ map (a: "${a} ${admins}") config.myEnv.mail.postfix.other_aliases
272 ));
273 };
274 in
275 virtual_map // sasl_access;
276 config = {
277 ### postfix module overrides
278 readme_directory = "${pkgs.postfix}/share/postfix/doc";
279 smtp_tls_CAfile = lib.mkForce "";
280 smtp_tls_cert_file = lib.mkForce "";
281 smtp_tls_key_file = lib.mkForce "";
282
283 message_size_limit = "1073741824"; # Don't put 0 here, it's not equivalent to "unlimited"
284 mailbox_size_limit = "1073741825"; # Workaround, local delivered mails should all go through scripts
285 alias_database = "\$alias_maps";
286
287 ### Aliases scripts user
288 default_privs = "postfixscripts";
289
290 ### Virtual mailboxes config
291 virtual_alias_maps = [
292 "hash:/etc/postfix/virtual"
293 "mysql:${config.secrets.fullPaths."postfix/mysql_alias_maps"}"
294 "ldap:${config.secrets.fullPaths."postfix/ldap_ejabberd_users_immae_fr"}"
295 ];
296 virtual_mailbox_domains = receiving_domains;
297 virtual_mailbox_maps = [
298 "ldap:${config.secrets.fullPaths."postfix/ldap_mailboxes"}"
299 ];
300 dovecot_destination_recipient_limit = "1";
301 virtual_transport = "dovecot";
302
303 ### Relay domains
304 smtpd_relay_restrictions = [
305 "defer_unauth_destination"
306 ];
307
308 ### Additional smtpd configuration
309 smtpd_tls_received_header = "yes";
310 smtpd_tls_loglevel = "1";
311
312 ### Email sending configuration
313 smtp_tls_security_level = "may";
314 smtp_tls_loglevel = "1";
315
316 ### Force ip bind for smtp
317 smtp_bind_address = builtins.head config.hostEnv.ips.main.ip4;
318 smtp_bind_address6 = builtins.head config.hostEnv.ips.main.ip6;
319
320 # Use some relays when authorized senders are not myself
321 smtp_sasl_mechanism_filter = [
322 "plain"
323 "login"
324 ]; # GSSAPI Not correctly supported by postfix
325 smtp_sasl_auth_enable = "yes";
326 smtp_sasl_password_maps = [
327 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_creds"}"
328 ];
329 smtp_sasl_security_options = "noanonymous";
330 smtp_sender_dependent_authentication = "yes";
331 sender_dependent_relayhost_maps = [
332 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_hosts"}"
333 ];
334
335 ### opendkim, opendmarc, openarc milters
336 non_smtpd_milters = [
337 "unix:${config.myServices.mail.milters.sockets.opendkim}"
338 ];
339 smtpd_milters = [
340 "unix:${config.myServices.mail.milters.sockets.opendkim}"
341 "unix:${config.myServices.mail.milters.sockets.openarc}"
342 "unix:${config.myServices.mail.milters.sockets.opendmarc}"
343 ];
344
345 smtp_use_tls = true;
346 smtpd_use_tls = true;
347 smtpd_tls_chain_files = [
348 "/var/lib/acme/mail/full.pem"
349 "/var/lib/acme/mail-rsa/full.pem"
350 ];
351
352 maximal_queue_lifetime = "6w";
353 bounce_queue_lifetime = "6w";
354 };
355 enable = true;
356 enableSmtp = true;
357 enableSubmission = true;
358 submissionOptions = config.services.postfix.submissionOptions';
359 submissionOptions' = {
360 # Don’t use "long form", only commas (cf
361 # http://www.postfix.org/master.5.html long form is not handled
362 # well by the submission function)
363 smtpd_tls_security_level = "encrypt";
364 smtpd_sasl_auth_enable = "yes";
365 smtpd_tls_auth_only = "yes";
366 smtpd_sasl_tls_security_options = "noanonymous";
367 smtpd_sasl_type = "dovecot";
368 smtpd_sasl_path = "private/auth";
369 smtpd_reject_unlisted_recipient = "no";
370 smtpd_client_restrictions = [
371 "permit_sasl_authenticated"
372 "reject"
373 ];
374 smtpd_relay_restrictions = [
375 "permit_sasl_authenticated"
376 "reject"
377 ];
378 # Refuse to send e-mails with a From that is not handled
379 smtpd_sender_restrictions = [
380 "reject_sender_login_mismatch"
381 "reject_unlisted_sender"
382 "permit_sasl_authenticated,reject"
383 ];
384 smtpd_sender_login_maps = [
385 "hash:/etc/postfix/host_sender_login"
386 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_relays_maps"}"
387 "mysql:${config.secrets.fullPaths."postfix/mysql_sender_login_maps"}"
388 ];
389 smtpd_recipient_restrictions = [
390 "permit_sasl_authenticated"
391 "reject"
392 ];
393 milter_macro_daemon_name = "ORIGINATING";
394 smtpd_milters = [
395 # FIXME: put it back when opensmtpd is upgraded and able to
396 # rewrite the from header
397 #"unix:/run/milter_verify_from/verify_from.sock"
398 "unix:${config.myServices.mail.milters.sockets.opendkim}"
399 ];
400 };
401 destination = ["localhost"];
402 # This needs to reverse DNS
403 hostname = config.hostEnv.fqdn;
404 setSendmail = true;
405 recipientDelimiter = "+";
406 masterConfig = {
407 submissions = {
408 type = "inet";
409 private = false;
410 command = "smtpd";
411 args = ["-o" "smtpd_tls_wrappermode=yes" ] ++ (let
412 mkKeyVal = opt: val: [ "-o" (opt + "=" + val) ];
413 in lib.concatLists (lib.mapAttrsToList mkKeyVal config.services.postfix.submissionOptions)
414 );
415 };
416 dovecot = {
417 type = "unix";
418 privileged = true;
419 chroot = false;
420 command = "pipe";
421 args = let
422 # rspamd could be used as a milter, but then it cannot apply
423 # its checks "per user" (milter is not yet dispatched to
424 # users), so we wrap dovecot-lda inside rspamc per recipient
425 # here.
426 rspamc_dovecot = pkgs.writeScriptBin "rspamc_dovecot" ''
427 #! ${pkgs.stdenv.shell}
428 set -o pipefail
429 sender="$1"
430 original_recipient="$2"
431 user="$3"
432
433 ${pkgs.coreutils}/bin/cat - | \
434 ${pkgs.rspamd}/bin/rspamc -h ${config.myServices.mail.rspamd.sockets.worker-controller} -c bayes -d "$user" --mime | \
435 ${pkgs.dovecot}/libexec/dovecot/dovecot-lda -f "$sender" -a "$original_recipient" -d "$user"
436 if echo ''${PIPESTATUS[@]} | ${pkgs.gnugrep}/bin/grep -qE '^[0 ]+$'; then
437 exit 0
438 else
439 # src/global/sys_exits.h to retry
440 exit 75
441 fi
442 '';
443 in [
444 "flags=ODRhu" "user=vhost:vhost"
445 "argv=${rspamc_dovecot}/bin/rspamc_dovecot \${sender} \${original_recipient} \${user}@\${nexthop}"
446 ];
447 };
448 };
449 };
450 security.acme.certs."mail" = {
451 postRun = ''
452 systemctl restart postfix.service
453 '';
454 extraDomainNames = [ "smtp.immae.eu" ];
455 };
456 security.acme.certs."mail-rsa" = {
457 postRun = ''
458 systemctl restart postfix.service
459 '';
460 extraDomainNames = [ "smtp.immae.eu" ];
461 };
462 system.activationScripts.testmail = {
463 deps = [ "users" ];
464 text = let
465 allCfg = config.myEnv.monitoring.email_check;
466 cfg = allCfg.eldiron;
467 reverseTargets = builtins.attrNames (lib.attrsets.filterAttrs (k: v: builtins.elem "eldiron" v.targets) allCfg);
468 to_email = cfg': host':
469 let sep = if lib.strings.hasInfix "+" cfg'.mail_address then "_" else "+";
470 in "${cfg'.mail_address}${sep}${host'}@${cfg'.mail_domain}";
471 mails_to_receive = builtins.concatStringsSep " " (map (to_email cfg) reverseTargets);
472 in ''
473 install -m 0555 -o postfixscripts -g keys -d /var/lib/naemon/checks/email
474 for f in ${mails_to_receive}; do
475 if [ ! -f /var/lib/naemon/checks/email/$f ]; then
476 install -m 0644 -o postfixscripts -g keys /dev/null -T /var/lib/naemon/checks/email/$f
477 touch -m -d @0 /var/lib/naemon/checks/email/$f
478 fi
479 done
480 '';
481 };
482 systemd.services.postfix.serviceConfig.Slice = "mail.slice";
483
484 myServices.monitoring.fromMasterObjects.service = [
485 {
486 service_description = "postfix SSL is up to date";
487 host_name = config.hostEnv.fqdn;
488 use = "external-service";
489 check_command = "check_smtp";
490
491 servicegroups = "webstatus-ssl";
492 _webstatus_name = "SMTP";
493 _webstatus_url = "smtp.immae.eu";
494 }
495 ];
496 };
497}
diff --git a/systems/eldiron/mail/rspamd.nix b/systems/eldiron/mail/rspamd.nix
new file mode 100644
index 0000000..a300cc5
--- /dev/null
+++ b/systems/eldiron/mail/rspamd.nix
@@ -0,0 +1,88 @@
1{ lib, pkgs, config, ... }:
2{
3 options.myServices.mail.rspamd.sockets = lib.mkOption {
4 type = lib.types.attrsOf lib.types.path;
5 default = {
6 worker-controller = "/run/rspamd/worker-controller.sock";
7 };
8 readOnly = true;
9 description = ''
10 rspamd sockets
11 '';
12 };
13 config = lib.mkIf config.myServices.mail.enable {
14 services.cron.systemCronJobs = let
15 cron_script = pkgs.runCommand "cron_script" {
16 buildInputs = [ pkgs.makeWrapper ];
17 } ''
18 mkdir -p $out
19 cp ${./scan_reported_mails} $out/scan_reported_mails
20 patchShebangs $out
21 for i in $out/*; do
22 wrapProgram "$i" --prefix PATH : ${lib.makeBinPath [ pkgs.coreutils pkgs.rspamd pkgs.flock ]}
23 done
24 '';
25 in
26 [ "*/20 * * * * vhost ${cron_script}/scan_reported_mails" ];
27
28 systemd.services.rspamd.serviceConfig.Slice = "mail.slice";
29 systemd.services.rspamd.serviceConfig.SupplementaryGroups = [ "vhost" ];
30 services.rspamd = {
31 enable = true;
32 debug = false;
33 overrides = {
34 "actions.conf".text = ''
35 reject = null;
36 add_header = 6;
37 greylist = null;
38 '';
39 "milter_headers.conf".text = ''
40 extended_spam_headers = true;
41 '';
42 };
43 locals = {
44 "redis.conf".text = ''
45 servers = "${config.myEnv.mail.rspamd.redis.socket}";
46 db = "${config.myEnv.mail.rspamd.redis.db}";
47 '';
48 "classifier-bayes.conf".text = ''
49 users_enabled = true;
50 backend = "redis";
51 servers = "${config.myEnv.mail.rspamd.redis.socket}";
52 database = "${config.myEnv.mail.rspamd.redis.db}";
53 autolearn = true;
54 cache {
55 backend = "redis";
56 }
57 new_schema = true;
58 statfile {
59 BAYES_HAM {
60 spam = false;
61 }
62 BAYES_SPAM {
63 spam = true;
64 }
65 }
66 '';
67 };
68 workers = {
69 controller = {
70 extraConfig = ''
71 enable_password = "${config.myEnv.mail.rspamd.write_password_hashed}";
72 password = "${config.myEnv.mail.rspamd.read_password_hashed}";
73 '';
74 bindSockets = [ {
75 socket = config.myServices.mail.rspamd.sockets.worker-controller;
76 mode = "0660";
77 owner = config.services.rspamd.user;
78 group = "vhost";
79 } ];
80 };
81 };
82 postfix = {
83 enable = true;
84 config = {};
85 };
86 };
87 };
88}
diff --git a/systems/eldiron/mail/scan_reported_mails b/systems/eldiron/mail/scan_reported_mails
new file mode 100755
index 0000000..fe9f4d6
--- /dev/null
+++ b/systems/eldiron/mail/scan_reported_mails
@@ -0,0 +1,21 @@
1#!/usr/bin/env bash
2
3( flock -n 9 || exit 1
4shopt -s nullglob
5for spool in /var/lib/vhost/.rspamd/*/pending; do
6 rspamd_folder=$(dirname $spool)
7 mail_user=$(basename $rspamd_folder)
8 mv $rspamd_folder/pending $rspamd_folder/processing
9
10 for mtype in ham spam; do
11 if [ -d $rspamd_folder/processing/$mtype ]; then
12 output="$(rspamc -h /run/rspamd/worker-controller.sock -c bayes -d $mail_user learn_$mtype $rspamd_folder/processing/$mtype/*)"
13 echo "[$mtype: $mail_user]" ${output} >> /var/lib/vhost/.rspamd/rspamd.log
14 mkdir -p $rspamd_folder/processed/$mtype
15 cp $rspamd_folder/processing/$mtype/* $rspamd_folder/processed/$mtype/
16 fi
17 done
18
19 rm -rf $rspamd_folder/processing
20done
21) 9>/var/lib/vhost/scan_reported_mails.lock
diff --git a/systems/eldiron/mail/sieve_bin/imapsieve_copy b/systems/eldiron/mail/sieve_bin/imapsieve_copy
new file mode 100755
index 0000000..2ca1f23
--- /dev/null
+++ b/systems/eldiron/mail/sieve_bin/imapsieve_copy
@@ -0,0 +1,8 @@
1#!/usr/bin/env bash
2# Inspired from https://docs.iredmail.org/dovecot.imapsieve.html
3
4MSG_TYPE="$1"
5OUTPUT_DIR="/var/lib/vhost/.rspamd/${USER}/pending/${MSG_TYPE}"
6FILE="${OUTPUT_DIR}/$(date +%Y%m%d%H%M%S)-${RANDOM}${RANDOM}.eml"
7mkdir -p "${OUTPUT_DIR}"
8cat > ${FILE} < /dev/stdin
diff --git a/systems/eldiron/mail/sieve_scripts/backup.sieve b/systems/eldiron/mail/sieve_scripts/backup.sieve
new file mode 100644
index 0000000..3014c0a
--- /dev/null
+++ b/systems/eldiron/mail/sieve_scripts/backup.sieve
@@ -0,0 +1,7 @@
1# vim: filetype=sieve
2require ["copy","mailbox","fileinto","regex"];
3if header :is "X-Spam" "Yes" {
4 fileinto :create :copy "Backup/Spam";
5} else {
6 fileinto :create :copy "Backup/Ham";
7}
diff --git a/systems/eldiron/mail/sieve_scripts/report_ham.sieve b/systems/eldiron/mail/sieve_scripts/report_ham.sieve
new file mode 100644
index 0000000..f9b8481
--- /dev/null
+++ b/systems/eldiron/mail/sieve_scripts/report_ham.sieve
@@ -0,0 +1,11 @@
1require ["vnd.dovecot.pipe", "copy", "imapsieve", "environment", "variables"];
2
3if environment :matches "imap.mailbox" "*" {
4 set "mailbox" "${1}";
5}
6
7if string "${mailbox}" "Trash" {
8 stop;
9}
10
11pipe :copy "imapsieve_copy" [ "ham" ];
diff --git a/systems/eldiron/mail/sieve_scripts/report_spam.sieve b/systems/eldiron/mail/sieve_scripts/report_spam.sieve
new file mode 100644
index 0000000..9a1f794
--- /dev/null
+++ b/systems/eldiron/mail/sieve_scripts/report_spam.sieve
@@ -0,0 +1,3 @@
1require ["vnd.dovecot.pipe", "copy", "imapsieve" ];
2
3pipe :copy "imapsieve_copy" [ "spam" ];
diff --git a/systems/eldiron/mail/sympa.nix b/systems/eldiron/mail/sympa.nix
new file mode 100644
index 0000000..8e801dd
--- /dev/null
+++ b/systems/eldiron/mail/sympa.nix
@@ -0,0 +1,232 @@
1{ lib, pkgs, config, ... }:
2let
3 domain = "lists.immae.eu";
4 sympaConfig = config.myEnv.mail.sympa;
5in
6{
7 config = lib.mkIf config.myServices.mail.enable {
8 myServices.dns.zones."immae.eu".emailPolicies."lists".receive = true;
9 myServices.dns.zones."immae.eu".subdomains.lists =
10 with config.myServices.dns.helpers; lib.mkMerge [
11 (ips servers.eldiron.ips.main)
12 (mailCommon "immae.eu")
13 mailSend
14 ];
15
16 myServices.chatonsProperties.services.sympa = {
17 file.datetime = "2022-08-22T00:50:00";
18 service = {
19 name = "Sympa";
20 description = "Mailing lists service";
21 website = "https://mail.immae.eu/sympa";
22 logo = "https://mail.immae.eu/static-sympa/icons/favicon_sympa.png";
23 status.level = "OK";
24 status.description = "OK";
25 registration."" = ["MEMBER" "CLIENT"];
26 registration.load = "OPEN";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "Sympa";
31 website = "https://www.sympa.org/";
32 license.url = "https://github.com/sympa-community/sympa/blob/sympa-6.2/COPYING";
33 license.name = "GNU General Public License v2.0";
34 version = pkgs.sympa.version;
35 source.url = "https://github.com/sympa-community/sympa/";
36 };
37 };
38 myServices.databases.postgresql.authorizedHosts = {
39 backup-2 = [
40 {
41 username = "sympa";
42 database = "sympa";
43 ip4 = config.myEnv.servers.backup-2.ips.main.ip4;
44 ip6 = map (v: "${v}/128") config.myEnv.servers.backup-2.ips.main.ip6;
45 }
46 ];
47 };
48 services.websites.env.tools.vhostConfs.mail = {
49 extraConfig = lib.mkAfter [
50 ''
51 Alias /static-sympa/ /var/lib/sympa/static_content/
52 <Directory /var/lib/sympa/static_content/>
53 Require all granted
54 AllowOverride none
55 </Directory>
56 <Location /sympa>
57 SetHandler "proxy:unix:/run/sympa/wwsympa.socket|fcgi://"
58 Require all granted
59 </Location>
60 ''
61 ];
62 };
63
64 secrets.keys = {
65 "sympa/db_password" = {
66 permissions = "0400";
67 group = "sympa";
68 user = "sympa";
69 text = sympaConfig.postgresql.password;
70 };
71 }
72 // lib.mapAttrs' (n: v: lib.nameValuePair "sympa/data_sources/${n}.incl" {
73 permissions = "0400"; group = "sympa"; user = "sympa"; text = v;
74 }) sympaConfig.data_sources
75 // lib.mapAttrs' (n: v: lib.nameValuePair "sympa/scenari/${n}" {
76 permissions = "0400"; group = "sympa"; user = "sympa"; text = v;
77 }) sympaConfig.scenari;
78 users.users.sympa.extraGroups = [ "keys" ];
79 systemd.slices.mail-sympa = {
80 description = "Sympa slice";
81 };
82
83 systemd.services.sympa.serviceConfig.SupplementaryGroups = [ "keys" ];
84 systemd.services.sympa-archive.serviceConfig.SupplementaryGroups = [ "keys" ];
85 systemd.services.sympa-bounce.serviceConfig.SupplementaryGroups = [ "keys" ];
86 systemd.services.sympa-bulk.serviceConfig.SupplementaryGroups = [ "keys" ];
87 systemd.services.sympa-task.serviceConfig.SupplementaryGroups = [ "keys" ];
88
89 systemd.services.sympa.serviceConfig.Slice = "mail-sympa.slice";
90 systemd.services.sympa-archive.serviceConfig.Slice = "mail-sympa.slice";
91 systemd.services.sympa-bounce.serviceConfig.Slice = "mail-sympa.slice";
92 systemd.services.sympa-bulk.serviceConfig.Slice = "mail-sympa.slice";
93 systemd.services.sympa-task.serviceConfig.Slice = "mail-sympa.slice";
94
95 # https://github.com/NixOS/nixpkgs/pull/84202
96 systemd.services.sympa.serviceConfig.ProtectKernelModules = lib.mkForce false;
97 systemd.services.sympa-archive.serviceConfig.ProtectKernelModules = lib.mkForce false;
98 systemd.services.sympa-bounce.serviceConfig.ProtectKernelModules = lib.mkForce false;
99 systemd.services.sympa-bulk.serviceConfig.ProtectKernelModules = lib.mkForce false;
100 systemd.services.sympa-task.serviceConfig.ProtectKernelModules = lib.mkForce false;
101 systemd.services.sympa.serviceConfig.ProtectKernelTunables = lib.mkForce false;
102 systemd.services.sympa-archive.serviceConfig.ProtectKernelTunables = lib.mkForce false;
103 systemd.services.sympa-bounce.serviceConfig.ProtectKernelTunables = lib.mkForce false;
104 systemd.services.sympa-bulk.serviceConfig.ProtectKernelTunables = lib.mkForce false;
105 systemd.services.sympa-task.serviceConfig.ProtectKernelTunables = lib.mkForce false;
106
107 systemd.services.wwsympa = {
108 wantedBy = [ "multi-user.target" ];
109 after = [ "sympa.service" ];
110 serviceConfig = {
111 Slice = "mail-sympa.slice";
112 Type = "forking";
113 PIDFile = "/run/sympa/wwsympa.pid";
114 Restart = "always";
115 ExecStart = ''${pkgs.spawn_fcgi}/bin/spawn-fcgi \
116 -u sympa \
117 -g sympa \
118 -U wwwrun \
119 -M 0600 \
120 -F 2 \
121 -P /run/sympa/wwsympa.pid \
122 -s /run/sympa/wwsympa.socket \
123 -- ${pkgs.sympa}/lib/sympa/cgi/wwsympa.fcgi
124 '';
125 StateDirectory = "sympa";
126 ProtectHome = true;
127 ProtectSystem = "full";
128 ProtectControlGroups = true;
129 };
130 };
131
132 services.postfix = {
133 mapFiles = {
134 # Update relay list when changing one of those
135 sympa_virtual = pkgs.writeText "virtual.sympa" ''
136 sympa-request@${domain} postmaster@immae.eu
137 sympa-owner@${domain} postmaster@immae.eu
138 '';
139 sympa_transport = pkgs.writeText "transport.sympa" ''
140 ${domain} error:User unknown in recipient table
141 sympa@${domain} sympa:sympa@${domain}
142 listmaster@${domain} sympa:listmaster@${domain}
143 bounce@${domain} sympabounce:sympa@${domain}
144 abuse-feedback-report@${domain} sympabounce:sympa@${domain}
145 '';
146 };
147 config = {
148 transport_maps = lib.mkAfter [
149 "hash:/etc/postfix/sympa_transport"
150 "hash:/var/lib/sympa/sympa_transport"
151 ];
152 virtual_alias_maps = lib.mkAfter [
153 "hash:/etc/postfix/sympa_virtual"
154 ];
155 virtual_mailbox_maps = lib.mkAfter [
156 "hash:/etc/postfix/sympa_transport"
157 "hash:/var/lib/sympa/sympa_transport"
158 "hash:/etc/postfix/sympa_virtual"
159 ];
160 };
161 masterConfig = {
162 sympa = {
163 type = "unix";
164 privileged = true;
165 chroot = false;
166 command = "pipe";
167 args = [
168 "flags=hqRu"
169 "user=sympa"
170 "argv=${pkgs.sympa}/libexec/queue"
171 "\${nexthop}"
172 ];
173 };
174 sympabounce = {
175 type = "unix";
176 privileged = true;
177 chroot = false;
178 command = "pipe";
179 args = [
180 "flags=hqRu"
181 "user=sympa"
182 "argv=${pkgs.sympa}/libexec/bouncequeue"
183 "\${nexthop}"
184 ];
185 };
186 };
187 };
188 services.sympa = {
189 enable = true;
190 listMasters = sympaConfig.listmasters;
191 mainDomain = domain;
192 domains = {
193 "${domain}" = {
194 webHost = "mail.immae.eu";
195 webLocation = "/sympa";
196 };
197 };
198
199 database = {
200 type = "PostgreSQL";
201 user = sympaConfig.postgresql.user;
202 host = sympaConfig.postgresql.socket;
203 name = sympaConfig.postgresql.database;
204 passwordFile = config.secrets.fullPaths."sympa/db_password";
205 createLocally = false;
206 };
207 settings = {
208 sendmail = "/run/wrappers/bin/sendmail";
209 log_smtp = "on";
210 sendmail_aliases = "/var/lib/sympa/sympa_transport";
211 aliases_program = "${pkgs.postfix}/bin/postmap";
212 create_list = "listmaster";
213 };
214 settingsFile = {
215 "virtual.sympa".enable = false;
216 "transport.sympa".enable = false;
217 } // lib.mapAttrs' (n: v: lib.nameValuePair
218 "etc/${domain}/data_sources/${n}.incl"
219 { source = config.secrets.fullPaths."sympa/data_sources/${n}.incl"; }) sympaConfig.data_sources
220 // lib.mapAttrs' (n: v: lib.nameValuePair
221 "etc/${domain}/scenari/${n}"
222 { source = config.secrets.fullPaths."sympa/scenari/${n}"; }) sympaConfig.scenari;
223 web = {
224 server = "none";
225 };
226
227 mta = {
228 type = "none";
229 };
230 };
231 };
232}
diff --git a/systems/eldiron/monitoring.nix b/systems/eldiron/monitoring.nix
new file mode 100644
index 0000000..2aa7f8f
--- /dev/null
+++ b/systems/eldiron/monitoring.nix
@@ -0,0 +1,51 @@
1{ config, pkgs, lib, name, monitoring, ... }:
2let
3 hostFQDN = config.hostEnv.fqdn;
4 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
5in
6{
7 config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "mdadm" "postfix" "postgresql" "zfs" "notify-secondary"];
8 config.myServices.monitoring.pluginsArgs.postgresql.package = config.myServices.databases.postgresql.package;
9 config.myServices.monitoring.objects = lib.mkMerge [
10 (monitoring.lib.objectsCommon {
11 inherit hostFQDN;
12 hostName = name;
13 master = false;
14 processWarn = "550"; processAlert = "650";
15 loadWarn = "1.0"; loadAlert = "1.2";
16 interface = builtins.head (builtins.attrNames config.networking.interfaces);
17 })
18
19 {
20 service = [
21 {
22 service_description = "No mdadm array is degraded";
23 use = "local-service";
24 check_command = ["check_mdadm"];
25 __passive_servicegroups = "webstatus-resources";
26 }
27 {
28 service_description = "Postgresql replication for backup-2 is up to date";
29 use = "local-service";
30 check_command = ["check_postgresql_replication" "backup-2" "/run/postgresql" "5432"];
31 __passive_servicegroups = "webstatus-databases";
32 }
33 {
34 service_description = "No ZFS pool is degraded";
35 use = "local-service";
36 check_command = ["check_zfs"];
37 __passive_servicegroups = "webstatus-resources";
38 }
39 {
40 service_description = "mailq is empty";
41 use = "local-service";
42 check_command = ["check_mailq"];
43 __passive_servicegroups = "webstatus-email";
44 }
45 (emailCheck "eldiron" hostFQDN // {
46 __passive_servicegroups = "webstatus-email";
47 })
48 ];
49 }
50 ];
51}
diff --git a/systems/eldiron/mpd.nix b/systems/eldiron/mpd.nix
new file mode 100644
index 0000000..640b001
--- /dev/null
+++ b/systems/eldiron/mpd.nix
@@ -0,0 +1,60 @@
1{ lib, pkgs, config, ... }:
2{
3 options.myServices.mpd.enable = lib.mkEnableOption "enable MPD";
4 config = lib.mkIf config.myServices.mpd.enable {
5 secrets.keys = {
6 "mpd" = {
7 permissions = "0400";
8 text = config.myEnv.mpd.password;
9 };
10 "mpd-config" = {
11 permissions = "0400";
12 user = "mpd";
13 group = "mpd";
14 text = ''
15 password "${config.myEnv.mpd.password}@read,add,control,admin"
16 '';
17 };
18 };
19 networking.firewall.allowedTCPPorts = [ 6600 ];
20 users.users.mpd.extraGroups = [ "wwwrun" "keys" ];
21 systemd.services.mpd.serviceConfig.RuntimeDirectory = "mpd";
22 services.filesWatcher.mpd = {
23 restart = true;
24 paths = [ config.secrets.fullPaths."mpd-config" ];
25 };
26
27 services.mpd = {
28 enable = true;
29 network.listenAddress = "any";
30 musicDirectory = config.myEnv.mpd.folder;
31 extraConfig = ''
32 include "${config.secrets.fullPaths."mpd-config"}"
33 audio_output {
34 type "null"
35 name "No Output"
36 mixer_type "none"
37 }
38 audio_output {
39 type "httpd"
40 name "OGG"
41 encoder "vorbis"
42 bind_to_address "/run/mpd/ogg.sock"
43 quality "5.0"
44 format "44100:16:1"
45 }
46 audio_output {
47 type "httpd"
48 name "MP3"
49 encoder "lame"
50 bind_to_address "/run/mpd/mp3.sock"
51 quality "5.0"
52 format "44100:16:1"
53 }
54
55
56 '';
57 };
58 };
59}
60
diff --git a/systems/eldiron/pub/default.nix b/systems/eldiron/pub/default.nix
new file mode 100644
index 0000000..ca8122a
--- /dev/null
+++ b/systems/eldiron/pub/default.nix
@@ -0,0 +1,100 @@
1{ lib, pkgs, config, ... }:
2let
3 restrict = pkgs.runCommand "restrict" {
4 file = ./restrict;
5 buildInputs = [ pkgs.makeWrapper ];
6 } ''
7 mkdir -p $out/bin
8 cp $file $out/bin/restrict
9 chmod a+x $out/bin/restrict
10 patchShebangs $out/bin/restrict
11 wrapProgram $out/bin/restrict \
12 --prefix PATH : ${lib.makeBinPath [ pkgs.bubblewrap pkgs.rrsync ]} \
13 --set TMUX_RESTRICT ${./tmux.restrict.conf}
14 '';
15in
16{
17 options = {
18 myServices.pub.enable = lib.mkOption {
19 type = lib.types.bool;
20 default = false;
21 description = ''
22 Whether to enable pub user.
23 '';
24 };
25 myServices.pub.usersProfiles = lib.mkOption {
26 type = lib.types.attrsOf (lib.types.listOf lib.types.package);
27 default = {};
28 description = ''
29 specific user profile
30 '';
31 };
32 myServices.pub.restrictCommand = lib.mkOption {
33 type = lib.types.path;
34 readOnly = true;
35 default = "${restrict}/bin/restrict";
36 description = ''
37 path to the restrict shell
38 '';
39 };
40 };
41
42 config = lib.mkIf config.myServices.pub.enable {
43 myServices.dns.zones."immae.eu".subdomains.pub =
44 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
45
46 myServices.chatonsProperties.services.vm-like = {
47 file.datetime = "2022-08-22T01:00:00";
48 service = {
49 name = "Comptes shell";
50 description = "Compte shell cloisonné";
51 logo = "https://www.openssh.com/favicon.ico";
52 website = "pub.immae.eu";
53 status.level = "OK";
54 status.description = "OK";
55 registration."" = ["MEMBER" "CLIENT"];
56 registration.load = "OPEN";
57 install.type = "PACKAGE";
58 };
59 software = {
60 name = "Openssh";
61 website = "https://www.openssh.com/";
62 license.url = "https://github.com/openssh/openssh-portable/blob/master/LICENCE";
63 license.name = "BSD Licence";
64 version = pkgs.openssh.version;
65 source.url = "https://github.com/openssh/openssh-portable";
66 };
67 };
68 myServices.ssh.modules.pub = {
69 snippet = builtins.readFile ./ldap_pub.sh;
70 dependencies = [ pkgs.coreutils ];
71 vars.ldap_forward_group = "cn=forward,cn=pub,ou=services,dc=immae,dc=eu";
72 vars.ldap_pub_group = "cn=restrict,cn=pub,ou=services,dc=immae,dc=eu";
73 vars.echo_command = "${pkgs.coreutils}/bin/echo";
74 vars.restrict_command = "${restrict}/bin/restrict";
75 };
76
77 system.extraSystemBuilderCmds = let
78 toPath = u: paths: pkgs.buildEnv {
79 name = "${u}-profile";
80 inherit paths;
81 };
82 in ''
83 mkdir -p $out/pub
84 ${builtins.concatStringsSep "\n" (lib.mapAttrsToList (u: m: "ln -s ${toPath u m} $out/pub/${u}") config.myServices.pub.usersProfiles)}
85 '';
86 users.users.pub = let
87 in {
88 createHome = true;
89 description = "Restricted shell user";
90 home = "/var/lib/pub";
91 uid = config.myEnv.users.pub.uid;
92 isNormalUser = true;
93 group = "nogroup";
94 useDefaultShell = true;
95 packages = [
96 pkgs.tmux
97 ];
98 };
99 };
100}
diff --git a/systems/eldiron/pub/ldap_pub.sh b/systems/eldiron/pub/ldap_pub.sh
new file mode 100644
index 0000000..9f03ffe
--- /dev/null
+++ b/systems/eldiron/pub/ldap_pub.sh
@@ -0,0 +1,38 @@
1### This snippet is not standalone and must be integrated in the global ldap_authorized_keys.sh
2LDAP_PUB_RESTRICT_MEMBER="@pub_ldap_pub_group@"
3LDAP_PUB_FORWARD_MEMBER="@pub_ldap_forward_group@"
4ECHO="@pub_echo_command@"
5
6if [[ $user == pub ]]; then
7 allowed_logins=$(LDAP_BASE=$USER_LDAP_BASE \
8 ldap_search '(memberOf='$LDAP_PUB_RESTRICT_MEMBER')' '' \
9 | grep ^dn \
10 | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \
11 | paste -sd,)
12
13 allowed_forwards=$(LDAP_BASE=$USER_LDAP_BASE \
14 ldap_search '(memberOf='$LDAP_PUB_FORWARD_MEMBER')' '' \
15 | grep ^dn \
16 | sed -e "s/^dn: uid=\([^,]*\),.*$USER_LDAP_BASE$/'\1'/" \
17 | paste -sd,)
18
19 psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'pub' = ANY(usage) AND login IN ($allowed_logins);" | while IFS='|' read user key; do
20 if [ ! -z "$key" ]; then
21 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
22 echo -n 'command="@pub_restrict_command@ '$user'" '
23 echo $key
24 fi
25 fi
26 done
27
28 psql_search "SELECT login, key FROM ldap_users_ssh_keys WHERE realm = 'immae' AND 'forward' = ANY(usage) AND login IN ($allowed_logins,$allowed_forwards);" | while IFS='|' read user key; do
29 if [ ! -z "$key" ]; then
30 if [[ $key != *$'\n'* ]] && [[ $key == ssh-* ]]; then
31 echo -n 'no-pty,no-X11-forwarding,command="'$ECHO' forward only" '
32 echo $key
33 fi
34 fi
35 done
36 exit 0
37fi
38
diff --git a/systems/eldiron/pub/restrict b/systems/eldiron/pub/restrict
new file mode 100644
index 0000000..698e394
--- /dev/null
+++ b/systems/eldiron/pub/restrict
@@ -0,0 +1,71 @@
1#!/usr/bin/env bash
2user="$1"
3rootuser="$HOME/$user/"
4mkdir -p $rootuser
5
6orig="$SSH_ORIGINAL_COMMAND"
7if [ -z "$orig" ]; then
8 orig="/bin/bash -l"
9fi
10if [ "${orig:0:7}" = "command" ]; then
11 orig="${orig:8}"
12fi
13
14case "$orig" in
15rsync*)
16 rrsync $HOME/$user/
17 ;;
18*)
19 nix_store_paths() {
20 nix-store -q -R \
21 /run/current-system/sw \
22 /etc/profiles/per-user/pub \
23 /etc/ssl/certs/ca-bundle.crt \
24 | while read i; do
25 printf '%s--ro-bind\0'$i'\0'$i'\0' ''
26 done
27 if [ -e "/run/current-system/pub/$user" ]; then
28 nix-store -q -R "/run/current-system/pub/$user" \
29 | while read i; do
30 printf '%s--ro-bind\0'$i'\0'$i'\0' ''
31 done
32 printf '%s--ro-bind\0/run/current-system/pub/'$user'/bin\0/bin-pub-'$user'\0' ''
33 fi
34 }
35
36 set -euo pipefail
37 (exec -c bwrap --ro-bind /usr /usr \
38 --args 10 \
39 --dir /tmp \
40 --dir /var \
41 --symlink ../tmp var/tmp \
42 --proc /proc \
43 --dev /dev \
44 --ro-bind /etc/resolv.conf /etc/resolv.conf \
45 --ro-bind /etc/zoneinfo /etc/zoneinfo \
46 --ro-bind /etc/ssl /etc/ssl \
47 --ro-bind /etc/static/ssl/certs /etc/static/ssl/certs \
48 --ro-bind /run/current-system/sw/lib/locale/locale-archive /etc/locale-archive \
49 --ro-bind /run/current-system/sw/bin /bin \
50 --ro-bind /etc/profiles/per-user/pub/bin /bin-pub \
51 --bind /var/lib/pub/$user /var/lib/pub \
52 --dir /var/lib/commons \
53 --ro-bind $TMUX_RESTRICT /var/lib/commons/tmux.restrict.conf \
54 --chdir /var/lib/pub \
55 --unshare-all \
56 --share-net \
57 --dir /run/user/$(id -u) \
58 --setenv TERM "$TERM" \
59 --setenv LOCALE_ARCHIVE "/etc/locale-archive" \
60 --setenv XDG_RUNTIME_DIR "/run/user/`id -u`" \
61 --setenv PS1 "$user@pub $ " \
62 --setenv PATH "/bin-pub-$user:/bin:/bin-pub" \
63 --setenv HOME "/var/lib/pub" \
64 --file 11 /etc/passwd \
65 --file 12 /etc/group \
66 -- $orig) \
67 10< <(nix_store_paths | sort | uniq) \
68 11< <(getent passwd $UID 65534) \
69 12< <(getent group $(id -g) 65534)
70 ;;
71esac
diff --git a/systems/eldiron/pub/tmux.restrict.conf b/systems/eldiron/pub/tmux.restrict.conf
new file mode 100644
index 0000000..5aefd1c
--- /dev/null
+++ b/systems/eldiron/pub/tmux.restrict.conf
@@ -0,0 +1,43 @@
1# Pour les nostalgiques de screen
2# comme les raccourcis ne sont pas les mêmes, j'évite
3set -g prefix C-a
4unbind-key C-b
5
6unbind-key -a
7bind-key -n C-h list-keys
8bind-key C-d detach
9bind-key & confirm-before -p "kill-window #W? (y/n)" kill-window
10
11# même hack que sur screen lorsqu'on veut profiter du scroll du terminal
12# (xterm ...)
13set -g terminal-overrides 'xterm*:smcup@:rmcup@'
14
15#Pour les ctrl+arrow
16set-option -g xterm-keys on
17
18# c'est un minimum (defaut 2000)
19set-option -g history-limit 10000
20
21# lorsque j'ai encore un tmux ailleurs seule
22# sa fenetre active réduit la taille de ma fenetre locale
23setw -g aggressive-resize on
24
25# Pour etre alerté sur un changement dans une autre fenêtre
26setw -g monitor-activity on
27#set -g visual-activity on
28#set -g visual-bell on
29
30set -g base-index 1
31
32# repercuter le contenu de la fenetre dans la barre de titre
33# reference des string : man tmux (status-left)
34set -g set-titles on
35set -g set-titles-string '#H #W #T' # host window command
36
37#Dans les valeurs par defaut deja, avec le ssh-agent
38set -g update-environment "DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY PATH"
39
40set -g status off
41set -g status-left ''
42set -g status-right ''
43
diff --git a/systems/eldiron/tasks/default.nix b/systems/eldiron/tasks/default.nix
new file mode 100644
index 0000000..0772a5f
--- /dev/null
+++ b/systems/eldiron/tasks/default.nix
@@ -0,0 +1,384 @@
1{ lib, pkgs, config, taskwarrior-web, ... }:
2let
3 cfg = config.myServices.tasks;
4 server_vardir = config.services.taskserver.dataDir;
5 fqdn = "task.immae.eu";
6 user = config.services.taskserver.user;
7 env = config.myEnv.tools.task;
8 group = config.services.taskserver.group;
9 taskserver-user-certs = pkgs.runCommand "taskserver-user-certs" {} ''
10 mkdir -p $out/bin
11 cat > $out/bin/taskserver-user-certs <<"EOF"
12 #!/usr/bin/env bash
13
14 user=$1
15
16 silent_certtool() {
17 if ! output="$("${pkgs.gnutls.bin}/bin/certtool" "$@" 2>&1)"; then
18 echo "GNUTLS certtool invocation failed with output:" >&2
19 echo "$output" >&2
20 fi
21 }
22
23 silent_certtool -p \
24 --bits 4096 \
25 --outfile "${server_vardir}/userkeys/$user.key.pem"
26 ${pkgs.gnused}/bin/sed -i -n -e '/^-----BEGIN RSA PRIVATE KEY-----$/,$p' "${server_vardir}/userkeys/$user.key.pem"
27
28 silent_certtool -c \
29 --template "${pkgs.writeText "taskserver-ca.template" ''
30 tls_www_client
31 encryption_key
32 signing_key
33 expiration_days = 3650
34 ''}" \
35 --load-ca-certificate "${server_vardir}/keys/ca.cert" \
36 --load-ca-privkey "${server_vardir}/keys/ca.key" \
37 --load-privkey "${server_vardir}/userkeys/$user.key.pem" \
38 --outfile "${server_vardir}/userkeys/$user.cert.pem"
39 EOF
40 chmod a+x $out/bin/taskserver-user-certs
41 patchShebangs $out/bin/taskserver-user-certs
42 '';
43 socketsDir = "/run/taskwarrior-web";
44 varDir = "/var/lib/taskwarrior-web";
45 taskwebPages = let
46 uidPages = lib.attrsets.zipAttrs (
47 lib.lists.flatten
48 (lib.attrsets.mapAttrsToList (k: c: map (v: { "${v}" = k; }) c.uid) env.taskwarrior-web)
49 );
50 pages = lib.attrsets.mapAttrs (uid: items:
51 if lib.lists.length items == 1 then
52 ''
53 <html>
54 <head>
55 <meta http-equiv="refresh" content="0; url=/taskweb/${lib.lists.head items}/" />
56 </head>
57 <body></body>
58 </html>
59 ''
60 else
61 ''
62 <html>
63 <head>
64 <title>To-do list disponibles</title>
65 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
66 <meta name="viewport" content="width=device-width, initial-scale=1" />
67 </head>
68 <body>
69 <ul>
70 ${builtins.concatStringsSep "\n" (map (item: "<li><a href='/taskweb/${item}'>${item}</a></li>") items)}
71 </ul>
72 </body>
73 </html>
74 ''
75 ) uidPages;
76 in
77 pkgs.runCommand "taskwerver-pages" {} ''
78 mkdir -p $out/
79 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (k: v: "cp ${pkgs.writeText k v} $out/${k}.html") pages)}
80 echo "Please login" > $out/index.html
81 '';
82in {
83 options.myServices.tasks = {
84 enable = lib.mkEnableOption "my tasks service";
85 };
86
87 config = lib.mkIf cfg.enable {
88 myServices.dns.zones."immae.eu".subdomains.task =
89 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
90
91 myServices.chatonsProperties.services.taskwarrior = {
92 file.datetime = "2022-08-22T00:00:00";
93 service = {
94 name = "Taskwarrior";
95 description = "Taskwarrior is Free and Open Source Software that manages your TODO list from the command line. Web interface and synchronization server";
96 website = "https://task.immae.eu/";
97 logo = "https://taskwarrior.org/favicon.ico";
98 status.level = "OK";
99 status.description = "OK";
100 registration."" = ["MEMBER" "CLIENT"];
101 registration.load = "OPEN";
102 install.type = "PACKAGE";
103 };
104 software = {
105 name = "Taskwarrior";
106 website = "https://taskwarrior.org/";
107 license.url = "https://github.com/GothenburgBitFactory/taskwarrior/blob/develop/LICENSE";
108 license.name = "MIT License";
109 version = taskwarrior-web.version;
110 source.url = "https://taskwarrior.org/download/";
111 };
112 };
113 secrets.keys = {
114 "webapps/tools-taskwarrior-web" = {
115 user = "wwwrun";
116 group = "wwwrun";
117 permissions = "0400";
118 text = ''
119 SetEnv TASKD_HOST "${fqdn}:${toString config.services.taskserver.listenPort}"
120 SetEnv TASKD_VARDIR "${server_vardir}"
121 SetEnv TASKD_LDAP_HOST "ldaps://${env.ldap.host}"
122 SetEnv TASKD_LDAP_DN "${env.ldap.dn}"
123 SetEnv TASKD_LDAP_PASSWORD "${env.ldap.password}"
124 SetEnv TASKD_LDAP_BASE "${env.ldap.base}"
125 SetEnv TASKD_LDAP_FILTER "${env.ldap.filter}"
126 '';
127 };
128 } // (lib.mapAttrs' (name: userConfig: lib.nameValuePair "webapps/tools-taskwarrior/${name}-taskrc" (
129 let
130 credentials = "${userConfig.org}/${name}/${userConfig.key}";
131 dateFormat = userConfig.date;
132 cacert = pkgs.writeText "ca.cert" ''
133 -----BEGIN CERTIFICATE-----
134 MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
135 TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
136 cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
137 WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
138 ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
139 MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
140 h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
141 0TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
142 A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
143 T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
144 B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
145 B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
146 KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
147 OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
148 jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
149 qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
150 rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
151 HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
152 hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
153 ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
154 3BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
155 NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
156 ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
157 TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
158 jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
159 oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
160 4RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
161 mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
162 emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
163 -----END CERTIFICATE-----'';
164 in {
165 inherit user group;
166 permissions = "0400";
167 text = ''
168 data.location=${varDir}/${name}
169 taskd.certificate=${server_vardir}/userkeys/taskwarrior-web.cert.pem
170 taskd.key=${server_vardir}/userkeys/taskwarrior-web.key.pem
171 # IdenTrust DST Root CA X3
172 # obtained here: https://letsencrypt.org/fr/certificates/
173 taskd.ca=${cacert}
174 taskd.server=${fqdn}:${toString config.services.taskserver.listenPort}
175 taskd.credentials=${credentials}
176 dateformat=${dateFormat}
177 '';
178 keyDependencies = [ cacert ];
179 })) env.taskwarrior-web);
180 security.acme.certs.eldiron.extraDomainNames = [ "task.immae.eu" ];
181 services.websites.env.tools.watchPaths = [ config.secrets.fullPaths."webapps/tools-taskwarrior-web" ];
182 services.websites.env.tools.modules = [ "proxy_fcgi" "sed" ];
183 services.websites.env.tools.vhostConfs.task = {
184 certName = "eldiron";
185 hosts = [ "task.immae.eu" ];
186 root = ./www;
187 extraConfig = [ ''
188 <Directory ${./www}>
189 DirectoryIndex index.php
190 Use LDAPConnect
191 Require ldap-group cn=users,cn=taskwarrior,ou=services,dc=immae,dc=eu
192 <FilesMatch "\.php$">
193 SetHandler "proxy:unix:${config.services.phpfpm.pools.tasks.socket}|fcgi://localhost"
194 </FilesMatch>
195 Include ${config.secrets.fullPaths."webapps/tools-taskwarrior-web"}
196 </Directory>
197 ''
198 ''
199 <Macro Taskwarrior %{folderName}>
200 ProxyPass "unix://${socketsDir}/%{folderName}.sock|http://localhost-%{folderName}/"
201 ProxyPassReverse "unix://${socketsDir}/%{folderName}.sock|http://localhost-%{folderName}/"
202 ProxyPassReverse http://${fqdn}/
203
204 SetOutputFilter Sed
205 OutputSed "s|/ajax|/taskweb/%{folderName}/ajax|g"
206 OutputSed "s|\([^x]\)/tasks|\1/taskweb/%{folderName}/tasks|g"
207 OutputSed "s|\([^x]\)/projects|\1/taskweb/%{folderName}/projects|g"
208 OutputSed "s|http://${fqdn}/|/taskweb/%{folderName}/|g"
209 OutputSed "s|/img/relax.jpg|/taskweb/%{folderName}/img/relax.jpg|g"
210 </Macro>
211 ''
212 ''
213 Alias /taskweb ${taskwebPages}
214 <Directory "${taskwebPages}">
215 DirectoryIndex index.html
216 Require all granted
217 </Directory>
218
219 RewriteEngine on
220 RewriteRule ^/taskweb$ /taskweb/ [R=301,L]
221 RedirectMatch permanent ^/taskweb/([^/]+)$ /taskweb/$1/
222
223 RewriteCond %{LA-U:REMOTE_USER} !=""
224 RewriteCond ${taskwebPages}/%{LA-U:REMOTE_USER}.html -f
225 RewriteRule ^/taskweb/?$ ${taskwebPages}/%{LA-U:REMOTE_USER}.html [L]
226
227 <Location /taskweb/>
228 Use LDAPConnect
229 Require ldap-group cn=users,cn=taskwarrior,ou=services,dc=immae,dc=eu
230 </Location>
231 ''
232 ] ++ (lib.attrsets.mapAttrsToList (k: v: ''
233 <Location /taskweb/${k}/>
234 ${builtins.concatStringsSep "\n" (map (uid: "Require ldap-attribute uid=${uid}") v.uid)}
235
236 Use Taskwarrior ${k}
237 </Location>
238 '') env.taskwarrior-web);
239 };
240 services.phpfpm.pools = {
241 tasks = {
242 user = user;
243 group = group;
244 settings = {
245 "listen.owner" = "wwwrun";
246 "listen.group" = "wwwrun";
247 "pm" = "dynamic";
248 "pm.max_children" = "60";
249 "pm.start_servers" = "2";
250 "pm.min_spare_servers" = "1";
251 "pm.max_spare_servers" = "10";
252
253 # Needed to avoid clashes in browser cookies (same domain)
254 "php_value[session.name]" = "TaskPHPSESSID";
255 "php_admin_value[session.save_handler]" = "redis";
256 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Task:'";
257 "php_admin_value[open_basedir]" = "${./www}:/tmp:${server_vardir}:/etc/profiles/per-user/${user}/bin/";
258 };
259 phpEnv = {
260 PATH = "/etc/profiles/per-user/${user}/bin";
261 };
262 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
263 };
264 };
265
266 security.acme.certs."task" = {
267 inherit group;
268 domain = fqdn;
269 postRun = ''
270 systemctl restart taskserver.service
271 '';
272 };
273
274 users.users.${user} = {
275 extraGroups = [ "keys" ];
276 packages = [ taskserver-user-certs ];
277 };
278
279 system.activationScripts.taskserver = {
280 deps = [ "users" ];
281 text = ''
282 install -m 0750 -o ${user} -g ${group} -d ${server_vardir}
283 install -m 0750 -o ${user} -g ${group} -d ${server_vardir}/userkeys
284 install -m 0750 -o ${user} -g ${group} -d ${server_vardir}/keys
285
286 if [ ! -e "${server_vardir}/keys/ca.key" ]; then
287 silent_certtool() {
288 if ! output="$("${pkgs.gnutls.bin}/bin/certtool" "$@" 2>&1)"; then
289 echo "GNUTLS certtool invocation failed with output:" >&2
290 echo "$output" >&2
291 fi
292 }
293
294 silent_certtool -p \
295 --bits 4096 \
296 --outfile "${server_vardir}/keys/ca.key"
297
298 silent_certtool -s \
299 --template "${pkgs.writeText "taskserver-ca.template" ''
300 cn = ${fqdn}
301 expiration_days = -1
302 cert_signing_key
303 ca
304 ''}" \
305 --load-privkey "${server_vardir}/keys/ca.key" \
306 --outfile "${server_vardir}/keys/ca.cert"
307
308 chown :${group} "${server_vardir}/keys/ca.key"
309 chmod g+r "${server_vardir}/keys/ca.key"
310 fi
311 '';
312 };
313
314 services.taskserver = {
315 enable = true;
316 allowedClientIDs = [ "^task [2-9]" "^Mirakel [1-9]" ];
317 inherit fqdn;
318 listenHost = "::";
319 pki.manual.ca.cert = "${server_vardir}/keys/ca.cert";
320 pki.manual.server.cert = "${config.security.acme.certs.task.directory}/fullchain.pem";
321 pki.manual.server.crl = "${config.security.acme.certs.task.directory}/invalid.crl";
322 pki.manual.server.key = "${config.security.acme.certs.task.directory}/key.pem";
323 requestLimit = 104857600;
324 };
325
326 system.activationScripts.taskwarrior-web = {
327 deps = [ "users" ];
328 text = ''
329 if [ ! -f ${server_vardir}/userkeys/taskwarrior-web.cert.pem ]; then
330 ${taskserver-user-certs}/bin/taskserver-user-certs taskwarrior-web
331 chown taskd:taskd ${server_vardir}/userkeys/taskwarrior-web.cert.pem ${server_vardir}/userkeys/taskwarrior-web.key.pem
332 fi
333 '';
334 };
335
336 systemd.slices.taskwarrior = {
337 description = "Taskwarrior slice";
338 };
339
340 systemd.services = (lib.attrsets.mapAttrs' (name: userConfig:
341 lib.attrsets.nameValuePair "taskwarrior-web-${name}" {
342 description = "Taskwarrior webapp for ${name}";
343 wantedBy = [ "multi-user.target" ];
344 after = [ "network.target" ];
345 path = [ pkgs.taskwarrior ];
346
347 environment.TASKRC = config.secrets.fullPaths."webapps/tools-taskwarrior/${name}-taskrc";
348 environment.BUNDLE_PATH = "${taskwarrior-web.gems}/${taskwarrior-web.gems.ruby.gemPath}";
349 environment.BUNDLE_GEMFILE = "${taskwarrior-web.gems.confFiles}/Gemfile";
350 environment.LC_ALL = "fr_FR.UTF-8";
351
352 script = ''
353 exec ${taskwarrior-web.gems}/${taskwarrior-web.gems.ruby.gemPath}/bin/bundle exec thin start -R config.ru -S ${socketsDir}/${name}.sock
354 '';
355
356 serviceConfig = {
357 Slice = "taskwarrior.slice";
358 User = user;
359 PrivateTmp = true;
360 Restart = "always";
361 TimeoutSec = 60;
362 Type = "simple";
363 WorkingDirectory = taskwarrior-web;
364 StateDirectoryMode = 0750;
365 StateDirectory = assert lib.strings.hasPrefix "/var/lib/" varDir;
366 (lib.strings.removePrefix "/var/lib/" varDir + "/${name}");
367 RuntimeDirectoryPreserve = "yes";
368 RuntimeDirectory = assert lib.strings.hasPrefix "/run/" socketsDir;
369 lib.strings.removePrefix "/run/" socketsDir;
370 };
371
372 unitConfig.RequiresMountsFor = varDir;
373 }) env.taskwarrior-web) // {
374 taskserver-ca.postStart = ''
375 chown :${group} "${server_vardir}/keys/ca.key"
376 chmod g+r "${server_vardir}/keys/ca.key"
377 '';
378 taskserver-ca.serviceConfig.Slice = "taskwarrior.slice";
379 taskserver-init.serviceConfig.Slice = "taskwarrior.slice";
380 taskserver.serviceConfig.Slice = "taskwarrior.slice";
381 };
382
383 };
384}
diff --git a/systems/eldiron/tasks/www/index.php b/systems/eldiron/tasks/www/index.php
new file mode 100644
index 0000000..bde773d
--- /dev/null
+++ b/systems/eldiron/tasks/www/index.php
@@ -0,0 +1,168 @@
1<?php
2if (!isset($_SERVER["REMOTE_USER"])) {
3 die("please login");
4}
5$ldap_user = $_SERVER["REMOTE_USER"];
6$ldap_host = getenv("TASKD_LDAP_HOST");
7$ldap_dn = getenv('TASKD_LDAP_DN');
8$ldap_password = getenv('TASKD_LDAP_PASSWORD');
9$ldap_base = getenv('TASKD_LDAP_BASE');
10$ldap_filter = getenv('TASKD_LDAP_FILTER');
11$host = getenv('TASKD_HOST');
12$vardir = getenv('TASKD_VARDIR');
13
14$connect = ldap_connect($ldap_host);
15ldap_set_option($connect, LDAP_OPT_PROTOCOL_VERSION, 3);
16if (!$connect || !ldap_bind($connect, $ldap_dn, $ldap_password)) {
17 die("impossible to connect to LDAP");
18}
19
20$search_query = str_replace('%login%', ldap_escape($ldap_user), $ldap_filter);
21
22$search = ldap_search($connect, $ldap_base, $search_query);
23$info = ldap_get_entries($connect, $search);
24
25if (ldap_count_entries($connect, $search) != 1) {
26 die("Impossible to find user in LDAP");
27}
28
29$entries = [];
30foreach($info[0]["immaetaskid"] as $key => $value) {
31 if ($key !== "count") {
32 $entries[] = explode(":", $value);
33 }
34}
35
36if (isset($_GET["file"])) {
37 $basecert = $vardir . "/userkeys/" . $ldap_user;
38 if (!file_exists($basecert . ".cert.pem")) {
39 exec("taskserver-user-certs $ldap_user");
40 }
41 $certificate = file_get_contents($basecert . ".cert.pem");
42 $cert_key = file_get_contents($basecert . ".key.pem");
43
44 // IdenTrust DST Root CA X3
45 // obtained here: https://letsencrypt.org/fr/certificates/
46 $server_cert = "-----BEGIN CERTIFICATE-----
47MIIFazCCA1OgAwIBAgIRAIIQz7DSQONZRGPgu2OCiwAwDQYJKoZIhvcNAQELBQAw
48TzELMAkGA1UEBhMCVVMxKTAnBgNVBAoTIEludGVybmV0IFNlY3VyaXR5IFJlc2Vh
49cmNoIEdyb3VwMRUwEwYDVQQDEwxJU1JHIFJvb3QgWDEwHhcNMTUwNjA0MTEwNDM4
50WhcNMzUwNjA0MTEwNDM4WjBPMQswCQYDVQQGEwJVUzEpMCcGA1UEChMgSW50ZXJu
51ZXQgU2VjdXJpdHkgUmVzZWFyY2ggR3JvdXAxFTATBgNVBAMTDElTUkcgUm9vdCBY
52MTCCAiIwDQYJKoZIhvcNAQEBBQADggIPADCCAgoCggIBAK3oJHP0FDfzm54rVygc
53h77ct984kIxuPOZXoHj3dcKi/vVqbvYATyjb3miGbESTtrFj/RQSa78f0uoxmyF+
540TM8ukj13Xnfs7j/EvEhmkvBioZxaUpmZmyPfjxwv60pIgbz5MDmgK7iS4+3mX6U
55A5/TR5d8mUgjU+g4rk8Kb4Mu0UlXjIB0ttov0DiNewNwIRt18jA8+o+u3dpjq+sW
56T8KOEUt+zwvo/7V3LvSye0rgTBIlDHCNAymg4VMk7BPZ7hm/ELNKjD+Jo2FR3qyH
57B5T0Y3HsLuJvW5iB4YlcNHlsdu87kGJ55tukmi8mxdAQ4Q7e2RCOFvu396j3x+UC
58B5iPNgiV5+I3lg02dZ77DnKxHZu8A/lJBdiB3QW0KtZB6awBdpUKD9jf1b0SHzUv
59KBds0pjBqAlkd25HN7rOrFleaJ1/ctaJxQZBKT5ZPt0m9STJEadao0xAH0ahmbWn
60OlFuhjuefXKnEgV4We0+UXgVCwOPjdAvBbI+e0ocS3MFEvzG6uBQE3xDk3SzynTn
61jh8BCNAw1FtxNrQHusEwMFxIt4I7mKZ9YIqioymCzLq9gwQbooMDQaHWBfEbwrbw
62qHyGO0aoSCqI3Haadr8faqU9GY/rOPNk3sgrDQoo//fb4hVC1CLQJ13hef4Y53CI
63rU7m2Ys6xt0nUW7/vGT1M0NPAgMBAAGjQjBAMA4GA1UdDwEB/wQEAwIBBjAPBgNV
64HRMBAf8EBTADAQH/MB0GA1UdDgQWBBR5tFnme7bl5AFzgAiIyBpY9umbbjANBgkq
65hkiG9w0BAQsFAAOCAgEAVR9YqbyyqFDQDLHYGmkgJykIrGF1XIpu+ILlaS/V9lZL
66ubhzEFnTIZd+50xx+7LSYK05qAvqFyFWhfFQDlnrzuBZ6brJFe+GnY+EgPbk6ZGQ
673BebYhtF8GaV0nxvwuo77x/Py9auJ/GpsMiu/X1+mvoiBOv/2X/qkSsisRcOj/KK
68NFtY2PwByVS5uCbMiogziUwthDyC3+6WVwW6LLv3xLfHTjuCvjHIInNzktHCgKQ5
69ORAzI4JMPJ+GslWYHb4phowim57iaztXOoJwTdwJx4nLCgdNbOhdjsnvzqvHu7Ur
70TkXWStAmzOVyyghqpZXjFaH3pO3JLF+l+/+sKAIuvtd7u+Nxe5AW0wdeRlN8NwdC
71jNPElpzVmbUq4JUagEiuTDkHzsxHpFKVK7q4+63SM1N95R1NbdWhscdCb+ZAJzVc
72oyi3B43njTOQ5yOf+1CceWxG1bQVs5ZufpsMljq4Ui0/1lvh+wjChP4kqKOJ2qxq
734RgqsahDYVvTH9w7jXbyLeiNdd8XM2w9U/t7y0Ff/9yi0GE44Za4rF2LN9d11TPA
74mRGunUHBcnWEvgJBQl9nJEiU0Zsnvgc/ubhPgXRR4Xq37Z0j4r7g1SgEEzwxA57d
75emyPxgcYxn/eR44/KJ4EBs+lVDR3veyJm+kXQ99b21/+jh5Xos1AnX5iItreGCc=
76-----END CERTIFICATE-----";
77
78 $file = $_GET["file"];
79 switch($file) {
80 case "ca.cert.pem":
81 $content = $server_cert;
82 $name = "ca.cert.pem";
83 $type = "application/x-x509-ca-cert";
84 break;
85 case "cert.pem":
86 $content = $certificate;
87 $name = $ldap_user . ".cert.pem";
88 $type = "application/x-x509-ca-cert";
89 break;
90 case "key.pem":
91 $content = $cert_key;
92 $name = $ldap_user . ".key.pem";
93 $type = "application/x-x509-ca-cert";
94 break;
95 case "mirakel";
96 foreach ($entries as $entry) {
97 list($org, $user, $key) = $entry;
98 if ($key == $_GET["key"]) { break; }
99 }
100 $name = $user . ".mirakel";
101 $type = "text/plain";
102 $content = "username: $user
103org: $org
104user key: $key
105server: $host
106client.cert:
107$certificate
108Client.key:
109$cert_key
110ca.cert:
111$server_cert
112";
113 break;
114 default:
115 die("invalid file name");
116 break;
117 }
118
119 header("Content-Type: $type");
120 header('Content-Disposition: attachment; filename="' . $name . '"');
121 header('Content-Transfer-Encoding: binary');
122 header('Accept-Ranges: bytes');
123 header('Cache-Control: private');
124 header('Pragma: private');
125 echo $content;
126 exit;
127}
128?>
129<html>
130<header>
131 <title>Taskwarrior configuration</title>
132</header>
133<body>
134<ul>
135 <li><a href="?file=ca.cert.pem">ca.cert.pem</a></li>
136 <li><a href="?file=cert.pem"><?php echo $ldap_user; ?>.cert.pem</a></li>
137 <li><a href="?file=key.pem"><?php echo $ldap_user; ?>.key.pem</a></li>
138</ul>
139For command line interface, download the files, put them near your Taskwarrior
140configuration files, and add that to your Taskwarrior configuration:
141<pre>
142taskd.certificate=/path/to/<?php echo $ldap_user; ?>.cert.pem
143taskd.key=/path/to/<?php echo $ldap_user; ?>.key.pem
144taskd.server=<?php echo $host ."\n"; ?>
145taskd.ca=/path/to/ca.cert.pem
146<?php if (count($entries) > 1) {
147 echo "# Chose one of them\n";
148 foreach($entries as $entry) {
149 list($org, $user, $key) = $entry;
150 echo "# taskd.credentials=$org/$user/$key\n";
151 }
152} else { ?>
153taskd.credentials=<?php echo $entries[0][0]; ?>/<?php echo $entries[0][1]; ?>/<?php echo $entries[0][2]; ?>
154<?php } ?>
155</pre>
156For Mirakel, download and import the file:
157<ul>
158<?php
159foreach ($entries as $entry) {
160 list($org, $user, $key) = $entry;
161 echo '<li><a href="?file=mirakel&key='.$key.'">' . $user . '.mirakel</a></li>';
162}
163?>
164</ul>
165For Android Taskwarrior app, see instructions <a href="https://bitbucket.org/kvorobyev/taskwarriorandroid/wiki/Configuration">here</a>.
166</body>
167</html>
168
diff --git a/systems/eldiron/vpn/default.nix b/systems/eldiron/vpn/default.nix
new file mode 100644
index 0000000..df56249
--- /dev/null
+++ b/systems/eldiron/vpn/default.nix
@@ -0,0 +1,92 @@
1{ config, pkgs, lib, ... }:
2let
3 cfg = config.myServices.vpn;
4in
5{
6 options.myServices = {
7 vpn.enable = lib.mkEnableOption "Enable vpn service";
8 };
9
10 config = lib.mkIf cfg.enable {
11 myServices.dns.zones."immae.eu".subdomains.vpn = with config.myServices.dns.helpers;
12 ips servers.eldiron.ips.main // {
13 subdomains.gw.AAAA = [ "${config.myEnv.vpn.eldiron.prefix}:0:ffff:1" ];
14 # Fake address to designate the subnet
15 subdomains.sn.AAAA = [ "${config.myEnv.vpn.eldiron.prefix}::" ];
16 };
17 myServices.chatonsProperties.hostings.vpn = {
18 file.datetime = "2022-08-27T18:00:00";
19 hosting = {
20 name = "VPN";
21 description = "VPN";
22 website = "https://vpn.immae.eu";
23 logo = "https://tinc-vpn.org/favicon.ico";
24 status.level = "OK";
25 status.description = "OK";
26 registration.load = "FULL";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "tinc";
31 website = "https://tinc-vpn.org/";
32 license.url = "https://www.gnu.org/licenses/old-licenses/gpl-2.0.html";
33 license.name = "GNU General Public License v2.0";
34 version = pkgs.tinc.version;
35 source.url = "https://tinc-vpn.org/git/browse?p=tinc";
36 };
37 };
38 secrets.keys = {
39 "tinc/key.priv" = {
40 user = "root";
41 group = "root";
42 permissions = "0400";
43 text = config.myEnv.vpn.eldiron.privateKey;
44 };
45 "tinc/key.pub" = {
46 user = "root";
47 group = "root";
48 permissions = "0400";
49 text = config.myEnv.vpn.eldiron.publicKey;
50 };
51 };
52 networking.firewall.allowedTCPPorts = [ 655 1194 ];
53 system.activationScripts.tinc = let
54 configFiles = pkgs.runCommand "tinc-files" {
55 mainInterface = "eth0";
56 hostName = "ImmaeEu";
57 network = "Immae";
58 keyFile = config.secrets.fullPaths."tinc/key.priv";
59 } ''
60 mkdir -p $out
61 for i in ${./tinc}/*; do
62 substituteAll $i $out/$(basename $i)
63 done
64 '';
65 in ''
66 install -m750 -o root -g root -d /var/lib/tinc/ /var/lib/tinc/Immae
67 install -m700 -o root -g root -t /var/lib/tinc/Immae ${configFiles}/{host-*,tinc-*}
68 install -m400 -o root -g root -t /var/lib/tinc/Immae ${configFiles}/tinc.conf
69 if [ ! -d /var/lib/tinc/Immae/hosts ]; then
70 ${pkgs.git}/bin/git clone -b master https://git.immae.eu/perso/Immae/Config/tinc/hosts /var/lib/tinc/Immae/hosts
71 fi
72 '';
73
74 systemd.slices.tinc = {
75 description = "Tinc slice";
76 };
77
78 systemd.services.tinc-Immae = {
79 description = "Tinc Daemon - Immae";
80 wantedBy = [ "multi-user.target" ];
81 after = [ "network.target" ];
82 path = [ pkgs.getent pkgs.tinc pkgs.bashInteractive pkgs.iproute pkgs.gnused pkgs.gawk pkgs.git pkgs.glibc ];
83 serviceConfig = {
84 Slice = "tinc.slice";
85 Type = "simple";
86 Restart = "always";
87 RestartSec = "3";
88 ExecStart = "${pkgs.tinc}/bin/tincd -d1 -D -c /var/lib/tinc/Immae --pidfile /run/tinc.Immae.pid";
89 };
90 };
91 };
92}
diff --git a/systems/eldiron/vpn/tinc/host-down b/systems/eldiron/vpn/tinc/host-down
new file mode 100755
index 0000000..1e79bd3
--- /dev/null
+++ b/systems/eldiron/vpn/tinc/host-down
@@ -0,0 +1,7 @@
1#!/usr/bin/env bash
2
3SUBDOMAIN=$(echo "$NODE" | sed -e "s/\([A-Z][a-z0-9]*\)/\L\1 /g;" | awk '{ for (i=NF; i>1; i--) printf("%s.",$i); print $1; }')
4NODEIPS=`getent hosts ${SUBDOMAIN}.immae.eu | cut -d' ' -f1 | tr "\\n" ' '`
5for NODEIP in $NODEIPS; do
6 ip neigh del proxy $NODEIP dev @mainInterface@
7done
diff --git a/systems/eldiron/vpn/tinc/host-up b/systems/eldiron/vpn/tinc/host-up
new file mode 100755
index 0000000..2f7cee2
--- /dev/null
+++ b/systems/eldiron/vpn/tinc/host-up
@@ -0,0 +1,11 @@
1#!/usr/bin/env bash
2
3SUBDOMAIN=$(echo "$NODE" | sed -e "s/\([A-Z][a-z0-9]*\)/\L\1 /g;" | awk '{ for (i=NF; i>1; i--) printf("%s.",$i); print $1; }')
4while [ -z "$NODEIPS" ]; do
5 NODEIPS=`getent hosts ${SUBDOMAIN}.immae.eu | cut -d' ' -f1 | tr "\\n" ' '`
6 sleep 5
7done
8for NODEIP in $NODEIPS; do
9 ip neigh add proxy $NODEIP dev @mainInterface@
10done
11(cd /var/lib/tinc/@network@/hosts && git pull -q origin master) || true
diff --git a/systems/eldiron/vpn/tinc/tinc-down b/systems/eldiron/vpn/tinc/tinc-down
new file mode 100755
index 0000000..1cc45c0
--- /dev/null
+++ b/systems/eldiron/vpn/tinc/tinc-down
@@ -0,0 +1,12 @@
1#!/bin/sh
2# This file closes down the tap device.
3
4echo 0 > /proc/sys/net/ipv6/conf/@mainInterface@/proxy_ndp
5echo 0 > /proc/sys/net/ipv6/conf/all/forwarding
6
7GWIP=`getent hosts gw.vpn.immae.eu | head -n1 | cut -d' ' -f1`
8
9ip neigh del proxy $GWIP dev eth0
10
11ip -6 addr del $GWIP/96 dev $INTERFACE
12ip -6 link set $INTERFACE down
diff --git a/systems/eldiron/vpn/tinc/tinc-up b/systems/eldiron/vpn/tinc/tinc-up
new file mode 100755
index 0000000..26c1ec3
--- /dev/null
+++ b/systems/eldiron/vpn/tinc/tinc-up
@@ -0,0 +1,14 @@
1#!/usr/bin/env bash
2
3echo 1 > /proc/sys/net/ipv6/conf/@mainInterface@/proxy_ndp
4echo 1 > /proc/sys/net/ipv6/conf/all/forwarding
5
6SUBNET=`getent hosts sn.vpn.immae.eu | head -n1 | cut -d' ' -f1`
7GWIP=`getent hosts gw.vpn.immae.eu | head -n1 | cut -d' ' -f1`
8
9ip -6 link set $INTERFACE up mtu 1280 txqueuelen 1000
10
11ip -6 addr add $GWIP/96 dev $INTERFACE
12ip -6 route add $SUBNET/80 dev $INTERFACE
13
14ip neigh add proxy $GWIP dev @mainInterface@
diff --git a/systems/eldiron/vpn/tinc/tinc.conf b/systems/eldiron/vpn/tinc/tinc.conf
new file mode 100644
index 0000000..7a4f103
--- /dev/null
+++ b/systems/eldiron/vpn/tinc/tinc.conf
@@ -0,0 +1,11 @@
1BindToAddress = * 655
2BindToAddress = * 1194
3
4Name = @hostName@
5Interface = vpn6
6
7Mode = switch
8
9Device = /dev/net/tun
10GraphDumpFile = /var/lib/tinc/@network@/tinc_graph
11PrivateKeyFile = @keyFile@
diff --git a/systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html b/systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html
new file mode 100644
index 0000000..ff6dbf3
--- /dev/null
+++ b/systems/eldiron/websites/_www/googleb6d69446ff4ca3e5.html
@@ -0,0 +1 @@
google-site-verification: googleb6d69446ff4ca3e5.html \ No newline at end of file
diff --git a/systems/eldiron/websites/_www/index.htm b/systems/eldiron/websites/_www/index.htm
new file mode 100644
index 0000000..0274251
--- /dev/null
+++ b/systems/eldiron/websites/_www/index.htm
@@ -0,0 +1,9 @@
1<!DOCTYPE html>
2<html>
3 <head>
4 <title>Hello World HTML</title>
5 </head>
6 <body>
7 <h1>It works!</h1>
8 </body>
9</html>
diff --git a/systems/eldiron/websites/_www/maintenance_immae.html b/systems/eldiron/websites/_www/maintenance_immae.html
new file mode 100644
index 0000000..90f265f
--- /dev/null
+++ b/systems/eldiron/websites/_www/maintenance_immae.html
@@ -0,0 +1,58 @@
1<!doctype html>
2<html>
3 <head>
4 <title>Maintenance</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
6 <style>
7 body {
8 padding-left: 5px;
9 padding-right: 5px;
10 text-align: center;
11 margin: auto;
12 font: 20px Helvetica, sans-serif;
13 color: #333;
14 }
15 h1 {
16 margin: 0px;
17 font-size: 40px;
18 }
19 article {
20 display: block;
21 max-width: 650px;
22 margin: 0 auto;
23 padding-top: 30px;
24 }
25 article + article {
26 border-top: 1px solid lightgrey;
27 }
28 article div {
29 text-align: justify;
30 }
31 a {
32 color: #dc8100;
33 text-decoration: none;
34 }
35 a:hover {
36 color: #333;
37 }
38 </style>
39 <script type="text/javascript">
40 setTimeout(function () { location.reload(true); }, 5000);
41 </script>
42 </head>
43 <body>
44 <article>
45 <h1>Erreur serveur ou maintenance en cours&nbsp;!</h1>
46 <div>
47 <p>Une mise à jour ou une opération de maintenance est en cours sur le site. <a href="">Retentez</a> dans quelques instants ou patientez, la page se rechargera automatiquement.</p>
48 </div>
49 </article>
50
51 <article>
52 <h1>Server error or website in maintenance!</h1>
53 <div>
54 <p>An update or a maintenance is on track on the website. Please try <a href="">again</a> in a few seconds or wait, the page will reload automatically.</p>
55 </div>
56 </article>
57 </body>
58</html>
diff --git a/systems/eldiron/websites/_www/nossl.html b/systems/eldiron/websites/_www/nossl.html
new file mode 100644
index 0000000..4401a80
--- /dev/null
+++ b/systems/eldiron/websites/_www/nossl.html
@@ -0,0 +1,11 @@
1<!DOCTYPE html>
2<html>
3 <head>
4 <title>No SSL site</title>
5 </head>
6 <body>
7 <h1>No SSL on this site</h1>
8 <p>Use for wifi networks with login page that doesn't work well with
9 https.</p>
10 </body>
11</html>
diff --git a/systems/eldiron/websites/assets/default.nix b/systems/eldiron/websites/assets/default.nix
new file mode 100644
index 0000000..02a4952
--- /dev/null
+++ b/systems/eldiron/websites/assets/default.nix
@@ -0,0 +1,98 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.tools.assets;
4 fetchFont = v: pkgs.runCommand "fetch-font" {
5 outputHashAlgo = "sha256";
6 outputHashMode = "recursive";
7 outputHash = v.sha256;
8 } ''
9 mkdir -p $out
10 ${pkgs.curl}/bin/curl -k --output $out/font.css -H "User-Agent: Firefox/100.0" "${v.url}"
11 cat $out/font.css | grep -o "https://[^ )]*" | while read url; do
12 filename=$(echo "$url" | sed -e "s@.*/@@g")
13 ${pkgs.curl}/bin/curl -k --output "$out/$filename" "$url"
14 sed -i -e "s@$url@./$filename@" "$out/font.css"
15 done
16 '';
17 fetchTgz = v: pkgs.runCommand "fetch-tgz" {
18 outputHashAlgo = "sha256";
19 outputHashMode = "recursive";
20 outputHash = v.sha256;
21 } ''
22 mkdir -p $out
23 cd $out
24 ${pkgs.curl}/bin/curl -L -k "${v.url}" | tar -xz --strip-components=${builtins.toString v.tgzRemoveComponents}
25 '';
26 fetchAsset = v:
27 if v.assetType == "googleFont"
28 then fetchFont v
29 else if v.assetType == "tgz"
30 then fetchTgz v
31 else pkgs.fetchurl { url = v.url; sha256 = v.sha256; };
32 assets_urls = lib.mapAttrs (k: fetchAsset) config.myEnv.tools.assets;
33 assets = pkgs.runCommand "assets" {} (''
34 mkdir -p $out
35 cp -a ${./static}/* $out/
36 '' + builtins.concatStringsSep "\n"
37 (lib.mapAttrsToList (k: v: ''
38 if [ -d "${v}" ]; then
39 mkdir -p "$out/$(dirname "${k}")"
40 cp -a "${v}" "$out/${k}"
41 chmod -R u+rwX "$out/${k}"
42 else
43 install -D -m644 -T "${v}" "$out/${k}"
44 fi
45 '') assets_urls));
46in
47{
48 options.myServices.websites.tools.assets = {
49 enable = lib.mkEnableOption "Enable assets website";
50 };
51 config = lib.mkIf cfg.enable {
52 myServices.dns.zones."immae.eu".subdomains.assets =
53 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
54
55 services.websites.env.production.bindMounts."/run/imgproxy" = {};
56 security.acme.certs.eldiron.extraDomainNames = [ "assets.immae.eu" ];
57 services.websites.env.tools.vhostConfs.assets = {
58 certName = "eldiron";
59 hosts = [ "assets.immae.eu" ];
60 root = assets;
61 extraConfig = [
62 ''
63 Use Apaxy "${assets}" "title"
64 <Directory "${assets}">
65 Options Indexes FollowSymlinks
66 AllowOverride None
67 Require all granted
68 Header always set Last-Modified "Tue, 01 Jan 2020 00:00:00 GMT"
69 Header always set Cache-Control "public, max-age=31536000, immutable"
70 Header always set Access-Control-Allow-Origin "*"
71 Header always set Access-Control-Expose-Headers "*"
72 </Directory>
73
74 MergeSlashes OFF
75 <Location /p>
76 ProxyPass unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu
77 ProxyPassReverse unix:///run/imgproxy/imgproxy.sock|http://assets.immae.eu
78 </Location>
79 ''
80 ];
81 };
82 systemd.services.imgproxy = {
83 description = "IMG proxy";
84 wantedBy = [ "multi-user.target" ];
85
86 environment = {
87 IMGPROXY_NETWORK = "unix";
88 IMGPROXY_BIND = "%t/imgproxy/imgproxy.sock";
89 };
90 serviceConfig = {
91 User = "wwwrun";
92 Group = "wwwrun";
93 RuntimeDirectory = "imgproxy";
94 ExecStart = "${pkgs.imgproxy}/bin/imgproxy";
95 };
96 };
97 };
98}
diff --git a/systems/eldiron/websites/assets/static/favicon.png b/systems/eldiron/websites/assets/static/favicon.png
new file mode 100644
index 0000000..1caf5a4
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/favicon.png
Binary files differ
diff --git a/systems/eldiron/websites/assets/static/logger.png b/systems/eldiron/websites/assets/static/logger.png
new file mode 100644
index 0000000..d9579fb
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/logger.png
Binary files differ
diff --git a/systems/eldiron/websites/assets/static/logger.txt b/systems/eldiron/websites/assets/static/logger.txt
new file mode 100644
index 0000000..50dccc6
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/logger.txt
@@ -0,0 +1,3 @@
1Downloaded from https://commons.wikimedia.org/wiki/File:Ghost2.svg
2Licence Creative Commons Attribution-Share Alike 4.0 International
3https://creativecommons.org/licenses/by-sa/4.0/deed.en
diff --git a/systems/eldiron/websites/assets/static/logo.jpg b/systems/eldiron/websites/assets/static/logo.jpg
new file mode 100644
index 0000000..a89172d
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/logo.jpg
Binary files differ
diff --git a/systems/eldiron/websites/assets/static/logo.txt b/systems/eldiron/websites/assets/static/logo.txt
new file mode 100644
index 0000000..327e62a
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/logo.txt
@@ -0,0 +1,7 @@
1size: 2
2dpi: 72
3background: white
4plot_type: fullcolor
5center: "whole"
6whitespace: 0.5
7format: jpg
diff --git a/systems/eldiron/websites/assets/static/logo_big.jpg b/systems/eldiron/websites/assets/static/logo_big.jpg
new file mode 100644
index 0000000..45448f2
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/logo_big.jpg
Binary files differ
diff --git a/systems/eldiron/websites/assets/static/logo_big.txt b/systems/eldiron/websites/assets/static/logo_big.txt
new file mode 100644
index 0000000..ce92c09
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/logo_big.txt
@@ -0,0 +1,7 @@
1size: 4
2dpi: 72
3background: white
4plot_type: fullcolor
5center: "whole"
6whitespace: 0.5
7format: jpg
diff --git a/systems/eldiron/websites/assets/static/logo_center.jpg b/systems/eldiron/websites/assets/static/logo_center.jpg
new file mode 100644
index 0000000..6b177e0
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/logo_center.jpg
Binary files differ
diff --git a/systems/eldiron/websites/assets/static/logo_center.txt b/systems/eldiron/websites/assets/static/logo_center.txt
new file mode 100644
index 0000000..60a8f1c
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/logo_center.txt
@@ -0,0 +1,8 @@
1size: 4
2dpi: 72
3background: white
4plot_type: fullcolor
5center: "center"
6whitespace: 0.5
7format: jpg
8
diff --git a/systems/eldiron/websites/assets/static/monitoring.png b/systems/eldiron/websites/assets/static/monitoring.png
new file mode 100644
index 0000000..0024fee
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/monitoring.png
Binary files differ
diff --git a/systems/eldiron/websites/assets/static/monitoring.txt b/systems/eldiron/websites/assets/static/monitoring.txt
new file mode 100644
index 0000000..9f3e13a
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/monitoring.txt
@@ -0,0 +1,3 @@
1Downloaded from https://commons.wikimedia.org/wiki/File:Magnifying_Glass2.svg
2Licence Creative Commons CC0 1.0 Universal Public Domain Dedication
3https://creativecommons.org/publicdomain/zero/1.0/deed.en
diff --git a/systems/eldiron/websites/assets/static/photos/ct.jpg b/systems/eldiron/websites/assets/static/photos/ct.jpg
new file mode 100644
index 0000000..ab7876b
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/photos/ct.jpg
Binary files differ
diff --git a/systems/eldiron/websites/assets/static/photos/fretlink.jpg b/systems/eldiron/websites/assets/static/photos/fretlink.jpg
new file mode 100644
index 0000000..c941e1d
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/photos/fretlink.jpg
Binary files differ
diff --git a/systems/eldiron/websites/assets/static/photos/raton.jpg b/systems/eldiron/websites/assets/static/photos/raton.jpg
new file mode 100644
index 0000000..a859e1c
--- /dev/null
+++ b/systems/eldiron/websites/assets/static/photos/raton.jpg
Binary files differ
diff --git a/systems/eldiron/websites/cloud/add-htaccess.php b/systems/eldiron/websites/cloud/add-htaccess.php
new file mode 100644
index 0000000..e11d943
--- /dev/null
+++ b/systems/eldiron/websites/cloud/add-htaccess.php
@@ -0,0 +1,70 @@
1<?php
2
3namespace bantu\IniGetWrapper { class IniGetWrapper { } }
4namespace Psr\Log { class LoggerInterface { } }
5namespace OCP {
6 class IL10N { }
7 class Defaults { }
8}
9namespace OCP\Security {
10 class ISecureRandom { }
11}
12namespace OC {
13 class Installer { }
14 class SystemConfig {
15 private $a;
16 public function __construct($a) {
17 $this->a = $a;
18 }
19 public function getValue($val, $default) {
20 if(isset($this->a[$val])) {
21 return $this->a[$val];
22 } else {
23 return $default;
24 }
25 }
26 }
27}
28
29namespace {
30 class NServer {
31 private $argv;
32 public function __construct($argv) {
33 $this->argv = $argv;
34 }
35 public function getSystemConfig() {
36 return new OC\SystemConfig(Array(
37 'htaccess.RewriteBase' => $this->argv[1],
38 ));
39 }
40
41 public function get($c) {
42 return new $c();
43 }
44 public function getL10N() {
45 return new \OCP\IL10N();
46 }
47 public function query($c) {
48 return new $c();
49 }
50 public function getSecureRandom() {
51 return new \OCP\Security\ISecureRandom();
52 }
53 }
54
55 class OC {
56 public static Bool $CLI = false;
57 public static $SERVERROOT = '.';
58 public static $WEBROOT;
59 public static \NServer $server;
60 }
61
62 \OC::$server = new NServer($argv);
63 \OC::$WEBROOT = $argv[1];
64
65 require "./lib/private/Setup.php";
66 $result = \OC\Setup::updateHtaccess();
67 if ($result) {
68 echo "done";
69 };
70}
diff --git a/systems/eldiron/websites/cloud/default.nix b/systems/eldiron/websites/cloud/default.nix
new file mode 100644
index 0000000..e1df883
--- /dev/null
+++ b/systems/eldiron/websites/cloud/default.nix
@@ -0,0 +1,151 @@
1{ lib, pkgs, config, ... }:
2let
3 ncfg = config.myServices.tools.cloud.farm.instances.immae;
4 env = config.myEnv.tools.nextcloud;
5 cfg = config.myServices.websites.tools.cloud;
6in {
7 options.myServices.websites.tools.cloud = {
8 enable = lib.mkEnableOption "enable cloud website";
9 };
10
11 config = lib.mkIf cfg.enable {
12 myServices.dns.zones."immae.eu".subdomains.cloud =
13 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
14
15 myServices.chatonsProperties.hostings.nextcloud = {
16 file.datetime = "2022-08-21T19:50:00";
17 hosting = {
18 name = "Nextcloud";
19 description = "The self-hosted productivity platform that keeps you in control";
20 website = "https://cloud.immae.eu/";
21 logo = "https://cloud.immae.eu/core/img/favicon.ico";
22 type = "INSTANCE";
23 status.level = "OK";
24 status.description = "OK";
25 registration.load = "OPEN";
26 install.type = "PACKAGE";
27 };
28 };
29 myServices.chatonsProperties.services.nextcloud = {
30 file.datetime = "2022-08-21T19:50:00";
31 service = {
32 name = "Nextcloud";
33 description = "The self-hosted productivity platform that keeps you in control";
34 website = "https://cloud.immae.eu/";
35 logo = "https://cloud.immae.eu/core/img/favicon.ico";
36 status.level = "OK";
37 status.description = "OK";
38 registration."" = ["MEMBER" "CLIENT"];
39 registration.load = "OPEN";
40 install.type = "PACKAGE";
41 guide.user = "https://www.immae.eu/docs/nextcloud.html";
42 };
43 software = {
44 name = "Nextcloud";
45 website = "https://nextcloud.com/";
46 license.url = "https://github.com/nextcloud/server/blob/master/COPYING";
47 license.name = "GNU Affero General Public License v3.0";
48 version = ncfg.rootDir.version;
49 source.url = "https://github.com/nextcloud/server";
50 modules = map (a: a.appName) ncfg.rootDir.apps;
51 };
52 };
53
54 myServices.tools.cloud.farm.instances.immae = {
55 nextcloud = pkgs.webapps-nextcloud_27.override ({
56 # Allow /index.php redirects
57 postInstall = ''
58 cd $out
59 ${pkgs.php81}/bin/php ${./add-htaccess.php} /
60 '';
61 });
62 apps = a: [
63 a.side_menu a.audioplayer a.bookmarks a.calendar a.carnet a.contacts
64 a.cookbook a.deck a.extract a.files_markdown a.files_mindmap
65 a.gpxpod a.keeweb a.maps a.metadata a.music
66 a.notes a.passman a.polls a.spreed a.tasks
67 ];
68 varDir = "/var/lib/nextcloud";
69 secretsPath = "webapps/tools-nextcloud";
70 phpPackage = pkgs.php81;
71 # Be careful when editing that: config from here takes
72 # precedence over the regular one, but if a key got removed, it my
73 # still exist in the default config file
74 config = let
75 env = config.myEnv.tools.nextcloud;
76 in {
77 "dbtype" = "pgsql";
78 "dbname" = env.postgresql.database;
79 "dbhost" = env.postgresql.socket;
80 "dbport" = "";
81 "dbtableprefix" = "oc_";
82 "dbuser" = env.postgresql.user;
83 "dbpassword" = env.postgresql.password;
84
85 "instanceid" = env.instance_id;
86 "passwordsalt" = env.password_salt;
87 "secret" = env.secret;
88
89 "trusted_domains" = [ "cloud.immae.eu" ];
90 "overwrite.cli.url" = "https://cloud.immae.eu";
91
92 "lost_password_link" = "disabled";
93
94 "remember_login_cookie_lifetime" = 60*60*24*30;
95 "session_keepalive" = true;
96 "session_lifefime" = 60*60*24*30;
97
98 "maxZipInputSize" = 0;
99 "allowZipDownload" = true;
100
101 # set by Carnet
102 "has_rebuilt_cache" = true;
103
104 "memcache.distributed" = "\\OC\\Memcache\\Redis";
105 "memcache.locking" = "\\OC\\Memcache\\Redis";
106 "filelocking.enabled" = true;
107 "redis" = {
108 "host" = env.redis.socket;
109 "port" = 0;
110 "dbindex" = env.redis.db;
111 };
112
113 "ldapIgnoreNamingRules" = false;
114 "ldapProviderFactory" = "\\OCA\\User_LDAP\\LDAPProviderFactory";
115
116 "mail_smtpmode" = "sendmail";
117 "mail_smtphost" = "127.0.0.1";
118 "mail_smtpname" = "";
119 "mail_smtppassword" = "";
120 "mail_from_address" = "nextcloud";
121 "mail_smtpauth" = false;
122 "mail_domain" = "tools.immae.eu";
123 };
124 };
125 services.websites.env.tools.modules = [ "proxy_fcgi" ];
126
127 security.acme.certs.eldiron.extraDomainNames = [ "cloud.immae.eu" ];
128 services.websites.env.tools.vhostConfs.cloud = {
129 certName = "eldiron";
130 hosts = ["cloud.immae.eu" ];
131 root = ncfg.rootDir;
132 extraConfig = [
133 ncfg.vhost
134 ];
135 };
136
137 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
138 myServices.monitoring.fromMasterObjects.service = [
139 {
140 service_description = "owncloud website is running on cloud.immae.eu";
141 host_name = config.hostEnv.fqdn;
142 use = "external-web-service";
143 check_command = ["check_https" "cloud.immae.eu" "/" "a safe home for all your data"];
144
145 servicegroups = "webstatus-webapps";
146 _webstatus_name = "Nextcloud";
147 _webstatus_url = "https://cloud.immae.eu";
148 }
149 ];
150 };
151}
diff --git a/systems/eldiron/websites/cloud/farm.nix b/systems/eldiron/websites/cloud/farm.nix
new file mode 100644
index 0000000..df24cba
--- /dev/null
+++ b/systems/eldiron/websites/cloud/farm.nix
@@ -0,0 +1,221 @@
1{ lib, pkgs, config, ... }:
2let
3 scfg = config.secrets.fullPaths;
4 cfg = config.myServices.tools.cloud.farm;
5 apacheUser = config.services.websites.env.production.user;
6 apacheGroup = config.services.websites.env.production.group;
7 additionalConfs = icfg: lib.attrsets.mapAttrs (n: v: pkgs.writeText "${n}.json" (builtins.toJSON v)) icfg.rootDir.otherConfig;
8 overrideConfig = icfg: pkgs.writeText "override.config.php" ''
9 <?php
10 $CONFIG = json_decode(file_get_contents("${icfg.configOverride}"), TRUE);
11 '';
12 toVhost = icfg: ''
13 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
14 SetEnv NEXTCLOUD_CONFIG_DIR "${icfg.varDir}/config"
15 <Directory ${icfg.rootDir}>
16 AcceptPathInfo On
17 DirectoryIndex index.php
18 Options FollowSymlinks
19 Require all granted
20 AllowOverride all
21
22 <IfModule mod_headers.c>
23 Header always set Strict-Transport-Security "max-age=15552000; includeSubDomains; preload"
24 </IfModule>
25 <FilesMatch "\.php$">
26 CGIPassAuth on
27 SetHandler "proxy:unix:${config.services.phpfpm.pools.${icfg.phpPoolName}.socket}|fcgi://localhost"
28 </FilesMatch>
29
30 </Directory>
31 '';
32in
33{
34 options.myServices.tools.cloud.farm = {
35 instances = lib.mkOption {
36 description = "Instances names for the nextcloud Farm";
37 default = {};
38 type = lib.types.attrsOf (lib.types.submodule ({ name, config, ... }: {
39 options = {
40 nextcloud = lib.mkOption {
41 description = "Nextcloud version to use";
42 default = pkgs.webapps-nextcloud_27;
43 type = lib.types.package;
44 };
45 apps = lib.mkOption {
46 description = "Applications to use";
47 default = a: [];
48 #type = functionTo (listOf packages)
49 type = lib.types.unspecified;
50 };
51 config = lib.mkOption {
52 description = "Config keys";
53 default = {};
54 type = lib.types.attrsOf lib.types.unspecified;
55 };
56 secretsPath = lib.mkOption {
57 description = "Path in secrets to nextcloud config file";
58 default = "websites/${name}/nextcloud";
59 type = lib.types.str;
60 };
61 configOverride = lib.mkOption {
62 description = "Path to config override";
63 readOnly = true;
64 default = scfg."${config.secretsPath}";
65 type = lib.types.path;
66 };
67 phpPackage = lib.mkOption {
68 description = "PHP package to use";
69 default = pkgs.php81;
70 type = lib.types.package;
71 apply = v: (v.withExtensions({ enabled, all }: enabled ++ [ all.redis all.apcu all.opcache all.imagick all.sysvsem ])).override { extraConfig = ''
72 apc.enable_cli = 1
73 apc.enabled = 1
74 '';
75 };
76 };
77 rootDir = lib.mkOption {
78 description = "Instance root dirs";
79 readOnly = true;
80 type = lib.types.package;
81 default = config.nextcloud.withApps config.apps;
82 };
83 phpPoolName = lib.mkOption {
84 description = "Php pool name for the instance";
85 readOnly = true;
86 type = lib.types.str;
87 default = "nextcloud_farm_" + name;
88 };
89 phpBaseDir = lib.mkOption {
90 description = "Php basedir for the instance";
91 readOnly = true;
92 type = lib.types.str;
93 default = builtins.concatStringsSep ":" (
94 [ config.rootDir config.varDir ]
95 ++ config.rootDir.apps
96 ++ [ config.configOverride (overrideConfig config) ]
97 ++ (builtins.attrValues (additionalConfs config))
98 );
99 };
100 varDir = lib.mkOption {
101 description = "Instance var dir";
102 type = lib.types.path;
103 default = "/var/lib/nextcloud_farm/${name}";
104 };
105 vhost = lib.mkOption {
106 description = "Instance vhost config";
107 readOnly = true;
108 type = lib.types.str;
109 default = toVhost config;
110 };
111 };
112 }));
113 };
114 };
115
116 config = lib.mkIf (builtins.length (builtins.attrNames cfg.instances) > 0) {
117 systemd.services = lib.mapAttrs' (k: v: lib.nameValuePair ("phpfpm-" + v.phpPoolName) {
118 after = lib.mkAfter [ "postgresql.service" ];
119 wants = [ "postgresql.service" ];
120 serviceConfig.ExecStartPre =
121 "+${pkgs.writeScript "phpfpm-nextcloud-${k}-pre-start" ''
122 #!${pkgs.stdenv.shell}
123
124 install -m 0755 -o wwwrun -g wwwrun -d ${v.varDir} -d ${v.varDir}/config
125 ${builtins.concatStringsSep "\n" (lib.attrsets.mapAttrsToList (n: f:
126 "ln -sf ${f} ${v.varDir}/config/${n}.json"
127 ) (additionalConfs v))}
128 ln -sf ${overrideConfig v} ${v.varDir}/config/override.config.php
129 ''}";
130 }) cfg.instances;
131 services.phpfpm.pools = lib.mapAttrs' (k: v: lib.nameValuePair v.phpPoolName {
132 user = apacheUser;
133 group = apacheGroup;
134 settings = {
135 "listen.owner" = apacheUser;
136 "listen.group" = apacheGroup;
137 "pm" = "dynamic";
138 "pm.max_children" = "60";
139 "pm.start_servers" = "3";
140 "pm.min_spare_servers" = "3";
141 "pm.max_spare_servers" = "3";
142 "pm.process_idle_timeout" = "60";
143
144 "php_admin_value[output_buffering]" = "0";
145 "php_admin_value[max_execution_time]" = "1800";
146 "php_admin_value[zend_extension]" = "opcache";
147 "php_value[apc.enable_cli]" = "1";
148 "php_value[apc.enabled]" = "1";
149 #already enabled by default?
150 #"php_value[opcache.enable]" = "1";
151 "php_value[opcache.enable_cli]" = "1";
152 "php_value[opcache.interned_strings_buffer]" = "32";
153 "php_value[opcache.max_accelerated_files]" = "10000";
154 "php_value[opcache.memory_consumption]" = "128";
155 "php_value[opcache.save_comments]" = "1";
156 "php_value[opcache.revalidate_freq]" = "1";
157 "php_admin_value[memory_limit]" = "512M";
158
159 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${v.phpBaseDir}:/proc/cpuinfo:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
160 "php_admin_value[session.save_handler]" = "redis";
161 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:NextcloudFarm:${k}:'";
162 };
163 phpPackage = v.phpPackage;
164 }) cfg.instances;
165 environment.systemPackages = let
166 toOcc = name: icfg: pkgs.writeScriptBin "nextcloud-occ-${name}" ''
167 #! ${pkgs.stdenv.shell}
168 cd ${icfg.rootDir}
169 NEXTCLOUD_CONFIG_DIR="${icfg.varDir}/config" \
170 exec \
171 sudo -E -u wwwrun ${icfg.phpPackage}/bin/php \
172 -d memory_limit=512M \
173 -c ${icfg.phpPackage}/etc/php.ini \
174 occ $*
175 '';
176 in lib.mapAttrsToList toOcc cfg.instances;
177 services.cron = {
178 enable = true;
179 systemCronJobs = let
180 toScript = name: icfg: pkgs.writeScriptBin "nextcloud-cron" ''
181 #! ${pkgs.stdenv.shell}
182 export LOCALE_ARCHIVE=/run/current-system/sw/lib/locale/locale-archive
183 export PATH=/run/wrappers/bin:$PATH
184 export NEXTCLOUD_CONFIG_DIR="${icfg.varDir}/config"
185 ${icfg.phpPackage}/bin/php -c ${icfg.phpPackage}/etc/php.ini -d memory_limit=512M -f ${icfg.rootDir}/cron.php
186 '';
187 toLine = name: icfg: ''
188 */5 * * * * wwwrun ${toScript name icfg}/bin/nextcloud-cron
189 '';
190 in lib.mapAttrsToList toLine cfg.instances;
191 };
192
193 secrets.keys = lib.mapAttrs' (name: v: lib.nameValuePair "${v.secretsPath}" {
194 user = "wwwrun";
195 group = "wwwrun";
196 permissions = "0600";
197 # Be careful when editing that: config from this file takes
198 # precedence over the regular one, but if a key got removed, it my
199 # still exist in the default config file
200 text = builtins.toJSON ( {
201 "datadirectory" = if name == "immae" then v.varDir else "${v.varDir}/data";
202
203 "appstoreenabled" = false;
204 "integrity.check.disabled" = true;
205 "updater.release.channel" = "stable";
206 "upgrade.disable-web" = true;
207
208 "memcache.local" = "\\OC\\Memcache\\APCu";
209
210 "htaccess.RewriteBase" = "/";
211
212 "loglevel" = 2;
213 "logtimezone" = "Europe/Paris";
214
215 "default_phone_region" = "FR";
216 "skeletondirectory" = "";
217 "theme" = "";
218 } // v.config);
219 }) cfg.instances;
220 };
221}
diff --git a/systems/eldiron/websites/commento/default.nix b/systems/eldiron/websites/commento/default.nix
new file mode 100644
index 0000000..c5131b8
--- /dev/null
+++ b/systems/eldiron/websites/commento/default.nix
@@ -0,0 +1,84 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.tools.commento;
4 env = config.myEnv.tools.commento;
5 webPort = "${host}:${port}";
6 port = toString env.listenPort;
7 host = "localhost";
8 postgresql_url = "postgres://${env.postgresql.user}:${env.postgresql.password}@localhost:${env.postgresql.port}/${env.postgresql.database}?sslmode=disable";
9in
10{
11 options.myServices.websites.tools.commento = {
12 enable = lib.mkEnableOption "Enable commento website";
13 };
14 config = lib.mkIf cfg.enable {
15 myServices.dns.zones."immae.eu".subdomains.commento =
16 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
17
18 myServices.chatonsProperties.services.commento = {
19 file.datetime = "2022-08-21T01:11:00";
20 service = {
21 name = "Commento";
22 description = "Commento is a fast, privacy-focused commenting platform";
23 website = "https://commento.immae.eu";
24 logo = "https://commento.immae.eu/images/logo.svg";
25 status.level = "OK";
26 status.description = "OK";
27 registration."" = ["MEMBER" "CLIENT"];
28 registration.load = "OPEN";
29 install.type = "PACKAGE";
30 };
31 software = {
32 name = "Commento";
33 website = "https://www.commento.io/";
34 license.url = "https://gitlab.com/commento/commento/-/blob/master/LICENSE";
35 license.name = "MIT License";
36 version = pkgs.commento.version;
37 source.url = "https://gitlab.com/commento/commento";
38 };
39 };
40 secrets.keys = {
41 "commento/env" = {
42 permissions = "0400";
43 text = ''
44 COMMENTO_ORIGIN=https://commento.immae.eu/
45 COMMENTO_PORT=${port}
46 COMMENTO_POSTGRES=${postgresql_url}
47 COMMENTO_FORBID_NEW_OWNERS=true
48 COMMENTO_BIND_ADDRESS=${host}
49 COMMENTO_GZIP_STATIC=true
50 COMMENTO_SMTP_HOST=${env.smtp.host}
51 COMMENTO_SMTP_PORT=${env.smtp.port}
52 COMMENTO_SMTP_USERNAME=${env.smtp.email}
53 COMMENTO_SMTP_PASSWORD=${env.smtp.password}
54 COMMENTO_SMTP_FROM_ADDRESS=${env.smtp.email}
55 '';
56 };
57 };
58
59 security.acme.certs.eldiron.extraDomainNames = [ "commento.immae.eu" ];
60 services.websites.env.tools.vhostConfs.commento = {
61 certName = "eldiron";
62 hosts = [ "commento.immae.eu" ];
63 root = null;
64 extraConfig = [
65 ''
66 ProxyPass / http://${webPort}/
67 ProxyPassReverse / http://${webPort}/
68 ProxyPreserveHost On
69 ''
70 ];
71 };
72 systemd.services.commento = {
73 description = "Commento";
74 wantedBy = [ "multi-user.target" ];
75 requires = ["postgresql.service"];
76 after = ["network.target" "postgresql.service"];
77 serviceConfig = {
78 User = "wwwrun";
79 ExecStart = "${pkgs.commento}/commento";
80 EnvironmentFile = config.secrets.fullPaths."commento/env";
81 };
82 };
83 };
84}
diff --git a/systems/eldiron/websites/cryptpad/default.nix b/systems/eldiron/websites/cryptpad/default.nix
new file mode 100644
index 0000000..4635548
--- /dev/null
+++ b/systems/eldiron/websites/cryptpad/default.nix
@@ -0,0 +1,89 @@
1{ config, pkgs, lib, ... }:
2let
3 cfg = config.myServices.websites.tools.cryptpad;
4 envCfg = config.myEnv.tools.cryptpad;
5 domain = "cryptpad.immae.eu";
6 port = envCfg.port;
7 configFile = pkgs.writeText "config.js" ''
8 // ${pkgs.cryptpad}/lib/node_modules/cryptpad/config/config.example.js
9 module.exports = {
10 httpUnsafeOrigin: 'https://${domain}',
11 httpPort: ${toString port},
12 adminEmail: '${envCfg.email}',
13 filePath: './datastore/',
14 archivePath: './data/archive',
15 pinPath: './data/pins',
16 taskPath: './data/tasks',
17 blockPath: './block',
18 blobPath: './blob',
19 blobStagingPath: './data/blobstage',
20 decreePath: './data/decrees',
21 logPath: './data/logs',
22 logToStdout: false,
23 logLevel: 'info',
24 logFeedback: false,
25 verbose: false,
26 inactiveTime: false,
27 maxUploadSize: 100 * 1024 * 1024,
28 adminKeys: ${builtins.toJSON envCfg.admins},
29 };
30 '';
31in
32{
33 options.myServices.websites.tools.cryptpad.enable = lib.mkEnableOption "Enable Cryptpad";
34 config = lib.mkIf cfg.enable {
35 myServices.dns.zones."immae.eu".subdomains.cryptpad =
36 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
37
38 myServices.chatonsProperties.hostings.cryptpad = {
39 file.datetime = "2022-08-21T01:20:00";
40 hosting = {
41 name = "Cryptpad";
42 description = "Collaboration suite, encrypted and open-source";
43 website = "https://cryptpad.immae.eu/";
44 logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png";
45 type = "INSTANCE";
46 status.level = "OK";
47 status.description = "OK";
48 registration.load = "OPEN";
49 install.type = "PACKAGE";
50 };
51 };
52 myServices.chatonsProperties.services.cryptpad = {
53 file.datetime = "2022-08-21T01:20:00";
54 service = {
55 name = "Cryptpad";
56 description = "Collaboration suite, encrypted and open-source";
57 website = "https://cryptpad.immae.eu/";
58 logo = "https://cryptpad.immae.eu/customize/favicon/main-favicon.png";
59 status.level = "OK";
60 status.description = "OK";
61 registration."" = ["NONE" "FREE" "MEMBER" "CLIENT"];
62 registration.load = "OPEN";
63 install.type = "PACKAGE";
64 };
65 software = {
66 name = "Cryptpad";
67 website = "https://cryptpad.org/";
68 license.url = "https://github.com/xwiki-labs/cryptpad/blob/main/LICENSE";
69 license.name = "GNU Affero General Public License v3.0";
70 version = pkgs.cryptpad.version;
71 source.url = "https://github.com/xwiki-labs/cryptpad";
72 };
73 };
74 myServices.tools.cryptpad.farm.hosts.immaeEu = {
75 inherit domain port;
76 config = configFile;
77 };
78 services.websites.env.tools.modules = [ "proxy_wstunnel" ];
79 security.acme.certs.eldiron.extraDomainNames = [ domain ];
80 services.websites.env.tools.vhostConfs.cryptpad = {
81 certName = "eldiron";
82 hosts = [domain];
83 root = config.myServices.tools.cryptpad.farm.vhostRoots.immaeEu;
84 extraConfig = [
85 config.myServices.tools.cryptpad.farm.vhosts.immaeEu
86 ];
87 };
88 };
89}
diff --git a/systems/eldiron/websites/cryptpad/farm.nix b/systems/eldiron/websites/cryptpad/farm.nix
new file mode 100644
index 0000000..58393ab
--- /dev/null
+++ b/systems/eldiron/websites/cryptpad/farm.nix
@@ -0,0 +1,186 @@
1{ pkgs, config, lib, ... }:
2let
3 cfg = config.myServices.tools.cryptpad.farm;
4 toService = name:
5 let
6 inherit (cfg.hosts.${name}) package config;
7 in {
8 description = "Cryptpad ${name} Service";
9 wantedBy = [ "multi-user.target" ];
10 after = [ "networking.target" ];
11 serviceConfig = {
12 User = "cryptpad";
13 Group = "cryptpad";
14 Environment = [
15 "CRYPTPAD_CONFIG=${config}"
16 "HOME=%S/cryptpad/${name}"
17 ];
18 ExecStart = "${package}/bin/cryptpad";
19 PrivateTmp = true;
20 Restart = "always";
21 StateDirectory = "cryptpad/${name}";
22 WorkingDirectory = "%S/cryptpad/${name}";
23 };
24 };
25 toVhostRoot = name: "${cfg.hosts.${name}.package}/lib/node_modules/cryptpad";
26 toVhost = name:
27 let
28 inherit (cfg.hosts.${name}) package domain port;
29 api_domain = domain;
30 files_domain = domain;
31 in ''
32 RewriteEngine On
33
34 Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
35 Header set X-XSS-Protection "1; mode=block"
36 Header set X-Content-Type-Options "nosniff"
37 Header set Access-Control-Allow-Origin "*"
38 Header set Permissions-Policy "interest-cohort=()"
39
40 Header set Cross-Origin-Resource-Policy "cross-origin"
41 <If "%{REQUEST_URI} =~ m#^/(sheet|presentation|doc)/.*$#">
42 Header set Cross-Origin-Opener-Policy "same-origin"
43 </If>
44 Header set Cross-Origin-Embedder-Policy "require-corp"
45
46 ErrorDocument 404 /customize.dist/404.html
47
48 <If "%{QUERY_STRING} =~ m#ver=.*?#">
49 Header set Cache-Control "max-age=31536000"
50 </If>
51 <If "%{REQUEST_URI} =~ m#^/.*(\/|\.html)$#">
52 Header set Cache-Control "no-cache"
53 </If>
54
55 SetEnv styleSrc "'unsafe-inline' 'self' ${domain}"
56 SetEnv connectSrc "'self' https://${domain} ${domain} https://${api_domain} blob: wss://${api_domain} ${api_domain} ${files_domain}"
57 SetEnv fontSrc "'self' data: ${domain}"
58 SetEnv imgSrc "'self' data: * blob: ${domain}"
59 SetEnv frameSrc "'self' blob:"
60 SetEnv mediaSrc "'self' data: * blob: ${domain}"
61 SetEnv childSrc "https://${domain}"
62 SetEnv workerSrc "https://${domain}"
63 SetEnv scriptSrc "'self' 'unsafe-eval' 'unsafe-inline' resource: ${domain}"
64
65 Header set Content-Security-Policy "default-src 'none'; child-src %{childSrc}e; worker-src %{workerSrc}e; media-src %{mediaSrc}e; style-src %{styleSrc}e; script-src %{scriptSrc}e; connect-src %{connectSrc}e; font-src %{fontSrc}e; img-src %{imgSrc}e; frame-src %{frameSrc}e;"
66
67 RewriteCond %{HTTP:UPGRADE} ^WebSocket$ [NC]
68 RewriteCond %{HTTP:CONNECTION} Upgrade$ [NC]
69 RewriteRule .* ws://localhost:${toString port}%{REQUEST_URI} [P,NE,QSA,L]
70
71 RewriteRule ^/customize/(.*)$ /customize.dist/$1 [L]
72
73 ProxyPassMatch "^/(api/(config|broadcast).*)$" "http://localhost:${toString port}/$1"
74 ProxyPassReverse /api http://localhost:${toString port}/api
75 ProxyPreserveHost On
76 RequestHeader set X-Real-IP %{REMOTE_ADDR}s
77
78 Alias /blob /var/lib/cryptpad/${name}/blob
79 <Directory /var/lib/cryptpad/${name}/blob>
80 Require all granted
81 AllowOverride None
82 </Directory>
83 Alias /block /var/lib/cryptpad/${name}/block
84 <Directory /var/lib/cryptpad/${name}/block>
85 Require all granted
86 AllowOverride None
87 </Directory>
88 <LocationMatch /blob/>
89 Header set Cache-Control "max-age=31536000"
90 Header set Access-Control-Allow-Origin "*"
91 Header set Access-Control-Allow-Methods "GET, POST, OPTIONS"
92 Header set Access-Control-Allow-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Content-Length"
93 Header set Access-Control-Expose-Headers "DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,Content-Range,Range,Content-Length"
94
95 RewriteCond %{REQUEST_METHOD} OPTIONS
96 RewriteRule ^(.*)$ $1 [R=204,L]
97 </LocationMatch>
98
99 <LocationMatch /block/>
100 Header set Cache-Control "max-age=0"
101 </locationMatch>
102
103 RewriteRule ^/(register|login|settings|user|pad|drive|poll|slide|code|whiteboard|file|media|profile|contacts|todo|filepicker|debug|kanban|sheet|support|admin|notifications|teams|calendar|presentation|doc)$ $1/ [R=302,L]
104
105 RewriteCond %{DOCUMENT_ROOT}/www/%{REQUEST_URI} -f
106 RewriteRule (.*) /www/$1 [L]
107
108 RewriteCond %{DOCUMENT_ROOT}/www/%{REQUEST_URI}/index.html -f
109 RewriteRule (.*) /www/$1/index.html [L]
110
111 RewriteCond %{DOCUMENT_ROOT}/customize.dist/%{REQUEST_URI} -f
112 RewriteRule (.*) /customize.dist/$1 [L]
113
114 <Directory ${package}/lib/node_modules/cryptpad/www>
115 AllowOverride None
116 Require all granted
117 DirectoryIndex index.html
118 </Directory>
119 <Directory ${package}/lib/node_modules/cryptpad/customize.dist>
120 AllowOverride None
121 Require all granted
122 DirectoryIndex index.html
123 </Directory>
124 '';
125in
126{
127 options.myServices.tools.cryptpad.farm = {
128 hosts = lib.mkOption {
129 default = {};
130 description = "Hosts to install";
131 type = lib.types.attrsOf (lib.types.submodule {
132 options = {
133 port = lib.mkOption {
134 type = lib.types.port;
135 };
136 package = lib.mkOption {
137 type = lib.types.package;
138 description = "Cryptpad package to use";
139 default = pkgs.cryptpad;
140 };
141 domain = lib.mkOption {
142 type = lib.types.str;
143 description = "Domain for main host";
144 };
145 config = lib.mkOption {
146 type = lib.types.path;
147 description = "Path to configuration";
148 };
149 };
150 });
151 };
152 vhosts = lib.mkOption {
153 description = "Instance vhosts configs";
154 readOnly = true;
155 type = lib.types.attrsOf lib.types.str;
156 default = lib.genAttrs (builtins.attrNames cfg.hosts) toVhost;
157 };
158 vhostRoots = lib.mkOption {
159 description = "Instance vhosts document roots";
160 readOnly = true;
161 type = lib.types.attrsOf lib.types.path;
162 default = lib.genAttrs (builtins.attrNames cfg.hosts) toVhostRoot;
163 };
164 vhostVarDirs = lib.mkOption {
165 description = "Instance vhosts var dirs";
166 readOnly = true;
167 type = lib.types.attrsOf lib.types.path;
168 default = lib.genAttrs (builtins.attrNames cfg.hosts) (n: "/var/lib/cryptpad/${n}");
169 };
170 };
171 config = {
172 users.users = lib.optionalAttrs (cfg.hosts != {}) {
173 cryptpad = {
174 uid = config.ids.uids.cryptpad;
175 group = "cryptpad";
176 description = "Cryptpad user";
177 };
178 };
179 users.groups = lib.optionalAttrs (cfg.hosts != {}) {
180 cryptpad = {
181 gid = config.ids.gids.cryptpad;
182 };
183 };
184 systemd.services = lib.listToAttrs (map (n: lib.nameValuePair "cryptpad-${n}" (toService n)) (builtins.attrNames cfg.hosts));
185 };
186}
diff --git a/systems/eldiron/websites/dav/davical.nix b/systems/eldiron/websites/dav/davical.nix
new file mode 100644
index 0000000..b418cb8
--- /dev/null
+++ b/systems/eldiron/websites/dav/davical.nix
@@ -0,0 +1,128 @@
1{ stdenv, fetchurl, gettext, writeText, env, awl, davical, config }:
2rec {
3 keys."webapps/dav-davical" = {
4 user = apache.user;
5 group = apache.group;
6 permissions = "0400";
7 text = ''
8 <?php
9 $c->pg_connect[] = "dbname=${env.postgresql.database} user=${env.postgresql.user} host=${env.postgresql.socket} password=${env.postgresql.password}";
10
11 $c->readonly_webdav_collections = false;
12
13 $c->admin_email ='davical@tools.immae.eu';
14
15 $c->restrict_setup_to_admin = true;
16
17 $c->collections_always_exist = false;
18
19 $c->external_refresh = 60;
20
21 $c->enable_scheduling = true;
22
23 $c->iMIP = (object) array("send_email" => true);
24
25 $c->authenticate_hook['optional'] = false;
26 $c->authenticate_hook['call'] = 'LDAP_check';
27 $c->authenticate_hook['config'] = array(
28 'host' => '${env.ldap.host}',
29 'port' => '389',
30 'startTLS' => 'yes',
31 'bindDN'=> '${env.ldap.dn}',
32 'passDN'=> '${env.ldap.password}',
33 'protocolVersion' => '3',
34 'baseDNUsers'=> array('ou=users,${env.ldap.base}', 'ou=group_users,${env.ldap.base}'),
35 'filterUsers' => '${env.ldap.filter}',
36 'baseDNGroups' => 'ou=groups,${env.ldap.base}',
37 'filterGroups' => 'memberOf=cn=groups,${env.ldap.dn}',
38 'mapping_field' => array(
39 "username" => "uid",
40 "fullname" => "cn",
41 "email" => "mail",
42 "modified" => "modifyTimestamp",
43 ),
44 'format_updated'=> array('Y' => array(0,4),'m' => array(4,2),'d'=> array(6,2),'H' => array(8,2),'M'=>array(10,2),'S' => array(12,2)),
45 /** used to set default value for all users, will be overcharged by ldap if defined also in mapping_field **/
46 // 'default_value' => array("date_format_type" => "E","locale" => "fr_FR"),
47 'group_mapping_field' => array(
48 "username" => "cn",
49 "updated" => "modifyTimestamp",
50 "fullname" => "givenName",
51 "displayname" => "givenName",
52 "members" => "memberUid",
53 "email" => "mail",
54 ),
55 );
56
57 $c->do_not_sync_from_ldap = array('admin' => true);
58 include('drivers_ldap.php');
59 '';
60 };
61 webapp = davical.override { davical_config = config.secrets.fullPaths."webapps/dav-davical"; };
62 webRoot = "${webapp}/htdocs";
63 apache = rec {
64 user = "wwwrun";
65 group = "wwwrun";
66 modules = [ "proxy_fcgi" ];
67 root = webRoot;
68 vhostConf = socket: ''
69 Alias /davical "${root}"
70 Alias /caldav.php "${root}/caldav.php"
71 <Directory "${root}">
72 DirectoryIndex index.php index.html
73 AcceptPathInfo On
74 AllowOverride None
75 Require all granted
76
77 <FilesMatch "\.php$">
78 CGIPassAuth on
79 SetHandler "proxy:unix:${socket}|fcgi://localhost"
80 </FilesMatch>
81
82 RewriteEngine On
83 <IfModule mod_headers.c>
84 Header unset Access-Control-Allow-Origin
85 Header unset Access-Control-Allow-Methods
86 Header unset Access-Control-Allow-Headers
87 Header unset Access-Control-Allow-Credentials
88 Header unset Access-Control-Expose-Headers
89
90 Header always set Access-Control-Allow-Origin "*"
91 Header always set Access-Control-Allow-Methods "GET,POST,OPTIONS,PROPFIND,PROPPATCH,REPORT,PUT,MOVE,DELETE,LOCK,UNLOCK"
92 Header always set Access-Control-Allow-Headers "User-Agent,Authorization,Content-type,Depth,If-match,If-None-Match,Lock-Token,Timeout,Destination,Overwrite,Prefer,X-client,X-Requested-With"
93 Header always set Access-Control-Allow-Credentials false
94 Header always set Access-Control-Expose-Headers "Etag,Preference-Applied"
95
96 RewriteCond %{HTTP:Access-Control-Request-Method} !^$
97 RewriteCond %{REQUEST_METHOD} OPTIONS
98 RewriteRule ^(.*)$ $1 [R=200,L]
99 </IfModule>
100 </Directory>
101 '';
102 };
103 phpFpm = rec {
104 serviceDeps = [ "postgresql.service" "openldap.service" ];
105 basedir = builtins.concatStringsSep ":" [ webapp config.secrets.fullPaths."webapps/dav-davical" awl ];
106 pool = {
107 "listen.owner" = apache.user;
108 "listen.group" = apache.group;
109 "pm" = "dynamic";
110 "pm.max_children" = "60";
111 "pm.start_servers" = "2";
112 "pm.min_spare_servers" = "1";
113 "pm.max_spare_servers" = "10";
114
115 # Needed to avoid clashes in browser cookies (same domain)
116 "php_value[session.name]" = "DavicalPHPSESSID";
117 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
118 "php_admin_value[include_path]" = "${awl}/inc:${webapp}/inc";
119 "php_admin_value[session.save_handler]" = "redis";
120 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Davical:'";
121 "php_flag[magic_quotes_gpc]" = "Off";
122 "php_flag[register_globals]" = "Off";
123 "php_admin_value[error_reporting]" = "E_ALL & ~E_NOTICE";
124 "php_admin_value[default_charset]" = "utf-8";
125 "php_flag[magic_quotes_runtime]" = "Off";
126 };
127 };
128}
diff --git a/systems/eldiron/websites/dav/default.nix b/systems/eldiron/websites/dav/default.nix
new file mode 100644
index 0000000..109715d
--- /dev/null
+++ b/systems/eldiron/websites/dav/default.nix
@@ -0,0 +1,140 @@
1{ lib, pkgs, config, ... }:
2let
3 infcloud = rec {
4 root = pkgs.webapps-infcloud;
5 vhostConf = ''
6 Alias /carddavmate ${root}
7 Alias /caldavzap ${root}
8 Alias /infcloud ${root}
9 <Directory ${root}>
10 AllowOverride All
11 Options FollowSymlinks
12 Require all granted
13 DirectoryIndex index.html
14 </Directory>
15 '';
16 };
17 davical = pkgs.callPackage ./davical.nix {
18 env = config.myEnv.tools.davical;
19 davical = pkgs.webapps-davical;
20 awl = pkgs.webapps-awl;
21 inherit config;
22 };
23
24 cfg = config.myServices.websites.tools.dav;
25in {
26 options.myServices.websites.tools.dav = {
27 enable = lib.mkEnableOption "enable dav website";
28 };
29
30 config = lib.mkIf cfg.enable {
31 myServices.dns.zones."immae.eu".subdomains.dav =
32 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
33
34 myServices.chatonsProperties.services = {
35 davical = {
36 file.datetime = "2022-08-21T01:33:00";
37 service = {
38 name = "Davical";
39 description = "DAViCal is a server for calendar sharing";
40 website = "https://dav.immae.eu";
41 logo = "https://www.davical.org/images/logo.gif";
42 status.level = "OK";
43 status.description = "OK";
44 registration."" = ["MEMBER" "CLIENT"];
45 registration.load = "OPEN";
46 install.type = "PACKAGE";
47 };
48 software = {
49 name = "Davical";
50 website = "https://www.davical.org/";
51 license.url = "https://gitlab.com/davical-project/davical/-/blob/master/COPYING";
52 license.name = "GNU General Public License Version 2";
53 version = pkgs.webapps-davical.version;
54 source.url = "https://gitlab.com/davical-project/davical/";
55 modules = "infcloud";
56 };
57 };
58 #calendar = {
59 # file.datetime = "2022-08-22T00:00:00";
60 # service = {
61 # name = "Calendar";
62 # description = "Opensource CalDAV web client";
63 # website = "https://dav.immae.eu/caldavzap/";
64 # logo = "https://dav.immae.eu/caldavzap/images/infcloud_logo.svg";
65 # status.level = "OK";
66 # status.description = "OK";
67 # registration."" = ["MEMBER" "CLIENT"];
68 # registration.load = "OPEN";
69 # install.type = "PACKAGE";
70 # };
71 # software = {
72 # name = "InfCloud";
73 # website = "https://inf-it.com/open-source/clients/infcloud/";
74 # license.url = "https://www.gnu.org/licenses/agpl-3.0.en.html";
75 # license.name = "GNU Affero General Public License (version 3.0)";
76 # version = pkgs.webapps-infcloud.version;
77 # source.url = "https://inf-it.com/open-source/clients/infcloud/";
78 # };
79 #};
80 #contacts = {
81 # file.datetime = "2022-08-22T00:00:00";
82 # service = {
83 # name = "Contacts";
84 # description = "Opensource Carddav web client";
85 # website = "https://dav.immae.eu/carddavmate/";
86 # logo = "https://dav.immae.eu/caldavzap/images/infcloud_logo.svg";
87 # status.level = "OK";
88 # status.description = "OK";
89 # registration."" = ["MEMBER" "CLIENT"];
90 # registration.load = "OPEN";
91 # install.type = "PACKAGE";
92 # };
93 # software = {
94 # name = "InfCloud";
95 # website = "https://inf-it.com/open-source/clients/infcloud/";
96 # license.url = "https://www.gnu.org/licenses/agpl-3.0.en.html";
97 # license.name = "GNU Affero General Public License (version 3.0)";
98 # version = pkgs.webapps-infcloud.version;
99 # source.url = "https://inf-it.com/open-source/clients/infcloud/";
100 # };
101 #};
102 };
103 secrets.keys = davical.keys;
104 services.websites.env.tools.modules = davical.apache.modules;
105
106 security.acme.certs.eldiron.extraDomainNames = [ "dav.immae.eu" ];
107 services.websites.env.tools.vhostConfs.dav = {
108 certName = "eldiron";
109 hosts = ["dav.immae.eu" ];
110 root = ./www;
111 extraConfig = [
112 infcloud.vhostConf
113 (davical.apache.vhostConf config.services.phpfpm.pools.davical.socket)
114 ];
115 };
116
117 services.phpfpm.pools = {
118 davical = {
119 user = config.services.websites.env.tools.user;
120 group = config.services.websites.env.tools.group;
121 settings = davical.phpFpm.pool;
122 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
123 };
124 };
125 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
126 myServices.monitoring.fromMasterObjects.service = [
127 {
128 service_description = "davical website is running on dav.immae.eu";
129 host_name = config.hostEnv.fqdn;
130 use = "external-web-service";
131 check_command = ["check_https" "dav.immae.eu" "/davical/" "Log On Please"];
132
133 servicegroups = "webstatus-webapps";
134 _webstatus_name = "Davical";
135 _webstatus_url = "https://dav.immae.eu/davical";
136 }
137 ];
138 };
139}
140
diff --git a/systems/eldiron/websites/dav/www/index.html b/systems/eldiron/websites/dav/www/index.html
new file mode 100644
index 0000000..91c25ba
--- /dev/null
+++ b/systems/eldiron/websites/dav/www/index.html
@@ -0,0 +1,42 @@
1<!doctype html>
2<html lang="fr">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Dav configuration</title>
7 <style type="text/css">
8 body {
9 padding-top: 1em;
10 padding-left: 5px;
11 padding-right: 5px;
12 text-align: left;
13 margin: auto;
14 font: 20px Helvetica, sans-serif;
15 color: #333;
16 height: 100%;
17 min-height: 100%;
18 }
19 span.code {
20 font-family: monospace;
21 }
22 </style>
23 </head>
24 <body>
25 <p>
26 Dav configuration:
27 <ul>
28 <li>Server: <span class="code">https://dav.immae.eu/caldav.php</span>
29 </li>
30 </ul>
31 </p>
32 <p>Clients:
33 <ul>
34 <li><a href="/infcloud">Infcloud (calendar, address book, todo lists)</a></li>
35 <li><a href="/carddavmate">Carddavmate (address book)</a></li>
36 <li><a href="/caldavzap">Caldavzap (calendar, todo lists)</a></li>
37 <li><a href="/davical">Davical (Manage dav account)</a></li>
38 </ul>
39 </p>
40 </body>
41</html>
42
diff --git a/systems/eldiron/websites/db/default.nix b/systems/eldiron/websites/db/default.nix
new file mode 100644
index 0000000..339948f
--- /dev/null
+++ b/systems/eldiron/websites/db/default.nix
@@ -0,0 +1,32 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.tools.db;
4in {
5 options.myServices.websites.tools.db = {
6 enable = lib.mkEnableOption "enable database's website";
7 };
8
9 config = lib.mkIf cfg.enable {
10 services.websites.env.tools.modules = [ "proxy_fcgi" ];
11 security.acme.certs.eldiron.extraDomainNames = [ "db-1.immae.eu" ];
12 services.websites.env.tools.vhostConfs.db-1 = {
13 certName = "eldiron";
14 hosts = ["db-1.immae.eu" ];
15 root = null;
16 extraConfig = [ ''
17 Alias /adminer ${pkgs.webapps-adminer}
18 <Directory ${pkgs.webapps-adminer}>
19 DirectoryIndex index.php
20 <FilesMatch "\.php$">
21 SetHandler "proxy:unix:${config.services.phpfpm.pools.adminer.socket}|fcgi://localhost"
22 </FilesMatch>
23
24 Use LDAPConnect
25 Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu
26 Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu
27 </Directory>
28 ''
29 ];
30 };
31 };
32}
diff --git a/systems/eldiron/websites/default.nix b/systems/eldiron/websites/default.nix
new file mode 100644
index 0000000..68205de
--- /dev/null
+++ b/systems/eldiron/websites/default.nix
@@ -0,0 +1,319 @@
1{ lib, pkgs, config, mypackages-lib, ... }:
2let
3 www_root = ./_www;
4 theme_root = (mypackages-lib.apache-theme {}).theme;
5 apacheConfig = {
6 shutdownconfig = {
7 # Only give 5 seconds to workers to finish their work
8 extraConfig = ''
9 GracefulShutdownTimeout 5
10 '';
11 };
12 cache = {
13 # This setting permits to ignore time-based cache for files in the
14 # nix store:
15 # If a client requires an If-Modified-Since from timestamp 1, then
16 # this header is removed, and if the response contains a
17 # too old Last-Modified tag, then it is removed too
18 extraConfig = ''
19 <If "%{HTTP:If-Modified-Since} =~ /01 Jan 1970 00:00:01/" >
20 RequestHeader unset If-Modified-Since
21 </If>
22 Header unset Last-Modified "expr=%{LAST_MODIFIED} < 19991231235959"
23 '';
24 };
25 gzip = {
26 modules = [ "deflate" "filter" ];
27 extraConfig = ''
28 AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/javascript
29 '';
30 };
31 macros = {
32 modules = [ "macro" ];
33 };
34 stats = {
35 extraConfig = ''
36 <Macro Stats %{domain}>
37 Alias /webstats ${config.services.webstats.dataDir}/%{domain}
38 <Directory ${config.services.webstats.dataDir}/%{domain}>
39 DirectoryIndex index.html
40 AllowOverride None
41 Require all granted
42 </Directory>
43 <Location /webstats>
44 Use LDAPConnect
45 Require ldap-group cn=%{domain},ou=stats,cn=httpd,ou=services,dc=immae,dc=eu
46 </Location>
47 </Macro>
48 '';
49 };
50 ldap = {
51 modules = [ "ldap" "authnz_ldap" ];
52 extraConfig = ''
53 <IfModule ldap_module>
54 LDAPSharedCacheSize 500000
55 LDAPCacheEntries 1024
56 LDAPCacheTTL 600
57 LDAPOpCacheEntries 1024
58 LDAPOpCacheTTL 600
59 </IfModule>
60
61 Include ${config.secrets.fullPaths."apache-ldap"}
62 '';
63 };
64 global = {
65 extraConfig = ''
66 ErrorDocument 500 /maintenance_immae.html
67 ErrorDocument 501 /maintenance_immae.html
68 ErrorDocument 502 /maintenance_immae.html
69 ErrorDocument 503 /maintenance_immae.html
70 ErrorDocument 504 /maintenance_immae.html
71 Alias /maintenance_immae.html ${www_root}/maintenance_immae.html
72 ProxyPass /maintenance_immae.html !
73
74 AliasMatch "(.*)/googleb6d69446ff4ca3e5.html" ${www_root}/googleb6d69446ff4ca3e5.html
75 <Directory ${www_root}>
76 AllowOverride None
77 Require all granted
78 </Directory>
79 '';
80 };
81 apaxy = {
82 extraConfig = (mypackages-lib.apache-theme { inherit theme_root; }).apacheConfig;
83 };
84 http2 = {
85 modules = [ "http2" ];
86 extraConfig = ''
87 Protocols h2 http/1.1
88 '';
89 };
90 customLog = {
91 extraConfig = ''
92 LogFormat "%{Host}i:%p %h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combinedVhost
93 '';
94 };
95 };
96 makeModules = lib.lists.flatten (lib.attrsets.mapAttrsToList (n: v: v.modules or []) apacheConfig);
97 makeExtraConfig = (builtins.filter (x: x != null) (lib.attrsets.mapAttrsToList (n: v: v.extraConfig or null) apacheConfig));
98 moomin = let
99 lines = lib.splitString "\n" (lib.fileContents ./moomin.txt);
100 pad = width: str: let
101 padWidth = width - lib.stringLength str;
102 padding = lib.concatStrings (lib.genList (lib.const "0") padWidth);
103 in lib.optionalString (padWidth > 0) padding + str;
104 in
105 lib.imap0 (i: e: ''Header always set "X-Moomin-${pad 2 (builtins.toString i)}" "${e}"'') lines;
106in
107{
108 imports = [
109 ./immae/production.nix
110 ./immae/release.nix
111
112 # Tools
113 ./assets
114 ./cloud
115 ./cloud/farm.nix
116 ./cryptpad
117 ./cryptpad/farm.nix
118 ./commento
119 ./dav
120 ./vpn
121 ./db
122 ./diaspora
123 ./ether
124 ./git
125 ./im
126 ./mastodon
127 ./mgoblin
128 ./peertube
129 ./performance
130 ./tools
131 ./mail
132 ./stats
133 ./visio
134 ./kanboard/farm.nix
135
136 # Games
137 ./games/codenames
138 ./games/terraforming-mars
139 ];
140
141 options.myServices.websites.enable = lib.mkEnableOption "enable websites";
142
143 config = lib.mkIf config.myServices.websites.enable {
144 myServices.dns.zones."immae.eu".subdomains = with config.myServices.dns.helpers;
145 {
146 games = ips servers.eldiron.ips.main;
147 nossl = ips servers.eldiron.ips.main;
148 };
149
150 myServices.chatonsProperties.hostings.web = {
151 file.datetime = "2022-08-22T01:30:00";
152 hosting = {
153 name = "Hébergement Web";
154 description = "Service d'hébergement web avec php/mysql/postgresql";
155 website = "https://www.immae.eu";
156 status.level = "OK";
157 status.description = "OK";
158 registration.load = "OPEN";
159 install.type = "PACKAGE";
160 };
161 software = {
162 name = "Apache Httpd";
163 website = "https://httpd.apache.org/";
164 license.url = "https://www.apache.org/licenses/";
165 license.name = "Apache License Version 2";
166 version = pkgs.apacheHttpd.version;
167 source.url = "https://httpd.apache.org/download.cgi";
168 modules = "openssh,pure-ftpd";
169 };
170 };
171 users.users.wwwrun.extraGroups = [ "keys" ];
172 networking.firewall.allowedTCPPorts = [ 80 443 ];
173
174 secrets.keys."apache-ldap" = {
175 user = "wwwrun";
176 group = "wwwrun";
177 permissions = "0400";
178 text = ''
179 <Macro LDAPConnect>
180 <IfModule authnz_ldap_module>
181 AuthLDAPURL ldap://ldap.immae.eu:389/dc=immae,dc=eu STARTTLS
182 AuthLDAPBindDN cn=httpd,ou=services,dc=immae,dc=eu
183 AuthLDAPBindPassword "${config.myEnv.httpd.ldap.password}"
184 AuthType Basic
185 AuthName "Authentification requise (Acces LDAP)"
186 AuthBasicProvider ldap
187 </IfModule>
188 </Macro>
189 '';
190 };
191
192 system.activationScripts = {
193 httpd = ''
194 install -d -m 0755 /var/lib/acme/acme-challenges
195 install -d -m 0750 -o wwwrun -g wwwrun /var/lib/php/sessions
196 '';
197 };
198
199 services.phpfpm = {
200 phpOptions = ''
201 session.save_path = "/var/lib/php/sessions"
202 post_max_size = 20M
203 ; 15 days (seconds)
204 session.gc_maxlifetime = 1296000
205 ; 30 days (minutes)
206 session.cache_expire = 43200
207 '';
208 settings = {
209 log_level = "notice";
210 };
211 };
212
213 services.websites.env.production = {
214 enable = true;
215 moduleType = "container";
216 adminAddr = "httpd@immae.eu";
217 bindMounts."/var/lib/ftp" = {};
218 # FIXME: Bind directly the needed files
219 bindMounts."/var/secrets" = {};
220 bindMounts."/var/lib/goaccess" = {};
221 bindMounts."/var/lib/acme" = {};
222 bindMounts."/run/phpfpm" = {};
223 ips =
224 let ips = config.myEnv.servers.eldiron.ips.production;
225 in (ips.ip4 or []) ++ (ips.ip6 or []);
226 modules = makeModules;
227 extraConfig = makeExtraConfig;
228 fallbackVhost = {
229 certName = "eldiron";
230 hosts = ["eldiron.immae.eu" ];
231 root = www_root;
232 extraConfig = [ "DirectoryIndex index.htm" ];
233 };
234 };
235
236 services.websites.env.integration = {
237 enable = true;
238 moduleType = "container";
239 adminAddr = "httpd@immae.eu";
240 bindMounts."/var/lib/ftp" = {};
241 bindMounts."/var/secrets" = {};
242 bindMounts."/var/lib/goaccess" = {};
243 bindMounts."/var/lib/acme" = {};
244 bindMounts."/run/phpfpm" = {};
245 ips =
246 let ips = config.myEnv.servers.eldiron.ips.integration;
247 in (ips.ip4 or []) ++ (ips.ip6 or []);
248 modules = makeModules;
249 extraConfig = makeExtraConfig ++ moomin;
250 fallbackVhost = {
251 certName = "integration";
252 hosts = ["eldiron.immae.eu" ];
253 root = www_root;
254 extraConfig = [ "DirectoryIndex index.htm" ];
255 };
256 watchPaths = [ config.secrets.fullPaths."apache-ldap" ];
257 };
258
259 services.websites.env.tools = {
260 enable = true;
261 moduleType = "main";
262 adminAddr = "httpd@immae.eu";
263 ips =
264 let ips = config.myEnv.servers.eldiron.ips.main;
265 in (ips.ip4 or []) ++ (ips.ip6 or []);
266 modules = makeModules;
267 extraConfig = makeExtraConfig ++
268 [ ''
269 RedirectMatch ^/licen[cs]es?_et_tip(ping)?$ https://www.immae.eu/licences_et_tip.html
270 RedirectMatch ^/licen[cs]es?_and_tip(ping)?$ https://www.immae.eu/licenses_and_tipping.html
271 RedirectMatch ^/licen[cs]es?$ https://www.immae.eu/licenses_and_tipping.html
272 RedirectMatch ^/tip(ping)?$ https://www.immae.eu/licenses_and_tipping.html
273 RedirectMatch ^/(mentions|mentions_legales|legal)$ https://www.immae.eu/mentions.html
274 RedirectMatch ^/CGU$ https://www.immae.eu/CGU
275 ''
276 ];
277 nosslVhost = {
278 enable = true;
279 host = "nossl.immae.eu";
280 root = ./nossl;
281 };
282 fallbackVhost = {
283 certName = "eldiron";
284 hosts = ["eldiron.immae.eu" ];
285 root = www_root;
286 extraConfig = [ "DirectoryIndex index.htm" ];
287 };
288 watchPaths = [ config.secrets.fullPaths."apache-ldap" ];
289 };
290
291 myServices.websites = {
292 immae = {
293 production.enable = true;
294 release.enable = true;
295 };
296
297 tools.assets.enable = true;
298 tools.cloud.enable = true;
299 tools.commento.enable = true;
300 tools.cryptpad.enable = true;
301 tools.dav.enable = true;
302 tools.db.enable = true;
303 tools.diaspora.enable = true;
304 tools.etherpad-lite.enable = true;
305 tools.git.enable = true;
306 tools.mastodon.enable = true;
307 tools.mediagoblin.enable = true;
308 tools.peertube.enable = true;
309 tools.performance.enable = true;
310 tools.tools.enable = true;
311 tools.email.enable = true;
312 tools.stats.enable = false;
313 tools.visio.enable = true;
314
315 games.codenames.enable = true;
316 games.terraforming-mars.enable = true;
317 };
318 };
319}
diff --git a/systems/eldiron/websites/diaspora/default.nix b/systems/eldiron/websites/diaspora/default.nix
new file mode 100644
index 0000000..c536446
--- /dev/null
+++ b/systems/eldiron/websites/diaspora/default.nix
@@ -0,0 +1,224 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.diaspora;
4 root = "${dcfg.workdir}/public/";
5 cfg = config.myServices.websites.tools.diaspora;
6 dcfg = config.services.diaspora;
7in {
8 options.myServices.websites.tools.diaspora = {
9 enable = lib.mkEnableOption "enable diaspora's website";
10 };
11
12 config = lib.mkIf cfg.enable {
13 myServices.dns.zones."immae.eu".subdomains.diaspora =
14 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
15
16 myServices.chatonsProperties.services.diaspora = {
17 file.datetime = "2022-08-21T01:39:00";
18 service = {
19 name = "Diaspora";
20 description = "The online social world where you are in control";
21 website = "https://diaspora.immae.eu";
22 logo = "https://diaspora.immae.eu/assets/apple-touch-icon-9f7c9cc3923b4817fbb25bfeb0dd5fd34638827fd9c82b5a03f7b68e6e90806f.png";
23 status.level = "OK";
24 status.description = "OK";
25 registration."" = ["MEMBER" "CLIENT"];
26 registration.load = "OPEN";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "Diaspora*";
31 website = "https://diasporafoundation.org/";
32 license.url = "https://github.com/diaspora/diaspora/blob/develop/LICENSE";
33 license.name = "GNU Affero General Public License v3.0";
34 version = dcfg.package.version;
35 source.url = "https://github.com/diaspora/diaspora";
36 };
37 };
38 users.users.diaspora.extraGroups = [ "keys" ];
39
40 secrets.keys = {
41 "webapps/diaspora" = {
42 isDir = true;
43 user = "diaspora";
44 group = "diaspora";
45 permissions = "0500";
46 };
47 "webapps/diaspora/diaspora.yml" = {
48 user = "diaspora";
49 group = "diaspora";
50 permissions = "0400";
51 keyDependencies = [ pkgs.cacert ];
52 text = ''
53 configuration:
54 environment:
55 url: "https://diaspora.immae.eu/"
56 certificate_authorities: '${pkgs.cacert}/etc/ssl/certs/ca-bundle.crt'
57 redis: 'redis://${env.redis.host}:${env.redis.port}/${env.redis.db}'
58 sidekiq:
59 s3:
60 assets:
61 logging:
62 logrotate:
63 debug:
64 server:
65 listen: '${dcfg.sockets.rails}'
66 rails_environment: 'production'
67 chat:
68 server:
69 bosh:
70 log:
71 map:
72 mapbox:
73 privacy:
74 piwik:
75 statistics:
76 camo:
77 settings:
78 enable_registrations: false
79 welcome_message:
80 invitations:
81 open: false
82 paypal_donations:
83 community_spotlight:
84 captcha:
85 enable: false
86 terms:
87 maintenance:
88 remove_old_users:
89 default_metas:
90 csp:
91 services:
92 twitter:
93 tumblr:
94 wordpress:
95 mail:
96 enable: true
97 sender_address: 'diaspora@tools.immae.eu'
98 method: 'sendmail'
99 smtp:
100 sendmail:
101 location: '/run/wrappers/bin/sendmail'
102 admins:
103 account: "ismael"
104 podmin_email: 'diaspora@tools.immae.eu'
105 relay:
106 outbound:
107 inbound:
108 ldap:
109 enable: true
110 host: ${env.ldap.host}
111 port: 636
112 only_ldap: true
113 mail_attribute: mail
114 skip_email_confirmation: true
115 use_bind_dn: true
116 bind_dn: "${env.ldap.dn}"
117 bind_pw: "${env.ldap.password}"
118 search_base: "${env.ldap.base}"
119 search_filter: "${env.ldap.filter}"
120 production:
121 environment:
122 development:
123 environment:
124 '';
125 };
126 "webapps/diaspora/database.yml" = {
127 user = "diaspora";
128 group = "diaspora";
129 permissions = "0400";
130 text = ''
131 postgresql: &postgresql
132 adapter: postgresql
133 host: "${env.postgresql.socket}"
134 port: "${env.postgresql.port}"
135 username: "${env.postgresql.user}"
136 password: "${env.postgresql.password}"
137 encoding: unicode
138 common: &common
139 <<: *postgresql
140 combined: &combined
141 <<: *common
142 development:
143 <<: *combined
144 database: diaspora_development
145 production:
146 <<: *combined
147 database: ${env.postgresql.database}
148 test:
149 <<: *combined
150 database: "diaspora_test"
151 integration1:
152 <<: *combined
153 database: diaspora_integration1
154 integration2:
155 <<: *combined
156 database: diaspora_integration2
157 '';
158 };
159 "webapps/diaspora/secret_token.rb" = {
160 user = "diaspora";
161 group = "diaspora";
162 permissions = "0400";
163 text = ''
164 Diaspora::Application.config.secret_key_base = '${env.secret_token}'
165 '';
166 };
167 };
168
169 services.diaspora = {
170 enable = true;
171 withLdap = true;
172 dataDir = "/var/lib/diaspora_immae";
173 adminEmail = "diaspora@tools.immae.eu";
174 configDir = config.secrets.fullPaths."webapps/diaspora";
175 };
176
177 services.filesWatcher.diaspora = {
178 restart = true;
179 paths = [ dcfg.configDir ];
180 };
181
182 services.websites.env.tools.modules = [
183 "headers" "proxy" "proxy_http"
184 ];
185 security.acme.certs.eldiron.extraDomainNames = [ "diaspora.immae.eu" ];
186 services.websites.env.tools.vhostConfs.diaspora = {
187 certName = "eldiron";
188 hosts = [ "diaspora.immae.eu" ];
189 root = root;
190 extraConfig = [ ''
191 RewriteEngine On
192 RewriteCond %{DOCUMENT_ROOT}/%{REQUEST_FILENAME} !-f
193 RewriteRule ^/(.*)$ unix://${dcfg.sockets.rails}|http://diaspora.immae.eu/%{REQUEST_URI} [P,NE,QSA,L]
194
195 ProxyRequests Off
196 ProxyVia On
197 ProxyPreserveHost On
198 RequestHeader set X_FORWARDED_PROTO https
199
200 <Proxy *>
201 Require all granted
202 </Proxy>
203
204 <Directory ${root}>
205 Require all granted
206 Options -MultiViews
207 </Directory>
208 '' ];
209 };
210 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
211 myServices.monitoring.fromMasterObjects.service = [
212 {
213 service_description = "diaspora website is running on diaspora.immae.eu";
214 host_name = config.hostEnv.fqdn;
215 use = "external-web-service";
216 check_command = ["check_https" "diaspora.immae.eu" "/" "is the online social world where you are in control"];
217
218 servicegroups = "webstatus-webapps";
219 _webstatus_name = "Diaspora";
220 _webstatus_url = "https://diaspora.immae.eu/";
221 }
222 ];
223 };
224}
diff --git a/systems/eldiron/websites/ether/default.nix b/systems/eldiron/websites/ether/default.nix
new file mode 100644
index 0000000..3993553
--- /dev/null
+++ b/systems/eldiron/websites/ether/default.nix
@@ -0,0 +1,251 @@
1{ lib, pkgs, config, nixpkgsRaw, etherpad-lite, ... }:
2let
3 env = config.myEnv.tools.etherpad-lite;
4 cfg = config.myServices.websites.tools.etherpad-lite;
5 # Make sure we’re not rebuilding whole libreoffice just because of a
6 # dependency
7 libreoffice = nixpkgsRaw.libreoffice-fresh;
8 ecfg = config.services.etherpad-lite;
9in {
10 options.myServices.websites.tools.etherpad-lite = {
11 enable = lib.mkEnableOption "enable etherpad's website";
12 };
13
14 config = lib.mkIf cfg.enable {
15 myServices.dns.zones."immae.eu".subdomains.ether =
16 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
17
18 myServices.chatonsProperties.services.etherpad = {
19 file.datetime = "2021-01-04T00:01:00";
20 service = {
21 name = "Etherpad";
22 description = "Éditeur de texte collaboratif en temps réel. on peut y écrire simultanément.";
23 website = "https://ether.immae.eu";
24 logo = "https://ether.immae.eu/favicon.ico";
25 status.level = "OK";
26 status.description = "OK";
27 registration."" = ["NONE" "MEMBER" "CLIENT"];
28 registration.load = "OPEN";
29 install.type = "PACKAGE";
30 };
31 software = {
32 name = "Etherpad";
33 website = "https://etherpad.org/";
34 license.url = "https://github.com/ether/etherpad-lite/blob/develop/LICENSE";
35 license.name = "Apache License Version 2.0";
36 version = ecfg.package.version;
37 source.url = "https://github.com/ether/etherpad-lite";
38 modules = ecfg.package.moduleNames;
39 };
40 };
41 secrets.keys = {
42 "webapps/tools-etherpad-apikey" = {
43 permissions = "0400";
44 text = env.api_key;
45 };
46 "webapps/tools-etherpad-sessionkey" = {
47 permissions = "0400";
48 text = env.session_key;
49 };
50 "webapps/tools-etherpad" = {
51 permissions = "0400";
52 keyDependencies = [ libreoffice ];
53 text = ''
54 {
55 "title": "Etherpad",
56 "favicon": "favicon.ico",
57 "skinName": "colibris",
58 "skinVariants": "dark-toolbar light-background super-light-editor full-width-editor",
59
60 "ip": "",
61 "port" : "${ecfg.sockets.node}",
62 "showSettingsInAdminPage" : false,
63 "dbType" : "postgres",
64 "dbSettings" : {
65 "user" : "${env.postgresql.user}",
66 "host" : "${env.postgresql.socket}",
67 "password": "${env.postgresql.password}",
68 "database": "${env.postgresql.database}",
69 "charset" : "utf8mb4"
70 },
71
72 "defaultPadText" : "Welcome to Etherpad!\n\nThis pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!\n\nGet involved with Etherpad at http:\/\/etherpad.org\n",
73 "padOptions": {
74 "noColors": false,
75 "showControls": true,
76 "showChat": true,
77 "showLineNumbers": true,
78 "useMonospaceFont": false,
79 "userName": false,
80 "userColor": false,
81 "rtl": false,
82 "alwaysShowChat": false,
83 "chatAndUsers": false,
84 "lang": "fr"
85 },
86
87 "suppressErrorsInPadText" : false,
88 "requireSession" : false,
89 "editOnly" : false,
90 "sessionNoPassword" : false,
91 "minify" : false,
92 "maxAge" : 21600,
93 "abiword" : null,
94 "soffice" : "${libreoffice}/bin/soffice",
95 "tidyHtml" : "",
96 "allowUnknownFileEnds" : true,
97 "requireAuthentication" : false,
98 "requireAuthorization" : false,
99 "trustProxy" : true,
100 "disableIPlogging" : false,
101 "automaticReconnectionTimeout" : 0,
102 "scrollWhenFocusLineIsOutOfViewport": {
103 "percentage": {
104 "editionAboveViewport": 0,
105 "editionBelowViewport": 0
106 },
107 "duration": 0,
108 "scrollWhenCaretIsInTheLastLineOfViewport": false,
109 "percentageToScrollWhenUserPressesArrowUp": 0
110 },
111 "users": {
112 "admin": {
113 "password": "${env.adminPassword}",
114 "is_admin": true
115 },
116 "ldapauth": {
117 "hash": "invalid",
118 "url": "ldaps://${env.ldap.host}",
119 "accountBase": "${env.ldap.base}",
120 "accountPattern": "${env.ldap.filter}",
121 "displayNameAttribute": "cn",
122 "searchDN": "${env.ldap.dn}",
123 "searchPWD": "${env.ldap.password}",
124 "groupSearchBase": "${env.ldap.base}",
125 "groupAttribute": "member",
126 "groupAttributeIsDN": true,
127 "searchScope": "sub",
128 "groupSearch": "${env.ldap.group_filter}",
129 "anonymousReadonly": false
130 }
131 },
132 "ep_mypads": {
133 "warning": "This hash is stored in database, changing anything here will not have any consequence",
134 "ldap": {
135 "url": "ldaps://${env.ldap.host}",
136 "bindDN": "${env.ldap.dn}",
137 "bindCredentials": "${env.ldap.password}",
138 "searchBase": "${env.ldap.base}",
139 "searchFilter": "${env.ldap.filter}",
140 "properties": {
141 "login": "uid",
142 "email": "mail",
143 "firstname": "givenName",
144 "lastname": "sn"
145 },
146 "defaultLang": "fr"
147 }
148 },
149 "ep_comments_page": {
150 "displayCommentAsIcon": true,
151 "highlightSelectedText": true
152 },
153 "socketTransportProtocols" : ["xhr-polling", "jsonp-polling", "htmlfile"],
154 "loadTest": false,
155 "indentationOnNewLine": false,
156 "toolbar": {
157 "left": [
158 ["bold", "italic", "underline", "strikethrough"],
159 ["orderedlist", "unorderedlist", "indent", "outdent"],
160 ["undo", "redo"],
161 ["clearauthorship"]
162 ],
163 "right": [
164 ["importexport", "timeslider", "savedrevision"],
165 ["settings", "embed"],
166 ["showusers"]
167 ],
168 "timeslider": [
169 ["timeslider_export", "timeslider_returnToPad"]
170 ]
171 },
172 "loglevel": "INFO",
173 "logconfig" : { "appenders": [ { "type": "console" } ] }
174 }
175 '';
176 };
177 };
178 services.etherpad-lite = {
179 enable = true;
180 package = etherpad-lite.withModules (p: [
181 p.ep_align p.ep_bookmark p.ep_colors p.ep_comments_page
182 p.ep_cursortrace p.ep_delete_empty_pads p.ep_embedmedia
183 p.ep_font_size p.ep_headings2 p.ep_immae_buttons p.ep_ldapauth
184 p.ep_line_height p.ep_markdown p.ep_mypads p.ep_page_view
185 p.ep_previewimages p.ep_ruler p.ep_scrollto
186 p.ep_set_title_on_pad p.ep_subscript_and_superscript
187 p.ep_timesliderdiff
188 ]);
189 modules = [];
190 sessionKeyFile = config.secrets.fullPaths."webapps/tools-etherpad-sessionkey";
191 apiKeyFile = config.secrets.fullPaths."webapps/tools-etherpad-apikey";
192 configFile = config.secrets.fullPaths."webapps/tools-etherpad";
193 };
194
195 systemd.services.etherpad-lite.serviceConfig.SupplementaryGroups = "keys";
196 systemd.services.etherpad-lite-cleanup.serviceConfig.SupplementaryGroups = "keys";
197 # Needed so that they get in the closure
198 systemd.services.etherpad-lite.path = [ libreoffice pkgs.html-tidy ];
199
200 services.filesWatcher.etherpad-lite = {
201 restart = true;
202 paths = [ ecfg.sessionKeyFile ecfg.apiKeyFile ecfg.configFile ];
203 };
204
205 services.websites.env.tools.modules = [
206 "headers" "proxy" "proxy_http" "proxy_wstunnel"
207 ];
208 security.acme.certs.eldiron.extraDomainNames = [ "ether.immae.eu" ];
209 services.websites.env.tools.vhostConfs.etherpad-lite = {
210 certName = "eldiron";
211 hosts = [ "ether.immae.eu" ];
212 root = null;
213 extraConfig = [ ''
214 Header always set Strict-Transport-Security "max-age=31536000; includeSubdomains;"
215 RequestHeader set X-Forwarded-Proto "https"
216
217 RewriteEngine On
218
219 RewriteCond %{REQUEST_URI} ^/socket.io [NC]
220 RewriteCond %{QUERY_STRING} transport=websocket [NC]
221 RewriteRule /(.*) unix://${ecfg.sockets.node}|ws://ether.immae.eu/$1 [P,NE,QSA,L]
222
223 <IfModule mod_proxy.c>
224 ProxyVia On
225 ProxyRequests Off
226 ProxyPreserveHost On
227 ProxyPass / unix://${ecfg.sockets.node}|http://ether.immae.eu/
228 ProxyPassReverse / unix://${ecfg.sockets.node}|http://ether.immae.eu/
229 <Proxy *>
230 Options FollowSymLinks MultiViews
231 AllowOverride None
232 Require all granted
233 </Proxy>
234 </IfModule>
235 '' ];
236 };
237 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
238 myServices.monitoring.fromMasterObjects.service = [
239 {
240 service_description = "etherpad website is running on ether.immae.eu";
241 host_name = config.hostEnv.fqdn;
242 use = "external-web-service";
243 check_command = ["check_https" "ether.immae.eu" "/" "<title>Etherpad"];
244
245 servicegroups = "webstatus-webapps";
246 _webstatus_name = "Etherpad";
247 _webstatus_url = "https://ether.immae.eu/";
248 }
249 ];
250 };
251}
diff --git a/systems/eldiron/websites/games/codenames/codenames.patch b/systems/eldiron/websites/games/codenames/codenames.patch
new file mode 100644
index 0000000..9faf069
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/codenames.patch
@@ -0,0 +1,8306 @@
1diff --git a/elm.json b/elm.json
2index a0d276b..1b73a46 100644
3--- a/elm.json
4+++ b/elm.json
5@@ -3,7 +3,7 @@
6 "source-directories": [
7 "src"
8 ],
9- "elm-version": "0.19.0",
10+ "elm-version": "0.19.1",
11 "dependencies": {
12 "direct": {
13 "elm/browser": "1.0.1",
14@@ -15,12 +15,11 @@
15 "perzanko/elm-loading": "2.0.4"
16 },
17 "indirect": {
18- "Skinney/murmur3": "2.0.8",
19 "elm/bytes": "1.0.8",
20 "elm/file": "1.0.5",
21 "elm/time": "1.0.0",
22 "elm/virtual-dom": "1.0.2",
23- "rtfeldman/elm-css": "16.0.1",
24+ "rtfeldman/elm-css": "16.1.0",
25 "rtfeldman/elm-hex": "1.0.0"
26 }
27 },
28@@ -32,4 +31,4 @@
29 "elm/random": "1.0.0"
30 }
31 }
32-}
33\ No newline at end of file
34+}
35diff --git a/package-lock.json b/package-lock.json
36index 778b061..05a22ab 100644
37--- a/package-lock.json
38+++ b/package-lock.json
39@@ -4,196 +4,7963 @@
40 "lockfileVersion": 1,
41 "requires": true,
42 "dependencies": {
43+ "@babel/code-frame": {
44+ "version": "7.0.0",
45+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
46+ "integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
47+ "dev": true,
48+ "requires": {
49+ "@babel/highlight": "^7.0.0"
50+ }
51+ },
52+ "@babel/core": {
53+ "version": "7.3.4",
54+ "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz",
55+ "integrity": "sha512-jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==",
56+ "dev": true,
57+ "requires": {
58+ "@babel/code-frame": "^7.0.0",
59+ "@babel/generator": "^7.3.4",
60+ "@babel/helpers": "^7.2.0",
61+ "@babel/parser": "^7.3.4",
62+ "@babel/template": "^7.2.2",
63+ "@babel/traverse": "^7.3.4",
64+ "@babel/types": "^7.3.4",
65+ "convert-source-map": "^1.1.0",
66+ "debug": "^4.1.0",
67+ "json5": "^2.1.0",
68+ "lodash": "^4.17.11",
69+ "resolve": "^1.3.2",
70+ "semver": "^5.4.1",
71+ "source-map": "^0.5.0"
72+ },
73+ "dependencies": {
74+ "json5": {
75+ "version": "2.1.3",
76+ "resolved": "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz",
77+ "integrity": "sha512-KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==",
78+ "dev": true,
79+ "requires": {
80+ "minimist": "^1.2.5"
81+ }
82+ },
83+ "source-map": {
84+ "version": "0.5.7",
85+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
86+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
87+ "dev": true
88+ }
89+ }
90+ },
91+ "@babel/generator": {
92+ "version": "7.3.4",
93+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz",
94+ "integrity": "sha512-8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==",
95+ "dev": true,
96+ "requires": {
97+ "@babel/types": "^7.3.4",
98+ "jsesc": "^2.5.1",
99+ "lodash": "^4.17.11",
100+ "source-map": "^0.5.0",
101+ "trim-right": "^1.0.1"
102+ },
103+ "dependencies": {
104+ "source-map": {
105+ "version": "0.5.7",
106+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
107+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
108+ "dev": true
109+ }
110+ }
111+ },
112+ "@babel/helper-annotate-as-pure": {
113+ "version": "7.8.3",
114+ "resolved": "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz",
115+ "integrity": "sha512-6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==",
116+ "dev": true,
117+ "requires": {
118+ "@babel/types": "^7.8.3"
119+ },
120+ "dependencies": {
121+ "@babel/types": {
122+ "version": "7.9.5",
123+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
124+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
125+ "dev": true,
126+ "requires": {
127+ "@babel/helper-validator-identifier": "^7.9.5",
128+ "lodash": "^4.17.13",
129+ "to-fast-properties": "^2.0.0"
130+ }
131+ }
132+ }
133+ },
134+ "@babel/helper-builder-binary-assignment-operator-visitor": {
135+ "version": "7.8.3",
136+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz",
137+ "integrity": "sha512-5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==",
138+ "dev": true,
139+ "requires": {
140+ "@babel/helper-explode-assignable-expression": "^7.8.3",
141+ "@babel/types": "^7.8.3"
142+ },
143+ "dependencies": {
144+ "@babel/types": {
145+ "version": "7.9.5",
146+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
147+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
148+ "dev": true,
149+ "requires": {
150+ "@babel/helper-validator-identifier": "^7.9.5",
151+ "lodash": "^4.17.13",
152+ "to-fast-properties": "^2.0.0"
153+ }
154+ }
155+ }
156+ },
157+ "@babel/helper-builder-react-jsx": {
158+ "version": "7.9.0",
159+ "resolved": "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz",
160+ "integrity": "sha512-weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==",
161+ "dev": true,
162+ "requires": {
163+ "@babel/helper-annotate-as-pure": "^7.8.3",
164+ "@babel/types": "^7.9.0"
165+ },
166+ "dependencies": {
167+ "@babel/types": {
168+ "version": "7.9.5",
169+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
170+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
171+ "dev": true,
172+ "requires": {
173+ "@babel/helper-validator-identifier": "^7.9.5",
174+ "lodash": "^4.17.13",
175+ "to-fast-properties": "^2.0.0"
176+ }
177+ }
178+ }
179+ },
180+ "@babel/helper-create-regexp-features-plugin": {
181+ "version": "7.8.8",
182+ "resolved": "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz",
183+ "integrity": "sha512-LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==",
184+ "dev": true,
185+ "requires": {
186+ "@babel/helper-annotate-as-pure": "^7.8.3",
187+ "@babel/helper-regex": "^7.8.3",
188+ "regexpu-core": "^4.7.0"
189+ }
190+ },
191+ "@babel/helper-define-map": {
192+ "version": "7.8.3",
193+ "resolved": "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz",
194+ "integrity": "sha512-PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==",
195+ "dev": true,
196+ "requires": {
197+ "@babel/helper-function-name": "^7.8.3",
198+ "@babel/types": "^7.8.3",
199+ "lodash": "^4.17.13"
200+ },
201+ "dependencies": {
202+ "@babel/types": {
203+ "version": "7.9.5",
204+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
205+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
206+ "dev": true,
207+ "requires": {
208+ "@babel/helper-validator-identifier": "^7.9.5",
209+ "lodash": "^4.17.13",
210+ "to-fast-properties": "^2.0.0"
211+ }
212+ }
213+ }
214+ },
215+ "@babel/helper-explode-assignable-expression": {
216+ "version": "7.8.3",
217+ "resolved": "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz",
218+ "integrity": "sha512-N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==",
219+ "dev": true,
220+ "requires": {
221+ "@babel/traverse": "^7.8.3",
222+ "@babel/types": "^7.8.3"
223+ },
224+ "dependencies": {
225+ "@babel/code-frame": {
226+ "version": "7.8.3",
227+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
228+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
229+ "dev": true,
230+ "requires": {
231+ "@babel/highlight": "^7.8.3"
232+ }
233+ },
234+ "@babel/generator": {
235+ "version": "7.9.5",
236+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
237+ "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
238+ "dev": true,
239+ "requires": {
240+ "@babel/types": "^7.9.5",
241+ "jsesc": "^2.5.1",
242+ "lodash": "^4.17.13",
243+ "source-map": "^0.5.0"
244+ }
245+ },
246+ "@babel/parser": {
247+ "version": "7.9.4",
248+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
249+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
250+ "dev": true
251+ },
252+ "@babel/traverse": {
253+ "version": "7.9.5",
254+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
255+ "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
256+ "dev": true,
257+ "requires": {
258+ "@babel/code-frame": "^7.8.3",
259+ "@babel/generator": "^7.9.5",
260+ "@babel/helper-function-name": "^7.9.5",
261+ "@babel/helper-split-export-declaration": "^7.8.3",
262+ "@babel/parser": "^7.9.0",
263+ "@babel/types": "^7.9.5",
264+ "debug": "^4.1.0",
265+ "globals": "^11.1.0",
266+ "lodash": "^4.17.13"
267+ }
268+ },
269+ "@babel/types": {
270+ "version": "7.9.5",
271+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
272+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
273+ "dev": true,
274+ "requires": {
275+ "@babel/helper-validator-identifier": "^7.9.5",
276+ "lodash": "^4.17.13",
277+ "to-fast-properties": "^2.0.0"
278+ }
279+ },
280+ "source-map": {
281+ "version": "0.5.7",
282+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
283+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
284+ "dev": true
285+ }
286+ }
287+ },
288+ "@babel/helper-function-name": {
289+ "version": "7.9.5",
290+ "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz",
291+ "integrity": "sha512-JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==",
292+ "dev": true,
293+ "requires": {
294+ "@babel/helper-get-function-arity": "^7.8.3",
295+ "@babel/template": "^7.8.3",
296+ "@babel/types": "^7.9.5"
297+ },
298+ "dependencies": {
299+ "@babel/code-frame": {
300+ "version": "7.8.3",
301+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
302+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
303+ "dev": true,
304+ "requires": {
305+ "@babel/highlight": "^7.8.3"
306+ }
307+ },
308+ "@babel/parser": {
309+ "version": "7.9.4",
310+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
311+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
312+ "dev": true
313+ },
314+ "@babel/template": {
315+ "version": "7.8.6",
316+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
317+ "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
318+ "dev": true,
319+ "requires": {
320+ "@babel/code-frame": "^7.8.3",
321+ "@babel/parser": "^7.8.6",
322+ "@babel/types": "^7.8.6"
323+ }
324+ },
325+ "@babel/types": {
326+ "version": "7.9.5",
327+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
328+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
329+ "dev": true,
330+ "requires": {
331+ "@babel/helper-validator-identifier": "^7.9.5",
332+ "lodash": "^4.17.13",
333+ "to-fast-properties": "^2.0.0"
334+ }
335+ }
336+ }
337+ },
338+ "@babel/helper-get-function-arity": {
339+ "version": "7.8.3",
340+ "resolved": "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz",
341+ "integrity": "sha512-FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==",
342+ "dev": true,
343+ "requires": {
344+ "@babel/types": "^7.8.3"
345+ },
346+ "dependencies": {
347+ "@babel/types": {
348+ "version": "7.9.5",
349+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
350+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
351+ "dev": true,
352+ "requires": {
353+ "@babel/helper-validator-identifier": "^7.9.5",
354+ "lodash": "^4.17.13",
355+ "to-fast-properties": "^2.0.0"
356+ }
357+ }
358+ }
359+ },
360+ "@babel/helper-hoist-variables": {
361+ "version": "7.8.3",
362+ "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz",
363+ "integrity": "sha512-ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==",
364+ "dev": true,
365+ "requires": {
366+ "@babel/types": "^7.8.3"
367+ },
368+ "dependencies": {
369+ "@babel/types": {
370+ "version": "7.9.5",
371+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
372+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
373+ "dev": true,
374+ "requires": {
375+ "@babel/helper-validator-identifier": "^7.9.5",
376+ "lodash": "^4.17.13",
377+ "to-fast-properties": "^2.0.0"
378+ }
379+ }
380+ }
381+ },
382+ "@babel/helper-member-expression-to-functions": {
383+ "version": "7.8.3",
384+ "resolved": "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz",
385+ "integrity": "sha512-fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==",
386+ "dev": true,
387+ "requires": {
388+ "@babel/types": "^7.8.3"
389+ },
390+ "dependencies": {
391+ "@babel/types": {
392+ "version": "7.9.5",
393+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
394+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
395+ "dev": true,
396+ "requires": {
397+ "@babel/helper-validator-identifier": "^7.9.5",
398+ "lodash": "^4.17.13",
399+ "to-fast-properties": "^2.0.0"
400+ }
401+ }
402+ }
403+ },
404+ "@babel/helper-module-imports": {
405+ "version": "7.8.3",
406+ "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz",
407+ "integrity": "sha512-R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==",
408+ "dev": true,
409+ "requires": {
410+ "@babel/types": "^7.8.3"
411+ },
412+ "dependencies": {
413+ "@babel/types": {
414+ "version": "7.9.5",
415+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
416+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
417+ "dev": true,
418+ "requires": {
419+ "@babel/helper-validator-identifier": "^7.9.5",
420+ "lodash": "^4.17.13",
421+ "to-fast-properties": "^2.0.0"
422+ }
423+ }
424+ }
425+ },
426+ "@babel/helper-module-transforms": {
427+ "version": "7.9.0",
428+ "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz",
429+ "integrity": "sha512-0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==",
430+ "dev": true,
431+ "requires": {
432+ "@babel/helper-module-imports": "^7.8.3",
433+ "@babel/helper-replace-supers": "^7.8.6",
434+ "@babel/helper-simple-access": "^7.8.3",
435+ "@babel/helper-split-export-declaration": "^7.8.3",
436+ "@babel/template": "^7.8.6",
437+ "@babel/types": "^7.9.0",
438+ "lodash": "^4.17.13"
439+ },
440+ "dependencies": {
441+ "@babel/code-frame": {
442+ "version": "7.8.3",
443+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
444+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
445+ "dev": true,
446+ "requires": {
447+ "@babel/highlight": "^7.8.3"
448+ }
449+ },
450+ "@babel/parser": {
451+ "version": "7.9.4",
452+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
453+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
454+ "dev": true
455+ },
456+ "@babel/template": {
457+ "version": "7.8.6",
458+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
459+ "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
460+ "dev": true,
461+ "requires": {
462+ "@babel/code-frame": "^7.8.3",
463+ "@babel/parser": "^7.8.6",
464+ "@babel/types": "^7.8.6"
465+ }
466+ },
467+ "@babel/types": {
468+ "version": "7.9.5",
469+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
470+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
471+ "dev": true,
472+ "requires": {
473+ "@babel/helper-validator-identifier": "^7.9.5",
474+ "lodash": "^4.17.13",
475+ "to-fast-properties": "^2.0.0"
476+ }
477+ }
478+ }
479+ },
480+ "@babel/helper-optimise-call-expression": {
481+ "version": "7.8.3",
482+ "resolved": "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz",
483+ "integrity": "sha512-Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==",
484+ "dev": true,
485+ "requires": {
486+ "@babel/types": "^7.8.3"
487+ },
488+ "dependencies": {
489+ "@babel/types": {
490+ "version": "7.9.5",
491+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
492+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
493+ "dev": true,
494+ "requires": {
495+ "@babel/helper-validator-identifier": "^7.9.5",
496+ "lodash": "^4.17.13",
497+ "to-fast-properties": "^2.0.0"
498+ }
499+ }
500+ }
501+ },
502+ "@babel/helper-plugin-utils": {
503+ "version": "7.8.3",
504+ "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz",
505+ "integrity": "sha512-j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==",
506+ "dev": true
507+ },
508+ "@babel/helper-regex": {
509+ "version": "7.8.3",
510+ "resolved": "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz",
511+ "integrity": "sha512-BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==",
512+ "dev": true,
513+ "requires": {
514+ "lodash": "^4.17.13"
515+ }
516+ },
517+ "@babel/helper-remap-async-to-generator": {
518+ "version": "7.8.3",
519+ "resolved": "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz",
520+ "integrity": "sha512-kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==",
521+ "dev": true,
522+ "requires": {
523+ "@babel/helper-annotate-as-pure": "^7.8.3",
524+ "@babel/helper-wrap-function": "^7.8.3",
525+ "@babel/template": "^7.8.3",
526+ "@babel/traverse": "^7.8.3",
527+ "@babel/types": "^7.8.3"
528+ },
529+ "dependencies": {
530+ "@babel/code-frame": {
531+ "version": "7.8.3",
532+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
533+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
534+ "dev": true,
535+ "requires": {
536+ "@babel/highlight": "^7.8.3"
537+ }
538+ },
539+ "@babel/generator": {
540+ "version": "7.9.5",
541+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
542+ "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
543+ "dev": true,
544+ "requires": {
545+ "@babel/types": "^7.9.5",
546+ "jsesc": "^2.5.1",
547+ "lodash": "^4.17.13",
548+ "source-map": "^0.5.0"
549+ }
550+ },
551+ "@babel/parser": {
552+ "version": "7.9.4",
553+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
554+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
555+ "dev": true
556+ },
557+ "@babel/template": {
558+ "version": "7.8.6",
559+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
560+ "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
561+ "dev": true,
562+ "requires": {
563+ "@babel/code-frame": "^7.8.3",
564+ "@babel/parser": "^7.8.6",
565+ "@babel/types": "^7.8.6"
566+ }
567+ },
568+ "@babel/traverse": {
569+ "version": "7.9.5",
570+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
571+ "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
572+ "dev": true,
573+ "requires": {
574+ "@babel/code-frame": "^7.8.3",
575+ "@babel/generator": "^7.9.5",
576+ "@babel/helper-function-name": "^7.9.5",
577+ "@babel/helper-split-export-declaration": "^7.8.3",
578+ "@babel/parser": "^7.9.0",
579+ "@babel/types": "^7.9.5",
580+ "debug": "^4.1.0",
581+ "globals": "^11.1.0",
582+ "lodash": "^4.17.13"
583+ }
584+ },
585+ "@babel/types": {
586+ "version": "7.9.5",
587+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
588+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
589+ "dev": true,
590+ "requires": {
591+ "@babel/helper-validator-identifier": "^7.9.5",
592+ "lodash": "^4.17.13",
593+ "to-fast-properties": "^2.0.0"
594+ }
595+ },
596+ "source-map": {
597+ "version": "0.5.7",
598+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
599+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
600+ "dev": true
601+ }
602+ }
603+ },
604+ "@babel/helper-replace-supers": {
605+ "version": "7.8.6",
606+ "resolved": "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz",
607+ "integrity": "sha512-PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==",
608+ "dev": true,
609+ "requires": {
610+ "@babel/helper-member-expression-to-functions": "^7.8.3",
611+ "@babel/helper-optimise-call-expression": "^7.8.3",
612+ "@babel/traverse": "^7.8.6",
613+ "@babel/types": "^7.8.6"
614+ },
615+ "dependencies": {
616+ "@babel/code-frame": {
617+ "version": "7.8.3",
618+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
619+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
620+ "dev": true,
621+ "requires": {
622+ "@babel/highlight": "^7.8.3"
623+ }
624+ },
625+ "@babel/generator": {
626+ "version": "7.9.5",
627+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
628+ "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
629+ "dev": true,
630+ "requires": {
631+ "@babel/types": "^7.9.5",
632+ "jsesc": "^2.5.1",
633+ "lodash": "^4.17.13",
634+ "source-map": "^0.5.0"
635+ }
636+ },
637+ "@babel/parser": {
638+ "version": "7.9.4",
639+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
640+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
641+ "dev": true
642+ },
643+ "@babel/traverse": {
644+ "version": "7.9.5",
645+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
646+ "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
647+ "dev": true,
648+ "requires": {
649+ "@babel/code-frame": "^7.8.3",
650+ "@babel/generator": "^7.9.5",
651+ "@babel/helper-function-name": "^7.9.5",
652+ "@babel/helper-split-export-declaration": "^7.8.3",
653+ "@babel/parser": "^7.9.0",
654+ "@babel/types": "^7.9.5",
655+ "debug": "^4.1.0",
656+ "globals": "^11.1.0",
657+ "lodash": "^4.17.13"
658+ }
659+ },
660+ "@babel/types": {
661+ "version": "7.9.5",
662+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
663+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
664+ "dev": true,
665+ "requires": {
666+ "@babel/helper-validator-identifier": "^7.9.5",
667+ "lodash": "^4.17.13",
668+ "to-fast-properties": "^2.0.0"
669+ }
670+ },
671+ "source-map": {
672+ "version": "0.5.7",
673+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
674+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
675+ "dev": true
676+ }
677+ }
678+ },
679+ "@babel/helper-simple-access": {
680+ "version": "7.8.3",
681+ "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz",
682+ "integrity": "sha512-VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==",
683+ "dev": true,
684+ "requires": {
685+ "@babel/template": "^7.8.3",
686+ "@babel/types": "^7.8.3"
687+ },
688+ "dependencies": {
689+ "@babel/code-frame": {
690+ "version": "7.8.3",
691+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
692+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
693+ "dev": true,
694+ "requires": {
695+ "@babel/highlight": "^7.8.3"
696+ }
697+ },
698+ "@babel/parser": {
699+ "version": "7.9.4",
700+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
701+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
702+ "dev": true
703+ },
704+ "@babel/template": {
705+ "version": "7.8.6",
706+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
707+ "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
708+ "dev": true,
709+ "requires": {
710+ "@babel/code-frame": "^7.8.3",
711+ "@babel/parser": "^7.8.6",
712+ "@babel/types": "^7.8.6"
713+ }
714+ },
715+ "@babel/types": {
716+ "version": "7.9.5",
717+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
718+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
719+ "dev": true,
720+ "requires": {
721+ "@babel/helper-validator-identifier": "^7.9.5",
722+ "lodash": "^4.17.13",
723+ "to-fast-properties": "^2.0.0"
724+ }
725+ }
726+ }
727+ },
728+ "@babel/helper-split-export-declaration": {
729+ "version": "7.8.3",
730+ "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz",
731+ "integrity": "sha512-3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==",
732+ "dev": true,
733+ "requires": {
734+ "@babel/types": "^7.8.3"
735+ },
736+ "dependencies": {
737+ "@babel/types": {
738+ "version": "7.9.5",
739+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
740+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
741+ "dev": true,
742+ "requires": {
743+ "@babel/helper-validator-identifier": "^7.9.5",
744+ "lodash": "^4.17.13",
745+ "to-fast-properties": "^2.0.0"
746+ }
747+ }
748+ }
749+ },
750+ "@babel/helper-validator-identifier": {
751+ "version": "7.9.5",
752+ "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz",
753+ "integrity": "sha512-/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==",
754+ "dev": true
755+ },
756+ "@babel/helper-wrap-function": {
757+ "version": "7.8.3",
758+ "resolved": "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz",
759+ "integrity": "sha512-LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==",
760+ "dev": true,
761+ "requires": {
762+ "@babel/helper-function-name": "^7.8.3",
763+ "@babel/template": "^7.8.3",
764+ "@babel/traverse": "^7.8.3",
765+ "@babel/types": "^7.8.3"
766+ },
767+ "dependencies": {
768+ "@babel/code-frame": {
769+ "version": "7.8.3",
770+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
771+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
772+ "dev": true,
773+ "requires": {
774+ "@babel/highlight": "^7.8.3"
775+ }
776+ },
777+ "@babel/generator": {
778+ "version": "7.9.5",
779+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
780+ "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
781+ "dev": true,
782+ "requires": {
783+ "@babel/types": "^7.9.5",
784+ "jsesc": "^2.5.1",
785+ "lodash": "^4.17.13",
786+ "source-map": "^0.5.0"
787+ }
788+ },
789+ "@babel/parser": {
790+ "version": "7.9.4",
791+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
792+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
793+ "dev": true
794+ },
795+ "@babel/template": {
796+ "version": "7.8.6",
797+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
798+ "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
799+ "dev": true,
800+ "requires": {
801+ "@babel/code-frame": "^7.8.3",
802+ "@babel/parser": "^7.8.6",
803+ "@babel/types": "^7.8.6"
804+ }
805+ },
806+ "@babel/traverse": {
807+ "version": "7.9.5",
808+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
809+ "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
810+ "dev": true,
811+ "requires": {
812+ "@babel/code-frame": "^7.8.3",
813+ "@babel/generator": "^7.9.5",
814+ "@babel/helper-function-name": "^7.9.5",
815+ "@babel/helper-split-export-declaration": "^7.8.3",
816+ "@babel/parser": "^7.9.0",
817+ "@babel/types": "^7.9.5",
818+ "debug": "^4.1.0",
819+ "globals": "^11.1.0",
820+ "lodash": "^4.17.13"
821+ }
822+ },
823+ "@babel/types": {
824+ "version": "7.9.5",
825+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
826+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
827+ "dev": true,
828+ "requires": {
829+ "@babel/helper-validator-identifier": "^7.9.5",
830+ "lodash": "^4.17.13",
831+ "to-fast-properties": "^2.0.0"
832+ }
833+ },
834+ "source-map": {
835+ "version": "0.5.7",
836+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
837+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
838+ "dev": true
839+ }
840+ }
841+ },
842+ "@babel/helpers": {
843+ "version": "7.9.2",
844+ "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz",
845+ "integrity": "sha512-JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==",
846+ "dev": true,
847+ "requires": {
848+ "@babel/template": "^7.8.3",
849+ "@babel/traverse": "^7.9.0",
850+ "@babel/types": "^7.9.0"
851+ },
852+ "dependencies": {
853+ "@babel/code-frame": {
854+ "version": "7.8.3",
855+ "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz",
856+ "integrity": "sha512-a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==",
857+ "dev": true,
858+ "requires": {
859+ "@babel/highlight": "^7.8.3"
860+ }
861+ },
862+ "@babel/generator": {
863+ "version": "7.9.5",
864+ "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz",
865+ "integrity": "sha512-GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==",
866+ "dev": true,
867+ "requires": {
868+ "@babel/types": "^7.9.5",
869+ "jsesc": "^2.5.1",
870+ "lodash": "^4.17.13",
871+ "source-map": "^0.5.0"
872+ }
873+ },
874+ "@babel/parser": {
875+ "version": "7.9.4",
876+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz",
877+ "integrity": "sha512-bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==",
878+ "dev": true
879+ },
880+ "@babel/template": {
881+ "version": "7.8.6",
882+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz",
883+ "integrity": "sha512-zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==",
884+ "dev": true,
885+ "requires": {
886+ "@babel/code-frame": "^7.8.3",
887+ "@babel/parser": "^7.8.6",
888+ "@babel/types": "^7.8.6"
889+ }
890+ },
891+ "@babel/traverse": {
892+ "version": "7.9.5",
893+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz",
894+ "integrity": "sha512-c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==",
895+ "dev": true,
896+ "requires": {
897+ "@babel/code-frame": "^7.8.3",
898+ "@babel/generator": "^7.9.5",
899+ "@babel/helper-function-name": "^7.9.5",
900+ "@babel/helper-split-export-declaration": "^7.8.3",
901+ "@babel/parser": "^7.9.0",
902+ "@babel/types": "^7.9.5",
903+ "debug": "^4.1.0",
904+ "globals": "^11.1.0",
905+ "lodash": "^4.17.13"
906+ }
907+ },
908+ "@babel/types": {
909+ "version": "7.9.5",
910+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz",
911+ "integrity": "sha512-XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==",
912+ "dev": true,
913+ "requires": {
914+ "@babel/helper-validator-identifier": "^7.9.5",
915+ "lodash": "^4.17.13",
916+ "to-fast-properties": "^2.0.0"
917+ }
918+ },
919+ "source-map": {
920+ "version": "0.5.7",
921+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
922+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
923+ "dev": true
924+ }
925+ }
926+ },
927+ "@babel/highlight": {
928+ "version": "7.9.0",
929+ "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz",
930+ "integrity": "sha512-lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==",
931+ "dev": true,
932+ "requires": {
933+ "@babel/helper-validator-identifier": "^7.9.0",
934+ "chalk": "^2.0.0",
935+ "js-tokens": "^4.0.0"
936+ }
937+ },
938+ "@babel/parser": {
939+ "version": "7.3.4",
940+ "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz",
941+ "integrity": "sha512-tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==",
942+ "dev": true
943+ },
944+ "@babel/plugin-proposal-async-generator-functions": {
945+ "version": "7.8.3",
946+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz",
947+ "integrity": "sha512-NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==",
948+ "dev": true,
949+ "requires": {
950+ "@babel/helper-plugin-utils": "^7.8.3",
951+ "@babel/helper-remap-async-to-generator": "^7.8.3",
952+ "@babel/plugin-syntax-async-generators": "^7.8.0"
953+ }
954+ },
955+ "@babel/plugin-proposal-json-strings": {
956+ "version": "7.8.3",
957+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz",
958+ "integrity": "sha512-KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==",
959+ "dev": true,
960+ "requires": {
961+ "@babel/helper-plugin-utils": "^7.8.3",
962+ "@babel/plugin-syntax-json-strings": "^7.8.0"
963+ }
964+ },
965+ "@babel/plugin-proposal-object-rest-spread": {
966+ "version": "7.9.5",
967+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz",
968+ "integrity": "sha512-VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==",
969+ "dev": true,
970+ "requires": {
971+ "@babel/helper-plugin-utils": "^7.8.3",
972+ "@babel/plugin-syntax-object-rest-spread": "^7.8.0",
973+ "@babel/plugin-transform-parameters": "^7.9.5"
974+ }
975+ },
976+ "@babel/plugin-proposal-optional-catch-binding": {
977+ "version": "7.8.3",
978+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz",
979+ "integrity": "sha512-0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==",
980+ "dev": true,
981+ "requires": {
982+ "@babel/helper-plugin-utils": "^7.8.3",
983+ "@babel/plugin-syntax-optional-catch-binding": "^7.8.0"
984+ }
985+ },
986+ "@babel/plugin-proposal-unicode-property-regex": {
987+ "version": "7.8.8",
988+ "resolved": "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz",
989+ "integrity": "sha512-EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==",
990+ "dev": true,
991+ "requires": {
992+ "@babel/helper-create-regexp-features-plugin": "^7.8.8",
993+ "@babel/helper-plugin-utils": "^7.8.3"
994+ }
995+ },
996+ "@babel/plugin-syntax-async-generators": {
997+ "version": "7.8.4",
998+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz",
999+ "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==",
1000+ "dev": true,
1001+ "requires": {
1002+ "@babel/helper-plugin-utils": "^7.8.0"
1003+ }
1004+ },
1005+ "@babel/plugin-syntax-flow": {
1006+ "version": "7.8.3",
1007+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz",
1008+ "integrity": "sha512-innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==",
1009+ "dev": true,
1010+ "requires": {
1011+ "@babel/helper-plugin-utils": "^7.8.3"
1012+ }
1013+ },
1014+ "@babel/plugin-syntax-json-strings": {
1015+ "version": "7.8.3",
1016+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz",
1017+ "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==",
1018+ "dev": true,
1019+ "requires": {
1020+ "@babel/helper-plugin-utils": "^7.8.0"
1021+ }
1022+ },
1023+ "@babel/plugin-syntax-jsx": {
1024+ "version": "7.8.3",
1025+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz",
1026+ "integrity": "sha512-WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==",
1027+ "dev": true,
1028+ "requires": {
1029+ "@babel/helper-plugin-utils": "^7.8.3"
1030+ }
1031+ },
1032+ "@babel/plugin-syntax-object-rest-spread": {
1033+ "version": "7.8.3",
1034+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz",
1035+ "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==",
1036+ "dev": true,
1037+ "requires": {
1038+ "@babel/helper-plugin-utils": "^7.8.0"
1039+ }
1040+ },
1041+ "@babel/plugin-syntax-optional-catch-binding": {
1042+ "version": "7.8.3",
1043+ "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz",
1044+ "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==",
1045+ "dev": true,
1046+ "requires": {
1047+ "@babel/helper-plugin-utils": "^7.8.0"
1048+ }
1049+ },
1050+ "@babel/plugin-transform-arrow-functions": {
1051+ "version": "7.8.3",
1052+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz",
1053+ "integrity": "sha512-0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==",
1054+ "dev": true,
1055+ "requires": {
1056+ "@babel/helper-plugin-utils": "^7.8.3"
1057+ }
1058+ },
1059+ "@babel/plugin-transform-async-to-generator": {
1060+ "version": "7.8.3",
1061+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz",
1062+ "integrity": "sha512-imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==",
1063+ "dev": true,
1064+ "requires": {
1065+ "@babel/helper-module-imports": "^7.8.3",
1066+ "@babel/helper-plugin-utils": "^7.8.3",
1067+ "@babel/helper-remap-async-to-generator": "^7.8.3"
1068+ }
1069+ },
1070+ "@babel/plugin-transform-block-scoped-functions": {
1071+ "version": "7.8.3",
1072+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz",
1073+ "integrity": "sha512-vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==",
1074+ "dev": true,
1075+ "requires": {
1076+ "@babel/helper-plugin-utils": "^7.8.3"
1077+ }
1078+ },
1079+ "@babel/plugin-transform-block-scoping": {
1080+ "version": "7.8.3",
1081+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz",
1082+ "integrity": "sha512-pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==",
1083+ "dev": true,
1084+ "requires": {
1085+ "@babel/helper-plugin-utils": "^7.8.3",
1086+ "lodash": "^4.17.13"
1087+ }
1088+ },
1089+ "@babel/plugin-transform-classes": {
1090+ "version": "7.9.5",
1091+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz",
1092+ "integrity": "sha512-x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==",
1093+ "dev": true,
1094+ "requires": {
1095+ "@babel/helper-annotate-as-pure": "^7.8.3",
1096+ "@babel/helper-define-map": "^7.8.3",
1097+ "@babel/helper-function-name": "^7.9.5",
1098+ "@babel/helper-optimise-call-expression": "^7.8.3",
1099+ "@babel/helper-plugin-utils": "^7.8.3",
1100+ "@babel/helper-replace-supers": "^7.8.6",
1101+ "@babel/helper-split-export-declaration": "^7.8.3",
1102+ "globals": "^11.1.0"
1103+ }
1104+ },
1105+ "@babel/plugin-transform-computed-properties": {
1106+ "version": "7.8.3",
1107+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz",
1108+ "integrity": "sha512-O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==",
1109+ "dev": true,
1110+ "requires": {
1111+ "@babel/helper-plugin-utils": "^7.8.3"
1112+ }
1113+ },
1114+ "@babel/plugin-transform-destructuring": {
1115+ "version": "7.9.5",
1116+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz",
1117+ "integrity": "sha512-j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==",
1118+ "dev": true,
1119+ "requires": {
1120+ "@babel/helper-plugin-utils": "^7.8.3"
1121+ }
1122+ },
1123+ "@babel/plugin-transform-dotall-regex": {
1124+ "version": "7.8.3",
1125+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz",
1126+ "integrity": "sha512-kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==",
1127+ "dev": true,
1128+ "requires": {
1129+ "@babel/helper-create-regexp-features-plugin": "^7.8.3",
1130+ "@babel/helper-plugin-utils": "^7.8.3"
1131+ }
1132+ },
1133+ "@babel/plugin-transform-duplicate-keys": {
1134+ "version": "7.8.3",
1135+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz",
1136+ "integrity": "sha512-s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==",
1137+ "dev": true,
1138+ "requires": {
1139+ "@babel/helper-plugin-utils": "^7.8.3"
1140+ }
1141+ },
1142+ "@babel/plugin-transform-exponentiation-operator": {
1143+ "version": "7.8.3",
1144+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz",
1145+ "integrity": "sha512-zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==",
1146+ "dev": true,
1147+ "requires": {
1148+ "@babel/helper-builder-binary-assignment-operator-visitor": "^7.8.3",
1149+ "@babel/helper-plugin-utils": "^7.8.3"
1150+ }
1151+ },
1152+ "@babel/plugin-transform-flow-strip-types": {
1153+ "version": "7.3.4",
1154+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.3.4.tgz",
1155+ "integrity": "sha512-PmQC9R7DwpBFA+7ATKMyzViz3zCaMNouzZMPZN2K5PnbBbtL3AXFYTkDk+Hey5crQq2A90UG5Uthz0mel+XZrA==",
1156+ "dev": true,
1157+ "requires": {
1158+ "@babel/helper-plugin-utils": "^7.0.0",
1159+ "@babel/plugin-syntax-flow": "^7.2.0"
1160+ }
1161+ },
1162+ "@babel/plugin-transform-for-of": {
1163+ "version": "7.9.0",
1164+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz",
1165+ "integrity": "sha512-lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==",
1166+ "dev": true,
1167+ "requires": {
1168+ "@babel/helper-plugin-utils": "^7.8.3"
1169+ }
1170+ },
1171+ "@babel/plugin-transform-function-name": {
1172+ "version": "7.8.3",
1173+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz",
1174+ "integrity": "sha512-rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==",
1175+ "dev": true,
1176+ "requires": {
1177+ "@babel/helper-function-name": "^7.8.3",
1178+ "@babel/helper-plugin-utils": "^7.8.3"
1179+ }
1180+ },
1181+ "@babel/plugin-transform-literals": {
1182+ "version": "7.8.3",
1183+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz",
1184+ "integrity": "sha512-3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==",
1185+ "dev": true,
1186+ "requires": {
1187+ "@babel/helper-plugin-utils": "^7.8.3"
1188+ }
1189+ },
1190+ "@babel/plugin-transform-modules-amd": {
1191+ "version": "7.9.0",
1192+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz",
1193+ "integrity": "sha512-vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==",
1194+ "dev": true,
1195+ "requires": {
1196+ "@babel/helper-module-transforms": "^7.9.0",
1197+ "@babel/helper-plugin-utils": "^7.8.3",
1198+ "babel-plugin-dynamic-import-node": "^2.3.0"
1199+ }
1200+ },
1201+ "@babel/plugin-transform-modules-commonjs": {
1202+ "version": "7.2.0",
1203+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz",
1204+ "integrity": "sha512-V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==",
1205+ "dev": true,
1206+ "requires": {
1207+ "@babel/helper-module-transforms": "^7.1.0",
1208+ "@babel/helper-plugin-utils": "^7.0.0",
1209+ "@babel/helper-simple-access": "^7.1.0"
1210+ }
1211+ },
1212+ "@babel/plugin-transform-modules-systemjs": {
1213+ "version": "7.9.0",
1214+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz",
1215+ "integrity": "sha512-FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==",
1216+ "dev": true,
1217+ "requires": {
1218+ "@babel/helper-hoist-variables": "^7.8.3",
1219+ "@babel/helper-module-transforms": "^7.9.0",
1220+ "@babel/helper-plugin-utils": "^7.8.3",
1221+ "babel-plugin-dynamic-import-node": "^2.3.0"
1222+ }
1223+ },
1224+ "@babel/plugin-transform-modules-umd": {
1225+ "version": "7.9.0",
1226+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz",
1227+ "integrity": "sha512-uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==",
1228+ "dev": true,
1229+ "requires": {
1230+ "@babel/helper-module-transforms": "^7.9.0",
1231+ "@babel/helper-plugin-utils": "^7.8.3"
1232+ }
1233+ },
1234+ "@babel/plugin-transform-named-capturing-groups-regex": {
1235+ "version": "7.8.3",
1236+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz",
1237+ "integrity": "sha512-f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==",
1238+ "dev": true,
1239+ "requires": {
1240+ "@babel/helper-create-regexp-features-plugin": "^7.8.3"
1241+ }
1242+ },
1243+ "@babel/plugin-transform-new-target": {
1244+ "version": "7.8.3",
1245+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz",
1246+ "integrity": "sha512-QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==",
1247+ "dev": true,
1248+ "requires": {
1249+ "@babel/helper-plugin-utils": "^7.8.3"
1250+ }
1251+ },
1252+ "@babel/plugin-transform-object-super": {
1253+ "version": "7.8.3",
1254+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz",
1255+ "integrity": "sha512-57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==",
1256+ "dev": true,
1257+ "requires": {
1258+ "@babel/helper-plugin-utils": "^7.8.3",
1259+ "@babel/helper-replace-supers": "^7.8.3"
1260+ }
1261+ },
1262+ "@babel/plugin-transform-parameters": {
1263+ "version": "7.9.5",
1264+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz",
1265+ "integrity": "sha512-0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==",
1266+ "dev": true,
1267+ "requires": {
1268+ "@babel/helper-get-function-arity": "^7.8.3",
1269+ "@babel/helper-plugin-utils": "^7.8.3"
1270+ }
1271+ },
1272+ "@babel/plugin-transform-react-jsx": {
1273+ "version": "7.3.0",
1274+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz",
1275+ "integrity": "sha512-a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==",
1276+ "dev": true,
1277+ "requires": {
1278+ "@babel/helper-builder-react-jsx": "^7.3.0",
1279+ "@babel/helper-plugin-utils": "^7.0.0",
1280+ "@babel/plugin-syntax-jsx": "^7.2.0"
1281+ }
1282+ },
1283+ "@babel/plugin-transform-regenerator": {
1284+ "version": "7.8.7",
1285+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz",
1286+ "integrity": "sha512-TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==",
1287+ "dev": true,
1288+ "requires": {
1289+ "regenerator-transform": "^0.14.2"
1290+ }
1291+ },
1292+ "@babel/plugin-transform-shorthand-properties": {
1293+ "version": "7.8.3",
1294+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz",
1295+ "integrity": "sha512-I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==",
1296+ "dev": true,
1297+ "requires": {
1298+ "@babel/helper-plugin-utils": "^7.8.3"
1299+ }
1300+ },
1301+ "@babel/plugin-transform-spread": {
1302+ "version": "7.8.3",
1303+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz",
1304+ "integrity": "sha512-CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==",
1305+ "dev": true,
1306+ "requires": {
1307+ "@babel/helper-plugin-utils": "^7.8.3"
1308+ }
1309+ },
1310+ "@babel/plugin-transform-sticky-regex": {
1311+ "version": "7.8.3",
1312+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz",
1313+ "integrity": "sha512-9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==",
1314+ "dev": true,
1315+ "requires": {
1316+ "@babel/helper-plugin-utils": "^7.8.3",
1317+ "@babel/helper-regex": "^7.8.3"
1318+ }
1319+ },
1320+ "@babel/plugin-transform-template-literals": {
1321+ "version": "7.8.3",
1322+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz",
1323+ "integrity": "sha512-820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==",
1324+ "dev": true,
1325+ "requires": {
1326+ "@babel/helper-annotate-as-pure": "^7.8.3",
1327+ "@babel/helper-plugin-utils": "^7.8.3"
1328+ }
1329+ },
1330+ "@babel/plugin-transform-typeof-symbol": {
1331+ "version": "7.8.4",
1332+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz",
1333+ "integrity": "sha512-2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==",
1334+ "dev": true,
1335+ "requires": {
1336+ "@babel/helper-plugin-utils": "^7.8.3"
1337+ }
1338+ },
1339+ "@babel/plugin-transform-unicode-regex": {
1340+ "version": "7.8.3",
1341+ "resolved": "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz",
1342+ "integrity": "sha512-+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==",
1343+ "dev": true,
1344+ "requires": {
1345+ "@babel/helper-create-regexp-features-plugin": "^7.8.3",
1346+ "@babel/helper-plugin-utils": "^7.8.3"
1347+ }
1348+ },
1349+ "@babel/preset-env": {
1350+ "version": "7.3.4",
1351+ "resolved": "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz",
1352+ "integrity": "sha512-2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==",
1353+ "dev": true,
1354+ "requires": {
1355+ "@babel/helper-module-imports": "^7.0.0",
1356+ "@babel/helper-plugin-utils": "^7.0.0",
1357+ "@babel/plugin-proposal-async-generator-functions": "^7.2.0",
1358+ "@babel/plugin-proposal-json-strings": "^7.2.0",
1359+ "@babel/plugin-proposal-object-rest-spread": "^7.3.4",
1360+ "@babel/plugin-proposal-optional-catch-binding": "^7.2.0",
1361+ "@babel/plugin-proposal-unicode-property-regex": "^7.2.0",
1362+ "@babel/plugin-syntax-async-generators": "^7.2.0",
1363+ "@babel/plugin-syntax-json-strings": "^7.2.0",
1364+ "@babel/plugin-syntax-object-rest-spread": "^7.2.0",
1365+ "@babel/plugin-syntax-optional-catch-binding": "^7.2.0",
1366+ "@babel/plugin-transform-arrow-functions": "^7.2.0",
1367+ "@babel/plugin-transform-async-to-generator": "^7.3.4",
1368+ "@babel/plugin-transform-block-scoped-functions": "^7.2.0",
1369+ "@babel/plugin-transform-block-scoping": "^7.3.4",
1370+ "@babel/plugin-transform-classes": "^7.3.4",
1371+ "@babel/plugin-transform-computed-properties": "^7.2.0",
1372+ "@babel/plugin-transform-destructuring": "^7.2.0",
1373+ "@babel/plugin-transform-dotall-regex": "^7.2.0",
1374+ "@babel/plugin-transform-duplicate-keys": "^7.2.0",
1375+ "@babel/plugin-transform-exponentiation-operator": "^7.2.0",
1376+ "@babel/plugin-transform-for-of": "^7.2.0",
1377+ "@babel/plugin-transform-function-name": "^7.2.0",
1378+ "@babel/plugin-transform-literals": "^7.2.0",
1379+ "@babel/plugin-transform-modules-amd": "^7.2.0",
1380+ "@babel/plugin-transform-modules-commonjs": "^7.2.0",
1381+ "@babel/plugin-transform-modules-systemjs": "^7.3.4",
1382+ "@babel/plugin-transform-modules-umd": "^7.2.0",
1383+ "@babel/plugin-transform-named-capturing-groups-regex": "^7.3.0",
1384+ "@babel/plugin-transform-new-target": "^7.0.0",
1385+ "@babel/plugin-transform-object-super": "^7.2.0",
1386+ "@babel/plugin-transform-parameters": "^7.2.0",
1387+ "@babel/plugin-transform-regenerator": "^7.3.4",
1388+ "@babel/plugin-transform-shorthand-properties": "^7.2.0",
1389+ "@babel/plugin-transform-spread": "^7.2.0",
1390+ "@babel/plugin-transform-sticky-regex": "^7.2.0",
1391+ "@babel/plugin-transform-template-literals": "^7.2.0",
1392+ "@babel/plugin-transform-typeof-symbol": "^7.2.0",
1393+ "@babel/plugin-transform-unicode-regex": "^7.2.0",
1394+ "browserslist": "^4.3.4",
1395+ "invariant": "^2.2.2",
1396+ "js-levenshtein": "^1.1.3",
1397+ "semver": "^5.3.0"
1398+ }
1399+ },
1400+ "@babel/runtime": {
1401+ "version": "7.3.4",
1402+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz",
1403+ "integrity": "sha512-IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==",
1404+ "dev": true,
1405+ "requires": {
1406+ "regenerator-runtime": "^0.12.0"
1407+ },
1408+ "dependencies": {
1409+ "regenerator-runtime": {
1410+ "version": "0.12.1",
1411+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz",
1412+ "integrity": "sha512-odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==",
1413+ "dev": true
1414+ }
1415+ }
1416+ },
1417+ "@babel/template": {
1418+ "version": "7.2.2",
1419+ "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz",
1420+ "integrity": "sha512-zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==",
1421+ "dev": true,
1422+ "requires": {
1423+ "@babel/code-frame": "^7.0.0",
1424+ "@babel/parser": "^7.2.2",
1425+ "@babel/types": "^7.2.2"
1426+ }
1427+ },
1428+ "@babel/traverse": {
1429+ "version": "7.3.4",
1430+ "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz",
1431+ "integrity": "sha512-TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==",
1432+ "dev": true,
1433+ "requires": {
1434+ "@babel/code-frame": "^7.0.0",
1435+ "@babel/generator": "^7.3.4",
1436+ "@babel/helper-function-name": "^7.1.0",
1437+ "@babel/helper-split-export-declaration": "^7.0.0",
1438+ "@babel/parser": "^7.3.4",
1439+ "@babel/types": "^7.3.4",
1440+ "debug": "^4.1.0",
1441+ "globals": "^11.1.0",
1442+ "lodash": "^4.17.11"
1443+ }
1444+ },
1445+ "@babel/types": {
1446+ "version": "7.3.4",
1447+ "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz",
1448+ "integrity": "sha512-WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==",
1449+ "dev": true,
1450+ "requires": {
1451+ "esutils": "^2.0.2",
1452+ "lodash": "^4.17.11",
1453+ "to-fast-properties": "^2.0.0"
1454+ }
1455+ },
1456+ "@iarna/toml": {
1457+ "version": "2.2.5",
1458+ "resolved": "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz",
1459+ "integrity": "sha512-trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==",
1460+ "dev": true
1461+ },
1462+ "@mrmlnc/readdir-enhanced": {
1463+ "version": "2.2.1",
1464+ "resolved": "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz",
1465+ "integrity": "sha512-bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==",
1466+ "dev": true,
1467+ "requires": {
1468+ "call-me-maybe": "^1.0.1",
1469+ "glob-to-regexp": "^0.3.0"
1470+ }
1471+ },
1472+ "@nodelib/fs.stat": {
1473+ "version": "1.1.3",
1474+ "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz",
1475+ "integrity": "sha512-shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==",
1476+ "dev": true
1477+ },
1478+ "@parcel/fs": {
1479+ "version": "1.11.0",
1480+ "resolved": "https://registry.npmjs.org/@parcel/fs/-/fs-1.11.0.tgz",
1481+ "integrity": "sha512-86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA==",
1482+ "dev": true,
1483+ "requires": {
1484+ "@parcel/utils": "^1.11.0",
1485+ "mkdirp": "^0.5.1",
1486+ "rimraf": "^2.6.2"
1487+ }
1488+ },
1489+ "@parcel/logger": {
1490+ "version": "1.11.1",
1491+ "resolved": "https://registry.npmjs.org/@parcel/logger/-/logger-1.11.1.tgz",
1492+ "integrity": "sha512-9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA==",
1493+ "dev": true,
1494+ "requires": {
1495+ "@parcel/workers": "^1.11.0",
1496+ "chalk": "^2.1.0",
1497+ "grapheme-breaker": "^0.3.2",
1498+ "ora": "^2.1.0",
1499+ "strip-ansi": "^4.0.0"
1500+ }
1501+ },
1502+ "@parcel/utils": {
1503+ "version": "1.11.0",
1504+ "resolved": "https://registry.npmjs.org/@parcel/utils/-/utils-1.11.0.tgz",
1505+ "integrity": "sha512-cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ==",
1506+ "dev": true
1507+ },
1508+ "@parcel/watcher": {
1509+ "version": "1.12.1",
1510+ "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-1.12.1.tgz",
1511+ "integrity": "sha512-od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA==",
1512+ "dev": true,
1513+ "requires": {
1514+ "@parcel/utils": "^1.11.0",
1515+ "chokidar": "^2.1.5"
1516+ }
1517+ },
1518+ "@parcel/workers": {
1519+ "version": "1.11.0",
1520+ "resolved": "https://registry.npmjs.org/@parcel/workers/-/workers-1.11.0.tgz",
1521+ "integrity": "sha512-USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==",
1522+ "dev": true,
1523+ "requires": {
1524+ "@parcel/utils": "^1.11.0",
1525+ "physical-cpu-count": "^2.0.0"
1526+ }
1527+ },
1528+ "@types/q": {
1529+ "version": "1.5.2",
1530+ "resolved": "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz",
1531+ "integrity": "sha512-ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==",
1532+ "dev": true
1533+ },
1534+ "abab": {
1535+ "version": "2.0.3",
1536+ "resolved": "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz",
1537+ "integrity": "sha512-tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==",
1538+ "dev": true
1539+ },
1540+ "abbrev": {
1541+ "version": "1.1.1",
1542+ "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz",
1543+ "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==",
1544+ "dev": true
1545+ },
1546+ "acorn": {
1547+ "version": "7.1.1",
1548+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz",
1549+ "integrity": "sha512-add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==",
1550+ "dev": true
1551+ },
1552+ "acorn-globals": {
1553+ "version": "4.3.4",
1554+ "resolved": "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz",
1555+ "integrity": "sha512-clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==",
1556+ "dev": true,
1557+ "requires": {
1558+ "acorn": "^6.0.1",
1559+ "acorn-walk": "^6.0.1"
1560+ },
1561+ "dependencies": {
1562+ "acorn": {
1563+ "version": "6.4.1",
1564+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
1565+ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
1566+ "dev": true
1567+ }
1568+ }
1569+ },
1570+ "acorn-walk": {
1571+ "version": "6.2.0",
1572+ "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz",
1573+ "integrity": "sha512-7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==",
1574+ "dev": true
1575+ },
1576+ "ajv": {
1577+ "version": "6.12.2",
1578+ "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz",
1579+ "integrity": "sha512-k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==",
1580+ "requires": {
1581+ "fast-deep-equal": "^3.1.1",
1582+ "fast-json-stable-stringify": "^2.0.0",
1583+ "json-schema-traverse": "^0.4.1",
1584+ "uri-js": "^4.2.2"
1585+ }
1586+ },
1587+ "alphanum-sort": {
1588+ "version": "1.0.2",
1589+ "resolved": "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz",
1590+ "integrity": "sha1-l6ERlkmyEa0zaR2fn0hqjsn74KM=",
1591+ "dev": true
1592+ },
1593+ "ansi-regex": {
1594+ "version": "3.0.0",
1595+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz",
1596+ "integrity": "sha1-7QMXwyIGT3lGbAKWa922Bas32Zg=",
1597+ "dev": true
1598+ },
1599+ "ansi-styles": {
1600+ "version": "3.2.1",
1601+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz",
1602+ "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==",
1603+ "dev": true,
1604+ "requires": {
1605+ "color-convert": "^1.9.0"
1606+ }
1607+ },
1608+ "ansi-to-html": {
1609+ "version": "0.6.14",
1610+ "resolved": "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.14.tgz",
1611+ "integrity": "sha512-7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA==",
1612+ "dev": true,
1613+ "requires": {
1614+ "entities": "^1.1.2"
1615+ },
1616+ "dependencies": {
1617+ "entities": {
1618+ "version": "1.1.2",
1619+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
1620+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
1621+ "dev": true
1622+ }
1623+ }
1624+ },
1625+ "anymatch": {
1626+ "version": "2.0.0",
1627+ "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz",
1628+ "integrity": "sha512-5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==",
1629+ "dev": true,
1630+ "requires": {
1631+ "micromatch": "^3.1.4",
1632+ "normalize-path": "^2.1.1"
1633+ },
1634+ "dependencies": {
1635+ "normalize-path": {
1636+ "version": "2.1.1",
1637+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz",
1638+ "integrity": "sha1-GrKLVW4Zg2Oowab35vogE3/mrtk=",
1639+ "dev": true,
1640+ "requires": {
1641+ "remove-trailing-separator": "^1.0.1"
1642+ }
1643+ }
1644+ }
1645+ },
1646+ "argparse": {
1647+ "version": "1.0.10",
1648+ "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
1649+ "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
1650+ "dev": true,
1651+ "requires": {
1652+ "sprintf-js": "~1.0.2"
1653+ }
1654+ },
1655+ "arr-diff": {
1656+ "version": "4.0.0",
1657+ "resolved": "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz",
1658+ "integrity": "sha1-1kYQdP6/7HHn4VI1dhoyml3HxSA=",
1659+ "dev": true
1660+ },
1661+ "arr-flatten": {
1662+ "version": "1.1.0",
1663+ "resolved": "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz",
1664+ "integrity": "sha512-L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==",
1665+ "dev": true
1666+ },
1667+ "arr-union": {
1668+ "version": "3.1.0",
1669+ "resolved": "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz",
1670+ "integrity": "sha1-45sJrqne+Gao8gbiiK9jkZuuOcQ=",
1671+ "dev": true
1672+ },
1673+ "array-equal": {
1674+ "version": "1.0.0",
1675+ "resolved": "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz",
1676+ "integrity": "sha1-jCpe8kcv2ep0KwTHenUJO6J1fJM=",
1677+ "dev": true
1678+ },
1679+ "array-unique": {
1680+ "version": "0.3.2",
1681+ "resolved": "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz",
1682+ "integrity": "sha1-qJS3XUvE9s1nnvMkSp/Y9Gri1Cg=",
1683+ "dev": true
1684+ },
1685+ "asn1": {
1686+ "version": "0.2.4",
1687+ "resolved": "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz",
1688+ "integrity": "sha512-jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==",
1689+ "requires": {
1690+ "safer-buffer": "~2.1.0"
1691+ }
1692+ },
1693+ "asn1.js": {
1694+ "version": "4.10.1",
1695+ "resolved": "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz",
1696+ "integrity": "sha512-p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==",
1697+ "dev": true,
1698+ "requires": {
1699+ "bn.js": "^4.0.0",
1700+ "inherits": "^2.0.1",
1701+ "minimalistic-assert": "^1.0.0"
1702+ }
1703+ },
1704+ "assert": {
1705+ "version": "1.5.0",
1706+ "resolved": "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz",
1707+ "integrity": "sha512-EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==",
1708+ "dev": true,
1709+ "requires": {
1710+ "object-assign": "^4.1.1",
1711+ "util": "0.10.3"
1712+ },
1713+ "dependencies": {
1714+ "inherits": {
1715+ "version": "2.0.1",
1716+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz",
1717+ "integrity": "sha1-sX0I0ya0Qj5Wjv9xn5GwscvfafE=",
1718+ "dev": true
1719+ },
1720+ "util": {
1721+ "version": "0.10.3",
1722+ "resolved": "https://registry.npmjs.org/util/-/util-0.10.3.tgz",
1723+ "integrity": "sha1-evsa/lCAUkZInj23/g7TeTNqwPk=",
1724+ "dev": true,
1725+ "requires": {
1726+ "inherits": "2.0.1"
1727+ }
1728+ }
1729+ }
1730+ },
1731+ "assert-plus": {
1732+ "version": "1.0.0",
1733+ "resolved": "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz",
1734+ "integrity": "sha1-8S4PPF13sLHN2RRpQuTpbB5N1SU="
1735+ },
1736+ "assign-symbols": {
1737+ "version": "1.0.0",
1738+ "resolved": "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz",
1739+ "integrity": "sha1-WWZ/QfrdTyDMvCu5a41Pf3jsA2c=",
1740+ "dev": true
1741+ },
1742+ "async-each": {
1743+ "version": "1.0.3",
1744+ "resolved": "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz",
1745+ "integrity": "sha512-z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==",
1746+ "dev": true
1747+ },
1748+ "async-limiter": {
1749+ "version": "1.0.1",
1750+ "resolved": "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz",
1751+ "integrity": "sha512-csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==",
1752+ "dev": true
1753+ },
1754+ "asynckit": {
1755+ "version": "0.4.0",
1756+ "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz",
1757+ "integrity": "sha1-x57Zf380y48robyXkLzDZkdLS3k="
1758+ },
1759+ "atob": {
1760+ "version": "2.1.2",
1761+ "resolved": "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz",
1762+ "integrity": "sha512-Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==",
1763+ "dev": true
1764+ },
1765+ "aws-sign2": {
1766+ "version": "0.7.0",
1767+ "resolved": "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz",
1768+ "integrity": "sha1-tG6JCTSpWR8tL2+G1+ap8bP+dqg="
1769+ },
1770+ "aws4": {
1771+ "version": "1.9.1",
1772+ "resolved": "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz",
1773+ "integrity": "sha512-wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug=="
1774+ },
1775+ "babel-plugin-dynamic-import-node": {
1776+ "version": "2.3.3",
1777+ "resolved": "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz",
1778+ "integrity": "sha512-jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==",
1779+ "dev": true,
1780+ "requires": {
1781+ "object.assign": "^4.1.0"
1782+ }
1783+ },
1784+ "babel-runtime": {
1785+ "version": "6.26.0",
1786+ "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz",
1787+ "integrity": "sha1-llxwWGaOgrVde/4E/yM3vItWR/4=",
1788+ "dev": true,
1789+ "requires": {
1790+ "core-js": "^2.4.0",
1791+ "regenerator-runtime": "^0.11.0"
1792+ },
1793+ "dependencies": {
1794+ "regenerator-runtime": {
1795+ "version": "0.11.1",
1796+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz",
1797+ "integrity": "sha512-MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==",
1798+ "dev": true
1799+ }
1800+ }
1801+ },
1802+ "babel-types": {
1803+ "version": "6.26.0",
1804+ "resolved": "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz",
1805+ "integrity": "sha1-o7Bz+Uq0nrb6Vc1lInozQ4BjJJc=",
1806+ "dev": true,
1807+ "requires": {
1808+ "babel-runtime": "^6.26.0",
1809+ "esutils": "^2.0.2",
1810+ "lodash": "^4.17.4",
1811+ "to-fast-properties": "^1.0.3"
1812+ },
1813+ "dependencies": {
1814+ "to-fast-properties": {
1815+ "version": "1.0.3",
1816+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz",
1817+ "integrity": "sha1-uDVx+k2MJbguIxsG46MFXeTKGkc=",
1818+ "dev": true
1819+ }
1820+ }
1821+ },
1822+ "babylon-walk": {
1823+ "version": "1.0.2",
1824+ "resolved": "https://registry.npmjs.org/babylon-walk/-/babylon-walk-1.0.2.tgz",
1825+ "integrity": "sha1-OxWl3btIKni0zpwByLoYFwLZ1s4=",
1826+ "dev": true,
1827+ "requires": {
1828+ "babel-runtime": "^6.11.6",
1829+ "babel-types": "^6.15.0",
1830+ "lodash.clone": "^4.5.0"
1831+ }
1832+ },
1833 "balanced-match": {
1834 "version": "1.0.0",
1835- "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
1836- "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
1837+ "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz",
1838+ "integrity": "sha1-ibTRmasr7kneFk6gK4nORi1xt2c=",
1839+ "dev": true
1840+ },
1841+ "base": {
1842+ "version": "0.11.2",
1843+ "resolved": "https://registry.npmjs.org/base/-/base-0.11.2.tgz",
1844+ "integrity": "sha512-5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==",
1845+ "dev": true,
1846+ "requires": {
1847+ "cache-base": "^1.0.1",
1848+ "class-utils": "^0.3.5",
1849+ "component-emitter": "^1.2.1",
1850+ "define-property": "^1.0.0",
1851+ "isobject": "^3.0.1",
1852+ "mixin-deep": "^1.2.0",
1853+ "pascalcase": "^0.1.1"
1854+ },
1855+ "dependencies": {
1856+ "define-property": {
1857+ "version": "1.0.0",
1858+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
1859+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
1860+ "dev": true,
1861+ "requires": {
1862+ "is-descriptor": "^1.0.0"
1863+ }
1864+ },
1865+ "is-accessor-descriptor": {
1866+ "version": "1.0.0",
1867+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
1868+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
1869+ "dev": true,
1870+ "requires": {
1871+ "kind-of": "^6.0.0"
1872+ }
1873+ },
1874+ "is-data-descriptor": {
1875+ "version": "1.0.0",
1876+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
1877+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
1878+ "dev": true,
1879+ "requires": {
1880+ "kind-of": "^6.0.0"
1881+ }
1882+ },
1883+ "is-descriptor": {
1884+ "version": "1.0.2",
1885+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
1886+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
1887+ "dev": true,
1888+ "requires": {
1889+ "is-accessor-descriptor": "^1.0.0",
1890+ "is-data-descriptor": "^1.0.0",
1891+ "kind-of": "^6.0.2"
1892+ }
1893+ }
1894+ }
1895+ },
1896+ "base64-js": {
1897+ "version": "1.3.1",
1898+ "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz",
1899+ "integrity": "sha512-mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==",
1900+ "dev": true
1901+ },
1902+ "bcrypt-pbkdf": {
1903+ "version": "1.0.2",
1904+ "resolved": "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz",
1905+ "integrity": "sha1-pDAdOJtqQ/m2f/PKEaP2Y342Dp4=",
1906+ "requires": {
1907+ "tweetnacl": "^0.14.3"
1908+ }
1909+ },
1910+ "binary-extensions": {
1911+ "version": "1.13.1",
1912+ "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz",
1913+ "integrity": "sha512-Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==",
1914+ "dev": true
1915+ },
1916+ "bindings": {
1917+ "version": "1.5.0",
1918+ "resolved": "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz",
1919+ "integrity": "sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==",
1920+ "dev": true,
1921+ "requires": {
1922+ "file-uri-to-path": "1.0.0"
1923+ }
1924+ },
1925+ "bn.js": {
1926+ "version": "4.11.8",
1927+ "resolved": "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz",
1928+ "integrity": "sha512-ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==",
1929+ "dev": true
1930+ },
1931+ "boolbase": {
1932+ "version": "1.0.0",
1933+ "resolved": "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz",
1934+ "integrity": "sha1-aN/1++YMUes3cl6p4+0xDcwed24=",
1935+ "dev": true
1936+ },
1937+ "brace-expansion": {
1938+ "version": "1.1.11",
1939+ "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
1940+ "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
1941+ "dev": true,
1942+ "requires": {
1943+ "balanced-match": "^1.0.0",
1944+ "concat-map": "0.0.1"
1945+ }
1946+ },
1947+ "braces": {
1948+ "version": "2.3.2",
1949+ "resolved": "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz",
1950+ "integrity": "sha512-aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==",
1951+ "dev": true,
1952+ "requires": {
1953+ "arr-flatten": "^1.1.0",
1954+ "array-unique": "^0.3.2",
1955+ "extend-shallow": "^2.0.1",
1956+ "fill-range": "^4.0.0",
1957+ "isobject": "^3.0.1",
1958+ "repeat-element": "^1.1.2",
1959+ "snapdragon": "^0.8.1",
1960+ "snapdragon-node": "^2.0.1",
1961+ "split-string": "^3.0.2",
1962+ "to-regex": "^3.0.1"
1963+ },
1964+ "dependencies": {
1965+ "extend-shallow": {
1966+ "version": "2.0.1",
1967+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
1968+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
1969+ "dev": true,
1970+ "requires": {
1971+ "is-extendable": "^0.1.0"
1972+ }
1973+ }
1974+ }
1975+ },
1976+ "brfs": {
1977+ "version": "1.6.1",
1978+ "resolved": "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz",
1979+ "integrity": "sha512-OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==",
1980+ "dev": true,
1981+ "requires": {
1982+ "quote-stream": "^1.0.1",
1983+ "resolve": "^1.1.5",
1984+ "static-module": "^2.2.0",
1985+ "through2": "^2.0.0"
1986+ }
1987+ },
1988+ "brorand": {
1989+ "version": "1.1.0",
1990+ "resolved": "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz",
1991+ "integrity": "sha1-EsJe/kCkXjwyPrhnWgoM5XsiNx8=",
1992+ "dev": true
1993+ },
1994+ "browser-process-hrtime": {
1995+ "version": "1.0.0",
1996+ "resolved": "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz",
1997+ "integrity": "sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==",
1998+ "dev": true
1999+ },
2000+ "browserify-aes": {
2001+ "version": "1.2.0",
2002+ "resolved": "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz",
2003+ "integrity": "sha512-+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==",
2004+ "dev": true,
2005+ "requires": {
2006+ "buffer-xor": "^1.0.3",
2007+ "cipher-base": "^1.0.0",
2008+ "create-hash": "^1.1.0",
2009+ "evp_bytestokey": "^1.0.3",
2010+ "inherits": "^2.0.1",
2011+ "safe-buffer": "^5.0.1"
2012+ }
2013+ },
2014+ "browserify-cipher": {
2015+ "version": "1.0.1",
2016+ "resolved": "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz",
2017+ "integrity": "sha512-sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==",
2018+ "dev": true,
2019+ "requires": {
2020+ "browserify-aes": "^1.0.4",
2021+ "browserify-des": "^1.0.0",
2022+ "evp_bytestokey": "^1.0.0"
2023+ }
2024+ },
2025+ "browserify-des": {
2026+ "version": "1.0.2",
2027+ "resolved": "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz",
2028+ "integrity": "sha512-BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==",
2029+ "dev": true,
2030+ "requires": {
2031+ "cipher-base": "^1.0.1",
2032+ "des.js": "^1.0.0",
2033+ "inherits": "^2.0.1",
2034+ "safe-buffer": "^5.1.2"
2035+ }
2036+ },
2037+ "browserify-rsa": {
2038+ "version": "4.0.1",
2039+ "resolved": "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz",
2040+ "integrity": "sha1-IeCr+vbyApzy+vsTNWenAdQTVSQ=",
2041+ "dev": true,
2042+ "requires": {
2043+ "bn.js": "^4.1.0",
2044+ "randombytes": "^2.0.1"
2045+ }
2046+ },
2047+ "browserify-sign": {
2048+ "version": "4.0.4",
2049+ "resolved": "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz",
2050+ "integrity": "sha1-qk62jl17ZYuqa/alfmMMvXqT0pg=",
2051+ "dev": true,
2052+ "requires": {
2053+ "bn.js": "^4.1.1",
2054+ "browserify-rsa": "^4.0.0",
2055+ "create-hash": "^1.1.0",
2056+ "create-hmac": "^1.1.2",
2057+ "elliptic": "^6.0.0",
2058+ "inherits": "^2.0.1",
2059+ "parse-asn1": "^5.0.0"
2060+ }
2061+ },
2062+ "browserify-zlib": {
2063+ "version": "0.2.0",
2064+ "resolved": "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz",
2065+ "integrity": "sha512-Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==",
2066+ "dev": true,
2067+ "requires": {
2068+ "pako": "~1.0.5"
2069+ },
2070+ "dependencies": {
2071+ "pako": {
2072+ "version": "1.0.11",
2073+ "resolved": "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz",
2074+ "integrity": "sha512-4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==",
2075+ "dev": true
2076+ }
2077+ }
2078+ },
2079+ "browserslist": {
2080+ "version": "4.12.0",
2081+ "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz",
2082+ "integrity": "sha512-UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==",
2083+ "dev": true,
2084+ "requires": {
2085+ "caniuse-lite": "^1.0.30001043",
2086+ "electron-to-chromium": "^1.3.413",
2087+ "node-releases": "^1.1.53",
2088+ "pkg-up": "^2.0.0"
2089+ }
2090+ },
2091+ "buffer": {
2092+ "version": "4.9.2",
2093+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz",
2094+ "integrity": "sha512-xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==",
2095+ "dev": true,
2096+ "requires": {
2097+ "base64-js": "^1.0.2",
2098+ "ieee754": "^1.1.4",
2099+ "isarray": "^1.0.0"
2100+ }
2101+ },
2102+ "buffer-equal": {
2103+ "version": "0.0.1",
2104+ "resolved": "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz",
2105+ "integrity": "sha1-kbx0sR6kBbyRa8aqkI+q+ltKrEs=",
2106+ "dev": true
2107+ },
2108+ "buffer-from": {
2109+ "version": "1.1.1",
2110+ "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
2111+ "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
2112+ "dev": true
2113+ },
2114+ "buffer-xor": {
2115+ "version": "1.0.3",
2116+ "resolved": "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz",
2117+ "integrity": "sha1-JuYe0UIvtw3ULm42cp7VHYVf6Nk=",
2118+ "dev": true
2119+ },
2120+ "builtin-status-codes": {
2121+ "version": "3.0.0",
2122+ "resolved": "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz",
2123+ "integrity": "sha1-hZgoeOIbmOHGZCXgPQF0eI9Wnug=",
2124+ "dev": true
2125+ },
2126+ "cache-base": {
2127+ "version": "1.0.1",
2128+ "resolved": "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz",
2129+ "integrity": "sha512-AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==",
2130+ "dev": true,
2131+ "requires": {
2132+ "collection-visit": "^1.0.0",
2133+ "component-emitter": "^1.2.1",
2134+ "get-value": "^2.0.6",
2135+ "has-value": "^1.0.0",
2136+ "isobject": "^3.0.1",
2137+ "set-value": "^2.0.0",
2138+ "to-object-path": "^0.3.0",
2139+ "union-value": "^1.0.0",
2140+ "unset-value": "^1.0.0"
2141+ }
2142+ },
2143+ "call-me-maybe": {
2144+ "version": "1.0.1",
2145+ "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz",
2146+ "integrity": "sha1-JtII6onje1y95gJQoV8DHBak1ms=",
2147+ "dev": true
2148+ },
2149+ "caller-callsite": {
2150+ "version": "2.0.0",
2151+ "resolved": "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz",
2152+ "integrity": "sha1-hH4PzgoiN1CpoCfFSzNzGtMVQTQ=",
2153+ "dev": true,
2154+ "requires": {
2155+ "callsites": "^2.0.0"
2156+ }
2157+ },
2158+ "caller-path": {
2159+ "version": "2.0.0",
2160+ "resolved": "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz",
2161+ "integrity": "sha1-Ro+DBE42mrIBD6xfBs7uFbsssfQ=",
2162+ "dev": true,
2163+ "requires": {
2164+ "caller-callsite": "^2.0.0"
2165+ }
2166+ },
2167+ "callsites": {
2168+ "version": "2.0.0",
2169+ "resolved": "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz",
2170+ "integrity": "sha1-BuuE8A7qQT2oav/vrL/7Ngk7PFA=",
2171+ "dev": true
2172+ },
2173+ "camelcase": {
2174+ "version": "5.3.1",
2175+ "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz",
2176+ "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==",
2177+ "dev": true
2178+ },
2179+ "caniuse-api": {
2180+ "version": "3.0.0",
2181+ "resolved": "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz",
2182+ "integrity": "sha512-bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==",
2183+ "dev": true,
2184+ "requires": {
2185+ "browserslist": "^4.0.0",
2186+ "caniuse-lite": "^1.0.0",
2187+ "lodash.memoize": "^4.1.2",
2188+ "lodash.uniq": "^4.5.0"
2189+ }
2190+ },
2191+ "caniuse-lite": {
2192+ "version": "1.0.30001048",
2193+ "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz",
2194+ "integrity": "sha512-g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==",
2195+ "dev": true
2196+ },
2197+ "caseless": {
2198+ "version": "0.12.0",
2199+ "resolved": "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz",
2200+ "integrity": "sha1-G2gcIf+EAzyCZUMJBolCDRhxUdw="
2201+ },
2202+ "chalk": {
2203+ "version": "2.4.2",
2204+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz",
2205+ "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==",
2206+ "dev": true,
2207+ "requires": {
2208+ "ansi-styles": "^3.2.1",
2209+ "escape-string-regexp": "^1.0.5",
2210+ "supports-color": "^5.3.0"
2211+ },
2212+ "dependencies": {
2213+ "supports-color": {
2214+ "version": "5.5.0",
2215+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
2216+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
2217+ "dev": true,
2218+ "requires": {
2219+ "has-flag": "^3.0.0"
2220+ }
2221+ }
2222+ }
2223+ },
2224+ "chokidar": {
2225+ "version": "2.1.8",
2226+ "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz",
2227+ "integrity": "sha512-ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==",
2228+ "dev": true,
2229+ "requires": {
2230+ "anymatch": "^2.0.0",
2231+ "async-each": "^1.0.1",
2232+ "braces": "^2.3.2",
2233+ "fsevents": "^1.2.7",
2234+ "glob-parent": "^3.1.0",
2235+ "inherits": "^2.0.3",
2236+ "is-binary-path": "^1.0.0",
2237+ "is-glob": "^4.0.0",
2238+ "normalize-path": "^3.0.0",
2239+ "path-is-absolute": "^1.0.0",
2240+ "readdirp": "^2.2.1",
2241+ "upath": "^1.1.1"
2242+ },
2243+ "dependencies": {
2244+ "fsevents": {
2245+ "version": "1.2.12",
2246+ "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz",
2247+ "integrity": "sha512-Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==",
2248+ "dev": true,
2249+ "optional": true,
2250+ "requires": {
2251+ "bindings": "^1.5.0",
2252+ "nan": "^2.12.1",
2253+ "node-pre-gyp": "*"
2254+ },
2255+ "dependencies": {
2256+ "abbrev": {
2257+ "version": "1.1.1",
2258+ "bundled": true,
2259+ "dev": true,
2260+ "optional": true
2261+ },
2262+ "ansi-regex": {
2263+ "version": "2.1.1",
2264+ "bundled": true,
2265+ "dev": true,
2266+ "optional": true
2267+ },
2268+ "aproba": {
2269+ "version": "1.2.0",
2270+ "bundled": true,
2271+ "dev": true,
2272+ "optional": true
2273+ },
2274+ "are-we-there-yet": {
2275+ "version": "1.1.5",
2276+ "bundled": true,
2277+ "dev": true,
2278+ "optional": true,
2279+ "requires": {
2280+ "delegates": "^1.0.0",
2281+ "readable-stream": "^2.0.6"
2282+ }
2283+ },
2284+ "balanced-match": {
2285+ "version": "1.0.0",
2286+ "bundled": true,
2287+ "dev": true,
2288+ "optional": true
2289+ },
2290+ "brace-expansion": {
2291+ "version": "1.1.11",
2292+ "bundled": true,
2293+ "dev": true,
2294+ "optional": true,
2295+ "requires": {
2296+ "balanced-match": "^1.0.0",
2297+ "concat-map": "0.0.1"
2298+ }
2299+ },
2300+ "chownr": {
2301+ "version": "1.1.4",
2302+ "bundled": true,
2303+ "dev": true,
2304+ "optional": true
2305+ },
2306+ "code-point-at": {
2307+ "version": "1.1.0",
2308+ "bundled": true,
2309+ "dev": true,
2310+ "optional": true
2311+ },
2312+ "concat-map": {
2313+ "version": "0.0.1",
2314+ "bundled": true,
2315+ "dev": true,
2316+ "optional": true
2317+ },
2318+ "console-control-strings": {
2319+ "version": "1.1.0",
2320+ "bundled": true,
2321+ "dev": true,
2322+ "optional": true
2323+ },
2324+ "core-util-is": {
2325+ "version": "1.0.2",
2326+ "bundled": true,
2327+ "dev": true,
2328+ "optional": true
2329+ },
2330+ "debug": {
2331+ "version": "3.2.6",
2332+ "bundled": true,
2333+ "dev": true,
2334+ "optional": true,
2335+ "requires": {
2336+ "ms": "^2.1.1"
2337+ }
2338+ },
2339+ "deep-extend": {
2340+ "version": "0.6.0",
2341+ "bundled": true,
2342+ "dev": true,
2343+ "optional": true
2344+ },
2345+ "delegates": {
2346+ "version": "1.0.0",
2347+ "bundled": true,
2348+ "dev": true,
2349+ "optional": true
2350+ },
2351+ "detect-libc": {
2352+ "version": "1.0.3",
2353+ "bundled": true,
2354+ "dev": true,
2355+ "optional": true
2356+ },
2357+ "fs-minipass": {
2358+ "version": "1.2.7",
2359+ "bundled": true,
2360+ "dev": true,
2361+ "optional": true,
2362+ "requires": {
2363+ "minipass": "^2.6.0"
2364+ }
2365+ },
2366+ "fs.realpath": {
2367+ "version": "1.0.0",
2368+ "bundled": true,
2369+ "dev": true,
2370+ "optional": true
2371+ },
2372+ "gauge": {
2373+ "version": "2.7.4",
2374+ "bundled": true,
2375+ "dev": true,
2376+ "optional": true,
2377+ "requires": {
2378+ "aproba": "^1.0.3",
2379+ "console-control-strings": "^1.0.0",
2380+ "has-unicode": "^2.0.0",
2381+ "object-assign": "^4.1.0",
2382+ "signal-exit": "^3.0.0",
2383+ "string-width": "^1.0.1",
2384+ "strip-ansi": "^3.0.1",
2385+ "wide-align": "^1.1.0"
2386+ }
2387+ },
2388+ "glob": {
2389+ "version": "7.1.6",
2390+ "bundled": true,
2391+ "dev": true,
2392+ "optional": true,
2393+ "requires": {
2394+ "fs.realpath": "^1.0.0",
2395+ "inflight": "^1.0.4",
2396+ "inherits": "2",
2397+ "minimatch": "^3.0.4",
2398+ "once": "^1.3.0",
2399+ "path-is-absolute": "^1.0.0"
2400+ }
2401+ },
2402+ "has-unicode": {
2403+ "version": "2.0.1",
2404+ "bundled": true,
2405+ "dev": true,
2406+ "optional": true
2407+ },
2408+ "iconv-lite": {
2409+ "version": "0.4.24",
2410+ "bundled": true,
2411+ "dev": true,
2412+ "optional": true,
2413+ "requires": {
2414+ "safer-buffer": ">= 2.1.2 < 3"
2415+ }
2416+ },
2417+ "ignore-walk": {
2418+ "version": "3.0.3",
2419+ "bundled": true,
2420+ "dev": true,
2421+ "optional": true,
2422+ "requires": {
2423+ "minimatch": "^3.0.4"
2424+ }
2425+ },
2426+ "inflight": {
2427+ "version": "1.0.6",
2428+ "bundled": true,
2429+ "dev": true,
2430+ "optional": true,
2431+ "requires": {
2432+ "once": "^1.3.0",
2433+ "wrappy": "1"
2434+ }
2435+ },
2436+ "inherits": {
2437+ "version": "2.0.4",
2438+ "bundled": true,
2439+ "dev": true,
2440+ "optional": true
2441+ },
2442+ "ini": {
2443+ "version": "1.3.5",
2444+ "bundled": true,
2445+ "dev": true,
2446+ "optional": true
2447+ },
2448+ "is-fullwidth-code-point": {
2449+ "version": "1.0.0",
2450+ "bundled": true,
2451+ "dev": true,
2452+ "optional": true,
2453+ "requires": {
2454+ "number-is-nan": "^1.0.0"
2455+ }
2456+ },
2457+ "isarray": {
2458+ "version": "1.0.0",
2459+ "bundled": true,
2460+ "dev": true,
2461+ "optional": true
2462+ },
2463+ "minimatch": {
2464+ "version": "3.0.4",
2465+ "bundled": true,
2466+ "dev": true,
2467+ "optional": true,
2468+ "requires": {
2469+ "brace-expansion": "^1.1.7"
2470+ }
2471+ },
2472+ "minimist": {
2473+ "version": "1.2.5",
2474+ "bundled": true,
2475+ "dev": true,
2476+ "optional": true
2477+ },
2478+ "minipass": {
2479+ "version": "2.9.0",
2480+ "bundled": true,
2481+ "dev": true,
2482+ "optional": true,
2483+ "requires": {
2484+ "safe-buffer": "^5.1.2",
2485+ "yallist": "^3.0.0"
2486+ }
2487+ },
2488+ "minizlib": {
2489+ "version": "1.3.3",
2490+ "bundled": true,
2491+ "dev": true,
2492+ "optional": true,
2493+ "requires": {
2494+ "minipass": "^2.9.0"
2495+ }
2496+ },
2497+ "mkdirp": {
2498+ "version": "0.5.3",
2499+ "bundled": true,
2500+ "dev": true,
2501+ "optional": true,
2502+ "requires": {
2503+ "minimist": "^1.2.5"
2504+ }
2505+ },
2506+ "ms": {
2507+ "version": "2.1.2",
2508+ "bundled": true,
2509+ "dev": true,
2510+ "optional": true
2511+ },
2512+ "needle": {
2513+ "version": "2.3.3",
2514+ "bundled": true,
2515+ "dev": true,
2516+ "optional": true,
2517+ "requires": {
2518+ "debug": "^3.2.6",
2519+ "iconv-lite": "^0.4.4",
2520+ "sax": "^1.2.4"
2521+ }
2522+ },
2523+ "node-pre-gyp": {
2524+ "version": "0.14.0",
2525+ "bundled": true,
2526+ "dev": true,
2527+ "optional": true,
2528+ "requires": {
2529+ "detect-libc": "^1.0.2",
2530+ "mkdirp": "^0.5.1",
2531+ "needle": "^2.2.1",
2532+ "nopt": "^4.0.1",
2533+ "npm-packlist": "^1.1.6",
2534+ "npmlog": "^4.0.2",
2535+ "rc": "^1.2.7",
2536+ "rimraf": "^2.6.1",
2537+ "semver": "^5.3.0",
2538+ "tar": "^4.4.2"
2539+ }
2540+ },
2541+ "nopt": {
2542+ "version": "4.0.3",
2543+ "bundled": true,
2544+ "dev": true,
2545+ "optional": true,
2546+ "requires": {
2547+ "abbrev": "1",
2548+ "osenv": "^0.1.4"
2549+ }
2550+ },
2551+ "npm-bundled": {
2552+ "version": "1.1.1",
2553+ "bundled": true,
2554+ "dev": true,
2555+ "optional": true,
2556+ "requires": {
2557+ "npm-normalize-package-bin": "^1.0.1"
2558+ }
2559+ },
2560+ "npm-normalize-package-bin": {
2561+ "version": "1.0.1",
2562+ "bundled": true,
2563+ "dev": true,
2564+ "optional": true
2565+ },
2566+ "npm-packlist": {
2567+ "version": "1.4.8",
2568+ "bundled": true,
2569+ "dev": true,
2570+ "optional": true,
2571+ "requires": {
2572+ "ignore-walk": "^3.0.1",
2573+ "npm-bundled": "^1.0.1",
2574+ "npm-normalize-package-bin": "^1.0.1"
2575+ }
2576+ },
2577+ "npmlog": {
2578+ "version": "4.1.2",
2579+ "bundled": true,
2580+ "dev": true,
2581+ "optional": true,
2582+ "requires": {
2583+ "are-we-there-yet": "~1.1.2",
2584+ "console-control-strings": "~1.1.0",
2585+ "gauge": "~2.7.3",
2586+ "set-blocking": "~2.0.0"
2587+ }
2588+ },
2589+ "number-is-nan": {
2590+ "version": "1.0.1",
2591+ "bundled": true,
2592+ "dev": true,
2593+ "optional": true
2594+ },
2595+ "object-assign": {
2596+ "version": "4.1.1",
2597+ "bundled": true,
2598+ "dev": true,
2599+ "optional": true
2600+ },
2601+ "once": {
2602+ "version": "1.4.0",
2603+ "bundled": true,
2604+ "dev": true,
2605+ "optional": true,
2606+ "requires": {
2607+ "wrappy": "1"
2608+ }
2609+ },
2610+ "os-homedir": {
2611+ "version": "1.0.2",
2612+ "bundled": true,
2613+ "dev": true,
2614+ "optional": true
2615+ },
2616+ "os-tmpdir": {
2617+ "version": "1.0.2",
2618+ "bundled": true,
2619+ "dev": true,
2620+ "optional": true
2621+ },
2622+ "osenv": {
2623+ "version": "0.1.5",
2624+ "bundled": true,
2625+ "dev": true,
2626+ "optional": true,
2627+ "requires": {
2628+ "os-homedir": "^1.0.0",
2629+ "os-tmpdir": "^1.0.0"
2630+ }
2631+ },
2632+ "path-is-absolute": {
2633+ "version": "1.0.1",
2634+ "bundled": true,
2635+ "dev": true,
2636+ "optional": true
2637+ },
2638+ "process-nextick-args": {
2639+ "version": "2.0.1",
2640+ "bundled": true,
2641+ "dev": true,
2642+ "optional": true
2643+ },
2644+ "rc": {
2645+ "version": "1.2.8",
2646+ "bundled": true,
2647+ "dev": true,
2648+ "optional": true,
2649+ "requires": {
2650+ "deep-extend": "^0.6.0",
2651+ "ini": "~1.3.0",
2652+ "minimist": "^1.2.0",
2653+ "strip-json-comments": "~2.0.1"
2654+ }
2655+ },
2656+ "readable-stream": {
2657+ "version": "2.3.7",
2658+ "bundled": true,
2659+ "dev": true,
2660+ "optional": true,
2661+ "requires": {
2662+ "core-util-is": "~1.0.0",
2663+ "inherits": "~2.0.3",
2664+ "isarray": "~1.0.0",
2665+ "process-nextick-args": "~2.0.0",
2666+ "safe-buffer": "~5.1.1",
2667+ "string_decoder": "~1.1.1",
2668+ "util-deprecate": "~1.0.1"
2669+ }
2670+ },
2671+ "rimraf": {
2672+ "version": "2.7.1",
2673+ "bundled": true,
2674+ "dev": true,
2675+ "optional": true,
2676+ "requires": {
2677+ "glob": "^7.1.3"
2678+ }
2679+ },
2680+ "safe-buffer": {
2681+ "version": "5.1.2",
2682+ "bundled": true,
2683+ "dev": true,
2684+ "optional": true
2685+ },
2686+ "safer-buffer": {
2687+ "version": "2.1.2",
2688+ "bundled": true,
2689+ "dev": true,
2690+ "optional": true
2691+ },
2692+ "sax": {
2693+ "version": "1.2.4",
2694+ "bundled": true,
2695+ "dev": true,
2696+ "optional": true
2697+ },
2698+ "semver": {
2699+ "version": "5.7.1",
2700+ "bundled": true,
2701+ "dev": true,
2702+ "optional": true
2703+ },
2704+ "set-blocking": {
2705+ "version": "2.0.0",
2706+ "bundled": true,
2707+ "dev": true,
2708+ "optional": true
2709+ },
2710+ "signal-exit": {
2711+ "version": "3.0.2",
2712+ "bundled": true,
2713+ "dev": true,
2714+ "optional": true
2715+ },
2716+ "string-width": {
2717+ "version": "1.0.2",
2718+ "bundled": true,
2719+ "dev": true,
2720+ "optional": true,
2721+ "requires": {
2722+ "code-point-at": "^1.0.0",
2723+ "is-fullwidth-code-point": "^1.0.0",
2724+ "strip-ansi": "^3.0.0"
2725+ }
2726+ },
2727+ "string_decoder": {
2728+ "version": "1.1.1",
2729+ "bundled": true,
2730+ "dev": true,
2731+ "optional": true,
2732+ "requires": {
2733+ "safe-buffer": "~5.1.0"
2734+ }
2735+ },
2736+ "strip-ansi": {
2737+ "version": "3.0.1",
2738+ "bundled": true,
2739+ "dev": true,
2740+ "optional": true,
2741+ "requires": {
2742+ "ansi-regex": "^2.0.0"
2743+ }
2744+ },
2745+ "strip-json-comments": {
2746+ "version": "2.0.1",
2747+ "bundled": true,
2748+ "dev": true,
2749+ "optional": true
2750+ },
2751+ "tar": {
2752+ "version": "4.4.13",
2753+ "bundled": true,
2754+ "dev": true,
2755+ "optional": true,
2756+ "requires": {
2757+ "chownr": "^1.1.1",
2758+ "fs-minipass": "^1.2.5",
2759+ "minipass": "^2.8.6",
2760+ "minizlib": "^1.2.1",
2761+ "mkdirp": "^0.5.0",
2762+ "safe-buffer": "^5.1.2",
2763+ "yallist": "^3.0.3"
2764+ }
2765+ },
2766+ "util-deprecate": {
2767+ "version": "1.0.2",
2768+ "bundled": true,
2769+ "dev": true,
2770+ "optional": true
2771+ },
2772+ "wide-align": {
2773+ "version": "1.1.3",
2774+ "bundled": true,
2775+ "dev": true,
2776+ "optional": true,
2777+ "requires": {
2778+ "string-width": "^1.0.2 || 2"
2779+ }
2780+ },
2781+ "wrappy": {
2782+ "version": "1.0.2",
2783+ "bundled": true,
2784+ "dev": true,
2785+ "optional": true
2786+ },
2787+ "yallist": {
2788+ "version": "3.1.1",
2789+ "bundled": true,
2790+ "dev": true,
2791+ "optional": true
2792+ }
2793+ }
2794+ }
2795+ }
2796+ },
2797+ "cipher-base": {
2798+ "version": "1.0.4",
2799+ "resolved": "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz",
2800+ "integrity": "sha512-Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==",
2801+ "dev": true,
2802+ "requires": {
2803+ "inherits": "^2.0.1",
2804+ "safe-buffer": "^5.0.1"
2805+ }
2806+ },
2807+ "class-utils": {
2808+ "version": "0.3.6",
2809+ "resolved": "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz",
2810+ "integrity": "sha512-qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==",
2811+ "dev": true,
2812+ "requires": {
2813+ "arr-union": "^3.1.0",
2814+ "define-property": "^0.2.5",
2815+ "isobject": "^3.0.0",
2816+ "static-extend": "^0.1.1"
2817+ },
2818+ "dependencies": {
2819+ "define-property": {
2820+ "version": "0.2.5",
2821+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
2822+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
2823+ "dev": true,
2824+ "requires": {
2825+ "is-descriptor": "^0.1.0"
2826+ }
2827+ }
2828+ }
2829+ },
2830+ "cli-cursor": {
2831+ "version": "2.1.0",
2832+ "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz",
2833+ "integrity": "sha1-s12sN2R5+sw+lHR9QdDQ9SOP/LU=",
2834+ "dev": true,
2835+ "requires": {
2836+ "restore-cursor": "^2.0.0"
2837+ }
2838+ },
2839+ "cli-spinners": {
2840+ "version": "1.3.1",
2841+ "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz",
2842+ "integrity": "sha512-1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==",
2843+ "dev": true
2844+ },
2845+ "cliui": {
2846+ "version": "5.0.0",
2847+ "resolved": "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz",
2848+ "integrity": "sha512-PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==",
2849+ "dev": true,
2850+ "requires": {
2851+ "string-width": "^3.1.0",
2852+ "strip-ansi": "^5.2.0",
2853+ "wrap-ansi": "^5.1.0"
2854+ },
2855+ "dependencies": {
2856+ "ansi-regex": {
2857+ "version": "4.1.0",
2858+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
2859+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
2860+ "dev": true
2861+ },
2862+ "strip-ansi": {
2863+ "version": "5.2.0",
2864+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
2865+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
2866+ "dev": true,
2867+ "requires": {
2868+ "ansi-regex": "^4.1.0"
2869+ }
2870+ }
2871+ }
2872+ },
2873+ "clone": {
2874+ "version": "2.1.2",
2875+ "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz",
2876+ "integrity": "sha1-G39Ln1kfHo+DZwQBYANFoCiHQ18=",
2877+ "dev": true
2878+ },
2879+ "clones": {
2880+ "version": "1.2.0",
2881+ "resolved": "https://registry.npmjs.org/clones/-/clones-1.2.0.tgz",
2882+ "integrity": "sha512-FXDYw4TjR8wgPZYui2LeTqWh1BLpfQ8lB6upMtlpDF6WlOOxghmTTxWyngdKTgozqBgKnHbTVwTE+hOHqAykuQ==",
2883+ "dev": true
2884+ },
2885+ "coa": {
2886+ "version": "2.0.2",
2887+ "resolved": "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz",
2888+ "integrity": "sha512-q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==",
2889+ "dev": true,
2890+ "requires": {
2891+ "@types/q": "^1.5.1",
2892+ "chalk": "^2.4.1",
2893+ "q": "^1.1.2"
2894+ }
2895+ },
2896+ "collection-visit": {
2897+ "version": "1.0.0",
2898+ "resolved": "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz",
2899+ "integrity": "sha1-S8A3PBZLwykbTTaMgpzxqApZ3KA=",
2900+ "dev": true,
2901+ "requires": {
2902+ "map-visit": "^1.0.0",
2903+ "object-visit": "^1.0.0"
2904+ }
2905+ },
2906+ "color": {
2907+ "version": "3.1.2",
2908+ "resolved": "https://registry.npmjs.org/color/-/color-3.1.2.tgz",
2909+ "integrity": "sha512-vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==",
2910+ "dev": true,
2911+ "requires": {
2912+ "color-convert": "^1.9.1",
2913+ "color-string": "^1.5.2"
2914+ }
2915+ },
2916+ "color-convert": {
2917+ "version": "1.9.3",
2918+ "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz",
2919+ "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==",
2920+ "dev": true,
2921+ "requires": {
2922+ "color-name": "1.1.3"
2923+ }
2924+ },
2925+ "color-name": {
2926+ "version": "1.1.3",
2927+ "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz",
2928+ "integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU=",
2929+ "dev": true
2930+ },
2931+ "color-string": {
2932+ "version": "1.5.3",
2933+ "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz",
2934+ "integrity": "sha512-dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==",
2935+ "dev": true,
2936+ "requires": {
2937+ "color-name": "^1.0.0",
2938+ "simple-swizzle": "^0.2.2"
2939+ }
2940+ },
2941+ "combined-stream": {
2942+ "version": "1.0.8",
2943+ "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz",
2944+ "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==",
2945+ "requires": {
2946+ "delayed-stream": "~1.0.0"
2947+ }
2948+ },
2949+ "command-exists": {
2950+ "version": "1.2.9",
2951+ "resolved": "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz",
2952+ "integrity": "sha512-LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==",
2953+ "dev": true
2954+ },
2955+ "commander": {
2956+ "version": "2.20.3",
2957+ "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz",
2958+ "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==",
2959+ "dev": true
2960+ },
2961+ "component-emitter": {
2962+ "version": "1.3.0",
2963+ "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz",
2964+ "integrity": "sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==",
2965+ "dev": true
2966+ },
2967+ "concat-map": {
2968+ "version": "0.0.1",
2969+ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
2970+ "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
2971+ "dev": true
2972+ },
2973+ "concat-stream": {
2974+ "version": "1.6.2",
2975+ "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz",
2976+ "integrity": "sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==",
2977+ "dev": true,
2978+ "requires": {
2979+ "buffer-from": "^1.0.0",
2980+ "inherits": "^2.0.3",
2981+ "readable-stream": "^2.2.2",
2982+ "typedarray": "^0.0.6"
2983+ }
2984+ },
2985+ "config-chain": {
2986+ "version": "1.1.12",
2987+ "resolved": "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz",
2988+ "integrity": "sha512-a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==",
2989+ "dev": true,
2990+ "requires": {
2991+ "ini": "^1.3.4",
2992+ "proto-list": "~1.2.1"
2993+ }
2994+ },
2995+ "console-browserify": {
2996+ "version": "1.2.0",
2997+ "resolved": "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz",
2998+ "integrity": "sha512-ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==",
2999+ "dev": true
3000+ },
3001+ "constants-browserify": {
3002+ "version": "1.0.0",
3003+ "resolved": "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz",
3004+ "integrity": "sha1-wguW2MYXdIqvHBYCF2DNJ/y4y3U=",
3005+ "dev": true
3006+ },
3007+ "convert-source-map": {
3008+ "version": "1.7.0",
3009+ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz",
3010+ "integrity": "sha512-4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==",
3011+ "dev": true,
3012+ "requires": {
3013+ "safe-buffer": "~5.1.1"
3014+ }
3015+ },
3016+ "copy-descriptor": {
3017+ "version": "0.1.1",
3018+ "resolved": "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz",
3019+ "integrity": "sha1-Z29us8OZl8LuGsOpJP1hJHSPV40=",
3020+ "dev": true
3021+ },
3022+ "core-js": {
3023+ "version": "2.6.11",
3024+ "resolved": "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz",
3025+ "integrity": "sha512-5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==",
3026+ "dev": true
3027+ },
3028+ "core-util-is": {
3029+ "version": "1.0.2",
3030+ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz",
3031+ "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac="
3032+ },
3033+ "cosmiconfig": {
3034+ "version": "5.2.1",
3035+ "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz",
3036+ "integrity": "sha512-H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==",
3037+ "dev": true,
3038+ "requires": {
3039+ "import-fresh": "^2.0.0",
3040+ "is-directory": "^0.3.1",
3041+ "js-yaml": "^3.13.1",
3042+ "parse-json": "^4.0.0"
3043+ }
3044+ },
3045+ "create-ecdh": {
3046+ "version": "4.0.3",
3047+ "resolved": "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz",
3048+ "integrity": "sha512-GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==",
3049+ "dev": true,
3050+ "requires": {
3051+ "bn.js": "^4.1.0",
3052+ "elliptic": "^6.0.0"
3053+ }
3054+ },
3055+ "create-hash": {
3056+ "version": "1.2.0",
3057+ "resolved": "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz",
3058+ "integrity": "sha512-z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==",
3059+ "dev": true,
3060+ "requires": {
3061+ "cipher-base": "^1.0.1",
3062+ "inherits": "^2.0.1",
3063+ "md5.js": "^1.3.4",
3064+ "ripemd160": "^2.0.1",
3065+ "sha.js": "^2.4.0"
3066+ }
3067+ },
3068+ "create-hmac": {
3069+ "version": "1.1.7",
3070+ "resolved": "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz",
3071+ "integrity": "sha512-MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==",
3072+ "dev": true,
3073+ "requires": {
3074+ "cipher-base": "^1.0.3",
3075+ "create-hash": "^1.1.0",
3076+ "inherits": "^2.0.1",
3077+ "ripemd160": "^2.0.0",
3078+ "safe-buffer": "^5.0.1",
3079+ "sha.js": "^2.4.8"
3080+ }
3081+ },
3082+ "cross-spawn": {
3083+ "version": "6.0.5",
3084+ "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
3085+ "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
3086+ "dev": true,
3087+ "requires": {
3088+ "nice-try": "^1.0.4",
3089+ "path-key": "^2.0.1",
3090+ "semver": "^5.5.0",
3091+ "shebang-command": "^1.2.0",
3092+ "which": "^1.2.9"
3093+ }
3094+ },
3095+ "crypto-browserify": {
3096+ "version": "3.12.0",
3097+ "resolved": "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz",
3098+ "integrity": "sha512-fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==",
3099+ "dev": true,
3100+ "requires": {
3101+ "browserify-cipher": "^1.0.0",
3102+ "browserify-sign": "^4.0.0",
3103+ "create-ecdh": "^4.0.0",
3104+ "create-hash": "^1.1.0",
3105+ "create-hmac": "^1.1.0",
3106+ "diffie-hellman": "^5.0.0",
3107+ "inherits": "^2.0.1",
3108+ "pbkdf2": "^3.0.3",
3109+ "public-encrypt": "^4.0.0",
3110+ "randombytes": "^2.0.0",
3111+ "randomfill": "^1.0.3"
3112+ }
3113+ },
3114+ "css-color-names": {
3115+ "version": "0.0.4",
3116+ "resolved": "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz",
3117+ "integrity": "sha1-gIrcLnnPhHOAabZGyyDsJ762KeA=",
3118+ "dev": true
3119+ },
3120+ "css-declaration-sorter": {
3121+ "version": "4.0.1",
3122+ "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz",
3123+ "integrity": "sha512-BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==",
3124+ "dev": true,
3125+ "requires": {
3126+ "postcss": "^7.0.1",
3127+ "timsort": "^0.3.0"
3128+ }
3129+ },
3130+ "css-modules-loader-core": {
3131+ "version": "1.1.0",
3132+ "resolved": "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz",
3133+ "integrity": "sha1-WQhmgpShvs0mGuCkziGwtVHyHRY=",
3134+ "dev": true,
3135+ "requires": {
3136+ "icss-replace-symbols": "1.1.0",
3137+ "postcss": "6.0.1",
3138+ "postcss-modules-extract-imports": "1.1.0",
3139+ "postcss-modules-local-by-default": "1.2.0",
3140+ "postcss-modules-scope": "1.1.0",
3141+ "postcss-modules-values": "1.3.0"
3142+ },
3143+ "dependencies": {
3144+ "ansi-regex": {
3145+ "version": "2.1.1",
3146+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
3147+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
3148+ "dev": true
3149+ },
3150+ "ansi-styles": {
3151+ "version": "2.2.1",
3152+ "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
3153+ "integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
3154+ "dev": true
3155+ },
3156+ "chalk": {
3157+ "version": "1.1.3",
3158+ "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
3159+ "integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
3160+ "dev": true,
3161+ "requires": {
3162+ "ansi-styles": "^2.2.1",
3163+ "escape-string-regexp": "^1.0.2",
3164+ "has-ansi": "^2.0.0",
3165+ "strip-ansi": "^3.0.0",
3166+ "supports-color": "^2.0.0"
3167+ },
3168+ "dependencies": {
3169+ "supports-color": {
3170+ "version": "2.0.0",
3171+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
3172+ "integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
3173+ "dev": true
3174+ }
3175+ }
3176+ },
3177+ "has-flag": {
3178+ "version": "1.0.0",
3179+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz",
3180+ "integrity": "sha1-nZ55MWXOAXoA8AQYxD+UKnsdEfo=",
3181+ "dev": true
3182+ },
3183+ "postcss": {
3184+ "version": "6.0.1",
3185+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz",
3186+ "integrity": "sha1-AA29H47vIXqjaLmiEsX8QLKo8/I=",
3187+ "dev": true,
3188+ "requires": {
3189+ "chalk": "^1.1.3",
3190+ "source-map": "^0.5.6",
3191+ "supports-color": "^3.2.3"
3192+ }
3193+ },
3194+ "source-map": {
3195+ "version": "0.5.7",
3196+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
3197+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
3198+ "dev": true
3199+ },
3200+ "strip-ansi": {
3201+ "version": "3.0.1",
3202+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
3203+ "integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
3204+ "dev": true,
3205+ "requires": {
3206+ "ansi-regex": "^2.0.0"
3207+ }
3208+ },
3209+ "supports-color": {
3210+ "version": "3.2.3",
3211+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz",
3212+ "integrity": "sha1-ZawFBLOVQXHYpklGsq48u4pfVPY=",
3213+ "dev": true,
3214+ "requires": {
3215+ "has-flag": "^1.0.0"
3216+ }
3217+ }
3218+ }
3219+ },
3220+ "css-select": {
3221+ "version": "2.1.0",
3222+ "resolved": "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz",
3223+ "integrity": "sha512-Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==",
3224+ "dev": true,
3225+ "requires": {
3226+ "boolbase": "^1.0.0",
3227+ "css-what": "^3.2.1",
3228+ "domutils": "^1.7.0",
3229+ "nth-check": "^1.0.2"
3230+ }
3231+ },
3232+ "css-select-base-adapter": {
3233+ "version": "0.1.1",
3234+ "resolved": "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz",
3235+ "integrity": "sha512-jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==",
3236+ "dev": true
3237+ },
3238+ "css-selector-tokenizer": {
3239+ "version": "0.7.2",
3240+ "resolved": "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz",
3241+ "integrity": "sha512-yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==",
3242+ "dev": true,
3243+ "requires": {
3244+ "cssesc": "^3.0.0",
3245+ "fastparse": "^1.1.2",
3246+ "regexpu-core": "^4.6.0"
3247+ }
3248+ },
3249+ "css-tree": {
3250+ "version": "1.0.0-alpha.37",
3251+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz",
3252+ "integrity": "sha512-DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==",
3253+ "dev": true,
3254+ "requires": {
3255+ "mdn-data": "2.0.4",
3256+ "source-map": "^0.6.1"
3257+ }
3258+ },
3259+ "css-what": {
3260+ "version": "3.2.1",
3261+ "resolved": "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz",
3262+ "integrity": "sha512-WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==",
3263+ "dev": true
3264+ },
3265+ "cssesc": {
3266+ "version": "3.0.0",
3267+ "resolved": "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz",
3268+ "integrity": "sha512-/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==",
3269+ "dev": true
3270+ },
3271+ "cssnano": {
3272+ "version": "4.1.10",
3273+ "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz",
3274+ "integrity": "sha512-5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==",
3275+ "dev": true,
3276+ "requires": {
3277+ "cosmiconfig": "^5.0.0",
3278+ "cssnano-preset-default": "^4.0.7",
3279+ "is-resolvable": "^1.0.0",
3280+ "postcss": "^7.0.0"
3281+ }
3282+ },
3283+ "cssnano-preset-default": {
3284+ "version": "4.0.7",
3285+ "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz",
3286+ "integrity": "sha512-x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==",
3287+ "dev": true,
3288+ "requires": {
3289+ "css-declaration-sorter": "^4.0.1",
3290+ "cssnano-util-raw-cache": "^4.0.1",
3291+ "postcss": "^7.0.0",
3292+ "postcss-calc": "^7.0.1",
3293+ "postcss-colormin": "^4.0.3",
3294+ "postcss-convert-values": "^4.0.1",
3295+ "postcss-discard-comments": "^4.0.2",
3296+ "postcss-discard-duplicates": "^4.0.2",
3297+ "postcss-discard-empty": "^4.0.1",
3298+ "postcss-discard-overridden": "^4.0.1",
3299+ "postcss-merge-longhand": "^4.0.11",
3300+ "postcss-merge-rules": "^4.0.3",
3301+ "postcss-minify-font-values": "^4.0.2",
3302+ "postcss-minify-gradients": "^4.0.2",
3303+ "postcss-minify-params": "^4.0.2",
3304+ "postcss-minify-selectors": "^4.0.2",
3305+ "postcss-normalize-charset": "^4.0.1",
3306+ "postcss-normalize-display-values": "^4.0.2",
3307+ "postcss-normalize-positions": "^4.0.2",
3308+ "postcss-normalize-repeat-style": "^4.0.2",
3309+ "postcss-normalize-string": "^4.0.2",
3310+ "postcss-normalize-timing-functions": "^4.0.2",
3311+ "postcss-normalize-unicode": "^4.0.1",
3312+ "postcss-normalize-url": "^4.0.1",
3313+ "postcss-normalize-whitespace": "^4.0.2",
3314+ "postcss-ordered-values": "^4.1.2",
3315+ "postcss-reduce-initial": "^4.0.3",
3316+ "postcss-reduce-transforms": "^4.0.2",
3317+ "postcss-svgo": "^4.0.2",
3318+ "postcss-unique-selectors": "^4.0.1"
3319+ }
3320+ },
3321+ "cssnano-util-get-arguments": {
3322+ "version": "4.0.0",
3323+ "resolved": "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz",
3324+ "integrity": "sha1-7ToIKZ8h11dBsg87gfGU7UnMFQ8=",
3325+ "dev": true
3326+ },
3327+ "cssnano-util-get-match": {
3328+ "version": "4.0.0",
3329+ "resolved": "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz",
3330+ "integrity": "sha1-wOTKB/U4a7F+xeUiULT1lhNlFW0=",
3331+ "dev": true
3332+ },
3333+ "cssnano-util-raw-cache": {
3334+ "version": "4.0.1",
3335+ "resolved": "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz",
3336+ "integrity": "sha512-qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==",
3337+ "dev": true,
3338+ "requires": {
3339+ "postcss": "^7.0.0"
3340+ }
3341+ },
3342+ "cssnano-util-same-parent": {
3343+ "version": "4.0.1",
3344+ "resolved": "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz",
3345+ "integrity": "sha512-WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==",
3346+ "dev": true
3347+ },
3348+ "csso": {
3349+ "version": "4.0.3",
3350+ "resolved": "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz",
3351+ "integrity": "sha512-NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==",
3352+ "dev": true,
3353+ "requires": {
3354+ "css-tree": "1.0.0-alpha.39"
3355+ },
3356+ "dependencies": {
3357+ "css-tree": {
3358+ "version": "1.0.0-alpha.39",
3359+ "resolved": "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz",
3360+ "integrity": "sha512-7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==",
3361+ "dev": true,
3362+ "requires": {
3363+ "mdn-data": "2.0.6",
3364+ "source-map": "^0.6.1"
3365+ }
3366+ },
3367+ "mdn-data": {
3368+ "version": "2.0.6",
3369+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz",
3370+ "integrity": "sha512-rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==",
3371+ "dev": true
3372+ }
3373+ }
3374+ },
3375+ "cssom": {
3376+ "version": "0.3.8",
3377+ "resolved": "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz",
3378+ "integrity": "sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==",
3379+ "dev": true
3380+ },
3381+ "cssstyle": {
3382+ "version": "1.4.0",
3383+ "resolved": "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz",
3384+ "integrity": "sha512-GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==",
3385+ "dev": true,
3386+ "requires": {
3387+ "cssom": "0.3.x"
3388+ }
3389+ },
3390+ "dashdash": {
3391+ "version": "1.14.1",
3392+ "resolved": "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz",
3393+ "integrity": "sha1-hTz6D3y+L+1d4gMmuN1YEDX24vA=",
3394+ "requires": {
3395+ "assert-plus": "^1.0.0"
3396+ }
3397+ },
3398+ "data-urls": {
3399+ "version": "1.1.0",
3400+ "resolved": "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz",
3401+ "integrity": "sha512-YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==",
3402+ "dev": true,
3403+ "requires": {
3404+ "abab": "^2.0.0",
3405+ "whatwg-mimetype": "^2.2.0",
3406+ "whatwg-url": "^7.0.0"
3407+ }
3408+ },
3409+ "deasync": {
3410+ "version": "0.1.19",
3411+ "resolved": "https://registry.npmjs.org/deasync/-/deasync-0.1.19.tgz",
3412+ "integrity": "sha512-oh3MRktfnPlLysCPpBpKZZzb4cUC/p0aA3SyRGp15lN30juJBTo/CiD0d4fR+f1kBtUQoJj1NE9RPNWQ7BQ9Mg==",
3413+ "dev": true,
3414+ "requires": {
3415+ "bindings": "^1.5.0",
3416+ "node-addon-api": "^1.7.1"
3417+ }
3418+ },
3419+ "debug": {
3420+ "version": "4.1.1",
3421+ "resolved": "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz",
3422+ "integrity": "sha512-pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==",
3423+ "dev": true,
3424+ "requires": {
3425+ "ms": "^2.1.1"
3426+ }
3427+ },
3428+ "decamelize": {
3429+ "version": "1.2.0",
3430+ "resolved": "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz",
3431+ "integrity": "sha1-9lNNFRSCabIDUue+4m9QH5oZEpA=",
3432+ "dev": true
3433+ },
3434+ "decode-uri-component": {
3435+ "version": "0.2.0",
3436+ "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz",
3437+ "integrity": "sha1-6zkTMzRYd1y4TNGh+uBiEGu4dUU=",
3438+ "dev": true
3439+ },
3440+ "deep-is": {
3441+ "version": "0.1.3",
3442+ "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz",
3443+ "integrity": "sha1-s2nW+128E+7PUk+RsHD+7cNXzzQ=",
3444+ "dev": true
3445+ },
3446+ "defaults": {
3447+ "version": "1.0.3",
3448+ "resolved": "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz",
3449+ "integrity": "sha1-xlYFHpgX2f8I7YgUd/P+QBnz730=",
3450+ "dev": true,
3451+ "requires": {
3452+ "clone": "^1.0.2"
3453+ },
3454+ "dependencies": {
3455+ "clone": {
3456+ "version": "1.0.4",
3457+ "resolved": "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz",
3458+ "integrity": "sha1-2jCcwmPfFZlMaIypAheco8fNfH4=",
3459+ "dev": true
3460+ }
3461+ }
3462+ },
3463+ "define-properties": {
3464+ "version": "1.1.3",
3465+ "resolved": "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz",
3466+ "integrity": "sha512-3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==",
3467+ "dev": true,
3468+ "requires": {
3469+ "object-keys": "^1.0.12"
3470+ }
3471+ },
3472+ "define-property": {
3473+ "version": "2.0.2",
3474+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz",
3475+ "integrity": "sha512-jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==",
3476+ "dev": true,
3477+ "requires": {
3478+ "is-descriptor": "^1.0.2",
3479+ "isobject": "^3.0.1"
3480+ },
3481+ "dependencies": {
3482+ "is-accessor-descriptor": {
3483+ "version": "1.0.0",
3484+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
3485+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
3486+ "dev": true,
3487+ "requires": {
3488+ "kind-of": "^6.0.0"
3489+ }
3490+ },
3491+ "is-data-descriptor": {
3492+ "version": "1.0.0",
3493+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
3494+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
3495+ "dev": true,
3496+ "requires": {
3497+ "kind-of": "^6.0.0"
3498+ }
3499+ },
3500+ "is-descriptor": {
3501+ "version": "1.0.2",
3502+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
3503+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
3504+ "dev": true,
3505+ "requires": {
3506+ "is-accessor-descriptor": "^1.0.0",
3507+ "is-data-descriptor": "^1.0.0",
3508+ "kind-of": "^6.0.2"
3509+ }
3510+ }
3511+ }
3512+ },
3513+ "delayed-stream": {
3514+ "version": "1.0.0",
3515+ "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz",
3516+ "integrity": "sha1-3zrhmayt+31ECqrgsp4icrJOxhk="
3517+ },
3518+ "depd": {
3519+ "version": "1.1.2",
3520+ "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz",
3521+ "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=",
3522+ "dev": true
3523+ },
3524+ "des.js": {
3525+ "version": "1.0.1",
3526+ "resolved": "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz",
3527+ "integrity": "sha512-Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==",
3528+ "dev": true,
3529+ "requires": {
3530+ "inherits": "^2.0.1",
3531+ "minimalistic-assert": "^1.0.0"
3532+ }
3533+ },
3534+ "destroy": {
3535+ "version": "1.0.4",
3536+ "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz",
3537+ "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=",
3538+ "dev": true
3539+ },
3540+ "diffie-hellman": {
3541+ "version": "5.0.3",
3542+ "resolved": "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz",
3543+ "integrity": "sha512-kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==",
3544+ "dev": true,
3545+ "requires": {
3546+ "bn.js": "^4.1.0",
3547+ "miller-rabin": "^4.0.0",
3548+ "randombytes": "^2.0.0"
3549+ }
3550+ },
3551+ "dom-serializer": {
3552+ "version": "0.2.2",
3553+ "resolved": "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz",
3554+ "integrity": "sha512-2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==",
3555+ "dev": true,
3556+ "requires": {
3557+ "domelementtype": "^2.0.1",
3558+ "entities": "^2.0.0"
3559+ },
3560+ "dependencies": {
3561+ "domelementtype": {
3562+ "version": "2.0.1",
3563+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz",
3564+ "integrity": "sha512-5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==",
3565+ "dev": true
3566+ }
3567+ }
3568+ },
3569+ "domain-browser": {
3570+ "version": "1.2.0",
3571+ "resolved": "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz",
3572+ "integrity": "sha512-jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==",
3573+ "dev": true
3574+ },
3575+ "domelementtype": {
3576+ "version": "1.3.1",
3577+ "resolved": "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz",
3578+ "integrity": "sha512-BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==",
3579+ "dev": true
3580+ },
3581+ "domexception": {
3582+ "version": "1.0.1",
3583+ "resolved": "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz",
3584+ "integrity": "sha512-raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==",
3585+ "dev": true,
3586+ "requires": {
3587+ "webidl-conversions": "^4.0.2"
3588+ }
3589+ },
3590+ "domhandler": {
3591+ "version": "2.4.2",
3592+ "resolved": "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz",
3593+ "integrity": "sha512-JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==",
3594+ "dev": true,
3595+ "requires": {
3596+ "domelementtype": "1"
3597+ }
3598+ },
3599+ "domutils": {
3600+ "version": "1.7.0",
3601+ "resolved": "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz",
3602+ "integrity": "sha512-Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==",
3603+ "dev": true,
3604+ "requires": {
3605+ "dom-serializer": "0",
3606+ "domelementtype": "1"
3607+ }
3608+ },
3609+ "dot-prop": {
3610+ "version": "5.2.0",
3611+ "resolved": "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz",
3612+ "integrity": "sha512-uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==",
3613+ "dev": true,
3614+ "requires": {
3615+ "is-obj": "^2.0.0"
3616+ }
3617+ },
3618+ "dotenv": {
3619+ "version": "5.0.1",
3620+ "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz",
3621+ "integrity": "sha512-4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==",
3622+ "dev": true
3623+ },
3624+ "dotenv-expand": {
3625+ "version": "4.2.0",
3626+ "resolved": "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz",
3627+ "integrity": "sha1-3vHxyl1gWdJKdm5YeULCEQbOEnU=",
3628+ "dev": true
3629+ },
3630+ "duplexer2": {
3631+ "version": "0.1.4",
3632+ "resolved": "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz",
3633+ "integrity": "sha1-ixLauHjA1p4+eJEFFmKjL8a93ME=",
3634+ "dev": true,
3635+ "requires": {
3636+ "readable-stream": "^2.0.2"
3637+ }
3638+ },
3639+ "ecc-jsbn": {
3640+ "version": "0.1.2",
3641+ "resolved": "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz",
3642+ "integrity": "sha1-OoOpBOVDUyh4dMVkt1SThoSamMk=",
3643+ "requires": {
3644+ "jsbn": "~0.1.0",
3645+ "safer-buffer": "^2.1.0"
3646+ }
3647+ },
3648+ "editorconfig": {
3649+ "version": "0.15.3",
3650+ "resolved": "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz",
3651+ "integrity": "sha512-M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==",
3652+ "dev": true,
3653+ "requires": {
3654+ "commander": "^2.19.0",
3655+ "lru-cache": "^4.1.5",
3656+ "semver": "^5.6.0",
3657+ "sigmund": "^1.0.1"
3658+ }
3659+ },
3660+ "ee-first": {
3661+ "version": "1.1.1",
3662+ "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz",
3663+ "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=",
3664+ "dev": true
3665+ },
3666+ "electron-to-chromium": {
3667+ "version": "1.3.418",
3668+ "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.418.tgz",
3669+ "integrity": "sha512-i2QrQtHes5fK/F9QGG5XacM5WKEuR322fxTYF9e8O9Gu0mc0WmjjwGpV8c7Htso6Zf2Di18lc3SIPxmMeRFBug==",
3670+ "dev": true
3671+ },
3672+ "elliptic": {
3673+ "version": "6.5.2",
3674+ "resolved": "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz",
3675+ "integrity": "sha512-f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==",
3676+ "dev": true,
3677+ "requires": {
3678+ "bn.js": "^4.4.0",
3679+ "brorand": "^1.0.1",
3680+ "hash.js": "^1.0.0",
3681+ "hmac-drbg": "^1.0.0",
3682+ "inherits": "^2.0.1",
3683+ "minimalistic-assert": "^1.0.0",
3684+ "minimalistic-crypto-utils": "^1.0.0"
3685+ }
3686+ },
3687+ "elm-hot": {
3688+ "version": "1.1.1",
3689+ "resolved": "https://registry.npmjs.org/elm-hot/-/elm-hot-1.1.1.tgz",
3690+ "integrity": "sha512-ZHjoHd2Ev6riNXNQirj3J+GKKXXwedAUikfFBYzlVL/+3CdGs96cpZ7nhAk4c5l//Qa9ymltrqX36mOlr0pPFA==",
3691+ "dev": true
3692+ },
3693+ "emoji-regex": {
3694+ "version": "7.0.3",
3695+ "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz",
3696+ "integrity": "sha512-CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==",
3697+ "dev": true
3698+ },
3699+ "encodeurl": {
3700+ "version": "1.0.2",
3701+ "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz",
3702+ "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=",
3703+ "dev": true
3704+ },
3705+ "entities": {
3706+ "version": "2.0.0",
3707+ "resolved": "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz",
3708+ "integrity": "sha512-D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==",
3709+ "dev": true
3710+ },
3711+ "error-ex": {
3712+ "version": "1.3.2",
3713+ "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz",
3714+ "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==",
3715+ "dev": true,
3716+ "requires": {
3717+ "is-arrayish": "^0.2.1"
3718+ }
3719+ },
3720+ "es-abstract": {
3721+ "version": "1.17.5",
3722+ "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz",
3723+ "integrity": "sha512-BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==",
3724+ "dev": true,
3725+ "requires": {
3726+ "es-to-primitive": "^1.2.1",
3727+ "function-bind": "^1.1.1",
3728+ "has": "^1.0.3",
3729+ "has-symbols": "^1.0.1",
3730+ "is-callable": "^1.1.5",
3731+ "is-regex": "^1.0.5",
3732+ "object-inspect": "^1.7.0",
3733+ "object-keys": "^1.1.1",
3734+ "object.assign": "^4.1.0",
3735+ "string.prototype.trimleft": "^2.1.1",
3736+ "string.prototype.trimright": "^2.1.1"
3737+ }
3738+ },
3739+ "es-to-primitive": {
3740+ "version": "1.2.1",
3741+ "resolved": "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz",
3742+ "integrity": "sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==",
3743+ "dev": true,
3744+ "requires": {
3745+ "is-callable": "^1.1.4",
3746+ "is-date-object": "^1.0.1",
3747+ "is-symbol": "^1.0.2"
3748+ }
3749+ },
3750+ "escape-html": {
3751+ "version": "1.0.3",
3752+ "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz",
3753+ "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=",
3754+ "dev": true
3755+ },
3756+ "escape-string-regexp": {
3757+ "version": "1.0.5",
3758+ "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz",
3759+ "integrity": "sha1-G2HAViGQqN/2rjuyzwIAyhMLhtQ=",
3760+ "dev": true
3761+ },
3762+ "escodegen": {
3763+ "version": "1.9.1",
3764+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz",
3765+ "integrity": "sha512-6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==",
3766+ "dev": true,
3767+ "requires": {
3768+ "esprima": "^3.1.3",
3769+ "estraverse": "^4.2.0",
3770+ "esutils": "^2.0.2",
3771+ "optionator": "^0.8.1",
3772+ "source-map": "~0.6.1"
3773+ },
3774+ "dependencies": {
3775+ "esprima": {
3776+ "version": "3.1.3",
3777+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz",
3778+ "integrity": "sha1-/cpRzuYTOJXjyI1TXOSdv/YqRjM=",
3779+ "dev": true
3780+ }
3781+ }
3782+ },
3783+ "esprima": {
3784+ "version": "4.0.1",
3785+ "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz",
3786+ "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==",
3787+ "dev": true
3788+ },
3789+ "estraverse": {
3790+ "version": "4.3.0",
3791+ "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz",
3792+ "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==",
3793+ "dev": true
3794+ },
3795+ "esutils": {
3796+ "version": "2.0.3",
3797+ "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz",
3798+ "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==",
3799+ "dev": true
3800+ },
3801+ "etag": {
3802+ "version": "1.8.1",
3803+ "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz",
3804+ "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=",
3805+ "dev": true
3806+ },
3807+ "events": {
3808+ "version": "3.1.0",
3809+ "resolved": "https://registry.npmjs.org/events/-/events-3.1.0.tgz",
3810+ "integrity": "sha512-Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==",
3811+ "dev": true
3812+ },
3813+ "evp_bytestokey": {
3814+ "version": "1.0.3",
3815+ "resolved": "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz",
3816+ "integrity": "sha512-/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==",
3817+ "dev": true,
3818+ "requires": {
3819+ "md5.js": "^1.3.4",
3820+ "safe-buffer": "^5.1.1"
3821+ }
3822+ },
3823+ "expand-brackets": {
3824+ "version": "2.1.4",
3825+ "resolved": "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz",
3826+ "integrity": "sha1-t3c14xXOMPa27/D4OwQVGiJEliI=",
3827+ "dev": true,
3828+ "requires": {
3829+ "debug": "^2.3.3",
3830+ "define-property": "^0.2.5",
3831+ "extend-shallow": "^2.0.1",
3832+ "posix-character-classes": "^0.1.0",
3833+ "regex-not": "^1.0.0",
3834+ "snapdragon": "^0.8.1",
3835+ "to-regex": "^3.0.1"
3836+ },
3837+ "dependencies": {
3838+ "debug": {
3839+ "version": "2.6.9",
3840+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
3841+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
3842+ "dev": true,
3843+ "requires": {
3844+ "ms": "2.0.0"
3845+ }
3846+ },
3847+ "define-property": {
3848+ "version": "0.2.5",
3849+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
3850+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
3851+ "dev": true,
3852+ "requires": {
3853+ "is-descriptor": "^0.1.0"
3854+ }
3855+ },
3856+ "extend-shallow": {
3857+ "version": "2.0.1",
3858+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
3859+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
3860+ "dev": true,
3861+ "requires": {
3862+ "is-extendable": "^0.1.0"
3863+ }
3864+ },
3865+ "ms": {
3866+ "version": "2.0.0",
3867+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
3868+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
3869+ "dev": true
3870+ }
3871+ }
3872+ },
3873+ "extend": {
3874+ "version": "3.0.2",
3875+ "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz",
3876+ "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g=="
3877+ },
3878+ "extend-shallow": {
3879+ "version": "3.0.2",
3880+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz",
3881+ "integrity": "sha1-Jqcarwc7OfshJxcnRhMcJwQCjbg=",
3882+ "dev": true,
3883+ "requires": {
3884+ "assign-symbols": "^1.0.0",
3885+ "is-extendable": "^1.0.1"
3886+ },
3887+ "dependencies": {
3888+ "is-extendable": {
3889+ "version": "1.0.1",
3890+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
3891+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
3892+ "dev": true,
3893+ "requires": {
3894+ "is-plain-object": "^2.0.4"
3895+ }
3896+ }
3897+ }
3898+ },
3899+ "extglob": {
3900+ "version": "2.0.4",
3901+ "resolved": "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz",
3902+ "integrity": "sha512-Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==",
3903+ "dev": true,
3904+ "requires": {
3905+ "array-unique": "^0.3.2",
3906+ "define-property": "^1.0.0",
3907+ "expand-brackets": "^2.1.4",
3908+ "extend-shallow": "^2.0.1",
3909+ "fragment-cache": "^0.2.1",
3910+ "regex-not": "^1.0.0",
3911+ "snapdragon": "^0.8.1",
3912+ "to-regex": "^3.0.1"
3913+ },
3914+ "dependencies": {
3915+ "define-property": {
3916+ "version": "1.0.0",
3917+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
3918+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
3919+ "dev": true,
3920+ "requires": {
3921+ "is-descriptor": "^1.0.0"
3922+ }
3923+ },
3924+ "extend-shallow": {
3925+ "version": "2.0.1",
3926+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
3927+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
3928+ "dev": true,
3929+ "requires": {
3930+ "is-extendable": "^0.1.0"
3931+ }
3932+ },
3933+ "is-accessor-descriptor": {
3934+ "version": "1.0.0",
3935+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
3936+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
3937+ "dev": true,
3938+ "requires": {
3939+ "kind-of": "^6.0.0"
3940+ }
3941+ },
3942+ "is-data-descriptor": {
3943+ "version": "1.0.0",
3944+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
3945+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
3946+ "dev": true,
3947+ "requires": {
3948+ "kind-of": "^6.0.0"
3949+ }
3950+ },
3951+ "is-descriptor": {
3952+ "version": "1.0.2",
3953+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
3954+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
3955+ "dev": true,
3956+ "requires": {
3957+ "is-accessor-descriptor": "^1.0.0",
3958+ "is-data-descriptor": "^1.0.0",
3959+ "kind-of": "^6.0.2"
3960+ }
3961+ }
3962+ }
3963+ },
3964+ "extsprintf": {
3965+ "version": "1.3.0",
3966+ "resolved": "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz",
3967+ "integrity": "sha1-lpGEQOMEGnpBT4xS48V06zw+HgU="
3968+ },
3969+ "falafel": {
3970+ "version": "2.2.4",
3971+ "resolved": "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz",
3972+ "integrity": "sha512-0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==",
3973+ "dev": true,
3974+ "requires": {
3975+ "acorn": "^7.1.1",
3976+ "foreach": "^2.0.5",
3977+ "isarray": "^2.0.1",
3978+ "object-keys": "^1.0.6"
3979+ },
3980+ "dependencies": {
3981+ "isarray": {
3982+ "version": "2.0.5",
3983+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz",
3984+ "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==",
3985+ "dev": true
3986+ }
3987+ }
3988+ },
3989+ "fast-deep-equal": {
3990+ "version": "3.1.1",
3991+ "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz",
3992+ "integrity": "sha512-8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA=="
3993+ },
3994+ "fast-glob": {
3995+ "version": "2.2.7",
3996+ "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz",
3997+ "integrity": "sha512-g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==",
3998+ "dev": true,
3999+ "requires": {
4000+ "@mrmlnc/readdir-enhanced": "^2.2.1",
4001+ "@nodelib/fs.stat": "^1.1.2",
4002+ "glob-parent": "^3.1.0",
4003+ "is-glob": "^4.0.0",
4004+ "merge2": "^1.2.3",
4005+ "micromatch": "^3.1.10"
4006+ }
4007+ },
4008+ "fast-json-stable-stringify": {
4009+ "version": "2.1.0",
4010+ "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz",
4011+ "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw=="
4012+ },
4013+ "fast-levenshtein": {
4014+ "version": "2.0.6",
4015+ "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz",
4016+ "integrity": "sha1-PYpcZog6FqMMqGQ+hR8Zuqd5eRc=",
4017+ "dev": true
4018+ },
4019+ "fastparse": {
4020+ "version": "1.1.2",
4021+ "resolved": "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz",
4022+ "integrity": "sha512-483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==",
4023+ "dev": true
4024+ },
4025+ "file-uri-to-path": {
4026+ "version": "1.0.0",
4027+ "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz",
4028+ "integrity": "sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==",
4029+ "dev": true
4030+ },
4031+ "filesize": {
4032+ "version": "3.6.1",
4033+ "resolved": "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz",
4034+ "integrity": "sha512-7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==",
4035+ "dev": true
4036+ },
4037+ "fill-range": {
4038+ "version": "4.0.0",
4039+ "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz",
4040+ "integrity": "sha1-1USBHUKPmOsGpj3EAtJAPDKMOPc=",
4041+ "dev": true,
4042+ "requires": {
4043+ "extend-shallow": "^2.0.1",
4044+ "is-number": "^3.0.0",
4045+ "repeat-string": "^1.6.1",
4046+ "to-regex-range": "^2.1.0"
4047+ },
4048+ "dependencies": {
4049+ "extend-shallow": {
4050+ "version": "2.0.1",
4051+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
4052+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
4053+ "dev": true,
4054+ "requires": {
4055+ "is-extendable": "^0.1.0"
4056+ }
4057+ }
4058+ }
4059+ },
4060+ "find-elm-dependencies": {
4061+ "version": "2.0.2",
4062+ "resolved": "https://registry.npmjs.org/find-elm-dependencies/-/find-elm-dependencies-2.0.2.tgz",
4063+ "integrity": "sha512-nM5UCbccD1G8CGK2GsM7ykG3ksOAl9E+34jiDfl07CAl2OPnLpBVWY2hlxEmIkSBfdJjSopEowWHrO0cI8RhxQ==",
4064+ "dev": true,
4065+ "requires": {
4066+ "firstline": "1.2.0",
4067+ "lodash": "4.17.15"
4068+ }
4069+ },
4070+ "find-up": {
4071+ "version": "2.1.0",
4072+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz",
4073+ "integrity": "sha1-RdG35QbHF93UgndaK3eSCjwMV6c=",
4074+ "dev": true,
4075+ "requires": {
4076+ "locate-path": "^2.0.0"
4077+ }
4078+ },
4079+ "firstline": {
4080+ "version": "1.2.0",
4081+ "resolved": "https://registry.npmjs.org/firstline/-/firstline-1.2.0.tgz",
4082+ "integrity": "sha1-yfSIbn9/vwr8EtcZQdzgaxkq6gU=",
4083+ "dev": true
4084+ },
4085+ "for-in": {
4086+ "version": "1.0.2",
4087+ "resolved": "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz",
4088+ "integrity": "sha1-gQaNKVqBQuwKxybG4iAMMPttXoA=",
4089+ "dev": true
4090+ },
4091+ "foreach": {
4092+ "version": "2.0.5",
4093+ "resolved": "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz",
4094+ "integrity": "sha1-C+4AUBiusmDQo6865ljdATbsG5k=",
4095+ "dev": true
4096+ },
4097+ "forever-agent": {
4098+ "version": "0.6.1",
4099+ "resolved": "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz",
4100+ "integrity": "sha1-+8cfDEGt6zf5bFd60e1C2P2sypE="
4101+ },
4102+ "form-data": {
4103+ "version": "2.3.3",
4104+ "resolved": "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz",
4105+ "integrity": "sha512-1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==",
4106+ "requires": {
4107+ "asynckit": "^0.4.0",
4108+ "combined-stream": "^1.0.6",
4109+ "mime-types": "^2.1.12"
4110+ }
4111+ },
4112+ "fragment-cache": {
4113+ "version": "0.2.1",
4114+ "resolved": "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz",
4115+ "integrity": "sha1-QpD60n8T6Jvn8zeZxrxaCr//DRk=",
4116+ "dev": true,
4117+ "requires": {
4118+ "map-cache": "^0.2.2"
4119+ }
4120+ },
4121+ "fresh": {
4122+ "version": "0.5.2",
4123+ "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz",
4124+ "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=",
4125+ "dev": true
4126+ },
4127+ "fs.realpath": {
4128+ "version": "1.0.0",
4129+ "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
4130+ "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
4131+ "dev": true
4132+ },
4133+ "function-bind": {
4134+ "version": "1.1.1",
4135+ "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz",
4136+ "integrity": "sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==",
4137+ "dev": true
4138+ },
4139+ "get-caller-file": {
4140+ "version": "2.0.5",
4141+ "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz",
4142+ "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==",
4143+ "dev": true
4144+ },
4145+ "get-port": {
4146+ "version": "3.2.0",
4147+ "resolved": "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz",
4148+ "integrity": "sha1-3Xzn3hh8Bsi/NTeWrHHgmfCYDrw=",
4149+ "dev": true
4150+ },
4151+ "get-value": {
4152+ "version": "2.0.6",
4153+ "resolved": "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz",
4154+ "integrity": "sha1-3BXKHGcjh8p2vTesCjlbogQqLCg=",
4155+ "dev": true
4156+ },
4157+ "getpass": {
4158+ "version": "0.1.7",
4159+ "resolved": "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz",
4160+ "integrity": "sha1-Xv+OPmhNVprkyysSgmBOi6YhSfo=",
4161+ "requires": {
4162+ "assert-plus": "^1.0.0"
4163+ }
4164+ },
4165+ "glob": {
4166+ "version": "7.1.4",
4167+ "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
4168+ "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
4169+ "dev": true,
4170+ "requires": {
4171+ "fs.realpath": "^1.0.0",
4172+ "inflight": "^1.0.4",
4173+ "inherits": "2",
4174+ "minimatch": "^3.0.4",
4175+ "once": "^1.3.0",
4176+ "path-is-absolute": "^1.0.0"
4177+ }
4178+ },
4179+ "glob-parent": {
4180+ "version": "3.1.0",
4181+ "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz",
4182+ "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=",
4183+ "dev": true,
4184+ "requires": {
4185+ "is-glob": "^3.1.0",
4186+ "path-dirname": "^1.0.0"
4187+ },
4188+ "dependencies": {
4189+ "is-glob": {
4190+ "version": "3.1.0",
4191+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz",
4192+ "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=",
4193+ "dev": true,
4194+ "requires": {
4195+ "is-extglob": "^2.1.0"
4196+ }
4197+ }
4198+ }
4199+ },
4200+ "glob-to-regexp": {
4201+ "version": "0.3.0",
4202+ "resolved": "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz",
4203+ "integrity": "sha1-jFoUlNIGbFcMw7/kSWF1rMTVAqs=",
4204+ "dev": true
4205+ },
4206+ "globals": {
4207+ "version": "11.12.0",
4208+ "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz",
4209+ "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==",
4210+ "dev": true
4211+ },
4212+ "graceful-fs": {
4213+ "version": "4.2.3",
4214+ "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz",
4215+ "integrity": "sha512-a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==",
4216+ "dev": true
4217+ },
4218+ "grapheme-breaker": {
4219+ "version": "0.3.2",
4220+ "resolved": "https://registry.npmjs.org/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz",
4221+ "integrity": "sha1-W55reMODJFLSuiuxy4MPlidkEKw=",
4222+ "dev": true,
4223+ "requires": {
4224+ "brfs": "^1.2.0",
4225+ "unicode-trie": "^0.3.1"
4226+ }
4227+ },
4228+ "har-schema": {
4229+ "version": "2.0.0",
4230+ "resolved": "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz",
4231+ "integrity": "sha1-qUwiJOvKwEeCoNkDVSHyRzW37JI="
4232+ },
4233+ "har-validator": {
4234+ "version": "5.1.3",
4235+ "resolved": "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz",
4236+ "integrity": "sha512-sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==",
4237+ "requires": {
4238+ "ajv": "^6.5.5",
4239+ "har-schema": "^2.0.0"
4240+ }
4241+ },
4242+ "has": {
4243+ "version": "1.0.3",
4244+ "resolved": "https://registry.npmjs.org/has/-/has-1.0.3.tgz",
4245+ "integrity": "sha512-f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==",
4246+ "dev": true,
4247+ "requires": {
4248+ "function-bind": "^1.1.1"
4249+ }
4250+ },
4251+ "has-ansi": {
4252+ "version": "2.0.0",
4253+ "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
4254+ "integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
4255+ "dev": true,
4256+ "requires": {
4257+ "ansi-regex": "^2.0.0"
4258+ },
4259+ "dependencies": {
4260+ "ansi-regex": {
4261+ "version": "2.1.1",
4262+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz",
4263+ "integrity": "sha1-w7M6te42DYbg5ijwRorn7yfWVN8=",
4264+ "dev": true
4265+ }
4266+ }
4267+ },
4268+ "has-flag": {
4269+ "version": "3.0.0",
4270+ "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
4271+ "integrity": "sha1-tdRU3CGZriJWmfNGfloH87lVuv0=",
4272+ "dev": true
4273+ },
4274+ "has-symbols": {
4275+ "version": "1.0.1",
4276+ "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz",
4277+ "integrity": "sha512-PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==",
4278+ "dev": true
4279+ },
4280+ "has-value": {
4281+ "version": "1.0.0",
4282+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz",
4283+ "integrity": "sha1-GLKB2lhbHFxR3vJMkw7SmgvmsXc=",
4284+ "dev": true,
4285+ "requires": {
4286+ "get-value": "^2.0.6",
4287+ "has-values": "^1.0.0",
4288+ "isobject": "^3.0.0"
4289+ }
4290+ },
4291+ "has-values": {
4292+ "version": "1.0.0",
4293+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz",
4294+ "integrity": "sha1-lbC2P+whRmGab+V/51Yo1aOe/k8=",
4295+ "dev": true,
4296+ "requires": {
4297+ "is-number": "^3.0.0",
4298+ "kind-of": "^4.0.0"
4299+ },
4300+ "dependencies": {
4301+ "kind-of": {
4302+ "version": "4.0.0",
4303+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz",
4304+ "integrity": "sha1-IIE989cSkosgc3hpGkUGb65y3Vc=",
4305+ "dev": true,
4306+ "requires": {
4307+ "is-buffer": "^1.1.5"
4308+ }
4309+ }
4310+ }
4311+ },
4312+ "hash-base": {
4313+ "version": "3.0.4",
4314+ "resolved": "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz",
4315+ "integrity": "sha1-X8hoaEfs1zSZQDMZprCj8/auSRg=",
4316+ "dev": true,
4317+ "requires": {
4318+ "inherits": "^2.0.1",
4319+ "safe-buffer": "^5.0.1"
4320+ }
4321+ },
4322+ "hash.js": {
4323+ "version": "1.1.7",
4324+ "resolved": "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz",
4325+ "integrity": "sha512-taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==",
4326+ "dev": true,
4327+ "requires": {
4328+ "inherits": "^2.0.3",
4329+ "minimalistic-assert": "^1.0.1"
4330+ }
4331+ },
4332+ "hex-color-regex": {
4333+ "version": "1.1.0",
4334+ "resolved": "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz",
4335+ "integrity": "sha512-l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==",
4336+ "dev": true
4337+ },
4338+ "hmac-drbg": {
4339+ "version": "1.0.1",
4340+ "resolved": "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz",
4341+ "integrity": "sha1-0nRXAQJabHdabFRXk+1QL8DGSaE=",
4342+ "dev": true,
4343+ "requires": {
4344+ "hash.js": "^1.0.3",
4345+ "minimalistic-assert": "^1.0.0",
4346+ "minimalistic-crypto-utils": "^1.0.1"
4347+ }
4348+ },
4349+ "hsl-regex": {
4350+ "version": "1.0.0",
4351+ "resolved": "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz",
4352+ "integrity": "sha1-1JMwx4ntgZ4nakwNJy3/owsY/m4=",
4353+ "dev": true
4354+ },
4355+ "hsla-regex": {
4356+ "version": "1.0.0",
4357+ "resolved": "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz",
4358+ "integrity": "sha1-wc56MWjIxmFAM6S194d/OyJfnDg=",
4359+ "dev": true
4360+ },
4361+ "html-comment-regex": {
4362+ "version": "1.1.2",
4363+ "resolved": "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz",
4364+ "integrity": "sha512-P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==",
4365+ "dev": true
4366+ },
4367+ "html-encoding-sniffer": {
4368+ "version": "1.0.2",
4369+ "resolved": "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz",
4370+ "integrity": "sha512-71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==",
4371+ "dev": true,
4372+ "requires": {
4373+ "whatwg-encoding": "^1.0.1"
4374+ }
4375+ },
4376+ "html-tags": {
4377+ "version": "1.2.0",
4378+ "resolved": "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz",
4379+ "integrity": "sha1-x43mW1Zjqll5id0rerSSANfk25g=",
4380+ "dev": true
4381+ },
4382+ "htmlnano": {
4383+ "version": "0.2.5",
4384+ "resolved": "https://registry.npmjs.org/htmlnano/-/htmlnano-0.2.5.tgz",
4385+ "integrity": "sha512-X1iPSwXG/iF9bVs+/obt2n6F64uH0ETkA8zp7qFDmLW9/+A6ueHGeb/+qD67T21qUY22owZPMdawljN50ajkqA==",
4386+ "dev": true,
4387+ "requires": {
4388+ "cssnano": "^4.1.10",
4389+ "normalize-html-whitespace": "^1.0.0",
4390+ "posthtml": "^0.12.0",
4391+ "posthtml-render": "^1.1.5",
4392+ "purgecss": "^1.4.0",
4393+ "svgo": "^1.3.2",
4394+ "terser": "^4.3.9",
4395+ "uncss": "^0.17.2"
4396+ },
4397+ "dependencies": {
4398+ "posthtml": {
4399+ "version": "0.12.3",
4400+ "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.12.3.tgz",
4401+ "integrity": "sha512-Fbpi95+JJyR0tqU7pUy1zTSQFjAsluuwB9pJ1h0jtnGk7n/O2TBtP5nDl9rV0JVACjQ1Lm5wSp4ppChr8u3MhA==",
4402+ "dev": true,
4403+ "requires": {
4404+ "posthtml-parser": "^0.4.2",
4405+ "posthtml-render": "^1.2.2"
4406+ }
4407+ },
4408+ "terser": {
4409+ "version": "4.6.12",
4410+ "resolved": "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz",
4411+ "integrity": "sha512-fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==",
4412+ "dev": true,
4413+ "requires": {
4414+ "commander": "^2.20.0",
4415+ "source-map": "~0.6.1",
4416+ "source-map-support": "~0.5.12"
4417+ }
4418+ }
4419+ }
4420+ },
4421+ "htmlparser2": {
4422+ "version": "3.10.1",
4423+ "resolved": "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz",
4424+ "integrity": "sha512-IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==",
4425+ "dev": true,
4426+ "requires": {
4427+ "domelementtype": "^1.3.1",
4428+ "domhandler": "^2.3.0",
4429+ "domutils": "^1.5.1",
4430+ "entities": "^1.1.1",
4431+ "inherits": "^2.0.1",
4432+ "readable-stream": "^3.1.1"
4433+ },
4434+ "dependencies": {
4435+ "entities": {
4436+ "version": "1.1.2",
4437+ "resolved": "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz",
4438+ "integrity": "sha512-f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==",
4439+ "dev": true
4440+ },
4441+ "readable-stream": {
4442+ "version": "3.6.0",
4443+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz",
4444+ "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==",
4445+ "dev": true,
4446+ "requires": {
4447+ "inherits": "^2.0.3",
4448+ "string_decoder": "^1.1.1",
4449+ "util-deprecate": "^1.0.1"
4450+ }
4451+ }
4452+ }
4453+ },
4454+ "http-errors": {
4455+ "version": "1.7.3",
4456+ "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz",
4457+ "integrity": "sha512-ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==",
4458+ "dev": true,
4459+ "requires": {
4460+ "depd": "~1.1.2",
4461+ "inherits": "2.0.4",
4462+ "setprototypeof": "1.1.1",
4463+ "statuses": ">= 1.5.0 < 2",
4464+ "toidentifier": "1.0.0"
4465+ }
4466+ },
4467+ "http-signature": {
4468+ "version": "1.2.0",
4469+ "resolved": "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz",
4470+ "integrity": "sha1-muzZJRFHcvPZW2WmCruPfBj7rOE=",
4471+ "requires": {
4472+ "assert-plus": "^1.0.0",
4473+ "jsprim": "^1.2.2",
4474+ "sshpk": "^1.7.0"
4475+ }
4476+ },
4477+ "https-browserify": {
4478+ "version": "1.0.0",
4479+ "resolved": "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz",
4480+ "integrity": "sha1-7AbBDgo0wPL68Zn3/X/Hj//QPHM=",
4481+ "dev": true
4482+ },
4483+ "iconv-lite": {
4484+ "version": "0.4.24",
4485+ "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz",
4486+ "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==",
4487+ "dev": true,
4488+ "requires": {
4489+ "safer-buffer": ">= 2.1.2 < 3"
4490+ }
4491+ },
4492+ "icss-replace-symbols": {
4493+ "version": "1.1.0",
4494+ "resolved": "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz",
4495+ "integrity": "sha1-Bupvg2ead0njhs/h/oEq5dsiPe0=",
4496+ "dev": true
4497+ },
4498+ "ieee754": {
4499+ "version": "1.1.13",
4500+ "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz",
4501+ "integrity": "sha512-4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==",
4502+ "dev": true
4503+ },
4504+ "import-fresh": {
4505+ "version": "2.0.0",
4506+ "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz",
4507+ "integrity": "sha1-2BNVwVYS04bGH53dOSLUMEgipUY=",
4508+ "dev": true,
4509+ "requires": {
4510+ "caller-path": "^2.0.0",
4511+ "resolve-from": "^3.0.0"
4512+ }
4513+ },
4514+ "indexes-of": {
4515+ "version": "1.0.1",
4516+ "resolved": "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz",
4517+ "integrity": "sha1-8w9xbI4r00bHtn0985FVZqfAVgc=",
4518+ "dev": true
4519+ },
4520+ "inflight": {
4521+ "version": "1.0.6",
4522+ "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
4523+ "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
4524+ "dev": true,
4525+ "requires": {
4526+ "once": "^1.3.0",
4527+ "wrappy": "1"
4528+ }
4529+ },
4530+ "inherits": {
4531+ "version": "2.0.4",
4532+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
4533+ "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
4534+ "dev": true
4535+ },
4536+ "ini": {
4537+ "version": "1.3.5",
4538+ "resolved": "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz",
4539+ "integrity": "sha512-RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==",
4540+ "dev": true
4541+ },
4542+ "invariant": {
4543+ "version": "2.2.4",
4544+ "resolved": "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz",
4545+ "integrity": "sha512-phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==",
4546+ "dev": true,
4547+ "requires": {
4548+ "loose-envify": "^1.0.0"
4549+ }
4550+ },
4551+ "is-absolute-url": {
4552+ "version": "2.1.0",
4553+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz",
4554+ "integrity": "sha1-UFMN+4T8yap9vnhS6Do3uTufKqY=",
4555+ "dev": true
4556+ },
4557+ "is-accessor-descriptor": {
4558+ "version": "0.1.6",
4559+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz",
4560+ "integrity": "sha1-qeEss66Nh2cn7u84Q/igiXtcmNY=",
4561+ "dev": true,
4562+ "requires": {
4563+ "kind-of": "^3.0.2"
4564+ },
4565+ "dependencies": {
4566+ "kind-of": {
4567+ "version": "3.2.2",
4568+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
4569+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
4570+ "dev": true,
4571+ "requires": {
4572+ "is-buffer": "^1.1.5"
4573+ }
4574+ }
4575+ }
4576+ },
4577+ "is-arrayish": {
4578+ "version": "0.2.1",
4579+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz",
4580+ "integrity": "sha1-d8mYQFJ6qOyxqLppe4BkWnqSap0=",
4581+ "dev": true
4582+ },
4583+ "is-binary-path": {
4584+ "version": "1.0.1",
4585+ "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz",
4586+ "integrity": "sha1-dfFmQrSA8YenEcgUFh/TpKdlWJg=",
4587+ "dev": true,
4588+ "requires": {
4589+ "binary-extensions": "^1.0.0"
4590+ }
4591+ },
4592+ "is-buffer": {
4593+ "version": "1.1.6",
4594+ "resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
4595+ "integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==",
4596+ "dev": true
4597+ },
4598+ "is-callable": {
4599+ "version": "1.1.5",
4600+ "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz",
4601+ "integrity": "sha512-ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==",
4602+ "dev": true
4603+ },
4604+ "is-color-stop": {
4605+ "version": "1.1.0",
4606+ "resolved": "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz",
4607+ "integrity": "sha1-z/9HGu5N1cnhWFmPvhKWe1za00U=",
4608+ "dev": true,
4609+ "requires": {
4610+ "css-color-names": "^0.0.4",
4611+ "hex-color-regex": "^1.1.0",
4612+ "hsl-regex": "^1.0.0",
4613+ "hsla-regex": "^1.0.0",
4614+ "rgb-regex": "^1.0.1",
4615+ "rgba-regex": "^1.0.0"
4616+ }
4617+ },
4618+ "is-data-descriptor": {
4619+ "version": "0.1.4",
4620+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz",
4621+ "integrity": "sha1-C17mSDiOLIYCgueT8YVv7D8wG1Y=",
4622+ "dev": true,
4623+ "requires": {
4624+ "kind-of": "^3.0.2"
4625+ },
4626+ "dependencies": {
4627+ "kind-of": {
4628+ "version": "3.2.2",
4629+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
4630+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
4631+ "dev": true,
4632+ "requires": {
4633+ "is-buffer": "^1.1.5"
4634+ }
4635+ }
4636+ }
4637+ },
4638+ "is-date-object": {
4639+ "version": "1.0.2",
4640+ "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz",
4641+ "integrity": "sha512-USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==",
4642+ "dev": true
4643+ },
4644+ "is-descriptor": {
4645+ "version": "0.1.6",
4646+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz",
4647+ "integrity": "sha512-avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==",
4648+ "dev": true,
4649+ "requires": {
4650+ "is-accessor-descriptor": "^0.1.6",
4651+ "is-data-descriptor": "^0.1.4",
4652+ "kind-of": "^5.0.0"
4653+ },
4654+ "dependencies": {
4655+ "kind-of": {
4656+ "version": "5.1.0",
4657+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz",
4658+ "integrity": "sha512-NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==",
4659+ "dev": true
4660+ }
4661+ }
4662+ },
4663+ "is-directory": {
4664+ "version": "0.3.1",
4665+ "resolved": "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz",
4666+ "integrity": "sha1-YTObbyR1/Hcv2cnYP1yFddwVSuE=",
4667+ "dev": true
4668+ },
4669+ "is-extendable": {
4670+ "version": "0.1.1",
4671+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz",
4672+ "integrity": "sha1-YrEQ4omkcUGOPsNqYX1HLjAd/Ik=",
4673+ "dev": true
4674+ },
4675+ "is-extglob": {
4676+ "version": "2.1.1",
4677+ "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz",
4678+ "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=",
4679+ "dev": true
4680+ },
4681+ "is-fullwidth-code-point": {
4682+ "version": "2.0.0",
4683+ "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz",
4684+ "integrity": "sha1-o7MKXE8ZkYMWeqq5O+764937ZU8=",
4685+ "dev": true
4686+ },
4687+ "is-glob": {
4688+ "version": "4.0.1",
4689+ "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz",
4690+ "integrity": "sha512-5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==",
4691+ "dev": true,
4692+ "requires": {
4693+ "is-extglob": "^2.1.1"
4694+ }
4695+ },
4696+ "is-html": {
4697+ "version": "1.1.0",
4698+ "resolved": "https://registry.npmjs.org/is-html/-/is-html-1.1.0.tgz",
4699+ "integrity": "sha1-4E8cGNOUhRETlvmgJz6rUa8hhGQ=",
4700+ "dev": true,
4701+ "requires": {
4702+ "html-tags": "^1.0.0"
4703+ }
4704+ },
4705+ "is-number": {
4706+ "version": "3.0.0",
4707+ "resolved": "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz",
4708+ "integrity": "sha1-JP1iAaR4LPUFYcgQJ2r8fRLXEZU=",
4709+ "dev": true,
4710+ "requires": {
4711+ "kind-of": "^3.0.2"
4712+ },
4713+ "dependencies": {
4714+ "kind-of": {
4715+ "version": "3.2.2",
4716+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
4717+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
4718+ "dev": true,
4719+ "requires": {
4720+ "is-buffer": "^1.1.5"
4721+ }
4722+ }
4723+ }
4724+ },
4725+ "is-obj": {
4726+ "version": "2.0.0",
4727+ "resolved": "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz",
4728+ "integrity": "sha512-drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==",
4729+ "dev": true
4730+ },
4731+ "is-plain-object": {
4732+ "version": "2.0.4",
4733+ "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz",
4734+ "integrity": "sha512-h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==",
4735+ "dev": true,
4736+ "requires": {
4737+ "isobject": "^3.0.1"
4738+ }
4739+ },
4740+ "is-regex": {
4741+ "version": "1.0.5",
4742+ "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz",
4743+ "integrity": "sha512-vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==",
4744+ "dev": true,
4745+ "requires": {
4746+ "has": "^1.0.3"
4747+ }
4748+ },
4749+ "is-resolvable": {
4750+ "version": "1.1.0",
4751+ "resolved": "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz",
4752+ "integrity": "sha512-qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==",
4753+ "dev": true
4754+ },
4755+ "is-svg": {
4756+ "version": "3.0.0",
4757+ "resolved": "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz",
4758+ "integrity": "sha512-gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==",
4759+ "dev": true,
4760+ "requires": {
4761+ "html-comment-regex": "^1.1.0"
4762+ }
4763+ },
4764+ "is-symbol": {
4765+ "version": "1.0.3",
4766+ "resolved": "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz",
4767+ "integrity": "sha512-OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==",
4768+ "dev": true,
4769+ "requires": {
4770+ "has-symbols": "^1.0.1"
4771+ }
4772+ },
4773+ "is-typedarray": {
4774+ "version": "1.0.0",
4775+ "resolved": "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz",
4776+ "integrity": "sha1-5HnICFjfDBsR3dppQPlgEfzaSpo="
4777+ },
4778+ "is-url": {
4779+ "version": "1.2.4",
4780+ "resolved": "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz",
4781+ "integrity": "sha512-ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==",
4782+ "dev": true
4783+ },
4784+ "is-windows": {
4785+ "version": "1.0.2",
4786+ "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz",
4787+ "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==",
4788+ "dev": true
4789+ },
4790+ "is-wsl": {
4791+ "version": "1.1.0",
4792+ "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz",
4793+ "integrity": "sha1-HxbkqiKwTRM2tmGIpmrzxgDDpm0=",
4794+ "dev": true
4795+ },
4796+ "isarray": {
4797+ "version": "1.0.0",
4798+ "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz",
4799+ "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=",
4800+ "dev": true
4801+ },
4802+ "isexe": {
4803+ "version": "2.0.0",
4804+ "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
4805+ "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
4806+ "dev": true
4807+ },
4808+ "isobject": {
4809+ "version": "3.0.1",
4810+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz",
4811+ "integrity": "sha1-TkMekrEalzFjaqH5yNHMvP2reN8=",
4812+ "dev": true
4813+ },
4814+ "isstream": {
4815+ "version": "0.1.2",
4816+ "resolved": "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz",
4817+ "integrity": "sha1-R+Y/evVa+m+S4VAOaQ64uFKcCZo="
4818+ },
4819+ "js-beautify": {
4820+ "version": "1.11.0",
4821+ "resolved": "https://registry.npmjs.org/js-beautify/-/js-beautify-1.11.0.tgz",
4822+ "integrity": "sha512-a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==",
4823+ "dev": true,
4824+ "requires": {
4825+ "config-chain": "^1.1.12",
4826+ "editorconfig": "^0.15.3",
4827+ "glob": "^7.1.3",
4828+ "mkdirp": "~1.0.3",
4829+ "nopt": "^4.0.3"
4830+ },
4831+ "dependencies": {
4832+ "mkdirp": {
4833+ "version": "1.0.4",
4834+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz",
4835+ "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==",
4836+ "dev": true
4837+ }
4838+ }
4839+ },
4840+ "js-levenshtein": {
4841+ "version": "1.1.6",
4842+ "resolved": "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz",
4843+ "integrity": "sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==",
4844+ "dev": true
4845+ },
4846+ "js-tokens": {
4847+ "version": "4.0.0",
4848+ "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
4849+ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
4850+ "dev": true
4851+ },
4852+ "js-yaml": {
4853+ "version": "3.13.1",
4854+ "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
4855+ "integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
4856+ "dev": true,
4857+ "requires": {
4858+ "argparse": "^1.0.7",
4859+ "esprima": "^4.0.0"
4860+ }
4861+ },
4862+ "jsbn": {
4863+ "version": "0.1.1",
4864+ "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz",
4865+ "integrity": "sha1-peZUwuWi3rXyAdls77yoDA7y9RM="
4866+ },
4867+ "jsdom": {
4868+ "version": "14.1.0",
4869+ "resolved": "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz",
4870+ "integrity": "sha512-O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==",
4871+ "dev": true,
4872+ "requires": {
4873+ "abab": "^2.0.0",
4874+ "acorn": "^6.0.4",
4875+ "acorn-globals": "^4.3.0",
4876+ "array-equal": "^1.0.0",
4877+ "cssom": "^0.3.4",
4878+ "cssstyle": "^1.1.1",
4879+ "data-urls": "^1.1.0",
4880+ "domexception": "^1.0.1",
4881+ "escodegen": "^1.11.0",
4882+ "html-encoding-sniffer": "^1.0.2",
4883+ "nwsapi": "^2.1.3",
4884+ "parse5": "5.1.0",
4885+ "pn": "^1.1.0",
4886+ "request": "^2.88.0",
4887+ "request-promise-native": "^1.0.5",
4888+ "saxes": "^3.1.9",
4889+ "symbol-tree": "^3.2.2",
4890+ "tough-cookie": "^2.5.0",
4891+ "w3c-hr-time": "^1.0.1",
4892+ "w3c-xmlserializer": "^1.1.2",
4893+ "webidl-conversions": "^4.0.2",
4894+ "whatwg-encoding": "^1.0.5",
4895+ "whatwg-mimetype": "^2.3.0",
4896+ "whatwg-url": "^7.0.0",
4897+ "ws": "^6.1.2",
4898+ "xml-name-validator": "^3.0.0"
4899+ },
4900+ "dependencies": {
4901+ "acorn": {
4902+ "version": "6.4.1",
4903+ "resolved": "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz",
4904+ "integrity": "sha512-ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==",
4905+ "dev": true
4906+ },
4907+ "escodegen": {
4908+ "version": "1.14.1",
4909+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz",
4910+ "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==",
4911+ "dev": true,
4912+ "requires": {
4913+ "esprima": "^4.0.1",
4914+ "estraverse": "^4.2.0",
4915+ "esutils": "^2.0.2",
4916+ "optionator": "^0.8.1",
4917+ "source-map": "~0.6.1"
4918+ }
4919+ },
4920+ "ws": {
4921+ "version": "6.2.1",
4922+ "resolved": "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz",
4923+ "integrity": "sha512-GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==",
4924+ "dev": true,
4925+ "requires": {
4926+ "async-limiter": "~1.0.0"
4927+ }
4928+ }
4929+ }
4930+ },
4931+ "jsesc": {
4932+ "version": "2.5.2",
4933+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz",
4934+ "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==",
4935+ "dev": true
4936+ },
4937+ "json-parse-better-errors": {
4938+ "version": "1.0.2",
4939+ "resolved": "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz",
4940+ "integrity": "sha512-mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==",
4941+ "dev": true
4942+ },
4943+ "json-schema": {
4944+ "version": "0.2.3",
4945+ "resolved": "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz",
4946+ "integrity": "sha1-tIDIkuWaLwWVTOcnvT8qTogvnhM="
4947+ },
4948+ "json-schema-traverse": {
4949+ "version": "0.4.1",
4950+ "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz",
4951+ "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg=="
4952+ },
4953+ "json-stringify-safe": {
4954+ "version": "5.0.1",
4955+ "resolved": "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz",
4956+ "integrity": "sha1-Epai1Y/UXxmg9s4B1lcB4sc1tus="
4957+ },
4958+ "json5": {
4959+ "version": "1.0.1",
4960+ "resolved": "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz",
4961+ "integrity": "sha512-aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==",
4962+ "dev": true,
4963+ "requires": {
4964+ "minimist": "^1.2.0"
4965+ }
4966+ },
4967+ "jsprim": {
4968+ "version": "1.4.1",
4969+ "resolved": "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz",
4970+ "integrity": "sha1-MT5mvB5cwG5Di8G3SZwuXFastqI=",
4971+ "requires": {
4972+ "assert-plus": "1.0.0",
4973+ "extsprintf": "1.3.0",
4974+ "json-schema": "0.2.3",
4975+ "verror": "1.10.0"
4976+ }
4977+ },
4978+ "kind-of": {
4979+ "version": "6.0.3",
4980+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz",
4981+ "integrity": "sha512-dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==",
4982+ "dev": true
4983+ },
4984+ "levn": {
4985+ "version": "0.3.0",
4986+ "resolved": "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz",
4987+ "integrity": "sha1-OwmSTt+fCDwEkP3UwLxEIeBHZO4=",
4988+ "dev": true,
4989+ "requires": {
4990+ "prelude-ls": "~1.1.2",
4991+ "type-check": "~0.3.2"
4992+ }
4993+ },
4994+ "locate-path": {
4995+ "version": "2.0.0",
4996+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz",
4997+ "integrity": "sha1-K1aLJl7slExtnA3pw9u7ygNUzY4=",
4998+ "dev": true,
4999+ "requires": {
5000+ "p-locate": "^2.0.0",
5001+ "path-exists": "^3.0.0"
5002+ }
5003+ },
5004+ "lodash": {
5005+ "version": "4.17.15",
5006+ "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
5007+ "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
5008+ "dev": true
5009+ },
5010+ "lodash.clone": {
5011+ "version": "4.5.0",
5012+ "resolved": "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz",
5013+ "integrity": "sha1-GVhwRQ9aExkkeN9Lw9I9LeoZB7Y=",
5014+ "dev": true
5015+ },
5016+ "lodash.memoize": {
5017+ "version": "4.1.2",
5018+ "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz",
5019+ "integrity": "sha1-vMbEmkKihA7Zl/Mj6tpezRguC/4=",
5020+ "dev": true
5021+ },
5022+ "lodash.sortby": {
5023+ "version": "4.7.0",
5024+ "resolved": "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz",
5025+ "integrity": "sha1-7dFMgk4sycHgsKG0K7UhBRakJDg=",
5026+ "dev": true
5027+ },
5028+ "lodash.uniq": {
5029+ "version": "4.5.0",
5030+ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz",
5031+ "integrity": "sha1-0CJTc662Uq3BvILklFM5qEJ1R3M=",
5032+ "dev": true
5033+ },
5034+ "log-symbols": {
5035+ "version": "2.2.0",
5036+ "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz",
5037+ "integrity": "sha512-VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==",
5038+ "dev": true,
5039+ "requires": {
5040+ "chalk": "^2.0.1"
5041+ }
5042+ },
5043+ "loose-envify": {
5044+ "version": "1.4.0",
5045+ "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz",
5046+ "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==",
5047+ "dev": true,
5048+ "requires": {
5049+ "js-tokens": "^3.0.0 || ^4.0.0"
5050+ }
5051+ },
5052+ "lru-cache": {
5053+ "version": "4.1.5",
5054+ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz",
5055+ "integrity": "sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==",
5056+ "dev": true,
5057+ "requires": {
5058+ "pseudomap": "^1.0.2",
5059+ "yallist": "^2.1.2"
5060+ }
5061+ },
5062+ "magic-string": {
5063+ "version": "0.22.5",
5064+ "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz",
5065+ "integrity": "sha512-oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==",
5066+ "dev": true,
5067+ "requires": {
5068+ "vlq": "^0.2.2"
5069+ }
5070+ },
5071+ "map-cache": {
5072+ "version": "0.2.2",
5073+ "resolved": "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz",
5074+ "integrity": "sha1-wyq9C9ZSXZsFFkW7TyasXcmKDb8=",
5075+ "dev": true
5076+ },
5077+ "map-visit": {
5078+ "version": "1.0.0",
5079+ "resolved": "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz",
5080+ "integrity": "sha1-7Nyo8TFE5mDxtb1B8S80edmN+48=",
5081+ "dev": true,
5082+ "requires": {
5083+ "object-visit": "^1.0.0"
5084+ }
5085+ },
5086+ "md5.js": {
5087+ "version": "1.3.5",
5088+ "resolved": "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz",
5089+ "integrity": "sha512-xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==",
5090+ "dev": true,
5091+ "requires": {
5092+ "hash-base": "^3.0.0",
5093+ "inherits": "^2.0.1",
5094+ "safe-buffer": "^5.1.2"
5095+ }
5096+ },
5097+ "mdn-data": {
5098+ "version": "2.0.4",
5099+ "resolved": "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz",
5100+ "integrity": "sha512-iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==",
5101+ "dev": true
5102+ },
5103+ "merge-source-map": {
5104+ "version": "1.0.4",
5105+ "resolved": "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz",
5106+ "integrity": "sha1-pd5GU42uhNQRTMXqArR3KmNGcB8=",
5107+ "dev": true,
5108+ "requires": {
5109+ "source-map": "^0.5.6"
5110+ },
5111+ "dependencies": {
5112+ "source-map": {
5113+ "version": "0.5.7",
5114+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
5115+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
5116+ "dev": true
5117+ }
5118+ }
5119+ },
5120+ "merge2": {
5121+ "version": "1.3.0",
5122+ "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz",
5123+ "integrity": "sha512-2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==",
5124+ "dev": true
5125+ },
5126+ "micromatch": {
5127+ "version": "3.1.10",
5128+ "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz",
5129+ "integrity": "sha512-MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==",
5130+ "dev": true,
5131+ "requires": {
5132+ "arr-diff": "^4.0.0",
5133+ "array-unique": "^0.3.2",
5134+ "braces": "^2.3.1",
5135+ "define-property": "^2.0.2",
5136+ "extend-shallow": "^3.0.2",
5137+ "extglob": "^2.0.4",
5138+ "fragment-cache": "^0.2.1",
5139+ "kind-of": "^6.0.2",
5140+ "nanomatch": "^1.2.9",
5141+ "object.pick": "^1.3.0",
5142+ "regex-not": "^1.0.0",
5143+ "snapdragon": "^0.8.1",
5144+ "to-regex": "^3.0.2"
5145+ }
5146+ },
5147+ "miller-rabin": {
5148+ "version": "4.0.1",
5149+ "resolved": "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz",
5150+ "integrity": "sha512-115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==",
5151+ "dev": true,
5152+ "requires": {
5153+ "bn.js": "^4.0.0",
5154+ "brorand": "^1.0.1"
5155+ }
5156+ },
5157+ "mime": {
5158+ "version": "1.6.0",
5159+ "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz",
5160+ "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==",
5161+ "dev": true
5162+ },
5163+ "mime-db": {
5164+ "version": "1.44.0",
5165+ "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz",
5166+ "integrity": "sha512-/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg=="
5167+ },
5168+ "mime-types": {
5169+ "version": "2.1.27",
5170+ "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz",
5171+ "integrity": "sha512-JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==",
5172+ "requires": {
5173+ "mime-db": "1.44.0"
5174+ }
5175+ },
5176+ "mimic-fn": {
5177+ "version": "1.2.0",
5178+ "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz",
5179+ "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==",
5180+ "dev": true
5181+ },
5182+ "minimalistic-assert": {
5183+ "version": "1.0.1",
5184+ "resolved": "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz",
5185+ "integrity": "sha512-UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==",
5186+ "dev": true
5187+ },
5188+ "minimalistic-crypto-utils": {
5189+ "version": "1.0.1",
5190+ "resolved": "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz",
5191+ "integrity": "sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=",
5192+ "dev": true
5193+ },
5194+ "minimatch": {
5195+ "version": "3.0.4",
5196+ "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
5197+ "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
5198+ "dev": true,
5199+ "requires": {
5200+ "brace-expansion": "^1.1.7"
5201+ }
5202+ },
5203+ "minimist": {
5204+ "version": "1.2.5",
5205+ "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz",
5206+ "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==",
5207+ "dev": true
5208+ },
5209+ "mixin-deep": {
5210+ "version": "1.3.2",
5211+ "resolved": "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz",
5212+ "integrity": "sha512-WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==",
5213+ "dev": true,
5214+ "requires": {
5215+ "for-in": "^1.0.2",
5216+ "is-extendable": "^1.0.1"
5217+ },
5218+ "dependencies": {
5219+ "is-extendable": {
5220+ "version": "1.0.1",
5221+ "resolved": "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz",
5222+ "integrity": "sha512-arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==",
5223+ "dev": true,
5224+ "requires": {
5225+ "is-plain-object": "^2.0.4"
5226+ }
5227+ }
5228+ }
5229+ },
5230+ "mkdirp": {
5231+ "version": "0.5.5",
5232+ "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz",
5233+ "integrity": "sha512-NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==",
5234+ "dev": true,
5235+ "requires": {
5236+ "minimist": "^1.2.5"
5237+ }
5238+ },
5239+ "ms": {
5240+ "version": "2.1.2",
5241+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz",
5242+ "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==",
5243+ "dev": true
5244+ },
5245+ "nan": {
5246+ "version": "2.14.1",
5247+ "resolved": "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz",
5248+ "integrity": "sha512-isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==",
5249+ "dev": true,
5250+ "optional": true
5251+ },
5252+ "nanomatch": {
5253+ "version": "1.2.13",
5254+ "resolved": "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz",
5255+ "integrity": "sha512-fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==",
5256+ "dev": true,
5257+ "requires": {
5258+ "arr-diff": "^4.0.0",
5259+ "array-unique": "^0.3.2",
5260+ "define-property": "^2.0.2",
5261+ "extend-shallow": "^3.0.2",
5262+ "fragment-cache": "^0.2.1",
5263+ "is-windows": "^1.0.2",
5264+ "kind-of": "^6.0.2",
5265+ "object.pick": "^1.3.0",
5266+ "regex-not": "^1.0.0",
5267+ "snapdragon": "^0.8.1",
5268+ "to-regex": "^3.0.1"
5269+ }
5270+ },
5271+ "nice-try": {
5272+ "version": "1.0.5",
5273+ "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
5274+ "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
5275+ "dev": true
5276+ },
5277+ "node-addon-api": {
5278+ "version": "1.7.1",
5279+ "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz",
5280+ "integrity": "sha512-2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ==",
5281+ "dev": true
5282+ },
5283+ "node-elm-compiler": {
5284+ "version": "5.0.4",
5285+ "resolved": "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz",
5286+ "integrity": "sha512-VQsT8QSierYGkHzRed+b4MnccQVF1+qPHunE8jBoU7jD6YpuRqCDPzEoC2zfyEJS80qVnlMZrqobLnyjzX9lJg==",
5287+ "dev": true,
5288+ "requires": {
5289+ "cross-spawn": "6.0.5",
5290+ "find-elm-dependencies": "2.0.2",
5291+ "lodash": "4.17.15",
5292+ "temp": "^0.9.0"
5293+ }
5294+ },
5295+ "node-forge": {
5296+ "version": "0.7.6",
5297+ "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz",
5298+ "integrity": "sha512-sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==",
5299+ "dev": true
5300+ },
5301+ "node-libs-browser": {
5302+ "version": "2.2.1",
5303+ "resolved": "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz",
5304+ "integrity": "sha512-h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==",
5305+ "dev": true,
5306+ "requires": {
5307+ "assert": "^1.1.1",
5308+ "browserify-zlib": "^0.2.0",
5309+ "buffer": "^4.3.0",
5310+ "console-browserify": "^1.1.0",
5311+ "constants-browserify": "^1.0.0",
5312+ "crypto-browserify": "^3.11.0",
5313+ "domain-browser": "^1.1.1",
5314+ "events": "^3.0.0",
5315+ "https-browserify": "^1.0.0",
5316+ "os-browserify": "^0.3.0",
5317+ "path-browserify": "0.0.1",
5318+ "process": "^0.11.10",
5319+ "punycode": "^1.2.4",
5320+ "querystring-es3": "^0.2.0",
5321+ "readable-stream": "^2.3.3",
5322+ "stream-browserify": "^2.0.1",
5323+ "stream-http": "^2.7.2",
5324+ "string_decoder": "^1.0.0",
5325+ "timers-browserify": "^2.0.4",
5326+ "tty-browserify": "0.0.0",
5327+ "url": "^0.11.0",
5328+ "util": "^0.11.0",
5329+ "vm-browserify": "^1.0.1"
5330+ },
5331+ "dependencies": {
5332+ "punycode": {
5333+ "version": "1.4.1",
5334+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz",
5335+ "integrity": "sha1-wNWmOycYgArY4esPpSachN1BhF4=",
5336+ "dev": true
5337+ }
5338+ }
5339+ },
5340+ "node-releases": {
5341+ "version": "1.1.53",
5342+ "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz",
5343+ "integrity": "sha512-wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==",
5344+ "dev": true
5345+ },
5346+ "nopt": {
5347+ "version": "4.0.3",
5348+ "resolved": "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz",
5349+ "integrity": "sha512-CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==",
5350+ "dev": true,
5351+ "requires": {
5352+ "abbrev": "1",
5353+ "osenv": "^0.1.4"
5354+ }
5355+ },
5356+ "normalize-html-whitespace": {
5357+ "version": "1.0.0",
5358+ "resolved": "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz",
5359+ "integrity": "sha512-9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==",
5360+ "dev": true
5361+ },
5362+ "normalize-path": {
5363+ "version": "3.0.0",
5364+ "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz",
5365+ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==",
5366+ "dev": true
5367+ },
5368+ "normalize-url": {
5369+ "version": "3.3.0",
5370+ "resolved": "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz",
5371+ "integrity": "sha512-U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==",
5372+ "dev": true
5373+ },
5374+ "nth-check": {
5375+ "version": "1.0.2",
5376+ "resolved": "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz",
5377+ "integrity": "sha512-WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==",
5378+ "dev": true,
5379+ "requires": {
5380+ "boolbase": "~1.0.0"
5381+ }
5382+ },
5383+ "nwsapi": {
5384+ "version": "2.2.0",
5385+ "resolved": "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz",
5386+ "integrity": "sha512-h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==",
5387+ "dev": true
5388+ },
5389+ "oauth-sign": {
5390+ "version": "0.9.0",
5391+ "resolved": "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz",
5392+ "integrity": "sha512-fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ=="
5393+ },
5394+ "object-assign": {
5395+ "version": "4.1.1",
5396+ "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz",
5397+ "integrity": "sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=",
5398+ "dev": true
5399+ },
5400+ "object-copy": {
5401+ "version": "0.1.0",
5402+ "resolved": "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz",
5403+ "integrity": "sha1-fn2Fi3gb18mRpBupde04EnVOmYw=",
5404+ "dev": true,
5405+ "requires": {
5406+ "copy-descriptor": "^0.1.0",
5407+ "define-property": "^0.2.5",
5408+ "kind-of": "^3.0.3"
5409+ },
5410+ "dependencies": {
5411+ "define-property": {
5412+ "version": "0.2.5",
5413+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
5414+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
5415+ "dev": true,
5416+ "requires": {
5417+ "is-descriptor": "^0.1.0"
5418+ }
5419+ },
5420+ "kind-of": {
5421+ "version": "3.2.2",
5422+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
5423+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
5424+ "dev": true,
5425+ "requires": {
5426+ "is-buffer": "^1.1.5"
5427+ }
5428+ }
5429+ }
5430+ },
5431+ "object-inspect": {
5432+ "version": "1.7.0",
5433+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz",
5434+ "integrity": "sha512-a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==",
5435+ "dev": true
5436+ },
5437+ "object-keys": {
5438+ "version": "1.1.1",
5439+ "resolved": "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz",
5440+ "integrity": "sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==",
5441+ "dev": true
5442+ },
5443+ "object-visit": {
5444+ "version": "1.0.1",
5445+ "resolved": "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz",
5446+ "integrity": "sha1-95xEk68MU3e1n+OdOV5BBC3QRbs=",
5447+ "dev": true,
5448+ "requires": {
5449+ "isobject": "^3.0.0"
5450+ }
5451+ },
5452+ "object.assign": {
5453+ "version": "4.1.0",
5454+ "resolved": "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz",
5455+ "integrity": "sha512-exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==",
5456+ "dev": true,
5457+ "requires": {
5458+ "define-properties": "^1.1.2",
5459+ "function-bind": "^1.1.1",
5460+ "has-symbols": "^1.0.0",
5461+ "object-keys": "^1.0.11"
5462+ }
5463+ },
5464+ "object.getownpropertydescriptors": {
5465+ "version": "2.1.0",
5466+ "resolved": "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz",
5467+ "integrity": "sha512-Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==",
5468+ "dev": true,
5469+ "requires": {
5470+ "define-properties": "^1.1.3",
5471+ "es-abstract": "^1.17.0-next.1"
5472+ }
5473+ },
5474+ "object.pick": {
5475+ "version": "1.3.0",
5476+ "resolved": "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz",
5477+ "integrity": "sha1-h6EKxMFpS9Lhy/U1kaZhQftd10c=",
5478+ "dev": true,
5479+ "requires": {
5480+ "isobject": "^3.0.1"
5481+ }
5482+ },
5483+ "object.values": {
5484+ "version": "1.1.1",
5485+ "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz",
5486+ "integrity": "sha512-WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==",
5487+ "dev": true,
5488+ "requires": {
5489+ "define-properties": "^1.1.3",
5490+ "es-abstract": "^1.17.0-next.1",
5491+ "function-bind": "^1.1.1",
5492+ "has": "^1.0.3"
5493+ }
5494+ },
5495+ "on-finished": {
5496+ "version": "2.3.0",
5497+ "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz",
5498+ "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=",
5499+ "dev": true,
5500+ "requires": {
5501+ "ee-first": "1.1.1"
5502+ }
5503+ },
5504+ "once": {
5505+ "version": "1.4.0",
5506+ "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
5507+ "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
5508+ "dev": true,
5509+ "requires": {
5510+ "wrappy": "1"
5511+ }
5512+ },
5513+ "onetime": {
5514+ "version": "2.0.1",
5515+ "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz",
5516+ "integrity": "sha1-BnQoIw/WdEOyeUsiu6UotoZ5YtQ=",
5517+ "dev": true,
5518+ "requires": {
5519+ "mimic-fn": "^1.0.0"
5520+ }
5521+ },
5522+ "opn": {
5523+ "version": "5.5.0",
5524+ "resolved": "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz",
5525+ "integrity": "sha512-PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==",
5526+ "dev": true,
5527+ "requires": {
5528+ "is-wsl": "^1.1.0"
5529+ }
5530+ },
5531+ "optionator": {
5532+ "version": "0.8.3",
5533+ "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz",
5534+ "integrity": "sha512-+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==",
5535+ "dev": true,
5536+ "requires": {
5537+ "deep-is": "~0.1.3",
5538+ "fast-levenshtein": "~2.0.6",
5539+ "levn": "~0.3.0",
5540+ "prelude-ls": "~1.1.2",
5541+ "type-check": "~0.3.2",
5542+ "word-wrap": "~1.2.3"
5543+ }
5544+ },
5545+ "ora": {
5546+ "version": "2.1.0",
5547+ "resolved": "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz",
5548+ "integrity": "sha512-hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==",
5549+ "dev": true,
5550+ "requires": {
5551+ "chalk": "^2.3.1",
5552+ "cli-cursor": "^2.1.0",
5553+ "cli-spinners": "^1.1.0",
5554+ "log-symbols": "^2.2.0",
5555+ "strip-ansi": "^4.0.0",
5556+ "wcwidth": "^1.0.1"
5557+ }
5558+ },
5559+ "os-browserify": {
5560+ "version": "0.3.0",
5561+ "resolved": "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz",
5562+ "integrity": "sha1-hUNzx/XCMVkU/Jv8a9gjj92h7Cc=",
5563+ "dev": true
5564+ },
5565+ "os-homedir": {
5566+ "version": "1.0.2",
5567+ "resolved": "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz",
5568+ "integrity": "sha1-/7xJiDNuDoM94MFox+8VISGqf7M=",
5569+ "dev": true
5570+ },
5571+ "os-tmpdir": {
5572+ "version": "1.0.2",
5573+ "resolved": "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz",
5574+ "integrity": "sha1-u+Z0BseaqFxc/sdm/lc0VV36EnQ=",
5575+ "dev": true
5576+ },
5577+ "osenv": {
5578+ "version": "0.1.5",
5579+ "resolved": "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz",
5580+ "integrity": "sha512-0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==",
5581+ "dev": true,
5582+ "requires": {
5583+ "os-homedir": "^1.0.0",
5584+ "os-tmpdir": "^1.0.0"
5585+ }
5586+ },
5587+ "p-limit": {
5588+ "version": "1.3.0",
5589+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz",
5590+ "integrity": "sha512-vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==",
5591+ "dev": true,
5592+ "requires": {
5593+ "p-try": "^1.0.0"
5594+ }
5595+ },
5596+ "p-locate": {
5597+ "version": "2.0.0",
5598+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz",
5599+ "integrity": "sha1-IKAQOyIqcMj9OcwuWAaA893l7EM=",
5600+ "dev": true,
5601+ "requires": {
5602+ "p-limit": "^1.1.0"
5603+ }
5604+ },
5605+ "p-try": {
5606+ "version": "1.0.0",
5607+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz",
5608+ "integrity": "sha1-y8ec26+P1CKOE/Yh8rGiN8GyB7M=",
5609+ "dev": true
5610+ },
5611+ "pako": {
5612+ "version": "0.2.9",
5613+ "resolved": "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz",
5614+ "integrity": "sha1-8/dSL073gjSNqBYbrZ7P1Rv4OnU=",
5615+ "dev": true
5616+ },
5617+ "parcel-bundler": {
5618+ "version": "1.12.3",
5619+ "resolved": "https://registry.npmjs.org/parcel-bundler/-/parcel-bundler-1.12.3.tgz",
5620+ "integrity": "sha512-8bq6lj0hhQeGxD9f9xEkFMXQ3d8TIlf2+isKxoi9bciB0KVEILRGllaPkUgp++5t0anToBh9+tG6ZyInXOC1/A==",
5621+ "dev": true,
5622+ "requires": {
5623+ "@babel/code-frame": "^7.0.0 <7.4.0",
5624+ "@babel/core": "^7.0.0 <7.4.0",
5625+ "@babel/generator": "^7.0.0 <7.4.0",
5626+ "@babel/parser": "^7.0.0 <7.4.0",
5627+ "@babel/plugin-transform-flow-strip-types": "^7.0.0 <7.4.0",
5628+ "@babel/plugin-transform-modules-commonjs": "^7.0.0 <7.4.0",
5629+ "@babel/plugin-transform-react-jsx": "^7.0.0 <7.4.0",
5630+ "@babel/preset-env": "^7.0.0 <7.4.0",
5631+ "@babel/runtime": "^7.0.0 <7.4.0",
5632+ "@babel/template": "^7.0.0 <7.4.0",
5633+ "@babel/traverse": "^7.0.0 <7.4.0",
5634+ "@babel/types": "^7.0.0 <7.4.0",
5635+ "@iarna/toml": "^2.2.0",
5636+ "@parcel/fs": "^1.11.0",
5637+ "@parcel/logger": "^1.11.0",
5638+ "@parcel/utils": "^1.11.0",
5639+ "@parcel/watcher": "^1.12.0",
5640+ "@parcel/workers": "^1.11.0",
5641+ "ansi-to-html": "^0.6.4",
5642+ "babylon-walk": "^1.0.2",
5643+ "browserslist": "^4.1.0",
5644+ "chalk": "^2.1.0",
5645+ "clone": "^2.1.1",
5646+ "command-exists": "^1.2.6",
5647+ "commander": "^2.11.0",
5648+ "cross-spawn": "^6.0.4",
5649+ "css-modules-loader-core": "^1.1.0",
5650+ "cssnano": "^4.0.0",
5651+ "deasync": "^0.1.14",
5652+ "dotenv": "^5.0.0",
5653+ "dotenv-expand": "^4.2.0",
5654+ "fast-glob": "^2.2.2",
5655+ "filesize": "^3.6.0",
5656+ "get-port": "^3.2.0",
5657+ "htmlnano": "^0.2.2",
5658+ "is-glob": "^4.0.0",
5659+ "is-url": "^1.2.2",
5660+ "js-yaml": "^3.10.0",
5661+ "json5": "^1.0.1",
5662+ "micromatch": "^3.0.4",
5663+ "mkdirp": "^0.5.1",
5664+ "node-forge": "^0.7.1",
5665+ "node-libs-browser": "^2.0.0",
5666+ "opn": "^5.1.0",
5667+ "postcss": "^7.0.11",
5668+ "postcss-value-parser": "^3.3.1",
5669+ "posthtml": "^0.11.2",
5670+ "posthtml-parser": "^0.4.0",
5671+ "posthtml-render": "^1.1.3",
5672+ "resolve": "^1.4.0",
5673+ "semver": "^5.4.1",
5674+ "serialize-to-js": "^1.1.1",
5675+ "serve-static": "^1.12.4",
5676+ "source-map": "0.6.1",
5677+ "terser": "^3.7.3",
5678+ "v8-compile-cache": "^2.0.0",
5679+ "ws": "^5.1.1"
5680+ },
5681+ "dependencies": {
5682+ "postcss-value-parser": {
5683+ "version": "3.3.1",
5684+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
5685+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
5686+ "dev": true
5687+ }
5688+ }
5689+ },
5690+ "parse-asn1": {
5691+ "version": "5.1.5",
5692+ "resolved": "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz",
5693+ "integrity": "sha512-jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==",
5694+ "dev": true,
5695+ "requires": {
5696+ "asn1.js": "^4.0.0",
5697+ "browserify-aes": "^1.0.0",
5698+ "create-hash": "^1.1.0",
5699+ "evp_bytestokey": "^1.0.0",
5700+ "pbkdf2": "^3.0.3",
5701+ "safe-buffer": "^5.1.1"
5702+ }
5703+ },
5704+ "parse-json": {
5705+ "version": "4.0.0",
5706+ "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz",
5707+ "integrity": "sha1-vjX1Qlvh9/bHRxhPmKeIy5lHfuA=",
5708+ "dev": true,
5709+ "requires": {
5710+ "error-ex": "^1.3.1",
5711+ "json-parse-better-errors": "^1.0.1"
5712+ }
5713+ },
5714+ "parse5": {
5715+ "version": "5.1.0",
5716+ "resolved": "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz",
5717+ "integrity": "sha512-fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==",
5718+ "dev": true
5719+ },
5720+ "parseurl": {
5721+ "version": "1.3.3",
5722+ "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz",
5723+ "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==",
5724+ "dev": true
5725+ },
5726+ "pascalcase": {
5727+ "version": "0.1.1",
5728+ "resolved": "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz",
5729+ "integrity": "sha1-s2PlXoAGym/iF4TS2yK9FdeRfxQ=",
5730+ "dev": true
5731+ },
5732+ "path-browserify": {
5733+ "version": "0.0.1",
5734+ "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz",
5735+ "integrity": "sha512-BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==",
5736+ "dev": true
5737+ },
5738+ "path-dirname": {
5739+ "version": "1.0.2",
5740+ "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz",
5741+ "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=",
5742+ "dev": true
5743+ },
5744+ "path-exists": {
5745+ "version": "3.0.0",
5746+ "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz",
5747+ "integrity": "sha1-zg6+ql94yxiSXqfYENe1mwEP1RU=",
5748+ "dev": true
5749+ },
5750+ "path-is-absolute": {
5751+ "version": "1.0.1",
5752+ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
5753+ "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
5754+ "dev": true
5755+ },
5756+ "path-key": {
5757+ "version": "2.0.1",
5758+ "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
5759+ "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
5760+ "dev": true
5761+ },
5762+ "path-parse": {
5763+ "version": "1.0.6",
5764+ "resolved": "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz",
5765+ "integrity": "sha512-GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==",
5766+ "dev": true
5767+ },
5768+ "pbkdf2": {
5769+ "version": "3.0.17",
5770+ "resolved": "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz",
5771+ "integrity": "sha512-U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==",
5772+ "dev": true,
5773+ "requires": {
5774+ "create-hash": "^1.1.2",
5775+ "create-hmac": "^1.1.4",
5776+ "ripemd160": "^2.0.1",
5777+ "safe-buffer": "^5.0.1",
5778+ "sha.js": "^2.4.8"
5779+ }
5780+ },
5781+ "performance-now": {
5782+ "version": "2.1.0",
5783+ "resolved": "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz",
5784+ "integrity": "sha1-Ywn04OX6kT7BxpMHrjZLSzd8nns="
5785+ },
5786+ "physical-cpu-count": {
5787+ "version": "2.0.0",
5788+ "resolved": "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz",
5789+ "integrity": "sha1-GN4vl+S/epVRrXURlCtUlverpmA=",
5790+ "dev": true
5791+ },
5792+ "pkg-up": {
5793+ "version": "2.0.0",
5794+ "resolved": "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz",
5795+ "integrity": "sha1-yBmscoBZpGHKscOImivjxJoATX8=",
5796+ "dev": true,
5797+ "requires": {
5798+ "find-up": "^2.1.0"
5799+ }
5800+ },
5801+ "pn": {
5802+ "version": "1.1.0",
5803+ "resolved": "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz",
5804+ "integrity": "sha512-2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==",
5805+ "dev": true
5806+ },
5807+ "posix-character-classes": {
5808+ "version": "0.1.1",
5809+ "resolved": "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz",
5810+ "integrity": "sha1-AerA/jta9xoqbAL+q7jB/vfgDqs=",
5811+ "dev": true
5812+ },
5813+ "postcss": {
5814+ "version": "7.0.27",
5815+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz",
5816+ "integrity": "sha512-WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==",
5817+ "dev": true,
5818+ "requires": {
5819+ "chalk": "^2.4.2",
5820+ "source-map": "^0.6.1",
5821+ "supports-color": "^6.1.0"
5822+ }
5823+ },
5824+ "postcss-calc": {
5825+ "version": "7.0.2",
5826+ "resolved": "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz",
5827+ "integrity": "sha512-rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==",
5828+ "dev": true,
5829+ "requires": {
5830+ "postcss": "^7.0.27",
5831+ "postcss-selector-parser": "^6.0.2",
5832+ "postcss-value-parser": "^4.0.2"
5833+ }
5834+ },
5835+ "postcss-colormin": {
5836+ "version": "4.0.3",
5837+ "resolved": "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz",
5838+ "integrity": "sha512-WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==",
5839+ "dev": true,
5840+ "requires": {
5841+ "browserslist": "^4.0.0",
5842+ "color": "^3.0.0",
5843+ "has": "^1.0.0",
5844+ "postcss": "^7.0.0",
5845+ "postcss-value-parser": "^3.0.0"
5846+ },
5847+ "dependencies": {
5848+ "postcss-value-parser": {
5849+ "version": "3.3.1",
5850+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
5851+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
5852+ "dev": true
5853+ }
5854+ }
5855+ },
5856+ "postcss-convert-values": {
5857+ "version": "4.0.1",
5858+ "resolved": "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz",
5859+ "integrity": "sha512-Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==",
5860+ "dev": true,
5861+ "requires": {
5862+ "postcss": "^7.0.0",
5863+ "postcss-value-parser": "^3.0.0"
5864+ },
5865+ "dependencies": {
5866+ "postcss-value-parser": {
5867+ "version": "3.3.1",
5868+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
5869+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
5870+ "dev": true
5871+ }
5872+ }
5873+ },
5874+ "postcss-discard-comments": {
5875+ "version": "4.0.2",
5876+ "resolved": "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz",
5877+ "integrity": "sha512-RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==",
5878+ "dev": true,
5879+ "requires": {
5880+ "postcss": "^7.0.0"
5881+ }
5882+ },
5883+ "postcss-discard-duplicates": {
5884+ "version": "4.0.2",
5885+ "resolved": "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz",
5886+ "integrity": "sha512-ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==",
5887+ "dev": true,
5888+ "requires": {
5889+ "postcss": "^7.0.0"
5890+ }
5891+ },
5892+ "postcss-discard-empty": {
5893+ "version": "4.0.1",
5894+ "resolved": "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz",
5895+ "integrity": "sha512-B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==",
5896+ "dev": true,
5897+ "requires": {
5898+ "postcss": "^7.0.0"
5899+ }
5900+ },
5901+ "postcss-discard-overridden": {
5902+ "version": "4.0.1",
5903+ "resolved": "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz",
5904+ "integrity": "sha512-IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==",
5905+ "dev": true,
5906+ "requires": {
5907+ "postcss": "^7.0.0"
5908+ }
5909+ },
5910+ "postcss-merge-longhand": {
5911+ "version": "4.0.11",
5912+ "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz",
5913+ "integrity": "sha512-alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==",
5914+ "dev": true,
5915+ "requires": {
5916+ "css-color-names": "0.0.4",
5917+ "postcss": "^7.0.0",
5918+ "postcss-value-parser": "^3.0.0",
5919+ "stylehacks": "^4.0.0"
5920+ },
5921+ "dependencies": {
5922+ "postcss-value-parser": {
5923+ "version": "3.3.1",
5924+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
5925+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
5926+ "dev": true
5927+ }
5928+ }
5929+ },
5930+ "postcss-merge-rules": {
5931+ "version": "4.0.3",
5932+ "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz",
5933+ "integrity": "sha512-U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==",
5934+ "dev": true,
5935+ "requires": {
5936+ "browserslist": "^4.0.0",
5937+ "caniuse-api": "^3.0.0",
5938+ "cssnano-util-same-parent": "^4.0.0",
5939+ "postcss": "^7.0.0",
5940+ "postcss-selector-parser": "^3.0.0",
5941+ "vendors": "^1.0.0"
5942+ },
5943+ "dependencies": {
5944+ "postcss-selector-parser": {
5945+ "version": "3.1.2",
5946+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
5947+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
5948+ "dev": true,
5949+ "requires": {
5950+ "dot-prop": "^5.2.0",
5951+ "indexes-of": "^1.0.1",
5952+ "uniq": "^1.0.1"
5953+ }
5954+ }
5955+ }
5956+ },
5957+ "postcss-minify-font-values": {
5958+ "version": "4.0.2",
5959+ "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz",
5960+ "integrity": "sha512-j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==",
5961+ "dev": true,
5962+ "requires": {
5963+ "postcss": "^7.0.0",
5964+ "postcss-value-parser": "^3.0.0"
5965+ },
5966+ "dependencies": {
5967+ "postcss-value-parser": {
5968+ "version": "3.3.1",
5969+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
5970+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
5971+ "dev": true
5972+ }
5973+ }
5974+ },
5975+ "postcss-minify-gradients": {
5976+ "version": "4.0.2",
5977+ "resolved": "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz",
5978+ "integrity": "sha512-qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==",
5979+ "dev": true,
5980+ "requires": {
5981+ "cssnano-util-get-arguments": "^4.0.0",
5982+ "is-color-stop": "^1.0.0",
5983+ "postcss": "^7.0.0",
5984+ "postcss-value-parser": "^3.0.0"
5985+ },
5986+ "dependencies": {
5987+ "postcss-value-parser": {
5988+ "version": "3.3.1",
5989+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
5990+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
5991+ "dev": true
5992+ }
5993+ }
5994+ },
5995+ "postcss-minify-params": {
5996+ "version": "4.0.2",
5997+ "resolved": "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz",
5998+ "integrity": "sha512-G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==",
5999+ "dev": true,
6000+ "requires": {
6001+ "alphanum-sort": "^1.0.0",
6002+ "browserslist": "^4.0.0",
6003+ "cssnano-util-get-arguments": "^4.0.0",
6004+ "postcss": "^7.0.0",
6005+ "postcss-value-parser": "^3.0.0",
6006+ "uniqs": "^2.0.0"
6007+ },
6008+ "dependencies": {
6009+ "postcss-value-parser": {
6010+ "version": "3.3.1",
6011+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6012+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6013+ "dev": true
6014+ }
6015+ }
6016+ },
6017+ "postcss-minify-selectors": {
6018+ "version": "4.0.2",
6019+ "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz",
6020+ "integrity": "sha512-D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==",
6021+ "dev": true,
6022+ "requires": {
6023+ "alphanum-sort": "^1.0.0",
6024+ "has": "^1.0.0",
6025+ "postcss": "^7.0.0",
6026+ "postcss-selector-parser": "^3.0.0"
6027+ },
6028+ "dependencies": {
6029+ "postcss-selector-parser": {
6030+ "version": "3.1.2",
6031+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
6032+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
6033+ "dev": true,
6034+ "requires": {
6035+ "dot-prop": "^5.2.0",
6036+ "indexes-of": "^1.0.1",
6037+ "uniq": "^1.0.1"
6038+ }
6039+ }
6040+ }
6041+ },
6042+ "postcss-modules-extract-imports": {
6043+ "version": "1.1.0",
6044+ "resolved": "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz",
6045+ "integrity": "sha1-thTJcgvmgW6u41+zpfqh26agXds=",
6046+ "dev": true,
6047+ "requires": {
6048+ "postcss": "^6.0.1"
6049+ },
6050+ "dependencies": {
6051+ "postcss": {
6052+ "version": "6.0.23",
6053+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
6054+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
6055+ "dev": true,
6056+ "requires": {
6057+ "chalk": "^2.4.1",
6058+ "source-map": "^0.6.1",
6059+ "supports-color": "^5.4.0"
6060+ }
6061+ },
6062+ "supports-color": {
6063+ "version": "5.5.0",
6064+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
6065+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
6066+ "dev": true,
6067+ "requires": {
6068+ "has-flag": "^3.0.0"
6069+ }
6070+ }
6071+ }
6072+ },
6073+ "postcss-modules-local-by-default": {
6074+ "version": "1.2.0",
6075+ "resolved": "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz",
6076+ "integrity": "sha1-99gMOYxaOT+nlkRmvRlQCn1hwGk=",
6077+ "dev": true,
6078+ "requires": {
6079+ "css-selector-tokenizer": "^0.7.0",
6080+ "postcss": "^6.0.1"
6081+ },
6082+ "dependencies": {
6083+ "postcss": {
6084+ "version": "6.0.23",
6085+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
6086+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
6087+ "dev": true,
6088+ "requires": {
6089+ "chalk": "^2.4.1",
6090+ "source-map": "^0.6.1",
6091+ "supports-color": "^5.4.0"
6092+ }
6093+ },
6094+ "supports-color": {
6095+ "version": "5.5.0",
6096+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
6097+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
6098+ "dev": true,
6099+ "requires": {
6100+ "has-flag": "^3.0.0"
6101+ }
6102+ }
6103+ }
6104+ },
6105+ "postcss-modules-scope": {
6106+ "version": "1.1.0",
6107+ "resolved": "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz",
6108+ "integrity": "sha1-1upkmUx5+XtipytCb75gVqGUu5A=",
6109+ "dev": true,
6110+ "requires": {
6111+ "css-selector-tokenizer": "^0.7.0",
6112+ "postcss": "^6.0.1"
6113+ },
6114+ "dependencies": {
6115+ "postcss": {
6116+ "version": "6.0.23",
6117+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
6118+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
6119+ "dev": true,
6120+ "requires": {
6121+ "chalk": "^2.4.1",
6122+ "source-map": "^0.6.1",
6123+ "supports-color": "^5.4.0"
6124+ }
6125+ },
6126+ "supports-color": {
6127+ "version": "5.5.0",
6128+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
6129+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
6130+ "dev": true,
6131+ "requires": {
6132+ "has-flag": "^3.0.0"
6133+ }
6134+ }
6135+ }
6136+ },
6137+ "postcss-modules-values": {
6138+ "version": "1.3.0",
6139+ "resolved": "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz",
6140+ "integrity": "sha1-7P+p1+GSUYOJ9CrQ6D9yrsRW6iA=",
6141+ "dev": true,
6142+ "requires": {
6143+ "icss-replace-symbols": "^1.1.0",
6144+ "postcss": "^6.0.1"
6145+ },
6146+ "dependencies": {
6147+ "postcss": {
6148+ "version": "6.0.23",
6149+ "resolved": "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz",
6150+ "integrity": "sha512-soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==",
6151+ "dev": true,
6152+ "requires": {
6153+ "chalk": "^2.4.1",
6154+ "source-map": "^0.6.1",
6155+ "supports-color": "^5.4.0"
6156+ }
6157+ },
6158+ "supports-color": {
6159+ "version": "5.5.0",
6160+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz",
6161+ "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==",
6162+ "dev": true,
6163+ "requires": {
6164+ "has-flag": "^3.0.0"
6165+ }
6166+ }
6167+ }
6168+ },
6169+ "postcss-normalize-charset": {
6170+ "version": "4.0.1",
6171+ "resolved": "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz",
6172+ "integrity": "sha512-gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==",
6173+ "dev": true,
6174+ "requires": {
6175+ "postcss": "^7.0.0"
6176+ }
6177+ },
6178+ "postcss-normalize-display-values": {
6179+ "version": "4.0.2",
6180+ "resolved": "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz",
6181+ "integrity": "sha512-3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==",
6182+ "dev": true,
6183+ "requires": {
6184+ "cssnano-util-get-match": "^4.0.0",
6185+ "postcss": "^7.0.0",
6186+ "postcss-value-parser": "^3.0.0"
6187+ },
6188+ "dependencies": {
6189+ "postcss-value-parser": {
6190+ "version": "3.3.1",
6191+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6192+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6193+ "dev": true
6194+ }
6195+ }
6196+ },
6197+ "postcss-normalize-positions": {
6198+ "version": "4.0.2",
6199+ "resolved": "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz",
6200+ "integrity": "sha512-Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==",
6201+ "dev": true,
6202+ "requires": {
6203+ "cssnano-util-get-arguments": "^4.0.0",
6204+ "has": "^1.0.0",
6205+ "postcss": "^7.0.0",
6206+ "postcss-value-parser": "^3.0.0"
6207+ },
6208+ "dependencies": {
6209+ "postcss-value-parser": {
6210+ "version": "3.3.1",
6211+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6212+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6213+ "dev": true
6214+ }
6215+ }
6216+ },
6217+ "postcss-normalize-repeat-style": {
6218+ "version": "4.0.2",
6219+ "resolved": "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz",
6220+ "integrity": "sha512-qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==",
6221+ "dev": true,
6222+ "requires": {
6223+ "cssnano-util-get-arguments": "^4.0.0",
6224+ "cssnano-util-get-match": "^4.0.0",
6225+ "postcss": "^7.0.0",
6226+ "postcss-value-parser": "^3.0.0"
6227+ },
6228+ "dependencies": {
6229+ "postcss-value-parser": {
6230+ "version": "3.3.1",
6231+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6232+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6233+ "dev": true
6234+ }
6235+ }
6236+ },
6237+ "postcss-normalize-string": {
6238+ "version": "4.0.2",
6239+ "resolved": "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz",
6240+ "integrity": "sha512-RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==",
6241+ "dev": true,
6242+ "requires": {
6243+ "has": "^1.0.0",
6244+ "postcss": "^7.0.0",
6245+ "postcss-value-parser": "^3.0.0"
6246+ },
6247+ "dependencies": {
6248+ "postcss-value-parser": {
6249+ "version": "3.3.1",
6250+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6251+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6252+ "dev": true
6253+ }
6254+ }
6255+ },
6256+ "postcss-normalize-timing-functions": {
6257+ "version": "4.0.2",
6258+ "resolved": "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz",
6259+ "integrity": "sha512-acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==",
6260+ "dev": true,
6261+ "requires": {
6262+ "cssnano-util-get-match": "^4.0.0",
6263+ "postcss": "^7.0.0",
6264+ "postcss-value-parser": "^3.0.0"
6265+ },
6266+ "dependencies": {
6267+ "postcss-value-parser": {
6268+ "version": "3.3.1",
6269+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6270+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6271+ "dev": true
6272+ }
6273+ }
6274+ },
6275+ "postcss-normalize-unicode": {
6276+ "version": "4.0.1",
6277+ "resolved": "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz",
6278+ "integrity": "sha512-od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==",
6279+ "dev": true,
6280+ "requires": {
6281+ "browserslist": "^4.0.0",
6282+ "postcss": "^7.0.0",
6283+ "postcss-value-parser": "^3.0.0"
6284+ },
6285+ "dependencies": {
6286+ "postcss-value-parser": {
6287+ "version": "3.3.1",
6288+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6289+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6290+ "dev": true
6291+ }
6292+ }
6293+ },
6294+ "postcss-normalize-url": {
6295+ "version": "4.0.1",
6296+ "resolved": "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz",
6297+ "integrity": "sha512-p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==",
6298+ "dev": true,
6299+ "requires": {
6300+ "is-absolute-url": "^2.0.0",
6301+ "normalize-url": "^3.0.0",
6302+ "postcss": "^7.0.0",
6303+ "postcss-value-parser": "^3.0.0"
6304+ },
6305+ "dependencies": {
6306+ "postcss-value-parser": {
6307+ "version": "3.3.1",
6308+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6309+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6310+ "dev": true
6311+ }
6312+ }
6313+ },
6314+ "postcss-normalize-whitespace": {
6315+ "version": "4.0.2",
6316+ "resolved": "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz",
6317+ "integrity": "sha512-tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==",
6318+ "dev": true,
6319+ "requires": {
6320+ "postcss": "^7.0.0",
6321+ "postcss-value-parser": "^3.0.0"
6322+ },
6323+ "dependencies": {
6324+ "postcss-value-parser": {
6325+ "version": "3.3.1",
6326+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6327+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6328+ "dev": true
6329+ }
6330+ }
6331+ },
6332+ "postcss-ordered-values": {
6333+ "version": "4.1.2",
6334+ "resolved": "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz",
6335+ "integrity": "sha512-2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==",
6336+ "dev": true,
6337+ "requires": {
6338+ "cssnano-util-get-arguments": "^4.0.0",
6339+ "postcss": "^7.0.0",
6340+ "postcss-value-parser": "^3.0.0"
6341+ },
6342+ "dependencies": {
6343+ "postcss-value-parser": {
6344+ "version": "3.3.1",
6345+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6346+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6347+ "dev": true
6348+ }
6349+ }
6350+ },
6351+ "postcss-reduce-initial": {
6352+ "version": "4.0.3",
6353+ "resolved": "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz",
6354+ "integrity": "sha512-gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==",
6355+ "dev": true,
6356+ "requires": {
6357+ "browserslist": "^4.0.0",
6358+ "caniuse-api": "^3.0.0",
6359+ "has": "^1.0.0",
6360+ "postcss": "^7.0.0"
6361+ }
6362+ },
6363+ "postcss-reduce-transforms": {
6364+ "version": "4.0.2",
6365+ "resolved": "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz",
6366+ "integrity": "sha512-EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==",
6367+ "dev": true,
6368+ "requires": {
6369+ "cssnano-util-get-match": "^4.0.0",
6370+ "has": "^1.0.0",
6371+ "postcss": "^7.0.0",
6372+ "postcss-value-parser": "^3.0.0"
6373+ },
6374+ "dependencies": {
6375+ "postcss-value-parser": {
6376+ "version": "3.3.1",
6377+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6378+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6379+ "dev": true
6380+ }
6381+ }
6382+ },
6383+ "postcss-selector-parser": {
6384+ "version": "6.0.2",
6385+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz",
6386+ "integrity": "sha512-36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==",
6387+ "dev": true,
6388+ "requires": {
6389+ "cssesc": "^3.0.0",
6390+ "indexes-of": "^1.0.1",
6391+ "uniq": "^1.0.1"
6392+ }
6393+ },
6394+ "postcss-svgo": {
6395+ "version": "4.0.2",
6396+ "resolved": "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz",
6397+ "integrity": "sha512-C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==",
6398+ "dev": true,
6399+ "requires": {
6400+ "is-svg": "^3.0.0",
6401+ "postcss": "^7.0.0",
6402+ "postcss-value-parser": "^3.0.0",
6403+ "svgo": "^1.0.0"
6404+ },
6405+ "dependencies": {
6406+ "postcss-value-parser": {
6407+ "version": "3.3.1",
6408+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz",
6409+ "integrity": "sha512-pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==",
6410+ "dev": true
6411+ }
6412+ }
6413+ },
6414+ "postcss-unique-selectors": {
6415+ "version": "4.0.1",
6416+ "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz",
6417+ "integrity": "sha512-+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==",
6418+ "dev": true,
6419+ "requires": {
6420+ "alphanum-sort": "^1.0.0",
6421+ "postcss": "^7.0.0",
6422+ "uniqs": "^2.0.0"
6423+ }
6424+ },
6425+ "postcss-value-parser": {
6426+ "version": "4.0.3",
6427+ "resolved": "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz",
6428+ "integrity": "sha512-N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==",
6429+ "dev": true
6430+ },
6431+ "posthtml": {
6432+ "version": "0.11.6",
6433+ "resolved": "https://registry.npmjs.org/posthtml/-/posthtml-0.11.6.tgz",
6434+ "integrity": "sha512-C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw==",
6435+ "dev": true,
6436+ "requires": {
6437+ "posthtml-parser": "^0.4.1",
6438+ "posthtml-render": "^1.1.5"
6439+ }
6440+ },
6441+ "posthtml-parser": {
6442+ "version": "0.4.2",
6443+ "resolved": "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.4.2.tgz",
6444+ "integrity": "sha512-BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==",
6445+ "dev": true,
6446+ "requires": {
6447+ "htmlparser2": "^3.9.2"
6448+ }
6449+ },
6450+ "posthtml-render": {
6451+ "version": "1.2.2",
6452+ "resolved": "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.2.2.tgz",
6453+ "integrity": "sha512-MbIXTWwAfJ9qET6Zl29UNwJcDJEEz9Zkr5oDhiujitJa7YBJwEpbkX2cmuklCDxubTMoRWpid3q8DrSyGnUUzQ==",
6454+ "dev": true
6455+ },
6456+ "prelude-ls": {
6457+ "version": "1.1.2",
6458+ "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz",
6459+ "integrity": "sha1-IZMqVJ9eUv/ZqCf1cOBL5iqX2lQ=",
6460+ "dev": true
6461+ },
6462+ "private": {
6463+ "version": "0.1.8",
6464+ "resolved": "https://registry.npmjs.org/private/-/private-0.1.8.tgz",
6465+ "integrity": "sha512-VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==",
6466+ "dev": true
6467+ },
6468+ "process": {
6469+ "version": "0.11.10",
6470+ "resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
6471+ "integrity": "sha1-czIwDoQBYb2j5podHZGn1LwW8YI=",
6472+ "dev": true
6473+ },
6474+ "process-nextick-args": {
6475+ "version": "2.0.1",
6476+ "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
6477+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
6478+ "dev": true
6479+ },
6480+ "proto-list": {
6481+ "version": "1.2.4",
6482+ "resolved": "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz",
6483+ "integrity": "sha1-IS1b/hMYMGpCD2QCuOJv85ZHqEk=",
6484+ "dev": true
6485+ },
6486+ "pseudomap": {
6487+ "version": "1.0.2",
6488+ "resolved": "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz",
6489+ "integrity": "sha1-8FKijacOYYkX7wqKw0wa5aaChrM=",
6490+ "dev": true
6491+ },
6492+ "psl": {
6493+ "version": "1.8.0",
6494+ "resolved": "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz",
6495+ "integrity": "sha512-RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ=="
6496+ },
6497+ "public-encrypt": {
6498+ "version": "4.0.3",
6499+ "resolved": "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz",
6500+ "integrity": "sha512-zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==",
6501+ "dev": true,
6502+ "requires": {
6503+ "bn.js": "^4.1.0",
6504+ "browserify-rsa": "^4.0.0",
6505+ "create-hash": "^1.1.0",
6506+ "parse-asn1": "^5.0.0",
6507+ "randombytes": "^2.0.1",
6508+ "safe-buffer": "^5.1.2"
6509+ }
6510+ },
6511+ "punycode": {
6512+ "version": "2.1.1",
6513+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz",
6514+ "integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A=="
6515+ },
6516+ "purgecss": {
6517+ "version": "1.4.2",
6518+ "resolved": "https://registry.npmjs.org/purgecss/-/purgecss-1.4.2.tgz",
6519+ "integrity": "sha512-hkOreFTgiyMHMmC2BxzdIw5DuC6kxAbP/gGOGd3MEsF3+5m69rIvUEPaxrnoUtfODTFKe9hcXjGwC6jcjoyhOw==",
6520+ "dev": true,
6521+ "requires": {
6522+ "glob": "^7.1.3",
6523+ "postcss": "^7.0.14",
6524+ "postcss-selector-parser": "^6.0.0",
6525+ "yargs": "^14.0.0"
6526+ }
6527+ },
6528+ "q": {
6529+ "version": "1.5.1",
6530+ "resolved": "https://registry.npmjs.org/q/-/q-1.5.1.tgz",
6531+ "integrity": "sha1-fjL3W0E4EpHQRhHxvxQQmsAGUdc=",
6532+ "dev": true
6533+ },
6534+ "qs": {
6535+ "version": "6.5.2",
6536+ "resolved": "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz",
6537+ "integrity": "sha512-N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA=="
6538+ },
6539+ "querystring": {
6540+ "version": "0.2.0",
6541+ "resolved": "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz",
6542+ "integrity": "sha1-sgmEkgO7Jd+CDadW50cAWHhSFiA=",
6543+ "dev": true
6544+ },
6545+ "querystring-es3": {
6546+ "version": "0.2.1",
6547+ "resolved": "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz",
6548+ "integrity": "sha1-nsYfeQSYdXB9aUFFlv2Qek1xHnM=",
6549+ "dev": true
6550+ },
6551+ "quote-stream": {
6552+ "version": "1.0.2",
6553+ "resolved": "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz",
6554+ "integrity": "sha1-hJY/jJwmuULhU/7rU6rnRlK34LI=",
6555+ "dev": true,
6556+ "requires": {
6557+ "buffer-equal": "0.0.1",
6558+ "minimist": "^1.1.3",
6559+ "through2": "^2.0.0"
6560+ }
6561+ },
6562+ "randombytes": {
6563+ "version": "2.1.0",
6564+ "resolved": "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz",
6565+ "integrity": "sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==",
6566+ "dev": true,
6567+ "requires": {
6568+ "safe-buffer": "^5.1.0"
6569+ }
6570+ },
6571+ "randomfill": {
6572+ "version": "1.0.4",
6573+ "resolved": "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz",
6574+ "integrity": "sha512-87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==",
6575+ "dev": true,
6576+ "requires": {
6577+ "randombytes": "^2.0.5",
6578+ "safe-buffer": "^5.1.0"
6579+ }
6580+ },
6581+ "range-parser": {
6582+ "version": "1.2.1",
6583+ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz",
6584+ "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==",
6585+ "dev": true
6586+ },
6587+ "readable-stream": {
6588+ "version": "2.3.7",
6589+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz",
6590+ "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==",
6591+ "dev": true,
6592+ "requires": {
6593+ "core-util-is": "~1.0.0",
6594+ "inherits": "~2.0.3",
6595+ "isarray": "~1.0.0",
6596+ "process-nextick-args": "~2.0.0",
6597+ "safe-buffer": "~5.1.1",
6598+ "string_decoder": "~1.1.1",
6599+ "util-deprecate": "~1.0.1"
6600+ }
6601+ },
6602+ "readdirp": {
6603+ "version": "2.2.1",
6604+ "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz",
6605+ "integrity": "sha512-1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==",
6606+ "dev": true,
6607+ "requires": {
6608+ "graceful-fs": "^4.1.11",
6609+ "micromatch": "^3.1.10",
6610+ "readable-stream": "^2.0.2"
6611+ }
6612+ },
6613+ "regenerate": {
6614+ "version": "1.4.0",
6615+ "resolved": "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz",
6616+ "integrity": "sha512-1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==",
6617+ "dev": true
6618+ },
6619+ "regenerate-unicode-properties": {
6620+ "version": "8.2.0",
6621+ "resolved": "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz",
6622+ "integrity": "sha512-F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==",
6623+ "dev": true,
6624+ "requires": {
6625+ "regenerate": "^1.4.0"
6626+ }
6627+ },
6628+ "regenerator-runtime": {
6629+ "version": "0.13.5",
6630+ "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz",
6631+ "integrity": "sha512-ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==",
6632+ "dev": true
6633+ },
6634+ "regenerator-transform": {
6635+ "version": "0.14.4",
6636+ "resolved": "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz",
6637+ "integrity": "sha512-EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==",
6638+ "dev": true,
6639+ "requires": {
6640+ "@babel/runtime": "^7.8.4",
6641+ "private": "^0.1.8"
6642+ },
6643+ "dependencies": {
6644+ "@babel/runtime": {
6645+ "version": "7.9.2",
6646+ "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz",
6647+ "integrity": "sha512-NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==",
6648+ "dev": true,
6649+ "requires": {
6650+ "regenerator-runtime": "^0.13.4"
6651+ }
6652+ }
6653+ }
6654+ },
6655+ "regex-not": {
6656+ "version": "1.0.2",
6657+ "resolved": "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz",
6658+ "integrity": "sha512-J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==",
6659+ "dev": true,
6660+ "requires": {
6661+ "extend-shallow": "^3.0.2",
6662+ "safe-regex": "^1.1.0"
6663+ }
6664+ },
6665+ "regexpu-core": {
6666+ "version": "4.7.0",
6667+ "resolved": "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz",
6668+ "integrity": "sha512-TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==",
6669+ "dev": true,
6670+ "requires": {
6671+ "regenerate": "^1.4.0",
6672+ "regenerate-unicode-properties": "^8.2.0",
6673+ "regjsgen": "^0.5.1",
6674+ "regjsparser": "^0.6.4",
6675+ "unicode-match-property-ecmascript": "^1.0.4",
6676+ "unicode-match-property-value-ecmascript": "^1.2.0"
6677+ }
6678+ },
6679+ "regjsgen": {
6680+ "version": "0.5.1",
6681+ "resolved": "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz",
6682+ "integrity": "sha512-5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==",
6683+ "dev": true
6684+ },
6685+ "regjsparser": {
6686+ "version": "0.6.4",
6687+ "resolved": "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz",
6688+ "integrity": "sha512-64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==",
6689+ "dev": true,
6690+ "requires": {
6691+ "jsesc": "~0.5.0"
6692+ },
6693+ "dependencies": {
6694+ "jsesc": {
6695+ "version": "0.5.0",
6696+ "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz",
6697+ "integrity": "sha1-597mbjXW/Bb3EP6R1c9p9w8IkR0=",
6698+ "dev": true
6699+ }
6700+ }
6701+ },
6702+ "remove-trailing-separator": {
6703+ "version": "1.1.0",
6704+ "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz",
6705+ "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=",
6706+ "dev": true
6707+ },
6708+ "repeat-element": {
6709+ "version": "1.1.3",
6710+ "resolved": "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz",
6711+ "integrity": "sha512-ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==",
6712+ "dev": true
6713+ },
6714+ "repeat-string": {
6715+ "version": "1.6.1",
6716+ "resolved": "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz",
6717+ "integrity": "sha1-jcrkcOHIirwtYA//Sndihtp15jc=",
6718+ "dev": true
6719+ },
6720+ "request": {
6721+ "version": "2.88.2",
6722+ "resolved": "https://registry.npmjs.org/request/-/request-2.88.2.tgz",
6723+ "integrity": "sha512-MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==",
6724+ "requires": {
6725+ "aws-sign2": "~0.7.0",
6726+ "aws4": "^1.8.0",
6727+ "caseless": "~0.12.0",
6728+ "combined-stream": "~1.0.6",
6729+ "extend": "~3.0.2",
6730+ "forever-agent": "~0.6.1",
6731+ "form-data": "~2.3.2",
6732+ "har-validator": "~5.1.3",
6733+ "http-signature": "~1.2.0",
6734+ "is-typedarray": "~1.0.0",
6735+ "isstream": "~0.1.2",
6736+ "json-stringify-safe": "~5.0.1",
6737+ "mime-types": "~2.1.19",
6738+ "oauth-sign": "~0.9.0",
6739+ "performance-now": "^2.1.0",
6740+ "qs": "~6.5.2",
6741+ "safe-buffer": "^5.1.2",
6742+ "tough-cookie": "~2.5.0",
6743+ "tunnel-agent": "^0.6.0",
6744+ "uuid": "^3.3.2"
6745+ }
6746+ },
6747+ "request-promise-core": {
6748+ "version": "1.1.3",
6749+ "resolved": "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz",
6750+ "integrity": "sha512-QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==",
6751+ "dev": true,
6752+ "requires": {
6753+ "lodash": "^4.17.15"
6754+ }
6755+ },
6756+ "request-promise-native": {
6757+ "version": "1.0.8",
6758+ "resolved": "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz",
6759+ "integrity": "sha512-dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==",
6760+ "dev": true,
6761+ "requires": {
6762+ "request-promise-core": "1.1.3",
6763+ "stealthy-require": "^1.1.1",
6764+ "tough-cookie": "^2.3.3"
6765+ }
6766+ },
6767+ "require-directory": {
6768+ "version": "2.1.1",
6769+ "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz",
6770+ "integrity": "sha1-jGStX9MNqxyXbiNE/+f3kqam30I=",
6771+ "dev": true
6772+ },
6773+ "require-main-filename": {
6774+ "version": "2.0.0",
6775+ "resolved": "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz",
6776+ "integrity": "sha512-NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==",
6777+ "dev": true
6778+ },
6779+ "resolve": {
6780+ "version": "1.17.0",
6781+ "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz",
6782+ "integrity": "sha512-ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==",
6783+ "dev": true,
6784+ "requires": {
6785+ "path-parse": "^1.0.6"
6786+ }
6787+ },
6788+ "resolve-from": {
6789+ "version": "3.0.0",
6790+ "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz",
6791+ "integrity": "sha1-six699nWiBvItuZTM17rywoYh0g=",
6792+ "dev": true
6793+ },
6794+ "resolve-url": {
6795+ "version": "0.2.1",
6796+ "resolved": "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz",
6797+ "integrity": "sha1-LGN/53yJOv0qZj/iGqkIAGjiBSo=",
6798+ "dev": true
6799+ },
6800+ "restore-cursor": {
6801+ "version": "2.0.0",
6802+ "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz",
6803+ "integrity": "sha1-n37ih/gv0ybU/RYpI9YhKe7g368=",
6804+ "dev": true,
6805+ "requires": {
6806+ "onetime": "^2.0.0",
6807+ "signal-exit": "^3.0.2"
6808+ }
6809+ },
6810+ "ret": {
6811+ "version": "0.1.15",
6812+ "resolved": "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz",
6813+ "integrity": "sha512-TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==",
6814+ "dev": true
6815+ },
6816+ "rgb-regex": {
6817+ "version": "1.0.1",
6818+ "resolved": "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz",
6819+ "integrity": "sha1-wODWiC3w4jviVKR16O3UGRX+rrE=",
6820+ "dev": true
6821+ },
6822+ "rgba-regex": {
6823+ "version": "1.0.0",
6824+ "resolved": "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz",
6825+ "integrity": "sha1-QzdOLiyglosO8VI0YLfXMP8i7rM=",
6826+ "dev": true
6827+ },
6828+ "rimraf": {
6829+ "version": "2.6.3",
6830+ "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
6831+ "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
6832+ "dev": true,
6833+ "requires": {
6834+ "glob": "^7.1.3"
6835+ }
6836+ },
6837+ "ripemd160": {
6838+ "version": "2.0.2",
6839+ "resolved": "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz",
6840+ "integrity": "sha512-ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==",
6841+ "dev": true,
6842+ "requires": {
6843+ "hash-base": "^3.0.0",
6844+ "inherits": "^2.0.1"
6845+ }
6846+ },
6847+ "safe-buffer": {
6848+ "version": "5.1.2",
6849+ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz",
6850+ "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
6851+ },
6852+ "safe-regex": {
6853+ "version": "1.1.0",
6854+ "resolved": "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz",
6855+ "integrity": "sha1-QKNmnzsHfR6UPURinhV91IAjvy4=",
6856+ "dev": true,
6857+ "requires": {
6858+ "ret": "~0.1.10"
6859+ }
6860+ },
6861+ "safer-buffer": {
6862+ "version": "2.1.2",
6863+ "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz",
6864+ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg=="
6865+ },
6866+ "safer-eval": {
6867+ "version": "1.3.6",
6868+ "resolved": "https://registry.npmjs.org/safer-eval/-/safer-eval-1.3.6.tgz",
6869+ "integrity": "sha512-DN9tBsZgtUOHODzSfO1nGCLhZtxc7Qq/d8/2SNxQZ9muYXZspSh1fO7HOsrf4lcelBNviAJLCxB/ggmG+jV1aw==",
6870+ "dev": true,
6871+ "requires": {
6872+ "clones": "^1.2.0"
6873+ }
6874+ },
6875+ "sax": {
6876+ "version": "1.2.4",
6877+ "resolved": "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz",
6878+ "integrity": "sha512-NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==",
6879+ "dev": true
6880+ },
6881+ "saxes": {
6882+ "version": "3.1.11",
6883+ "resolved": "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz",
6884+ "integrity": "sha512-Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==",
6885+ "dev": true,
6886+ "requires": {
6887+ "xmlchars": "^2.1.1"
6888+ }
6889+ },
6890+ "semver": {
6891+ "version": "5.7.1",
6892+ "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
6893+ "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
6894+ "dev": true
6895+ },
6896+ "send": {
6897+ "version": "0.17.1",
6898+ "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz",
6899+ "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==",
6900+ "dev": true,
6901+ "requires": {
6902+ "debug": "2.6.9",
6903+ "depd": "~1.1.2",
6904+ "destroy": "~1.0.4",
6905+ "encodeurl": "~1.0.2",
6906+ "escape-html": "~1.0.3",
6907+ "etag": "~1.8.1",
6908+ "fresh": "0.5.2",
6909+ "http-errors": "~1.7.2",
6910+ "mime": "1.6.0",
6911+ "ms": "2.1.1",
6912+ "on-finished": "~2.3.0",
6913+ "range-parser": "~1.2.1",
6914+ "statuses": "~1.5.0"
6915+ },
6916+ "dependencies": {
6917+ "debug": {
6918+ "version": "2.6.9",
6919+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
6920+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
6921+ "dev": true,
6922+ "requires": {
6923+ "ms": "2.0.0"
6924+ },
6925+ "dependencies": {
6926+ "ms": {
6927+ "version": "2.0.0",
6928+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
6929+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
6930+ "dev": true
6931+ }
6932+ }
6933+ },
6934+ "ms": {
6935+ "version": "2.1.1",
6936+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
6937+ "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
6938+ "dev": true
6939+ }
6940+ }
6941+ },
6942+ "serialize-to-js": {
6943+ "version": "1.2.2",
6944+ "resolved": "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-1.2.2.tgz",
6945+ "integrity": "sha512-mUc8vA5iJghe+O+3s0YDGFLMJcqitVFk787YKiv8a4sf6RX5W0u81b+gcHrp15O0fFa010dRBVZvwcKXOWsL9Q==",
6946+ "dev": true,
6947+ "requires": {
6948+ "js-beautify": "^1.8.9",
6949+ "safer-eval": "^1.3.0"
6950+ }
6951+ },
6952+ "serve-static": {
6953+ "version": "1.14.1",
6954+ "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz",
6955+ "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==",
6956+ "dev": true,
6957+ "requires": {
6958+ "encodeurl": "~1.0.2",
6959+ "escape-html": "~1.0.3",
6960+ "parseurl": "~1.3.3",
6961+ "send": "0.17.1"
6962+ }
6963+ },
6964+ "set-blocking": {
6965+ "version": "2.0.0",
6966+ "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz",
6967+ "integrity": "sha1-BF+XgtARrppoA93TgrJDkrPYkPc=",
6968+ "dev": true
6969+ },
6970+ "set-value": {
6971+ "version": "2.0.1",
6972+ "resolved": "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz",
6973+ "integrity": "sha512-JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==",
6974+ "dev": true,
6975+ "requires": {
6976+ "extend-shallow": "^2.0.1",
6977+ "is-extendable": "^0.1.1",
6978+ "is-plain-object": "^2.0.3",
6979+ "split-string": "^3.0.1"
6980+ },
6981+ "dependencies": {
6982+ "extend-shallow": {
6983+ "version": "2.0.1",
6984+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
6985+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
6986+ "dev": true,
6987+ "requires": {
6988+ "is-extendable": "^0.1.0"
6989+ }
6990+ }
6991+ }
6992+ },
6993+ "setimmediate": {
6994+ "version": "1.0.5",
6995+ "resolved": "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz",
6996+ "integrity": "sha1-KQy7Iy4waULX1+qbg3Mqt4VvgoU=",
6997+ "dev": true
6998+ },
6999+ "setprototypeof": {
7000+ "version": "1.1.1",
7001+ "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz",
7002+ "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==",
7003+ "dev": true
7004+ },
7005+ "sha.js": {
7006+ "version": "2.4.11",
7007+ "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz",
7008+ "integrity": "sha512-QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==",
7009+ "dev": true,
7010+ "requires": {
7011+ "inherits": "^2.0.1",
7012+ "safe-buffer": "^5.0.1"
7013+ }
7014+ },
7015+ "shallow-copy": {
7016+ "version": "0.0.1",
7017+ "resolved": "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz",
7018+ "integrity": "sha1-QV9CcC1z2BAzApLMXuhurhoRoXA=",
7019+ "dev": true
7020+ },
7021+ "shebang-command": {
7022+ "version": "1.2.0",
7023+ "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
7024+ "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
7025+ "dev": true,
7026+ "requires": {
7027+ "shebang-regex": "^1.0.0"
7028+ }
7029+ },
7030+ "shebang-regex": {
7031+ "version": "1.0.0",
7032+ "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
7033+ "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
7034+ "dev": true
7035+ },
7036+ "sigmund": {
7037+ "version": "1.0.1",
7038+ "resolved": "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz",
7039+ "integrity": "sha1-P/IfGYytIXX587eBhT/ZTQ0ZtZA=",
7040+ "dev": true
7041+ },
7042+ "signal-exit": {
7043+ "version": "3.0.3",
7044+ "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz",
7045+ "integrity": "sha512-VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==",
7046+ "dev": true
7047+ },
7048+ "simple-swizzle": {
7049+ "version": "0.2.2",
7050+ "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz",
7051+ "integrity": "sha1-pNprY1/8zMoz9w0Xy5JZLeleVXo=",
7052+ "dev": true,
7053+ "requires": {
7054+ "is-arrayish": "^0.3.1"
7055+ },
7056+ "dependencies": {
7057+ "is-arrayish": {
7058+ "version": "0.3.2",
7059+ "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz",
7060+ "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==",
7061+ "dev": true
7062+ }
7063+ }
7064+ },
7065+ "snapdragon": {
7066+ "version": "0.8.2",
7067+ "resolved": "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz",
7068+ "integrity": "sha512-FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==",
7069+ "dev": true,
7070+ "requires": {
7071+ "base": "^0.11.1",
7072+ "debug": "^2.2.0",
7073+ "define-property": "^0.2.5",
7074+ "extend-shallow": "^2.0.1",
7075+ "map-cache": "^0.2.2",
7076+ "source-map": "^0.5.6",
7077+ "source-map-resolve": "^0.5.0",
7078+ "use": "^3.1.0"
7079+ },
7080+ "dependencies": {
7081+ "debug": {
7082+ "version": "2.6.9",
7083+ "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz",
7084+ "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==",
7085+ "dev": true,
7086+ "requires": {
7087+ "ms": "2.0.0"
7088+ }
7089+ },
7090+ "define-property": {
7091+ "version": "0.2.5",
7092+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
7093+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
7094+ "dev": true,
7095+ "requires": {
7096+ "is-descriptor": "^0.1.0"
7097+ }
7098+ },
7099+ "extend-shallow": {
7100+ "version": "2.0.1",
7101+ "resolved": "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz",
7102+ "integrity": "sha1-Ua99YUrZqfYQ6huvu5idaxxWiQ8=",
7103+ "dev": true,
7104+ "requires": {
7105+ "is-extendable": "^0.1.0"
7106+ }
7107+ },
7108+ "ms": {
7109+ "version": "2.0.0",
7110+ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
7111+ "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
7112+ "dev": true
7113+ },
7114+ "source-map": {
7115+ "version": "0.5.7",
7116+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz",
7117+ "integrity": "sha1-igOdLRAh0i0eoUyA2OpGi6LvP8w=",
7118+ "dev": true
7119+ }
7120+ }
7121+ },
7122+ "snapdragon-node": {
7123+ "version": "2.1.1",
7124+ "resolved": "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz",
7125+ "integrity": "sha512-O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==",
7126+ "dev": true,
7127+ "requires": {
7128+ "define-property": "^1.0.0",
7129+ "isobject": "^3.0.0",
7130+ "snapdragon-util": "^3.0.1"
7131+ },
7132+ "dependencies": {
7133+ "define-property": {
7134+ "version": "1.0.0",
7135+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz",
7136+ "integrity": "sha1-dp66rz9KY6rTr56NMEybvnm/sOY=",
7137+ "dev": true,
7138+ "requires": {
7139+ "is-descriptor": "^1.0.0"
7140+ }
7141+ },
7142+ "is-accessor-descriptor": {
7143+ "version": "1.0.0",
7144+ "resolved": "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz",
7145+ "integrity": "sha512-m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==",
7146+ "dev": true,
7147+ "requires": {
7148+ "kind-of": "^6.0.0"
7149+ }
7150+ },
7151+ "is-data-descriptor": {
7152+ "version": "1.0.0",
7153+ "resolved": "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz",
7154+ "integrity": "sha512-jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==",
7155+ "dev": true,
7156+ "requires": {
7157+ "kind-of": "^6.0.0"
7158+ }
7159+ },
7160+ "is-descriptor": {
7161+ "version": "1.0.2",
7162+ "resolved": "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz",
7163+ "integrity": "sha512-2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==",
7164+ "dev": true,
7165+ "requires": {
7166+ "is-accessor-descriptor": "^1.0.0",
7167+ "is-data-descriptor": "^1.0.0",
7168+ "kind-of": "^6.0.2"
7169+ }
7170+ }
7171+ }
7172+ },
7173+ "snapdragon-util": {
7174+ "version": "3.0.1",
7175+ "resolved": "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz",
7176+ "integrity": "sha512-mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==",
7177+ "dev": true,
7178+ "requires": {
7179+ "kind-of": "^3.2.0"
7180+ },
7181+ "dependencies": {
7182+ "kind-of": {
7183+ "version": "3.2.2",
7184+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
7185+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
7186+ "dev": true,
7187+ "requires": {
7188+ "is-buffer": "^1.1.5"
7189+ }
7190+ }
7191+ }
7192+ },
7193+ "source-map": {
7194+ "version": "0.6.1",
7195+ "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz",
7196+ "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==",
7197+ "dev": true
7198+ },
7199+ "source-map-resolve": {
7200+ "version": "0.5.3",
7201+ "resolved": "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz",
7202+ "integrity": "sha512-Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==",
7203+ "dev": true,
7204+ "requires": {
7205+ "atob": "^2.1.2",
7206+ "decode-uri-component": "^0.2.0",
7207+ "resolve-url": "^0.2.1",
7208+ "source-map-url": "^0.4.0",
7209+ "urix": "^0.1.0"
7210+ }
7211+ },
7212+ "source-map-support": {
7213+ "version": "0.5.19",
7214+ "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz",
7215+ "integrity": "sha512-Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==",
7216+ "dev": true,
7217+ "requires": {
7218+ "buffer-from": "^1.0.0",
7219+ "source-map": "^0.6.0"
7220+ }
7221+ },
7222+ "source-map-url": {
7223+ "version": "0.4.0",
7224+ "resolved": "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz",
7225+ "integrity": "sha1-PpNdfd1zYxuXZZlW1VEo6HtQhKM=",
7226+ "dev": true
7227+ },
7228+ "split-string": {
7229+ "version": "3.1.0",
7230+ "resolved": "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz",
7231+ "integrity": "sha512-NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==",
7232+ "dev": true,
7233+ "requires": {
7234+ "extend-shallow": "^3.0.0"
7235+ }
7236+ },
7237+ "sprintf-js": {
7238+ "version": "1.0.3",
7239+ "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
7240+ "integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
7241+ "dev": true
7242+ },
7243+ "sshpk": {
7244+ "version": "1.16.1",
7245+ "resolved": "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz",
7246+ "integrity": "sha512-HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==",
7247+ "requires": {
7248+ "asn1": "~0.2.3",
7249+ "assert-plus": "^1.0.0",
7250+ "bcrypt-pbkdf": "^1.0.0",
7251+ "dashdash": "^1.12.0",
7252+ "ecc-jsbn": "~0.1.1",
7253+ "getpass": "^0.1.1",
7254+ "jsbn": "~0.1.0",
7255+ "safer-buffer": "^2.0.2",
7256+ "tweetnacl": "~0.14.0"
7257+ }
7258+ },
7259+ "stable": {
7260+ "version": "0.1.8",
7261+ "resolved": "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz",
7262+ "integrity": "sha512-ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==",
7263+ "dev": true
7264+ },
7265+ "static-eval": {
7266+ "version": "2.0.5",
7267+ "resolved": "https://registry.npmjs.org/static-eval/-/static-eval-2.0.5.tgz",
7268+ "integrity": "sha512-nNbV6LbGtMBgv7e9LFkt5JV8RVlRsyJrphfAt9tOtBBW/SfnzZDf2KnS72an8e434A+9e/BmJuTxeGPvrAK7KA==",
7269+ "dev": true,
7270+ "requires": {
7271+ "escodegen": "^1.11.1"
7272+ },
7273+ "dependencies": {
7274+ "escodegen": {
7275+ "version": "1.14.1",
7276+ "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz",
7277+ "integrity": "sha512-Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==",
7278+ "dev": true,
7279+ "requires": {
7280+ "esprima": "^4.0.1",
7281+ "estraverse": "^4.2.0",
7282+ "esutils": "^2.0.2",
7283+ "optionator": "^0.8.1",
7284+ "source-map": "~0.6.1"
7285+ }
7286+ }
7287+ }
7288+ },
7289+ "static-extend": {
7290+ "version": "0.1.2",
7291+ "resolved": "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz",
7292+ "integrity": "sha1-YICcOcv/VTNyJv1eC1IPNB8ftcY=",
7293+ "dev": true,
7294+ "requires": {
7295+ "define-property": "^0.2.5",
7296+ "object-copy": "^0.1.0"
7297+ },
7298+ "dependencies": {
7299+ "define-property": {
7300+ "version": "0.2.5",
7301+ "resolved": "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz",
7302+ "integrity": "sha1-w1se+RjsPJkPmlvFe+BKrOxcgRY=",
7303+ "dev": true,
7304+ "requires": {
7305+ "is-descriptor": "^0.1.0"
7306+ }
7307+ }
7308+ }
7309+ },
7310+ "static-module": {
7311+ "version": "2.2.5",
7312+ "resolved": "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz",
7313+ "integrity": "sha512-D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==",
7314+ "dev": true,
7315+ "requires": {
7316+ "concat-stream": "~1.6.0",
7317+ "convert-source-map": "^1.5.1",
7318+ "duplexer2": "~0.1.4",
7319+ "escodegen": "~1.9.0",
7320+ "falafel": "^2.1.0",
7321+ "has": "^1.0.1",
7322+ "magic-string": "^0.22.4",
7323+ "merge-source-map": "1.0.4",
7324+ "object-inspect": "~1.4.0",
7325+ "quote-stream": "~1.0.2",
7326+ "readable-stream": "~2.3.3",
7327+ "shallow-copy": "~0.0.1",
7328+ "static-eval": "^2.0.0",
7329+ "through2": "~2.0.3"
7330+ },
7331+ "dependencies": {
7332+ "object-inspect": {
7333+ "version": "1.4.1",
7334+ "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz",
7335+ "integrity": "sha512-wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==",
7336+ "dev": true
7337+ }
7338+ }
7339+ },
7340+ "statuses": {
7341+ "version": "1.5.0",
7342+ "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz",
7343+ "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=",
7344+ "dev": true
7345+ },
7346+ "stealthy-require": {
7347+ "version": "1.1.1",
7348+ "resolved": "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz",
7349+ "integrity": "sha1-NbCYdbT/SfJqd35QmzCQoyJr8ks=",
7350+ "dev": true
7351+ },
7352+ "stream-browserify": {
7353+ "version": "2.0.2",
7354+ "resolved": "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz",
7355+ "integrity": "sha512-nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==",
7356+ "dev": true,
7357+ "requires": {
7358+ "inherits": "~2.0.1",
7359+ "readable-stream": "^2.0.2"
7360+ }
7361+ },
7362+ "stream-http": {
7363+ "version": "2.8.3",
7364+ "resolved": "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz",
7365+ "integrity": "sha512-+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==",
7366+ "dev": true,
7367+ "requires": {
7368+ "builtin-status-codes": "^3.0.0",
7369+ "inherits": "^2.0.1",
7370+ "readable-stream": "^2.3.6",
7371+ "to-arraybuffer": "^1.0.0",
7372+ "xtend": "^4.0.0"
7373+ }
7374+ },
7375+ "string-width": {
7376+ "version": "3.1.0",
7377+ "resolved": "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz",
7378+ "integrity": "sha512-vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==",
7379+ "dev": true,
7380+ "requires": {
7381+ "emoji-regex": "^7.0.1",
7382+ "is-fullwidth-code-point": "^2.0.0",
7383+ "strip-ansi": "^5.1.0"
7384+ },
7385+ "dependencies": {
7386+ "ansi-regex": {
7387+ "version": "4.1.0",
7388+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
7389+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
7390+ "dev": true
7391+ },
7392+ "strip-ansi": {
7393+ "version": "5.2.0",
7394+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
7395+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
7396+ "dev": true,
7397+ "requires": {
7398+ "ansi-regex": "^4.1.0"
7399+ }
7400+ }
7401+ }
7402+ },
7403+ "string.prototype.trimend": {
7404+ "version": "1.0.1",
7405+ "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz",
7406+ "integrity": "sha512-LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==",
7407+ "dev": true,
7408+ "requires": {
7409+ "define-properties": "^1.1.3",
7410+ "es-abstract": "^1.17.5"
7411+ }
7412+ },
7413+ "string.prototype.trimleft": {
7414+ "version": "2.1.2",
7415+ "resolved": "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz",
7416+ "integrity": "sha512-gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==",
7417+ "dev": true,
7418+ "requires": {
7419+ "define-properties": "^1.1.3",
7420+ "es-abstract": "^1.17.5",
7421+ "string.prototype.trimstart": "^1.0.0"
7422+ }
7423+ },
7424+ "string.prototype.trimright": {
7425+ "version": "2.1.2",
7426+ "resolved": "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz",
7427+ "integrity": "sha512-ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==",
7428+ "dev": true,
7429+ "requires": {
7430+ "define-properties": "^1.1.3",
7431+ "es-abstract": "^1.17.5",
7432+ "string.prototype.trimend": "^1.0.0"
7433+ }
7434+ },
7435+ "string.prototype.trimstart": {
7436+ "version": "1.0.1",
7437+ "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz",
7438+ "integrity": "sha512-XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==",
7439+ "dev": true,
7440+ "requires": {
7441+ "define-properties": "^1.1.3",
7442+ "es-abstract": "^1.17.5"
7443+ }
7444+ },
7445+ "string_decoder": {
7446+ "version": "1.1.1",
7447+ "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz",
7448+ "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==",
7449+ "dev": true,
7450+ "requires": {
7451+ "safe-buffer": "~5.1.0"
7452+ }
7453+ },
7454+ "strip-ansi": {
7455+ "version": "4.0.0",
7456+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz",
7457+ "integrity": "sha1-qEeQIusaw2iocTibY1JixQXuNo8=",
7458+ "dev": true,
7459+ "requires": {
7460+ "ansi-regex": "^3.0.0"
7461+ }
7462+ },
7463+ "stylehacks": {
7464+ "version": "4.0.3",
7465+ "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz",
7466+ "integrity": "sha512-7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==",
7467+ "dev": true,
7468+ "requires": {
7469+ "browserslist": "^4.0.0",
7470+ "postcss": "^7.0.0",
7471+ "postcss-selector-parser": "^3.0.0"
7472+ },
7473+ "dependencies": {
7474+ "postcss-selector-parser": {
7475+ "version": "3.1.2",
7476+ "resolved": "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz",
7477+ "integrity": "sha512-h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==",
7478+ "dev": true,
7479+ "requires": {
7480+ "dot-prop": "^5.2.0",
7481+ "indexes-of": "^1.0.1",
7482+ "uniq": "^1.0.1"
7483+ }
7484+ }
7485+ }
7486+ },
7487+ "supports-color": {
7488+ "version": "6.1.0",
7489+ "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz",
7490+ "integrity": "sha512-qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==",
7491+ "dev": true,
7492+ "requires": {
7493+ "has-flag": "^3.0.0"
7494+ }
7495+ },
7496+ "svgo": {
7497+ "version": "1.3.2",
7498+ "resolved": "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz",
7499+ "integrity": "sha512-yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==",
7500+ "dev": true,
7501+ "requires": {
7502+ "chalk": "^2.4.1",
7503+ "coa": "^2.0.2",
7504+ "css-select": "^2.0.0",
7505+ "css-select-base-adapter": "^0.1.1",
7506+ "css-tree": "1.0.0-alpha.37",
7507+ "csso": "^4.0.2",
7508+ "js-yaml": "^3.13.1",
7509+ "mkdirp": "~0.5.1",
7510+ "object.values": "^1.1.0",
7511+ "sax": "~1.2.4",
7512+ "stable": "^0.1.8",
7513+ "unquote": "~1.1.1",
7514+ "util.promisify": "~1.0.0"
7515+ }
7516+ },
7517+ "symbol-tree": {
7518+ "version": "3.2.4",
7519+ "resolved": "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz",
7520+ "integrity": "sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==",
7521+ "dev": true
7522+ },
7523+ "temp": {
7524+ "version": "0.9.0",
7525+ "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.0.tgz",
7526+ "integrity": "sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ==",
7527+ "dev": true,
7528+ "requires": {
7529+ "rimraf": "~2.6.2"
7530+ }
7531+ },
7532+ "terser": {
7533+ "version": "3.17.0",
7534+ "resolved": "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz",
7535+ "integrity": "sha512-/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==",
7536+ "dev": true,
7537+ "requires": {
7538+ "commander": "^2.19.0",
7539+ "source-map": "~0.6.1",
7540+ "source-map-support": "~0.5.10"
7541+ }
7542+ },
7543+ "through2": {
7544+ "version": "2.0.5",
7545+ "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz",
7546+ "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==",
7547+ "dev": true,
7548+ "requires": {
7549+ "readable-stream": "~2.3.6",
7550+ "xtend": "~4.0.1"
7551+ }
7552+ },
7553+ "timers-browserify": {
7554+ "version": "2.0.11",
7555+ "resolved": "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz",
7556+ "integrity": "sha512-60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==",
7557+ "dev": true,
7558+ "requires": {
7559+ "setimmediate": "^1.0.4"
7560+ }
7561+ },
7562+ "timsort": {
7563+ "version": "0.3.0",
7564+ "resolved": "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz",
7565+ "integrity": "sha1-QFQRqOfmM5/mTbmiNN4R3DHgK9Q=",
7566+ "dev": true
7567+ },
7568+ "tiny-inflate": {
7569+ "version": "1.0.3",
7570+ "resolved": "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz",
7571+ "integrity": "sha512-pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==",
7572+ "dev": true
7573+ },
7574+ "to-arraybuffer": {
7575+ "version": "1.0.1",
7576+ "resolved": "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz",
7577+ "integrity": "sha1-fSKbH8xjfkZsoIEYCDanqr/4P0M=",
7578+ "dev": true
7579+ },
7580+ "to-fast-properties": {
7581+ "version": "2.0.0",
7582+ "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz",
7583+ "integrity": "sha1-3F5pjL0HkmW8c+A3doGk5Og/YW4=",
7584+ "dev": true
7585+ },
7586+ "to-object-path": {
7587+ "version": "0.3.0",
7588+ "resolved": "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz",
7589+ "integrity": "sha1-KXWIt7Dn4KwI4E5nL4XB9JmeF68=",
7590+ "dev": true,
7591+ "requires": {
7592+ "kind-of": "^3.0.2"
7593+ },
7594+ "dependencies": {
7595+ "kind-of": {
7596+ "version": "3.2.2",
7597+ "resolved": "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz",
7598+ "integrity": "sha1-MeohpzS6ubuw8yRm2JOupR5KPGQ=",
7599+ "dev": true,
7600+ "requires": {
7601+ "is-buffer": "^1.1.5"
7602+ }
7603+ }
7604+ }
7605+ },
7606+ "to-regex": {
7607+ "version": "3.0.2",
7608+ "resolved": "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz",
7609+ "integrity": "sha512-FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==",
7610+ "dev": true,
7611+ "requires": {
7612+ "define-property": "^2.0.2",
7613+ "extend-shallow": "^3.0.2",
7614+ "regex-not": "^1.0.2",
7615+ "safe-regex": "^1.1.0"
7616+ }
7617+ },
7618+ "to-regex-range": {
7619+ "version": "2.1.1",
7620+ "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz",
7621+ "integrity": "sha1-fIDBe53+vlmeJzZ+DU3VWQFB2zg=",
7622+ "dev": true,
7623+ "requires": {
7624+ "is-number": "^3.0.0",
7625+ "repeat-string": "^1.6.1"
7626+ }
7627+ },
7628+ "toidentifier": {
7629+ "version": "1.0.0",
7630+ "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz",
7631+ "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==",
7632 "dev": true
7633 },
7634- "brace-expansion": {
7635- "version": "1.1.11",
7636- "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz",
7637- "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==",
7638+ "tough-cookie": {
7639+ "version": "2.5.0",
7640+ "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz",
7641+ "integrity": "sha512-nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==",
7642+ "requires": {
7643+ "psl": "^1.1.28",
7644+ "punycode": "^2.1.1"
7645+ }
7646+ },
7647+ "tr46": {
7648+ "version": "1.0.1",
7649+ "resolved": "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz",
7650+ "integrity": "sha1-qLE/1r/SSJUZZ0zN5VujaTtwbQk=",
7651 "dev": true,
7652 "requires": {
7653- "balanced-match": "^1.0.0",
7654- "concat-map": "0.0.1"
7655+ "punycode": "^2.1.0"
7656 }
7657 },
7658- "concat-map": {
7659- "version": "0.0.1",
7660- "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz",
7661- "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=",
7662+ "trim-right": {
7663+ "version": "1.0.1",
7664+ "resolved": "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz",
7665+ "integrity": "sha1-yy4SAwZ+DI3h9hQJS5/kVwTqYAM=",
7666 "dev": true
7667 },
7668- "cross-spawn": {
7669- "version": "6.0.5",
7670- "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz",
7671- "integrity": "sha512-eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==",
7672+ "tty-browserify": {
7673+ "version": "0.0.0",
7674+ "resolved": "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz",
7675+ "integrity": "sha1-oVe6QC2iTpv5V/mqadUk7tQpAaY=",
7676+ "dev": true
7677+ },
7678+ "tunnel-agent": {
7679+ "version": "0.6.0",
7680+ "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz",
7681+ "integrity": "sha1-J6XeoGs2sEoKmWZ3SykIaPD8QP0=",
7682+ "requires": {
7683+ "safe-buffer": "^5.0.1"
7684+ }
7685+ },
7686+ "tweetnacl": {
7687+ "version": "0.14.5",
7688+ "resolved": "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz",
7689+ "integrity": "sha1-WuaBd/GS1EViadEIr6k/+HQ/T2Q="
7690+ },
7691+ "type-check": {
7692+ "version": "0.3.2",
7693+ "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz",
7694+ "integrity": "sha1-WITKtRLPHTVeP7eE8wgEsrUg23I=",
7695 "dev": true,
7696 "requires": {
7697- "nice-try": "^1.0.4",
7698- "path-key": "^2.0.1",
7699- "semver": "^5.5.0",
7700- "shebang-command": "^1.2.0",
7701- "which": "^1.2.9"
7702+ "prelude-ls": "~1.1.2"
7703 }
7704 },
7705- "elm-hot": {
7706- "version": "1.1.1",
7707- "resolved": "https://registry.npmjs.org/elm-hot/-/elm-hot-1.1.1.tgz",
7708- "integrity": "sha512-ZHjoHd2Ev6riNXNQirj3J+GKKXXwedAUikfFBYzlVL/+3CdGs96cpZ7nhAk4c5l//Qa9ymltrqX36mOlr0pPFA==",
7709+ "typedarray": {
7710+ "version": "0.0.6",
7711+ "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz",
7712+ "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=",
7713 "dev": true
7714 },
7715- "find-elm-dependencies": {
7716- "version": "2.0.2",
7717- "resolved": "https://registry.npmjs.org/find-elm-dependencies/-/find-elm-dependencies-2.0.2.tgz",
7718- "integrity": "sha512-nM5UCbccD1G8CGK2GsM7ykG3ksOAl9E+34jiDfl07CAl2OPnLpBVWY2hlxEmIkSBfdJjSopEowWHrO0cI8RhxQ==",
7719+ "uncss": {
7720+ "version": "0.17.3",
7721+ "resolved": "https://registry.npmjs.org/uncss/-/uncss-0.17.3.tgz",
7722+ "integrity": "sha512-ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog==",
7723 "dev": true,
7724 "requires": {
7725- "firstline": "1.2.0",
7726- "lodash": "4.17.15"
7727+ "commander": "^2.20.0",
7728+ "glob": "^7.1.4",
7729+ "is-absolute-url": "^3.0.1",
7730+ "is-html": "^1.1.0",
7731+ "jsdom": "^14.1.0",
7732+ "lodash": "^4.17.15",
7733+ "postcss": "^7.0.17",
7734+ "postcss-selector-parser": "6.0.2",
7735+ "request": "^2.88.0"
7736+ },
7737+ "dependencies": {
7738+ "is-absolute-url": {
7739+ "version": "3.0.3",
7740+ "resolved": "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz",
7741+ "integrity": "sha512-opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==",
7742+ "dev": true
7743+ }
7744 }
7745 },
7746- "firstline": {
7747+ "unicode-canonical-property-names-ecmascript": {
7748+ "version": "1.0.4",
7749+ "resolved": "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz",
7750+ "integrity": "sha512-jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==",
7751+ "dev": true
7752+ },
7753+ "unicode-match-property-ecmascript": {
7754+ "version": "1.0.4",
7755+ "resolved": "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz",
7756+ "integrity": "sha512-L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==",
7757+ "dev": true,
7758+ "requires": {
7759+ "unicode-canonical-property-names-ecmascript": "^1.0.4",
7760+ "unicode-property-aliases-ecmascript": "^1.0.4"
7761+ }
7762+ },
7763+ "unicode-match-property-value-ecmascript": {
7764 "version": "1.2.0",
7765- "resolved": "https://registry.npmjs.org/firstline/-/firstline-1.2.0.tgz",
7766- "integrity": "sha1-yfSIbn9/vwr8EtcZQdzgaxkq6gU=",
7767+ "resolved": "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz",
7768+ "integrity": "sha512-wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==",
7769 "dev": true
7770 },
7771- "fs.realpath": {
7772- "version": "1.0.0",
7773- "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz",
7774- "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=",
7775+ "unicode-property-aliases-ecmascript": {
7776+ "version": "1.1.0",
7777+ "resolved": "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz",
7778+ "integrity": "sha512-PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==",
7779 "dev": true
7780 },
7781- "glob": {
7782- "version": "7.1.4",
7783- "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
7784- "integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
7785+ "unicode-trie": {
7786+ "version": "0.3.1",
7787+ "resolved": "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz",
7788+ "integrity": "sha1-1nHd3YkQGgi6w3tqUWEBBgIFIIU=",
7789 "dev": true,
7790 "requires": {
7791- "fs.realpath": "^1.0.0",
7792- "inflight": "^1.0.4",
7793- "inherits": "2",
7794- "minimatch": "^3.0.4",
7795- "once": "^1.3.0",
7796- "path-is-absolute": "^1.0.0"
7797+ "pako": "^0.2.5",
7798+ "tiny-inflate": "^1.0.0"
7799 }
7800 },
7801- "inflight": {
7802- "version": "1.0.6",
7803- "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz",
7804- "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=",
7805+ "union-value": {
7806+ "version": "1.0.1",
7807+ "resolved": "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz",
7808+ "integrity": "sha512-tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==",
7809 "dev": true,
7810 "requires": {
7811- "once": "^1.3.0",
7812- "wrappy": "1"
7813+ "arr-union": "^3.1.0",
7814+ "get-value": "^2.0.6",
7815+ "is-extendable": "^0.1.1",
7816+ "set-value": "^2.0.1"
7817 }
7818 },
7819- "inherits": {
7820- "version": "2.0.4",
7821- "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz",
7822- "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==",
7823+ "uniq": {
7824+ "version": "1.0.1",
7825+ "resolved": "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz",
7826+ "integrity": "sha1-sxxa6CVIRKOoKBVBzisEuGWnNP8=",
7827 "dev": true
7828 },
7829- "isexe": {
7830+ "uniqs": {
7831 "version": "2.0.0",
7832- "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz",
7833- "integrity": "sha1-6PvzdNxVb/iUehDcsFctYz8s+hA=",
7834+ "resolved": "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz",
7835+ "integrity": "sha1-/+3ks2slKQaW5uFl1KWe25mOawI=",
7836 "dev": true
7837 },
7838- "lodash": {
7839- "version": "4.17.15",
7840- "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz",
7841- "integrity": "sha512-8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==",
7842+ "unquote": {
7843+ "version": "1.1.1",
7844+ "resolved": "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz",
7845+ "integrity": "sha1-j97XMk7G6IoP+LkF58CYzcCG1UQ=",
7846 "dev": true
7847 },
7848- "minimatch": {
7849- "version": "3.0.4",
7850- "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz",
7851- "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==",
7852+ "unset-value": {
7853+ "version": "1.0.0",
7854+ "resolved": "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz",
7855+ "integrity": "sha1-g3aHP30jNRef+x5vw6jtDfyKtVk=",
7856 "dev": true,
7857 "requires": {
7858- "brace-expansion": "^1.1.7"
7859+ "has-value": "^0.3.1",
7860+ "isobject": "^3.0.0"
7861+ },
7862+ "dependencies": {
7863+ "has-value": {
7864+ "version": "0.3.1",
7865+ "resolved": "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz",
7866+ "integrity": "sha1-ex9YutpiyoJ+wKIHgCVlSEWZXh8=",
7867+ "dev": true,
7868+ "requires": {
7869+ "get-value": "^2.0.3",
7870+ "has-values": "^0.1.4",
7871+ "isobject": "^2.0.0"
7872+ },
7873+ "dependencies": {
7874+ "isobject": {
7875+ "version": "2.1.0",
7876+ "resolved": "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz",
7877+ "integrity": "sha1-8GVWEJaj8dou9GJy+BXIQNh+DIk=",
7878+ "dev": true,
7879+ "requires": {
7880+ "isarray": "1.0.0"
7881+ }
7882+ }
7883+ }
7884+ },
7885+ "has-values": {
7886+ "version": "0.1.4",
7887+ "resolved": "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz",
7888+ "integrity": "sha1-bWHeldkd/Km5oCCJrThL/49it3E=",
7889+ "dev": true
7890+ }
7891 }
7892 },
7893- "nice-try": {
7894- "version": "1.0.5",
7895- "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz",
7896- "integrity": "sha512-1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==",
7897+ "upath": {
7898+ "version": "1.2.0",
7899+ "resolved": "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz",
7900+ "integrity": "sha512-aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==",
7901 "dev": true
7902 },
7903- "node-elm-compiler": {
7904- "version": "5.0.4",
7905- "resolved": "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz",
7906- "integrity": "sha512-VQsT8QSierYGkHzRed+b4MnccQVF1+qPHunE8jBoU7jD6YpuRqCDPzEoC2zfyEJS80qVnlMZrqobLnyjzX9lJg==",
7907+ "uri-js": {
7908+ "version": "4.2.2",
7909+ "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz",
7910+ "integrity": "sha512-KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==",
7911+ "requires": {
7912+ "punycode": "^2.1.0"
7913+ }
7914+ },
7915+ "urix": {
7916+ "version": "0.1.0",
7917+ "resolved": "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz",
7918+ "integrity": "sha1-2pN/emLiH+wf0Y1Js1wpNQZ6bHI=",
7919+ "dev": true
7920+ },
7921+ "url": {
7922+ "version": "0.11.0",
7923+ "resolved": "https://registry.npmjs.org/url/-/url-0.11.0.tgz",
7924+ "integrity": "sha1-ODjpfPxgUh63PFJajlW/3Z4uKPE=",
7925 "dev": true,
7926 "requires": {
7927- "cross-spawn": "6.0.5",
7928- "find-elm-dependencies": "2.0.2",
7929- "lodash": "4.17.15",
7930- "temp": "^0.9.0"
7931+ "punycode": "1.3.2",
7932+ "querystring": "0.2.0"
7933+ },
7934+ "dependencies": {
7935+ "punycode": {
7936+ "version": "1.3.2",
7937+ "resolved": "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz",
7938+ "integrity": "sha1-llOgNvt8HuQjQvIyXM7v6jkmxI0=",
7939+ "dev": true
7940+ }
7941 }
7942 },
7943- "once": {
7944- "version": "1.4.0",
7945- "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz",
7946- "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=",
7947+ "use": {
7948+ "version": "3.1.1",
7949+ "resolved": "https://registry.npmjs.org/use/-/use-3.1.1.tgz",
7950+ "integrity": "sha512-cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==",
7951+ "dev": true
7952+ },
7953+ "util": {
7954+ "version": "0.11.1",
7955+ "resolved": "https://registry.npmjs.org/util/-/util-0.11.1.tgz",
7956+ "integrity": "sha512-HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==",
7957 "dev": true,
7958 "requires": {
7959- "wrappy": "1"
7960+ "inherits": "2.0.3"
7961+ },
7962+ "dependencies": {
7963+ "inherits": {
7964+ "version": "2.0.3",
7965+ "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz",
7966+ "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=",
7967+ "dev": true
7968+ }
7969 }
7970 },
7971- "path-is-absolute": {
7972+ "util-deprecate": {
7973+ "version": "1.0.2",
7974+ "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
7975+ "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=",
7976+ "dev": true
7977+ },
7978+ "util.promisify": {
7979 "version": "1.0.1",
7980- "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz",
7981- "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=",
7982+ "resolved": "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz",
7983+ "integrity": "sha512-g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==",
7984+ "dev": true,
7985+ "requires": {
7986+ "define-properties": "^1.1.3",
7987+ "es-abstract": "^1.17.2",
7988+ "has-symbols": "^1.0.1",
7989+ "object.getownpropertydescriptors": "^2.1.0"
7990+ }
7991+ },
7992+ "uuid": {
7993+ "version": "3.4.0",
7994+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz",
7995+ "integrity": "sha512-HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A=="
7996+ },
7997+ "v8-compile-cache": {
7998+ "version": "2.1.0",
7999+ "resolved": "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz",
8000+ "integrity": "sha512-usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==",
8001 "dev": true
8002 },
8003- "path-key": {
8004- "version": "2.0.1",
8005- "resolved": "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz",
8006- "integrity": "sha1-QRyttXTFoUDTpLGRDUDYDMn0C0A=",
8007+ "vendors": {
8008+ "version": "1.0.4",
8009+ "resolved": "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz",
8010+ "integrity": "sha512-/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==",
8011 "dev": true
8012 },
8013- "rimraf": {
8014- "version": "2.6.3",
8015- "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz",
8016- "integrity": "sha512-mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==",
8017+ "verror": {
8018+ "version": "1.10.0",
8019+ "resolved": "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz",
8020+ "integrity": "sha1-OhBcoXBTr1XW4nDB+CiGguGNpAA=",
8021+ "requires": {
8022+ "assert-plus": "^1.0.0",
8023+ "core-util-is": "1.0.2",
8024+ "extsprintf": "^1.2.0"
8025+ }
8026+ },
8027+ "vlq": {
8028+ "version": "0.2.3",
8029+ "resolved": "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz",
8030+ "integrity": "sha512-DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==",
8031+ "dev": true
8032+ },
8033+ "vm-browserify": {
8034+ "version": "1.1.2",
8035+ "resolved": "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz",
8036+ "integrity": "sha512-2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==",
8037+ "dev": true
8038+ },
8039+ "w3c-hr-time": {
8040+ "version": "1.0.2",
8041+ "resolved": "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz",
8042+ "integrity": "sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==",
8043 "dev": true,
8044 "requires": {
8045- "glob": "^7.1.3"
8046+ "browser-process-hrtime": "^1.0.0"
8047 }
8048 },
8049- "semver": {
8050- "version": "5.7.1",
8051- "resolved": "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz",
8052- "integrity": "sha512-sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==",
8053+ "w3c-xmlserializer": {
8054+ "version": "1.1.2",
8055+ "resolved": "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz",
8056+ "integrity": "sha512-p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==",
8057+ "dev": true,
8058+ "requires": {
8059+ "domexception": "^1.0.1",
8060+ "webidl-conversions": "^4.0.2",
8061+ "xml-name-validator": "^3.0.0"
8062+ }
8063+ },
8064+ "wcwidth": {
8065+ "version": "1.0.1",
8066+ "resolved": "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz",
8067+ "integrity": "sha1-8LDc+RW8X/FSivrbLA4XtTLaL+g=",
8068+ "dev": true,
8069+ "requires": {
8070+ "defaults": "^1.0.3"
8071+ }
8072+ },
8073+ "webidl-conversions": {
8074+ "version": "4.0.2",
8075+ "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz",
8076+ "integrity": "sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==",
8077 "dev": true
8078 },
8079- "shebang-command": {
8080- "version": "1.2.0",
8081- "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz",
8082- "integrity": "sha1-RKrGW2lbAzmJaMOfNj/uXer98eo=",
8083+ "whatwg-encoding": {
8084+ "version": "1.0.5",
8085+ "resolved": "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz",
8086+ "integrity": "sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==",
8087 "dev": true,
8088 "requires": {
8089- "shebang-regex": "^1.0.0"
8090+ "iconv-lite": "0.4.24"
8091 }
8092 },
8093- "shebang-regex": {
8094- "version": "1.0.0",
8095- "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz",
8096- "integrity": "sha1-2kL0l0DAtC2yypcoVxyxkMmO/qM=",
8097+ "whatwg-mimetype": {
8098+ "version": "2.3.0",
8099+ "resolved": "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz",
8100+ "integrity": "sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==",
8101 "dev": true
8102 },
8103- "temp": {
8104- "version": "0.9.0",
8105- "resolved": "https://registry.npmjs.org/temp/-/temp-0.9.0.tgz",
8106- "integrity": "sha512-YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ==",
8107+ "whatwg-url": {
8108+ "version": "7.1.0",
8109+ "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz",
8110+ "integrity": "sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==",
8111 "dev": true,
8112 "requires": {
8113- "rimraf": "~2.6.2"
8114+ "lodash.sortby": "^4.7.0",
8115+ "tr46": "^1.0.1",
8116+ "webidl-conversions": "^4.0.2"
8117 }
8118 },
8119 "which": {
8120@@ -205,11 +7972,164 @@
8121 "isexe": "^2.0.0"
8122 }
8123 },
8124+ "which-module": {
8125+ "version": "2.0.0",
8126+ "resolved": "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz",
8127+ "integrity": "sha1-2e8H3Od7mQK4o6j6SzHD4/fm6Ho=",
8128+ "dev": true
8129+ },
8130+ "word-wrap": {
8131+ "version": "1.2.3",
8132+ "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz",
8133+ "integrity": "sha512-Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==",
8134+ "dev": true
8135+ },
8136+ "wrap-ansi": {
8137+ "version": "5.1.0",
8138+ "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz",
8139+ "integrity": "sha512-QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==",
8140+ "dev": true,
8141+ "requires": {
8142+ "ansi-styles": "^3.2.0",
8143+ "string-width": "^3.0.0",
8144+ "strip-ansi": "^5.0.0"
8145+ },
8146+ "dependencies": {
8147+ "ansi-regex": {
8148+ "version": "4.1.0",
8149+ "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz",
8150+ "integrity": "sha512-1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==",
8151+ "dev": true
8152+ },
8153+ "strip-ansi": {
8154+ "version": "5.2.0",
8155+ "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz",
8156+ "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==",
8157+ "dev": true,
8158+ "requires": {
8159+ "ansi-regex": "^4.1.0"
8160+ }
8161+ }
8162+ }
8163+ },
8164 "wrappy": {
8165 "version": "1.0.2",
8166 "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz",
8167 "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=",
8168 "dev": true
8169+ },
8170+ "ws": {
8171+ "version": "5.2.2",
8172+ "resolved": "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz",
8173+ "integrity": "sha512-jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==",
8174+ "dev": true,
8175+ "requires": {
8176+ "async-limiter": "~1.0.0"
8177+ }
8178+ },
8179+ "xml-name-validator": {
8180+ "version": "3.0.0",
8181+ "resolved": "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz",
8182+ "integrity": "sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==",
8183+ "dev": true
8184+ },
8185+ "xmlchars": {
8186+ "version": "2.2.0",
8187+ "resolved": "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz",
8188+ "integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
8189+ "dev": true
8190+ },
8191+ "xtend": {
8192+ "version": "4.0.2",
8193+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
8194+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
8195+ "dev": true
8196+ },
8197+ "y18n": {
8198+ "version": "4.0.0",
8199+ "resolved": "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz",
8200+ "integrity": "sha512-r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==",
8201+ "dev": true
8202+ },
8203+ "yallist": {
8204+ "version": "2.1.2",
8205+ "resolved": "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz",
8206+ "integrity": "sha1-HBH5IY8HYImkfdUS+TxmmaaoHVI=",
8207+ "dev": true
8208+ },
8209+ "yargs": {
8210+ "version": "14.2.3",
8211+ "resolved": "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz",
8212+ "integrity": "sha512-ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==",
8213+ "dev": true,
8214+ "requires": {
8215+ "cliui": "^5.0.0",
8216+ "decamelize": "^1.2.0",
8217+ "find-up": "^3.0.0",
8218+ "get-caller-file": "^2.0.1",
8219+ "require-directory": "^2.1.1",
8220+ "require-main-filename": "^2.0.0",
8221+ "set-blocking": "^2.0.0",
8222+ "string-width": "^3.0.0",
8223+ "which-module": "^2.0.0",
8224+ "y18n": "^4.0.0",
8225+ "yargs-parser": "^15.0.1"
8226+ },
8227+ "dependencies": {
8228+ "find-up": {
8229+ "version": "3.0.0",
8230+ "resolved": "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz",
8231+ "integrity": "sha512-1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==",
8232+ "dev": true,
8233+ "requires": {
8234+ "locate-path": "^3.0.0"
8235+ }
8236+ },
8237+ "locate-path": {
8238+ "version": "3.0.0",
8239+ "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz",
8240+ "integrity": "sha512-7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==",
8241+ "dev": true,
8242+ "requires": {
8243+ "p-locate": "^3.0.0",
8244+ "path-exists": "^3.0.0"
8245+ }
8246+ },
8247+ "p-limit": {
8248+ "version": "2.3.0",
8249+ "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz",
8250+ "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==",
8251+ "dev": true,
8252+ "requires": {
8253+ "p-try": "^2.0.0"
8254+ }
8255+ },
8256+ "p-locate": {
8257+ "version": "3.0.0",
8258+ "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz",
8259+ "integrity": "sha512-x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==",
8260+ "dev": true,
8261+ "requires": {
8262+ "p-limit": "^2.0.0"
8263+ }
8264+ },
8265+ "p-try": {
8266+ "version": "2.2.0",
8267+ "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz",
8268+ "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==",
8269+ "dev": true
8270+ }
8271+ }
8272+ },
8273+ "yargs-parser": {
8274+ "version": "15.0.1",
8275+ "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz",
8276+ "integrity": "sha512-0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==",
8277+ "dev": true,
8278+ "requires": {
8279+ "camelcase": "^5.0.0",
8280+ "decamelize": "^1.2.0"
8281+ }
8282 }
8283 }
8284 }
8285diff --git a/src/Api.elm b/src/Api.elm
8286index 82e5f6c..bd8c516 100644
8287--- a/src/Api.elm
8288+++ b/src/Api.elm
8289@@ -36,7 +36,7 @@ init url =
8290 { url | host = "api.codenamesgreen.com", path = "", query = Nothing, fragment = Nothing }
8291
8292 _ ->
8293- { url | host = "api." ++ url.host, path = "", query = Nothing, fragment = Nothing }
8294+ { url | host = url.host, path = "/api", query = Nothing, fragment = Nothing }
8295 in
8296 { baseUrl = baseUrl }
8297
8298@@ -80,7 +80,7 @@ type alias Index =
8299
8300 endpointUrl : Url.Url -> String -> String
8301 endpointUrl baseUrl path =
8302- { baseUrl | path = path }
8303+ { baseUrl | path = baseUrl.path ++ path }
8304 |> Url.toString
8305
8306
diff --git a/systems/eldiron/websites/games/codenames/default.nix b/systems/eldiron/websites/games/codenames/default.nix
new file mode 100644
index 0000000..7f09cc3
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/default.nix
@@ -0,0 +1,76 @@
1{ config, lib, pkgs, ... }:
2let
3 greenapid = pkgs.callPackage ./greenapid.nix {};
4 frontend = pkgs.callPackage ./frontend.nix { nodeEnv = pkgs.callPackage pkgs.mylibs.nodeEnv {}; };
5 wordlists = pkgs.runCommand "wordlists" {} ''
6 mkdir -p $out
7 cp -r ${./wordlists} $out/wordlists
8 '';
9 cfg = config.myServices.websites.games.codenames;
10in
11{
12 options.myServices.websites.games.codenames.enable = lib.mkEnableOption "Enable Codenames game";
13 config = lib.mkIf cfg.enable {
14 myServices.dns.zones."immae.eu".subdomains.games.subdomains.codenames = with config.myServices.dns.helpers;
15 ips servers.eldiron.ips.main;
16
17 myServices.chatonsProperties.services.codenames = {
18 file.datetime = "2022-08-27T14:08:00";
19 service = {
20 name = "Codenames Green";
21 description = "Co-op codenames app";
22 website = "https://codenames.games.immae.eu/";
23 logo = "https://codenames.games.immae.eu/images/apple-touch-icon.png";
24 status.level = "OK";
25 status.description = "OK";
26 registration."" = ["NONE"];
27 registration.load = "OPEN";
28 install.type = "PACKAGE";
29 };
30 software = {
31 name = "Codenames Green";
32 website = "https://www.codenamesgreen.com/";
33 license.url = "https://github.com/jbowens/codenamesgreen/blob/master/package.json";
34 license.name = "MIT";
35 version = greenapid.version;
36 source.url = "https://github.com/jbowens/codenamesgreen";
37 };
38 };
39 systemd.services.codenames_api = {
40 description = "Api for codenames game";
41 wantedBy = [ "multi-user.target" ];
42 script = "${greenapid}/bin/greenapid";
43 postStart = ''
44 sleep 5;
45 chown :wwwrun /run/codenamesgreen/socket.sock
46 chmod g+w /run/codenamesgreen/socket.sock
47 '';
48 serviceConfig = {
49 User = "codenames";
50 DynamicUser = true;
51 SupplementaryGroups = [ "wwwrun" ];
52 Type = "simple";
53 RuntimeDirectory = "codenamesgreen";
54 WorkingDirectory = builtins.toString wordlists;
55 };
56 };
57
58 security.acme.certs.games.domain = "games.immae.eu";
59 security.acme.certs.games.extraDomainNames = [ "codenames.games.immae.eu" ];
60 services.websites.env.tools.vhostConfs.games_codenames = {
61 certName = "games";
62 hosts = [ "codenames.games.immae.eu" ];
63 root = frontend;
64 extraConfig = [
65 ''
66 ProxyPass /api/ unix:///run/codenamesgreen/socket.sock|http://codenames.games.immae.eu/
67 ProxyPassReverse /api/ unix:///run/codenamesgreen/socket.sock|http://codenames.games.immae.eu/
68
69 <Directory ${frontend}>
70 FallbackResource index.html
71 </Directory>
72 ''
73 ];
74 };
75 };
76}
diff --git a/systems/eldiron/websites/games/codenames/deps.nix b/systems/eldiron/websites/games/codenames/deps.nix
new file mode 100644
index 0000000..fddec2e
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/deps.nix
@@ -0,0 +1,11 @@
1[
2 {
3 goPackagePath = "github.com/jbowens/dictionary";
4 fetch = {
5 type = "git";
6 url = "https://github.com/jbowens/dictionary";
7 rev = "229cf68df1a675e7a2462c4028d7df4abfd98854";
8 sha256 = "0gyg3xcx4xqx6w8id2dq5s280mdfhs6yc9flg2jbj8jff040s28w";
9 };
10 }
11]
diff --git a/systems/eldiron/websites/games/codenames/elm-srcs.nix b/systems/eldiron/websites/games/codenames/elm-srcs.nix
new file mode 100644
index 0000000..031e7ff
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/elm-srcs.nix
@@ -0,0 +1,77 @@
1{
2
3 "elm/json" = {
4 sha256 = "0kjwrz195z84kwywaxhhlnpl3p251qlbm5iz6byd6jky2crmyqyh";
5 version = "1.1.3";
6 };
7
8 "perzanko/elm-loading" = {
9 sha256 = "0fs7ly4jib4gwhh157g91hgjryqja096i6jhbsq7qb4k4r3c5l80";
10 version = "2.0.4";
11 };
12
13 "elm/html" = {
14 sha256 = "1n3gpzmpqqdsldys4ipgyl1zacn0kbpc3g4v3hdpiyfjlgh8bf3k";
15 version = "1.0.0";
16 };
17
18 "elm/browser" = {
19 sha256 = "1zlmx672glg7fdgkvh5jm47y85pv7pdfr5mkhg6x7ar6k000vyka";
20 version = "1.0.1";
21 };
22
23 "elm/core" = {
24 sha256 = "1l0qdbczw91kzz8sx5d5zwz9x662bspy7p21dsr3f2rigxiix2as";
25 version = "1.0.2";
26 };
27
28 "elm/url" = {
29 sha256 = "0av8x5syid40sgpl5vd7pry2rq0q4pga28b4yykn9gd9v12rs3l4";
30 version = "1.0.0";
31 };
32
33 "elm/http" = {
34 sha256 = "008bs76mnp48b4dw8qwjj4fyvzbxvlrl4xpa2qh1gg2kfwyw56v1";
35 version = "2.0.0";
36 };
37
38 "elm/bytes" = {
39 sha256 = "02ywbf52akvxclpxwj9n04jydajcbsbcbsnjs53yjc5lwck3abwj";
40 version = "1.0.8";
41 };
42
43 "elm/file" = {
44 sha256 = "1rljcb41dl97myidyjih2yliyzddkr2m7n74x7gg46rcw4jl0ny8";
45 version = "1.0.5";
46 };
47
48 "rtfeldman/elm-hex" = {
49 sha256 = "1y0aa16asvwdqmgbskh5iba6psp43lkcjjw9mgzj3gsrg33lp00d";
50 version = "1.0.0";
51 };
52
53 "rtfeldman/elm-css" = {
54 sha256 = "0nxiyxyw3kw55whkpwhrcgc0dr6a8zlm2nqvsaqdw6mzkykg0ba6";
55 version = "16.1.0";
56 };
57
58 "elm/time" = {
59 sha256 = "0vch7i86vn0x8b850w1p69vplll1bnbkp8s383z7pinyg94cm2z1";
60 version = "1.0.0";
61 };
62
63 "elm/virtual-dom" = {
64 sha256 = "0q1v5gi4g336bzz1lgwpn5b1639lrn63d8y6k6pimcyismp2i1yg";
65 version = "1.0.2";
66 };
67
68 "elm-explorations/test" = {
69 sha256 = "0rpynrm9irgzyynd1bws0xspww5lnwv7w7998750jb8kcrw39h0n";
70 version = "1.0.0";
71 };
72
73 "elm/random" = {
74 sha256 = "138n2455wdjwa657w6sjq18wx2r0k60ibpc4frhbqr50sncxrfdl";
75 version = "1.0.0";
76 };
77}
diff --git a/systems/eldiron/websites/games/codenames/frontend.nix b/systems/eldiron/websites/games/codenames/frontend.nix
new file mode 100644
index 0000000..0f29070
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/frontend.nix
@@ -0,0 +1,22 @@
1{ callPackage, runCommand, nodejs, utillinux, nodeEnv, nodePackages, elmPackages }:
2let
3 codenamesgreen_packages = callPackage ./node-packages.nix { inherit nodeEnv; };
4in
5runCommand "frontend" {
6 buildInputs = [
7 nodejs utillinux nodePackages.parcel-bundler elmPackages.elm
8 ];
9} ''
10 cp -a ${codenamesgreen_packages.package}/lib/node_modules/codenamesgreen .
11 chmod -R u+w codenamesgreen
12 cd codenamesgreen
13 ${elmPackages.fetchElmDeps {
14 elmPackages = import ./elm-srcs.nix;
15 registryDat = ./registry.dat;
16 elmVersion = elmPackages.elm.version;
17 }}
18 npx parcel build src/index.html
19 cp -a dist $out
20 cp -R src/images $out
21 cp src/robots.txt $out
22''
diff --git a/systems/eldiron/websites/games/codenames/greenapid.nix b/systems/eldiron/websites/games/codenames/greenapid.nix
new file mode 100644
index 0000000..52bda3b
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/greenapid.nix
@@ -0,0 +1,18 @@
1{ buildGoPackage, fetchFromGitHub, socket ? "/run/codenamesgreen/socket.sock" }:
2buildGoPackage rec {
3 pname = "greenapid";
4 version = "master-6d014d0";
5
6 goPackagePath = "github.com/jbowens/codenamesgreen";
7 subPackages = [ "cmd/greenapid" ];
8
9 src = fetchFromGitHub {
10 owner = "jbowens";
11 repo = "codenamesgreen";
12 rev = "6d014d0df14bee72495e01f12885ef31cba3bd6b";
13 sha256 = "0bkaf52rnjw792q0755in4k5jbcrmgq06cl03fdl6zdr8kq2mhm0";
14 };
15
16 patches = [ ./greenapid.patch ];
17 goDeps = ./deps.nix;
18}
diff --git a/systems/eldiron/websites/games/codenames/greenapid.patch b/systems/eldiron/websites/games/codenames/greenapid.patch
new file mode 100644
index 0000000..21a9fad
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/greenapid.patch
@@ -0,0 +1,39 @@
1diff --git a/cmd/greenapid/main.go b/cmd/greenapid/main.go
2index 86499e9..1589323 100644
3--- a/cmd/greenapid/main.go
4+++ b/cmd/greenapid/main.go
5@@ -1,6 +1,7 @@
6 package main
7
8 import (
9+ "net"
10 "net/http"
11
12 "github.com/jbowens/codenamesgreen/gameapi"
13@@ -13,6 +14,12 @@ func main() {
14 }
15
16 h := gameapi.Handler(wordLists)
17- err = http.ListenAndServe(":8080", h)
18+ server := &http.Server{Handler: h}
19+ ln, err := net.Listen("unix", "/run/codenamesgreen/socket.sock")
20+ if err != nil {
21+ panic(err)
22+ }
23+
24+ err = server.Serve(ln)
25 panic(err)
26 }
27diff --git a/gameapi/handler.go b/gameapi/handler.go
28index d67cf94..108e7e1 100644
29--- a/gameapi/handler.go
30+++ b/gameapi/handler.go
31@@ -101,7 +101,7 @@ func (h *handler) handleIndex(rw http.ResponseWriter, req *http.Request) {
32 for {
33 w1 := strings.ToLower(h.allWords[h.rand.Int63n(int64(len(h.allWords)))])
34 w2 := strings.ToLower(h.allWords[h.rand.Int63n(int64(len(h.allWords)))])
35- id := fmt.Sprintf("%s-%s", w1, w2)
36+ id = fmt.Sprintf("%s-%s", w1, w2)
37 if _, ok := h.games[id]; !ok {
38 break
39 }
diff --git a/systems/eldiron/websites/games/codenames/immae-assets.patch b/systems/eldiron/websites/games/codenames/immae-assets.patch
new file mode 100644
index 0000000..c53ab97
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/immae-assets.patch
@@ -0,0 +1,15 @@
1diff --git a/src/index.html b/src/index.html
2index 2559a37..84a0d64 100644
3--- a/src/index.html
4+++ b/src/index.html
5@@ -6,8 +6,8 @@
6 <meta name="description" content="Online cooperative codenames game. Play with two or more players.">
7 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0" />
8 <meta name="theme-color" content="#ffffff">
9- <link href="https://fonts.googleapis.com/css?family=Exo+2&display=swap" rel="stylesheet">
10- <link href="https://unpkg.com/ionicons@4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet">
11+ <link href="https://assets.immae.eu/fonts/Exo2_swap/font.css" rel="stylesheet">
12+ <link href="https://assets.immae.eu/ionicons/4.5.10-0/dist/css/ionicons.min.css" rel="stylesheet">
13 <link rel="manifest" href="/codenames.manifest">
14 <link rel="apple-touch-icon" sizes="180x180" href="/images/apple-touch-icon.png">
15 <link rel="icon" type="image/png" sizes="32x32" href="/images/favicon-32x32.png">
diff --git a/systems/eldiron/websites/games/codenames/node-packages.nix b/systems/eldiron/websites/games/codenames/node-packages.nix
new file mode 100644
index 0000000..1fb2db3
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/node-packages.nix
@@ -0,0 +1,7622 @@
1# This file has been generated by node2nix 1.8.0. Do not edit!
2
3{nodeEnv, fetchurl, fetchgit, fetchFromGitHub, runCommand, globalBuildInputs ? []}:
4
5let
6 sources = {
7 "@babel/code-frame-7.0.0" = {
8 name = "_at_babel_slash_code-frame";
9 packageName = "@babel/code-frame";
10 version = "7.0.0";
11 src = fetchurl {
12 url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz";
13 sha512 = "OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==";
14 };
15 };
16 "@babel/code-frame-7.8.3" = {
17 name = "_at_babel_slash_code-frame";
18 packageName = "@babel/code-frame";
19 version = "7.8.3";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.8.3.tgz";
22 sha512 = "a9gxpmdXtZEInkCSHUJDLHZVBgb1QS0jhss4cPP93EW7s+uC5bikET2twEF3KV+7rDblJcmNvTR7VJejqd2C2g==";
23 };
24 };
25 "@babel/core-7.3.4" = {
26 name = "_at_babel_slash_core";
27 packageName = "@babel/core";
28 version = "7.3.4";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@babel/core/-/core-7.3.4.tgz";
31 sha512 = "jRsuseXBo9pN197KnDwhhaaBzyZr2oIcLHHTt2oDdQrej5Qp57dCCJafWx5ivU8/alEYDpssYqv1MUqcxwQlrA==";
32 };
33 };
34 "@babel/generator-7.3.4" = {
35 name = "_at_babel_slash_generator";
36 packageName = "@babel/generator";
37 version = "7.3.4";
38 src = fetchurl {
39 url = "https://registry.npmjs.org/@babel/generator/-/generator-7.3.4.tgz";
40 sha512 = "8EXhHRFqlVVWXPezBW5keTiQi/rJMQTg/Y9uVCEZ0CAF3PKtCCaVRnp64Ii1ujhkoDhhF1fVsImoN4yJ2uz4Wg==";
41 };
42 };
43 "@babel/generator-7.9.5" = {
44 name = "_at_babel_slash_generator";
45 packageName = "@babel/generator";
46 version = "7.9.5";
47 src = fetchurl {
48 url = "https://registry.npmjs.org/@babel/generator/-/generator-7.9.5.tgz";
49 sha512 = "GbNIxVB3ZJe3tLeDm1HSn2AhuD/mVcyLDpgtLXa5tplmWrJdF/elxB56XNqCuD6szyNkDi6wuoKXln3QeBmCHQ==";
50 };
51 };
52 "@babel/helper-annotate-as-pure-7.8.3" = {
53 name = "_at_babel_slash_helper-annotate-as-pure";
54 packageName = "@babel/helper-annotate-as-pure";
55 version = "7.8.3";
56 src = fetchurl {
57 url = "https://registry.npmjs.org/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.8.3.tgz";
58 sha512 = "6o+mJrZBxOoEX77Ezv9zwW7WV8DdluouRKNY/IR5u/YTMuKHgugHOzYWlYvYLpLA9nPsQCAAASpCIbjI9Mv+Uw==";
59 };
60 };
61 "@babel/helper-builder-binary-assignment-operator-visitor-7.8.3" = {
62 name = "_at_babel_slash_helper-builder-binary-assignment-operator-visitor";
63 packageName = "@babel/helper-builder-binary-assignment-operator-visitor";
64 version = "7.8.3";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.8.3.tgz";
67 sha512 = "5eFOm2SyFPK4Rh3XMMRDjN7lBH0orh3ss0g3rTYZnBQ+r6YPj7lgDyCvPphynHvUrobJmeMignBr6Acw9mAPlw==";
68 };
69 };
70 "@babel/helper-builder-react-jsx-7.9.0" = {
71 name = "_at_babel_slash_helper-builder-react-jsx";
72 packageName = "@babel/helper-builder-react-jsx";
73 version = "7.9.0";
74 src = fetchurl {
75 url = "https://registry.npmjs.org/@babel/helper-builder-react-jsx/-/helper-builder-react-jsx-7.9.0.tgz";
76 sha512 = "weiIo4gaoGgnhff54GQ3P5wsUQmnSwpkvU0r6ZHq6TzoSzKy4JxHEgnxNytaKbov2a9z/CVNyzliuCOUPEX3Jw==";
77 };
78 };
79 "@babel/helper-create-regexp-features-plugin-7.8.8" = {
80 name = "_at_babel_slash_helper-create-regexp-features-plugin";
81 packageName = "@babel/helper-create-regexp-features-plugin";
82 version = "7.8.8";
83 src = fetchurl {
84 url = "https://registry.npmjs.org/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.8.8.tgz";
85 sha512 = "LYVPdwkrQEiX9+1R29Ld/wTrmQu1SSKYnuOk3g0CkcZMA1p0gsNxJFj/3gBdaJ7Cg0Fnek5z0DsMULePP7Lrqg==";
86 };
87 };
88 "@babel/helper-define-map-7.8.3" = {
89 name = "_at_babel_slash_helper-define-map";
90 packageName = "@babel/helper-define-map";
91 version = "7.8.3";
92 src = fetchurl {
93 url = "https://registry.npmjs.org/@babel/helper-define-map/-/helper-define-map-7.8.3.tgz";
94 sha512 = "PoeBYtxoZGtct3md6xZOCWPcKuMuk3IHhgxsRRNtnNShebf4C8YonTSblsK4tvDbm+eJAw2HAPOfCr+Q/YRG/g==";
95 };
96 };
97 "@babel/helper-explode-assignable-expression-7.8.3" = {
98 name = "_at_babel_slash_helper-explode-assignable-expression";
99 packageName = "@babel/helper-explode-assignable-expression";
100 version = "7.8.3";
101 src = fetchurl {
102 url = "https://registry.npmjs.org/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.8.3.tgz";
103 sha512 = "N+8eW86/Kj147bO9G2uclsg5pwfs/fqqY5rwgIL7eTBklgXjcOJ3btzS5iM6AitJcftnY7pm2lGsrJVYLGjzIw==";
104 };
105 };
106 "@babel/helper-function-name-7.9.5" = {
107 name = "_at_babel_slash_helper-function-name";
108 packageName = "@babel/helper-function-name";
109 version = "7.9.5";
110 src = fetchurl {
111 url = "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.9.5.tgz";
112 sha512 = "JVcQZeXM59Cd1qanDUxv9fgJpt3NeKUaqBqUEvfmQ+BCOKq2xUgaWZW2hr0dkbyJgezYuplEoh5knmrnS68efw==";
113 };
114 };
115 "@babel/helper-get-function-arity-7.8.3" = {
116 name = "_at_babel_slash_helper-get-function-arity";
117 packageName = "@babel/helper-get-function-arity";
118 version = "7.8.3";
119 src = fetchurl {
120 url = "https://registry.npmjs.org/@babel/helper-get-function-arity/-/helper-get-function-arity-7.8.3.tgz";
121 sha512 = "FVDR+Gd9iLjUMY1fzE2SR0IuaJToR4RkCDARVfsBBPSP53GEqSFjD8gNyxg246VUyc/ALRxFaAK8rVG7UT7xRA==";
122 };
123 };
124 "@babel/helper-hoist-variables-7.8.3" = {
125 name = "_at_babel_slash_helper-hoist-variables";
126 packageName = "@babel/helper-hoist-variables";
127 version = "7.8.3";
128 src = fetchurl {
129 url = "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.8.3.tgz";
130 sha512 = "ky1JLOjcDUtSc+xkt0xhYff7Z6ILTAHKmZLHPxAhOP0Nd77O+3nCsd6uSVYur6nJnCI029CrNbYlc0LoPfAPQg==";
131 };
132 };
133 "@babel/helper-member-expression-to-functions-7.8.3" = {
134 name = "_at_babel_slash_helper-member-expression-to-functions";
135 packageName = "@babel/helper-member-expression-to-functions";
136 version = "7.8.3";
137 src = fetchurl {
138 url = "https://registry.npmjs.org/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.8.3.tgz";
139 sha512 = "fO4Egq88utkQFjbPrSHGmGLFqmrshs11d46WI+WZDESt7Wu7wN2G2Iu+NMMZJFDOVRHAMIkB5SNh30NtwCA7RA==";
140 };
141 };
142 "@babel/helper-module-imports-7.8.3" = {
143 name = "_at_babel_slash_helper-module-imports";
144 packageName = "@babel/helper-module-imports";
145 version = "7.8.3";
146 src = fetchurl {
147 url = "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.8.3.tgz";
148 sha512 = "R0Bx3jippsbAEtzkpZ/6FIiuzOURPcMjHp+Z6xPe6DtApDJx+w7UYyOLanZqO8+wKR9G10s/FmHXvxaMd9s6Kg==";
149 };
150 };
151 "@babel/helper-module-transforms-7.9.0" = {
152 name = "_at_babel_slash_helper-module-transforms";
153 packageName = "@babel/helper-module-transforms";
154 version = "7.9.0";
155 src = fetchurl {
156 url = "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.9.0.tgz";
157 sha512 = "0FvKyu0gpPfIQ8EkxlrAydOWROdHpBmiCiRwLkUiBGhCUPRRbVD2/tm3sFr/c/GWFrQ/ffutGUAnx7V0FzT2wA==";
158 };
159 };
160 "@babel/helper-optimise-call-expression-7.8.3" = {
161 name = "_at_babel_slash_helper-optimise-call-expression";
162 packageName = "@babel/helper-optimise-call-expression";
163 version = "7.8.3";
164 src = fetchurl {
165 url = "https://registry.npmjs.org/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.8.3.tgz";
166 sha512 = "Kag20n86cbO2AvHca6EJsvqAd82gc6VMGule4HwebwMlwkpXuVqrNRj6CkCV2sKxgi9MyAUnZVnZ6lJ1/vKhHQ==";
167 };
168 };
169 "@babel/helper-plugin-utils-7.8.3" = {
170 name = "_at_babel_slash_helper-plugin-utils";
171 packageName = "@babel/helper-plugin-utils";
172 version = "7.8.3";
173 src = fetchurl {
174 url = "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.8.3.tgz";
175 sha512 = "j+fq49Xds2smCUNYmEHF9kGNkhbet6yVIBp4e6oeQpH1RUs/Ir06xUKzDjDkGcaaokPiTNs2JBWHjaE4csUkZQ==";
176 };
177 };
178 "@babel/helper-regex-7.8.3" = {
179 name = "_at_babel_slash_helper-regex";
180 packageName = "@babel/helper-regex";
181 version = "7.8.3";
182 src = fetchurl {
183 url = "https://registry.npmjs.org/@babel/helper-regex/-/helper-regex-7.8.3.tgz";
184 sha512 = "BWt0QtYv/cg/NecOAZMdcn/waj/5P26DR4mVLXfFtDokSR6fyuG0Pj+e2FqtSME+MqED1khnSMulkmGl8qWiUQ==";
185 };
186 };
187 "@babel/helper-remap-async-to-generator-7.8.3" = {
188 name = "_at_babel_slash_helper-remap-async-to-generator";
189 packageName = "@babel/helper-remap-async-to-generator";
190 version = "7.8.3";
191 src = fetchurl {
192 url = "https://registry.npmjs.org/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.8.3.tgz";
193 sha512 = "kgwDmw4fCg7AVgS4DukQR/roGp+jP+XluJE5hsRZwxCYGg+Rv9wSGErDWhlI90FODdYfd4xG4AQRiMDjjN0GzA==";
194 };
195 };
196 "@babel/helper-replace-supers-7.8.6" = {
197 name = "_at_babel_slash_helper-replace-supers";
198 packageName = "@babel/helper-replace-supers";
199 version = "7.8.6";
200 src = fetchurl {
201 url = "https://registry.npmjs.org/@babel/helper-replace-supers/-/helper-replace-supers-7.8.6.tgz";
202 sha512 = "PeMArdA4Sv/Wf4zXwBKPqVj7n9UF/xg6slNRtZW84FM7JpE1CbG8B612FyM4cxrf4fMAMGO0kR7voy1ForHHFA==";
203 };
204 };
205 "@babel/helper-simple-access-7.8.3" = {
206 name = "_at_babel_slash_helper-simple-access";
207 packageName = "@babel/helper-simple-access";
208 version = "7.8.3";
209 src = fetchurl {
210 url = "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.8.3.tgz";
211 sha512 = "VNGUDjx5cCWg4vvCTR8qQ7YJYZ+HBjxOgXEl7ounz+4Sn7+LMD3CFrCTEU6/qXKbA2nKg21CwhhBzO0RpRbdCw==";
212 };
213 };
214 "@babel/helper-split-export-declaration-7.8.3" = {
215 name = "_at_babel_slash_helper-split-export-declaration";
216 packageName = "@babel/helper-split-export-declaration";
217 version = "7.8.3";
218 src = fetchurl {
219 url = "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.8.3.tgz";
220 sha512 = "3x3yOeyBhW851hroze7ElzdkeRXQYQbFIb7gLK1WQYsw2GWDay5gAJNw1sWJ0VFP6z5J1whqeXH/WCdCjZv6dA==";
221 };
222 };
223 "@babel/helper-validator-identifier-7.9.5" = {
224 name = "_at_babel_slash_helper-validator-identifier";
225 packageName = "@babel/helper-validator-identifier";
226 version = "7.9.5";
227 src = fetchurl {
228 url = "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.9.5.tgz";
229 sha512 = "/8arLKUFq882w4tWGj9JYzRpAlZgiWUJ+dtteNTDqrRBz9Iguck9Rn3ykuBDoUwh2TO4tSAJlrxDUOXWklJe4g==";
230 };
231 };
232 "@babel/helper-wrap-function-7.8.3" = {
233 name = "_at_babel_slash_helper-wrap-function";
234 packageName = "@babel/helper-wrap-function";
235 version = "7.8.3";
236 src = fetchurl {
237 url = "https://registry.npmjs.org/@babel/helper-wrap-function/-/helper-wrap-function-7.8.3.tgz";
238 sha512 = "LACJrbUET9cQDzb6kG7EeD7+7doC3JNvUgTEQOx2qaO1fKlzE/Bf05qs9w1oXQMmXlPO65lC3Tq9S6gZpTErEQ==";
239 };
240 };
241 "@babel/helpers-7.9.2" = {
242 name = "_at_babel_slash_helpers";
243 packageName = "@babel/helpers";
244 version = "7.9.2";
245 src = fetchurl {
246 url = "https://registry.npmjs.org/@babel/helpers/-/helpers-7.9.2.tgz";
247 sha512 = "JwLvzlXVPjO8eU9c/wF9/zOIN7X6h8DYf7mG4CiFRZRvZNKEF5dQ3H3V+ASkHoIB3mWhatgl5ONhyqHRI6MppA==";
248 };
249 };
250 "@babel/highlight-7.9.0" = {
251 name = "_at_babel_slash_highlight";
252 packageName = "@babel/highlight";
253 version = "7.9.0";
254 src = fetchurl {
255 url = "https://registry.npmjs.org/@babel/highlight/-/highlight-7.9.0.tgz";
256 sha512 = "lJZPilxX7Op3Nv/2cvFdnlepPXDxi29wxteT57Q965oc5R9v86ztx0jfxVrTcBk8C2kcPkkDa2Z4T3ZsPPVWsQ==";
257 };
258 };
259 "@babel/parser-7.3.4" = {
260 name = "_at_babel_slash_parser";
261 packageName = "@babel/parser";
262 version = "7.3.4";
263 src = fetchurl {
264 url = "https://registry.npmjs.org/@babel/parser/-/parser-7.3.4.tgz";
265 sha512 = "tXZCqWtlOOP4wgCp6RjRvLmfuhnqTLy9VHwRochJBCP2nDm27JnnuFEnXFASVyQNHk36jD1tAammsCEEqgscIQ==";
266 };
267 };
268 "@babel/parser-7.9.4" = {
269 name = "_at_babel_slash_parser";
270 packageName = "@babel/parser";
271 version = "7.9.4";
272 src = fetchurl {
273 url = "https://registry.npmjs.org/@babel/parser/-/parser-7.9.4.tgz";
274 sha512 = "bC49otXX6N0/VYhgOMh4gnP26E9xnDZK3TmbNpxYzzz9BQLBosQwfyOe9/cXUU3txYhTzLCbcqd5c8y/OmCjHA==";
275 };
276 };
277 "@babel/plugin-proposal-async-generator-functions-7.8.3" = {
278 name = "_at_babel_slash_plugin-proposal-async-generator-functions";
279 packageName = "@babel/plugin-proposal-async-generator-functions";
280 version = "7.8.3";
281 src = fetchurl {
282 url = "https://registry.npmjs.org/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.8.3.tgz";
283 sha512 = "NZ9zLv848JsV3hs8ryEh7Uaz/0KsmPLqv0+PdkDJL1cJy0K4kOCFa8zc1E3mp+RHPQcpdfb/6GovEsW4VDrOMw==";
284 };
285 };
286 "@babel/plugin-proposal-json-strings-7.8.3" = {
287 name = "_at_babel_slash_plugin-proposal-json-strings";
288 packageName = "@babel/plugin-proposal-json-strings";
289 version = "7.8.3";
290 src = fetchurl {
291 url = "https://registry.npmjs.org/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.8.3.tgz";
292 sha512 = "KGhQNZ3TVCQG/MjRbAUwuH+14y9q0tpxs1nWWs3pbSleRdDro9SAMMDyye8HhY1gqZ7/NqIc8SKhya0wRDgP1Q==";
293 };
294 };
295 "@babel/plugin-proposal-object-rest-spread-7.9.5" = {
296 name = "_at_babel_slash_plugin-proposal-object-rest-spread";
297 packageName = "@babel/plugin-proposal-object-rest-spread";
298 version = "7.9.5";
299 src = fetchurl {
300 url = "https://registry.npmjs.org/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.9.5.tgz";
301 sha512 = "VP2oXvAf7KCYTthbUHwBlewbl1Iq059f6seJGsxMizaCdgHIeczOr7FBqELhSqfkIl04Fi8okzWzl63UKbQmmg==";
302 };
303 };
304 "@babel/plugin-proposal-optional-catch-binding-7.8.3" = {
305 name = "_at_babel_slash_plugin-proposal-optional-catch-binding";
306 packageName = "@babel/plugin-proposal-optional-catch-binding";
307 version = "7.8.3";
308 src = fetchurl {
309 url = "https://registry.npmjs.org/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.8.3.tgz";
310 sha512 = "0gkX7J7E+AtAw9fcwlVQj8peP61qhdg/89D5swOkjYbkboA2CVckn3kiyum1DE0wskGb7KJJxBdyEBApDLLVdw==";
311 };
312 };
313 "@babel/plugin-proposal-unicode-property-regex-7.8.8" = {
314 name = "_at_babel_slash_plugin-proposal-unicode-property-regex";
315 packageName = "@babel/plugin-proposal-unicode-property-regex";
316 version = "7.8.8";
317 src = fetchurl {
318 url = "https://registry.npmjs.org/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.8.8.tgz";
319 sha512 = "EVhjVsMpbhLw9ZfHWSx2iy13Q8Z/eg8e8ccVWt23sWQK5l1UdkoLJPN5w69UA4uITGBnEZD2JOe4QOHycYKv8A==";
320 };
321 };
322 "@babel/plugin-syntax-async-generators-7.8.4" = {
323 name = "_at_babel_slash_plugin-syntax-async-generators";
324 packageName = "@babel/plugin-syntax-async-generators";
325 version = "7.8.4";
326 src = fetchurl {
327 url = "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz";
328 sha512 = "tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==";
329 };
330 };
331 "@babel/plugin-syntax-flow-7.8.3" = {
332 name = "_at_babel_slash_plugin-syntax-flow";
333 packageName = "@babel/plugin-syntax-flow";
334 version = "7.8.3";
335 src = fetchurl {
336 url = "https://registry.npmjs.org/@babel/plugin-syntax-flow/-/plugin-syntax-flow-7.8.3.tgz";
337 sha512 = "innAx3bUbA0KSYj2E2MNFSn9hiCeowOFLxlsuhXzw8hMQnzkDomUr9QCD7E9VF60NmnG1sNTuuv6Qf4f8INYsg==";
338 };
339 };
340 "@babel/plugin-syntax-json-strings-7.8.3" = {
341 name = "_at_babel_slash_plugin-syntax-json-strings";
342 packageName = "@babel/plugin-syntax-json-strings";
343 version = "7.8.3";
344 src = fetchurl {
345 url = "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz";
346 sha512 = "lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==";
347 };
348 };
349 "@babel/plugin-syntax-jsx-7.8.3" = {
350 name = "_at_babel_slash_plugin-syntax-jsx";
351 packageName = "@babel/plugin-syntax-jsx";
352 version = "7.8.3";
353 src = fetchurl {
354 url = "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.8.3.tgz";
355 sha512 = "WxdW9xyLgBdefoo0Ynn3MRSkhe5tFVxxKNVdnZSh318WrG2e2jH+E9wd/++JsqcLJZPfz87njQJ8j2Upjm0M0A==";
356 };
357 };
358 "@babel/plugin-syntax-object-rest-spread-7.8.3" = {
359 name = "_at_babel_slash_plugin-syntax-object-rest-spread";
360 packageName = "@babel/plugin-syntax-object-rest-spread";
361 version = "7.8.3";
362 src = fetchurl {
363 url = "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz";
364 sha512 = "XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==";
365 };
366 };
367 "@babel/plugin-syntax-optional-catch-binding-7.8.3" = {
368 name = "_at_babel_slash_plugin-syntax-optional-catch-binding";
369 packageName = "@babel/plugin-syntax-optional-catch-binding";
370 version = "7.8.3";
371 src = fetchurl {
372 url = "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz";
373 sha512 = "6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==";
374 };
375 };
376 "@babel/plugin-transform-arrow-functions-7.8.3" = {
377 name = "_at_babel_slash_plugin-transform-arrow-functions";
378 packageName = "@babel/plugin-transform-arrow-functions";
379 version = "7.8.3";
380 src = fetchurl {
381 url = "https://registry.npmjs.org/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.8.3.tgz";
382 sha512 = "0MRF+KC8EqH4dbuITCWwPSzsyO3HIWWlm30v8BbbpOrS1B++isGxPnnuq/IZvOX5J2D/p7DQalQm+/2PnlKGxg==";
383 };
384 };
385 "@babel/plugin-transform-async-to-generator-7.8.3" = {
386 name = "_at_babel_slash_plugin-transform-async-to-generator";
387 packageName = "@babel/plugin-transform-async-to-generator";
388 version = "7.8.3";
389 src = fetchurl {
390 url = "https://registry.npmjs.org/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.8.3.tgz";
391 sha512 = "imt9tFLD9ogt56Dd5CI/6XgpukMwd/fLGSrix2httihVe7LOGVPhyhMh1BU5kDM7iHD08i8uUtmV2sWaBFlHVQ==";
392 };
393 };
394 "@babel/plugin-transform-block-scoped-functions-7.8.3" = {
395 name = "_at_babel_slash_plugin-transform-block-scoped-functions";
396 packageName = "@babel/plugin-transform-block-scoped-functions";
397 version = "7.8.3";
398 src = fetchurl {
399 url = "https://registry.npmjs.org/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.8.3.tgz";
400 sha512 = "vo4F2OewqjbB1+yaJ7k2EJFHlTP3jR634Z9Cj9itpqNjuLXvhlVxgnjsHsdRgASR8xYDrx6onw4vW5H6We0Jmg==";
401 };
402 };
403 "@babel/plugin-transform-block-scoping-7.8.3" = {
404 name = "_at_babel_slash_plugin-transform-block-scoping";
405 packageName = "@babel/plugin-transform-block-scoping";
406 version = "7.8.3";
407 src = fetchurl {
408 url = "https://registry.npmjs.org/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.8.3.tgz";
409 sha512 = "pGnYfm7RNRgYRi7bids5bHluENHqJhrV4bCZRwc5GamaWIIs07N4rZECcmJL6ZClwjDz1GbdMZFtPs27hTB06w==";
410 };
411 };
412 "@babel/plugin-transform-classes-7.9.5" = {
413 name = "_at_babel_slash_plugin-transform-classes";
414 packageName = "@babel/plugin-transform-classes";
415 version = "7.9.5";
416 src = fetchurl {
417 url = "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.9.5.tgz";
418 sha512 = "x2kZoIuLC//O5iA7PEvecB105o7TLzZo8ofBVhP79N+DO3jaX+KYfww9TQcfBEZD0nikNyYcGB1IKtRq36rdmg==";
419 };
420 };
421 "@babel/plugin-transform-computed-properties-7.8.3" = {
422 name = "_at_babel_slash_plugin-transform-computed-properties";
423 packageName = "@babel/plugin-transform-computed-properties";
424 version = "7.8.3";
425 src = fetchurl {
426 url = "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.8.3.tgz";
427 sha512 = "O5hiIpSyOGdrQZRQ2ccwtTVkgUDBBiCuK//4RJ6UfePllUTCENOzKxfh6ulckXKc0DixTFLCfb2HVkNA7aDpzA==";
428 };
429 };
430 "@babel/plugin-transform-destructuring-7.9.5" = {
431 name = "_at_babel_slash_plugin-transform-destructuring";
432 packageName = "@babel/plugin-transform-destructuring";
433 version = "7.9.5";
434 src = fetchurl {
435 url = "https://registry.npmjs.org/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.9.5.tgz";
436 sha512 = "j3OEsGel8nHL/iusv/mRd5fYZ3DrOxWC82x0ogmdN/vHfAP4MYw+AFKYanzWlktNwikKvlzUV//afBW5FTp17Q==";
437 };
438 };
439 "@babel/plugin-transform-dotall-regex-7.8.3" = {
440 name = "_at_babel_slash_plugin-transform-dotall-regex";
441 packageName = "@babel/plugin-transform-dotall-regex";
442 version = "7.8.3";
443 src = fetchurl {
444 url = "https://registry.npmjs.org/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.8.3.tgz";
445 sha512 = "kLs1j9Nn4MQoBYdRXH6AeaXMbEJFaFu/v1nQkvib6QzTj8MZI5OQzqmD83/2jEM1z0DLilra5aWO5YpyC0ALIw==";
446 };
447 };
448 "@babel/plugin-transform-duplicate-keys-7.8.3" = {
449 name = "_at_babel_slash_plugin-transform-duplicate-keys";
450 packageName = "@babel/plugin-transform-duplicate-keys";
451 version = "7.8.3";
452 src = fetchurl {
453 url = "https://registry.npmjs.org/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.8.3.tgz";
454 sha512 = "s8dHiBUbcbSgipS4SMFuWGqCvyge5V2ZeAWzR6INTVC3Ltjig/Vw1G2Gztv0vU/hRG9X8IvKvYdoksnUfgXOEQ==";
455 };
456 };
457 "@babel/plugin-transform-exponentiation-operator-7.8.3" = {
458 name = "_at_babel_slash_plugin-transform-exponentiation-operator";
459 packageName = "@babel/plugin-transform-exponentiation-operator";
460 version = "7.8.3";
461 src = fetchurl {
462 url = "https://registry.npmjs.org/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.8.3.tgz";
463 sha512 = "zwIpuIymb3ACcInbksHaNcR12S++0MDLKkiqXHl3AzpgdKlFNhog+z/K0+TGW+b0w5pgTq4H6IwV/WhxbGYSjQ==";
464 };
465 };
466 "@babel/plugin-transform-flow-strip-types-7.3.4" = {
467 name = "_at_babel_slash_plugin-transform-flow-strip-types";
468 packageName = "@babel/plugin-transform-flow-strip-types";
469 version = "7.3.4";
470 src = fetchurl {
471 url = "https://registry.npmjs.org/@babel/plugin-transform-flow-strip-types/-/plugin-transform-flow-strip-types-7.3.4.tgz";
472 sha512 = "PmQC9R7DwpBFA+7ATKMyzViz3zCaMNouzZMPZN2K5PnbBbtL3AXFYTkDk+Hey5crQq2A90UG5Uthz0mel+XZrA==";
473 };
474 };
475 "@babel/plugin-transform-for-of-7.9.0" = {
476 name = "_at_babel_slash_plugin-transform-for-of";
477 packageName = "@babel/plugin-transform-for-of";
478 version = "7.9.0";
479 src = fetchurl {
480 url = "https://registry.npmjs.org/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.9.0.tgz";
481 sha512 = "lTAnWOpMwOXpyDx06N+ywmF3jNbafZEqZ96CGYabxHrxNX8l5ny7dt4bK/rGwAh9utyP2b2Hv7PlZh1AAS54FQ==";
482 };
483 };
484 "@babel/plugin-transform-function-name-7.8.3" = {
485 name = "_at_babel_slash_plugin-transform-function-name";
486 packageName = "@babel/plugin-transform-function-name";
487 version = "7.8.3";
488 src = fetchurl {
489 url = "https://registry.npmjs.org/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.8.3.tgz";
490 sha512 = "rO/OnDS78Eifbjn5Py9v8y0aR+aSYhDhqAwVfsTl0ERuMZyr05L1aFSCJnbv2mmsLkit/4ReeQ9N2BgLnOcPCQ==";
491 };
492 };
493 "@babel/plugin-transform-literals-7.8.3" = {
494 name = "_at_babel_slash_plugin-transform-literals";
495 packageName = "@babel/plugin-transform-literals";
496 version = "7.8.3";
497 src = fetchurl {
498 url = "https://registry.npmjs.org/@babel/plugin-transform-literals/-/plugin-transform-literals-7.8.3.tgz";
499 sha512 = "3Tqf8JJ/qB7TeldGl+TT55+uQei9JfYaregDcEAyBZ7akutriFrt6C/wLYIer6OYhleVQvH/ntEhjE/xMmy10A==";
500 };
501 };
502 "@babel/plugin-transform-modules-amd-7.9.0" = {
503 name = "_at_babel_slash_plugin-transform-modules-amd";
504 packageName = "@babel/plugin-transform-modules-amd";
505 version = "7.9.0";
506 src = fetchurl {
507 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.9.0.tgz";
508 sha512 = "vZgDDF003B14O8zJy0XXLnPH4sg+9X5hFBBGN1V+B2rgrB+J2xIypSN6Rk9imB2hSTHQi5OHLrFWsZab1GMk+Q==";
509 };
510 };
511 "@babel/plugin-transform-modules-commonjs-7.2.0" = {
512 name = "_at_babel_slash_plugin-transform-modules-commonjs";
513 packageName = "@babel/plugin-transform-modules-commonjs";
514 version = "7.2.0";
515 src = fetchurl {
516 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.2.0.tgz";
517 sha512 = "V6y0uaUQrQPXUrmj+hgnks8va2L0zcZymeU7TtWEgdRLNkceafKXEduv7QzgQAE4lT+suwooG9dC7LFhdRAbVQ==";
518 };
519 };
520 "@babel/plugin-transform-modules-systemjs-7.9.0" = {
521 name = "_at_babel_slash_plugin-transform-modules-systemjs";
522 packageName = "@babel/plugin-transform-modules-systemjs";
523 version = "7.9.0";
524 src = fetchurl {
525 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.9.0.tgz";
526 sha512 = "FsiAv/nao/ud2ZWy4wFacoLOm5uxl0ExSQ7ErvP7jpoihLR6Cq90ilOFyX9UXct3rbtKsAiZ9kFt5XGfPe/5SQ==";
527 };
528 };
529 "@babel/plugin-transform-modules-umd-7.9.0" = {
530 name = "_at_babel_slash_plugin-transform-modules-umd";
531 packageName = "@babel/plugin-transform-modules-umd";
532 version = "7.9.0";
533 src = fetchurl {
534 url = "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.9.0.tgz";
535 sha512 = "uTWkXkIVtg/JGRSIABdBoMsoIeoHQHPTL0Y2E7xf5Oj7sLqwVsNXOkNk0VJc7vF0IMBsPeikHxFjGe+qmwPtTQ==";
536 };
537 };
538 "@babel/plugin-transform-named-capturing-groups-regex-7.8.3" = {
539 name = "_at_babel_slash_plugin-transform-named-capturing-groups-regex";
540 packageName = "@babel/plugin-transform-named-capturing-groups-regex";
541 version = "7.8.3";
542 src = fetchurl {
543 url = "https://registry.npmjs.org/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz";
544 sha512 = "f+tF/8UVPU86TrCb06JoPWIdDpTNSGGcAtaD9mLP0aYGA0OS0j7j7DHJR0GTFrUZPUU6loZhbsVZgTh0N+Qdnw==";
545 };
546 };
547 "@babel/plugin-transform-new-target-7.8.3" = {
548 name = "_at_babel_slash_plugin-transform-new-target";
549 packageName = "@babel/plugin-transform-new-target";
550 version = "7.8.3";
551 src = fetchurl {
552 url = "https://registry.npmjs.org/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.8.3.tgz";
553 sha512 = "QuSGysibQpyxexRyui2vca+Cmbljo8bcRckgzYV4kRIsHpVeyeC3JDO63pY+xFZ6bWOBn7pfKZTqV4o/ix9sFw==";
554 };
555 };
556 "@babel/plugin-transform-object-super-7.8.3" = {
557 name = "_at_babel_slash_plugin-transform-object-super";
558 packageName = "@babel/plugin-transform-object-super";
559 version = "7.8.3";
560 src = fetchurl {
561 url = "https://registry.npmjs.org/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.8.3.tgz";
562 sha512 = "57FXk+gItG/GejofIyLIgBKTas4+pEU47IXKDBWFTxdPd7F80H8zybyAY7UoblVfBhBGs2EKM+bJUu2+iUYPDQ==";
563 };
564 };
565 "@babel/plugin-transform-parameters-7.9.5" = {
566 name = "_at_babel_slash_plugin-transform-parameters";
567 packageName = "@babel/plugin-transform-parameters";
568 version = "7.9.5";
569 src = fetchurl {
570 url = "https://registry.npmjs.org/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.9.5.tgz";
571 sha512 = "0+1FhHnMfj6lIIhVvS4KGQJeuhe1GI//h5uptK4PvLt+BGBxsoUJbd3/IW002yk//6sZPlFgsG1hY6OHLcy6kA==";
572 };
573 };
574 "@babel/plugin-transform-react-jsx-7.3.0" = {
575 name = "_at_babel_slash_plugin-transform-react-jsx";
576 packageName = "@babel/plugin-transform-react-jsx";
577 version = "7.3.0";
578 src = fetchurl {
579 url = "https://registry.npmjs.org/@babel/plugin-transform-react-jsx/-/plugin-transform-react-jsx-7.3.0.tgz";
580 sha512 = "a/+aRb7R06WcKvQLOu4/TpjKOdvVEKRLWFpKcNuHhiREPgGRB4TQJxq07+EZLS8LFVYpfq1a5lDUnuMdcCpBKg==";
581 };
582 };
583 "@babel/plugin-transform-regenerator-7.8.7" = {
584 name = "_at_babel_slash_plugin-transform-regenerator";
585 packageName = "@babel/plugin-transform-regenerator";
586 version = "7.8.7";
587 src = fetchurl {
588 url = "https://registry.npmjs.org/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.8.7.tgz";
589 sha512 = "TIg+gAl4Z0a3WmD3mbYSk+J9ZUH6n/Yc57rtKRnlA/7rcCvpekHXe0CMZHP1gYp7/KLe9GHTuIba0vXmls6drA==";
590 };
591 };
592 "@babel/plugin-transform-shorthand-properties-7.8.3" = {
593 name = "_at_babel_slash_plugin-transform-shorthand-properties";
594 packageName = "@babel/plugin-transform-shorthand-properties";
595 version = "7.8.3";
596 src = fetchurl {
597 url = "https://registry.npmjs.org/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.8.3.tgz";
598 sha512 = "I9DI6Odg0JJwxCHzbzW08ggMdCezoWcuQRz3ptdudgwaHxTjxw5HgdFJmZIkIMlRymL6YiZcped4TTCB0JcC8w==";
599 };
600 };
601 "@babel/plugin-transform-spread-7.8.3" = {
602 name = "_at_babel_slash_plugin-transform-spread";
603 packageName = "@babel/plugin-transform-spread";
604 version = "7.8.3";
605 src = fetchurl {
606 url = "https://registry.npmjs.org/@babel/plugin-transform-spread/-/plugin-transform-spread-7.8.3.tgz";
607 sha512 = "CkuTU9mbmAoFOI1tklFWYYbzX5qCIZVXPVy0jpXgGwkplCndQAa58s2jr66fTeQnA64bDox0HL4U56CFYoyC7g==";
608 };
609 };
610 "@babel/plugin-transform-sticky-regex-7.8.3" = {
611 name = "_at_babel_slash_plugin-transform-sticky-regex";
612 packageName = "@babel/plugin-transform-sticky-regex";
613 version = "7.8.3";
614 src = fetchurl {
615 url = "https://registry.npmjs.org/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.8.3.tgz";
616 sha512 = "9Spq0vGCD5Bb4Z/ZXXSK5wbbLFMG085qd2vhL1JYu1WcQ5bXqZBAYRzU1d+p79GcHs2szYv5pVQCX13QgldaWw==";
617 };
618 };
619 "@babel/plugin-transform-template-literals-7.8.3" = {
620 name = "_at_babel_slash_plugin-transform-template-literals";
621 packageName = "@babel/plugin-transform-template-literals";
622 version = "7.8.3";
623 src = fetchurl {
624 url = "https://registry.npmjs.org/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.8.3.tgz";
625 sha512 = "820QBtykIQOLFT8NZOcTRJ1UNuztIELe4p9DCgvj4NK+PwluSJ49we7s9FB1HIGNIYT7wFUJ0ar2QpCDj0escQ==";
626 };
627 };
628 "@babel/plugin-transform-typeof-symbol-7.8.4" = {
629 name = "_at_babel_slash_plugin-transform-typeof-symbol";
630 packageName = "@babel/plugin-transform-typeof-symbol";
631 version = "7.8.4";
632 src = fetchurl {
633 url = "https://registry.npmjs.org/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.8.4.tgz";
634 sha512 = "2QKyfjGdvuNfHsb7qnBBlKclbD4CfshH2KvDabiijLMGXPHJXGxtDzwIF7bQP+T0ysw8fYTtxPafgfs/c1Lrqg==";
635 };
636 };
637 "@babel/plugin-transform-unicode-regex-7.8.3" = {
638 name = "_at_babel_slash_plugin-transform-unicode-regex";
639 packageName = "@babel/plugin-transform-unicode-regex";
640 version = "7.8.3";
641 src = fetchurl {
642 url = "https://registry.npmjs.org/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.8.3.tgz";
643 sha512 = "+ufgJjYdmWfSQ+6NS9VGUR2ns8cjJjYbrbi11mZBTaWm+Fui/ncTLFF28Ei1okavY+xkojGr1eJxNsWYeA5aZw==";
644 };
645 };
646 "@babel/preset-env-7.3.4" = {
647 name = "_at_babel_slash_preset-env";
648 packageName = "@babel/preset-env";
649 version = "7.3.4";
650 src = fetchurl {
651 url = "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.3.4.tgz";
652 sha512 = "2mwqfYMK8weA0g0uBKOt4FE3iEodiHy9/CW0b+nWXcbL+pGzLx8ESYc+j9IIxr6LTDHWKgPm71i9smo02bw+gA==";
653 };
654 };
655 "@babel/runtime-7.3.4" = {
656 name = "_at_babel_slash_runtime";
657 packageName = "@babel/runtime";
658 version = "7.3.4";
659 src = fetchurl {
660 url = "https://registry.npmjs.org/@babel/runtime/-/runtime-7.3.4.tgz";
661 sha512 = "IvfvnMdSaLBateu0jfsYIpZTxAc2cKEXEMiezGGN75QcBcecDUKd3PgLAncT0oOgxKy8dd8hrJKj9MfzgfZd6g==";
662 };
663 };
664 "@babel/runtime-7.9.2" = {
665 name = "_at_babel_slash_runtime";
666 packageName = "@babel/runtime";
667 version = "7.9.2";
668 src = fetchurl {
669 url = "https://registry.npmjs.org/@babel/runtime/-/runtime-7.9.2.tgz";
670 sha512 = "NE2DtOdufG7R5vnfQUTehdTfNycfUANEtCa9PssN9O/xmTzP4E08UI797ixaei6hBEVL9BI/PsdJS5x7mWoB9Q==";
671 };
672 };
673 "@babel/template-7.2.2" = {
674 name = "_at_babel_slash_template";
675 packageName = "@babel/template";
676 version = "7.2.2";
677 src = fetchurl {
678 url = "https://registry.npmjs.org/@babel/template/-/template-7.2.2.tgz";
679 sha512 = "zRL0IMM02AUDwghf5LMSSDEz7sBCO2YnNmpg3uWTZj/v1rcG2BmQUvaGU8GhU8BvfMh1k2KIAYZ7Ji9KXPUg7g==";
680 };
681 };
682 "@babel/template-7.8.6" = {
683 name = "_at_babel_slash_template";
684 packageName = "@babel/template";
685 version = "7.8.6";
686 src = fetchurl {
687 url = "https://registry.npmjs.org/@babel/template/-/template-7.8.6.tgz";
688 sha512 = "zbMsPMy/v0PWFZEhQJ66bqjhH+z0JgMoBWuikXybgG3Gkd/3t5oQ1Rw2WQhnSrsOmsKXnZOx15tkC4qON/+JPg==";
689 };
690 };
691 "@babel/traverse-7.3.4" = {
692 name = "_at_babel_slash_traverse";
693 packageName = "@babel/traverse";
694 version = "7.3.4";
695 src = fetchurl {
696 url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.3.4.tgz";
697 sha512 = "TvTHKp6471OYEcE/91uWmhR6PrrYywQntCHSaZ8CM8Vmp+pjAusal4nGB2WCCQd0rvI7nOMKn9GnbcvTUz3/ZQ==";
698 };
699 };
700 "@babel/traverse-7.9.5" = {
701 name = "_at_babel_slash_traverse";
702 packageName = "@babel/traverse";
703 version = "7.9.5";
704 src = fetchurl {
705 url = "https://registry.npmjs.org/@babel/traverse/-/traverse-7.9.5.tgz";
706 sha512 = "c4gH3jsvSuGUezlP6rzSJ6jf8fYjLj3hsMZRx/nX0h+fmHN0w+ekubRrHPqnMec0meycA2nwCsJ7dC8IPem2FQ==";
707 };
708 };
709 "@babel/types-7.3.4" = {
710 name = "_at_babel_slash_types";
711 packageName = "@babel/types";
712 version = "7.3.4";
713 src = fetchurl {
714 url = "https://registry.npmjs.org/@babel/types/-/types-7.3.4.tgz";
715 sha512 = "WEkp8MsLftM7O/ty580wAmZzN1nDmCACc5+jFzUt+GUFNNIi3LdRlueYz0YIlmJhlZx1QYDMZL5vdWCL0fNjFQ==";
716 };
717 };
718 "@babel/types-7.9.5" = {
719 name = "_at_babel_slash_types";
720 packageName = "@babel/types";
721 version = "7.9.5";
722 src = fetchurl {
723 url = "https://registry.npmjs.org/@babel/types/-/types-7.9.5.tgz";
724 sha512 = "XjnvNqenk818r5zMaba+sLQjnbda31UfUURv3ei0qPQw4u+j2jMyJ5b11y8ZHYTRSI3NnInQkkkRT4fLqqPdHg==";
725 };
726 };
727 "@iarna/toml-2.2.5" = {
728 name = "_at_iarna_slash_toml";
729 packageName = "@iarna/toml";
730 version = "2.2.5";
731 src = fetchurl {
732 url = "https://registry.npmjs.org/@iarna/toml/-/toml-2.2.5.tgz";
733 sha512 = "trnsAYxU3xnS1gPHPyU961coFyLkh4gAD/0zQ5mymY4yOZ+CYvsPqUbOFSw0aDM4y0tV7tiFxL/1XfXPNC6IPg==";
734 };
735 };
736 "@mrmlnc/readdir-enhanced-2.2.1" = {
737 name = "_at_mrmlnc_slash_readdir-enhanced";
738 packageName = "@mrmlnc/readdir-enhanced";
739 version = "2.2.1";
740 src = fetchurl {
741 url = "https://registry.npmjs.org/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz";
742 sha512 = "bPHp6Ji8b41szTOcaP63VlnbbO5Ny6dwAATtY6JTjh5N2OLrb5Qk/Th5cRkRQhkWCt+EJsYrNB0MiL+Gpn6e3g==";
743 };
744 };
745 "@nodelib/fs.stat-1.1.3" = {
746 name = "_at_nodelib_slash_fs.stat";
747 packageName = "@nodelib/fs.stat";
748 version = "1.1.3";
749 src = fetchurl {
750 url = "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz";
751 sha512 = "shAmDyaQC4H92APFoIaVDHCx5bStIocgvbwQyxPRrbUY20V1EYTbSDchWbuwlMG3V17cprZhA6+78JfB+3DTPw==";
752 };
753 };
754 "@parcel/fs-1.11.0" = {
755 name = "_at_parcel_slash_fs";
756 packageName = "@parcel/fs";
757 version = "1.11.0";
758 src = fetchurl {
759 url = "https://registry.npmjs.org/@parcel/fs/-/fs-1.11.0.tgz";
760 sha512 = "86RyEqULbbVoeo8OLcv+LQ1Vq2PKBAvWTU9fCgALxuCTbbs5Ppcvll4Vr+Ko1AnmMzja/k++SzNAwJfeQXVlpA==";
761 };
762 };
763 "@parcel/logger-1.11.1" = {
764 name = "_at_parcel_slash_logger";
765 packageName = "@parcel/logger";
766 version = "1.11.1";
767 src = fetchurl {
768 url = "https://registry.npmjs.org/@parcel/logger/-/logger-1.11.1.tgz";
769 sha512 = "9NF3M6UVeP2udOBDILuoEHd8VrF4vQqoWHEafymO1pfSoOMfxrSJZw1MfyAAIUN/IFp9qjcpDCUbDZB+ioVevA==";
770 };
771 };
772 "@parcel/utils-1.11.0" = {
773 name = "_at_parcel_slash_utils";
774 packageName = "@parcel/utils";
775 version = "1.11.0";
776 src = fetchurl {
777 url = "https://registry.npmjs.org/@parcel/utils/-/utils-1.11.0.tgz";
778 sha512 = "cA3p4jTlaMeOtAKR/6AadanOPvKeg8VwgnHhOyfi0yClD0TZS/hi9xu12w4EzA/8NtHu0g6o4RDfcNjqN8l1AQ==";
779 };
780 };
781 "@parcel/watcher-1.12.1" = {
782 name = "_at_parcel_slash_watcher";
783 packageName = "@parcel/watcher";
784 version = "1.12.1";
785 src = fetchurl {
786 url = "https://registry.npmjs.org/@parcel/watcher/-/watcher-1.12.1.tgz";
787 sha512 = "od+uCtCxC/KoNQAIE1vWx1YTyKYY+7CTrxBJPRh3cDWw/C0tCtlBMVlrbplscGoEpt6B27KhJDCv82PBxOERNA==";
788 };
789 };
790 "@parcel/workers-1.11.0" = {
791 name = "_at_parcel_slash_workers";
792 packageName = "@parcel/workers";
793 version = "1.11.0";
794 src = fetchurl {
795 url = "https://registry.npmjs.org/@parcel/workers/-/workers-1.11.0.tgz";
796 sha512 = "USSjRAAQYsZFlv43FUPdD+jEGML5/8oLF0rUzPQTtK4q9kvaXr49F5ZplyLz5lox78cLZ0TxN2bIDQ1xhOkulQ==";
797 };
798 };
799 "@types/q-1.5.2" = {
800 name = "_at_types_slash_q";
801 packageName = "@types/q";
802 version = "1.5.2";
803 src = fetchurl {
804 url = "https://registry.npmjs.org/@types/q/-/q-1.5.2.tgz";
805 sha512 = "ce5d3q03Ex0sy4R14722Rmt6MT07Ua+k4FwDfdcToYJcMKNtRVQvJ6JCAPdAmAnbRb6CsX6aYb9m96NGod9uTw==";
806 };
807 };
808 "abab-2.0.3" = {
809 name = "abab";
810 packageName = "abab";
811 version = "2.0.3";
812 src = fetchurl {
813 url = "https://registry.npmjs.org/abab/-/abab-2.0.3.tgz";
814 sha512 = "tsFzPpcttalNjFBCFMqsKYQcWxxen1pgJR56by//QwvJc4/OUS3kPOOttx2tSIfjsylB0pYu7f5D3K1RCxUnUg==";
815 };
816 };
817 "abbrev-1.1.1" = {
818 name = "abbrev";
819 packageName = "abbrev";
820 version = "1.1.1";
821 src = fetchurl {
822 url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
823 sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
824 };
825 };
826 "acorn-6.4.1" = {
827 name = "acorn";
828 packageName = "acorn";
829 version = "6.4.1";
830 src = fetchurl {
831 url = "https://registry.npmjs.org/acorn/-/acorn-6.4.1.tgz";
832 sha512 = "ZVA9k326Nwrj3Cj9jlh3wGFutC2ZornPNARZwsNYqQYgN0EsV2d53w5RN/co65Ohn4sUAUtb1rSUAOD6XN9idA==";
833 };
834 };
835 "acorn-7.1.1" = {
836 name = "acorn";
837 packageName = "acorn";
838 version = "7.1.1";
839 src = fetchurl {
840 url = "https://registry.npmjs.org/acorn/-/acorn-7.1.1.tgz";
841 sha512 = "add7dgA5ppRPxCFJoAGfMDi7PIBXq1RtGo7BhbLaxwrXPOmw8gq48Y9ozT01hUKy9byMjlR20EJhu5zlkErEkg==";
842 };
843 };
844 "acorn-globals-4.3.4" = {
845 name = "acorn-globals";
846 packageName = "acorn-globals";
847 version = "4.3.4";
848 src = fetchurl {
849 url = "https://registry.npmjs.org/acorn-globals/-/acorn-globals-4.3.4.tgz";
850 sha512 = "clfQEh21R+D0leSbUdWf3OcfqyaCSAQ8Ryq00bofSekfr9W8u1jyYZo6ir0xu9Gtcf7BjcHJpnbZH7JOCpP60A==";
851 };
852 };
853 "acorn-walk-6.2.0" = {
854 name = "acorn-walk";
855 packageName = "acorn-walk";
856 version = "6.2.0";
857 src = fetchurl {
858 url = "https://registry.npmjs.org/acorn-walk/-/acorn-walk-6.2.0.tgz";
859 sha512 = "7evsyfH1cLOCdAzZAd43Cic04yKydNx0cF+7tiA19p1XnLLPU4dpCQOqpjqwokFe//vS0QqfqqjCS2JkiIs0cA==";
860 };
861 };
862 "ajv-6.12.2" = {
863 name = "ajv";
864 packageName = "ajv";
865 version = "6.12.2";
866 src = fetchurl {
867 url = "https://registry.npmjs.org/ajv/-/ajv-6.12.2.tgz";
868 sha512 = "k+V+hzjm5q/Mr8ef/1Y9goCmlsK4I6Sm74teeyGvFk1XrOsbsKLjEdrvny42CZ+a8sXbk8KWpY/bDwS+FLL2UQ==";
869 };
870 };
871 "alphanum-sort-1.0.2" = {
872 name = "alphanum-sort";
873 packageName = "alphanum-sort";
874 version = "1.0.2";
875 src = fetchurl {
876 url = "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
877 sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
878 };
879 };
880 "ansi-regex-2.1.1" = {
881 name = "ansi-regex";
882 packageName = "ansi-regex";
883 version = "2.1.1";
884 src = fetchurl {
885 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
886 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
887 };
888 };
889 "ansi-regex-3.0.0" = {
890 name = "ansi-regex";
891 packageName = "ansi-regex";
892 version = "3.0.0";
893 src = fetchurl {
894 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz";
895 sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
896 };
897 };
898 "ansi-regex-4.1.0" = {
899 name = "ansi-regex";
900 packageName = "ansi-regex";
901 version = "4.1.0";
902 src = fetchurl {
903 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz";
904 sha512 = "1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==";
905 };
906 };
907 "ansi-styles-2.2.1" = {
908 name = "ansi-styles";
909 packageName = "ansi-styles";
910 version = "2.2.1";
911 src = fetchurl {
912 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
913 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
914 };
915 };
916 "ansi-styles-3.2.1" = {
917 name = "ansi-styles";
918 packageName = "ansi-styles";
919 version = "3.2.1";
920 src = fetchurl {
921 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";
922 sha512 = "VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==";
923 };
924 };
925 "ansi-to-html-0.6.14" = {
926 name = "ansi-to-html";
927 packageName = "ansi-to-html";
928 version = "0.6.14";
929 src = fetchurl {
930 url = "https://registry.npmjs.org/ansi-to-html/-/ansi-to-html-0.6.14.tgz";
931 sha512 = "7ZslfB1+EnFSDO5Ju+ue5Y6It19DRnZXWv8jrGHgIlPna5Mh4jz7BV5jCbQneXNFurQcKoolaaAjHtgSBfOIuA==";
932 };
933 };
934 "anymatch-2.0.0" = {
935 name = "anymatch";
936 packageName = "anymatch";
937 version = "2.0.0";
938 src = fetchurl {
939 url = "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz";
940 sha512 = "5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==";
941 };
942 };
943 "argparse-1.0.10" = {
944 name = "argparse";
945 packageName = "argparse";
946 version = "1.0.10";
947 src = fetchurl {
948 url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz";
949 sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==";
950 };
951 };
952 "arr-diff-4.0.0" = {
953 name = "arr-diff";
954 packageName = "arr-diff";
955 version = "4.0.0";
956 src = fetchurl {
957 url = "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz";
958 sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
959 };
960 };
961 "arr-flatten-1.1.0" = {
962 name = "arr-flatten";
963 packageName = "arr-flatten";
964 version = "1.1.0";
965 src = fetchurl {
966 url = "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz";
967 sha512 = "L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==";
968 };
969 };
970 "arr-union-3.1.0" = {
971 name = "arr-union";
972 packageName = "arr-union";
973 version = "3.1.0";
974 src = fetchurl {
975 url = "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz";
976 sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
977 };
978 };
979 "array-equal-1.0.0" = {
980 name = "array-equal";
981 packageName = "array-equal";
982 version = "1.0.0";
983 src = fetchurl {
984 url = "https://registry.npmjs.org/array-equal/-/array-equal-1.0.0.tgz";
985 sha1 = "8c2a5ef2472fd9ea742b04c77a75093ba2757c93";
986 };
987 };
988 "array-unique-0.3.2" = {
989 name = "array-unique";
990 packageName = "array-unique";
991 version = "0.3.2";
992 src = fetchurl {
993 url = "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz";
994 sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
995 };
996 };
997 "asn1-0.2.4" = {
998 name = "asn1";
999 packageName = "asn1";
1000 version = "0.2.4";
1001 src = fetchurl {
1002 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
1003 sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
1004 };
1005 };
1006 "asn1.js-4.10.1" = {
1007 name = "asn1.js";
1008 packageName = "asn1.js";
1009 version = "4.10.1";
1010 src = fetchurl {
1011 url = "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz";
1012 sha512 = "p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==";
1013 };
1014 };
1015 "assert-1.5.0" = {
1016 name = "assert";
1017 packageName = "assert";
1018 version = "1.5.0";
1019 src = fetchurl {
1020 url = "https://registry.npmjs.org/assert/-/assert-1.5.0.tgz";
1021 sha512 = "EDsgawzwoun2CZkCgtxJbv392v4nbk9XDD06zI+kQYoBM/3RBWLlEyJARDOmhAAosBjWACEkKL6S+lIZtcAubA==";
1022 };
1023 };
1024 "assert-plus-1.0.0" = {
1025 name = "assert-plus";
1026 packageName = "assert-plus";
1027 version = "1.0.0";
1028 src = fetchurl {
1029 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
1030 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
1031 };
1032 };
1033 "assign-symbols-1.0.0" = {
1034 name = "assign-symbols";
1035 packageName = "assign-symbols";
1036 version = "1.0.0";
1037 src = fetchurl {
1038 url = "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz";
1039 sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
1040 };
1041 };
1042 "async-each-1.0.3" = {
1043 name = "async-each";
1044 packageName = "async-each";
1045 version = "1.0.3";
1046 src = fetchurl {
1047 url = "https://registry.npmjs.org/async-each/-/async-each-1.0.3.tgz";
1048 sha512 = "z/WhQ5FPySLdvREByI2vZiTWwCnF0moMJ1hK9YQwDTHKh6I7/uSckMetoRGb5UBZPC1z0jlw+n/XCgjeH7y1AQ==";
1049 };
1050 };
1051 "async-limiter-1.0.1" = {
1052 name = "async-limiter";
1053 packageName = "async-limiter";
1054 version = "1.0.1";
1055 src = fetchurl {
1056 url = "https://registry.npmjs.org/async-limiter/-/async-limiter-1.0.1.tgz";
1057 sha512 = "csOlWGAcRFJaI6m+F2WKdnMKr4HhdhFVBk0H/QbJFMCr+uO2kwohwXQPxw/9OCxp05r5ghVBFSyioixx3gfkNQ==";
1058 };
1059 };
1060 "asynckit-0.4.0" = {
1061 name = "asynckit";
1062 packageName = "asynckit";
1063 version = "0.4.0";
1064 src = fetchurl {
1065 url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";
1066 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
1067 };
1068 };
1069 "atob-2.1.2" = {
1070 name = "atob";
1071 packageName = "atob";
1072 version = "2.1.2";
1073 src = fetchurl {
1074 url = "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz";
1075 sha512 = "Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==";
1076 };
1077 };
1078 "aws-sign2-0.7.0" = {
1079 name = "aws-sign2";
1080 packageName = "aws-sign2";
1081 version = "0.7.0";
1082 src = fetchurl {
1083 url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";
1084 sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
1085 };
1086 };
1087 "aws4-1.9.1" = {
1088 name = "aws4";
1089 packageName = "aws4";
1090 version = "1.9.1";
1091 src = fetchurl {
1092 url = "https://registry.npmjs.org/aws4/-/aws4-1.9.1.tgz";
1093 sha512 = "wMHVg2EOHaMRxbzgFJ9gtjOOCrI80OHLG14rxi28XwOW8ux6IiEbRCGGGqCtdAIg4FQCbW20k9RsT4y3gJlFug==";
1094 };
1095 };
1096 "babel-plugin-dynamic-import-node-2.3.3" = {
1097 name = "babel-plugin-dynamic-import-node";
1098 packageName = "babel-plugin-dynamic-import-node";
1099 version = "2.3.3";
1100 src = fetchurl {
1101 url = "https://registry.npmjs.org/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz";
1102 sha512 = "jZVI+s9Zg3IqA/kdi0i6UDCybUI3aSBLnglhYbSSjKlV7yF1F/5LWv8MakQmvYpnbJDS6fcBL2KzHSxNCMtWSQ==";
1103 };
1104 };
1105 "babel-runtime-6.26.0" = {
1106 name = "babel-runtime";
1107 packageName = "babel-runtime";
1108 version = "6.26.0";
1109 src = fetchurl {
1110 url = "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz";
1111 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
1112 };
1113 };
1114 "babel-types-6.26.0" = {
1115 name = "babel-types";
1116 packageName = "babel-types";
1117 version = "6.26.0";
1118 src = fetchurl {
1119 url = "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz";
1120 sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
1121 };
1122 };
1123 "babylon-walk-1.0.2" = {
1124 name = "babylon-walk";
1125 packageName = "babylon-walk";
1126 version = "1.0.2";
1127 src = fetchurl {
1128 url = "https://registry.npmjs.org/babylon-walk/-/babylon-walk-1.0.2.tgz";
1129 sha1 = "3b15a5ddbb482a78b4ce9c01c8ba181702d9d6ce";
1130 };
1131 };
1132 "balanced-match-1.0.0" = {
1133 name = "balanced-match";
1134 packageName = "balanced-match";
1135 version = "1.0.0";
1136 src = fetchurl {
1137 url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
1138 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
1139 };
1140 };
1141 "base-0.11.2" = {
1142 name = "base";
1143 packageName = "base";
1144 version = "0.11.2";
1145 src = fetchurl {
1146 url = "https://registry.npmjs.org/base/-/base-0.11.2.tgz";
1147 sha512 = "5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==";
1148 };
1149 };
1150 "base64-js-1.3.1" = {
1151 name = "base64-js";
1152 packageName = "base64-js";
1153 version = "1.3.1";
1154 src = fetchurl {
1155 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.3.1.tgz";
1156 sha512 = "mLQ4i2QO1ytvGWFWmcngKO//JXAQueZvwEKtjgQFM4jIK0kU+ytMfplL8j+n5mspOfjHwoAg+9yhb7BwAHm36g==";
1157 };
1158 };
1159 "bcrypt-pbkdf-1.0.2" = {
1160 name = "bcrypt-pbkdf";
1161 packageName = "bcrypt-pbkdf";
1162 version = "1.0.2";
1163 src = fetchurl {
1164 url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
1165 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
1166 };
1167 };
1168 "binary-extensions-1.13.1" = {
1169 name = "binary-extensions";
1170 packageName = "binary-extensions";
1171 version = "1.13.1";
1172 src = fetchurl {
1173 url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.13.1.tgz";
1174 sha512 = "Un7MIEDdUC5gNpcGDV97op1Ywk748MpHcFTHoYs6qnj1Z3j7I53VG3nwZhKzoBZmbdRNnb6WRdFlwl7tSDuZGw==";
1175 };
1176 };
1177 "bindings-1.5.0" = {
1178 name = "bindings";
1179 packageName = "bindings";
1180 version = "1.5.0";
1181 src = fetchurl {
1182 url = "https://registry.npmjs.org/bindings/-/bindings-1.5.0.tgz";
1183 sha512 = "p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==";
1184 };
1185 };
1186 "bn.js-4.11.8" = {
1187 name = "bn.js";
1188 packageName = "bn.js";
1189 version = "4.11.8";
1190 src = fetchurl {
1191 url = "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz";
1192 sha512 = "ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==";
1193 };
1194 };
1195 "boolbase-1.0.0" = {
1196 name = "boolbase";
1197 packageName = "boolbase";
1198 version = "1.0.0";
1199 src = fetchurl {
1200 url = "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz";
1201 sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
1202 };
1203 };
1204 "brace-expansion-1.1.11" = {
1205 name = "brace-expansion";
1206 packageName = "brace-expansion";
1207 version = "1.1.11";
1208 src = fetchurl {
1209 url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
1210 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
1211 };
1212 };
1213 "braces-2.3.2" = {
1214 name = "braces";
1215 packageName = "braces";
1216 version = "2.3.2";
1217 src = fetchurl {
1218 url = "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz";
1219 sha512 = "aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==";
1220 };
1221 };
1222 "brfs-1.6.1" = {
1223 name = "brfs";
1224 packageName = "brfs";
1225 version = "1.6.1";
1226 src = fetchurl {
1227 url = "https://registry.npmjs.org/brfs/-/brfs-1.6.1.tgz";
1228 sha512 = "OfZpABRQQf+Xsmju8XE9bDjs+uU4vLREGolP7bDgcpsI17QREyZ4Bl+2KLxxx1kCgA0fAIhKQBaBYh+PEcCqYQ==";
1229 };
1230 };
1231 "brorand-1.1.0" = {
1232 name = "brorand";
1233 packageName = "brorand";
1234 version = "1.1.0";
1235 src = fetchurl {
1236 url = "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz";
1237 sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
1238 };
1239 };
1240 "browser-process-hrtime-1.0.0" = {
1241 name = "browser-process-hrtime";
1242 packageName = "browser-process-hrtime";
1243 version = "1.0.0";
1244 src = fetchurl {
1245 url = "https://registry.npmjs.org/browser-process-hrtime/-/browser-process-hrtime-1.0.0.tgz";
1246 sha512 = "9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==";
1247 };
1248 };
1249 "browserify-aes-1.2.0" = {
1250 name = "browserify-aes";
1251 packageName = "browserify-aes";
1252 version = "1.2.0";
1253 src = fetchurl {
1254 url = "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz";
1255 sha512 = "+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==";
1256 };
1257 };
1258 "browserify-cipher-1.0.1" = {
1259 name = "browserify-cipher";
1260 packageName = "browserify-cipher";
1261 version = "1.0.1";
1262 src = fetchurl {
1263 url = "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
1264 sha512 = "sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==";
1265 };
1266 };
1267 "browserify-des-1.0.2" = {
1268 name = "browserify-des";
1269 packageName = "browserify-des";
1270 version = "1.0.2";
1271 src = fetchurl {
1272 url = "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz";
1273 sha512 = "BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==";
1274 };
1275 };
1276 "browserify-rsa-4.0.1" = {
1277 name = "browserify-rsa";
1278 packageName = "browserify-rsa";
1279 version = "4.0.1";
1280 src = fetchurl {
1281 url = "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
1282 sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
1283 };
1284 };
1285 "browserify-sign-4.0.4" = {
1286 name = "browserify-sign";
1287 packageName = "browserify-sign";
1288 version = "4.0.4";
1289 src = fetchurl {
1290 url = "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz";
1291 sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
1292 };
1293 };
1294 "browserify-zlib-0.2.0" = {
1295 name = "browserify-zlib";
1296 packageName = "browserify-zlib";
1297 version = "0.2.0";
1298 src = fetchurl {
1299 url = "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
1300 sha512 = "Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==";
1301 };
1302 };
1303 "browserslist-4.12.0" = {
1304 name = "browserslist";
1305 packageName = "browserslist";
1306 version = "4.12.0";
1307 src = fetchurl {
1308 url = "https://registry.npmjs.org/browserslist/-/browserslist-4.12.0.tgz";
1309 sha512 = "UH2GkcEDSI0k/lRkuDSzFl9ZZ87skSy9w2XAn1MsZnL+4c4rqbBd3e82UWHbYDpztABrPBhZsTEeuxVfHppqDg==";
1310 };
1311 };
1312 "buffer-4.9.2" = {
1313 name = "buffer";
1314 packageName = "buffer";
1315 version = "4.9.2";
1316 src = fetchurl {
1317 url = "https://registry.npmjs.org/buffer/-/buffer-4.9.2.tgz";
1318 sha512 = "xq+q3SRMOxGivLhBNaUdC64hDTQwejJ+H0T/NB1XMtTVEwNTrfFF3gAxiyW0Bu/xWEGhjVKgUcMhCrUy2+uCWg==";
1319 };
1320 };
1321 "buffer-equal-0.0.1" = {
1322 name = "buffer-equal";
1323 packageName = "buffer-equal";
1324 version = "0.0.1";
1325 src = fetchurl {
1326 url = "https://registry.npmjs.org/buffer-equal/-/buffer-equal-0.0.1.tgz";
1327 sha1 = "91bc74b11ea405bc916bc6aa908faafa5b4aac4b";
1328 };
1329 };
1330 "buffer-from-1.1.1" = {
1331 name = "buffer-from";
1332 packageName = "buffer-from";
1333 version = "1.1.1";
1334 src = fetchurl {
1335 url = "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz";
1336 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
1337 };
1338 };
1339 "buffer-xor-1.0.3" = {
1340 name = "buffer-xor";
1341 packageName = "buffer-xor";
1342 version = "1.0.3";
1343 src = fetchurl {
1344 url = "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz";
1345 sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
1346 };
1347 };
1348 "builtin-status-codes-3.0.0" = {
1349 name = "builtin-status-codes";
1350 packageName = "builtin-status-codes";
1351 version = "3.0.0";
1352 src = fetchurl {
1353 url = "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
1354 sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
1355 };
1356 };
1357 "cache-base-1.0.1" = {
1358 name = "cache-base";
1359 packageName = "cache-base";
1360 version = "1.0.1";
1361 src = fetchurl {
1362 url = "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz";
1363 sha512 = "AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==";
1364 };
1365 };
1366 "call-me-maybe-1.0.1" = {
1367 name = "call-me-maybe";
1368 packageName = "call-me-maybe";
1369 version = "1.0.1";
1370 src = fetchurl {
1371 url = "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.1.tgz";
1372 sha1 = "26d208ea89e37b5cbde60250a15f031c16a4d66b";
1373 };
1374 };
1375 "caller-callsite-2.0.0" = {
1376 name = "caller-callsite";
1377 packageName = "caller-callsite";
1378 version = "2.0.0";
1379 src = fetchurl {
1380 url = "https://registry.npmjs.org/caller-callsite/-/caller-callsite-2.0.0.tgz";
1381 sha1 = "847e0fce0a223750a9a027c54b33731ad3154134";
1382 };
1383 };
1384 "caller-path-2.0.0" = {
1385 name = "caller-path";
1386 packageName = "caller-path";
1387 version = "2.0.0";
1388 src = fetchurl {
1389 url = "https://registry.npmjs.org/caller-path/-/caller-path-2.0.0.tgz";
1390 sha1 = "468f83044e369ab2010fac5f06ceee15bb2cb1f4";
1391 };
1392 };
1393 "callsites-2.0.0" = {
1394 name = "callsites";
1395 packageName = "callsites";
1396 version = "2.0.0";
1397 src = fetchurl {
1398 url = "https://registry.npmjs.org/callsites/-/callsites-2.0.0.tgz";
1399 sha1 = "06eb84f00eea413da86affefacbffb36093b3c50";
1400 };
1401 };
1402 "camelcase-5.3.1" = {
1403 name = "camelcase";
1404 packageName = "camelcase";
1405 version = "5.3.1";
1406 src = fetchurl {
1407 url = "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz";
1408 sha512 = "L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==";
1409 };
1410 };
1411 "caniuse-api-3.0.0" = {
1412 name = "caniuse-api";
1413 packageName = "caniuse-api";
1414 version = "3.0.0";
1415 src = fetchurl {
1416 url = "https://registry.npmjs.org/caniuse-api/-/caniuse-api-3.0.0.tgz";
1417 sha512 = "bsTwuIg/BZZK/vreVTYYbSWoe2F+71P7K5QGEX+pT250DZbfU1MQ5prOKpPR+LL6uWKK3KMwMCAS74QB3Um1uw==";
1418 };
1419 };
1420 "caniuse-lite-1.0.30001048" = {
1421 name = "caniuse-lite";
1422 packageName = "caniuse-lite";
1423 version = "1.0.30001048";
1424 src = fetchurl {
1425 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001048.tgz";
1426 sha512 = "g1iSHKVxornw0K8LG9LLdf+Fxnv7T1Z+mMsf0/YYLclQX4Cd522Ap0Lrw6NFqHgezit78dtyWxzlV2Xfc7vgRg==";
1427 };
1428 };
1429 "caseless-0.12.0" = {
1430 name = "caseless";
1431 packageName = "caseless";
1432 version = "0.12.0";
1433 src = fetchurl {
1434 url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
1435 sha1 = "1b681c21ff84033c826543090689420d187151dc";
1436 };
1437 };
1438 "chalk-1.1.3" = {
1439 name = "chalk";
1440 packageName = "chalk";
1441 version = "1.1.3";
1442 src = fetchurl {
1443 url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
1444 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
1445 };
1446 };
1447 "chalk-2.4.2" = {
1448 name = "chalk";
1449 packageName = "chalk";
1450 version = "2.4.2";
1451 src = fetchurl {
1452 url = "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz";
1453 sha512 = "Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==";
1454 };
1455 };
1456 "chokidar-2.1.8" = {
1457 name = "chokidar";
1458 packageName = "chokidar";
1459 version = "2.1.8";
1460 src = fetchurl {
1461 url = "https://registry.npmjs.org/chokidar/-/chokidar-2.1.8.tgz";
1462 sha512 = "ZmZUazfOzf0Nve7duiCKD23PFSCs4JPoYyccjUFF3aQkQadqBhfzhjkwBH2mNOG9cTBwhamM37EIsIkZw3nRgg==";
1463 };
1464 };
1465 "cipher-base-1.0.4" = {
1466 name = "cipher-base";
1467 packageName = "cipher-base";
1468 version = "1.0.4";
1469 src = fetchurl {
1470 url = "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz";
1471 sha512 = "Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==";
1472 };
1473 };
1474 "class-utils-0.3.6" = {
1475 name = "class-utils";
1476 packageName = "class-utils";
1477 version = "0.3.6";
1478 src = fetchurl {
1479 url = "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz";
1480 sha512 = "qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==";
1481 };
1482 };
1483 "cli-cursor-2.1.0" = {
1484 name = "cli-cursor";
1485 packageName = "cli-cursor";
1486 version = "2.1.0";
1487 src = fetchurl {
1488 url = "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz";
1489 sha1 = "b35dac376479facc3e94747d41d0d0f5238ffcb5";
1490 };
1491 };
1492 "cli-spinners-1.3.1" = {
1493 name = "cli-spinners";
1494 packageName = "cli-spinners";
1495 version = "1.3.1";
1496 src = fetchurl {
1497 url = "https://registry.npmjs.org/cli-spinners/-/cli-spinners-1.3.1.tgz";
1498 sha512 = "1QL4544moEsDVH9T/l6Cemov/37iv1RtoKf7NJ04A60+4MREXNfx/QvavbH6QoGdsD4N4Mwy49cmaINR/o2mdg==";
1499 };
1500 };
1501 "cliui-5.0.0" = {
1502 name = "cliui";
1503 packageName = "cliui";
1504 version = "5.0.0";
1505 src = fetchurl {
1506 url = "https://registry.npmjs.org/cliui/-/cliui-5.0.0.tgz";
1507 sha512 = "PYeGSEmmHM6zvoef2w8TPzlrnNpXIjTipYK780YswmIP9vjxmd6Y2a3CB2Ks6/AU8NHjZugXvo8w3oWM2qnwXA==";
1508 };
1509 };
1510 "clone-1.0.4" = {
1511 name = "clone";
1512 packageName = "clone";
1513 version = "1.0.4";
1514 src = fetchurl {
1515 url = "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz";
1516 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
1517 };
1518 };
1519 "clone-2.1.2" = {
1520 name = "clone";
1521 packageName = "clone";
1522 version = "2.1.2";
1523 src = fetchurl {
1524 url = "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz";
1525 sha1 = "1b7f4b9f591f1e8f83670401600345a02887435f";
1526 };
1527 };
1528 "clones-1.2.0" = {
1529 name = "clones";
1530 packageName = "clones";
1531 version = "1.2.0";
1532 src = fetchurl {
1533 url = "https://registry.npmjs.org/clones/-/clones-1.2.0.tgz";
1534 sha512 = "FXDYw4TjR8wgPZYui2LeTqWh1BLpfQ8lB6upMtlpDF6WlOOxghmTTxWyngdKTgozqBgKnHbTVwTE+hOHqAykuQ==";
1535 };
1536 };
1537 "coa-2.0.2" = {
1538 name = "coa";
1539 packageName = "coa";
1540 version = "2.0.2";
1541 src = fetchurl {
1542 url = "https://registry.npmjs.org/coa/-/coa-2.0.2.tgz";
1543 sha512 = "q5/jG+YQnSy4nRTV4F7lPepBJZ8qBNJJDBuJdoejDyLXgmL7IEo+Le2JDZudFTFt7mrCqIRaSjws4ygRCTCAXA==";
1544 };
1545 };
1546 "collection-visit-1.0.0" = {
1547 name = "collection-visit";
1548 packageName = "collection-visit";
1549 version = "1.0.0";
1550 src = fetchurl {
1551 url = "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz";
1552 sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
1553 };
1554 };
1555 "color-3.1.2" = {
1556 name = "color";
1557 packageName = "color";
1558 version = "3.1.2";
1559 src = fetchurl {
1560 url = "https://registry.npmjs.org/color/-/color-3.1.2.tgz";
1561 sha512 = "vXTJhHebByxZn3lDvDJYw4lR5+uB3vuoHsuYA5AKuxRVn5wzzIfQKGLBmgdVRHKTJYeK5rvJcHnrd0Li49CFpg==";
1562 };
1563 };
1564 "color-convert-1.9.3" = {
1565 name = "color-convert";
1566 packageName = "color-convert";
1567 version = "1.9.3";
1568 src = fetchurl {
1569 url = "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz";
1570 sha512 = "QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==";
1571 };
1572 };
1573 "color-name-1.1.3" = {
1574 name = "color-name";
1575 packageName = "color-name";
1576 version = "1.1.3";
1577 src = fetchurl {
1578 url = "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz";
1579 sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
1580 };
1581 };
1582 "color-string-1.5.3" = {
1583 name = "color-string";
1584 packageName = "color-string";
1585 version = "1.5.3";
1586 src = fetchurl {
1587 url = "https://registry.npmjs.org/color-string/-/color-string-1.5.3.tgz";
1588 sha512 = "dC2C5qeWoYkxki5UAXapdjqO672AM4vZuPGRQfO8b5HKuKGBbKWpITyDYN7TOFKvRW7kOgAn3746clDBMDJyQw==";
1589 };
1590 };
1591 "combined-stream-1.0.8" = {
1592 name = "combined-stream";
1593 packageName = "combined-stream";
1594 version = "1.0.8";
1595 src = fetchurl {
1596 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz";
1597 sha512 = "FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==";
1598 };
1599 };
1600 "command-exists-1.2.9" = {
1601 name = "command-exists";
1602 packageName = "command-exists";
1603 version = "1.2.9";
1604 src = fetchurl {
1605 url = "https://registry.npmjs.org/command-exists/-/command-exists-1.2.9.tgz";
1606 sha512 = "LTQ/SGc+s0Xc0Fu5WaKnR0YiygZkm9eKFvyS+fRsU7/ZWFF8ykFM6Pc9aCVf1+xasOOZpO3BAVgVrKvsqKHV7w==";
1607 };
1608 };
1609 "commander-2.20.3" = {
1610 name = "commander";
1611 packageName = "commander";
1612 version = "2.20.3";
1613 src = fetchurl {
1614 url = "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz";
1615 sha512 = "GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==";
1616 };
1617 };
1618 "component-emitter-1.3.0" = {
1619 name = "component-emitter";
1620 packageName = "component-emitter";
1621 version = "1.3.0";
1622 src = fetchurl {
1623 url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.0.tgz";
1624 sha512 = "Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==";
1625 };
1626 };
1627 "concat-map-0.0.1" = {
1628 name = "concat-map";
1629 packageName = "concat-map";
1630 version = "0.0.1";
1631 src = fetchurl {
1632 url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
1633 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
1634 };
1635 };
1636 "concat-stream-1.6.2" = {
1637 name = "concat-stream";
1638 packageName = "concat-stream";
1639 version = "1.6.2";
1640 src = fetchurl {
1641 url = "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz";
1642 sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==";
1643 };
1644 };
1645 "config-chain-1.1.12" = {
1646 name = "config-chain";
1647 packageName = "config-chain";
1648 version = "1.1.12";
1649 src = fetchurl {
1650 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz";
1651 sha512 = "a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==";
1652 };
1653 };
1654 "console-browserify-1.2.0" = {
1655 name = "console-browserify";
1656 packageName = "console-browserify";
1657 version = "1.2.0";
1658 src = fetchurl {
1659 url = "https://registry.npmjs.org/console-browserify/-/console-browserify-1.2.0.tgz";
1660 sha512 = "ZMkYO/LkF17QvCPqM0gxw8yUzigAOZOSWSHg91FH6orS7vcEj5dVZTidN2fQ14yBSdg97RqhSNwLUXInd52OTA==";
1661 };
1662 };
1663 "constants-browserify-1.0.0" = {
1664 name = "constants-browserify";
1665 packageName = "constants-browserify";
1666 version = "1.0.0";
1667 src = fetchurl {
1668 url = "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz";
1669 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
1670 };
1671 };
1672 "convert-source-map-1.7.0" = {
1673 name = "convert-source-map";
1674 packageName = "convert-source-map";
1675 version = "1.7.0";
1676 src = fetchurl {
1677 url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.7.0.tgz";
1678 sha512 = "4FJkXzKXEDB1snCFZlLP4gpC3JILicCpGbzG9f9G7tGqGCzETQ2hWPrcinA9oU4wtf2biUaEH5065UnMeR33oA==";
1679 };
1680 };
1681 "copy-descriptor-0.1.1" = {
1682 name = "copy-descriptor";
1683 packageName = "copy-descriptor";
1684 version = "0.1.1";
1685 src = fetchurl {
1686 url = "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
1687 sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
1688 };
1689 };
1690 "core-js-2.6.11" = {
1691 name = "core-js";
1692 packageName = "core-js";
1693 version = "2.6.11";
1694 src = fetchurl {
1695 url = "https://registry.npmjs.org/core-js/-/core-js-2.6.11.tgz";
1696 sha512 = "5wjnpaT/3dV+XB4borEsnAYQchn00XSgTAWKDkEqv+K8KevjbzmofK6hfJ9TZIlpj2N0xQpazy7PiRQiWHqzWg==";
1697 };
1698 };
1699 "core-util-is-1.0.2" = {
1700 name = "core-util-is";
1701 packageName = "core-util-is";
1702 version = "1.0.2";
1703 src = fetchurl {
1704 url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
1705 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
1706 };
1707 };
1708 "cosmiconfig-5.2.1" = {
1709 name = "cosmiconfig";
1710 packageName = "cosmiconfig";
1711 version = "5.2.1";
1712 src = fetchurl {
1713 url = "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-5.2.1.tgz";
1714 sha512 = "H65gsXo1SKjf8zmrJ67eJk8aIRKV5ff2D4uKZIBZShbhGSpEmsQOPW/SKMKYhSTrqR7ufy6RP69rPogdaPh/kA==";
1715 };
1716 };
1717 "create-ecdh-4.0.3" = {
1718 name = "create-ecdh";
1719 packageName = "create-ecdh";
1720 version = "4.0.3";
1721 src = fetchurl {
1722 url = "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz";
1723 sha512 = "GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==";
1724 };
1725 };
1726 "create-hash-1.2.0" = {
1727 name = "create-hash";
1728 packageName = "create-hash";
1729 version = "1.2.0";
1730 src = fetchurl {
1731 url = "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz";
1732 sha512 = "z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==";
1733 };
1734 };
1735 "create-hmac-1.1.7" = {
1736 name = "create-hmac";
1737 packageName = "create-hmac";
1738 version = "1.1.7";
1739 src = fetchurl {
1740 url = "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz";
1741 sha512 = "MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==";
1742 };
1743 };
1744 "cross-spawn-6.0.5" = {
1745 name = "cross-spawn";
1746 packageName = "cross-spawn";
1747 version = "6.0.5";
1748 src = fetchurl {
1749 url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";
1750 sha512 = "eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==";
1751 };
1752 };
1753 "crypto-browserify-3.12.0" = {
1754 name = "crypto-browserify";
1755 packageName = "crypto-browserify";
1756 version = "3.12.0";
1757 src = fetchurl {
1758 url = "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
1759 sha512 = "fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==";
1760 };
1761 };
1762 "css-color-names-0.0.4" = {
1763 name = "css-color-names";
1764 packageName = "css-color-names";
1765 version = "0.0.4";
1766 src = fetchurl {
1767 url = "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz";
1768 sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
1769 };
1770 };
1771 "css-declaration-sorter-4.0.1" = {
1772 name = "css-declaration-sorter";
1773 packageName = "css-declaration-sorter";
1774 version = "4.0.1";
1775 src = fetchurl {
1776 url = "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz";
1777 sha512 = "BcxQSKTSEEQUftYpBVnsH4SF05NTuBokb19/sBt6asXGKZ/6VP7PLG1CBCkFDYOnhXhPh0jMhO6xZ71oYHXHBA==";
1778 };
1779 };
1780 "css-modules-loader-core-1.1.0" = {
1781 name = "css-modules-loader-core";
1782 packageName = "css-modules-loader-core";
1783 version = "1.1.0";
1784 src = fetchurl {
1785 url = "https://registry.npmjs.org/css-modules-loader-core/-/css-modules-loader-core-1.1.0.tgz";
1786 sha1 = "5908668294a1becd261ae0a4ce21b0b551f21d16";
1787 };
1788 };
1789 "css-select-2.1.0" = {
1790 name = "css-select";
1791 packageName = "css-select";
1792 version = "2.1.0";
1793 src = fetchurl {
1794 url = "https://registry.npmjs.org/css-select/-/css-select-2.1.0.tgz";
1795 sha512 = "Dqk7LQKpwLoH3VovzZnkzegqNSuAziQyNZUcrdDM401iY+R5NkGBXGmtO05/yaXQziALuPogeG0b7UAgjnTJTQ==";
1796 };
1797 };
1798 "css-select-base-adapter-0.1.1" = {
1799 name = "css-select-base-adapter";
1800 packageName = "css-select-base-adapter";
1801 version = "0.1.1";
1802 src = fetchurl {
1803 url = "https://registry.npmjs.org/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz";
1804 sha512 = "jQVeeRG70QI08vSTwf1jHxp74JoZsr2XSgETae8/xC8ovSnL2WF87GTLO86Sbwdt2lK4Umg4HnnwMO4YF3Ce7w==";
1805 };
1806 };
1807 "css-selector-tokenizer-0.7.2" = {
1808 name = "css-selector-tokenizer";
1809 packageName = "css-selector-tokenizer";
1810 version = "0.7.2";
1811 src = fetchurl {
1812 url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.2.tgz";
1813 sha512 = "yj856NGuAymN6r8bn8/Jl46pR+OC3eEvAhfGYDUe7YPtTPAYrSSw4oAniZ9Y8T5B92hjhwTBLUen0/vKPxf6pw==";
1814 };
1815 };
1816 "css-tree-1.0.0-alpha.37" = {
1817 name = "css-tree";
1818 packageName = "css-tree";
1819 version = "1.0.0-alpha.37";
1820 src = fetchurl {
1821 url = "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.37.tgz";
1822 sha512 = "DMxWJg0rnz7UgxKT0Q1HU/L9BeJI0M6ksor0OgqOnF+aRCDWg/N2641HmVyU9KVIu0OVVWOb2IpC9A+BJRnejg==";
1823 };
1824 };
1825 "css-tree-1.0.0-alpha.39" = {
1826 name = "css-tree";
1827 packageName = "css-tree";
1828 version = "1.0.0-alpha.39";
1829 src = fetchurl {
1830 url = "https://registry.npmjs.org/css-tree/-/css-tree-1.0.0-alpha.39.tgz";
1831 sha512 = "7UvkEYgBAHRG9Nt980lYxjsTrCyHFN53ky3wVsDkiMdVqylqRt+Zc+jm5qw7/qyOvN2dHSYtX0e4MbCCExSvnA==";
1832 };
1833 };
1834 "css-what-3.2.1" = {
1835 name = "css-what";
1836 packageName = "css-what";
1837 version = "3.2.1";
1838 src = fetchurl {
1839 url = "https://registry.npmjs.org/css-what/-/css-what-3.2.1.tgz";
1840 sha512 = "WwOrosiQTvyms+Ti5ZC5vGEK0Vod3FTt1ca+payZqvKuGJF+dq7bG63DstxtN0dpm6FxY27a/zS3Wten+gEtGw==";
1841 };
1842 };
1843 "cssesc-3.0.0" = {
1844 name = "cssesc";
1845 packageName = "cssesc";
1846 version = "3.0.0";
1847 src = fetchurl {
1848 url = "https://registry.npmjs.org/cssesc/-/cssesc-3.0.0.tgz";
1849 sha512 = "/Tb/JcjK111nNScGob5MNtsntNM1aCNUDipB/TkwZFhyDrrE47SOx/18wF2bbjgc3ZzCSKW1T5nt5EbFoAz/Vg==";
1850 };
1851 };
1852 "cssnano-4.1.10" = {
1853 name = "cssnano";
1854 packageName = "cssnano";
1855 version = "4.1.10";
1856 src = fetchurl {
1857 url = "https://registry.npmjs.org/cssnano/-/cssnano-4.1.10.tgz";
1858 sha512 = "5wny+F6H4/8RgNlaqab4ktc3e0/blKutmq8yNlBFXA//nSFFAqAngjNVRzUvCgYROULmZZUoosL/KSoZo5aUaQ==";
1859 };
1860 };
1861 "cssnano-preset-default-4.0.7" = {
1862 name = "cssnano-preset-default";
1863 packageName = "cssnano-preset-default";
1864 version = "4.0.7";
1865 src = fetchurl {
1866 url = "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz";
1867 sha512 = "x0YHHx2h6p0fCl1zY9L9roD7rnlltugGu7zXSKQx6k2rYw0Hi3IqxcoAGF7u9Q5w1nt7vK0ulxV8Lo+EvllGsA==";
1868 };
1869 };
1870 "cssnano-util-get-arguments-4.0.0" = {
1871 name = "cssnano-util-get-arguments";
1872 packageName = "cssnano-util-get-arguments";
1873 version = "4.0.0";
1874 src = fetchurl {
1875 url = "https://registry.npmjs.org/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz";
1876 sha1 = "ed3a08299f21d75741b20f3b81f194ed49cc150f";
1877 };
1878 };
1879 "cssnano-util-get-match-4.0.0" = {
1880 name = "cssnano-util-get-match";
1881 packageName = "cssnano-util-get-match";
1882 version = "4.0.0";
1883 src = fetchurl {
1884 url = "https://registry.npmjs.org/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz";
1885 sha1 = "c0e4ca07f5386bb17ec5e52250b4f5961365156d";
1886 };
1887 };
1888 "cssnano-util-raw-cache-4.0.1" = {
1889 name = "cssnano-util-raw-cache";
1890 packageName = "cssnano-util-raw-cache";
1891 version = "4.0.1";
1892 src = fetchurl {
1893 url = "https://registry.npmjs.org/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz";
1894 sha512 = "qLuYtWK2b2Dy55I8ZX3ky1Z16WYsx544Q0UWViebptpwn/xDBmog2TLg4f+DBMg1rJ6JDWtn96WHbOKDWt1WQA==";
1895 };
1896 };
1897 "cssnano-util-same-parent-4.0.1" = {
1898 name = "cssnano-util-same-parent";
1899 packageName = "cssnano-util-same-parent";
1900 version = "4.0.1";
1901 src = fetchurl {
1902 url = "https://registry.npmjs.org/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz";
1903 sha512 = "WcKx5OY+KoSIAxBW6UBBRay1U6vkYheCdjyVNDm85zt5K9mHoGOfsOsqIszfAqrQQFIIKgjh2+FDgIj/zsl21Q==";
1904 };
1905 };
1906 "csso-4.0.3" = {
1907 name = "csso";
1908 packageName = "csso";
1909 version = "4.0.3";
1910 src = fetchurl {
1911 url = "https://registry.npmjs.org/csso/-/csso-4.0.3.tgz";
1912 sha512 = "NL3spysxUkcrOgnpsT4Xdl2aiEiBG6bXswAABQVHcMrfjjBisFOKwLDOmf4wf32aPdcJws1zds2B0Rg+jqMyHQ==";
1913 };
1914 };
1915 "cssom-0.3.8" = {
1916 name = "cssom";
1917 packageName = "cssom";
1918 version = "0.3.8";
1919 src = fetchurl {
1920 url = "https://registry.npmjs.org/cssom/-/cssom-0.3.8.tgz";
1921 sha512 = "b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==";
1922 };
1923 };
1924 "cssstyle-1.4.0" = {
1925 name = "cssstyle";
1926 packageName = "cssstyle";
1927 version = "1.4.0";
1928 src = fetchurl {
1929 url = "https://registry.npmjs.org/cssstyle/-/cssstyle-1.4.0.tgz";
1930 sha512 = "GBrLZYZ4X4x6/QEoBnIrqb8B/f5l4+8me2dkom/j1Gtbxy0kBv6OGzKuAsGM75bkGwGAFkt56Iwg28S3XTZgSA==";
1931 };
1932 };
1933 "dashdash-1.14.1" = {
1934 name = "dashdash";
1935 packageName = "dashdash";
1936 version = "1.14.1";
1937 src = fetchurl {
1938 url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
1939 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
1940 };
1941 };
1942 "data-urls-1.1.0" = {
1943 name = "data-urls";
1944 packageName = "data-urls";
1945 version = "1.1.0";
1946 src = fetchurl {
1947 url = "https://registry.npmjs.org/data-urls/-/data-urls-1.1.0.tgz";
1948 sha512 = "YTWYI9se1P55u58gL5GkQHW4P6VJBJ5iBT+B5a7i2Tjadhv52paJG0qHX4A0OR6/t52odI64KP2YvFpkDOi3eQ==";
1949 };
1950 };
1951 "deasync-0.1.19" = {
1952 name = "deasync";
1953 packageName = "deasync";
1954 version = "0.1.19";
1955 src = fetchurl {
1956 url = "https://registry.npmjs.org/deasync/-/deasync-0.1.19.tgz";
1957 sha512 = "oh3MRktfnPlLysCPpBpKZZzb4cUC/p0aA3SyRGp15lN30juJBTo/CiD0d4fR+f1kBtUQoJj1NE9RPNWQ7BQ9Mg==";
1958 };
1959 };
1960 "debug-2.6.9" = {
1961 name = "debug";
1962 packageName = "debug";
1963 version = "2.6.9";
1964 src = fetchurl {
1965 url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";
1966 sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
1967 };
1968 };
1969 "debug-4.1.1" = {
1970 name = "debug";
1971 packageName = "debug";
1972 version = "4.1.1";
1973 src = fetchurl {
1974 url = "https://registry.npmjs.org/debug/-/debug-4.1.1.tgz";
1975 sha512 = "pYAIzeRo8J6KPEaJ0VWOh5Pzkbw/RetuzehGM7QRRX5he4fPHx2rdKMB256ehJCkX+XRQm16eZLqLNS8RSZXZw==";
1976 };
1977 };
1978 "decamelize-1.2.0" = {
1979 name = "decamelize";
1980 packageName = "decamelize";
1981 version = "1.2.0";
1982 src = fetchurl {
1983 url = "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz";
1984 sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
1985 };
1986 };
1987 "decode-uri-component-0.2.0" = {
1988 name = "decode-uri-component";
1989 packageName = "decode-uri-component";
1990 version = "0.2.0";
1991 src = fetchurl {
1992 url = "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
1993 sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
1994 };
1995 };
1996 "deep-is-0.1.3" = {
1997 name = "deep-is";
1998 packageName = "deep-is";
1999 version = "0.1.3";
2000 src = fetchurl {
2001 url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
2002 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
2003 };
2004 };
2005 "defaults-1.0.3" = {
2006 name = "defaults";
2007 packageName = "defaults";
2008 version = "1.0.3";
2009 src = fetchurl {
2010 url = "https://registry.npmjs.org/defaults/-/defaults-1.0.3.tgz";
2011 sha1 = "c656051e9817d9ff08ed881477f3fe4019f3ef7d";
2012 };
2013 };
2014 "define-properties-1.1.3" = {
2015 name = "define-properties";
2016 packageName = "define-properties";
2017 version = "1.1.3";
2018 src = fetchurl {
2019 url = "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz";
2020 sha512 = "3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==";
2021 };
2022 };
2023 "define-property-0.2.5" = {
2024 name = "define-property";
2025 packageName = "define-property";
2026 version = "0.2.5";
2027 src = fetchurl {
2028 url = "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz";
2029 sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
2030 };
2031 };
2032 "define-property-1.0.0" = {
2033 name = "define-property";
2034 packageName = "define-property";
2035 version = "1.0.0";
2036 src = fetchurl {
2037 url = "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz";
2038 sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
2039 };
2040 };
2041 "define-property-2.0.2" = {
2042 name = "define-property";
2043 packageName = "define-property";
2044 version = "2.0.2";
2045 src = fetchurl {
2046 url = "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz";
2047 sha512 = "jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==";
2048 };
2049 };
2050 "delayed-stream-1.0.0" = {
2051 name = "delayed-stream";
2052 packageName = "delayed-stream";
2053 version = "1.0.0";
2054 src = fetchurl {
2055 url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
2056 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
2057 };
2058 };
2059 "depd-1.1.2" = {
2060 name = "depd";
2061 packageName = "depd";
2062 version = "1.1.2";
2063 src = fetchurl {
2064 url = "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz";
2065 sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
2066 };
2067 };
2068 "des.js-1.0.1" = {
2069 name = "des.js";
2070 packageName = "des.js";
2071 version = "1.0.1";
2072 src = fetchurl {
2073 url = "https://registry.npmjs.org/des.js/-/des.js-1.0.1.tgz";
2074 sha512 = "Q0I4pfFrv2VPd34/vfLrFOoRmlYj3OV50i7fskps1jZWK1kApMWWT9G6RRUeYedLcBDIhnSDaUvJMb3AhUlaEA==";
2075 };
2076 };
2077 "destroy-1.0.4" = {
2078 name = "destroy";
2079 packageName = "destroy";
2080 version = "1.0.4";
2081 src = fetchurl {
2082 url = "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz";
2083 sha1 = "978857442c44749e4206613e37946205826abd80";
2084 };
2085 };
2086 "diffie-hellman-5.0.3" = {
2087 name = "diffie-hellman";
2088 packageName = "diffie-hellman";
2089 version = "5.0.3";
2090 src = fetchurl {
2091 url = "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
2092 sha512 = "kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==";
2093 };
2094 };
2095 "dom-serializer-0.2.2" = {
2096 name = "dom-serializer";
2097 packageName = "dom-serializer";
2098 version = "0.2.2";
2099 src = fetchurl {
2100 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.2.2.tgz";
2101 sha512 = "2/xPb3ORsQ42nHYiSunXkDjPLBaEj/xTwUO4B7XCZQTRk7EBtTOPaygh10YAAh2OI1Qrp6NWfpAhzswj0ydt9g==";
2102 };
2103 };
2104 "domain-browser-1.2.0" = {
2105 name = "domain-browser";
2106 packageName = "domain-browser";
2107 version = "1.2.0";
2108 src = fetchurl {
2109 url = "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz";
2110 sha512 = "jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==";
2111 };
2112 };
2113 "domelementtype-1.3.1" = {
2114 name = "domelementtype";
2115 packageName = "domelementtype";
2116 version = "1.3.1";
2117 src = fetchurl {
2118 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.1.tgz";
2119 sha512 = "BSKB+TSpMpFI/HOxCNr1O8aMOTZ8hT3pM3GQ0w/mWRmkhEDSFJkkyzz4XQsBV44BChwGkrDfMyjVD0eA2aFV3w==";
2120 };
2121 };
2122 "domelementtype-2.0.1" = {
2123 name = "domelementtype";
2124 packageName = "domelementtype";
2125 version = "2.0.1";
2126 src = fetchurl {
2127 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-2.0.1.tgz";
2128 sha512 = "5HOHUDsYZWV8FGWN0Njbr/Rn7f/eWSQi1v7+HsUVwXgn8nWWlL64zKDkS0n8ZmQ3mlWOMuXOnR+7Nx/5tMO5AQ==";
2129 };
2130 };
2131 "domexception-1.0.1" = {
2132 name = "domexception";
2133 packageName = "domexception";
2134 version = "1.0.1";
2135 src = fetchurl {
2136 url = "https://registry.npmjs.org/domexception/-/domexception-1.0.1.tgz";
2137 sha512 = "raigMkn7CJNNo6Ihro1fzG7wr3fHuYVytzquZKX5n0yizGsTcYgzdIUwj1X9pK0VvjeihV+XiclP+DjwbsSKug==";
2138 };
2139 };
2140 "domhandler-2.4.2" = {
2141 name = "domhandler";
2142 packageName = "domhandler";
2143 version = "2.4.2";
2144 src = fetchurl {
2145 url = "https://registry.npmjs.org/domhandler/-/domhandler-2.4.2.tgz";
2146 sha512 = "JiK04h0Ht5u/80fdLMCEmV4zkNh2BcoMFBmZ/91WtYZ8qVXSKjiw7fXMgFPnHcSZgOo3XdinHvmnDUeMf5R4wA==";
2147 };
2148 };
2149 "domutils-1.7.0" = {
2150 name = "domutils";
2151 packageName = "domutils";
2152 version = "1.7.0";
2153 src = fetchurl {
2154 url = "https://registry.npmjs.org/domutils/-/domutils-1.7.0.tgz";
2155 sha512 = "Lgd2XcJ/NjEw+7tFvfKxOzCYKZsdct5lczQ2ZaQY8Djz7pfAD3Gbp8ySJWtreII/vDlMVmxwa6pHmdxIYgttDg==";
2156 };
2157 };
2158 "dot-prop-5.2.0" = {
2159 name = "dot-prop";
2160 packageName = "dot-prop";
2161 version = "5.2.0";
2162 src = fetchurl {
2163 url = "https://registry.npmjs.org/dot-prop/-/dot-prop-5.2.0.tgz";
2164 sha512 = "uEUyaDKoSQ1M4Oq8l45hSE26SnTxL6snNnqvK/VWx5wJhmff5z0FUVJDKDanor/6w3kzE3i7XZOk+7wC0EXr1A==";
2165 };
2166 };
2167 "dotenv-5.0.1" = {
2168 name = "dotenv";
2169 packageName = "dotenv";
2170 version = "5.0.1";
2171 src = fetchurl {
2172 url = "https://registry.npmjs.org/dotenv/-/dotenv-5.0.1.tgz";
2173 sha512 = "4As8uPrjfwb7VXC+WnLCbXK7y+Ueb2B3zgNCePYfhxS1PYeaO1YTeplffTEcbfLhvFNGLAz90VvJs9yomG7bow==";
2174 };
2175 };
2176 "dotenv-expand-4.2.0" = {
2177 name = "dotenv-expand";
2178 packageName = "dotenv-expand";
2179 version = "4.2.0";
2180 src = fetchurl {
2181 url = "https://registry.npmjs.org/dotenv-expand/-/dotenv-expand-4.2.0.tgz";
2182 sha1 = "def1f1ca5d6059d24a766e587942c21106ce1275";
2183 };
2184 };
2185 "duplexer2-0.1.4" = {
2186 name = "duplexer2";
2187 packageName = "duplexer2";
2188 version = "0.1.4";
2189 src = fetchurl {
2190 url = "https://registry.npmjs.org/duplexer2/-/duplexer2-0.1.4.tgz";
2191 sha1 = "8b12dab878c0d69e3e7891051662a32fc6bddcc1";
2192 };
2193 };
2194 "ecc-jsbn-0.1.2" = {
2195 name = "ecc-jsbn";
2196 packageName = "ecc-jsbn";
2197 version = "0.1.2";
2198 src = fetchurl {
2199 url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
2200 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
2201 };
2202 };
2203 "editorconfig-0.15.3" = {
2204 name = "editorconfig";
2205 packageName = "editorconfig";
2206 version = "0.15.3";
2207 src = fetchurl {
2208 url = "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz";
2209 sha512 = "M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==";
2210 };
2211 };
2212 "ee-first-1.1.1" = {
2213 name = "ee-first";
2214 packageName = "ee-first";
2215 version = "1.1.1";
2216 src = fetchurl {
2217 url = "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz";
2218 sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
2219 };
2220 };
2221 "electron-to-chromium-1.3.418" = {
2222 name = "electron-to-chromium";
2223 packageName = "electron-to-chromium";
2224 version = "1.3.418";
2225 src = fetchurl {
2226 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.418.tgz";
2227 sha512 = "i2QrQtHes5fK/F9QGG5XacM5WKEuR322fxTYF9e8O9Gu0mc0WmjjwGpV8c7Htso6Zf2Di18lc3SIPxmMeRFBug==";
2228 };
2229 };
2230 "elliptic-6.5.2" = {
2231 name = "elliptic";
2232 packageName = "elliptic";
2233 version = "6.5.2";
2234 src = fetchurl {
2235 url = "https://registry.npmjs.org/elliptic/-/elliptic-6.5.2.tgz";
2236 sha512 = "f4x70okzZbIQl/NSRLkI/+tteV/9WqL98zx+SQ69KbXxmVrmjwsNUPn/gYJJ0sHvEak24cZgHIPegRePAtA/xw==";
2237 };
2238 };
2239 "elm-hot-1.1.1" = {
2240 name = "elm-hot";
2241 packageName = "elm-hot";
2242 version = "1.1.1";
2243 src = fetchurl {
2244 url = "https://registry.npmjs.org/elm-hot/-/elm-hot-1.1.1.tgz";
2245 sha512 = "ZHjoHd2Ev6riNXNQirj3J+GKKXXwedAUikfFBYzlVL/+3CdGs96cpZ7nhAk4c5l//Qa9ymltrqX36mOlr0pPFA==";
2246 };
2247 };
2248 "emoji-regex-7.0.3" = {
2249 name = "emoji-regex";
2250 packageName = "emoji-regex";
2251 version = "7.0.3";
2252 src = fetchurl {
2253 url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz";
2254 sha512 = "CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==";
2255 };
2256 };
2257 "encodeurl-1.0.2" = {
2258 name = "encodeurl";
2259 packageName = "encodeurl";
2260 version = "1.0.2";
2261 src = fetchurl {
2262 url = "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz";
2263 sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
2264 };
2265 };
2266 "entities-1.1.2" = {
2267 name = "entities";
2268 packageName = "entities";
2269 version = "1.1.2";
2270 src = fetchurl {
2271 url = "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz";
2272 sha512 = "f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==";
2273 };
2274 };
2275 "entities-2.0.0" = {
2276 name = "entities";
2277 packageName = "entities";
2278 version = "2.0.0";
2279 src = fetchurl {
2280 url = "https://registry.npmjs.org/entities/-/entities-2.0.0.tgz";
2281 sha512 = "D9f7V0JSRwIxlRI2mjMqufDrRDnx8p+eEOz7aUM9SuvF8gsBzra0/6tbjl1m8eQHrZlYj6PxqE00hZ1SAIKPLw==";
2282 };
2283 };
2284 "error-ex-1.3.2" = {
2285 name = "error-ex";
2286 packageName = "error-ex";
2287 version = "1.3.2";
2288 src = fetchurl {
2289 url = "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz";
2290 sha512 = "7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==";
2291 };
2292 };
2293 "es-abstract-1.17.5" = {
2294 name = "es-abstract";
2295 packageName = "es-abstract";
2296 version = "1.17.5";
2297 src = fetchurl {
2298 url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.17.5.tgz";
2299 sha512 = "BR9auzDbySxOcfog0tLECW8l28eRGpDpU3Dm3Hp4q/N+VtLTmyj4EUN088XZWQDW/hzj6sYRDXeOFsaAODKvpg==";
2300 };
2301 };
2302 "es-to-primitive-1.2.1" = {
2303 name = "es-to-primitive";
2304 packageName = "es-to-primitive";
2305 version = "1.2.1";
2306 src = fetchurl {
2307 url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.1.tgz";
2308 sha512 = "QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==";
2309 };
2310 };
2311 "escape-html-1.0.3" = {
2312 name = "escape-html";
2313 packageName = "escape-html";
2314 version = "1.0.3";
2315 src = fetchurl {
2316 url = "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz";
2317 sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
2318 };
2319 };
2320 "escape-string-regexp-1.0.5" = {
2321 name = "escape-string-regexp";
2322 packageName = "escape-string-regexp";
2323 version = "1.0.5";
2324 src = fetchurl {
2325 url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
2326 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
2327 };
2328 };
2329 "escodegen-1.14.1" = {
2330 name = "escodegen";
2331 packageName = "escodegen";
2332 version = "1.14.1";
2333 src = fetchurl {
2334 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.14.1.tgz";
2335 sha512 = "Bmt7NcRySdIfNPfU2ZoXDrrXsG9ZjvDxcAlMfDUgRBjLOWTuIACXPBFJH7Z+cLb40JeQco5toikyc9t9P8E9SQ==";
2336 };
2337 };
2338 "escodegen-1.9.1" = {
2339 name = "escodegen";
2340 packageName = "escodegen";
2341 version = "1.9.1";
2342 src = fetchurl {
2343 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.9.1.tgz";
2344 sha512 = "6hTjO1NAWkHnDk3OqQ4YrCuwwmGHL9S3nPlzBOUG/R44rda3wLNrfvQ5fkSGjyhHFKM7ALPKcKGrwvCLe0lC7Q==";
2345 };
2346 };
2347 "esprima-3.1.3" = {
2348 name = "esprima";
2349 packageName = "esprima";
2350 version = "3.1.3";
2351 src = fetchurl {
2352 url = "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz";
2353 sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
2354 };
2355 };
2356 "esprima-4.0.1" = {
2357 name = "esprima";
2358 packageName = "esprima";
2359 version = "4.0.1";
2360 src = fetchurl {
2361 url = "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz";
2362 sha512 = "eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==";
2363 };
2364 };
2365 "estraverse-4.3.0" = {
2366 name = "estraverse";
2367 packageName = "estraverse";
2368 version = "4.3.0";
2369 src = fetchurl {
2370 url = "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz";
2371 sha512 = "39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==";
2372 };
2373 };
2374 "esutils-2.0.3" = {
2375 name = "esutils";
2376 packageName = "esutils";
2377 version = "2.0.3";
2378 src = fetchurl {
2379 url = "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz";
2380 sha512 = "kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==";
2381 };
2382 };
2383 "etag-1.8.1" = {
2384 name = "etag";
2385 packageName = "etag";
2386 version = "1.8.1";
2387 src = fetchurl {
2388 url = "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz";
2389 sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
2390 };
2391 };
2392 "events-3.1.0" = {
2393 name = "events";
2394 packageName = "events";
2395 version = "3.1.0";
2396 src = fetchurl {
2397 url = "https://registry.npmjs.org/events/-/events-3.1.0.tgz";
2398 sha512 = "Rv+u8MLHNOdMjTAFeT3nCjHn2aGlx435FP/sDHNaRhDEMwyI/aB22Kj2qIN8R0cw3z28psEQLYwxVKLsKrMgWg==";
2399 };
2400 };
2401 "evp_bytestokey-1.0.3" = {
2402 name = "evp_bytestokey";
2403 packageName = "evp_bytestokey";
2404 version = "1.0.3";
2405 src = fetchurl {
2406 url = "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
2407 sha512 = "/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==";
2408 };
2409 };
2410 "expand-brackets-2.1.4" = {
2411 name = "expand-brackets";
2412 packageName = "expand-brackets";
2413 version = "2.1.4";
2414 src = fetchurl {
2415 url = "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz";
2416 sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
2417 };
2418 };
2419 "extend-3.0.2" = {
2420 name = "extend";
2421 packageName = "extend";
2422 version = "3.0.2";
2423 src = fetchurl {
2424 url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
2425 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
2426 };
2427 };
2428 "extend-shallow-2.0.1" = {
2429 name = "extend-shallow";
2430 packageName = "extend-shallow";
2431 version = "2.0.1";
2432 src = fetchurl {
2433 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz";
2434 sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
2435 };
2436 };
2437 "extend-shallow-3.0.2" = {
2438 name = "extend-shallow";
2439 packageName = "extend-shallow";
2440 version = "3.0.2";
2441 src = fetchurl {
2442 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz";
2443 sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
2444 };
2445 };
2446 "extglob-2.0.4" = {
2447 name = "extglob";
2448 packageName = "extglob";
2449 version = "2.0.4";
2450 src = fetchurl {
2451 url = "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz";
2452 sha512 = "Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==";
2453 };
2454 };
2455 "extsprintf-1.3.0" = {
2456 name = "extsprintf";
2457 packageName = "extsprintf";
2458 version = "1.3.0";
2459 src = fetchurl {
2460 url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
2461 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
2462 };
2463 };
2464 "falafel-2.2.4" = {
2465 name = "falafel";
2466 packageName = "falafel";
2467 version = "2.2.4";
2468 src = fetchurl {
2469 url = "https://registry.npmjs.org/falafel/-/falafel-2.2.4.tgz";
2470 sha512 = "0HXjo8XASWRmsS0X1EkhwEMZaD3Qvp7FfURwjLKjG1ghfRm/MGZl2r4cWUTv41KdNghTw4OUMmVtdGQp3+H+uQ==";
2471 };
2472 };
2473 "fast-deep-equal-3.1.1" = {
2474 name = "fast-deep-equal";
2475 packageName = "fast-deep-equal";
2476 version = "3.1.1";
2477 src = fetchurl {
2478 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
2479 sha512 = "8UEa58QDLauDNfpbrX55Q9jrGHThw2ZMdOky5Gl1CDtVeJDPVrG4Jxx1N8jw2gkWaff5UUuX1KJd+9zGe2B+ZA==";
2480 };
2481 };
2482 "fast-glob-2.2.7" = {
2483 name = "fast-glob";
2484 packageName = "fast-glob";
2485 version = "2.2.7";
2486 src = fetchurl {
2487 url = "https://registry.npmjs.org/fast-glob/-/fast-glob-2.2.7.tgz";
2488 sha512 = "g1KuQwHOZAmOZMuBtHdxDtju+T2RT8jgCC9aANsbpdiDDTSnjgfuVsIBNKbUeJI3oKMRExcfNDtJl4OhbffMsw==";
2489 };
2490 };
2491 "fast-json-stable-stringify-2.1.0" = {
2492 name = "fast-json-stable-stringify";
2493 packageName = "fast-json-stable-stringify";
2494 version = "2.1.0";
2495 src = fetchurl {
2496 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
2497 sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
2498 };
2499 };
2500 "fast-levenshtein-2.0.6" = {
2501 name = "fast-levenshtein";
2502 packageName = "fast-levenshtein";
2503 version = "2.0.6";
2504 src = fetchurl {
2505 url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
2506 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
2507 };
2508 };
2509 "fastparse-1.1.2" = {
2510 name = "fastparse";
2511 packageName = "fastparse";
2512 version = "1.1.2";
2513 src = fetchurl {
2514 url = "https://registry.npmjs.org/fastparse/-/fastparse-1.1.2.tgz";
2515 sha512 = "483XLLxTVIwWK3QTrMGRqUfUpoOs/0hbQrl2oz4J0pAcm3A3bu84wxTFqGqkJzewCLdME38xJLJAxBABfQT8sQ==";
2516 };
2517 };
2518 "file-uri-to-path-1.0.0" = {
2519 name = "file-uri-to-path";
2520 packageName = "file-uri-to-path";
2521 version = "1.0.0";
2522 src = fetchurl {
2523 url = "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz";
2524 sha512 = "0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==";
2525 };
2526 };
2527 "filesize-3.6.1" = {
2528 name = "filesize";
2529 packageName = "filesize";
2530 version = "3.6.1";
2531 src = fetchurl {
2532 url = "https://registry.npmjs.org/filesize/-/filesize-3.6.1.tgz";
2533 sha512 = "7KjR1vv6qnicaPMi1iiTcI85CyYwRO/PSFCu6SvqL8jN2Wjt/NIYQTFtFs7fSDCYOstUkEWIQGFUg5YZQfjlcg==";
2534 };
2535 };
2536 "fill-range-4.0.0" = {
2537 name = "fill-range";
2538 packageName = "fill-range";
2539 version = "4.0.0";
2540 src = fetchurl {
2541 url = "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz";
2542 sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
2543 };
2544 };
2545 "find-elm-dependencies-2.0.2" = {
2546 name = "find-elm-dependencies";
2547 packageName = "find-elm-dependencies";
2548 version = "2.0.2";
2549 src = fetchurl {
2550 url = "https://registry.npmjs.org/find-elm-dependencies/-/find-elm-dependencies-2.0.2.tgz";
2551 sha512 = "nM5UCbccD1G8CGK2GsM7ykG3ksOAl9E+34jiDfl07CAl2OPnLpBVWY2hlxEmIkSBfdJjSopEowWHrO0cI8RhxQ==";
2552 };
2553 };
2554 "find-up-2.1.0" = {
2555 name = "find-up";
2556 packageName = "find-up";
2557 version = "2.1.0";
2558 src = fetchurl {
2559 url = "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz";
2560 sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
2561 };
2562 };
2563 "find-up-3.0.0" = {
2564 name = "find-up";
2565 packageName = "find-up";
2566 version = "3.0.0";
2567 src = fetchurl {
2568 url = "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz";
2569 sha512 = "1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==";
2570 };
2571 };
2572 "firstline-1.2.0" = {
2573 name = "firstline";
2574 packageName = "firstline";
2575 version = "1.2.0";
2576 src = fetchurl {
2577 url = "https://registry.npmjs.org/firstline/-/firstline-1.2.0.tgz";
2578 sha1 = "c9f4886e7f7fbf0afc12d71941dce06b192aea05";
2579 };
2580 };
2581 "for-in-1.0.2" = {
2582 name = "for-in";
2583 packageName = "for-in";
2584 version = "1.0.2";
2585 src = fetchurl {
2586 url = "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz";
2587 sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
2588 };
2589 };
2590 "foreach-2.0.5" = {
2591 name = "foreach";
2592 packageName = "foreach";
2593 version = "2.0.5";
2594 src = fetchurl {
2595 url = "https://registry.npmjs.org/foreach/-/foreach-2.0.5.tgz";
2596 sha1 = "0bee005018aeb260d0a3af3ae658dd0136ec1b99";
2597 };
2598 };
2599 "forever-agent-0.6.1" = {
2600 name = "forever-agent";
2601 packageName = "forever-agent";
2602 version = "0.6.1";
2603 src = fetchurl {
2604 url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
2605 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
2606 };
2607 };
2608 "form-data-2.3.3" = {
2609 name = "form-data";
2610 packageName = "form-data";
2611 version = "2.3.3";
2612 src = fetchurl {
2613 url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";
2614 sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
2615 };
2616 };
2617 "fragment-cache-0.2.1" = {
2618 name = "fragment-cache";
2619 packageName = "fragment-cache";
2620 version = "0.2.1";
2621 src = fetchurl {
2622 url = "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz";
2623 sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
2624 };
2625 };
2626 "fresh-0.5.2" = {
2627 name = "fresh";
2628 packageName = "fresh";
2629 version = "0.5.2";
2630 src = fetchurl {
2631 url = "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz";
2632 sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
2633 };
2634 };
2635 "fs.realpath-1.0.0" = {
2636 name = "fs.realpath";
2637 packageName = "fs.realpath";
2638 version = "1.0.0";
2639 src = fetchurl {
2640 url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
2641 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
2642 };
2643 };
2644 "fsevents-1.2.12" = {
2645 name = "fsevents";
2646 packageName = "fsevents";
2647 version = "1.2.12";
2648 src = fetchurl {
2649 url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.12.tgz";
2650 sha512 = "Ggd/Ktt7E7I8pxZRbGIs7vwqAPscSESMrCSkx2FtWeqmheJgCo2R74fTsZFCifr0VTPwqRpPv17+6b8Zp7th0Q==";
2651 };
2652 };
2653 "function-bind-1.1.1" = {
2654 name = "function-bind";
2655 packageName = "function-bind";
2656 version = "1.1.1";
2657 src = fetchurl {
2658 url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz";
2659 sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==";
2660 };
2661 };
2662 "get-caller-file-2.0.5" = {
2663 name = "get-caller-file";
2664 packageName = "get-caller-file";
2665 version = "2.0.5";
2666 src = fetchurl {
2667 url = "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz";
2668 sha512 = "DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==";
2669 };
2670 };
2671 "get-port-3.2.0" = {
2672 name = "get-port";
2673 packageName = "get-port";
2674 version = "3.2.0";
2675 src = fetchurl {
2676 url = "https://registry.npmjs.org/get-port/-/get-port-3.2.0.tgz";
2677 sha1 = "dd7ce7de187c06c8bf353796ac71e099f0980ebc";
2678 };
2679 };
2680 "get-value-2.0.6" = {
2681 name = "get-value";
2682 packageName = "get-value";
2683 version = "2.0.6";
2684 src = fetchurl {
2685 url = "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz";
2686 sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
2687 };
2688 };
2689 "getpass-0.1.7" = {
2690 name = "getpass";
2691 packageName = "getpass";
2692 version = "0.1.7";
2693 src = fetchurl {
2694 url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
2695 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
2696 };
2697 };
2698 "glob-7.1.4" = {
2699 name = "glob";
2700 packageName = "glob";
2701 version = "7.1.4";
2702 src = fetchurl {
2703 url = "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz";
2704 sha512 = "hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==";
2705 };
2706 };
2707 "glob-parent-3.1.0" = {
2708 name = "glob-parent";
2709 packageName = "glob-parent";
2710 version = "3.1.0";
2711 src = fetchurl {
2712 url = "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz";
2713 sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
2714 };
2715 };
2716 "glob-to-regexp-0.3.0" = {
2717 name = "glob-to-regexp";
2718 packageName = "glob-to-regexp";
2719 version = "0.3.0";
2720 src = fetchurl {
2721 url = "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz";
2722 sha1 = "8c5a1494d2066c570cc3bfe4496175acc4d502ab";
2723 };
2724 };
2725 "globals-11.12.0" = {
2726 name = "globals";
2727 packageName = "globals";
2728 version = "11.12.0";
2729 src = fetchurl {
2730 url = "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz";
2731 sha512 = "WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==";
2732 };
2733 };
2734 "graceful-fs-4.2.3" = {
2735 name = "graceful-fs";
2736 packageName = "graceful-fs";
2737 version = "4.2.3";
2738 src = fetchurl {
2739 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.3.tgz";
2740 sha512 = "a30VEBm4PEdx1dRB7MFK7BejejvCvBronbLjht+sHuGYj8PHs7M/5Z+rt5lw551vZ7yfTCj4Vuyy3mSJytDWRQ==";
2741 };
2742 };
2743 "grapheme-breaker-0.3.2" = {
2744 name = "grapheme-breaker";
2745 packageName = "grapheme-breaker";
2746 version = "0.3.2";
2747 src = fetchurl {
2748 url = "https://registry.npmjs.org/grapheme-breaker/-/grapheme-breaker-0.3.2.tgz";
2749 sha1 = "5b9e6b78c3832452d2ba2bb1cb830f96276410ac";
2750 };
2751 };
2752 "har-schema-2.0.0" = {
2753 name = "har-schema";
2754 packageName = "har-schema";
2755 version = "2.0.0";
2756 src = fetchurl {
2757 url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";
2758 sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
2759 };
2760 };
2761 "har-validator-5.1.3" = {
2762 name = "har-validator";
2763 packageName = "har-validator";
2764 version = "5.1.3";
2765 src = fetchurl {
2766 url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.3.tgz";
2767 sha512 = "sNvOCzEQNr/qrvJgc3UG/kD4QtlHycrzwS+6mfTrrSq97BvaYcPZZI1ZSqGSPR73Cxn4LKTD4PttRwfU7jWq5g==";
2768 };
2769 };
2770 "has-1.0.3" = {
2771 name = "has";
2772 packageName = "has";
2773 version = "1.0.3";
2774 src = fetchurl {
2775 url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz";
2776 sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==";
2777 };
2778 };
2779 "has-ansi-2.0.0" = {
2780 name = "has-ansi";
2781 packageName = "has-ansi";
2782 version = "2.0.0";
2783 src = fetchurl {
2784 url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
2785 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
2786 };
2787 };
2788 "has-flag-1.0.0" = {
2789 name = "has-flag";
2790 packageName = "has-flag";
2791 version = "1.0.0";
2792 src = fetchurl {
2793 url = "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz";
2794 sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
2795 };
2796 };
2797 "has-flag-3.0.0" = {
2798 name = "has-flag";
2799 packageName = "has-flag";
2800 version = "3.0.0";
2801 src = fetchurl {
2802 url = "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz";
2803 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
2804 };
2805 };
2806 "has-symbols-1.0.1" = {
2807 name = "has-symbols";
2808 packageName = "has-symbols";
2809 version = "1.0.1";
2810 src = fetchurl {
2811 url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.1.tgz";
2812 sha512 = "PLcsoqu++dmEIZB+6totNFKq/7Do+Z0u4oT0zKOJNl3lYK6vGwwu2hjHs+68OEZbTjiUE9bgOABXbP/GvrS0Kg==";
2813 };
2814 };
2815 "has-value-0.3.1" = {
2816 name = "has-value";
2817 packageName = "has-value";
2818 version = "0.3.1";
2819 src = fetchurl {
2820 url = "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz";
2821 sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
2822 };
2823 };
2824 "has-value-1.0.0" = {
2825 name = "has-value";
2826 packageName = "has-value";
2827 version = "1.0.0";
2828 src = fetchurl {
2829 url = "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz";
2830 sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
2831 };
2832 };
2833 "has-values-0.1.4" = {
2834 name = "has-values";
2835 packageName = "has-values";
2836 version = "0.1.4";
2837 src = fetchurl {
2838 url = "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz";
2839 sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
2840 };
2841 };
2842 "has-values-1.0.0" = {
2843 name = "has-values";
2844 packageName = "has-values";
2845 version = "1.0.0";
2846 src = fetchurl {
2847 url = "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz";
2848 sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
2849 };
2850 };
2851 "hash-base-3.0.4" = {
2852 name = "hash-base";
2853 packageName = "hash-base";
2854 version = "3.0.4";
2855 src = fetchurl {
2856 url = "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz";
2857 sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918";
2858 };
2859 };
2860 "hash.js-1.1.7" = {
2861 name = "hash.js";
2862 packageName = "hash.js";
2863 version = "1.1.7";
2864 src = fetchurl {
2865 url = "https://registry.npmjs.org/hash.js/-/hash.js-1.1.7.tgz";
2866 sha512 = "taOaskGt4z4SOANNseOviYDvjEJinIkRgmp7LbKP2YTTmVxWBl87s/uzK9r+44BclBSp2X7K1hqeNfz9JbBeXA==";
2867 };
2868 };
2869 "hex-color-regex-1.1.0" = {
2870 name = "hex-color-regex";
2871 packageName = "hex-color-regex";
2872 version = "1.1.0";
2873 src = fetchurl {
2874 url = "https://registry.npmjs.org/hex-color-regex/-/hex-color-regex-1.1.0.tgz";
2875 sha512 = "l9sfDFsuqtOqKDsQdqrMRk0U85RZc0RtOR9yPI7mRVOa4FsR/BVnZ0shmQRM96Ji99kYZP/7hn1cedc1+ApsTQ==";
2876 };
2877 };
2878 "hmac-drbg-1.0.1" = {
2879 name = "hmac-drbg";
2880 packageName = "hmac-drbg";
2881 version = "1.0.1";
2882 src = fetchurl {
2883 url = "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
2884 sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
2885 };
2886 };
2887 "hsl-regex-1.0.0" = {
2888 name = "hsl-regex";
2889 packageName = "hsl-regex";
2890 version = "1.0.0";
2891 src = fetchurl {
2892 url = "https://registry.npmjs.org/hsl-regex/-/hsl-regex-1.0.0.tgz";
2893 sha1 = "d49330c789ed819e276a4c0d272dffa30b18fe6e";
2894 };
2895 };
2896 "hsla-regex-1.0.0" = {
2897 name = "hsla-regex";
2898 packageName = "hsla-regex";
2899 version = "1.0.0";
2900 src = fetchurl {
2901 url = "https://registry.npmjs.org/hsla-regex/-/hsla-regex-1.0.0.tgz";
2902 sha1 = "c1ce7a3168c8c6614033a4b5f7877f3b225f9c38";
2903 };
2904 };
2905 "html-comment-regex-1.1.2" = {
2906 name = "html-comment-regex";
2907 packageName = "html-comment-regex";
2908 version = "1.1.2";
2909 src = fetchurl {
2910 url = "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz";
2911 sha512 = "P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==";
2912 };
2913 };
2914 "html-encoding-sniffer-1.0.2" = {
2915 name = "html-encoding-sniffer";
2916 packageName = "html-encoding-sniffer";
2917 version = "1.0.2";
2918 src = fetchurl {
2919 url = "https://registry.npmjs.org/html-encoding-sniffer/-/html-encoding-sniffer-1.0.2.tgz";
2920 sha512 = "71lZziiDnsuabfdYiUeWdCVyKuqwWi23L8YeIgV9jSSZHCtb6wB1BKWooH7L3tn4/FuZJMVWyNaIDr4RGmaSYw==";
2921 };
2922 };
2923 "html-tags-1.2.0" = {
2924 name = "html-tags";
2925 packageName = "html-tags";
2926 version = "1.2.0";
2927 src = fetchurl {
2928 url = "https://registry.npmjs.org/html-tags/-/html-tags-1.2.0.tgz";
2929 sha1 = "c78de65b5663aa597989dd2b7ab49200d7e4db98";
2930 };
2931 };
2932 "htmlnano-0.2.5" = {
2933 name = "htmlnano";
2934 packageName = "htmlnano";
2935 version = "0.2.5";
2936 src = fetchurl {
2937 url = "https://registry.npmjs.org/htmlnano/-/htmlnano-0.2.5.tgz";
2938 sha512 = "X1iPSwXG/iF9bVs+/obt2n6F64uH0ETkA8zp7qFDmLW9/+A6ueHGeb/+qD67T21qUY22owZPMdawljN50ajkqA==";
2939 };
2940 };
2941 "htmlparser2-3.10.1" = {
2942 name = "htmlparser2";
2943 packageName = "htmlparser2";
2944 version = "3.10.1";
2945 src = fetchurl {
2946 url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.10.1.tgz";
2947 sha512 = "IgieNijUMbkDovyoKObU1DUhm1iwNYE/fuifEoEHfd1oZKZDaONBSkal7Y01shxsM49R4XaMdGez3WnF9UfiCQ==";
2948 };
2949 };
2950 "http-errors-1.7.3" = {
2951 name = "http-errors";
2952 packageName = "http-errors";
2953 version = "1.7.3";
2954 src = fetchurl {
2955 url = "https://registry.npmjs.org/http-errors/-/http-errors-1.7.3.tgz";
2956 sha512 = "ZTTX0MWrsQ2ZAhA1cejAwDLycFsd7I7nVtnkT3Ol0aqodaKW+0CTZDQ1uBv5whptCnc8e8HeRRJxRs0kmm/Qfw==";
2957 };
2958 };
2959 "http-signature-1.2.0" = {
2960 name = "http-signature";
2961 packageName = "http-signature";
2962 version = "1.2.0";
2963 src = fetchurl {
2964 url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";
2965 sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
2966 };
2967 };
2968 "https-browserify-1.0.0" = {
2969 name = "https-browserify";
2970 packageName = "https-browserify";
2971 version = "1.0.0";
2972 src = fetchurl {
2973 url = "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz";
2974 sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
2975 };
2976 };
2977 "iconv-lite-0.4.24" = {
2978 name = "iconv-lite";
2979 packageName = "iconv-lite";
2980 version = "0.4.24";
2981 src = fetchurl {
2982 url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz";
2983 sha512 = "v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==";
2984 };
2985 };
2986 "icss-replace-symbols-1.1.0" = {
2987 name = "icss-replace-symbols";
2988 packageName = "icss-replace-symbols";
2989 version = "1.1.0";
2990 src = fetchurl {
2991 url = "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
2992 sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
2993 };
2994 };
2995 "ieee754-1.1.13" = {
2996 name = "ieee754";
2997 packageName = "ieee754";
2998 version = "1.1.13";
2999 src = fetchurl {
3000 url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.13.tgz";
3001 sha512 = "4vf7I2LYV/HaWerSo3XmlMkp5eZ83i+/CDluXi/IGTs/O1sejBNhTtnxzmRZfvOUqj7lZjqHkeTvpgSFDlWZTg==";
3002 };
3003 };
3004 "import-fresh-2.0.0" = {
3005 name = "import-fresh";
3006 packageName = "import-fresh";
3007 version = "2.0.0";
3008 src = fetchurl {
3009 url = "https://registry.npmjs.org/import-fresh/-/import-fresh-2.0.0.tgz";
3010 sha1 = "d81355c15612d386c61f9ddd3922d4304822a546";
3011 };
3012 };
3013 "indexes-of-1.0.1" = {
3014 name = "indexes-of";
3015 packageName = "indexes-of";
3016 version = "1.0.1";
3017 src = fetchurl {
3018 url = "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz";
3019 sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
3020 };
3021 };
3022 "inflight-1.0.6" = {
3023 name = "inflight";
3024 packageName = "inflight";
3025 version = "1.0.6";
3026 src = fetchurl {
3027 url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
3028 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
3029 };
3030 };
3031 "inherits-2.0.1" = {
3032 name = "inherits";
3033 packageName = "inherits";
3034 version = "2.0.1";
3035 src = fetchurl {
3036 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz";
3037 sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
3038 };
3039 };
3040 "inherits-2.0.3" = {
3041 name = "inherits";
3042 packageName = "inherits";
3043 version = "2.0.3";
3044 src = fetchurl {
3045 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
3046 sha1 = "633c2c83e3da42a502f52466022480f4208261de";
3047 };
3048 };
3049 "inherits-2.0.4" = {
3050 name = "inherits";
3051 packageName = "inherits";
3052 version = "2.0.4";
3053 src = fetchurl {
3054 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz";
3055 sha512 = "k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==";
3056 };
3057 };
3058 "ini-1.3.5" = {
3059 name = "ini";
3060 packageName = "ini";
3061 version = "1.3.5";
3062 src = fetchurl {
3063 url = "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz";
3064 sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==";
3065 };
3066 };
3067 "invariant-2.2.4" = {
3068 name = "invariant";
3069 packageName = "invariant";
3070 version = "2.2.4";
3071 src = fetchurl {
3072 url = "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz";
3073 sha512 = "phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==";
3074 };
3075 };
3076 "is-absolute-url-2.1.0" = {
3077 name = "is-absolute-url";
3078 packageName = "is-absolute-url";
3079 version = "2.1.0";
3080 src = fetchurl {
3081 url = "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
3082 sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
3083 };
3084 };
3085 "is-absolute-url-3.0.3" = {
3086 name = "is-absolute-url";
3087 packageName = "is-absolute-url";
3088 version = "3.0.3";
3089 src = fetchurl {
3090 url = "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-3.0.3.tgz";
3091 sha512 = "opmNIX7uFnS96NtPmhWQgQx6/NYFgsUXYMllcfzwWKUMwfo8kku1TvE6hkNcH+Q1ts5cMVrsY7j0bxXQDciu9Q==";
3092 };
3093 };
3094 "is-accessor-descriptor-0.1.6" = {
3095 name = "is-accessor-descriptor";
3096 packageName = "is-accessor-descriptor";
3097 version = "0.1.6";
3098 src = fetchurl {
3099 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
3100 sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
3101 };
3102 };
3103 "is-accessor-descriptor-1.0.0" = {
3104 name = "is-accessor-descriptor";
3105 packageName = "is-accessor-descriptor";
3106 version = "1.0.0";
3107 src = fetchurl {
3108 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
3109 sha512 = "m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==";
3110 };
3111 };
3112 "is-arrayish-0.2.1" = {
3113 name = "is-arrayish";
3114 packageName = "is-arrayish";
3115 version = "0.2.1";
3116 src = fetchurl {
3117 url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz";
3118 sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
3119 };
3120 };
3121 "is-arrayish-0.3.2" = {
3122 name = "is-arrayish";
3123 packageName = "is-arrayish";
3124 version = "0.3.2";
3125 src = fetchurl {
3126 url = "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz";
3127 sha512 = "eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==";
3128 };
3129 };
3130 "is-binary-path-1.0.1" = {
3131 name = "is-binary-path";
3132 packageName = "is-binary-path";
3133 version = "1.0.1";
3134 src = fetchurl {
3135 url = "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz";
3136 sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
3137 };
3138 };
3139 "is-buffer-1.1.6" = {
3140 name = "is-buffer";
3141 packageName = "is-buffer";
3142 version = "1.1.6";
3143 src = fetchurl {
3144 url = "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz";
3145 sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
3146 };
3147 };
3148 "is-callable-1.1.5" = {
3149 name = "is-callable";
3150 packageName = "is-callable";
3151 version = "1.1.5";
3152 src = fetchurl {
3153 url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.5.tgz";
3154 sha512 = "ESKv5sMCJB2jnHTWZ3O5itG+O128Hsus4K4Qh1h2/cgn2vbgnLSVqfV46AeJA9D5EeeLa9w81KUXMtn34zhX+Q==";
3155 };
3156 };
3157 "is-color-stop-1.1.0" = {
3158 name = "is-color-stop";
3159 packageName = "is-color-stop";
3160 version = "1.1.0";
3161 src = fetchurl {
3162 url = "https://registry.npmjs.org/is-color-stop/-/is-color-stop-1.1.0.tgz";
3163 sha1 = "cfff471aee4dd5c9e158598fbe12967b5cdad345";
3164 };
3165 };
3166 "is-data-descriptor-0.1.4" = {
3167 name = "is-data-descriptor";
3168 packageName = "is-data-descriptor";
3169 version = "0.1.4";
3170 src = fetchurl {
3171 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
3172 sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
3173 };
3174 };
3175 "is-data-descriptor-1.0.0" = {
3176 name = "is-data-descriptor";
3177 packageName = "is-data-descriptor";
3178 version = "1.0.0";
3179 src = fetchurl {
3180 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
3181 sha512 = "jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==";
3182 };
3183 };
3184 "is-date-object-1.0.2" = {
3185 name = "is-date-object";
3186 packageName = "is-date-object";
3187 version = "1.0.2";
3188 src = fetchurl {
3189 url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.2.tgz";
3190 sha512 = "USlDT524woQ08aoZFzh3/Z6ch9Y/EWXEHQ/AaRN0SkKq4t2Jw2R2339tSXmwuVoY7LLlBCbOIlx2myP/L5zk0g==";
3191 };
3192 };
3193 "is-descriptor-0.1.6" = {
3194 name = "is-descriptor";
3195 packageName = "is-descriptor";
3196 version = "0.1.6";
3197 src = fetchurl {
3198 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz";
3199 sha512 = "avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==";
3200 };
3201 };
3202 "is-descriptor-1.0.2" = {
3203 name = "is-descriptor";
3204 packageName = "is-descriptor";
3205 version = "1.0.2";
3206 src = fetchurl {
3207 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz";
3208 sha512 = "2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==";
3209 };
3210 };
3211 "is-directory-0.3.1" = {
3212 name = "is-directory";
3213 packageName = "is-directory";
3214 version = "0.3.1";
3215 src = fetchurl {
3216 url = "https://registry.npmjs.org/is-directory/-/is-directory-0.3.1.tgz";
3217 sha1 = "61339b6f2475fc772fd9c9d83f5c8575dc154ae1";
3218 };
3219 };
3220 "is-extendable-0.1.1" = {
3221 name = "is-extendable";
3222 packageName = "is-extendable";
3223 version = "0.1.1";
3224 src = fetchurl {
3225 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz";
3226 sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
3227 };
3228 };
3229 "is-extendable-1.0.1" = {
3230 name = "is-extendable";
3231 packageName = "is-extendable";
3232 version = "1.0.1";
3233 src = fetchurl {
3234 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz";
3235 sha512 = "arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==";
3236 };
3237 };
3238 "is-extglob-2.1.1" = {
3239 name = "is-extglob";
3240 packageName = "is-extglob";
3241 version = "2.1.1";
3242 src = fetchurl {
3243 url = "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz";
3244 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
3245 };
3246 };
3247 "is-fullwidth-code-point-2.0.0" = {
3248 name = "is-fullwidth-code-point";
3249 packageName = "is-fullwidth-code-point";
3250 version = "2.0.0";
3251 src = fetchurl {
3252 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
3253 sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
3254 };
3255 };
3256 "is-glob-3.1.0" = {
3257 name = "is-glob";
3258 packageName = "is-glob";
3259 version = "3.1.0";
3260 src = fetchurl {
3261 url = "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz";
3262 sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
3263 };
3264 };
3265 "is-glob-4.0.1" = {
3266 name = "is-glob";
3267 packageName = "is-glob";
3268 version = "4.0.1";
3269 src = fetchurl {
3270 url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz";
3271 sha512 = "5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==";
3272 };
3273 };
3274 "is-html-1.1.0" = {
3275 name = "is-html";
3276 packageName = "is-html";
3277 version = "1.1.0";
3278 src = fetchurl {
3279 url = "https://registry.npmjs.org/is-html/-/is-html-1.1.0.tgz";
3280 sha1 = "e04f1c18d39485111396f9a0273eab51af218464";
3281 };
3282 };
3283 "is-number-3.0.0" = {
3284 name = "is-number";
3285 packageName = "is-number";
3286 version = "3.0.0";
3287 src = fetchurl {
3288 url = "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz";
3289 sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
3290 };
3291 };
3292 "is-obj-2.0.0" = {
3293 name = "is-obj";
3294 packageName = "is-obj";
3295 version = "2.0.0";
3296 src = fetchurl {
3297 url = "https://registry.npmjs.org/is-obj/-/is-obj-2.0.0.tgz";
3298 sha512 = "drqDG3cbczxxEJRoOXcOjtdp1J/lyp1mNn0xaznRs8+muBhgQcrnbspox5X5fOw0HnMnbfDzvnEMEtqDEJEo8w==";
3299 };
3300 };
3301 "is-plain-object-2.0.4" = {
3302 name = "is-plain-object";
3303 packageName = "is-plain-object";
3304 version = "2.0.4";
3305 src = fetchurl {
3306 url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz";
3307 sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
3308 };
3309 };
3310 "is-regex-1.0.5" = {
3311 name = "is-regex";
3312 packageName = "is-regex";
3313 version = "1.0.5";
3314 src = fetchurl {
3315 url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.5.tgz";
3316 sha512 = "vlKW17SNq44owv5AQR3Cq0bQPEb8+kF3UKZ2fiZNOWtztYE5i0CzCZxFDwO58qAOWtxdBRVO/V5Qin1wjCqFYQ==";
3317 };
3318 };
3319 "is-resolvable-1.1.0" = {
3320 name = "is-resolvable";
3321 packageName = "is-resolvable";
3322 version = "1.1.0";
3323 src = fetchurl {
3324 url = "https://registry.npmjs.org/is-resolvable/-/is-resolvable-1.1.0.tgz";
3325 sha512 = "qgDYXFSR5WvEfuS5dMj6oTMEbrrSaM0CrFk2Yiq/gXnBvD9pMa2jGXxyhGLfvhZpuMZe18CJpFxAt3CRs42NMg==";
3326 };
3327 };
3328 "is-svg-3.0.0" = {
3329 name = "is-svg";
3330 packageName = "is-svg";
3331 version = "3.0.0";
3332 src = fetchurl {
3333 url = "https://registry.npmjs.org/is-svg/-/is-svg-3.0.0.tgz";
3334 sha512 = "gi4iHK53LR2ujhLVVj+37Ykh9GLqYHX6JOVXbLAucaG/Cqw9xwdFOjDM2qeifLs1sF1npXXFvDu0r5HNgCMrzQ==";
3335 };
3336 };
3337 "is-symbol-1.0.3" = {
3338 name = "is-symbol";
3339 packageName = "is-symbol";
3340 version = "1.0.3";
3341 src = fetchurl {
3342 url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.3.tgz";
3343 sha512 = "OwijhaRSgqvhm/0ZdAcXNZt9lYdKFpcRDT5ULUuYXPoT794UNOdU+gpT6Rzo7b4V2HUl/op6GqY894AZwv9faQ==";
3344 };
3345 };
3346 "is-typedarray-1.0.0" = {
3347 name = "is-typedarray";
3348 packageName = "is-typedarray";
3349 version = "1.0.0";
3350 src = fetchurl {
3351 url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
3352 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
3353 };
3354 };
3355 "is-url-1.2.4" = {
3356 name = "is-url";
3357 packageName = "is-url";
3358 version = "1.2.4";
3359 src = fetchurl {
3360 url = "https://registry.npmjs.org/is-url/-/is-url-1.2.4.tgz";
3361 sha512 = "ITvGim8FhRiYe4IQ5uHSkj7pVaPDrCTkNd3yq3cV7iZAcJdHTUMPMEHcqSOy9xZ9qFenQCvi+2wjH9a1nXqHww==";
3362 };
3363 };
3364 "is-windows-1.0.2" = {
3365 name = "is-windows";
3366 packageName = "is-windows";
3367 version = "1.0.2";
3368 src = fetchurl {
3369 url = "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz";
3370 sha512 = "eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==";
3371 };
3372 };
3373 "is-wsl-1.1.0" = {
3374 name = "is-wsl";
3375 packageName = "is-wsl";
3376 version = "1.1.0";
3377 src = fetchurl {
3378 url = "https://registry.npmjs.org/is-wsl/-/is-wsl-1.1.0.tgz";
3379 sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d";
3380 };
3381 };
3382 "isarray-1.0.0" = {
3383 name = "isarray";
3384 packageName = "isarray";
3385 version = "1.0.0";
3386 src = fetchurl {
3387 url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
3388 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
3389 };
3390 };
3391 "isarray-2.0.5" = {
3392 name = "isarray";
3393 packageName = "isarray";
3394 version = "2.0.5";
3395 src = fetchurl {
3396 url = "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz";
3397 sha512 = "xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==";
3398 };
3399 };
3400 "isexe-2.0.0" = {
3401 name = "isexe";
3402 packageName = "isexe";
3403 version = "2.0.0";
3404 src = fetchurl {
3405 url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";
3406 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
3407 };
3408 };
3409 "isobject-2.1.0" = {
3410 name = "isobject";
3411 packageName = "isobject";
3412 version = "2.1.0";
3413 src = fetchurl {
3414 url = "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz";
3415 sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
3416 };
3417 };
3418 "isobject-3.0.1" = {
3419 name = "isobject";
3420 packageName = "isobject";
3421 version = "3.0.1";
3422 src = fetchurl {
3423 url = "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz";
3424 sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
3425 };
3426 };
3427 "isstream-0.1.2" = {
3428 name = "isstream";
3429 packageName = "isstream";
3430 version = "0.1.2";
3431 src = fetchurl {
3432 url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
3433 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
3434 };
3435 };
3436 "js-beautify-1.11.0" = {
3437 name = "js-beautify";
3438 packageName = "js-beautify";
3439 version = "1.11.0";
3440 src = fetchurl {
3441 url = "https://registry.npmjs.org/js-beautify/-/js-beautify-1.11.0.tgz";
3442 sha512 = "a26B+Cx7USQGSWnz9YxgJNMmML/QG2nqIaL7VVYPCXbqiKz8PN0waSNvroMtvAK6tY7g/wPdNWGEP+JTNIBr6A==";
3443 };
3444 };
3445 "js-levenshtein-1.1.6" = {
3446 name = "js-levenshtein";
3447 packageName = "js-levenshtein";
3448 version = "1.1.6";
3449 src = fetchurl {
3450 url = "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz";
3451 sha512 = "X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g==";
3452 };
3453 };
3454 "js-tokens-4.0.0" = {
3455 name = "js-tokens";
3456 packageName = "js-tokens";
3457 version = "4.0.0";
3458 src = fetchurl {
3459 url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz";
3460 sha512 = "RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==";
3461 };
3462 };
3463 "js-yaml-3.13.1" = {
3464 name = "js-yaml";
3465 packageName = "js-yaml";
3466 version = "3.13.1";
3467 src = fetchurl {
3468 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz";
3469 sha512 = "YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==";
3470 };
3471 };
3472 "jsbn-0.1.1" = {
3473 name = "jsbn";
3474 packageName = "jsbn";
3475 version = "0.1.1";
3476 src = fetchurl {
3477 url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
3478 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
3479 };
3480 };
3481 "jsdom-14.1.0" = {
3482 name = "jsdom";
3483 packageName = "jsdom";
3484 version = "14.1.0";
3485 src = fetchurl {
3486 url = "https://registry.npmjs.org/jsdom/-/jsdom-14.1.0.tgz";
3487 sha512 = "O901mfJSuTdwU2w3Sn+74T+RnDVP+FuV5fH8tcPWyqrseRAb0s5xOtPgCFiPOtLcyK7CLIJwPyD83ZqQWvA5ng==";
3488 };
3489 };
3490 "jsesc-0.5.0" = {
3491 name = "jsesc";
3492 packageName = "jsesc";
3493 version = "0.5.0";
3494 src = fetchurl {
3495 url = "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz";
3496 sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
3497 };
3498 };
3499 "jsesc-2.5.2" = {
3500 name = "jsesc";
3501 packageName = "jsesc";
3502 version = "2.5.2";
3503 src = fetchurl {
3504 url = "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz";
3505 sha512 = "OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==";
3506 };
3507 };
3508 "json-parse-better-errors-1.0.2" = {
3509 name = "json-parse-better-errors";
3510 packageName = "json-parse-better-errors";
3511 version = "1.0.2";
3512 src = fetchurl {
3513 url = "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
3514 sha512 = "mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==";
3515 };
3516 };
3517 "json-schema-0.2.3" = {
3518 name = "json-schema";
3519 packageName = "json-schema";
3520 version = "0.2.3";
3521 src = fetchurl {
3522 url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
3523 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
3524 };
3525 };
3526 "json-schema-traverse-0.4.1" = {
3527 name = "json-schema-traverse";
3528 packageName = "json-schema-traverse";
3529 version = "0.4.1";
3530 src = fetchurl {
3531 url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
3532 sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
3533 };
3534 };
3535 "json-stringify-safe-5.0.1" = {
3536 name = "json-stringify-safe";
3537 packageName = "json-stringify-safe";
3538 version = "5.0.1";
3539 src = fetchurl {
3540 url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
3541 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
3542 };
3543 };
3544 "json5-1.0.1" = {
3545 name = "json5";
3546 packageName = "json5";
3547 version = "1.0.1";
3548 src = fetchurl {
3549 url = "https://registry.npmjs.org/json5/-/json5-1.0.1.tgz";
3550 sha512 = "aKS4WQjPenRxiQsC93MNfjx+nbF4PAdYzmd/1JIj8HYzqfbu86beTuNgXDzPknWk0n0uARlyewZo4s++ES36Ow==";
3551 };
3552 };
3553 "json5-2.1.3" = {
3554 name = "json5";
3555 packageName = "json5";
3556 version = "2.1.3";
3557 src = fetchurl {
3558 url = "https://registry.npmjs.org/json5/-/json5-2.1.3.tgz";
3559 sha512 = "KXPvOm8K9IJKFM0bmdn8QXh7udDh1g/giieX0NLCaMnb4hEiVFqnop2ImTXCc5e0/oHz3LTqmHGtExn5hfMkOA==";
3560 };
3561 };
3562 "jsprim-1.4.1" = {
3563 name = "jsprim";
3564 packageName = "jsprim";
3565 version = "1.4.1";
3566 src = fetchurl {
3567 url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
3568 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
3569 };
3570 };
3571 "kind-of-3.2.2" = {
3572 name = "kind-of";
3573 packageName = "kind-of";
3574 version = "3.2.2";
3575 src = fetchurl {
3576 url = "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz";
3577 sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
3578 };
3579 };
3580 "kind-of-4.0.0" = {
3581 name = "kind-of";
3582 packageName = "kind-of";
3583 version = "4.0.0";
3584 src = fetchurl {
3585 url = "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz";
3586 sha1 = "20813df3d712928b207378691a45066fae72dd57";
3587 };
3588 };
3589 "kind-of-5.1.0" = {
3590 name = "kind-of";
3591 packageName = "kind-of";
3592 version = "5.1.0";
3593 src = fetchurl {
3594 url = "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz";
3595 sha512 = "NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==";
3596 };
3597 };
3598 "kind-of-6.0.3" = {
3599 name = "kind-of";
3600 packageName = "kind-of";
3601 version = "6.0.3";
3602 src = fetchurl {
3603 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz";
3604 sha512 = "dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==";
3605 };
3606 };
3607 "levn-0.3.0" = {
3608 name = "levn";
3609 packageName = "levn";
3610 version = "0.3.0";
3611 src = fetchurl {
3612 url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
3613 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
3614 };
3615 };
3616 "locate-path-2.0.0" = {
3617 name = "locate-path";
3618 packageName = "locate-path";
3619 version = "2.0.0";
3620 src = fetchurl {
3621 url = "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz";
3622 sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
3623 };
3624 };
3625 "locate-path-3.0.0" = {
3626 name = "locate-path";
3627 packageName = "locate-path";
3628 version = "3.0.0";
3629 src = fetchurl {
3630 url = "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz";
3631 sha512 = "7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==";
3632 };
3633 };
3634 "lodash-4.17.15" = {
3635 name = "lodash";
3636 packageName = "lodash";
3637 version = "4.17.15";
3638 src = fetchurl {
3639 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.15.tgz";
3640 sha512 = "8xOcRHvCjnocdS5cpwXQXVzmmh5e5+saE2QGoeQmbKmRS6J3VQppPOIt0MnmE+4xlZoumy0GPG0D0MVIQbNA1A==";
3641 };
3642 };
3643 "lodash.clone-4.5.0" = {
3644 name = "lodash.clone";
3645 packageName = "lodash.clone";
3646 version = "4.5.0";
3647 src = fetchurl {
3648 url = "https://registry.npmjs.org/lodash.clone/-/lodash.clone-4.5.0.tgz";
3649 sha1 = "195870450f5a13192478df4bc3d23d2dea1907b6";
3650 };
3651 };
3652 "lodash.memoize-4.1.2" = {
3653 name = "lodash.memoize";
3654 packageName = "lodash.memoize";
3655 version = "4.1.2";
3656 src = fetchurl {
3657 url = "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
3658 sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
3659 };
3660 };
3661 "lodash.sortby-4.7.0" = {
3662 name = "lodash.sortby";
3663 packageName = "lodash.sortby";
3664 version = "4.7.0";
3665 src = fetchurl {
3666 url = "https://registry.npmjs.org/lodash.sortby/-/lodash.sortby-4.7.0.tgz";
3667 sha1 = "edd14c824e2cc9c1e0b0a1b42bb5210516a42438";
3668 };
3669 };
3670 "lodash.uniq-4.5.0" = {
3671 name = "lodash.uniq";
3672 packageName = "lodash.uniq";
3673 version = "4.5.0";
3674 src = fetchurl {
3675 url = "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
3676 sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
3677 };
3678 };
3679 "log-symbols-2.2.0" = {
3680 name = "log-symbols";
3681 packageName = "log-symbols";
3682 version = "2.2.0";
3683 src = fetchurl {
3684 url = "https://registry.npmjs.org/log-symbols/-/log-symbols-2.2.0.tgz";
3685 sha512 = "VeIAFslyIerEJLXHziedo2basKbMKtTw3vfn5IzG0XTjhAVEJyNHnL2p7vc+wBDSdQuUpNw3M2u6xb9QsAY5Eg==";
3686 };
3687 };
3688 "loose-envify-1.4.0" = {
3689 name = "loose-envify";
3690 packageName = "loose-envify";
3691 version = "1.4.0";
3692 src = fetchurl {
3693 url = "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz";
3694 sha512 = "lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==";
3695 };
3696 };
3697 "lru-cache-4.1.5" = {
3698 name = "lru-cache";
3699 packageName = "lru-cache";
3700 version = "4.1.5";
3701 src = fetchurl {
3702 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz";
3703 sha512 = "sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==";
3704 };
3705 };
3706 "magic-string-0.22.5" = {
3707 name = "magic-string";
3708 packageName = "magic-string";
3709 version = "0.22.5";
3710 src = fetchurl {
3711 url = "https://registry.npmjs.org/magic-string/-/magic-string-0.22.5.tgz";
3712 sha512 = "oreip9rJZkzvA8Qzk9HFs8fZGF/u7H/gtrE8EN6RjKJ9kh2HlC+yQ2QezifqTZfGyiuAV0dRv5a+y/8gBb1m9w==";
3713 };
3714 };
3715 "map-cache-0.2.2" = {
3716 name = "map-cache";
3717 packageName = "map-cache";
3718 version = "0.2.2";
3719 src = fetchurl {
3720 url = "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz";
3721 sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
3722 };
3723 };
3724 "map-visit-1.0.0" = {
3725 name = "map-visit";
3726 packageName = "map-visit";
3727 version = "1.0.0";
3728 src = fetchurl {
3729 url = "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz";
3730 sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
3731 };
3732 };
3733 "md5.js-1.3.5" = {
3734 name = "md5.js";
3735 packageName = "md5.js";
3736 version = "1.3.5";
3737 src = fetchurl {
3738 url = "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz";
3739 sha512 = "xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==";
3740 };
3741 };
3742 "mdn-data-2.0.4" = {
3743 name = "mdn-data";
3744 packageName = "mdn-data";
3745 version = "2.0.4";
3746 src = fetchurl {
3747 url = "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.4.tgz";
3748 sha512 = "iV3XNKw06j5Q7mi6h+9vbx23Tv7JkjEVgKHW4pimwyDGWm0OIQntJJ+u1C6mg6mK1EaTv42XQ7w76yuzH7M2cA==";
3749 };
3750 };
3751 "mdn-data-2.0.6" = {
3752 name = "mdn-data";
3753 packageName = "mdn-data";
3754 version = "2.0.6";
3755 src = fetchurl {
3756 url = "https://registry.npmjs.org/mdn-data/-/mdn-data-2.0.6.tgz";
3757 sha512 = "rQvjv71olwNHgiTbfPZFkJtjNMciWgswYeciZhtvWLO8bmX3TnhyA62I6sTWOyZssWHJJjY6/KiWwqQsWWsqOA==";
3758 };
3759 };
3760 "merge-source-map-1.0.4" = {
3761 name = "merge-source-map";
3762 packageName = "merge-source-map";
3763 version = "1.0.4";
3764 src = fetchurl {
3765 url = "https://registry.npmjs.org/merge-source-map/-/merge-source-map-1.0.4.tgz";
3766 sha1 = "a5de46538dae84d4114cc5ea02b4772a6346701f";
3767 };
3768 };
3769 "merge2-1.3.0" = {
3770 name = "merge2";
3771 packageName = "merge2";
3772 version = "1.3.0";
3773 src = fetchurl {
3774 url = "https://registry.npmjs.org/merge2/-/merge2-1.3.0.tgz";
3775 sha512 = "2j4DAdlBOkiSZIsaXk4mTE3sRS02yBHAtfy127xRV3bQUFqXkjHCHLW6Scv7DwNRbIWNHH8zpnz9zMaKXIdvYw==";
3776 };
3777 };
3778 "micromatch-3.1.10" = {
3779 name = "micromatch";
3780 packageName = "micromatch";
3781 version = "3.1.10";
3782 src = fetchurl {
3783 url = "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz";
3784 sha512 = "MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==";
3785 };
3786 };
3787 "miller-rabin-4.0.1" = {
3788 name = "miller-rabin";
3789 packageName = "miller-rabin";
3790 version = "4.0.1";
3791 src = fetchurl {
3792 url = "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz";
3793 sha512 = "115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==";
3794 };
3795 };
3796 "mime-1.6.0" = {
3797 name = "mime";
3798 packageName = "mime";
3799 version = "1.6.0";
3800 src = fetchurl {
3801 url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz";
3802 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
3803 };
3804 };
3805 "mime-db-1.44.0" = {
3806 name = "mime-db";
3807 packageName = "mime-db";
3808 version = "1.44.0";
3809 src = fetchurl {
3810 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.44.0.tgz";
3811 sha512 = "/NOTfLrsPBVeH7YtFPgsVWveuL+4SjjYxaQ1xtM1KMFj7HdxlBlxeyNLzhyJVx7r4rZGJAZ/6lkKCitSc/Nmpg==";
3812 };
3813 };
3814 "mime-types-2.1.27" = {
3815 name = "mime-types";
3816 packageName = "mime-types";
3817 version = "2.1.27";
3818 src = fetchurl {
3819 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.27.tgz";
3820 sha512 = "JIhqnCasI9yD+SsmkquHBxTSEuZdQX5BuQnS2Vc7puQQQ+8yiP5AY5uWhpdv4YL4VM5c6iliiYWPgJ/nJQLp7w==";
3821 };
3822 };
3823 "mimic-fn-1.2.0" = {
3824 name = "mimic-fn";
3825 packageName = "mimic-fn";
3826 version = "1.2.0";
3827 src = fetchurl {
3828 url = "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz";
3829 sha512 = "jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==";
3830 };
3831 };
3832 "minimalistic-assert-1.0.1" = {
3833 name = "minimalistic-assert";
3834 packageName = "minimalistic-assert";
3835 version = "1.0.1";
3836 src = fetchurl {
3837 url = "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
3838 sha512 = "UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==";
3839 };
3840 };
3841 "minimalistic-crypto-utils-1.0.1" = {
3842 name = "minimalistic-crypto-utils";
3843 packageName = "minimalistic-crypto-utils";
3844 version = "1.0.1";
3845 src = fetchurl {
3846 url = "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
3847 sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
3848 };
3849 };
3850 "minimatch-3.0.4" = {
3851 name = "minimatch";
3852 packageName = "minimatch";
3853 version = "3.0.4";
3854 src = fetchurl {
3855 url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
3856 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
3857 };
3858 };
3859 "minimist-1.2.5" = {
3860 name = "minimist";
3861 packageName = "minimist";
3862 version = "1.2.5";
3863 src = fetchurl {
3864 url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
3865 sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
3866 };
3867 };
3868 "mixin-deep-1.3.2" = {
3869 name = "mixin-deep";
3870 packageName = "mixin-deep";
3871 version = "1.3.2";
3872 src = fetchurl {
3873 url = "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.2.tgz";
3874 sha512 = "WRoDn//mXBiJ1H40rqa3vH0toePwSsGb45iInWlTySa+Uu4k3tYUSxa2v1KqAiLtvlrSzaExqS1gtk96A9zvEA==";
3875 };
3876 };
3877 "mkdirp-0.5.5" = {
3878 name = "mkdirp";
3879 packageName = "mkdirp";
3880 version = "0.5.5";
3881 src = fetchurl {
3882 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
3883 sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
3884 };
3885 };
3886 "mkdirp-1.0.4" = {
3887 name = "mkdirp";
3888 packageName = "mkdirp";
3889 version = "1.0.4";
3890 src = fetchurl {
3891 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz";
3892 sha512 = "vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==";
3893 };
3894 };
3895 "ms-2.0.0" = {
3896 name = "ms";
3897 packageName = "ms";
3898 version = "2.0.0";
3899 src = fetchurl {
3900 url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
3901 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
3902 };
3903 };
3904 "ms-2.1.1" = {
3905 name = "ms";
3906 packageName = "ms";
3907 version = "2.1.1";
3908 src = fetchurl {
3909 url = "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz";
3910 sha512 = "tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==";
3911 };
3912 };
3913 "ms-2.1.2" = {
3914 name = "ms";
3915 packageName = "ms";
3916 version = "2.1.2";
3917 src = fetchurl {
3918 url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz";
3919 sha512 = "sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==";
3920 };
3921 };
3922 "nan-2.14.1" = {
3923 name = "nan";
3924 packageName = "nan";
3925 version = "2.14.1";
3926 src = fetchurl {
3927 url = "https://registry.npmjs.org/nan/-/nan-2.14.1.tgz";
3928 sha512 = "isWHgVjnFjh2x2yuJ/tj3JbwoHu3UC2dX5G/88Cm24yB6YopVgxvBObDY7n5xW6ExmFhJpSEQqFPvq9zaXc8Jw==";
3929 };
3930 };
3931 "nanomatch-1.2.13" = {
3932 name = "nanomatch";
3933 packageName = "nanomatch";
3934 version = "1.2.13";
3935 src = fetchurl {
3936 url = "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz";
3937 sha512 = "fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==";
3938 };
3939 };
3940 "nice-try-1.0.5" = {
3941 name = "nice-try";
3942 packageName = "nice-try";
3943 version = "1.0.5";
3944 src = fetchurl {
3945 url = "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz";
3946 sha512 = "1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==";
3947 };
3948 };
3949 "node-addon-api-1.7.1" = {
3950 name = "node-addon-api";
3951 packageName = "node-addon-api";
3952 version = "1.7.1";
3953 src = fetchurl {
3954 url = "https://registry.npmjs.org/node-addon-api/-/node-addon-api-1.7.1.tgz";
3955 sha512 = "2+DuKodWvwRTrCfKOeR24KIc5unKjOh8mz17NCzVnHWfjAdDqbfbjqh7gUT+BkXBRQM52+xCHciKWonJ3CbJMQ==";
3956 };
3957 };
3958 "node-elm-compiler-5.0.4" = {
3959 name = "node-elm-compiler";
3960 packageName = "node-elm-compiler";
3961 version = "5.0.4";
3962 src = fetchurl {
3963 url = "https://registry.npmjs.org/node-elm-compiler/-/node-elm-compiler-5.0.4.tgz";
3964 sha512 = "VQsT8QSierYGkHzRed+b4MnccQVF1+qPHunE8jBoU7jD6YpuRqCDPzEoC2zfyEJS80qVnlMZrqobLnyjzX9lJg==";
3965 };
3966 };
3967 "node-forge-0.7.6" = {
3968 name = "node-forge";
3969 packageName = "node-forge";
3970 version = "0.7.6";
3971 src = fetchurl {
3972 url = "https://registry.npmjs.org/node-forge/-/node-forge-0.7.6.tgz";
3973 sha512 = "sol30LUpz1jQFBjOKwbjxijiE3b6pjd74YwfD0fJOKPjF+fONKb2Yg8rYgS6+bK6VDl+/wfr4IYpC7jDzLUIfw==";
3974 };
3975 };
3976 "node-libs-browser-2.2.1" = {
3977 name = "node-libs-browser";
3978 packageName = "node-libs-browser";
3979 version = "2.2.1";
3980 src = fetchurl {
3981 url = "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.2.1.tgz";
3982 sha512 = "h/zcD8H9kaDZ9ALUWwlBUDo6TKF8a7qBSCSEGfjTVIYeqsioSKaAX+BN7NgiMGp6iSIXZ3PxgCu8KS3b71YK5Q==";
3983 };
3984 };
3985 "node-releases-1.1.53" = {
3986 name = "node-releases";
3987 packageName = "node-releases";
3988 version = "1.1.53";
3989 src = fetchurl {
3990 url = "https://registry.npmjs.org/node-releases/-/node-releases-1.1.53.tgz";
3991 sha512 = "wp8zyQVwef2hpZ/dJH7SfSrIPD6YoJz6BDQDpGEkcA0s3LpAQoxBIYmfIq6QAhC1DhwsyCgTaTTcONwX8qzCuQ==";
3992 };
3993 };
3994 "nopt-4.0.3" = {
3995 name = "nopt";
3996 packageName = "nopt";
3997 version = "4.0.3";
3998 src = fetchurl {
3999 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz";
4000 sha512 = "CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==";
4001 };
4002 };
4003 "normalize-html-whitespace-1.0.0" = {
4004 name = "normalize-html-whitespace";
4005 packageName = "normalize-html-whitespace";
4006 version = "1.0.0";
4007 src = fetchurl {
4008 url = "https://registry.npmjs.org/normalize-html-whitespace/-/normalize-html-whitespace-1.0.0.tgz";
4009 sha512 = "9ui7CGtOOlehQu0t/OhhlmDyc71mKVlv+4vF+me4iZLPrNtRL2xoquEdfZxasC/bdQi/Hr3iTrpyRKIG+ocabA==";
4010 };
4011 };
4012 "normalize-path-2.1.1" = {
4013 name = "normalize-path";
4014 packageName = "normalize-path";
4015 version = "2.1.1";
4016 src = fetchurl {
4017 url = "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz";
4018 sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
4019 };
4020 };
4021 "normalize-path-3.0.0" = {
4022 name = "normalize-path";
4023 packageName = "normalize-path";
4024 version = "3.0.0";
4025 src = fetchurl {
4026 url = "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz";
4027 sha512 = "6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==";
4028 };
4029 };
4030 "normalize-url-3.3.0" = {
4031 name = "normalize-url";
4032 packageName = "normalize-url";
4033 version = "3.3.0";
4034 src = fetchurl {
4035 url = "https://registry.npmjs.org/normalize-url/-/normalize-url-3.3.0.tgz";
4036 sha512 = "U+JJi7duF1o+u2pynbp2zXDW2/PADgC30f0GsHZtRh+HOcXHnw137TrNlyxxRvWW5fjKd3bcLHPxofWuCjaeZg==";
4037 };
4038 };
4039 "nth-check-1.0.2" = {
4040 name = "nth-check";
4041 packageName = "nth-check";
4042 version = "1.0.2";
4043 src = fetchurl {
4044 url = "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz";
4045 sha512 = "WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==";
4046 };
4047 };
4048 "nwsapi-2.2.0" = {
4049 name = "nwsapi";
4050 packageName = "nwsapi";
4051 version = "2.2.0";
4052 src = fetchurl {
4053 url = "https://registry.npmjs.org/nwsapi/-/nwsapi-2.2.0.tgz";
4054 sha512 = "h2AatdwYH+JHiZpv7pt/gSX1XoRGb7L/qSIeuqA6GwYoF9w1vP1cw42TO0aI2pNyshRK5893hNSl+1//vHK7hQ==";
4055 };
4056 };
4057 "oauth-sign-0.9.0" = {
4058 name = "oauth-sign";
4059 packageName = "oauth-sign";
4060 version = "0.9.0";
4061 src = fetchurl {
4062 url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";
4063 sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==";
4064 };
4065 };
4066 "object-assign-4.1.1" = {
4067 name = "object-assign";
4068 packageName = "object-assign";
4069 version = "4.1.1";
4070 src = fetchurl {
4071 url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
4072 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
4073 };
4074 };
4075 "object-copy-0.1.0" = {
4076 name = "object-copy";
4077 packageName = "object-copy";
4078 version = "0.1.0";
4079 src = fetchurl {
4080 url = "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz";
4081 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
4082 };
4083 };
4084 "object-inspect-1.4.1" = {
4085 name = "object-inspect";
4086 packageName = "object-inspect";
4087 version = "1.4.1";
4088 src = fetchurl {
4089 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.4.1.tgz";
4090 sha512 = "wqdhLpfCUbEsoEwl3FXwGyv8ief1k/1aUdIPCqVnupM6e8l63BEJdiF/0swtn04/8p05tG/T0FrpTlfwvljOdw==";
4091 };
4092 };
4093 "object-inspect-1.7.0" = {
4094 name = "object-inspect";
4095 packageName = "object-inspect";
4096 version = "1.7.0";
4097 src = fetchurl {
4098 url = "https://registry.npmjs.org/object-inspect/-/object-inspect-1.7.0.tgz";
4099 sha512 = "a7pEHdh1xKIAgTySUGgLMx/xwDZskN1Ud6egYYN3EdRW4ZMPNEDUTF+hwy2LUC+Bl+SyLXANnwz/jyh/qutKUw==";
4100 };
4101 };
4102 "object-keys-1.1.1" = {
4103 name = "object-keys";
4104 packageName = "object-keys";
4105 version = "1.1.1";
4106 src = fetchurl {
4107 url = "https://registry.npmjs.org/object-keys/-/object-keys-1.1.1.tgz";
4108 sha512 = "NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==";
4109 };
4110 };
4111 "object-visit-1.0.1" = {
4112 name = "object-visit";
4113 packageName = "object-visit";
4114 version = "1.0.1";
4115 src = fetchurl {
4116 url = "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz";
4117 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
4118 };
4119 };
4120 "object.assign-4.1.0" = {
4121 name = "object.assign";
4122 packageName = "object.assign";
4123 version = "4.1.0";
4124 src = fetchurl {
4125 url = "https://registry.npmjs.org/object.assign/-/object.assign-4.1.0.tgz";
4126 sha512 = "exHJeq6kBKj58mqGyTQ9DFvrZC/eR6OwxzoM9YRoGBqrXYonaFyGiFMuc9VZrXf7DarreEwMpurG3dd+CNyW5w==";
4127 };
4128 };
4129 "object.getownpropertydescriptors-2.1.0" = {
4130 name = "object.getownpropertydescriptors";
4131 packageName = "object.getownpropertydescriptors";
4132 version = "2.1.0";
4133 src = fetchurl {
4134 url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz";
4135 sha512 = "Z53Oah9A3TdLoblT7VKJaTDdXdT+lQO+cNpKVnya5JDe9uLvzu1YyY1yFDFrcxrlRgWrEFH0jJtD/IbuwjcEVg==";
4136 };
4137 };
4138 "object.pick-1.3.0" = {
4139 name = "object.pick";
4140 packageName = "object.pick";
4141 version = "1.3.0";
4142 src = fetchurl {
4143 url = "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz";
4144 sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
4145 };
4146 };
4147 "object.values-1.1.1" = {
4148 name = "object.values";
4149 packageName = "object.values";
4150 version = "1.1.1";
4151 src = fetchurl {
4152 url = "https://registry.npmjs.org/object.values/-/object.values-1.1.1.tgz";
4153 sha512 = "WTa54g2K8iu0kmS/us18jEmdv1a4Wi//BZ/DTVYEcH0XhLM5NYdpDHja3gt57VrZLcNAO2WGA+KpWsDBaHt6eA==";
4154 };
4155 };
4156 "on-finished-2.3.0" = {
4157 name = "on-finished";
4158 packageName = "on-finished";
4159 version = "2.3.0";
4160 src = fetchurl {
4161 url = "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz";
4162 sha1 = "20f1336481b083cd75337992a16971aa2d906947";
4163 };
4164 };
4165 "once-1.4.0" = {
4166 name = "once";
4167 packageName = "once";
4168 version = "1.4.0";
4169 src = fetchurl {
4170 url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
4171 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
4172 };
4173 };
4174 "onetime-2.0.1" = {
4175 name = "onetime";
4176 packageName = "onetime";
4177 version = "2.0.1";
4178 src = fetchurl {
4179 url = "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz";
4180 sha1 = "067428230fd67443b2794b22bba528b6867962d4";
4181 };
4182 };
4183 "opn-5.5.0" = {
4184 name = "opn";
4185 packageName = "opn";
4186 version = "5.5.0";
4187 src = fetchurl {
4188 url = "https://registry.npmjs.org/opn/-/opn-5.5.0.tgz";
4189 sha512 = "PqHpggC9bLV0VeWcdKhkpxY+3JTzetLSqTCWL/z/tFIbI6G8JCjondXklT1JinczLz2Xib62sSp0T/gKT4KksA==";
4190 };
4191 };
4192 "optionator-0.8.3" = {
4193 name = "optionator";
4194 packageName = "optionator";
4195 version = "0.8.3";
4196 src = fetchurl {
4197 url = "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz";
4198 sha512 = "+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==";
4199 };
4200 };
4201 "ora-2.1.0" = {
4202 name = "ora";
4203 packageName = "ora";
4204 version = "2.1.0";
4205 src = fetchurl {
4206 url = "https://registry.npmjs.org/ora/-/ora-2.1.0.tgz";
4207 sha512 = "hNNlAd3gfv/iPmsNxYoAPLvxg7HuPozww7fFonMZvL84tP6Ox5igfk5j/+a9rtJJwqMgKK+JgWsAQik5o0HTLA==";
4208 };
4209 };
4210 "os-browserify-0.3.0" = {
4211 name = "os-browserify";
4212 packageName = "os-browserify";
4213 version = "0.3.0";
4214 src = fetchurl {
4215 url = "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz";
4216 sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
4217 };
4218 };
4219 "os-homedir-1.0.2" = {
4220 name = "os-homedir";
4221 packageName = "os-homedir";
4222 version = "1.0.2";
4223 src = fetchurl {
4224 url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
4225 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
4226 };
4227 };
4228 "os-tmpdir-1.0.2" = {
4229 name = "os-tmpdir";
4230 packageName = "os-tmpdir";
4231 version = "1.0.2";
4232 src = fetchurl {
4233 url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
4234 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
4235 };
4236 };
4237 "osenv-0.1.5" = {
4238 name = "osenv";
4239 packageName = "osenv";
4240 version = "0.1.5";
4241 src = fetchurl {
4242 url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
4243 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
4244 };
4245 };
4246 "p-limit-1.3.0" = {
4247 name = "p-limit";
4248 packageName = "p-limit";
4249 version = "1.3.0";
4250 src = fetchurl {
4251 url = "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz";
4252 sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==";
4253 };
4254 };
4255 "p-limit-2.3.0" = {
4256 name = "p-limit";
4257 packageName = "p-limit";
4258 version = "2.3.0";
4259 src = fetchurl {
4260 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz";
4261 sha512 = "//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==";
4262 };
4263 };
4264 "p-locate-2.0.0" = {
4265 name = "p-locate";
4266 packageName = "p-locate";
4267 version = "2.0.0";
4268 src = fetchurl {
4269 url = "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz";
4270 sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
4271 };
4272 };
4273 "p-locate-3.0.0" = {
4274 name = "p-locate";
4275 packageName = "p-locate";
4276 version = "3.0.0";
4277 src = fetchurl {
4278 url = "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz";
4279 sha512 = "x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==";
4280 };
4281 };
4282 "p-try-1.0.0" = {
4283 name = "p-try";
4284 packageName = "p-try";
4285 version = "1.0.0";
4286 src = fetchurl {
4287 url = "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz";
4288 sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
4289 };
4290 };
4291 "p-try-2.2.0" = {
4292 name = "p-try";
4293 packageName = "p-try";
4294 version = "2.2.0";
4295 src = fetchurl {
4296 url = "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz";
4297 sha512 = "R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==";
4298 };
4299 };
4300 "pako-0.2.9" = {
4301 name = "pako";
4302 packageName = "pako";
4303 version = "0.2.9";
4304 src = fetchurl {
4305 url = "https://registry.npmjs.org/pako/-/pako-0.2.9.tgz";
4306 sha1 = "f3f7522f4ef782348da8161bad9ecfd51bf83a75";
4307 };
4308 };
4309 "pako-1.0.11" = {
4310 name = "pako";
4311 packageName = "pako";
4312 version = "1.0.11";
4313 src = fetchurl {
4314 url = "https://registry.npmjs.org/pako/-/pako-1.0.11.tgz";
4315 sha512 = "4hLB8Py4zZce5s4yd9XzopqwVv/yGNhV1Bl8NTmCq1763HeK2+EwVTv+leGeL13Dnh2wfbqowVPXCIO0z4taYw==";
4316 };
4317 };
4318 "parcel-bundler-1.12.3" = {
4319 name = "parcel-bundler";
4320 packageName = "parcel-bundler";
4321 version = "1.12.3";
4322 src = fetchurl {
4323 url = "https://registry.npmjs.org/parcel-bundler/-/parcel-bundler-1.12.3.tgz";
4324 sha512 = "8bq6lj0hhQeGxD9f9xEkFMXQ3d8TIlf2+isKxoi9bciB0KVEILRGllaPkUgp++5t0anToBh9+tG6ZyInXOC1/A==";
4325 };
4326 };
4327 "parse-asn1-5.1.5" = {
4328 name = "parse-asn1";
4329 packageName = "parse-asn1";
4330 version = "5.1.5";
4331 src = fetchurl {
4332 url = "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.5.tgz";
4333 sha512 = "jkMYn1dcJqF6d5CpU689bq7w/b5ALS9ROVSpQDPrZsqqesUJii9qutvoT5ltGedNXMO2e16YUWIghG9KxaViTQ==";
4334 };
4335 };
4336 "parse-json-4.0.0" = {
4337 name = "parse-json";
4338 packageName = "parse-json";
4339 version = "4.0.0";
4340 src = fetchurl {
4341 url = "https://registry.npmjs.org/parse-json/-/parse-json-4.0.0.tgz";
4342 sha1 = "be35f5425be1f7f6c747184f98a788cb99477ee0";
4343 };
4344 };
4345 "parse5-5.1.0" = {
4346 name = "parse5";
4347 packageName = "parse5";
4348 version = "5.1.0";
4349 src = fetchurl {
4350 url = "https://registry.npmjs.org/parse5/-/parse5-5.1.0.tgz";
4351 sha512 = "fxNG2sQjHvlVAYmzBZS9YlDp6PTSSDwa98vkD4QgVDDCAo84z5X1t5XyJQ62ImdLXx5NdIIfihey6xpum9/gRQ==";
4352 };
4353 };
4354 "parseurl-1.3.3" = {
4355 name = "parseurl";
4356 packageName = "parseurl";
4357 version = "1.3.3";
4358 src = fetchurl {
4359 url = "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz";
4360 sha512 = "CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==";
4361 };
4362 };
4363 "pascalcase-0.1.1" = {
4364 name = "pascalcase";
4365 packageName = "pascalcase";
4366 version = "0.1.1";
4367 src = fetchurl {
4368 url = "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz";
4369 sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
4370 };
4371 };
4372 "path-browserify-0.0.1" = {
4373 name = "path-browserify";
4374 packageName = "path-browserify";
4375 version = "0.0.1";
4376 src = fetchurl {
4377 url = "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.1.tgz";
4378 sha512 = "BapA40NHICOS+USX9SN4tyhq+A2RrN/Ws5F0Z5aMHDp98Fl86lX8Oti8B7uN93L4Ifv4fHOEA+pQw87gmMO/lQ==";
4379 };
4380 };
4381 "path-dirname-1.0.2" = {
4382 name = "path-dirname";
4383 packageName = "path-dirname";
4384 version = "1.0.2";
4385 src = fetchurl {
4386 url = "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz";
4387 sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
4388 };
4389 };
4390 "path-exists-3.0.0" = {
4391 name = "path-exists";
4392 packageName = "path-exists";
4393 version = "3.0.0";
4394 src = fetchurl {
4395 url = "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz";
4396 sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
4397 };
4398 };
4399 "path-is-absolute-1.0.1" = {
4400 name = "path-is-absolute";
4401 packageName = "path-is-absolute";
4402 version = "1.0.1";
4403 src = fetchurl {
4404 url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
4405 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
4406 };
4407 };
4408 "path-key-2.0.1" = {
4409 name = "path-key";
4410 packageName = "path-key";
4411 version = "2.0.1";
4412 src = fetchurl {
4413 url = "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz";
4414 sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
4415 };
4416 };
4417 "path-parse-1.0.6" = {
4418 name = "path-parse";
4419 packageName = "path-parse";
4420 version = "1.0.6";
4421 src = fetchurl {
4422 url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz";
4423 sha512 = "GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==";
4424 };
4425 };
4426 "pbkdf2-3.0.17" = {
4427 name = "pbkdf2";
4428 packageName = "pbkdf2";
4429 version = "3.0.17";
4430 src = fetchurl {
4431 url = "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz";
4432 sha512 = "U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==";
4433 };
4434 };
4435 "performance-now-2.1.0" = {
4436 name = "performance-now";
4437 packageName = "performance-now";
4438 version = "2.1.0";
4439 src = fetchurl {
4440 url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";
4441 sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
4442 };
4443 };
4444 "physical-cpu-count-2.0.0" = {
4445 name = "physical-cpu-count";
4446 packageName = "physical-cpu-count";
4447 version = "2.0.0";
4448 src = fetchurl {
4449 url = "https://registry.npmjs.org/physical-cpu-count/-/physical-cpu-count-2.0.0.tgz";
4450 sha1 = "18de2f97e4bf7a9551ad7511942b5496f7aba660";
4451 };
4452 };
4453 "pkg-up-2.0.0" = {
4454 name = "pkg-up";
4455 packageName = "pkg-up";
4456 version = "2.0.0";
4457 src = fetchurl {
4458 url = "https://registry.npmjs.org/pkg-up/-/pkg-up-2.0.0.tgz";
4459 sha1 = "c819ac728059a461cab1c3889a2be3c49a004d7f";
4460 };
4461 };
4462 "pn-1.1.0" = {
4463 name = "pn";
4464 packageName = "pn";
4465 version = "1.1.0";
4466 src = fetchurl {
4467 url = "https://registry.npmjs.org/pn/-/pn-1.1.0.tgz";
4468 sha512 = "2qHaIQr2VLRFoxe2nASzsV6ef4yOOH+Fi9FBOVH6cqeSgUnoyySPZkxzLuzd+RYOQTRpROA0ztTMqxROKSb/nA==";
4469 };
4470 };
4471 "posix-character-classes-0.1.1" = {
4472 name = "posix-character-classes";
4473 packageName = "posix-character-classes";
4474 version = "0.1.1";
4475 src = fetchurl {
4476 url = "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
4477 sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
4478 };
4479 };
4480 "postcss-6.0.1" = {
4481 name = "postcss";
4482 packageName = "postcss";
4483 version = "6.0.1";
4484 src = fetchurl {
4485 url = "https://registry.npmjs.org/postcss/-/postcss-6.0.1.tgz";
4486 sha1 = "000dbd1f8eef217aa368b9a212c5fc40b2a8f3f2";
4487 };
4488 };
4489 "postcss-6.0.23" = {
4490 name = "postcss";
4491 packageName = "postcss";
4492 version = "6.0.23";
4493 src = fetchurl {
4494 url = "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz";
4495 sha512 = "soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==";
4496 };
4497 };
4498 "postcss-7.0.27" = {
4499 name = "postcss";
4500 packageName = "postcss";
4501 version = "7.0.27";
4502 src = fetchurl {
4503 url = "https://registry.npmjs.org/postcss/-/postcss-7.0.27.tgz";
4504 sha512 = "WuQETPMcW9Uf1/22HWUWP9lgsIC+KEHg2kozMflKjbeUtw9ujvFX6QmIfozaErDkmLWS9WEnEdEe6Uo9/BNTdQ==";
4505 };
4506 };
4507 "postcss-calc-7.0.2" = {
4508 name = "postcss-calc";
4509 packageName = "postcss-calc";
4510 version = "7.0.2";
4511 src = fetchurl {
4512 url = "https://registry.npmjs.org/postcss-calc/-/postcss-calc-7.0.2.tgz";
4513 sha512 = "rofZFHUg6ZIrvRwPeFktv06GdbDYLcGqh9EwiMutZg+a0oePCCw1zHOEiji6LCpyRcjTREtPASuUqeAvYlEVvQ==";
4514 };
4515 };
4516 "postcss-colormin-4.0.3" = {
4517 name = "postcss-colormin";
4518 packageName = "postcss-colormin";
4519 version = "4.0.3";
4520 src = fetchurl {
4521 url = "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-4.0.3.tgz";
4522 sha512 = "WyQFAdDZpExQh32j0U0feWisZ0dmOtPl44qYmJKkq9xFWY3p+4qnRzCHeNrkeRhwPHz9bQ3mo0/yVkaply0MNw==";
4523 };
4524 };
4525 "postcss-convert-values-4.0.1" = {
4526 name = "postcss-convert-values";
4527 packageName = "postcss-convert-values";
4528 version = "4.0.1";
4529 src = fetchurl {
4530 url = "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz";
4531 sha512 = "Kisdo1y77KUC0Jmn0OXU/COOJbzM8cImvw1ZFsBgBgMgb1iL23Zs/LXRe3r+EZqM3vGYKdQ2YJVQ5VkJI+zEJQ==";
4532 };
4533 };
4534 "postcss-discard-comments-4.0.2" = {
4535 name = "postcss-discard-comments";
4536 packageName = "postcss-discard-comments";
4537 version = "4.0.2";
4538 src = fetchurl {
4539 url = "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz";
4540 sha512 = "RJutN259iuRf3IW7GZyLM5Sw4GLTOH8FmsXBnv8Ab/Tc2k4SR4qbV4DNbyyY4+Sjo362SyDmW2DQ7lBSChrpkg==";
4541 };
4542 };
4543 "postcss-discard-duplicates-4.0.2" = {
4544 name = "postcss-discard-duplicates";
4545 packageName = "postcss-discard-duplicates";
4546 version = "4.0.2";
4547 src = fetchurl {
4548 url = "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz";
4549 sha512 = "ZNQfR1gPNAiXZhgENFfEglF93pciw0WxMkJeVmw8eF+JZBbMD7jp6C67GqJAXVZP2BWbOztKfbsdmMp/k8c6oQ==";
4550 };
4551 };
4552 "postcss-discard-empty-4.0.1" = {
4553 name = "postcss-discard-empty";
4554 packageName = "postcss-discard-empty";
4555 version = "4.0.1";
4556 src = fetchurl {
4557 url = "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz";
4558 sha512 = "B9miTzbznhDjTfjvipfHoqbWKwd0Mj+/fL5s1QOz06wufguil+Xheo4XpOnc4NqKYBCNqqEzgPv2aPBIJLox0w==";
4559 };
4560 };
4561 "postcss-discard-overridden-4.0.1" = {
4562 name = "postcss-discard-overridden";
4563 packageName = "postcss-discard-overridden";
4564 version = "4.0.1";
4565 src = fetchurl {
4566 url = "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz";
4567 sha512 = "IYY2bEDD7g1XM1IDEsUT4//iEYCxAmP5oDSFMVU/JVvT7gh+l4fmjciLqGgwjdWpQIdb0Che2VX00QObS5+cTg==";
4568 };
4569 };
4570 "postcss-merge-longhand-4.0.11" = {
4571 name = "postcss-merge-longhand";
4572 packageName = "postcss-merge-longhand";
4573 version = "4.0.11";
4574 src = fetchurl {
4575 url = "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz";
4576 sha512 = "alx/zmoeXvJjp7L4mxEMjh8lxVlDFX1gqWHzaaQewwMZiVhLo42TEClKaeHbRf6J7j82ZOdTJ808RtN0ZOZwvw==";
4577 };
4578 };
4579 "postcss-merge-rules-4.0.3" = {
4580 name = "postcss-merge-rules";
4581 packageName = "postcss-merge-rules";
4582 version = "4.0.3";
4583 src = fetchurl {
4584 url = "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz";
4585 sha512 = "U7e3r1SbvYzO0Jr3UT/zKBVgYYyhAz0aitvGIYOYK5CPmkNih+WDSsS5tvPrJ8YMQYlEMvsZIiqmn7HdFUaeEQ==";
4586 };
4587 };
4588 "postcss-minify-font-values-4.0.2" = {
4589 name = "postcss-minify-font-values";
4590 packageName = "postcss-minify-font-values";
4591 version = "4.0.2";
4592 src = fetchurl {
4593 url = "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz";
4594 sha512 = "j85oO6OnRU9zPf04+PZv1LYIYOprWm6IA6zkXkrJXyRveDEuQggG6tvoy8ir8ZwjLxLuGfNkCZEQG7zan+Hbtg==";
4595 };
4596 };
4597 "postcss-minify-gradients-4.0.2" = {
4598 name = "postcss-minify-gradients";
4599 packageName = "postcss-minify-gradients";
4600 version = "4.0.2";
4601 src = fetchurl {
4602 url = "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz";
4603 sha512 = "qKPfwlONdcf/AndP1U8SJ/uzIJtowHlMaSioKzebAXSG4iJthlWC9iSWznQcX4f66gIWX44RSA841HTHj3wK+Q==";
4604 };
4605 };
4606 "postcss-minify-params-4.0.2" = {
4607 name = "postcss-minify-params";
4608 packageName = "postcss-minify-params";
4609 version = "4.0.2";
4610 src = fetchurl {
4611 url = "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz";
4612 sha512 = "G7eWyzEx0xL4/wiBBJxJOz48zAKV2WG3iZOqVhPet/9geefm/Px5uo1fzlHu+DOjT+m0Mmiz3jkQzVHe6wxAWg==";
4613 };
4614 };
4615 "postcss-minify-selectors-4.0.2" = {
4616 name = "postcss-minify-selectors";
4617 packageName = "postcss-minify-selectors";
4618 version = "4.0.2";
4619 src = fetchurl {
4620 url = "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz";
4621 sha512 = "D5S1iViljXBj9kflQo4YutWnJmwm8VvIsU1GeXJGiG9j8CIg9zs4voPMdQDUmIxetUOh60VilsNzCiAFTOqu3g==";
4622 };
4623 };
4624 "postcss-modules-extract-imports-1.1.0" = {
4625 name = "postcss-modules-extract-imports";
4626 packageName = "postcss-modules-extract-imports";
4627 version = "1.1.0";
4628 src = fetchurl {
4629 url = "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.1.0.tgz";
4630 sha1 = "b614c9720be6816eaee35fb3a5faa1dba6a05ddb";
4631 };
4632 };
4633 "postcss-modules-local-by-default-1.2.0" = {
4634 name = "postcss-modules-local-by-default";
4635 packageName = "postcss-modules-local-by-default";
4636 version = "1.2.0";
4637 src = fetchurl {
4638 url = "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz";
4639 sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069";
4640 };
4641 };
4642 "postcss-modules-scope-1.1.0" = {
4643 name = "postcss-modules-scope";
4644 packageName = "postcss-modules-scope";
4645 version = "1.1.0";
4646 src = fetchurl {
4647 url = "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz";
4648 sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90";
4649 };
4650 };
4651 "postcss-modules-values-1.3.0" = {
4652 name = "postcss-modules-values";
4653 packageName = "postcss-modules-values";
4654 version = "1.3.0";
4655 src = fetchurl {
4656 url = "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz";
4657 sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20";
4658 };
4659 };
4660 "postcss-normalize-charset-4.0.1" = {
4661 name = "postcss-normalize-charset";
4662 packageName = "postcss-normalize-charset";
4663 version = "4.0.1";
4664 src = fetchurl {
4665 url = "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz";
4666 sha512 = "gMXCrrlWh6G27U0hF3vNvR3w8I1s2wOBILvA87iNXaPvSNo5uZAMYsZG7XjCUf1eVxuPfyL4TJ7++SGZLc9A3g==";
4667 };
4668 };
4669 "postcss-normalize-display-values-4.0.2" = {
4670 name = "postcss-normalize-display-values";
4671 packageName = "postcss-normalize-display-values";
4672 version = "4.0.2";
4673 src = fetchurl {
4674 url = "https://registry.npmjs.org/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz";
4675 sha512 = "3F2jcsaMW7+VtRMAqf/3m4cPFhPD3EFRgNs18u+k3lTJJlVe7d0YPO+bnwqo2xg8YiRpDXJI2u8A0wqJxMsQuQ==";
4676 };
4677 };
4678 "postcss-normalize-positions-4.0.2" = {
4679 name = "postcss-normalize-positions";
4680 packageName = "postcss-normalize-positions";
4681 version = "4.0.2";
4682 src = fetchurl {
4683 url = "https://registry.npmjs.org/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz";
4684 sha512 = "Dlf3/9AxpxE+NF1fJxYDeggi5WwV35MXGFnnoccP/9qDtFrTArZ0D0R+iKcg5WsUd8nUYMIl8yXDCtcrT8JrdA==";
4685 };
4686 };
4687 "postcss-normalize-repeat-style-4.0.2" = {
4688 name = "postcss-normalize-repeat-style";
4689 packageName = "postcss-normalize-repeat-style";
4690 version = "4.0.2";
4691 src = fetchurl {
4692 url = "https://registry.npmjs.org/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz";
4693 sha512 = "qvigdYYMpSuoFs3Is/f5nHdRLJN/ITA7huIoCyqqENJe9PvPmLhNLMu7QTjPdtnVf6OcYYO5SHonx4+fbJE1+Q==";
4694 };
4695 };
4696 "postcss-normalize-string-4.0.2" = {
4697 name = "postcss-normalize-string";
4698 packageName = "postcss-normalize-string";
4699 version = "4.0.2";
4700 src = fetchurl {
4701 url = "https://registry.npmjs.org/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz";
4702 sha512 = "RrERod97Dnwqq49WNz8qo66ps0swYZDSb6rM57kN2J+aoyEAJfZ6bMx0sx/F9TIEX0xthPGCmeyiam/jXif0eA==";
4703 };
4704 };
4705 "postcss-normalize-timing-functions-4.0.2" = {
4706 name = "postcss-normalize-timing-functions";
4707 packageName = "postcss-normalize-timing-functions";
4708 version = "4.0.2";
4709 src = fetchurl {
4710 url = "https://registry.npmjs.org/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz";
4711 sha512 = "acwJY95edP762e++00Ehq9L4sZCEcOPyaHwoaFOhIwWCDfik6YvqsYNxckee65JHLKzuNSSmAdxwD2Cud1Z54A==";
4712 };
4713 };
4714 "postcss-normalize-unicode-4.0.1" = {
4715 name = "postcss-normalize-unicode";
4716 packageName = "postcss-normalize-unicode";
4717 version = "4.0.1";
4718 src = fetchurl {
4719 url = "https://registry.npmjs.org/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz";
4720 sha512 = "od18Uq2wCYn+vZ/qCOeutvHjB5jm57ToxRaMeNuf0nWVHaP9Hua56QyMF6fs/4FSUnVIw0CBPsU0K4LnBPwYwg==";
4721 };
4722 };
4723 "postcss-normalize-url-4.0.1" = {
4724 name = "postcss-normalize-url";
4725 packageName = "postcss-normalize-url";
4726 version = "4.0.1";
4727 src = fetchurl {
4728 url = "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz";
4729 sha512 = "p5oVaF4+IHwu7VpMan/SSpmpYxcJMtkGppYf0VbdH5B6hN8YNmVyJLuY9FmLQTzY3fag5ESUUHDqM+heid0UVA==";
4730 };
4731 };
4732 "postcss-normalize-whitespace-4.0.2" = {
4733 name = "postcss-normalize-whitespace";
4734 packageName = "postcss-normalize-whitespace";
4735 version = "4.0.2";
4736 src = fetchurl {
4737 url = "https://registry.npmjs.org/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz";
4738 sha512 = "tO8QIgrsI3p95r8fyqKV+ufKlSHh9hMJqACqbv2XknufqEDhDvbguXGBBqxw9nsQoXWf0qOqppziKJKHMD4GtA==";
4739 };
4740 };
4741 "postcss-ordered-values-4.1.2" = {
4742 name = "postcss-ordered-values";
4743 packageName = "postcss-ordered-values";
4744 version = "4.1.2";
4745 src = fetchurl {
4746 url = "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz";
4747 sha512 = "2fCObh5UanxvSxeXrtLtlwVThBvHn6MQcu4ksNT2tsaV2Fg76R2CV98W7wNSlX+5/pFwEyaDwKLLoEV7uRybAw==";
4748 };
4749 };
4750 "postcss-reduce-initial-4.0.3" = {
4751 name = "postcss-reduce-initial";
4752 packageName = "postcss-reduce-initial";
4753 version = "4.0.3";
4754 src = fetchurl {
4755 url = "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz";
4756 sha512 = "gKWmR5aUulSjbzOfD9AlJiHCGH6AEVLaM0AV+aSioxUDd16qXP1PCh8d1/BGVvpdWn8k/HiK7n6TjeoXN1F7DA==";
4757 };
4758 };
4759 "postcss-reduce-transforms-4.0.2" = {
4760 name = "postcss-reduce-transforms";
4761 packageName = "postcss-reduce-transforms";
4762 version = "4.0.2";
4763 src = fetchurl {
4764 url = "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz";
4765 sha512 = "EEVig1Q2QJ4ELpJXMZR8Vt5DQx8/mo+dGWSR7vWXqcob2gQLyQGsionYcGKATXvQzMPn6DSN1vTN7yFximdIAg==";
4766 };
4767 };
4768 "postcss-selector-parser-3.1.2" = {
4769 name = "postcss-selector-parser";
4770 packageName = "postcss-selector-parser";
4771 version = "3.1.2";
4772 src = fetchurl {
4773 url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz";
4774 sha512 = "h7fJ/5uWuRVyOtkO45pnt1Ih40CEleeyCHzipqAZO2e5H20g25Y48uYnFUiShvY4rZWNJ/Bib/KVPmanaCtOhA==";
4775 };
4776 };
4777 "postcss-selector-parser-6.0.2" = {
4778 name = "postcss-selector-parser";
4779 packageName = "postcss-selector-parser";
4780 version = "6.0.2";
4781 src = fetchurl {
4782 url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz";
4783 sha512 = "36P2QR59jDTOAiIkqEprfJDsoNrvwFei3eCqKd1Y0tUsBimsq39BLp7RD+JWny3WgB1zGhJX8XVePwm9k4wdBg==";
4784 };
4785 };
4786 "postcss-svgo-4.0.2" = {
4787 name = "postcss-svgo";
4788 packageName = "postcss-svgo";
4789 version = "4.0.2";
4790 src = fetchurl {
4791 url = "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-4.0.2.tgz";
4792 sha512 = "C6wyjo3VwFm0QgBy+Fu7gCYOkCmgmClghO+pjcxvrcBKtiKt0uCF+hvbMO1fyv5BMImRK90SMb+dwUnfbGd+jw==";
4793 };
4794 };
4795 "postcss-unique-selectors-4.0.1" = {
4796 name = "postcss-unique-selectors";
4797 packageName = "postcss-unique-selectors";
4798 version = "4.0.1";
4799 src = fetchurl {
4800 url = "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz";
4801 sha512 = "+JanVaryLo9QwZjKrmJgkI4Fn8SBgRO6WXQBJi7KiAVPlmxikB5Jzc4EvXMT2H0/m0RjrVVm9rGNhZddm/8Spg==";
4802 };
4803 };
4804 "postcss-value-parser-3.3.1" = {
4805 name = "postcss-value-parser";
4806 packageName = "postcss-value-parser";
4807 version = "3.3.1";
4808 src = fetchurl {
4809 url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz";
4810 sha512 = "pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==";
4811 };
4812 };
4813 "postcss-value-parser-4.0.3" = {
4814 name = "postcss-value-parser";
4815 packageName = "postcss-value-parser";
4816 version = "4.0.3";
4817 src = fetchurl {
4818 url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.0.3.tgz";
4819 sha512 = "N7h4pG+Nnu5BEIzyeaaIYWs0LI5XC40OrRh5L60z0QjFsqGWcHcbkBvpe1WYpcIS9yQ8sOi/vIPt1ejQCrMVrg==";
4820 };
4821 };
4822 "posthtml-0.11.6" = {
4823 name = "posthtml";
4824 packageName = "posthtml";
4825 version = "0.11.6";
4826 src = fetchurl {
4827 url = "https://registry.npmjs.org/posthtml/-/posthtml-0.11.6.tgz";
4828 sha512 = "C2hrAPzmRdpuL3iH0TDdQ6XCc9M7Dcc3zEW5BLerY65G4tWWszwv6nG/ksi6ul5i2mx22ubdljgktXCtNkydkw==";
4829 };
4830 };
4831 "posthtml-0.12.3" = {
4832 name = "posthtml";
4833 packageName = "posthtml";
4834 version = "0.12.3";
4835 src = fetchurl {
4836 url = "https://registry.npmjs.org/posthtml/-/posthtml-0.12.3.tgz";
4837 sha512 = "Fbpi95+JJyR0tqU7pUy1zTSQFjAsluuwB9pJ1h0jtnGk7n/O2TBtP5nDl9rV0JVACjQ1Lm5wSp4ppChr8u3MhA==";
4838 };
4839 };
4840 "posthtml-parser-0.4.2" = {
4841 name = "posthtml-parser";
4842 packageName = "posthtml-parser";
4843 version = "0.4.2";
4844 src = fetchurl {
4845 url = "https://registry.npmjs.org/posthtml-parser/-/posthtml-parser-0.4.2.tgz";
4846 sha512 = "BUIorsYJTvS9UhXxPTzupIztOMVNPa/HtAm9KHni9z6qEfiJ1bpOBL5DfUOL9XAc3XkLIEzBzpph+Zbm4AdRAg==";
4847 };
4848 };
4849 "posthtml-render-1.2.2" = {
4850 name = "posthtml-render";
4851 packageName = "posthtml-render";
4852 version = "1.2.2";
4853 src = fetchurl {
4854 url = "https://registry.npmjs.org/posthtml-render/-/posthtml-render-1.2.2.tgz";
4855 sha512 = "MbIXTWwAfJ9qET6Zl29UNwJcDJEEz9Zkr5oDhiujitJa7YBJwEpbkX2cmuklCDxubTMoRWpid3q8DrSyGnUUzQ==";
4856 };
4857 };
4858 "prelude-ls-1.1.2" = {
4859 name = "prelude-ls";
4860 packageName = "prelude-ls";
4861 version = "1.1.2";
4862 src = fetchurl {
4863 url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
4864 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
4865 };
4866 };
4867 "private-0.1.8" = {
4868 name = "private";
4869 packageName = "private";
4870 version = "0.1.8";
4871 src = fetchurl {
4872 url = "https://registry.npmjs.org/private/-/private-0.1.8.tgz";
4873 sha512 = "VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==";
4874 };
4875 };
4876 "process-0.11.10" = {
4877 name = "process";
4878 packageName = "process";
4879 version = "0.11.10";
4880 src = fetchurl {
4881 url = "https://registry.npmjs.org/process/-/process-0.11.10.tgz";
4882 sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
4883 };
4884 };
4885 "process-nextick-args-2.0.1" = {
4886 name = "process-nextick-args";
4887 packageName = "process-nextick-args";
4888 version = "2.0.1";
4889 src = fetchurl {
4890 url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
4891 sha512 = "3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==";
4892 };
4893 };
4894 "proto-list-1.2.4" = {
4895 name = "proto-list";
4896 packageName = "proto-list";
4897 version = "1.2.4";
4898 src = fetchurl {
4899 url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz";
4900 sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
4901 };
4902 };
4903 "pseudomap-1.0.2" = {
4904 name = "pseudomap";
4905 packageName = "pseudomap";
4906 version = "1.0.2";
4907 src = fetchurl {
4908 url = "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz";
4909 sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
4910 };
4911 };
4912 "psl-1.8.0" = {
4913 name = "psl";
4914 packageName = "psl";
4915 version = "1.8.0";
4916 src = fetchurl {
4917 url = "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz";
4918 sha512 = "RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==";
4919 };
4920 };
4921 "public-encrypt-4.0.3" = {
4922 name = "public-encrypt";
4923 packageName = "public-encrypt";
4924 version = "4.0.3";
4925 src = fetchurl {
4926 url = "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz";
4927 sha512 = "zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==";
4928 };
4929 };
4930 "punycode-1.3.2" = {
4931 name = "punycode";
4932 packageName = "punycode";
4933 version = "1.3.2";
4934 src = fetchurl {
4935 url = "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz";
4936 sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
4937 };
4938 };
4939 "punycode-1.4.1" = {
4940 name = "punycode";
4941 packageName = "punycode";
4942 version = "1.4.1";
4943 src = fetchurl {
4944 url = "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz";
4945 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
4946 };
4947 };
4948 "punycode-2.1.1" = {
4949 name = "punycode";
4950 packageName = "punycode";
4951 version = "2.1.1";
4952 src = fetchurl {
4953 url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
4954 sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
4955 };
4956 };
4957 "purgecss-1.4.2" = {
4958 name = "purgecss";
4959 packageName = "purgecss";
4960 version = "1.4.2";
4961 src = fetchurl {
4962 url = "https://registry.npmjs.org/purgecss/-/purgecss-1.4.2.tgz";
4963 sha512 = "hkOreFTgiyMHMmC2BxzdIw5DuC6kxAbP/gGOGd3MEsF3+5m69rIvUEPaxrnoUtfODTFKe9hcXjGwC6jcjoyhOw==";
4964 };
4965 };
4966 "q-1.5.1" = {
4967 name = "q";
4968 packageName = "q";
4969 version = "1.5.1";
4970 src = fetchurl {
4971 url = "https://registry.npmjs.org/q/-/q-1.5.1.tgz";
4972 sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
4973 };
4974 };
4975 "qs-6.5.2" = {
4976 name = "qs";
4977 packageName = "qs";
4978 version = "6.5.2";
4979 src = fetchurl {
4980 url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";
4981 sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==";
4982 };
4983 };
4984 "querystring-0.2.0" = {
4985 name = "querystring";
4986 packageName = "querystring";
4987 version = "0.2.0";
4988 src = fetchurl {
4989 url = "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz";
4990 sha1 = "b209849203bb25df820da756e747005878521620";
4991 };
4992 };
4993 "querystring-es3-0.2.1" = {
4994 name = "querystring-es3";
4995 packageName = "querystring-es3";
4996 version = "0.2.1";
4997 src = fetchurl {
4998 url = "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz";
4999 sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
5000 };
5001 };
5002 "quote-stream-1.0.2" = {
5003 name = "quote-stream";
5004 packageName = "quote-stream";
5005 version = "1.0.2";
5006 src = fetchurl {
5007 url = "https://registry.npmjs.org/quote-stream/-/quote-stream-1.0.2.tgz";
5008 sha1 = "84963f8c9c26b942e153feeb53aae74652b7e0b2";
5009 };
5010 };
5011 "randombytes-2.1.0" = {
5012 name = "randombytes";
5013 packageName = "randombytes";
5014 version = "2.1.0";
5015 src = fetchurl {
5016 url = "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz";
5017 sha512 = "vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==";
5018 };
5019 };
5020 "randomfill-1.0.4" = {
5021 name = "randomfill";
5022 packageName = "randomfill";
5023 version = "1.0.4";
5024 src = fetchurl {
5025 url = "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz";
5026 sha512 = "87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==";
5027 };
5028 };
5029 "range-parser-1.2.1" = {
5030 name = "range-parser";
5031 packageName = "range-parser";
5032 version = "1.2.1";
5033 src = fetchurl {
5034 url = "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz";
5035 sha512 = "Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==";
5036 };
5037 };
5038 "readable-stream-2.3.7" = {
5039 name = "readable-stream";
5040 packageName = "readable-stream";
5041 version = "2.3.7";
5042 src = fetchurl {
5043 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";
5044 sha512 = "Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==";
5045 };
5046 };
5047 "readable-stream-3.6.0" = {
5048 name = "readable-stream";
5049 packageName = "readable-stream";
5050 version = "3.6.0";
5051 src = fetchurl {
5052 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz";
5053 sha512 = "BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==";
5054 };
5055 };
5056 "readdirp-2.2.1" = {
5057 name = "readdirp";
5058 packageName = "readdirp";
5059 version = "2.2.1";
5060 src = fetchurl {
5061 url = "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz";
5062 sha512 = "1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==";
5063 };
5064 };
5065 "regenerate-1.4.0" = {
5066 name = "regenerate";
5067 packageName = "regenerate";
5068 version = "1.4.0";
5069 src = fetchurl {
5070 url = "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz";
5071 sha512 = "1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==";
5072 };
5073 };
5074 "regenerate-unicode-properties-8.2.0" = {
5075 name = "regenerate-unicode-properties";
5076 packageName = "regenerate-unicode-properties";
5077 version = "8.2.0";
5078 src = fetchurl {
5079 url = "https://registry.npmjs.org/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz";
5080 sha512 = "F9DjY1vKLo/tPePDycuH3dn9H1OTPIkVD9Kz4LODu+F2C75mgjAJ7x/gwy6ZcSNRAAkhNlJSOHRe8k3p+K9WhA==";
5081 };
5082 };
5083 "regenerator-runtime-0.11.1" = {
5084 name = "regenerator-runtime";
5085 packageName = "regenerator-runtime";
5086 version = "0.11.1";
5087 src = fetchurl {
5088 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
5089 sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
5090 };
5091 };
5092 "regenerator-runtime-0.12.1" = {
5093 name = "regenerator-runtime";
5094 packageName = "regenerator-runtime";
5095 version = "0.12.1";
5096 src = fetchurl {
5097 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.12.1.tgz";
5098 sha512 = "odxIc1/vDlo4iZcfXqRYFj0vpXFNoGdKMAUieAlFYO6m/nl5e9KR/beGf41z4a1FI+aQgtjhuaSlDxQ0hmkrHg==";
5099 };
5100 };
5101 "regenerator-runtime-0.13.5" = {
5102 name = "regenerator-runtime";
5103 packageName = "regenerator-runtime";
5104 version = "0.13.5";
5105 src = fetchurl {
5106 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz";
5107 sha512 = "ZS5w8CpKFinUzOwW3c83oPeVXoNsrLsaCoLtJvAClH135j/R77RuymhiSErhm2lKcwSCIpmvIWSbDkIfAqKQlA==";
5108 };
5109 };
5110 "regenerator-transform-0.14.4" = {
5111 name = "regenerator-transform";
5112 packageName = "regenerator-transform";
5113 version = "0.14.4";
5114 src = fetchurl {
5115 url = "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.14.4.tgz";
5116 sha512 = "EaJaKPBI9GvKpvUz2mz4fhx7WPgvwRLY9v3hlNHWmAuJHI13T4nwKnNvm5RWJzEdnI5g5UwtOww+S8IdoUC2bw==";
5117 };
5118 };
5119 "regex-not-1.0.2" = {
5120 name = "regex-not";
5121 packageName = "regex-not";
5122 version = "1.0.2";
5123 src = fetchurl {
5124 url = "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz";
5125 sha512 = "J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==";
5126 };
5127 };
5128 "regexpu-core-4.7.0" = {
5129 name = "regexpu-core";
5130 packageName = "regexpu-core";
5131 version = "4.7.0";
5132 src = fetchurl {
5133 url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-4.7.0.tgz";
5134 sha512 = "TQ4KXRnIn6tz6tjnrXEkD/sshygKH/j5KzK86X8MkeHyZ8qst/LZ89j3X4/8HEIfHANTFIP/AbXakeRhWIl5YQ==";
5135 };
5136 };
5137 "regjsgen-0.5.1" = {
5138 name = "regjsgen";
5139 packageName = "regjsgen";
5140 version = "0.5.1";
5141 src = fetchurl {
5142 url = "https://registry.npmjs.org/regjsgen/-/regjsgen-0.5.1.tgz";
5143 sha512 = "5qxzGZjDs9w4tzT3TPhCJqWdCc3RLYwy9J2NB0nm5Lz+S273lvWcpjaTGHsT1dc6Hhfq41uSEOw8wBmxrKOuyg==";
5144 };
5145 };
5146 "regjsparser-0.6.4" = {
5147 name = "regjsparser";
5148 packageName = "regjsparser";
5149 version = "0.6.4";
5150 src = fetchurl {
5151 url = "https://registry.npmjs.org/regjsparser/-/regjsparser-0.6.4.tgz";
5152 sha512 = "64O87/dPDgfk8/RQqC4gkZoGyyWFIEUTTh80CU6CWuK5vkCGyekIx+oKcEIYtP/RAxSQltCZHCNu/mdd7fqlJw==";
5153 };
5154 };
5155 "remove-trailing-separator-1.1.0" = {
5156 name = "remove-trailing-separator";
5157 packageName = "remove-trailing-separator";
5158 version = "1.1.0";
5159 src = fetchurl {
5160 url = "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
5161 sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
5162 };
5163 };
5164 "repeat-element-1.1.3" = {
5165 name = "repeat-element";
5166 packageName = "repeat-element";
5167 version = "1.1.3";
5168 src = fetchurl {
5169 url = "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz";
5170 sha512 = "ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==";
5171 };
5172 };
5173 "repeat-string-1.6.1" = {
5174 name = "repeat-string";
5175 packageName = "repeat-string";
5176 version = "1.6.1";
5177 src = fetchurl {
5178 url = "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz";
5179 sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
5180 };
5181 };
5182 "request-2.88.2" = {
5183 name = "request";
5184 packageName = "request";
5185 version = "2.88.2";
5186 src = fetchurl {
5187 url = "https://registry.npmjs.org/request/-/request-2.88.2.tgz";
5188 sha512 = "MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==";
5189 };
5190 };
5191 "request-promise-core-1.1.3" = {
5192 name = "request-promise-core";
5193 packageName = "request-promise-core";
5194 version = "1.1.3";
5195 src = fetchurl {
5196 url = "https://registry.npmjs.org/request-promise-core/-/request-promise-core-1.1.3.tgz";
5197 sha512 = "QIs2+ArIGQVp5ZYbWD5ZLCY29D5CfWizP8eWnm8FoGD1TX61veauETVQbrV60662V0oFBkrDOuaBI8XgtuyYAQ==";
5198 };
5199 };
5200 "request-promise-native-1.0.8" = {
5201 name = "request-promise-native";
5202 packageName = "request-promise-native";
5203 version = "1.0.8";
5204 src = fetchurl {
5205 url = "https://registry.npmjs.org/request-promise-native/-/request-promise-native-1.0.8.tgz";
5206 sha512 = "dapwLGqkHtwL5AEbfenuzjTYg35Jd6KPytsC2/TLkVMz8rm+tNt72MGUWT1RP/aYawMpN6HqbNGBQaRcBtjQMQ==";
5207 };
5208 };
5209 "require-directory-2.1.1" = {
5210 name = "require-directory";
5211 packageName = "require-directory";
5212 version = "2.1.1";
5213 src = fetchurl {
5214 url = "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz";
5215 sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
5216 };
5217 };
5218 "require-main-filename-2.0.0" = {
5219 name = "require-main-filename";
5220 packageName = "require-main-filename";
5221 version = "2.0.0";
5222 src = fetchurl {
5223 url = "https://registry.npmjs.org/require-main-filename/-/require-main-filename-2.0.0.tgz";
5224 sha512 = "NKN5kMDylKuldxYLSUfrbo5Tuzh4hd+2E8NPPX02mZtn1VuREQToYe/ZdlJy+J3uCpfaiGF05e7B8W0iXbQHmg==";
5225 };
5226 };
5227 "resolve-1.17.0" = {
5228 name = "resolve";
5229 packageName = "resolve";
5230 version = "1.17.0";
5231 src = fetchurl {
5232 url = "https://registry.npmjs.org/resolve/-/resolve-1.17.0.tgz";
5233 sha512 = "ic+7JYiV8Vi2yzQGFWOkiZD5Z9z7O2Zhm9XMaTxdJExKasieFCr+yXZ/WmXsckHiKl12ar0y6XiXDx3m4RHn1w==";
5234 };
5235 };
5236 "resolve-from-3.0.0" = {
5237 name = "resolve-from";
5238 packageName = "resolve-from";
5239 version = "3.0.0";
5240 src = fetchurl {
5241 url = "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz";
5242 sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
5243 };
5244 };
5245 "resolve-url-0.2.1" = {
5246 name = "resolve-url";
5247 packageName = "resolve-url";
5248 version = "0.2.1";
5249 src = fetchurl {
5250 url = "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz";
5251 sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
5252 };
5253 };
5254 "restore-cursor-2.0.0" = {
5255 name = "restore-cursor";
5256 packageName = "restore-cursor";
5257 version = "2.0.0";
5258 src = fetchurl {
5259 url = "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz";
5260 sha1 = "9f7ee287f82fd326d4fd162923d62129eee0dfaf";
5261 };
5262 };
5263 "ret-0.1.15" = {
5264 name = "ret";
5265 packageName = "ret";
5266 version = "0.1.15";
5267 src = fetchurl {
5268 url = "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz";
5269 sha512 = "TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==";
5270 };
5271 };
5272 "rgb-regex-1.0.1" = {
5273 name = "rgb-regex";
5274 packageName = "rgb-regex";
5275 version = "1.0.1";
5276 src = fetchurl {
5277 url = "https://registry.npmjs.org/rgb-regex/-/rgb-regex-1.0.1.tgz";
5278 sha1 = "c0e0d6882df0e23be254a475e8edd41915feaeb1";
5279 };
5280 };
5281 "rgba-regex-1.0.0" = {
5282 name = "rgba-regex";
5283 packageName = "rgba-regex";
5284 version = "1.0.0";
5285 src = fetchurl {
5286 url = "https://registry.npmjs.org/rgba-regex/-/rgba-regex-1.0.0.tgz";
5287 sha1 = "43374e2e2ca0968b0ef1523460b7d730ff22eeb3";
5288 };
5289 };
5290 "rimraf-2.6.3" = {
5291 name = "rimraf";
5292 packageName = "rimraf";
5293 version = "2.6.3";
5294 src = fetchurl {
5295 url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";
5296 sha512 = "mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==";
5297 };
5298 };
5299 "ripemd160-2.0.2" = {
5300 name = "ripemd160";
5301 packageName = "ripemd160";
5302 version = "2.0.2";
5303 src = fetchurl {
5304 url = "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz";
5305 sha512 = "ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==";
5306 };
5307 };
5308 "safe-buffer-5.1.2" = {
5309 name = "safe-buffer";
5310 packageName = "safe-buffer";
5311 version = "5.1.2";
5312 src = fetchurl {
5313 url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
5314 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
5315 };
5316 };
5317 "safe-regex-1.1.0" = {
5318 name = "safe-regex";
5319 packageName = "safe-regex";
5320 version = "1.1.0";
5321 src = fetchurl {
5322 url = "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz";
5323 sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
5324 };
5325 };
5326 "safer-buffer-2.1.2" = {
5327 name = "safer-buffer";
5328 packageName = "safer-buffer";
5329 version = "2.1.2";
5330 src = fetchurl {
5331 url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
5332 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
5333 };
5334 };
5335 "safer-eval-1.3.6" = {
5336 name = "safer-eval";
5337 packageName = "safer-eval";
5338 version = "1.3.6";
5339 src = fetchurl {
5340 url = "https://registry.npmjs.org/safer-eval/-/safer-eval-1.3.6.tgz";
5341 sha512 = "DN9tBsZgtUOHODzSfO1nGCLhZtxc7Qq/d8/2SNxQZ9muYXZspSh1fO7HOsrf4lcelBNviAJLCxB/ggmG+jV1aw==";
5342 };
5343 };
5344 "sax-1.2.4" = {
5345 name = "sax";
5346 packageName = "sax";
5347 version = "1.2.4";
5348 src = fetchurl {
5349 url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";
5350 sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==";
5351 };
5352 };
5353 "saxes-3.1.11" = {
5354 name = "saxes";
5355 packageName = "saxes";
5356 version = "3.1.11";
5357 src = fetchurl {
5358 url = "https://registry.npmjs.org/saxes/-/saxes-3.1.11.tgz";
5359 sha512 = "Ydydq3zC+WYDJK1+gRxRapLIED9PWeSuuS41wqyoRmzvhhh9nc+QQrVMKJYzJFULazeGhzSV0QleN2wD3boh2g==";
5360 };
5361 };
5362 "semver-5.7.1" = {
5363 name = "semver";
5364 packageName = "semver";
5365 version = "5.7.1";
5366 src = fetchurl {
5367 url = "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";
5368 sha512 = "sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==";
5369 };
5370 };
5371 "send-0.17.1" = {
5372 name = "send";
5373 packageName = "send";
5374 version = "0.17.1";
5375 src = fetchurl {
5376 url = "https://registry.npmjs.org/send/-/send-0.17.1.tgz";
5377 sha512 = "BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==";
5378 };
5379 };
5380 "serialize-to-js-1.2.2" = {
5381 name = "serialize-to-js";
5382 packageName = "serialize-to-js";
5383 version = "1.2.2";
5384 src = fetchurl {
5385 url = "https://registry.npmjs.org/serialize-to-js/-/serialize-to-js-1.2.2.tgz";
5386 sha512 = "mUc8vA5iJghe+O+3s0YDGFLMJcqitVFk787YKiv8a4sf6RX5W0u81b+gcHrp15O0fFa010dRBVZvwcKXOWsL9Q==";
5387 };
5388 };
5389 "serve-static-1.14.1" = {
5390 name = "serve-static";
5391 packageName = "serve-static";
5392 version = "1.14.1";
5393 src = fetchurl {
5394 url = "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz";
5395 sha512 = "JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==";
5396 };
5397 };
5398 "set-blocking-2.0.0" = {
5399 name = "set-blocking";
5400 packageName = "set-blocking";
5401 version = "2.0.0";
5402 src = fetchurl {
5403 url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
5404 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
5405 };
5406 };
5407 "set-value-2.0.1" = {
5408 name = "set-value";
5409 packageName = "set-value";
5410 version = "2.0.1";
5411 src = fetchurl {
5412 url = "https://registry.npmjs.org/set-value/-/set-value-2.0.1.tgz";
5413 sha512 = "JxHc1weCN68wRY0fhCoXpyK55m/XPHafOmK4UWD7m2CI14GMcFypt4w/0+NV5f/ZMby2F6S2wwA7fgynh9gWSw==";
5414 };
5415 };
5416 "setimmediate-1.0.5" = {
5417 name = "setimmediate";
5418 packageName = "setimmediate";
5419 version = "1.0.5";
5420 src = fetchurl {
5421 url = "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz";
5422 sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
5423 };
5424 };
5425 "setprototypeof-1.1.1" = {
5426 name = "setprototypeof";
5427 packageName = "setprototypeof";
5428 version = "1.1.1";
5429 src = fetchurl {
5430 url = "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz";
5431 sha512 = "JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==";
5432 };
5433 };
5434 "sha.js-2.4.11" = {
5435 name = "sha.js";
5436 packageName = "sha.js";
5437 version = "2.4.11";
5438 src = fetchurl {
5439 url = "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz";
5440 sha512 = "QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==";
5441 };
5442 };
5443 "shallow-copy-0.0.1" = {
5444 name = "shallow-copy";
5445 packageName = "shallow-copy";
5446 version = "0.0.1";
5447 src = fetchurl {
5448 url = "https://registry.npmjs.org/shallow-copy/-/shallow-copy-0.0.1.tgz";
5449 sha1 = "415f42702d73d810330292cc5ee86eae1a11a170";
5450 };
5451 };
5452 "shebang-command-1.2.0" = {
5453 name = "shebang-command";
5454 packageName = "shebang-command";
5455 version = "1.2.0";
5456 src = fetchurl {
5457 url = "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz";
5458 sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
5459 };
5460 };
5461 "shebang-regex-1.0.0" = {
5462 name = "shebang-regex";
5463 packageName = "shebang-regex";
5464 version = "1.0.0";
5465 src = fetchurl {
5466 url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz";
5467 sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
5468 };
5469 };
5470 "sigmund-1.0.1" = {
5471 name = "sigmund";
5472 packageName = "sigmund";
5473 version = "1.0.1";
5474 src = fetchurl {
5475 url = "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz";
5476 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
5477 };
5478 };
5479 "signal-exit-3.0.3" = {
5480 name = "signal-exit";
5481 packageName = "signal-exit";
5482 version = "3.0.3";
5483 src = fetchurl {
5484 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz";
5485 sha512 = "VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==";
5486 };
5487 };
5488 "simple-swizzle-0.2.2" = {
5489 name = "simple-swizzle";
5490 packageName = "simple-swizzle";
5491 version = "0.2.2";
5492 src = fetchurl {
5493 url = "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz";
5494 sha1 = "a4da6b635ffcccca33f70d17cb92592de95e557a";
5495 };
5496 };
5497 "snapdragon-0.8.2" = {
5498 name = "snapdragon";
5499 packageName = "snapdragon";
5500 version = "0.8.2";
5501 src = fetchurl {
5502 url = "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz";
5503 sha512 = "FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==";
5504 };
5505 };
5506 "snapdragon-node-2.1.1" = {
5507 name = "snapdragon-node";
5508 packageName = "snapdragon-node";
5509 version = "2.1.1";
5510 src = fetchurl {
5511 url = "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
5512 sha512 = "O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==";
5513 };
5514 };
5515 "snapdragon-util-3.0.1" = {
5516 name = "snapdragon-util";
5517 packageName = "snapdragon-util";
5518 version = "3.0.1";
5519 src = fetchurl {
5520 url = "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
5521 sha512 = "mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==";
5522 };
5523 };
5524 "source-map-0.5.7" = {
5525 name = "source-map";
5526 packageName = "source-map";
5527 version = "0.5.7";
5528 src = fetchurl {
5529 url = "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz";
5530 sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
5531 };
5532 };
5533 "source-map-0.6.1" = {
5534 name = "source-map";
5535 packageName = "source-map";
5536 version = "0.6.1";
5537 src = fetchurl {
5538 url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";
5539 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
5540 };
5541 };
5542 "source-map-resolve-0.5.3" = {
5543 name = "source-map-resolve";
5544 packageName = "source-map-resolve";
5545 version = "0.5.3";
5546 src = fetchurl {
5547 url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.3.tgz";
5548 sha512 = "Htz+RnsXWk5+P2slx5Jh3Q66vhQj1Cllm0zvnaY98+NFx+Dv2CF/f5O/t8x+KaNdrdIAsruNzoh/KpialbqAnw==";
5549 };
5550 };
5551 "source-map-support-0.5.19" = {
5552 name = "source-map-support";
5553 packageName = "source-map-support";
5554 version = "0.5.19";
5555 src = fetchurl {
5556 url = "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz";
5557 sha512 = "Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==";
5558 };
5559 };
5560 "source-map-url-0.4.0" = {
5561 name = "source-map-url";
5562 packageName = "source-map-url";
5563 version = "0.4.0";
5564 src = fetchurl {
5565 url = "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz";
5566 sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
5567 };
5568 };
5569 "split-string-3.1.0" = {
5570 name = "split-string";
5571 packageName = "split-string";
5572 version = "3.1.0";
5573 src = fetchurl {
5574 url = "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz";
5575 sha512 = "NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==";
5576 };
5577 };
5578 "sprintf-js-1.0.3" = {
5579 name = "sprintf-js";
5580 packageName = "sprintf-js";
5581 version = "1.0.3";
5582 src = fetchurl {
5583 url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz";
5584 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
5585 };
5586 };
5587 "sshpk-1.16.1" = {
5588 name = "sshpk";
5589 packageName = "sshpk";
5590 version = "1.16.1";
5591 src = fetchurl {
5592 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";
5593 sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==";
5594 };
5595 };
5596 "stable-0.1.8" = {
5597 name = "stable";
5598 packageName = "stable";
5599 version = "0.1.8";
5600 src = fetchurl {
5601 url = "https://registry.npmjs.org/stable/-/stable-0.1.8.tgz";
5602 sha512 = "ji9qxRnOVfcuLDySj9qzhGSEFVobyt1kIOSkj1qZzYLzq7Tos/oUUWvotUPQLlrsidqsK6tBH89Bc9kL5zHA6w==";
5603 };
5604 };
5605 "static-eval-2.0.5" = {
5606 name = "static-eval";
5607 packageName = "static-eval";
5608 version = "2.0.5";
5609 src = fetchurl {
5610 url = "https://registry.npmjs.org/static-eval/-/static-eval-2.0.5.tgz";
5611 sha512 = "nNbV6LbGtMBgv7e9LFkt5JV8RVlRsyJrphfAt9tOtBBW/SfnzZDf2KnS72an8e434A+9e/BmJuTxeGPvrAK7KA==";
5612 };
5613 };
5614 "static-extend-0.1.2" = {
5615 name = "static-extend";
5616 packageName = "static-extend";
5617 version = "0.1.2";
5618 src = fetchurl {
5619 url = "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz";
5620 sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
5621 };
5622 };
5623 "static-module-2.2.5" = {
5624 name = "static-module";
5625 packageName = "static-module";
5626 version = "2.2.5";
5627 src = fetchurl {
5628 url = "https://registry.npmjs.org/static-module/-/static-module-2.2.5.tgz";
5629 sha512 = "D8vv82E/Kpmz3TXHKG8PPsCPg+RAX6cbCOyvjM6x04qZtQ47EtJFVwRsdov3n5d6/6ynrOY9XB4JkaZwB2xoRQ==";
5630 };
5631 };
5632 "statuses-1.5.0" = {
5633 name = "statuses";
5634 packageName = "statuses";
5635 version = "1.5.0";
5636 src = fetchurl {
5637 url = "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz";
5638 sha1 = "161c7dac177659fd9811f43771fa99381478628c";
5639 };
5640 };
5641 "stealthy-require-1.1.1" = {
5642 name = "stealthy-require";
5643 packageName = "stealthy-require";
5644 version = "1.1.1";
5645 src = fetchurl {
5646 url = "https://registry.npmjs.org/stealthy-require/-/stealthy-require-1.1.1.tgz";
5647 sha1 = "35b09875b4ff49f26a777e509b3090a3226bf24b";
5648 };
5649 };
5650 "stream-browserify-2.0.2" = {
5651 name = "stream-browserify";
5652 packageName = "stream-browserify";
5653 version = "2.0.2";
5654 src = fetchurl {
5655 url = "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.2.tgz";
5656 sha512 = "nX6hmklHs/gr2FuxYDltq8fJA1GDlxKQCz8O/IM4atRqBH8OORmBNgfvW5gG10GT/qQ9u0CzIvr2X5Pkt6ntqg==";
5657 };
5658 };
5659 "stream-http-2.8.3" = {
5660 name = "stream-http";
5661 packageName = "stream-http";
5662 version = "2.8.3";
5663 src = fetchurl {
5664 url = "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz";
5665 sha512 = "+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==";
5666 };
5667 };
5668 "string-width-3.1.0" = {
5669 name = "string-width";
5670 packageName = "string-width";
5671 version = "3.1.0";
5672 src = fetchurl {
5673 url = "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz";
5674 sha512 = "vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==";
5675 };
5676 };
5677 "string.prototype.trimend-1.0.1" = {
5678 name = "string.prototype.trimend";
5679 packageName = "string.prototype.trimend";
5680 version = "1.0.1";
5681 src = fetchurl {
5682 url = "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz";
5683 sha512 = "LRPxFUaTtpqYsTeNKaFOw3R4bxIzWOnbQ837QfBylo8jIxtcbK/A/sMV7Q+OAV/vWo+7s25pOE10KYSjaSO06g==";
5684 };
5685 };
5686 "string.prototype.trimleft-2.1.2" = {
5687 name = "string.prototype.trimleft";
5688 packageName = "string.prototype.trimleft";
5689 version = "2.1.2";
5690 src = fetchurl {
5691 url = "https://registry.npmjs.org/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz";
5692 sha512 = "gCA0tza1JBvqr3bfAIFJGqfdRTyPae82+KTnm3coDXkZN9wnuW3HjGgN386D7hfv5CHQYCI022/rJPVlqXyHSw==";
5693 };
5694 };
5695 "string.prototype.trimright-2.1.2" = {
5696 name = "string.prototype.trimright";
5697 packageName = "string.prototype.trimright";
5698 version = "2.1.2";
5699 src = fetchurl {
5700 url = "https://registry.npmjs.org/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz";
5701 sha512 = "ZNRQ7sY3KroTaYjRS6EbNiiHrOkjihL9aQE/8gfQ4DtAC/aEBRHFJa44OmoWxGGqXuJlfKkZW4WcXErGr+9ZFg==";
5702 };
5703 };
5704 "string.prototype.trimstart-1.0.1" = {
5705 name = "string.prototype.trimstart";
5706 packageName = "string.prototype.trimstart";
5707 version = "1.0.1";
5708 src = fetchurl {
5709 url = "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz";
5710 sha512 = "XxZn+QpvrBI1FOcg6dIpxUPgWCPuNXvMD72aaRaUQv1eD4e/Qy8i/hFTe0BUmD60p/QA6bh1avmuPTfNjqVWRw==";
5711 };
5712 };
5713 "string_decoder-1.1.1" = {
5714 name = "string_decoder";
5715 packageName = "string_decoder";
5716 version = "1.1.1";
5717 src = fetchurl {
5718 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
5719 sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
5720 };
5721 };
5722 "strip-ansi-3.0.1" = {
5723 name = "strip-ansi";
5724 packageName = "strip-ansi";
5725 version = "3.0.1";
5726 src = fetchurl {
5727 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
5728 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
5729 };
5730 };
5731 "strip-ansi-4.0.0" = {
5732 name = "strip-ansi";
5733 packageName = "strip-ansi";
5734 version = "4.0.0";
5735 src = fetchurl {
5736 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";
5737 sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
5738 };
5739 };
5740 "strip-ansi-5.2.0" = {
5741 name = "strip-ansi";
5742 packageName = "strip-ansi";
5743 version = "5.2.0";
5744 src = fetchurl {
5745 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz";
5746 sha512 = "DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==";
5747 };
5748 };
5749 "stylehacks-4.0.3" = {
5750 name = "stylehacks";
5751 packageName = "stylehacks";
5752 version = "4.0.3";
5753 src = fetchurl {
5754 url = "https://registry.npmjs.org/stylehacks/-/stylehacks-4.0.3.tgz";
5755 sha512 = "7GlLk9JwlElY4Y6a/rmbH2MhVlTyVmiJd1PfTCqFaIBEGMYNsrO/v3SeGTdhBThLg4Z+NbOk/qFMwCa+J+3p/g==";
5756 };
5757 };
5758 "supports-color-2.0.0" = {
5759 name = "supports-color";
5760 packageName = "supports-color";
5761 version = "2.0.0";
5762 src = fetchurl {
5763 url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
5764 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
5765 };
5766 };
5767 "supports-color-3.2.3" = {
5768 name = "supports-color";
5769 packageName = "supports-color";
5770 version = "3.2.3";
5771 src = fetchurl {
5772 url = "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz";
5773 sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
5774 };
5775 };
5776 "supports-color-5.5.0" = {
5777 name = "supports-color";
5778 packageName = "supports-color";
5779 version = "5.5.0";
5780 src = fetchurl {
5781 url = "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";
5782 sha512 = "QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==";
5783 };
5784 };
5785 "supports-color-6.1.0" = {
5786 name = "supports-color";
5787 packageName = "supports-color";
5788 version = "6.1.0";
5789 src = fetchurl {
5790 url = "https://registry.npmjs.org/supports-color/-/supports-color-6.1.0.tgz";
5791 sha512 = "qe1jfm1Mg7Nq/NSh6XE24gPXROEVsWHxC1LIx//XNlD9iw7YZQGjZNjYN7xGaEG6iKdA8EtNFW6R0gjnVXp+wQ==";
5792 };
5793 };
5794 "svgo-1.3.2" = {
5795 name = "svgo";
5796 packageName = "svgo";
5797 version = "1.3.2";
5798 src = fetchurl {
5799 url = "https://registry.npmjs.org/svgo/-/svgo-1.3.2.tgz";
5800 sha512 = "yhy/sQYxR5BkC98CY7o31VGsg014AKLEPxdfhora76l36hD9Rdy5NZA/Ocn6yayNPgSamYdtX2rFJdcv07AYVw==";
5801 };
5802 };
5803 "symbol-tree-3.2.4" = {
5804 name = "symbol-tree";
5805 packageName = "symbol-tree";
5806 version = "3.2.4";
5807 src = fetchurl {
5808 url = "https://registry.npmjs.org/symbol-tree/-/symbol-tree-3.2.4.tgz";
5809 sha512 = "9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==";
5810 };
5811 };
5812 "temp-0.9.0" = {
5813 name = "temp";
5814 packageName = "temp";
5815 version = "0.9.0";
5816 src = fetchurl {
5817 url = "https://registry.npmjs.org/temp/-/temp-0.9.0.tgz";
5818 sha512 = "YfUhPQCJoNQE5N+FJQcdPz63O3x3sdT4Xju69Gj4iZe0lBKOtnAMi0SLj9xKhGkcGhsxThvTJ/usxtFPo438zQ==";
5819 };
5820 };
5821 "terser-3.17.0" = {
5822 name = "terser";
5823 packageName = "terser";
5824 version = "3.17.0";
5825 src = fetchurl {
5826 url = "https://registry.npmjs.org/terser/-/terser-3.17.0.tgz";
5827 sha512 = "/FQzzPJmCpjAH9Xvk2paiWrFq+5M6aVOf+2KRbwhByISDX/EujxsK+BAvrhb6H+2rtrLCHK9N01wO014vrIwVQ==";
5828 };
5829 };
5830 "terser-4.6.12" = {
5831 name = "terser";
5832 packageName = "terser";
5833 version = "4.6.12";
5834 src = fetchurl {
5835 url = "https://registry.npmjs.org/terser/-/terser-4.6.12.tgz";
5836 sha512 = "fnIwuaKjFPANG6MAixC/k1TDtnl1YlPLUlLVIxxGZUn1gfUx2+l3/zGNB72wya+lgsb50QBi2tUV75RiODwnww==";
5837 };
5838 };
5839 "through2-2.0.5" = {
5840 name = "through2";
5841 packageName = "through2";
5842 version = "2.0.5";
5843 src = fetchurl {
5844 url = "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz";
5845 sha512 = "/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==";
5846 };
5847 };
5848 "timers-browserify-2.0.11" = {
5849 name = "timers-browserify";
5850 packageName = "timers-browserify";
5851 version = "2.0.11";
5852 src = fetchurl {
5853 url = "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.11.tgz";
5854 sha512 = "60aV6sgJ5YEbzUdn9c8kYGIqOubPoUdqQCul3SBAsRCZ40s6Y5cMcrW4dt3/k/EsbLVJNl9n6Vz3fTc+k2GeKQ==";
5855 };
5856 };
5857 "timsort-0.3.0" = {
5858 name = "timsort";
5859 packageName = "timsort";
5860 version = "0.3.0";
5861 src = fetchurl {
5862 url = "https://registry.npmjs.org/timsort/-/timsort-0.3.0.tgz";
5863 sha1 = "405411a8e7e6339fe64db9a234de11dc31e02bd4";
5864 };
5865 };
5866 "tiny-inflate-1.0.3" = {
5867 name = "tiny-inflate";
5868 packageName = "tiny-inflate";
5869 version = "1.0.3";
5870 src = fetchurl {
5871 url = "https://registry.npmjs.org/tiny-inflate/-/tiny-inflate-1.0.3.tgz";
5872 sha512 = "pkY1fj1cKHb2seWDy0B16HeWyczlJA9/WW3u3c4z/NiWDsO3DOU5D7nhTLE9CF0yXv/QZFY7sEJmj24dK+Rrqw==";
5873 };
5874 };
5875 "to-arraybuffer-1.0.1" = {
5876 name = "to-arraybuffer";
5877 packageName = "to-arraybuffer";
5878 version = "1.0.1";
5879 src = fetchurl {
5880 url = "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
5881 sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
5882 };
5883 };
5884 "to-fast-properties-1.0.3" = {
5885 name = "to-fast-properties";
5886 packageName = "to-fast-properties";
5887 version = "1.0.3";
5888 src = fetchurl {
5889 url = "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
5890 sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
5891 };
5892 };
5893 "to-fast-properties-2.0.0" = {
5894 name = "to-fast-properties";
5895 packageName = "to-fast-properties";
5896 version = "2.0.0";
5897 src = fetchurl {
5898 url = "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz";
5899 sha1 = "dc5e698cbd079265bc73e0377681a4e4e83f616e";
5900 };
5901 };
5902 "to-object-path-0.3.0" = {
5903 name = "to-object-path";
5904 packageName = "to-object-path";
5905 version = "0.3.0";
5906 src = fetchurl {
5907 url = "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz";
5908 sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
5909 };
5910 };
5911 "to-regex-3.0.2" = {
5912 name = "to-regex";
5913 packageName = "to-regex";
5914 version = "3.0.2";
5915 src = fetchurl {
5916 url = "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz";
5917 sha512 = "FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==";
5918 };
5919 };
5920 "to-regex-range-2.1.1" = {
5921 name = "to-regex-range";
5922 packageName = "to-regex-range";
5923 version = "2.1.1";
5924 src = fetchurl {
5925 url = "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz";
5926 sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
5927 };
5928 };
5929 "toidentifier-1.0.0" = {
5930 name = "toidentifier";
5931 packageName = "toidentifier";
5932 version = "1.0.0";
5933 src = fetchurl {
5934 url = "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz";
5935 sha512 = "yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==";
5936 };
5937 };
5938 "tough-cookie-2.5.0" = {
5939 name = "tough-cookie";
5940 packageName = "tough-cookie";
5941 version = "2.5.0";
5942 src = fetchurl {
5943 url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";
5944 sha512 = "nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==";
5945 };
5946 };
5947 "tr46-1.0.1" = {
5948 name = "tr46";
5949 packageName = "tr46";
5950 version = "1.0.1";
5951 src = fetchurl {
5952 url = "https://registry.npmjs.org/tr46/-/tr46-1.0.1.tgz";
5953 sha1 = "a8b13fd6bfd2489519674ccde55ba3693b706d09";
5954 };
5955 };
5956 "trim-right-1.0.1" = {
5957 name = "trim-right";
5958 packageName = "trim-right";
5959 version = "1.0.1";
5960 src = fetchurl {
5961 url = "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz";
5962 sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
5963 };
5964 };
5965 "tty-browserify-0.0.0" = {
5966 name = "tty-browserify";
5967 packageName = "tty-browserify";
5968 version = "0.0.0";
5969 src = fetchurl {
5970 url = "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz";
5971 sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
5972 };
5973 };
5974 "tunnel-agent-0.6.0" = {
5975 name = "tunnel-agent";
5976 packageName = "tunnel-agent";
5977 version = "0.6.0";
5978 src = fetchurl {
5979 url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
5980 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
5981 };
5982 };
5983 "tweetnacl-0.14.5" = {
5984 name = "tweetnacl";
5985 packageName = "tweetnacl";
5986 version = "0.14.5";
5987 src = fetchurl {
5988 url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
5989 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
5990 };
5991 };
5992 "type-check-0.3.2" = {
5993 name = "type-check";
5994 packageName = "type-check";
5995 version = "0.3.2";
5996 src = fetchurl {
5997 url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
5998 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
5999 };
6000 };
6001 "typedarray-0.0.6" = {
6002 name = "typedarray";
6003 packageName = "typedarray";
6004 version = "0.0.6";
6005 src = fetchurl {
6006 url = "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz";
6007 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
6008 };
6009 };
6010 "uncss-0.17.3" = {
6011 name = "uncss";
6012 packageName = "uncss";
6013 version = "0.17.3";
6014 src = fetchurl {
6015 url = "https://registry.npmjs.org/uncss/-/uncss-0.17.3.tgz";
6016 sha512 = "ksdDWl81YWvF/X14fOSw4iu8tESDHFIeyKIeDrK6GEVTQvqJc1WlOEXqostNwOCi3qAj++4EaLsdAgPmUbEyog==";
6017 };
6018 };
6019 "unicode-canonical-property-names-ecmascript-1.0.4" = {
6020 name = "unicode-canonical-property-names-ecmascript";
6021 packageName = "unicode-canonical-property-names-ecmascript";
6022 version = "1.0.4";
6023 src = fetchurl {
6024 url = "https://registry.npmjs.org/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz";
6025 sha512 = "jDrNnXWHd4oHiTZnx/ZG7gtUTVp+gCcTTKr8L0HjlwphROEW3+Him+IpvC+xcJEFegapiMZyZe02CyuOnRmbnQ==";
6026 };
6027 };
6028 "unicode-match-property-ecmascript-1.0.4" = {
6029 name = "unicode-match-property-ecmascript";
6030 packageName = "unicode-match-property-ecmascript";
6031 version = "1.0.4";
6032 src = fetchurl {
6033 url = "https://registry.npmjs.org/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz";
6034 sha512 = "L4Qoh15vTfntsn4P1zqnHulG0LdXgjSO035fEpdtp6YxXhMT51Q6vgM5lYdG/5X3MjS+k/Y9Xw4SFCY9IkR0rg==";
6035 };
6036 };
6037 "unicode-match-property-value-ecmascript-1.2.0" = {
6038 name = "unicode-match-property-value-ecmascript";
6039 packageName = "unicode-match-property-value-ecmascript";
6040 version = "1.2.0";
6041 src = fetchurl {
6042 url = "https://registry.npmjs.org/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz";
6043 sha512 = "wjuQHGQVofmSJv1uVISKLE5zO2rNGzM/KCYZch/QQvez7C1hUhBIuZ701fYXExuufJFMPhv2SyL8CyoIfMLbIQ==";
6044 };
6045 };
6046 "unicode-property-aliases-ecmascript-1.1.0" = {
6047 name = "unicode-property-aliases-ecmascript";
6048 packageName = "unicode-property-aliases-ecmascript";
6049 version = "1.1.0";
6050 src = fetchurl {
6051 url = "https://registry.npmjs.org/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz";
6052 sha512 = "PqSoPh/pWetQ2phoj5RLiaqIk4kCNwoV3CI+LfGmWLKI3rE3kl1h59XpX2BjgDrmbxD9ARtQobPGU1SguCYuQg==";
6053 };
6054 };
6055 "unicode-trie-0.3.1" = {
6056 name = "unicode-trie";
6057 packageName = "unicode-trie";
6058 version = "0.3.1";
6059 src = fetchurl {
6060 url = "https://registry.npmjs.org/unicode-trie/-/unicode-trie-0.3.1.tgz";
6061 sha1 = "d671dddd89101a08bac37b6a5161010602052085";
6062 };
6063 };
6064 "union-value-1.0.1" = {
6065 name = "union-value";
6066 packageName = "union-value";
6067 version = "1.0.1";
6068 src = fetchurl {
6069 url = "https://registry.npmjs.org/union-value/-/union-value-1.0.1.tgz";
6070 sha512 = "tJfXmxMeWYnczCVs7XAEvIV7ieppALdyepWMkHkwciRpZraG/xwT+s2JN8+pr1+8jCRf80FFzvr+MpQeeoF4Xg==";
6071 };
6072 };
6073 "uniq-1.0.1" = {
6074 name = "uniq";
6075 packageName = "uniq";
6076 version = "1.0.1";
6077 src = fetchurl {
6078 url = "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz";
6079 sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
6080 };
6081 };
6082 "uniqs-2.0.0" = {
6083 name = "uniqs";
6084 packageName = "uniqs";
6085 version = "2.0.0";
6086 src = fetchurl {
6087 url = "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz";
6088 sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
6089 };
6090 };
6091 "unquote-1.1.1" = {
6092 name = "unquote";
6093 packageName = "unquote";
6094 version = "1.1.1";
6095 src = fetchurl {
6096 url = "https://registry.npmjs.org/unquote/-/unquote-1.1.1.tgz";
6097 sha1 = "8fded7324ec6e88a0ff8b905e7c098cdc086d544";
6098 };
6099 };
6100 "unset-value-1.0.0" = {
6101 name = "unset-value";
6102 packageName = "unset-value";
6103 version = "1.0.0";
6104 src = fetchurl {
6105 url = "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz";
6106 sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
6107 };
6108 };
6109 "upath-1.2.0" = {
6110 name = "upath";
6111 packageName = "upath";
6112 version = "1.2.0";
6113 src = fetchurl {
6114 url = "https://registry.npmjs.org/upath/-/upath-1.2.0.tgz";
6115 sha512 = "aZwGpamFO61g3OlfT7OQCHqhGnW43ieH9WZeP7QxN/G/jS4jfqUkZxoryvJgVPEcrl5NL/ggHsSmLMHuH64Lhg==";
6116 };
6117 };
6118 "uri-js-4.2.2" = {
6119 name = "uri-js";
6120 packageName = "uri-js";
6121 version = "4.2.2";
6122 src = fetchurl {
6123 url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
6124 sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
6125 };
6126 };
6127 "urix-0.1.0" = {
6128 name = "urix";
6129 packageName = "urix";
6130 version = "0.1.0";
6131 src = fetchurl {
6132 url = "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz";
6133 sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
6134 };
6135 };
6136 "url-0.11.0" = {
6137 name = "url";
6138 packageName = "url";
6139 version = "0.11.0";
6140 src = fetchurl {
6141 url = "https://registry.npmjs.org/url/-/url-0.11.0.tgz";
6142 sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
6143 };
6144 };
6145 "use-3.1.1" = {
6146 name = "use";
6147 packageName = "use";
6148 version = "3.1.1";
6149 src = fetchurl {
6150 url = "https://registry.npmjs.org/use/-/use-3.1.1.tgz";
6151 sha512 = "cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==";
6152 };
6153 };
6154 "util-0.10.3" = {
6155 name = "util";
6156 packageName = "util";
6157 version = "0.10.3";
6158 src = fetchurl {
6159 url = "https://registry.npmjs.org/util/-/util-0.10.3.tgz";
6160 sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
6161 };
6162 };
6163 "util-0.11.1" = {
6164 name = "util";
6165 packageName = "util";
6166 version = "0.11.1";
6167 src = fetchurl {
6168 url = "https://registry.npmjs.org/util/-/util-0.11.1.tgz";
6169 sha512 = "HShAsny+zS2TZfaXxD9tYj4HQGlBezXZMZuM/S5PKLLoZkShZiGk9o5CzukI1LVHZvjdvZ2Sj1aW/Ndn2NB/HQ==";
6170 };
6171 };
6172 "util-deprecate-1.0.2" = {
6173 name = "util-deprecate";
6174 packageName = "util-deprecate";
6175 version = "1.0.2";
6176 src = fetchurl {
6177 url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
6178 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
6179 };
6180 };
6181 "util.promisify-1.0.1" = {
6182 name = "util.promisify";
6183 packageName = "util.promisify";
6184 version = "1.0.1";
6185 src = fetchurl {
6186 url = "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.1.tgz";
6187 sha512 = "g9JpC/3He3bm38zsLupWryXHoEcS22YHthuPQSJdMy6KNrzIRzWqcsHzD/WUnqe45whVou4VIsPew37DoXWNrA==";
6188 };
6189 };
6190 "uuid-3.4.0" = {
6191 name = "uuid";
6192 packageName = "uuid";
6193 version = "3.4.0";
6194 src = fetchurl {
6195 url = "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz";
6196 sha512 = "HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==";
6197 };
6198 };
6199 "v8-compile-cache-2.1.0" = {
6200 name = "v8-compile-cache";
6201 packageName = "v8-compile-cache";
6202 version = "2.1.0";
6203 src = fetchurl {
6204 url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.1.0.tgz";
6205 sha512 = "usZBT3PW+LOjM25wbqIlZwPeJV+3OSz3M1k1Ws8snlW39dZyYL9lOGC5FgPVHfk0jKmjiDV8Z0mIbVQPiwFs7g==";
6206 };
6207 };
6208 "vendors-1.0.4" = {
6209 name = "vendors";
6210 packageName = "vendors";
6211 version = "1.0.4";
6212 src = fetchurl {
6213 url = "https://registry.npmjs.org/vendors/-/vendors-1.0.4.tgz";
6214 sha512 = "/juG65kTL4Cy2su4P8HjtkTxk6VmJDiOPBufWniqQ6wknac6jNiXS9vU+hO3wgusiyqWlzTbVHi0dyJqRONg3w==";
6215 };
6216 };
6217 "verror-1.10.0" = {
6218 name = "verror";
6219 packageName = "verror";
6220 version = "1.10.0";
6221 src = fetchurl {
6222 url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
6223 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
6224 };
6225 };
6226 "vlq-0.2.3" = {
6227 name = "vlq";
6228 packageName = "vlq";
6229 version = "0.2.3";
6230 src = fetchurl {
6231 url = "https://registry.npmjs.org/vlq/-/vlq-0.2.3.tgz";
6232 sha512 = "DRibZL6DsNhIgYQ+wNdWDL2SL3bKPlVrRiBqV5yuMm++op8W4kGFtaQfCs4KEJn0wBZcHVHJ3eoywX8983k1ow==";
6233 };
6234 };
6235 "vm-browserify-1.1.2" = {
6236 name = "vm-browserify";
6237 packageName = "vm-browserify";
6238 version = "1.1.2";
6239 src = fetchurl {
6240 url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-1.1.2.tgz";
6241 sha512 = "2ham8XPWTONajOR0ohOKOHXkm3+gaBmGut3SRuu75xLd/RRaY6vqgh8NBYYk7+RW3u5AtzPQZG8F10LHkl0lAQ==";
6242 };
6243 };
6244 "w3c-hr-time-1.0.2" = {
6245 name = "w3c-hr-time";
6246 packageName = "w3c-hr-time";
6247 version = "1.0.2";
6248 src = fetchurl {
6249 url = "https://registry.npmjs.org/w3c-hr-time/-/w3c-hr-time-1.0.2.tgz";
6250 sha512 = "z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==";
6251 };
6252 };
6253 "w3c-xmlserializer-1.1.2" = {
6254 name = "w3c-xmlserializer";
6255 packageName = "w3c-xmlserializer";
6256 version = "1.1.2";
6257 src = fetchurl {
6258 url = "https://registry.npmjs.org/w3c-xmlserializer/-/w3c-xmlserializer-1.1.2.tgz";
6259 sha512 = "p10l/ayESzrBMYWRID6xbuCKh2Fp77+sA0doRuGn4tTIMrrZVeqfpKjXHY+oDh3K4nLdPgNwMTVP6Vp4pvqbNg==";
6260 };
6261 };
6262 "wcwidth-1.0.1" = {
6263 name = "wcwidth";
6264 packageName = "wcwidth";
6265 version = "1.0.1";
6266 src = fetchurl {
6267 url = "https://registry.npmjs.org/wcwidth/-/wcwidth-1.0.1.tgz";
6268 sha1 = "f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8";
6269 };
6270 };
6271 "webidl-conversions-4.0.2" = {
6272 name = "webidl-conversions";
6273 packageName = "webidl-conversions";
6274 version = "4.0.2";
6275 src = fetchurl {
6276 url = "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-4.0.2.tgz";
6277 sha512 = "YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==";
6278 };
6279 };
6280 "whatwg-encoding-1.0.5" = {
6281 name = "whatwg-encoding";
6282 packageName = "whatwg-encoding";
6283 version = "1.0.5";
6284 src = fetchurl {
6285 url = "https://registry.npmjs.org/whatwg-encoding/-/whatwg-encoding-1.0.5.tgz";
6286 sha512 = "b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==";
6287 };
6288 };
6289 "whatwg-mimetype-2.3.0" = {
6290 name = "whatwg-mimetype";
6291 packageName = "whatwg-mimetype";
6292 version = "2.3.0";
6293 src = fetchurl {
6294 url = "https://registry.npmjs.org/whatwg-mimetype/-/whatwg-mimetype-2.3.0.tgz";
6295 sha512 = "M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==";
6296 };
6297 };
6298 "whatwg-url-7.1.0" = {
6299 name = "whatwg-url";
6300 packageName = "whatwg-url";
6301 version = "7.1.0";
6302 src = fetchurl {
6303 url = "https://registry.npmjs.org/whatwg-url/-/whatwg-url-7.1.0.tgz";
6304 sha512 = "WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==";
6305 };
6306 };
6307 "which-1.3.1" = {
6308 name = "which";
6309 packageName = "which";
6310 version = "1.3.1";
6311 src = fetchurl {
6312 url = "https://registry.npmjs.org/which/-/which-1.3.1.tgz";
6313 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
6314 };
6315 };
6316 "which-module-2.0.0" = {
6317 name = "which-module";
6318 packageName = "which-module";
6319 version = "2.0.0";
6320 src = fetchurl {
6321 url = "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz";
6322 sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
6323 };
6324 };
6325 "word-wrap-1.2.3" = {
6326 name = "word-wrap";
6327 packageName = "word-wrap";
6328 version = "1.2.3";
6329 src = fetchurl {
6330 url = "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz";
6331 sha512 = "Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==";
6332 };
6333 };
6334 "wrap-ansi-5.1.0" = {
6335 name = "wrap-ansi";
6336 packageName = "wrap-ansi";
6337 version = "5.1.0";
6338 src = fetchurl {
6339 url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-5.1.0.tgz";
6340 sha512 = "QC1/iN/2/RPVJ5jYK8BGttj5z83LmSKmvbvrXPNCLZSEb32KKVDJDl/MOt2N01qU2H/FkzEa9PKto1BqDjtd7Q==";
6341 };
6342 };
6343 "wrappy-1.0.2" = {
6344 name = "wrappy";
6345 packageName = "wrappy";
6346 version = "1.0.2";
6347 src = fetchurl {
6348 url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
6349 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
6350 };
6351 };
6352 "ws-5.2.2" = {
6353 name = "ws";
6354 packageName = "ws";
6355 version = "5.2.2";
6356 src = fetchurl {
6357 url = "https://registry.npmjs.org/ws/-/ws-5.2.2.tgz";
6358 sha512 = "jaHFD6PFv6UgoIVda6qZllptQsMlDEJkTQcybzzXDYM1XO9Y8em691FGMPmM46WGyLU4z9KMgQN+qrux/nhlHA==";
6359 };
6360 };
6361 "ws-6.2.1" = {
6362 name = "ws";
6363 packageName = "ws";
6364 version = "6.2.1";
6365 src = fetchurl {
6366 url = "https://registry.npmjs.org/ws/-/ws-6.2.1.tgz";
6367 sha512 = "GIyAXC2cB7LjvpgMt9EKS2ldqr0MTrORaleiOno6TweZ6r3TKtoFQWay/2PceJ3RuBasOHzXNn5Lrw1X0bEjqA==";
6368 };
6369 };
6370 "xml-name-validator-3.0.0" = {
6371 name = "xml-name-validator";
6372 packageName = "xml-name-validator";
6373 version = "3.0.0";
6374 src = fetchurl {
6375 url = "https://registry.npmjs.org/xml-name-validator/-/xml-name-validator-3.0.0.tgz";
6376 sha512 = "A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==";
6377 };
6378 };
6379 "xmlchars-2.2.0" = {
6380 name = "xmlchars";
6381 packageName = "xmlchars";
6382 version = "2.2.0";
6383 src = fetchurl {
6384 url = "https://registry.npmjs.org/xmlchars/-/xmlchars-2.2.0.tgz";
6385 sha512 = "JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==";
6386 };
6387 };
6388 "xtend-4.0.2" = {
6389 name = "xtend";
6390 packageName = "xtend";
6391 version = "4.0.2";
6392 src = fetchurl {
6393 url = "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz";
6394 sha512 = "LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==";
6395 };
6396 };
6397 "y18n-4.0.0" = {
6398 name = "y18n";
6399 packageName = "y18n";
6400 version = "4.0.0";
6401 src = fetchurl {
6402 url = "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz";
6403 sha512 = "r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==";
6404 };
6405 };
6406 "yallist-2.1.2" = {
6407 name = "yallist";
6408 packageName = "yallist";
6409 version = "2.1.2";
6410 src = fetchurl {
6411 url = "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz";
6412 sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
6413 };
6414 };
6415 "yargs-14.2.3" = {
6416 name = "yargs";
6417 packageName = "yargs";
6418 version = "14.2.3";
6419 src = fetchurl {
6420 url = "https://registry.npmjs.org/yargs/-/yargs-14.2.3.tgz";
6421 sha512 = "ZbotRWhF+lkjijC/VhmOT9wSgyBQ7+zr13+YLkhfsSiTriYsMzkTUFP18pFhWwBeMa5gUc1MzbhrO6/VB7c9Xg==";
6422 };
6423 };
6424 "yargs-parser-15.0.1" = {
6425 name = "yargs-parser";
6426 packageName = "yargs-parser";
6427 version = "15.0.1";
6428 src = fetchurl {
6429 url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-15.0.1.tgz";
6430 sha512 = "0OAMV2mAZQrs3FkNpDQcBk1x5HXb8X4twADss4S0Iuk+2dGnLOE/fRHrsYm542GduMveyA77OF4wrNJuanRCWw==";
6431 };
6432 };
6433 };
6434 args = {
6435 name = "codenamesgreen";
6436 packageName = "codenamesgreen";
6437 version = "1.0.0";
6438 src = let
6439 upstream = fetchFromGitHub {
6440 owner = "jbowens";
6441 repo = "codenamesgreen";
6442 rev = "6d014d0df14bee72495e01f12885ef31cba3bd6b";
6443 sha256 = "0bkaf52rnjw792q0755in4k5jbcrmgq06cl03fdl6zdr8kq2mhm0";
6444 };
6445 in
6446 runCommand "codenamesgreen-src" {} ''
6447 cp -a ${upstream} $out
6448 chmod -R u+w $out
6449 cd $out
6450 patch -p1 < ${./codenames.patch}
6451 patch -p1 < ${./immae-assets.patch}
6452 '';
6453 dependencies = [
6454 sources."@babel/code-frame-7.0.0"
6455 (sources."@babel/core-7.3.4" // {
6456 dependencies = [
6457 sources."json5-2.1.3"
6458 sources."source-map-0.5.7"
6459 ];
6460 })
6461 (sources."@babel/generator-7.3.4" // {
6462 dependencies = [
6463 sources."source-map-0.5.7"
6464 ];
6465 })
6466 (sources."@babel/helper-annotate-as-pure-7.8.3" // {
6467 dependencies = [
6468 sources."@babel/types-7.9.5"
6469 ];
6470 })
6471 (sources."@babel/helper-builder-binary-assignment-operator-visitor-7.8.3" // {
6472 dependencies = [
6473 sources."@babel/types-7.9.5"
6474 ];
6475 })
6476 (sources."@babel/helper-builder-react-jsx-7.9.0" // {
6477 dependencies = [
6478 sources."@babel/types-7.9.5"
6479 ];
6480 })
6481 sources."@babel/helper-create-regexp-features-plugin-7.8.8"
6482 (sources."@babel/helper-define-map-7.8.3" // {
6483 dependencies = [
6484 sources."@babel/types-7.9.5"
6485 ];
6486 })
6487 (sources."@babel/helper-explode-assignable-expression-7.8.3" // {
6488 dependencies = [
6489 sources."@babel/code-frame-7.8.3"
6490 sources."@babel/generator-7.9.5"
6491 sources."@babel/parser-7.9.4"
6492 sources."@babel/traverse-7.9.5"
6493 sources."@babel/types-7.9.5"
6494 sources."source-map-0.5.7"
6495 ];
6496 })
6497 (sources."@babel/helper-function-name-7.9.5" // {
6498 dependencies = [
6499 sources."@babel/code-frame-7.8.3"
6500 sources."@babel/parser-7.9.4"
6501 sources."@babel/template-7.8.6"
6502 sources."@babel/types-7.9.5"
6503 ];
6504 })
6505 (sources."@babel/helper-get-function-arity-7.8.3" // {
6506 dependencies = [
6507 sources."@babel/types-7.9.5"
6508 ];
6509 })
6510 (sources."@babel/helper-hoist-variables-7.8.3" // {
6511 dependencies = [
6512 sources."@babel/types-7.9.5"
6513 ];
6514 })
6515 (sources."@babel/helper-member-expression-to-functions-7.8.3" // {
6516 dependencies = [
6517 sources."@babel/types-7.9.5"
6518 ];
6519 })
6520 (sources."@babel/helper-module-imports-7.8.3" // {
6521 dependencies = [
6522 sources."@babel/types-7.9.5"
6523 ];
6524 })
6525 (sources."@babel/helper-module-transforms-7.9.0" // {
6526 dependencies = [
6527 sources."@babel/code-frame-7.8.3"
6528 sources."@babel/parser-7.9.4"
6529 sources."@babel/template-7.8.6"
6530 sources."@babel/types-7.9.5"
6531 ];
6532 })
6533 (sources."@babel/helper-optimise-call-expression-7.8.3" // {
6534 dependencies = [
6535 sources."@babel/types-7.9.5"
6536 ];
6537 })
6538 sources."@babel/helper-plugin-utils-7.8.3"
6539 sources."@babel/helper-regex-7.8.3"
6540 (sources."@babel/helper-remap-async-to-generator-7.8.3" // {
6541 dependencies = [
6542 sources."@babel/code-frame-7.8.3"
6543 sources."@babel/generator-7.9.5"
6544 sources."@babel/parser-7.9.4"
6545 sources."@babel/template-7.8.6"
6546 sources."@babel/traverse-7.9.5"
6547 sources."@babel/types-7.9.5"
6548 sources."source-map-0.5.7"
6549 ];
6550 })
6551 (sources."@babel/helper-replace-supers-7.8.6" // {
6552 dependencies = [
6553 sources."@babel/code-frame-7.8.3"
6554 sources."@babel/generator-7.9.5"
6555 sources."@babel/parser-7.9.4"
6556 sources."@babel/traverse-7.9.5"
6557 sources."@babel/types-7.9.5"
6558 sources."source-map-0.5.7"
6559 ];
6560 })
6561 (sources."@babel/helper-simple-access-7.8.3" // {
6562 dependencies = [
6563 sources."@babel/code-frame-7.8.3"
6564 sources."@babel/parser-7.9.4"
6565 sources."@babel/template-7.8.6"
6566 sources."@babel/types-7.9.5"
6567 ];
6568 })
6569 (sources."@babel/helper-split-export-declaration-7.8.3" // {
6570 dependencies = [
6571 sources."@babel/types-7.9.5"
6572 ];
6573 })
6574 sources."@babel/helper-validator-identifier-7.9.5"
6575 (sources."@babel/helper-wrap-function-7.8.3" // {
6576 dependencies = [
6577 sources."@babel/code-frame-7.8.3"
6578 sources."@babel/generator-7.9.5"
6579 sources."@babel/parser-7.9.4"
6580 sources."@babel/template-7.8.6"
6581 sources."@babel/traverse-7.9.5"
6582 sources."@babel/types-7.9.5"
6583 sources."source-map-0.5.7"
6584 ];
6585 })
6586 (sources."@babel/helpers-7.9.2" // {
6587 dependencies = [
6588 sources."@babel/code-frame-7.8.3"
6589 sources."@babel/generator-7.9.5"
6590 sources."@babel/parser-7.9.4"
6591 sources."@babel/template-7.8.6"
6592 sources."@babel/traverse-7.9.5"
6593 sources."@babel/types-7.9.5"
6594 sources."source-map-0.5.7"
6595 ];
6596 })
6597 sources."@babel/highlight-7.9.0"
6598 sources."@babel/parser-7.3.4"
6599 sources."@babel/plugin-proposal-async-generator-functions-7.8.3"
6600 sources."@babel/plugin-proposal-json-strings-7.8.3"
6601 sources."@babel/plugin-proposal-object-rest-spread-7.9.5"
6602 sources."@babel/plugin-proposal-optional-catch-binding-7.8.3"
6603 sources."@babel/plugin-proposal-unicode-property-regex-7.8.8"
6604 sources."@babel/plugin-syntax-async-generators-7.8.4"
6605 sources."@babel/plugin-syntax-flow-7.8.3"
6606 sources."@babel/plugin-syntax-json-strings-7.8.3"
6607 sources."@babel/plugin-syntax-jsx-7.8.3"
6608 sources."@babel/plugin-syntax-object-rest-spread-7.8.3"
6609 sources."@babel/plugin-syntax-optional-catch-binding-7.8.3"
6610 sources."@babel/plugin-transform-arrow-functions-7.8.3"
6611 sources."@babel/plugin-transform-async-to-generator-7.8.3"
6612 sources."@babel/plugin-transform-block-scoped-functions-7.8.3"
6613 sources."@babel/plugin-transform-block-scoping-7.8.3"
6614 sources."@babel/plugin-transform-classes-7.9.5"
6615 sources."@babel/plugin-transform-computed-properties-7.8.3"
6616 sources."@babel/plugin-transform-destructuring-7.9.5"
6617 sources."@babel/plugin-transform-dotall-regex-7.8.3"
6618 sources."@babel/plugin-transform-duplicate-keys-7.8.3"
6619 sources."@babel/plugin-transform-exponentiation-operator-7.8.3"
6620 sources."@babel/plugin-transform-flow-strip-types-7.3.4"
6621 sources."@babel/plugin-transform-for-of-7.9.0"
6622 sources."@babel/plugin-transform-function-name-7.8.3"
6623 sources."@babel/plugin-transform-literals-7.8.3"
6624 sources."@babel/plugin-transform-modules-amd-7.9.0"
6625 sources."@babel/plugin-transform-modules-commonjs-7.2.0"
6626 sources."@babel/plugin-transform-modules-systemjs-7.9.0"
6627 sources."@babel/plugin-transform-modules-umd-7.9.0"
6628 sources."@babel/plugin-transform-named-capturing-groups-regex-7.8.3"
6629 sources."@babel/plugin-transform-new-target-7.8.3"
6630 sources."@babel/plugin-transform-object-super-7.8.3"
6631 sources."@babel/plugin-transform-parameters-7.9.5"
6632 sources."@babel/plugin-transform-react-jsx-7.3.0"
6633 sources."@babel/plugin-transform-regenerator-7.8.7"
6634 sources."@babel/plugin-transform-shorthand-properties-7.8.3"
6635 sources."@babel/plugin-transform-spread-7.8.3"
6636 sources."@babel/plugin-transform-sticky-regex-7.8.3"
6637 sources."@babel/plugin-transform-template-literals-7.8.3"
6638 sources."@babel/plugin-transform-typeof-symbol-7.8.4"
6639 sources."@babel/plugin-transform-unicode-regex-7.8.3"
6640 sources."@babel/preset-env-7.3.4"
6641 (sources."@babel/runtime-7.3.4" // {
6642 dependencies = [
6643 sources."regenerator-runtime-0.12.1"
6644 ];
6645 })
6646 sources."@babel/template-7.2.2"
6647 sources."@babel/traverse-7.3.4"
6648 sources."@babel/types-7.3.4"
6649 sources."@iarna/toml-2.2.5"
6650 sources."@mrmlnc/readdir-enhanced-2.2.1"
6651 sources."@nodelib/fs.stat-1.1.3"
6652 sources."@parcel/fs-1.11.0"
6653 sources."@parcel/logger-1.11.1"
6654 sources."@parcel/utils-1.11.0"
6655 sources."@parcel/watcher-1.12.1"
6656 sources."@parcel/workers-1.11.0"
6657 sources."@types/q-1.5.2"
6658 sources."abab-2.0.3"
6659 sources."abbrev-1.1.1"
6660 sources."acorn-7.1.1"
6661 (sources."acorn-globals-4.3.4" // {
6662 dependencies = [
6663 sources."acorn-6.4.1"
6664 ];
6665 })
6666 sources."acorn-walk-6.2.0"
6667 sources."ajv-6.12.2"
6668 sources."alphanum-sort-1.0.2"
6669 sources."ansi-regex-3.0.0"
6670 sources."ansi-styles-3.2.1"
6671 (sources."ansi-to-html-0.6.14" // {
6672 dependencies = [
6673 sources."entities-1.1.2"
6674 ];
6675 })
6676 (sources."anymatch-2.0.0" // {
6677 dependencies = [
6678 sources."normalize-path-2.1.1"
6679 ];
6680 })
6681 sources."argparse-1.0.10"
6682 sources."arr-diff-4.0.0"
6683 sources."arr-flatten-1.1.0"
6684 sources."arr-union-3.1.0"
6685 sources."array-equal-1.0.0"
6686 sources."array-unique-0.3.2"
6687 sources."asn1-0.2.4"
6688 sources."asn1.js-4.10.1"
6689 (sources."assert-1.5.0" // {
6690 dependencies = [
6691 sources."inherits-2.0.1"
6692 sources."util-0.10.3"
6693 ];
6694 })
6695 sources."assert-plus-1.0.0"
6696 sources."assign-symbols-1.0.0"
6697 sources."async-each-1.0.3"
6698 sources."async-limiter-1.0.1"
6699 sources."asynckit-0.4.0"
6700 sources."atob-2.1.2"
6701 sources."aws-sign2-0.7.0"
6702 sources."aws4-1.9.1"
6703 sources."babel-plugin-dynamic-import-node-2.3.3"
6704 (sources."babel-runtime-6.26.0" // {
6705 dependencies = [
6706 sources."regenerator-runtime-0.11.1"
6707 ];
6708 })
6709 (sources."babel-types-6.26.0" // {
6710 dependencies = [
6711 sources."to-fast-properties-1.0.3"
6712 ];
6713 })
6714 sources."babylon-walk-1.0.2"
6715 sources."balanced-match-1.0.0"
6716 (sources."base-0.11.2" // {
6717 dependencies = [
6718 sources."define-property-1.0.0"
6719 sources."is-accessor-descriptor-1.0.0"
6720 sources."is-data-descriptor-1.0.0"
6721 sources."is-descriptor-1.0.2"
6722 ];
6723 })
6724 sources."base64-js-1.3.1"
6725 sources."bcrypt-pbkdf-1.0.2"
6726 sources."binary-extensions-1.13.1"
6727 sources."bindings-1.5.0"
6728 sources."bn.js-4.11.8"
6729 sources."boolbase-1.0.0"
6730 sources."brace-expansion-1.1.11"
6731 (sources."braces-2.3.2" // {
6732 dependencies = [
6733 sources."extend-shallow-2.0.1"
6734 ];
6735 })
6736 sources."brfs-1.6.1"
6737 sources."brorand-1.1.0"
6738 sources."browser-process-hrtime-1.0.0"
6739 sources."browserify-aes-1.2.0"
6740 sources."browserify-cipher-1.0.1"
6741 sources."browserify-des-1.0.2"
6742 sources."browserify-rsa-4.0.1"
6743 sources."browserify-sign-4.0.4"
6744 (sources."browserify-zlib-0.2.0" // {
6745 dependencies = [
6746 sources."pako-1.0.11"
6747 ];
6748 })
6749 sources."browserslist-4.12.0"
6750 sources."buffer-4.9.2"
6751 sources."buffer-equal-0.0.1"
6752 sources."buffer-from-1.1.1"
6753 sources."buffer-xor-1.0.3"
6754 sources."builtin-status-codes-3.0.0"
6755 sources."cache-base-1.0.1"
6756 sources."call-me-maybe-1.0.1"
6757 sources."caller-callsite-2.0.0"
6758 sources."caller-path-2.0.0"
6759 sources."callsites-2.0.0"
6760 sources."camelcase-5.3.1"
6761 sources."caniuse-api-3.0.0"
6762 sources."caniuse-lite-1.0.30001048"
6763 sources."caseless-0.12.0"
6764 (sources."chalk-2.4.2" // {
6765 dependencies = [
6766 sources."supports-color-5.5.0"
6767 ];
6768 })
6769 (sources."chokidar-2.1.8" // {
6770 dependencies = [
6771 sources."fsevents-1.2.12"
6772 ];
6773 })
6774 sources."cipher-base-1.0.4"
6775 (sources."class-utils-0.3.6" // {
6776 dependencies = [
6777 sources."define-property-0.2.5"
6778 ];
6779 })
6780 sources."cli-cursor-2.1.0"
6781 sources."cli-spinners-1.3.1"
6782 (sources."cliui-5.0.0" // {
6783 dependencies = [
6784 sources."ansi-regex-4.1.0"
6785 sources."strip-ansi-5.2.0"
6786 ];
6787 })
6788 sources."clone-2.1.2"
6789 sources."clones-1.2.0"
6790 sources."coa-2.0.2"
6791 sources."collection-visit-1.0.0"
6792 sources."color-3.1.2"
6793 sources."color-convert-1.9.3"
6794 sources."color-name-1.1.3"
6795 sources."color-string-1.5.3"
6796 sources."combined-stream-1.0.8"
6797 sources."command-exists-1.2.9"
6798 sources."commander-2.20.3"
6799 sources."component-emitter-1.3.0"
6800 sources."concat-map-0.0.1"
6801 sources."concat-stream-1.6.2"
6802 sources."config-chain-1.1.12"
6803 sources."console-browserify-1.2.0"
6804 sources."constants-browserify-1.0.0"
6805 sources."convert-source-map-1.7.0"
6806 sources."copy-descriptor-0.1.1"
6807 sources."core-js-2.6.11"
6808 sources."core-util-is-1.0.2"
6809 sources."cosmiconfig-5.2.1"
6810 sources."create-ecdh-4.0.3"
6811 sources."create-hash-1.2.0"
6812 sources."create-hmac-1.1.7"
6813 sources."cross-spawn-6.0.5"
6814 sources."crypto-browserify-3.12.0"
6815 sources."css-color-names-0.0.4"
6816 sources."css-declaration-sorter-4.0.1"
6817 (sources."css-modules-loader-core-1.1.0" // {
6818 dependencies = [
6819 sources."ansi-regex-2.1.1"
6820 sources."ansi-styles-2.2.1"
6821 (sources."chalk-1.1.3" // {
6822 dependencies = [
6823 sources."supports-color-2.0.0"
6824 ];
6825 })
6826 sources."has-flag-1.0.0"
6827 sources."postcss-6.0.1"
6828 sources."source-map-0.5.7"
6829 sources."strip-ansi-3.0.1"
6830 sources."supports-color-3.2.3"
6831 ];
6832 })
6833 sources."css-select-2.1.0"
6834 sources."css-select-base-adapter-0.1.1"
6835 sources."css-selector-tokenizer-0.7.2"
6836 sources."css-tree-1.0.0-alpha.37"
6837 sources."css-what-3.2.1"
6838 sources."cssesc-3.0.0"
6839 sources."cssnano-4.1.10"
6840 sources."cssnano-preset-default-4.0.7"
6841 sources."cssnano-util-get-arguments-4.0.0"
6842 sources."cssnano-util-get-match-4.0.0"
6843 sources."cssnano-util-raw-cache-4.0.1"
6844 sources."cssnano-util-same-parent-4.0.1"
6845 (sources."csso-4.0.3" // {
6846 dependencies = [
6847 sources."css-tree-1.0.0-alpha.39"
6848 sources."mdn-data-2.0.6"
6849 ];
6850 })
6851 sources."cssom-0.3.8"
6852 sources."cssstyle-1.4.0"
6853 sources."dashdash-1.14.1"
6854 sources."data-urls-1.1.0"
6855 sources."deasync-0.1.19"
6856 sources."debug-4.1.1"
6857 sources."decamelize-1.2.0"
6858 sources."decode-uri-component-0.2.0"
6859 sources."deep-is-0.1.3"
6860 (sources."defaults-1.0.3" // {
6861 dependencies = [
6862 sources."clone-1.0.4"
6863 ];
6864 })
6865 sources."define-properties-1.1.3"
6866 (sources."define-property-2.0.2" // {
6867 dependencies = [
6868 sources."is-accessor-descriptor-1.0.0"
6869 sources."is-data-descriptor-1.0.0"
6870 sources."is-descriptor-1.0.2"
6871 ];
6872 })
6873 sources."delayed-stream-1.0.0"
6874 sources."depd-1.1.2"
6875 sources."des.js-1.0.1"
6876 sources."destroy-1.0.4"
6877 sources."diffie-hellman-5.0.3"
6878 (sources."dom-serializer-0.2.2" // {
6879 dependencies = [
6880 sources."domelementtype-2.0.1"
6881 ];
6882 })
6883 sources."domain-browser-1.2.0"
6884 sources."domelementtype-1.3.1"
6885 sources."domexception-1.0.1"
6886 sources."domhandler-2.4.2"
6887 sources."domutils-1.7.0"
6888 sources."dot-prop-5.2.0"
6889 sources."dotenv-5.0.1"
6890 sources."dotenv-expand-4.2.0"
6891 sources."duplexer2-0.1.4"
6892 sources."ecc-jsbn-0.1.2"
6893 sources."editorconfig-0.15.3"
6894 sources."ee-first-1.1.1"
6895 sources."electron-to-chromium-1.3.418"
6896 sources."elliptic-6.5.2"
6897 sources."elm-hot-1.1.1"
6898 sources."emoji-regex-7.0.3"
6899 sources."encodeurl-1.0.2"
6900 sources."entities-2.0.0"
6901 sources."error-ex-1.3.2"
6902 sources."es-abstract-1.17.5"
6903 sources."es-to-primitive-1.2.1"
6904 sources."escape-html-1.0.3"
6905 sources."escape-string-regexp-1.0.5"
6906 (sources."escodegen-1.9.1" // {
6907 dependencies = [
6908 sources."esprima-3.1.3"
6909 ];
6910 })
6911 sources."esprima-4.0.1"
6912 sources."estraverse-4.3.0"
6913 sources."esutils-2.0.3"
6914 sources."etag-1.8.1"
6915 sources."events-3.1.0"
6916 sources."evp_bytestokey-1.0.3"
6917 (sources."expand-brackets-2.1.4" // {
6918 dependencies = [
6919 sources."debug-2.6.9"
6920 sources."define-property-0.2.5"
6921 sources."extend-shallow-2.0.1"
6922 sources."ms-2.0.0"
6923 ];
6924 })
6925 sources."extend-3.0.2"
6926 (sources."extend-shallow-3.0.2" // {
6927 dependencies = [
6928 sources."is-extendable-1.0.1"
6929 ];
6930 })
6931 (sources."extglob-2.0.4" // {
6932 dependencies = [
6933 sources."define-property-1.0.0"
6934 sources."extend-shallow-2.0.1"
6935 sources."is-accessor-descriptor-1.0.0"
6936 sources."is-data-descriptor-1.0.0"
6937 sources."is-descriptor-1.0.2"
6938 ];
6939 })
6940 sources."extsprintf-1.3.0"
6941 (sources."falafel-2.2.4" // {
6942 dependencies = [
6943 sources."isarray-2.0.5"
6944 ];
6945 })
6946 sources."fast-deep-equal-3.1.1"
6947 sources."fast-glob-2.2.7"
6948 sources."fast-json-stable-stringify-2.1.0"
6949 sources."fast-levenshtein-2.0.6"
6950 sources."fastparse-1.1.2"
6951 sources."file-uri-to-path-1.0.0"
6952 sources."filesize-3.6.1"
6953 (sources."fill-range-4.0.0" // {
6954 dependencies = [
6955 sources."extend-shallow-2.0.1"
6956 ];
6957 })
6958 sources."find-elm-dependencies-2.0.2"
6959 sources."find-up-2.1.0"
6960 sources."firstline-1.2.0"
6961 sources."for-in-1.0.2"
6962 sources."foreach-2.0.5"
6963 sources."forever-agent-0.6.1"
6964 sources."form-data-2.3.3"
6965 sources."fragment-cache-0.2.1"
6966 sources."fresh-0.5.2"
6967 sources."fs.realpath-1.0.0"
6968 sources."function-bind-1.1.1"
6969 sources."get-caller-file-2.0.5"
6970 sources."get-port-3.2.0"
6971 sources."get-value-2.0.6"
6972 sources."getpass-0.1.7"
6973 sources."glob-7.1.4"
6974 (sources."glob-parent-3.1.0" // {
6975 dependencies = [
6976 sources."is-glob-3.1.0"
6977 ];
6978 })
6979 sources."glob-to-regexp-0.3.0"
6980 sources."globals-11.12.0"
6981 sources."graceful-fs-4.2.3"
6982 sources."grapheme-breaker-0.3.2"
6983 sources."har-schema-2.0.0"
6984 sources."har-validator-5.1.3"
6985 sources."has-1.0.3"
6986 (sources."has-ansi-2.0.0" // {
6987 dependencies = [
6988 sources."ansi-regex-2.1.1"
6989 ];
6990 })
6991 sources."has-flag-3.0.0"
6992 sources."has-symbols-1.0.1"
6993 sources."has-value-1.0.0"
6994 (sources."has-values-1.0.0" // {
6995 dependencies = [
6996 sources."kind-of-4.0.0"
6997 ];
6998 })
6999 sources."hash-base-3.0.4"
7000 sources."hash.js-1.1.7"
7001 sources."hex-color-regex-1.1.0"
7002 sources."hmac-drbg-1.0.1"
7003 sources."hsl-regex-1.0.0"
7004 sources."hsla-regex-1.0.0"
7005 sources."html-comment-regex-1.1.2"
7006 sources."html-encoding-sniffer-1.0.2"
7007 sources."html-tags-1.2.0"
7008 (sources."htmlnano-0.2.5" // {
7009 dependencies = [
7010 sources."posthtml-0.12.3"
7011 sources."terser-4.6.12"
7012 ];
7013 })
7014 (sources."htmlparser2-3.10.1" // {
7015 dependencies = [
7016 sources."entities-1.1.2"
7017 sources."readable-stream-3.6.0"
7018 ];
7019 })
7020 sources."http-errors-1.7.3"
7021 sources."http-signature-1.2.0"
7022 sources."https-browserify-1.0.0"
7023 sources."iconv-lite-0.4.24"
7024 sources."icss-replace-symbols-1.1.0"
7025 sources."ieee754-1.1.13"
7026 sources."import-fresh-2.0.0"
7027 sources."indexes-of-1.0.1"
7028 sources."inflight-1.0.6"
7029 sources."inherits-2.0.4"
7030 sources."ini-1.3.5"
7031 sources."invariant-2.2.4"
7032 sources."is-absolute-url-2.1.0"
7033 (sources."is-accessor-descriptor-0.1.6" // {
7034 dependencies = [
7035 sources."kind-of-3.2.2"
7036 ];
7037 })
7038 sources."is-arrayish-0.2.1"
7039 sources."is-binary-path-1.0.1"
7040 sources."is-buffer-1.1.6"
7041 sources."is-callable-1.1.5"
7042 sources."is-color-stop-1.1.0"
7043 (sources."is-data-descriptor-0.1.4" // {
7044 dependencies = [
7045 sources."kind-of-3.2.2"
7046 ];
7047 })
7048 sources."is-date-object-1.0.2"
7049 (sources."is-descriptor-0.1.6" // {
7050 dependencies = [
7051 sources."kind-of-5.1.0"
7052 ];
7053 })
7054 sources."is-directory-0.3.1"
7055 sources."is-extendable-0.1.1"
7056 sources."is-extglob-2.1.1"
7057 sources."is-fullwidth-code-point-2.0.0"
7058 sources."is-glob-4.0.1"
7059 sources."is-html-1.1.0"
7060 (sources."is-number-3.0.0" // {
7061 dependencies = [
7062 sources."kind-of-3.2.2"
7063 ];
7064 })
7065 sources."is-obj-2.0.0"
7066 sources."is-plain-object-2.0.4"
7067 sources."is-regex-1.0.5"
7068 sources."is-resolvable-1.1.0"
7069 sources."is-svg-3.0.0"
7070 sources."is-symbol-1.0.3"
7071 sources."is-typedarray-1.0.0"
7072 sources."is-url-1.2.4"
7073 sources."is-windows-1.0.2"
7074 sources."is-wsl-1.1.0"
7075 sources."isarray-1.0.0"
7076 sources."isexe-2.0.0"
7077 sources."isobject-3.0.1"
7078 sources."isstream-0.1.2"
7079 (sources."js-beautify-1.11.0" // {
7080 dependencies = [
7081 sources."mkdirp-1.0.4"
7082 ];
7083 })
7084 sources."js-levenshtein-1.1.6"
7085 sources."js-tokens-4.0.0"
7086 sources."js-yaml-3.13.1"
7087 sources."jsbn-0.1.1"
7088 (sources."jsdom-14.1.0" // {
7089 dependencies = [
7090 sources."acorn-6.4.1"
7091 sources."escodegen-1.14.1"
7092 sources."ws-6.2.1"
7093 ];
7094 })
7095 sources."jsesc-2.5.2"
7096 sources."json-parse-better-errors-1.0.2"
7097 sources."json-schema-0.2.3"
7098 sources."json-schema-traverse-0.4.1"
7099 sources."json-stringify-safe-5.0.1"
7100 sources."json5-1.0.1"
7101 sources."jsprim-1.4.1"
7102 sources."kind-of-6.0.3"
7103 sources."levn-0.3.0"
7104 sources."locate-path-2.0.0"
7105 sources."lodash-4.17.15"
7106 sources."lodash.clone-4.5.0"
7107 sources."lodash.memoize-4.1.2"
7108 sources."lodash.sortby-4.7.0"
7109 sources."lodash.uniq-4.5.0"
7110 sources."log-symbols-2.2.0"
7111 sources."loose-envify-1.4.0"
7112 sources."lru-cache-4.1.5"
7113 sources."magic-string-0.22.5"
7114 sources."map-cache-0.2.2"
7115 sources."map-visit-1.0.0"
7116 sources."md5.js-1.3.5"
7117 sources."mdn-data-2.0.4"
7118 (sources."merge-source-map-1.0.4" // {
7119 dependencies = [
7120 sources."source-map-0.5.7"
7121 ];
7122 })
7123 sources."merge2-1.3.0"
7124 sources."micromatch-3.1.10"
7125 sources."miller-rabin-4.0.1"
7126 sources."mime-1.6.0"
7127 sources."mime-db-1.44.0"
7128 sources."mime-types-2.1.27"
7129 sources."mimic-fn-1.2.0"
7130 sources."minimalistic-assert-1.0.1"
7131 sources."minimalistic-crypto-utils-1.0.1"
7132 sources."minimatch-3.0.4"
7133 sources."minimist-1.2.5"
7134 (sources."mixin-deep-1.3.2" // {
7135 dependencies = [
7136 sources."is-extendable-1.0.1"
7137 ];
7138 })
7139 sources."mkdirp-0.5.5"
7140 sources."ms-2.1.2"
7141 sources."nan-2.14.1"
7142 sources."nanomatch-1.2.13"
7143 sources."nice-try-1.0.5"
7144 sources."node-addon-api-1.7.1"
7145 sources."node-elm-compiler-5.0.4"
7146 sources."node-forge-0.7.6"
7147 (sources."node-libs-browser-2.2.1" // {
7148 dependencies = [
7149 sources."punycode-1.4.1"
7150 ];
7151 })
7152 sources."node-releases-1.1.53"
7153 sources."nopt-4.0.3"
7154 sources."normalize-html-whitespace-1.0.0"
7155 sources."normalize-path-3.0.0"
7156 sources."normalize-url-3.3.0"
7157 sources."nth-check-1.0.2"
7158 sources."nwsapi-2.2.0"
7159 sources."oauth-sign-0.9.0"
7160 sources."object-assign-4.1.1"
7161 (sources."object-copy-0.1.0" // {
7162 dependencies = [
7163 sources."define-property-0.2.5"
7164 sources."kind-of-3.2.2"
7165 ];
7166 })
7167 sources."object-inspect-1.7.0"
7168 sources."object-keys-1.1.1"
7169 sources."object-visit-1.0.1"
7170 sources."object.assign-4.1.0"
7171 sources."object.getownpropertydescriptors-2.1.0"
7172 sources."object.pick-1.3.0"
7173 sources."object.values-1.1.1"
7174 sources."on-finished-2.3.0"
7175 sources."once-1.4.0"
7176 sources."onetime-2.0.1"
7177 sources."opn-5.5.0"
7178 sources."optionator-0.8.3"
7179 sources."ora-2.1.0"
7180 sources."os-browserify-0.3.0"
7181 sources."os-homedir-1.0.2"
7182 sources."os-tmpdir-1.0.2"
7183 sources."osenv-0.1.5"
7184 sources."p-limit-1.3.0"
7185 sources."p-locate-2.0.0"
7186 sources."p-try-1.0.0"
7187 sources."pako-0.2.9"
7188 (sources."parcel-bundler-1.12.3" // {
7189 dependencies = [
7190 sources."postcss-value-parser-3.3.1"
7191 ];
7192 })
7193 sources."parse-asn1-5.1.5"
7194 sources."parse-json-4.0.0"
7195 sources."parse5-5.1.0"
7196 sources."parseurl-1.3.3"
7197 sources."pascalcase-0.1.1"
7198 sources."path-browserify-0.0.1"
7199 sources."path-dirname-1.0.2"
7200 sources."path-exists-3.0.0"
7201 sources."path-is-absolute-1.0.1"
7202 sources."path-key-2.0.1"
7203 sources."path-parse-1.0.6"
7204 sources."pbkdf2-3.0.17"
7205 sources."performance-now-2.1.0"
7206 sources."physical-cpu-count-2.0.0"
7207 sources."pkg-up-2.0.0"
7208 sources."pn-1.1.0"
7209 sources."posix-character-classes-0.1.1"
7210 sources."postcss-7.0.27"
7211 sources."postcss-calc-7.0.2"
7212 (sources."postcss-colormin-4.0.3" // {
7213 dependencies = [
7214 sources."postcss-value-parser-3.3.1"
7215 ];
7216 })
7217 (sources."postcss-convert-values-4.0.1" // {
7218 dependencies = [
7219 sources."postcss-value-parser-3.3.1"
7220 ];
7221 })
7222 sources."postcss-discard-comments-4.0.2"
7223 sources."postcss-discard-duplicates-4.0.2"
7224 sources."postcss-discard-empty-4.0.1"
7225 sources."postcss-discard-overridden-4.0.1"
7226 (sources."postcss-merge-longhand-4.0.11" // {
7227 dependencies = [
7228 sources."postcss-value-parser-3.3.1"
7229 ];
7230 })
7231 (sources."postcss-merge-rules-4.0.3" // {
7232 dependencies = [
7233 sources."postcss-selector-parser-3.1.2"
7234 ];
7235 })
7236 (sources."postcss-minify-font-values-4.0.2" // {
7237 dependencies = [
7238 sources."postcss-value-parser-3.3.1"
7239 ];
7240 })
7241 (sources."postcss-minify-gradients-4.0.2" // {
7242 dependencies = [
7243 sources."postcss-value-parser-3.3.1"
7244 ];
7245 })
7246 (sources."postcss-minify-params-4.0.2" // {
7247 dependencies = [
7248 sources."postcss-value-parser-3.3.1"
7249 ];
7250 })
7251 (sources."postcss-minify-selectors-4.0.2" // {
7252 dependencies = [
7253 sources."postcss-selector-parser-3.1.2"
7254 ];
7255 })
7256 (sources."postcss-modules-extract-imports-1.1.0" // {
7257 dependencies = [
7258 sources."postcss-6.0.23"
7259 sources."supports-color-5.5.0"
7260 ];
7261 })
7262 (sources."postcss-modules-local-by-default-1.2.0" // {
7263 dependencies = [
7264 sources."postcss-6.0.23"
7265 sources."supports-color-5.5.0"
7266 ];
7267 })
7268 (sources."postcss-modules-scope-1.1.0" // {
7269 dependencies = [
7270 sources."postcss-6.0.23"
7271 sources."supports-color-5.5.0"
7272 ];
7273 })
7274 (sources."postcss-modules-values-1.3.0" // {
7275 dependencies = [
7276 sources."postcss-6.0.23"
7277 sources."supports-color-5.5.0"
7278 ];
7279 })
7280 sources."postcss-normalize-charset-4.0.1"
7281 (sources."postcss-normalize-display-values-4.0.2" // {
7282 dependencies = [
7283 sources."postcss-value-parser-3.3.1"
7284 ];
7285 })
7286 (sources."postcss-normalize-positions-4.0.2" // {
7287 dependencies = [
7288 sources."postcss-value-parser-3.3.1"
7289 ];
7290 })
7291 (sources."postcss-normalize-repeat-style-4.0.2" // {
7292 dependencies = [
7293 sources."postcss-value-parser-3.3.1"
7294 ];
7295 })
7296 (sources."postcss-normalize-string-4.0.2" // {
7297 dependencies = [
7298 sources."postcss-value-parser-3.3.1"
7299 ];
7300 })
7301 (sources."postcss-normalize-timing-functions-4.0.2" // {
7302 dependencies = [
7303 sources."postcss-value-parser-3.3.1"
7304 ];
7305 })
7306 (sources."postcss-normalize-unicode-4.0.1" // {
7307 dependencies = [
7308 sources."postcss-value-parser-3.3.1"
7309 ];
7310 })
7311 (sources."postcss-normalize-url-4.0.1" // {
7312 dependencies = [
7313 sources."postcss-value-parser-3.3.1"
7314 ];
7315 })
7316 (sources."postcss-normalize-whitespace-4.0.2" // {
7317 dependencies = [
7318 sources."postcss-value-parser-3.3.1"
7319 ];
7320 })
7321 (sources."postcss-ordered-values-4.1.2" // {
7322 dependencies = [
7323 sources."postcss-value-parser-3.3.1"
7324 ];
7325 })
7326 sources."postcss-reduce-initial-4.0.3"
7327 (sources."postcss-reduce-transforms-4.0.2" // {
7328 dependencies = [
7329 sources."postcss-value-parser-3.3.1"
7330 ];
7331 })
7332 sources."postcss-selector-parser-6.0.2"
7333 (sources."postcss-svgo-4.0.2" // {
7334 dependencies = [
7335 sources."postcss-value-parser-3.3.1"
7336 ];
7337 })
7338 sources."postcss-unique-selectors-4.0.1"
7339 sources."postcss-value-parser-4.0.3"
7340 sources."posthtml-0.11.6"
7341 sources."posthtml-parser-0.4.2"
7342 sources."posthtml-render-1.2.2"
7343 sources."prelude-ls-1.1.2"
7344 sources."private-0.1.8"
7345 sources."process-0.11.10"
7346 sources."process-nextick-args-2.0.1"
7347 sources."proto-list-1.2.4"
7348 sources."pseudomap-1.0.2"
7349 sources."psl-1.8.0"
7350 sources."public-encrypt-4.0.3"
7351 sources."punycode-2.1.1"
7352 sources."purgecss-1.4.2"
7353 sources."q-1.5.1"
7354 sources."qs-6.5.2"
7355 sources."querystring-0.2.0"
7356 sources."querystring-es3-0.2.1"
7357 sources."quote-stream-1.0.2"
7358 sources."randombytes-2.1.0"
7359 sources."randomfill-1.0.4"
7360 sources."range-parser-1.2.1"
7361 sources."readable-stream-2.3.7"
7362 sources."readdirp-2.2.1"
7363 sources."regenerate-1.4.0"
7364 sources."regenerate-unicode-properties-8.2.0"
7365 sources."regenerator-runtime-0.13.5"
7366 (sources."regenerator-transform-0.14.4" // {
7367 dependencies = [
7368 sources."@babel/runtime-7.9.2"
7369 ];
7370 })
7371 sources."regex-not-1.0.2"
7372 sources."regexpu-core-4.7.0"
7373 sources."regjsgen-0.5.1"
7374 (sources."regjsparser-0.6.4" // {
7375 dependencies = [
7376 sources."jsesc-0.5.0"
7377 ];
7378 })
7379 sources."remove-trailing-separator-1.1.0"
7380 sources."repeat-element-1.1.3"
7381 sources."repeat-string-1.6.1"
7382 sources."request-2.88.2"
7383 sources."request-promise-core-1.1.3"
7384 sources."request-promise-native-1.0.8"
7385 sources."require-directory-2.1.1"
7386 sources."require-main-filename-2.0.0"
7387 sources."resolve-1.17.0"
7388 sources."resolve-from-3.0.0"
7389 sources."resolve-url-0.2.1"
7390 sources."restore-cursor-2.0.0"
7391 sources."ret-0.1.15"
7392 sources."rgb-regex-1.0.1"
7393 sources."rgba-regex-1.0.0"
7394 sources."rimraf-2.6.3"
7395 sources."ripemd160-2.0.2"
7396 sources."safe-buffer-5.1.2"
7397 sources."safe-regex-1.1.0"
7398 sources."safer-buffer-2.1.2"
7399 sources."safer-eval-1.3.6"
7400 sources."sax-1.2.4"
7401 sources."saxes-3.1.11"
7402 sources."semver-5.7.1"
7403 (sources."send-0.17.1" // {
7404 dependencies = [
7405 (sources."debug-2.6.9" // {
7406 dependencies = [
7407 sources."ms-2.0.0"
7408 ];
7409 })
7410 sources."ms-2.1.1"
7411 ];
7412 })
7413 sources."serialize-to-js-1.2.2"
7414 sources."serve-static-1.14.1"
7415 sources."set-blocking-2.0.0"
7416 (sources."set-value-2.0.1" // {
7417 dependencies = [
7418 sources."extend-shallow-2.0.1"
7419 ];
7420 })
7421 sources."setimmediate-1.0.5"
7422 sources."setprototypeof-1.1.1"
7423 sources."sha.js-2.4.11"
7424 sources."shallow-copy-0.0.1"
7425 sources."shebang-command-1.2.0"
7426 sources."shebang-regex-1.0.0"
7427 sources."sigmund-1.0.1"
7428 sources."signal-exit-3.0.3"
7429 (sources."simple-swizzle-0.2.2" // {
7430 dependencies = [
7431 sources."is-arrayish-0.3.2"
7432 ];
7433 })
7434 (sources."snapdragon-0.8.2" // {
7435 dependencies = [
7436 sources."debug-2.6.9"
7437 sources."define-property-0.2.5"
7438 sources."extend-shallow-2.0.1"
7439 sources."ms-2.0.0"
7440 sources."source-map-0.5.7"
7441 ];
7442 })
7443 (sources."snapdragon-node-2.1.1" // {
7444 dependencies = [
7445 sources."define-property-1.0.0"
7446 sources."is-accessor-descriptor-1.0.0"
7447 sources."is-data-descriptor-1.0.0"
7448 sources."is-descriptor-1.0.2"
7449 ];
7450 })
7451 (sources."snapdragon-util-3.0.1" // {
7452 dependencies = [
7453 sources."kind-of-3.2.2"
7454 ];
7455 })
7456 sources."source-map-0.6.1"
7457 sources."source-map-resolve-0.5.3"
7458 sources."source-map-support-0.5.19"
7459 sources."source-map-url-0.4.0"
7460 sources."split-string-3.1.0"
7461 sources."sprintf-js-1.0.3"
7462 sources."sshpk-1.16.1"
7463 sources."stable-0.1.8"
7464 (sources."static-eval-2.0.5" // {
7465 dependencies = [
7466 sources."escodegen-1.14.1"
7467 ];
7468 })
7469 (sources."static-extend-0.1.2" // {
7470 dependencies = [
7471 sources."define-property-0.2.5"
7472 ];
7473 })
7474 (sources."static-module-2.2.5" // {
7475 dependencies = [
7476 sources."object-inspect-1.4.1"
7477 ];
7478 })
7479 sources."statuses-1.5.0"
7480 sources."stealthy-require-1.1.1"
7481 sources."stream-browserify-2.0.2"
7482 sources."stream-http-2.8.3"
7483 (sources."string-width-3.1.0" // {
7484 dependencies = [
7485 sources."ansi-regex-4.1.0"
7486 sources."strip-ansi-5.2.0"
7487 ];
7488 })
7489 sources."string.prototype.trimend-1.0.1"
7490 sources."string.prototype.trimleft-2.1.2"
7491 sources."string.prototype.trimright-2.1.2"
7492 sources."string.prototype.trimstart-1.0.1"
7493 sources."string_decoder-1.1.1"
7494 sources."strip-ansi-4.0.0"
7495 (sources."stylehacks-4.0.3" // {
7496 dependencies = [
7497 sources."postcss-selector-parser-3.1.2"
7498 ];
7499 })
7500 sources."supports-color-6.1.0"
7501 sources."svgo-1.3.2"
7502 sources."symbol-tree-3.2.4"
7503 sources."temp-0.9.0"
7504 sources."terser-3.17.0"
7505 sources."through2-2.0.5"
7506 sources."timers-browserify-2.0.11"
7507 sources."timsort-0.3.0"
7508 sources."tiny-inflate-1.0.3"
7509 sources."to-arraybuffer-1.0.1"
7510 sources."to-fast-properties-2.0.0"
7511 (sources."to-object-path-0.3.0" // {
7512 dependencies = [
7513 sources."kind-of-3.2.2"
7514 ];
7515 })
7516 sources."to-regex-3.0.2"
7517 sources."to-regex-range-2.1.1"
7518 sources."toidentifier-1.0.0"
7519 sources."tough-cookie-2.5.0"
7520 sources."tr46-1.0.1"
7521 sources."trim-right-1.0.1"
7522 sources."tty-browserify-0.0.0"
7523 sources."tunnel-agent-0.6.0"
7524 sources."tweetnacl-0.14.5"
7525 sources."type-check-0.3.2"
7526 sources."typedarray-0.0.6"
7527 (sources."uncss-0.17.3" // {
7528 dependencies = [
7529 sources."is-absolute-url-3.0.3"
7530 ];
7531 })
7532 sources."unicode-canonical-property-names-ecmascript-1.0.4"
7533 sources."unicode-match-property-ecmascript-1.0.4"
7534 sources."unicode-match-property-value-ecmascript-1.2.0"
7535 sources."unicode-property-aliases-ecmascript-1.1.0"
7536 sources."unicode-trie-0.3.1"
7537 sources."union-value-1.0.1"
7538 sources."uniq-1.0.1"
7539 sources."uniqs-2.0.0"
7540 sources."unquote-1.1.1"
7541 (sources."unset-value-1.0.0" // {
7542 dependencies = [
7543 (sources."has-value-0.3.1" // {
7544 dependencies = [
7545 sources."isobject-2.1.0"
7546 ];
7547 })
7548 sources."has-values-0.1.4"
7549 ];
7550 })
7551 sources."upath-1.2.0"
7552 sources."uri-js-4.2.2"
7553 sources."urix-0.1.0"
7554 (sources."url-0.11.0" // {
7555 dependencies = [
7556 sources."punycode-1.3.2"
7557 ];
7558 })
7559 sources."use-3.1.1"
7560 (sources."util-0.11.1" // {
7561 dependencies = [
7562 sources."inherits-2.0.3"
7563 ];
7564 })
7565 sources."util-deprecate-1.0.2"
7566 sources."util.promisify-1.0.1"
7567 sources."uuid-3.4.0"
7568 sources."v8-compile-cache-2.1.0"
7569 sources."vendors-1.0.4"
7570 sources."verror-1.10.0"
7571 sources."vlq-0.2.3"
7572 sources."vm-browserify-1.1.2"
7573 sources."w3c-hr-time-1.0.2"
7574 sources."w3c-xmlserializer-1.1.2"
7575 sources."wcwidth-1.0.1"
7576 sources."webidl-conversions-4.0.2"
7577 sources."whatwg-encoding-1.0.5"
7578 sources."whatwg-mimetype-2.3.0"
7579 sources."whatwg-url-7.1.0"
7580 sources."which-1.3.1"
7581 sources."which-module-2.0.0"
7582 sources."word-wrap-1.2.3"
7583 (sources."wrap-ansi-5.1.0" // {
7584 dependencies = [
7585 sources."ansi-regex-4.1.0"
7586 sources."strip-ansi-5.2.0"
7587 ];
7588 })
7589 sources."wrappy-1.0.2"
7590 sources."ws-5.2.2"
7591 sources."xml-name-validator-3.0.0"
7592 sources."xmlchars-2.2.0"
7593 sources."xtend-4.0.2"
7594 sources."y18n-4.0.0"
7595 sources."yallist-2.1.2"
7596 (sources."yargs-14.2.3" // {
7597 dependencies = [
7598 sources."find-up-3.0.0"
7599 sources."locate-path-3.0.0"
7600 sources."p-limit-2.3.0"
7601 sources."p-locate-3.0.0"
7602 sources."p-try-2.2.0"
7603 ];
7604 })
7605 sources."yargs-parser-15.0.1"
7606 ];
7607 buildInputs = globalBuildInputs;
7608 meta = {
7609 license = "MIT";
7610 };
7611 production = false;
7612 bypassCache = true;
7613 reconstructLock = false;
7614 };
7615in
7616{
7617 args = args;
7618 sources = sources;
7619 tarball = nodeEnv.buildNodeSourceDist args;
7620 package = nodeEnv.buildNodePackage args;
7621 shell = nodeEnv.buildNodeShell args;
7622}
diff --git a/systems/eldiron/websites/games/codenames/registry.dat b/systems/eldiron/websites/games/codenames/registry.dat
new file mode 100644
index 0000000..a8585a8
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/registry.dat
Binary files differ
diff --git a/systems/eldiron/websites/games/codenames/shell.nix b/systems/eldiron/websites/games/codenames/shell.nix
new file mode 100644
index 0000000..053696b
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/shell.nix
@@ -0,0 +1,50 @@
1{ pkgs ? import <nixpkgs> {} }: with pkgs;
2let
3 greenapid = callPackage ./greenapid.nix {};
4 frontend = callPackage ./frontend.nix {};
5 nginx_conf = writeText "nginx.conf" ''
6 pid ./nginx.pid;
7 error_log stderr;
8 daemon off;
9 events {
10 }
11 http {
12 include ${mailcap}/etc/nginx/mime.types;
13 server {
14 listen 0.0.0.0:8081;
15 listen [::]:8081;
16 location /api/ {
17 proxy_set_header X-Real-IP $remote_addr;
18 proxy_set_header Host $host;
19 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
20 proxy_pass http://127.0.0.1:8080/;
21 }
22 location / {
23 root ${frontend};
24 try_files $uri $uri/ /index.html;
25 }
26 }
27 }
28 '';
29in
30pkgs.mkShell {
31 buildInputs = [
32 greenapid
33 frontend
34 python2
35 nginx
36 ];
37 shellHook = ''
38 greenapid &
39 pid=$!
40
41 finish() {
42 kill $pid;
43 }
44
45 trap finish EXIT
46
47 nginx -c ${nginx_conf} -p ./nginx/
48 exit
49 '';
50}
diff --git a/systems/eldiron/websites/games/codenames/wordlists/french.txt b/systems/eldiron/websites/games/codenames/wordlists/french.txt
new file mode 100644
index 0000000..462ddc4
--- /dev/null
+++ b/systems/eldiron/websites/games/codenames/wordlists/french.txt
@@ -0,0 +1,694 @@
1ACCIDENT
2ACHAT
3ACNÉ
4ACTION
5ADOLESCENT
6AFRIQUE
7AIGUILLE
8ALLUMER
9ALPES
10ALPHABET
11ALTITUDE
12AMÉRIQUE
13AMI
14AMOUR
15AMPOULE
16ANNIVERSAIRE
17APPÉTIT
18ARAIGNÉE
19ARBRE
20ARC
21ARC-EN-CIEL
22ARGENT
23ARME
24ARMÉE
25ASCENSEUR
26ASIE
27ASSIS
28ASTRONAUTE
29ATCHOUM
30ATHLÈTE
31ATLANTIDE
32AUBE
33AUSTRALIE
34AVEC
35AVENTURE
36AVION
37AVOCAT
38BAC
39BAGUETTE
40BAIN
41BAISER
42BALAI
43BALLE
44BALLON
45BAMBOU
46BANANE
47BANNIR
48BARBE
49BARRIÈRE
50BAS
51BASKET
52BATEAU
53BÂTON
54BATTERIE
55BÉBÉ
56BEETHOVEN
57BÊTE
58BIBERON
59BIÈRE
60BLANC
61BLÉ
62BLEU
63BOB
64BOISSON
65BOÎTE
66BOMBE
67BONBON
68BONNET
69BORD
70BORDEAUX
71BOTTE
72BOUE
73BOUGIE
74BOULE
75BOUTEILLE
76BOUTON
77BRANCHE
78BRAS
79BRAVO
80BRETAGNE
81BRISE
82BROSSE
83BRUIT
84BRUME
85BRUN
86BÛCHE
87BULLE
88BUREAU
89BUT
90CABANE
91CABINE
92CACHER
93CADEAU
94CAFARD
95CAFÉ
96CAISSE
97CALCULER
98CALME
99CAMÉRA
100CAMION
101CAMPING
102CANADA
103CANARD
104CANETTE
105CANINE
106CAP
107CAPITALISME
108CAR
109CAROTTE
110CARRÉ
111CARTE
112CARTON
113CASQUE
114CASSER
115CASSETTE
116CAUCHEMAR
117CAUSE
118CEINTURE
119CELLULE
120CERCLE
121CHAÎNE
122CHAIR
123CHAISE
124CHAMP
125CHAMPION
126CHANT
127CHAPEAU
128CHARBON
129CHARGE
130CHASSE
131CHAT
132CHÂTEAU
133CHAUD
134CHAUSSURE
135CHAUVE
136CHEF
137CHEMISE
138CHÊNE
139CHER
140CHEVAL
141CHEVALIER
142CHEVEU
143CHIEN
144CHIFFRE
145CHINE
146CHOCOLAT
147CHÔMAGE
148CIEL
149CIL
150CINÉMA
151CIRE
152CIRQUE
153CITRON
154CLÉ
155CLOU
156CLOWN
157COACH
158COCCINELLE
159CODE
160CŒUR
161COL
162COLLE
163COLLINE
164COLONNE
165CÔNE
166CONFORT
167CONTINU
168CONTRE
169CONVERSATION
170COPAIN
171COQ
172COQUILLAGE
173CORBEAU
174CORDE
175CORPS
176CÔTE
177COUDE
178COULOIR
179COUP
180COUR
181COURANT
182COURRIER
183COURS
184COURSE
185COURT
186COUTEAU
187COUVERT
188COUVERTURE
189COWBOY
190CRAC
191CRAYON
192CRÈME
193CRITIQUE
194CROCHET
195CROIX
196CROÛTE
197CUILLÈRE
198CUIR
199CUISINE
200CULOTTE
201CYCLE
202DARD
203
204DEBOUT
205DÉFAUT
206DEHORS
207DÉMOCRATIE
208DENT
209DENTISTE
210DESSIN
211DEVOIR
212DIAMANT
213DICTIONNAIRE
214DIEU
215DINOSAURE
216DISCOURS
217DISQUE
218DIX
219DOCTEUR
220DOIGT
221DOMINO
222DORMIR
223DROIT
224EAU
225ÉCHEC
226ÉCHELLE
227ÉCLAIR
228ÉCOLE
229ÉCRAN
230ÉCRASER
231ÉCRIT
232ÉGLISE
233ÉGOUT
234ÉLECTRICITÉ
235ÉLÉPHANT
236ÉLÈVE
237ELFE
238EMPREINTE
239ENCEINTE
240ÉPICE
241ÉPINE
242ERREUR
243ESPACE
244ESPION
245ESSENCE
246ÉTAT
247ÉTÉ
248ÉTOILE
249ÉTRANGER
250ÉVENTAIL
251ÉVOLUTION
252EXPLOSION
253EXTENSION
254FACE
255FAN
256FARCE
257FATIGUE
258FAUTEUIL
259FEMME
260FENÊTRE
261FER
262FÊTE
263FEU
264FEUILLE
265FIDÈLE
266FIL
267FILLE
268FLAMME
269FLÈCHE
270FLEUR
271FLEUVE
272FOND
273FOOTBALL
274FORÊT
275FORGER
276FOUDRE
277FOUET
278FOUR
279FOURMI
280FROID
281FROMAGE
282FRONT
283FRUIT
284FUIR
285FUTUR
286GARÇON
287GÂTEAU
288GAUCHE
289GAZ
290GAZON
291GEL
292GENOU
293GLACE
294GOMME
295GORGE
296GOUTTE
297GRAND
298GRÈCE
299GRENOUILLE
300GRIPPE
301GRIS
302GROS
303GROUPE
304GUITARE
305HASARD
306HAUT
307HÉLICOPTÈRE
308HERBE
309HEUREUX
310HISTOIRE
311HIVER
312HÔTEL
313HUGO
314HUILE
315HUMIDE
316HUMOUR
317INDICE
318INTERNET
319INVITER
320ITALIE
321JACQUES
322JAMBE
323JAMBON
324JARDIN
325JAUNE
326JEAN
327JEANNE
328JET
329JEU
330JOGGING
331JOUR
332JOURNAL
333JUPITER
334KILO
335KIWI
336LAINE
337LAIT
338LANGUE
339LAPIN
340LATIN
341LAVER
342LECTEUR
343LÉGER
344LENT
345LETTRE
346LIEN
347LIGNE
348LINGE
349LION
350LIT
351LIVRE
352LOI
353LONG
354LOUIS
355LOUP
356LUMIÈRE
357LUNDI
358LUNE
359LUNETTE
360MACHINE
361MACHO
362MAIN
363MAISON
364MAÎTRESSE
365MAL
366MALADIE
367MAMAN
368MAMMOUTH
369MANGER
370MARAIS
371MARC
372MARCHE
373MARIAGE
374MARIE
375MARIÉE
376MARQUE
377MARSEILLE
378MASSE
379MER
380MESSE
381MÈTRE
382MÉTRO
383MIAOU
384MICRO
385MIEUX
386MILLE
387MINE
388MIROIR
389MODERNE
390MOITIÉ
391MONDE
392MONSTRE
393MONTAGNE
394MONTRE
395MORT
396MOTEUR
397MOTO
398MOU
399MOUCHE
400MOULIN
401MOUSTACHE
402MOUTON
403MUR
404MUSCLE
405MUSIQUE
406MYSTÈRE
407NAGE
408NATURE
409NEIGE
410NEUTRE
411NEW YORK
412NEZ
413NID
414NINJA
415NIVEAU
416NOËL
417NŒUD
418NOIR
419NOUS
420NUAGE
421NUIT
422NUMÉRO
423ŒIL
424ŒUF
425OISEAU
426OLYMPIQUE
427OMBRE
428ONGLE
429OR
430ORAL
431ORANGE
432ORDINATEUR
433ORDRE
434ORDURE
435OREILLE
436ORGANE
437ORGUEIL
438OURS
439OUTIL
440OUVERT
441OVALE
442PAIN
443PALAIS
444PANNEAU
445PANTALON
446PANTIN
447PAPA
448PAPIER
449PAPILLON
450PARADIS
451PARC
452PARIS
453PAROLE
454PARTIE
455PASSE
456PÂTE
457PATIN
458PATTE
459PAUL
460PAYER
461PÊCHE
462PEINTURE
463PENDULE
464PENSER
465PERSONNE
466PETIT
467PEUR
468PHILOSOPHE
469PHOTO
470PHRASE
471PIANO
472PIÈCE
473PIED
474PIERRE
475PILE
476PILOTE
477PINCE
478PIOCHE
479PION
480PIRATE
481PIRE
482PISCINE
483PLACE
484PLAFOND
485PLAGE
486PLAIE
487PLAN
488PLANCHE
489PLANÈTE
490PLANTE
491PLASTIQUE
492PLAT
493PLOMB
494PLONGER
495PLUIE
496POCHE
497POÈTE
498POIDS
499POING
500POINT
501POIVRE
502POLICE
503POLITIQUE
504POLLEN
505POLO
506POMME
507POMPE
508PONT
509POPULATION
510PORT
511PORTE
512PORTEFEUILLE
513POSITIF
514POSTE
515POUBELLE
516POULE
517POUPÉE
518POUSSER
519POUSSIÈRE
520POUVOIR
521PRÉHISTOIRE
522PREMIER
523PRÉSENT
524PRESSE
525PRIER
526PRINCESSE
527PRISE
528PRIVÉ
529PROFESSEUR
530PSYCHOLOGIE
531PUBLIC
532PULL
533PUNK
534PUZZLE
535PYJAMA
536QUATRE
537QUINZE
538RACE
539RADIO
540RAISIN
541RAP
542RAYÉ
543RAYON
544RÉFLÉCHIR
545REINE
546REPAS
547REPTILE
548REQUIN
549RÊVE
550RICHE
551RIDEAU
552RIEN
553RIRE
554ROBINET
555ROCHE
556ROI
557ROND
558ROSE
559ROUE
560ROUGE
561ROUILLE
562ROUX
563RUSSIE
564SABLE
565SABRE
566SAC
567SAIN
568SAISON
569SALE
570SALLE
571SALUT
572SAMU
573SANDWICH
574SANG
575SAPIN
576SATELLITE
577SAUMON
578SAUT
579SAVOIR
580SCHTROUMPF
581SCIENCE
582SCOUT
583SEC
584SEINE
585SEL
586SEPT
587SERPENT
588SERRER
589SEXE
590SHAMPOOING
591SIÈCLE
592SIÈGE
593SIESTE
594SILHOUETTE
595SIRÈNE
596SKI
597SOLEIL
598SOMMEIL
599SON
600SONNER
601SORCIÈRE
602SOURD
603SOURIS
604SPORT
605STAR
606STATION
607STYLO
608SUR
609SURFACE
610SUSHI
611SWING
612TABLEAU
613TACHE
614TAILLE
615TANTE
616TAPIS
617TARD
618TAXI
619TÉLÉPHONE
620TÉLÉVISION
621TEMPLE
622TEMPS
623TENNIS
624TÊTE
625THÉ
626TIGRE
627TINTIN
628TISSU
629TITRE
630TOAST
631TOILETTE
632TOKYO
633TOMBE
634TON
635TOP
636TOUCHE
637TOUJOURS
638TOUR
639TOURNOI
640TOUT
641TRACE
642TRAIN
643TRAÎNER
644TRANSPORT
645TRAVAIL
646TRÉSOR
647TRIANGLE
648TRISTE
649TRÔNE
650TROUPEAU
651TSAR
652TUBE
653TUER
654TUPPERWARE
655TUYAU
656TWITTER
657TYPE
658UNIVERSITÉ
659VACHE
660VAGUE
661VAISSELLE
662VALEUR
663VER
664VERDICT
665VERRE
666VERS
667VERT
668VESTE
669VIANDE
670VIDE
671VIE
672VIEUX
673VILLE
674VIN
675VINGT
676VIOLON
677VIPÈRE
678VISION
679VITE
680VIVE
681VŒU
682VOILE
683VOISIN
684VOITURE
685VOL
686VOLUME
687VOTE
688VOULOIR
689VOYAGE
690ZEN
691ZÉRO
692ZODIAQUE
693ZONE
694ZOO
diff --git a/systems/eldiron/websites/games/terraforming-mars/default.nix b/systems/eldiron/websites/games/terraforming-mars/default.nix
new file mode 100644
index 0000000..e90e72f
--- /dev/null
+++ b/systems/eldiron/websites/games/terraforming-mars/default.nix
@@ -0,0 +1,75 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.myServices.websites.games.terraforming-mars;
4 terraforming-mars = pkgs.callPackage ./terraforming-mars.nix {};
5in
6{
7 options.myServices.websites.games.terraforming-mars.enable = lib.mkEnableOption "Enable Terraforming mars game";
8 config = lib.mkIf cfg.enable {
9 myServices.dns.zones."immae.eu".subdomains.games.subdomains.terraforming-mars = with config.myServices.dns.helpers;
10 ips servers.eldiron.ips.main;
11 myServices.chatonsProperties.services.terraforming-mars = {
12 file.datetime = "2022-08-27T14:20:00";
13 service = {
14 name = "Terraforming Mars";
15 description = "Terraforming Mars Boardgame";
16 website = "https://terraforming-mars.games.immae.eu/";
17 logo = "https://terraforming-mars.games.immae.eu/favicon.ico";
18 status.level = "OK";
19 status.description = "OK";
20 registration."" = ["NONE"];
21 registration.load = "OPEN";
22 install.type = "PACKAGE";
23 };
24 software = {
25 name = "Terraforming Mars";
26 website = "https://github.com/terraforming-mars/terraforming-mars";
27 license.url = "https://github.com/terraforming-mars/terraforming-mars/blob/main/LICENSE";
28 license.name = "GNU General Public License v3.0";
29 version = "unversionned";
30 source.url = "https://github.com/terraforming-mars/terraforming-mars";
31 };
32 };
33 systemd.services.terraforming-mars = {
34 path = [ pkgs.nodejs_16 pkgs.bashInteractive ];
35 description = "Terraforming mars game";
36 wantedBy = [ "multi-user.target" ];
37 script = ''
38 export PORT=/run/terraforming-mars/socket.sock
39 export NODE_ENV=production
40 mkdir -p /var/lib/terraforming-mars/db
41 npm run start
42 '';
43 postStart = ''
44 sleep 5;
45 chown :wwwrun /run/terraforming-mars/socket.sock
46 chmod g+w /run/terraforming-mars/socket.sock
47 '';
48 environment.NPM_CONFIG_LOGS_DIR = "%S/terraforming-mars/npm_logs";
49 environment.NPM_CONFIG_CACHE = "%S/terraforming-mars/npm_cache";
50 serviceConfig = {
51 User = "terraformingmars";
52 DynamicUser = true;
53 SupplementaryGroups = [ "wwwrun" ];
54 Type = "simple";
55 WorkingDirectory = terraforming-mars;
56 RuntimeDirectory = "terraforming-mars";
57 StateDirectory = "terraforming-mars";
58 };
59 };
60
61 security.acme.certs.games.extraDomainNames = [ "terraforming-mars.games.immae.eu" ];
62 security.acme.certs.games.domain = "games.immae.eu";
63 services.websites.env.tools.vhostConfs.games_terraforming-mars = {
64 certName = "games";
65 hosts = [ "terraforming-mars.games.immae.eu" ];
66 root = null;
67 extraConfig = [
68 ''
69 ProxyPass / unix:///run/terraforming-mars/socket.sock|http://terraforming-mars.games.immae.eu/
70 ProxyPassReverse / unix:///run/terraforming-mars/socket.sock|http://terraforming-mars.games.immae.eu/
71 ''
72 ];
73 };
74 };
75}
diff --git a/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch b/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch
new file mode 100644
index 0000000..684a7df
--- /dev/null
+++ b/systems/eldiron/websites/games/terraforming-mars/immae-assets.patch
@@ -0,0 +1,13 @@
1diff --git a/assets/index.html b/assets/index.html
2index 220192834..d77a0fc80 100644
3--- a/assets/index.html
4+++ b/assets/index.html
5@@ -2,7 +2,7 @@
6 <html>
7 <head>
8 <link
9- href="https://fonts.googleapis.com/css?family=Ubuntu&display=swap"
10+ href="https://assets.immae.eu/fonts/Ubuntu_swap/font.css"
11 rel="stylesheet"
12 />
13 <link rel="stylesheet" type="text/css" media="all" href="/styles.css" />
diff --git a/systems/eldiron/websites/games/terraforming-mars/node-packages.nix b/systems/eldiron/websites/games/terraforming-mars/node-packages.nix
new file mode 100644
index 0000000..e5fac49
--- /dev/null
+++ b/systems/eldiron/websites/games/terraforming-mars/node-packages.nix
@@ -0,0 +1,4353 @@
1# This file has been generated by node2nix 1.8.0. Do not edit!
2
3{nodeEnv, fetchurl, fetchgit, globalBuildInputs ? [], src}:
4
5let
6 sources = {
7 "@babel/code-frame-7.12.13" = {
8 name = "_at_babel_slash_code-frame";
9 packageName = "@babel/code-frame";
10 version = "7.12.13";
11 src = fetchurl {
12 url = "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.12.13.tgz";
13 sha512 = "HV1Cm0Q3ZrpCR93tkWOYiuYIgLxZXZFVG2VgK+MBWjUqZTundupbfx2aXarXuw5Ko5aMcjtJgbSs4vUGBS5v6g==";
14 };
15 };
16 "@babel/helper-validator-identifier-7.12.11" = {
17 name = "_at_babel_slash_helper-validator-identifier";
18 packageName = "@babel/helper-validator-identifier";
19 version = "7.12.11";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.12.11.tgz";
22 sha512 = "np/lG3uARFybkoHokJUmf1QfEvRVCPbmQeUQpKow5cQ3xWrV9i3rUHodKDJPQfTVX61qKi+UdYk8kik84n7XOw==";
23 };
24 };
25 "@babel/highlight-7.13.10" = {
26 name = "_at_babel_slash_highlight";
27 packageName = "@babel/highlight";
28 version = "7.13.10";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@babel/highlight/-/highlight-7.13.10.tgz";
31 sha512 = "5aPpe5XQPzflQrFwL1/QoeHkP2MsA4JCntcXHRhEsdsfPVkvPi2w7Qix4iV7t5S/oC9OodGrggd8aco1g3SZFg==";
32 };
33 };
34 "@discoveryjs/json-ext-0.5.2" = {
35 name = "_at_discoveryjs_slash_json-ext";
36 packageName = "@discoveryjs/json-ext";
37 version = "0.5.2";
38 src = fetchurl {
39 url = "https://registry.npmjs.org/@discoveryjs/json-ext/-/json-ext-0.5.2.tgz";
40 sha512 = "HyYEUDeIj5rRQU2Hk5HTB2uHsbRQpF70nvMhVzi+VJR0X+xNEhjPui4/kBf3VeH/wqD28PT4sVOm8qqLjBrSZg==";
41 };
42 };
43 "@nodelib/fs.scandir-2.1.4" = {
44 name = "_at_nodelib_slash_fs.scandir";
45 packageName = "@nodelib/fs.scandir";
46 version = "2.1.4";
47 src = fetchurl {
48 url = "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.4.tgz";
49 sha512 = "33g3pMJk3bg5nXbL/+CY6I2eJDzZAni49PfJnL5fghPTggPvBd/pFNSgJsdAgWptuFu7qq/ERvOYFlhvsLTCKA==";
50 };
51 };
52 "@nodelib/fs.stat-2.0.4" = {
53 name = "_at_nodelib_slash_fs.stat";
54 packageName = "@nodelib/fs.stat";
55 version = "2.0.4";
56 src = fetchurl {
57 url = "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.4.tgz";
58 sha512 = "IYlHJA0clt2+Vg7bccq+TzRdJvv19c2INqBSsoOLp1je7xjtr7J26+WXR72MCdvU9q1qTzIWDfhMf+DRvQJK4Q==";
59 };
60 };
61 "@nodelib/fs.walk-1.2.6" = {
62 name = "_at_nodelib_slash_fs.walk";
63 packageName = "@nodelib/fs.walk";
64 version = "1.2.6";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.6.tgz";
67 sha512 = "8Broas6vTtW4GIXTAHDoE32hnN2M5ykgCpWGbuXHQ15vEMqr23pB76e/GZcYsZCHALv50ktd24qhEyKr6wBtow==";
68 };
69 };
70 "@types/eslint-7.2.10" = {
71 name = "_at_types_slash_eslint";
72 packageName = "@types/eslint";
73 version = "7.2.10";
74 src = fetchurl {
75 url = "https://registry.npmjs.org/@types/eslint/-/eslint-7.2.10.tgz";
76 sha512 = "kUEPnMKrqbtpCq/KTaGFFKAcz6Ethm2EjCoKIDaCmfRBWLbFuTcOJfTlorwbnboXBzahqWLgUp1BQeKHiJzPUQ==";
77 };
78 };
79 "@types/eslint-scope-3.7.0" = {
80 name = "_at_types_slash_eslint-scope";
81 packageName = "@types/eslint-scope";
82 version = "3.7.0";
83 src = fetchurl {
84 url = "https://registry.npmjs.org/@types/eslint-scope/-/eslint-scope-3.7.0.tgz";
85 sha512 = "O/ql2+rrCUe2W2rs7wMR+GqPRcgB6UiqN5RhrR5xruFlY7l9YLMn0ZkDzjoHLeiFkR8MCQZVudUuuvQ2BLC9Qw==";
86 };
87 };
88 "@types/estree-0.0.46" = {
89 name = "_at_types_slash_estree";
90 packageName = "@types/estree";
91 version = "0.0.46";
92 src = fetchurl {
93 url = "https://registry.npmjs.org/@types/estree/-/estree-0.0.46.tgz";
94 sha512 = "laIjwTQaD+5DukBZaygQ79K1Z0jb1bPEMRrkXSLjtCcZm+abyp5YbrqpSLzD42FwWW6gK/aS4NYpJ804nG2brg==";
95 };
96 };
97 "@types/json-schema-7.0.7" = {
98 name = "_at_types_slash_json-schema";
99 packageName = "@types/json-schema";
100 version = "7.0.7";
101 src = fetchurl {
102 url = "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.7.tgz";
103 sha512 = "cxWFQVseBm6O9Gbw1IWb8r6OS4OhSt3hPZLkFApLjM8TEXROBuQGLAH2i2gZpcXdLBIrpXuTDhH7Vbm1iXmNGA==";
104 };
105 };
106 "@types/node-10.17.58" = {
107 name = "_at_types_slash_node";
108 packageName = "@types/node";
109 version = "10.17.58";
110 src = fetchurl {
111 url = "https://registry.npmjs.org/@types/node/-/node-10.17.58.tgz";
112 sha512 = "Dn5RBxLohjdHFj17dVVw3rtrZAeXeWg+LQfvxDIW/fdPkSiuQk7h3frKMYtsQhtIW42wkErDcy9UMVxhGW4O7w==";
113 };
114 };
115 "@types/pg-7.14.11" = {
116 name = "_at_types_slash_pg";
117 packageName = "@types/pg";
118 version = "7.14.11";
119 src = fetchurl {
120 url = "https://registry.npmjs.org/@types/pg/-/pg-7.14.11.tgz";
121 sha512 = "EnZkZ1OMw9DvNfQkn2MTJrwKmhJYDEs5ujWrPfvseWNoI95N8B4HzU/Ltrq5ZfYxDX/Zg8mTzwr6UAyTjjFvXA==";
122 };
123 };
124 "@types/sqlite3-3.1.7" = {
125 name = "_at_types_slash_sqlite3";
126 packageName = "@types/sqlite3";
127 version = "3.1.7";
128 src = fetchurl {
129 url = "https://registry.npmjs.org/@types/sqlite3/-/sqlite3-3.1.7.tgz";
130 sha512 = "8FHV/8Uzd7IwdHm5mvmF2Aif4aC/gjrt4axWD9SmfaxITnOjtOhCbOSTuqv/VbH1uq0QrwlaTj9aTz3gmR6u4w==";
131 };
132 };
133 "@typescript-eslint/eslint-plugin-4.22.0" = {
134 name = "_at_typescript-eslint_slash_eslint-plugin";
135 packageName = "@typescript-eslint/eslint-plugin";
136 version = "4.22.0";
137 src = fetchurl {
138 url = "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-4.22.0.tgz";
139 sha512 = "U8SP9VOs275iDXaL08Ln1Fa/wLXfj5aTr/1c0t0j6CdbOnxh+TruXu1p4I0NAvdPBQgoPjHsgKn28mOi0FzfoA==";
140 };
141 };
142 "@typescript-eslint/experimental-utils-4.22.0" = {
143 name = "_at_typescript-eslint_slash_experimental-utils";
144 packageName = "@typescript-eslint/experimental-utils";
145 version = "4.22.0";
146 src = fetchurl {
147 url = "https://registry.npmjs.org/@typescript-eslint/experimental-utils/-/experimental-utils-4.22.0.tgz";
148 sha512 = "xJXHHl6TuAxB5AWiVrGhvbGL8/hbiCQ8FiWwObO3r0fnvBdrbWEDy1hlvGQOAWc6qsCWuWMKdVWlLAEMpxnddg==";
149 };
150 };
151 "@typescript-eslint/parser-4.22.0" = {
152 name = "_at_typescript-eslint_slash_parser";
153 packageName = "@typescript-eslint/parser";
154 version = "4.22.0";
155 src = fetchurl {
156 url = "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-4.22.0.tgz";
157 sha512 = "z/bGdBJJZJN76nvAY9DkJANYgK3nlRstRRi74WHm3jjgf2I8AglrSY+6l7ogxOmn55YJ6oKZCLLy+6PW70z15Q==";
158 };
159 };
160 "@typescript-eslint/scope-manager-4.22.0" = {
161 name = "_at_typescript-eslint_slash_scope-manager";
162 packageName = "@typescript-eslint/scope-manager";
163 version = "4.22.0";
164 src = fetchurl {
165 url = "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-4.22.0.tgz";
166 sha512 = "OcCO7LTdk6ukawUM40wo61WdeoA7NM/zaoq1/2cs13M7GyiF+T4rxuA4xM+6LeHWjWbss7hkGXjFDRcKD4O04Q==";
167 };
168 };
169 "@typescript-eslint/types-4.22.0" = {
170 name = "_at_typescript-eslint_slash_types";
171 packageName = "@typescript-eslint/types";
172 version = "4.22.0";
173 src = fetchurl {
174 url = "https://registry.npmjs.org/@typescript-eslint/types/-/types-4.22.0.tgz";
175 sha512 = "sW/BiXmmyMqDPO2kpOhSy2Py5w6KvRRsKZnV0c4+0nr4GIcedJwXAq+RHNK4lLVEZAJYFltnnk1tJSlbeS9lYA==";
176 };
177 };
178 "@typescript-eslint/typescript-estree-4.22.0" = {
179 name = "_at_typescript-eslint_slash_typescript-estree";
180 packageName = "@typescript-eslint/typescript-estree";
181 version = "4.22.0";
182 src = fetchurl {
183 url = "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-4.22.0.tgz";
184 sha512 = "TkIFeu5JEeSs5ze/4NID+PIcVjgoU3cUQUIZnH3Sb1cEn1lBo7StSV5bwPuJQuoxKXlzAObjYTilOEKRuhR5yg==";
185 };
186 };
187 "@typescript-eslint/visitor-keys-4.22.0" = {
188 name = "_at_typescript-eslint_slash_visitor-keys";
189 packageName = "@typescript-eslint/visitor-keys";
190 version = "4.22.0";
191 src = fetchurl {
192 url = "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-4.22.0.tgz";
193 sha512 = "nnMu4F+s4o0sll6cBSsTeVsT4cwxB7zECK3dFxzEjPBii9xLpq4yqqsy/FU5zMfan6G60DKZSCXAa3sHJZrcYw==";
194 };
195 };
196 "@webassemblyjs/ast-1.11.0" = {
197 name = "_at_webassemblyjs_slash_ast";
198 packageName = "@webassemblyjs/ast";
199 version = "1.11.0";
200 src = fetchurl {
201 url = "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.11.0.tgz";
202 sha512 = "kX2W49LWsbthrmIRMbQZuQDhGtjyqXfEmmHyEi4XWnSZtPmxY0+3anPIzsnRb45VH/J55zlOfWvZuY47aJZTJg==";
203 };
204 };
205 "@webassemblyjs/floating-point-hex-parser-1.11.0" = {
206 name = "_at_webassemblyjs_slash_floating-point-hex-parser";
207 packageName = "@webassemblyjs/floating-point-hex-parser";
208 version = "1.11.0";
209 src = fetchurl {
210 url = "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.11.0.tgz";
211 sha512 = "Q/aVYs/VnPDVYvsCBL/gSgwmfjeCb4LW8+TMrO3cSzJImgv8lxxEPM2JA5jMrivE7LSz3V+PFqtMbls3m1exDA==";
212 };
213 };
214 "@webassemblyjs/helper-api-error-1.11.0" = {
215 name = "_at_webassemblyjs_slash_helper-api-error";
216 packageName = "@webassemblyjs/helper-api-error";
217 version = "1.11.0";
218 src = fetchurl {
219 url = "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.11.0.tgz";
220 sha512 = "baT/va95eXiXb2QflSx95QGT5ClzWpGaa8L7JnJbgzoYeaA27FCvuBXU758l+KXWRndEmUXjP0Q5fibhavIn8w==";
221 };
222 };
223 "@webassemblyjs/helper-buffer-1.11.0" = {
224 name = "_at_webassemblyjs_slash_helper-buffer";
225 packageName = "@webassemblyjs/helper-buffer";
226 version = "1.11.0";
227 src = fetchurl {
228 url = "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.11.0.tgz";
229 sha512 = "u9HPBEl4DS+vA8qLQdEQ6N/eJQ7gT7aNvMIo8AAWvAl/xMrcOSiI2M0MAnMCy3jIFke7bEee/JwdX1nUpCtdyA==";
230 };
231 };
232 "@webassemblyjs/helper-numbers-1.11.0" = {
233 name = "_at_webassemblyjs_slash_helper-numbers";
234 packageName = "@webassemblyjs/helper-numbers";
235 version = "1.11.0";
236 src = fetchurl {
237 url = "https://registry.npmjs.org/@webassemblyjs/helper-numbers/-/helper-numbers-1.11.0.tgz";
238 sha512 = "DhRQKelIj01s5IgdsOJMKLppI+4zpmcMQ3XboFPLwCpSNH6Hqo1ritgHgD0nqHeSYqofA6aBN/NmXuGjM1jEfQ==";
239 };
240 };
241 "@webassemblyjs/helper-wasm-bytecode-1.11.0" = {
242 name = "_at_webassemblyjs_slash_helper-wasm-bytecode";
243 packageName = "@webassemblyjs/helper-wasm-bytecode";
244 version = "1.11.0";
245 src = fetchurl {
246 url = "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.11.0.tgz";
247 sha512 = "MbmhvxXExm542tWREgSFnOVo07fDpsBJg3sIl6fSp9xuu75eGz5lz31q7wTLffwL3Za7XNRCMZy210+tnsUSEA==";
248 };
249 };
250 "@webassemblyjs/helper-wasm-section-1.11.0" = {
251 name = "_at_webassemblyjs_slash_helper-wasm-section";
252 packageName = "@webassemblyjs/helper-wasm-section";
253 version = "1.11.0";
254 src = fetchurl {
255 url = "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.11.0.tgz";
256 sha512 = "3Eb88hcbfY/FCukrg6i3EH8H2UsD7x8Vy47iVJrP967A9JGqgBVL9aH71SETPx1JrGsOUVLo0c7vMCN22ytJew==";
257 };
258 };
259 "@webassemblyjs/ieee754-1.11.0" = {
260 name = "_at_webassemblyjs_slash_ieee754";
261 packageName = "@webassemblyjs/ieee754";
262 version = "1.11.0";
263 src = fetchurl {
264 url = "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.11.0.tgz";
265 sha512 = "KXzOqpcYQwAfeQ6WbF6HXo+0udBNmw0iXDmEK5sFlmQdmND+tr773Ti8/5T/M6Tl/413ArSJErATd8In3B+WBA==";
266 };
267 };
268 "@webassemblyjs/leb128-1.11.0" = {
269 name = "_at_webassemblyjs_slash_leb128";
270 packageName = "@webassemblyjs/leb128";
271 version = "1.11.0";
272 src = fetchurl {
273 url = "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.11.0.tgz";
274 sha512 = "aqbsHa1mSQAbeeNcl38un6qVY++hh8OpCOzxhixSYgbRfNWcxJNJQwe2rezK9XEcssJbbWIkblaJRwGMS9zp+g==";
275 };
276 };
277 "@webassemblyjs/utf8-1.11.0" = {
278 name = "_at_webassemblyjs_slash_utf8";
279 packageName = "@webassemblyjs/utf8";
280 version = "1.11.0";
281 src = fetchurl {
282 url = "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.11.0.tgz";
283 sha512 = "A/lclGxH6SpSLSyFowMzO/+aDEPU4hvEiooCMXQPcQFPPJaYcPQNKGOCLUySJsYJ4trbpr+Fs08n4jelkVTGVw==";
284 };
285 };
286 "@webassemblyjs/wasm-edit-1.11.0" = {
287 name = "_at_webassemblyjs_slash_wasm-edit";
288 packageName = "@webassemblyjs/wasm-edit";
289 version = "1.11.0";
290 src = fetchurl {
291 url = "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.11.0.tgz";
292 sha512 = "JHQ0damXy0G6J9ucyKVXO2j08JVJ2ntkdJlq1UTiUrIgfGMmA7Ik5VdC/L8hBK46kVJgujkBIoMtT8yVr+yVOQ==";
293 };
294 };
295 "@webassemblyjs/wasm-gen-1.11.0" = {
296 name = "_at_webassemblyjs_slash_wasm-gen";
297 packageName = "@webassemblyjs/wasm-gen";
298 version = "1.11.0";
299 src = fetchurl {
300 url = "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.11.0.tgz";
301 sha512 = "BEUv1aj0WptCZ9kIS30th5ILASUnAPEvE3tVMTrItnZRT9tXCLW2LEXT8ezLw59rqPP9klh9LPmpU+WmRQmCPQ==";
302 };
303 };
304 "@webassemblyjs/wasm-opt-1.11.0" = {
305 name = "_at_webassemblyjs_slash_wasm-opt";
306 packageName = "@webassemblyjs/wasm-opt";
307 version = "1.11.0";
308 src = fetchurl {
309 url = "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.11.0.tgz";
310 sha512 = "tHUSP5F4ywyh3hZ0+fDQuWxKx3mJiPeFufg+9gwTpYp324mPCQgnuVKwzLTZVqj0duRDovnPaZqDwoyhIO8kYg==";
311 };
312 };
313 "@webassemblyjs/wasm-parser-1.11.0" = {
314 name = "_at_webassemblyjs_slash_wasm-parser";
315 packageName = "@webassemblyjs/wasm-parser";
316 version = "1.11.0";
317 src = fetchurl {
318 url = "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.11.0.tgz";
319 sha512 = "6L285Sgu9gphrcpDXINvm0M9BskznnzJTE7gYkjDbxET28shDqp27wpruyx3C2S/dvEwiigBwLA1cz7lNUi0kw==";
320 };
321 };
322 "@webassemblyjs/wast-printer-1.11.0" = {
323 name = "_at_webassemblyjs_slash_wast-printer";
324 packageName = "@webassemblyjs/wast-printer";
325 version = "1.11.0";
326 src = fetchurl {
327 url = "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.11.0.tgz";
328 sha512 = "Fg5OX46pRdTgB7rKIUojkh9vXaVN6sGYCnEiJN1GYkb0RPwShZXp6KTDqmoMdQPKhcroOXh3fEzmkWmCYaKYhQ==";
329 };
330 };
331 "@webpack-cli/configtest-1.0.2" = {
332 name = "_at_webpack-cli_slash_configtest";
333 packageName = "@webpack-cli/configtest";
334 version = "1.0.2";
335 src = fetchurl {
336 url = "https://registry.npmjs.org/@webpack-cli/configtest/-/configtest-1.0.2.tgz";
337 sha512 = "3OBzV2fBGZ5TBfdW50cha1lHDVf9vlvRXnjpVbJBa20pSZQaSkMJZiwA8V2vD9ogyeXn8nU5s5A6mHyf5jhMzA==";
338 };
339 };
340 "@webpack-cli/info-1.2.3" = {
341 name = "_at_webpack-cli_slash_info";
342 packageName = "@webpack-cli/info";
343 version = "1.2.3";
344 src = fetchurl {
345 url = "https://registry.npmjs.org/@webpack-cli/info/-/info-1.2.3.tgz";
346 sha512 = "lLek3/T7u40lTqzCGpC6CAbY6+vXhdhmwFRxZLMnRm6/sIF/7qMpT8MocXCRQfz0JAh63wpbXLMnsQ5162WS7Q==";
347 };
348 };
349 "@webpack-cli/serve-1.3.1" = {
350 name = "_at_webpack-cli_slash_serve";
351 packageName = "@webpack-cli/serve";
352 version = "1.3.1";
353 src = fetchurl {
354 url = "https://registry.npmjs.org/@webpack-cli/serve/-/serve-1.3.1.tgz";
355 sha512 = "0qXvpeYO6vaNoRBI52/UsbcaBydJCggoBBnIo/ovQQdn6fug0BgwsjorV1hVS7fMqGVTZGcVxv8334gjmbj5hw==";
356 };
357 };
358 "@xtuc/ieee754-1.2.0" = {
359 name = "_at_xtuc_slash_ieee754";
360 packageName = "@xtuc/ieee754";
361 version = "1.2.0";
362 src = fetchurl {
363 url = "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz";
364 sha512 = "DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==";
365 };
366 };
367 "@xtuc/long-4.2.2" = {
368 name = "_at_xtuc_slash_long";
369 packageName = "@xtuc/long";
370 version = "4.2.2";
371 src = fetchurl {
372 url = "https://registry.npmjs.org/@xtuc/long/-/long-4.2.2.tgz";
373 sha512 = "NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==";
374 };
375 };
376 "abbrev-1.1.1" = {
377 name = "abbrev";
378 packageName = "abbrev";
379 version = "1.1.1";
380 src = fetchurl {
381 url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
382 sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
383 };
384 };
385 "acorn-7.4.1" = {
386 name = "acorn";
387 packageName = "acorn";
388 version = "7.4.1";
389 src = fetchurl {
390 url = "https://registry.npmjs.org/acorn/-/acorn-7.4.1.tgz";
391 sha512 = "nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==";
392 };
393 };
394 "acorn-8.1.1" = {
395 name = "acorn";
396 packageName = "acorn";
397 version = "8.1.1";
398 src = fetchurl {
399 url = "https://registry.npmjs.org/acorn/-/acorn-8.1.1.tgz";
400 sha512 = "xYiIVjNuqtKXMxlRMDc6mZUhXehod4a3gbZ1qRlM7icK4EbxUFNLhWoPblCvFtB2Y9CIqHP3CF/rdxLItaQv8g==";
401 };
402 };
403 "acorn-jsx-5.3.1" = {
404 name = "acorn-jsx";
405 packageName = "acorn-jsx";
406 version = "5.3.1";
407 src = fetchurl {
408 url = "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.1.tgz";
409 sha512 = "K0Ptm/47OKfQRpNQ2J/oIN/3QYiK6FwW+eJbILhsdxh2WTLdl+30o8aGdTbm5JbffpFFAg/g+zi1E+jvJha5ng==";
410 };
411 };
412 "ajv-6.12.6" = {
413 name = "ajv";
414 packageName = "ajv";
415 version = "6.12.6";
416 src = fetchurl {
417 url = "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz";
418 sha512 = "j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==";
419 };
420 };
421 "ajv-keywords-3.5.2" = {
422 name = "ajv-keywords";
423 packageName = "ajv-keywords";
424 version = "3.5.2";
425 src = fetchurl {
426 url = "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz";
427 sha512 = "5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==";
428 };
429 };
430 "ansi-colors-4.1.1" = {
431 name = "ansi-colors";
432 packageName = "ansi-colors";
433 version = "4.1.1";
434 src = fetchurl {
435 url = "https://registry.npmjs.org/ansi-colors/-/ansi-colors-4.1.1.tgz";
436 sha512 = "JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==";
437 };
438 };
439 "ansi-escapes-4.3.2" = {
440 name = "ansi-escapes";
441 packageName = "ansi-escapes";
442 version = "4.3.2";
443 src = fetchurl {
444 url = "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz";
445 sha512 = "gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==";
446 };
447 };
448 "ansi-regex-2.1.1" = {
449 name = "ansi-regex";
450 packageName = "ansi-regex";
451 version = "2.1.1";
452 src = fetchurl {
453 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
454 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
455 };
456 };
457 "ansi-regex-3.0.0" = {
458 name = "ansi-regex";
459 packageName = "ansi-regex";
460 version = "3.0.0";
461 src = fetchurl {
462 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz";
463 sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
464 };
465 };
466 "ansi-regex-4.1.0" = {
467 name = "ansi-regex";
468 packageName = "ansi-regex";
469 version = "4.1.0";
470 src = fetchurl {
471 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.0.tgz";
472 sha512 = "1apePfXM1UOSqw0o9IiFAovVz9M5S1Dg+4TrDwfMewQ6p/rmMueb7tWZjQ1rx4Loy1ArBggoqGpfqqdI4rondg==";
473 };
474 };
475 "ansi-regex-5.0.0" = {
476 name = "ansi-regex";
477 packageName = "ansi-regex";
478 version = "5.0.0";
479 src = fetchurl {
480 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.0.tgz";
481 sha512 = "bY6fj56OUQ0hU1KjFNDQuJFezqKdrAyFdIevADiqrWHwSlbmBNMHp5ak2f40Pm8JTFyM2mqxkG6ngkHO11f/lg==";
482 };
483 };
484 "ansi-styles-3.2.1" = {
485 name = "ansi-styles";
486 packageName = "ansi-styles";
487 version = "3.2.1";
488 src = fetchurl {
489 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";
490 sha512 = "VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==";
491 };
492 };
493 "ansi-styles-4.3.0" = {
494 name = "ansi-styles";
495 packageName = "ansi-styles";
496 version = "4.3.0";
497 src = fetchurl {
498 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz";
499 sha512 = "zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==";
500 };
501 };
502 "aproba-1.2.0" = {
503 name = "aproba";
504 packageName = "aproba";
505 version = "1.2.0";
506 src = fetchurl {
507 url = "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz";
508 sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
509 };
510 };
511 "are-we-there-yet-1.1.5" = {
512 name = "are-we-there-yet";
513 packageName = "are-we-there-yet";
514 version = "1.1.5";
515 src = fetchurl {
516 url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
517 sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==";
518 };
519 };
520 "argparse-1.0.10" = {
521 name = "argparse";
522 packageName = "argparse";
523 version = "1.0.10";
524 src = fetchurl {
525 url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz";
526 sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==";
527 };
528 };
529 "array-union-2.1.0" = {
530 name = "array-union";
531 packageName = "array-union";
532 version = "2.1.0";
533 src = fetchurl {
534 url = "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz";
535 sha512 = "HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==";
536 };
537 };
538 "asn1-0.2.4" = {
539 name = "asn1";
540 packageName = "asn1";
541 version = "0.2.4";
542 src = fetchurl {
543 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
544 sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
545 };
546 };
547 "assert-plus-1.0.0" = {
548 name = "assert-plus";
549 packageName = "assert-plus";
550 version = "1.0.0";
551 src = fetchurl {
552 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
553 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
554 };
555 };
556 "astral-regex-1.0.0" = {
557 name = "astral-regex";
558 packageName = "astral-regex";
559 version = "1.0.0";
560 src = fetchurl {
561 url = "https://registry.npmjs.org/astral-regex/-/astral-regex-1.0.0.tgz";
562 sha512 = "+Ryf6g3BKoRc7jfp7ad8tM4TtMiaWvbF/1/sQcZPkkS7ag3D5nMBCe2UfOTONtAkaG0tO0ij3C5Lwmf1EiyjHg==";
563 };
564 };
565 "asynckit-0.4.0" = {
566 name = "asynckit";
567 packageName = "asynckit";
568 version = "0.4.0";
569 src = fetchurl {
570 url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";
571 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
572 };
573 };
574 "aws-sign2-0.7.0" = {
575 name = "aws-sign2";
576 packageName = "aws-sign2";
577 version = "0.7.0";
578 src = fetchurl {
579 url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.7.0.tgz";
580 sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
581 };
582 };
583 "aws4-1.11.0" = {
584 name = "aws4";
585 packageName = "aws4";
586 version = "1.11.0";
587 src = fetchurl {
588 url = "https://registry.npmjs.org/aws4/-/aws4-1.11.0.tgz";
589 sha512 = "xh1Rl34h6Fi1DC2WWKfxUTVqRsNnr6LsKz2+hfwDxQJWmrx8+c7ylaqBMcHfl1U1r2dsifOvKX3LQuLNZ+XSvA==";
590 };
591 };
592 "balanced-match-1.0.2" = {
593 name = "balanced-match";
594 packageName = "balanced-match";
595 version = "1.0.2";
596 src = fetchurl {
597 url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz";
598 sha512 = "3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==";
599 };
600 };
601 "bcrypt-pbkdf-1.0.2" = {
602 name = "bcrypt-pbkdf";
603 packageName = "bcrypt-pbkdf";
604 version = "1.0.2";
605 src = fetchurl {
606 url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
607 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
608 };
609 };
610 "block-stream-0.0.9" = {
611 name = "block-stream";
612 packageName = "block-stream";
613 version = "0.0.9";
614 src = fetchurl {
615 url = "https://registry.npmjs.org/block-stream/-/block-stream-0.0.9.tgz";
616 sha1 = "13ebfe778a03205cfe03751481ebb4b3300c126a";
617 };
618 };
619 "brace-expansion-1.1.11" = {
620 name = "brace-expansion";
621 packageName = "brace-expansion";
622 version = "1.1.11";
623 src = fetchurl {
624 url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
625 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
626 };
627 };
628 "braces-3.0.2" = {
629 name = "braces";
630 packageName = "braces";
631 version = "3.0.2";
632 src = fetchurl {
633 url = "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz";
634 sha512 = "b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==";
635 };
636 };
637 "browserslist-4.16.4" = {
638 name = "browserslist";
639 packageName = "browserslist";
640 version = "4.16.4";
641 src = fetchurl {
642 url = "https://registry.npmjs.org/browserslist/-/browserslist-4.16.4.tgz";
643 sha512 = "d7rCxYV8I9kj41RH8UKYnvDYCRENUlHRgyXy/Rhr/1BaeLGfiCptEdFE8MIrvGfWbBFNjVYx76SQWvNX1j+/cQ==";
644 };
645 };
646 "buffer-from-1.1.1" = {
647 name = "buffer-from";
648 packageName = "buffer-from";
649 version = "1.1.1";
650 src = fetchurl {
651 url = "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz";
652 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
653 };
654 };
655 "buffer-writer-2.0.0" = {
656 name = "buffer-writer";
657 packageName = "buffer-writer";
658 version = "2.0.0";
659 src = fetchurl {
660 url = "https://registry.npmjs.org/buffer-writer/-/buffer-writer-2.0.0.tgz";
661 sha512 = "a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==";
662 };
663 };
664 "callsites-3.1.0" = {
665 name = "callsites";
666 packageName = "callsites";
667 version = "3.1.0";
668 src = fetchurl {
669 url = "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz";
670 sha512 = "P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==";
671 };
672 };
673 "caniuse-lite-1.0.30001209" = {
674 name = "caniuse-lite";
675 packageName = "caniuse-lite";
676 version = "1.0.30001209";
677 src = fetchurl {
678 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001209.tgz";
679 sha512 = "2Ktt4OeRM7EM/JaOZjuLzPYAIqmbwQMNnYbgooT+icoRGrKOyAxA1xhlnotBD1KArRSPsuJp3TdYcZYrL7qNxA==";
680 };
681 };
682 "caseless-0.12.0" = {
683 name = "caseless";
684 packageName = "caseless";
685 version = "0.12.0";
686 src = fetchurl {
687 url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
688 sha1 = "1b681c21ff84033c826543090689420d187151dc";
689 };
690 };
691 "chalk-2.4.2" = {
692 name = "chalk";
693 packageName = "chalk";
694 version = "2.4.2";
695 src = fetchurl {
696 url = "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz";
697 sha512 = "Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==";
698 };
699 };
700 "chalk-4.1.0" = {
701 name = "chalk";
702 packageName = "chalk";
703 version = "4.1.0";
704 src = fetchurl {
705 url = "https://registry.npmjs.org/chalk/-/chalk-4.1.0.tgz";
706 sha512 = "qwx12AxXe2Q5xQ43Ac//I6v5aXTipYrSESdOgzrN+9XjgEpyjpKuvSGaN4qE93f7TQTlerQQ8S+EQ0EyDoVL1A==";
707 };
708 };
709 "chardet-0.7.0" = {
710 name = "chardet";
711 packageName = "chardet";
712 version = "0.7.0";
713 src = fetchurl {
714 url = "https://registry.npmjs.org/chardet/-/chardet-0.7.0.tgz";
715 sha512 = "mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==";
716 };
717 };
718 "chownr-1.1.4" = {
719 name = "chownr";
720 packageName = "chownr";
721 version = "1.1.4";
722 src = fetchurl {
723 url = "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz";
724 sha512 = "jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==";
725 };
726 };
727 "chrome-trace-event-1.0.3" = {
728 name = "chrome-trace-event";
729 packageName = "chrome-trace-event";
730 version = "1.0.3";
731 src = fetchurl {
732 url = "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.3.tgz";
733 sha512 = "p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==";
734 };
735 };
736 "cli-cursor-3.1.0" = {
737 name = "cli-cursor";
738 packageName = "cli-cursor";
739 version = "3.1.0";
740 src = fetchurl {
741 url = "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz";
742 sha512 = "I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==";
743 };
744 };
745 "cli-width-3.0.0" = {
746 name = "cli-width";
747 packageName = "cli-width";
748 version = "3.0.0";
749 src = fetchurl {
750 url = "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz";
751 sha512 = "FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==";
752 };
753 };
754 "clone-deep-4.0.1" = {
755 name = "clone-deep";
756 packageName = "clone-deep";
757 version = "4.0.1";
758 src = fetchurl {
759 url = "https://registry.npmjs.org/clone-deep/-/clone-deep-4.0.1.tgz";
760 sha512 = "neHB9xuzh/wk0dIHweyAXv2aPGZIVk3pLMe+/RNzINf17fe0OG96QroktYAUm7SM1PBnzTabaLboqqxDyMU+SQ==";
761 };
762 };
763 "code-point-at-1.1.0" = {
764 name = "code-point-at";
765 packageName = "code-point-at";
766 version = "1.1.0";
767 src = fetchurl {
768 url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";
769 sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
770 };
771 };
772 "color-convert-1.9.3" = {
773 name = "color-convert";
774 packageName = "color-convert";
775 version = "1.9.3";
776 src = fetchurl {
777 url = "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz";
778 sha512 = "QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==";
779 };
780 };
781 "color-convert-2.0.1" = {
782 name = "color-convert";
783 packageName = "color-convert";
784 version = "2.0.1";
785 src = fetchurl {
786 url = "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz";
787 sha512 = "RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==";
788 };
789 };
790 "color-name-1.1.3" = {
791 name = "color-name";
792 packageName = "color-name";
793 version = "1.1.3";
794 src = fetchurl {
795 url = "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz";
796 sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
797 };
798 };
799 "color-name-1.1.4" = {
800 name = "color-name";
801 packageName = "color-name";
802 version = "1.1.4";
803 src = fetchurl {
804 url = "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz";
805 sha512 = "dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==";
806 };
807 };
808 "colorette-1.2.2" = {
809 name = "colorette";
810 packageName = "colorette";
811 version = "1.2.2";
812 src = fetchurl {
813 url = "https://registry.npmjs.org/colorette/-/colorette-1.2.2.tgz";
814 sha512 = "MKGMzyfeuutC/ZJ1cba9NqcNpfeqMUcYmyF1ZFY6/Cn7CNSAKx6a+s48sqLqyAiZuaP2TcqMhoo+dlwFnVxT9w==";
815 };
816 };
817 "combined-stream-1.0.8" = {
818 name = "combined-stream";
819 packageName = "combined-stream";
820 version = "1.0.8";
821 src = fetchurl {
822 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz";
823 sha512 = "FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==";
824 };
825 };
826 "commander-2.20.3" = {
827 name = "commander";
828 packageName = "commander";
829 version = "2.20.3";
830 src = fetchurl {
831 url = "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz";
832 sha512 = "GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==";
833 };
834 };
835 "commander-7.2.0" = {
836 name = "commander";
837 packageName = "commander";
838 version = "7.2.0";
839 src = fetchurl {
840 url = "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz";
841 sha512 = "QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==";
842 };
843 };
844 "compression-webpack-plugin-7.1.2" = {
845 name = "compression-webpack-plugin";
846 packageName = "compression-webpack-plugin";
847 version = "7.1.2";
848 src = fetchurl {
849 url = "https://registry.npmjs.org/compression-webpack-plugin/-/compression-webpack-plugin-7.1.2.tgz";
850 sha512 = "9DKNW6ILLjx+bNBoviHDgLx6swBhWWH9ApClC9sTH2NoFfQM47BapQfovCm9zjD9v1uZwInF5a925FB9ErGQeQ==";
851 };
852 };
853 "concat-map-0.0.1" = {
854 name = "concat-map";
855 packageName = "concat-map";
856 version = "0.0.1";
857 src = fetchurl {
858 url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
859 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
860 };
861 };
862 "config-chain-1.1.12" = {
863 name = "config-chain";
864 packageName = "config-chain";
865 version = "1.1.12";
866 src = fetchurl {
867 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz";
868 sha512 = "a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==";
869 };
870 };
871 "console-control-strings-1.1.0" = {
872 name = "console-control-strings";
873 packageName = "console-control-strings";
874 version = "1.1.0";
875 src = fetchurl {
876 url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";
877 sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
878 };
879 };
880 "console-stamp-3.0.0-rc4.2" = {
881 name = "console-stamp";
882 packageName = "console-stamp";
883 version = "3.0.0-rc4.2";
884 src = fetchurl {
885 url = "https://registry.npmjs.org/console-stamp/-/console-stamp-3.0.0-rc4.2.tgz";
886 sha512 = "ncGYdZsfDbBYYiaPXr9NHfZbSSkoVzYyh8nHji9/3ovw35Jn4ozo0btcirtfIznXT4xNgBQW+IyTVLISnNumdQ==";
887 };
888 };
889 "copy-anything-2.0.3" = {
890 name = "copy-anything";
891 packageName = "copy-anything";
892 version = "2.0.3";
893 src = fetchurl {
894 url = "https://registry.npmjs.org/copy-anything/-/copy-anything-2.0.3.tgz";
895 sha512 = "GK6QUtisv4fNS+XcI7shX0Gx9ORg7QqIznyfho79JTnX1XhLiyZHfftvGiziqzRiEi/Bjhgpi+D2o7HxJFPnDQ==";
896 };
897 };
898 "core-util-is-1.0.2" = {
899 name = "core-util-is";
900 packageName = "core-util-is";
901 version = "1.0.2";
902 src = fetchurl {
903 url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
904 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
905 };
906 };
907 "cross-spawn-6.0.5" = {
908 name = "cross-spawn";
909 packageName = "cross-spawn";
910 version = "6.0.5";
911 src = fetchurl {
912 url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";
913 sha512 = "eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==";
914 };
915 };
916 "cross-spawn-7.0.3" = {
917 name = "cross-spawn";
918 packageName = "cross-spawn";
919 version = "7.0.3";
920 src = fetchurl {
921 url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz";
922 sha512 = "iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==";
923 };
924 };
925 "dashdash-1.14.1" = {
926 name = "dashdash";
927 packageName = "dashdash";
928 version = "1.14.1";
929 src = fetchurl {
930 url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
931 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
932 };
933 };
934 "dateformat-3.0.3" = {
935 name = "dateformat";
936 packageName = "dateformat";
937 version = "3.0.3";
938 src = fetchurl {
939 url = "https://registry.npmjs.org/dateformat/-/dateformat-3.0.3.tgz";
940 sha512 = "jyCETtSl3VMZMWeRo7iY1FL19ges1t55hMo5yaam4Jrsm5EPL89UQkoQRyiI+Yf4k8r2ZpdngkV8hr1lIdjb3Q==";
941 };
942 };
943 "de-indent-1.0.2" = {
944 name = "de-indent";
945 packageName = "de-indent";
946 version = "1.0.2";
947 src = fetchurl {
948 url = "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz";
949 sha1 = "b2038e846dc33baa5796128d0804b455b8c1e21d";
950 };
951 };
952 "debug-3.2.7" = {
953 name = "debug";
954 packageName = "debug";
955 version = "3.2.7";
956 src = fetchurl {
957 url = "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz";
958 sha512 = "CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==";
959 };
960 };
961 "debug-4.3.1" = {
962 name = "debug";
963 packageName = "debug";
964 version = "4.3.1";
965 src = fetchurl {
966 url = "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz";
967 sha512 = "doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==";
968 };
969 };
970 "deep-extend-0.6.0" = {
971 name = "deep-extend";
972 packageName = "deep-extend";
973 version = "0.6.0";
974 src = fetchurl {
975 url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz";
976 sha512 = "LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==";
977 };
978 };
979 "deep-is-0.1.3" = {
980 name = "deep-is";
981 packageName = "deep-is";
982 version = "0.1.3";
983 src = fetchurl {
984 url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
985 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
986 };
987 };
988 "delayed-stream-1.0.0" = {
989 name = "delayed-stream";
990 packageName = "delayed-stream";
991 version = "1.0.0";
992 src = fetchurl {
993 url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
994 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
995 };
996 };
997 "delegates-1.0.0" = {
998 name = "delegates";
999 packageName = "delegates";
1000 version = "1.0.0";
1001 src = fetchurl {
1002 url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";
1003 sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
1004 };
1005 };
1006 "detect-libc-1.0.3" = {
1007 name = "detect-libc";
1008 packageName = "detect-libc";
1009 version = "1.0.3";
1010 src = fetchurl {
1011 url = "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz";
1012 sha1 = "fa137c4bd698edf55cd5cd02ac559f91a4c4ba9b";
1013 };
1014 };
1015 "dialog-polyfill-0.5.6" = {
1016 name = "dialog-polyfill";
1017 packageName = "dialog-polyfill";
1018 version = "0.5.6";
1019 src = fetchurl {
1020 url = "https://registry.npmjs.org/dialog-polyfill/-/dialog-polyfill-0.5.6.tgz";
1021 sha512 = "ZbVDJI9uvxPAKze6z146rmfUZjBqNEwcnFTVamQzXH+svluiV7swmVIGr7miwADgfgt1G2JQIytypM9fbyhX4w==";
1022 };
1023 };
1024 "dir-glob-3.0.1" = {
1025 name = "dir-glob";
1026 packageName = "dir-glob";
1027 version = "3.0.1";
1028 src = fetchurl {
1029 url = "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz";
1030 sha512 = "WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==";
1031 };
1032 };
1033 "doctrine-3.0.0" = {
1034 name = "doctrine";
1035 packageName = "doctrine";
1036 version = "3.0.0";
1037 src = fetchurl {
1038 url = "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz";
1039 sha512 = "yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==";
1040 };
1041 };
1042 "dotenv-8.2.0" = {
1043 name = "dotenv";
1044 packageName = "dotenv";
1045 version = "8.2.0";
1046 src = fetchurl {
1047 url = "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz";
1048 sha512 = "8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==";
1049 };
1050 };
1051 "ecc-jsbn-0.1.2" = {
1052 name = "ecc-jsbn";
1053 packageName = "ecc-jsbn";
1054 version = "0.1.2";
1055 src = fetchurl {
1056 url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
1057 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
1058 };
1059 };
1060 "editorconfig-0.15.3" = {
1061 name = "editorconfig";
1062 packageName = "editorconfig";
1063 version = "0.15.3";
1064 src = fetchurl {
1065 url = "https://registry.npmjs.org/editorconfig/-/editorconfig-0.15.3.tgz";
1066 sha512 = "M9wIMFx96vq0R4F+gRpY3o2exzb8hEj/n9S8unZtHSvYjibBp/iMufSzvmOcV/laG0ZtuTVGtiJggPOSW2r93g==";
1067 };
1068 };
1069 "electron-to-chromium-1.3.717" = {
1070 name = "electron-to-chromium";
1071 packageName = "electron-to-chromium";
1072 version = "1.3.717";
1073 src = fetchurl {
1074 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.717.tgz";
1075 sha512 = "OfzVPIqD1MkJ7fX+yTl2nKyOE4FReeVfMCzzxQS+Kp43hZYwHwThlGP+EGIZRXJsxCM7dqo8Y65NOX/HP12iXQ==";
1076 };
1077 };
1078 "emoji-regex-7.0.3" = {
1079 name = "emoji-regex";
1080 packageName = "emoji-regex";
1081 version = "7.0.3";
1082 src = fetchurl {
1083 url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-7.0.3.tgz";
1084 sha512 = "CwBLREIQ7LvYFB0WyRvwhq5N5qPhc6PMjD6bYggFlI5YyDgl+0vxq5VHbMOFqLg7hfWzmu8T5Z1QofhmTIhItA==";
1085 };
1086 };
1087 "emoji-regex-8.0.0" = {
1088 name = "emoji-regex";
1089 packageName = "emoji-regex";
1090 version = "8.0.0";
1091 src = fetchurl {
1092 url = "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz";
1093 sha512 = "MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==";
1094 };
1095 };
1096 "enhanced-resolve-5.7.0" = {
1097 name = "enhanced-resolve";
1098 packageName = "enhanced-resolve";
1099 version = "5.7.0";
1100 src = fetchurl {
1101 url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.7.0.tgz";
1102 sha512 = "6njwt/NsZFUKhM6j9U8hzVyD4E4r0x7NQzhTCbcWOJ0IQjNSAoalWmb0AE51Wn+fwan5qVESWi7t2ToBxs9vrw==";
1103 };
1104 };
1105 "enquirer-2.3.6" = {
1106 name = "enquirer";
1107 packageName = "enquirer";
1108 version = "2.3.6";
1109 src = fetchurl {
1110 url = "https://registry.npmjs.org/enquirer/-/enquirer-2.3.6.tgz";
1111 sha512 = "yjNnPr315/FjS4zIsUxYguYUPP2e1NK4d7E7ZOLiyYCcbFBiTMyID+2wvm2w6+pZ/odMA7cRkjhsPbltwBOrLg==";
1112 };
1113 };
1114 "envinfo-7.8.1" = {
1115 name = "envinfo";
1116 packageName = "envinfo";
1117 version = "7.8.1";
1118 src = fetchurl {
1119 url = "https://registry.npmjs.org/envinfo/-/envinfo-7.8.1.tgz";
1120 sha512 = "/o+BXHmB7ocbHEAs6F2EnG0ogybVVUdkRunTT2glZU9XAaGmhqskrvKwqXuDfNjEO0LZKWdejEEpnq8aM0tOaw==";
1121 };
1122 };
1123 "errno-0.1.8" = {
1124 name = "errno";
1125 packageName = "errno";
1126 version = "0.1.8";
1127 src = fetchurl {
1128 url = "https://registry.npmjs.org/errno/-/errno-0.1.8.tgz";
1129 sha512 = "dJ6oBr5SQ1VSd9qkk7ByRgb/1SH4JZjCHSW/mr63/QcXO9zLVxvJ6Oy13nio03rxpSnVDDjFor75SjVeZWPW/A==";
1130 };
1131 };
1132 "es-module-lexer-0.4.1" = {
1133 name = "es-module-lexer";
1134 packageName = "es-module-lexer";
1135 version = "0.4.1";
1136 src = fetchurl {
1137 url = "https://registry.npmjs.org/es-module-lexer/-/es-module-lexer-0.4.1.tgz";
1138 sha512 = "ooYciCUtfw6/d2w56UVeqHPcoCFAiJdz5XOkYpv/Txl1HMUozpXjz/2RIQgqwKdXNDPSF1W7mJCFse3G+HDyAA==";
1139 };
1140 };
1141 "escalade-3.1.1" = {
1142 name = "escalade";
1143 packageName = "escalade";
1144 version = "3.1.1";
1145 src = fetchurl {
1146 url = "https://registry.npmjs.org/escalade/-/escalade-3.1.1.tgz";
1147 sha512 = "k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==";
1148 };
1149 };
1150 "escape-string-regexp-1.0.5" = {
1151 name = "escape-string-regexp";
1152 packageName = "escape-string-regexp";
1153 version = "1.0.5";
1154 src = fetchurl {
1155 url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
1156 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
1157 };
1158 };
1159 "eslint-6.8.0" = {
1160 name = "eslint";
1161 packageName = "eslint";
1162 version = "6.8.0";
1163 src = fetchurl {
1164 url = "https://registry.npmjs.org/eslint/-/eslint-6.8.0.tgz";
1165 sha512 = "K+Iayyo2LtyYhDSYwz5D5QdWw0hCacNzyq1Y821Xna2xSJj7cijoLLYmLxTQgcgZ9mC61nryMy9S7GRbYpI5Ig==";
1166 };
1167 };
1168 "eslint-config-google-0.14.0" = {
1169 name = "eslint-config-google";
1170 packageName = "eslint-config-google";
1171 version = "0.14.0";
1172 src = fetchurl {
1173 url = "https://registry.npmjs.org/eslint-config-google/-/eslint-config-google-0.14.0.tgz";
1174 sha512 = "WsbX4WbjuMvTdeVL6+J3rK1RGhCTqjsFjX7UMSMgZiyxxaNLkoJENbrGExzERFeoTpGw3F3FypTiWAP9ZXzkEw==";
1175 };
1176 };
1177 "eslint-plugin-vue-6.2.2" = {
1178 name = "eslint-plugin-vue";
1179 packageName = "eslint-plugin-vue";
1180 version = "6.2.2";
1181 src = fetchurl {
1182 url = "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz";
1183 sha512 = "Nhc+oVAHm0uz/PkJAWscwIT4ijTrK5fqNqz9QB1D35SbbuMG1uB6Yr5AJpvPSWg+WOw7nYNswerYh0kOk64gqQ==";
1184 };
1185 };
1186 "eslint-scope-5.1.1" = {
1187 name = "eslint-scope";
1188 packageName = "eslint-scope";
1189 version = "5.1.1";
1190 src = fetchurl {
1191 url = "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz";
1192 sha512 = "2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==";
1193 };
1194 };
1195 "eslint-utils-1.4.3" = {
1196 name = "eslint-utils";
1197 packageName = "eslint-utils";
1198 version = "1.4.3";
1199 src = fetchurl {
1200 url = "https://registry.npmjs.org/eslint-utils/-/eslint-utils-1.4.3.tgz";
1201 sha512 = "fbBN5W2xdY45KulGXmLHZ3c3FHfVYmKg0IrAKGOkT/464PQsx2UeIzfz1RmEci+KLm1bBaAzZAh8+/E+XAeZ8Q==";
1202 };
1203 };
1204 "eslint-utils-2.1.0" = {
1205 name = "eslint-utils";
1206 packageName = "eslint-utils";
1207 version = "2.1.0";
1208 src = fetchurl {
1209 url = "https://registry.npmjs.org/eslint-utils/-/eslint-utils-2.1.0.tgz";
1210 sha512 = "w94dQYoauyvlDc43XnGB8lU3Zt713vNChgt4EWwhXAP2XkBvndfxF0AgIqKOOasjPIPzj9JqgwkwbCYD0/V3Zg==";
1211 };
1212 };
1213 "eslint-visitor-keys-1.3.0" = {
1214 name = "eslint-visitor-keys";
1215 packageName = "eslint-visitor-keys";
1216 version = "1.3.0";
1217 src = fetchurl {
1218 url = "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-1.3.0.tgz";
1219 sha512 = "6J72N8UNa462wa/KFODt/PJ3IU60SDpC3QXC1Hjc1BXXpfL2C9R5+AU7jhe0F6GREqVMh4Juu+NY7xn+6dipUQ==";
1220 };
1221 };
1222 "eslint-visitor-keys-2.0.0" = {
1223 name = "eslint-visitor-keys";
1224 packageName = "eslint-visitor-keys";
1225 version = "2.0.0";
1226 src = fetchurl {
1227 url = "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.0.0.tgz";
1228 sha512 = "QudtT6av5WXels9WjIM7qz1XD1cWGvX4gGXvp/zBn9nXG02D0utdU3Em2m/QjTnrsk6bBjmCygl3rmj118msQQ==";
1229 };
1230 };
1231 "espree-6.2.1" = {
1232 name = "espree";
1233 packageName = "espree";
1234 version = "6.2.1";
1235 src = fetchurl {
1236 url = "https://registry.npmjs.org/espree/-/espree-6.2.1.tgz";
1237 sha512 = "ysCxRQY3WaXJz9tdbWOwuWr5Y/XrPTGX9Kiz3yoUXwW0VZ4w30HTkQLaGx/+ttFjF8i+ACbArnB4ce68a9m5hw==";
1238 };
1239 };
1240 "esprima-4.0.1" = {
1241 name = "esprima";
1242 packageName = "esprima";
1243 version = "4.0.1";
1244 src = fetchurl {
1245 url = "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz";
1246 sha512 = "eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==";
1247 };
1248 };
1249 "esquery-1.4.0" = {
1250 name = "esquery";
1251 packageName = "esquery";
1252 version = "1.4.0";
1253 src = fetchurl {
1254 url = "https://registry.npmjs.org/esquery/-/esquery-1.4.0.tgz";
1255 sha512 = "cCDispWt5vHHtwMY2YrAQ4ibFkAL8RbH5YGBnZBc90MolvvfkkQcJro/aZiAQUlQ3qgrYS6D6v8Gc5G5CQsc9w==";
1256 };
1257 };
1258 "esrecurse-4.3.0" = {
1259 name = "esrecurse";
1260 packageName = "esrecurse";
1261 version = "4.3.0";
1262 src = fetchurl {
1263 url = "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz";
1264 sha512 = "KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==";
1265 };
1266 };
1267 "estraverse-4.3.0" = {
1268 name = "estraverse";
1269 packageName = "estraverse";
1270 version = "4.3.0";
1271 src = fetchurl {
1272 url = "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz";
1273 sha512 = "39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==";
1274 };
1275 };
1276 "estraverse-5.2.0" = {
1277 name = "estraverse";
1278 packageName = "estraverse";
1279 version = "5.2.0";
1280 src = fetchurl {
1281 url = "https://registry.npmjs.org/estraverse/-/estraverse-5.2.0.tgz";
1282 sha512 = "BxbNGGNm0RyRYvUdHpIwv9IWzeM9XClbOxwoATuFdOE7ZE6wHL+HQ5T8hoPM+zHvmKzzsEqhgy0GrQ5X13afiQ==";
1283 };
1284 };
1285 "esutils-2.0.3" = {
1286 name = "esutils";
1287 packageName = "esutils";
1288 version = "2.0.3";
1289 src = fetchurl {
1290 url = "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz";
1291 sha512 = "kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==";
1292 };
1293 };
1294 "events-3.3.0" = {
1295 name = "events";
1296 packageName = "events";
1297 version = "3.3.0";
1298 src = fetchurl {
1299 url = "https://registry.npmjs.org/events/-/events-3.3.0.tgz";
1300 sha512 = "mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==";
1301 };
1302 };
1303 "execa-5.0.0" = {
1304 name = "execa";
1305 packageName = "execa";
1306 version = "5.0.0";
1307 src = fetchurl {
1308 url = "https://registry.npmjs.org/execa/-/execa-5.0.0.tgz";
1309 sha512 = "ov6w/2LCiuyO4RLYGdpFGjkcs0wMTgGE8PrkTHikeUy5iJekXyPIKUjifk5CsE0pt7sMCrMZ3YNqoCj6idQOnQ==";
1310 };
1311 };
1312 "extend-3.0.2" = {
1313 name = "extend";
1314 packageName = "extend";
1315 version = "3.0.2";
1316 src = fetchurl {
1317 url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
1318 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
1319 };
1320 };
1321 "external-editor-3.1.0" = {
1322 name = "external-editor";
1323 packageName = "external-editor";
1324 version = "3.1.0";
1325 src = fetchurl {
1326 url = "https://registry.npmjs.org/external-editor/-/external-editor-3.1.0.tgz";
1327 sha512 = "hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==";
1328 };
1329 };
1330 "extsprintf-1.3.0" = {
1331 name = "extsprintf";
1332 packageName = "extsprintf";
1333 version = "1.3.0";
1334 src = fetchurl {
1335 url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
1336 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
1337 };
1338 };
1339 "fast-deep-equal-3.1.3" = {
1340 name = "fast-deep-equal";
1341 packageName = "fast-deep-equal";
1342 version = "3.1.3";
1343 src = fetchurl {
1344 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz";
1345 sha512 = "f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==";
1346 };
1347 };
1348 "fast-glob-3.2.5" = {
1349 name = "fast-glob";
1350 packageName = "fast-glob";
1351 version = "3.2.5";
1352 src = fetchurl {
1353 url = "https://registry.npmjs.org/fast-glob/-/fast-glob-3.2.5.tgz";
1354 sha512 = "2DtFcgT68wiTTiwZ2hNdJfcHNke9XOfnwmBRWXhmeKM8rF0TGwmC/Qto3S7RoZKp5cilZbxzO5iTNTQsJ+EeDg==";
1355 };
1356 };
1357 "fast-json-stable-stringify-2.1.0" = {
1358 name = "fast-json-stable-stringify";
1359 packageName = "fast-json-stable-stringify";
1360 version = "2.1.0";
1361 src = fetchurl {
1362 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
1363 sha512 = "lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==";
1364 };
1365 };
1366 "fast-levenshtein-2.0.6" = {
1367 name = "fast-levenshtein";
1368 packageName = "fast-levenshtein";
1369 version = "2.0.6";
1370 src = fetchurl {
1371 url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
1372 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
1373 };
1374 };
1375 "fastest-levenshtein-1.0.12" = {
1376 name = "fastest-levenshtein";
1377 packageName = "fastest-levenshtein";
1378 version = "1.0.12";
1379 src = fetchurl {
1380 url = "https://registry.npmjs.org/fastest-levenshtein/-/fastest-levenshtein-1.0.12.tgz";
1381 sha512 = "On2N+BpYJ15xIC974QNVuYGMOlEVt4s0EOI3wwMqOmK1fdDY+FN/zltPV8vosq4ad4c/gJ1KHScUn/6AWIgiow==";
1382 };
1383 };
1384 "fastq-1.11.0" = {
1385 name = "fastq";
1386 packageName = "fastq";
1387 version = "1.11.0";
1388 src = fetchurl {
1389 url = "https://registry.npmjs.org/fastq/-/fastq-1.11.0.tgz";
1390 sha512 = "7Eczs8gIPDrVzT+EksYBcupqMyxSHXXrHOLRRxU2/DicV8789MRBRR8+Hc2uWzUupOs4YS4JzBmBxjjCVBxD/g==";
1391 };
1392 };
1393 "figures-3.2.0" = {
1394 name = "figures";
1395 packageName = "figures";
1396 version = "3.2.0";
1397 src = fetchurl {
1398 url = "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz";
1399 sha512 = "yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==";
1400 };
1401 };
1402 "file-entry-cache-5.0.1" = {
1403 name = "file-entry-cache";
1404 packageName = "file-entry-cache";
1405 version = "5.0.1";
1406 src = fetchurl {
1407 url = "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-5.0.1.tgz";
1408 sha512 = "bCg29ictuBaKUwwArK4ouCaqDgLZcysCFLmM/Yn/FDoqndh/9vNuQfXRDvTuXKLxfD/JtZQGKFT8MGcJBK644g==";
1409 };
1410 };
1411 "fill-range-7.0.1" = {
1412 name = "fill-range";
1413 packageName = "fill-range";
1414 version = "7.0.1";
1415 src = fetchurl {
1416 url = "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz";
1417 sha512 = "qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==";
1418 };
1419 };
1420 "find-up-4.1.0" = {
1421 name = "find-up";
1422 packageName = "find-up";
1423 version = "4.1.0";
1424 src = fetchurl {
1425 url = "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz";
1426 sha512 = "PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==";
1427 };
1428 };
1429 "flat-cache-2.0.1" = {
1430 name = "flat-cache";
1431 packageName = "flat-cache";
1432 version = "2.0.1";
1433 src = fetchurl {
1434 url = "https://registry.npmjs.org/flat-cache/-/flat-cache-2.0.1.tgz";
1435 sha512 = "LoQe6yDuUMDzQAEH8sgmh4Md6oZnc/7PjtwjNFSzveXqSHt6ka9fPBuso7IGf9Rz4uqnSnWiFH2B/zj24a5ReA==";
1436 };
1437 };
1438 "flatted-2.0.2" = {
1439 name = "flatted";
1440 packageName = "flatted";
1441 version = "2.0.2";
1442 src = fetchurl {
1443 url = "https://registry.npmjs.org/flatted/-/flatted-2.0.2.tgz";
1444 sha512 = "r5wGx7YeOwNWNlCA0wQ86zKyDLMQr+/RB8xy74M4hTphfmjlijTSSXGuH8rnvKZnfT9i+75zmd8jcKdMR4O6jA==";
1445 };
1446 };
1447 "forever-agent-0.6.1" = {
1448 name = "forever-agent";
1449 packageName = "forever-agent";
1450 version = "0.6.1";
1451 src = fetchurl {
1452 url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
1453 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
1454 };
1455 };
1456 "form-data-2.3.3" = {
1457 name = "form-data";
1458 packageName = "form-data";
1459 version = "2.3.3";
1460 src = fetchurl {
1461 url = "https://registry.npmjs.org/form-data/-/form-data-2.3.3.tgz";
1462 sha512 = "1lLKB2Mu3aGP1Q/2eCOx0fNbRMe7XdwktwOruhfqqd0rIJWwN4Dh+E3hrPSlDCXnSR7UtZ1N38rVXm+6+MEhJQ==";
1463 };
1464 };
1465 "fs-minipass-1.2.7" = {
1466 name = "fs-minipass";
1467 packageName = "fs-minipass";
1468 version = "1.2.7";
1469 src = fetchurl {
1470 url = "https://registry.npmjs.org/fs-minipass/-/fs-minipass-1.2.7.tgz";
1471 sha512 = "GWSSJGFy4e9GUeCcbIkED+bgAoFyj7XF1mV8rma3QW4NIqX9Kyx79N/PF61H5udOV3aY1IaMLs6pGbH71nlCTA==";
1472 };
1473 };
1474 "fs.realpath-1.0.0" = {
1475 name = "fs.realpath";
1476 packageName = "fs.realpath";
1477 version = "1.0.0";
1478 src = fetchurl {
1479 url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
1480 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
1481 };
1482 };
1483 "fstream-1.0.12" = {
1484 name = "fstream";
1485 packageName = "fstream";
1486 version = "1.0.12";
1487 src = fetchurl {
1488 url = "https://registry.npmjs.org/fstream/-/fstream-1.0.12.tgz";
1489 sha512 = "WvJ193OHa0GHPEL+AycEJgxvBEwyfRkN1vhjca23OaPVMCaLCXTd5qAu82AjTcgP1UJmytkOKb63Ypde7raDIg==";
1490 };
1491 };
1492 "function-bind-1.1.1" = {
1493 name = "function-bind";
1494 packageName = "function-bind";
1495 version = "1.1.1";
1496 src = fetchurl {
1497 url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz";
1498 sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==";
1499 };
1500 };
1501 "functional-red-black-tree-1.0.1" = {
1502 name = "functional-red-black-tree";
1503 packageName = "functional-red-black-tree";
1504 version = "1.0.1";
1505 src = fetchurl {
1506 url = "https://registry.npmjs.org/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz";
1507 sha1 = "1b0ab3bd553b2a0d6399d29c0e3ea0b252078327";
1508 };
1509 };
1510 "gauge-2.7.4" = {
1511 name = "gauge";
1512 packageName = "gauge";
1513 version = "2.7.4";
1514 src = fetchurl {
1515 url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";
1516 sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
1517 };
1518 };
1519 "get-stream-6.0.1" = {
1520 name = "get-stream";
1521 packageName = "get-stream";
1522 version = "6.0.1";
1523 src = fetchurl {
1524 url = "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz";
1525 sha512 = "ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==";
1526 };
1527 };
1528 "getpass-0.1.7" = {
1529 name = "getpass";
1530 packageName = "getpass";
1531 version = "0.1.7";
1532 src = fetchurl {
1533 url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
1534 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
1535 };
1536 };
1537 "glob-7.1.6" = {
1538 name = "glob";
1539 packageName = "glob";
1540 version = "7.1.6";
1541 src = fetchurl {
1542 url = "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz";
1543 sha512 = "LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==";
1544 };
1545 };
1546 "glob-parent-5.1.2" = {
1547 name = "glob-parent";
1548 packageName = "glob-parent";
1549 version = "5.1.2";
1550 src = fetchurl {
1551 url = "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz";
1552 sha512 = "AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==";
1553 };
1554 };
1555 "glob-to-regexp-0.4.1" = {
1556 name = "glob-to-regexp";
1557 packageName = "glob-to-regexp";
1558 version = "0.4.1";
1559 src = fetchurl {
1560 url = "https://registry.npmjs.org/glob-to-regexp/-/glob-to-regexp-0.4.1.tgz";
1561 sha512 = "lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==";
1562 };
1563 };
1564 "globals-12.4.0" = {
1565 name = "globals";
1566 packageName = "globals";
1567 version = "12.4.0";
1568 src = fetchurl {
1569 url = "https://registry.npmjs.org/globals/-/globals-12.4.0.tgz";
1570 sha512 = "BWICuzzDvDoH54NHKCseDanAhE3CeDorgDL5MT6LMXXj2WCnd9UC2szdk4AWLfjdgNBCXLUanXYcpBBKOSWGwg==";
1571 };
1572 };
1573 "globby-11.0.3" = {
1574 name = "globby";
1575 packageName = "globby";
1576 version = "11.0.3";
1577 src = fetchurl {
1578 url = "https://registry.npmjs.org/globby/-/globby-11.0.3.tgz";
1579 sha512 = "ffdmosjA807y7+lA1NM0jELARVmYul/715xiILEjo3hBLPTcirgQNnXECn5g3mtR8TOLCVbkfua1Hpen25/Xcg==";
1580 };
1581 };
1582 "graceful-fs-4.2.6" = {
1583 name = "graceful-fs";
1584 packageName = "graceful-fs";
1585 version = "4.2.6";
1586 src = fetchurl {
1587 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.6.tgz";
1588 sha512 = "nTnJ528pbqxYanhpDYsi4Rd8MAeaBA67+RZ10CM1m3bTAVFEDcd5AuA4a6W5YkGZ1iNXHzZz8T6TBKLeBuNriQ==";
1589 };
1590 };
1591 "har-schema-2.0.0" = {
1592 name = "har-schema";
1593 packageName = "har-schema";
1594 version = "2.0.0";
1595 src = fetchurl {
1596 url = "https://registry.npmjs.org/har-schema/-/har-schema-2.0.0.tgz";
1597 sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
1598 };
1599 };
1600 "har-validator-5.1.5" = {
1601 name = "har-validator";
1602 packageName = "har-validator";
1603 version = "5.1.5";
1604 src = fetchurl {
1605 url = "https://registry.npmjs.org/har-validator/-/har-validator-5.1.5.tgz";
1606 sha512 = "nmT2T0lljbxdQZfspsno9hgrG3Uir6Ks5afism62poxqBM6sDnMEuPmzTq8XN0OEwqKLLdh1jQI3qyE66Nzb3w==";
1607 };
1608 };
1609 "has-1.0.3" = {
1610 name = "has";
1611 packageName = "has";
1612 version = "1.0.3";
1613 src = fetchurl {
1614 url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz";
1615 sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==";
1616 };
1617 };
1618 "has-flag-3.0.0" = {
1619 name = "has-flag";
1620 packageName = "has-flag";
1621 version = "3.0.0";
1622 src = fetchurl {
1623 url = "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz";
1624 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
1625 };
1626 };
1627 "has-flag-4.0.0" = {
1628 name = "has-flag";
1629 packageName = "has-flag";
1630 version = "4.0.0";
1631 src = fetchurl {
1632 url = "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz";
1633 sha512 = "EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==";
1634 };
1635 };
1636 "has-unicode-2.0.1" = {
1637 name = "has-unicode";
1638 packageName = "has-unicode";
1639 version = "2.0.1";
1640 src = fetchurl {
1641 url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";
1642 sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
1643 };
1644 };
1645 "he-1.2.0" = {
1646 name = "he";
1647 packageName = "he";
1648 version = "1.2.0";
1649 src = fetchurl {
1650 url = "https://registry.npmjs.org/he/-/he-1.2.0.tgz";
1651 sha512 = "F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==";
1652 };
1653 };
1654 "http-signature-1.2.0" = {
1655 name = "http-signature";
1656 packageName = "http-signature";
1657 version = "1.2.0";
1658 src = fetchurl {
1659 url = "https://registry.npmjs.org/http-signature/-/http-signature-1.2.0.tgz";
1660 sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
1661 };
1662 };
1663 "human-signals-2.1.0" = {
1664 name = "human-signals";
1665 packageName = "human-signals";
1666 version = "2.1.0";
1667 src = fetchurl {
1668 url = "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz";
1669 sha512 = "B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==";
1670 };
1671 };
1672 "iconv-lite-0.4.24" = {
1673 name = "iconv-lite";
1674 packageName = "iconv-lite";
1675 version = "0.4.24";
1676 src = fetchurl {
1677 url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz";
1678 sha512 = "v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==";
1679 };
1680 };
1681 "ignore-4.0.6" = {
1682 name = "ignore";
1683 packageName = "ignore";
1684 version = "4.0.6";
1685 src = fetchurl {
1686 url = "https://registry.npmjs.org/ignore/-/ignore-4.0.6.tgz";
1687 sha512 = "cyFDKrqc/YdcWFniJhzI42+AzS+gNwmUzOSFcRCQYwySuBBBy/KjuxWLZ/FHEH6Moq1NizMOBWyTcv8O4OZIMg==";
1688 };
1689 };
1690 "ignore-5.1.8" = {
1691 name = "ignore";
1692 packageName = "ignore";
1693 version = "5.1.8";
1694 src = fetchurl {
1695 url = "https://registry.npmjs.org/ignore/-/ignore-5.1.8.tgz";
1696 sha512 = "BMpfD7PpiETpBl/A6S498BaIJ6Y/ABT93ETbby2fP00v4EbvPBXWEoaR1UBPKs3iR53pJY7EtZk5KACI57i1Uw==";
1697 };
1698 };
1699 "ignore-walk-3.0.3" = {
1700 name = "ignore-walk";
1701 packageName = "ignore-walk";
1702 version = "3.0.3";
1703 src = fetchurl {
1704 url = "https://registry.npmjs.org/ignore-walk/-/ignore-walk-3.0.3.tgz";
1705 sha512 = "m7o6xuOaT1aqheYHKf8W6J5pYH85ZI9w077erOzLje3JsB1gkafkAhHHY19dqjulgIZHFm32Cp5uNZgcQqdJKw==";
1706 };
1707 };
1708 "image-size-0.5.5" = {
1709 name = "image-size";
1710 packageName = "image-size";
1711 version = "0.5.5";
1712 src = fetchurl {
1713 url = "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz";
1714 sha1 = "09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c";
1715 };
1716 };
1717 "import-fresh-3.3.0" = {
1718 name = "import-fresh";
1719 packageName = "import-fresh";
1720 version = "3.3.0";
1721 src = fetchurl {
1722 url = "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz";
1723 sha512 = "veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==";
1724 };
1725 };
1726 "import-local-3.0.2" = {
1727 name = "import-local";
1728 packageName = "import-local";
1729 version = "3.0.2";
1730 src = fetchurl {
1731 url = "https://registry.npmjs.org/import-local/-/import-local-3.0.2.tgz";
1732 sha512 = "vjL3+w0oulAVZ0hBHnxa/Nm5TAurf9YLQJDhqRZyqb+VKGOB6LU8t9H1Nr5CIo16vh9XfJTOoHwU0B71S557gA==";
1733 };
1734 };
1735 "imurmurhash-0.1.4" = {
1736 name = "imurmurhash";
1737 packageName = "imurmurhash";
1738 version = "0.1.4";
1739 src = fetchurl {
1740 url = "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz";
1741 sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea";
1742 };
1743 };
1744 "inflight-1.0.6" = {
1745 name = "inflight";
1746 packageName = "inflight";
1747 version = "1.0.6";
1748 src = fetchurl {
1749 url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
1750 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
1751 };
1752 };
1753 "inherits-2.0.4" = {
1754 name = "inherits";
1755 packageName = "inherits";
1756 version = "2.0.4";
1757 src = fetchurl {
1758 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz";
1759 sha512 = "k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==";
1760 };
1761 };
1762 "ini-1.3.8" = {
1763 name = "ini";
1764 packageName = "ini";
1765 version = "1.3.8";
1766 src = fetchurl {
1767 url = "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz";
1768 sha512 = "JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew==";
1769 };
1770 };
1771 "inquirer-7.3.3" = {
1772 name = "inquirer";
1773 packageName = "inquirer";
1774 version = "7.3.3";
1775 src = fetchurl {
1776 url = "https://registry.npmjs.org/inquirer/-/inquirer-7.3.3.tgz";
1777 sha512 = "JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==";
1778 };
1779 };
1780 "interpret-2.2.0" = {
1781 name = "interpret";
1782 packageName = "interpret";
1783 version = "2.2.0";
1784 src = fetchurl {
1785 url = "https://registry.npmjs.org/interpret/-/interpret-2.2.0.tgz";
1786 sha512 = "Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==";
1787 };
1788 };
1789 "is-core-module-2.2.0" = {
1790 name = "is-core-module";
1791 packageName = "is-core-module";
1792 version = "2.2.0";
1793 src = fetchurl {
1794 url = "https://registry.npmjs.org/is-core-module/-/is-core-module-2.2.0.tgz";
1795 sha512 = "XRAfAdyyY5F5cOXn7hYQDqh2Xmii+DEfIcQGxK/uNwMHhIkPWO0g8msXcbzLe+MpGoR951MlqM/2iIlU4vKDdQ==";
1796 };
1797 };
1798 "is-extglob-2.1.1" = {
1799 name = "is-extglob";
1800 packageName = "is-extglob";
1801 version = "2.1.1";
1802 src = fetchurl {
1803 url = "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz";
1804 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
1805 };
1806 };
1807 "is-fullwidth-code-point-1.0.0" = {
1808 name = "is-fullwidth-code-point";
1809 packageName = "is-fullwidth-code-point";
1810 version = "1.0.0";
1811 src = fetchurl {
1812 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
1813 sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
1814 };
1815 };
1816 "is-fullwidth-code-point-2.0.0" = {
1817 name = "is-fullwidth-code-point";
1818 packageName = "is-fullwidth-code-point";
1819 version = "2.0.0";
1820 src = fetchurl {
1821 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
1822 sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
1823 };
1824 };
1825 "is-fullwidth-code-point-3.0.0" = {
1826 name = "is-fullwidth-code-point";
1827 packageName = "is-fullwidth-code-point";
1828 version = "3.0.0";
1829 src = fetchurl {
1830 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz";
1831 sha512 = "zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==";
1832 };
1833 };
1834 "is-glob-4.0.1" = {
1835 name = "is-glob";
1836 packageName = "is-glob";
1837 version = "4.0.1";
1838 src = fetchurl {
1839 url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.1.tgz";
1840 sha512 = "5G0tKtBTFImOqDnLB2hG6Bp2qcKEFduo4tZu9MT/H6NQv/ghhy30o55ufafxJ/LdH79LLs2Kfrn85TLKyA7BUg==";
1841 };
1842 };
1843 "is-number-7.0.0" = {
1844 name = "is-number";
1845 packageName = "is-number";
1846 version = "7.0.0";
1847 src = fetchurl {
1848 url = "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz";
1849 sha512 = "41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==";
1850 };
1851 };
1852 "is-plain-object-2.0.4" = {
1853 name = "is-plain-object";
1854 packageName = "is-plain-object";
1855 version = "2.0.4";
1856 src = fetchurl {
1857 url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz";
1858 sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
1859 };
1860 };
1861 "is-stream-2.0.0" = {
1862 name = "is-stream";
1863 packageName = "is-stream";
1864 version = "2.0.0";
1865 src = fetchurl {
1866 url = "https://registry.npmjs.org/is-stream/-/is-stream-2.0.0.tgz";
1867 sha512 = "XCoy+WlUr7d1+Z8GgSuXmpuUFC9fOhRXglJMx+dwLKTkL44Cjd4W1Z5P+BQZpr+cR93aGP4S/s7Ftw6Nd/kiEw==";
1868 };
1869 };
1870 "is-typedarray-1.0.0" = {
1871 name = "is-typedarray";
1872 packageName = "is-typedarray";
1873 version = "1.0.0";
1874 src = fetchurl {
1875 url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
1876 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
1877 };
1878 };
1879 "is-what-3.14.1" = {
1880 name = "is-what";
1881 packageName = "is-what";
1882 version = "3.14.1";
1883 src = fetchurl {
1884 url = "https://registry.npmjs.org/is-what/-/is-what-3.14.1.tgz";
1885 sha512 = "sNxgpk9793nzSs7bA6JQJGeIuRBQhAaNGG77kzYQgMkrID+lS6SlK07K5LaptscDlSaIgH+GPFzf+d75FVxozA==";
1886 };
1887 };
1888 "isarray-1.0.0" = {
1889 name = "isarray";
1890 packageName = "isarray";
1891 version = "1.0.0";
1892 src = fetchurl {
1893 url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
1894 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
1895 };
1896 };
1897 "isexe-2.0.0" = {
1898 name = "isexe";
1899 packageName = "isexe";
1900 version = "2.0.0";
1901 src = fetchurl {
1902 url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";
1903 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
1904 };
1905 };
1906 "isobject-3.0.1" = {
1907 name = "isobject";
1908 packageName = "isobject";
1909 version = "3.0.1";
1910 src = fetchurl {
1911 url = "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz";
1912 sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
1913 };
1914 };
1915 "isstream-0.1.2" = {
1916 name = "isstream";
1917 packageName = "isstream";
1918 version = "0.1.2";
1919 src = fetchurl {
1920 url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
1921 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
1922 };
1923 };
1924 "jest-worker-26.6.2" = {
1925 name = "jest-worker";
1926 packageName = "jest-worker";
1927 version = "26.6.2";
1928 src = fetchurl {
1929 url = "https://registry.npmjs.org/jest-worker/-/jest-worker-26.6.2.tgz";
1930 sha512 = "KWYVV1c4i+jbMpaBC+U++4Va0cp8OisU185o73T1vo99hqi7w8tSJfUXYswwqqrjzwxa6KpRK54WhPvwf5w6PQ==";
1931 };
1932 };
1933 "js-beautify-1.13.13" = {
1934 name = "js-beautify";
1935 packageName = "js-beautify";
1936 version = "1.13.13";
1937 src = fetchurl {
1938 url = "https://registry.npmjs.org/js-beautify/-/js-beautify-1.13.13.tgz";
1939 sha512 = "oH+nc0U5mOAqX8M5JO1J0Pw/7Q35sAdOsM5W3i87pir9Ntx6P/5Gx1xLNoK+MGyvHk4rqqRCE4Oq58H6xl2W7A==";
1940 };
1941 };
1942 "js-tokens-4.0.0" = {
1943 name = "js-tokens";
1944 packageName = "js-tokens";
1945 version = "4.0.0";
1946 src = fetchurl {
1947 url = "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz";
1948 sha512 = "RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==";
1949 };
1950 };
1951 "js-yaml-3.14.1" = {
1952 name = "js-yaml";
1953 packageName = "js-yaml";
1954 version = "3.14.1";
1955 src = fetchurl {
1956 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz";
1957 sha512 = "okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==";
1958 };
1959 };
1960 "jsbn-0.1.1" = {
1961 name = "jsbn";
1962 packageName = "jsbn";
1963 version = "0.1.1";
1964 src = fetchurl {
1965 url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
1966 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
1967 };
1968 };
1969 "json-parse-better-errors-1.0.2" = {
1970 name = "json-parse-better-errors";
1971 packageName = "json-parse-better-errors";
1972 version = "1.0.2";
1973 src = fetchurl {
1974 url = "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
1975 sha512 = "mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==";
1976 };
1977 };
1978 "json-schema-0.2.3" = {
1979 name = "json-schema";
1980 packageName = "json-schema";
1981 version = "0.2.3";
1982 src = fetchurl {
1983 url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
1984 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
1985 };
1986 };
1987 "json-schema-traverse-0.4.1" = {
1988 name = "json-schema-traverse";
1989 packageName = "json-schema-traverse";
1990 version = "0.4.1";
1991 src = fetchurl {
1992 url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
1993 sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
1994 };
1995 };
1996 "json-stable-stringify-without-jsonify-1.0.1" = {
1997 name = "json-stable-stringify-without-jsonify";
1998 packageName = "json-stable-stringify-without-jsonify";
1999 version = "1.0.1";
2000 src = fetchurl {
2001 url = "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz";
2002 sha1 = "9db7b59496ad3f3cfef30a75142d2d930ad72651";
2003 };
2004 };
2005 "json-stringify-safe-5.0.1" = {
2006 name = "json-stringify-safe";
2007 packageName = "json-stringify-safe";
2008 version = "5.0.1";
2009 src = fetchurl {
2010 url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
2011 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
2012 };
2013 };
2014 "jsprim-1.4.1" = {
2015 name = "jsprim";
2016 packageName = "jsprim";
2017 version = "1.4.1";
2018 src = fetchurl {
2019 url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
2020 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
2021 };
2022 };
2023 "kind-of-6.0.3" = {
2024 name = "kind-of";
2025 packageName = "kind-of";
2026 version = "6.0.3";
2027 src = fetchurl {
2028 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.3.tgz";
2029 sha512 = "dcS1ul+9tmeD95T+x28/ehLgd9mENa3LsvDTtzm3vyBEO7RPptvAD+t44WVXaUjTBRcrpFeFlC8WCruUR456hw==";
2030 };
2031 };
2032 "less-3.13.1" = {
2033 name = "less";
2034 packageName = "less";
2035 version = "3.13.1";
2036 src = fetchurl {
2037 url = "https://registry.npmjs.org/less/-/less-3.13.1.tgz";
2038 sha512 = "SwA1aQXGUvp+P5XdZslUOhhLnClSLIjWvJhmd+Vgib5BFIr9lMNlQwmwUNOjXThF/A0x+MCYYPeWEfeWiLRnTw==";
2039 };
2040 };
2041 "levn-0.3.0" = {
2042 name = "levn";
2043 packageName = "levn";
2044 version = "0.3.0";
2045 src = fetchurl {
2046 url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
2047 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
2048 };
2049 };
2050 "loader-runner-4.2.0" = {
2051 name = "loader-runner";
2052 packageName = "loader-runner";
2053 version = "4.2.0";
2054 src = fetchurl {
2055 url = "https://registry.npmjs.org/loader-runner/-/loader-runner-4.2.0.tgz";
2056 sha512 = "92+huvxMvYlMzMt0iIOukcwYBFpkYJdpl2xsZ7LrlayO7E8SOv+JJUEK17B/dJIHAOLMfh2dZZ/Y18WgmGtYNw==";
2057 };
2058 };
2059 "locate-path-5.0.0" = {
2060 name = "locate-path";
2061 packageName = "locate-path";
2062 version = "5.0.0";
2063 src = fetchurl {
2064 url = "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz";
2065 sha512 = "t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==";
2066 };
2067 };
2068 "lodash-4.17.21" = {
2069 name = "lodash";
2070 packageName = "lodash";
2071 version = "4.17.21";
2072 src = fetchurl {
2073 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz";
2074 sha512 = "v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==";
2075 };
2076 };
2077 "lru-cache-4.1.5" = {
2078 name = "lru-cache";
2079 packageName = "lru-cache";
2080 version = "4.1.5";
2081 src = fetchurl {
2082 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.5.tgz";
2083 sha512 = "sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==";
2084 };
2085 };
2086 "lru-cache-6.0.0" = {
2087 name = "lru-cache";
2088 packageName = "lru-cache";
2089 version = "6.0.0";
2090 src = fetchurl {
2091 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz";
2092 sha512 = "Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==";
2093 };
2094 };
2095 "make-dir-2.1.0" = {
2096 name = "make-dir";
2097 packageName = "make-dir";
2098 version = "2.1.0";
2099 src = fetchurl {
2100 url = "https://registry.npmjs.org/make-dir/-/make-dir-2.1.0.tgz";
2101 sha512 = "LS9X+dc8KLxXCb8dni79fLIIUA5VyZoyjSMCwTluaXA0o27cCK0bhXkpgw+sTXVpPy/lSO57ilRixqk0vDmtRA==";
2102 };
2103 };
2104 "merge-stream-2.0.0" = {
2105 name = "merge-stream";
2106 packageName = "merge-stream";
2107 version = "2.0.0";
2108 src = fetchurl {
2109 url = "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz";
2110 sha512 = "abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==";
2111 };
2112 };
2113 "merge2-1.4.1" = {
2114 name = "merge2";
2115 packageName = "merge2";
2116 version = "1.4.1";
2117 src = fetchurl {
2118 url = "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz";
2119 sha512 = "8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==";
2120 };
2121 };
2122 "micromatch-4.0.4" = {
2123 name = "micromatch";
2124 packageName = "micromatch";
2125 version = "4.0.4";
2126 src = fetchurl {
2127 url = "https://registry.npmjs.org/micromatch/-/micromatch-4.0.4.tgz";
2128 sha512 = "pRmzw/XUcwXGpD9aI9q/0XOwLNygjETJ8y0ao0wdqprrzDa4YnxLcz7fQRZr8voh8V10kGhABbNcHVk5wHgWwg==";
2129 };
2130 };
2131 "mime-1.6.0" = {
2132 name = "mime";
2133 packageName = "mime";
2134 version = "1.6.0";
2135 src = fetchurl {
2136 url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz";
2137 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
2138 };
2139 };
2140 "mime-db-1.47.0" = {
2141 name = "mime-db";
2142 packageName = "mime-db";
2143 version = "1.47.0";
2144 src = fetchurl {
2145 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.47.0.tgz";
2146 sha512 = "QBmA/G2y+IfeS4oktet3qRZ+P5kPhCKRXxXnQEudYqUaEioAU1/Lq2us3D/t1Jfo4hE9REQPrbB7K5sOczJVIw==";
2147 };
2148 };
2149 "mime-types-2.1.30" = {
2150 name = "mime-types";
2151 packageName = "mime-types";
2152 version = "2.1.30";
2153 src = fetchurl {
2154 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.30.tgz";
2155 sha512 = "crmjA4bLtR8m9qLpHvgxSChT+XoSlZi8J4n/aIdn3z92e/U47Z0V/yl+Wh9W046GgFVAmoNR/fmdbZYcSSIUeg==";
2156 };
2157 };
2158 "mimic-fn-2.1.0" = {
2159 name = "mimic-fn";
2160 packageName = "mimic-fn";
2161 version = "2.1.0";
2162 src = fetchurl {
2163 url = "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz";
2164 sha512 = "OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==";
2165 };
2166 };
2167 "minimatch-3.0.4" = {
2168 name = "minimatch";
2169 packageName = "minimatch";
2170 version = "3.0.4";
2171 src = fetchurl {
2172 url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
2173 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
2174 };
2175 };
2176 "minimist-1.2.5" = {
2177 name = "minimist";
2178 packageName = "minimist";
2179 version = "1.2.5";
2180 src = fetchurl {
2181 url = "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz";
2182 sha512 = "FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==";
2183 };
2184 };
2185 "minipass-2.9.0" = {
2186 name = "minipass";
2187 packageName = "minipass";
2188 version = "2.9.0";
2189 src = fetchurl {
2190 url = "https://registry.npmjs.org/minipass/-/minipass-2.9.0.tgz";
2191 sha512 = "wxfUjg9WebH+CUDX/CdbRlh5SmfZiy/hpkxaRI16Y9W56Pa75sWgd/rvFilSgrauD9NyFymP/+JFV3KwzIsJeg==";
2192 };
2193 };
2194 "minizlib-1.3.3" = {
2195 name = "minizlib";
2196 packageName = "minizlib";
2197 version = "1.3.3";
2198 src = fetchurl {
2199 url = "https://registry.npmjs.org/minizlib/-/minizlib-1.3.3.tgz";
2200 sha512 = "6ZYMOEnmVsdCeTJVE0W9ZD+pVnE8h9Hma/iOwwRDsdQoePpoX56/8B6z3P9VNwppJuBKNRuFDRNRqRWexT9G9Q==";
2201 };
2202 };
2203 "mkdirp-0.5.5" = {
2204 name = "mkdirp";
2205 packageName = "mkdirp";
2206 version = "0.5.5";
2207 src = fetchurl {
2208 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.5.tgz";
2209 sha512 = "NKmAlESf6jMGym1++R0Ra7wvhV+wFW63FaSOFPwRahvea0gMUcGUhVeAg/0BC0wiv9ih5NYPB1Wn1UEI1/L+xQ==";
2210 };
2211 };
2212 "mkdirp-1.0.4" = {
2213 name = "mkdirp";
2214 packageName = "mkdirp";
2215 version = "1.0.4";
2216 src = fetchurl {
2217 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz";
2218 sha512 = "vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==";
2219 };
2220 };
2221 "mnemonist-0.38.3" = {
2222 name = "mnemonist";
2223 packageName = "mnemonist";
2224 version = "0.38.3";
2225 src = fetchurl {
2226 url = "https://registry.npmjs.org/mnemonist/-/mnemonist-0.38.3.tgz";
2227 sha512 = "2K9QYubXx/NAjv4VLq1d1Ly8pWNC5L3BrixtdkyTegXWJIqY+zLNDhhX/A+ZwWt70tB1S8H4BE8FLYEFyNoOBw==";
2228 };
2229 };
2230 "ms-2.1.2" = {
2231 name = "ms";
2232 packageName = "ms";
2233 version = "2.1.2";
2234 src = fetchurl {
2235 url = "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz";
2236 sha512 = "sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==";
2237 };
2238 };
2239 "mute-stream-0.0.8" = {
2240 name = "mute-stream";
2241 packageName = "mute-stream";
2242 version = "0.0.8";
2243 src = fetchurl {
2244 url = "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.8.tgz";
2245 sha512 = "nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==";
2246 };
2247 };
2248 "native-request-1.0.8" = {
2249 name = "native-request";
2250 packageName = "native-request";
2251 version = "1.0.8";
2252 src = fetchurl {
2253 url = "https://registry.npmjs.org/native-request/-/native-request-1.0.8.tgz";
2254 sha512 = "vU2JojJVelUGp6jRcLwToPoWGxSx23z/0iX+I77J3Ht17rf2INGjrhOoQnjVo60nQd8wVsgzKkPfRXBiVdD2ag==";
2255 };
2256 };
2257 "natural-compare-1.4.0" = {
2258 name = "natural-compare";
2259 packageName = "natural-compare";
2260 version = "1.4.0";
2261 src = fetchurl {
2262 url = "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz";
2263 sha1 = "4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7";
2264 };
2265 };
2266 "needle-2.6.0" = {
2267 name = "needle";
2268 packageName = "needle";
2269 version = "2.6.0";
2270 src = fetchurl {
2271 url = "https://registry.npmjs.org/needle/-/needle-2.6.0.tgz";
2272 sha512 = "KKYdza4heMsEfSWD7VPUIz3zX2XDwOyX2d+geb4vrERZMT5RMU6ujjaD+I5Yr54uZxQ2w6XRTAhHBbSCyovZBg==";
2273 };
2274 };
2275 "neo-async-2.6.2" = {
2276 name = "neo-async";
2277 packageName = "neo-async";
2278 version = "2.6.2";
2279 src = fetchurl {
2280 url = "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz";
2281 sha512 = "Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==";
2282 };
2283 };
2284 "nice-try-1.0.5" = {
2285 name = "nice-try";
2286 packageName = "nice-try";
2287 version = "1.0.5";
2288 src = fetchurl {
2289 url = "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz";
2290 sha512 = "1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==";
2291 };
2292 };
2293 "node-addon-api-3.1.0" = {
2294 name = "node-addon-api";
2295 packageName = "node-addon-api";
2296 version = "3.1.0";
2297 src = fetchurl {
2298 url = "https://registry.npmjs.org/node-addon-api/-/node-addon-api-3.1.0.tgz";
2299 sha512 = "flmrDNB06LIl5lywUz7YlNGZH/5p0M7W28k8hzd9Lshtdh1wshD2Y+U4h9LD6KObOy1f+fEVdgprPrEymjM5uw==";
2300 };
2301 };
2302 "node-gyp-3.8.0" = {
2303 name = "node-gyp";
2304 packageName = "node-gyp";
2305 version = "3.8.0";
2306 src = fetchurl {
2307 url = "https://registry.npmjs.org/node-gyp/-/node-gyp-3.8.0.tgz";
2308 sha512 = "3g8lYefrRRzvGeSowdJKAKyks8oUpLEd/DyPV4eMhVlhJ0aNaZqIrNUIPuEWWTAoPqyFkfGrM67MC69baqn6vA==";
2309 };
2310 };
2311 "node-pre-gyp-0.11.0" = {
2312 name = "node-pre-gyp";
2313 packageName = "node-pre-gyp";
2314 version = "0.11.0";
2315 src = fetchurl {
2316 url = "https://registry.npmjs.org/node-pre-gyp/-/node-pre-gyp-0.11.0.tgz";
2317 sha512 = "TwWAOZb0j7e9eGaf9esRx3ZcLaE5tQ2lvYy1pb5IAaG1a2e2Kv5Lms1Y4hpj+ciXJRofIxxlt5haeQ/2ANeE0Q==";
2318 };
2319 };
2320 "node-releases-1.1.71" = {
2321 name = "node-releases";
2322 packageName = "node-releases";
2323 version = "1.1.71";
2324 src = fetchurl {
2325 url = "https://registry.npmjs.org/node-releases/-/node-releases-1.1.71.tgz";
2326 sha512 = "zR6HoT6LrLCRBwukmrVbHv0EpEQjksO6GmFcZQQuCAy139BEsoVKPYnf3jongYW83fAa1torLGYwxxky/p28sg==";
2327 };
2328 };
2329 "nopt-3.0.6" = {
2330 name = "nopt";
2331 packageName = "nopt";
2332 version = "3.0.6";
2333 src = fetchurl {
2334 url = "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz";
2335 sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
2336 };
2337 };
2338 "nopt-4.0.3" = {
2339 name = "nopt";
2340 packageName = "nopt";
2341 version = "4.0.3";
2342 src = fetchurl {
2343 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.3.tgz";
2344 sha512 = "CvaGwVMztSMJLOeXPrez7fyfObdZqNUK1cPAEzLHrTybIua9pMdmmPR5YwtfNftIOMv3DPUhFaxsZMNTQO20Kg==";
2345 };
2346 };
2347 "nopt-5.0.0" = {
2348 name = "nopt";
2349 packageName = "nopt";
2350 version = "5.0.0";
2351 src = fetchurl {
2352 url = "https://registry.npmjs.org/nopt/-/nopt-5.0.0.tgz";
2353 sha512 = "Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==";
2354 };
2355 };
2356 "npm-bundled-1.1.1" = {
2357 name = "npm-bundled";
2358 packageName = "npm-bundled";
2359 version = "1.1.1";
2360 src = fetchurl {
2361 url = "https://registry.npmjs.org/npm-bundled/-/npm-bundled-1.1.1.tgz";
2362 sha512 = "gqkfgGePhTpAEgUsGEgcq1rqPXA+tv/aVBlgEzfXwA1yiUJF7xtEt3CtVwOjNYQOVknDk0F20w58Fnm3EtG0fA==";
2363 };
2364 };
2365 "npm-normalize-package-bin-1.0.1" = {
2366 name = "npm-normalize-package-bin";
2367 packageName = "npm-normalize-package-bin";
2368 version = "1.0.1";
2369 src = fetchurl {
2370 url = "https://registry.npmjs.org/npm-normalize-package-bin/-/npm-normalize-package-bin-1.0.1.tgz";
2371 sha512 = "EPfafl6JL5/rU+ot6P3gRSCpPDW5VmIzX959Ob1+ySFUuuYHWHekXpwdUZcKP5C+DS4GEtdJluwBjnsNDl+fSA==";
2372 };
2373 };
2374 "npm-packlist-1.4.8" = {
2375 name = "npm-packlist";
2376 packageName = "npm-packlist";
2377 version = "1.4.8";
2378 src = fetchurl {
2379 url = "https://registry.npmjs.org/npm-packlist/-/npm-packlist-1.4.8.tgz";
2380 sha512 = "5+AZgwru5IevF5ZdnFglB5wNlHG1AOOuw28WhUq8/8emhBmLv6jX5by4WJCh7lW0uSYZYS6DXqIsyZVIXRZU9A==";
2381 };
2382 };
2383 "npm-run-path-4.0.1" = {
2384 name = "npm-run-path";
2385 packageName = "npm-run-path";
2386 version = "4.0.1";
2387 src = fetchurl {
2388 url = "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz";
2389 sha512 = "S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==";
2390 };
2391 };
2392 "npmlog-4.1.2" = {
2393 name = "npmlog";
2394 packageName = "npmlog";
2395 version = "4.1.2";
2396 src = fetchurl {
2397 url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";
2398 sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==";
2399 };
2400 };
2401 "number-is-nan-1.0.1" = {
2402 name = "number-is-nan";
2403 packageName = "number-is-nan";
2404 version = "1.0.1";
2405 src = fetchurl {
2406 url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";
2407 sha1 = "097b602b53422a522c1afb8790318336941a011d";
2408 };
2409 };
2410 "oauth-sign-0.9.0" = {
2411 name = "oauth-sign";
2412 packageName = "oauth-sign";
2413 version = "0.9.0";
2414 src = fetchurl {
2415 url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.9.0.tgz";
2416 sha512 = "fexhUFFPTGV8ybAtSIGbV6gOkSv8UtRbDBnAyLQw4QPKkgNlsH2ByPGtMUqdWkos6YCRmAqViwgZrJc/mRDzZQ==";
2417 };
2418 };
2419 "object-assign-4.1.1" = {
2420 name = "object-assign";
2421 packageName = "object-assign";
2422 version = "4.1.1";
2423 src = fetchurl {
2424 url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
2425 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
2426 };
2427 };
2428 "obliterator-1.6.1" = {
2429 name = "obliterator";
2430 packageName = "obliterator";
2431 version = "1.6.1";
2432 src = fetchurl {
2433 url = "https://registry.npmjs.org/obliterator/-/obliterator-1.6.1.tgz";
2434 sha512 = "9WXswnqINnnhOG/5SLimUlzuU1hFJUc8zkwyD59Sd+dPOMf05PmnYG/d6Q7HZ+KmgkZJa1PxRso6QdM3sTNHig==";
2435 };
2436 };
2437 "once-1.4.0" = {
2438 name = "once";
2439 packageName = "once";
2440 version = "1.4.0";
2441 src = fetchurl {
2442 url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
2443 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
2444 };
2445 };
2446 "onetime-5.1.2" = {
2447 name = "onetime";
2448 packageName = "onetime";
2449 version = "5.1.2";
2450 src = fetchurl {
2451 url = "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz";
2452 sha512 = "kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==";
2453 };
2454 };
2455 "optionator-0.8.3" = {
2456 name = "optionator";
2457 packageName = "optionator";
2458 version = "0.8.3";
2459 src = fetchurl {
2460 url = "https://registry.npmjs.org/optionator/-/optionator-0.8.3.tgz";
2461 sha512 = "+IW9pACdk3XWmmTXG8m3upGUJst5XRGzxMRjXzAuJ1XnIFNvfhjjIuYkDvysnPQ7qzqVzLt78BCruntqRhWQbA==";
2462 };
2463 };
2464 "os-homedir-1.0.2" = {
2465 name = "os-homedir";
2466 packageName = "os-homedir";
2467 version = "1.0.2";
2468 src = fetchurl {
2469 url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
2470 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
2471 };
2472 };
2473 "os-tmpdir-1.0.2" = {
2474 name = "os-tmpdir";
2475 packageName = "os-tmpdir";
2476 version = "1.0.2";
2477 src = fetchurl {
2478 url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
2479 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
2480 };
2481 };
2482 "osenv-0.1.5" = {
2483 name = "osenv";
2484 packageName = "osenv";
2485 version = "0.1.5";
2486 src = fetchurl {
2487 url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
2488 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
2489 };
2490 };
2491 "p-limit-2.3.0" = {
2492 name = "p-limit";
2493 packageName = "p-limit";
2494 version = "2.3.0";
2495 src = fetchurl {
2496 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz";
2497 sha512 = "//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==";
2498 };
2499 };
2500 "p-limit-3.1.0" = {
2501 name = "p-limit";
2502 packageName = "p-limit";
2503 version = "3.1.0";
2504 src = fetchurl {
2505 url = "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz";
2506 sha512 = "TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==";
2507 };
2508 };
2509 "p-locate-4.1.0" = {
2510 name = "p-locate";
2511 packageName = "p-locate";
2512 version = "4.1.0";
2513 src = fetchurl {
2514 url = "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz";
2515 sha512 = "R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==";
2516 };
2517 };
2518 "p-try-2.2.0" = {
2519 name = "p-try";
2520 packageName = "p-try";
2521 version = "2.2.0";
2522 src = fetchurl {
2523 url = "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz";
2524 sha512 = "R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==";
2525 };
2526 };
2527 "packet-reader-1.0.0" = {
2528 name = "packet-reader";
2529 packageName = "packet-reader";
2530 version = "1.0.0";
2531 src = fetchurl {
2532 url = "https://registry.npmjs.org/packet-reader/-/packet-reader-1.0.0.tgz";
2533 sha512 = "HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==";
2534 };
2535 };
2536 "parent-module-1.0.1" = {
2537 name = "parent-module";
2538 packageName = "parent-module";
2539 version = "1.0.1";
2540 src = fetchurl {
2541 url = "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz";
2542 sha512 = "GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==";
2543 };
2544 };
2545 "path-exists-4.0.0" = {
2546 name = "path-exists";
2547 packageName = "path-exists";
2548 version = "4.0.0";
2549 src = fetchurl {
2550 url = "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz";
2551 sha512 = "ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==";
2552 };
2553 };
2554 "path-is-absolute-1.0.1" = {
2555 name = "path-is-absolute";
2556 packageName = "path-is-absolute";
2557 version = "1.0.1";
2558 src = fetchurl {
2559 url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
2560 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
2561 };
2562 };
2563 "path-key-2.0.1" = {
2564 name = "path-key";
2565 packageName = "path-key";
2566 version = "2.0.1";
2567 src = fetchurl {
2568 url = "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz";
2569 sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
2570 };
2571 };
2572 "path-key-3.1.1" = {
2573 name = "path-key";
2574 packageName = "path-key";
2575 version = "3.1.1";
2576 src = fetchurl {
2577 url = "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz";
2578 sha512 = "ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==";
2579 };
2580 };
2581 "path-parse-1.0.6" = {
2582 name = "path-parse";
2583 packageName = "path-parse";
2584 version = "1.0.6";
2585 src = fetchurl {
2586 url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz";
2587 sha512 = "GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==";
2588 };
2589 };
2590 "path-type-4.0.0" = {
2591 name = "path-type";
2592 packageName = "path-type";
2593 version = "4.0.0";
2594 src = fetchurl {
2595 url = "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz";
2596 sha512 = "gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==";
2597 };
2598 };
2599 "performance-now-2.1.0" = {
2600 name = "performance-now";
2601 packageName = "performance-now";
2602 version = "2.1.0";
2603 src = fetchurl {
2604 url = "https://registry.npmjs.org/performance-now/-/performance-now-2.1.0.tgz";
2605 sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
2606 };
2607 };
2608 "pg-8.6.0" = {
2609 name = "pg";
2610 packageName = "pg";
2611 version = "8.6.0";
2612 src = fetchurl {
2613 url = "https://registry.npmjs.org/pg/-/pg-8.6.0.tgz";
2614 sha512 = "qNS9u61lqljTDFvmk/N66EeGq3n6Ujzj0FFyNMGQr6XuEv4tgNTXvJQTfJdcvGit5p5/DWPu+wj920hAJFI+QQ==";
2615 };
2616 };
2617 "pg-connection-string-2.5.0" = {
2618 name = "pg-connection-string";
2619 packageName = "pg-connection-string";
2620 version = "2.5.0";
2621 src = fetchurl {
2622 url = "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.5.0.tgz";
2623 sha512 = "r5o/V/ORTA6TmUnyWZR9nCj1klXCO2CEKNRlVuJptZe85QuhFayC7WeMic7ndayT5IRIR0S0xFxFi2ousartlQ==";
2624 };
2625 };
2626 "pg-int8-1.0.1" = {
2627 name = "pg-int8";
2628 packageName = "pg-int8";
2629 version = "1.0.1";
2630 src = fetchurl {
2631 url = "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz";
2632 sha512 = "WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==";
2633 };
2634 };
2635 "pg-pool-3.3.0" = {
2636 name = "pg-pool";
2637 packageName = "pg-pool";
2638 version = "3.3.0";
2639 src = fetchurl {
2640 url = "https://registry.npmjs.org/pg-pool/-/pg-pool-3.3.0.tgz";
2641 sha512 = "0O5huCql8/D6PIRFAlmccjphLYWC+JIzvUhSzXSpGaf+tjTZc4nn+Lr7mLXBbFJfvwbP0ywDv73EiaBsxn7zdg==";
2642 };
2643 };
2644 "pg-protocol-1.5.0" = {
2645 name = "pg-protocol";
2646 packageName = "pg-protocol";
2647 version = "1.5.0";
2648 src = fetchurl {
2649 url = "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.5.0.tgz";
2650 sha512 = "muRttij7H8TqRNu/DxrAJQITO4Ac7RmX3Klyr/9mJEOBeIpgnF8f9jAfRz5d3XwQZl5qBjF9gLsUtMPJE0vezQ==";
2651 };
2652 };
2653 "pg-types-2.2.0" = {
2654 name = "pg-types";
2655 packageName = "pg-types";
2656 version = "2.2.0";
2657 src = fetchurl {
2658 url = "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz";
2659 sha512 = "qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==";
2660 };
2661 };
2662 "pgpass-1.0.4" = {
2663 name = "pgpass";
2664 packageName = "pgpass";
2665 version = "1.0.4";
2666 src = fetchurl {
2667 url = "https://registry.npmjs.org/pgpass/-/pgpass-1.0.4.tgz";
2668 sha512 = "YmuA56alyBq7M59vxVBfPJrGSozru8QAdoNlWuW3cz8l+UX3cWge0vTvjKhsSHSJpo3Bom8/Mm6hf0TR5GY0+w==";
2669 };
2670 };
2671 "picomatch-2.2.3" = {
2672 name = "picomatch";
2673 packageName = "picomatch";
2674 version = "2.2.3";
2675 src = fetchurl {
2676 url = "https://registry.npmjs.org/picomatch/-/picomatch-2.2.3.tgz";
2677 sha512 = "KpELjfwcCDUb9PeigTs2mBJzXUPzAuP2oPcA989He8Rte0+YUAjw1JVedDhuTKPkHjSYzMN3npC9luThGYEKdg==";
2678 };
2679 };
2680 "pify-4.0.1" = {
2681 name = "pify";
2682 packageName = "pify";
2683 version = "4.0.1";
2684 src = fetchurl {
2685 url = "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz";
2686 sha512 = "uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g==";
2687 };
2688 };
2689 "pkg-dir-4.2.0" = {
2690 name = "pkg-dir";
2691 packageName = "pkg-dir";
2692 version = "4.2.0";
2693 src = fetchurl {
2694 url = "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz";
2695 sha512 = "HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==";
2696 };
2697 };
2698 "postgres-array-2.0.0" = {
2699 name = "postgres-array";
2700 packageName = "postgres-array";
2701 version = "2.0.0";
2702 src = fetchurl {
2703 url = "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz";
2704 sha512 = "VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==";
2705 };
2706 };
2707 "postgres-bytea-1.0.0" = {
2708 name = "postgres-bytea";
2709 packageName = "postgres-bytea";
2710 version = "1.0.0";
2711 src = fetchurl {
2712 url = "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz";
2713 sha1 = "027b533c0aa890e26d172d47cf9ccecc521acd35";
2714 };
2715 };
2716 "postgres-date-1.0.7" = {
2717 name = "postgres-date";
2718 packageName = "postgres-date";
2719 version = "1.0.7";
2720 src = fetchurl {
2721 url = "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz";
2722 sha512 = "suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==";
2723 };
2724 };
2725 "postgres-interval-1.2.0" = {
2726 name = "postgres-interval";
2727 packageName = "postgres-interval";
2728 version = "1.2.0";
2729 src = fetchurl {
2730 url = "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz";
2731 sha512 = "9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==";
2732 };
2733 };
2734 "prelude-ls-1.1.2" = {
2735 name = "prelude-ls";
2736 packageName = "prelude-ls";
2737 version = "1.1.2";
2738 src = fetchurl {
2739 url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
2740 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
2741 };
2742 };
2743 "process-nextick-args-2.0.1" = {
2744 name = "process-nextick-args";
2745 packageName = "process-nextick-args";
2746 version = "2.0.1";
2747 src = fetchurl {
2748 url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
2749 sha512 = "3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==";
2750 };
2751 };
2752 "progress-2.0.3" = {
2753 name = "progress";
2754 packageName = "progress";
2755 version = "2.0.3";
2756 src = fetchurl {
2757 url = "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz";
2758 sha512 = "7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==";
2759 };
2760 };
2761 "proto-list-1.2.4" = {
2762 name = "proto-list";
2763 packageName = "proto-list";
2764 version = "1.2.4";
2765 src = fetchurl {
2766 url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz";
2767 sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
2768 };
2769 };
2770 "prr-1.0.1" = {
2771 name = "prr";
2772 packageName = "prr";
2773 version = "1.0.1";
2774 src = fetchurl {
2775 url = "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz";
2776 sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
2777 };
2778 };
2779 "pseudomap-1.0.2" = {
2780 name = "pseudomap";
2781 packageName = "pseudomap";
2782 version = "1.0.2";
2783 src = fetchurl {
2784 url = "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz";
2785 sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
2786 };
2787 };
2788 "psl-1.8.0" = {
2789 name = "psl";
2790 packageName = "psl";
2791 version = "1.8.0";
2792 src = fetchurl {
2793 url = "https://registry.npmjs.org/psl/-/psl-1.8.0.tgz";
2794 sha512 = "RIdOzyoavK+hA18OGGWDqUTsCLhtA7IcZ/6NCs4fFJaHBDab+pDDmDIByWFRQJq2Cd7r1OoQxBGKOaztq+hjIQ==";
2795 };
2796 };
2797 "punycode-2.1.1" = {
2798 name = "punycode";
2799 packageName = "punycode";
2800 version = "2.1.1";
2801 src = fetchurl {
2802 url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
2803 sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
2804 };
2805 };
2806 "qs-6.5.2" = {
2807 name = "qs";
2808 packageName = "qs";
2809 version = "6.5.2";
2810 src = fetchurl {
2811 url = "https://registry.npmjs.org/qs/-/qs-6.5.2.tgz";
2812 sha512 = "N5ZAX4/LxJmF+7wN74pUD6qAh9/wnvdQcjq9TZjevvXzSUo7bfmw91saqMjzGS2xq91/odN2dW/WOl7qQHNDGA==";
2813 };
2814 };
2815 "queue-microtask-1.2.3" = {
2816 name = "queue-microtask";
2817 packageName = "queue-microtask";
2818 version = "1.2.3";
2819 src = fetchurl {
2820 url = "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz";
2821 sha512 = "NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==";
2822 };
2823 };
2824 "randombytes-2.1.0" = {
2825 name = "randombytes";
2826 packageName = "randombytes";
2827 version = "2.1.0";
2828 src = fetchurl {
2829 url = "https://registry.npmjs.org/randombytes/-/randombytes-2.1.0.tgz";
2830 sha512 = "vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==";
2831 };
2832 };
2833 "rc-1.2.8" = {
2834 name = "rc";
2835 packageName = "rc";
2836 version = "1.2.8";
2837 src = fetchurl {
2838 url = "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz";
2839 sha512 = "y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==";
2840 };
2841 };
2842 "readable-stream-2.3.7" = {
2843 name = "readable-stream";
2844 packageName = "readable-stream";
2845 version = "2.3.7";
2846 src = fetchurl {
2847 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz";
2848 sha512 = "Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==";
2849 };
2850 };
2851 "readable-stream-3.6.0" = {
2852 name = "readable-stream";
2853 packageName = "readable-stream";
2854 version = "3.6.0";
2855 src = fetchurl {
2856 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz";
2857 sha512 = "BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==";
2858 };
2859 };
2860 "rechoir-0.7.0" = {
2861 name = "rechoir";
2862 packageName = "rechoir";
2863 version = "0.7.0";
2864 src = fetchurl {
2865 url = "https://registry.npmjs.org/rechoir/-/rechoir-0.7.0.tgz";
2866 sha512 = "ADsDEH2bvbjltXEP+hTIAmeFekTFK0V2BTxMkok6qILyAJEXV0AFfoWcAq4yfll5VdIMd/RVXq0lR+wQi5ZU3Q==";
2867 };
2868 };
2869 "regexpp-2.0.1" = {
2870 name = "regexpp";
2871 packageName = "regexpp";
2872 version = "2.0.1";
2873 src = fetchurl {
2874 url = "https://registry.npmjs.org/regexpp/-/regexpp-2.0.1.tgz";
2875 sha512 = "lv0M6+TkDVniA3aD1Eg0DVpfU/booSu7Eev3TDO/mZKHBfVjgCGTV4t4buppESEYDtkArYFOxTJWv6S5C+iaNw==";
2876 };
2877 };
2878 "regexpp-3.1.0" = {
2879 name = "regexpp";
2880 packageName = "regexpp";
2881 version = "3.1.0";
2882 src = fetchurl {
2883 url = "https://registry.npmjs.org/regexpp/-/regexpp-3.1.0.tgz";
2884 sha512 = "ZOIzd8yVsQQA7j8GCSlPGXwg5PfmA1mrq0JP4nGhh54LaKN3xdai/vHUDu74pKwV8OxseMS65u2NImosQcSD0Q==";
2885 };
2886 };
2887 "request-2.88.2" = {
2888 name = "request";
2889 packageName = "request";
2890 version = "2.88.2";
2891 src = fetchurl {
2892 url = "https://registry.npmjs.org/request/-/request-2.88.2.tgz";
2893 sha512 = "MsvtOrfG9ZcrOwAW+Qi+F6HbD0CWXEh9ou77uOb7FM2WPhwT7smM833PzanhJLsgXjN89Ir6V2PczXNnMpwKhw==";
2894 };
2895 };
2896 "resolve-1.20.0" = {
2897 name = "resolve";
2898 packageName = "resolve";
2899 version = "1.20.0";
2900 src = fetchurl {
2901 url = "https://registry.npmjs.org/resolve/-/resolve-1.20.0.tgz";
2902 sha512 = "wENBPt4ySzg4ybFQW2TT1zMQucPK95HSh/nq2CFTZVOGut2+pQvSsgtda4d26YrYcr067wjbmzOG8byDPBX63A==";
2903 };
2904 };
2905 "resolve-cwd-3.0.0" = {
2906 name = "resolve-cwd";
2907 packageName = "resolve-cwd";
2908 version = "3.0.0";
2909 src = fetchurl {
2910 url = "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz";
2911 sha512 = "OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==";
2912 };
2913 };
2914 "resolve-from-4.0.0" = {
2915 name = "resolve-from";
2916 packageName = "resolve-from";
2917 version = "4.0.0";
2918 src = fetchurl {
2919 url = "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz";
2920 sha512 = "pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==";
2921 };
2922 };
2923 "resolve-from-5.0.0" = {
2924 name = "resolve-from";
2925 packageName = "resolve-from";
2926 version = "5.0.0";
2927 src = fetchurl {
2928 url = "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz";
2929 sha512 = "qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==";
2930 };
2931 };
2932 "restore-cursor-3.1.0" = {
2933 name = "restore-cursor";
2934 packageName = "restore-cursor";
2935 version = "3.1.0";
2936 src = fetchurl {
2937 url = "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz";
2938 sha512 = "l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==";
2939 };
2940 };
2941 "reusify-1.0.4" = {
2942 name = "reusify";
2943 packageName = "reusify";
2944 version = "1.0.4";
2945 src = fetchurl {
2946 url = "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz";
2947 sha512 = "U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==";
2948 };
2949 };
2950 "rimraf-2.6.3" = {
2951 name = "rimraf";
2952 packageName = "rimraf";
2953 version = "2.6.3";
2954 src = fetchurl {
2955 url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.3.tgz";
2956 sha512 = "mwqeW5XsA2qAejG46gYdENaxXjx9onRNCfn7L0duuP4hCuTIi/QO7PDK07KJfp1d+izWPrzEJDcSqBa0OZQriA==";
2957 };
2958 };
2959 "run-async-2.4.1" = {
2960 name = "run-async";
2961 packageName = "run-async";
2962 version = "2.4.1";
2963 src = fetchurl {
2964 url = "https://registry.npmjs.org/run-async/-/run-async-2.4.1.tgz";
2965 sha512 = "tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==";
2966 };
2967 };
2968 "run-parallel-1.2.0" = {
2969 name = "run-parallel";
2970 packageName = "run-parallel";
2971 version = "1.2.0";
2972 src = fetchurl {
2973 url = "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz";
2974 sha512 = "5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==";
2975 };
2976 };
2977 "rxjs-6.6.7" = {
2978 name = "rxjs";
2979 packageName = "rxjs";
2980 version = "6.6.7";
2981 src = fetchurl {
2982 url = "https://registry.npmjs.org/rxjs/-/rxjs-6.6.7.tgz";
2983 sha512 = "hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==";
2984 };
2985 };
2986 "safe-buffer-5.1.2" = {
2987 name = "safe-buffer";
2988 packageName = "safe-buffer";
2989 version = "5.1.2";
2990 src = fetchurl {
2991 url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
2992 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
2993 };
2994 };
2995 "safe-buffer-5.2.1" = {
2996 name = "safe-buffer";
2997 packageName = "safe-buffer";
2998 version = "5.2.1";
2999 src = fetchurl {
3000 url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz";
3001 sha512 = "rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==";
3002 };
3003 };
3004 "safer-buffer-2.1.2" = {
3005 name = "safer-buffer";
3006 packageName = "safer-buffer";
3007 version = "2.1.2";
3008 src = fetchurl {
3009 url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
3010 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
3011 };
3012 };
3013 "sax-1.2.4" = {
3014 name = "sax";
3015 packageName = "sax";
3016 version = "1.2.4";
3017 src = fetchurl {
3018 url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";
3019 sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==";
3020 };
3021 };
3022 "schema-utils-3.0.0" = {
3023 name = "schema-utils";
3024 packageName = "schema-utils";
3025 version = "3.0.0";
3026 src = fetchurl {
3027 url = "https://registry.npmjs.org/schema-utils/-/schema-utils-3.0.0.tgz";
3028 sha512 = "6D82/xSzO094ajanoOSbe4YvXWMfn2A//8Y1+MUqFAJul5Bs+yn36xbK9OtNDcRVSBJ9jjeoXftM6CfztsjOAA==";
3029 };
3030 };
3031 "semver-5.3.0" = {
3032 name = "semver";
3033 packageName = "semver";
3034 version = "5.3.0";
3035 src = fetchurl {
3036 url = "https://registry.npmjs.org/semver/-/semver-5.3.0.tgz";
3037 sha1 = "9b2ce5d3de02d17c6012ad326aa6b4d0cf54f94f";
3038 };
3039 };
3040 "semver-5.7.1" = {
3041 name = "semver";
3042 packageName = "semver";
3043 version = "5.7.1";
3044 src = fetchurl {
3045 url = "https://registry.npmjs.org/semver/-/semver-5.7.1.tgz";
3046 sha512 = "sauaDf/PZdVgrLTNYHRtpXa1iRiKcaebiKQ1BJdpQlWH2lCvexQdX55snPFyK7QzpudqbCI0qXFfOasHdyNDGQ==";
3047 };
3048 };
3049 "semver-6.3.0" = {
3050 name = "semver";
3051 packageName = "semver";
3052 version = "6.3.0";
3053 src = fetchurl {
3054 url = "https://registry.npmjs.org/semver/-/semver-6.3.0.tgz";
3055 sha512 = "b39TBaTSfV6yBrapU89p5fKekE2m/NwnDocOVruQFS1/veMgdzuPcnOM34M6CwxW8jH/lxEa5rBoDeUwu5HHTw==";
3056 };
3057 };
3058 "semver-7.3.5" = {
3059 name = "semver";
3060 packageName = "semver";
3061 version = "7.3.5";
3062 src = fetchurl {
3063 url = "https://registry.npmjs.org/semver/-/semver-7.3.5.tgz";
3064 sha512 = "PoeGJYh8HK4BTO/a9Tf6ZG3veo/A7ZVsYrSA6J8ny9nb3B1VrpkuN+z9OE5wfE5p6H4LchYZsegiQgbJD94ZFQ==";
3065 };
3066 };
3067 "serialize-javascript-5.0.1" = {
3068 name = "serialize-javascript";
3069 packageName = "serialize-javascript";
3070 version = "5.0.1";
3071 src = fetchurl {
3072 url = "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-5.0.1.tgz";
3073 sha512 = "SaaNal9imEO737H2c05Og0/8LUXG7EnsZyMa8MzkmuHoELfT6txuj0cMqRj6zfPKnmQ1yasR4PCJc8x+M4JSPA==";
3074 };
3075 };
3076 "set-blocking-2.0.0" = {
3077 name = "set-blocking";
3078 packageName = "set-blocking";
3079 version = "2.0.0";
3080 src = fetchurl {
3081 url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
3082 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
3083 };
3084 };
3085 "shallow-clone-3.0.1" = {
3086 name = "shallow-clone";
3087 packageName = "shallow-clone";
3088 version = "3.0.1";
3089 src = fetchurl {
3090 url = "https://registry.npmjs.org/shallow-clone/-/shallow-clone-3.0.1.tgz";
3091 sha512 = "/6KqX+GVUdqPuPPd2LxDDxzX6CAbjJehAAOKlNpqqUpAqPM6HeL8f+o3a+JsyGjn2lv0WY8UsTgUJjU9Ok55NA==";
3092 };
3093 };
3094 "shebang-command-1.2.0" = {
3095 name = "shebang-command";
3096 packageName = "shebang-command";
3097 version = "1.2.0";
3098 src = fetchurl {
3099 url = "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz";
3100 sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
3101 };
3102 };
3103 "shebang-command-2.0.0" = {
3104 name = "shebang-command";
3105 packageName = "shebang-command";
3106 version = "2.0.0";
3107 src = fetchurl {
3108 url = "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz";
3109 sha512 = "kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==";
3110 };
3111 };
3112 "shebang-regex-1.0.0" = {
3113 name = "shebang-regex";
3114 packageName = "shebang-regex";
3115 version = "1.0.0";
3116 src = fetchurl {
3117 url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz";
3118 sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
3119 };
3120 };
3121 "shebang-regex-3.0.0" = {
3122 name = "shebang-regex";
3123 packageName = "shebang-regex";
3124 version = "3.0.0";
3125 src = fetchurl {
3126 url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz";
3127 sha512 = "7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==";
3128 };
3129 };
3130 "sigmund-1.0.1" = {
3131 name = "sigmund";
3132 packageName = "sigmund";
3133 version = "1.0.1";
3134 src = fetchurl {
3135 url = "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz";
3136 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
3137 };
3138 };
3139 "signal-exit-3.0.3" = {
3140 name = "signal-exit";
3141 packageName = "signal-exit";
3142 version = "3.0.3";
3143 src = fetchurl {
3144 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.3.tgz";
3145 sha512 = "VUJ49FC8U1OxwZLxIbTTrDvLnf/6TDgxZcK8wxR8zs13xpx7xbG60ndBlhNrFi2EMuFRoeDoJO7wthSLq42EjA==";
3146 };
3147 };
3148 "slash-3.0.0" = {
3149 name = "slash";
3150 packageName = "slash";
3151 version = "3.0.0";
3152 src = fetchurl {
3153 url = "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz";
3154 sha512 = "g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==";
3155 };
3156 };
3157 "slice-ansi-2.1.0" = {
3158 name = "slice-ansi";
3159 packageName = "slice-ansi";
3160 version = "2.1.0";
3161 src = fetchurl {
3162 url = "https://registry.npmjs.org/slice-ansi/-/slice-ansi-2.1.0.tgz";
3163 sha512 = "Qu+VC3EwYLldKa1fCxuuvULvSJOKEgk9pi8dZeCVK7TqBfUNTH4sFkk4joj8afVSfAYgJoSOetjx9QWOJ5mYoQ==";
3164 };
3165 };
3166 "source-list-map-2.0.1" = {
3167 name = "source-list-map";
3168 packageName = "source-list-map";
3169 version = "2.0.1";
3170 src = fetchurl {
3171 url = "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz";
3172 sha512 = "qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==";
3173 };
3174 };
3175 "source-map-0.6.1" = {
3176 name = "source-map";
3177 packageName = "source-map";
3178 version = "0.6.1";
3179 src = fetchurl {
3180 url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";
3181 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
3182 };
3183 };
3184 "source-map-0.7.3" = {
3185 name = "source-map";
3186 packageName = "source-map";
3187 version = "0.7.3";
3188 src = fetchurl {
3189 url = "https://registry.npmjs.org/source-map/-/source-map-0.7.3.tgz";
3190 sha512 = "CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==";
3191 };
3192 };
3193 "source-map-support-0.5.19" = {
3194 name = "source-map-support";
3195 packageName = "source-map-support";
3196 version = "0.5.19";
3197 src = fetchurl {
3198 url = "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.19.tgz";
3199 sha512 = "Wonm7zOCIJzBGQdB+thsPar0kYuCIzYvxZwlBa87yi/Mdjv7Tip2cyVbLj5o0cFPN4EVkuTwb3GDDyUx2DGnGw==";
3200 };
3201 };
3202 "spectre.css-0.5.9" = {
3203 name = "spectre.css";
3204 packageName = "spectre.css";
3205 version = "0.5.9";
3206 src = fetchurl {
3207 url = "https://registry.npmjs.org/spectre.css/-/spectre.css-0.5.9.tgz";
3208 sha512 = "9jUqwZmCnvflrxFGcK+ize43TvjwDjqMwZPVubEtSIHzvinH0TBUESm1LcOJx3Ur7bdPaeOHQIjOqBl1Y5kLFw==";
3209 };
3210 };
3211 "split2-3.2.2" = {
3212 name = "split2";
3213 packageName = "split2";
3214 version = "3.2.2";
3215 src = fetchurl {
3216 url = "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz";
3217 sha512 = "9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==";
3218 };
3219 };
3220 "sprintf-js-1.0.3" = {
3221 name = "sprintf-js";
3222 packageName = "sprintf-js";
3223 version = "1.0.3";
3224 src = fetchurl {
3225 url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz";
3226 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
3227 };
3228 };
3229 "sqlite3-5.0.2" = {
3230 name = "sqlite3";
3231 packageName = "sqlite3";
3232 version = "5.0.2";
3233 src = fetchurl {
3234 url = "https://registry.npmjs.org/sqlite3/-/sqlite3-5.0.2.tgz";
3235 sha512 = "1SdTNo+BVU211Xj1csWa8lV6KM0CtucDwRyA0VHl91wEH1Mgh7RxUpI4rVvG7OhHrzCSGaVyW5g8vKvlrk9DJA==";
3236 };
3237 };
3238 "sshpk-1.16.1" = {
3239 name = "sshpk";
3240 packageName = "sshpk";
3241 version = "1.16.1";
3242 src = fetchurl {
3243 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.16.1.tgz";
3244 sha512 = "HXXqVUq7+pcKeLqqZj6mHFUMvXtOJt1uoUx09pFW6011inTMxqI8BA8PM95myrIyyKwdnzjdFjLiE6KBPVtJIg==";
3245 };
3246 };
3247 "string-width-1.0.2" = {
3248 name = "string-width";
3249 packageName = "string-width";
3250 version = "1.0.2";
3251 src = fetchurl {
3252 url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";
3253 sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
3254 };
3255 };
3256 "string-width-2.1.1" = {
3257 name = "string-width";
3258 packageName = "string-width";
3259 version = "2.1.1";
3260 src = fetchurl {
3261 url = "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz";
3262 sha512 = "nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==";
3263 };
3264 };
3265 "string-width-3.1.0" = {
3266 name = "string-width";
3267 packageName = "string-width";
3268 version = "3.1.0";
3269 src = fetchurl {
3270 url = "https://registry.npmjs.org/string-width/-/string-width-3.1.0.tgz";
3271 sha512 = "vafcv6KjVZKSgz06oM/H6GDBrAtz8vdhQakGjFIvNrHA6y3HCF1CInLy+QLq8dTJPQ1b+KDUqDFctkdRW44e1w==";
3272 };
3273 };
3274 "string-width-4.2.2" = {
3275 name = "string-width";
3276 packageName = "string-width";
3277 version = "4.2.2";
3278 src = fetchurl {
3279 url = "https://registry.npmjs.org/string-width/-/string-width-4.2.2.tgz";
3280 sha512 = "XBJbT3N4JhVumXE0eoLU9DCjcaF92KLNqTmFCnG1pf8duUxFGwtP6AD6nkjw9a3IdiRtL3E2w3JDiE/xi3vOeA==";
3281 };
3282 };
3283 "string_decoder-1.1.1" = {
3284 name = "string_decoder";
3285 packageName = "string_decoder";
3286 version = "1.1.1";
3287 src = fetchurl {
3288 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
3289 sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
3290 };
3291 };
3292 "string_decoder-1.3.0" = {
3293 name = "string_decoder";
3294 packageName = "string_decoder";
3295 version = "1.3.0";
3296 src = fetchurl {
3297 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz";
3298 sha512 = "hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==";
3299 };
3300 };
3301 "strip-ansi-3.0.1" = {
3302 name = "strip-ansi";
3303 packageName = "strip-ansi";
3304 version = "3.0.1";
3305 src = fetchurl {
3306 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
3307 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
3308 };
3309 };
3310 "strip-ansi-4.0.0" = {
3311 name = "strip-ansi";
3312 packageName = "strip-ansi";
3313 version = "4.0.0";
3314 src = fetchurl {
3315 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";
3316 sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
3317 };
3318 };
3319 "strip-ansi-5.2.0" = {
3320 name = "strip-ansi";
3321 packageName = "strip-ansi";
3322 version = "5.2.0";
3323 src = fetchurl {
3324 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz";
3325 sha512 = "DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==";
3326 };
3327 };
3328 "strip-ansi-6.0.0" = {
3329 name = "strip-ansi";
3330 packageName = "strip-ansi";
3331 version = "6.0.0";
3332 src = fetchurl {
3333 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.0.tgz";
3334 sha512 = "AuvKTrTfQNYNIctbR1K/YGTR1756GycPsg7b9bdV9Duqur4gv6aKqHXah67Z8ImS7WEz5QVcOtlfW2rZEugt6w==";
3335 };
3336 };
3337 "strip-final-newline-2.0.0" = {
3338 name = "strip-final-newline";
3339 packageName = "strip-final-newline";
3340 version = "2.0.0";
3341 src = fetchurl {
3342 url = "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz";
3343 sha512 = "BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==";
3344 };
3345 };
3346 "strip-json-comments-2.0.1" = {
3347 name = "strip-json-comments";
3348 packageName = "strip-json-comments";
3349 version = "2.0.1";
3350 src = fetchurl {
3351 url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz";
3352 sha1 = "3c531942e908c2697c0ec344858c286c7ca0a60a";
3353 };
3354 };
3355 "strip-json-comments-3.1.1" = {
3356 name = "strip-json-comments";
3357 packageName = "strip-json-comments";
3358 version = "3.1.1";
3359 src = fetchurl {
3360 url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz";
3361 sha512 = "6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==";
3362 };
3363 };
3364 "supports-color-5.5.0" = {
3365 name = "supports-color";
3366 packageName = "supports-color";
3367 version = "5.5.0";
3368 src = fetchurl {
3369 url = "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";
3370 sha512 = "QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==";
3371 };
3372 };
3373 "supports-color-7.2.0" = {
3374 name = "supports-color";
3375 packageName = "supports-color";
3376 version = "7.2.0";
3377 src = fetchurl {
3378 url = "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz";
3379 sha512 = "qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==";
3380 };
3381 };
3382 "table-5.4.6" = {
3383 name = "table";
3384 packageName = "table";
3385 version = "5.4.6";
3386 src = fetchurl {
3387 url = "https://registry.npmjs.org/table/-/table-5.4.6.tgz";
3388 sha512 = "wmEc8m4fjnob4gt5riFRtTu/6+4rSe12TpAELNSqHMfF3IqnA+CH37USM6/YR3qRZv7e56kAEAtd6nKZaxe0Ug==";
3389 };
3390 };
3391 "tapable-2.2.0" = {
3392 name = "tapable";
3393 packageName = "tapable";
3394 version = "2.2.0";
3395 src = fetchurl {
3396 url = "https://registry.npmjs.org/tapable/-/tapable-2.2.0.tgz";
3397 sha512 = "FBk4IesMV1rBxX2tfiK8RAmogtWn53puLOQlvO8XuwlgxcYbP4mVPS9Ph4aeamSyyVjOl24aYWAuc8U5kCVwMw==";
3398 };
3399 };
3400 "tar-2.2.2" = {
3401 name = "tar";
3402 packageName = "tar";
3403 version = "2.2.2";
3404 src = fetchurl {
3405 url = "https://registry.npmjs.org/tar/-/tar-2.2.2.tgz";
3406 sha512 = "FCEhQ/4rE1zYv9rYXJw/msRqsnmlje5jHP6huWeBZ704jUTy02c5AZyWujpMR1ax6mVw9NyJMfuK2CMDWVIfgA==";
3407 };
3408 };
3409 "tar-4.4.13" = {
3410 name = "tar";
3411 packageName = "tar";
3412 version = "4.4.13";
3413 src = fetchurl {
3414 url = "https://registry.npmjs.org/tar/-/tar-4.4.13.tgz";
3415 sha512 = "w2VwSrBoHa5BsSyH+KxEqeQBAllHhccyMFVHtGtdMpF4W7IRWfZjFiQceJPChOeTsSDVUpER2T8FA93pr0L+QA==";
3416 };
3417 };
3418 "terser-5.6.1" = {
3419 name = "terser";
3420 packageName = "terser";
3421 version = "5.6.1";
3422 src = fetchurl {
3423 url = "https://registry.npmjs.org/terser/-/terser-5.6.1.tgz";
3424 sha512 = "yv9YLFQQ+3ZqgWCUk+pvNJwgUTdlIxUk1WTN+RnaFJe2L7ipG2csPT0ra2XRm7Cs8cxN7QXmK1rFzEwYEQkzXw==";
3425 };
3426 };
3427 "terser-webpack-plugin-5.1.1" = {
3428 name = "terser-webpack-plugin";
3429 packageName = "terser-webpack-plugin";
3430 version = "5.1.1";
3431 src = fetchurl {
3432 url = "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.1.1.tgz";
3433 sha512 = "5XNNXZiR8YO6X6KhSGXfY0QrGrCRlSwAEjIIrlRQR4W8nP69TaJUlh3bkuac6zzgspiGPfKEHcY295MMVExl5Q==";
3434 };
3435 };
3436 "text-table-0.2.0" = {
3437 name = "text-table";
3438 packageName = "text-table";
3439 version = "0.2.0";
3440 src = fetchurl {
3441 url = "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz";
3442 sha1 = "7f5ee823ae805207c00af2df4a84ec3fcfa570b4";
3443 };
3444 };
3445 "through-2.3.8" = {
3446 name = "through";
3447 packageName = "through";
3448 version = "2.3.8";
3449 src = fetchurl {
3450 url = "https://registry.npmjs.org/through/-/through-2.3.8.tgz";
3451 sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
3452 };
3453 };
3454 "tmp-0.0.33" = {
3455 name = "tmp";
3456 packageName = "tmp";
3457 version = "0.0.33";
3458 src = fetchurl {
3459 url = "https://registry.npmjs.org/tmp/-/tmp-0.0.33.tgz";
3460 sha512 = "jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==";
3461 };
3462 };
3463 "to-regex-range-5.0.1" = {
3464 name = "to-regex-range";
3465 packageName = "to-regex-range";
3466 version = "5.0.1";
3467 src = fetchurl {
3468 url = "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz";
3469 sha512 = "65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==";
3470 };
3471 };
3472 "tough-cookie-2.5.0" = {
3473 name = "tough-cookie";
3474 packageName = "tough-cookie";
3475 version = "2.5.0";
3476 src = fetchurl {
3477 url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.5.0.tgz";
3478 sha512 = "nlLsUzgm1kfLXSXfRZMc1KLAugd4hqJHDTvc2hDIwS3mZAfMEuMbc03SujMF+GEcpaX/qboeycw6iO8JwVv2+g==";
3479 };
3480 };
3481 "tslib-1.14.1" = {
3482 name = "tslib";
3483 packageName = "tslib";
3484 version = "1.14.1";
3485 src = fetchurl {
3486 url = "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz";
3487 sha512 = "Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==";
3488 };
3489 };
3490 "tsutils-3.21.0" = {
3491 name = "tsutils";
3492 packageName = "tsutils";
3493 version = "3.21.0";
3494 src = fetchurl {
3495 url = "https://registry.npmjs.org/tsutils/-/tsutils-3.21.0.tgz";
3496 sha512 = "mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==";
3497 };
3498 };
3499 "tunnel-agent-0.6.0" = {
3500 name = "tunnel-agent";
3501 packageName = "tunnel-agent";
3502 version = "0.6.0";
3503 src = fetchurl {
3504 url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
3505 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
3506 };
3507 };
3508 "tweetnacl-0.14.5" = {
3509 name = "tweetnacl";
3510 packageName = "tweetnacl";
3511 version = "0.14.5";
3512 src = fetchurl {
3513 url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
3514 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
3515 };
3516 };
3517 "type-check-0.3.2" = {
3518 name = "type-check";
3519 packageName = "type-check";
3520 version = "0.3.2";
3521 src = fetchurl {
3522 url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
3523 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
3524 };
3525 };
3526 "type-fest-0.21.3" = {
3527 name = "type-fest";
3528 packageName = "type-fest";
3529 version = "0.21.3";
3530 src = fetchurl {
3531 url = "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz";
3532 sha512 = "t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==";
3533 };
3534 };
3535 "type-fest-0.8.1" = {
3536 name = "type-fest";
3537 packageName = "type-fest";
3538 version = "0.8.1";
3539 src = fetchurl {
3540 url = "https://registry.npmjs.org/type-fest/-/type-fest-0.8.1.tgz";
3541 sha512 = "4dbzIzqvjtgiM5rw1k5rEHtBANKmdudhGyBEajN01fEyhaAIhsoKNy6y7+IN93IfpFtwY9iqi7kD+xwKhQsNJA==";
3542 };
3543 };
3544 "typescript-4.2.4" = {
3545 name = "typescript";
3546 packageName = "typescript";
3547 version = "4.2.4";
3548 src = fetchurl {
3549 url = "https://registry.npmjs.org/typescript/-/typescript-4.2.4.tgz";
3550 sha512 = "V+evlYHZnQkaz8TRBuxTA92yZBPotr5H+WhQ7bD3hZUndx5tGOa1fuCgeSjxAzM1RiN5IzvadIXTVefuuwZCRg==";
3551 };
3552 };
3553 "uri-js-4.4.1" = {
3554 name = "uri-js";
3555 packageName = "uri-js";
3556 version = "4.4.1";
3557 src = fetchurl {
3558 url = "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz";
3559 sha512 = "7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==";
3560 };
3561 };
3562 "util-deprecate-1.0.2" = {
3563 name = "util-deprecate";
3564 packageName = "util-deprecate";
3565 version = "1.0.2";
3566 src = fetchurl {
3567 url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
3568 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
3569 };
3570 };
3571 "uuid-3.4.0" = {
3572 name = "uuid";
3573 packageName = "uuid";
3574 version = "3.4.0";
3575 src = fetchurl {
3576 url = "https://registry.npmjs.org/uuid/-/uuid-3.4.0.tgz";
3577 sha512 = "HjSDRw6gZE5JMggctHBcjVak08+KEVhSIiDzFnT9S9aegmp85S/bReBVTb4QTFaRNptJ9kuYaNhnbNEOkbKb/A==";
3578 };
3579 };
3580 "v8-compile-cache-2.3.0" = {
3581 name = "v8-compile-cache";
3582 packageName = "v8-compile-cache";
3583 version = "2.3.0";
3584 src = fetchurl {
3585 url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.3.0.tgz";
3586 sha512 = "l8lCEmLcLYZh4nbunNZvQCJc5pv7+RCwa8q/LdUx8u7lsWvPDKmpodJAJNwkAhJC//dFY48KuIEmjtd4RViDrA==";
3587 };
3588 };
3589 "verror-1.10.0" = {
3590 name = "verror";
3591 packageName = "verror";
3592 version = "1.10.0";
3593 src = fetchurl {
3594 url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
3595 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
3596 };
3597 };
3598 "vue-2.6.10" = {
3599 name = "vue";
3600 packageName = "vue";
3601 version = "2.6.10";
3602 src = fetchurl {
3603 url = "https://registry.npmjs.org/vue/-/vue-2.6.10.tgz";
3604 sha512 = "ImThpeNU9HbdZL3utgMCq0oiMzAkt1mcgy3/E6zWC/G6AaQoeuFdsl9nDhTDU3X1R6FK7nsIUuRACVcjI+A2GQ==";
3605 };
3606 };
3607 "vue-eslint-parser-7.6.0" = {
3608 name = "vue-eslint-parser";
3609 packageName = "vue-eslint-parser";
3610 version = "7.6.0";
3611 src = fetchurl {
3612 url = "https://registry.npmjs.org/vue-eslint-parser/-/vue-eslint-parser-7.6.0.tgz";
3613 sha512 = "QXxqH8ZevBrtiZMZK0LpwaMfevQi9UL7lY6Kcp+ogWHC88AuwUPwwCIzkOUc1LR4XsYAt/F9yHXAB/QoD17QXA==";
3614 };
3615 };
3616 "vue-template-compiler-2.6.10" = {
3617 name = "vue-template-compiler";
3618 packageName = "vue-template-compiler";
3619 version = "2.6.10";
3620 src = fetchurl {
3621 url = "https://registry.npmjs.org/vue-template-compiler/-/vue-template-compiler-2.6.10.tgz";
3622 sha512 = "jVZkw4/I/HT5ZMvRnhv78okGusqe0+qH2A0Em0Cp8aq78+NK9TII263CDVz2QXZsIT+yyV/gZc/j/vlwa+Epyg==";
3623 };
3624 };
3625 "watchpack-2.1.1" = {
3626 name = "watchpack";
3627 packageName = "watchpack";
3628 version = "2.1.1";
3629 src = fetchurl {
3630 url = "https://registry.npmjs.org/watchpack/-/watchpack-2.1.1.tgz";
3631 sha512 = "Oo7LXCmc1eE1AjyuSBmtC3+Wy4HcV8PxWh2kP6fOl8yTlNS7r0K9l1ao2lrrUza7V39Y3D/BbJgY8VeSlc5JKw==";
3632 };
3633 };
3634 "webpack-5.33.2" = {
3635 name = "webpack";
3636 packageName = "webpack";
3637 version = "5.33.2";
3638 src = fetchurl {
3639 url = "https://registry.npmjs.org/webpack/-/webpack-5.33.2.tgz";
3640 sha512 = "X4b7F1sYBmJx8mlh2B7mV5szEkE0jYNJ2y3akgAP0ERi0vLCG1VvdsIxt8lFd4st6SUy0lf7W0CCQS566MBpJg==";
3641 };
3642 };
3643 "webpack-cli-4.6.0" = {
3644 name = "webpack-cli";
3645 packageName = "webpack-cli";
3646 version = "4.6.0";
3647 src = fetchurl {
3648 url = "https://registry.npmjs.org/webpack-cli/-/webpack-cli-4.6.0.tgz";
3649 sha512 = "9YV+qTcGMjQFiY7Nb1kmnupvb1x40lfpj8pwdO/bom+sQiP4OBMKjHq29YQrlDWDPZO9r/qWaRRywKaRDKqBTA==";
3650 };
3651 };
3652 "webpack-merge-5.7.3" = {
3653 name = "webpack-merge";
3654 packageName = "webpack-merge";
3655 version = "5.7.3";
3656 src = fetchurl {
3657 url = "https://registry.npmjs.org/webpack-merge/-/webpack-merge-5.7.3.tgz";
3658 sha512 = "6/JUQv0ELQ1igjGDzHkXbVDRxkfA57Zw7PfiupdLFJYrgFqY5ZP8xxbpp2lU3EPwYx89ht5Z/aDkD40hFCm5AA==";
3659 };
3660 };
3661 "webpack-sources-2.2.0" = {
3662 name = "webpack-sources";
3663 packageName = "webpack-sources";
3664 version = "2.2.0";
3665 src = fetchurl {
3666 url = "https://registry.npmjs.org/webpack-sources/-/webpack-sources-2.2.0.tgz";
3667 sha512 = "bQsA24JLwcnWGArOKUxYKhX3Mz/nK1Xf6hxullKERyktjNMC4x8koOeaDNTA2fEJ09BdWLbM/iTW0ithREUP0w==";
3668 };
3669 };
3670 "which-1.3.1" = {
3671 name = "which";
3672 packageName = "which";
3673 version = "1.3.1";
3674 src = fetchurl {
3675 url = "https://registry.npmjs.org/which/-/which-1.3.1.tgz";
3676 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
3677 };
3678 };
3679 "which-2.0.2" = {
3680 name = "which";
3681 packageName = "which";
3682 version = "2.0.2";
3683 src = fetchurl {
3684 url = "https://registry.npmjs.org/which/-/which-2.0.2.tgz";
3685 sha512 = "BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==";
3686 };
3687 };
3688 "wide-align-1.1.3" = {
3689 name = "wide-align";
3690 packageName = "wide-align";
3691 version = "1.1.3";
3692 src = fetchurl {
3693 url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";
3694 sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==";
3695 };
3696 };
3697 "wildcard-2.0.0" = {
3698 name = "wildcard";
3699 packageName = "wildcard";
3700 version = "2.0.0";
3701 src = fetchurl {
3702 url = "https://registry.npmjs.org/wildcard/-/wildcard-2.0.0.tgz";
3703 sha512 = "JcKqAHLPxcdb9KM49dufGXn2x3ssnfjbcaQdLlfZsL9rH9wgDQjUtDxbo8NE0F6SFvydeu1VhZe7hZuHsB2/pw==";
3704 };
3705 };
3706 "word-wrap-1.2.3" = {
3707 name = "word-wrap";
3708 packageName = "word-wrap";
3709 version = "1.2.3";
3710 src = fetchurl {
3711 url = "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.3.tgz";
3712 sha512 = "Hz/mrNwitNRh/HUAtM/VT/5VH+ygD6DV7mYKZAtHOrbs8U7lvPS6xf7EJKMF0uW1KJCl0H701g3ZGus+muE5vQ==";
3713 };
3714 };
3715 "wrappy-1.0.2" = {
3716 name = "wrappy";
3717 packageName = "wrappy";
3718 version = "1.0.2";
3719 src = fetchurl {
3720 url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
3721 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
3722 };
3723 };
3724 "write-1.0.3" = {
3725 name = "write";
3726 packageName = "write";
3727 version = "1.0.3";
3728 src = fetchurl {
3729 url = "https://registry.npmjs.org/write/-/write-1.0.3.tgz";
3730 sha512 = "/lg70HAjtkUgWPVZhZcm+T4hkL8Zbtp1nFNOn3lRrxnlv50SRBv7cR7RqR+GMsd3hUXy9hWBo4CHTbFTcOYwig==";
3731 };
3732 };
3733 "xtend-4.0.2" = {
3734 name = "xtend";
3735 packageName = "xtend";
3736 version = "4.0.2";
3737 src = fetchurl {
3738 url = "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz";
3739 sha512 = "LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==";
3740 };
3741 };
3742 "yallist-2.1.2" = {
3743 name = "yallist";
3744 packageName = "yallist";
3745 version = "2.1.2";
3746 src = fetchurl {
3747 url = "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz";
3748 sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
3749 };
3750 };
3751 "yallist-3.1.1" = {
3752 name = "yallist";
3753 packageName = "yallist";
3754 version = "3.1.1";
3755 src = fetchurl {
3756 url = "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz";
3757 sha512 = "a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==";
3758 };
3759 };
3760 "yallist-4.0.0" = {
3761 name = "yallist";
3762 packageName = "yallist";
3763 version = "4.0.0";
3764 src = fetchurl {
3765 url = "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz";
3766 sha512 = "3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==";
3767 };
3768 };
3769 "yocto-queue-0.1.0" = {
3770 name = "yocto-queue";
3771 packageName = "yocto-queue";
3772 version = "0.1.0";
3773 src = fetchurl {
3774 url = "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz";
3775 sha512 = "rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==";
3776 };
3777 };
3778 };
3779 args = {
3780 name = "terraforming-mars";
3781 packageName = "terraforming-mars";
3782 version = "1.0.0";
3783 inherit src;
3784 dependencies = [
3785 sources."@babel/code-frame-7.12.13"
3786 sources."@babel/helper-validator-identifier-7.12.11"
3787 sources."@babel/highlight-7.13.10"
3788 sources."@discoveryjs/json-ext-0.5.2"
3789 sources."@nodelib/fs.scandir-2.1.4"
3790 sources."@nodelib/fs.stat-2.0.4"
3791 sources."@nodelib/fs.walk-1.2.6"
3792 sources."@types/eslint-7.2.10"
3793 sources."@types/eslint-scope-3.7.0"
3794 sources."@types/estree-0.0.46"
3795 sources."@types/json-schema-7.0.7"
3796 sources."@types/node-10.17.58"
3797 sources."@types/pg-7.14.11"
3798 sources."@types/sqlite3-3.1.7"
3799 sources."@typescript-eslint/eslint-plugin-4.22.0"
3800 sources."@typescript-eslint/experimental-utils-4.22.0"
3801 sources."@typescript-eslint/parser-4.22.0"
3802 sources."@typescript-eslint/scope-manager-4.22.0"
3803 sources."@typescript-eslint/types-4.22.0"
3804 sources."@typescript-eslint/typescript-estree-4.22.0"
3805 sources."@typescript-eslint/visitor-keys-4.22.0"
3806 sources."@webassemblyjs/ast-1.11.0"
3807 sources."@webassemblyjs/floating-point-hex-parser-1.11.0"
3808 sources."@webassemblyjs/helper-api-error-1.11.0"
3809 sources."@webassemblyjs/helper-buffer-1.11.0"
3810 sources."@webassemblyjs/helper-numbers-1.11.0"
3811 sources."@webassemblyjs/helper-wasm-bytecode-1.11.0"
3812 sources."@webassemblyjs/helper-wasm-section-1.11.0"
3813 sources."@webassemblyjs/ieee754-1.11.0"
3814 sources."@webassemblyjs/leb128-1.11.0"
3815 sources."@webassemblyjs/utf8-1.11.0"
3816 sources."@webassemblyjs/wasm-edit-1.11.0"
3817 sources."@webassemblyjs/wasm-gen-1.11.0"
3818 sources."@webassemblyjs/wasm-opt-1.11.0"
3819 sources."@webassemblyjs/wasm-parser-1.11.0"
3820 sources."@webassemblyjs/wast-printer-1.11.0"
3821 sources."@webpack-cli/configtest-1.0.2"
3822 sources."@webpack-cli/info-1.2.3"
3823 sources."@webpack-cli/serve-1.3.1"
3824 sources."@xtuc/ieee754-1.2.0"
3825 sources."@xtuc/long-4.2.2"
3826 sources."abbrev-1.1.1"
3827 sources."acorn-7.4.1"
3828 sources."acorn-jsx-5.3.1"
3829 sources."ajv-6.12.6"
3830 sources."ajv-keywords-3.5.2"
3831 sources."ansi-colors-4.1.1"
3832 (sources."ansi-escapes-4.3.2" // {
3833 dependencies = [
3834 sources."type-fest-0.21.3"
3835 ];
3836 })
3837 sources."ansi-regex-4.1.0"
3838 sources."ansi-styles-3.2.1"
3839 sources."aproba-1.2.0"
3840 (sources."are-we-there-yet-1.1.5" // {
3841 dependencies = [
3842 sources."readable-stream-2.3.7"
3843 sources."string_decoder-1.1.1"
3844 ];
3845 })
3846 sources."argparse-1.0.10"
3847 sources."array-union-2.1.0"
3848 sources."asn1-0.2.4"
3849 sources."assert-plus-1.0.0"
3850 sources."astral-regex-1.0.0"
3851 sources."asynckit-0.4.0"
3852 sources."aws-sign2-0.7.0"
3853 sources."aws4-1.11.0"
3854 sources."balanced-match-1.0.2"
3855 sources."bcrypt-pbkdf-1.0.2"
3856 sources."block-stream-0.0.9"
3857 sources."brace-expansion-1.1.11"
3858 sources."braces-3.0.2"
3859 sources."browserslist-4.16.4"
3860 sources."buffer-from-1.1.1"
3861 sources."buffer-writer-2.0.0"
3862 sources."callsites-3.1.0"
3863 sources."caniuse-lite-1.0.30001209"
3864 sources."caseless-0.12.0"
3865 sources."chalk-2.4.2"
3866 sources."chardet-0.7.0"
3867 sources."chownr-1.1.4"
3868 sources."chrome-trace-event-1.0.3"
3869 sources."cli-cursor-3.1.0"
3870 sources."cli-width-3.0.0"
3871 (sources."clone-deep-4.0.1" // {
3872 dependencies = [
3873 sources."kind-of-6.0.3"
3874 ];
3875 })
3876 sources."code-point-at-1.1.0"
3877 sources."color-convert-1.9.3"
3878 sources."color-name-1.1.3"
3879 sources."colorette-1.2.2"
3880 sources."combined-stream-1.0.8"
3881 sources."commander-2.20.3"
3882 sources."compression-webpack-plugin-7.1.2"
3883 sources."concat-map-0.0.1"
3884 sources."config-chain-1.1.12"
3885 sources."console-control-strings-1.1.0"
3886 sources."console-stamp-3.0.0-rc4.2"
3887 sources."copy-anything-2.0.3"
3888 sources."core-util-is-1.0.2"
3889 (sources."cross-spawn-6.0.5" // {
3890 dependencies = [
3891 sources."semver-5.7.1"
3892 ];
3893 })
3894 sources."dashdash-1.14.1"
3895 sources."dateformat-3.0.3"
3896 sources."de-indent-1.0.2"
3897 sources."debug-4.3.1"
3898 sources."deep-extend-0.6.0"
3899 sources."deep-is-0.1.3"
3900 sources."delayed-stream-1.0.0"
3901 sources."delegates-1.0.0"
3902 sources."detect-libc-1.0.3"
3903 sources."dialog-polyfill-0.5.6"
3904 sources."dir-glob-3.0.1"
3905 sources."doctrine-3.0.0"
3906 sources."dotenv-8.2.0"
3907 sources."ecc-jsbn-0.1.2"
3908 (sources."editorconfig-0.15.3" // {
3909 dependencies = [
3910 sources."semver-5.7.1"
3911 ];
3912 })
3913 sources."electron-to-chromium-1.3.717"
3914 sources."emoji-regex-8.0.0"
3915 sources."enhanced-resolve-5.7.0"
3916 sources."enquirer-2.3.6"
3917 sources."envinfo-7.8.1"
3918 sources."errno-0.1.8"
3919 sources."es-module-lexer-0.4.1"
3920 sources."escalade-3.1.1"
3921 sources."escape-string-regexp-1.0.5"
3922 (sources."eslint-6.8.0" // {
3923 dependencies = [
3924 sources."eslint-utils-1.4.3"
3925 sources."eslint-visitor-keys-1.3.0"
3926 sources."regexpp-2.0.1"
3927 sources."semver-6.3.0"
3928 ];
3929 })
3930 sources."eslint-config-google-0.14.0"
3931 (sources."eslint-plugin-vue-6.2.2" // {
3932 dependencies = [
3933 sources."semver-5.7.1"
3934 ];
3935 })
3936 sources."eslint-scope-5.1.1"
3937 (sources."eslint-utils-2.1.0" // {
3938 dependencies = [
3939 sources."eslint-visitor-keys-1.3.0"
3940 ];
3941 })
3942 sources."eslint-visitor-keys-2.0.0"
3943 (sources."espree-6.2.1" // {
3944 dependencies = [
3945 sources."eslint-visitor-keys-1.3.0"
3946 ];
3947 })
3948 sources."esprima-4.0.1"
3949 (sources."esquery-1.4.0" // {
3950 dependencies = [
3951 sources."estraverse-5.2.0"
3952 ];
3953 })
3954 (sources."esrecurse-4.3.0" // {
3955 dependencies = [
3956 sources."estraverse-5.2.0"
3957 ];
3958 })
3959 sources."estraverse-4.3.0"
3960 sources."esutils-2.0.3"
3961 sources."events-3.3.0"
3962 (sources."execa-5.0.0" // {
3963 dependencies = [
3964 sources."cross-spawn-7.0.3"
3965 sources."is-stream-2.0.0"
3966 sources."path-key-3.1.1"
3967 sources."shebang-command-2.0.0"
3968 sources."shebang-regex-3.0.0"
3969 sources."which-2.0.2"
3970 ];
3971 })
3972 sources."extend-3.0.2"
3973 sources."external-editor-3.1.0"
3974 sources."extsprintf-1.3.0"
3975 sources."fast-deep-equal-3.1.3"
3976 sources."fast-glob-3.2.5"
3977 sources."fast-json-stable-stringify-2.1.0"
3978 sources."fast-levenshtein-2.0.6"
3979 sources."fastest-levenshtein-1.0.12"
3980 sources."fastq-1.11.0"
3981 sources."figures-3.2.0"
3982 sources."file-entry-cache-5.0.1"
3983 sources."fill-range-7.0.1"
3984 sources."flat-cache-2.0.1"
3985 sources."flatted-2.0.2"
3986 sources."forever-agent-0.6.1"
3987 sources."form-data-2.3.3"
3988 sources."fs-minipass-1.2.7"
3989 sources."fs.realpath-1.0.0"
3990 sources."fstream-1.0.12"
3991 sources."function-bind-1.1.1"
3992 sources."functional-red-black-tree-1.0.1"
3993 (sources."gauge-2.7.4" // {
3994 dependencies = [
3995 sources."ansi-regex-2.1.1"
3996 sources."is-fullwidth-code-point-1.0.0"
3997 sources."string-width-1.0.2"
3998 sources."strip-ansi-3.0.1"
3999 ];
4000 })
4001 sources."get-stream-6.0.1"
4002 sources."getpass-0.1.7"
4003 sources."glob-7.1.6"
4004 sources."glob-parent-5.1.2"
4005 sources."glob-to-regexp-0.4.1"
4006 sources."globals-12.4.0"
4007 (sources."globby-11.0.3" // {
4008 dependencies = [
4009 sources."ignore-5.1.8"
4010 ];
4011 })
4012 sources."graceful-fs-4.2.6"
4013 sources."har-schema-2.0.0"
4014 sources."har-validator-5.1.5"
4015 sources."has-1.0.3"
4016 sources."has-flag-3.0.0"
4017 sources."has-unicode-2.0.1"
4018 sources."he-1.2.0"
4019 sources."http-signature-1.2.0"
4020 sources."human-signals-2.1.0"
4021 sources."iconv-lite-0.4.24"
4022 sources."ignore-4.0.6"
4023 sources."ignore-walk-3.0.3"
4024 sources."image-size-0.5.5"
4025 sources."import-fresh-3.3.0"
4026 (sources."import-local-3.0.2" // {
4027 dependencies = [
4028 sources."find-up-4.1.0"
4029 sources."locate-path-5.0.0"
4030 sources."p-limit-2.3.0"
4031 sources."p-locate-4.1.0"
4032 sources."pkg-dir-4.2.0"
4033 ];
4034 })
4035 sources."imurmurhash-0.1.4"
4036 sources."inflight-1.0.6"
4037 sources."inherits-2.0.4"
4038 sources."ini-1.3.8"
4039 (sources."inquirer-7.3.3" // {
4040 dependencies = [
4041 sources."ansi-regex-5.0.0"
4042 sources."ansi-styles-4.3.0"
4043 sources."chalk-4.1.0"
4044 sources."color-convert-2.0.1"
4045 sources."color-name-1.1.4"
4046 sources."has-flag-4.0.0"
4047 sources."strip-ansi-6.0.0"
4048 sources."supports-color-7.2.0"
4049 ];
4050 })
4051 sources."interpret-2.2.0"
4052 sources."is-core-module-2.2.0"
4053 sources."is-extglob-2.1.1"
4054 sources."is-fullwidth-code-point-3.0.0"
4055 sources."is-glob-4.0.1"
4056 sources."is-number-7.0.0"
4057 sources."is-plain-object-2.0.4"
4058 sources."is-typedarray-1.0.0"
4059 sources."is-what-3.14.1"
4060 sources."isarray-1.0.0"
4061 sources."isexe-2.0.0"
4062 sources."isobject-3.0.1"
4063 sources."isstream-0.1.2"
4064 (sources."jest-worker-26.6.2" // {
4065 dependencies = [
4066 sources."has-flag-4.0.0"
4067 sources."supports-color-7.2.0"
4068 ];
4069 })
4070 (sources."js-beautify-1.13.13" // {
4071 dependencies = [
4072 sources."mkdirp-1.0.4"
4073 ];
4074 })
4075 sources."js-tokens-4.0.0"
4076 sources."js-yaml-3.14.1"
4077 sources."jsbn-0.1.1"
4078 sources."json-parse-better-errors-1.0.2"
4079 sources."json-schema-0.2.3"
4080 sources."json-schema-traverse-0.4.1"
4081 sources."json-stable-stringify-without-jsonify-1.0.1"
4082 sources."json-stringify-safe-5.0.1"
4083 sources."jsprim-1.4.1"
4084 sources."less-3.13.1"
4085 sources."levn-0.3.0"
4086 sources."loader-runner-4.2.0"
4087 sources."lodash-4.17.21"
4088 sources."lru-cache-4.1.5"
4089 (sources."make-dir-2.1.0" // {
4090 dependencies = [
4091 sources."semver-5.7.1"
4092 ];
4093 })
4094 sources."merge-stream-2.0.0"
4095 sources."merge2-1.4.1"
4096 sources."micromatch-4.0.4"
4097 sources."mime-1.6.0"
4098 sources."mime-db-1.47.0"
4099 sources."mime-types-2.1.30"
4100 sources."mimic-fn-2.1.0"
4101 sources."minimatch-3.0.4"
4102 sources."minimist-1.2.5"
4103 (sources."minipass-2.9.0" // {
4104 dependencies = [
4105 sources."yallist-3.1.1"
4106 ];
4107 })
4108 sources."minizlib-1.3.3"
4109 sources."mkdirp-0.5.5"
4110 sources."mnemonist-0.38.3"
4111 sources."ms-2.1.2"
4112 sources."mute-stream-0.0.8"
4113 sources."native-request-1.0.8"
4114 sources."natural-compare-1.4.0"
4115 (sources."needle-2.6.0" // {
4116 dependencies = [
4117 sources."debug-3.2.7"
4118 ];
4119 })
4120 sources."neo-async-2.6.2"
4121 sources."nice-try-1.0.5"
4122 sources."node-addon-api-3.1.0"
4123 (sources."node-gyp-3.8.0" // {
4124 dependencies = [
4125 sources."nopt-3.0.6"
4126 sources."semver-5.3.0"
4127 ];
4128 })
4129 (sources."node-pre-gyp-0.11.0" // {
4130 dependencies = [
4131 sources."nopt-4.0.3"
4132 sources."semver-5.7.1"
4133 sources."tar-4.4.13"
4134 sources."yallist-3.1.1"
4135 ];
4136 })
4137 sources."node-releases-1.1.71"
4138 sources."nopt-5.0.0"
4139 sources."npm-bundled-1.1.1"
4140 sources."npm-normalize-package-bin-1.0.1"
4141 sources."npm-packlist-1.4.8"
4142 (sources."npm-run-path-4.0.1" // {
4143 dependencies = [
4144 sources."path-key-3.1.1"
4145 ];
4146 })
4147 sources."npmlog-4.1.2"
4148 sources."number-is-nan-1.0.1"
4149 sources."oauth-sign-0.9.0"
4150 sources."object-assign-4.1.1"
4151 sources."obliterator-1.6.1"
4152 sources."once-1.4.0"
4153 sources."onetime-5.1.2"
4154 sources."optionator-0.8.3"
4155 sources."os-homedir-1.0.2"
4156 sources."os-tmpdir-1.0.2"
4157 sources."osenv-0.1.5"
4158 sources."p-limit-3.1.0"
4159 sources."p-try-2.2.0"
4160 sources."packet-reader-1.0.0"
4161 sources."parent-module-1.0.1"
4162 sources."path-exists-4.0.0"
4163 sources."path-is-absolute-1.0.1"
4164 sources."path-key-2.0.1"
4165 sources."path-parse-1.0.6"
4166 sources."path-type-4.0.0"
4167 sources."performance-now-2.1.0"
4168 sources."pg-8.6.0"
4169 sources."pg-connection-string-2.5.0"
4170 sources."pg-int8-1.0.1"
4171 sources."pg-pool-3.3.0"
4172 sources."pg-protocol-1.5.0"
4173 sources."pg-types-2.2.0"
4174 sources."pgpass-1.0.4"
4175 sources."picomatch-2.2.3"
4176 sources."pify-4.0.1"
4177 sources."postgres-array-2.0.0"
4178 sources."postgres-bytea-1.0.0"
4179 sources."postgres-date-1.0.7"
4180 sources."postgres-interval-1.2.0"
4181 sources."prelude-ls-1.1.2"
4182 sources."process-nextick-args-2.0.1"
4183 sources."progress-2.0.3"
4184 sources."proto-list-1.2.4"
4185 sources."prr-1.0.1"
4186 sources."pseudomap-1.0.2"
4187 sources."psl-1.8.0"
4188 sources."punycode-2.1.1"
4189 sources."qs-6.5.2"
4190 sources."queue-microtask-1.2.3"
4191 sources."randombytes-2.1.0"
4192 (sources."rc-1.2.8" // {
4193 dependencies = [
4194 sources."strip-json-comments-2.0.1"
4195 ];
4196 })
4197 sources."readable-stream-3.6.0"
4198 sources."rechoir-0.7.0"
4199 sources."regexpp-3.1.0"
4200 (sources."request-2.88.2" // {
4201 dependencies = [
4202 sources."tough-cookie-2.5.0"
4203 ];
4204 })
4205 sources."resolve-1.20.0"
4206 (sources."resolve-cwd-3.0.0" // {
4207 dependencies = [
4208 sources."resolve-from-5.0.0"
4209 ];
4210 })
4211 sources."resolve-from-4.0.0"
4212 sources."restore-cursor-3.1.0"
4213 sources."reusify-1.0.4"
4214 sources."rimraf-2.6.3"
4215 sources."run-async-2.4.1"
4216 sources."run-parallel-1.2.0"
4217 sources."rxjs-6.6.7"
4218 sources."safe-buffer-5.1.2"
4219 sources."safer-buffer-2.1.2"
4220 sources."sax-1.2.4"
4221 sources."schema-utils-3.0.0"
4222 (sources."semver-7.3.5" // {
4223 dependencies = [
4224 sources."lru-cache-6.0.0"
4225 sources."yallist-4.0.0"
4226 ];
4227 })
4228 sources."serialize-javascript-5.0.1"
4229 sources."set-blocking-2.0.0"
4230 (sources."shallow-clone-3.0.1" // {
4231 dependencies = [
4232 sources."kind-of-6.0.3"
4233 ];
4234 })
4235 sources."shebang-command-1.2.0"
4236 sources."shebang-regex-1.0.0"
4237 sources."sigmund-1.0.1"
4238 sources."signal-exit-3.0.3"
4239 sources."slash-3.0.0"
4240 (sources."slice-ansi-2.1.0" // {
4241 dependencies = [
4242 sources."is-fullwidth-code-point-2.0.0"
4243 ];
4244 })
4245 sources."source-list-map-2.0.1"
4246 sources."source-map-0.6.1"
4247 sources."source-map-support-0.5.19"
4248 sources."spectre.css-0.5.9"
4249 sources."split2-3.2.2"
4250 sources."sprintf-js-1.0.3"
4251 sources."sqlite3-5.0.2"
4252 sources."sshpk-1.16.1"
4253 (sources."string-width-4.2.2" // {
4254 dependencies = [
4255 sources."ansi-regex-5.0.0"
4256 sources."strip-ansi-6.0.0"
4257 ];
4258 })
4259 (sources."string_decoder-1.3.0" // {
4260 dependencies = [
4261 sources."safe-buffer-5.2.1"
4262 ];
4263 })
4264 sources."strip-ansi-5.2.0"
4265 sources."strip-final-newline-2.0.0"
4266 sources."strip-json-comments-3.1.1"
4267 sources."supports-color-5.5.0"
4268 (sources."table-5.4.6" // {
4269 dependencies = [
4270 sources."emoji-regex-7.0.3"
4271 sources."is-fullwidth-code-point-2.0.0"
4272 sources."string-width-3.1.0"
4273 ];
4274 })
4275 sources."tapable-2.2.0"
4276 sources."tar-2.2.2"
4277 (sources."terser-5.6.1" // {
4278 dependencies = [
4279 sources."source-map-0.7.3"
4280 ];
4281 })
4282 sources."terser-webpack-plugin-5.1.1"
4283 sources."text-table-0.2.0"
4284 sources."through-2.3.8"
4285 sources."tmp-0.0.33"
4286 sources."to-regex-range-5.0.1"
4287 sources."tslib-1.14.1"
4288 sources."tsutils-3.21.0"
4289 sources."tunnel-agent-0.6.0"
4290 sources."tweetnacl-0.14.5"
4291 sources."type-check-0.3.2"
4292 sources."type-fest-0.8.1"
4293 sources."typescript-4.2.4"
4294 sources."uri-js-4.4.1"
4295 sources."util-deprecate-1.0.2"
4296 sources."uuid-3.4.0"
4297 sources."v8-compile-cache-2.3.0"
4298 sources."verror-1.10.0"
4299 sources."vue-2.6.10"
4300 (sources."vue-eslint-parser-7.6.0" // {
4301 dependencies = [
4302 sources."eslint-visitor-keys-1.3.0"
4303 ];
4304 })
4305 sources."vue-template-compiler-2.6.10"
4306 sources."watchpack-2.1.1"
4307 (sources."webpack-5.33.2" // {
4308 dependencies = [
4309 sources."acorn-8.1.1"
4310 ];
4311 })
4312 (sources."webpack-cli-4.6.0" // {
4313 dependencies = [
4314 sources."commander-7.2.0"
4315 ];
4316 })
4317 sources."webpack-merge-5.7.3"
4318 sources."webpack-sources-2.2.0"
4319 sources."which-1.3.1"
4320 (sources."wide-align-1.1.3" // {
4321 dependencies = [
4322 sources."ansi-regex-3.0.0"
4323 sources."is-fullwidth-code-point-2.0.0"
4324 sources."string-width-2.1.1"
4325 sources."strip-ansi-4.0.0"
4326 ];
4327 })
4328 sources."wildcard-2.0.0"
4329 sources."word-wrap-1.2.3"
4330 sources."wrappy-1.0.2"
4331 sources."write-1.0.3"
4332 sources."xtend-4.0.2"
4333 sources."yallist-2.1.2"
4334 sources."yocto-queue-0.1.0"
4335 ];
4336 buildInputs = globalBuildInputs;
4337 meta = {
4338 description = "Terraforming Mars Game";
4339 homepage = "https://github.com/bafolts/terraforming-mars#readme";
4340 license = "ISC";
4341 };
4342 production = true;
4343 bypassCache = true;
4344 reconstructLock = false;
4345 };
4346in
4347{
4348 args = args;
4349 sources = sources;
4350 tarball = nodeEnv.buildNodeSourceDist args;
4351 package = nodeEnv.buildNodePackage args;
4352 shell = nodeEnv.buildNodeShell args;
4353}
diff --git a/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix b/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix
new file mode 100644
index 0000000..f190221
--- /dev/null
+++ b/systems/eldiron/websites/games/terraforming-mars/terraforming-mars.nix
@@ -0,0 +1,39 @@
1{ fetchgit, runCommand, callPackage, mylibs, nodePackages, nodejs_16, git }:
2let
3 source = fetchgit {
4 url = "https://github.com/bafolts/terraforming-mars";
5 rev = "25b3f80e276cc0c1fc283a78b6ae94b13c545ab6";
6 sha256 = "03xcwvxv2mlmswngklzqp3lf30hgkvdilqq7p1z4h8xmy50cy12k";
7 leaveDotGit = true;
8 fetchSubmodules = true;
9 };
10 patchedSource = runCommand "patch-source" {} ''
11 cp -r ${source} $out
12 chmod -R u+w $out
13 sed -i -e 's/"lockfileVersion": 2,/"lockfileVersion": 1,/' $out/package-lock.json
14 '';
15 packages = callPackage ./node-packages.nix {
16 src = patchedSource;
17 nodeEnv = callPackage mylibs.nodeEnv { nodejs = nodejs_16; };
18 globalBuildInputs = [ nodejs_16.pkgs.node-pre-gyp ];
19 };
20 terraforming-mars = runCommand "terraforming-mars" {
21 buildInputs = [ nodejs_16 git ];
22 } ''
23 cp -r ${source} ./source
24 chmod -R u+w source
25 cd source
26 patch -p1 < ${./immae-assets.patch}
27 ln -s ${packages.package}/lib/node_modules/terraforming-mars/node_modules .
28 # See https://stackoverflow.com/questions/74548318/how-to-resolve-error-error0308010cdigital-envelope-routinesunsupported-no
29 export NODE_OPTIONS=--openssl-legacy-provider
30 npm run build
31 mkdir $out
32 cp -a build $out/
33 cp -a assets $out/
34 cp package.json $out/
35 ln -s ${packages.package}/lib/node_modules/terraforming-mars/node_modules $out
36 ln -s /var/lib/terraforming-mars/db $out/db
37 '';
38in
39 terraforming-mars
diff --git a/systems/eldiron/websites/git/cgit_js.html b/systems/eldiron/websites/git/cgit_js.html
new file mode 100644
index 0000000..4101071
--- /dev/null
+++ b/systems/eldiron/websites/git/cgit_js.html
@@ -0,0 +1,16 @@
1<script src="https://assets.immae.eu/jquery/3.5.1/jquery.min.js"></script>
2<script type="application/javascript">
3 $(document).ready(function() {
4 const linksObject = {
5 "/github/fretlink": "Fretlink Open-source Github forks",
6 "/github": "Github forks",
7 "/perso/Denise": "Denise",
8 "/perso/Immae": "Immae",
9 }
10 function toRow(href, name) {
11 return `<a href='/cgit${href}'>${name}</a>`;
12 }
13 const links = Object.keys(linksObject).map(function(k) { return toRow(k, linksObject[k]); }).join("");
14 $("table.tabs a.active[href='/cgit/']").after(links);
15 });
16</script>
diff --git a/systems/eldiron/websites/git/default.nix b/systems/eldiron/websites/git/default.nix
new file mode 100644
index 0000000..46ba34d
--- /dev/null
+++ b/systems/eldiron/websites/git/default.nix
@@ -0,0 +1,98 @@
1{ lib, pkgs, config, ... }:
2let
3 mantisbt = pkgs.callPackage ./mantisbt.nix {
4 mantisbt_2 = pkgs.webapps-mantisbt_2;
5 mantisbt_2-plugins = pkgs.webapps-mantisbt_2-plugins;
6 env = config.myEnv.tools.mantisbt;
7 inherit config;
8 };
9 gitweb = pkgs.callPackage ./gitweb.nix {
10 gitoliteDir = config.myServices.gitolite.gitoliteDir;
11 };
12
13 cfg = config.myServices.websites.tools.git;
14in {
15 options.myServices.websites.tools.git = {
16 enable = lib.mkEnableOption "enable git's website";
17 };
18
19 config = lib.mkIf cfg.enable {
20 myServices.chatonsProperties.services.mantisbt = {
21 file.datetime = "2022-08-21T10:08:00";
22 service = {
23 name = "MantisBT";
24 description = "Mantis Bug Tracker";
25 website = "https://git.immae.eu/mantisbt";
26 logo = "https://git.immae.eu/mantisbt/images/favicon.ico";
27 status.level = "OK";
28 status.description = "OK";
29 registration."" = ["MEMBER" "CLIENT"];
30 registration.load = "OPEN";
31 install.type = "PACKAGE";
32 guide.user = "https://www.immae.eu/docs/forge-logicielle.html";
33 };
34 software = {
35 name = "MantisBT";
36 website = "https://mantisbt.org/";
37 license.url = "https://opensource.org/licenses/gpl-license";
38 license.name = "GNU General Public License";
39 version = mantisbt.webRoot.version;
40 source.url = "https://github.com/mantisbt/mantisbt";
41 modules = mantisbt.webRoot.pluginNames;
42 };
43 };
44 secrets.keys = mantisbt.keys;
45 services.websites.env.tools.modules =
46 gitweb.apache.modules ++
47 mantisbt.apache.modules;
48
49 security.acme.certs.eldiron.extraDomainNames = [ "git.immae.eu" ];
50 services.websites.env.tools.vhostConfs.git = {
51 certName = "eldiron";
52 hosts = ["git.immae.eu" ];
53 root = gitweb.apache.root;
54 extraConfig = [
55 gitweb.apache.vhostConf
56 (mantisbt.apache.vhostConf config.services.phpfpm.pools.mantisbt.socket)
57 ''
58 RewriteEngine on
59 RewriteCond %{REQUEST_URI} ^/releases
60 RewriteRule /releases(.*) https://release.immae.eu$1 [P,L]
61 ''
62 ];
63 };
64 services.phpfpm.pools = {
65 mantisbt = {
66 user = config.services.websites.env.tools.user;
67 group = config.services.websites.env.tools.group;
68 settings = mantisbt.phpFpm.pool;
69 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
70 };
71 };
72
73 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
74 myServices.monitoring.fromMasterObjects.service = [
75 {
76 service_description = "gitweb website is running on git.immae.eu";
77 host_name = config.hostEnv.fqdn;
78 use = "external-web-service";
79 check_command = ["check_https" "git.immae.eu" "/cgit" "<title>Immae’s git"];
80
81 servicegroups = "webstatus-webapps";
82 _webstatus_name = "Git";
83 _webstatus_url = "https://git.immae.eu/";
84 }
85
86 {
87 service_description = "mantisbt website is running on git.immae.eu";
88 host_name = config.hostEnv.fqdn;
89 use = "external-web-service";
90 check_command = ["check_https" "git.immae.eu" "/mantisbt/" "<title>My View - MantisBT"];
91
92 servicegroups = "webstatus-webapps";
93 _webstatus_name = "Mantisbt";
94 _webstatus_url = "https://git.immae.eu/mantisbt";
95 }
96 ];
97 };
98}
diff --git a/systems/eldiron/websites/git/gitweb.nix b/systems/eldiron/websites/git/gitweb.nix
new file mode 100644
index 0000000..40f99e0
--- /dev/null
+++ b/systems/eldiron/websites/git/gitweb.nix
@@ -0,0 +1,124 @@
1{ gitweb, writeText, stdenv, coreutils, writeScript, gitolite, git, cgit, gitoliteDir, mailcap, highlight }:
2rec {
3 varDir = gitoliteDir;
4 config = writeText "gitweb.conf" ''
5 $git_temp = "/tmp";
6
7 # The directories where your projects are. Must not end with a
8 # slash.
9 $projectroot = "${varDir}/repositories";
10
11 $projects_list = "${varDir}/projects.list";
12 $strict_export = "true";
13
14 # Base URLs for links displayed in the web interface.
15 our @git_base_url_list = qw(ssh://gitolite@git.immae.eu https://git.immae.eu);
16
17 $feature{'blame'}{'default'} = [1];
18 $feature{'avatar'}{'default'} = ['gravatar'];
19 $feature{'highlight'}{'default'} = [1];
20
21 @stylesheets = ("gitweb-theme/gitweb.css");
22 $logo = "gitweb-theme/git-logo.png";
23 $favicon = "gitweb-theme/git-favicon.png";
24 $javascript = "gitweb-theme/gitweb.js";
25 $logo_url = "https://git.immae.eu/";
26 $projects_list_group_categories = "true";
27 $projects_list_description_width = 60;
28 $project_list_default_category = "__Others__";
29 $highlight_bin = "${highlight}/bin/highlight";
30 '';
31 aboutFilter = writeScript "about-filter.sh" ''
32 #!${stdenv.shell}
33
34 if [ -f "$CGIT_REPO_PATH/README.html" ]; then
35 cat "$CGIT_REPO_PATH/README.html"
36 else
37 ${cgit}/lib/cgit/filters/about-formatting.sh "$@"
38 fi
39 '';
40 cgitConfig = writeText "cgitrc" ''
41 css=/cgit-css/cgit.css
42 logo=/cgit-css/cgit.png
43 favicon=/cgit-css/favicon.ico
44 head-include=${./cgit_js.html}
45
46 root-title=Immae’s git
47 root-desc=To go back to the old interface: https://git.immae.eu/?old
48 readme=:README.md
49 readme=:readme.md
50 readme=:README
51 readme=:DOCUMENTATION.md
52 about-filter=${aboutFilter}
53 #${cgit}/lib/cgit/filters/about-formatting.sh
54 source-filter=${cgit}/lib/cgit/filters/syntax-highlighting.py
55
56 enable-blame=1
57 enable-index-links=1
58 enable-commit-graph=1
59 enable-log-filecount=1
60 enable-log-linecount=1
61
62 enable-html-serving=1
63 # Allow using gitweb.* keys
64 enable-git-config=1
65
66 side-by-side-diffs=1
67 snapshots=tar.gz tar.zst zip
68 mimetype-file=${mailcap}/etc/mime.types
69
70 section=__Others__
71 clone-url=ssh://gitolite@git.immae.eu/$CGIT_REPO_URL https://git.immae.eu/$CGIT_REPO_URL
72 #section-from-path=1
73 project-list=${varDir}/projects.list
74 scan-path=${varDir}/repositories
75 '';
76 apache = rec {
77 user = "wwwrun";
78 group = "wwwrun";
79 modules = [ "cgid" ];
80 root = gitweb;
81 vhostConf = ''
82 SetEnv GIT_PROJECT_ROOT ${varDir}/repositories/
83 ScriptAliasMatch \
84 "(?x)^/(.*/(HEAD | \
85 info/refs | \
86 objects/(info/[^/]+ | \
87 [0-9a-f]{2}/[0-9a-f]{38} | \
88 pack/pack-[0-9a-f]{40}\.(pack|idx)) | \
89 git-(upload|receive)-pack))$" \
90 ${git}/libexec/git-core/git-http-backend/$1
91
92 <Directory "${git}/libexec/git-core">
93 Require all granted
94 </Directory>
95 <Directory "${root}">
96 DirectoryIndex gitweb.cgi
97 Require all granted
98 AllowOverride None
99 Options ExecCGI FollowSymLinks
100 <Files gitweb.cgi>
101 SetHandler cgi-script
102 SetEnv GITWEB_CONFIG "${config}"
103 </Files>
104 </Directory>
105
106 SetEnv CGIT_CONFIG ${cgitConfig}
107 ScriptAlias /cgit "${cgit}/cgit/cgit.cgi/"
108 Alias /cgit-css "${cgit}/cgit"
109 <Directory "${cgit}/cgit/">
110 AllowOverride None
111 Options ExecCGI FollowSymlinks
112 Require all granted
113 </Directory>
114
115 RewriteEngine On
116 RewriteCond %{QUERY_STRING} ^$
117 RewriteRule ^/?$ /cgit [L,R=302]
118
119 RewriteCond %{REQUEST_URI} ^(.*)(\.git)?/?$
120 RewriteCond ${varDir}/repositories/%1.git/HEAD -f
121 RewriteRule ^(.+)$ /cgit$1 [L,R=302]
122 '';
123 };
124}
diff --git a/systems/eldiron/websites/git/mantisbt.nix b/systems/eldiron/websites/git/mantisbt.nix
new file mode 100644
index 0000000..3bd78e1
--- /dev/null
+++ b/systems/eldiron/websites/git/mantisbt.nix
@@ -0,0 +1,86 @@
1{ env, mantisbt_2, mantisbt_2-plugins, config }:
2rec {
3 keys."webapps/tools-mantisbt" = {
4 user = apache.user;
5 group = apache.group;
6 permissions = "0400";
7 text = ''
8 <?php
9 $g_hostname = '${env.postgresql.socket}';
10 $g_db_username = '${env.postgresql.user}';
11 $g_db_password = '${env.postgresql.password}';
12 $g_database_name = '${env.postgresql.database}';
13 $g_db_type = 'pgsql';
14 $g_crypto_master_salt = '${env.master_salt}';
15 $g_allow_signup = OFF;
16 $g_allow_anonymous_login = ON;
17 $g_anonymous_account = 'anonymous';
18
19 $g_phpMailer_method = PHPMAILER_METHOD_SENDMAIL;
20 $g_smtp_host = 'localhost';
21 $g_smtp_username = ''';
22 $g_smtp_password = ''';
23 $g_webmaster_email = 'mantisbt@tools.immae.eu';
24 $g_from_email = 'mantisbt@tools.immae.eu';
25 $g_return_path_email = 'mantisbt@tools.immae.eu';
26 $g_from_name = 'Mantis Bug Tracker at git.immae.eu';
27 $g_email_receive_own = ON;
28 # --- LDAP ---
29 $g_login_method = LDAP;
30 $g_ldap_protocol_version = 3;
31 $g_ldap_server = 'ldaps://${env.ldap.host}:636';
32 $g_ldap_root_dn = 'ou=users,${env.ldap.base}';
33 $g_ldap_bind_dn = '${env.ldap.dn}';
34 $g_ldap_bind_passwd = '${env.ldap.password}';
35 $g_use_ldap_email = ON;
36 $g_use_ldap_realname = ON;
37 $g_ldap_uid_field = 'uid';
38 $g_ldap_realname_field = 'cn';
39 $g_ldap_organization = '${env.ldap.filter}';
40 '';
41 };
42 webRoot = (mantisbt_2.override { mantis_config = config.secrets.fullPaths."webapps/tools-mantisbt"; }).withPlugins (p: [p.slack p.source-integration]);
43 apache = rec {
44 user = "wwwrun";
45 group = "wwwrun";
46 modules = [ "proxy_fcgi" ];
47 root = webRoot;
48 vhostConf = socket: ''
49 Alias /mantisbt "${root}"
50 <Directory "${root}">
51 DirectoryIndex index.php
52 <FilesMatch "\.php$">
53 SetHandler "proxy:unix:${socket}|fcgi://localhost"
54 </FilesMatch>
55
56 AllowOverride All
57 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
58 Options FollowSymlinks
59 Require all granted
60 </Directory>
61 <Directory "${root}/admin">
62 #Reenable during upgrade
63 Require all denied
64 </Directory>
65 '';
66 };
67 phpFpm = rec {
68 serviceDeps = [ "postgresql.service" "openldap.service" ];
69 basedir = builtins.concatStringsSep ":" (
70 [ webRoot config.secrets.fullPaths."webapps/tools-mantisbt" ]
71 ++ webRoot.plugins);
72 pool = {
73 "listen.owner" = apache.user;
74 "listen.group" = apache.group;
75 "pm" = "ondemand";
76 "pm.max_children" = "60";
77 "pm.process_idle_timeout" = "60";
78
79 "php_admin_value[upload_max_filesize]" = "5000000";
80
81 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
82 "php_admin_value[session.save_handler]" = "redis";
83 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:MantisBT:'";
84 };
85 };
86}
diff --git a/systems/eldiron/websites/im/default.nix b/systems/eldiron/websites/im/default.nix
new file mode 100644
index 0000000..7755a5c
--- /dev/null
+++ b/systems/eldiron/websites/im/default.nix
@@ -0,0 +1,118 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.myServices.websites.tools.im;
4 converseVersion = "9.1.1";
5 www = pkgs.runCommand "www" {} ''
6 cp -a ${./www} $out
7 substituteInPlace $out/converse.html --replace {{converseVersion}} ${converseVersion}
8 '';
9in
10{
11 options.myServices.websites.tools.im = {
12 enable = lib.mkEnableOption "enable im website";
13 };
14
15 config = lib.mkIf cfg.enable {
16 myServices.chatonsProperties.services.converse = {
17 file.datetime = "2022-08-21T19:20:00";
18 service = {
19 name = "Converse";
20 description = "A free and open-source XMPP chat client in your browser";
21 website = "https://im.immae.fr/converse";
22 logo = "https://conversejs.org/docs/html/_static/favicon.ico";
23 status.level = "OK";
24 status.description = "OK";
25 registration."" = ["NONE" "FREE"];
26 registration.load = "OPEN";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "Converse";
31 website = "https://conversejs.org/";
32 license.name = "Mozilla Public License 2.0";
33 license.url = "https://github.com/conversejs/converse.js/blob/master/LICENSE";
34 version = "9.1.1";
35 source.url = "https://github.com/conversejs/converse.js";
36 };
37 };
38 myServices.chatonsProperties.services.weechat-bridge = {
39 file.datetime = "2022-08-21T19:20:00";
40 service = {
41 name = "Weechat bridge";
42 description = "WeeChat web frontend";
43 website = "https://im.immae.fr/glowing-bear";
44 logo = "https://im.immae.fr/glowing-bear/assets/img/glowing_bear_128x128.png";
45 status.level = "OK";
46 status.description = "OK";
47 registration."" = ["NONE" "FREE"];
48 registration.load = "OPEN";
49 install.type = "PACKAGE";
50 };
51 software = {
52 name = "Glowing bear";
53 website = "https://www.ejabberd.im/";
54 license.name = "GNU General Public License v3.0";
55 license.url = "https://github.com/processone/ejabberd";
56 version = pkgs.glowing-bear.version;
57 source.url = "https://github.com/glowing-bear/glowing-bear";
58 };
59 };
60 myServices.chatonsProperties.services.xmpp = {
61 file.datetime = "2022-08-21T19:20:00";
62 service = {
63 name = "XMPP";
64 description = "Universal messaging standard";
65 website = "https://im.immae.fr/";
66 logo = "https://xmpp.org/favicon-32x32.png";
67 status.level = "OK";
68 status.description = "OK";
69 registration."" = ["MEMBER" "CLIENT"];
70 registration.load = "OPEN";
71 install.type = "PACKAGE";
72 };
73 software = {
74 name = "ejabberd";
75 website = "https://www.ejabberd.im/";
76 license.url = "https://github.com/processone/ejabberd/blob/master/COPYING";
77 license.name = "GNU GENERAL PUBLIC LICENSE Version 2";
78 version = pkgs.ejabberd.version;
79 source.url = "https://github.com/processone/ejabberd";
80 modules = "converse";
81 };
82 };
83 security.acme.certs.eldiron.extraDomainNames = [ "im.immae.fr" ];
84 services.websites.env.tools.vhostConfs.im = {
85 certName = "eldiron";
86 hosts = ["im.immae.fr"];
87 root = www;
88 extraConfig = [
89 ''
90 Alias /glowing-bear ${pkgs.glowing-bear}
91 Alias /converse ${www}/converse.html
92 ProxyPreserveHost On
93 <Location "/bosh">
94 ProxyPass http://localhost:5280/bosh
95 ProxyPassReverse http://localhost:5280/bosh
96 </Location>
97 <Location "/ws">
98 ProxyPass ws://localhost:5280/ws
99 </Location>
100 ProxyPass /upload http://localhost:5280/upload
101 ProxyPassReverse /upload http://localhost:5280/upload
102 ProxyPass /admin http://localhost:5280/admin
103 ProxyPassReverse /admin http://localhost:5280/admin
104 ProxyPass /api http://localhost:5280/api
105 ProxyPassReverse /api http://localhost:5280/api
106 <Directory ${pkgs.glowing-bear}>
107 AllowOverride none
108 Require all granted
109 </Directory>
110 <Directory ${www}>
111 Require all granted
112 AllowOverride none
113 </Directory>
114 ''
115 ];
116 };
117 };
118}
diff --git a/systems/eldiron/websites/im/www/converse.html b/systems/eldiron/websites/im/www/converse.html
new file mode 100644
index 0000000..4ca451d
--- /dev/null
+++ b/systems/eldiron/websites/im/www/converse.html
@@ -0,0 +1,57 @@
1<!DOCTYPE html>
2<html lang="en">
3 <head>
4 <title>Converse</title>
5 <meta charset="utf-8">
6 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
7 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
8 <meta name="description" content="Converse: An XMPP chat client which can be integrated into any website" />
9 <meta name="keywords" content="xmpp chat webchat converse.js Converse" />
10
11 <link type="text/css" rel="stylesheet" media="screen" href="https://assets.immae.eu/converse/{{converseVersion}}/dist/converse.min.css" />
12 <style type="text/css">
13 #conversejs div.chat-msg__text pre {
14 background-color: #eee;
15 padding: 10px;
16 }
17 </style>
18 <script src="https://assets.immae.eu/converse/{{converseVersion}}/3rdparty/libsignal-protocol.min.js"></script>
19 <script src="https://assets.immae.eu/converse/{{converseVersion}}/dist/converse.min.js"></script>
20 <script src="https://assets.immae.eu/marked/1.2.6/marked.min.js"></script>
21 <script src="https://assets.immae.eu/markdown-it/10.0.0/markdown-it.min.js"></script>
22 </head>
23 <body>
24 <script>
25 var md = window.markdownit({
26 html: true,
27 });
28 converse.plugins.add('markdown', {
29 //initialize () {
30 // const { _converse } = this;
31 // _converse.api.listen.on('afterMessageBodyTransformed', (view, text) => {
32 // let newtext = text.replace(/<br\/>/g, '\n').replace(/```/g, "\n```\n");
33 // newtext = md.render(newtext).replace(/^<p>/, "").replace(/<\/p>\s*$/, "");
34 // view.model.save({'message': newtext}, {'silent': true });
35 // });
36 //}
37 overrides: {
38 MessageView: {
39 transformBodyText: async function(text) {
40 let newtext = await this.__super__.transformBodyText.apply(this, arguments);
41 newtext = newtext.replace(/<br\/>/g, '\n').replace(/```/g, "\n```\n");
42 return md.render(newtext).replace(/^<p>/, "").replace(/<\/p>\s*$/, "");
43 }
44 }
45 }
46 });
47 converse.initialize({
48 //bosh_service_url: 'https://im.immae.fr/bosh',
49 websocket_url: 'wss://im.immae.fr/ws',
50 view_mode: 'fullscreen',
51 show_controlbox_by_default: true,
52 whitelisted_plugins: ['markdown'],
53 });
54 </script>
55 </body>
56</html>
57
diff --git a/systems/eldiron/websites/im/www/index.html b/systems/eldiron/websites/im/www/index.html
new file mode 100644
index 0000000..90c5458
--- /dev/null
+++ b/systems/eldiron/websites/im/www/index.html
@@ -0,0 +1,47 @@
1<!doctype html>
2<html lang="fr">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>Instant messaging configuration (Jabber/XMPP)</title>
7 <style type="text/css">
8 body {
9 padding-top: 1em;
10 padding-left: 5px;
11 padding-right: 5px;
12 text-align: left;
13 margin: auto;
14 font: 20px Helvetica, sans-serif;
15 color: #333;
16 height: 100%;
17 min-height: 100%;
18 }
19 article {
20 text-align: justify;
21 display: block;
22 max-width: 850px;
23 margin: 0 auto;
24 padding-top: 30px;
25 }
26 span.code {
27 font-family: monospace;
28 }
29 </style>
30 </head>
31 <body>
32 <p>
33 Pre-configured clients:
34 <ul>
35 <li><a href="converse">Converse client</a></li>
36 <li><a href="glowing-bear">Weechat relay client</a></li>
37 </ul>
38 </p>
39 <p>
40 Technical details:
41 <ul>
42 <li>HTTP-bind/BOSH access (XEP-0124 / XEP-0206): <span class="code">https://im.immae.fr/bosh</span></li>
43 <li>WS access (RFC 7395): <span class="code">wss://im.immae.fr/ws</span></li>
44 </ul>
45 </p>
46 </body>
47</html>
diff --git a/systems/eldiron/websites/immae/matrix/client b/systems/eldiron/websites/immae/matrix/client
new file mode 100644
index 0000000..89136a0
--- /dev/null
+++ b/systems/eldiron/websites/immae/matrix/client
@@ -0,0 +1,11 @@
1{
2 "m.homeserver": {
3 "base_url": "https://immae.ems.host"
4 },
5 "m.identity_server": {
6 "base_url": "https://vector.im"
7 },
8 "org.matrix.msc3575.proxy": {
9 "url": "https://immae.ems.host"
10 }
11}
diff --git a/systems/eldiron/websites/immae/matrix/server b/systems/eldiron/websites/immae/matrix/server
new file mode 100644
index 0000000..449155a
--- /dev/null
+++ b/systems/eldiron/websites/immae/matrix/server
@@ -0,0 +1,3 @@
1{
2 "m.server": "immae.ems.host:443"
3}
diff --git a/systems/eldiron/websites/immae/production.nix b/systems/eldiron/websites/immae/production.nix
new file mode 100644
index 0000000..e4060ba
--- /dev/null
+++ b/systems/eldiron/websites/immae/production.nix
@@ -0,0 +1,107 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.immae.production;
4 varDir = "/var/lib/buildbot/outputs/immae/blog";
5 historyDir = "/var/lib/buildbot/outputs/immae/history";
6 docsDir = "/var/lib/buildbot/outputs/immae/docs/";
7in {
8 options.myServices.websites.immae.production.enable = lib.mkEnableOption "enable Immae's website";
9
10 config = lib.mkIf cfg.enable {
11 myServices.dns.zones."immae.eu".subdomains = with config.myServices.dns.helpers;
12 {
13 www = ips servers.eldiron.ips.production;
14 matrix.CNAME = [ "immae.element.io." ];
15 };
16 services.webstats.sites = [ { name = "www.immae.eu"; } ];
17
18 security.acme.certs.immae.domain = "www.immae.eu";
19 security.acme.certs.immae.extraDomainNames = [ "immae.eu" ];
20 services.websites.env.production.bindMounts."${varDir}" = {};
21 services.websites.env.production.bindMounts."${docsDir}" = {};
22 services.websites.env.production.bindMounts."${historyDir}" = {};
23 services.websites.env.production.vhostConfs.immae_production = {
24 certName = "immae";
25 hosts = [ "www.immae.eu" "immae.eu" ];
26 root = varDir;
27 extraConfig = [
28 ''
29 Use Stats www.immae.eu
30 Header always set Strict-Transport-Security "max-age=31536000"
31
32 <LocationMatch /.well-known/(webfinger|host-meta)>
33 Header always set Referrer-Policy "strict-origin-when-cross-origin"
34 RequestHeader set X-Forwarded-Proto "https"
35
36 RewriteRule ^(.*)$ https://mastodon.immae.eu%{REQUEST_URI} [QSA,L]
37 </LocationMatch>
38
39 RewriteEngine On
40 RewriteCond "%{REQUEST_URI}" "!^/.well-known/(webfinger|host-meta)"
41 RewriteCond "%{HTTP_HOST}" "!^www\.immae\.eu$" [NC]
42 RewriteRule ^(.+)$ https://www.immae.eu$1 [R=302,L]
43
44 <Directory ${varDir}>
45 DirectoryIndex index.htm index.html
46 Options Indexes FollowSymLinks MultiViews Includes
47 AllowOverride All
48 Require all granted
49 </Directory>
50
51 Alias /.well-known/matrix ${./matrix}
52 <Directory ${./matrix}>
53 Options Indexes FollowSymLinks MultiViews Includes
54 AllowOverride None
55 Require all granted
56 Header always set Access-Control-Allow-Origin "*"
57 </Directory>
58
59 Alias /docs ${docsDir}
60 <Directory ${docsDir}>
61 DirectoryIndex index.htm index.html
62 Options Indexes FollowSymLinks MultiViews Includes
63 AllowOverride All
64 Require all granted
65 </Directory>
66
67 Alias /eurl ${./sarl}
68 Alias /eurl ${./sarl}
69 <Directory ${./sarl}>
70 DirectoryIndex index.htm index.html
71 Options Indexes FollowSymLinks MultiViews Includes
72 AllowOverride None
73 Require all granted
74 </Directory>
75
76 Alias /history ${historyDir}
77 <Directory ${historyDir}>
78 DirectoryIndex index.html
79 AllowOverride None
80 Require all granted
81 </Directory>
82
83 Alias /.well-known/chatonsinfos ${config.myServices.chatonsProperties.propertiesPath}
84 <Directory ${config.myServices.chatonsProperties.propertiesPath}>
85 Options Indexes FollowSymLinks MultiViews Includes
86 AllowOverride None
87 Require all granted
88 </Directory>
89 ''
90 ];
91 };
92
93 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
94 myServices.monitoring.fromMasterObjects.service = [
95 {
96 service_description = "blog website is running on immae.eu";
97 host_name = config.hostEnv.fqdn;
98 use = "external-web-service";
99 check_command = ["check_https" "www.immae.eu" "/blog/" "egrep -ri TODO /etc"];
100
101 servicegroups = "webstatus-websites";
102 _webstatus_name = "Immae’s Blog";
103 _webstatus_url = "https://www.immae.eu/blog";
104 }
105 ];
106 };
107}
diff --git a/systems/eldiron/websites/immae/release.nix b/systems/eldiron/websites/immae/release.nix
new file mode 100644
index 0000000..4882bac
--- /dev/null
+++ b/systems/eldiron/websites/immae/release.nix
@@ -0,0 +1,40 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.websites.immae.release;
4 varDir = "/var/lib/ftp/release.immae.eu";
5in {
6 options.myServices.websites.immae.release.enable = lib.mkEnableOption "enable Release' website";
7
8 config = lib.mkIf cfg.enable {
9 myServices.dns.zones."immae.eu".subdomains.release = with config.myServices.dns.helpers;
10 ips servers.eldiron.ips.production;
11 services.webstats.sites = [ { name = "release.immae.eu"; } ];
12
13 security.acme.certs.immae.extraDomainNames = [ "release.immae.eu" ];
14 services.websites.env.production.vhostConfs.immae_release = {
15 certName = "immae";
16 hosts = [ "release.immae.eu" ];
17 root = varDir;
18 extraConfig = [
19 ''
20 Use Stats release.immae.eu
21
22 Use Apaxy "${varDir}" "title .duplicity-ignore"
23 <Directory "${varDir}">
24 Use LDAPConnect
25 Options Indexes
26 AllowOverride All
27 Require all granted
28 </Directory>
29
30 <Directory "${varDir}/packages">
31 Use LDAPConnect
32 Options Indexes FollowSymlinks
33 AllowOverride None
34 Require all granted
35 </Directory>
36 ''
37 ];
38 };
39 };
40}
diff --git a/systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt b/systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt
new file mode 100644
index 0000000..671534c
--- /dev/null
+++ b/systems/eldiron/websites/immae/sarl/certificates/2021-certificate.crt
@@ -0,0 +1,23 @@
1-----BEGIN CERTIFICATE-----
2MIIDyzCCArOgAwIBAgIUXNW7Lmte+fa5YxI7Gdznl7ZaLPIwDQYJKoZIhvcNAQEL
3BQAwdTELMAkGA1UEBhMCRlIxGDAWBgNVBAgMD0FscGVzLU1hcml0aW1lczEPMA0G
4A1UEBwwGR3Jhc3NlMRUwEwYDVQQKDAxJbW1hZUV1IEVVUkwxJDAiBgkqhkiG9w0B
5CQEWFWNvbnRhY3RAbWFpbC5pbW1hZS5ldTAeFw0yMTAxMTkwMDI5MDlaFw0yMjAx
6MTkwMDI5MDlaMHUxCzAJBgNVBAYTAkZSMRgwFgYDVQQIDA9BbHBlcy1NYXJpdGlt
7ZXMxDzANBgNVBAcMBkdyYXNzZTEVMBMGA1UECgwMSW1tYWVFdSBFVVJMMSQwIgYJ
8KoZIhvcNAQkBFhVjb250YWN0QG1haWwuaW1tYWUuZXUwggEiMA0GCSqGSIb3DQEB
9AQUAA4IBDwAwggEKAoIBAQDeyWKvTu2kuJ2HSgRzZZL6yFNHUXGgcl/q8vlRKFI4
10P0yHwcEwDCaCXquqS09WN99H55aNTjHfnu70dZXogyWHGk4vlaUkGiUoCAYK5tFU
1134fzpZuInhBL8nRY0pRV4H2t02jQMyiYowZXTqR86BRocbXZ4TY5EwD/hlrH6iDc
12pIlC7cVnWV4J5qXX9fXALbpXseD9PF0/y2tP5dM658jBL9KdW1PqlPGudvB44Z+a
13pE8XCXF9PGrVBNN7aPmizOb42scx/2XghX1DYCikiUf8m+FGjidxGlXmj4B6Dukp
14b7RxdkY7p97svH91uMQuUvDW5d93ZiatHNeYuAl8yI39AgMBAAGjUzBRMB0GA1Ud
15DgQWBBSgsFwzEybKyLF/Bkuz7FA5SwfwPTAfBgNVHSMEGDAWgBSgsFwzEybKyLF/
16Bkuz7FA5SwfwPTAPBgNVHRMBAf8EBTADAQH/MA0GCSqGSIb3DQEBCwUAA4IBAQDX
17Wij/gDT+7N/pSSVWImiYoe+/KsAJd0TLs39GJkvW0114RXKINYNU8exNY7rKMVCl
18TKePEevSo5CCartNfLXGIr3uqPlR+V3XF6KmyMSiB6k+GukoUtUg2Bp7ESGlpZXi
19wkHYclk0NIzxWyUrzNdflxu3gPU278qFMbUIlbdWNsHtrLbpHypelPQ+IaEbNoWV
20Q+M8Vg6ifsDmhp7TqFXpIoGa6CIxXuknDOidBpeE9kPjVu0kKrjXQULirNl3eEe6
21H1XUQ7lSdt/l3N1cHTj70x2xIi6fdwPQRqhXILrIuST+C0wpPiqPCv1rfcwh0PvU
22mZVZ/+83y3Zuo9lVqkbB
23-----END CERTIFICATE-----
diff --git a/systems/eldiron/websites/kanboard/farm.nix b/systems/eldiron/websites/kanboard/farm.nix
new file mode 100644
index 0000000..a70d0d6
--- /dev/null
+++ b/systems/eldiron/websites/kanboard/farm.nix
@@ -0,0 +1,183 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.tools.kanboard.farm;
4 apacheUser = config.services.websites.env.tools.user;
5 apacheGroup = config.services.websites.env.tools.group;
6 toVardir = name: "/var/lib/kanboard_farm/${name}";
7 varDirs = lib.mapAttrsToList (name: v: toVardir name) cfg.instances;
8 toPhpBaseDir = name: [ rootDir (toVardir name) ];
9 phpBaseDir = builtins.concatStringsSep ":" (lib.unique (lib.flatten (lib.mapAttrsToList (name: v: toPhpBaseDir name) cfg.instances)));
10 rootDir = pkgs.kanboard;
11
12 toVhost = name: ''
13 Alias /${name} "${rootDir}"
14 <Location /${name}>
15 SetEnv DATA_DIR "${toVardir name}"
16 SetEnv MAIL_FROM "kanboard@tools.immae.eu"
17 </Location>
18 '';
19 toCustomVhost = name: lib.optionalAttrs (cfg.instances."${name}".customHost != null) {
20 "kanboard_farm_${name}" = {
21 certName = "eldiron";
22 hosts = [cfg.instances."${name}".customHost];
23 root = null;
24 extraConfig = [
25 ''
26 Alias / "${rootDir}"
27 <Location />
28 SetEnv DATA_DIR "${toVardir name}"
29 SetEnv MAIL_FROM "kanboard@tools.immae.eu"
30 </Location>
31 <Directory "${rootDir}">
32 DirectoryIndex index.php
33 AllowOverride All
34 Options FollowSymlinks
35 Require all granted
36
37 <FilesMatch "\.php$">
38 SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost"
39 </FilesMatch>
40 </Directory>
41 <DirectoryMatch "${rootDir}/data">
42 Require all denied
43 </DirectoryMatch>
44 ''
45 ];
46 };
47 };
48 customHosts = lib.filter (n: n != null) (map (n: cfg.instances."${n}".customHost) (builtins.attrNames cfg.instances));
49 customVhosts = lib.foldl (o: n: o // n) {} (map toCustomVhost (builtins.attrNames cfg.instances));
50 phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [all.redis]);
51in
52{
53 options.myServices.tools.kanboard.farm = {
54 instances = lib.mkOption {
55 description = "Instances names for the kanboard Farm";
56 default = {};
57 type = lib.types.attrsOf (lib.types.submodule {
58 options = {
59 customHost = lib.mkOption {
60 description = "Custom host to use for the kanboard instance";
61 default = null;
62 type = lib.types.nullOr lib.types.str;
63 };
64 };
65 });
66 };
67 vhosts = lib.mkOption {
68 description = "Instance vhosts configs";
69 readOnly = true;
70 type = lib.types.attrsOf lib.types.str;
71 default = lib.mapAttrs (name: v: toVhost name) cfg.instances;
72 };
73 };
74
75 config = lib.mkIf (builtins.length (builtins.attrNames cfg.instances) > 0) {
76 myServices.dns.zones."immae.eu".subdomains.kanboard =
77 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
78
79 myServices.chatonsProperties.hostings.kanboard = {
80 file.datetime = "2022-08-21T19:40:00";
81 hosting = {
82 name = "Kanboard";
83 description = "Kanban project management software";
84 website = "https://tools.immae.eu/kanboard";
85 logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png";
86 type = "INSTANCE";
87 status.level = "OK";
88 status.description = "OK";
89 registration.load = "OPEN";
90 install.type = "PACKAGE";
91 };
92 };
93 myServices.chatonsProperties.services.kanboard = {
94 file.datetime = "2022-08-21T19:40:00";
95 service = {
96 name = "Kanboard";
97 description = "Kanban project management software";
98 website = "https://tools.immae.eu/kanboard";
99 logo = "https://tools.immae.eu/kanboard/assets/img/favicon.png";
100 status.level = "OK";
101 status.description = "OK";
102 registration."" = ["MEMBER" "CLIENT"];
103 registration.load = "OPEN";
104 install.type = "PACKAGE";
105 };
106 software = {
107 name = "Kanboard";
108 website = "https://kanboard.org/";
109 license.url = "https://github.com/kanboard/kanboard/blob/main/LICENSE";
110 license.name = "MIT License";
111 version = pkgs.kanboard.version;
112 source.url = "https://github.com/kanboard/kanboard";
113 };
114 };
115 system.activationScripts.kanboard_farm_vardirs = {
116 deps = [ "httpd" ];
117 text = ''
118 install -m 0755 -o ${apacheUser} -g ${apacheGroup} -d ${builtins.concatStringsSep " " varDirs}
119 '';
120 };
121 services.phpfpm.pools.kanboard_farm = {
122 user = apacheUser;
123 group = apacheGroup;
124 settings = let
125 instanceNb = builtins.length (builtins.attrNames cfg.instances);
126 in {
127 "listen.owner" = apacheUser;
128 "listen.group" = apacheGroup;
129 "pm" = "dynamic";
130 "pm.max_children" = builtins.toString (60 * instanceNb);
131 "pm.start_servers" = builtins.toString (2 * instanceNb);
132 "pm.min_spare_servers" = builtins.toString (2 * instanceNb);
133 "pm.max_spare_servers" = builtins.toString (3 * instanceNb);
134 "pm.process_idle_timeout" = "60";
135
136 "php_admin_value[output_buffering]" = "0";
137 "php_admin_value[max_execution_time]" = "1800";
138 "php_admin_value[zend_extension]" = "opcache";
139 "php_value[apcu.enable_cli]" = "1";
140 "php_value[apcu.enabled]" = "1";
141 #already enabled by default?
142 #"php_value[opcache.enable]" = "1";
143 "php_value[opcache.enable_cli]" = "1";
144 "php_value[opcache.interned_strings_buffer]" = "8";
145 "php_value[opcache.max_accelerated_files]" = "10000";
146 "php_value[opcache.memory_consumption]" = "128";
147 "php_value[opcache.save_comments]" = "1";
148 "php_value[opcache.revalidate_freq]" = "1";
149 "php_admin_value[memory_limit]" = "512M";
150
151 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${phpBaseDir}:/proc/meminfo:/dev/urandom:/proc/self/fd:/tmp";
152 "php_admin_value[session.save_handler]" = "redis";
153 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:KanboardFarm:'";
154 };
155 inherit phpPackage;
156 };
157 security.acme.certs.eldiron.extraDomainNames = customHosts ++ [ "kanboard.immae.eu" ];
158 services.websites.env.tools.vhostConfs = {
159 kanboard = {
160 certName = "eldiron";
161 hosts = ["kanboard.immae.eu"];
162 root = null;
163 extraConfig = [
164 ''
165 <Directory "${rootDir}">
166 DirectoryIndex index.php
167 AllowOverride All
168 Options FollowSymlinks
169 Require all granted
170
171 <FilesMatch "\.php$">
172 SetHandler "proxy:unix:${config.services.phpfpm.pools.kanboard_farm.socket}|fcgi://localhost"
173 </FilesMatch>
174 </Directory>
175 <DirectoryMatch "${rootDir}/data">
176 Require all denied
177 </DirectoryMatch>
178 ''
179 ] ++ builtins.attrValues cfg.vhosts;
180 };
181 } // customVhosts;
182 };
183}
diff --git a/systems/eldiron/websites/mail/default.nix b/systems/eldiron/websites/mail/default.nix
new file mode 100644
index 0000000..0a0342b
--- /dev/null
+++ b/systems/eldiron/websites/mail/default.nix
@@ -0,0 +1,141 @@
1{ lib, pkgs, config, ... }:
2let
3 roundcubemail = pkgs.callPackage ./roundcubemail.nix {
4 roundcubemail = pkgs.webapps-roundcubemail;
5 env = config.myEnv.tools.roundcubemail;
6 inherit config;
7 };
8 rainloop = pkgs.callPackage ./rainloop.nix {
9 rainloop = pkgs.rainloop-community;
10 };
11 cfg = config.myServices.websites.tools.email;
12 pcfg = config.services.phpfpm.pools;
13in
14{
15 options.myServices.websites.tools.email = {
16 enable = lib.mkEnableOption "enable email website";
17 };
18
19 imports = [
20 ./mta-sts.nix
21 ];
22
23 config = lib.mkIf cfg.enable {
24 #myServices.chatonsProperties.services.mail-rainloop = {
25 # file.datetime = "2022-08-22T00:30:00";
26 # service = {
27 # name = "Rainloop";
28 # description = "Simple, modern & fast web-based email client";
29 # website = "https://mail.immae.eu/rainloop";
30 # logo = "https://www.rainloop.net/static/img/logo-16x16.png";
31 # status.level = "ERROR";
32 # status.description = "Stopped due to CVE-2022-29360";
33 # registration."" = ["MEMBER" "CLIENT"];
34 # registration.load = "OPEN";
35 # install.type = "PACKAGE";
36 # };
37 # software = {
38 # name = "Rainloop";
39 # website = "https://www.rainloop.net/";
40 # license.url = "https://www.rainloop.net/licensing/";
41 # license.name = "GNU Affero General Public License v3.0";
42 # version = rainloop.webRoot.version;
43 # source.url = "https://github.com/RainLoop/rainloop-webmail";
44 # };
45 #};
46 #myServices.chatonsProperties.services.mail-roundcube = {
47 # file.datetime = "2022-08-22T00:30:00";
48 # service = {
49 # name = "Roundcube";
50 # description = "The Roundcube Webmail suite";
51 # website = "https://mail.immae.eu/roundcube";
52 # logo = "https://mail.immae.eu/roundcube/skins/elastic/images/favicon.ico";
53 # status.level = "OK";
54 # status.description = "OK";
55 # registration."" = ["MEMBER" "CLIENT"];
56 # registration.load = "OPEN";
57 # install.type = "PACKAGE";
58 # };
59 # software = {
60 # name = "Roundcube";
61 # website = "https://roundcube.net/";
62 # license.url = "https://github.com/roundcube/roundcubemail/blob/master/LICENSE";
63 # license.name = "GNU General Public License v3.0";
64 # version = roundcubemail.webRoot.version;
65 # source.url = "https://github.com/roundcube/roundcubemail";
66 # modules = map (a: a.pluginName) roundcubemail.webRoot.plugins ++ map (a: a.skinName) roundcubemail.webRoot.skins;
67 # };
68 #};
69
70 myServices.dns.zones."immae.eu".subdomains.mail =
71 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
72
73 secrets.keys = roundcubemail.keys;
74
75 services.websites.env.tools.modules =
76 [ "proxy_fcgi" ]
77 ++ rainloop.apache.modules
78 ++ roundcubemail.apache.modules;
79
80 security.acme.certs.mail.extraDomainNames = [ "mail.immae.eu" ];
81 services.websites.env.tools.vhostConfs.mail = {
82 certName = "mail";
83 hosts = ["mail.immae.eu"];
84 root = ./www;
85 extraConfig = [
86 (rainloop.apache.vhostConf pcfg.rainloop.socket)
87 (roundcubemail.apache.vhostConf pcfg.roundcubemail.socket)
88 ''
89 <Directory ${./www}>
90 Require all granted
91 Options -Indexes
92 </Directory>
93 ''
94 ];
95 };
96 systemd.services = {
97 phpfpm-rainloop = {
98 after = lib.mkAfter rainloop.phpFpm.serviceDeps;
99 wants = rainloop.phpFpm.serviceDeps;
100 };
101 phpfpm-roundcubemail = {
102 after = lib.mkAfter roundcubemail.phpFpm.serviceDeps;
103 wants = roundcubemail.phpFpm.serviceDeps;
104 };
105 };
106
107 services.phpfpm.pools.roundcubemail = {
108 user = "wwwrun";
109 group = "wwwrun";
110 settings = roundcubemail.phpFpm.pool;
111 phpOptions = config.services.phpfpm.phpOptions + ''
112 date.timezone = 'CET'
113 '';
114 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.imagick all.redis ]);
115 };
116 services.phpfpm.pools.rainloop = {
117 user = "wwwrun";
118 group = "wwwrun";
119 settings = rainloop.phpFpm.pool;
120 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
121 };
122 system.activationScripts = {
123 roundcubemail = roundcubemail.activationScript;
124 rainloop = rainloop.activationScript;
125 };
126 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
127 myServices.monitoring.fromMasterObjects.service = [
128 {
129 service_description = "roundcube website is running on mail.immae.eu";
130 host_name = config.hostEnv.fqdn;
131 use = "external-web-service";
132 check_command = ["check_https" "mail.immae.eu" "/roundcube/" "<title>Roundcube"];
133
134 servicegroups = "webstatus-webapps,webstatus-email";
135 _webstatus_name = "Roundcube";
136 _webstatus_url = "https://mail.immae.eu/roundcube/";
137 }
138 ];
139 };
140
141}
diff --git a/systems/eldiron/websites/mail/mta-sts.nix b/systems/eldiron/websites/mail/mta-sts.nix
new file mode 100644
index 0000000..2438702
--- /dev/null
+++ b/systems/eldiron/websites/mail/mta-sts.nix
@@ -0,0 +1,42 @@
1{ lib, pkgs, config, ... }:
2let
3 getDomains = p: lib.mapAttrsToList (n: v: v) (lib.filterAttrs (n: v: v.receive) p.emailPolicies);
4 bydomain = builtins.mapAttrs (n: getDomains) config.myServices.dns.zones;
5 domains = lib.flatten (builtins.attrValues bydomain);
6 mxes = lib.mapAttrsToList
7 (n: v: v.mx.subdomain)
8 (lib.attrsets.filterAttrs (n: v: v.mx.enable) config.myEnv.servers);
9 file = d: pkgs.writeText "mta-sts-${d.fqdn}.txt" (
10 builtins.concatStringsSep "\r\n" ([ "version: STSv1" "mode: testing" ]
11 ++ (map (v: "mx: ${v}.${d.domain}") mxes)
12 ++ [ "max_age: 604800" ]
13 ));
14 root = pkgs.runCommand "mta-sts_root" {} ''
15 mkdir -p $out
16 ${builtins.concatStringsSep "\n" (map (d:
17 "cp ${file d} $out/${d.fqdn}.txt"
18 ) domains)}
19 '';
20 cfg = config.myServices.websites.tools.email;
21in
22{
23 config = lib.mkIf cfg.enable {
24 security.acme.certs.mail.extraDomainNames = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.fqdn}") domains;
25 services.websites.env.tools.vhostConfs.mta_sts = {
26 certName = "mail";
27 hosts = ["mta-sts.mail.immae.eu"] ++ map (v: "mta-sts.${v.fqdn}") domains;
28 root = root;
29 extraConfig = [
30 ''
31 RewriteEngine on
32 RewriteCond %{HTTP_HOST} ^mta-sts.(.*)$
33 RewriteRule ^/.well-known/mta-sts.txt$ %{DOCUMENT_ROOT}/%1.txt [L]
34 <Directory ${root}>
35 Require all granted
36 Options -Indexes
37 </Directory>
38 ''
39 ];
40 };
41 };
42}
diff --git a/systems/eldiron/websites/mail/rainloop.nix b/systems/eldiron/websites/mail/rainloop.nix
new file mode 100644
index 0000000..f821005
--- /dev/null
+++ b/systems/eldiron/websites/mail/rainloop.nix
@@ -0,0 +1,54 @@
1{ lib, rainloop, writeText, stdenv, fetchurl }:
2rec {
3 varDir = "/var/lib/rainloop";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}
8 install -m 0750 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
9 '';
10 };
11 webRoot = rainloop.override { dataPath = "${varDir}/data"; };
12 apache = rec {
13 user = "wwwrun";
14 group = "wwwrun";
15 modules = [ "proxy_fcgi" ];
16 root = webRoot;
17 vhostConf = socket: ''
18 Alias /rainloop "${root}"
19 <Directory "${root}">
20 DirectoryIndex index.php
21 AllowOverride All
22 Options -FollowSymlinks
23 Require all denied
24
25 <FilesMatch "\.php$">
26 SetHandler "proxy:unix:${socket}|fcgi://localhost"
27 </FilesMatch>
28 </Directory>
29
30 <DirectoryMatch "${root}/data">
31 Require all denied
32 </DirectoryMatch>
33 '';
34 };
35 phpFpm = rec {
36 serviceDeps = [ "postgresql.service" ];
37 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
38 pool = {
39 "listen.owner" = apache.user;
40 "listen.group" = apache.group;
41 "pm" = "ondemand";
42 "pm.max_children" = "60";
43 "pm.process_idle_timeout" = "60";
44
45 # Needed to avoid clashes in browser cookies (same domain)
46 "php_value[session.name]" = "RainloopPHPSESSID";
47 "php_admin_value[upload_max_filesize]" = "200M";
48 "php_admin_value[post_max_size]" = "200M";
49 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
50 "php_admin_value[session.save_handler]" = "redis";
51 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Rainloop:'";
52 };
53 };
54}
diff --git a/systems/eldiron/websites/mail/roundcubemail.nix b/systems/eldiron/websites/mail/roundcubemail.nix
new file mode 100644
index 0000000..21a10fe
--- /dev/null
+++ b/systems/eldiron/websites/mail/roundcubemail.nix
@@ -0,0 +1,119 @@
1{ env, roundcubemail, apacheHttpd, config }:
2rec {
3 varDir = "/var/lib/roundcubemail";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
8 ${varDir}/cache ${varDir}/logs
9 '';
10 };
11 keys."webapps/tools-roundcube" = {
12 user = apache.user;
13 group = apache.group;
14 permissions = "0400";
15 text =
16 let
17 psql_url = with env.postgresql; "pgsql://${user}:${password}@unix(${socket}:${port})/${database}";
18 in ''
19 <?php
20 $config['db_dsnw'] = '${psql_url}';
21 $config['default_host'] = 'ssl://imap.immae.eu';
22 $config['username_domain'] = array(
23 "imap.immae.eu" => "mail.immae.eu"
24 );
25 $config['imap_conn_options'] = array("ssl" => array("verify_peer" => false));
26 $config['smtp_server'] = 'tls://smtp.immae.eu';
27 $config['smtp_port'] = '587';
28 $config['managesieve_host'] = 'imap.immae.eu';
29 $config['managesieve_port'] = '4190';
30 $config['managesieve_usetls'] = true;
31 $config['managesieve_conn_options'] = array("ssl" => array("verify_peer" => false));
32
33 $config['imap_cache'] = 'db';
34 $config['messages_cache'] = 'db';
35
36 $config['support_url'] = ''';
37
38 $config['des_key'] = '${env.secret}';
39
40 $config['skin'] = 'elastic';
41 $config['plugins'] = array(
42 'attachment_reminder',
43 'emoticons',
44 'filesystem_attachments',
45 'hide_blockquote',
46 'identicon',
47 'identity_select',
48 'jqueryui',
49 'markasjunk',
50 'managesieve',
51 'newmail_notifier',
52 'vcard_attachments',
53 'zipdownload',
54
55 'automatic_addressbook',
56 'message_highlight',
57 'carddav',
58 // Ne marche pas ?: 'ident_switch',
59 // Ne marche pas ?: 'thunderbird_labels',
60 );
61
62 $config['language'] = 'fr_FR';
63
64 $config['drafts_mbox'] = 'Drafts';
65 $config['junk_mbox'] = 'Junk';
66 $config['sent_mbox'] = 'Sent';
67 $config['trash_mbox'] = 'Trash';
68 $config['default_folders'] = array('INBOX', 'Drafts', 'Sent', 'Junk', 'Trash');
69 $config['draft_autosave'] = 60;
70 $config['enable_installer'] = false;
71 $config['log_driver'] = 'file';
72 $config['temp_dir'] = '${varDir}/cache';
73 $config['mime_types'] = '${apacheHttpd}/conf/mime.types';
74 '';
75 keyDependencies = [ apacheHttpd ];
76 };
77 webRoot = (roundcubemail.override { roundcube_config = config.secrets.fullPaths."webapps/tools-roundcube"; }).withPlugins (p: [ p.automatic_addressbook p.carddav p.contextmenu p.contextmenu_folder p.html5_notifier p.ident_switch p.message_highlight p.thunderbird_labels ]);
78 apache = rec {
79 user = "wwwrun";
80 group = "wwwrun";
81 modules = [ "proxy_fcgi" ];
82 root = webRoot;
83 vhostConf = socket: ''
84 Alias /roundcube "${root}"
85 <Directory "${root}">
86 DirectoryIndex index.php
87 AllowOverride All
88 Options FollowSymlinks
89 Require all granted
90
91 <FilesMatch "\.php$">
92 SetHandler "proxy:unix:${socket}|fcgi://localhost"
93 </FilesMatch>
94 </Directory>
95 '';
96 };
97 phpFpm = rec {
98 serviceDeps = [ "postgresql.service" ];
99 basedir = builtins.concatStringsSep ":" (
100 [ webRoot config.secrets.fullPaths."webapps/tools-roundcube" varDir ]
101 ++ webRoot.plugins
102 ++ webRoot.skins);
103 pool = {
104 "listen.owner" = apache.user;
105 "listen.group" = apache.group;
106 "pm" = "ondemand";
107 "pm.max_children" = "60";
108 "pm.process_idle_timeout" = "60";
109
110 # Needed to avoid clashes in browser cookies (same domain)
111 "php_value[session.name]" = "RoundcubemailPHPSESSID";
112 "php_admin_value[upload_max_filesize]" = "200M";
113 "php_admin_value[post_max_size]" = "200M";
114 "php_admin_value[open_basedir]" = "${basedir}:${apacheHttpd}/conf/mime.types:/tmp";
115 "php_admin_value[session.save_handler]" = "redis";
116 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Roundcubemail:'";
117 };
118 };
119}
diff --git a/systems/eldiron/websites/mail/www/index.html b/systems/eldiron/websites/mail/www/index.html
new file mode 100644
index 0000000..88b0ebd
--- /dev/null
+++ b/systems/eldiron/websites/mail/www/index.html
@@ -0,0 +1,74 @@
1<!doctype html>
2<html lang="fr">
3 <head>
4 <meta charset="UTF-8">
5 <meta name="viewport" content="width=device-width, initial-scale=1.0">
6 <title>E-mail configuration</title>
7 <style type="text/css">
8 body {
9 padding-top: 1em;
10 padding-left: 5px;
11 padding-right: 5px;
12 text-align: left;
13 margin: auto;
14 font: 20px Helvetica, sans-serif;
15 color: #333;
16 height: 100%;
17 min-height: 100%;
18 }
19 article {
20 text-align: justify;
21 display: block;
22 max-width: 850px;
23 margin: 0 auto;
24 padding-top: 30px;
25 }
26 span.code {
27 font-family: monospace;
28 }
29 </style>
30 </head>
31 <body>
32 <p>
33 Email configuration. For automatic configuration in your smart e-mail
34 client, use <span class="code">login@mail.immae.eu</span>. If it
35 doesn’t work, the details are there:
36 <ul>
37 <li>IMAP: <span class="code">imap.immae.eu</span>
38 <ul>
39 <li>No unencrypted access</li>
40 <li>STARTTLS: 143</li>
41 <li>SSL: 993</li>
42 </ul>
43 </li>
44 <li>POP3: <span class="code">pop3.immae.eu</span>
45 <ul>
46 <li>No unencrypted access</li>
47 <li>STARTTLS: 110</li>
48 <li>SSL: 995</li>
49 </ul>
50 </li>
51 <li>SMTP: <span class="code">smtp.immae.eu</span>
52 <ul>
53 <li>No unencrypted access</li>
54 <li>STARTTLS: 587</li>
55 <li>SSL: 465</li>
56 </ul>
57 </li>
58 <li>Sieve: <span class="code">imap.immae.eu</span>
59 <ul>
60 <li>No unencrypted access</li>
61 <li>STARTTLS: 4190</li>
62 </ul>
63 </li>
64 </ul>
65 </p>
66 <p>Webmails:
67 <ul>
68 <li><a href="/roundcube">Roundcube</a></li>
69 <li><a href="/rainloop">Rainloop</a> (experimental)</li>
70 </ul>
71 </p>
72 </body>
73</html>
74
diff --git a/systems/eldiron/websites/mastodon/default.nix b/systems/eldiron/websites/mastodon/default.nix
new file mode 100644
index 0000000..603fc9e
--- /dev/null
+++ b/systems/eldiron/websites/mastodon/default.nix
@@ -0,0 +1,174 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.mastodon;
4 root = "${mcfg.workdir}/public/";
5 cfg = config.myServices.websites.tools.mastodon;
6 mcfg = config.immaeServices.mastodon;
7in {
8 options.myServices.websites.tools.mastodon = {
9 enable = lib.mkEnableOption "enable mastodon's website";
10 };
11
12 config = lib.mkIf cfg.enable {
13 myServices.dns.zones."immae.eu".subdomains.mastodon =
14 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
15
16 myServices.chatonsProperties.services.mastodon = {
17 file.datetime = "2022-08-21T19:50:00";
18 service = {
19 name = "Mastodon";
20 description = "Your self-hosted, globally interconnected microblogging community";
21 website = "https://mastodon.immae.eu/";
22 logo = "https://mastodon.immae.eu/apple-touch-icon.png";
23 status.level = "OK";
24 status.description = "OK";
25 registration."" = ["MEMBER" "CLIENT"];
26 registration.load = "OPEN";
27 install.type = "PACKAGE";
28 };
29 software = {
30 name = "Mastodon";
31 website = "https://joinmastodon.org/";
32 license.url = "https://github.com/tootsuite/mastodon/blob/master/LICENSE";
33 license.name = "GNU General Public License v3.0";
34 version = mcfg.package.version;
35 source.url = "https://github.com/tootsuite/mastodon";
36 };
37 };
38 secrets.keys."webapps/tools-mastodon" = {
39 user = "mastodon";
40 group = "mastodon";
41 permissions = "0400";
42 text = ''
43 REDIS_HOST=${env.redis.host}
44 REDIS_PORT=${env.redis.port}
45 REDIS_DB=${env.redis.db}
46 DB_HOST=${env.postgresql.socket}
47 DB_USER=${env.postgresql.user}
48 DB_NAME=${env.postgresql.database}
49 DB_PASS=${env.postgresql.password}
50 DB_PORT=${env.postgresql.port}
51
52 LOCAL_DOMAIN=mastodon.immae.eu
53 LOCAL_HTTPS=true
54 ALTERNATE_DOMAINS=immae.eu
55
56 PAPERCLIP_SECRET=${env.paperclip_secret}
57 SECRET_KEY_BASE=${env.secret_key_base}
58 OTP_SECRET=${env.otp_secret}
59
60 VAPID_PRIVATE_KEY=${env.vapid.private}
61 VAPID_PUBLIC_KEY=${env.vapid.public}
62
63 SMTP_DELIVERY_METHOD=sendmail
64 SMTP_FROM_ADDRESS=mastodon@tools.immae.eu
65 SENDMAIL_LOCATION="/run/wrappers/bin/sendmail"
66 PAPERCLIP_ROOT_PATH=${mcfg.dataDir}
67
68 STREAMING_CLUSTER_NUM=1
69
70 RAILS_LOG_LEVEL=warn
71
72 # LDAP authentication (optional)
73 LDAP_ENABLED=true
74 LDAP_HOST=${env.ldap.host}
75 LDAP_PORT=636
76 LDAP_METHOD=simple_tls
77 LDAP_BASE="${env.ldap.base}"
78 LDAP_BIND_DN="${env.ldap.dn}"
79 LDAP_PASSWORD="${env.ldap.password}"
80 LDAP_UID="uid"
81 LDAP_SEARCH_FILTER="${env.ldap.filter}"
82 '';
83 };
84 immaeServices.mastodon = {
85 enable = true;
86 configFile = config.secrets.fullPaths."webapps/tools-mastodon";
87 socketsPrefix = "live_immae";
88 dataDir = "/var/lib/mastodon_immae";
89 };
90 services.filesWatcher.mastodon-streaming = {
91 restart = true;
92 paths = [ mcfg.configFile ];
93 };
94 services.filesWatcher.mastodon-web = {
95 restart = true;
96 paths = [ mcfg.configFile ];
97 };
98 services.filesWatcher.mastodon-sidekiq = {
99 restart = true;
100 paths = [ mcfg.configFile ];
101 };
102
103
104 services.websites.env.tools.modules = [
105 "headers" "proxy" "proxy_wstunnel" "proxy_http"
106 ];
107 security.acme.certs.eldiron.extraDomainNames = [ "mastodon.immae.eu" ];
108 services.websites.env.tools.vhostConfs.mastodon = {
109 certName = "eldiron";
110 hosts = ["mastodon.immae.eu" ];
111 root = root;
112 extraConfig = [ ''
113 Header always set Referrer-Policy "strict-origin-when-cross-origin"
114 Header always set Strict-Transport-Security "max-age=31536000"
115
116 <LocationMatch "^/(assets|avatars|emoji|headers|packs|sounds|system)>
117 Header always set Cache-Control "public, max-age=31536000, immutable"
118 Require all granted
119 </LocationMatch>
120
121 ProxyPreserveHost On
122 RequestHeader set X-Forwarded-Proto "https"
123
124 RewriteEngine On
125
126 RewriteRule ^/api/v1/streaming/(.+)$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/$1 [P,NE,QSA,L]
127 RewriteRule ^/api/v1/streaming/public$ unix://${mcfg.sockets.node}|http://mastodon.immae.eu/api/v1/streaming/public [P,NE,QSA,L]
128 RewriteRule ^/api/v1/streaming/$ unix://${mcfg.sockets.node}|ws://mastodon.immae.eu/ [P,NE,QSA,L]
129 RewriteCond %{REQUEST_URI} !/500.html
130 RewriteCond %{REQUEST_URI} !/sw.js
131 RewriteCond %{REQUEST_URI} !/embed.js
132 RewriteCond %{REQUEST_URI} !/robots.txt
133 RewriteCond %{REQUEST_URI} !/manifest.json
134 RewriteCond %{REQUEST_URI} !/browserconfig.xml
135 RewriteCond %{REQUEST_URI} !/mask-icon.svg
136 RewriteCond %{REQUEST_URI} !^(/.*\.(png|ico|gif)$)
137 RewriteCond %{REQUEST_URI} !^/(assets|avatars|emoji|headers|packs|sounds|system|.well-known/acme-challenge)
138 RewriteRule ^/(.*)$ unix:///run/mastodon/live_immae_puma.sock|http://mastodon.immae.eu/$1 [P,NE,QSA,L]
139 ProxyPassReverse / unix://${mcfg.sockets.rails}|http://mastodon.immae.eu/
140
141 Alias /system ${mcfg.dataDir}
142
143 <Directory ${mcfg.dataDir}>
144 Require all granted
145 Options -MultiViews
146 </Directory>
147
148 <Directory ${root}>
149 Require all granted
150 Options -MultiViews +FollowSymlinks
151 </Directory>
152
153 ErrorDocument 500 /500.html
154 ErrorDocument 501 /500.html
155 ErrorDocument 502 /500.html
156 ErrorDocument 503 /500.html
157 ErrorDocument 504 /500.html
158 '' ];
159 };
160 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
161 myServices.monitoring.fromMasterObjects.service = [
162 {
163 service_description = "mastodon website is running on mastodon.immae.eu";
164 host_name = config.hostEnv.fqdn;
165 use = "external-web-service";
166 check_command = ["check_https" "mastodon.immae.eu" "/" "Mastodon</title>"];
167
168 servicegroups = "webstatus-webapps";
169 _webstatus_name = "Mastodon";
170 _webstatus_url = "https://mastodon.immae.eu/";
171 }
172 ];
173 };
174}
diff --git a/systems/eldiron/websites/mgoblin/default.nix b/systems/eldiron/websites/mgoblin/default.nix
new file mode 100644
index 0000000..f276c62
--- /dev/null
+++ b/systems/eldiron/websites/mgoblin/default.nix
@@ -0,0 +1,173 @@
1{ lib, pkgs, config, mediagoblin, ... }:
2let
3 env = config.myEnv.tools.mediagoblin;
4 cfg = config.myServices.websites.tools.mediagoblin;
5 mcfg = config.services.mediagoblin;
6in {
7 options.myServices.websites.tools.mediagoblin = {
8 enable = lib.mkEnableOption "enable mediagoblin's website";
9 };
10
11 config = lib.mkIf cfg.enable {
12 myServices.dns.zones."immae.eu".subdomains.mgoblin =
13 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
14
15 myServices.chatonsProperties.services.mediagoblin = {
16 file.datetime = "2022-08-21T20:00:00";
17 service = {
18 name = "Mediagoblin";
19 description = "MediaGoblin is a free software media publishing platform that anyone can run";
20 website = "https://mgoblin.immae.eu/";
21 logo = "https://mgoblin.immae.eu/mgoblin_static/images/goblin.ico";
22 status.level = "OK";
23 status.description = "OK";
24 registration."" = ["MEMBER" "CLIENT"];
25 registration.load = "OPEN";
26 install.type = "PACKAGE";
27 };
28 software = {
29 name = "Mediagoblin";
30 website = "https://mediagoblin.org/";
31 license.url = "http://www.gnu.org/licenses/agpl.html";
32 license.name = "GNU Affero General Public License";
33 version = mcfg.package.version;
34 source.url = "https://git.savannah.gnu.org/git/mediagoblin.git";
35 modules = map (a: a.pluginName) mcfg.package.plugins;
36 };
37 };
38 secrets.keys."webapps/tools-mediagoblin" = {
39 user = "mediagoblin";
40 group = "mediagoblin";
41 permissions = "0400";
42 text =
43 let
44 psql_url = with env.postgresql; "postgresql://${user}:${password}@:${port}/${database}?host=${socket}";
45 redis_url = with env.redis; "redis+socket://${socket}?virtual_host=${db}";
46 in
47 ''
48 [DEFAULT]
49 data_basedir = "${mcfg.dataDir}"
50
51 [mediagoblin]
52 direct_remote_path = /mgoblin_static/
53 email_sender_address = "mediagoblin@tools.immae.eu"
54
55 #sql_engine = sqlite:///%(data_basedir)s/mediagoblin.db
56 sql_engine = ${psql_url}
57
58 email_debug_mode = false
59 allow_registration = false
60 allow_reporting = true
61
62 theme = airymodified
63
64 user_privilege_scheme = "uploader,commenter,reporter"
65
66 # We need to redefine them here since we override data_basedir
67 # cf /usr/share/webapps/mediagoblin/mediagoblin/config_spec.ini
68 workbench_path = %(data_basedir)s/media/workbench
69 crypto_path = %(data_basedir)s/crypto
70 theme_install_dir = %(data_basedir)s/themes/
71 theme_linked_assets_dir = %(data_basedir)s/theme_static/
72 plugin_linked_assets_dir = %(data_basedir)s/plugin_static/
73
74 [storage:queuestore]
75 base_dir = %(data_basedir)s/media/queue
76
77 [storage:publicstore]
78 base_dir = %(data_basedir)s/media/public
79 base_url = /mgoblin_media/
80
81 [celery]
82 CELERY_RESULT_DBURI = ${redis_url}
83 BROKER_URL = ${redis_url}
84 CELERYD_CONCURRENCY = 1
85
86 [plugins]
87 [[mediagoblin.plugins.geolocation]]
88 [[mediagoblin.plugins.ldap]]
89 [[[immae.eu]]]
90 LDAP_SERVER_URI = 'ldaps://${env.ldap.host}:636'
91 LDAP_SEARCH_BASE = '${env.ldap.base}'
92 LDAP_BIND_DN = '${env.ldap.dn}'
93 LDAP_BIND_PW = '${env.ldap.password}'
94 LDAP_SEARCH_FILTER = '${env.ldap.filter}'
95 EMAIL_SEARCH_FIELD = 'mail'
96 [[mediagoblin.plugins.basicsearch]]
97 [[mediagoblin.plugins.piwigo]]
98 [[mediagoblin.plugins.processing_info]]
99 [[mediagoblin.media_types.image]]
100 [[mediagoblin.media_types.video]]
101 '';
102 };
103
104 users.users.mediagoblin.extraGroups = [ "keys" ];
105
106 services.mediagoblin = {
107 enable = true;
108 package = mediagoblin.withPlugins (p: [p.basicsearch]);
109 configFile = config.secrets.fullPaths."webapps/tools-mediagoblin";
110 };
111 services.filesWatcher.mediagoblin-web = {
112 restart = true;
113 paths = [ mcfg.configFile ];
114 };
115 services.filesWatcher.mediagoblin-celeryd = {
116 restart = true;
117 paths = [ mcfg.configFile ];
118 };
119
120 services.websites.env.tools.modules = [
121 "proxy" "proxy_http"
122 ];
123 users.users.wwwrun.extraGroups = [ "mediagoblin" ];
124 security.acme.certs.eldiron.extraDomainNames = [ "mgoblin.immae.eu" ];
125 services.websites.env.tools.vhostConfs.mgoblin = {
126 certName = "eldiron";
127 hosts = ["mgoblin.immae.eu" ];
128 root = null;
129 extraConfig = [ ''
130 Alias /mgoblin_media ${mcfg.dataDir}/media/public
131 <Directory ${mcfg.dataDir}/media/public>
132 Options -Indexes +FollowSymLinks +MultiViews +Includes
133 Require all granted
134 </Directory>
135
136 Alias /theme_static ${mcfg.dataDir}/theme_static
137 <Directory ${mcfg.dataDir}/theme_static>
138 Options -Indexes +FollowSymLinks +MultiViews +Includes
139 Require all granted
140 </Directory>
141
142 Alias /plugin_static ${mcfg.dataDir}/plugin_static
143 <Directory ${mcfg.dataDir}/plugin_static>
144 Options -Indexes +FollowSymLinks +MultiViews +Includes
145 Require all granted
146 </Directory>
147
148 ProxyPreserveHost on
149 ProxyVia On
150 ProxyRequests Off
151 ProxyPass /mgoblin_media !
152 ProxyPass /theme_static !
153 ProxyPass /plugin_static !
154 ProxyPassMatch ^/.well-known/acme-challenge !
155 ProxyPass / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/
156 ProxyPassReverse / unix://${mcfg.sockets.paster}|http://mgoblin.immae.eu/
157 '' ];
158 };
159 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
160 myServices.monitoring.fromMasterObjects.service = [
161 {
162 service_description = "mediagoblin website is running on mgoblin.immae.eu";
163 host_name = config.hostEnv.fqdn;
164 use = "external-web-service";
165 check_command = ["check_https" "mgoblin.immae.eu" "/" "<title>GNU MediaGoblin"];
166
167 servicegroups = "webstatus-webapps";
168 _webstatus_name = "Mediagoblin";
169 _webstatus_url = "https://mgoblin.immae.eu/";
170 }
171 ];
172 };
173}
diff --git a/systems/eldiron/websites/moomin.txt b/systems/eldiron/websites/moomin.txt
new file mode 100644
index 0000000..036fb1c
--- /dev/null
+++ b/systems/eldiron/websites/moomin.txt
@@ -0,0 +1,16 @@
1⠀⠀⠀⠀⠀⠀⠀⢠⢦⡀⠀⡰⣩⠃
2⠀⠀⠀⠀⠀⠀⠀⠘⣄⠙⠍⠁⠙⠦⡀
3⠀⠀⠀⠀⠀⠀⠀⠀⡎⠀⠀⡠⠄⠔⠊⠉⠒⠒⠒⢄
4⠀⠀⠀⠀⠀⠀⠀⢀⠇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢈⠆
5⠀⠀⢠⢤⠜⡆⠀⢸⠀⠰⣄⠀⠀⠀⠀⠀⠀⠀⣠⠎
6⠀⠀⠱⠤⡁⠈⠑⠇⠀⠀⠀⠉⠒⠤⠤⠄⢖⠊⠀⡐⠧⣄⣀
7⠀⠀⠀⠀⠘⢆⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠹⡉⠀⣀⣨⡷
8⠀⠀⠀⠀⠀⠈⡇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⢱⠜⠁
9⠀⠀⠀⠀⠀⠀⢇⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⣸⠱⡀
10⠀⠀⠀⠀⠀⠀⠸⡀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠀⠸⠁⠀⣣
11⠀⠀⠀⠀⠀⠀⠀⠑⣄⠀⠀⠀⠀⠀⠀⠀⢀⣠⣀⠴⠊⠁
12⠰⢍⢒⢄⠀⠀⠀⠀⢸⢳⢆⠀⠀⠀⠰⡖⠋⠁
13⠀⠳⠴⣙⢄⠀⢀⡠⣣⠃⠈⠑⢤⡄⠀⡸⠂
14⠀⠀⠀⠀⠑⠋⠓⠊⠁⠀⠀⠀⠓⠒⠉
15Credentials: https://twitter.com/thingskatedid/status/1278274012754309120
16Credentials: https://gist.github.com/katef/09581d7c84eddf784508fa430f6ef47a
diff --git a/systems/eldiron/websites/nossl/index.html b/systems/eldiron/websites/nossl/index.html
new file mode 100644
index 0000000..4401a80
--- /dev/null
+++ b/systems/eldiron/websites/nossl/index.html
@@ -0,0 +1,11 @@
1<!DOCTYPE html>
2<html>
3 <head>
4 <title>No SSL site</title>
5 </head>
6 <body>
7 <h1>No SSL on this site</h1>
8 <p>Use for wifi networks with login page that doesn't work well with
9 https.</p>
10 </body>
11</html>
diff --git a/systems/eldiron/websites/peertube/default.nix b/systems/eldiron/websites/peertube/default.nix
new file mode 100644
index 0000000..0ebe4e7
--- /dev/null
+++ b/systems/eldiron/websites/peertube/default.nix
@@ -0,0 +1,147 @@
1{ lib, pkgs, config, ... }:
2let
3 env = config.myEnv.tools.peertube;
4 cfg = config.myServices.websites.tools.peertube;
5 pcfg = config.immaeServices.peertube;
6in {
7 options.myServices.websites.tools.peertube = {
8 enable = lib.mkEnableOption "enable Peertube's website";
9 };
10
11 config = lib.mkIf cfg.enable {
12 myServices.dns.zones."immae.eu".subdomains.peertube =
13 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
14
15 myServices.chatonsProperties.hostings.peertube = {
16 file.datetime = "2022-08-21T20:00:00";
17 hosting = {
18 name = "Peertube";
19 description = "Free software to take back control of your videos";
20 website = "https://peertube.immae.eu/";
21 logo = "https://peertube.immae.eu/client/assets/images/icons/icon-192x192.png";
22 type = "INSTANCE";
23 status.level = "OK";
24 status.description = "OK";
25 registration.load = "OPEN";
26 install.type = "PACKAGE";
27 };
28 };
29 myServices.chatonsProperties.services.peertube = {
30 file.datetime = "2022-08-21T20:00:00";
31 service = {
32 name = "Peertube";
33 description = "Free software to take back control of your videos";
34 website = "https://peertube.immae.eu/";
35 logo = "https://peertube.immae.eu/client/assets/images/icons/icon-192x192.png";
36 status.level = "OK";
37 status.description = "OK";
38 registration."" = ["MEMBER" "CLIENT"];
39 registration.load = "OPEN";
40 install.type = "PACKAGE";
41 };
42 software = {
43 name = "Peertube";
44 website = "https://joinpeertube.org/";
45 license.url = "https://github.com/Chocobozzz/PeerTube/blob/develop/LICENSE";
46 license.name = "GNU Affero General Public License";
47 version = pcfg.package.version;
48 source.url = "https://github.com/Chocobozzz/PeerTube";
49 };
50 };
51 immaeServices.peertube = {
52 enable = true;
53 configFile = config.secrets.fullPaths."webapps/tools-peertube";
54 };
55 users.users.peertube.extraGroups = [ "keys" ];
56
57 secrets.keys."webapps/tools-peertube" = {
58 user = "peertube";
59 group = "peertube";
60 permissions = "0640";
61 text = ''
62 listen:
63 hostname: 'localhost'
64 port: ${toString config.myEnv.ports.peertube}
65 webserver:
66 https: true
67 hostname: 'peertube.immae.eu'
68 port: 443
69 database:
70 hostname: '${env.postgresql.socket}'
71 port: 5432
72 suffix: '_prod'
73 username: '${env.postgresql.user}'
74 password: '${env.postgresql.password}'
75 pool:
76 max: 5
77 redis:
78 socket: '${env.redis.socket}'
79 auth: null
80 db: ${env.redis.db}
81 smtp:
82 transport: sendmail
83 sendmail: '/run/wrappers/bin/sendmail'
84 from_address: 'peertube@tools.immae.eu'
85 storage:
86 tmp: '${pcfg.dataDir}/storage/tmp/'
87 avatars: '${pcfg.dataDir}/storage/avatars/'
88 videos: '${pcfg.dataDir}/storage/videos/'
89 streaming_playlists: '${pcfg.dataDir}/storage/streaming-playlists/'
90 redundancy: '${pcfg.dataDir}/storage/videos/'
91 logs: '${pcfg.dataDir}/storage/logs/'
92 previews: '${pcfg.dataDir}/storage/previews/'
93 thumbnails: '${pcfg.dataDir}/storage/thumbnails/'
94 torrents: '${pcfg.dataDir}/storage/torrents/'
95 captions: '${pcfg.dataDir}/storage/captions/'
96 cache: '${pcfg.dataDir}/storage/cache/'
97 plugins: '${pcfg.dataDir}/storage/plugins/'
98 client_overrides: '${pcfg.dataDir}/storage/client-overrides/'
99 '';
100 };
101
102 services.websites.env.tools.modules = [
103 "headers" "proxy" "proxy_http" "proxy_wstunnel"
104 ];
105 services.filesWatcher.peertube = {
106 restart = true;
107 paths = [ pcfg.configFile ];
108 };
109
110 security.acme.certs.eldiron.extraDomainNames = [ "peertube.immae.eu" ];
111 services.websites.env.tools.vhostConfs.peertube = {
112 certName = "eldiron";
113 hosts = [ "peertube.immae.eu" ];
114 root = null;
115 extraConfig = [ ''
116 RewriteEngine On
117
118 RewriteCond %{REQUEST_URI} ^/socket.io [NC]
119 RewriteCond %{QUERY_STRING} transport=websocket [NC]
120 RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
121
122 RewriteCond %{REQUEST_URI} ^/tracker/socket [NC]
123 RewriteRule /(.*) ws://localhost:${toString env.listenPort}/$1 [P,NE,QSA,L]
124
125 ProxyPass / http://localhost:${toString env.listenPort}/
126 ProxyPassReverse / http://localhost:${toString env.listenPort}/
127
128 ProxyPreserveHost On
129 RequestHeader set X-Real-IP %{REMOTE_ADDR}s
130 '' ];
131 };
132
133 myServices.monitoring.fromMasterActivatedPlugins = [ "http" ];
134 myServices.monitoring.fromMasterObjects.service = [
135 {
136 service_description = "peertube website is running on peertube.immae.eu";
137 host_name = config.hostEnv.fqdn;
138 use = "external-web-service";
139 check_command = ["check_https" "peertube.immae.eu" "/" "<title>Immae’s PeerTube"];
140
141 servicegroups = "webstatus-webapps";
142 _webstatus_name = "Peertube";
143 _webstatus_url = "https://peertube.immae.eu/";
144 }
145 ];
146 };
147}
diff --git a/systems/eldiron/websites/performance/default.nix b/systems/eldiron/websites/performance/default.nix
new file mode 100644
index 0000000..23f754a
--- /dev/null
+++ b/systems/eldiron/websites/performance/default.nix
@@ -0,0 +1,93 @@
1{ pkgs, lib, config, ... }:
2let
3 env = config.myEnv.tools.status_engine;
4 package = pkgs.status-engine-interface.override({ config_file = config.secrets.fullPaths."status_engine_ui"; });
5 apacheRoot = "${package}/public";
6 cfg = config.myServices.websites.tools.performance;
7in
8{
9 options.myServices.websites.tools.performance = {
10 enable = lib.mkEnableOption "Enable performance website";
11 };
12
13 config = lib.mkIf cfg.enable {
14 myServices.dns.zones."immae.eu".subdomains.performance =
15 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
16
17 secrets.keys = {
18 status_engine_ui = {
19 permissions = "0400";
20 user = "wwwrun";
21 group = "wwwrun";
22 text = ''
23 allow_anonymous: 0
24 anonymous_can_submit_commands: 0
25 urls_without_login:
26 - login
27 - loginstate
28 auth_type: ldap
29 ldap_server: ${env.ldap.host}
30 ldap_use_ssl: 1
31 ldap_port: 636
32 ldap_bind_dn: ${env.ldap.dn}
33 ldap_bind_password: ${env.ldap.password}
34 ldap_base_dn: ${env.ldap.base}
35 ldap_filter: "${env.ldap.filter}"
36 ldap_attribute:
37 - memberOf
38 use_crate: 0
39 use_mysql: 1
40 mysql:
41 host: 127.0.0.1
42 port: ${builtins.toString env.mysql.port}
43 username: ${env.mysql.user}
44 password: ${env.mysql.password}
45 database: ${env.mysql.database}
46 display_perfdata: 1
47 perfdata_backend: mysql
48 '';
49 };
50 };
51
52 services.websites.env.tools.modules = [ "proxy_fcgi" ];
53
54 security.acme.certs.eldiron.extraDomainNames = [ "performance.immae.eu" ];
55 services.websites.env.tools.vhostConfs.performance = {
56 certName = "eldiron";
57 hosts = [ "performance.immae.eu" ];
58 root = apacheRoot;
59 extraConfig = [
60 ''
61 <Directory ${apacheRoot}>
62 DirectoryIndex index.html
63 AllowOverride None
64 Require all granted
65 <FilesMatch "\.php$">
66 SetHandler "proxy:unix:${config.services.phpfpm.pools.status_engine.socket}|fcgi://localhost"
67 </FilesMatch>
68 </Directory>
69 ''
70 ];
71 };
72
73 services.phpfpm.pools.status_engine = {
74 user = "wwwrun";
75 group = "wwwrun";
76 settings = {
77 "listen.owner" = "wwwrun";
78 "listen.group" = "wwwrun";
79 "pm" = "dynamic";
80 "pm.max_children" = "60";
81 "pm.start_servers" = "2";
82 "pm.min_spare_servers" = "1";
83 "pm.max_spare_servers" = "10";
84
85 "php_admin_value[session.save_handler]" = "redis";
86 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:StatusEngine:'";
87 "php_admin_value[open_basedir]" = "${package}:/tmp:${config.secrets.fullPaths."status_engine_ui"}";
88 };
89 phpPackage = pkgs.php74.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
90 };
91
92 };
93}
diff --git a/systems/eldiron/websites/stats/default.nix b/systems/eldiron/websites/stats/default.nix
new file mode 100644
index 0000000..665010b
--- /dev/null
+++ b/systems/eldiron/websites/stats/default.nix
@@ -0,0 +1,51 @@
1{ config, lib, pkgs, ... }:
2let
3 cfg = config.myServices.websites.tools.stats;
4 myCfg = config.myEnv.tools.umami;
5in
6{
7 options.myServices.websites.tools.stats.enable = lib.mkEnableOption "Enable stats site";
8 config = lib.mkIf cfg.enable {
9 secrets.keys = {
10 "uami/env" = {
11 permission = "0400";
12 text = ''
13 PORT=${toString myCfg.listenPort}
14 HOSTNAME=127.0.0.1
15 DATABASE_URL=postgresql://${myCfg.postgresql.user}:${myCfg.postgresql.password}@localhost:${myCfg.postgresql.port}/${myCfg.postgresql.database}?sslmode=disable&host=${myCfg.postgresql.socket}
16 HASH_SALT=${myCfg.hashSalt}
17 '';
18 };
19 };
20
21 security.acme.certs.eldiron.extraDomainNames = [ "stats.immae.eu" ];
22 services.websites.env.tools.vhostConfs.stats = {
23 certName = "eldiron";
24 hosts = [ "stats.immae.eu" ];
25 root = null;
26 extraConfig = [
27 ''
28 ProxyPass / http://localhost:${toString myCfg.listenPort}/
29 ProxyPassReverse / http://localhost:${toString myCfg.listenPort}/
30 ProxyPreserveHost On
31 ''
32 ];
33 };
34 systemd.services.umami = {
35 description = "Umami service";
36 wantedBy = [ "multi-user.target" ];
37 after = [ "network.target" ];
38 wants = [ "postgresql.service" ];
39 path = [ pkgs.nodejs pkgs.bashInteractive ];
40 serviceConfig = {
41 Type = "simple";
42 User = "umami";
43 Group = "umami";
44 DynamicUser = true;
45 SupplementaryGroups = [ "keys" ];
46 ExecStart = "${pkgs.umami}/bin/umami";
47 EnvironmentFile = config.secrets.fullPaths."umami/env";
48 };
49 };
50 };
51}
diff --git a/systems/eldiron/websites/tools/adminer.nix b/systems/eldiron/websites/tools/adminer.nix
new file mode 100644
index 0000000..5e865b1
--- /dev/null
+++ b/systems/eldiron/websites/tools/adminer.nix
@@ -0,0 +1,83 @@
1{ config, webapps-adminer, php82, lib, forcePhpSocket ? null }:
2rec {
3 webRoot = webapps-adminer;
4 phpFpm = rec {
5 user = apache.user;
6 group = apache.group;
7 phpPackage = let
8 #mysqli_pam = php81.extensions.mysqli.overrideAttrs(old: {
9 # configureFlags = [ "--with-mysqli=${libmysqlclient_pam.dev}/bin/mysql_config" "--with-mysql-sock=/run/mysqld/mysqld.sock" ];
10 #});
11 in
12 php82.withExtensions ({ enabled, all }: [all.mysqli all.redis all.pgsql]);
13 settings = {
14 "listen.owner" = apache.user;
15 "listen.group" = apache.group;
16 "pm" = "ondemand";
17 "pm.max_children" = "5";
18 "pm.process_idle_timeout" = "60";
19 #"php_admin_flag[log_errors]" = "on";
20 # Needed to avoid clashes in browser cookies (same domain)
21 "php_value[session.name]" = "AdminerPHPSESSID";
22 "php_admin_value[open_basedir]" = "${webRoot}:/tmp";
23 "php_admin_value[session.save_handler]" = "redis";
24 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Adminer:'";
25 };
26 };
27 apache = rec {
28 user = "wwwrun";
29 group = "wwwrun";
30 modules = [ "proxy_fcgi" ];
31 root = webRoot;
32 vhostConf = socket: ''
33 Alias /adminer ${webRoot}
34 <Directory ${webRoot}>
35 DirectoryIndex index.php
36 <FilesMatch "\.php$">
37 SetHandler "proxy:unix:${if forcePhpSocket != null then forcePhpSocket else socket}|fcgi://localhost"
38 </FilesMatch>
39
40 Use LDAPConnect
41 Require ldap-group cn=users,cn=mysql,cn=pam,ou=services,dc=immae,dc=eu
42 Require ldap-group cn=users,cn=postgresql,cn=pam,ou=services,dc=immae,dc=eu
43 </Directory>
44 '';
45 };
46 monitoringPlugins = [ "http" ];
47 monitoringObjects.service = [
48 {
49 service_description = "adminer website is running on tools.immae.eu";
50 host_name = config.hostEnv.fqdn;
51 use = "external-web-service";
52 check_command = ["check_https_auth" "tools.immae.eu" "/adminer/" "www.adminerevo.org"];
53
54 servicegroups = "webstatus-webapps";
55 _webstatus_name = "Adminer";
56 _webstatus_url = "https://tools.immae.eu/adminer/";
57 }
58 ];
59
60 chatonsProperties = {
61 published = false;
62 file.datetime = "2023-08-21T15:20:00";
63 service = {
64 name = "Adminer";
65 description = "Database management in a single PHP file";
66 website = "https://tools.immae.eu/adminer/";
67 logo = "https://tools.immae.eu/adminer/?file=favicon.ico";
68 status.level = "OK";
69 status.description = "OK";
70 registration."" = ["MEMBER" "CLIENT"];
71 registration.load = "OPEN";
72 install.type = "PACKAGE";
73 };
74 software = {
75 name = "Adminer";
76 website = "https://docs.adminerevo.org/";
77 license.url = "https://github.com/adminerevo/adminerevo/blob/main/readme.md";
78 license.name = "Apache License 2.0 or GPL 2";
79 version = webRoot.version;
80 source.url = "https://github.com/adminerevo/adminerevo/";
81 };
82 };
83}
diff --git a/systems/eldiron/websites/tools/default.nix b/systems/eldiron/websites/tools/default.nix
new file mode 100644
index 0000000..4d9e3c1
--- /dev/null
+++ b/systems/eldiron/websites/tools/default.nix
@@ -0,0 +1,547 @@
1{ lib, pkgs, config, mypackages-lib, grocy, ... }:
2let
3 composerEnv = mypackages-lib.composerEnv;
4 adminer = pkgs.callPackage ./adminer.nix { inherit config; };
5 ympd = pkgs.callPackage ./ympd.nix {
6 env = config.myEnv.tools.ympd;
7 inherit config;
8 };
9 ttrss = pkgs.callPackage ./ttrss.nix {
10 ttrss = pkgs.webapps-ttrss;
11 ttrss-plugins = pkgs.webapps-ttrss-plugins;
12 env = config.myEnv.tools.ttrss;
13 php = pkgs.php72;
14 inherit config;
15 };
16 kanboard = pkgs.callPackage ./kanboard.nix {
17 inherit config;
18 env = config.myEnv.tools.kanboard;
19 };
20 wallabag = pkgs.callPackage ./wallabag.nix {
21 wallabag = pkgs.webapps-wallabag.override {
22 composerEnv = composerEnv.override {
23 php = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy]);
24 };
25 };
26 env = config.myEnv.tools.wallabag;
27 inherit config;
28 };
29 yourls = pkgs.callPackage ./yourls.nix {
30 yourls = pkgs.webapps-yourls;
31 yourls-plugins = pkgs.webapps-yourls-plugins;
32 env = config.myEnv.tools.yourls;
33 inherit config;
34 };
35 rompr = pkgs.callPackage ./rompr.nix {
36 rompr = pkgs.webapps-rompr;
37 env = config.myEnv.tools.rompr;
38 inherit config;
39 };
40 shaarli = pkgs.callPackage ./shaarli.nix {
41 env = config.myEnv.tools.shaarli;
42 inherit config;
43 };
44 dokuwiki = pkgs.callPackage ./dokuwiki.nix {
45 dokuwiki = pkgs.webapps-dokuwiki;
46 dokuwiki-plugins = pkgs.webapps-dokuwiki-plugins;
47 inherit config;
48 };
49 ldap = pkgs.callPackage ./ldap.nix {
50 phpldapadmin = pkgs.webapps-phpldapadmin;
51 env = config.myEnv.tools.phpldapadmin;
52 inherit config;
53 };
54 grocy' = pkgs.callPackage ./grocy.nix {
55 grocy = grocy.override { composerEnv = composerEnv.override { php = pkgs.php72; }; };
56 };
57 phpbb = pkgs.callPackage ./phpbb.nix {
58 phpbb = (pkgs.webapps-phpbb.withLangs (l: [ l.fr ])).withExts (e: [
59 e.alfredoramos.markdown e.davidiq.mailinglist e.dmzx.mchat
60 e.empteintesduweb.monitoranswers e.lr94.autosubscribe
61 e.phpbbmodders.adduser ]);
62 };
63 webhooks-bin-env = pkgs.buildEnv {
64 name = "webhook-env";
65 paths = [ pkgs.apprise ];
66 pathsToLink = [ "/bin" ];
67 };
68 webhooks = pkgs.callPackage ./webhooks.nix {
69 env = config.myEnv.tools.webhooks;
70 binEnv = webhooks-bin-env;
71 };
72 dmarc-reports = pkgs.callPackage ./dmarc_reports.nix {
73 env = config.myEnv.tools.dmarc_reports;
74 inherit config;
75 };
76
77 landing = pkgs.callPackage ./landing.nix { };
78
79 cfg = config.myServices.websites.tools.tools;
80 pcfg = config.services.phpfpm.pools;
81in {
82 options.myServices.websites.tools.tools = {
83 enable = lib.mkEnableOption "enable tools website";
84 };
85
86 config = lib.mkIf cfg.enable {
87 # Services needing to send e-mails
88 myServices.dns.zones."immae.eu".emailPolicies."tools".receive = true;
89 myServices.dns.zones."immae.eu".subdomains =
90 with config.myServices.dns.helpers;
91 {
92 outils = ips servers.eldiron.ips.main;
93 tools = lib.mkMerge [
94 (mailCommon "immae.eu")
95 mailSend
96 (ips servers.eldiron.ips.main)
97 ];
98 };
99
100 myServices.chatonsProperties.services = {
101 adminer = adminer.chatonsProperties;
102 dokuwiki = dokuwiki.chatonsProperties;
103 shaarli = shaarli.chatonsProperties;
104 ttrss = ttrss.chatonsProperties;
105 wallabag = wallabag.chatonsProperties;
106 paste = {
107 file.datetime = "2022-08-22T00:15:00";
108 service = {
109 name = "Paste";
110 description = "A simple paster script with syntax highlight";
111 website = "https://tools.immae.eu/paste/";
112 logo = "https://assets.immae.eu/logo.jpg";
113 status.level = "OK";
114 status.description = "OK";
115 registration."" = ["MEMBER" "CLIENT"];
116 registration.load = "OPEN";
117 install.type = "PACKAGE";
118 guide.user = "https://tools.immae.eu/paste/";
119 };
120 software = {
121 name = "Paste";
122 website = "https://tools.immae.eu/paste/";
123 license.url = "https://tools.immae.eu/paste/license";
124 license.name = "MIT License";
125 version = "Unversioned";
126 source.url = "https://tools.immae.eu/paste/abcd123/py";
127 };
128 };
129 };
130 myServices.chatonsProperties.hostings = {
131 dokuwiki = dokuwiki.chatonsHostingProperties;
132 phpbb = phpbb.chatonsHostingProperties;
133 };
134 secrets.keys =
135 kanboard.keys
136 // ldap.keys
137 // shaarli.keys
138 // ttrss.keys
139 // wallabag.keys
140 // yourls.keys
141 // dmarc-reports.keys
142 // webhooks.keys
143 // ({ "webapps/tools-landing-sql-rw" = {
144 user = "wwwrun";
145 group = "wwwrun";
146 permissions = "0400";
147 text = let
148 env = config.myEnv.tools.landing;
149 in ''
150 SetEnv PGUSER "${env.postgresql.user}"
151 SetEnv PGPASSWORD "${env.postgresql.password}"
152 SetEnv PGDATABASE "${env.postgresql.database}"
153 SetEnv PGHOST "${env.postgresql.socket}"
154 '';
155 }; });
156 services.websites.env.tools.modules =
157 [ "proxy_fcgi" ]
158 ++ adminer.apache.modules
159 ++ ympd.apache.modules
160 ++ ttrss.apache.modules
161 ++ wallabag.apache.modules
162 ++ yourls.apache.modules
163 ++ rompr.apache.modules
164 ++ shaarli.apache.modules
165 ++ dokuwiki.apache.modules
166 ++ dmarc-reports.apache.modules
167 ++ phpbb.apache.modules
168 ++ ldap.apache.modules
169 ++ kanboard.apache.modules;
170
171 myServices.dns.zones."immae.dev" = with config.myServices.dns.helpers; {
172 subdomains.tools = ips servers.eldiron.ips.integration;
173 };
174 security.acme.certs.integration.domain = "tools.immae.dev";
175 services.websites.env.integration.vhostConfs.devtools = {
176 certName = "integration";
177 hosts = [ "tools.immae.dev" ];
178 root = "/var/lib/ftp/immae/devtools";
179 extraConfig = [
180 ''
181 Use Apaxy "/var/lib/ftp/immae/devtools" "title"
182 Timeout 600
183 ProxyTimeout 600
184 Header always set Content-Security-Policy-Report-Only "${config.myEnv.tools.csp_reports.policies.inline}"
185 <Directory "/var/lib/ftp/immae/devtools">
186 DirectoryIndex index.php index.htm index.html
187 AllowOverride all
188 Require all granted
189 <FilesMatch "\.php$">
190 SetHandler "proxy:unix:${pcfg.devtools.socket}|fcgi://localhost"
191 </FilesMatch>
192 </Directory>
193 ''
194 ];
195 };
196
197
198 security.acme.certs.eldiron.extraDomainNames = [ "outils.immae.eu" "tools.immae.eu" ];
199 services.websites.env.tools.vhostConfs.tools = {
200 certName = "eldiron";
201 hosts = ["tools.immae.eu" ];
202 root = landing;
203 extraConfig = [
204 ''
205 RedirectMatch 301 ^/vpn(.*)$ https://vpn.immae.eu$1
206 RedirectMatch 301 ^/roundcube(.*)$ https://mail.immae.eu/roundcube$1
207 RedirectMatch 301 ^/jappix(.*)$ https://im.immae.fr/converse
208
209 <Directory "${landing}">
210 Include ${config.secrets.fullPaths."webapps/tools-landing-sql-rw"}
211 DirectoryIndex index.html
212 AllowOverride None
213 Require all granted
214
215 <FilesMatch "\.php$">
216 SetHandler "proxy:unix:${pcfg.tools.socket}|fcgi://localhost"
217 </FilesMatch>
218 </Directory>
219 ''
220 (adminer.apache.vhostConf pcfg.adminer.socket)
221 ympd.apache.vhostConf
222 (ttrss.apache.vhostConf pcfg.ttrss.socket)
223 (wallabag.apache.vhostConf pcfg.wallabag.socket)
224 (yourls.apache.vhostConf pcfg.yourls.socket)
225 (rompr.apache.vhostConf pcfg.rompr.socket)
226 (shaarli.apache.vhostConf pcfg.shaarli.socket)
227 (dokuwiki.apache.vhostConf pcfg.dokuwiki.socket)
228 (ldap.apache.vhostConf pcfg.ldap.socket)
229 (kanboard.apache.vhostConf pcfg.kanboard.socket)
230 (grocy'.apache.vhostConf pcfg.grocy.socket)
231 (phpbb.apache.vhostConf pcfg.phpbb.socket)
232 (dmarc-reports.apache.vhostConf pcfg.dmarc-reports.socket)
233 ''
234 <Location "/paste/">
235 ProxyPass unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
236 ProxyPassReverse unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
237 ProxyPreserveHost on
238 </Location>
239 <Location "/paste">
240 ProxyPass unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
241 ProxyPassReverse unix://${config.services.paste.sockets.gunicorn}|http://tools.immae.eu/paste/
242 ProxyPreserveHost on
243 </Location>
244
245 <Location "/ntfy/">
246 SetEnv proxy-nokeepalive 1
247 SetEnv proxy-sendchunked 1
248 LimitRequestBody 102400
249
250 RewriteEngine On
251
252 # FIXME: why is landing prefixed in the url?
253 RewriteCond %{HTTP:Upgrade} websocket [NC]
254 RewriteCond %{HTTP:Connection} upgrade [NC]
255 RewriteRule ^(${landing}/ntfy)?/?(.*) unix:///run/ntfy/ntfy.sock|ws://tools.immae.eu/$2 [P,NE,QSA,L]
256
257 RewriteRule ^(${landing}/ntfy)?/?(.*) unix:///run/ntfy/ntfy.sock|http://tools.immae.eu/$2 [P,NE,QSA,L]
258 </Location>
259 Alias /BIP39 /var/lib/buildbot/outputs/immae/bip39
260 <Directory "/var/lib/buildbot/outputs/immae/bip39">
261 DirectoryIndex index.html
262 AllowOverride None
263 Require all granted
264 </Directory>
265
266 Alias /webhooks ${config.secrets.fullPaths."webapps/webhooks"}
267 <Directory "${config.secrets.fullPaths."webapps/webhooks"}">
268 Options -Indexes
269 DirectoryIndex index.php
270 Require all granted
271 AllowOverride None
272 <FilesMatch "\.php$">
273 SetHandler "proxy:unix:${pcfg.tools.socket}|fcgi://localhost"
274 </FilesMatch>
275 </Directory>
276 ''
277 ];
278 };
279
280 services.websites.env.tools.vhostConfs.outils = {
281 certName = "eldiron";
282 hosts = [ "outils.immae.eu" ];
283 root = null;
284 extraConfig = [
285 ''
286 RedirectMatch 301 ^/mediagoblin(.*)$ https://mgoblin.immae.eu$1
287
288 RedirectMatch 301 ^/ether(.*)$ https://ether.immae.eu$1
289
290 RedirectMatch 301 ^/nextcloud(.*)$ https://cloud.immae.eu$1
291 RedirectMatch 301 ^/owncloud(.*)$ https://cloud.immae.eu$1
292
293 RedirectMatch 301 ^/carddavmate(.*)$ https://dav.immae.eu/infcloud$1
294 RedirectMatch 301 ^/caldavzap(.*)$ https://dav.immae.eu/infcloud$1
295 RedirectMatch 301 ^/caldav.php(.*)$ https://dav.immae.eu/caldav.php$1
296 RedirectMatch 301 ^/davical(.*)$ https://dav.immae.eu/davical$1
297
298 RedirectMatch 301 ^/taskweb(.*)$ https://task.immae.eu/taskweb$1
299
300 RedirectMatch 301 ^/roundcube(.*)$ https://mail.immae.eu/roundcube$1
301
302 RedirectMatch 301 ^/jappix(.*)$ https://im.immae.fr/converse
303
304 RedirectMatch 301 ^/vpn(.*)$ https://vpn.immae.eu$1
305
306 RedirectMatch 301 ^/(.*)$ https://tools.immae.eu/$1
307 ''
308 ];
309 };
310
311 systemd.services = {
312 phpfpm-dokuwiki = {
313 after = lib.mkAfter dokuwiki.phpFpm.serviceDeps;
314 wants = dokuwiki.phpFpm.serviceDeps;
315 };
316 phpfpm-phpbb = {
317 after = lib.mkAfter phpbb.phpFpm.serviceDeps;
318 wants = phpbb.phpFpm.serviceDeps;
319 };
320 phpfpm-kanboard = {
321 after = lib.mkAfter kanboard.phpFpm.serviceDeps;
322 wants = kanboard.phpFpm.serviceDeps;
323 };
324 phpfpm-ldap = {
325 after = lib.mkAfter ldap.phpFpm.serviceDeps;
326 wants = ldap.phpFpm.serviceDeps;
327 };
328 phpfpm-shaarli = {
329 after = lib.mkAfter shaarli.phpFpm.serviceDeps;
330 wants = shaarli.phpFpm.serviceDeps;
331 };
332 phpfpm-ttrss = {
333 after = lib.mkAfter ttrss.phpFpm.serviceDeps;
334 wants = ttrss.phpFpm.serviceDeps;
335 };
336 phpfpm-wallabag = {
337 after = lib.mkAfter wallabag.phpFpm.serviceDeps;
338 wants = wallabag.phpFpm.serviceDeps;
339 preStart = lib.mkAfter wallabag.phpFpm.preStart;
340 };
341 phpfpm-yourls = {
342 after = lib.mkAfter yourls.phpFpm.serviceDeps;
343 wants = yourls.phpFpm.serviceDeps;
344 };
345 ntfy = {
346 description = "send push notifications to your phone or desktop via scripts from any computer";
347 wantedBy = [ "multi-user.target" ];
348 serviceConfig = {
349 ExecStart = "${pkgs.ntfy-sh}/bin/ntfy serve --listen-http '' --listen-unix %t/ntfy/ntfy.sock --cache-file %S/ntfy/cache.db --cache-duration 120h --behind-proxy --attachment-cache-dir %S/ntfy/attachments --base-url https://tools.immae.eu/ntfy";
350 Type = "simple";
351 WorkingDirectory = "%S/ntfy";
352 RuntimeDirectory = "ntfy";
353 StateDirectory = "ntfy";
354 User = "wwwrun";
355 };
356 };
357 ympd = {
358 description = "Standalone MPD Web GUI written in C";
359 wantedBy = [ "multi-user.target" ];
360 script = ''
361 export MPD_PASSWORD=$(cat ${config.secrets.fullPaths."mpd"})
362 ${pkgs.ympd}/bin/ympd --host ${ympd.config.host} --port ${toString ympd.config.port} --webport ${ympd.config.webPort} --user nobody
363 '';
364 };
365 tt-rss = {
366 description = "Tiny Tiny RSS feeds update daemon";
367 serviceConfig = {
368 User = "wwwrun";
369 ExecStart = "${pkgs.php72}/bin/php ${ttrss.webRoot}/update.php --daemon";
370 StandardOutput = "syslog";
371 StandardError = "syslog";
372 PermissionsStartOnly = true;
373 };
374
375 wantedBy = [ "multi-user.target" ];
376 requires = ["postgresql.service"];
377 after = ["network.target" "postgresql.service"];
378 };
379 };
380
381 services.filesWatcher.ympd = {
382 restart = true;
383 paths = [ config.secrets.fullPaths."mpd" ];
384 };
385
386 services.phpfpm.pools = {
387 tools = {
388 user = "wwwrun";
389 group = "wwwrun";
390 settings = {
391 "listen.owner" = "wwwrun";
392 "listen.group" = "wwwrun";
393 "pm" = "dynamic";
394 "pm.max_children" = "60";
395 "pm.start_servers" = "2";
396 "pm.min_spare_servers" = "1";
397 "pm.max_spare_servers" = "10";
398
399 "php_admin_value[sendmail_path]" = "/run/wrappers/bin/sendmail -t -i";
400 "php_admin_value[session.save_handler]" = "redis";
401 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Tools:'";
402 # Needed to avoid clashes in browser cookies (same domain)
403 "php_value[session.name]" = "ToolsPHPSESSID";
404 "php_admin_value[open_basedir]" = builtins.concatStringsSep ":" [
405 "/run/wrappers/bin/sendmail" landing "/tmp"
406 config.secrets.fullPaths."webapps/webhooks"
407 "${webhooks-bin-env}/bin"
408 ];
409 };
410 phpEnv = {
411 CONTACT_EMAIL = config.myEnv.tools.contact;
412 };
413 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [ all.redis ]);
414 };
415 devtools = {
416 user = "wwwrun";
417 group = "wwwrun";
418 settings = {
419 "listen.owner" = "wwwrun";
420 "listen.group" = "wwwrun";
421 "pm" = "dynamic";
422 "pm.max_children" = "60";
423 "pm.start_servers" = "2";
424 "pm.min_spare_servers" = "1";
425 "pm.max_spare_servers" = "10";
426
427 "php_admin_value[sendmail_path]" = "/run/wrappers/bin/sendmail -t -i";
428 "php_admin_value[session.save_handler]" = "redis";
429 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Devtools:'";
430 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:/var/lib/ftp/immae/devtools:/tmp";
431 };
432 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.mysqli all.sqlite3 all.redis all.apcu all.opcache ]);
433 };
434 adminer = adminer.phpFpm;
435 ttrss = {
436 user = "wwwrun";
437 group = "wwwrun";
438 settings = ttrss.phpFpm.pool;
439 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
440 };
441 wallabag = {
442 user = "wwwrun";
443 group = "wwwrun";
444 settings = wallabag.phpFpm.pool;
445 phpPackage = pkgs.php73.withExtensions({ enabled, all }: enabled ++ [all.tidy all.redis]);
446 };
447 yourls = {
448 user = "wwwrun";
449 group = "wwwrun";
450 settings = yourls.phpFpm.pool;
451 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
452 };
453 rompr = {
454 user = "wwwrun";
455 group = "wwwrun";
456 settings = rompr.phpFpm.pool;
457 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
458 };
459 shaarli = {
460 user = "wwwrun";
461 group = "wwwrun";
462 settings = shaarli.phpFpm.pool;
463 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
464 };
465 dmarc-reports = {
466 user = "wwwrun";
467 group = "wwwrun";
468 settings = dmarc-reports.phpFpm.pool;
469 phpEnv = dmarc-reports.phpFpm.phpEnv;
470 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
471 };
472 dokuwiki = {
473 user = "wwwrun";
474 group = "wwwrun";
475 settings = dokuwiki.phpFpm.pool;
476 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
477 };
478 phpbb = {
479 user = "wwwrun";
480 group = "wwwrun";
481 settings = phpbb.phpFpm.pool;
482 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
483 };
484 ldap = {
485 user = "wwwrun";
486 group = "wwwrun";
487 settings = ldap.phpFpm.pool;
488 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
489 };
490 kanboard = {
491 user = "wwwrun";
492 group = "wwwrun";
493 settings = kanboard.phpFpm.pool;
494 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
495 };
496 grocy = {
497 user = "wwwrun";
498 group = "wwwrun";
499 settings = grocy'.phpFpm.pool;
500 phpPackage = pkgs.php72.withExtensions({ enabled, all }: enabled ++ [all.redis]);
501 };
502 };
503
504 system.activationScripts = {
505 grocy = grocy'.activationScript;
506 ttrss = ttrss.activationScript;
507 wallabag = wallabag.activationScript;
508 rompr = rompr.activationScript;
509 shaarli = shaarli.activationScript;
510 dokuwiki = dokuwiki.activationScript;
511 phpbb = phpbb.activationScript;
512 kanboard = kanboard.activationScript;
513 };
514
515 services.websites.env.tools.watchPaths = [
516 config.secrets.fullPaths."webapps/tools-shaarli"
517 ];
518 services.filesWatcher.phpfpm-wallabag = {
519 restart = true;
520 paths = [ config.secrets.fullPaths."webapps/tools-wallabag" ];
521 };
522
523 myServices.monitoring.fromMasterActivatedPlugins = lib.mkMerge [
524 ttrss.monitoringPlugins
525 rompr.monitoringPlugins
526 wallabag.monitoringPlugins
527 yourls.monitoringPlugins
528 ympd.monitoringPlugins
529 dokuwiki.monitoringPlugins
530 shaarli.monitoringPlugins
531 ldap.monitoringPlugins
532 adminer.monitoringPlugins
533 ];
534 myServices.monitoring.fromMasterObjects = lib.mkMerge [
535 ttrss.monitoringObjects
536 rompr.monitoringObjects
537 wallabag.monitoringObjects
538 yourls.monitoringObjects
539 ympd.monitoringObjects
540 dokuwiki.monitoringObjects
541 shaarli.monitoringObjects
542 ldap.monitoringObjects
543 adminer.monitoringObjects
544 ];
545 };
546}
547
diff --git a/systems/eldiron/websites/tools/dmarc_reports.nix b/systems/eldiron/websites/tools/dmarc_reports.nix
new file mode 100644
index 0000000..8b3aa99
--- /dev/null
+++ b/systems/eldiron/websites/tools/dmarc_reports.nix
@@ -0,0 +1,61 @@
1{ env, config }:
2rec {
3 keys."webapps/tools-dmarc-reports.php" = {
4 user = "wwwrun";
5 group = "wwwrun";
6 permissions = "0400";
7 text = ''
8 <?php
9 $dbhost = "${env.mysql.host}";
10 $dbname = "${env.mysql.database}";
11 $dbuser = "${env.mysql.user}";
12 $dbpass = "${env.mysql.password}";
13 $dbport = "${builtins.toString env.mysql.port}";
14 $anonymous_key = "${env.anonymous_key}";
15 ?>
16 '';
17 };
18 webRoot = ./dmarc_reports;
19 apache = rec {
20 user = "wwwrun";
21 group = "wwwrun";
22 modules = [ "proxy_fcgi" ];
23 root = webRoot;
24 vhostConf = socket: ''
25 Alias /dmarc-reports "${root}"
26 <Directory "${root}">
27 DirectoryIndex index.html
28 <FilesMatch "\.php$">
29 SetHandler "proxy:unix:${socket}|fcgi://localhost"
30 </FilesMatch>
31
32 AllowOverride None
33 Options +FollowSymlinks
34
35 SetEnvIf Authorization "(.*)" HTTP_AUTHORIZATION=$1
36 Use LDAPConnect
37 Require all granted
38 Require ldap-attribute uid=immae
39 </Directory>
40 '';
41 };
42 phpFpm = rec {
43 basedir = builtins.concatStringsSep ":"
44 [ webRoot config.secrets.fullPaths."webapps/tools-dmarc-reports.php" ];
45 pool = {
46 "listen.owner" = apache.user;
47 "listen.group" = apache.group;
48 "pm" = "ondemand";
49 "pm.max_children" = "60";
50 "pm.process_idle_timeout" = "60";
51
52 "php_admin_value[session.save_handler]" = "redis";
53 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:DmarcReports:'";
54 # Needed to avoid clashes in browser cookies (same domain)
55 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
56 };
57 phpEnv = {
58 SECRETS_FILE = config.secrets.fullPaths."webapps/tools-dmarc-reports.php";
59 };
60 };
61}
diff --git a/systems/eldiron/websites/tools/dmarc_reports/api.php b/systems/eldiron/websites/tools/dmarc_reports/api.php
new file mode 100644
index 0000000..850f9ce
--- /dev/null
+++ b/systems/eldiron/websites/tools/dmarc_reports/api.php
@@ -0,0 +1,122 @@
1<?php
2
3require(getenv("SECRETS_FILE"));
4
5$response = array(
6 "status" => "ok",
7);
8$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname, $dbport);
9
10function error_die($text, $number) {
11 http_response_code("500");
12 $message = array(
13 "status" => "error",
14 "message" => $text,
15 "code" => $number
16 );
17
18 die(json_encode($message));
19}
20
21$anonymous = isset($_GET['anonymous']) && $_GET['anonymous'];
22function maybe_anonymize($string, $long = false) {
23 global $anonymous_key;
24 global $anonymous;
25 if ($anonymous) {
26 if ($long) {
27 return md5($anonymous_key . ":" . $string);
28 } else {
29 return substr(md5($anonymous_key . ":" . $string), 0, 6);
30 }
31 } else {
32 return $string;
33 }
34}
35
36if (!$anonymous && (!isset($_SERVER['HTTP_AUTHORIZATION']) || $_SERVER['HTTP_AUTHORIZATION'] === "")) {
37 header('WWW-Authenticate: Basic realm="Immae"');
38 header('HTTP/1.0 401 Unauthorized');
39 echo "You need to be authenticated to access private information";
40 exit;
41}
42
43if ($mysqli->connect_errno) {
44 error_die($mysqli->connect_error, $mysqli->connect_errno);
45}
46
47if (!isset($_GET['serial'])) {
48 $response["domains"] = array();
49 $query = $mysqli->query("SELECT DISTINCT domain FROM `report` ORDER BY domain");
50 if ($mysqli->error) { error_die($mysqli->error, $mysqli->errno); }
51 while($row = $query->fetch_assoc()) {
52 $response["domains"][] = maybe_anonymize($row['domain']);
53 }
54
55 $response["orgs"] = array();
56 $query = $mysqli->query("SELECT DISTINCT org FROM `report` ORDER BY org");
57 if ($mysqli->error) { error_die($mysqli->error, $mysqli->errno); }
58 while($row = $query->fetch_assoc()) {
59 $response["orgs"][] = maybe_anonymize($row['org']);
60 }
61
62 $response["dates"] = array();
63 $query = $mysqli->query("SELECT DISTINCT DISTINCT year(mindate) as year, month(mindate) as month FROM `report` ORDER BY year DESC,month DESC");
64 if ($mysqli->error) { error_die($mysqli->error, $mysqli->errno); }
65 while($row = $query->fetch_assoc()) {
66 $response["dates"][] = sprintf( "%'.04d-%'.02d", $row['year'], $row['month'] );
67 }
68
69 $response["summaries"] = array();
70 if (isset($_GET['errors_only'])) {
71 $where = " WHERE (spfresult != 'pass' or dkimresult != 'pass')";
72 } else {
73 $where = "";
74 }
75
76 $sql = "SELECT report.* , sum(rptrecord.rcount) AS rcount, MIN(rptrecord.dkimresult) AS dkimresult, MIN(rptrecord.spfresult) AS spfresult FROM report LEFT JOIN (SELECT rcount, COALESCE(dkimresult, 'neutral') AS dkimresult, COALESCE(spfresult, 'neutral') AS spfresult, serial FROM rptrecord) AS rptrecord ON report.serial = rptrecord.serial$where GROUP BY serial ORDER BY mindate ASC, maxdate ASC, org";
77 $query = $mysqli->query($sql);
78 if ($mysqli->error) { error_die($mysqli->error, $mysqli->errno); }
79 while($row = $query->fetch_assoc()) {
80 $wanted_keys = array(
81 'domain', 'org', 'reportid', 'mindate', 'maxdate', 'rcount', 'serial', 'policy_adkim', 'policy_aspf', 'policy_none', 'policy_sp', 'policy_pct', 'spfresult', 'dkimresult'
82 );
83 $row = array_intersect_key($row, array_fill_keys($wanted_keys, '1'));
84 $row["domain"] = maybe_anonymize($row["domain"]);
85 $row["org"] = maybe_anonymize($row["org"]);
86 $row["reportid"] = maybe_anonymize($row["reportid"], true);
87 $response["summaries"][] = $row;
88 }
89} else {
90 $response["rptrecord"] = [];
91 $sql = $mysqli->prepare("SELECT * FROM rptrecord where serial = ?");
92 $sql->bind_param("s", $_GET["serial"]);
93 $sql->execute();
94 $query = $sql->get_result();
95 if ($mysqli->error) { error_die($mysqli->error, $mysqli->errno); }
96 while($row = $query->fetch_assoc()) {
97 if ($row['ip']) {
98 $ip = long2ip($row['ip']);
99 $host = gethostbyaddr($ip);
100 } elseif ( $row['ip6'] ) {
101 $ip = inet_ntop($row['ip6']);
102 $host = gethostbyaddr($ip);
103 } else {
104 $ip = "-";
105 $host = "-";
106 }
107 $wanted_keys = array(
108 'ip', 'host', 'rcount', 'disposition', 'reason', 'dkimdomain', 'dkimresult', 'spfdomain', 'spfresult'
109 );
110 $row = array_intersect_key($row, array_fill_keys($wanted_keys, '1'));
111 $row['ip'] = maybe_anonymize($ip);
112 $row['host'] = maybe_anonymize($host);
113 $row['dkimdomain'] = maybe_anonymize($row['dkimdomain']);
114 $row['spfdomain'] = maybe_anonymize($row['spfdomain']);
115 $response["rptrecord"][] = $row;
116 }
117}
118
119header("Content-Type: application/json");
120
121echo json_encode($response, JSON_PRETTY_PRINT);
122?>
diff --git a/systems/eldiron/websites/tools/dmarc_reports/app.js b/systems/eldiron/websites/tools/dmarc_reports/app.js
new file mode 100644
index 0000000..8e8a6c4
--- /dev/null
+++ b/systems/eldiron/websites/tools/dmarc_reports/app.js
@@ -0,0 +1,103 @@
1const app = new Vue({
2 el: '#app',
3 data: {
4 info: null,
5 summaries: null,
6 selectedSummary: null,
7 filterGreen: true,
8 filterDomain: null,
9 filterOrg: null,
10 //filterDate: (new Date()).toISOString().substring(0, 7),
11 filterDate: null,
12 reverse: true,
13 anonymous: true,
14 },
15 created: async function () {
16 let that = this;
17
18 if ('anonymous' in localStorage) {
19 this.anonymous = JSON.parse(localStorage.anonymous);
20 }
21 this.fetchAll();
22 },
23 methods: {
24 fetchAll: async function() {
25 try {
26 this.info = await this.getInfo();
27 this.summaries = this.info.summaries;
28 } catch (error) {
29 this.info = null;
30 this.summaries = null;
31 }
32 },
33 toggleAnonymous: function() {
34 this.anonymous = !this.anonymous;
35 localStorage.anonymous = this.anonymous;
36 this.fetchAll();
37 },
38 filtered: function () {
39 let that = this;
40 let filtered = this.summaries.filter(function (summary) {
41 return (!that.filterGreen || that.getColor(summary) !== "lime")
42 && (!that.filterDomain || summary.domain === that.filterDomain)
43 && (!that.filterOrg || summary.org === that.filterOrg)
44 && (!that.filterDate || that.inDates(summary));
45 });
46 if (this.reverse) {
47 return filtered.reverse();
48 } else {
49 return filtered;
50 }
51 },
52 toggle: async function(summary) {
53 if (this.selectedSummary && this.selectedSummary.serial === summary.serial) {
54 this.selectedSummary = null;
55 } else {
56 if (!summary.details) {
57 summary.details = await this.getDetails(summary.serial);
58 }
59 this.selectedSummary = summary;
60 }
61 },
62 inDates: function(summary) {
63 if (!this.filterDate) { return true; }
64
65 let mindate = (new Date(summary.mindate)).toISOString().substring(0, 7);
66 let maxdate = (new Date(summary.maxdate)).toISOString().substring(0, 7);
67
68 return mindate === this.filterDate || maxdate === this.filterDate;
69 },
70 printDate: function (date) {
71 return (new Date(date)).toISOString().replace("T", " ").replace(/\..*Z$/, " UTC");
72 },
73 getColor: function (element) {
74 if (element.dkimresult === "fail" && element.spfresult === "fail") {
75 return "red";
76 } else if (element.dkimresult === "fail" || element.spfresult === "fail") {
77 return "orange";
78 } else if (element.dkimresult === "pass" && element.spfresult === "pass") {
79 return "lime";
80 } else {
81 return "yellow";
82 }
83 },
84 getInfo: function (event) {
85 let anonymous = this.anonymous ? "anonymous=1" : "";
86 return fetch(`api.php?${anonymous}`).then(function (response) {
87 if (response.status != 200) { return; }
88 return response.text().then(function (body) {
89 return JSON.parse(body);
90 });
91 });
92 },
93 getDetails: function (serial) {
94 let anonymous = this.anonymous ? "&anonymous=1" : "";
95 return fetch(`api.php?serial=${serial}${anonymous}`).then(function (response) {
96 if (response.status != 200) { return; }
97 return response.text().then(function (body) {
98 return JSON.parse(body);
99 });
100 });
101 }
102 }
103});
diff --git a/systems/eldiron/websites/tools/dmarc_reports/default.css b/systems/eldiron/websites/tools/dmarc_reports/default.css
new file mode 100644
index 0000000..9e0c63f
--- /dev/null
+++ b/systems/eldiron/websites/tools/dmarc_reports/default.css
@@ -0,0 +1,130 @@
1h1 {
2 text-align: center;
3}
4
5p.warninginfo {
6 text-align: center;
7}
8
9table.reportlist {
10 margin: 2em auto 2em auto;
11 border-collapse: collapse;
12 clear: both;
13}
14
15table.reportlist td, table.reportlist th {
16 padding:3px;
17}
18
19table.reportlist thead {
20 border-top: 1px solid grey;
21 border-bottom: 1px solid grey;
22
23}
24table.reportlist tbody tr:first-child td {
25 padding-top: 10px;
26}
27table.reportlist tr.sum {
28 border-top: 1px solid grey;
29}
30table.reportlist tr.selected {
31 background-color: lightgrey;
32}
33.reportdesc {
34 font-weight: bold;
35 width: 90%;
36 margin-left: auto;
37 margin-right: auto;
38}
39
40tr.summaryrow {
41 cursor: pointer;
42}
43
44tr.summaryrow:hover, tr.summaryrow.selected {
45 background-color: lightgray;
46 border-left: 1px solid lightgray;
47}
48
49td.reportcell {
50 border-bottom: 1px solid lightgray;
51 border-left: 1px solid lightgray;
52 border-right: 1px solid lightgray;
53}
54
55table.reportdata {
56 margin: 0px auto 0px auto;
57 border-collapse: separate;
58 border-spacing: 2px;
59}
60
61table.reportdata tr th, table.reportdata tr td {
62 text-align: center;
63 padding: 3px;
64}
65
66table.reportdata tr.red {
67 background-color: #FF0000;
68}
69
70table.reportdata tr.orange {
71 background-color: #FFA500;
72}
73
74table.reportdata tr.lime {
75 background-color: #00FF00;
76}
77
78table.reportdata tr.yellow {
79 background-color: #FFFF00;
80}
81
82.optionblock {
83 background: lightgrey;
84 padding: 0.4em;
85 float: right;
86 margin: auto 2em 1em auto;
87 white-space: nowrap;
88}
89
90.optionlabel {
91 font-weight: bold;
92 float: left; clear: left;
93 margin-right: 1em;
94}
95
96.options {
97 font-size: 70%;
98 text-align: right;
99 border: none;
100 width: 97%;
101 padding: 0.4em;
102}
103
104.center {
105 text-align:center;
106}
107
108.circle_lime:before {
109 content: ' \25CF';
110 font-size: 25px;
111 color: #00FF00;
112}
113
114.circle_red:before {
115 content: ' \25CF';
116 font-size: 25px;
117 color: #FF0000;
118}
119
120.circle_yellow:before {
121 content: ' \25CF';
122 font-size: 25px;
123 color: #FFFF00;
124}
125
126.circle_orange:before {
127 content: ' \25CF';
128 font-size: 25px;
129 color: #FFA500;
130}
diff --git a/systems/eldiron/websites/tools/dmarc_reports/index.html b/systems/eldiron/websites/tools/dmarc_reports/index.html
new file mode 100644
index 0000000..0afc82f
--- /dev/null
+++ b/systems/eldiron/websites/tools/dmarc_reports/index.html
@@ -0,0 +1,128 @@
1<!DOCTYPE html>
2<html>
3
4<head>
5 <meta charset="utf-8">
6 <meta name="viewport" content="width=device-width, initial-scale=1">
7 <meta name="robots" content="noindex">
8 <title>Dmarc reports</title>
9 <link rel="stylesheet" href="default.css">
10</head>
11
12<body>
13 <div id="app" style="width: 100%">
14 <div class="optionblock">
15 <div class='options'>
16 <span class='optionlabel'>Anonymize</span>
17 <label><input type="radio" :value="false" v-model="anonymous" v-on:click="toggleAnonymous()"> no</label>
18 <label><input type="radio" :value="true" v-model="anonymous" v-on:click="toggleAnonymous()"> yes</label>
19 </div>
20 <template v-if="info">
21 <div class='options'>
22 <span class='optionlabel'>Hide all-green lines:</span>
23 <label><input type="radio" :value="false" v-model="filterGreen"> no</label>
24 <label><input type="radio" :value="true" v-model="filterGreen"> yes</label>
25 </div>
26 <div class='options'>
27 <span class='optionlabel'>Sort order:</span>
28 <label><input type="radio" :value="false" v-model="reverse"> ascending</label>
29 <label><input type="radio" :value="true" v-model="reverse"> descending</label>
30 </div>
31 <div class='options'>
32 <span class='optionlabel'>Domain(s):</span>
33 <select v-model="filterDomain">
34 <option selected="selected" :value="null">[all]</option>
35 <option v-for="domain in info.domains" :value="domain">{{ domain }}</option>
36 </select>
37 </div>
38 <div class='options'>
39 <span class='optionlabel'>Organisation(s):</span>
40 <select v-model="filterOrg">
41 <option selected="selected" :value="null">[all]</option>
42 <option v-for="org in info.orgs" :value="org">{{ org }}</option>
43 </select>
44 </div>
45 <div class='options'>
46 <span class='optionlabel'>Time:</span>
47 <select v-model="filterDate">
48 <option selected="selected" :value="null">[all]</option>
49 <option v-for="date in info.dates" :value="date">{{ date }}</option>
50 </select>
51 </div>
52 </template>
53 </div>
54
55 <h1 class='main'>DMARC Reports</h1>
56 <p v-if="!info" class="warninginfo">
57 No information could be fetched. If in non-anonymous mode you need to be logged-in
58 </p>
59 <table class='reportlist' v-if="summaries">
60 <thead>
61 <tr>
62 <th></th>
63 <th>Start Date</th>
64 <th>End Date</th>
65 <th>Domain</th>
66 <th>Reporting Organization</th>
67 <th>Report ID</th>
68 <th>Messages</th>
69 </tr>
70 </thead>
71 <tbody>
72 <template v-for="summary in filtered()">
73 <tr v-on:click="toggle(summary)" class="summaryrow"
74 v-bind:class="[{ selected: selectedSummary && summary.serial === selectedSummary.serial }]">
75 <td class='right'><span :class="'circle_' + getColor(summary)"></span></td>
76 <td class='right'>{{ printDate(summary.mindate) }}</td>
77 <td class='right'>{{ printDate(summary.maxdate) }}</td>
78 <td class='center'>{{ summary.domain }}</td>
79 <td class='center'>{{ summary.org }}</td>
80 <td class='center'>{{ summary.reportid }}</td>
81 <td class='center'>{{ summary.rcount }}</td>
82 </tr>
83 <tr v-if="selectedSummary && summary.serial === selectedSummary.serial">
84 <td colspan="6" class="reportcell">
85 <div class='center reportdesc'>
86 <p>Policies: adkim={{ summary.policy_adkim }}, aspf={{ summary.policy_aspf }}, p={{ summary.policy_none }}, sp={{ summary.policy_sp }}, pct={{ summary.policy_pct }}</p>
87 </div>
88 <table v-if="summary.details" class='reportdata'>
89 <thead>
90 <tr>
91 <th>IP Address</th>
92 <th>Host Name</th>
93 <th>Message Count</th>
94 <th>Disposition</th>
95 <th>Reason</th>
96 <th>DKIM Domain</th>
97 <th>Raw DKIM Result</th>
98 <th>SPF Domain</th>
99 <th>Raw SPF Result</th>
100 </tr>
101 </thead>
102 <tbody>
103 <tr v-for="record in summary.details.rptrecord" :class='getColor(record)'>
104 <td>{{ record.ip }}</td>
105 <td>{{ record.host }}</td>
106 <td>{{ record.rcount }}</td>
107 <td>{{ record.disposition }}</td>
108 <td>{{ record.reason }}</td>
109 <td>{{ record.dkimdomain }}</td>
110 <td>{{ record.dkimresult }}</td>
111 <td>{{ record.spfdomain }}</td>
112 <td>{{ record.spfresult }}</td>
113 </tr>
114 </tbody>
115 </table>
116 </td>
117 <td></td>
118 </tr>
119 </template>
120 </tbody>
121 </table>
122 </div>
123
124 <script src="https://assets.immae.eu/vue/2.6.11/vue.min.js" integrity="sha256-ngFW3UnAN0Tnm76mDuu7uUtYEcG3G5H1+zioJw3t+68=" crossorigin="anonymous"></script>
125 <script src="app.js"></script>
126</body>
127
128</html>
diff --git a/systems/eldiron/websites/tools/dokuwiki.nix b/systems/eldiron/websites/tools/dokuwiki.nix
new file mode 100644
index 0000000..813c426
--- /dev/null
+++ b/systems/eldiron/websites/tools/dokuwiki.nix
@@ -0,0 +1,106 @@
1{ lib, stdenv, dokuwiki, dokuwiki-plugins, config }:
2rec {
3 varDir = "/var/lib/dokuwiki";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 if [ ! -d ${varDir} ]; then
8 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
9 ${varDir}/animals
10 cp -a ${webRoot}/conf.dist ${varDir}/conf
11 cp -a ${webRoot}/data.dist ${varDir}/data
12 cp -a ${webRoot}/
13 chown -R ${apache.user}:${apache.user} ${varDir}/config ${varDir}/data
14 chmod -R 755 ${varDir}/config ${varDir}/data
15 fi
16 '';
17 };
18 chatonsHostingProperties = {
19 file.datetime = "2022-08-21T22:50:00";
20 hosting = {
21 name = "Dokuwiki";
22 description = "DokuWiki is a simple to use and highly versatile Open Source wiki software";
23 website = "https://tools.immae.eu/dokuwiki/";
24 logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png";
25 type = "INSTANCE";
26 status.level = "OK";
27 status.description = "OK";
28 registration.load = "OPEN";
29 install.type = "PACKAGE";
30 };
31 };
32 chatonsProperties = {
33 file.datetime = "2022-08-21T22:50:00";
34 service = {
35 name = "Dokuwiki";
36 description = "DokuWiki is a simple to use and highly versatile Open Source wiki software";
37 website = "https://tools.immae.eu/dokuwiki/";
38 logo = "https://tools.immae.eu/dokuwiki/lib/tpl/dokuwiki/images/apple-touch-icon.png";
39 status.level = "OK";
40 status.description = "OK";
41 registration."" = ["MEMBER" "CLIENT"];
42 registration.load = "OPEN";
43 install.type = "PACKAGE";
44 };
45 software = {
46 name = "Dokuwiki";
47 website = "https://www.dokuwiki.org/dokuwiki";
48 license.url = "http://www.gnu.org/licenses/gpl-2.0.html";
49 license.name = "GNU General Public License Version 2";
50 version = webRoot.version;
51 source.url = "https://download.dokuwiki.org/";
52 modules = map (a: a.pluginName) webRoot.plugins;
53 };
54 };
55 webRoot = dokuwiki.withPlugins (p: [ p.farmer p.todo ]);
56 apache = rec {
57 user = "wwwrun";
58 group = "wwwrun";
59 modules = [ "proxy_fcgi" ];
60 root = webRoot;
61 vhostConf = socket: ''
62 Alias /dokuwiki "${root}"
63 <Directory "${root}">
64 DirectoryIndex index.php
65 <FilesMatch "\.php$">
66 SetHandler "proxy:unix:${socket}|fcgi://localhost"
67 </FilesMatch>
68
69 AllowOverride All
70 Options +FollowSymlinks
71 Require all granted
72 </Directory>
73 '';
74 };
75 phpFpm = rec {
76 serviceDeps = [ "openldap.service" ];
77 basedir = builtins.concatStringsSep ":" (
78 [ webRoot varDir ] ++ webRoot.plugins);
79 pool = {
80 "listen.owner" = apache.user;
81 "listen.group" = apache.group;
82 "pm" = "ondemand";
83 "pm.max_children" = "60";
84 "pm.process_idle_timeout" = "60";
85
86 # Needed to avoid clashes in browser cookies (same domain)
87 "php_value[session.name]" = "DokuwikiPHPSESSID";
88 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
89 "php_admin_value[session.save_handler]" = "redis";
90 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Dokuwiki:'";
91 };
92 };
93 monitoringPlugins = [ "http" ];
94 monitoringObjects.service = [
95 {
96 service_description = "dokuwiki website is running on tools.immae.eu";
97 host_name = config.hostEnv.fqdn;
98 use = "external-web-service";
99 check_command = ["check_https" "tools.immae.eu" "/dokuwiki/" "<title>start"];
100
101 servicegroups = "webstatus-webapps";
102 _webstatus_name = "Dokuwiki";
103 _webstatus_url = "https://tools.immae.eu/dokuwiki/";
104 }
105 ];
106}
diff --git a/systems/eldiron/websites/tools/grocy.nix b/systems/eldiron/websites/tools/grocy.nix
new file mode 100644
index 0000000..96e18a3
--- /dev/null
+++ b/systems/eldiron/websites/tools/grocy.nix
@@ -0,0 +1,48 @@
1{ lib, stdenv, grocy }:
2rec {
3 varDir = "/var/lib/grocy";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
8 '';
9 };
10 webRoot = grocy.webRoot;
11 apache = rec {
12 user = "wwwrun";
13 group = "wwwrun";
14 modules = [ "proxy_fcgi" ];
15 root = webRoot;
16 vhostConf = socket: ''
17 Alias /grocy "${root}"
18 <Directory "${root}">
19 DirectoryIndex index.php
20 <FilesMatch "\.php$">
21 SetHandler "proxy:unix:${socket}|fcgi://localhost"
22 </FilesMatch>
23
24 AllowOverride All
25 Options +FollowSymlinks
26 Require all granted
27 </Directory>
28 '';
29 };
30 phpFpm = rec {
31 basedir = builtins.concatStringsSep ":" (
32 [ grocy grocy.yarnModules varDir ]);
33 pool = {
34 "listen.owner" = apache.user;
35 "listen.group" = apache.group;
36 "pm" = "ondemand";
37 "pm.max_children" = "60";
38 "pm.process_idle_timeout" = "60";
39
40 # Needed to avoid clashes in browser cookies (same domain)
41 "php_value[session.name]" = "grocyPHPSESSID";
42 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
43 "php_admin_value[session.save_handler]" = "redis";
44 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Grocy:'";
45 };
46 };
47}
48
diff --git a/systems/eldiron/websites/tools/kanboard.nix b/systems/eldiron/websites/tools/kanboard.nix
new file mode 100644
index 0000000..db39ecd
--- /dev/null
+++ b/systems/eldiron/websites/tools/kanboard.nix
@@ -0,0 +1,81 @@
1{ env, kanboard, config }:
2rec {
3 varDir = "/var/lib/kanboard";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/data
8 install -TDm644 ${webRoot}/dataold/.htaccess ${varDir}/data/.htaccess
9 install -TDm644 ${webRoot}/dataold/web.config ${varDir}/data/web.config
10 '';
11 };
12 keys."webapps/tools-kanboard" = {
13 user = apache.user;
14 group = apache.group;
15 permissions = "0400";
16 text = ''
17 SetEnv MAIL_FROM "kanboard@tools.immae.eu"
18
19 SetEnv DB_DRIVER "postgres"
20 SetEnv DB_USERNAME "${env.postgresql.user}"
21 SetEnv DB_PASSWORD "${env.postgresql.password}"
22 SetEnv DB_HOSTNAME "${env.postgresql.socket}"
23 SetEnv DB_NAME "${env.postgresql.database}"
24
25 SetEnv DATA_DIR "${varDir}"
26 SetEnv LDAP_AUTH "true"
27 SetEnv LDAP_SERVER "${env.ldap.host}"
28 SetEnv LDAP_START_TLS "true"
29
30 SetEnv LDAP_BIND_TYPE "proxy"
31 SetEnv LDAP_USERNAME "${env.ldap.dn}"
32 SetEnv LDAP_PASSWORD "${env.ldap.password}"
33 SetEnv LDAP_USER_BASE_DN "${env.ldap.base}"
34 SetEnv LDAP_USER_FILTER "${env.ldap.filter}"
35 SetEnv LDAP_GROUP_ADMIN_DN "${env.ldap.admin_dn}"
36 '';
37 };
38 webRoot = kanboard;
39 apache = rec {
40 user = "wwwrun";
41 group = "wwwrun";
42 modules = [ "proxy_fcgi" ];
43 root = webRoot;
44 vhostConf = socket: ''
45 Alias /kanboard "${root}"
46 <Location /kanboard>
47 Include ${config.secrets.fullPaths."webapps/tools-kanboard"}
48 </Location>
49 <Directory "${root}">
50 DirectoryIndex index.php
51 AllowOverride All
52 Options FollowSymlinks
53 Require all granted
54
55 <FilesMatch "\.php$">
56 SetHandler "proxy:unix:${socket}|fcgi://localhost"
57 </FilesMatch>
58 </Directory>
59 <DirectoryMatch "${root}/data">
60 Require all denied
61 </DirectoryMatch>
62 '';
63 };
64 phpFpm = rec {
65 serviceDeps = [ "postgresql.service" "openldap.service" ];
66 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
67 pool = {
68 "listen.owner" = apache.user;
69 "listen.group" = apache.group;
70 "pm" = "ondemand";
71 "pm.max_children" = "60";
72 "pm.process_idle_timeout" = "60";
73
74 # Needed to avoid clashes in browser cookies (same domain)
75 "php_value[session.name]" = "KanboardPHPSESSID";
76 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
77 "php_admin_value[session.save_handler]" = "redis";
78 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Kanboard:'";
79 };
80 };
81}
diff --git a/systems/eldiron/websites/tools/landing.nix b/systems/eldiron/websites/tools/landing.nix
new file mode 100644
index 0000000..f5d851e
--- /dev/null
+++ b/systems/eldiron/websites/tools/landing.nix
@@ -0,0 +1,38 @@
1{ stdenv, yarn2nix-moretea, nodejs_16 }:
2let
3 source = builtins.fetchGit {
4 url = "https://git.immae.eu/github/bastienwirtz/homer.git";
5 ref = "gitolite_local/local_changes";
6 rev = "bb60c5b869931f305f15c5bfa9cdb3f68702f01f";
7 narHash = "sha256-xBIBUJhQ7KPY0d92pW9ErA9OvGafWcxyuGkbHShF4Bs=";
8 };
9 yarnModules = yarn2nix-moretea.mkYarnModules rec {
10 nodejs = nodejs_16;
11 name = "landing";
12 pname = name;
13 version = "v1.0.0";
14 packageJSON = "${source}/package.json";
15 yarnLock = "${source}/yarn.lock";
16 yarnNix = ./landing/yarn-packages.nix;
17 };
18in
19 stdenv.mkDerivation rec {
20 pname = "landing";
21 version = "v1.0.0";
22 src = source;
23
24 buildInputs = [ yarnModules yarn2nix-moretea.yarn ];
25 configurePhase = ''
26 ln -s ${yarnModules}/node_modules .
27 '';
28 buildPhase = ''
29 # See https://stackoverflow.com/questions/74548318/how-to-resolve-error-error0308010cdigital-envelope-routinesunsupported-no
30 export NODE_OPTIONS=--openssl-legacy-provider
31 yarn build
32 '';
33 installPhase = ''
34 cp -a dist $out
35 cp ${./landing}/*.php $out/
36 ln -s service-worker.js $out/worker.js
37 '';
38 }
diff --git a/systems/eldiron/websites/tools/landing/ldap_password.php b/systems/eldiron/websites/tools/landing/ldap_password.php
new file mode 100644
index 0000000..efb4f57
--- /dev/null
+++ b/systems/eldiron/websites/tools/landing/ldap_password.php
@@ -0,0 +1,170 @@
1<?php
2
3/**
4 * LDAP PHP Change Password Webpage
5 * @author: Matt Rude <http://mattrude.com>
6 * @website: http://technology.mattrude.com/2010/11/ldap-php-change-password-webpage/
7 *
8 *
9 * GNU GENERAL PUBLIC LICENSE
10 * Version 2, June 1991
11 *
12 * Copyright (C) 1989, 1991 Free Software Foundation, Inc.,
13 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
14 * Everyone is permitted to copy and distribute verbatim copies
15 * of this license document, but changing it is not allowed.
16 */
17
18$message = array();
19$message_css = "";
20
21function changePasswordLDAP($con, $user_dn, $newPassword){
22 global $message;
23 $salt = substr(str_shuffle(str_repeat('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789',4)),0,4);
24 $encoded_newPassword = "{SSHA}" . base64_encode(pack("H*", sha1($newPassword.$salt)).$salt);
25
26 $entry = array();
27 $entry["userPassword"] = "$encoded_newPassword";
28
29 if (ldap_modify($con,$user_dn,$entry) === false){
30 $error = ldap_error($con);
31 $errno = ldap_errno($con);
32 $message[] = "$errno - $error";
33 return false;
34 } else {
35 return true;
36 }
37}
38
39function changePasswordSQL($user_realm, $newPassword) {
40 global $message;
41
42 foreach(["PGUSER", "PGPASSWORD", "PGDATABASE", "PGHOST"] as $k) {
43 if (isset($_SERVER[$k]) && !isset($_ENV[$k])) {
44 putenv("${k}=" . $_SERVER[$k]);
45 }
46 }
47 $con = pg_connect("");
48 $result = pg_query_params($con, "WITH newsalt as (SELECT gen_random_bytes(4)) UPDATE ldap_users SET password = encode(digest( $1 || (SELECT * FROM newsalt), 'sha1'), 'hex'), mechanism = 'SSHA', salt = (SELECT * FROM newsalt) where login || '@' || realm = $2", array($newPassword, $user_realm));
49 if (!$result) {
50 $message[] = "Error when accessing database";
51 return false;
52 } else {
53 return true;
54 }
55}
56
57function changePassword($user,$oldPassword,$newPassword,$newPasswordCnf){
58 global $message;
59 global $message_css;
60
61 $server = "ldaps://ldap.immae.eu";
62
63 error_reporting(0);
64 $con = ldap_connect($server);
65 ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
66
67 $user_dn = "uid=$user,ou=users,dc=immae,dc=eu";
68
69 if (ldap_bind($con, $user_dn, $oldPassword) === false) {
70 $user_dn = "uid=$user,ou=group_users,dc=immae,dc=eu";
71 if (ldap_bind($con, $user_dn, $oldPassword) === false) {
72 $message[] = "Error E101 - Current Username or Password is wrong.";
73 return false;
74 }
75 }
76 if ($newPassword != $newPasswordCnf ) {
77 $message[] = "Error E102 - Your New passwords do not match!";
78 return false;
79 }
80 if (strlen($newPassword) < 6 ) {
81 $message[] = "Error E103 - Your new password is too short.<br/>Your password must be at least 6 characters long.";
82 return false;
83 }
84
85 $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)");
86 $auth_entry = ldap_first_entry($con, $user_search);
87
88 $mail_address = ldap_get_values($con, $auth_entry, "mail")[0];
89 $first_name = ldap_get_values($con, $auth_entry, "givenName")[0];
90 $existing_password = ldap_get_values($con, $auth_entry, "userPassword")[0];
91 if (substr($existing_password, 0, 6) == "{SASL}") {
92 $result = changePasswordSQL(substr($existing_password, 6), $newPassword);
93 } else {
94 $result = changePasswordLDAP($con, $user_dn, $newPassword);
95 }
96
97 if (!$result) {
98 $message[] = "E201 - Your password cannot be changed, please contact the administrator.";
99 } else {
100 $message_css = "yes";
101 mail($mail_address,"Password change notice","Dear $first_name,
102Your password on https://tools.immae.eu/ldap_password.php for account $user was just changed.
103If you did not make this change, please contact me.
104If you were the one who changed your password, you may disregard this message.
105
106Thanks
107--
108Immae / Ismaël", "From: " . getenv("CONTACT_EMAIL"));
109 $message[] = "The password for $user has been changed.<br/>An informational email has been sent to $mail_address.<br/>Your new password is now fully active.";
110 }
111}
112
113?>
114<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
115<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
116<head>
117<title>Password Change Page</title>
118<meta name="viewport" content="width=device-width, initial-scale=1" />
119<link rel="stylesheet" href="https://assets.immae.eu/skeleton/2.0.4/skeleton.min.css" integrity="sha256-2YQRJMXD7pIAPHiXr0s+vlRWA7GYJEK0ARns7k2sbHY=" crossorigin="anonymous" />
120<style type="text/css">
121 body { font-family: Verdana,Arial,Courier New; margin: auto; }
122
123 .msg_yes { margin: 0 auto; text-align: center; color: green; background: #D4EAD4; border: 1px solid green; border-radius: 10px; margin: 2px; }
124 .msg_no { margin: 0 auto; text-align: center; color: red; background: #FFF0F0; border: 1px solid red; border-radius: 10px; margin: 2px; }
125</style>
126<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
127</head>
128<body>
129<div class="container">
130<form action="<?php print $_SERVER['PHP_SELF']; ?>" name="passwordChange" method="post">
131<h3>Password Change Page</h3>
132<?php
133if (isset($_POST["submitted"])) {
134 echo '<div class="row">';
135 changePassword($_POST['username'],$_POST['oldPassword'],$_POST['newPassword1'],$_POST['newPassword2']);
136 global $message_css;
137 if ($message_css == "yes") {
138 echo '<div class="msg_yes">';
139 } else {
140 echo '<div class="msg_no">';
141 $message[] = "Your password was not changed.";
142 }
143 foreach ( $message as $one ) { echo "<p>$one</p>"; }
144 ?></div></div><?php
145} ?>
146 <div class="row">
147 <div class="one-third column"><label for="username">Username</label></div>
148 <div class="two-thirds column"><input id="username" name="username" type="text" autocomplete="off" /></div>
149 </div>
150 <div class="row">
151 <div class="one-third column"><label for="oldPassword">Current password</label></div>
152 <div class="two-thirds column"><input id="oldPassword" name="oldPassword" type="password" /></div>
153 </div>
154 <div class="row">
155 <div class="one-third column"><label for="newPassword1">New password</label></div>
156 <div class="two-thirds column"><input id="newPassword1" name="newPassword1" type="password" /></div>
157 </div>
158 <div class="row">
159 <div class="one-third column"><label for="newPassword2">New password (again)</label></div>
160 <div class="two-thirds column"><input id="newPassword2" name="newPassword2" type="password" /></div>
161 </div>
162 <div class="row">
163 <div class="column">
164 <input name="submitted" type="submit" value="Change Password"/>
165 </div>
166 </div>
167</form>
168</div>
169</body>
170</html>
diff --git a/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php b/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php
new file mode 100644
index 0000000..85ed973
--- /dev/null
+++ b/systems/eldiron/websites/tools/landing/ldap_ssh_keys.php
@@ -0,0 +1,343 @@
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
2<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="fr" lang="fr">
3 <head>
4 <title>ImmaeEu Account</title>
5 <meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
6 <meta name="viewport" content="width=device-width, initial-scale=1" />
7 <link rel="stylesheet" href="https://assets.immae.eu/skeleton/2.0.4/skeleton.min.css" integrity="sha256-2YQRJMXD7pIAPHiXr0s+vlRWA7GYJEK0ARns7k2sbHY=" crossorigin="anonymous" />
8 <style type="text/css">
9 body {
10 font-family: Verdana,Arial,Courier New;
11 margin: auto;
12 }
13 table#ssh_keys_list textarea {
14 width: 100%;
15 height: 100%;
16 }
17 table#ssh_keys_list tbody tr.sshkeyrow {
18 height: 130px;
19 }
20 table#ssh_keys_list tbody tr.headrow th {
21 border-bottom: 0px !important;
22 padding-bottom: 0px !important;
23 }
24 table#ssh_keys_list tbody tr.mainrow td:not(.delete-button) {
25 border-bottom: 0px !important;
26 padding-bottom: 0px !important;
27 }
28 table#ssh_keys_list td.sshkey {
29 min-width: 600px;
30 height: 100%;
31 padding-top: 0px !important;
32 }
33
34 table#ssh_keys_list td.comment {
35 min-width: 160px;
36 }
37
38 </style>
39 </head>
40 <body>
41 <div class="container">
42 <h1>Gestion des clés SSH</h1>
43<?php
44
45$connection = NULL;
46
47session_start();
48
49// Liste des applications gérées
50const apps = [
51 'git',
52 'pub',
53 'ftp',
54 'ssh',
55 'forward',
56];
57
58function checkSshKey($sshKey)
59{
60 $exploded = explode(' ', $sshKey);
61 if (count($exploded) != 2) {
62 return false;
63 }
64 if (!in_array($exploded[0], array('ssh-rsa', 'ssh-ed25519'))) {
65 return false;
66 }
67 $decoded = base64_decode($exploded[1], true);
68 if ($decoded === FALSE) {
69 return false;
70 }
71 $decoded = preg_replace("/[^\w\-]/","", (string) $decoded);
72 if (substr($decoded, 0, strlen($exploded[0])) !== $exploded[0]) {
73 return false;
74 }
75
76 return true;
77}
78
79function isUserLogged()
80{
81 return (isset($_SESSION["login"]));
82}
83
84function checkLogin($user, $password)
85{
86 $server = "ldaps://ldap.immae.eu";
87 $con = ldap_connect($server);
88 ldap_set_option($con, LDAP_OPT_PROTOCOL_VERSION, 3);
89
90 $user_dn = "uid=$user,ou=users,dc=immae,dc=eu";
91
92 if (ldap_bind($con, $user_dn, $password) === false) {
93 return false;
94 }
95 $_SESSION["user_dn"] = $user_dn;
96
97 $user_search = ldap_search($con,"dc=immae,dc=eu","(uid=$user)");
98 $auth_entry = ldap_first_entry($con, $user_search);
99
100 return true;
101}
102
103function connectPg() {
104 foreach(["PGUSER", "PGPASSWORD", "PGDATABASE", "PGHOST"] as $k) {
105 if (isset($_SERVER[$k]) && !isset($_ENV[$k])) {
106 putenv("${k}=" . $_SERVER[$k]);
107 }
108 }
109 $con = pg_connect("");
110 if (!$con) {
111 die("database access error");
112 }
113 return $con;
114}
115
116function getKeys()
117{
118 $keys = [];
119 if (!isset($_SESSION["login"]))
120 return $keys;
121 $pg = connectPg();
122 $result = pg_query_params($pg, "SELECT id,key,array_to_json(usage) as usage,comment FROM ldap_users_ssh_keys WHERE realm = 'immae' AND login = $1 ORDER BY id", array($_SESSION["login"]));
123 if (!$result) {
124 die("database access error");
125 }
126 $keys = [];
127 while ($row = pg_fetch_assoc($result)) {
128 $keys[] = array(
129 'id' => $row["id"],
130 'apps' => json_decode($row["usage"]),
131 'public_key' => $row["key"],
132 'comment' => $row["comment"],
133 );
134 }
135
136 pg_close($pg);
137 return $keys;
138}
139
140function saveKeys($keys)
141{
142 if (!isset($_SESSION["login"])) {
143 return false;
144 }
145 $pg = connectPg();
146 $existingIds = pg_fetch_all_columns(pg_query_params($pg, "SELECT id FROM ldap_users_ssh_keys WHERE realm = 'immae' AND login = $1", array($_SESSION["login"])));
147 foreach ($keys as $key) {
148 if (isset($key["id"])) {
149 unset($existingIds[array_search($key["id"],$existingIds)]);
150 pg_query_params($pg, "UPDATE ldap_users_ssh_keys SET key = $2, usage = ARRAY(SELECT * FROM json_array_elements_text($3))::ldap_users_ssh_key_usage[], comment = $4 WHERE id = $5 AND login = $1 AND realm = 'immae'", array($_SESSION["login"], $key["public_key"], json_encode($key["apps"]), $key["comment"], $key["id"]));
151 } else {
152 pg_query_params($pg, "INSERT INTO ldap_users_ssh_keys (login,realm,key,usage,comment) values ($1,'immae',$2,ARRAY(SELECT * FROM json_array_elements_text($3))::ldap_users_ssh_key_usage[],$4)", array($_SESSION["login"], $key["public_key"], json_encode($key["apps"]), $key["comment"]));
153 }
154 }
155 foreach ($existingIds as $removedKeyId) {
156 pg_query_params($pg, "DELETE FROM ldap_users_ssh_keys WHERE login = $1 AND realm = 'immae' AND id = $2", array($_SESSION["login"], $removedKeyId));
157 }
158}
159
160
161// Script
162if (isset($_POST['deconnexion'])) {
163 $_SESSION = [];
164}
165
166if (isset($_POST['sauvegarder'])) {
167 $editedKeys = [];
168 $errors = false;
169 $keysToSave = [];
170 foreach($_POST['keys'] as $id => $key) {
171 $editedKeys[$id] = $key;
172 if (!checkSshKey($key['public_key'])) {
173 $editedKeys[$id]['error'] = true;
174 $errors = true;
175 }
176
177 if (!isset($key['apps'])) {
178 $editedKeys[$id]['apps'] = $key['apps'] = [];
179
180 }
181 foreach ($key['apps'] as $app) {
182 if (!in_array($app, apps)) {
183 die("integrity");
184 }
185 }
186
187 if (!isset($editedKeys[$id]['error']) || $editedKeys[$id]['error'] !== true) {
188 $keysToSave[] = $key;
189 }
190 }
191
192 if (!$errors) {
193 $successSave = saveKeys($keysToSave);
194 }
195}
196
197$loginErrors = "";
198if (isset($_POST['login'])) {
199 if (empty($_POST['username']) || empty($_POST['password'])) {
200 $loginErrors = "Le nom d'utilisateur et le mot de passe sont requis.";
201 } elseif (!checkLogin($_POST['username'], $_POST['password'])) {
202 $loginErrors = "Identifiants incorrects.";
203 } else {
204 $_SESSION['login'] = $_POST['username'];
205 }
206}
207
208if (isUserLogged()) :
209 $keys = isset($editedKeys) ? $editedKeys : getKeys();
210?>
211 <p>Connecté en tant que <b><?= $_SESSION['login']; ?></b></p>
212
213 <form method="post">
214 <input type="submit" name="deconnexion" value="Déconnexion">
215 </form>
216
217 <?php if (isset($successSave) && $successSave === true) : ?>
218 <p style="color: green;">Clés enregistrées avec succès.</p>
219 <?php endif; ?>
220
221 <form method="post">
222 <table id="ssh_keys_list">
223 <tbody>
224 <?php
225 foreach ($keys as $id => $sshKey) :
226 ?>
227 <tr class="headrow">
228 <th>Description</th>
229 <?php foreach (apps as $app) : ?>
230 <th><?= $app ?></th>
231 <?php endforeach; ?>
232 <th></th>
233 </tr>
234 <tr class="mainrow">
235 <td class="comment"><textarea name="keys[<?= $id ?>][comment]"><?= $sshKey['comment'] ?></textarea></td>
236 <?php
237 foreach (apps as $app) :
238 $checked = in_array($app, $sshKey['apps']);
239 ?>
240 <td><input type="checkbox" name="keys[<?= $id ?>][apps][]" value="<?= $app ?>"<?= $checked ? ' checked' : '' ?>></td>
241 <?php endforeach; ?>
242 <td class="delete-button" rowspan="2"><input type="hidden" name="keys[<?= $id ?>][id]" value="<?= $sshKey["id"] ?>"><button class="delete">Suppr.</button></td>
243 </tr>
244 <tr class="sshkeyrow">
245 <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[<?= $id ?>][public_key]" <?php if (isset($sshKey['error']) && $sshKey['error'] === true) :?>style="color: red"<?php endif; ?>><?= $sshKey['public_key'] ?></textarea></td>
246 </tr>
247 <?php
248 endforeach;
249 ?>
250 </tbody>
251 </table>
252
253 <button id="add">Ajouter</button>
254
255 <hr>
256
257 <input type="submit" value="Sauvegarder" name="sauvegarder">
258 </form>
259 <script>
260 function deleteLine(element) {
261 element.addEventListener('click', function(e) {
262 e.preventDefault();
263 e.target.closest('tr').nextElementSibling.remove();
264 e.target.closest('tr').previousElementSibling.remove();
265 e.target.closest('tr').remove();
266 }, false);
267 }
268
269 var suppr = document.getElementsByClassName('delete');
270 var add = document.getElementById('add');
271 var list = document.querySelector('#ssh_keys_list > tbody');
272
273 for (var i = 0; i < suppr.length; i++) {
274 deleteLine(suppr[i]);
275 }
276
277 add.addEventListener('click', function (e) {
278 e.preventDefault();
279 i++;
280
281 var newLine = `
282 <tr class="headrow">
283 <th>Description</th>
284 <?php foreach (apps as $app) : ?>
285 <th><?= $app ?></th>
286 <?php endforeach; ?>
287 <th></th>
288 </tr>
289 <tr class="mainrow">
290 <td class="comment"><textarea name="keys[${i}][comment]"></textarea></td>
291 `;
292
293
294 <?php
295 foreach (apps as $app) :
296 ?>
297 newLine += `<td><input type="checkbox" name="keys[${i}][apps][]" value="<?= $app ?>"></td>`;
298 <?php endforeach; ?>
299
300 newLine += `<td class="delete-button" rowspan="2"><button class="delete" id="delete-${i}">Suppr.</button></td>
301 </tr>`;
302
303 newLine += `<tr class="sshkeyrow">
304 <td colspan="<?php echo 1+count(apps); ?>" class="sshkey"><textarea name="keys[${i}][public_key]"></textarea></td>
305 </tr>`;
306
307
308 list.insertAdjacentHTML('beforeend', newLine);
309
310 deleteLine(document.getElementById("delete-" + i));
311
312 }, false)
313 </script>
314<?php
315else:
316?>
317 <form action="" method="post">
318 <h2>Login</h2>
319
320 <?php
321 if (!empty($loginErrors)):
322 ?>
323 <p style="color: red;"><?= $loginErrors; ?></p>
324 <?php
325 endif;
326 ?>
327
328 <label for="username">Utilisateur :</label>
329 <input type="text" id="username" name="username"/>
330
331 <label for="password">Mot de passe :</label>
332 <input type="password" id="password" name="password"/>
333
334 <input type="submit" value="OK" name="login" />
335 </form>
336<?php
337endif;
338?>
339 </div>
340 </body>
341</html>
342
343
diff --git a/systems/eldiron/websites/tools/landing/myip.php b/systems/eldiron/websites/tools/landing/myip.php
new file mode 100644
index 0000000..9ec1c6c
--- /dev/null
+++ b/systems/eldiron/websites/tools/landing/myip.php
@@ -0,0 +1 @@
<?php echo $_SERVER['REMOTE_ADDR']; ?>
diff --git a/systems/eldiron/websites/tools/landing/node-packages.nix b/systems/eldiron/websites/tools/landing/node-packages.nix
new file mode 100644
index 0000000..9ebf254
--- /dev/null
+++ b/systems/eldiron/websites/tools/landing/node-packages.nix
@@ -0,0 +1,130 @@
1# This file has been generated by node2nix 1.8.0. Do not edit!
2
3{nodeEnv, fetchurl, fetchgit, src, globalBuildInputs ? []}:
4
5let
6 sources = {
7 "@fortawesome/fontawesome-free-5.13.1" = {
8 name = "_at_fortawesome_slash_fontawesome-free";
9 packageName = "@fortawesome/fontawesome-free";
10 version = "5.13.1";
11 src = fetchurl {
12 url = "https://registry.npmjs.org/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.1.tgz";
13 sha512 = "D819f34FLHeBN/4xvw0HR0u7U2G7RqjPSggXqf7LktsxWQ48VAfGwvMrhcVuaZV2fF069c/619RdgCCms0DHhw==";
14 };
15 };
16 "argparse-1.0.10" = {
17 name = "argparse";
18 packageName = "argparse";
19 version = "1.0.10";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz";
22 sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==";
23 };
24 };
25 "bulma-0.8.2" = {
26 name = "bulma";
27 packageName = "bulma";
28 version = "0.8.2";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/bulma/-/bulma-0.8.2.tgz";
31 sha512 = "vMM/ijYSxX+Sm+nD7Lmc1UgWDy2JcL2nTKqwgEqXuOMU+IGALbXd5MLt/BcjBAPLIx36TtzhzBcSnOP974gcqA==";
32 };
33 };
34 "core-js-3.6.5" = {
35 name = "core-js";
36 packageName = "core-js";
37 version = "3.6.5";
38 src = fetchurl {
39 url = "https://registry.npmjs.org/core-js/-/core-js-3.6.5.tgz";
40 sha512 = "vZVEEwZoIsI+vPEuoF9Iqf5H7/M3eeQqWlQnYa8FSKKePuYTf5MWnxb5SDAzCa60b3JBRS5g9b+Dq7b1y/RCrA==";
41 };
42 };
43 "esprima-4.0.1" = {
44 name = "esprima";
45 packageName = "esprima";
46 version = "4.0.1";
47 src = fetchurl {
48 url = "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz";
49 sha512 = "eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==";
50 };
51 };
52 "js-yaml-3.14.0" = {
53 name = "js-yaml";
54 packageName = "js-yaml";
55 version = "3.14.0";
56 src = fetchurl {
57 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.0.tgz";
58 sha512 = "/4IbIeHcD9VMHFqDR/gQ7EdZdLimOvW2DdcxFjdyyZ9NsbS+ccrXqVWDtab/lRl5AlUqmpBx8EhPaWR+OtY17A==";
59 };
60 };
61 "lodash.merge-4.6.2" = {
62 name = "lodash.merge";
63 packageName = "lodash.merge";
64 version = "4.6.2";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz";
67 sha512 = "0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==";
68 };
69 };
70 "register-service-worker-1.7.1" = {
71 name = "register-service-worker";
72 packageName = "register-service-worker";
73 version = "1.7.1";
74 src = fetchurl {
75 url = "https://registry.npmjs.org/register-service-worker/-/register-service-worker-1.7.1.tgz";
76 sha512 = "IdTfUZ4u8iJL8o1w8es8l6UMGPmkwHolUdT+UmM1UypC80IB4KbpuIlvwWVj8UDS7eJwkEYRcKRgfRX+oTmJsw==";
77 };
78 };
79 "sprintf-js-1.0.3" = {
80 name = "sprintf-js";
81 packageName = "sprintf-js";
82 version = "1.0.3";
83 src = fetchurl {
84 url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz";
85 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
86 };
87 };
88 "vue-2.6.11" = {
89 name = "vue";
90 packageName = "vue";
91 version = "2.6.11";
92 src = fetchurl {
93 url = "https://registry.npmjs.org/vue/-/vue-2.6.11.tgz";
94 sha512 = "VfPwgcGABbGAue9+sfrD4PuwFar7gPb1yl1UK1MwXoQPAw0BKSqWfoYCT/ThFrdEVWoI51dBuyCoiNU9bZDZxQ==";
95 };
96 };
97 };
98 args = {
99 name = "homer";
100 packageName = "homer";
101 version = "20.06.1";
102 inherit src;
103 dependencies = [
104 sources."@fortawesome/fontawesome-free-5.13.1"
105 sources."argparse-1.0.10"
106 sources."bulma-0.8.2"
107 sources."core-js-3.6.5"
108 sources."esprima-4.0.1"
109 sources."js-yaml-3.14.0"
110 sources."lodash.merge-4.6.2"
111 sources."register-service-worker-1.7.1"
112 sources."sprintf-js-1.0.3"
113 sources."vue-2.6.11"
114 ];
115 buildInputs = globalBuildInputs;
116 meta = {
117 license = "Apache-2.0";
118 };
119 production = true;
120 bypassCache = true;
121 reconstructLock = true;
122 };
123in
124{
125 args = args;
126 sources = sources;
127 tarball = nodeEnv.buildNodeSourceDist args;
128 package = nodeEnv.buildNodePackage args;
129 shell = nodeEnv.buildNodeShell args;
130}
diff --git a/systems/eldiron/websites/tools/landing/yarn-packages.nix b/systems/eldiron/websites/tools/landing/yarn-packages.nix
new file mode 100644
index 0000000..9621c3e
--- /dev/null
+++ b/systems/eldiron/websites/tools/landing/yarn-packages.nix
@@ -0,0 +1,9357 @@
1{ fetchurl, fetchgit, linkFarm, runCommandNoCC, gnutar }: rec {
2 offline_cache = linkFarm "offline" packages;
3 packages = [
4 {
5 name = "_babel_code_frame___code_frame_7.10.1.tgz";
6 path = fetchurl {
7 name = "_babel_code_frame___code_frame_7.10.1.tgz";
8 url = "https://registry.yarnpkg.com/@babel/code-frame/-/code-frame-7.10.1.tgz";
9 sha1 = "d5481c5095daa1c57e16e54c6f9198443afb49ff";
10 };
11 }
12 {
13 name = "_babel_compat_data___compat_data_7.10.1.tgz";
14 path = fetchurl {
15 name = "_babel_compat_data___compat_data_7.10.1.tgz";
16 url = "https://registry.yarnpkg.com/@babel/compat-data/-/compat-data-7.10.1.tgz";
17 sha1 = "b1085ffe72cd17bf2c0ee790fc09f9626011b2db";
18 };
19 }
20 {
21 name = "_babel_core___core_7.10.2.tgz";
22 path = fetchurl {
23 name = "_babel_core___core_7.10.2.tgz";
24 url = "https://registry.yarnpkg.com/@babel/core/-/core-7.10.2.tgz";
25 sha1 = "bd6786046668a925ac2bd2fd95b579b92a23b36a";
26 };
27 }
28 {
29 name = "_babel_generator___generator_7.10.2.tgz";
30 path = fetchurl {
31 name = "_babel_generator___generator_7.10.2.tgz";
32 url = "https://registry.yarnpkg.com/@babel/generator/-/generator-7.10.2.tgz";
33 sha1 = "0fa5b5b2389db8bfdfcc3492b551ee20f5dd69a9";
34 };
35 }
36 {
37 name = "_babel_helper_annotate_as_pure___helper_annotate_as_pure_7.10.1.tgz";
38 path = fetchurl {
39 name = "_babel_helper_annotate_as_pure___helper_annotate_as_pure_7.10.1.tgz";
40 url = "https://registry.yarnpkg.com/@babel/helper-annotate-as-pure/-/helper-annotate-as-pure-7.10.1.tgz";
41 sha1 = "f6d08acc6f70bbd59b436262553fb2e259a1a268";
42 };
43 }
44 {
45 name = "_babel_helper_builder_binary_assignment_operator_visitor___helper_builder_binary_assignment_operator_visitor_7.10.1.tgz";
46 path = fetchurl {
47 name = "_babel_helper_builder_binary_assignment_operator_visitor___helper_builder_binary_assignment_operator_visitor_7.10.1.tgz";
48 url = "https://registry.yarnpkg.com/@babel/helper-builder-binary-assignment-operator-visitor/-/helper-builder-binary-assignment-operator-visitor-7.10.1.tgz";
49 sha1 = "0ec7d9be8174934532661f87783eb18d72290059";
50 };
51 }
52 {
53 name = "_babel_helper_compilation_targets___helper_compilation_targets_7.10.2.tgz";
54 path = fetchurl {
55 name = "_babel_helper_compilation_targets___helper_compilation_targets_7.10.2.tgz";
56 url = "https://registry.yarnpkg.com/@babel/helper-compilation-targets/-/helper-compilation-targets-7.10.2.tgz";
57 sha1 = "a17d9723b6e2c750299d2a14d4637c76936d8285";
58 };
59 }
60 {
61 name = "_babel_helper_create_class_features_plugin___helper_create_class_features_plugin_7.10.2.tgz";
62 path = fetchurl {
63 name = "_babel_helper_create_class_features_plugin___helper_create_class_features_plugin_7.10.2.tgz";
64 url = "https://registry.yarnpkg.com/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.10.2.tgz";
65 sha1 = "7474295770f217dbcf288bf7572eb213db46ee67";
66 };
67 }
68 {
69 name = "_babel_helper_create_regexp_features_plugin___helper_create_regexp_features_plugin_7.10.1.tgz";
70 path = fetchurl {
71 name = "_babel_helper_create_regexp_features_plugin___helper_create_regexp_features_plugin_7.10.1.tgz";
72 url = "https://registry.yarnpkg.com/@babel/helper-create-regexp-features-plugin/-/helper-create-regexp-features-plugin-7.10.1.tgz";
73 sha1 = "1b8feeab1594cbcfbf3ab5a3bbcabac0468efdbd";
74 };
75 }
76 {
77 name = "_babel_helper_define_map___helper_define_map_7.10.1.tgz";
78 path = fetchurl {
79 name = "_babel_helper_define_map___helper_define_map_7.10.1.tgz";
80 url = "https://registry.yarnpkg.com/@babel/helper-define-map/-/helper-define-map-7.10.1.tgz";
81 sha1 = "5e69ee8308648470dd7900d159c044c10285221d";
82 };
83 }
84 {
85 name = "_babel_helper_explode_assignable_expression___helper_explode_assignable_expression_7.10.1.tgz";
86 path = fetchurl {
87 name = "_babel_helper_explode_assignable_expression___helper_explode_assignable_expression_7.10.1.tgz";
88 url = "https://registry.yarnpkg.com/@babel/helper-explode-assignable-expression/-/helper-explode-assignable-expression-7.10.1.tgz";
89 sha1 = "e9d76305ee1162ca467357ae25df94f179af2b7e";
90 };
91 }
92 {
93 name = "_babel_helper_function_name___helper_function_name_7.10.1.tgz";
94 path = fetchurl {
95 name = "_babel_helper_function_name___helper_function_name_7.10.1.tgz";
96 url = "https://registry.yarnpkg.com/@babel/helper-function-name/-/helper-function-name-7.10.1.tgz";
97 sha1 = "92bd63829bfc9215aca9d9defa85f56b539454f4";
98 };
99 }
100 {
101 name = "_babel_helper_get_function_arity___helper_get_function_arity_7.10.1.tgz";
102 path = fetchurl {
103 name = "_babel_helper_get_function_arity___helper_get_function_arity_7.10.1.tgz";
104 url = "https://registry.yarnpkg.com/@babel/helper-get-function-arity/-/helper-get-function-arity-7.10.1.tgz";
105 sha1 = "7303390a81ba7cb59613895a192b93850e373f7d";
106 };
107 }
108 {
109 name = "_babel_helper_hoist_variables___helper_hoist_variables_7.10.1.tgz";
110 path = fetchurl {
111 name = "_babel_helper_hoist_variables___helper_hoist_variables_7.10.1.tgz";
112 url = "https://registry.yarnpkg.com/@babel/helper-hoist-variables/-/helper-hoist-variables-7.10.1.tgz";
113 sha1 = "7e77c82e5dcae1ebf123174c385aaadbf787d077";
114 };
115 }
116 {
117 name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.10.1.tgz";
118 path = fetchurl {
119 name = "_babel_helper_member_expression_to_functions___helper_member_expression_to_functions_7.10.1.tgz";
120 url = "https://registry.yarnpkg.com/@babel/helper-member-expression-to-functions/-/helper-member-expression-to-functions-7.10.1.tgz";
121 sha1 = "432967fd7e12a4afef66c4687d4ca22bc0456f15";
122 };
123 }
124 {
125 name = "_babel_helper_module_imports___helper_module_imports_7.10.1.tgz";
126 path = fetchurl {
127 name = "_babel_helper_module_imports___helper_module_imports_7.10.1.tgz";
128 url = "https://registry.yarnpkg.com/@babel/helper-module-imports/-/helper-module-imports-7.10.1.tgz";
129 sha1 = "dd331bd45bccc566ce77004e9d05fe17add13876";
130 };
131 }
132 {
133 name = "_babel_helper_module_transforms___helper_module_transforms_7.10.1.tgz";
134 path = fetchurl {
135 name = "_babel_helper_module_transforms___helper_module_transforms_7.10.1.tgz";
136 url = "https://registry.yarnpkg.com/@babel/helper-module-transforms/-/helper-module-transforms-7.10.1.tgz";
137 sha1 = "24e2f08ee6832c60b157bb0936c86bef7210c622";
138 };
139 }
140 {
141 name = "_babel_helper_optimise_call_expression___helper_optimise_call_expression_7.10.1.tgz";
142 path = fetchurl {
143 name = "_babel_helper_optimise_call_expression___helper_optimise_call_expression_7.10.1.tgz";
144 url = "https://registry.yarnpkg.com/@babel/helper-optimise-call-expression/-/helper-optimise-call-expression-7.10.1.tgz";
145 sha1 = "b4a1f2561870ce1247ceddb02a3860fa96d72543";
146 };
147 }
148 {
149 name = "_babel_helper_plugin_utils___helper_plugin_utils_7.10.1.tgz";
150 path = fetchurl {
151 name = "_babel_helper_plugin_utils___helper_plugin_utils_7.10.1.tgz";
152 url = "https://registry.yarnpkg.com/@babel/helper-plugin-utils/-/helper-plugin-utils-7.10.1.tgz";
153 sha1 = "ec5a5cf0eec925b66c60580328b122c01230a127";
154 };
155 }
156 {
157 name = "_babel_helper_regex___helper_regex_7.10.1.tgz";
158 path = fetchurl {
159 name = "_babel_helper_regex___helper_regex_7.10.1.tgz";
160 url = "https://registry.yarnpkg.com/@babel/helper-regex/-/helper-regex-7.10.1.tgz";
161 sha1 = "021cf1a7ba99822f993222a001cc3fec83255b96";
162 };
163 }
164 {
165 name = "_babel_helper_remap_async_to_generator___helper_remap_async_to_generator_7.10.1.tgz";
166 path = fetchurl {
167 name = "_babel_helper_remap_async_to_generator___helper_remap_async_to_generator_7.10.1.tgz";
168 url = "https://registry.yarnpkg.com/@babel/helper-remap-async-to-generator/-/helper-remap-async-to-generator-7.10.1.tgz";
169 sha1 = "bad6aaa4ff39ce8d4b82ccaae0bfe0f7dbb5f432";
170 };
171 }
172 {
173 name = "_babel_helper_replace_supers___helper_replace_supers_7.10.1.tgz";
174 path = fetchurl {
175 name = "_babel_helper_replace_supers___helper_replace_supers_7.10.1.tgz";
176 url = "https://registry.yarnpkg.com/@babel/helper-replace-supers/-/helper-replace-supers-7.10.1.tgz";
177 sha1 = "ec6859d20c5d8087f6a2dc4e014db7228975f13d";
178 };
179 }
180 {
181 name = "_babel_helper_simple_access___helper_simple_access_7.10.1.tgz";
182 path = fetchurl {
183 name = "_babel_helper_simple_access___helper_simple_access_7.10.1.tgz";
184 url = "https://registry.yarnpkg.com/@babel/helper-simple-access/-/helper-simple-access-7.10.1.tgz";
185 sha1 = "08fb7e22ace9eb8326f7e3920a1c2052f13d851e";
186 };
187 }
188 {
189 name = "_babel_helper_split_export_declaration___helper_split_export_declaration_7.10.1.tgz";
190 path = fetchurl {
191 name = "_babel_helper_split_export_declaration___helper_split_export_declaration_7.10.1.tgz";
192 url = "https://registry.yarnpkg.com/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.10.1.tgz";
193 sha1 = "c6f4be1cbc15e3a868e4c64a17d5d31d754da35f";
194 };
195 }
196 {
197 name = "_babel_helper_validator_identifier___helper_validator_identifier_7.10.1.tgz";
198 path = fetchurl {
199 name = "_babel_helper_validator_identifier___helper_validator_identifier_7.10.1.tgz";
200 url = "https://registry.yarnpkg.com/@babel/helper-validator-identifier/-/helper-validator-identifier-7.10.1.tgz";
201 sha1 = "5770b0c1a826c4f53f5ede5e153163e0318e94b5";
202 };
203 }
204 {
205 name = "_babel_helper_wrap_function___helper_wrap_function_7.10.1.tgz";
206 path = fetchurl {
207 name = "_babel_helper_wrap_function___helper_wrap_function_7.10.1.tgz";
208 url = "https://registry.yarnpkg.com/@babel/helper-wrap-function/-/helper-wrap-function-7.10.1.tgz";
209 sha1 = "956d1310d6696257a7afd47e4c42dfda5dfcedc9";
210 };
211 }
212 {
213 name = "_babel_helpers___helpers_7.10.1.tgz";
214 path = fetchurl {
215 name = "_babel_helpers___helpers_7.10.1.tgz";
216 url = "https://registry.yarnpkg.com/@babel/helpers/-/helpers-7.10.1.tgz";
217 sha1 = "a6827b7cb975c9d9cef5fd61d919f60d8844a973";
218 };
219 }
220 {
221 name = "_babel_highlight___highlight_7.10.1.tgz";
222 path = fetchurl {
223 name = "_babel_highlight___highlight_7.10.1.tgz";
224 url = "https://registry.yarnpkg.com/@babel/highlight/-/highlight-7.10.1.tgz";
225 sha1 = "841d098ba613ba1a427a2b383d79e35552c38ae0";
226 };
227 }
228 {
229 name = "_babel_parser___parser_7.10.2.tgz";
230 path = fetchurl {
231 name = "_babel_parser___parser_7.10.2.tgz";
232 url = "https://registry.yarnpkg.com/@babel/parser/-/parser-7.10.2.tgz";
233 sha1 = "871807f10442b92ff97e4783b9b54f6a0ca812d0";
234 };
235 }
236 {
237 name = "_babel_plugin_proposal_async_generator_functions___plugin_proposal_async_generator_functions_7.10.1.tgz";
238 path = fetchurl {
239 name = "_babel_plugin_proposal_async_generator_functions___plugin_proposal_async_generator_functions_7.10.1.tgz";
240 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-async-generator-functions/-/plugin-proposal-async-generator-functions-7.10.1.tgz";
241 sha1 = "6911af5ba2e615c4ff3c497fe2f47b35bf6d7e55";
242 };
243 }
244 {
245 name = "_babel_plugin_proposal_class_properties___plugin_proposal_class_properties_7.10.1.tgz";
246 path = fetchurl {
247 name = "_babel_plugin_proposal_class_properties___plugin_proposal_class_properties_7.10.1.tgz";
248 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-class-properties/-/plugin-proposal-class-properties-7.10.1.tgz";
249 sha1 = "046bc7f6550bb08d9bd1d4f060f5f5a4f1087e01";
250 };
251 }
252 {
253 name = "_babel_plugin_proposal_decorators___plugin_proposal_decorators_7.10.1.tgz";
254 path = fetchurl {
255 name = "_babel_plugin_proposal_decorators___plugin_proposal_decorators_7.10.1.tgz";
256 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-decorators/-/plugin-proposal-decorators-7.10.1.tgz";
257 sha1 = "9373c2d8db45345c6e30452ad77b469758e5c8f7";
258 };
259 }
260 {
261 name = "_babel_plugin_proposal_dynamic_import___plugin_proposal_dynamic_import_7.10.1.tgz";
262 path = fetchurl {
263 name = "_babel_plugin_proposal_dynamic_import___plugin_proposal_dynamic_import_7.10.1.tgz";
264 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-dynamic-import/-/plugin-proposal-dynamic-import-7.10.1.tgz";
265 sha1 = "e36979dc1dc3b73f6d6816fc4951da2363488ef0";
266 };
267 }
268 {
269 name = "_babel_plugin_proposal_json_strings___plugin_proposal_json_strings_7.10.1.tgz";
270 path = fetchurl {
271 name = "_babel_plugin_proposal_json_strings___plugin_proposal_json_strings_7.10.1.tgz";
272 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-json-strings/-/plugin-proposal-json-strings-7.10.1.tgz";
273 sha1 = "b1e691ee24c651b5a5e32213222b2379734aff09";
274 };
275 }
276 {
277 name = "_babel_plugin_proposal_nullish_coalescing_operator___plugin_proposal_nullish_coalescing_operator_7.10.1.tgz";
278 path = fetchurl {
279 name = "_babel_plugin_proposal_nullish_coalescing_operator___plugin_proposal_nullish_coalescing_operator_7.10.1.tgz";
280 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-nullish-coalescing-operator/-/plugin-proposal-nullish-coalescing-operator-7.10.1.tgz";
281 sha1 = "02dca21673842ff2fe763ac253777f235e9bbf78";
282 };
283 }
284 {
285 name = "_babel_plugin_proposal_numeric_separator___plugin_proposal_numeric_separator_7.10.1.tgz";
286 path = fetchurl {
287 name = "_babel_plugin_proposal_numeric_separator___plugin_proposal_numeric_separator_7.10.1.tgz";
288 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-numeric-separator/-/plugin-proposal-numeric-separator-7.10.1.tgz";
289 sha1 = "a9a38bc34f78bdfd981e791c27c6fdcec478c123";
290 };
291 }
292 {
293 name = "_babel_plugin_proposal_object_rest_spread___plugin_proposal_object_rest_spread_7.10.1.tgz";
294 path = fetchurl {
295 name = "_babel_plugin_proposal_object_rest_spread___plugin_proposal_object_rest_spread_7.10.1.tgz";
296 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-object-rest-spread/-/plugin-proposal-object-rest-spread-7.10.1.tgz";
297 sha1 = "cba44908ac9f142650b4a65b8aa06bf3478d5fb6";
298 };
299 }
300 {
301 name = "_babel_plugin_proposal_optional_catch_binding___plugin_proposal_optional_catch_binding_7.10.1.tgz";
302 path = fetchurl {
303 name = "_babel_plugin_proposal_optional_catch_binding___plugin_proposal_optional_catch_binding_7.10.1.tgz";
304 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-catch-binding/-/plugin-proposal-optional-catch-binding-7.10.1.tgz";
305 sha1 = "c9f86d99305f9fa531b568ff5ab8c964b8b223d2";
306 };
307 }
308 {
309 name = "_babel_plugin_proposal_optional_chaining___plugin_proposal_optional_chaining_7.10.1.tgz";
310 path = fetchurl {
311 name = "_babel_plugin_proposal_optional_chaining___plugin_proposal_optional_chaining_7.10.1.tgz";
312 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-optional-chaining/-/plugin-proposal-optional-chaining-7.10.1.tgz";
313 sha1 = "15f5d6d22708629451a91be28f8facc55b0e818c";
314 };
315 }
316 {
317 name = "_babel_plugin_proposal_private_methods___plugin_proposal_private_methods_7.10.1.tgz";
318 path = fetchurl {
319 name = "_babel_plugin_proposal_private_methods___plugin_proposal_private_methods_7.10.1.tgz";
320 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-private-methods/-/plugin-proposal-private-methods-7.10.1.tgz";
321 sha1 = "ed85e8058ab0fe309c3f448e5e1b73ca89cdb598";
322 };
323 }
324 {
325 name = "_babel_plugin_proposal_unicode_property_regex___plugin_proposal_unicode_property_regex_7.10.1.tgz";
326 path = fetchurl {
327 name = "_babel_plugin_proposal_unicode_property_regex___plugin_proposal_unicode_property_regex_7.10.1.tgz";
328 url = "https://registry.yarnpkg.com/@babel/plugin-proposal-unicode-property-regex/-/plugin-proposal-unicode-property-regex-7.10.1.tgz";
329 sha1 = "dc04feb25e2dd70c12b05d680190e138fa2c0c6f";
330 };
331 }
332 {
333 name = "_babel_plugin_syntax_async_generators___plugin_syntax_async_generators_7.8.4.tgz";
334 path = fetchurl {
335 name = "_babel_plugin_syntax_async_generators___plugin_syntax_async_generators_7.8.4.tgz";
336 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz";
337 sha1 = "a983fb1aeb2ec3f6ed042a210f640e90e786fe0d";
338 };
339 }
340 {
341 name = "_babel_plugin_syntax_class_properties___plugin_syntax_class_properties_7.10.1.tgz";
342 path = fetchurl {
343 name = "_babel_plugin_syntax_class_properties___plugin_syntax_class_properties_7.10.1.tgz";
344 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.10.1.tgz";
345 sha1 = "d5bc0645913df5b17ad7eda0fa2308330bde34c5";
346 };
347 }
348 {
349 name = "_babel_plugin_syntax_decorators___plugin_syntax_decorators_7.10.1.tgz";
350 path = fetchurl {
351 name = "_babel_plugin_syntax_decorators___plugin_syntax_decorators_7.10.1.tgz";
352 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-decorators/-/plugin-syntax-decorators-7.10.1.tgz";
353 sha1 = "16b869c4beafc9a442565147bda7ce0967bd4f13";
354 };
355 }
356 {
357 name = "_babel_plugin_syntax_dynamic_import___plugin_syntax_dynamic_import_7.8.3.tgz";
358 path = fetchurl {
359 name = "_babel_plugin_syntax_dynamic_import___plugin_syntax_dynamic_import_7.8.3.tgz";
360 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-dynamic-import/-/plugin-syntax-dynamic-import-7.8.3.tgz";
361 sha1 = "62bf98b2da3cd21d626154fc96ee5b3cb68eacb3";
362 };
363 }
364 {
365 name = "_babel_plugin_syntax_json_strings___plugin_syntax_json_strings_7.8.3.tgz";
366 path = fetchurl {
367 name = "_babel_plugin_syntax_json_strings___plugin_syntax_json_strings_7.8.3.tgz";
368 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz";
369 sha1 = "01ca21b668cd8218c9e640cb6dd88c5412b2c96a";
370 };
371 }
372 {
373 name = "_babel_plugin_syntax_jsx___plugin_syntax_jsx_7.10.1.tgz";
374 path = fetchurl {
375 name = "_babel_plugin_syntax_jsx___plugin_syntax_jsx_7.10.1.tgz";
376 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.10.1.tgz";
377 sha1 = "0ae371134a42b91d5418feb3c8c8d43e1565d2da";
378 };
379 }
380 {
381 name = "_babel_plugin_syntax_nullish_coalescing_operator___plugin_syntax_nullish_coalescing_operator_7.8.3.tgz";
382 path = fetchurl {
383 name = "_babel_plugin_syntax_nullish_coalescing_operator___plugin_syntax_nullish_coalescing_operator_7.8.3.tgz";
384 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz";
385 sha1 = "167ed70368886081f74b5c36c65a88c03b66d1a9";
386 };
387 }
388 {
389 name = "_babel_plugin_syntax_numeric_separator___plugin_syntax_numeric_separator_7.10.1.tgz";
390 path = fetchurl {
391 name = "_babel_plugin_syntax_numeric_separator___plugin_syntax_numeric_separator_7.10.1.tgz";
392 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.1.tgz";
393 sha1 = "25761ee7410bc8cf97327ba741ee94e4a61b7d99";
394 };
395 }
396 {
397 name = "_babel_plugin_syntax_object_rest_spread___plugin_syntax_object_rest_spread_7.8.3.tgz";
398 path = fetchurl {
399 name = "_babel_plugin_syntax_object_rest_spread___plugin_syntax_object_rest_spread_7.8.3.tgz";
400 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz";
401 sha1 = "60e225edcbd98a640332a2e72dd3e66f1af55871";
402 };
403 }
404 {
405 name = "_babel_plugin_syntax_optional_catch_binding___plugin_syntax_optional_catch_binding_7.8.3.tgz";
406 path = fetchurl {
407 name = "_babel_plugin_syntax_optional_catch_binding___plugin_syntax_optional_catch_binding_7.8.3.tgz";
408 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz";
409 sha1 = "6111a265bcfb020eb9efd0fdfd7d26402b9ed6c1";
410 };
411 }
412 {
413 name = "_babel_plugin_syntax_optional_chaining___plugin_syntax_optional_chaining_7.8.3.tgz";
414 path = fetchurl {
415 name = "_babel_plugin_syntax_optional_chaining___plugin_syntax_optional_chaining_7.8.3.tgz";
416 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz";
417 sha1 = "4f69c2ab95167e0180cd5336613f8c5788f7d48a";
418 };
419 }
420 {
421 name = "_babel_plugin_syntax_top_level_await___plugin_syntax_top_level_await_7.10.1.tgz";
422 path = fetchurl {
423 name = "_babel_plugin_syntax_top_level_await___plugin_syntax_top_level_await_7.10.1.tgz";
424 url = "https://registry.yarnpkg.com/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.10.1.tgz";
425 sha1 = "8b8733f8c57397b3eaa47ddba8841586dcaef362";
426 };
427 }
428 {
429 name = "_babel_plugin_transform_arrow_functions___plugin_transform_arrow_functions_7.10.1.tgz";
430 path = fetchurl {
431 name = "_babel_plugin_transform_arrow_functions___plugin_transform_arrow_functions_7.10.1.tgz";
432 url = "https://registry.yarnpkg.com/@babel/plugin-transform-arrow-functions/-/plugin-transform-arrow-functions-7.10.1.tgz";
433 sha1 = "cb5ee3a36f0863c06ead0b409b4cc43a889b295b";
434 };
435 }
436 {
437 name = "_babel_plugin_transform_async_to_generator___plugin_transform_async_to_generator_7.10.1.tgz";
438 path = fetchurl {
439 name = "_babel_plugin_transform_async_to_generator___plugin_transform_async_to_generator_7.10.1.tgz";
440 url = "https://registry.yarnpkg.com/@babel/plugin-transform-async-to-generator/-/plugin-transform-async-to-generator-7.10.1.tgz";
441 sha1 = "e5153eb1a3e028f79194ed8a7a4bf55f862b2062";
442 };
443 }
444 {
445 name = "_babel_plugin_transform_block_scoped_functions___plugin_transform_block_scoped_functions_7.10.1.tgz";
446 path = fetchurl {
447 name = "_babel_plugin_transform_block_scoped_functions___plugin_transform_block_scoped_functions_7.10.1.tgz";
448 url = "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoped-functions/-/plugin-transform-block-scoped-functions-7.10.1.tgz";
449 sha1 = "146856e756d54b20fff14b819456b3e01820b85d";
450 };
451 }
452 {
453 name = "_babel_plugin_transform_block_scoping___plugin_transform_block_scoping_7.10.1.tgz";
454 path = fetchurl {
455 name = "_babel_plugin_transform_block_scoping___plugin_transform_block_scoping_7.10.1.tgz";
456 url = "https://registry.yarnpkg.com/@babel/plugin-transform-block-scoping/-/plugin-transform-block-scoping-7.10.1.tgz";
457 sha1 = "47092d89ca345811451cd0dc5d91605982705d5e";
458 };
459 }
460 {
461 name = "_babel_plugin_transform_classes___plugin_transform_classes_7.10.1.tgz";
462 path = fetchurl {
463 name = "_babel_plugin_transform_classes___plugin_transform_classes_7.10.1.tgz";
464 url = "https://registry.yarnpkg.com/@babel/plugin-transform-classes/-/plugin-transform-classes-7.10.1.tgz";
465 sha1 = "6e11dd6c4dfae70f540480a4702477ed766d733f";
466 };
467 }
468 {
469 name = "_babel_plugin_transform_computed_properties___plugin_transform_computed_properties_7.10.1.tgz";
470 path = fetchurl {
471 name = "_babel_plugin_transform_computed_properties___plugin_transform_computed_properties_7.10.1.tgz";
472 url = "https://registry.yarnpkg.com/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.10.1.tgz";
473 sha1 = "59aa399064429d64dce5cf76ef9b90b7245ebd07";
474 };
475 }
476 {
477 name = "_babel_plugin_transform_destructuring___plugin_transform_destructuring_7.10.1.tgz";
478 path = fetchurl {
479 name = "_babel_plugin_transform_destructuring___plugin_transform_destructuring_7.10.1.tgz";
480 url = "https://registry.yarnpkg.com/@babel/plugin-transform-destructuring/-/plugin-transform-destructuring-7.10.1.tgz";
481 sha1 = "abd58e51337815ca3a22a336b85f62b998e71907";
482 };
483 }
484 {
485 name = "_babel_plugin_transform_dotall_regex___plugin_transform_dotall_regex_7.10.1.tgz";
486 path = fetchurl {
487 name = "_babel_plugin_transform_dotall_regex___plugin_transform_dotall_regex_7.10.1.tgz";
488 url = "https://registry.yarnpkg.com/@babel/plugin-transform-dotall-regex/-/plugin-transform-dotall-regex-7.10.1.tgz";
489 sha1 = "920b9fec2d78bb57ebb64a644d5c2ba67cc104ee";
490 };
491 }
492 {
493 name = "_babel_plugin_transform_duplicate_keys___plugin_transform_duplicate_keys_7.10.1.tgz";
494 path = fetchurl {
495 name = "_babel_plugin_transform_duplicate_keys___plugin_transform_duplicate_keys_7.10.1.tgz";
496 url = "https://registry.yarnpkg.com/@babel/plugin-transform-duplicate-keys/-/plugin-transform-duplicate-keys-7.10.1.tgz";
497 sha1 = "c900a793beb096bc9d4d0a9d0cde19518ffc83b9";
498 };
499 }
500 {
501 name = "_babel_plugin_transform_exponentiation_operator___plugin_transform_exponentiation_operator_7.10.1.tgz";
502 path = fetchurl {
503 name = "_babel_plugin_transform_exponentiation_operator___plugin_transform_exponentiation_operator_7.10.1.tgz";
504 url = "https://registry.yarnpkg.com/@babel/plugin-transform-exponentiation-operator/-/plugin-transform-exponentiation-operator-7.10.1.tgz";
505 sha1 = "279c3116756a60dd6e6f5e488ba7957db9c59eb3";
506 };
507 }
508 {
509 name = "_babel_plugin_transform_for_of___plugin_transform_for_of_7.10.1.tgz";
510 path = fetchurl {
511 name = "_babel_plugin_transform_for_of___plugin_transform_for_of_7.10.1.tgz";
512 url = "https://registry.yarnpkg.com/@babel/plugin-transform-for-of/-/plugin-transform-for-of-7.10.1.tgz";
513 sha1 = "ff01119784eb0ee32258e8646157ba2501fcfda5";
514 };
515 }
516 {
517 name = "_babel_plugin_transform_function_name___plugin_transform_function_name_7.10.1.tgz";
518 path = fetchurl {
519 name = "_babel_plugin_transform_function_name___plugin_transform_function_name_7.10.1.tgz";
520 url = "https://registry.yarnpkg.com/@babel/plugin-transform-function-name/-/plugin-transform-function-name-7.10.1.tgz";
521 sha1 = "4ed46fd6e1d8fde2a2ec7b03c66d853d2c92427d";
522 };
523 }
524 {
525 name = "_babel_plugin_transform_literals___plugin_transform_literals_7.10.1.tgz";
526 path = fetchurl {
527 name = "_babel_plugin_transform_literals___plugin_transform_literals_7.10.1.tgz";
528 url = "https://registry.yarnpkg.com/@babel/plugin-transform-literals/-/plugin-transform-literals-7.10.1.tgz";
529 sha1 = "5794f8da82846b22e4e6631ea1658bce708eb46a";
530 };
531 }
532 {
533 name = "_babel_plugin_transform_member_expression_literals___plugin_transform_member_expression_literals_7.10.1.tgz";
534 path = fetchurl {
535 name = "_babel_plugin_transform_member_expression_literals___plugin_transform_member_expression_literals_7.10.1.tgz";
536 url = "https://registry.yarnpkg.com/@babel/plugin-transform-member-expression-literals/-/plugin-transform-member-expression-literals-7.10.1.tgz";
537 sha1 = "90347cba31bca6f394b3f7bd95d2bbfd9fce2f39";
538 };
539 }
540 {
541 name = "_babel_plugin_transform_modules_amd___plugin_transform_modules_amd_7.10.1.tgz";
542 path = fetchurl {
543 name = "_babel_plugin_transform_modules_amd___plugin_transform_modules_amd_7.10.1.tgz";
544 url = "https://registry.yarnpkg.com/@babel/plugin-transform-modules-amd/-/plugin-transform-modules-amd-7.10.1.tgz";
545 sha1 = "65950e8e05797ebd2fe532b96e19fc5482a1d52a";
546 };
547 }
548 {
549 name = "_babel_plugin_transform_modules_commonjs___plugin_transform_modules_commonjs_7.10.1.tgz";
550 path = fetchurl {
551 name = "_babel_plugin_transform_modules_commonjs___plugin_transform_modules_commonjs_7.10.1.tgz";
552 url = "https://registry.yarnpkg.com/@babel/plugin-transform-modules-commonjs/-/plugin-transform-modules-commonjs-7.10.1.tgz";
553 sha1 = "d5ff4b4413ed97ffded99961056e1fb980fb9301";
554 };
555 }
556 {
557 name = "_babel_plugin_transform_modules_systemjs___plugin_transform_modules_systemjs_7.10.1.tgz";
558 path = fetchurl {
559 name = "_babel_plugin_transform_modules_systemjs___plugin_transform_modules_systemjs_7.10.1.tgz";
560 url = "https://registry.yarnpkg.com/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.10.1.tgz";
561 sha1 = "9962e4b0ac6aaf2e20431ada3d8ec72082cbffb6";
562 };
563 }
564 {
565 name = "_babel_plugin_transform_modules_umd___plugin_transform_modules_umd_7.10.1.tgz";
566 path = fetchurl {
567 name = "_babel_plugin_transform_modules_umd___plugin_transform_modules_umd_7.10.1.tgz";
568 url = "https://registry.yarnpkg.com/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.10.1.tgz";
569 sha1 = "ea080911ffc6eb21840a5197a39ede4ee67b1595";
570 };
571 }
572 {
573 name = "_babel_plugin_transform_named_capturing_groups_regex___plugin_transform_named_capturing_groups_regex_7.8.3.tgz";
574 path = fetchurl {
575 name = "_babel_plugin_transform_named_capturing_groups_regex___plugin_transform_named_capturing_groups_regex_7.8.3.tgz";
576 url = "https://registry.yarnpkg.com/@babel/plugin-transform-named-capturing-groups-regex/-/plugin-transform-named-capturing-groups-regex-7.8.3.tgz";
577 sha1 = "a2a72bffa202ac0e2d0506afd0939c5ecbc48c6c";
578 };
579 }
580 {
581 name = "_babel_plugin_transform_new_target___plugin_transform_new_target_7.10.1.tgz";
582 path = fetchurl {
583 name = "_babel_plugin_transform_new_target___plugin_transform_new_target_7.10.1.tgz";
584 url = "https://registry.yarnpkg.com/@babel/plugin-transform-new-target/-/plugin-transform-new-target-7.10.1.tgz";
585 sha1 = "6ee41a5e648da7632e22b6fb54012e87f612f324";
586 };
587 }
588 {
589 name = "_babel_plugin_transform_object_super___plugin_transform_object_super_7.10.1.tgz";
590 path = fetchurl {
591 name = "_babel_plugin_transform_object_super___plugin_transform_object_super_7.10.1.tgz";
592 url = "https://registry.yarnpkg.com/@babel/plugin-transform-object-super/-/plugin-transform-object-super-7.10.1.tgz";
593 sha1 = "2e3016b0adbf262983bf0d5121d676a5ed9c4fde";
594 };
595 }
596 {
597 name = "_babel_plugin_transform_parameters___plugin_transform_parameters_7.10.1.tgz";
598 path = fetchurl {
599 name = "_babel_plugin_transform_parameters___plugin_transform_parameters_7.10.1.tgz";
600 url = "https://registry.yarnpkg.com/@babel/plugin-transform-parameters/-/plugin-transform-parameters-7.10.1.tgz";
601 sha1 = "b25938a3c5fae0354144a720b07b32766f683ddd";
602 };
603 }
604 {
605 name = "_babel_plugin_transform_property_literals___plugin_transform_property_literals_7.10.1.tgz";
606 path = fetchurl {
607 name = "_babel_plugin_transform_property_literals___plugin_transform_property_literals_7.10.1.tgz";
608 url = "https://registry.yarnpkg.com/@babel/plugin-transform-property-literals/-/plugin-transform-property-literals-7.10.1.tgz";
609 sha1 = "cffc7315219230ed81dc53e4625bf86815b6050d";
610 };
611 }
612 {
613 name = "_babel_plugin_transform_regenerator___plugin_transform_regenerator_7.10.1.tgz";
614 path = fetchurl {
615 name = "_babel_plugin_transform_regenerator___plugin_transform_regenerator_7.10.1.tgz";
616 url = "https://registry.yarnpkg.com/@babel/plugin-transform-regenerator/-/plugin-transform-regenerator-7.10.1.tgz";
617 sha1 = "10e175cbe7bdb63cc9b39f9b3f823c5c7c5c5490";
618 };
619 }
620 {
621 name = "_babel_plugin_transform_reserved_words___plugin_transform_reserved_words_7.10.1.tgz";
622 path = fetchurl {
623 name = "_babel_plugin_transform_reserved_words___plugin_transform_reserved_words_7.10.1.tgz";
624 url = "https://registry.yarnpkg.com/@babel/plugin-transform-reserved-words/-/plugin-transform-reserved-words-7.10.1.tgz";
625 sha1 = "0fc1027312b4d1c3276a57890c8ae3bcc0b64a86";
626 };
627 }
628 {
629 name = "_babel_plugin_transform_runtime___plugin_transform_runtime_7.10.1.tgz";
630 path = fetchurl {
631 name = "_babel_plugin_transform_runtime___plugin_transform_runtime_7.10.1.tgz";
632 url = "https://registry.yarnpkg.com/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.10.1.tgz";
633 sha1 = "fd1887f749637fb2ed86dc278e79eb41df37f4b1";
634 };
635 }
636 {
637 name = "_babel_plugin_transform_shorthand_properties___plugin_transform_shorthand_properties_7.10.1.tgz";
638 path = fetchurl {
639 name = "_babel_plugin_transform_shorthand_properties___plugin_transform_shorthand_properties_7.10.1.tgz";
640 url = "https://registry.yarnpkg.com/@babel/plugin-transform-shorthand-properties/-/plugin-transform-shorthand-properties-7.10.1.tgz";
641 sha1 = "e8b54f238a1ccbae482c4dce946180ae7b3143f3";
642 };
643 }
644 {
645 name = "_babel_plugin_transform_spread___plugin_transform_spread_7.10.1.tgz";
646 path = fetchurl {
647 name = "_babel_plugin_transform_spread___plugin_transform_spread_7.10.1.tgz";
648 url = "https://registry.yarnpkg.com/@babel/plugin-transform-spread/-/plugin-transform-spread-7.10.1.tgz";
649 sha1 = "0c6d618a0c4461a274418460a28c9ccf5239a7c8";
650 };
651 }
652 {
653 name = "_babel_plugin_transform_sticky_regex___plugin_transform_sticky_regex_7.10.1.tgz";
654 path = fetchurl {
655 name = "_babel_plugin_transform_sticky_regex___plugin_transform_sticky_regex_7.10.1.tgz";
656 url = "https://registry.yarnpkg.com/@babel/plugin-transform-sticky-regex/-/plugin-transform-sticky-regex-7.10.1.tgz";
657 sha1 = "90fc89b7526228bed9842cff3588270a7a393b00";
658 };
659 }
660 {
661 name = "_babel_plugin_transform_template_literals___plugin_transform_template_literals_7.10.1.tgz";
662 path = fetchurl {
663 name = "_babel_plugin_transform_template_literals___plugin_transform_template_literals_7.10.1.tgz";
664 url = "https://registry.yarnpkg.com/@babel/plugin-transform-template-literals/-/plugin-transform-template-literals-7.10.1.tgz";
665 sha1 = "914c7b7f4752c570ea00553b4284dad8070e8628";
666 };
667 }
668 {
669 name = "_babel_plugin_transform_typeof_symbol___plugin_transform_typeof_symbol_7.10.1.tgz";
670 path = fetchurl {
671 name = "_babel_plugin_transform_typeof_symbol___plugin_transform_typeof_symbol_7.10.1.tgz";
672 url = "https://registry.yarnpkg.com/@babel/plugin-transform-typeof-symbol/-/plugin-transform-typeof-symbol-7.10.1.tgz";
673 sha1 = "60c0239b69965d166b80a84de7315c1bc7e0bb0e";
674 };
675 }
676 {
677 name = "_babel_plugin_transform_unicode_escapes___plugin_transform_unicode_escapes_7.10.1.tgz";
678 path = fetchurl {
679 name = "_babel_plugin_transform_unicode_escapes___plugin_transform_unicode_escapes_7.10.1.tgz";
680 url = "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-escapes/-/plugin-transform-unicode-escapes-7.10.1.tgz";
681 sha1 = "add0f8483dab60570d9e03cecef6c023aa8c9940";
682 };
683 }
684 {
685 name = "_babel_plugin_transform_unicode_regex___plugin_transform_unicode_regex_7.10.1.tgz";
686 path = fetchurl {
687 name = "_babel_plugin_transform_unicode_regex___plugin_transform_unicode_regex_7.10.1.tgz";
688 url = "https://registry.yarnpkg.com/@babel/plugin-transform-unicode-regex/-/plugin-transform-unicode-regex-7.10.1.tgz";
689 sha1 = "6b58f2aea7b68df37ac5025d9c88752443a6b43f";
690 };
691 }
692 {
693 name = "_babel_preset_env___preset_env_7.10.2.tgz";
694 path = fetchurl {
695 name = "_babel_preset_env___preset_env_7.10.2.tgz";
696 url = "https://registry.yarnpkg.com/@babel/preset-env/-/preset-env-7.10.2.tgz";
697 sha1 = "715930f2cf8573b0928005ee562bed52fb65fdfb";
698 };
699 }
700 {
701 name = "_babel_preset_modules___preset_modules_0.1.3.tgz";
702 path = fetchurl {
703 name = "_babel_preset_modules___preset_modules_0.1.3.tgz";
704 url = "https://registry.yarnpkg.com/@babel/preset-modules/-/preset-modules-0.1.3.tgz";
705 sha1 = "13242b53b5ef8c883c3cf7dddd55b36ce80fbc72";
706 };
707 }
708 {
709 name = "_babel_runtime___runtime_7.10.2.tgz";
710 path = fetchurl {
711 name = "_babel_runtime___runtime_7.10.2.tgz";
712 url = "https://registry.yarnpkg.com/@babel/runtime/-/runtime-7.10.2.tgz";
713 sha1 = "d103f21f2602497d38348a32e008637d506db839";
714 };
715 }
716 {
717 name = "_babel_template___template_7.10.1.tgz";
718 path = fetchurl {
719 name = "_babel_template___template_7.10.1.tgz";
720 url = "https://registry.yarnpkg.com/@babel/template/-/template-7.10.1.tgz";
721 sha1 = "e167154a94cb5f14b28dc58f5356d2162f539811";
722 };
723 }
724 {
725 name = "_babel_traverse___traverse_7.10.1.tgz";
726 path = fetchurl {
727 name = "_babel_traverse___traverse_7.10.1.tgz";
728 url = "https://registry.yarnpkg.com/@babel/traverse/-/traverse-7.10.1.tgz";
729 sha1 = "bbcef3031e4152a6c0b50147f4958df54ca0dd27";
730 };
731 }
732 {
733 name = "_babel_types___types_7.10.2.tgz";
734 path = fetchurl {
735 name = "_babel_types___types_7.10.2.tgz";
736 url = "https://registry.yarnpkg.com/@babel/types/-/types-7.10.2.tgz";
737 sha1 = "30283be31cad0dbf6fb00bd40641ca0ea675172d";
738 };
739 }
740 {
741 name = "_fortawesome_fontawesome_free___fontawesome_free_5.13.0.tgz";
742 path = fetchurl {
743 name = "_fortawesome_fontawesome_free___fontawesome_free_5.13.0.tgz";
744 url = "https://registry.yarnpkg.com/@fortawesome/fontawesome-free/-/fontawesome-free-5.13.0.tgz";
745 sha1 = "fcb113d1aca4b471b709e8c9c168674fbd6e06d9";
746 };
747 }
748 {
749 name = "_hapi_address___address_2.1.4.tgz";
750 path = fetchurl {
751 name = "_hapi_address___address_2.1.4.tgz";
752 url = "https://registry.yarnpkg.com/@hapi/address/-/address-2.1.4.tgz";
753 sha1 = "5d67ed43f3fd41a69d4b9ff7b56e7c0d1d0a81e5";
754 };
755 }
756 {
757 name = "_hapi_bourne___bourne_1.3.2.tgz";
758 path = fetchurl {
759 name = "_hapi_bourne___bourne_1.3.2.tgz";
760 url = "https://registry.yarnpkg.com/@hapi/bourne/-/bourne-1.3.2.tgz";
761 sha1 = "0a7095adea067243ce3283e1b56b8a8f453b242a";
762 };
763 }
764 {
765 name = "_hapi_hoek___hoek_8.5.1.tgz";
766 path = fetchurl {
767 name = "_hapi_hoek___hoek_8.5.1.tgz";
768 url = "https://registry.yarnpkg.com/@hapi/hoek/-/hoek-8.5.1.tgz";
769 sha1 = "fde96064ca446dec8c55a8c2f130957b070c6e06";
770 };
771 }
772 {
773 name = "_hapi_joi___joi_15.1.1.tgz";
774 path = fetchurl {
775 name = "_hapi_joi___joi_15.1.1.tgz";
776 url = "https://registry.yarnpkg.com/@hapi/joi/-/joi-15.1.1.tgz";
777 sha1 = "c675b8a71296f02833f8d6d243b34c57b8ce19d7";
778 };
779 }
780 {
781 name = "_hapi_topo___topo_3.1.6.tgz";
782 path = fetchurl {
783 name = "_hapi_topo___topo_3.1.6.tgz";
784 url = "https://registry.yarnpkg.com/@hapi/topo/-/topo-3.1.6.tgz";
785 sha1 = "68d935fa3eae7fdd5ab0d7f953f3205d8b2bfc29";
786 };
787 }
788 {
789 name = "_intervolga_optimize_cssnano_plugin___optimize_cssnano_plugin_1.0.6.tgz";
790 path = fetchurl {
791 name = "_intervolga_optimize_cssnano_plugin___optimize_cssnano_plugin_1.0.6.tgz";
792 url = "https://registry.yarnpkg.com/@intervolga/optimize-cssnano-plugin/-/optimize-cssnano-plugin-1.0.6.tgz";
793 sha1 = "be7c7846128b88f6a9b1d1261a0ad06eb5c0fdf8";
794 };
795 }
796 {
797 name = "_mrmlnc_readdir_enhanced___readdir_enhanced_2.2.1.tgz";
798 path = fetchurl {
799 name = "_mrmlnc_readdir_enhanced___readdir_enhanced_2.2.1.tgz";
800 url = "https://registry.yarnpkg.com/@mrmlnc/readdir-enhanced/-/readdir-enhanced-2.2.1.tgz";
801 sha1 = "524af240d1a360527b730475ecfa1344aa540dde";
802 };
803 }
804 {
805 name = "_nodelib_fs.stat___fs.stat_1.1.3.tgz";
806 path = fetchurl {
807 name = "_nodelib_fs.stat___fs.stat_1.1.3.tgz";
808 url = "https://registry.yarnpkg.com/@nodelib/fs.stat/-/fs.stat-1.1.3.tgz";
809 sha1 = "2b5a3ab3f918cca48a8c754c08168e3f03eba61b";
810 };
811 }
812 {
813 name = "_soda_friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.1.tgz";
814 path = fetchurl {
815 name = "_soda_friendly_errors_webpack_plugin___friendly_errors_webpack_plugin_1.7.1.tgz";
816 url = "https://registry.yarnpkg.com/@soda/friendly-errors-webpack-plugin/-/friendly-errors-webpack-plugin-1.7.1.tgz";
817 sha1 = "706f64bcb4a8b9642b48ae3ace444c70334d615d";
818 };
819 }
820 {
821 name = "_soda_get_current_script___get_current_script_1.0.1.tgz";
822 path = fetchurl {
823 name = "_soda_get_current_script___get_current_script_1.0.1.tgz";
824 url = "https://registry.yarnpkg.com/@soda/get-current-script/-/get-current-script-1.0.1.tgz";
825 sha1 = "f4afffcb36e069a801d5339c90499601c47a2516";
826 };
827 }
828 {
829 name = "_types_color_name___color_name_1.1.1.tgz";
830 path = fetchurl {
831 name = "_types_color_name___color_name_1.1.1.tgz";
832 url = "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz";
833 sha1 = "1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0";
834 };
835 }
836 {
837 name = "_types_glob___glob_7.1.2.tgz";
838 path = fetchurl {
839 name = "_types_glob___glob_7.1.2.tgz";
840 url = "https://registry.yarnpkg.com/@types/glob/-/glob-7.1.2.tgz";
841 sha1 = "06ca26521353a545d94a0adc74f38a59d232c987";
842 };
843 }
844 {
845 name = "_types_json_schema___json_schema_7.0.4.tgz";
846 path = fetchurl {
847 name = "_types_json_schema___json_schema_7.0.4.tgz";
848 url = "https://registry.yarnpkg.com/@types/json-schema/-/json-schema-7.0.4.tgz";
849 sha1 = "38fd73ddfd9b55abb1e1b2ed578cb55bd7b7d339";
850 };
851 }
852 {
853 name = "_types_minimatch___minimatch_3.0.3.tgz";
854 path = fetchurl {
855 name = "_types_minimatch___minimatch_3.0.3.tgz";
856 url = "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz";
857 sha1 = "3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d";
858 };
859 }
860 {
861 name = "_types_node___node_14.0.11.tgz";
862 path = fetchurl {
863 name = "_types_node___node_14.0.11.tgz";
864 url = "https://registry.yarnpkg.com/@types/node/-/node-14.0.11.tgz";
865 sha1 = "61d4886e2424da73b7b25547f59fdcb534c165a3";
866 };
867 }
868 {
869 name = "_types_normalize_package_data___normalize_package_data_2.4.0.tgz";
870 path = fetchurl {
871 name = "_types_normalize_package_data___normalize_package_data_2.4.0.tgz";
872 url = "https://registry.yarnpkg.com/@types/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
873 sha1 = "e486d0d97396d79beedd0a6e33f4534ff6b4973e";
874 };
875 }
876 {
877 name = "_types_q___q_1.5.4.tgz";
878 path = fetchurl {
879 name = "_types_q___q_1.5.4.tgz";
880 url = "https://registry.yarnpkg.com/@types/q/-/q-1.5.4.tgz";
881 sha1 = "15925414e0ad2cd765bfef58842f7e26a7accb24";
882 };
883 }
884 {
885 name = "_vue_babel_helper_vue_jsx_merge_props___babel_helper_vue_jsx_merge_props_1.0.0.tgz";
886 path = fetchurl {
887 name = "_vue_babel_helper_vue_jsx_merge_props___babel_helper_vue_jsx_merge_props_1.0.0.tgz";
888 url = "https://registry.yarnpkg.com/@vue/babel-helper-vue-jsx-merge-props/-/babel-helper-vue-jsx-merge-props-1.0.0.tgz";
889 sha1 = "048fe579958da408fb7a8b2a3ec050b50a661040";
890 };
891 }
892 {
893 name = "_vue_babel_plugin_transform_vue_jsx___babel_plugin_transform_vue_jsx_1.1.2.tgz";
894 path = fetchurl {
895 name = "_vue_babel_plugin_transform_vue_jsx___babel_plugin_transform_vue_jsx_1.1.2.tgz";
896 url = "https://registry.yarnpkg.com/@vue/babel-plugin-transform-vue-jsx/-/babel-plugin-transform-vue-jsx-1.1.2.tgz";
897 sha1 = "c0a3e6efc022e75e4247b448a8fc6b86f03e91c0";
898 };
899 }
900 {
901 name = "_vue_babel_preset_app___babel_preset_app_4.4.1.tgz";
902 path = fetchurl {
903 name = "_vue_babel_preset_app___babel_preset_app_4.4.1.tgz";
904 url = "https://registry.yarnpkg.com/@vue/babel-preset-app/-/babel-preset-app-4.4.1.tgz";
905 sha1 = "97c6796183cd0abf96a17297dc335c4c702fd8c4";
906 };
907 }
908 {
909 name = "_vue_babel_preset_jsx___babel_preset_jsx_1.1.2.tgz";
910 path = fetchurl {
911 name = "_vue_babel_preset_jsx___babel_preset_jsx_1.1.2.tgz";
912 url = "https://registry.yarnpkg.com/@vue/babel-preset-jsx/-/babel-preset-jsx-1.1.2.tgz";
913 sha1 = "2e169eb4c204ea37ca66c2ea85a880bfc99d4f20";
914 };
915 }
916 {
917 name = "_vue_babel_sugar_functional_vue___babel_sugar_functional_vue_1.1.2.tgz";
918 path = fetchurl {
919 name = "_vue_babel_sugar_functional_vue___babel_sugar_functional_vue_1.1.2.tgz";
920 url = "https://registry.yarnpkg.com/@vue/babel-sugar-functional-vue/-/babel-sugar-functional-vue-1.1.2.tgz";
921 sha1 = "f7e24fba09e6f1ee70104560a8808057555f1a9a";
922 };
923 }
924 {
925 name = "_vue_babel_sugar_inject_h___babel_sugar_inject_h_1.1.2.tgz";
926 path = fetchurl {
927 name = "_vue_babel_sugar_inject_h___babel_sugar_inject_h_1.1.2.tgz";
928 url = "https://registry.yarnpkg.com/@vue/babel-sugar-inject-h/-/babel-sugar-inject-h-1.1.2.tgz";
929 sha1 = "8a5276b6d8e2ed16ffc8078aad94236274e6edf0";
930 };
931 }
932 {
933 name = "_vue_babel_sugar_v_model___babel_sugar_v_model_1.1.2.tgz";
934 path = fetchurl {
935 name = "_vue_babel_sugar_v_model___babel_sugar_v_model_1.1.2.tgz";
936 url = "https://registry.yarnpkg.com/@vue/babel-sugar-v-model/-/babel-sugar-v-model-1.1.2.tgz";
937 sha1 = "1ff6fd1b800223fc9cb1e84dceb5e52d737a8192";
938 };
939 }
940 {
941 name = "_vue_babel_sugar_v_on___babel_sugar_v_on_1.1.2.tgz";
942 path = fetchurl {
943 name = "_vue_babel_sugar_v_on___babel_sugar_v_on_1.1.2.tgz";
944 url = "https://registry.yarnpkg.com/@vue/babel-sugar-v-on/-/babel-sugar-v-on-1.1.2.tgz";
945 sha1 = "b2ef99b8f2fab09fbead25aad70ef42e1cf5b13b";
946 };
947 }
948 {
949 name = "_vue_cli_overlay___cli_overlay_4.4.1.tgz";
950 path = fetchurl {
951 name = "_vue_cli_overlay___cli_overlay_4.4.1.tgz";
952 url = "https://registry.yarnpkg.com/@vue/cli-overlay/-/cli-overlay-4.4.1.tgz";
953 sha1 = "f1f51f31f7a00d371e9a5b5a941525184475bf8b";
954 };
955 }
956 {
957 name = "_vue_cli_plugin_babel___cli_plugin_babel_4.4.1.tgz";
958 path = fetchurl {
959 name = "_vue_cli_plugin_babel___cli_plugin_babel_4.4.1.tgz";
960 url = "https://registry.yarnpkg.com/@vue/cli-plugin-babel/-/cli-plugin-babel-4.4.1.tgz";
961 sha1 = "2c6e969fe51f1b4b211bea84afb7cad18240f70f";
962 };
963 }
964 {
965 name = "_vue_cli_plugin_eslint___cli_plugin_eslint_4.4.1.tgz";
966 path = fetchurl {
967 name = "_vue_cli_plugin_eslint___cli_plugin_eslint_4.4.1.tgz";
968 url = "https://registry.yarnpkg.com/@vue/cli-plugin-eslint/-/cli-plugin-eslint-4.4.1.tgz";
969 sha1 = "e39d6517da6de231195d227f995f495e2958a74a";
970 };
971 }
972 {
973 name = "_vue_cli_plugin_pwa___cli_plugin_pwa_4.4.1.tgz";
974 path = fetchurl {
975 name = "_vue_cli_plugin_pwa___cli_plugin_pwa_4.4.1.tgz";
976 url = "https://registry.yarnpkg.com/@vue/cli-plugin-pwa/-/cli-plugin-pwa-4.4.1.tgz";
977 sha1 = "e7bc010bc78cfaf74968c11fb332f3abc1ef298d";
978 };
979 }
980 {
981 name = "_vue_cli_plugin_router___cli_plugin_router_4.4.1.tgz";
982 path = fetchurl {
983 name = "_vue_cli_plugin_router___cli_plugin_router_4.4.1.tgz";
984 url = "https://registry.yarnpkg.com/@vue/cli-plugin-router/-/cli-plugin-router-4.4.1.tgz";
985 sha1 = "07d09df0f4bea816e637da814f578b808f1f93b2";
986 };
987 }
988 {
989 name = "_vue_cli_plugin_vuex___cli_plugin_vuex_4.4.1.tgz";
990 path = fetchurl {
991 name = "_vue_cli_plugin_vuex___cli_plugin_vuex_4.4.1.tgz";
992 url = "https://registry.yarnpkg.com/@vue/cli-plugin-vuex/-/cli-plugin-vuex-4.4.1.tgz";
993 sha1 = "98d18fc5d36fa6e0d1fc2ecaeea37aa965564f19";
994 };
995 }
996 {
997 name = "_vue_cli_service___cli_service_4.4.1.tgz";
998 path = fetchurl {
999 name = "_vue_cli_service___cli_service_4.4.1.tgz";
1000 url = "https://registry.yarnpkg.com/@vue/cli-service/-/cli-service-4.4.1.tgz";
1001 sha1 = "b26a435d8c953bc7efaf7b784c9835c1415bcf1c";
1002 };
1003 }
1004 {
1005 name = "_vue_cli_shared_utils___cli_shared_utils_4.4.1.tgz";
1006 path = fetchurl {
1007 name = "_vue_cli_shared_utils___cli_shared_utils_4.4.1.tgz";
1008 url = "https://registry.yarnpkg.com/@vue/cli-shared-utils/-/cli-shared-utils-4.4.1.tgz";
1009 sha1 = "930304ade5a9f9bf0d2fd67d9305cad83d04aae1";
1010 };
1011 }
1012 {
1013 name = "_vue_component_compiler_utils___component_compiler_utils_3.1.2.tgz";
1014 path = fetchurl {
1015 name = "_vue_component_compiler_utils___component_compiler_utils_3.1.2.tgz";
1016 url = "https://registry.yarnpkg.com/@vue/component-compiler-utils/-/component-compiler-utils-3.1.2.tgz";
1017 sha1 = "8213a5ff3202f9f2137fe55370f9e8b9656081c3";
1018 };
1019 }
1020 {
1021 name = "_vue_eslint_config_prettier___eslint_config_prettier_6.0.0.tgz";
1022 path = fetchurl {
1023 name = "_vue_eslint_config_prettier___eslint_config_prettier_6.0.0.tgz";
1024 url = "https://registry.yarnpkg.com/@vue/eslint-config-prettier/-/eslint-config-prettier-6.0.0.tgz";
1025 sha1 = "ad5912b308f4ae468458e02a2b05db0b9d246700";
1026 };
1027 }
1028 {
1029 name = "_vue_preload_webpack_plugin___preload_webpack_plugin_1.1.1.tgz";
1030 path = fetchurl {
1031 name = "_vue_preload_webpack_plugin___preload_webpack_plugin_1.1.1.tgz";
1032 url = "https://registry.yarnpkg.com/@vue/preload-webpack-plugin/-/preload-webpack-plugin-1.1.1.tgz";
1033 sha1 = "18723530d304f443021da2292d6ec9502826104a";
1034 };
1035 }
1036 {
1037 name = "_vue_web_component_wrapper___web_component_wrapper_1.2.0.tgz";
1038 path = fetchurl {
1039 name = "_vue_web_component_wrapper___web_component_wrapper_1.2.0.tgz";
1040 url = "https://registry.yarnpkg.com/@vue/web-component-wrapper/-/web-component-wrapper-1.2.0.tgz";
1041 sha1 = "bb0e46f1585a7e289b4ee6067dcc5a6ae62f1dd1";
1042 };
1043 }
1044 {
1045 name = "_webassemblyjs_ast___ast_1.9.0.tgz";
1046 path = fetchurl {
1047 name = "_webassemblyjs_ast___ast_1.9.0.tgz";
1048 url = "https://registry.yarnpkg.com/@webassemblyjs/ast/-/ast-1.9.0.tgz";
1049 sha1 = "bd850604b4042459a5a41cd7d338cbed695ed964";
1050 };
1051 }
1052 {
1053 name = "_webassemblyjs_floating_point_hex_parser___floating_point_hex_parser_1.9.0.tgz";
1054 path = fetchurl {
1055 name = "_webassemblyjs_floating_point_hex_parser___floating_point_hex_parser_1.9.0.tgz";
1056 url = "https://registry.yarnpkg.com/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.9.0.tgz";
1057 sha1 = "3c3d3b271bddfc84deb00f71344438311d52ffb4";
1058 };
1059 }
1060 {
1061 name = "_webassemblyjs_helper_api_error___helper_api_error_1.9.0.tgz";
1062 path = fetchurl {
1063 name = "_webassemblyjs_helper_api_error___helper_api_error_1.9.0.tgz";
1064 url = "https://registry.yarnpkg.com/@webassemblyjs/helper-api-error/-/helper-api-error-1.9.0.tgz";
1065 sha1 = "203f676e333b96c9da2eeab3ccef33c45928b6a2";
1066 };
1067 }
1068 {
1069 name = "_webassemblyjs_helper_buffer___helper_buffer_1.9.0.tgz";
1070 path = fetchurl {
1071 name = "_webassemblyjs_helper_buffer___helper_buffer_1.9.0.tgz";
1072 url = "https://registry.yarnpkg.com/@webassemblyjs/helper-buffer/-/helper-buffer-1.9.0.tgz";
1073 sha1 = "a1442d269c5feb23fcbc9ef759dac3547f29de00";
1074 };
1075 }
1076 {
1077 name = "_webassemblyjs_helper_code_frame___helper_code_frame_1.9.0.tgz";
1078 path = fetchurl {
1079 name = "_webassemblyjs_helper_code_frame___helper_code_frame_1.9.0.tgz";
1080 url = "https://registry.yarnpkg.com/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.9.0.tgz";
1081 sha1 = "647f8892cd2043a82ac0c8c5e75c36f1d9159f27";
1082 };
1083 }
1084 {
1085 name = "_webassemblyjs_helper_fsm___helper_fsm_1.9.0.tgz";
1086 path = fetchurl {
1087 name = "_webassemblyjs_helper_fsm___helper_fsm_1.9.0.tgz";
1088 url = "https://registry.yarnpkg.com/@webassemblyjs/helper-fsm/-/helper-fsm-1.9.0.tgz";
1089 sha1 = "c05256b71244214671f4b08ec108ad63b70eddb8";
1090 };
1091 }
1092 {
1093 name = "_webassemblyjs_helper_module_context___helper_module_context_1.9.0.tgz";
1094 path = fetchurl {
1095 name = "_webassemblyjs_helper_module_context___helper_module_context_1.9.0.tgz";
1096 url = "https://registry.yarnpkg.com/@webassemblyjs/helper-module-context/-/helper-module-context-1.9.0.tgz";
1097 sha1 = "25d8884b76839871a08a6c6f806c3979ef712f07";
1098 };
1099 }
1100 {
1101 name = "_webassemblyjs_helper_wasm_bytecode___helper_wasm_bytecode_1.9.0.tgz";
1102 path = fetchurl {
1103 name = "_webassemblyjs_helper_wasm_bytecode___helper_wasm_bytecode_1.9.0.tgz";
1104 url = "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.9.0.tgz";
1105 sha1 = "4fed8beac9b8c14f8c58b70d124d549dd1fe5790";
1106 };
1107 }
1108 {
1109 name = "_webassemblyjs_helper_wasm_section___helper_wasm_section_1.9.0.tgz";
1110 path = fetchurl {
1111 name = "_webassemblyjs_helper_wasm_section___helper_wasm_section_1.9.0.tgz";
1112 url = "https://registry.yarnpkg.com/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.9.0.tgz";
1113 sha1 = "5a4138d5a6292ba18b04c5ae49717e4167965346";
1114 };
1115 }
1116 {
1117 name = "_webassemblyjs_ieee754___ieee754_1.9.0.tgz";
1118 path = fetchurl {
1119 name = "_webassemblyjs_ieee754___ieee754_1.9.0.tgz";
1120 url = "https://registry.yarnpkg.com/@webassemblyjs/ieee754/-/ieee754-1.9.0.tgz";
1121 sha1 = "15c7a0fbaae83fb26143bbacf6d6df1702ad39e4";
1122 };
1123 }
1124 {
1125 name = "_webassemblyjs_leb128___leb128_1.9.0.tgz";
1126 path = fetchurl {
1127 name = "_webassemblyjs_leb128___leb128_1.9.0.tgz";
1128 url = "https://registry.yarnpkg.com/@webassemblyjs/leb128/-/leb128-1.9.0.tgz";
1129 sha1 = "f19ca0b76a6dc55623a09cffa769e838fa1e1c95";
1130 };
1131 }
1132 {
1133 name = "_webassemblyjs_utf8___utf8_1.9.0.tgz";
1134 path = fetchurl {
1135 name = "_webassemblyjs_utf8___utf8_1.9.0.tgz";
1136 url = "https://registry.yarnpkg.com/@webassemblyjs/utf8/-/utf8-1.9.0.tgz";
1137 sha1 = "04d33b636f78e6a6813227e82402f7637b6229ab";
1138 };
1139 }
1140 {
1141 name = "_webassemblyjs_wasm_edit___wasm_edit_1.9.0.tgz";
1142 path = fetchurl {
1143 name = "_webassemblyjs_wasm_edit___wasm_edit_1.9.0.tgz";
1144 url = "https://registry.yarnpkg.com/@webassemblyjs/wasm-edit/-/wasm-edit-1.9.0.tgz";
1145 sha1 = "3fe6d79d3f0f922183aa86002c42dd256cfee9cf";
1146 };
1147 }
1148 {
1149 name = "_webassemblyjs_wasm_gen___wasm_gen_1.9.0.tgz";
1150 path = fetchurl {
1151 name = "_webassemblyjs_wasm_gen___wasm_gen_1.9.0.tgz";
1152 url = "https://registry.yarnpkg.com/@webassemblyjs/wasm-gen/-/wasm-gen-1.9.0.tgz";
1153 sha1 = "50bc70ec68ded8e2763b01a1418bf43491a7a49c";
1154 };
1155 }
1156 {
1157 name = "_webassemblyjs_wasm_opt___wasm_opt_1.9.0.tgz";
1158 path = fetchurl {
1159 name = "_webassemblyjs_wasm_opt___wasm_opt_1.9.0.tgz";
1160 url = "https://registry.yarnpkg.com/@webassemblyjs/wasm-opt/-/wasm-opt-1.9.0.tgz";
1161 sha1 = "2211181e5b31326443cc8112eb9f0b9028721a61";
1162 };
1163 }
1164 {
1165 name = "_webassemblyjs_wasm_parser___wasm_parser_1.9.0.tgz";
1166 path = fetchurl {
1167 name = "_webassemblyjs_wasm_parser___wasm_parser_1.9.0.tgz";
1168 url = "https://registry.yarnpkg.com/@webassemblyjs/wasm-parser/-/wasm-parser-1.9.0.tgz";
1169 sha1 = "9d48e44826df4a6598294aa6c87469d642fff65e";
1170 };
1171 }
1172 {
1173 name = "_webassemblyjs_wast_parser___wast_parser_1.9.0.tgz";
1174 path = fetchurl {
1175 name = "_webassemblyjs_wast_parser___wast_parser_1.9.0.tgz";
1176 url = "https://registry.yarnpkg.com/@webassemblyjs/wast-parser/-/wast-parser-1.9.0.tgz";
1177 sha1 = "3031115d79ac5bd261556cecc3fa90a3ef451914";
1178 };
1179 }
1180 {
1181 name = "_webassemblyjs_wast_printer___wast_printer_1.9.0.tgz";
1182 path = fetchurl {
1183 name = "_webassemblyjs_wast_printer___wast_printer_1.9.0.tgz";
1184 url = "https://registry.yarnpkg.com/@webassemblyjs/wast-printer/-/wast-printer-1.9.0.tgz";
1185 sha1 = "4935d54c85fef637b00ce9f52377451d00d47899";
1186 };
1187 }
1188 {
1189 name = "_xtuc_ieee754___ieee754_1.2.0.tgz";
1190 path = fetchurl {
1191 name = "_xtuc_ieee754___ieee754_1.2.0.tgz";
1192 url = "https://registry.yarnpkg.com/@xtuc/ieee754/-/ieee754-1.2.0.tgz";
1193 sha1 = "eef014a3145ae477a1cbc00cd1e552336dceb790";
1194 };
1195 }
1196 {
1197 name = "_xtuc_long___long_4.2.2.tgz";
1198 path = fetchurl {
1199 name = "_xtuc_long___long_4.2.2.tgz";
1200 url = "https://registry.yarnpkg.com/@xtuc/long/-/long-4.2.2.tgz";
1201 sha1 = "d291c6a4e97989b5c61d9acf396ae4fe133a718d";
1202 };
1203 }
1204 {
1205 name = "accepts___accepts_1.3.7.tgz";
1206 path = fetchurl {
1207 name = "accepts___accepts_1.3.7.tgz";
1208 url = "https://registry.yarnpkg.com/accepts/-/accepts-1.3.7.tgz";
1209 sha1 = "531bc726517a3b2b41f850021c6cc15eaab507cd";
1210 };
1211 }
1212 {
1213 name = "acorn_jsx___acorn_jsx_5.2.0.tgz";
1214 path = fetchurl {
1215 name = "acorn_jsx___acorn_jsx_5.2.0.tgz";
1216 url = "https://registry.yarnpkg.com/acorn-jsx/-/acorn-jsx-5.2.0.tgz";
1217 sha1 = "4c66069173d6fdd68ed85239fc256226182b2ebe";
1218 };
1219 }
1220 {
1221 name = "acorn_walk___acorn_walk_7.1.1.tgz";
1222 path = fetchurl {
1223 name = "acorn_walk___acorn_walk_7.1.1.tgz";
1224 url = "https://registry.yarnpkg.com/acorn-walk/-/acorn-walk-7.1.1.tgz";
1225 sha1 = "345f0dffad5c735e7373d2fec9a1023e6a44b83e";
1226 };
1227 }
1228 {
1229 name = "acorn___acorn_6.4.1.tgz";
1230 path = fetchurl {
1231 name = "acorn___acorn_6.4.1.tgz";
1232 url = "https://registry.yarnpkg.com/acorn/-/acorn-6.4.1.tgz";
1233 sha1 = "531e58ba3f51b9dacb9a6646ca4debf5b14ca474";
1234 };
1235 }
1236 {
1237 name = "acorn___acorn_7.2.0.tgz";
1238 path = fetchurl {
1239 name = "acorn___acorn_7.2.0.tgz";
1240 url = "https://registry.yarnpkg.com/acorn/-/acorn-7.2.0.tgz";
1241 sha1 = "17ea7e40d7c8640ff54a694c889c26f31704effe";
1242 };
1243 }
1244 {
1245 name = "address___address_1.1.2.tgz";
1246 path = fetchurl {
1247 name = "address___address_1.1.2.tgz";
1248 url = "https://registry.yarnpkg.com/address/-/address-1.1.2.tgz";
1249 sha1 = "bf1116c9c758c51b7a933d296b72c221ed9428b6";
1250 };
1251 }
1252 {
1253 name = "aggregate_error___aggregate_error_3.0.1.tgz";
1254 path = fetchurl {
1255 name = "aggregate_error___aggregate_error_3.0.1.tgz";
1256 url = "https://registry.yarnpkg.com/aggregate-error/-/aggregate-error-3.0.1.tgz";
1257 sha1 = "db2fe7246e536f40d9b5442a39e117d7dd6a24e0";
1258 };
1259 }
1260 {
1261 name = "ajv_errors___ajv_errors_1.0.1.tgz";
1262 path = fetchurl {
1263 name = "ajv_errors___ajv_errors_1.0.1.tgz";
1264 url = "https://registry.yarnpkg.com/ajv-errors/-/ajv-errors-1.0.1.tgz";
1265 sha1 = "f35986aceb91afadec4102fbd85014950cefa64d";
1266 };
1267 }
1268 {
1269 name = "ajv_keywords___ajv_keywords_3.4.1.tgz";
1270 path = fetchurl {
1271 name = "ajv_keywords___ajv_keywords_3.4.1.tgz";
1272 url = "https://registry.yarnpkg.com/ajv-keywords/-/ajv-keywords-3.4.1.tgz";
1273 sha1 = "ef916e271c64ac12171fd8384eaae6b2345854da";
1274 };
1275 }
1276 {
1277 name = "ajv___ajv_6.12.2.tgz";
1278 path = fetchurl {
1279 name = "ajv___ajv_6.12.2.tgz";
1280 url = "https://registry.yarnpkg.com/ajv/-/ajv-6.12.2.tgz";
1281 sha1 = "c629c5eced17baf314437918d2da88c99d5958cd";
1282 };
1283 }
1284 {
1285 name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
1286 path = fetchurl {
1287 name = "alphanum_sort___alphanum_sort_1.0.2.tgz";
1288 url = "https://registry.yarnpkg.com/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
1289 sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
1290 };
1291 }
1292 {
1293 name = "ansi_colors___ansi_colors_3.2.4.tgz";
1294 path = fetchurl {
1295 name = "ansi_colors___ansi_colors_3.2.4.tgz";
1296 url = "https://registry.yarnpkg.com/ansi-colors/-/ansi-colors-3.2.4.tgz";
1297 sha1 = "e3a3da4bfbae6c86a9c285625de124a234026fbf";
1298 };
1299 }
1300 {
1301 name = "ansi_escapes___ansi_escapes_4.3.1.tgz";
1302 path = fetchurl {
1303 name = "ansi_escapes___ansi_escapes_4.3.1.tgz";
1304 url = "https://registry.yarnpkg.com/ansi-escapes/-/ansi-escapes-4.3.1.tgz";
1305 sha1 = "a5c47cc43181f1f38ffd7076837700d395522a61";
1306 };
1307 }
1308 {
1309 name = "ansi_html___ansi_html_0.0.7.tgz";
1310 path = fetchurl {
1311 name = "ansi_html___ansi_html_0.0.7.tgz";
1312 url = "https://registry.yarnpkg.com/ansi-html/-/ansi-html-0.0.7.tgz";
1313 sha1 = "813584021962a9e9e6fd039f940d12f56ca7859e";
1314 };
1315 }
1316 {
1317 name = "ansi_regex___ansi_regex_2.1.1.tgz";
1318 path = fetchurl {
1319 name = "ansi_regex___ansi_regex_2.1.1.tgz";
1320 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-2.1.1.tgz";
1321 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
1322 };
1323 }
1324 {
1325 name = "ansi_regex___ansi_regex_3.0.0.tgz";
1326 path = fetchurl {
1327 name = "ansi_regex___ansi_regex_3.0.0.tgz";
1328 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-3.0.0.tgz";
1329 sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
1330 };
1331 }
1332 {
1333 name = "ansi_regex___ansi_regex_4.1.0.tgz";
1334 path = fetchurl {
1335 name = "ansi_regex___ansi_regex_4.1.0.tgz";
1336 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-4.1.0.tgz";
1337 sha1 = "8b9f8f08cf1acb843756a839ca8c7e3168c51997";
1338 };
1339 }
1340 {
1341 name = "ansi_regex___ansi_regex_5.0.0.tgz";
1342 path = fetchurl {
1343 name = "ansi_regex___ansi_regex_5.0.0.tgz";
1344 url = "https://registry.yarnpkg.com/ansi-regex/-/ansi-regex-5.0.0.tgz";
1345 sha1 = "388539f55179bf39339c81af30a654d69f87cb75";
1346 };
1347 }
1348 {
1349 name = "ansi_styles___ansi_styles_2.2.1.tgz";
1350 path = fetchurl {
1351 name = "ansi_styles___ansi_styles_2.2.1.tgz";
1352 url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-2.2.1.tgz";
1353 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
1354 };
1355 }
1356 {
1357 name = "ansi_styles___ansi_styles_3.2.1.tgz";
1358 path = fetchurl {
1359 name = "ansi_styles___ansi_styles_3.2.1.tgz";
1360 url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-3.2.1.tgz";
1361 sha1 = "41fbb20243e50b12be0f04b8dedbf07520ce841d";
1362 };
1363 }
1364 {
1365 name = "ansi_styles___ansi_styles_4.2.1.tgz";
1366 path = fetchurl {
1367 name = "ansi_styles___ansi_styles_4.2.1.tgz";
1368 url = "https://registry.yarnpkg.com/ansi-styles/-/ansi-styles-4.2.1.tgz";
1369 sha1 = "90ae75c424d008d2624c5bf29ead3177ebfcf359";
1370 };
1371 }
1372 {
1373 name = "any_promise___any_promise_1.3.0.tgz";
1374 path = fetchurl {
1375 name = "any_promise___any_promise_1.3.0.tgz";
1376 url = "https://registry.yarnpkg.com/any-promise/-/any-promise-1.3.0.tgz";
1377 sha1 = "abc6afeedcea52e809cdc0376aed3ce39635d17f";
1378 };
1379 }
1380 {
1381 name = "anymatch___anymatch_2.0.0.tgz";
1382 path = fetchurl {
1383 name = "anymatch___anymatch_2.0.0.tgz";
1384 url = "https://registry.yarnpkg.com/anymatch/-/anymatch-2.0.0.tgz";
1385 sha1 = "bcb24b4f37934d9aa7ac17b4adaf89e7c76ef2eb";
1386 };
1387 }
1388 {
1389 name = "anymatch___anymatch_3.1.1.tgz";
1390 path = fetchurl {
1391 name = "anymatch___anymatch_3.1.1.tgz";
1392 url = "https://registry.yarnpkg.com/anymatch/-/anymatch-3.1.1.tgz";
1393 sha1 = "c55ecf02185e2469259399310c173ce31233b142";
1394 };
1395 }
1396 {
1397 name = "aproba___aproba_1.2.0.tgz";
1398 path = fetchurl {
1399 name = "aproba___aproba_1.2.0.tgz";
1400 url = "https://registry.yarnpkg.com/aproba/-/aproba-1.2.0.tgz";
1401 sha1 = "6802e6264efd18c790a1b0d517f0f2627bf2c94a";
1402 };
1403 }
1404 {
1405 name = "arch___arch_2.1.2.tgz";
1406 path = fetchurl {
1407 name = "arch___arch_2.1.2.tgz";
1408 url = "https://registry.yarnpkg.com/arch/-/arch-2.1.2.tgz";
1409 sha1 = "0c52bbe7344bb4fa260c443d2cbad9c00ff2f0bf";
1410 };
1411 }
1412 {
1413 name = "argparse___argparse_1.0.10.tgz";
1414 path = fetchurl {
1415 name = "argparse___argparse_1.0.10.tgz";
1416 url = "https://registry.yarnpkg.com/argparse/-/argparse-1.0.10.tgz";
1417 sha1 = "bcd6791ea5ae09725e17e5ad988134cd40b3d911";
1418 };
1419 }
1420 {
1421 name = "arr_diff___arr_diff_4.0.0.tgz";
1422 path = fetchurl {
1423 name = "arr_diff___arr_diff_4.0.0.tgz";
1424 url = "https://registry.yarnpkg.com/arr-diff/-/arr-diff-4.0.0.tgz";
1425 sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
1426 };
1427 }
1428 {
1429 name = "arr_flatten___arr_flatten_1.1.0.tgz";
1430 path = fetchurl {
1431 name = "arr_flatten___arr_flatten_1.1.0.tgz";
1432 url = "https://registry.yarnpkg.com/arr-flatten/-/arr-flatten-1.1.0.tgz";
1433 sha1 = "36048bbff4e7b47e136644316c99669ea5ae91f1";
1434 };
1435 }
1436 {
1437 name = "arr_union___arr_union_3.1.0.tgz";
1438 path = fetchurl {
1439 name = "arr_union___arr_union_3.1.0.tgz";
1440 url = "https://registry.yarnpkg.com/arr-union/-/arr-union-3.1.0.tgz";
1441 sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
1442 };
1443 }
1444 {
1445 name = "array_flatten___array_flatten_1.1.1.tgz";
1446 path = fetchurl {
1447 name = "array_flatten___array_flatten_1.1.1.tgz";
1448 url = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-1.1.1.tgz";
1449 sha1 = "9a5f699051b1e7073328f2a008968b64ea2955d2";
1450 };
1451 }
1452 {
1453 name = "array_flatten___array_flatten_2.1.2.tgz";
1454 path = fetchurl {
1455 name = "array_flatten___array_flatten_2.1.2.tgz";
1456 url = "https://registry.yarnpkg.com/array-flatten/-/array-flatten-2.1.2.tgz";
1457 sha1 = "24ef80a28c1a893617e2149b0c6d0d788293b099";
1458 };
1459 }
1460 {
1461 name = "array_union___array_union_1.0.2.tgz";
1462 path = fetchurl {
1463 name = "array_union___array_union_1.0.2.tgz";
1464 url = "https://registry.yarnpkg.com/array-union/-/array-union-1.0.2.tgz";
1465 sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
1466 };
1467 }
1468 {
1469 name = "array_uniq___array_uniq_1.0.3.tgz";
1470 path = fetchurl {
1471 name = "array_uniq___array_uniq_1.0.3.tgz";
1472 url = "https://registry.yarnpkg.com/array-uniq/-/array-uniq-1.0.3.tgz";
1473 sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
1474 };
1475 }
1476 {
1477 name = "array_unique___array_unique_0.3.2.tgz";
1478 path = fetchurl {
1479 name = "array_unique___array_unique_0.3.2.tgz";
1480 url = "https://registry.yarnpkg.com/array-unique/-/array-unique-0.3.2.tgz";
1481 sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
1482 };
1483 }
1484 {
1485 name = "asn1.js___asn1.js_4.10.1.tgz";
1486 path = fetchurl {
1487 name = "asn1.js___asn1.js_4.10.1.tgz";
1488 url = "https://registry.yarnpkg.com/asn1.js/-/asn1.js-4.10.1.tgz";
1489 sha1 = "b9c2bf5805f1e64aadeed6df3a2bfafb5a73f5a0";
1490 };
1491 }
1492 {
1493 name = "asn1___asn1_0.2.4.tgz";
1494 path = fetchurl {
1495 name = "asn1___asn1_0.2.4.tgz";
1496 url = "https://registry.yarnpkg.com/asn1/-/asn1-0.2.4.tgz";
1497 sha1 = "8d2475dfab553bb33e77b54e59e880bb8ce23136";
1498 };
1499 }
1500 {
1501 name = "assert_plus___assert_plus_1.0.0.tgz";
1502 path = fetchurl {
1503 name = "assert_plus___assert_plus_1.0.0.tgz";
1504 url = "https://registry.yarnpkg.com/assert-plus/-/assert-plus-1.0.0.tgz";
1505 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
1506 };
1507 }
1508 {
1509 name = "assert___assert_1.5.0.tgz";
1510 path = fetchurl {
1511 name = "assert___assert_1.5.0.tgz";
1512 url = "https://registry.yarnpkg.com/assert/-/assert-1.5.0.tgz";
1513 sha1 = "55c109aaf6e0aefdb3dc4b71240c70bf574b18eb";
1514 };
1515 }
1516 {
1517 name = "assign_symbols___assign_symbols_1.0.0.tgz";
1518 path = fetchurl {
1519 name = "assign_symbols___assign_symbols_1.0.0.tgz";
1520 url = "https://registry.yarnpkg.com/assign-symbols/-/assign-symbols-1.0.0.tgz";
1521 sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
1522 };
1523 }
1524 {
1525 name = "astral_regex___astral_regex_1.0.0.tgz";
1526 path = fetchurl {
1527 name = "astral_regex___astral_regex_1.0.0.tgz";
1528 url = "https://registry.yarnpkg.com/astral-regex/-/astral-regex-1.0.0.tgz";
1529 sha1 = "6c8c3fb827dd43ee3918f27b82782ab7658a6fd9";
1530 };
1531 }
1532 {
1533 name = "async_each___async_each_1.0.3.tgz";
1534 path = fetchurl {
1535 name = "async_each___async_each_1.0.3.tgz";
1536 url = "https://registry.yarnpkg.com/async-each/-/async-each-1.0.3.tgz";
1537 sha1 = "b727dbf87d7651602f06f4d4ac387f47d91b0cbf";
1538 };
1539 }
1540 {
1541 name = "async_limiter___async_limiter_1.0.1.tgz";
1542 path = fetchurl {
1543 name = "async_limiter___async_limiter_1.0.1.tgz";
1544 url = "https://registry.yarnpkg.com/async-limiter/-/async-limiter-1.0.1.tgz";
1545 sha1 = "dd379e94f0db8310b08291f9d64c3209766617fd";
1546 };
1547 }
1548 {
1549 name = "async___async_2.6.3.tgz";
1550 path = fetchurl {
1551 name = "async___async_2.6.3.tgz";
1552 url = "https://registry.yarnpkg.com/async/-/async-2.6.3.tgz";
1553 sha1 = "d72625e2344a3656e3a3ad4fa749fa83299d82ff";
1554 };
1555 }
1556 {
1557 name = "asynckit___asynckit_0.4.0.tgz";
1558 path = fetchurl {
1559 name = "asynckit___asynckit_0.4.0.tgz";
1560 url = "https://registry.yarnpkg.com/asynckit/-/asynckit-0.4.0.tgz";
1561 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
1562 };
1563 }
1564 {
1565 name = "atob___atob_2.1.2.tgz";
1566 path = fetchurl {
1567 name = "atob___atob_2.1.2.tgz";
1568 url = "https://registry.yarnpkg.com/atob/-/atob-2.1.2.tgz";
1569 sha1 = "6d9517eb9e030d2436666651e86bd9f6f13533c9";
1570 };
1571 }
1572 {
1573 name = "autoprefixer___autoprefixer_9.8.0.tgz";
1574 path = fetchurl {
1575 name = "autoprefixer___autoprefixer_9.8.0.tgz";
1576 url = "https://registry.yarnpkg.com/autoprefixer/-/autoprefixer-9.8.0.tgz";
1577 sha1 = "68e2d2bef7ba4c3a65436f662d0a56a741e56511";
1578 };
1579 }
1580 {
1581 name = "aws_sign2___aws_sign2_0.7.0.tgz";
1582 path = fetchurl {
1583 name = "aws_sign2___aws_sign2_0.7.0.tgz";
1584 url = "https://registry.yarnpkg.com/aws-sign2/-/aws-sign2-0.7.0.tgz";
1585 sha1 = "b46e890934a9591f2d2f6f86d7e6a9f1b3fe76a8";
1586 };
1587 }
1588 {
1589 name = "aws4___aws4_1.10.0.tgz";
1590 path = fetchurl {
1591 name = "aws4___aws4_1.10.0.tgz";
1592 url = "https://registry.yarnpkg.com/aws4/-/aws4-1.10.0.tgz";
1593 sha1 = "a17b3a8ea811060e74d47d306122400ad4497ae2";
1594 };
1595 }
1596 {
1597 name = "babel_eslint___babel_eslint_10.1.0.tgz";
1598 path = fetchurl {
1599 name = "babel_eslint___babel_eslint_10.1.0.tgz";
1600 url = "https://registry.yarnpkg.com/babel-eslint/-/babel-eslint-10.1.0.tgz";
1601 sha1 = "6968e568a910b78fb3779cdd8b6ac2f479943232";
1602 };
1603 }
1604 {
1605 name = "babel_extract_comments___babel_extract_comments_1.0.0.tgz";
1606 path = fetchurl {
1607 name = "babel_extract_comments___babel_extract_comments_1.0.0.tgz";
1608 url = "https://registry.yarnpkg.com/babel-extract-comments/-/babel-extract-comments-1.0.0.tgz";
1609 sha1 = "0a2aedf81417ed391b85e18b4614e693a0351a21";
1610 };
1611 }
1612 {
1613 name = "babel_loader___babel_loader_8.1.0.tgz";
1614 path = fetchurl {
1615 name = "babel_loader___babel_loader_8.1.0.tgz";
1616 url = "https://registry.yarnpkg.com/babel-loader/-/babel-loader-8.1.0.tgz";
1617 sha1 = "c611d5112bd5209abe8b9fa84c3e4da25275f1c3";
1618 };
1619 }
1620 {
1621 name = "babel_plugin_dynamic_import_node___babel_plugin_dynamic_import_node_2.3.3.tgz";
1622 path = fetchurl {
1623 name = "babel_plugin_dynamic_import_node___babel_plugin_dynamic_import_node_2.3.3.tgz";
1624 url = "https://registry.yarnpkg.com/babel-plugin-dynamic-import-node/-/babel-plugin-dynamic-import-node-2.3.3.tgz";
1625 sha1 = "84fda19c976ec5c6defef57f9427b3def66e17a3";
1626 };
1627 }
1628 {
1629 name = "babel_plugin_syntax_object_rest_spread___babel_plugin_syntax_object_rest_spread_6.13.0.tgz";
1630 path = fetchurl {
1631 name = "babel_plugin_syntax_object_rest_spread___babel_plugin_syntax_object_rest_spread_6.13.0.tgz";
1632 url = "https://registry.yarnpkg.com/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz";
1633 sha1 = "fd6536f2bce13836ffa3a5458c4903a597bb3bf5";
1634 };
1635 }
1636 {
1637 name = "babel_plugin_transform_object_rest_spread___babel_plugin_transform_object_rest_spread_6.26.0.tgz";
1638 path = fetchurl {
1639 name = "babel_plugin_transform_object_rest_spread___babel_plugin_transform_object_rest_spread_6.26.0.tgz";
1640 url = "https://registry.yarnpkg.com/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz";
1641 sha1 = "0f36692d50fef6b7e2d4b3ac1478137a963b7b06";
1642 };
1643 }
1644 {
1645 name = "babel_runtime___babel_runtime_6.26.0.tgz";
1646 path = fetchurl {
1647 name = "babel_runtime___babel_runtime_6.26.0.tgz";
1648 url = "https://registry.yarnpkg.com/babel-runtime/-/babel-runtime-6.26.0.tgz";
1649 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
1650 };
1651 }
1652 {
1653 name = "babylon___babylon_6.18.0.tgz";
1654 path = fetchurl {
1655 name = "babylon___babylon_6.18.0.tgz";
1656 url = "https://registry.yarnpkg.com/babylon/-/babylon-6.18.0.tgz";
1657 sha1 = "af2f3b88fa6f5c1e4c634d1a0f8eac4f55b395e3";
1658 };
1659 }
1660 {
1661 name = "balanced_match___balanced_match_1.0.0.tgz";
1662 path = fetchurl {
1663 name = "balanced_match___balanced_match_1.0.0.tgz";
1664 url = "https://registry.yarnpkg.com/balanced-match/-/balanced-match-1.0.0.tgz";
1665 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
1666 };
1667 }
1668 {
1669 name = "base64_js___base64_js_1.3.1.tgz";
1670 path = fetchurl {
1671 name = "base64_js___base64_js_1.3.1.tgz";
1672 url = "https://registry.yarnpkg.com/base64-js/-/base64-js-1.3.1.tgz";
1673 sha1 = "58ece8cb75dd07e71ed08c736abc5fac4dbf8df1";
1674 };
1675 }
1676 {
1677 name = "base___base_0.11.2.tgz";
1678 path = fetchurl {
1679 name = "base___base_0.11.2.tgz";
1680 url = "https://registry.yarnpkg.com/base/-/base-0.11.2.tgz";
1681 sha1 = "7bde5ced145b6d551a90db87f83c558b4eb48a8f";
1682 };
1683 }
1684 {
1685 name = "batch___batch_0.6.1.tgz";
1686 path = fetchurl {
1687 name = "batch___batch_0.6.1.tgz";
1688 url = "https://registry.yarnpkg.com/batch/-/batch-0.6.1.tgz";
1689 sha1 = "dc34314f4e679318093fc760272525f94bf25c16";
1690 };
1691 }
1692 {
1693 name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
1694 path = fetchurl {
1695 name = "bcrypt_pbkdf___bcrypt_pbkdf_1.0.2.tgz";
1696 url = "https://registry.yarnpkg.com/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
1697 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
1698 };
1699 }
1700 {
1701 name = "bfj___bfj_6.1.2.tgz";
1702 path = fetchurl {
1703 name = "bfj___bfj_6.1.2.tgz";
1704 url = "https://registry.yarnpkg.com/bfj/-/bfj-6.1.2.tgz";
1705 sha1 = "325c861a822bcb358a41c78a33b8e6e2086dde7f";
1706 };
1707 }
1708 {
1709 name = "big.js___big.js_3.2.0.tgz";
1710 path = fetchurl {
1711 name = "big.js___big.js_3.2.0.tgz";
1712 url = "https://registry.yarnpkg.com/big.js/-/big.js-3.2.0.tgz";
1713 sha1 = "a5fc298b81b9e0dca2e458824784b65c52ba588e";
1714 };
1715 }
1716 {
1717 name = "big.js___big.js_5.2.2.tgz";
1718 path = fetchurl {
1719 name = "big.js___big.js_5.2.2.tgz";
1720 url = "https://registry.yarnpkg.com/big.js/-/big.js-5.2.2.tgz";
1721 sha1 = "65f0af382f578bcdc742bd9c281e9cb2d7768328";
1722 };
1723 }
1724 {
1725 name = "binary_extensions___binary_extensions_1.13.1.tgz";
1726 path = fetchurl {
1727 name = "binary_extensions___binary_extensions_1.13.1.tgz";
1728 url = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-1.13.1.tgz";
1729 sha1 = "598afe54755b2868a5330d2aff9d4ebb53209b65";
1730 };
1731 }
1732 {
1733 name = "binary_extensions___binary_extensions_2.0.0.tgz";
1734 path = fetchurl {
1735 name = "binary_extensions___binary_extensions_2.0.0.tgz";
1736 url = "https://registry.yarnpkg.com/binary-extensions/-/binary-extensions-2.0.0.tgz";
1737 sha1 = "23c0df14f6a88077f5f986c0d167ec03c3d5537c";
1738 };
1739 }
1740 {
1741 name = "bindings___bindings_1.5.0.tgz";
1742 path = fetchurl {
1743 name = "bindings___bindings_1.5.0.tgz";
1744 url = "https://registry.yarnpkg.com/bindings/-/bindings-1.5.0.tgz";
1745 sha1 = "10353c9e945334bc0511a6d90b38fbc7c9c504df";
1746 };
1747 }
1748 {
1749 name = "bluebird___bluebird_3.7.2.tgz";
1750 path = fetchurl {
1751 name = "bluebird___bluebird_3.7.2.tgz";
1752 url = "https://registry.yarnpkg.com/bluebird/-/bluebird-3.7.2.tgz";
1753 sha1 = "9f229c15be272454ffa973ace0dbee79a1b0c36f";
1754 };
1755 }
1756 {
1757 name = "bn.js___bn.js_4.11.9.tgz";
1758 path = fetchurl {
1759 name = "bn.js___bn.js_4.11.9.tgz";
1760 url = "https://registry.yarnpkg.com/bn.js/-/bn.js-4.11.9.tgz";
1761 sha1 = "26d556829458f9d1e81fc48952493d0ba3507828";
1762 };
1763 }
1764 {
1765 name = "bn.js___bn.js_5.1.2.tgz";
1766 path = fetchurl {
1767 name = "bn.js___bn.js_5.1.2.tgz";
1768 url = "https://registry.yarnpkg.com/bn.js/-/bn.js-5.1.2.tgz";
1769 sha1 = "c9686902d3c9a27729f43ab10f9d79c2004da7b0";
1770 };
1771 }
1772 {
1773 name = "body_parser___body_parser_1.19.0.tgz";
1774 path = fetchurl {
1775 name = "body_parser___body_parser_1.19.0.tgz";
1776 url = "https://registry.yarnpkg.com/body-parser/-/body-parser-1.19.0.tgz";
1777 sha1 = "96b2709e57c9c4e09a6fd66a8fd979844f69f08a";
1778 };
1779 }
1780 {
1781 name = "bonjour___bonjour_3.5.0.tgz";
1782 path = fetchurl {
1783 name = "bonjour___bonjour_3.5.0.tgz";
1784 url = "https://registry.yarnpkg.com/bonjour/-/bonjour-3.5.0.tgz";
1785 sha1 = "8e890a183d8ee9a2393b3844c691a42bcf7bc9f5";
1786 };
1787 }
1788 {
1789 name = "boolbase___boolbase_1.0.0.tgz";
1790 path = fetchurl {
1791 name = "boolbase___boolbase_1.0.0.tgz";
1792 url = "https://registry.yarnpkg.com/boolbase/-/boolbase-1.0.0.tgz";
1793 sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
1794 };
1795 }
1796 {
1797 name = "brace_expansion___brace_expansion_1.1.11.tgz";
1798 path = fetchurl {
1799 name = "brace_expansion___brace_expansion_1.1.11.tgz";
1800 url = "https://registry.yarnpkg.com/brace-expansion/-/brace-expansion-1.1.11.tgz";
1801 sha1 = "3c7fcbf529d87226f3d2f52b966ff5271eb441dd";
1802 };
1803 }
1804 {
1805 name = "braces___braces_2.3.2.tgz";
1806 path = fetchurl {
1807 name = "braces___braces_2.3.2.tgz";
1808 url = "https://registry.yarnpkg.com/braces/-/braces-2.3.2.tgz";
1809 sha1 = "5979fd3f14cd531565e5fa2df1abfff1dfaee729";
1810 };
1811 }
1812 {
1813 name = "braces___braces_3.0.2.tgz";
1814 path = fetchurl {
1815 name = "braces___braces_3.0.2.tgz";
1816 url = "https://registry.yarnpkg.com/braces/-/braces-3.0.2.tgz";
1817 sha1 = "3454e1a462ee8d599e236df336cd9ea4f8afe107";
1818 };
1819 }
1820 {
1821 name = "brorand___brorand_1.1.0.tgz";
1822 path = fetchurl {
1823 name = "brorand___brorand_1.1.0.tgz";
1824 url = "https://registry.yarnpkg.com/brorand/-/brorand-1.1.0.tgz";
1825 sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
1826 };
1827 }
1828 {
1829 name = "browserify_aes___browserify_aes_1.2.0.tgz";
1830 path = fetchurl {
1831 name = "browserify_aes___browserify_aes_1.2.0.tgz";
1832 url = "https://registry.yarnpkg.com/browserify-aes/-/browserify-aes-1.2.0.tgz";
1833 sha1 = "326734642f403dabc3003209853bb70ad428ef48";
1834 };
1835 }
1836 {
1837 name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
1838 path = fetchurl {
1839 name = "browserify_cipher___browserify_cipher_1.0.1.tgz";
1840 url = "https://registry.yarnpkg.com/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
1841 sha1 = "8d6474c1b870bfdabcd3bcfcc1934a10e94f15f0";
1842 };
1843 }
1844 {
1845 name = "browserify_des___browserify_des_1.0.2.tgz";
1846 path = fetchurl {
1847 name = "browserify_des___browserify_des_1.0.2.tgz";
1848 url = "https://registry.yarnpkg.com/browserify-des/-/browserify-des-1.0.2.tgz";
1849 sha1 = "3af4f1f59839403572f1c66204375f7a7f703e9c";
1850 };
1851 }
1852 {
1853 name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
1854 path = fetchurl {
1855 name = "browserify_rsa___browserify_rsa_4.0.1.tgz";
1856 url = "https://registry.yarnpkg.com/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
1857 sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
1858 };
1859 }
1860 {
1861 name = "browserify_sign___browserify_sign_4.2.0.tgz";
1862 path = fetchurl {
1863 name = "browserify_sign___browserify_sign_4.2.0.tgz";
1864 url = "https://registry.yarnpkg.com/browserify-sign/-/browserify-sign-4.2.0.tgz";
1865 sha1 = "545d0b1b07e6b2c99211082bf1b12cce7a0b0e11";
1866 };
1867 }
1868 {
1869 name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
1870 path = fetchurl {
1871 name = "browserify_zlib___browserify_zlib_0.2.0.tgz";
1872 url = "https://registry.yarnpkg.com/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
1873 sha1 = "2869459d9aa3be245fe8fe2ca1f46e2e7f54d73f";
1874 };
1875 }
1876 {
1877 name = "browserslist___browserslist_4.12.0.tgz";
1878 path = fetchurl {
1879 name = "browserslist___browserslist_4.12.0.tgz";
1880 url = "https://registry.yarnpkg.com/browserslist/-/browserslist-4.12.0.tgz";
1881 sha1 = "06c6d5715a1ede6c51fc39ff67fd647f740b656d";
1882 };
1883 }
1884 {
1885 name = "buffer_from___buffer_from_1.1.1.tgz";
1886 path = fetchurl {
1887 name = "buffer_from___buffer_from_1.1.1.tgz";
1888 url = "https://registry.yarnpkg.com/buffer-from/-/buffer-from-1.1.1.tgz";
1889 sha1 = "32713bc028f75c02fdb710d7c7bcec1f2c6070ef";
1890 };
1891 }
1892 {
1893 name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
1894 path = fetchurl {
1895 name = "buffer_indexof___buffer_indexof_1.1.1.tgz";
1896 url = "https://registry.yarnpkg.com/buffer-indexof/-/buffer-indexof-1.1.1.tgz";
1897 sha1 = "52fabcc6a606d1a00302802648ef68f639da268c";
1898 };
1899 }
1900 {
1901 name = "buffer_json___buffer_json_2.0.0.tgz";
1902 path = fetchurl {
1903 name = "buffer_json___buffer_json_2.0.0.tgz";
1904 url = "https://registry.yarnpkg.com/buffer-json/-/buffer-json-2.0.0.tgz";
1905 sha1 = "f73e13b1e42f196fe2fd67d001c7d7107edd7c23";
1906 };
1907 }
1908 {
1909 name = "buffer_xor___buffer_xor_1.0.3.tgz";
1910 path = fetchurl {
1911 name = "buffer_xor___buffer_xor_1.0.3.tgz";
1912 url = "https://registry.yarnpkg.com/buffer-xor/-/buffer-xor-1.0.3.tgz";
1913 sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
1914 };
1915 }
1916 {
1917 name = "buffer___buffer_4.9.2.tgz";
1918 path = fetchurl {
1919 name = "buffer___buffer_4.9.2.tgz";
1920 url = "https://registry.yarnpkg.com/buffer/-/buffer-4.9.2.tgz";
1921 sha1 = "230ead344002988644841ab0244af8c44bbe3ef8";
1922 };
1923 }
1924 {
1925 name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
1926 path = fetchurl {
1927 name = "builtin_status_codes___builtin_status_codes_3.0.0.tgz";
1928 url = "https://registry.yarnpkg.com/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
1929 sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
1930 };
1931 }
1932 {
1933 name = "bulma___bulma_0.8.2.tgz";
1934 path = fetchurl {
1935 name = "bulma___bulma_0.8.2.tgz";
1936 url = "https://registry.yarnpkg.com/bulma/-/bulma-0.8.2.tgz";
1937 sha1 = "5d928f16ed4a84549c2873f95c92c38c69c631a7";
1938 };
1939 }
1940 {
1941 name = "bytes___bytes_3.0.0.tgz";
1942 path = fetchurl {
1943 name = "bytes___bytes_3.0.0.tgz";
1944 url = "https://registry.yarnpkg.com/bytes/-/bytes-3.0.0.tgz";
1945 sha1 = "d32815404d689699f85a4ea4fa8755dd13a96048";
1946 };
1947 }
1948 {
1949 name = "bytes___bytes_3.1.0.tgz";
1950 path = fetchurl {
1951 name = "bytes___bytes_3.1.0.tgz";
1952 url = "https://registry.yarnpkg.com/bytes/-/bytes-3.1.0.tgz";
1953 sha1 = "f6cf7933a360e0588fa9fde85651cdc7f805d1f6";
1954 };
1955 }
1956 {
1957 name = "cacache___cacache_12.0.4.tgz";
1958 path = fetchurl {
1959 name = "cacache___cacache_12.0.4.tgz";
1960 url = "https://registry.yarnpkg.com/cacache/-/cacache-12.0.4.tgz";
1961 sha1 = "668bcbd105aeb5f1d92fe25570ec9525c8faa40c";
1962 };
1963 }
1964 {
1965 name = "cacache___cacache_13.0.1.tgz";
1966 path = fetchurl {
1967 name = "cacache___cacache_13.0.1.tgz";
1968 url = "https://registry.yarnpkg.com/cacache/-/cacache-13.0.1.tgz";
1969 sha1 = "a8000c21697089082f85287a1aec6e382024a71c";
1970 };
1971 }
1972 {
1973 name = "cache_base___cache_base_1.0.1.tgz";
1974 path = fetchurl {
1975 name = "cache_base___cache_base_1.0.1.tgz";
1976 url = "https://registry.yarnpkg.com/cache-base/-/cache-base-1.0.1.tgz";
1977 sha1 = "0a7f46416831c8b662ee36fe4e7c59d76f666ab2";
1978 };
1979 }
1980 {
1981 name = "cache_loader___cache_loader_4.1.0.tgz";
1982 path = fetchurl {
1983 name = "cache_loader___cache_loader_4.1.0.tgz";
1984 url = "https://registry.yarnpkg.com/cache-loader/-/cache-loader-4.1.0.tgz";
1985 sha1 = "9948cae353aec0a1fcb1eafda2300816ec85387e";
1986 };
1987 }
1988 {
1989 name = "call_me_maybe___call_me_maybe_1.0.1.tgz";
1990 path = fetchurl {
1991 name = "call_me_maybe___call_me_maybe_1.0.1.tgz";
1992 url = "https://registry.yarnpkg.com/call-me-maybe/-/call-me-maybe-1.0.1.tgz";
1993 sha1 = "26d208ea89e37b5cbde60250a15f031c16a4d66b";
1994 };
1995 }
1996 {
1997 name = "caller_callsite___caller_callsite_2.0.0.tgz";
1998 path = fetchurl {
1999 name = "caller_callsite___caller_callsite_2.0.0.tgz";
2000 url = "https://registry.yarnpkg.com/caller-callsite/-/caller-callsite-2.0.0.tgz";
2001 sha1 = "847e0fce0a223750a9a027c54b33731ad3154134";
2002 };
2003 }
2004 {
2005 name = "caller_path___caller_path_2.0.0.tgz";
2006 path = fetchurl {
2007 name = "caller_path___caller_path_2.0.0.tgz";
2008 url = "https://registry.yarnpkg.com/caller-path/-/caller-path-2.0.0.tgz";
2009 sha1 = "468f83044e369ab2010fac5f06ceee15bb2cb1f4";
2010 };
2011 }
2012 {
2013 name = "callsites___callsites_2.0.0.tgz";
2014 path = fetchurl {
2015 name = "callsites___callsites_2.0.0.tgz";
2016 url = "https://registry.yarnpkg.com/callsites/-/callsites-2.0.0.tgz";
2017 sha1 = "06eb84f00eea413da86affefacbffb36093b3c50";
2018 };
2019 }
2020 {
2021 name = "callsites___callsites_3.1.0.tgz";
2022 path = fetchurl {
2023 name = "callsites___callsites_3.1.0.tgz";
2024 url = "https://registry.yarnpkg.com/callsites/-/callsites-3.1.0.tgz";
2025 sha1 = "b3630abd8943432f54b3f0519238e33cd7df2f73";
2026 };
2027 }
2028 {
2029 name = "camel_case___camel_case_3.0.0.tgz";
2030 path = fetchurl {
2031 name = "camel_case___camel_case_3.0.0.tgz";
2032 url = "https://registry.yarnpkg.com/camel-case/-/camel-case-3.0.0.tgz";
2033 sha1 = "ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73";
2034 };
2035 }
2036 {
2037 name = "camelcase___camelcase_5.3.1.tgz";
2038 path = fetchurl {
2039 name = "camelcase___camelcase_5.3.1.tgz";
2040 url = "https://registry.yarnpkg.com/camelcase/-/camelcase-5.3.1.tgz";
2041 sha1 = "e3c9b31569e106811df242f715725a1f4c494320";
2042 };
2043 }
2044 {
2045 name = "caniuse_api___caniuse_api_3.0.0.tgz";
2046 path = fetchurl {
2047 name = "caniuse_api___caniuse_api_3.0.0.tgz";
2048 url = "https://registry.yarnpkg.com/caniuse-api/-/caniuse-api-3.0.0.tgz";
2049 sha1 = "5e4d90e2274961d46291997df599e3ed008ee4c0";
2050 };
2051 }
2052 {
2053 name = "caniuse_lite___caniuse_lite_1.0.30001078.tgz";
2054 path = fetchurl {
2055 name = "caniuse_lite___caniuse_lite_1.0.30001078.tgz";
2056 url = "https://registry.yarnpkg.com/caniuse-lite/-/caniuse-lite-1.0.30001078.tgz";
2057 sha1 = "e1b6e2ae327b6a1ec11f65ec7a0dde1e7093074c";
2058 };
2059 }
2060 {
2061 name = "case_sensitive_paths_webpack_plugin___case_sensitive_paths_webpack_plugin_2.3.0.tgz";
2062 path = fetchurl {
2063 name = "case_sensitive_paths_webpack_plugin___case_sensitive_paths_webpack_plugin_2.3.0.tgz";
2064 url = "https://registry.yarnpkg.com/case-sensitive-paths-webpack-plugin/-/case-sensitive-paths-webpack-plugin-2.3.0.tgz";
2065 sha1 = "23ac613cc9a856e4f88ff8bb73bbb5e989825cf7";
2066 };
2067 }
2068 {
2069 name = "caseless___caseless_0.12.0.tgz";
2070 path = fetchurl {
2071 name = "caseless___caseless_0.12.0.tgz";
2072 url = "https://registry.yarnpkg.com/caseless/-/caseless-0.12.0.tgz";
2073 sha1 = "1b681c21ff84033c826543090689420d187151dc";
2074 };
2075 }
2076 {
2077 name = "chalk___chalk_1.1.3.tgz";
2078 path = fetchurl {
2079 name = "chalk___chalk_1.1.3.tgz";
2080 url = "https://registry.yarnpkg.com/chalk/-/chalk-1.1.3.tgz";
2081 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
2082 };
2083 }
2084 {
2085 name = "chalk___chalk_2.4.2.tgz";
2086 path = fetchurl {
2087 name = "chalk___chalk_2.4.2.tgz";
2088 url = "https://registry.yarnpkg.com/chalk/-/chalk-2.4.2.tgz";
2089 sha1 = "cd42541677a54333cf541a49108c1432b44c9424";
2090 };
2091 }
2092 {
2093 name = "chalk___chalk_3.0.0.tgz";
2094 path = fetchurl {
2095 name = "chalk___chalk_3.0.0.tgz";
2096 url = "https://registry.yarnpkg.com/chalk/-/chalk-3.0.0.tgz";
2097 sha1 = "3f73c2bf526591f574cc492c51e2456349f844e4";
2098 };
2099 }
2100 {
2101 name = "chalk___chalk_4.0.0.tgz";
2102 path = fetchurl {
2103 name = "chalk___chalk_4.0.0.tgz";
2104 url = "https://registry.yarnpkg.com/chalk/-/chalk-4.0.0.tgz";
2105 sha1 = "6e98081ed2d17faab615eb52ac66ec1fe6209e72";
2106 };
2107 }
2108 {
2109 name = "chardet___chardet_0.7.0.tgz";
2110 path = fetchurl {
2111 name = "chardet___chardet_0.7.0.tgz";
2112 url = "https://registry.yarnpkg.com/chardet/-/chardet-0.7.0.tgz";
2113 sha1 = "90094849f0937f2eedc2425d0d28a9e5f0cbad9e";
2114 };
2115 }
2116 {
2117 name = "check_types___check_types_8.0.3.tgz";
2118 path = fetchurl {
2119 name = "check_types___check_types_8.0.3.tgz";
2120 url = "https://registry.yarnpkg.com/check-types/-/check-types-8.0.3.tgz";
2121 sha1 = "3356cca19c889544f2d7a95ed49ce508a0ecf552";
2122 };
2123 }
2124 {
2125 name = "chokidar___chokidar_3.4.0.tgz";
2126 path = fetchurl {
2127 name = "chokidar___chokidar_3.4.0.tgz";
2128 url = "https://registry.yarnpkg.com/chokidar/-/chokidar-3.4.0.tgz";
2129 sha1 = "b30611423ce376357c765b9b8f904b9fba3c0be8";
2130 };
2131 }
2132 {
2133 name = "chokidar___chokidar_2.1.8.tgz";
2134 path = fetchurl {
2135 name = "chokidar___chokidar_2.1.8.tgz";
2136 url = "https://registry.yarnpkg.com/chokidar/-/chokidar-2.1.8.tgz";
2137 sha1 = "804b3a7b6a99358c3c5c61e71d8728f041cff917";
2138 };
2139 }
2140 {
2141 name = "chownr___chownr_1.1.4.tgz";
2142 path = fetchurl {
2143 name = "chownr___chownr_1.1.4.tgz";
2144 url = "https://registry.yarnpkg.com/chownr/-/chownr-1.1.4.tgz";
2145 sha1 = "6fc9d7b42d32a583596337666e7d08084da2cc6b";
2146 };
2147 }
2148 {
2149 name = "chrome_trace_event___chrome_trace_event_1.0.2.tgz";
2150 path = fetchurl {
2151 name = "chrome_trace_event___chrome_trace_event_1.0.2.tgz";
2152 url = "https://registry.yarnpkg.com/chrome-trace-event/-/chrome-trace-event-1.0.2.tgz";
2153 sha1 = "234090ee97c7d4ad1a2c4beae27505deffc608a4";
2154 };
2155 }
2156 {
2157 name = "ci_info___ci_info_1.6.0.tgz";
2158 path = fetchurl {
2159 name = "ci_info___ci_info_1.6.0.tgz";
2160 url = "https://registry.yarnpkg.com/ci-info/-/ci-info-1.6.0.tgz";
2161 sha1 = "2ca20dbb9ceb32d4524a683303313f0304b1e497";
2162 };
2163 }
2164 {
2165 name = "cipher_base___cipher_base_1.0.4.tgz";
2166 path = fetchurl {
2167 name = "cipher_base___cipher_base_1.0.4.tgz";
2168 url = "https://registry.yarnpkg.com/cipher-base/-/cipher-base-1.0.4.tgz";
2169 sha1 = "8760e4ecc272f4c363532f926d874aae2c1397de";
2170 };
2171 }
2172 {
2173 name = "class_utils___class_utils_0.3.6.tgz";
2174 path = fetchurl {
2175 name = "class_utils___class_utils_0.3.6.tgz";
2176 url = "https://registry.yarnpkg.com/class-utils/-/class-utils-0.3.6.tgz";
2177 sha1 = "f93369ae8b9a7ce02fd41faad0ca83033190c463";
2178 };
2179 }
2180 {
2181 name = "clean_css___clean_css_4.2.3.tgz";
2182 path = fetchurl {
2183 name = "clean_css___clean_css_4.2.3.tgz";
2184 url = "https://registry.yarnpkg.com/clean-css/-/clean-css-4.2.3.tgz";
2185 sha1 = "507b5de7d97b48ee53d84adb0160ff6216380f78";
2186 };
2187 }
2188 {
2189 name = "clean_stack___clean_stack_2.2.0.tgz";
2190 path = fetchurl {
2191 name = "clean_stack___clean_stack_2.2.0.tgz";
2192 url = "https://registry.yarnpkg.com/clean-stack/-/clean-stack-2.2.0.tgz";
2193 sha1 = "ee8472dbb129e727b31e8a10a427dee9dfe4008b";
2194 };
2195 }
2196 {
2197 name = "cli_cursor___cli_cursor_2.1.0.tgz";
2198 path = fetchurl {
2199 name = "cli_cursor___cli_cursor_2.1.0.tgz";
2200 url = "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-2.1.0.tgz";
2201 sha1 = "b35dac376479facc3e94747d41d0d0f5238ffcb5";
2202 };
2203 }
2204 {
2205 name = "cli_cursor___cli_cursor_3.1.0.tgz";
2206 path = fetchurl {
2207 name = "cli_cursor___cli_cursor_3.1.0.tgz";
2208 url = "https://registry.yarnpkg.com/cli-cursor/-/cli-cursor-3.1.0.tgz";
2209 sha1 = "264305a7ae490d1d03bf0c9ba7c925d1753af307";
2210 };
2211 }
2212 {
2213 name = "cli_highlight___cli_highlight_2.1.4.tgz";
2214 path = fetchurl {
2215 name = "cli_highlight___cli_highlight_2.1.4.tgz";
2216 url = "https://registry.yarnpkg.com/cli-highlight/-/cli-highlight-2.1.4.tgz";
2217 sha1 = "098cb642cf17f42adc1c1145e07f960ec4d7522b";
2218 };
2219 }
2220 {
2221 name = "cli_spinners___cli_spinners_2.3.0.tgz";
2222 path = fetchurl {
2223 name = "cli_spinners___cli_spinners_2.3.0.tgz";
2224 url = "https://registry.yarnpkg.com/cli-spinners/-/cli-spinners-2.3.0.tgz";
2225 sha1 = "0632239a4b5aa4c958610142c34bb7a651fc8df5";
2226 };
2227 }
2228 {
2229 name = "cli_width___cli_width_2.2.1.tgz";
2230 path = fetchurl {
2231 name = "cli_width___cli_width_2.2.1.tgz";
2232 url = "https://registry.yarnpkg.com/cli-width/-/cli-width-2.2.1.tgz";
2233 sha1 = "b0433d0b4e9c847ef18868a4ef16fd5fc8271c48";
2234 };
2235 }
2236 {
2237 name = "clipboardy___clipboardy_2.3.0.tgz";
2238 path = fetchurl {
2239 name = "clipboardy___clipboardy_2.3.0.tgz";
2240 url = "https://registry.yarnpkg.com/clipboardy/-/clipboardy-2.3.0.tgz";
2241 sha1 = "3c2903650c68e46a91b388985bc2774287dba290";
2242 };
2243 }
2244 {
2245 name = "cliui___cliui_5.0.0.tgz";
2246 path = fetchurl {
2247 name = "cliui___cliui_5.0.0.tgz";
2248 url = "https://registry.yarnpkg.com/cliui/-/cliui-5.0.0.tgz";
2249 sha1 = "deefcfdb2e800784aa34f46fa08e06851c7bbbc5";
2250 };
2251 }
2252 {
2253 name = "cliui___cliui_6.0.0.tgz";
2254 path = fetchurl {
2255 name = "cliui___cliui_6.0.0.tgz";
2256 url = "https://registry.yarnpkg.com/cliui/-/cliui-6.0.0.tgz";
2257 sha1 = "511d702c0c4e41ca156d7d0e96021f23e13225b1";
2258 };
2259 }
2260 {
2261 name = "clone_deep___clone_deep_4.0.1.tgz";
2262 path = fetchurl {
2263 name = "clone_deep___clone_deep_4.0.1.tgz";
2264 url = "https://registry.yarnpkg.com/clone-deep/-/clone-deep-4.0.1.tgz";
2265 sha1 = "c19fd9bdbbf85942b4fd979c84dcf7d5f07c2387";
2266 };
2267 }
2268 {
2269 name = "clone___clone_1.0.4.tgz";
2270 path = fetchurl {
2271 name = "clone___clone_1.0.4.tgz";
2272 url = "https://registry.yarnpkg.com/clone/-/clone-1.0.4.tgz";
2273 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
2274 };
2275 }
2276 {
2277 name = "coa___coa_2.0.2.tgz";
2278 path = fetchurl {
2279 name = "coa___coa_2.0.2.tgz";
2280 url = "https://registry.yarnpkg.com/coa/-/coa-2.0.2.tgz";
2281 sha1 = "43f6c21151b4ef2bf57187db0d73de229e3e7ec3";
2282 };
2283 }
2284 {
2285 name = "collection_visit___collection_visit_1.0.0.tgz";
2286 path = fetchurl {
2287 name = "collection_visit___collection_visit_1.0.0.tgz";
2288 url = "https://registry.yarnpkg.com/collection-visit/-/collection-visit-1.0.0.tgz";
2289 sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
2290 };
2291 }
2292 {
2293 name = "color_convert___color_convert_1.9.3.tgz";
2294 path = fetchurl {
2295 name = "color_convert___color_convert_1.9.3.tgz";
2296 url = "https://registry.yarnpkg.com/color-convert/-/color-convert-1.9.3.tgz";
2297 sha1 = "bb71850690e1f136567de629d2d5471deda4c1e8";
2298 };
2299 }
2300 {
2301 name = "color_convert___color_convert_2.0.1.tgz";
2302 path = fetchurl {
2303 name = "color_convert___color_convert_2.0.1.tgz";
2304 url = "https://registry.yarnpkg.com/color-convert/-/color-convert-2.0.1.tgz";
2305 sha1 = "72d3a68d598c9bdb3af2ad1e84f21d896abd4de3";
2306 };
2307 }
2308 {
2309 name = "color_name___color_name_1.1.3.tgz";
2310 path = fetchurl {
2311 name = "color_name___color_name_1.1.3.tgz";
2312 url = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.3.tgz";
2313 sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
2314 };
2315 }
2316 {
2317 name = "color_name___color_name_1.1.4.tgz";
2318 path = fetchurl {
2319 name = "color_name___color_name_1.1.4.tgz";
2320 url = "https://registry.yarnpkg.com/color-name/-/color-name-1.1.4.tgz";
2321 sha1 = "c2a09a87acbde69543de6f63fa3995c826c536a2";
2322 };
2323 }
2324 {
2325 name = "color_string___color_string_1.5.3.tgz";
2326 path = fetchurl {
2327 name = "color_string___color_string_1.5.3.tgz";
2328 url = "https://registry.yarnpkg.com/color-string/-/color-string-1.5.3.tgz";
2329 sha1 = "c9bbc5f01b58b5492f3d6857459cb6590ce204cc";
2330 };
2331 }
2332 {
2333 name = "color___color_3.1.2.tgz";
2334 path = fetchurl {
2335 name = "color___color_3.1.2.tgz";
2336 url = "https://registry.yarnpkg.com/color/-/color-3.1.2.tgz";
2337 sha1 = "68148e7f85d41ad7649c5fa8c8106f098d229e10";
2338 };
2339 }
2340 {
2341 name = "combined_stream___combined_stream_1.0.8.tgz";
2342 path = fetchurl {
2343 name = "combined_stream___combined_stream_1.0.8.tgz";
2344 url = "https://registry.yarnpkg.com/combined-stream/-/combined-stream-1.0.8.tgz";
2345 sha1 = "c3d45a8b34fd730631a110a8a2520682b31d5a7f";
2346 };
2347 }
2348 {
2349 name = "commander___commander_2.17.1.tgz";
2350 path = fetchurl {
2351 name = "commander___commander_2.17.1.tgz";
2352 url = "https://registry.yarnpkg.com/commander/-/commander-2.17.1.tgz";
2353 sha1 = "bd77ab7de6de94205ceacc72f1716d29f20a77bf";
2354 };
2355 }
2356 {
2357 name = "commander___commander_2.20.3.tgz";
2358 path = fetchurl {
2359 name = "commander___commander_2.20.3.tgz";
2360 url = "https://registry.yarnpkg.com/commander/-/commander-2.20.3.tgz";
2361 sha1 = "fd485e84c03eb4881c20722ba48035e8531aeb33";
2362 };
2363 }
2364 {
2365 name = "commander___commander_2.19.0.tgz";
2366 path = fetchurl {
2367 name = "commander___commander_2.19.0.tgz";
2368 url = "https://registry.yarnpkg.com/commander/-/commander-2.19.0.tgz";
2369 sha1 = "f6198aa84e5b83c46054b94ddedbfed5ee9ff12a";
2370 };
2371 }
2372 {
2373 name = "common_tags___common_tags_1.8.0.tgz";
2374 path = fetchurl {
2375 name = "common_tags___common_tags_1.8.0.tgz";
2376 url = "https://registry.yarnpkg.com/common-tags/-/common-tags-1.8.0.tgz";
2377 sha1 = "8e3153e542d4a39e9b10554434afaaf98956a937";
2378 };
2379 }
2380 {
2381 name = "commondir___commondir_1.0.1.tgz";
2382 path = fetchurl {
2383 name = "commondir___commondir_1.0.1.tgz";
2384 url = "https://registry.yarnpkg.com/commondir/-/commondir-1.0.1.tgz";
2385 sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b";
2386 };
2387 }
2388 {
2389 name = "component_emitter___component_emitter_1.3.0.tgz";
2390 path = fetchurl {
2391 name = "component_emitter___component_emitter_1.3.0.tgz";
2392 url = "https://registry.yarnpkg.com/component-emitter/-/component-emitter-1.3.0.tgz";
2393 sha1 = "16e4070fba8ae29b679f2215853ee181ab2eabc0";
2394 };
2395 }
2396 {
2397 name = "compressible___compressible_2.0.18.tgz";
2398 path = fetchurl {
2399 name = "compressible___compressible_2.0.18.tgz";
2400 url = "https://registry.yarnpkg.com/compressible/-/compressible-2.0.18.tgz";
2401 sha1 = "af53cca6b070d4c3c0750fbd77286a6d7cc46fba";
2402 };
2403 }
2404 {
2405 name = "compression___compression_1.7.4.tgz";
2406 path = fetchurl {
2407 name = "compression___compression_1.7.4.tgz";
2408 url = "https://registry.yarnpkg.com/compression/-/compression-1.7.4.tgz";
2409 sha1 = "95523eff170ca57c29a0ca41e6fe131f41e5bb8f";
2410 };
2411 }
2412 {
2413 name = "concat_map___concat_map_0.0.1.tgz";
2414 path = fetchurl {
2415 name = "concat_map___concat_map_0.0.1.tgz";
2416 url = "https://registry.yarnpkg.com/concat-map/-/concat-map-0.0.1.tgz";
2417 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
2418 };
2419 }
2420 {
2421 name = "concat_stream___concat_stream_1.6.2.tgz";
2422 path = fetchurl {
2423 name = "concat_stream___concat_stream_1.6.2.tgz";
2424 url = "https://registry.yarnpkg.com/concat-stream/-/concat-stream-1.6.2.tgz";
2425 sha1 = "904bdf194cd3122fc675c77fc4ac3d4ff0fd1a34";
2426 };
2427 }
2428 {
2429 name = "connect_history_api_fallback___connect_history_api_fallback_1.6.0.tgz";
2430 path = fetchurl {
2431 name = "connect_history_api_fallback___connect_history_api_fallback_1.6.0.tgz";
2432 url = "https://registry.yarnpkg.com/connect-history-api-fallback/-/connect-history-api-fallback-1.6.0.tgz";
2433 sha1 = "8b32089359308d111115d81cad3fceab888f97bc";
2434 };
2435 }
2436 {
2437 name = "console_browserify___console_browserify_1.2.0.tgz";
2438 path = fetchurl {
2439 name = "console_browserify___console_browserify_1.2.0.tgz";
2440 url = "https://registry.yarnpkg.com/console-browserify/-/console-browserify-1.2.0.tgz";
2441 sha1 = "67063cef57ceb6cf4993a2ab3a55840ae8c49336";
2442 };
2443 }
2444 {
2445 name = "consolidate___consolidate_0.15.1.tgz";
2446 path = fetchurl {
2447 name = "consolidate___consolidate_0.15.1.tgz";
2448 url = "https://registry.yarnpkg.com/consolidate/-/consolidate-0.15.1.tgz";
2449 sha1 = "21ab043235c71a07d45d9aad98593b0dba56bab7";
2450 };
2451 }
2452 {
2453 name = "constants_browserify___constants_browserify_1.0.0.tgz";
2454 path = fetchurl {
2455 name = "constants_browserify___constants_browserify_1.0.0.tgz";
2456 url = "https://registry.yarnpkg.com/constants-browserify/-/constants-browserify-1.0.0.tgz";
2457 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
2458 };
2459 }
2460 {
2461 name = "content_disposition___content_disposition_0.5.3.tgz";
2462 path = fetchurl {
2463 name = "content_disposition___content_disposition_0.5.3.tgz";
2464 url = "https://registry.yarnpkg.com/content-disposition/-/content-disposition-0.5.3.tgz";
2465 sha1 = "e130caf7e7279087c5616c2007d0485698984fbd";
2466 };
2467 }
2468 {
2469 name = "content_type___content_type_1.0.4.tgz";
2470 path = fetchurl {
2471 name = "content_type___content_type_1.0.4.tgz";
2472 url = "https://registry.yarnpkg.com/content-type/-/content-type-1.0.4.tgz";
2473 sha1 = "e138cc75e040c727b1966fe5e5f8c9aee256fe3b";
2474 };
2475 }
2476 {
2477 name = "convert_source_map___convert_source_map_1.7.0.tgz";
2478 path = fetchurl {
2479 name = "convert_source_map___convert_source_map_1.7.0.tgz";
2480 url = "https://registry.yarnpkg.com/convert-source-map/-/convert-source-map-1.7.0.tgz";
2481 sha1 = "17a2cb882d7f77d3490585e2ce6c524424a3a442";
2482 };
2483 }
2484 {
2485 name = "cookie_signature___cookie_signature_1.0.6.tgz";
2486 path = fetchurl {
2487 name = "cookie_signature___cookie_signature_1.0.6.tgz";
2488 url = "https://registry.yarnpkg.com/cookie-signature/-/cookie-signature-1.0.6.tgz";
2489 sha1 = "e303a882b342cc3ee8ca513a79999734dab3ae2c";
2490 };
2491 }
2492 {
2493 name = "cookie___cookie_0.4.0.tgz";
2494 path = fetchurl {
2495 name = "cookie___cookie_0.4.0.tgz";
2496 url = "https://registry.yarnpkg.com/cookie/-/cookie-0.4.0.tgz";
2497 sha1 = "beb437e7022b3b6d49019d088665303ebe9c14ba";
2498 };
2499 }
2500 {
2501 name = "copy_concurrently___copy_concurrently_1.0.5.tgz";
2502 path = fetchurl {
2503 name = "copy_concurrently___copy_concurrently_1.0.5.tgz";
2504 url = "https://registry.yarnpkg.com/copy-concurrently/-/copy-concurrently-1.0.5.tgz";
2505 sha1 = "92297398cae34937fcafd6ec8139c18051f0b5e0";
2506 };
2507 }
2508 {
2509 name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
2510 path = fetchurl {
2511 name = "copy_descriptor___copy_descriptor_0.1.1.tgz";
2512 url = "https://registry.yarnpkg.com/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
2513 sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
2514 };
2515 }
2516 {
2517 name = "copy_webpack_plugin___copy_webpack_plugin_5.1.1.tgz";
2518 path = fetchurl {
2519 name = "copy_webpack_plugin___copy_webpack_plugin_5.1.1.tgz";
2520 url = "https://registry.yarnpkg.com/copy-webpack-plugin/-/copy-webpack-plugin-5.1.1.tgz";
2521 sha1 = "5481a03dea1123d88a988c6ff8b78247214f0b88";
2522 };
2523 }
2524 {
2525 name = "core_js_compat___core_js_compat_3.6.5.tgz";
2526 path = fetchurl {
2527 name = "core_js_compat___core_js_compat_3.6.5.tgz";
2528 url = "https://registry.yarnpkg.com/core-js-compat/-/core-js-compat-3.6.5.tgz";
2529 sha1 = "2a51d9a4e25dfd6e690251aa81f99e3c05481f1c";
2530 };
2531 }
2532 {
2533 name = "core_js___core_js_2.6.11.tgz";
2534 path = fetchurl {
2535 name = "core_js___core_js_2.6.11.tgz";
2536 url = "https://registry.yarnpkg.com/core-js/-/core-js-2.6.11.tgz";
2537 sha1 = "38831469f9922bded8ee21c9dc46985e0399308c";
2538 };
2539 }
2540 {
2541 name = "core_js___core_js_3.6.5.tgz";
2542 path = fetchurl {
2543 name = "core_js___core_js_3.6.5.tgz";
2544 url = "https://registry.yarnpkg.com/core-js/-/core-js-3.6.5.tgz";
2545 sha1 = "7395dc273af37fb2e50e9bd3d9fe841285231d1a";
2546 };
2547 }
2548 {
2549 name = "core_util_is___core_util_is_1.0.2.tgz";
2550 path = fetchurl {
2551 name = "core_util_is___core_util_is_1.0.2.tgz";
2552 url = "https://registry.yarnpkg.com/core-util-is/-/core-util-is-1.0.2.tgz";
2553 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
2554 };
2555 }
2556 {
2557 name = "cosmiconfig___cosmiconfig_5.2.1.tgz";
2558 path = fetchurl {
2559 name = "cosmiconfig___cosmiconfig_5.2.1.tgz";
2560 url = "https://registry.yarnpkg.com/cosmiconfig/-/cosmiconfig-5.2.1.tgz";
2561 sha1 = "040f726809c591e77a17c0a3626ca45b4f168b1a";
2562 };
2563 }
2564 {
2565 name = "create_ecdh___create_ecdh_4.0.3.tgz";
2566 path = fetchurl {
2567 name = "create_ecdh___create_ecdh_4.0.3.tgz";
2568 url = "https://registry.yarnpkg.com/create-ecdh/-/create-ecdh-4.0.3.tgz";
2569 sha1 = "c9111b6f33045c4697f144787f9254cdc77c45ff";
2570 };
2571 }
2572 {
2573 name = "create_hash___create_hash_1.2.0.tgz";
2574 path = fetchurl {
2575 name = "create_hash___create_hash_1.2.0.tgz";
2576 url = "https://registry.yarnpkg.com/create-hash/-/create-hash-1.2.0.tgz";
2577 sha1 = "889078af11a63756bcfb59bd221996be3a9ef196";
2578 };
2579 }
2580 {
2581 name = "create_hmac___create_hmac_1.1.7.tgz";
2582 path = fetchurl {
2583 name = "create_hmac___create_hmac_1.1.7.tgz";
2584 url = "https://registry.yarnpkg.com/create-hmac/-/create-hmac-1.1.7.tgz";
2585 sha1 = "69170c78b3ab957147b2b8b04572e47ead2243ff";
2586 };
2587 }
2588 {
2589 name = "cross_spawn___cross_spawn_5.1.0.tgz";
2590 path = fetchurl {
2591 name = "cross_spawn___cross_spawn_5.1.0.tgz";
2592 url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-5.1.0.tgz";
2593 sha1 = "e8bd0efee58fcff6f8f94510a0a554bbfa235449";
2594 };
2595 }
2596 {
2597 name = "cross_spawn___cross_spawn_6.0.5.tgz";
2598 path = fetchurl {
2599 name = "cross_spawn___cross_spawn_6.0.5.tgz";
2600 url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-6.0.5.tgz";
2601 sha1 = "4a5ec7c64dfae22c3a14124dbacdee846d80cbc4";
2602 };
2603 }
2604 {
2605 name = "cross_spawn___cross_spawn_7.0.3.tgz";
2606 path = fetchurl {
2607 name = "cross_spawn___cross_spawn_7.0.3.tgz";
2608 url = "https://registry.yarnpkg.com/cross-spawn/-/cross-spawn-7.0.3.tgz";
2609 sha1 = "f73a85b9d5d41d045551c177e2882d4ac85728a6";
2610 };
2611 }
2612 {
2613 name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
2614 path = fetchurl {
2615 name = "crypto_browserify___crypto_browserify_3.12.0.tgz";
2616 url = "https://registry.yarnpkg.com/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
2617 sha1 = "396cf9f3137f03e4b8e532c58f698254e00f80ec";
2618 };
2619 }
2620 {
2621 name = "css_color_names___css_color_names_0.0.4.tgz";
2622 path = fetchurl {
2623 name = "css_color_names___css_color_names_0.0.4.tgz";
2624 url = "https://registry.yarnpkg.com/css-color-names/-/css-color-names-0.0.4.tgz";
2625 sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
2626 };
2627 }
2628 {
2629 name = "css_declaration_sorter___css_declaration_sorter_4.0.1.tgz";
2630 path = fetchurl {
2631 name = "css_declaration_sorter___css_declaration_sorter_4.0.1.tgz";
2632 url = "https://registry.yarnpkg.com/css-declaration-sorter/-/css-declaration-sorter-4.0.1.tgz";
2633 sha1 = "c198940f63a76d7e36c1e71018b001721054cb22";
2634 };
2635 }
2636 {
2637 name = "css_loader___css_loader_3.5.3.tgz";
2638 path = fetchurl {
2639 name = "css_loader___css_loader_3.5.3.tgz";
2640 url = "https://registry.yarnpkg.com/css-loader/-/css-loader-3.5.3.tgz";
2641 sha1 = "95ac16468e1adcd95c844729e0bb167639eb0bcf";
2642 };
2643 }
2644 {
2645 name = "css_select_base_adapter___css_select_base_adapter_0.1.1.tgz";
2646 path = fetchurl {
2647 name = "css_select_base_adapter___css_select_base_adapter_0.1.1.tgz";
2648 url = "https://registry.yarnpkg.com/css-select-base-adapter/-/css-select-base-adapter-0.1.1.tgz";
2649 sha1 = "3b2ff4972cc362ab88561507a95408a1432135d7";
2650 };
2651 }
2652 {
2653 name = "css_select___css_select_1.2.0.tgz";
2654 path = fetchurl {
2655 name = "css_select___css_select_1.2.0.tgz";
2656 url = "https://registry.yarnpkg.com/css-select/-/css-select-1.2.0.tgz";
2657 sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
2658 };
2659 }
2660 {
2661 name = "css_select___css_select_2.1.0.tgz";
2662 path = fetchurl {
2663 name = "css_select___css_select_2.1.0.tgz";
2664 url = "https://registry.yarnpkg.com/css-select/-/css-select-2.1.0.tgz";
2665 sha1 = "6a34653356635934a81baca68d0255432105dbef";
2666 };
2667 }
2668 {
2669 name = "css_tree___css_tree_1.0.0_alpha.37.tgz";
2670 path = fetchurl {
2671 name = "css_tree___css_tree_1.0.0_alpha.37.tgz";
2672 url = "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.37.tgz";
2673 sha1 = "98bebd62c4c1d9f960ec340cf9f7522e30709a22";
2674 };
2675 }
2676 {
2677 name = "css_tree___css_tree_1.0.0_alpha.39.tgz";
2678 path = fetchurl {
2679 name = "css_tree___css_tree_1.0.0_alpha.39.tgz";
2680 url = "https://registry.yarnpkg.com/css-tree/-/css-tree-1.0.0-alpha.39.tgz";
2681 sha1 = "2bff3ffe1bb3f776cf7eefd91ee5cba77a149eeb";
2682 };
2683 }
2684 {
2685 name = "css_what___css_what_2.1.3.tgz";
2686 path = fetchurl {
2687 name = "css_what___css_what_2.1.3.tgz";
2688 url = "https://registry.yarnpkg.com/css-what/-/css-what-2.1.3.tgz";
2689 sha1 = "a6d7604573365fe74686c3f311c56513d88285f2";
2690 };
2691 }
2692 {
2693 name = "css_what___css_what_3.3.0.tgz";
2694 path = fetchurl {
2695 name = "css_what___css_what_3.3.0.tgz";
2696 url = "https://registry.yarnpkg.com/css-what/-/css-what-3.3.0.tgz";
2697 sha1 = "10fec696a9ece2e591ac772d759aacabac38cd39";
2698 };
2699 }
2700 {
2701 name = "cssesc___cssesc_3.0.0.tgz";
2702 path = fetchurl {
2703 name = "cssesc___cssesc_3.0.0.tgz";
2704 url = "https://registry.yarnpkg.com/cssesc/-/cssesc-3.0.0.tgz";
2705 sha1 = "37741919903b868565e1c09ea747445cd18983ee";
2706 };
2707 }
2708 {
2709 name = "cssnano_preset_default___cssnano_preset_default_4.0.7.tgz";
2710 path = fetchurl {
2711 name = "cssnano_preset_default___cssnano_preset_default_4.0.7.tgz";
2712 url = "https://registry.yarnpkg.com/cssnano-preset-default/-/cssnano-preset-default-4.0.7.tgz";
2713 sha1 = "51ec662ccfca0f88b396dcd9679cdb931be17f76";
2714 };
2715 }
2716 {
2717 name = "cssnano_util_get_arguments___cssnano_util_get_arguments_4.0.0.tgz";
2718 path = fetchurl {
2719 name = "cssnano_util_get_arguments___cssnano_util_get_arguments_4.0.0.tgz";
2720 url = "https://registry.yarnpkg.com/cssnano-util-get-arguments/-/cssnano-util-get-arguments-4.0.0.tgz";
2721 sha1 = "ed3a08299f21d75741b20f3b81f194ed49cc150f";
2722 };
2723 }
2724 {
2725 name = "cssnano_util_get_match___cssnano_util_get_match_4.0.0.tgz";
2726 path = fetchurl {
2727 name = "cssnano_util_get_match___cssnano_util_get_match_4.0.0.tgz";
2728 url = "https://registry.yarnpkg.com/cssnano-util-get-match/-/cssnano-util-get-match-4.0.0.tgz";
2729 sha1 = "c0e4ca07f5386bb17ec5e52250b4f5961365156d";
2730 };
2731 }
2732 {
2733 name = "cssnano_util_raw_cache___cssnano_util_raw_cache_4.0.1.tgz";
2734 path = fetchurl {
2735 name = "cssnano_util_raw_cache___cssnano_util_raw_cache_4.0.1.tgz";
2736 url = "https://registry.yarnpkg.com/cssnano-util-raw-cache/-/cssnano-util-raw-cache-4.0.1.tgz";
2737 sha1 = "b26d5fd5f72a11dfe7a7846fb4c67260f96bf282";
2738 };
2739 }
2740 {
2741 name = "cssnano_util_same_parent___cssnano_util_same_parent_4.0.1.tgz";
2742 path = fetchurl {
2743 name = "cssnano_util_same_parent___cssnano_util_same_parent_4.0.1.tgz";
2744 url = "https://registry.yarnpkg.com/cssnano-util-same-parent/-/cssnano-util-same-parent-4.0.1.tgz";
2745 sha1 = "574082fb2859d2db433855835d9a8456ea18bbf3";
2746 };
2747 }
2748 {
2749 name = "cssnano___cssnano_4.1.10.tgz";
2750 path = fetchurl {
2751 name = "cssnano___cssnano_4.1.10.tgz";
2752 url = "https://registry.yarnpkg.com/cssnano/-/cssnano-4.1.10.tgz";
2753 sha1 = "0ac41f0b13d13d465487e111b778d42da631b8b2";
2754 };
2755 }
2756 {
2757 name = "csso___csso_4.0.3.tgz";
2758 path = fetchurl {
2759 name = "csso___csso_4.0.3.tgz";
2760 url = "https://registry.yarnpkg.com/csso/-/csso-4.0.3.tgz";
2761 sha1 = "0d9985dc852c7cc2b2cacfbbe1079014d1a8e903";
2762 };
2763 }
2764 {
2765 name = "cyclist___cyclist_1.0.1.tgz";
2766 path = fetchurl {
2767 name = "cyclist___cyclist_1.0.1.tgz";
2768 url = "https://registry.yarnpkg.com/cyclist/-/cyclist-1.0.1.tgz";
2769 sha1 = "596e9698fd0c80e12038c2b82d6eb1b35b6224d9";
2770 };
2771 }
2772 {
2773 name = "dashdash___dashdash_1.14.1.tgz";
2774 path = fetchurl {
2775 name = "dashdash___dashdash_1.14.1.tgz";
2776 url = "https://registry.yarnpkg.com/dashdash/-/dashdash-1.14.1.tgz";
2777 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
2778 };
2779 }
2780 {
2781 name = "de_indent___de_indent_1.0.2.tgz";
2782 path = fetchurl {
2783 name = "de_indent___de_indent_1.0.2.tgz";
2784 url = "https://registry.yarnpkg.com/de-indent/-/de-indent-1.0.2.tgz";
2785 sha1 = "b2038e846dc33baa5796128d0804b455b8c1e21d";
2786 };
2787 }
2788 {
2789 name = "debug___debug_2.6.9.tgz";
2790 path = fetchurl {
2791 name = "debug___debug_2.6.9.tgz";
2792 url = "https://registry.yarnpkg.com/debug/-/debug-2.6.9.tgz";
2793 sha1 = "5d128515df134ff327e90a4c93f4e077a536341f";
2794 };
2795 }
2796 {
2797 name = "debug___debug_3.2.6.tgz";
2798 path = fetchurl {
2799 name = "debug___debug_3.2.6.tgz";
2800 url = "https://registry.yarnpkg.com/debug/-/debug-3.2.6.tgz";
2801 sha1 = "e83d17de16d8a7efb7717edbe5fb10135eee629b";
2802 };
2803 }
2804 {
2805 name = "debug___debug_4.1.1.tgz";
2806 path = fetchurl {
2807 name = "debug___debug_4.1.1.tgz";
2808 url = "https://registry.yarnpkg.com/debug/-/debug-4.1.1.tgz";
2809 sha1 = "3b72260255109c6b589cee050f1d516139664791";
2810 };
2811 }
2812 {
2813 name = "decamelize___decamelize_1.2.0.tgz";
2814 path = fetchurl {
2815 name = "decamelize___decamelize_1.2.0.tgz";
2816 url = "https://registry.yarnpkg.com/decamelize/-/decamelize-1.2.0.tgz";
2817 sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
2818 };
2819 }
2820 {
2821 name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
2822 path = fetchurl {
2823 name = "decode_uri_component___decode_uri_component_0.2.0.tgz";
2824 url = "https://registry.yarnpkg.com/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
2825 sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
2826 };
2827 }
2828 {
2829 name = "deep_equal___deep_equal_1.1.1.tgz";
2830 path = fetchurl {
2831 name = "deep_equal___deep_equal_1.1.1.tgz";
2832 url = "https://registry.yarnpkg.com/deep-equal/-/deep-equal-1.1.1.tgz";
2833 sha1 = "b5c98c942ceffaf7cb051e24e1434a25a2e6076a";
2834 };
2835 }
2836 {
2837 name = "deep_is___deep_is_0.1.3.tgz";
2838 path = fetchurl {
2839 name = "deep_is___deep_is_0.1.3.tgz";
2840 url = "https://registry.yarnpkg.com/deep-is/-/deep-is-0.1.3.tgz";
2841 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
2842 };
2843 }
2844 {
2845 name = "deepmerge___deepmerge_1.5.2.tgz";
2846 path = fetchurl {
2847 name = "deepmerge___deepmerge_1.5.2.tgz";
2848 url = "https://registry.yarnpkg.com/deepmerge/-/deepmerge-1.5.2.tgz";
2849 sha1 = "10499d868844cdad4fee0842df8c7f6f0c95a753";
2850 };
2851 }
2852 {
2853 name = "default_gateway___default_gateway_4.2.0.tgz";
2854 path = fetchurl {
2855 name = "default_gateway___default_gateway_4.2.0.tgz";
2856 url = "https://registry.yarnpkg.com/default-gateway/-/default-gateway-4.2.0.tgz";
2857 sha1 = "167104c7500c2115f6dd69b0a536bb8ed720552b";
2858 };
2859 }
2860 {
2861 name = "default_gateway___default_gateway_5.0.5.tgz";
2862 path = fetchurl {
2863 name = "default_gateway___default_gateway_5.0.5.tgz";
2864 url = "https://registry.yarnpkg.com/default-gateway/-/default-gateway-5.0.5.tgz";
2865 sha1 = "4fd6bd5d2855d39b34cc5a59505486e9aafc9b10";
2866 };
2867 }
2868 {
2869 name = "defaults___defaults_1.0.3.tgz";
2870 path = fetchurl {
2871 name = "defaults___defaults_1.0.3.tgz";
2872 url = "https://registry.yarnpkg.com/defaults/-/defaults-1.0.3.tgz";
2873 sha1 = "c656051e9817d9ff08ed881477f3fe4019f3ef7d";
2874 };
2875 }
2876 {
2877 name = "define_properties___define_properties_1.1.3.tgz";
2878 path = fetchurl {
2879 name = "define_properties___define_properties_1.1.3.tgz";
2880 url = "https://registry.yarnpkg.com/define-properties/-/define-properties-1.1.3.tgz";
2881 sha1 = "cf88da6cbee26fe6db7094f61d870cbd84cee9f1";
2882 };
2883 }
2884 {
2885 name = "define_property___define_property_0.2.5.tgz";
2886 path = fetchurl {
2887 name = "define_property___define_property_0.2.5.tgz";
2888 url = "https://registry.yarnpkg.com/define-property/-/define-property-0.2.5.tgz";
2889 sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
2890 };
2891 }
2892 {
2893 name = "define_property___define_property_1.0.0.tgz";
2894 path = fetchurl {
2895 name = "define_property___define_property_1.0.0.tgz";
2896 url = "https://registry.yarnpkg.com/define-property/-/define-property-1.0.0.tgz";
2897 sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
2898 };
2899 }
2900 {
2901 name = "define_property___define_property_2.0.2.tgz";
2902 path = fetchurl {
2903 name = "define_property___define_property_2.0.2.tgz";
2904 url = "https://registry.yarnpkg.com/define-property/-/define-property-2.0.2.tgz";
2905 sha1 = "d459689e8d654ba77e02a817f8710d702cb16e9d";
2906 };
2907 }
2908 {
2909 name = "del___del_4.1.1.tgz";
2910 path = fetchurl {
2911 name = "del___del_4.1.1.tgz";
2912 url = "https://registry.yarnpkg.com/del/-/del-4.1.1.tgz";
2913 sha1 = "9e8f117222ea44a31ff3a156c049b99052a9f0b4";
2914 };
2915 }
2916 {
2917 name = "delayed_stream___delayed_stream_1.0.0.tgz";
2918 path = fetchurl {
2919 name = "delayed_stream___delayed_stream_1.0.0.tgz";
2920 url = "https://registry.yarnpkg.com/delayed-stream/-/delayed-stream-1.0.0.tgz";
2921 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
2922 };
2923 }
2924 {
2925 name = "depd___depd_1.1.2.tgz";
2926 path = fetchurl {
2927 name = "depd___depd_1.1.2.tgz";
2928 url = "https://registry.yarnpkg.com/depd/-/depd-1.1.2.tgz";
2929 sha1 = "9bcd52e14c097763e749b274c4346ed2e560b5a9";
2930 };
2931 }
2932 {
2933 name = "des.js___des.js_1.0.1.tgz";
2934 path = fetchurl {
2935 name = "des.js___des.js_1.0.1.tgz";
2936 url = "https://registry.yarnpkg.com/des.js/-/des.js-1.0.1.tgz";
2937 sha1 = "5382142e1bdc53f85d86d53e5f4aa7deb91e0843";
2938 };
2939 }
2940 {
2941 name = "destroy___destroy_1.0.4.tgz";
2942 path = fetchurl {
2943 name = "destroy___destroy_1.0.4.tgz";
2944 url = "https://registry.yarnpkg.com/destroy/-/destroy-1.0.4.tgz";
2945 sha1 = "978857442c44749e4206613e37946205826abd80";
2946 };
2947 }
2948 {
2949 name = "detect_node___detect_node_2.0.4.tgz";
2950 path = fetchurl {
2951 name = "detect_node___detect_node_2.0.4.tgz";
2952 url = "https://registry.yarnpkg.com/detect-node/-/detect-node-2.0.4.tgz";
2953 sha1 = "014ee8f8f669c5c58023da64b8179c083a28c46c";
2954 };
2955 }
2956 {
2957 name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
2958 path = fetchurl {
2959 name = "diffie_hellman___diffie_hellman_5.0.3.tgz";
2960 url = "https://registry.yarnpkg.com/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
2961 sha1 = "40e8ee98f55a2149607146921c63e1ae5f3d2875";
2962 };
2963 }
2964 {
2965 name = "dir_glob___dir_glob_2.2.2.tgz";
2966 path = fetchurl {
2967 name = "dir_glob___dir_glob_2.2.2.tgz";
2968 url = "https://registry.yarnpkg.com/dir-glob/-/dir-glob-2.2.2.tgz";
2969 sha1 = "fa09f0694153c8918b18ba0deafae94769fc50c4";
2970 };
2971 }
2972 {
2973 name = "dns_equal___dns_equal_1.0.0.tgz";
2974 path = fetchurl {
2975 name = "dns_equal___dns_equal_1.0.0.tgz";
2976 url = "https://registry.yarnpkg.com/dns-equal/-/dns-equal-1.0.0.tgz";
2977 sha1 = "b39e7f1da6eb0a75ba9c17324b34753c47e0654d";
2978 };
2979 }
2980 {
2981 name = "dns_packet___dns_packet_1.3.1.tgz";
2982 path = fetchurl {
2983 name = "dns_packet___dns_packet_1.3.1.tgz";
2984 url = "https://registry.yarnpkg.com/dns-packet/-/dns-packet-1.3.1.tgz";
2985 sha1 = "12aa426981075be500b910eedcd0b47dd7deda5a";
2986 };
2987 }
2988 {
2989 name = "dns_txt___dns_txt_2.0.2.tgz";
2990 path = fetchurl {
2991 name = "dns_txt___dns_txt_2.0.2.tgz";
2992 url = "https://registry.yarnpkg.com/dns-txt/-/dns-txt-2.0.2.tgz";
2993 sha1 = "b91d806f5d27188e4ab3e7d107d881a1cc4642b6";
2994 };
2995 }
2996 {
2997 name = "doctrine___doctrine_3.0.0.tgz";
2998 path = fetchurl {
2999 name = "doctrine___doctrine_3.0.0.tgz";
3000 url = "https://registry.yarnpkg.com/doctrine/-/doctrine-3.0.0.tgz";
3001 sha1 = "addebead72a6574db783639dc87a121773973961";
3002 };
3003 }
3004 {
3005 name = "dom_converter___dom_converter_0.2.0.tgz";
3006 path = fetchurl {
3007 name = "dom_converter___dom_converter_0.2.0.tgz";
3008 url = "https://registry.yarnpkg.com/dom-converter/-/dom-converter-0.2.0.tgz";
3009 sha1 = "6721a9daee2e293682955b6afe416771627bb768";
3010 };
3011 }
3012 {
3013 name = "dom_serializer___dom_serializer_0.2.2.tgz";
3014 path = fetchurl {
3015 name = "dom_serializer___dom_serializer_0.2.2.tgz";
3016 url = "https://registry.yarnpkg.com/dom-serializer/-/dom-serializer-0.2.2.tgz";
3017 sha1 = "1afb81f533717175d478655debc5e332d9f9bb51";
3018 };
3019 }
3020 {
3021 name = "domain_browser___domain_browser_1.2.0.tgz";
3022 path = fetchurl {
3023 name = "domain_browser___domain_browser_1.2.0.tgz";
3024 url = "https://registry.yarnpkg.com/domain-browser/-/domain-browser-1.2.0.tgz";
3025 sha1 = "3d31f50191a6749dd1375a7f522e823d42e54eda";
3026 };
3027 }
3028 {
3029 name = "domelementtype___domelementtype_1.3.1.tgz";
3030 path = fetchurl {
3031 name = "domelementtype___domelementtype_1.3.1.tgz";
3032 url = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-1.3.1.tgz";
3033 sha1 = "d048c44b37b0d10a7f2a3d5fee3f4333d790481f";
3034 };
3035 }
3036 {
3037 name = "domelementtype___domelementtype_2.0.1.tgz";
3038 path = fetchurl {
3039 name = "domelementtype___domelementtype_2.0.1.tgz";
3040 url = "https://registry.yarnpkg.com/domelementtype/-/domelementtype-2.0.1.tgz";
3041 sha1 = "1f8bdfe91f5a78063274e803b4bdcedf6e94f94d";
3042 };
3043 }
3044 {
3045 name = "domhandler___domhandler_2.4.2.tgz";
3046 path = fetchurl {
3047 name = "domhandler___domhandler_2.4.2.tgz";
3048 url = "https://registry.yarnpkg.com/domhandler/-/domhandler-2.4.2.tgz";
3049 sha1 = "8805097e933d65e85546f726d60f5eb88b44f803";
3050 };
3051 }
3052 {
3053 name = "domutils___domutils_1.5.1.tgz";
3054 path = fetchurl {
3055 name = "domutils___domutils_1.5.1.tgz";
3056 url = "https://registry.yarnpkg.com/domutils/-/domutils-1.5.1.tgz";
3057 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
3058 };
3059 }
3060 {
3061 name = "domutils___domutils_1.7.0.tgz";
3062 path = fetchurl {
3063 name = "domutils___domutils_1.7.0.tgz";
3064 url = "https://registry.yarnpkg.com/domutils/-/domutils-1.7.0.tgz";
3065 sha1 = "56ea341e834e06e6748af7a1cb25da67ea9f8c2a";
3066 };
3067 }
3068 {
3069 name = "dot_prop___dot_prop_5.2.0.tgz";
3070 path = fetchurl {
3071 name = "dot_prop___dot_prop_5.2.0.tgz";
3072 url = "https://registry.yarnpkg.com/dot-prop/-/dot-prop-5.2.0.tgz";
3073 sha1 = "c34ecc29556dc45f1f4c22697b6f4904e0cc4fcb";
3074 };
3075 }
3076 {
3077 name = "dotenv_expand___dotenv_expand_5.1.0.tgz";
3078 path = fetchurl {
3079 name = "dotenv_expand___dotenv_expand_5.1.0.tgz";
3080 url = "https://registry.yarnpkg.com/dotenv-expand/-/dotenv-expand-5.1.0.tgz";
3081 sha1 = "3fbaf020bfd794884072ea26b1e9791d45a629f0";
3082 };
3083 }
3084 {
3085 name = "dotenv___dotenv_8.2.0.tgz";
3086 path = fetchurl {
3087 name = "dotenv___dotenv_8.2.0.tgz";
3088 url = "https://registry.yarnpkg.com/dotenv/-/dotenv-8.2.0.tgz";
3089 sha1 = "97e619259ada750eea3e4ea3e26bceea5424b16a";
3090 };
3091 }
3092 {
3093 name = "duplexer___duplexer_0.1.1.tgz";
3094 path = fetchurl {
3095 name = "duplexer___duplexer_0.1.1.tgz";
3096 url = "https://registry.yarnpkg.com/duplexer/-/duplexer-0.1.1.tgz";
3097 sha1 = "ace6ff808c1ce66b57d1ebf97977acb02334cfc1";
3098 };
3099 }
3100 {
3101 name = "duplexify___duplexify_3.7.1.tgz";
3102 path = fetchurl {
3103 name = "duplexify___duplexify_3.7.1.tgz";
3104 url = "https://registry.yarnpkg.com/duplexify/-/duplexify-3.7.1.tgz";
3105 sha1 = "2a4df5317f6ccfd91f86d6fd25d8d8a103b88309";
3106 };
3107 }
3108 {
3109 name = "easy_stack___easy_stack_1.0.0.tgz";
3110 path = fetchurl {
3111 name = "easy_stack___easy_stack_1.0.0.tgz";
3112 url = "https://registry.yarnpkg.com/easy-stack/-/easy-stack-1.0.0.tgz";
3113 sha1 = "12c91b3085a37f0baa336e9486eac4bf94e3e788";
3114 };
3115 }
3116 {
3117 name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
3118 path = fetchurl {
3119 name = "ecc_jsbn___ecc_jsbn_0.1.2.tgz";
3120 url = "https://registry.yarnpkg.com/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
3121 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
3122 };
3123 }
3124 {
3125 name = "ee_first___ee_first_1.1.1.tgz";
3126 path = fetchurl {
3127 name = "ee_first___ee_first_1.1.1.tgz";
3128 url = "https://registry.yarnpkg.com/ee-first/-/ee-first-1.1.1.tgz";
3129 sha1 = "590c61156b0ae2f4f0255732a158b266bc56b21d";
3130 };
3131 }
3132 {
3133 name = "ejs___ejs_2.7.4.tgz";
3134 path = fetchurl {
3135 name = "ejs___ejs_2.7.4.tgz";
3136 url = "https://registry.yarnpkg.com/ejs/-/ejs-2.7.4.tgz";
3137 sha1 = "48661287573dcc53e366c7a1ae52c3a120eec9ba";
3138 };
3139 }
3140 {
3141 name = "electron_to_chromium___electron_to_chromium_1.3.464.tgz";
3142 path = fetchurl {
3143 name = "electron_to_chromium___electron_to_chromium_1.3.464.tgz";
3144 url = "https://registry.yarnpkg.com/electron-to-chromium/-/electron-to-chromium-1.3.464.tgz";
3145 sha1 = "fe13feaa08f6f865d3c89d5d72e54c194f463aa5";
3146 };
3147 }
3148 {
3149 name = "elliptic___elliptic_6.5.2.tgz";
3150 path = fetchurl {
3151 name = "elliptic___elliptic_6.5.2.tgz";
3152 url = "https://registry.yarnpkg.com/elliptic/-/elliptic-6.5.2.tgz";
3153 sha1 = "05c5678d7173c049d8ca433552224a495d0e3762";
3154 };
3155 }
3156 {
3157 name = "emoji_regex___emoji_regex_7.0.3.tgz";
3158 path = fetchurl {
3159 name = "emoji_regex___emoji_regex_7.0.3.tgz";
3160 url = "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-7.0.3.tgz";
3161 sha1 = "933a04052860c85e83c122479c4748a8e4c72156";
3162 };
3163 }
3164 {
3165 name = "emoji_regex___emoji_regex_8.0.0.tgz";
3166 path = fetchurl {
3167 name = "emoji_regex___emoji_regex_8.0.0.tgz";
3168 url = "https://registry.yarnpkg.com/emoji-regex/-/emoji-regex-8.0.0.tgz";
3169 sha1 = "e818fd69ce5ccfcb404594f842963bf53164cc37";
3170 };
3171 }
3172 {
3173 name = "emojis_list___emojis_list_2.1.0.tgz";
3174 path = fetchurl {
3175 name = "emojis_list___emojis_list_2.1.0.tgz";
3176 url = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-2.1.0.tgz";
3177 sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
3178 };
3179 }
3180 {
3181 name = "emojis_list___emojis_list_3.0.0.tgz";
3182 path = fetchurl {
3183 name = "emojis_list___emojis_list_3.0.0.tgz";
3184 url = "https://registry.yarnpkg.com/emojis-list/-/emojis-list-3.0.0.tgz";
3185 sha1 = "5570662046ad29e2e916e71aae260abdff4f6a78";
3186 };
3187 }
3188 {
3189 name = "encodeurl___encodeurl_1.0.2.tgz";
3190 path = fetchurl {
3191 name = "encodeurl___encodeurl_1.0.2.tgz";
3192 url = "https://registry.yarnpkg.com/encodeurl/-/encodeurl-1.0.2.tgz";
3193 sha1 = "ad3ff4c86ec2d029322f5a02c3a9a606c95b3f59";
3194 };
3195 }
3196 {
3197 name = "end_of_stream___end_of_stream_1.4.4.tgz";
3198 path = fetchurl {
3199 name = "end_of_stream___end_of_stream_1.4.4.tgz";
3200 url = "https://registry.yarnpkg.com/end-of-stream/-/end-of-stream-1.4.4.tgz";
3201 sha1 = "5ae64a5f45057baf3626ec14da0ca5e4b2431eb0";
3202 };
3203 }
3204 {
3205 name = "enhanced_resolve___enhanced_resolve_4.1.1.tgz";
3206 path = fetchurl {
3207 name = "enhanced_resolve___enhanced_resolve_4.1.1.tgz";
3208 url = "https://registry.yarnpkg.com/enhanced-resolve/-/enhanced-resolve-4.1.1.tgz";
3209 sha1 = "2937e2b8066cd0fe7ce0990a98f0d71a35189f66";
3210 };
3211 }
3212 {
3213 name = "entities___entities_1.1.2.tgz";
3214 path = fetchurl {
3215 name = "entities___entities_1.1.2.tgz";
3216 url = "https://registry.yarnpkg.com/entities/-/entities-1.1.2.tgz";
3217 sha1 = "bdfa735299664dfafd34529ed4f8522a275fea56";
3218 };
3219 }
3220 {
3221 name = "entities___entities_2.0.3.tgz";
3222 path = fetchurl {
3223 name = "entities___entities_2.0.3.tgz";
3224 url = "https://registry.yarnpkg.com/entities/-/entities-2.0.3.tgz";
3225 sha1 = "5c487e5742ab93c15abb5da22759b8590ec03b7f";
3226 };
3227 }
3228 {
3229 name = "errno___errno_0.1.7.tgz";
3230 path = fetchurl {
3231 name = "errno___errno_0.1.7.tgz";
3232 url = "https://registry.yarnpkg.com/errno/-/errno-0.1.7.tgz";
3233 sha1 = "4684d71779ad39af177e3f007996f7c67c852618";
3234 };
3235 }
3236 {
3237 name = "error_ex___error_ex_1.3.2.tgz";
3238 path = fetchurl {
3239 name = "error_ex___error_ex_1.3.2.tgz";
3240 url = "https://registry.yarnpkg.com/error-ex/-/error-ex-1.3.2.tgz";
3241 sha1 = "b4ac40648107fdcdcfae242f428bea8a14d4f1bf";
3242 };
3243 }
3244 {
3245 name = "error_stack_parser___error_stack_parser_2.0.6.tgz";
3246 path = fetchurl {
3247 name = "error_stack_parser___error_stack_parser_2.0.6.tgz";
3248 url = "https://registry.yarnpkg.com/error-stack-parser/-/error-stack-parser-2.0.6.tgz";
3249 sha1 = "5a99a707bd7a4c58a797902d48d82803ede6aad8";
3250 };
3251 }
3252 {
3253 name = "es_abstract___es_abstract_1.17.5.tgz";
3254 path = fetchurl {
3255 name = "es_abstract___es_abstract_1.17.5.tgz";
3256 url = "https://registry.yarnpkg.com/es-abstract/-/es-abstract-1.17.5.tgz";
3257 sha1 = "d8c9d1d66c8981fb9200e2251d799eee92774ae9";
3258 };
3259 }
3260 {
3261 name = "es_to_primitive___es_to_primitive_1.2.1.tgz";
3262 path = fetchurl {
3263 name = "es_to_primitive___es_to_primitive_1.2.1.tgz";
3264 url = "https://registry.yarnpkg.com/es-to-primitive/-/es-to-primitive-1.2.1.tgz";
3265 sha1 = "e55cd4c9cdc188bcefb03b366c736323fc5c898a";
3266 };
3267 }
3268 {
3269 name = "escape_html___escape_html_1.0.3.tgz";
3270 path = fetchurl {
3271 name = "escape_html___escape_html_1.0.3.tgz";
3272 url = "https://registry.yarnpkg.com/escape-html/-/escape-html-1.0.3.tgz";
3273 sha1 = "0258eae4d3d0c0974de1c169188ef0051d1d1988";
3274 };
3275 }
3276 {
3277 name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
3278 path = fetchurl {
3279 name = "escape_string_regexp___escape_string_regexp_1.0.5.tgz";
3280 url = "https://registry.yarnpkg.com/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
3281 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
3282 };
3283 }
3284 {
3285 name = "eslint_config_prettier___eslint_config_prettier_6.11.0.tgz";
3286 path = fetchurl {
3287 name = "eslint_config_prettier___eslint_config_prettier_6.11.0.tgz";
3288 url = "https://registry.yarnpkg.com/eslint-config-prettier/-/eslint-config-prettier-6.11.0.tgz";
3289 sha1 = "f6d2238c1290d01c859a8b5c1f7d352a0b0da8b1";
3290 };
3291 }
3292 {
3293 name = "eslint_loader___eslint_loader_2.2.1.tgz";
3294 path = fetchurl {
3295 name = "eslint_loader___eslint_loader_2.2.1.tgz";
3296 url = "https://registry.yarnpkg.com/eslint-loader/-/eslint-loader-2.2.1.tgz";
3297 sha1 = "28b9c12da54057af0845e2a6112701a2f6bf8337";
3298 };
3299 }
3300 {
3301 name = "eslint_plugin_prettier___eslint_plugin_prettier_3.1.3.tgz";
3302 path = fetchurl {
3303 name = "eslint_plugin_prettier___eslint_plugin_prettier_3.1.3.tgz";
3304 url = "https://registry.yarnpkg.com/eslint-plugin-prettier/-/eslint-plugin-prettier-3.1.3.tgz";
3305 sha1 = "ae116a0fc0e598fdae48743a4430903de5b4e6ca";
3306 };
3307 }
3308 {
3309 name = "eslint_plugin_vue___eslint_plugin_vue_6.2.2.tgz";
3310 path = fetchurl {
3311 name = "eslint_plugin_vue___eslint_plugin_vue_6.2.2.tgz";
3312 url = "https://registry.yarnpkg.com/eslint-plugin-vue/-/eslint-plugin-vue-6.2.2.tgz";
3313 sha1 = "27fecd9a3a24789b0f111ecdd540a9e56198e0fe";
3314 };
3315 }
3316 {
3317 name = "eslint_scope___eslint_scope_4.0.3.tgz";
3318 path = fetchurl {
3319 name = "eslint_scope___eslint_scope_4.0.3.tgz";
3320 url = "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-4.0.3.tgz";
3321 sha1 = "ca03833310f6889a3264781aa82e63eb9cfe7848";
3322 };
3323 }
3324 {
3325 name = "eslint_scope___eslint_scope_5.1.0.tgz";
3326 path = fetchurl {
3327 name = "eslint_scope___eslint_scope_5.1.0.tgz";
3328 url = "https://registry.yarnpkg.com/eslint-scope/-/eslint-scope-5.1.0.tgz";
3329 sha1 = "d0f971dfe59c69e0cada684b23d49dbf82600ce5";
3330 };
3331 }
3332 {
3333 name = "eslint_utils___eslint_utils_2.0.0.tgz";
3334 path = fetchurl {
3335 name = "eslint_utils___eslint_utils_2.0.0.tgz";
3336 url = "https://registry.yarnpkg.com/eslint-utils/-/eslint-utils-2.0.0.tgz";
3337 sha1 = "7be1cc70f27a72a76cd14aa698bcabed6890e1cd";
3338 };
3339 }
3340 {
3341 name = "eslint_visitor_keys___eslint_visitor_keys_1.2.0.tgz";
3342 path = fetchurl {
3343 name = "eslint_visitor_keys___eslint_visitor_keys_1.2.0.tgz";
3344 url = "https://registry.yarnpkg.com/eslint-visitor-keys/-/eslint-visitor-keys-1.2.0.tgz";
3345 sha1 = "74415ac884874495f78ec2a97349525344c981fa";
3346 };
3347 }
3348 {
3349 name = "eslint___eslint_7.2.0.tgz";
3350 path = fetchurl {
3351 name = "eslint___eslint_7.2.0.tgz";
3352 url = "https://registry.yarnpkg.com/eslint/-/eslint-7.2.0.tgz";
3353 sha1 = "d41b2e47804b30dbabb093a967fb283d560082e6";
3354 };
3355 }
3356 {
3357 name = "espree___espree_6.2.1.tgz";
3358 path = fetchurl {
3359 name = "espree___espree_6.2.1.tgz";
3360 url = "https://registry.yarnpkg.com/espree/-/espree-6.2.1.tgz";
3361 sha1 = "77fc72e1fd744a2052c20f38a5b575832e82734a";
3362 };
3363 }
3364 {
3365 name = "espree___espree_7.1.0.tgz";
3366 path = fetchurl {
3367 name = "espree___espree_7.1.0.tgz";
3368 url = "https://registry.yarnpkg.com/espree/-/espree-7.1.0.tgz";
3369 sha1 = "a9c7f18a752056735bf1ba14cb1b70adc3a5ce1c";
3370 };
3371 }
3372 {
3373 name = "esprima___esprima_4.0.1.tgz";
3374 path = fetchurl {
3375 name = "esprima___esprima_4.0.1.tgz";
3376 url = "https://registry.yarnpkg.com/esprima/-/esprima-4.0.1.tgz";
3377 sha1 = "13b04cdb3e6c5d19df91ab6987a8695619b0aa71";
3378 };
3379 }
3380 {
3381 name = "esquery___esquery_1.3.1.tgz";
3382 path = fetchurl {
3383 name = "esquery___esquery_1.3.1.tgz";
3384 url = "https://registry.yarnpkg.com/esquery/-/esquery-1.3.1.tgz";
3385 sha1 = "b78b5828aa8e214e29fb74c4d5b752e1c033da57";
3386 };
3387 }
3388 {
3389 name = "esrecurse___esrecurse_4.2.1.tgz";
3390 path = fetchurl {
3391 name = "esrecurse___esrecurse_4.2.1.tgz";
3392 url = "https://registry.yarnpkg.com/esrecurse/-/esrecurse-4.2.1.tgz";
3393 sha1 = "007a3b9fdbc2b3bb87e4879ea19c92fdbd3942cf";
3394 };
3395 }
3396 {
3397 name = "estraverse___estraverse_4.3.0.tgz";
3398 path = fetchurl {
3399 name = "estraverse___estraverse_4.3.0.tgz";
3400 url = "https://registry.yarnpkg.com/estraverse/-/estraverse-4.3.0.tgz";
3401 sha1 = "398ad3f3c5a24948be7725e83d11a7de28cdbd1d";
3402 };
3403 }
3404 {
3405 name = "estraverse___estraverse_5.1.0.tgz";
3406 path = fetchurl {
3407 name = "estraverse___estraverse_5.1.0.tgz";
3408 url = "https://registry.yarnpkg.com/estraverse/-/estraverse-5.1.0.tgz";
3409 sha1 = "374309d39fd935ae500e7b92e8a6b4c720e59642";
3410 };
3411 }
3412 {
3413 name = "esutils___esutils_2.0.3.tgz";
3414 path = fetchurl {
3415 name = "esutils___esutils_2.0.3.tgz";
3416 url = "https://registry.yarnpkg.com/esutils/-/esutils-2.0.3.tgz";
3417 sha1 = "74d2eb4de0b8da1293711910d50775b9b710ef64";
3418 };
3419 }
3420 {
3421 name = "etag___etag_1.8.1.tgz";
3422 path = fetchurl {
3423 name = "etag___etag_1.8.1.tgz";
3424 url = "https://registry.yarnpkg.com/etag/-/etag-1.8.1.tgz";
3425 sha1 = "41ae2eeb65efa62268aebfea83ac7d79299b0887";
3426 };
3427 }
3428 {
3429 name = "event_pubsub___event_pubsub_4.3.0.tgz";
3430 path = fetchurl {
3431 name = "event_pubsub___event_pubsub_4.3.0.tgz";
3432 url = "https://registry.yarnpkg.com/event-pubsub/-/event-pubsub-4.3.0.tgz";
3433 sha1 = "f68d816bc29f1ec02c539dc58c8dd40ce72cb36e";
3434 };
3435 }
3436 {
3437 name = "eventemitter3___eventemitter3_4.0.4.tgz";
3438 path = fetchurl {
3439 name = "eventemitter3___eventemitter3_4.0.4.tgz";
3440 url = "https://registry.yarnpkg.com/eventemitter3/-/eventemitter3-4.0.4.tgz";
3441 sha1 = "b5463ace635a083d018bdc7c917b4c5f10a85384";
3442 };
3443 }
3444 {
3445 name = "events___events_3.1.0.tgz";
3446 path = fetchurl {
3447 name = "events___events_3.1.0.tgz";
3448 url = "https://registry.yarnpkg.com/events/-/events-3.1.0.tgz";
3449 sha1 = "84279af1b34cb75aa88bf5ff291f6d0bd9b31a59";
3450 };
3451 }
3452 {
3453 name = "eventsource___eventsource_1.0.7.tgz";
3454 path = fetchurl {
3455 name = "eventsource___eventsource_1.0.7.tgz";
3456 url = "https://registry.yarnpkg.com/eventsource/-/eventsource-1.0.7.tgz";
3457 sha1 = "8fbc72c93fcd34088090bc0a4e64f4b5cee6d8d0";
3458 };
3459 }
3460 {
3461 name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
3462 path = fetchurl {
3463 name = "evp_bytestokey___evp_bytestokey_1.0.3.tgz";
3464 url = "https://registry.yarnpkg.com/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
3465 sha1 = "7fcbdb198dc71959432efe13842684e0525acb02";
3466 };
3467 }
3468 {
3469 name = "execa___execa_0.8.0.tgz";
3470 path = fetchurl {
3471 name = "execa___execa_0.8.0.tgz";
3472 url = "https://registry.yarnpkg.com/execa/-/execa-0.8.0.tgz";
3473 sha1 = "d8d76bbc1b55217ed190fd6dd49d3c774ecfc8da";
3474 };
3475 }
3476 {
3477 name = "execa___execa_1.0.0.tgz";
3478 path = fetchurl {
3479 name = "execa___execa_1.0.0.tgz";
3480 url = "https://registry.yarnpkg.com/execa/-/execa-1.0.0.tgz";
3481 sha1 = "c6236a5bb4df6d6f15e88e7f017798216749ddd8";
3482 };
3483 }
3484 {
3485 name = "execa___execa_3.4.0.tgz";
3486 path = fetchurl {
3487 name = "execa___execa_3.4.0.tgz";
3488 url = "https://registry.yarnpkg.com/execa/-/execa-3.4.0.tgz";
3489 sha1 = "c08ed4550ef65d858fac269ffc8572446f37eb89";
3490 };
3491 }
3492 {
3493 name = "expand_brackets___expand_brackets_2.1.4.tgz";
3494 path = fetchurl {
3495 name = "expand_brackets___expand_brackets_2.1.4.tgz";
3496 url = "https://registry.yarnpkg.com/expand-brackets/-/expand-brackets-2.1.4.tgz";
3497 sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
3498 };
3499 }
3500 {
3501 name = "express___express_4.17.1.tgz";
3502 path = fetchurl {
3503 name = "express___express_4.17.1.tgz";
3504 url = "https://registry.yarnpkg.com/express/-/express-4.17.1.tgz";
3505 sha1 = "4491fc38605cf51f8629d39c2b5d026f98a4c134";
3506 };
3507 }
3508 {
3509 name = "extend_shallow___extend_shallow_2.0.1.tgz";
3510 path = fetchurl {
3511 name = "extend_shallow___extend_shallow_2.0.1.tgz";
3512 url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-2.0.1.tgz";
3513 sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
3514 };
3515 }
3516 {
3517 name = "extend_shallow___extend_shallow_3.0.2.tgz";
3518 path = fetchurl {
3519 name = "extend_shallow___extend_shallow_3.0.2.tgz";
3520 url = "https://registry.yarnpkg.com/extend-shallow/-/extend-shallow-3.0.2.tgz";
3521 sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
3522 };
3523 }
3524 {
3525 name = "extend___extend_3.0.2.tgz";
3526 path = fetchurl {
3527 name = "extend___extend_3.0.2.tgz";
3528 url = "https://registry.yarnpkg.com/extend/-/extend-3.0.2.tgz";
3529 sha1 = "f8b1136b4071fbd8eb140aff858b1019ec2915fa";
3530 };
3531 }
3532 {
3533 name = "external_editor___external_editor_3.1.0.tgz";
3534 path = fetchurl {
3535 name = "external_editor___external_editor_3.1.0.tgz";
3536 url = "https://registry.yarnpkg.com/external-editor/-/external-editor-3.1.0.tgz";
3537 sha1 = "cb03f740befae03ea4d283caed2741a83f335495";
3538 };
3539 }
3540 {
3541 name = "extglob___extglob_2.0.4.tgz";
3542 path = fetchurl {
3543 name = "extglob___extglob_2.0.4.tgz";
3544 url = "https://registry.yarnpkg.com/extglob/-/extglob-2.0.4.tgz";
3545 sha1 = "ad00fe4dc612a9232e8718711dc5cb5ab0285543";
3546 };
3547 }
3548 {
3549 name = "extsprintf___extsprintf_1.3.0.tgz";
3550 path = fetchurl {
3551 name = "extsprintf___extsprintf_1.3.0.tgz";
3552 url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.3.0.tgz";
3553 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
3554 };
3555 }
3556 {
3557 name = "extsprintf___extsprintf_1.4.0.tgz";
3558 path = fetchurl {
3559 name = "extsprintf___extsprintf_1.4.0.tgz";
3560 url = "https://registry.yarnpkg.com/extsprintf/-/extsprintf-1.4.0.tgz";
3561 sha1 = "e2689f8f356fad62cca65a3a91c5df5f9551692f";
3562 };
3563 }
3564 {
3565 name = "fast_deep_equal___fast_deep_equal_3.1.1.tgz";
3566 path = fetchurl {
3567 name = "fast_deep_equal___fast_deep_equal_3.1.1.tgz";
3568 url = "https://registry.yarnpkg.com/fast-deep-equal/-/fast-deep-equal-3.1.1.tgz";
3569 sha1 = "545145077c501491e33b15ec408c294376e94ae4";
3570 };
3571 }
3572 {
3573 name = "fast_diff___fast_diff_1.2.0.tgz";
3574 path = fetchurl {
3575 name = "fast_diff___fast_diff_1.2.0.tgz";
3576 url = "https://registry.yarnpkg.com/fast-diff/-/fast-diff-1.2.0.tgz";
3577 sha1 = "73ee11982d86caaf7959828d519cfe927fac5f03";
3578 };
3579 }
3580 {
3581 name = "fast_glob___fast_glob_2.2.7.tgz";
3582 path = fetchurl {
3583 name = "fast_glob___fast_glob_2.2.7.tgz";
3584 url = "https://registry.yarnpkg.com/fast-glob/-/fast-glob-2.2.7.tgz";
3585 sha1 = "6953857c3afa475fff92ee6015d52da70a4cd39d";
3586 };
3587 }
3588 {
3589 name = "fast_json_stable_stringify___fast_json_stable_stringify_2.1.0.tgz";
3590 path = fetchurl {
3591 name = "fast_json_stable_stringify___fast_json_stable_stringify_2.1.0.tgz";
3592 url = "https://registry.yarnpkg.com/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz";
3593 sha1 = "874bf69c6f404c2b5d99c481341399fd55892633";
3594 };
3595 }
3596 {
3597 name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
3598 path = fetchurl {
3599 name = "fast_levenshtein___fast_levenshtein_2.0.6.tgz";
3600 url = "https://registry.yarnpkg.com/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
3601 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
3602 };
3603 }
3604 {
3605 name = "faye_websocket___faye_websocket_0.10.0.tgz";
3606 path = fetchurl {
3607 name = "faye_websocket___faye_websocket_0.10.0.tgz";
3608 url = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.10.0.tgz";
3609 sha1 = "4e492f8d04dfb6f89003507f6edbf2d501e7c6f4";
3610 };
3611 }
3612 {
3613 name = "faye_websocket___faye_websocket_0.11.3.tgz";
3614 path = fetchurl {
3615 name = "faye_websocket___faye_websocket_0.11.3.tgz";
3616 url = "https://registry.yarnpkg.com/faye-websocket/-/faye-websocket-0.11.3.tgz";
3617 sha1 = "5c0e9a8968e8912c286639fde977a8b209f2508e";
3618 };
3619 }
3620 {
3621 name = "figgy_pudding___figgy_pudding_3.5.2.tgz";
3622 path = fetchurl {
3623 name = "figgy_pudding___figgy_pudding_3.5.2.tgz";
3624 url = "https://registry.yarnpkg.com/figgy-pudding/-/figgy-pudding-3.5.2.tgz";
3625 sha1 = "b4eee8148abb01dcf1d1ac34367d59e12fa61d6e";
3626 };
3627 }
3628 {
3629 name = "figures___figures_3.2.0.tgz";
3630 path = fetchurl {
3631 name = "figures___figures_3.2.0.tgz";
3632 url = "https://registry.yarnpkg.com/figures/-/figures-3.2.0.tgz";
3633 sha1 = "625c18bd293c604dc4a8ddb2febf0c88341746af";
3634 };
3635 }
3636 {
3637 name = "file_entry_cache___file_entry_cache_5.0.1.tgz";
3638 path = fetchurl {
3639 name = "file_entry_cache___file_entry_cache_5.0.1.tgz";
3640 url = "https://registry.yarnpkg.com/file-entry-cache/-/file-entry-cache-5.0.1.tgz";
3641 sha1 = "ca0f6efa6dd3d561333fb14515065c2fafdf439c";
3642 };
3643 }
3644 {
3645 name = "file_loader___file_loader_4.3.0.tgz";
3646 path = fetchurl {
3647 name = "file_loader___file_loader_4.3.0.tgz";
3648 url = "https://registry.yarnpkg.com/file-loader/-/file-loader-4.3.0.tgz";
3649 sha1 = "780f040f729b3d18019f20605f723e844b8a58af";
3650 };
3651 }
3652 {
3653 name = "file_uri_to_path___file_uri_to_path_1.0.0.tgz";
3654 path = fetchurl {
3655 name = "file_uri_to_path___file_uri_to_path_1.0.0.tgz";
3656 url = "https://registry.yarnpkg.com/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz";
3657 sha1 = "553a7b8446ff6f684359c445f1e37a05dacc33dd";
3658 };
3659 }
3660 {
3661 name = "filesize___filesize_3.6.1.tgz";
3662 path = fetchurl {
3663 name = "filesize___filesize_3.6.1.tgz";
3664 url = "https://registry.yarnpkg.com/filesize/-/filesize-3.6.1.tgz";
3665 sha1 = "090bb3ee01b6f801a8a8be99d31710b3422bb317";
3666 };
3667 }
3668 {
3669 name = "fill_range___fill_range_4.0.0.tgz";
3670 path = fetchurl {
3671 name = "fill_range___fill_range_4.0.0.tgz";
3672 url = "https://registry.yarnpkg.com/fill-range/-/fill-range-4.0.0.tgz";
3673 sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
3674 };
3675 }
3676 {
3677 name = "fill_range___fill_range_7.0.1.tgz";
3678 path = fetchurl {
3679 name = "fill_range___fill_range_7.0.1.tgz";
3680 url = "https://registry.yarnpkg.com/fill-range/-/fill-range-7.0.1.tgz";
3681 sha1 = "1919a6a7c75fe38b2c7c77e5198535da9acdda40";
3682 };
3683 }
3684 {
3685 name = "finalhandler___finalhandler_1.1.2.tgz";
3686 path = fetchurl {
3687 name = "finalhandler___finalhandler_1.1.2.tgz";
3688 url = "https://registry.yarnpkg.com/finalhandler/-/finalhandler-1.1.2.tgz";
3689 sha1 = "b7e7d000ffd11938d0fdb053506f6ebabe9f587d";
3690 };
3691 }
3692 {
3693 name = "find_cache_dir___find_cache_dir_0.1.1.tgz";
3694 path = fetchurl {
3695 name = "find_cache_dir___find_cache_dir_0.1.1.tgz";
3696 url = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-0.1.1.tgz";
3697 sha1 = "c8defae57c8a52a8a784f9e31c57c742e993a0b9";
3698 };
3699 }
3700 {
3701 name = "find_cache_dir___find_cache_dir_2.1.0.tgz";
3702 path = fetchurl {
3703 name = "find_cache_dir___find_cache_dir_2.1.0.tgz";
3704 url = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-2.1.0.tgz";
3705 sha1 = "8d0f94cd13fe43c6c7c261a0d86115ca918c05f7";
3706 };
3707 }
3708 {
3709 name = "find_cache_dir___find_cache_dir_3.3.1.tgz";
3710 path = fetchurl {
3711 name = "find_cache_dir___find_cache_dir_3.3.1.tgz";
3712 url = "https://registry.yarnpkg.com/find-cache-dir/-/find-cache-dir-3.3.1.tgz";
3713 sha1 = "89b33fad4a4670daa94f855f7fbe31d6d84fe880";
3714 };
3715 }
3716 {
3717 name = "find_up___find_up_1.1.2.tgz";
3718 path = fetchurl {
3719 name = "find_up___find_up_1.1.2.tgz";
3720 url = "https://registry.yarnpkg.com/find-up/-/find-up-1.1.2.tgz";
3721 sha1 = "6b2e9822b1a2ce0a60ab64d610eccad53cb24d0f";
3722 };
3723 }
3724 {
3725 name = "find_up___find_up_2.1.0.tgz";
3726 path = fetchurl {
3727 name = "find_up___find_up_2.1.0.tgz";
3728 url = "https://registry.yarnpkg.com/find-up/-/find-up-2.1.0.tgz";
3729 sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
3730 };
3731 }
3732 {
3733 name = "find_up___find_up_3.0.0.tgz";
3734 path = fetchurl {
3735 name = "find_up___find_up_3.0.0.tgz";
3736 url = "https://registry.yarnpkg.com/find-up/-/find-up-3.0.0.tgz";
3737 sha1 = "49169f1d7993430646da61ecc5ae355c21c97b73";
3738 };
3739 }
3740 {
3741 name = "find_up___find_up_4.1.0.tgz";
3742 path = fetchurl {
3743 name = "find_up___find_up_4.1.0.tgz";
3744 url = "https://registry.yarnpkg.com/find-up/-/find-up-4.1.0.tgz";
3745 sha1 = "97afe7d6cdc0bc5928584b7c8d7b16e8a9aa5d19";
3746 };
3747 }
3748 {
3749 name = "flat_cache___flat_cache_2.0.1.tgz";
3750 path = fetchurl {
3751 name = "flat_cache___flat_cache_2.0.1.tgz";
3752 url = "https://registry.yarnpkg.com/flat-cache/-/flat-cache-2.0.1.tgz";
3753 sha1 = "5d296d6f04bda44a4630a301413bdbc2ec085ec0";
3754 };
3755 }
3756 {
3757 name = "flatted___flatted_2.0.2.tgz";
3758 path = fetchurl {
3759 name = "flatted___flatted_2.0.2.tgz";
3760 url = "https://registry.yarnpkg.com/flatted/-/flatted-2.0.2.tgz";
3761 sha1 = "4575b21e2bcee7434aa9be662f4b7b5f9c2b5138";
3762 };
3763 }
3764 {
3765 name = "flush_write_stream___flush_write_stream_1.1.1.tgz";
3766 path = fetchurl {
3767 name = "flush_write_stream___flush_write_stream_1.1.1.tgz";
3768 url = "https://registry.yarnpkg.com/flush-write-stream/-/flush-write-stream-1.1.1.tgz";
3769 sha1 = "8dd7d873a1babc207d94ead0c2e0e44276ebf2e8";
3770 };
3771 }
3772 {
3773 name = "follow_redirects___follow_redirects_1.11.0.tgz";
3774 path = fetchurl {
3775 name = "follow_redirects___follow_redirects_1.11.0.tgz";
3776 url = "https://registry.yarnpkg.com/follow-redirects/-/follow-redirects-1.11.0.tgz";
3777 sha1 = "afa14f08ba12a52963140fe43212658897bc0ecb";
3778 };
3779 }
3780 {
3781 name = "for_in___for_in_1.0.2.tgz";
3782 path = fetchurl {
3783 name = "for_in___for_in_1.0.2.tgz";
3784 url = "https://registry.yarnpkg.com/for-in/-/for-in-1.0.2.tgz";
3785 sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
3786 };
3787 }
3788 {
3789 name = "forever_agent___forever_agent_0.6.1.tgz";
3790 path = fetchurl {
3791 name = "forever_agent___forever_agent_0.6.1.tgz";
3792 url = "https://registry.yarnpkg.com/forever-agent/-/forever-agent-0.6.1.tgz";
3793 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
3794 };
3795 }
3796 {
3797 name = "form_data___form_data_2.3.3.tgz";
3798 path = fetchurl {
3799 name = "form_data___form_data_2.3.3.tgz";
3800 url = "https://registry.yarnpkg.com/form-data/-/form-data-2.3.3.tgz";
3801 sha1 = "dcce52c05f644f298c6a7ab936bd724ceffbf3a6";
3802 };
3803 }
3804 {
3805 name = "forwarded___forwarded_0.1.2.tgz";
3806 path = fetchurl {
3807 name = "forwarded___forwarded_0.1.2.tgz";
3808 url = "https://registry.yarnpkg.com/forwarded/-/forwarded-0.1.2.tgz";
3809 sha1 = "98c23dab1175657b8c0573e8ceccd91b0ff18c84";
3810 };
3811 }
3812 {
3813 name = "fragment_cache___fragment_cache_0.2.1.tgz";
3814 path = fetchurl {
3815 name = "fragment_cache___fragment_cache_0.2.1.tgz";
3816 url = "https://registry.yarnpkg.com/fragment-cache/-/fragment-cache-0.2.1.tgz";
3817 sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
3818 };
3819 }
3820 {
3821 name = "fresh___fresh_0.5.2.tgz";
3822 path = fetchurl {
3823 name = "fresh___fresh_0.5.2.tgz";
3824 url = "https://registry.yarnpkg.com/fresh/-/fresh-0.5.2.tgz";
3825 sha1 = "3d8cadd90d976569fa835ab1f8e4b23a105605a7";
3826 };
3827 }
3828 {
3829 name = "from2___from2_2.3.0.tgz";
3830 path = fetchurl {
3831 name = "from2___from2_2.3.0.tgz";
3832 url = "https://registry.yarnpkg.com/from2/-/from2-2.3.0.tgz";
3833 sha1 = "8bfb5502bde4a4d36cfdeea007fcca21d7e382af";
3834 };
3835 }
3836 {
3837 name = "fs_extra___fs_extra_4.0.3.tgz";
3838 path = fetchurl {
3839 name = "fs_extra___fs_extra_4.0.3.tgz";
3840 url = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-4.0.3.tgz";
3841 sha1 = "0d852122e5bc5beb453fb028e9c0c9bf36340c94";
3842 };
3843 }
3844 {
3845 name = "fs_extra___fs_extra_7.0.1.tgz";
3846 path = fetchurl {
3847 name = "fs_extra___fs_extra_7.0.1.tgz";
3848 url = "https://registry.yarnpkg.com/fs-extra/-/fs-extra-7.0.1.tgz";
3849 sha1 = "4f189c44aa123b895f722804f55ea23eadc348e9";
3850 };
3851 }
3852 {
3853 name = "fs_minipass___fs_minipass_2.1.0.tgz";
3854 path = fetchurl {
3855 name = "fs_minipass___fs_minipass_2.1.0.tgz";
3856 url = "https://registry.yarnpkg.com/fs-minipass/-/fs-minipass-2.1.0.tgz";
3857 sha1 = "7f5036fdbf12c63c169190cbe4199c852271f9fb";
3858 };
3859 }
3860 {
3861 name = "fs_write_stream_atomic___fs_write_stream_atomic_1.0.10.tgz";
3862 path = fetchurl {
3863 name = "fs_write_stream_atomic___fs_write_stream_atomic_1.0.10.tgz";
3864 url = "https://registry.yarnpkg.com/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz";
3865 sha1 = "b47df53493ef911df75731e70a9ded0189db40c9";
3866 };
3867 }
3868 {
3869 name = "fs.realpath___fs.realpath_1.0.0.tgz";
3870 path = fetchurl {
3871 name = "fs.realpath___fs.realpath_1.0.0.tgz";
3872 url = "https://registry.yarnpkg.com/fs.realpath/-/fs.realpath-1.0.0.tgz";
3873 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
3874 };
3875 }
3876 {
3877 name = "fsevents___fsevents_1.2.13.tgz";
3878 path = fetchurl {
3879 name = "fsevents___fsevents_1.2.13.tgz";
3880 url = "https://registry.yarnpkg.com/fsevents/-/fsevents-1.2.13.tgz";
3881 sha1 = "f325cb0455592428bcf11b383370ef70e3bfcc38";
3882 };
3883 }
3884 {
3885 name = "fsevents___fsevents_2.1.3.tgz";
3886 path = fetchurl {
3887 name = "fsevents___fsevents_2.1.3.tgz";
3888 url = "https://registry.yarnpkg.com/fsevents/-/fsevents-2.1.3.tgz";
3889 sha1 = "fb738703ae8d2f9fe900c33836ddebee8b97f23e";
3890 };
3891 }
3892 {
3893 name = "function_bind___function_bind_1.1.1.tgz";
3894 path = fetchurl {
3895 name = "function_bind___function_bind_1.1.1.tgz";
3896 url = "https://registry.yarnpkg.com/function-bind/-/function-bind-1.1.1.tgz";
3897 sha1 = "a56899d3ea3c9bab874bb9773b7c5ede92f4895d";
3898 };
3899 }
3900 {
3901 name = "functional_red_black_tree___functional_red_black_tree_1.0.1.tgz";
3902 path = fetchurl {
3903 name = "functional_red_black_tree___functional_red_black_tree_1.0.1.tgz";
3904 url = "https://registry.yarnpkg.com/functional-red-black-tree/-/functional-red-black-tree-1.0.1.tgz";
3905 sha1 = "1b0ab3bd553b2a0d6399d29c0e3ea0b252078327";
3906 };
3907 }
3908 {
3909 name = "gensync___gensync_1.0.0_beta.1.tgz";
3910 path = fetchurl {
3911 name = "gensync___gensync_1.0.0_beta.1.tgz";
3912 url = "https://registry.yarnpkg.com/gensync/-/gensync-1.0.0-beta.1.tgz";
3913 sha1 = "58f4361ff987e5ff6e1e7a210827aa371eaac269";
3914 };
3915 }
3916 {
3917 name = "get_caller_file___get_caller_file_2.0.5.tgz";
3918 path = fetchurl {
3919 name = "get_caller_file___get_caller_file_2.0.5.tgz";
3920 url = "https://registry.yarnpkg.com/get-caller-file/-/get-caller-file-2.0.5.tgz";
3921 sha1 = "4f94412a82db32f36e3b0b9741f8a97feb031f7e";
3922 };
3923 }
3924 {
3925 name = "get_own_enumerable_property_symbols___get_own_enumerable_property_symbols_3.0.2.tgz";
3926 path = fetchurl {
3927 name = "get_own_enumerable_property_symbols___get_own_enumerable_property_symbols_3.0.2.tgz";
3928 url = "https://registry.yarnpkg.com/get-own-enumerable-property-symbols/-/get-own-enumerable-property-symbols-3.0.2.tgz";
3929 sha1 = "b5fde77f22cbe35f390b4e089922c50bce6ef664";
3930 };
3931 }
3932 {
3933 name = "get_stdin___get_stdin_6.0.0.tgz";
3934 path = fetchurl {
3935 name = "get_stdin___get_stdin_6.0.0.tgz";
3936 url = "https://registry.yarnpkg.com/get-stdin/-/get-stdin-6.0.0.tgz";
3937 sha1 = "9e09bf712b360ab9225e812048f71fde9c89657b";
3938 };
3939 }
3940 {
3941 name = "get_stream___get_stream_3.0.0.tgz";
3942 path = fetchurl {
3943 name = "get_stream___get_stream_3.0.0.tgz";
3944 url = "https://registry.yarnpkg.com/get-stream/-/get-stream-3.0.0.tgz";
3945 sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14";
3946 };
3947 }
3948 {
3949 name = "get_stream___get_stream_4.1.0.tgz";
3950 path = fetchurl {
3951 name = "get_stream___get_stream_4.1.0.tgz";
3952 url = "https://registry.yarnpkg.com/get-stream/-/get-stream-4.1.0.tgz";
3953 sha1 = "c1b255575f3dc21d59bfc79cd3d2b46b1c3a54b5";
3954 };
3955 }
3956 {
3957 name = "get_stream___get_stream_5.1.0.tgz";
3958 path = fetchurl {
3959 name = "get_stream___get_stream_5.1.0.tgz";
3960 url = "https://registry.yarnpkg.com/get-stream/-/get-stream-5.1.0.tgz";
3961 sha1 = "01203cdc92597f9b909067c3e656cc1f4d3c4dc9";
3962 };
3963 }
3964 {
3965 name = "get_value___get_value_2.0.6.tgz";
3966 path = fetchurl {
3967 name = "get_value___get_value_2.0.6.tgz";
3968 url = "https://registry.yarnpkg.com/get-value/-/get-value-2.0.6.tgz";
3969 sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
3970 };
3971 }
3972 {
3973 name = "getpass___getpass_0.1.7.tgz";
3974 path = fetchurl {
3975 name = "getpass___getpass_0.1.7.tgz";
3976 url = "https://registry.yarnpkg.com/getpass/-/getpass-0.1.7.tgz";
3977 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
3978 };
3979 }
3980 {
3981 name = "glob_parent___glob_parent_3.1.0.tgz";
3982 path = fetchurl {
3983 name = "glob_parent___glob_parent_3.1.0.tgz";
3984 url = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-3.1.0.tgz";
3985 sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
3986 };
3987 }
3988 {
3989 name = "glob_parent___glob_parent_5.1.1.tgz";
3990 path = fetchurl {
3991 name = "glob_parent___glob_parent_5.1.1.tgz";
3992 url = "https://registry.yarnpkg.com/glob-parent/-/glob-parent-5.1.1.tgz";
3993 sha1 = "b6c1ef417c4e5663ea498f1c45afac6916bbc229";
3994 };
3995 }
3996 {
3997 name = "glob_to_regexp___glob_to_regexp_0.3.0.tgz";
3998 path = fetchurl {
3999 name = "glob_to_regexp___glob_to_regexp_0.3.0.tgz";
4000 url = "https://registry.yarnpkg.com/glob-to-regexp/-/glob-to-regexp-0.3.0.tgz";
4001 sha1 = "8c5a1494d2066c570cc3bfe4496175acc4d502ab";
4002 };
4003 }
4004 {
4005 name = "glob___glob_7.1.6.tgz";
4006 path = fetchurl {
4007 name = "glob___glob_7.1.6.tgz";
4008 url = "https://registry.yarnpkg.com/glob/-/glob-7.1.6.tgz";
4009 sha1 = "141f33b81a7c2492e125594307480c46679278a6";
4010 };
4011 }
4012 {
4013 name = "globals___globals_11.12.0.tgz";
4014 path = fetchurl {
4015 name = "globals___globals_11.12.0.tgz";
4016 url = "https://registry.yarnpkg.com/globals/-/globals-11.12.0.tgz";
4017 sha1 = "ab8795338868a0babd8525758018c2a7eb95c42e";
4018 };
4019 }
4020 {
4021 name = "globals___globals_12.4.0.tgz";
4022 path = fetchurl {
4023 name = "globals___globals_12.4.0.tgz";
4024 url = "https://registry.yarnpkg.com/globals/-/globals-12.4.0.tgz";
4025 sha1 = "a18813576a41b00a24a97e7f815918c2e19925f8";
4026 };
4027 }
4028 {
4029 name = "globby___globby_6.1.0.tgz";
4030 path = fetchurl {
4031 name = "globby___globby_6.1.0.tgz";
4032 url = "https://registry.yarnpkg.com/globby/-/globby-6.1.0.tgz";
4033 sha1 = "f5a6d70e8395e21c858fb0489d64df02424d506c";
4034 };
4035 }
4036 {
4037 name = "globby___globby_7.1.1.tgz";
4038 path = fetchurl {
4039 name = "globby___globby_7.1.1.tgz";
4040 url = "https://registry.yarnpkg.com/globby/-/globby-7.1.1.tgz";
4041 sha1 = "fb2ccff9401f8600945dfada97440cca972b8680";
4042 };
4043 }
4044 {
4045 name = "globby___globby_9.2.0.tgz";
4046 path = fetchurl {
4047 name = "globby___globby_9.2.0.tgz";
4048 url = "https://registry.yarnpkg.com/globby/-/globby-9.2.0.tgz";
4049 sha1 = "fd029a706c703d29bdd170f4b6db3a3f7a7cb63d";
4050 };
4051 }
4052 {
4053 name = "graceful_fs___graceful_fs_4.2.4.tgz";
4054 path = fetchurl {
4055 name = "graceful_fs___graceful_fs_4.2.4.tgz";
4056 url = "https://registry.yarnpkg.com/graceful-fs/-/graceful-fs-4.2.4.tgz";
4057 sha1 = "2256bde14d3632958c465ebc96dc467ca07a29fb";
4058 };
4059 }
4060 {
4061 name = "gzip_size___gzip_size_5.1.1.tgz";
4062 path = fetchurl {
4063 name = "gzip_size___gzip_size_5.1.1.tgz";
4064 url = "https://registry.yarnpkg.com/gzip-size/-/gzip-size-5.1.1.tgz";
4065 sha1 = "cb9bee692f87c0612b232840a873904e4c135274";
4066 };
4067 }
4068 {
4069 name = "handle_thing___handle_thing_2.0.1.tgz";
4070 path = fetchurl {
4071 name = "handle_thing___handle_thing_2.0.1.tgz";
4072 url = "https://registry.yarnpkg.com/handle-thing/-/handle-thing-2.0.1.tgz";
4073 sha1 = "857f79ce359580c340d43081cc648970d0bb234e";
4074 };
4075 }
4076 {
4077 name = "har_schema___har_schema_2.0.0.tgz";
4078 path = fetchurl {
4079 name = "har_schema___har_schema_2.0.0.tgz";
4080 url = "https://registry.yarnpkg.com/har-schema/-/har-schema-2.0.0.tgz";
4081 sha1 = "a94c2224ebcac04782a0d9035521f24735b7ec92";
4082 };
4083 }
4084 {
4085 name = "har_validator___har_validator_5.1.3.tgz";
4086 path = fetchurl {
4087 name = "har_validator___har_validator_5.1.3.tgz";
4088 url = "https://registry.yarnpkg.com/har-validator/-/har-validator-5.1.3.tgz";
4089 sha1 = "1ef89ebd3e4996557675eed9893110dc350fa080";
4090 };
4091 }
4092 {
4093 name = "has_ansi___has_ansi_2.0.0.tgz";
4094 path = fetchurl {
4095 name = "has_ansi___has_ansi_2.0.0.tgz";
4096 url = "https://registry.yarnpkg.com/has-ansi/-/has-ansi-2.0.0.tgz";
4097 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
4098 };
4099 }
4100 {
4101 name = "has_flag___has_flag_3.0.0.tgz";
4102 path = fetchurl {
4103 name = "has_flag___has_flag_3.0.0.tgz";
4104 url = "https://registry.yarnpkg.com/has-flag/-/has-flag-3.0.0.tgz";
4105 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
4106 };
4107 }
4108 {
4109 name = "has_flag___has_flag_4.0.0.tgz";
4110 path = fetchurl {
4111 name = "has_flag___has_flag_4.0.0.tgz";
4112 url = "https://registry.yarnpkg.com/has-flag/-/has-flag-4.0.0.tgz";
4113 sha1 = "944771fd9c81c81265c4d6941860da06bb59479b";
4114 };
4115 }
4116 {
4117 name = "has_symbols___has_symbols_1.0.1.tgz";
4118 path = fetchurl {
4119 name = "has_symbols___has_symbols_1.0.1.tgz";
4120 url = "https://registry.yarnpkg.com/has-symbols/-/has-symbols-1.0.1.tgz";
4121 sha1 = "9f5214758a44196c406d9bd76cebf81ec2dd31e8";
4122 };
4123 }
4124 {
4125 name = "has_value___has_value_0.3.1.tgz";
4126 path = fetchurl {
4127 name = "has_value___has_value_0.3.1.tgz";
4128 url = "https://registry.yarnpkg.com/has-value/-/has-value-0.3.1.tgz";
4129 sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
4130 };
4131 }
4132 {
4133 name = "has_value___has_value_1.0.0.tgz";
4134 path = fetchurl {
4135 name = "has_value___has_value_1.0.0.tgz";
4136 url = "https://registry.yarnpkg.com/has-value/-/has-value-1.0.0.tgz";
4137 sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
4138 };
4139 }
4140 {
4141 name = "has_values___has_values_0.1.4.tgz";
4142 path = fetchurl {
4143 name = "has_values___has_values_0.1.4.tgz";
4144 url = "https://registry.yarnpkg.com/has-values/-/has-values-0.1.4.tgz";
4145 sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
4146 };
4147 }
4148 {
4149 name = "has_values___has_values_1.0.0.tgz";
4150 path = fetchurl {
4151 name = "has_values___has_values_1.0.0.tgz";
4152 url = "https://registry.yarnpkg.com/has-values/-/has-values-1.0.0.tgz";
4153 sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
4154 };
4155 }
4156 {
4157 name = "has___has_1.0.3.tgz";
4158 path = fetchurl {
4159 name = "has___has_1.0.3.tgz";
4160 url = "https://registry.yarnpkg.com/has/-/has-1.0.3.tgz";
4161 sha1 = "722d7cbfc1f6aa8241f16dd814e011e1f41e8796";
4162 };
4163 }
4164 {
4165 name = "hash_base___hash_base_3.1.0.tgz";
4166 path = fetchurl {
4167 name = "hash_base___hash_base_3.1.0.tgz";
4168 url = "https://registry.yarnpkg.com/hash-base/-/hash-base-3.1.0.tgz";
4169 sha1 = "55c381d9e06e1d2997a883b4a3fddfe7f0d3af33";
4170 };
4171 }
4172 {
4173 name = "hash_sum___hash_sum_1.0.2.tgz";
4174 path = fetchurl {
4175 name = "hash_sum___hash_sum_1.0.2.tgz";
4176 url = "https://registry.yarnpkg.com/hash-sum/-/hash-sum-1.0.2.tgz";
4177 sha1 = "33b40777754c6432573c120cc3808bbd10d47f04";
4178 };
4179 }
4180 {
4181 name = "hash_sum___hash_sum_2.0.0.tgz";
4182 path = fetchurl {
4183 name = "hash_sum___hash_sum_2.0.0.tgz";
4184 url = "https://registry.yarnpkg.com/hash-sum/-/hash-sum-2.0.0.tgz";
4185 sha1 = "81d01bb5de8ea4a214ad5d6ead1b523460b0b45a";
4186 };
4187 }
4188 {
4189 name = "hash.js___hash.js_1.1.7.tgz";
4190 path = fetchurl {
4191 name = "hash.js___hash.js_1.1.7.tgz";
4192 url = "https://registry.yarnpkg.com/hash.js/-/hash.js-1.1.7.tgz";
4193 sha1 = "0babca538e8d4ee4a0f8988d68866537a003cf42";
4194 };
4195 }
4196 {
4197 name = "he___he_1.2.0.tgz";
4198 path = fetchurl {
4199 name = "he___he_1.2.0.tgz";
4200 url = "https://registry.yarnpkg.com/he/-/he-1.2.0.tgz";
4201 sha1 = "84ae65fa7eafb165fddb61566ae14baf05664f0f";
4202 };
4203 }
4204 {
4205 name = "hex_color_regex___hex_color_regex_1.1.0.tgz";
4206 path = fetchurl {
4207 name = "hex_color_regex___hex_color_regex_1.1.0.tgz";
4208 url = "https://registry.yarnpkg.com/hex-color-regex/-/hex-color-regex-1.1.0.tgz";
4209 sha1 = "4c06fccb4602fe2602b3c93df82d7e7dbf1a8a8e";
4210 };
4211 }
4212 {
4213 name = "highlight.js___highlight.js_9.18.1.tgz";
4214 path = fetchurl {
4215 name = "highlight.js___highlight.js_9.18.1.tgz";
4216 url = "https://registry.yarnpkg.com/highlight.js/-/highlight.js-9.18.1.tgz";
4217 sha1 = "ed21aa001fe6252bb10a3d76d47573c6539fe13c";
4218 };
4219 }
4220 {
4221 name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
4222 path = fetchurl {
4223 name = "hmac_drbg___hmac_drbg_1.0.1.tgz";
4224 url = "https://registry.yarnpkg.com/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
4225 sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
4226 };
4227 }
4228 {
4229 name = "hoopy___hoopy_0.1.4.tgz";
4230 path = fetchurl {
4231 name = "hoopy___hoopy_0.1.4.tgz";
4232 url = "https://registry.yarnpkg.com/hoopy/-/hoopy-0.1.4.tgz";
4233 sha1 = "609207d661100033a9a9402ad3dea677381c1b1d";
4234 };
4235 }
4236 {
4237 name = "hosted_git_info___hosted_git_info_2.8.8.tgz";
4238 path = fetchurl {
4239 name = "hosted_git_info___hosted_git_info_2.8.8.tgz";
4240 url = "https://registry.yarnpkg.com/hosted-git-info/-/hosted-git-info-2.8.8.tgz";
4241 sha1 = "7539bd4bc1e0e0a895815a2e0262420b12858488";
4242 };
4243 }
4244 {
4245 name = "hpack.js___hpack.js_2.1.6.tgz";
4246 path = fetchurl {
4247 name = "hpack.js___hpack.js_2.1.6.tgz";
4248 url = "https://registry.yarnpkg.com/hpack.js/-/hpack.js-2.1.6.tgz";
4249 sha1 = "87774c0949e513f42e84575b3c45681fade2a0b2";
4250 };
4251 }
4252 {
4253 name = "hsl_regex___hsl_regex_1.0.0.tgz";
4254 path = fetchurl {
4255 name = "hsl_regex___hsl_regex_1.0.0.tgz";
4256 url = "https://registry.yarnpkg.com/hsl-regex/-/hsl-regex-1.0.0.tgz";
4257 sha1 = "d49330c789ed819e276a4c0d272dffa30b18fe6e";
4258 };
4259 }
4260 {
4261 name = "hsla_regex___hsla_regex_1.0.0.tgz";
4262 path = fetchurl {
4263 name = "hsla_regex___hsla_regex_1.0.0.tgz";
4264 url = "https://registry.yarnpkg.com/hsla-regex/-/hsla-regex-1.0.0.tgz";
4265 sha1 = "c1ce7a3168c8c6614033a4b5f7877f3b225f9c38";
4266 };
4267 }
4268 {
4269 name = "html_comment_regex___html_comment_regex_1.1.2.tgz";
4270 path = fetchurl {
4271 name = "html_comment_regex___html_comment_regex_1.1.2.tgz";
4272 url = "https://registry.yarnpkg.com/html-comment-regex/-/html-comment-regex-1.1.2.tgz";
4273 sha1 = "97d4688aeb5c81886a364faa0cad1dda14d433a7";
4274 };
4275 }
4276 {
4277 name = "html_entities___html_entities_1.3.1.tgz";
4278 path = fetchurl {
4279 name = "html_entities___html_entities_1.3.1.tgz";
4280 url = "https://registry.yarnpkg.com/html-entities/-/html-entities-1.3.1.tgz";
4281 sha1 = "fb9a1a4b5b14c5daba82d3e34c6ae4fe701a0e44";
4282 };
4283 }
4284 {
4285 name = "html_minifier___html_minifier_3.5.21.tgz";
4286 path = fetchurl {
4287 name = "html_minifier___html_minifier_3.5.21.tgz";
4288 url = "https://registry.yarnpkg.com/html-minifier/-/html-minifier-3.5.21.tgz";
4289 sha1 = "d0040e054730e354db008463593194015212d20c";
4290 };
4291 }
4292 {
4293 name = "html_tags___html_tags_2.0.0.tgz";
4294 path = fetchurl {
4295 name = "html_tags___html_tags_2.0.0.tgz";
4296 url = "https://registry.yarnpkg.com/html-tags/-/html-tags-2.0.0.tgz";
4297 sha1 = "10b30a386085f43cede353cc8fa7cb0deeea668b";
4298 };
4299 }
4300 {
4301 name = "html_webpack_plugin___html_webpack_plugin_3.2.0.tgz";
4302 path = fetchurl {
4303 name = "html_webpack_plugin___html_webpack_plugin_3.2.0.tgz";
4304 url = "https://registry.yarnpkg.com/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz";
4305 sha1 = "b01abbd723acaaa7b37b6af4492ebda03d9dd37b";
4306 };
4307 }
4308 {
4309 name = "htmlparser2___htmlparser2_3.10.1.tgz";
4310 path = fetchurl {
4311 name = "htmlparser2___htmlparser2_3.10.1.tgz";
4312 url = "https://registry.yarnpkg.com/htmlparser2/-/htmlparser2-3.10.1.tgz";
4313 sha1 = "bd679dc3f59897b6a34bb10749c855bb53a9392f";
4314 };
4315 }
4316 {
4317 name = "http_deceiver___http_deceiver_1.2.7.tgz";
4318 path = fetchurl {
4319 name = "http_deceiver___http_deceiver_1.2.7.tgz";
4320 url = "https://registry.yarnpkg.com/http-deceiver/-/http-deceiver-1.2.7.tgz";
4321 sha1 = "fa7168944ab9a519d337cb0bec7284dc3e723d87";
4322 };
4323 }
4324 {
4325 name = "http_errors___http_errors_1.7.2.tgz";
4326 path = fetchurl {
4327 name = "http_errors___http_errors_1.7.2.tgz";
4328 url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.2.tgz";
4329 sha1 = "4f5029cf13239f31036e5b2e55292bcfbcc85c8f";
4330 };
4331 }
4332 {
4333 name = "http_errors___http_errors_1.6.3.tgz";
4334 path = fetchurl {
4335 name = "http_errors___http_errors_1.6.3.tgz";
4336 url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.6.3.tgz";
4337 sha1 = "8b55680bb4be283a0b5bf4ea2e38580be1d9320d";
4338 };
4339 }
4340 {
4341 name = "http_errors___http_errors_1.7.3.tgz";
4342 path = fetchurl {
4343 name = "http_errors___http_errors_1.7.3.tgz";
4344 url = "https://registry.yarnpkg.com/http-errors/-/http-errors-1.7.3.tgz";
4345 sha1 = "6c619e4f9c60308c38519498c14fbb10aacebb06";
4346 };
4347 }
4348 {
4349 name = "http_parser_js___http_parser_js_0.5.2.tgz";
4350 path = fetchurl {
4351 name = "http_parser_js___http_parser_js_0.5.2.tgz";
4352 url = "https://registry.yarnpkg.com/http-parser-js/-/http-parser-js-0.5.2.tgz";
4353 sha1 = "da2e31d237b393aae72ace43882dd7e270a8ff77";
4354 };
4355 }
4356 {
4357 name = "http_proxy_middleware___http_proxy_middleware_0.19.1.tgz";
4358 path = fetchurl {
4359 name = "http_proxy_middleware___http_proxy_middleware_0.19.1.tgz";
4360 url = "https://registry.yarnpkg.com/http-proxy-middleware/-/http-proxy-middleware-0.19.1.tgz";
4361 sha1 = "183c7dc4aa1479150306498c210cdaf96080a43a";
4362 };
4363 }
4364 {
4365 name = "http_proxy___http_proxy_1.18.1.tgz";
4366 path = fetchurl {
4367 name = "http_proxy___http_proxy_1.18.1.tgz";
4368 url = "https://registry.yarnpkg.com/http-proxy/-/http-proxy-1.18.1.tgz";
4369 sha1 = "401541f0534884bbf95260334e72f88ee3976549";
4370 };
4371 }
4372 {
4373 name = "http_signature___http_signature_1.2.0.tgz";
4374 path = fetchurl {
4375 name = "http_signature___http_signature_1.2.0.tgz";
4376 url = "https://registry.yarnpkg.com/http-signature/-/http-signature-1.2.0.tgz";
4377 sha1 = "9aecd925114772f3d95b65a60abb8f7c18fbace1";
4378 };
4379 }
4380 {
4381 name = "https_browserify___https_browserify_1.0.0.tgz";
4382 path = fetchurl {
4383 name = "https_browserify___https_browserify_1.0.0.tgz";
4384 url = "https://registry.yarnpkg.com/https-browserify/-/https-browserify-1.0.0.tgz";
4385 sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
4386 };
4387 }
4388 {
4389 name = "human_signals___human_signals_1.1.1.tgz";
4390 path = fetchurl {
4391 name = "human_signals___human_signals_1.1.1.tgz";
4392 url = "https://registry.yarnpkg.com/human-signals/-/human-signals-1.1.1.tgz";
4393 sha1 = "c5b1cd14f50aeae09ab6c59fe63ba3395fe4dfa3";
4394 };
4395 }
4396 {
4397 name = "iconv_lite___iconv_lite_0.4.24.tgz";
4398 path = fetchurl {
4399 name = "iconv_lite___iconv_lite_0.4.24.tgz";
4400 url = "https://registry.yarnpkg.com/iconv-lite/-/iconv-lite-0.4.24.tgz";
4401 sha1 = "2022b4b25fbddc21d2f524974a474aafe733908b";
4402 };
4403 }
4404 {
4405 name = "icss_utils___icss_utils_4.1.1.tgz";
4406 path = fetchurl {
4407 name = "icss_utils___icss_utils_4.1.1.tgz";
4408 url = "https://registry.yarnpkg.com/icss-utils/-/icss-utils-4.1.1.tgz";
4409 sha1 = "21170b53789ee27447c2f47dd683081403f9a467";
4410 };
4411 }
4412 {
4413 name = "ieee754___ieee754_1.1.13.tgz";
4414 path = fetchurl {
4415 name = "ieee754___ieee754_1.1.13.tgz";
4416 url = "https://registry.yarnpkg.com/ieee754/-/ieee754-1.1.13.tgz";
4417 sha1 = "ec168558e95aa181fd87d37f55c32bbcb6708b84";
4418 };
4419 }
4420 {
4421 name = "iferr___iferr_0.1.5.tgz";
4422 path = fetchurl {
4423 name = "iferr___iferr_0.1.5.tgz";
4424 url = "https://registry.yarnpkg.com/iferr/-/iferr-0.1.5.tgz";
4425 sha1 = "c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501";
4426 };
4427 }
4428 {
4429 name = "ignore___ignore_3.3.10.tgz";
4430 path = fetchurl {
4431 name = "ignore___ignore_3.3.10.tgz";
4432 url = "https://registry.yarnpkg.com/ignore/-/ignore-3.3.10.tgz";
4433 sha1 = "0a97fb876986e8081c631160f8f9f389157f0043";
4434 };
4435 }
4436 {
4437 name = "ignore___ignore_4.0.6.tgz";
4438 path = fetchurl {
4439 name = "ignore___ignore_4.0.6.tgz";
4440 url = "https://registry.yarnpkg.com/ignore/-/ignore-4.0.6.tgz";
4441 sha1 = "750e3db5862087b4737ebac8207ffd1ef27b25fc";
4442 };
4443 }
4444 {
4445 name = "import_cwd___import_cwd_2.1.0.tgz";
4446 path = fetchurl {
4447 name = "import_cwd___import_cwd_2.1.0.tgz";
4448 url = "https://registry.yarnpkg.com/import-cwd/-/import-cwd-2.1.0.tgz";
4449 sha1 = "aa6cf36e722761285cb371ec6519f53e2435b0a9";
4450 };
4451 }
4452 {
4453 name = "import_fresh___import_fresh_2.0.0.tgz";
4454 path = fetchurl {
4455 name = "import_fresh___import_fresh_2.0.0.tgz";
4456 url = "https://registry.yarnpkg.com/import-fresh/-/import-fresh-2.0.0.tgz";
4457 sha1 = "d81355c15612d386c61f9ddd3922d4304822a546";
4458 };
4459 }
4460 {
4461 name = "import_fresh___import_fresh_3.2.1.tgz";
4462 path = fetchurl {
4463 name = "import_fresh___import_fresh_3.2.1.tgz";
4464 url = "https://registry.yarnpkg.com/import-fresh/-/import-fresh-3.2.1.tgz";
4465 sha1 = "633ff618506e793af5ac91bf48b72677e15cbe66";
4466 };
4467 }
4468 {
4469 name = "import_from___import_from_2.1.0.tgz";
4470 path = fetchurl {
4471 name = "import_from___import_from_2.1.0.tgz";
4472 url = "https://registry.yarnpkg.com/import-from/-/import-from-2.1.0.tgz";
4473 sha1 = "335db7f2a7affd53aaa471d4b8021dee36b7f3b1";
4474 };
4475 }
4476 {
4477 name = "import_local___import_local_2.0.0.tgz";
4478 path = fetchurl {
4479 name = "import_local___import_local_2.0.0.tgz";
4480 url = "https://registry.yarnpkg.com/import-local/-/import-local-2.0.0.tgz";
4481 sha1 = "55070be38a5993cf18ef6db7e961f5bee5c5a09d";
4482 };
4483 }
4484 {
4485 name = "imurmurhash___imurmurhash_0.1.4.tgz";
4486 path = fetchurl {
4487 name = "imurmurhash___imurmurhash_0.1.4.tgz";
4488 url = "https://registry.yarnpkg.com/imurmurhash/-/imurmurhash-0.1.4.tgz";
4489 sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea";
4490 };
4491 }
4492 {
4493 name = "indent_string___indent_string_4.0.0.tgz";
4494 path = fetchurl {
4495 name = "indent_string___indent_string_4.0.0.tgz";
4496 url = "https://registry.yarnpkg.com/indent-string/-/indent-string-4.0.0.tgz";
4497 sha1 = "624f8f4497d619b2d9768531d58f4122854d7251";
4498 };
4499 }
4500 {
4501 name = "indexes_of___indexes_of_1.0.1.tgz";
4502 path = fetchurl {
4503 name = "indexes_of___indexes_of_1.0.1.tgz";
4504 url = "https://registry.yarnpkg.com/indexes-of/-/indexes-of-1.0.1.tgz";
4505 sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
4506 };
4507 }
4508 {
4509 name = "infer_owner___infer_owner_1.0.4.tgz";
4510 path = fetchurl {
4511 name = "infer_owner___infer_owner_1.0.4.tgz";
4512 url = "https://registry.yarnpkg.com/infer-owner/-/infer-owner-1.0.4.tgz";
4513 sha1 = "c4cefcaa8e51051c2a40ba2ce8a3d27295af9467";
4514 };
4515 }
4516 {
4517 name = "inflight___inflight_1.0.6.tgz";
4518 path = fetchurl {
4519 name = "inflight___inflight_1.0.6.tgz";
4520 url = "https://registry.yarnpkg.com/inflight/-/inflight-1.0.6.tgz";
4521 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
4522 };
4523 }
4524 {
4525 name = "inherits___inherits_2.0.4.tgz";
4526 path = fetchurl {
4527 name = "inherits___inherits_2.0.4.tgz";
4528 url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.4.tgz";
4529 sha1 = "0fa2c64f932917c3433a0ded55363aae37416b7c";
4530 };
4531 }
4532 {
4533 name = "inherits___inherits_2.0.1.tgz";
4534 path = fetchurl {
4535 name = "inherits___inherits_2.0.1.tgz";
4536 url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.1.tgz";
4537 sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
4538 };
4539 }
4540 {
4541 name = "inherits___inherits_2.0.3.tgz";
4542 path = fetchurl {
4543 name = "inherits___inherits_2.0.3.tgz";
4544 url = "https://registry.yarnpkg.com/inherits/-/inherits-2.0.3.tgz";
4545 sha1 = "633c2c83e3da42a502f52466022480f4208261de";
4546 };
4547 }
4548 {
4549 name = "inquirer___inquirer_7.1.0.tgz";
4550 path = fetchurl {
4551 name = "inquirer___inquirer_7.1.0.tgz";
4552 url = "https://registry.yarnpkg.com/inquirer/-/inquirer-7.1.0.tgz";
4553 sha1 = "1298a01859883e17c7264b82870ae1034f92dd29";
4554 };
4555 }
4556 {
4557 name = "internal_ip___internal_ip_4.3.0.tgz";
4558 path = fetchurl {
4559 name = "internal_ip___internal_ip_4.3.0.tgz";
4560 url = "https://registry.yarnpkg.com/internal-ip/-/internal-ip-4.3.0.tgz";
4561 sha1 = "845452baad9d2ca3b69c635a137acb9a0dad0907";
4562 };
4563 }
4564 {
4565 name = "invariant___invariant_2.2.4.tgz";
4566 path = fetchurl {
4567 name = "invariant___invariant_2.2.4.tgz";
4568 url = "https://registry.yarnpkg.com/invariant/-/invariant-2.2.4.tgz";
4569 sha1 = "610f3c92c9359ce1db616e538008d23ff35158e6";
4570 };
4571 }
4572 {
4573 name = "ip_regex___ip_regex_2.1.0.tgz";
4574 path = fetchurl {
4575 name = "ip_regex___ip_regex_2.1.0.tgz";
4576 url = "https://registry.yarnpkg.com/ip-regex/-/ip-regex-2.1.0.tgz";
4577 sha1 = "fa78bf5d2e6913c911ce9f819ee5146bb6d844e9";
4578 };
4579 }
4580 {
4581 name = "ip___ip_1.1.5.tgz";
4582 path = fetchurl {
4583 name = "ip___ip_1.1.5.tgz";
4584 url = "https://registry.yarnpkg.com/ip/-/ip-1.1.5.tgz";
4585 sha1 = "bdded70114290828c0a039e72ef25f5aaec4354a";
4586 };
4587 }
4588 {
4589 name = "ipaddr.js___ipaddr.js_1.9.1.tgz";
4590 path = fetchurl {
4591 name = "ipaddr.js___ipaddr.js_1.9.1.tgz";
4592 url = "https://registry.yarnpkg.com/ipaddr.js/-/ipaddr.js-1.9.1.tgz";
4593 sha1 = "bff38543eeb8984825079ff3a2a8e6cbd46781b3";
4594 };
4595 }
4596 {
4597 name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
4598 path = fetchurl {
4599 name = "is_absolute_url___is_absolute_url_2.1.0.tgz";
4600 url = "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
4601 sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
4602 };
4603 }
4604 {
4605 name = "is_absolute_url___is_absolute_url_3.0.3.tgz";
4606 path = fetchurl {
4607 name = "is_absolute_url___is_absolute_url_3.0.3.tgz";
4608 url = "https://registry.yarnpkg.com/is-absolute-url/-/is-absolute-url-3.0.3.tgz";
4609 sha1 = "96c6a22b6a23929b11ea0afb1836c36ad4a5d698";
4610 };
4611 }
4612 {
4613 name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
4614 path = fetchurl {
4615 name = "is_accessor_descriptor___is_accessor_descriptor_0.1.6.tgz";
4616 url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
4617 sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
4618 };
4619 }
4620 {
4621 name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
4622 path = fetchurl {
4623 name = "is_accessor_descriptor___is_accessor_descriptor_1.0.0.tgz";
4624 url = "https://registry.yarnpkg.com/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
4625 sha1 = "169c2f6d3df1f992618072365c9b0ea1f6878656";
4626 };
4627 }
4628 {
4629 name = "is_arguments___is_arguments_1.0.4.tgz";
4630 path = fetchurl {
4631 name = "is_arguments___is_arguments_1.0.4.tgz";
4632 url = "https://registry.yarnpkg.com/is-arguments/-/is-arguments-1.0.4.tgz";
4633 sha1 = "3faf966c7cba0ff437fb31f6250082fcf0448cf3";
4634 };
4635 }
4636 {
4637 name = "is_arrayish___is_arrayish_0.2.1.tgz";
4638 path = fetchurl {
4639 name = "is_arrayish___is_arrayish_0.2.1.tgz";
4640 url = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.2.1.tgz";
4641 sha1 = "77c99840527aa8ecb1a8ba697b80645a7a926a9d";
4642 };
4643 }
4644 {
4645 name = "is_arrayish___is_arrayish_0.3.2.tgz";
4646 path = fetchurl {
4647 name = "is_arrayish___is_arrayish_0.3.2.tgz";
4648 url = "https://registry.yarnpkg.com/is-arrayish/-/is-arrayish-0.3.2.tgz";
4649 sha1 = "4574a2ae56f7ab206896fb431eaeed066fdf8f03";
4650 };
4651 }
4652 {
4653 name = "is_binary_path___is_binary_path_1.0.1.tgz";
4654 path = fetchurl {
4655 name = "is_binary_path___is_binary_path_1.0.1.tgz";
4656 url = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-1.0.1.tgz";
4657 sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
4658 };
4659 }
4660 {
4661 name = "is_binary_path___is_binary_path_2.1.0.tgz";
4662 path = fetchurl {
4663 name = "is_binary_path___is_binary_path_2.1.0.tgz";
4664 url = "https://registry.yarnpkg.com/is-binary-path/-/is-binary-path-2.1.0.tgz";
4665 sha1 = "ea1f7f3b80f064236e83470f86c09c254fb45b09";
4666 };
4667 }
4668 {
4669 name = "is_buffer___is_buffer_1.1.6.tgz";
4670 path = fetchurl {
4671 name = "is_buffer___is_buffer_1.1.6.tgz";
4672 url = "https://registry.yarnpkg.com/is-buffer/-/is-buffer-1.1.6.tgz";
4673 sha1 = "efaa2ea9daa0d7ab2ea13a97b2b8ad51fefbe8be";
4674 };
4675 }
4676 {
4677 name = "is_callable___is_callable_1.2.0.tgz";
4678 path = fetchurl {
4679 name = "is_callable___is_callable_1.2.0.tgz";
4680 url = "https://registry.yarnpkg.com/is-callable/-/is-callable-1.2.0.tgz";
4681 sha1 = "83336560b54a38e35e3a2df7afd0454d691468bb";
4682 };
4683 }
4684 {
4685 name = "is_ci___is_ci_1.2.1.tgz";
4686 path = fetchurl {
4687 name = "is_ci___is_ci_1.2.1.tgz";
4688 url = "https://registry.yarnpkg.com/is-ci/-/is-ci-1.2.1.tgz";
4689 sha1 = "e3779c8ee17fccf428488f6e281187f2e632841c";
4690 };
4691 }
4692 {
4693 name = "is_color_stop___is_color_stop_1.1.0.tgz";
4694 path = fetchurl {
4695 name = "is_color_stop___is_color_stop_1.1.0.tgz";
4696 url = "https://registry.yarnpkg.com/is-color-stop/-/is-color-stop-1.1.0.tgz";
4697 sha1 = "cfff471aee4dd5c9e158598fbe12967b5cdad345";
4698 };
4699 }
4700 {
4701 name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
4702 path = fetchurl {
4703 name = "is_data_descriptor___is_data_descriptor_0.1.4.tgz";
4704 url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
4705 sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
4706 };
4707 }
4708 {
4709 name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
4710 path = fetchurl {
4711 name = "is_data_descriptor___is_data_descriptor_1.0.0.tgz";
4712 url = "https://registry.yarnpkg.com/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
4713 sha1 = "d84876321d0e7add03990406abbbbd36ba9268c7";
4714 };
4715 }
4716 {
4717 name = "is_date_object___is_date_object_1.0.2.tgz";
4718 path = fetchurl {
4719 name = "is_date_object___is_date_object_1.0.2.tgz";
4720 url = "https://registry.yarnpkg.com/is-date-object/-/is-date-object-1.0.2.tgz";
4721 sha1 = "bda736f2cd8fd06d32844e7743bfa7494c3bfd7e";
4722 };
4723 }
4724 {
4725 name = "is_descriptor___is_descriptor_0.1.6.tgz";
4726 path = fetchurl {
4727 name = "is_descriptor___is_descriptor_0.1.6.tgz";
4728 url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-0.1.6.tgz";
4729 sha1 = "366d8240dde487ca51823b1ab9f07a10a78251ca";
4730 };
4731 }
4732 {
4733 name = "is_descriptor___is_descriptor_1.0.2.tgz";
4734 path = fetchurl {
4735 name = "is_descriptor___is_descriptor_1.0.2.tgz";
4736 url = "https://registry.yarnpkg.com/is-descriptor/-/is-descriptor-1.0.2.tgz";
4737 sha1 = "3b159746a66604b04f8c81524ba365c5f14d86ec";
4738 };
4739 }
4740 {
4741 name = "is_directory___is_directory_0.3.1.tgz";
4742 path = fetchurl {
4743 name = "is_directory___is_directory_0.3.1.tgz";
4744 url = "https://registry.yarnpkg.com/is-directory/-/is-directory-0.3.1.tgz";
4745 sha1 = "61339b6f2475fc772fd9c9d83f5c8575dc154ae1";
4746 };
4747 }
4748 {
4749 name = "is_docker___is_docker_2.0.0.tgz";
4750 path = fetchurl {
4751 name = "is_docker___is_docker_2.0.0.tgz";
4752 url = "https://registry.yarnpkg.com/is-docker/-/is-docker-2.0.0.tgz";
4753 sha1 = "2cb0df0e75e2d064fe1864c37cdeacb7b2dcf25b";
4754 };
4755 }
4756 {
4757 name = "is_extendable___is_extendable_0.1.1.tgz";
4758 path = fetchurl {
4759 name = "is_extendable___is_extendable_0.1.1.tgz";
4760 url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-0.1.1.tgz";
4761 sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
4762 };
4763 }
4764 {
4765 name = "is_extendable___is_extendable_1.0.1.tgz";
4766 path = fetchurl {
4767 name = "is_extendable___is_extendable_1.0.1.tgz";
4768 url = "https://registry.yarnpkg.com/is-extendable/-/is-extendable-1.0.1.tgz";
4769 sha1 = "a7470f9e426733d81bd81e1155264e3a3507cab4";
4770 };
4771 }
4772 {
4773 name = "is_extglob___is_extglob_2.1.1.tgz";
4774 path = fetchurl {
4775 name = "is_extglob___is_extglob_2.1.1.tgz";
4776 url = "https://registry.yarnpkg.com/is-extglob/-/is-extglob-2.1.1.tgz";
4777 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
4778 };
4779 }
4780 {
4781 name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
4782 path = fetchurl {
4783 name = "is_fullwidth_code_point___is_fullwidth_code_point_2.0.0.tgz";
4784 url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
4785 sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
4786 };
4787 }
4788 {
4789 name = "is_fullwidth_code_point___is_fullwidth_code_point_3.0.0.tgz";
4790 path = fetchurl {
4791 name = "is_fullwidth_code_point___is_fullwidth_code_point_3.0.0.tgz";
4792 url = "https://registry.yarnpkg.com/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz";
4793 sha1 = "f116f8064fe90b3f7844a38997c0b75051269f1d";
4794 };
4795 }
4796 {
4797 name = "is_glob___is_glob_3.1.0.tgz";
4798 path = fetchurl {
4799 name = "is_glob___is_glob_3.1.0.tgz";
4800 url = "https://registry.yarnpkg.com/is-glob/-/is-glob-3.1.0.tgz";
4801 sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
4802 };
4803 }
4804 {
4805 name = "is_glob___is_glob_4.0.1.tgz";
4806 path = fetchurl {
4807 name = "is_glob___is_glob_4.0.1.tgz";
4808 url = "https://registry.yarnpkg.com/is-glob/-/is-glob-4.0.1.tgz";
4809 sha1 = "7567dbe9f2f5e2467bc77ab83c4a29482407a5dc";
4810 };
4811 }
4812 {
4813 name = "is_number___is_number_3.0.0.tgz";
4814 path = fetchurl {
4815 name = "is_number___is_number_3.0.0.tgz";
4816 url = "https://registry.yarnpkg.com/is-number/-/is-number-3.0.0.tgz";
4817 sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
4818 };
4819 }
4820 {
4821 name = "is_number___is_number_7.0.0.tgz";
4822 path = fetchurl {
4823 name = "is_number___is_number_7.0.0.tgz";
4824 url = "https://registry.yarnpkg.com/is-number/-/is-number-7.0.0.tgz";
4825 sha1 = "7535345b896734d5f80c4d06c50955527a14f12b";
4826 };
4827 }
4828 {
4829 name = "is_obj___is_obj_1.0.1.tgz";
4830 path = fetchurl {
4831 name = "is_obj___is_obj_1.0.1.tgz";
4832 url = "https://registry.yarnpkg.com/is-obj/-/is-obj-1.0.1.tgz";
4833 sha1 = "3e4729ac1f5fde025cd7d83a896dab9f4f67db0f";
4834 };
4835 }
4836 {
4837 name = "is_obj___is_obj_2.0.0.tgz";
4838 path = fetchurl {
4839 name = "is_obj___is_obj_2.0.0.tgz";
4840 url = "https://registry.yarnpkg.com/is-obj/-/is-obj-2.0.0.tgz";
4841 sha1 = "473fb05d973705e3fd9620545018ca8e22ef4982";
4842 };
4843 }
4844 {
4845 name = "is_path_cwd___is_path_cwd_2.2.0.tgz";
4846 path = fetchurl {
4847 name = "is_path_cwd___is_path_cwd_2.2.0.tgz";
4848 url = "https://registry.yarnpkg.com/is-path-cwd/-/is-path-cwd-2.2.0.tgz";
4849 sha1 = "67d43b82664a7b5191fd9119127eb300048a9fdb";
4850 };
4851 }
4852 {
4853 name = "is_path_in_cwd___is_path_in_cwd_2.1.0.tgz";
4854 path = fetchurl {
4855 name = "is_path_in_cwd___is_path_in_cwd_2.1.0.tgz";
4856 url = "https://registry.yarnpkg.com/is-path-in-cwd/-/is-path-in-cwd-2.1.0.tgz";
4857 sha1 = "bfe2dca26c69f397265a4009963602935a053acb";
4858 };
4859 }
4860 {
4861 name = "is_path_inside___is_path_inside_2.1.0.tgz";
4862 path = fetchurl {
4863 name = "is_path_inside___is_path_inside_2.1.0.tgz";
4864 url = "https://registry.yarnpkg.com/is-path-inside/-/is-path-inside-2.1.0.tgz";
4865 sha1 = "7c9810587d659a40d27bcdb4d5616eab059494b2";
4866 };
4867 }
4868 {
4869 name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
4870 path = fetchurl {
4871 name = "is_plain_obj___is_plain_obj_1.1.0.tgz";
4872 url = "https://registry.yarnpkg.com/is-plain-obj/-/is-plain-obj-1.1.0.tgz";
4873 sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e";
4874 };
4875 }
4876 {
4877 name = "is_plain_object___is_plain_object_2.0.4.tgz";
4878 path = fetchurl {
4879 name = "is_plain_object___is_plain_object_2.0.4.tgz";
4880 url = "https://registry.yarnpkg.com/is-plain-object/-/is-plain-object-2.0.4.tgz";
4881 sha1 = "2c163b3fafb1b606d9d17928f05c2a1c38e07677";
4882 };
4883 }
4884 {
4885 name = "is_regex___is_regex_1.1.0.tgz";
4886 path = fetchurl {
4887 name = "is_regex___is_regex_1.1.0.tgz";
4888 url = "https://registry.yarnpkg.com/is-regex/-/is-regex-1.1.0.tgz";
4889 sha1 = "ece38e389e490df0dc21caea2bd596f987f767ff";
4890 };
4891 }
4892 {
4893 name = "is_regexp___is_regexp_1.0.0.tgz";
4894 path = fetchurl {
4895 name = "is_regexp___is_regexp_1.0.0.tgz";
4896 url = "https://registry.yarnpkg.com/is-regexp/-/is-regexp-1.0.0.tgz";
4897 sha1 = "fd2d883545c46bac5a633e7b9a09e87fa2cb5069";
4898 };
4899 }
4900 {
4901 name = "is_resolvable___is_resolvable_1.1.0.tgz";
4902 path = fetchurl {
4903 name = "is_resolvable___is_resolvable_1.1.0.tgz";
4904 url = "https://registry.yarnpkg.com/is-resolvable/-/is-resolvable-1.1.0.tgz";
4905 sha1 = "fb18f87ce1feb925169c9a407c19318a3206ed88";
4906 };
4907 }
4908 {
4909 name = "is_stream___is_stream_1.1.0.tgz";
4910 path = fetchurl {
4911 name = "is_stream___is_stream_1.1.0.tgz";
4912 url = "https://registry.yarnpkg.com/is-stream/-/is-stream-1.1.0.tgz";
4913 sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
4914 };
4915 }
4916 {
4917 name = "is_stream___is_stream_2.0.0.tgz";
4918 path = fetchurl {
4919 name = "is_stream___is_stream_2.0.0.tgz";
4920 url = "https://registry.yarnpkg.com/is-stream/-/is-stream-2.0.0.tgz";
4921 sha1 = "bde9c32680d6fae04129d6ac9d921ce7815f78e3";
4922 };
4923 }
4924 {
4925 name = "is_svg___is_svg_3.0.0.tgz";
4926 path = fetchurl {
4927 name = "is_svg___is_svg_3.0.0.tgz";
4928 url = "https://registry.yarnpkg.com/is-svg/-/is-svg-3.0.0.tgz";
4929 sha1 = "9321dbd29c212e5ca99c4fa9794c714bcafa2f75";
4930 };
4931 }
4932 {
4933 name = "is_symbol___is_symbol_1.0.3.tgz";
4934 path = fetchurl {
4935 name = "is_symbol___is_symbol_1.0.3.tgz";
4936 url = "https://registry.yarnpkg.com/is-symbol/-/is-symbol-1.0.3.tgz";
4937 sha1 = "38e1014b9e6329be0de9d24a414fd7441ec61937";
4938 };
4939 }
4940 {
4941 name = "is_typedarray___is_typedarray_1.0.0.tgz";
4942 path = fetchurl {
4943 name = "is_typedarray___is_typedarray_1.0.0.tgz";
4944 url = "https://registry.yarnpkg.com/is-typedarray/-/is-typedarray-1.0.0.tgz";
4945 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
4946 };
4947 }
4948 {
4949 name = "is_windows___is_windows_1.0.2.tgz";
4950 path = fetchurl {
4951 name = "is_windows___is_windows_1.0.2.tgz";
4952 url = "https://registry.yarnpkg.com/is-windows/-/is-windows-1.0.2.tgz";
4953 sha1 = "d1850eb9791ecd18e6182ce12a30f396634bb19d";
4954 };
4955 }
4956 {
4957 name = "is_wsl___is_wsl_1.1.0.tgz";
4958 path = fetchurl {
4959 name = "is_wsl___is_wsl_1.1.0.tgz";
4960 url = "https://registry.yarnpkg.com/is-wsl/-/is-wsl-1.1.0.tgz";
4961 sha1 = "1f16e4aa22b04d1336b66188a66af3c600c3a66d";
4962 };
4963 }
4964 {
4965 name = "is_wsl___is_wsl_2.2.0.tgz";
4966 path = fetchurl {
4967 name = "is_wsl___is_wsl_2.2.0.tgz";
4968 url = "https://registry.yarnpkg.com/is-wsl/-/is-wsl-2.2.0.tgz";
4969 sha1 = "74a4c76e77ca9fd3f932f290c17ea326cd157271";
4970 };
4971 }
4972 {
4973 name = "isarray___isarray_1.0.0.tgz";
4974 path = fetchurl {
4975 name = "isarray___isarray_1.0.0.tgz";
4976 url = "https://registry.yarnpkg.com/isarray/-/isarray-1.0.0.tgz";
4977 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
4978 };
4979 }
4980 {
4981 name = "isexe___isexe_2.0.0.tgz";
4982 path = fetchurl {
4983 name = "isexe___isexe_2.0.0.tgz";
4984 url = "https://registry.yarnpkg.com/isexe/-/isexe-2.0.0.tgz";
4985 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
4986 };
4987 }
4988 {
4989 name = "isobject___isobject_2.1.0.tgz";
4990 path = fetchurl {
4991 name = "isobject___isobject_2.1.0.tgz";
4992 url = "https://registry.yarnpkg.com/isobject/-/isobject-2.1.0.tgz";
4993 sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
4994 };
4995 }
4996 {
4997 name = "isobject___isobject_3.0.1.tgz";
4998 path = fetchurl {
4999 name = "isobject___isobject_3.0.1.tgz";
5000 url = "https://registry.yarnpkg.com/isobject/-/isobject-3.0.1.tgz";
5001 sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
5002 };
5003 }
5004 {
5005 name = "isstream___isstream_0.1.2.tgz";
5006 path = fetchurl {
5007 name = "isstream___isstream_0.1.2.tgz";
5008 url = "https://registry.yarnpkg.com/isstream/-/isstream-0.1.2.tgz";
5009 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
5010 };
5011 }
5012 {
5013 name = "javascript_stringify___javascript_stringify_2.0.1.tgz";
5014 path = fetchurl {
5015 name = "javascript_stringify___javascript_stringify_2.0.1.tgz";
5016 url = "https://registry.yarnpkg.com/javascript-stringify/-/javascript-stringify-2.0.1.tgz";
5017 sha1 = "6ef358035310e35d667c675ed63d3eb7c1aa19e5";
5018 };
5019 }
5020 {
5021 name = "jest_worker___jest_worker_25.5.0.tgz";
5022 path = fetchurl {
5023 name = "jest_worker___jest_worker_25.5.0.tgz";
5024 url = "https://registry.yarnpkg.com/jest-worker/-/jest-worker-25.5.0.tgz";
5025 sha1 = "2611d071b79cea0f43ee57a3d118593ac1547db1";
5026 };
5027 }
5028 {
5029 name = "js_message___js_message_1.0.5.tgz";
5030 path = fetchurl {
5031 name = "js_message___js_message_1.0.5.tgz";
5032 url = "https://registry.yarnpkg.com/js-message/-/js-message-1.0.5.tgz";
5033 sha1 = "2300d24b1af08e89dd095bc1a4c9c9cfcb892d15";
5034 };
5035 }
5036 {
5037 name = "js_queue___js_queue_2.0.0.tgz";
5038 path = fetchurl {
5039 name = "js_queue___js_queue_2.0.0.tgz";
5040 url = "https://registry.yarnpkg.com/js-queue/-/js-queue-2.0.0.tgz";
5041 sha1 = "362213cf860f468f0125fc6c96abc1742531f948";
5042 };
5043 }
5044 {
5045 name = "js_tokens___js_tokens_4.0.0.tgz";
5046 path = fetchurl {
5047 name = "js_tokens___js_tokens_4.0.0.tgz";
5048 url = "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz";
5049 sha1 = "19203fb59991df98e3a287050d4647cdeaf32499";
5050 };
5051 }
5052 {
5053 name = "js_yaml___js_yaml_3.14.0.tgz";
5054 path = fetchurl {
5055 name = "js_yaml___js_yaml_3.14.0.tgz";
5056 url = "https://registry.yarnpkg.com/js-yaml/-/js-yaml-3.14.0.tgz";
5057 sha1 = "a7a34170f26a21bb162424d8adacb4113a69e482";
5058 };
5059 }
5060 {
5061 name = "jsbn___jsbn_0.1.1.tgz";
5062 path = fetchurl {
5063 name = "jsbn___jsbn_0.1.1.tgz";
5064 url = "https://registry.yarnpkg.com/jsbn/-/jsbn-0.1.1.tgz";
5065 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
5066 };
5067 }
5068 {
5069 name = "jsesc___jsesc_2.5.2.tgz";
5070 path = fetchurl {
5071 name = "jsesc___jsesc_2.5.2.tgz";
5072 url = "https://registry.yarnpkg.com/jsesc/-/jsesc-2.5.2.tgz";
5073 sha1 = "80564d2e483dacf6e8ef209650a67df3f0c283a4";
5074 };
5075 }
5076 {
5077 name = "jsesc___jsesc_0.5.0.tgz";
5078 path = fetchurl {
5079 name = "jsesc___jsesc_0.5.0.tgz";
5080 url = "https://registry.yarnpkg.com/jsesc/-/jsesc-0.5.0.tgz";
5081 sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
5082 };
5083 }
5084 {
5085 name = "json_parse_better_errors___json_parse_better_errors_1.0.2.tgz";
5086 path = fetchurl {
5087 name = "json_parse_better_errors___json_parse_better_errors_1.0.2.tgz";
5088 url = "https://registry.yarnpkg.com/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
5089 sha1 = "bb867cfb3450e69107c131d1c514bab3dc8bcaa9";
5090 };
5091 }
5092 {
5093 name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
5094 path = fetchurl {
5095 name = "json_schema_traverse___json_schema_traverse_0.4.1.tgz";
5096 url = "https://registry.yarnpkg.com/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
5097 sha1 = "69f6a87d9513ab8bb8fe63bdb0979c448e684660";
5098 };
5099 }
5100 {
5101 name = "json_schema___json_schema_0.2.3.tgz";
5102 path = fetchurl {
5103 name = "json_schema___json_schema_0.2.3.tgz";
5104 url = "https://registry.yarnpkg.com/json-schema/-/json-schema-0.2.3.tgz";
5105 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
5106 };
5107 }
5108 {
5109 name = "json_stable_stringify_without_jsonify___json_stable_stringify_without_jsonify_1.0.1.tgz";
5110 path = fetchurl {
5111 name = "json_stable_stringify_without_jsonify___json_stable_stringify_without_jsonify_1.0.1.tgz";
5112 url = "https://registry.yarnpkg.com/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz";
5113 sha1 = "9db7b59496ad3f3cfef30a75142d2d930ad72651";
5114 };
5115 }
5116 {
5117 name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
5118 path = fetchurl {
5119 name = "json_stable_stringify___json_stable_stringify_1.0.1.tgz";
5120 url = "https://registry.yarnpkg.com/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
5121 sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
5122 };
5123 }
5124 {
5125 name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
5126 path = fetchurl {
5127 name = "json_stringify_safe___json_stringify_safe_5.0.1.tgz";
5128 url = "https://registry.yarnpkg.com/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
5129 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
5130 };
5131 }
5132 {
5133 name = "json3___json3_3.3.3.tgz";
5134 path = fetchurl {
5135 name = "json3___json3_3.3.3.tgz";
5136 url = "https://registry.yarnpkg.com/json3/-/json3-3.3.3.tgz";
5137 sha1 = "7fc10e375fc5ae42c4705a5cc0aa6f62be305b81";
5138 };
5139 }
5140 {
5141 name = "json5___json5_0.5.1.tgz";
5142 path = fetchurl {
5143 name = "json5___json5_0.5.1.tgz";
5144 url = "https://registry.yarnpkg.com/json5/-/json5-0.5.1.tgz";
5145 sha1 = "1eade7acc012034ad84e2396767ead9fa5495821";
5146 };
5147 }
5148 {
5149 name = "json5___json5_1.0.1.tgz";
5150 path = fetchurl {
5151 name = "json5___json5_1.0.1.tgz";
5152 url = "https://registry.yarnpkg.com/json5/-/json5-1.0.1.tgz";
5153 sha1 = "779fb0018604fa854eacbf6252180d83543e3dbe";
5154 };
5155 }
5156 {
5157 name = "json5___json5_2.1.3.tgz";
5158 path = fetchurl {
5159 name = "json5___json5_2.1.3.tgz";
5160 url = "https://registry.yarnpkg.com/json5/-/json5-2.1.3.tgz";
5161 sha1 = "c9b0f7fa9233bfe5807fe66fcf3a5617ed597d43";
5162 };
5163 }
5164 {
5165 name = "jsonfile___jsonfile_4.0.0.tgz";
5166 path = fetchurl {
5167 name = "jsonfile___jsonfile_4.0.0.tgz";
5168 url = "https://registry.yarnpkg.com/jsonfile/-/jsonfile-4.0.0.tgz";
5169 sha1 = "8771aae0799b64076b76640fca058f9c10e33ecb";
5170 };
5171 }
5172 {
5173 name = "jsonify___jsonify_0.0.0.tgz";
5174 path = fetchurl {
5175 name = "jsonify___jsonify_0.0.0.tgz";
5176 url = "https://registry.yarnpkg.com/jsonify/-/jsonify-0.0.0.tgz";
5177 sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
5178 };
5179 }
5180 {
5181 name = "jsprim___jsprim_1.4.1.tgz";
5182 path = fetchurl {
5183 name = "jsprim___jsprim_1.4.1.tgz";
5184 url = "https://registry.yarnpkg.com/jsprim/-/jsprim-1.4.1.tgz";
5185 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
5186 };
5187 }
5188 {
5189 name = "killable___killable_1.0.1.tgz";
5190 path = fetchurl {
5191 name = "killable___killable_1.0.1.tgz";
5192 url = "https://registry.yarnpkg.com/killable/-/killable-1.0.1.tgz";
5193 sha1 = "4c8ce441187a061c7474fb87ca08e2a638194892";
5194 };
5195 }
5196 {
5197 name = "kind_of___kind_of_3.2.2.tgz";
5198 path = fetchurl {
5199 name = "kind_of___kind_of_3.2.2.tgz";
5200 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-3.2.2.tgz";
5201 sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
5202 };
5203 }
5204 {
5205 name = "kind_of___kind_of_4.0.0.tgz";
5206 path = fetchurl {
5207 name = "kind_of___kind_of_4.0.0.tgz";
5208 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-4.0.0.tgz";
5209 sha1 = "20813df3d712928b207378691a45066fae72dd57";
5210 };
5211 }
5212 {
5213 name = "kind_of___kind_of_5.1.0.tgz";
5214 path = fetchurl {
5215 name = "kind_of___kind_of_5.1.0.tgz";
5216 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-5.1.0.tgz";
5217 sha1 = "729c91e2d857b7a419a1f9aa65685c4c33f5845d";
5218 };
5219 }
5220 {
5221 name = "kind_of___kind_of_6.0.3.tgz";
5222 path = fetchurl {
5223 name = "kind_of___kind_of_6.0.3.tgz";
5224 url = "https://registry.yarnpkg.com/kind-of/-/kind-of-6.0.3.tgz";
5225 sha1 = "07c05034a6c349fa06e24fa35aa76db4580ce4dd";
5226 };
5227 }
5228 {
5229 name = "launch_editor_middleware___launch_editor_middleware_2.2.1.tgz";
5230 path = fetchurl {
5231 name = "launch_editor_middleware___launch_editor_middleware_2.2.1.tgz";
5232 url = "https://registry.yarnpkg.com/launch-editor-middleware/-/launch-editor-middleware-2.2.1.tgz";
5233 sha1 = "e14b07e6c7154b0a4b86a0fd345784e45804c157";
5234 };
5235 }
5236 {
5237 name = "launch_editor___launch_editor_2.2.1.tgz";
5238 path = fetchurl {
5239 name = "launch_editor___launch_editor_2.2.1.tgz";
5240 url = "https://registry.yarnpkg.com/launch-editor/-/launch-editor-2.2.1.tgz";
5241 sha1 = "871b5a3ee39d6680fcc26d37930b6eeda89db0ca";
5242 };
5243 }
5244 {
5245 name = "leven___leven_3.1.0.tgz";
5246 path = fetchurl {
5247 name = "leven___leven_3.1.0.tgz";
5248 url = "https://registry.yarnpkg.com/leven/-/leven-3.1.0.tgz";
5249 sha1 = "77891de834064cccba82ae7842bb6b14a13ed7f2";
5250 };
5251 }
5252 {
5253 name = "levenary___levenary_1.1.1.tgz";
5254 path = fetchurl {
5255 name = "levenary___levenary_1.1.1.tgz";
5256 url = "https://registry.yarnpkg.com/levenary/-/levenary-1.1.1.tgz";
5257 sha1 = "842a9ee98d2075aa7faeedbe32679e9205f46f77";
5258 };
5259 }
5260 {
5261 name = "levn___levn_0.4.1.tgz";
5262 path = fetchurl {
5263 name = "levn___levn_0.4.1.tgz";
5264 url = "https://registry.yarnpkg.com/levn/-/levn-0.4.1.tgz";
5265 sha1 = "ae4562c007473b932a6200d403268dd2fffc6ade";
5266 };
5267 }
5268 {
5269 name = "lines_and_columns___lines_and_columns_1.1.6.tgz";
5270 path = fetchurl {
5271 name = "lines_and_columns___lines_and_columns_1.1.6.tgz";
5272 url = "https://registry.yarnpkg.com/lines-and-columns/-/lines-and-columns-1.1.6.tgz";
5273 sha1 = "1c00c743b433cd0a4e80758f7b64a57440d9ff00";
5274 };
5275 }
5276 {
5277 name = "loader_fs_cache___loader_fs_cache_1.0.3.tgz";
5278 path = fetchurl {
5279 name = "loader_fs_cache___loader_fs_cache_1.0.3.tgz";
5280 url = "https://registry.yarnpkg.com/loader-fs-cache/-/loader-fs-cache-1.0.3.tgz";
5281 sha1 = "f08657646d607078be2f0a032f8bd69dd6f277d9";
5282 };
5283 }
5284 {
5285 name = "loader_runner___loader_runner_2.4.0.tgz";
5286 path = fetchurl {
5287 name = "loader_runner___loader_runner_2.4.0.tgz";
5288 url = "https://registry.yarnpkg.com/loader-runner/-/loader-runner-2.4.0.tgz";
5289 sha1 = "ed47066bfe534d7e84c4c7b9998c2a75607d9357";
5290 };
5291 }
5292 {
5293 name = "loader_utils___loader_utils_0.2.17.tgz";
5294 path = fetchurl {
5295 name = "loader_utils___loader_utils_0.2.17.tgz";
5296 url = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-0.2.17.tgz";
5297 sha1 = "f86e6374d43205a6e6c60e9196f17c0299bfb348";
5298 };
5299 }
5300 {
5301 name = "loader_utils___loader_utils_1.4.0.tgz";
5302 path = fetchurl {
5303 name = "loader_utils___loader_utils_1.4.0.tgz";
5304 url = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-1.4.0.tgz";
5305 sha1 = "c579b5e34cb34b1a74edc6c1fb36bfa371d5a613";
5306 };
5307 }
5308 {
5309 name = "loader_utils___loader_utils_2.0.0.tgz";
5310 path = fetchurl {
5311 name = "loader_utils___loader_utils_2.0.0.tgz";
5312 url = "https://registry.yarnpkg.com/loader-utils/-/loader-utils-2.0.0.tgz";
5313 sha1 = "e4cace5b816d425a166b5f097e10cd12b36064b0";
5314 };
5315 }
5316 {
5317 name = "locate_path___locate_path_2.0.0.tgz";
5318 path = fetchurl {
5319 name = "locate_path___locate_path_2.0.0.tgz";
5320 url = "https://registry.yarnpkg.com/locate-path/-/locate-path-2.0.0.tgz";
5321 sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
5322 };
5323 }
5324 {
5325 name = "locate_path___locate_path_3.0.0.tgz";
5326 path = fetchurl {
5327 name = "locate_path___locate_path_3.0.0.tgz";
5328 url = "https://registry.yarnpkg.com/locate-path/-/locate-path-3.0.0.tgz";
5329 sha1 = "dbec3b3ab759758071b58fe59fc41871af21400e";
5330 };
5331 }
5332 {
5333 name = "locate_path___locate_path_5.0.0.tgz";
5334 path = fetchurl {
5335 name = "locate_path___locate_path_5.0.0.tgz";
5336 url = "https://registry.yarnpkg.com/locate-path/-/locate-path-5.0.0.tgz";
5337 sha1 = "1afba396afd676a6d42504d0a67a3a7eb9f62aa0";
5338 };
5339 }
5340 {
5341 name = "lodash._reinterpolate___lodash._reinterpolate_3.0.0.tgz";
5342 path = fetchurl {
5343 name = "lodash._reinterpolate___lodash._reinterpolate_3.0.0.tgz";
5344 url = "https://registry.yarnpkg.com/lodash._reinterpolate/-/lodash._reinterpolate-3.0.0.tgz";
5345 sha1 = "0ccf2d89166af03b3663c796538b75ac6e114d9d";
5346 };
5347 }
5348 {
5349 name = "lodash.defaultsdeep___lodash.defaultsdeep_4.6.1.tgz";
5350 path = fetchurl {
5351 name = "lodash.defaultsdeep___lodash.defaultsdeep_4.6.1.tgz";
5352 url = "https://registry.yarnpkg.com/lodash.defaultsdeep/-/lodash.defaultsdeep-4.6.1.tgz";
5353 sha1 = "512e9bd721d272d94e3d3a63653fa17516741ca6";
5354 };
5355 }
5356 {
5357 name = "lodash.kebabcase___lodash.kebabcase_4.1.1.tgz";
5358 path = fetchurl {
5359 name = "lodash.kebabcase___lodash.kebabcase_4.1.1.tgz";
5360 url = "https://registry.yarnpkg.com/lodash.kebabcase/-/lodash.kebabcase-4.1.1.tgz";
5361 sha1 = "8489b1cb0d29ff88195cceca448ff6d6cc295c36";
5362 };
5363 }
5364 {
5365 name = "lodash.mapvalues___lodash.mapvalues_4.6.0.tgz";
5366 path = fetchurl {
5367 name = "lodash.mapvalues___lodash.mapvalues_4.6.0.tgz";
5368 url = "https://registry.yarnpkg.com/lodash.mapvalues/-/lodash.mapvalues-4.6.0.tgz";
5369 sha1 = "1bafa5005de9dd6f4f26668c30ca37230cc9689c";
5370 };
5371 }
5372 {
5373 name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
5374 path = fetchurl {
5375 name = "lodash.memoize___lodash.memoize_4.1.2.tgz";
5376 url = "https://registry.yarnpkg.com/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
5377 sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
5378 };
5379 }
5380 {
5381 name = "lodash.merge___lodash.merge_4.6.2.tgz";
5382 path = fetchurl {
5383 name = "lodash.merge___lodash.merge_4.6.2.tgz";
5384 url = "https://registry.yarnpkg.com/lodash.merge/-/lodash.merge-4.6.2.tgz";
5385 sha1 = "558aa53b43b661e1925a0afdfa36a9a1085fe57a";
5386 };
5387 }
5388 {
5389 name = "lodash.template___lodash.template_4.5.0.tgz";
5390 path = fetchurl {
5391 name = "lodash.template___lodash.template_4.5.0.tgz";
5392 url = "https://registry.yarnpkg.com/lodash.template/-/lodash.template-4.5.0.tgz";
5393 sha1 = "f976195cf3f347d0d5f52483569fe8031ccce8ab";
5394 };
5395 }
5396 {
5397 name = "lodash.templatesettings___lodash.templatesettings_4.2.0.tgz";
5398 path = fetchurl {
5399 name = "lodash.templatesettings___lodash.templatesettings_4.2.0.tgz";
5400 url = "https://registry.yarnpkg.com/lodash.templatesettings/-/lodash.templatesettings-4.2.0.tgz";
5401 sha1 = "e481310f049d3cf6d47e912ad09313b154f0fb33";
5402 };
5403 }
5404 {
5405 name = "lodash.transform___lodash.transform_4.6.0.tgz";
5406 path = fetchurl {
5407 name = "lodash.transform___lodash.transform_4.6.0.tgz";
5408 url = "https://registry.yarnpkg.com/lodash.transform/-/lodash.transform-4.6.0.tgz";
5409 sha1 = "12306422f63324aed8483d3f38332b5f670547a0";
5410 };
5411 }
5412 {
5413 name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
5414 path = fetchurl {
5415 name = "lodash.uniq___lodash.uniq_4.5.0.tgz";
5416 url = "https://registry.yarnpkg.com/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
5417 sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
5418 };
5419 }
5420 {
5421 name = "lodash___lodash_4.17.15.tgz";
5422 path = fetchurl {
5423 name = "lodash___lodash_4.17.15.tgz";
5424 url = "https://registry.yarnpkg.com/lodash/-/lodash-4.17.15.tgz";
5425 sha1 = "b447f6670a0455bbfeedd11392eff330ea097548";
5426 };
5427 }
5428 {
5429 name = "log_symbols___log_symbols_2.2.0.tgz";
5430 path = fetchurl {
5431 name = "log_symbols___log_symbols_2.2.0.tgz";
5432 url = "https://registry.yarnpkg.com/log-symbols/-/log-symbols-2.2.0.tgz";
5433 sha1 = "5740e1c5d6f0dfda4ad9323b5332107ef6b4c40a";
5434 };
5435 }
5436 {
5437 name = "loglevel___loglevel_1.6.8.tgz";
5438 path = fetchurl {
5439 name = "loglevel___loglevel_1.6.8.tgz";
5440 url = "https://registry.yarnpkg.com/loglevel/-/loglevel-1.6.8.tgz";
5441 sha1 = "8a25fb75d092230ecd4457270d80b54e28011171";
5442 };
5443 }
5444 {
5445 name = "loose_envify___loose_envify_1.4.0.tgz";
5446 path = fetchurl {
5447 name = "loose_envify___loose_envify_1.4.0.tgz";
5448 url = "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz";
5449 sha1 = "71ee51fa7be4caec1a63839f7e682d8132d30caf";
5450 };
5451 }
5452 {
5453 name = "lower_case___lower_case_1.1.4.tgz";
5454 path = fetchurl {
5455 name = "lower_case___lower_case_1.1.4.tgz";
5456 url = "https://registry.yarnpkg.com/lower-case/-/lower-case-1.1.4.tgz";
5457 sha1 = "9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac";
5458 };
5459 }
5460 {
5461 name = "lru_cache___lru_cache_4.1.5.tgz";
5462 path = fetchurl {
5463 name = "lru_cache___lru_cache_4.1.5.tgz";
5464 url = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-4.1.5.tgz";
5465 sha1 = "8bbe50ea85bed59bc9e33dcab8235ee9bcf443cd";
5466 };
5467 }
5468 {
5469 name = "lru_cache___lru_cache_5.1.1.tgz";
5470 path = fetchurl {
5471 name = "lru_cache___lru_cache_5.1.1.tgz";
5472 url = "https://registry.yarnpkg.com/lru-cache/-/lru-cache-5.1.1.tgz";
5473 sha1 = "1da27e6710271947695daf6848e847f01d84b920";
5474 };
5475 }
5476 {
5477 name = "make_dir___make_dir_2.1.0.tgz";
5478 path = fetchurl {
5479 name = "make_dir___make_dir_2.1.0.tgz";
5480 url = "https://registry.yarnpkg.com/make-dir/-/make-dir-2.1.0.tgz";
5481 sha1 = "5f0310e18b8be898cc07009295a30ae41e91e6f5";
5482 };
5483 }
5484 {
5485 name = "make_dir___make_dir_3.1.0.tgz";
5486 path = fetchurl {
5487 name = "make_dir___make_dir_3.1.0.tgz";
5488 url = "https://registry.yarnpkg.com/make-dir/-/make-dir-3.1.0.tgz";
5489 sha1 = "415e967046b3a7f1d185277d84aa58203726a13f";
5490 };
5491 }
5492 {
5493 name = "map_cache___map_cache_0.2.2.tgz";
5494 path = fetchurl {
5495 name = "map_cache___map_cache_0.2.2.tgz";
5496 url = "https://registry.yarnpkg.com/map-cache/-/map-cache-0.2.2.tgz";
5497 sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
5498 };
5499 }
5500 {
5501 name = "map_visit___map_visit_1.0.0.tgz";
5502 path = fetchurl {
5503 name = "map_visit___map_visit_1.0.0.tgz";
5504 url = "https://registry.yarnpkg.com/map-visit/-/map-visit-1.0.0.tgz";
5505 sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
5506 };
5507 }
5508 {
5509 name = "md5.js___md5.js_1.3.5.tgz";
5510 path = fetchurl {
5511 name = "md5.js___md5.js_1.3.5.tgz";
5512 url = "https://registry.yarnpkg.com/md5.js/-/md5.js-1.3.5.tgz";
5513 sha1 = "b5d07b8e3216e3e27cd728d72f70d1e6a342005f";
5514 };
5515 }
5516 {
5517 name = "mdn_data___mdn_data_2.0.4.tgz";
5518 path = fetchurl {
5519 name = "mdn_data___mdn_data_2.0.4.tgz";
5520 url = "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.4.tgz";
5521 sha1 = "699b3c38ac6f1d728091a64650b65d388502fd5b";
5522 };
5523 }
5524 {
5525 name = "mdn_data___mdn_data_2.0.6.tgz";
5526 path = fetchurl {
5527 name = "mdn_data___mdn_data_2.0.6.tgz";
5528 url = "https://registry.yarnpkg.com/mdn-data/-/mdn-data-2.0.6.tgz";
5529 sha1 = "852dc60fcaa5daa2e8cf6c9189c440ed3e042978";
5530 };
5531 }
5532 {
5533 name = "media_typer___media_typer_0.3.0.tgz";
5534 path = fetchurl {
5535 name = "media_typer___media_typer_0.3.0.tgz";
5536 url = "https://registry.yarnpkg.com/media-typer/-/media-typer-0.3.0.tgz";
5537 sha1 = "8710d7af0aa626f8fffa1ce00168545263255748";
5538 };
5539 }
5540 {
5541 name = "memory_fs___memory_fs_0.4.1.tgz";
5542 path = fetchurl {
5543 name = "memory_fs___memory_fs_0.4.1.tgz";
5544 url = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.4.1.tgz";
5545 sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552";
5546 };
5547 }
5548 {
5549 name = "memory_fs___memory_fs_0.5.0.tgz";
5550 path = fetchurl {
5551 name = "memory_fs___memory_fs_0.5.0.tgz";
5552 url = "https://registry.yarnpkg.com/memory-fs/-/memory-fs-0.5.0.tgz";
5553 sha1 = "324c01288b88652966d161db77838720845a8e3c";
5554 };
5555 }
5556 {
5557 name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
5558 path = fetchurl {
5559 name = "merge_descriptors___merge_descriptors_1.0.1.tgz";
5560 url = "https://registry.yarnpkg.com/merge-descriptors/-/merge-descriptors-1.0.1.tgz";
5561 sha1 = "b00aaa556dd8b44568150ec9d1b953f3f90cbb61";
5562 };
5563 }
5564 {
5565 name = "merge_source_map___merge_source_map_1.1.0.tgz";
5566 path = fetchurl {
5567 name = "merge_source_map___merge_source_map_1.1.0.tgz";
5568 url = "https://registry.yarnpkg.com/merge-source-map/-/merge-source-map-1.1.0.tgz";
5569 sha1 = "2fdde7e6020939f70906a68f2d7ae685e4c8c646";
5570 };
5571 }
5572 {
5573 name = "merge_stream___merge_stream_2.0.0.tgz";
5574 path = fetchurl {
5575 name = "merge_stream___merge_stream_2.0.0.tgz";
5576 url = "https://registry.yarnpkg.com/merge-stream/-/merge-stream-2.0.0.tgz";
5577 sha1 = "52823629a14dd00c9770fb6ad47dc6310f2c1f60";
5578 };
5579 }
5580 {
5581 name = "merge2___merge2_1.4.1.tgz";
5582 path = fetchurl {
5583 name = "merge2___merge2_1.4.1.tgz";
5584 url = "https://registry.yarnpkg.com/merge2/-/merge2-1.4.1.tgz";
5585 sha1 = "4368892f885e907455a6fd7dc55c0c9d404990ae";
5586 };
5587 }
5588 {
5589 name = "methods___methods_1.1.2.tgz";
5590 path = fetchurl {
5591 name = "methods___methods_1.1.2.tgz";
5592 url = "https://registry.yarnpkg.com/methods/-/methods-1.1.2.tgz";
5593 sha1 = "5529a4d67654134edcc5266656835b0f851afcee";
5594 };
5595 }
5596 {
5597 name = "micromatch___micromatch_3.1.10.tgz";
5598 path = fetchurl {
5599 name = "micromatch___micromatch_3.1.10.tgz";
5600 url = "https://registry.yarnpkg.com/micromatch/-/micromatch-3.1.10.tgz";
5601 sha1 = "70859bc95c9840952f359a068a3fc49f9ecfac23";
5602 };
5603 }
5604 {
5605 name = "miller_rabin___miller_rabin_4.0.1.tgz";
5606 path = fetchurl {
5607 name = "miller_rabin___miller_rabin_4.0.1.tgz";
5608 url = "https://registry.yarnpkg.com/miller-rabin/-/miller-rabin-4.0.1.tgz";
5609 sha1 = "f080351c865b0dc562a8462966daa53543c78a4d";
5610 };
5611 }
5612 {
5613 name = "mime_db___mime_db_1.44.0.tgz";
5614 path = fetchurl {
5615 name = "mime_db___mime_db_1.44.0.tgz";
5616 url = "https://registry.yarnpkg.com/mime-db/-/mime-db-1.44.0.tgz";
5617 sha1 = "fa11c5eb0aca1334b4233cb4d52f10c5a6272f92";
5618 };
5619 }
5620 {
5621 name = "mime_types___mime_types_2.1.27.tgz";
5622 path = fetchurl {
5623 name = "mime_types___mime_types_2.1.27.tgz";
5624 url = "https://registry.yarnpkg.com/mime-types/-/mime-types-2.1.27.tgz";
5625 sha1 = "47949f98e279ea53119f5722e0f34e529bec009f";
5626 };
5627 }
5628 {
5629 name = "mime___mime_1.6.0.tgz";
5630 path = fetchurl {
5631 name = "mime___mime_1.6.0.tgz";
5632 url = "https://registry.yarnpkg.com/mime/-/mime-1.6.0.tgz";
5633 sha1 = "32cd9e5c64553bd58d19a568af452acff04981b1";
5634 };
5635 }
5636 {
5637 name = "mime___mime_2.4.6.tgz";
5638 path = fetchurl {
5639 name = "mime___mime_2.4.6.tgz";
5640 url = "https://registry.yarnpkg.com/mime/-/mime-2.4.6.tgz";
5641 sha1 = "e5b407c90db442f2beb5b162373d07b69affa4d1";
5642 };
5643 }
5644 {
5645 name = "mimic_fn___mimic_fn_1.2.0.tgz";
5646 path = fetchurl {
5647 name = "mimic_fn___mimic_fn_1.2.0.tgz";
5648 url = "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-1.2.0.tgz";
5649 sha1 = "820c86a39334640e99516928bd03fca88057d022";
5650 };
5651 }
5652 {
5653 name = "mimic_fn___mimic_fn_2.1.0.tgz";
5654 path = fetchurl {
5655 name = "mimic_fn___mimic_fn_2.1.0.tgz";
5656 url = "https://registry.yarnpkg.com/mimic-fn/-/mimic-fn-2.1.0.tgz";
5657 sha1 = "7ed2c2ccccaf84d3ffcb7a69b57711fc2083401b";
5658 };
5659 }
5660 {
5661 name = "mini_css_extract_plugin___mini_css_extract_plugin_0.9.0.tgz";
5662 path = fetchurl {
5663 name = "mini_css_extract_plugin___mini_css_extract_plugin_0.9.0.tgz";
5664 url = "https://registry.yarnpkg.com/mini-css-extract-plugin/-/mini-css-extract-plugin-0.9.0.tgz";
5665 sha1 = "47f2cf07aa165ab35733b1fc97d4c46c0564339e";
5666 };
5667 }
5668 {
5669 name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
5670 path = fetchurl {
5671 name = "minimalistic_assert___minimalistic_assert_1.0.1.tgz";
5672 url = "https://registry.yarnpkg.com/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
5673 sha1 = "2e194de044626d4a10e7f7fbc00ce73e83e4d5c7";
5674 };
5675 }
5676 {
5677 name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
5678 path = fetchurl {
5679 name = "minimalistic_crypto_utils___minimalistic_crypto_utils_1.0.1.tgz";
5680 url = "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
5681 sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
5682 };
5683 }
5684 {
5685 name = "minimatch___minimatch_3.0.4.tgz";
5686 path = fetchurl {
5687 name = "minimatch___minimatch_3.0.4.tgz";
5688 url = "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz";
5689 sha1 = "5166e286457f03306064be5497e8dbb0c3d32083";
5690 };
5691 }
5692 {
5693 name = "minimist___minimist_1.2.5.tgz";
5694 path = fetchurl {
5695 name = "minimist___minimist_1.2.5.tgz";
5696 url = "https://registry.yarnpkg.com/minimist/-/minimist-1.2.5.tgz";
5697 sha1 = "67d66014b66a6a8aaa0c083c5fd58df4e4e97602";
5698 };
5699 }
5700 {
5701 name = "minipass_collect___minipass_collect_1.0.2.tgz";
5702 path = fetchurl {
5703 name = "minipass_collect___minipass_collect_1.0.2.tgz";
5704 url = "https://registry.yarnpkg.com/minipass-collect/-/minipass-collect-1.0.2.tgz";
5705 sha1 = "22b813bf745dc6edba2576b940022ad6edc8c617";
5706 };
5707 }
5708 {
5709 name = "minipass_flush___minipass_flush_1.0.5.tgz";
5710 path = fetchurl {
5711 name = "minipass_flush___minipass_flush_1.0.5.tgz";
5712 url = "https://registry.yarnpkg.com/minipass-flush/-/minipass-flush-1.0.5.tgz";
5713 sha1 = "82e7135d7e89a50ffe64610a787953c4c4cbb373";
5714 };
5715 }
5716 {
5717 name = "minipass_pipeline___minipass_pipeline_1.2.3.tgz";
5718 path = fetchurl {
5719 name = "minipass_pipeline___minipass_pipeline_1.2.3.tgz";
5720 url = "https://registry.yarnpkg.com/minipass-pipeline/-/minipass-pipeline-1.2.3.tgz";
5721 sha1 = "55f7839307d74859d6e8ada9c3ebe72cec216a34";
5722 };
5723 }
5724 {
5725 name = "minipass___minipass_3.1.3.tgz";
5726 path = fetchurl {
5727 name = "minipass___minipass_3.1.3.tgz";
5728 url = "https://registry.yarnpkg.com/minipass/-/minipass-3.1.3.tgz";
5729 sha1 = "7d42ff1f39635482e15f9cdb53184deebd5815fd";
5730 };
5731 }
5732 {
5733 name = "mississippi___mississippi_3.0.0.tgz";
5734 path = fetchurl {
5735 name = "mississippi___mississippi_3.0.0.tgz";
5736 url = "https://registry.yarnpkg.com/mississippi/-/mississippi-3.0.0.tgz";
5737 sha1 = "ea0a3291f97e0b5e8776b363d5f0a12d94c67022";
5738 };
5739 }
5740 {
5741 name = "mixin_deep___mixin_deep_1.3.2.tgz";
5742 path = fetchurl {
5743 name = "mixin_deep___mixin_deep_1.3.2.tgz";
5744 url = "https://registry.yarnpkg.com/mixin-deep/-/mixin-deep-1.3.2.tgz";
5745 sha1 = "1120b43dc359a785dce65b55b82e257ccf479566";
5746 };
5747 }
5748 {
5749 name = "mkdirp___mkdirp_0.5.5.tgz";
5750 path = fetchurl {
5751 name = "mkdirp___mkdirp_0.5.5.tgz";
5752 url = "https://registry.yarnpkg.com/mkdirp/-/mkdirp-0.5.5.tgz";
5753 sha1 = "d91cefd62d1436ca0f41620e251288d420099def";
5754 };
5755 }
5756 {
5757 name = "move_concurrently___move_concurrently_1.0.1.tgz";
5758 path = fetchurl {
5759 name = "move_concurrently___move_concurrently_1.0.1.tgz";
5760 url = "https://registry.yarnpkg.com/move-concurrently/-/move-concurrently-1.0.1.tgz";
5761 sha1 = "be2c005fda32e0b29af1f05d7c4b33214c701f92";
5762 };
5763 }
5764 {
5765 name = "ms___ms_2.0.0.tgz";
5766 path = fetchurl {
5767 name = "ms___ms_2.0.0.tgz";
5768 url = "https://registry.yarnpkg.com/ms/-/ms-2.0.0.tgz";
5769 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
5770 };
5771 }
5772 {
5773 name = "ms___ms_2.1.1.tgz";
5774 path = fetchurl {
5775 name = "ms___ms_2.1.1.tgz";
5776 url = "https://registry.yarnpkg.com/ms/-/ms-2.1.1.tgz";
5777 sha1 = "30a5864eb3ebb0a66f2ebe6d727af06a09d86e0a";
5778 };
5779 }
5780 {
5781 name = "ms___ms_2.1.2.tgz";
5782 path = fetchurl {
5783 name = "ms___ms_2.1.2.tgz";
5784 url = "https://registry.yarnpkg.com/ms/-/ms-2.1.2.tgz";
5785 sha1 = "d09d1f357b443f493382a8eb3ccd183872ae6009";
5786 };
5787 }
5788 {
5789 name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
5790 path = fetchurl {
5791 name = "multicast_dns_service_types___multicast_dns_service_types_1.1.0.tgz";
5792 url = "https://registry.yarnpkg.com/multicast-dns-service-types/-/multicast-dns-service-types-1.1.0.tgz";
5793 sha1 = "899f11d9686e5e05cb91b35d5f0e63b773cfc901";
5794 };
5795 }
5796 {
5797 name = "multicast_dns___multicast_dns_6.2.3.tgz";
5798 path = fetchurl {
5799 name = "multicast_dns___multicast_dns_6.2.3.tgz";
5800 url = "https://registry.yarnpkg.com/multicast-dns/-/multicast-dns-6.2.3.tgz";
5801 sha1 = "a0ec7bd9055c4282f790c3c82f4e28db3b31b229";
5802 };
5803 }
5804 {
5805 name = "mute_stream___mute_stream_0.0.8.tgz";
5806 path = fetchurl {
5807 name = "mute_stream___mute_stream_0.0.8.tgz";
5808 url = "https://registry.yarnpkg.com/mute-stream/-/mute-stream-0.0.8.tgz";
5809 sha1 = "1630c42b2251ff81e2a283de96a5497ea92e5e0d";
5810 };
5811 }
5812 {
5813 name = "mz___mz_2.7.0.tgz";
5814 path = fetchurl {
5815 name = "mz___mz_2.7.0.tgz";
5816 url = "https://registry.yarnpkg.com/mz/-/mz-2.7.0.tgz";
5817 sha1 = "95008057a56cafadc2bc63dde7f9ff6955948e32";
5818 };
5819 }
5820 {
5821 name = "nan___nan_2.14.1.tgz";
5822 path = fetchurl {
5823 name = "nan___nan_2.14.1.tgz";
5824 url = "https://registry.yarnpkg.com/nan/-/nan-2.14.1.tgz";
5825 sha1 = "d7be34dfa3105b91494c3147089315eff8874b01";
5826 };
5827 }
5828 {
5829 name = "nanomatch___nanomatch_1.2.13.tgz";
5830 path = fetchurl {
5831 name = "nanomatch___nanomatch_1.2.13.tgz";
5832 url = "https://registry.yarnpkg.com/nanomatch/-/nanomatch-1.2.13.tgz";
5833 sha1 = "b87a8aa4fc0de8fe6be88895b38983ff265bd119";
5834 };
5835 }
5836 {
5837 name = "natural_compare___natural_compare_1.4.0.tgz";
5838 path = fetchurl {
5839 name = "natural_compare___natural_compare_1.4.0.tgz";
5840 url = "https://registry.yarnpkg.com/natural-compare/-/natural-compare-1.4.0.tgz";
5841 sha1 = "4abebfeed7541f2c27acfb29bdbbd15c8d5ba4f7";
5842 };
5843 }
5844 {
5845 name = "negotiator___negotiator_0.6.2.tgz";
5846 path = fetchurl {
5847 name = "negotiator___negotiator_0.6.2.tgz";
5848 url = "https://registry.yarnpkg.com/negotiator/-/negotiator-0.6.2.tgz";
5849 sha1 = "feacf7ccf525a77ae9634436a64883ffeca346fb";
5850 };
5851 }
5852 {
5853 name = "neo_async___neo_async_2.6.1.tgz";
5854 path = fetchurl {
5855 name = "neo_async___neo_async_2.6.1.tgz";
5856 url = "https://registry.yarnpkg.com/neo-async/-/neo-async-2.6.1.tgz";
5857 sha1 = "ac27ada66167fa8849a6addd837f6b189ad2081c";
5858 };
5859 }
5860 {
5861 name = "nice_try___nice_try_1.0.5.tgz";
5862 path = fetchurl {
5863 name = "nice_try___nice_try_1.0.5.tgz";
5864 url = "https://registry.yarnpkg.com/nice-try/-/nice-try-1.0.5.tgz";
5865 sha1 = "a3378a7696ce7d223e88fc9b764bd7ef1089e366";
5866 };
5867 }
5868 {
5869 name = "no_case___no_case_2.3.2.tgz";
5870 path = fetchurl {
5871 name = "no_case___no_case_2.3.2.tgz";
5872 url = "https://registry.yarnpkg.com/no-case/-/no-case-2.3.2.tgz";
5873 sha1 = "60b813396be39b3f1288a4c1ed5d1e7d28b464ac";
5874 };
5875 }
5876 {
5877 name = "node_forge___node_forge_0.9.0.tgz";
5878 path = fetchurl {
5879 name = "node_forge___node_forge_0.9.0.tgz";
5880 url = "https://registry.yarnpkg.com/node-forge/-/node-forge-0.9.0.tgz";
5881 sha1 = "d624050edbb44874adca12bb9a52ec63cb782579";
5882 };
5883 }
5884 {
5885 name = "node_ipc___node_ipc_9.1.1.tgz";
5886 path = fetchurl {
5887 name = "node_ipc___node_ipc_9.1.1.tgz";
5888 url = "https://registry.yarnpkg.com/node-ipc/-/node-ipc-9.1.1.tgz";
5889 sha1 = "4e245ed6938e65100e595ebc5dc34b16e8dd5d69";
5890 };
5891 }
5892 {
5893 name = "node_libs_browser___node_libs_browser_2.2.1.tgz";
5894 path = fetchurl {
5895 name = "node_libs_browser___node_libs_browser_2.2.1.tgz";
5896 url = "https://registry.yarnpkg.com/node-libs-browser/-/node-libs-browser-2.2.1.tgz";
5897 sha1 = "b64f513d18338625f90346d27b0d235e631f6425";
5898 };
5899 }
5900 {
5901 name = "node_releases___node_releases_1.1.58.tgz";
5902 path = fetchurl {
5903 name = "node_releases___node_releases_1.1.58.tgz";
5904 url = "https://registry.yarnpkg.com/node-releases/-/node-releases-1.1.58.tgz";
5905 sha1 = "8ee20eef30fa60e52755fcc0942def5a734fe935";
5906 };
5907 }
5908 {
5909 name = "normalize_package_data___normalize_package_data_2.5.0.tgz";
5910 path = fetchurl {
5911 name = "normalize_package_data___normalize_package_data_2.5.0.tgz";
5912 url = "https://registry.yarnpkg.com/normalize-package-data/-/normalize-package-data-2.5.0.tgz";
5913 sha1 = "e66db1838b200c1dfc233225d12cb36520e234a8";
5914 };
5915 }
5916 {
5917 name = "normalize_path___normalize_path_1.0.0.tgz";
5918 path = fetchurl {
5919 name = "normalize_path___normalize_path_1.0.0.tgz";
5920 url = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-1.0.0.tgz";
5921 sha1 = "32d0e472f91ff345701c15a8311018d3b0a90379";
5922 };
5923 }
5924 {
5925 name = "normalize_path___normalize_path_2.1.1.tgz";
5926 path = fetchurl {
5927 name = "normalize_path___normalize_path_2.1.1.tgz";
5928 url = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-2.1.1.tgz";
5929 sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
5930 };
5931 }
5932 {
5933 name = "normalize_path___normalize_path_3.0.0.tgz";
5934 path = fetchurl {
5935 name = "normalize_path___normalize_path_3.0.0.tgz";
5936 url = "https://registry.yarnpkg.com/normalize-path/-/normalize-path-3.0.0.tgz";
5937 sha1 = "0dcd69ff23a1c9b11fd0978316644a0388216a65";
5938 };
5939 }
5940 {
5941 name = "normalize_range___normalize_range_0.1.2.tgz";
5942 path = fetchurl {
5943 name = "normalize_range___normalize_range_0.1.2.tgz";
5944 url = "https://registry.yarnpkg.com/normalize-range/-/normalize-range-0.1.2.tgz";
5945 sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942";
5946 };
5947 }
5948 {
5949 name = "normalize_url___normalize_url_1.9.1.tgz";
5950 path = fetchurl {
5951 name = "normalize_url___normalize_url_1.9.1.tgz";
5952 url = "https://registry.yarnpkg.com/normalize-url/-/normalize-url-1.9.1.tgz";
5953 sha1 = "2cc0d66b31ea23036458436e3620d85954c66c3c";
5954 };
5955 }
5956 {
5957 name = "normalize_url___normalize_url_3.3.0.tgz";
5958 path = fetchurl {
5959 name = "normalize_url___normalize_url_3.3.0.tgz";
5960 url = "https://registry.yarnpkg.com/normalize-url/-/normalize-url-3.3.0.tgz";
5961 sha1 = "b2e1c4dc4f7c6d57743df733a4f5978d18650559";
5962 };
5963 }
5964 {
5965 name = "npm_run_path___npm_run_path_2.0.2.tgz";
5966 path = fetchurl {
5967 name = "npm_run_path___npm_run_path_2.0.2.tgz";
5968 url = "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-2.0.2.tgz";
5969 sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f";
5970 };
5971 }
5972 {
5973 name = "npm_run_path___npm_run_path_4.0.1.tgz";
5974 path = fetchurl {
5975 name = "npm_run_path___npm_run_path_4.0.1.tgz";
5976 url = "https://registry.yarnpkg.com/npm-run-path/-/npm-run-path-4.0.1.tgz";
5977 sha1 = "b7ecd1e5ed53da8e37a55e1c2269e0b97ed748ea";
5978 };
5979 }
5980 {
5981 name = "nth_check___nth_check_1.0.2.tgz";
5982 path = fetchurl {
5983 name = "nth_check___nth_check_1.0.2.tgz";
5984 url = "https://registry.yarnpkg.com/nth-check/-/nth-check-1.0.2.tgz";
5985 sha1 = "b2bd295c37e3dd58a3bf0700376663ba4d9cf05c";
5986 };
5987 }
5988 {
5989 name = "num2fraction___num2fraction_1.2.2.tgz";
5990 path = fetchurl {
5991 name = "num2fraction___num2fraction_1.2.2.tgz";
5992 url = "https://registry.yarnpkg.com/num2fraction/-/num2fraction-1.2.2.tgz";
5993 sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede";
5994 };
5995 }
5996 {
5997 name = "oauth_sign___oauth_sign_0.9.0.tgz";
5998 path = fetchurl {
5999 name = "oauth_sign___oauth_sign_0.9.0.tgz";
6000 url = "https://registry.yarnpkg.com/oauth-sign/-/oauth-sign-0.9.0.tgz";
6001 sha1 = "47a7b016baa68b5fa0ecf3dee08a85c679ac6455";
6002 };
6003 }
6004 {
6005 name = "object_assign___object_assign_4.1.1.tgz";
6006 path = fetchurl {
6007 name = "object_assign___object_assign_4.1.1.tgz";
6008 url = "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz";
6009 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
6010 };
6011 }
6012 {
6013 name = "object_copy___object_copy_0.1.0.tgz";
6014 path = fetchurl {
6015 name = "object_copy___object_copy_0.1.0.tgz";
6016 url = "https://registry.yarnpkg.com/object-copy/-/object-copy-0.1.0.tgz";
6017 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
6018 };
6019 }
6020 {
6021 name = "object_hash___object_hash_1.3.1.tgz";
6022 path = fetchurl {
6023 name = "object_hash___object_hash_1.3.1.tgz";
6024 url = "https://registry.yarnpkg.com/object-hash/-/object-hash-1.3.1.tgz";
6025 sha1 = "fde452098a951cb145f039bb7d455449ddc126df";
6026 };
6027 }
6028 {
6029 name = "object_inspect___object_inspect_1.7.0.tgz";
6030 path = fetchurl {
6031 name = "object_inspect___object_inspect_1.7.0.tgz";
6032 url = "https://registry.yarnpkg.com/object-inspect/-/object-inspect-1.7.0.tgz";
6033 sha1 = "f4f6bd181ad77f006b5ece60bd0b6f398ff74a67";
6034 };
6035 }
6036 {
6037 name = "object_is___object_is_1.1.2.tgz";
6038 path = fetchurl {
6039 name = "object_is___object_is_1.1.2.tgz";
6040 url = "https://registry.yarnpkg.com/object-is/-/object-is-1.1.2.tgz";
6041 sha1 = "c5d2e87ff9e119f78b7a088441519e2eec1573b6";
6042 };
6043 }
6044 {
6045 name = "object_keys___object_keys_1.1.1.tgz";
6046 path = fetchurl {
6047 name = "object_keys___object_keys_1.1.1.tgz";
6048 url = "https://registry.yarnpkg.com/object-keys/-/object-keys-1.1.1.tgz";
6049 sha1 = "1c47f272df277f3b1daf061677d9c82e2322c60e";
6050 };
6051 }
6052 {
6053 name = "object_visit___object_visit_1.0.1.tgz";
6054 path = fetchurl {
6055 name = "object_visit___object_visit_1.0.1.tgz";
6056 url = "https://registry.yarnpkg.com/object-visit/-/object-visit-1.0.1.tgz";
6057 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
6058 };
6059 }
6060 {
6061 name = "object.assign___object.assign_4.1.0.tgz";
6062 path = fetchurl {
6063 name = "object.assign___object.assign_4.1.0.tgz";
6064 url = "https://registry.yarnpkg.com/object.assign/-/object.assign-4.1.0.tgz";
6065 sha1 = "968bf1100d7956bb3ca086f006f846b3bc4008da";
6066 };
6067 }
6068 {
6069 name = "object.getownpropertydescriptors___object.getownpropertydescriptors_2.1.0.tgz";
6070 path = fetchurl {
6071 name = "object.getownpropertydescriptors___object.getownpropertydescriptors_2.1.0.tgz";
6072 url = "https://registry.yarnpkg.com/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.1.0.tgz";
6073 sha1 = "369bf1f9592d8ab89d712dced5cb81c7c5352649";
6074 };
6075 }
6076 {
6077 name = "object.pick___object.pick_1.3.0.tgz";
6078 path = fetchurl {
6079 name = "object.pick___object.pick_1.3.0.tgz";
6080 url = "https://registry.yarnpkg.com/object.pick/-/object.pick-1.3.0.tgz";
6081 sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
6082 };
6083 }
6084 {
6085 name = "object.values___object.values_1.1.1.tgz";
6086 path = fetchurl {
6087 name = "object.values___object.values_1.1.1.tgz";
6088 url = "https://registry.yarnpkg.com/object.values/-/object.values-1.1.1.tgz";
6089 sha1 = "68a99ecde356b7e9295a3c5e0ce31dc8c953de5e";
6090 };
6091 }
6092 {
6093 name = "obuf___obuf_1.1.2.tgz";
6094 path = fetchurl {
6095 name = "obuf___obuf_1.1.2.tgz";
6096 url = "https://registry.yarnpkg.com/obuf/-/obuf-1.1.2.tgz";
6097 sha1 = "09bea3343d41859ebd446292d11c9d4db619084e";
6098 };
6099 }
6100 {
6101 name = "on_finished___on_finished_2.3.0.tgz";
6102 path = fetchurl {
6103 name = "on_finished___on_finished_2.3.0.tgz";
6104 url = "https://registry.yarnpkg.com/on-finished/-/on-finished-2.3.0.tgz";
6105 sha1 = "20f1336481b083cd75337992a16971aa2d906947";
6106 };
6107 }
6108 {
6109 name = "on_headers___on_headers_1.0.2.tgz";
6110 path = fetchurl {
6111 name = "on_headers___on_headers_1.0.2.tgz";
6112 url = "https://registry.yarnpkg.com/on-headers/-/on-headers-1.0.2.tgz";
6113 sha1 = "772b0ae6aaa525c399e489adfad90c403eb3c28f";
6114 };
6115 }
6116 {
6117 name = "once___once_1.4.0.tgz";
6118 path = fetchurl {
6119 name = "once___once_1.4.0.tgz";
6120 url = "https://registry.yarnpkg.com/once/-/once-1.4.0.tgz";
6121 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
6122 };
6123 }
6124 {
6125 name = "onetime___onetime_2.0.1.tgz";
6126 path = fetchurl {
6127 name = "onetime___onetime_2.0.1.tgz";
6128 url = "https://registry.yarnpkg.com/onetime/-/onetime-2.0.1.tgz";
6129 sha1 = "067428230fd67443b2794b22bba528b6867962d4";
6130 };
6131 }
6132 {
6133 name = "onetime___onetime_5.1.0.tgz";
6134 path = fetchurl {
6135 name = "onetime___onetime_5.1.0.tgz";
6136 url = "https://registry.yarnpkg.com/onetime/-/onetime-5.1.0.tgz";
6137 sha1 = "fff0f3c91617fe62bb50189636e99ac8a6df7be5";
6138 };
6139 }
6140 {
6141 name = "open___open_6.4.0.tgz";
6142 path = fetchurl {
6143 name = "open___open_6.4.0.tgz";
6144 url = "https://registry.yarnpkg.com/open/-/open-6.4.0.tgz";
6145 sha1 = "5c13e96d0dc894686164f18965ecfe889ecfc8a9";
6146 };
6147 }
6148 {
6149 name = "opener___opener_1.5.1.tgz";
6150 path = fetchurl {
6151 name = "opener___opener_1.5.1.tgz";
6152 url = "https://registry.yarnpkg.com/opener/-/opener-1.5.1.tgz";
6153 sha1 = "6d2f0e77f1a0af0032aca716c2c1fbb8e7e8abed";
6154 };
6155 }
6156 {
6157 name = "opn___opn_5.5.0.tgz";
6158 path = fetchurl {
6159 name = "opn___opn_5.5.0.tgz";
6160 url = "https://registry.yarnpkg.com/opn/-/opn-5.5.0.tgz";
6161 sha1 = "fc7164fab56d235904c51c3b27da6758ca3b9bfc";
6162 };
6163 }
6164 {
6165 name = "optionator___optionator_0.9.1.tgz";
6166 path = fetchurl {
6167 name = "optionator___optionator_0.9.1.tgz";
6168 url = "https://registry.yarnpkg.com/optionator/-/optionator-0.9.1.tgz";
6169 sha1 = "4f236a6373dae0566a6d43e1326674f50c291499";
6170 };
6171 }
6172 {
6173 name = "ora___ora_3.4.0.tgz";
6174 path = fetchurl {
6175 name = "ora___ora_3.4.0.tgz";
6176 url = "https://registry.yarnpkg.com/ora/-/ora-3.4.0.tgz";
6177 sha1 = "bf0752491059a3ef3ed4c85097531de9fdbcd318";
6178 };
6179 }
6180 {
6181 name = "original___original_1.0.2.tgz";
6182 path = fetchurl {
6183 name = "original___original_1.0.2.tgz";
6184 url = "https://registry.yarnpkg.com/original/-/original-1.0.2.tgz";
6185 sha1 = "e442a61cffe1c5fd20a65f3261c26663b303f25f";
6186 };
6187 }
6188 {
6189 name = "os_browserify___os_browserify_0.3.0.tgz";
6190 path = fetchurl {
6191 name = "os_browserify___os_browserify_0.3.0.tgz";
6192 url = "https://registry.yarnpkg.com/os-browserify/-/os-browserify-0.3.0.tgz";
6193 sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
6194 };
6195 }
6196 {
6197 name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
6198 path = fetchurl {
6199 name = "os_tmpdir___os_tmpdir_1.0.2.tgz";
6200 url = "https://registry.yarnpkg.com/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
6201 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
6202 };
6203 }
6204 {
6205 name = "p_finally___p_finally_1.0.0.tgz";
6206 path = fetchurl {
6207 name = "p_finally___p_finally_1.0.0.tgz";
6208 url = "https://registry.yarnpkg.com/p-finally/-/p-finally-1.0.0.tgz";
6209 sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae";
6210 };
6211 }
6212 {
6213 name = "p_finally___p_finally_2.0.1.tgz";
6214 path = fetchurl {
6215 name = "p_finally___p_finally_2.0.1.tgz";
6216 url = "https://registry.yarnpkg.com/p-finally/-/p-finally-2.0.1.tgz";
6217 sha1 = "bd6fcaa9c559a096b680806f4d657b3f0f240561";
6218 };
6219 }
6220 {
6221 name = "p_limit___p_limit_1.3.0.tgz";
6222 path = fetchurl {
6223 name = "p_limit___p_limit_1.3.0.tgz";
6224 url = "https://registry.yarnpkg.com/p-limit/-/p-limit-1.3.0.tgz";
6225 sha1 = "b86bd5f0c25690911c7590fcbfc2010d54b3ccb8";
6226 };
6227 }
6228 {
6229 name = "p_limit___p_limit_2.3.0.tgz";
6230 path = fetchurl {
6231 name = "p_limit___p_limit_2.3.0.tgz";
6232 url = "https://registry.yarnpkg.com/p-limit/-/p-limit-2.3.0.tgz";
6233 sha1 = "3dd33c647a214fdfffd835933eb086da0dc21db1";
6234 };
6235 }
6236 {
6237 name = "p_locate___p_locate_2.0.0.tgz";
6238 path = fetchurl {
6239 name = "p_locate___p_locate_2.0.0.tgz";
6240 url = "https://registry.yarnpkg.com/p-locate/-/p-locate-2.0.0.tgz";
6241 sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
6242 };
6243 }
6244 {
6245 name = "p_locate___p_locate_3.0.0.tgz";
6246 path = fetchurl {
6247 name = "p_locate___p_locate_3.0.0.tgz";
6248 url = "https://registry.yarnpkg.com/p-locate/-/p-locate-3.0.0.tgz";
6249 sha1 = "322d69a05c0264b25997d9f40cd8a891ab0064a4";
6250 };
6251 }
6252 {
6253 name = "p_locate___p_locate_4.1.0.tgz";
6254 path = fetchurl {
6255 name = "p_locate___p_locate_4.1.0.tgz";
6256 url = "https://registry.yarnpkg.com/p-locate/-/p-locate-4.1.0.tgz";
6257 sha1 = "a3428bb7088b3a60292f66919278b7c297ad4f07";
6258 };
6259 }
6260 {
6261 name = "p_map___p_map_2.1.0.tgz";
6262 path = fetchurl {
6263 name = "p_map___p_map_2.1.0.tgz";
6264 url = "https://registry.yarnpkg.com/p-map/-/p-map-2.1.0.tgz";
6265 sha1 = "310928feef9c9ecc65b68b17693018a665cea175";
6266 };
6267 }
6268 {
6269 name = "p_map___p_map_3.0.0.tgz";
6270 path = fetchurl {
6271 name = "p_map___p_map_3.0.0.tgz";
6272 url = "https://registry.yarnpkg.com/p-map/-/p-map-3.0.0.tgz";
6273 sha1 = "d704d9af8a2ba684e2600d9a215983d4141a979d";
6274 };
6275 }
6276 {
6277 name = "p_retry___p_retry_3.0.1.tgz";
6278 path = fetchurl {
6279 name = "p_retry___p_retry_3.0.1.tgz";
6280 url = "https://registry.yarnpkg.com/p-retry/-/p-retry-3.0.1.tgz";
6281 sha1 = "316b4c8893e2c8dc1cfa891f406c4b422bebf328";
6282 };
6283 }
6284 {
6285 name = "p_try___p_try_1.0.0.tgz";
6286 path = fetchurl {
6287 name = "p_try___p_try_1.0.0.tgz";
6288 url = "https://registry.yarnpkg.com/p-try/-/p-try-1.0.0.tgz";
6289 sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
6290 };
6291 }
6292 {
6293 name = "p_try___p_try_2.2.0.tgz";
6294 path = fetchurl {
6295 name = "p_try___p_try_2.2.0.tgz";
6296 url = "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz";
6297 sha1 = "cb2868540e313d61de58fafbe35ce9004d5540e6";
6298 };
6299 }
6300 {
6301 name = "pako___pako_1.0.11.tgz";
6302 path = fetchurl {
6303 name = "pako___pako_1.0.11.tgz";
6304 url = "https://registry.yarnpkg.com/pako/-/pako-1.0.11.tgz";
6305 sha1 = "6c9599d340d54dfd3946380252a35705a6b992bf";
6306 };
6307 }
6308 {
6309 name = "parallel_transform___parallel_transform_1.2.0.tgz";
6310 path = fetchurl {
6311 name = "parallel_transform___parallel_transform_1.2.0.tgz";
6312 url = "https://registry.yarnpkg.com/parallel-transform/-/parallel-transform-1.2.0.tgz";
6313 sha1 = "9049ca37d6cb2182c3b1d2c720be94d14a5814fc";
6314 };
6315 }
6316 {
6317 name = "param_case___param_case_2.1.1.tgz";
6318 path = fetchurl {
6319 name = "param_case___param_case_2.1.1.tgz";
6320 url = "https://registry.yarnpkg.com/param-case/-/param-case-2.1.1.tgz";
6321 sha1 = "df94fd8cf6531ecf75e6bef9a0858fbc72be2247";
6322 };
6323 }
6324 {
6325 name = "parent_module___parent_module_1.0.1.tgz";
6326 path = fetchurl {
6327 name = "parent_module___parent_module_1.0.1.tgz";
6328 url = "https://registry.yarnpkg.com/parent-module/-/parent-module-1.0.1.tgz";
6329 sha1 = "691d2709e78c79fae3a156622452d00762caaaa2";
6330 };
6331 }
6332 {
6333 name = "parse_asn1___parse_asn1_5.1.5.tgz";
6334 path = fetchurl {
6335 name = "parse_asn1___parse_asn1_5.1.5.tgz";
6336 url = "https://registry.yarnpkg.com/parse-asn1/-/parse-asn1-5.1.5.tgz";
6337 sha1 = "003271343da58dc94cace494faef3d2147ecea0e";
6338 };
6339 }
6340 {
6341 name = "parse_json___parse_json_4.0.0.tgz";
6342 path = fetchurl {
6343 name = "parse_json___parse_json_4.0.0.tgz";
6344 url = "https://registry.yarnpkg.com/parse-json/-/parse-json-4.0.0.tgz";
6345 sha1 = "be35f5425be1f7f6c747184f98a788cb99477ee0";
6346 };
6347 }
6348 {
6349 name = "parse_json___parse_json_5.0.0.tgz";
6350 path = fetchurl {
6351 name = "parse_json___parse_json_5.0.0.tgz";
6352 url = "https://registry.yarnpkg.com/parse-json/-/parse-json-5.0.0.tgz";
6353 sha1 = "73e5114c986d143efa3712d4ea24db9a4266f60f";
6354 };
6355 }
6356 {
6357 name = "parse5_htmlparser2_tree_adapter___parse5_htmlparser2_tree_adapter_5.1.1.tgz";
6358 path = fetchurl {
6359 name = "parse5_htmlparser2_tree_adapter___parse5_htmlparser2_tree_adapter_5.1.1.tgz";
6360 url = "https://registry.yarnpkg.com/parse5-htmlparser2-tree-adapter/-/parse5-htmlparser2-tree-adapter-5.1.1.tgz";
6361 sha1 = "e8c743d4e92194d5293ecde2b08be31e67461cbc";
6362 };
6363 }
6364 {
6365 name = "parse5___parse5_5.1.1.tgz";
6366 path = fetchurl {
6367 name = "parse5___parse5_5.1.1.tgz";
6368 url = "https://registry.yarnpkg.com/parse5/-/parse5-5.1.1.tgz";
6369 sha1 = "f68e4e5ba1852ac2cadc00f4555fff6c2abb6178";
6370 };
6371 }
6372 {
6373 name = "parseurl___parseurl_1.3.3.tgz";
6374 path = fetchurl {
6375 name = "parseurl___parseurl_1.3.3.tgz";
6376 url = "https://registry.yarnpkg.com/parseurl/-/parseurl-1.3.3.tgz";
6377 sha1 = "9da19e7bee8d12dff0513ed5b76957793bc2e8d4";
6378 };
6379 }
6380 {
6381 name = "pascalcase___pascalcase_0.1.1.tgz";
6382 path = fetchurl {
6383 name = "pascalcase___pascalcase_0.1.1.tgz";
6384 url = "https://registry.yarnpkg.com/pascalcase/-/pascalcase-0.1.1.tgz";
6385 sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
6386 };
6387 }
6388 {
6389 name = "path_browserify___path_browserify_0.0.1.tgz";
6390 path = fetchurl {
6391 name = "path_browserify___path_browserify_0.0.1.tgz";
6392 url = "https://registry.yarnpkg.com/path-browserify/-/path-browserify-0.0.1.tgz";
6393 sha1 = "e6c4ddd7ed3aa27c68a20cc4e50e1a4ee83bbc4a";
6394 };
6395 }
6396 {
6397 name = "path_dirname___path_dirname_1.0.2.tgz";
6398 path = fetchurl {
6399 name = "path_dirname___path_dirname_1.0.2.tgz";
6400 url = "https://registry.yarnpkg.com/path-dirname/-/path-dirname-1.0.2.tgz";
6401 sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
6402 };
6403 }
6404 {
6405 name = "path_exists___path_exists_2.1.0.tgz";
6406 path = fetchurl {
6407 name = "path_exists___path_exists_2.1.0.tgz";
6408 url = "https://registry.yarnpkg.com/path-exists/-/path-exists-2.1.0.tgz";
6409 sha1 = "0feb6c64f0fc518d9a754dd5efb62c7022761f4b";
6410 };
6411 }
6412 {
6413 name = "path_exists___path_exists_3.0.0.tgz";
6414 path = fetchurl {
6415 name = "path_exists___path_exists_3.0.0.tgz";
6416 url = "https://registry.yarnpkg.com/path-exists/-/path-exists-3.0.0.tgz";
6417 sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
6418 };
6419 }
6420 {
6421 name = "path_exists___path_exists_4.0.0.tgz";
6422 path = fetchurl {
6423 name = "path_exists___path_exists_4.0.0.tgz";
6424 url = "https://registry.yarnpkg.com/path-exists/-/path-exists-4.0.0.tgz";
6425 sha1 = "513bdbe2d3b95d7762e8c1137efa195c6c61b5b3";
6426 };
6427 }
6428 {
6429 name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
6430 path = fetchurl {
6431 name = "path_is_absolute___path_is_absolute_1.0.1.tgz";
6432 url = "https://registry.yarnpkg.com/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
6433 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
6434 };
6435 }
6436 {
6437 name = "path_is_inside___path_is_inside_1.0.2.tgz";
6438 path = fetchurl {
6439 name = "path_is_inside___path_is_inside_1.0.2.tgz";
6440 url = "https://registry.yarnpkg.com/path-is-inside/-/path-is-inside-1.0.2.tgz";
6441 sha1 = "365417dede44430d1c11af61027facf074bdfc53";
6442 };
6443 }
6444 {
6445 name = "path_key___path_key_2.0.1.tgz";
6446 path = fetchurl {
6447 name = "path_key___path_key_2.0.1.tgz";
6448 url = "https://registry.yarnpkg.com/path-key/-/path-key-2.0.1.tgz";
6449 sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
6450 };
6451 }
6452 {
6453 name = "path_key___path_key_3.1.1.tgz";
6454 path = fetchurl {
6455 name = "path_key___path_key_3.1.1.tgz";
6456 url = "https://registry.yarnpkg.com/path-key/-/path-key-3.1.1.tgz";
6457 sha1 = "581f6ade658cbba65a0d3380de7753295054f375";
6458 };
6459 }
6460 {
6461 name = "path_parse___path_parse_1.0.6.tgz";
6462 path = fetchurl {
6463 name = "path_parse___path_parse_1.0.6.tgz";
6464 url = "https://registry.yarnpkg.com/path-parse/-/path-parse-1.0.6.tgz";
6465 sha1 = "d62dbb5679405d72c4737ec58600e9ddcf06d24c";
6466 };
6467 }
6468 {
6469 name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
6470 path = fetchurl {
6471 name = "path_to_regexp___path_to_regexp_0.1.7.tgz";
6472 url = "https://registry.yarnpkg.com/path-to-regexp/-/path-to-regexp-0.1.7.tgz";
6473 sha1 = "df604178005f522f15eb4490e7247a1bfaa67f8c";
6474 };
6475 }
6476 {
6477 name = "path_type___path_type_3.0.0.tgz";
6478 path = fetchurl {
6479 name = "path_type___path_type_3.0.0.tgz";
6480 url = "https://registry.yarnpkg.com/path-type/-/path-type-3.0.0.tgz";
6481 sha1 = "cef31dc8e0a1a3bb0d105c0cd97cf3bf47f4e36f";
6482 };
6483 }
6484 {
6485 name = "pbkdf2___pbkdf2_3.1.1.tgz";
6486 path = fetchurl {
6487 name = "pbkdf2___pbkdf2_3.1.1.tgz";
6488 url = "https://registry.yarnpkg.com/pbkdf2/-/pbkdf2-3.1.1.tgz";
6489 sha1 = "cb8724b0fada984596856d1a6ebafd3584654b94";
6490 };
6491 }
6492 {
6493 name = "performance_now___performance_now_2.1.0.tgz";
6494 path = fetchurl {
6495 name = "performance_now___performance_now_2.1.0.tgz";
6496 url = "https://registry.yarnpkg.com/performance-now/-/performance-now-2.1.0.tgz";
6497 sha1 = "6309f4e0e5fa913ec1c69307ae364b4b377c9e7b";
6498 };
6499 }
6500 {
6501 name = "picomatch___picomatch_2.2.2.tgz";
6502 path = fetchurl {
6503 name = "picomatch___picomatch_2.2.2.tgz";
6504 url = "https://registry.yarnpkg.com/picomatch/-/picomatch-2.2.2.tgz";
6505 sha1 = "21f333e9b6b8eaff02468f5146ea406d345f4dad";
6506 };
6507 }
6508 {
6509 name = "pify___pify_2.3.0.tgz";
6510 path = fetchurl {
6511 name = "pify___pify_2.3.0.tgz";
6512 url = "https://registry.yarnpkg.com/pify/-/pify-2.3.0.tgz";
6513 sha1 = "ed141a6ac043a849ea588498e7dca8b15330e90c";
6514 };
6515 }
6516 {
6517 name = "pify___pify_3.0.0.tgz";
6518 path = fetchurl {
6519 name = "pify___pify_3.0.0.tgz";
6520 url = "https://registry.yarnpkg.com/pify/-/pify-3.0.0.tgz";
6521 sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
6522 };
6523 }
6524 {
6525 name = "pify___pify_4.0.1.tgz";
6526 path = fetchurl {
6527 name = "pify___pify_4.0.1.tgz";
6528 url = "https://registry.yarnpkg.com/pify/-/pify-4.0.1.tgz";
6529 sha1 = "4b2cd25c50d598735c50292224fd8c6df41e3231";
6530 };
6531 }
6532 {
6533 name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
6534 path = fetchurl {
6535 name = "pinkie_promise___pinkie_promise_2.0.1.tgz";
6536 url = "https://registry.yarnpkg.com/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
6537 sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
6538 };
6539 }
6540 {
6541 name = "pinkie___pinkie_2.0.4.tgz";
6542 path = fetchurl {
6543 name = "pinkie___pinkie_2.0.4.tgz";
6544 url = "https://registry.yarnpkg.com/pinkie/-/pinkie-2.0.4.tgz";
6545 sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
6546 };
6547 }
6548 {
6549 name = "pkg_dir___pkg_dir_1.0.0.tgz";
6550 path = fetchurl {
6551 name = "pkg_dir___pkg_dir_1.0.0.tgz";
6552 url = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-1.0.0.tgz";
6553 sha1 = "7a4b508a8d5bb2d629d447056ff4e9c9314cf3d4";
6554 };
6555 }
6556 {
6557 name = "pkg_dir___pkg_dir_3.0.0.tgz";
6558 path = fetchurl {
6559 name = "pkg_dir___pkg_dir_3.0.0.tgz";
6560 url = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-3.0.0.tgz";
6561 sha1 = "2749020f239ed990881b1f71210d51eb6523bea3";
6562 };
6563 }
6564 {
6565 name = "pkg_dir___pkg_dir_4.2.0.tgz";
6566 path = fetchurl {
6567 name = "pkg_dir___pkg_dir_4.2.0.tgz";
6568 url = "https://registry.yarnpkg.com/pkg-dir/-/pkg-dir-4.2.0.tgz";
6569 sha1 = "f099133df7ede422e81d1d8448270eeb3e4261f3";
6570 };
6571 }
6572 {
6573 name = "pkg_up___pkg_up_2.0.0.tgz";
6574 path = fetchurl {
6575 name = "pkg_up___pkg_up_2.0.0.tgz";
6576 url = "https://registry.yarnpkg.com/pkg-up/-/pkg-up-2.0.0.tgz";
6577 sha1 = "c819ac728059a461cab1c3889a2be3c49a004d7f";
6578 };
6579 }
6580 {
6581 name = "pnp_webpack_plugin___pnp_webpack_plugin_1.6.4.tgz";
6582 path = fetchurl {
6583 name = "pnp_webpack_plugin___pnp_webpack_plugin_1.6.4.tgz";
6584 url = "https://registry.yarnpkg.com/pnp-webpack-plugin/-/pnp-webpack-plugin-1.6.4.tgz";
6585 sha1 = "c9711ac4dc48a685dabafc86f8b6dd9f8df84149";
6586 };
6587 }
6588 {
6589 name = "portfinder___portfinder_1.0.26.tgz";
6590 path = fetchurl {
6591 name = "portfinder___portfinder_1.0.26.tgz";
6592 url = "https://registry.yarnpkg.com/portfinder/-/portfinder-1.0.26.tgz";
6593 sha1 = "475658d56ca30bed72ac7f1378ed350bd1b64e70";
6594 };
6595 }
6596 {
6597 name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
6598 path = fetchurl {
6599 name = "posix_character_classes___posix_character_classes_0.1.1.tgz";
6600 url = "https://registry.yarnpkg.com/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
6601 sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
6602 };
6603 }
6604 {
6605 name = "postcss_calc___postcss_calc_7.0.2.tgz";
6606 path = fetchurl {
6607 name = "postcss_calc___postcss_calc_7.0.2.tgz";
6608 url = "https://registry.yarnpkg.com/postcss-calc/-/postcss-calc-7.0.2.tgz";
6609 sha1 = "504efcd008ca0273120568b0792b16cdcde8aac1";
6610 };
6611 }
6612 {
6613 name = "postcss_colormin___postcss_colormin_4.0.3.tgz";
6614 path = fetchurl {
6615 name = "postcss_colormin___postcss_colormin_4.0.3.tgz";
6616 url = "https://registry.yarnpkg.com/postcss-colormin/-/postcss-colormin-4.0.3.tgz";
6617 sha1 = "ae060bce93ed794ac71264f08132d550956bd381";
6618 };
6619 }
6620 {
6621 name = "postcss_convert_values___postcss_convert_values_4.0.1.tgz";
6622 path = fetchurl {
6623 name = "postcss_convert_values___postcss_convert_values_4.0.1.tgz";
6624 url = "https://registry.yarnpkg.com/postcss-convert-values/-/postcss-convert-values-4.0.1.tgz";
6625 sha1 = "ca3813ed4da0f812f9d43703584e449ebe189a7f";
6626 };
6627 }
6628 {
6629 name = "postcss_discard_comments___postcss_discard_comments_4.0.2.tgz";
6630 path = fetchurl {
6631 name = "postcss_discard_comments___postcss_discard_comments_4.0.2.tgz";
6632 url = "https://registry.yarnpkg.com/postcss-discard-comments/-/postcss-discard-comments-4.0.2.tgz";
6633 sha1 = "1fbabd2c246bff6aaad7997b2b0918f4d7af4033";
6634 };
6635 }
6636 {
6637 name = "postcss_discard_duplicates___postcss_discard_duplicates_4.0.2.tgz";
6638 path = fetchurl {
6639 name = "postcss_discard_duplicates___postcss_discard_duplicates_4.0.2.tgz";
6640 url = "https://registry.yarnpkg.com/postcss-discard-duplicates/-/postcss-discard-duplicates-4.0.2.tgz";
6641 sha1 = "3fe133cd3c82282e550fc9b239176a9207b784eb";
6642 };
6643 }
6644 {
6645 name = "postcss_discard_empty___postcss_discard_empty_4.0.1.tgz";
6646 path = fetchurl {
6647 name = "postcss_discard_empty___postcss_discard_empty_4.0.1.tgz";
6648 url = "https://registry.yarnpkg.com/postcss-discard-empty/-/postcss-discard-empty-4.0.1.tgz";
6649 sha1 = "c8c951e9f73ed9428019458444a02ad90bb9f765";
6650 };
6651 }
6652 {
6653 name = "postcss_discard_overridden___postcss_discard_overridden_4.0.1.tgz";
6654 path = fetchurl {
6655 name = "postcss_discard_overridden___postcss_discard_overridden_4.0.1.tgz";
6656 url = "https://registry.yarnpkg.com/postcss-discard-overridden/-/postcss-discard-overridden-4.0.1.tgz";
6657 sha1 = "652aef8a96726f029f5e3e00146ee7a4e755ff57";
6658 };
6659 }
6660 {
6661 name = "postcss_load_config___postcss_load_config_2.1.0.tgz";
6662 path = fetchurl {
6663 name = "postcss_load_config___postcss_load_config_2.1.0.tgz";
6664 url = "https://registry.yarnpkg.com/postcss-load-config/-/postcss-load-config-2.1.0.tgz";
6665 sha1 = "c84d692b7bb7b41ddced94ee62e8ab31b417b003";
6666 };
6667 }
6668 {
6669 name = "postcss_loader___postcss_loader_3.0.0.tgz";
6670 path = fetchurl {
6671 name = "postcss_loader___postcss_loader_3.0.0.tgz";
6672 url = "https://registry.yarnpkg.com/postcss-loader/-/postcss-loader-3.0.0.tgz";
6673 sha1 = "6b97943e47c72d845fa9e03f273773d4e8dd6c2d";
6674 };
6675 }
6676 {
6677 name = "postcss_merge_longhand___postcss_merge_longhand_4.0.11.tgz";
6678 path = fetchurl {
6679 name = "postcss_merge_longhand___postcss_merge_longhand_4.0.11.tgz";
6680 url = "https://registry.yarnpkg.com/postcss-merge-longhand/-/postcss-merge-longhand-4.0.11.tgz";
6681 sha1 = "62f49a13e4a0ee04e7b98f42bb16062ca2549e24";
6682 };
6683 }
6684 {
6685 name = "postcss_merge_rules___postcss_merge_rules_4.0.3.tgz";
6686 path = fetchurl {
6687 name = "postcss_merge_rules___postcss_merge_rules_4.0.3.tgz";
6688 url = "https://registry.yarnpkg.com/postcss-merge-rules/-/postcss-merge-rules-4.0.3.tgz";
6689 sha1 = "362bea4ff5a1f98e4075a713c6cb25aefef9a650";
6690 };
6691 }
6692 {
6693 name = "postcss_minify_font_values___postcss_minify_font_values_4.0.2.tgz";
6694 path = fetchurl {
6695 name = "postcss_minify_font_values___postcss_minify_font_values_4.0.2.tgz";
6696 url = "https://registry.yarnpkg.com/postcss-minify-font-values/-/postcss-minify-font-values-4.0.2.tgz";
6697 sha1 = "cd4c344cce474343fac5d82206ab2cbcb8afd5a6";
6698 };
6699 }
6700 {
6701 name = "postcss_minify_gradients___postcss_minify_gradients_4.0.2.tgz";
6702 path = fetchurl {
6703 name = "postcss_minify_gradients___postcss_minify_gradients_4.0.2.tgz";
6704 url = "https://registry.yarnpkg.com/postcss-minify-gradients/-/postcss-minify-gradients-4.0.2.tgz";
6705 sha1 = "93b29c2ff5099c535eecda56c4aa6e665a663471";
6706 };
6707 }
6708 {
6709 name = "postcss_minify_params___postcss_minify_params_4.0.2.tgz";
6710 path = fetchurl {
6711 name = "postcss_minify_params___postcss_minify_params_4.0.2.tgz";
6712 url = "https://registry.yarnpkg.com/postcss-minify-params/-/postcss-minify-params-4.0.2.tgz";
6713 sha1 = "6b9cef030c11e35261f95f618c90036d680db874";
6714 };
6715 }
6716 {
6717 name = "postcss_minify_selectors___postcss_minify_selectors_4.0.2.tgz";
6718 path = fetchurl {
6719 name = "postcss_minify_selectors___postcss_minify_selectors_4.0.2.tgz";
6720 url = "https://registry.yarnpkg.com/postcss-minify-selectors/-/postcss-minify-selectors-4.0.2.tgz";
6721 sha1 = "e2e5eb40bfee500d0cd9243500f5f8ea4262fbd8";
6722 };
6723 }
6724 {
6725 name = "postcss_modules_extract_imports___postcss_modules_extract_imports_2.0.0.tgz";
6726 path = fetchurl {
6727 name = "postcss_modules_extract_imports___postcss_modules_extract_imports_2.0.0.tgz";
6728 url = "https://registry.yarnpkg.com/postcss-modules-extract-imports/-/postcss-modules-extract-imports-2.0.0.tgz";
6729 sha1 = "818719a1ae1da325f9832446b01136eeb493cd7e";
6730 };
6731 }
6732 {
6733 name = "postcss_modules_local_by_default___postcss_modules_local_by_default_3.0.2.tgz";
6734 path = fetchurl {
6735 name = "postcss_modules_local_by_default___postcss_modules_local_by_default_3.0.2.tgz";
6736 url = "https://registry.yarnpkg.com/postcss-modules-local-by-default/-/postcss-modules-local-by-default-3.0.2.tgz";
6737 sha1 = "e8a6561be914aaf3c052876377524ca90dbb7915";
6738 };
6739 }
6740 {
6741 name = "postcss_modules_scope___postcss_modules_scope_2.2.0.tgz";
6742 path = fetchurl {
6743 name = "postcss_modules_scope___postcss_modules_scope_2.2.0.tgz";
6744 url = "https://registry.yarnpkg.com/postcss-modules-scope/-/postcss-modules-scope-2.2.0.tgz";
6745 sha1 = "385cae013cc7743f5a7d7602d1073a89eaae62ee";
6746 };
6747 }
6748 {
6749 name = "postcss_modules_values___postcss_modules_values_3.0.0.tgz";
6750 path = fetchurl {
6751 name = "postcss_modules_values___postcss_modules_values_3.0.0.tgz";
6752 url = "https://registry.yarnpkg.com/postcss-modules-values/-/postcss-modules-values-3.0.0.tgz";
6753 sha1 = "5b5000d6ebae29b4255301b4a3a54574423e7f10";
6754 };
6755 }
6756 {
6757 name = "postcss_normalize_charset___postcss_normalize_charset_4.0.1.tgz";
6758 path = fetchurl {
6759 name = "postcss_normalize_charset___postcss_normalize_charset_4.0.1.tgz";
6760 url = "https://registry.yarnpkg.com/postcss-normalize-charset/-/postcss-normalize-charset-4.0.1.tgz";
6761 sha1 = "8b35add3aee83a136b0471e0d59be58a50285dd4";
6762 };
6763 }
6764 {
6765 name = "postcss_normalize_display_values___postcss_normalize_display_values_4.0.2.tgz";
6766 path = fetchurl {
6767 name = "postcss_normalize_display_values___postcss_normalize_display_values_4.0.2.tgz";
6768 url = "https://registry.yarnpkg.com/postcss-normalize-display-values/-/postcss-normalize-display-values-4.0.2.tgz";
6769 sha1 = "0dbe04a4ce9063d4667ed2be476bb830c825935a";
6770 };
6771 }
6772 {
6773 name = "postcss_normalize_positions___postcss_normalize_positions_4.0.2.tgz";
6774 path = fetchurl {
6775 name = "postcss_normalize_positions___postcss_normalize_positions_4.0.2.tgz";
6776 url = "https://registry.yarnpkg.com/postcss-normalize-positions/-/postcss-normalize-positions-4.0.2.tgz";
6777 sha1 = "05f757f84f260437378368a91f8932d4b102917f";
6778 };
6779 }
6780 {
6781 name = "postcss_normalize_repeat_style___postcss_normalize_repeat_style_4.0.2.tgz";
6782 path = fetchurl {
6783 name = "postcss_normalize_repeat_style___postcss_normalize_repeat_style_4.0.2.tgz";
6784 url = "https://registry.yarnpkg.com/postcss-normalize-repeat-style/-/postcss-normalize-repeat-style-4.0.2.tgz";
6785 sha1 = "c4ebbc289f3991a028d44751cbdd11918b17910c";
6786 };
6787 }
6788 {
6789 name = "postcss_normalize_string___postcss_normalize_string_4.0.2.tgz";
6790 path = fetchurl {
6791 name = "postcss_normalize_string___postcss_normalize_string_4.0.2.tgz";
6792 url = "https://registry.yarnpkg.com/postcss-normalize-string/-/postcss-normalize-string-4.0.2.tgz";
6793 sha1 = "cd44c40ab07a0c7a36dc5e99aace1eca4ec2690c";
6794 };
6795 }
6796 {
6797 name = "postcss_normalize_timing_functions___postcss_normalize_timing_functions_4.0.2.tgz";
6798 path = fetchurl {
6799 name = "postcss_normalize_timing_functions___postcss_normalize_timing_functions_4.0.2.tgz";
6800 url = "https://registry.yarnpkg.com/postcss-normalize-timing-functions/-/postcss-normalize-timing-functions-4.0.2.tgz";
6801 sha1 = "8e009ca2a3949cdaf8ad23e6b6ab99cb5e7d28d9";
6802 };
6803 }
6804 {
6805 name = "postcss_normalize_unicode___postcss_normalize_unicode_4.0.1.tgz";
6806 path = fetchurl {
6807 name = "postcss_normalize_unicode___postcss_normalize_unicode_4.0.1.tgz";
6808 url = "https://registry.yarnpkg.com/postcss-normalize-unicode/-/postcss-normalize-unicode-4.0.1.tgz";
6809 sha1 = "841bd48fdcf3019ad4baa7493a3d363b52ae1cfb";
6810 };
6811 }
6812 {
6813 name = "postcss_normalize_url___postcss_normalize_url_4.0.1.tgz";
6814 path = fetchurl {
6815 name = "postcss_normalize_url___postcss_normalize_url_4.0.1.tgz";
6816 url = "https://registry.yarnpkg.com/postcss-normalize-url/-/postcss-normalize-url-4.0.1.tgz";
6817 sha1 = "10e437f86bc7c7e58f7b9652ed878daaa95faae1";
6818 };
6819 }
6820 {
6821 name = "postcss_normalize_whitespace___postcss_normalize_whitespace_4.0.2.tgz";
6822 path = fetchurl {
6823 name = "postcss_normalize_whitespace___postcss_normalize_whitespace_4.0.2.tgz";
6824 url = "https://registry.yarnpkg.com/postcss-normalize-whitespace/-/postcss-normalize-whitespace-4.0.2.tgz";
6825 sha1 = "bf1d4070fe4fcea87d1348e825d8cc0c5faa7d82";
6826 };
6827 }
6828 {
6829 name = "postcss_ordered_values___postcss_ordered_values_4.1.2.tgz";
6830 path = fetchurl {
6831 name = "postcss_ordered_values___postcss_ordered_values_4.1.2.tgz";
6832 url = "https://registry.yarnpkg.com/postcss-ordered-values/-/postcss-ordered-values-4.1.2.tgz";
6833 sha1 = "0cf75c820ec7d5c4d280189559e0b571ebac0eee";
6834 };
6835 }
6836 {
6837 name = "postcss_reduce_initial___postcss_reduce_initial_4.0.3.tgz";
6838 path = fetchurl {
6839 name = "postcss_reduce_initial___postcss_reduce_initial_4.0.3.tgz";
6840 url = "https://registry.yarnpkg.com/postcss-reduce-initial/-/postcss-reduce-initial-4.0.3.tgz";
6841 sha1 = "7fd42ebea5e9c814609639e2c2e84ae270ba48df";
6842 };
6843 }
6844 {
6845 name = "postcss_reduce_transforms___postcss_reduce_transforms_4.0.2.tgz";
6846 path = fetchurl {
6847 name = "postcss_reduce_transforms___postcss_reduce_transforms_4.0.2.tgz";
6848 url = "https://registry.yarnpkg.com/postcss-reduce-transforms/-/postcss-reduce-transforms-4.0.2.tgz";
6849 sha1 = "17efa405eacc6e07be3414a5ca2d1074681d4e29";
6850 };
6851 }
6852 {
6853 name = "postcss_selector_parser___postcss_selector_parser_3.1.2.tgz";
6854 path = fetchurl {
6855 name = "postcss_selector_parser___postcss_selector_parser_3.1.2.tgz";
6856 url = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-3.1.2.tgz";
6857 sha1 = "b310f5c4c0fdaf76f94902bbaa30db6aa84f5270";
6858 };
6859 }
6860 {
6861 name = "postcss_selector_parser___postcss_selector_parser_6.0.2.tgz";
6862 path = fetchurl {
6863 name = "postcss_selector_parser___postcss_selector_parser_6.0.2.tgz";
6864 url = "https://registry.yarnpkg.com/postcss-selector-parser/-/postcss-selector-parser-6.0.2.tgz";
6865 sha1 = "934cf799d016c83411859e09dcecade01286ec5c";
6866 };
6867 }
6868 {
6869 name = "postcss_svgo___postcss_svgo_4.0.2.tgz";
6870 path = fetchurl {
6871 name = "postcss_svgo___postcss_svgo_4.0.2.tgz";
6872 url = "https://registry.yarnpkg.com/postcss-svgo/-/postcss-svgo-4.0.2.tgz";
6873 sha1 = "17b997bc711b333bab143aaed3b8d3d6e3d38258";
6874 };
6875 }
6876 {
6877 name = "postcss_unique_selectors___postcss_unique_selectors_4.0.1.tgz";
6878 path = fetchurl {
6879 name = "postcss_unique_selectors___postcss_unique_selectors_4.0.1.tgz";
6880 url = "https://registry.yarnpkg.com/postcss-unique-selectors/-/postcss-unique-selectors-4.0.1.tgz";
6881 sha1 = "9446911f3289bfd64c6d680f073c03b1f9ee4bac";
6882 };
6883 }
6884 {
6885 name = "postcss_value_parser___postcss_value_parser_3.3.1.tgz";
6886 path = fetchurl {
6887 name = "postcss_value_parser___postcss_value_parser_3.3.1.tgz";
6888 url = "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz";
6889 sha1 = "9ff822547e2893213cf1c30efa51ac5fd1ba8281";
6890 };
6891 }
6892 {
6893 name = "postcss_value_parser___postcss_value_parser_4.1.0.tgz";
6894 path = fetchurl {
6895 name = "postcss_value_parser___postcss_value_parser_4.1.0.tgz";
6896 url = "https://registry.yarnpkg.com/postcss-value-parser/-/postcss-value-parser-4.1.0.tgz";
6897 sha1 = "443f6a20ced6481a2bda4fa8532a6e55d789a2cb";
6898 };
6899 }
6900 {
6901 name = "postcss___postcss_7.0.32.tgz";
6902 path = fetchurl {
6903 name = "postcss___postcss_7.0.32.tgz";
6904 url = "https://registry.yarnpkg.com/postcss/-/postcss-7.0.32.tgz";
6905 sha1 = "4310d6ee347053da3433db2be492883d62cec59d";
6906 };
6907 }
6908 {
6909 name = "prelude_ls___prelude_ls_1.2.1.tgz";
6910 path = fetchurl {
6911 name = "prelude_ls___prelude_ls_1.2.1.tgz";
6912 url = "https://registry.yarnpkg.com/prelude-ls/-/prelude-ls-1.2.1.tgz";
6913 sha1 = "debc6489d7a6e6b0e7611888cec880337d316396";
6914 };
6915 }
6916 {
6917 name = "prepend_http___prepend_http_1.0.4.tgz";
6918 path = fetchurl {
6919 name = "prepend_http___prepend_http_1.0.4.tgz";
6920 url = "https://registry.yarnpkg.com/prepend-http/-/prepend-http-1.0.4.tgz";
6921 sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc";
6922 };
6923 }
6924 {
6925 name = "prettier_linter_helpers___prettier_linter_helpers_1.0.0.tgz";
6926 path = fetchurl {
6927 name = "prettier_linter_helpers___prettier_linter_helpers_1.0.0.tgz";
6928 url = "https://registry.yarnpkg.com/prettier-linter-helpers/-/prettier-linter-helpers-1.0.0.tgz";
6929 sha1 = "d23d41fe1375646de2d0104d3454a3008802cf7b";
6930 };
6931 }
6932 {
6933 name = "prettier___prettier_1.19.1.tgz";
6934 path = fetchurl {
6935 name = "prettier___prettier_1.19.1.tgz";
6936 url = "https://registry.yarnpkg.com/prettier/-/prettier-1.19.1.tgz";
6937 sha1 = "f7d7f5ff8a9cd872a7be4ca142095956a60797cb";
6938 };
6939 }
6940 {
6941 name = "prettier___prettier_2.0.5.tgz";
6942 path = fetchurl {
6943 name = "prettier___prettier_2.0.5.tgz";
6944 url = "https://registry.yarnpkg.com/prettier/-/prettier-2.0.5.tgz";
6945 sha1 = "d6d56282455243f2f92cc1716692c08aa31522d4";
6946 };
6947 }
6948 {
6949 name = "pretty_bytes___pretty_bytes_5.3.0.tgz";
6950 path = fetchurl {
6951 name = "pretty_bytes___pretty_bytes_5.3.0.tgz";
6952 url = "https://registry.yarnpkg.com/pretty-bytes/-/pretty-bytes-5.3.0.tgz";
6953 sha1 = "f2849e27db79fb4d6cfe24764fc4134f165989f2";
6954 };
6955 }
6956 {
6957 name = "pretty_error___pretty_error_2.1.1.tgz";
6958 path = fetchurl {
6959 name = "pretty_error___pretty_error_2.1.1.tgz";
6960 url = "https://registry.yarnpkg.com/pretty-error/-/pretty-error-2.1.1.tgz";
6961 sha1 = "5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3";
6962 };
6963 }
6964 {
6965 name = "private___private_0.1.8.tgz";
6966 path = fetchurl {
6967 name = "private___private_0.1.8.tgz";
6968 url = "https://registry.yarnpkg.com/private/-/private-0.1.8.tgz";
6969 sha1 = "2381edb3689f7a53d653190060fcf822d2f368ff";
6970 };
6971 }
6972 {
6973 name = "process_nextick_args___process_nextick_args_2.0.1.tgz";
6974 path = fetchurl {
6975 name = "process_nextick_args___process_nextick_args_2.0.1.tgz";
6976 url = "https://registry.yarnpkg.com/process-nextick-args/-/process-nextick-args-2.0.1.tgz";
6977 sha1 = "7820d9b16120cc55ca9ae7792680ae7dba6d7fe2";
6978 };
6979 }
6980 {
6981 name = "process___process_0.11.10.tgz";
6982 path = fetchurl {
6983 name = "process___process_0.11.10.tgz";
6984 url = "https://registry.yarnpkg.com/process/-/process-0.11.10.tgz";
6985 sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
6986 };
6987 }
6988 {
6989 name = "progress___progress_2.0.3.tgz";
6990 path = fetchurl {
6991 name = "progress___progress_2.0.3.tgz";
6992 url = "https://registry.yarnpkg.com/progress/-/progress-2.0.3.tgz";
6993 sha1 = "7e8cf8d8f5b8f239c1bc68beb4eb78567d572ef8";
6994 };
6995 }
6996 {
6997 name = "promise_inflight___promise_inflight_1.0.1.tgz";
6998 path = fetchurl {
6999 name = "promise_inflight___promise_inflight_1.0.1.tgz";
7000 url = "https://registry.yarnpkg.com/promise-inflight/-/promise-inflight-1.0.1.tgz";
7001 sha1 = "98472870bf228132fcbdd868129bad12c3c029e3";
7002 };
7003 }
7004 {
7005 name = "proxy_addr___proxy_addr_2.0.6.tgz";
7006 path = fetchurl {
7007 name = "proxy_addr___proxy_addr_2.0.6.tgz";
7008 url = "https://registry.yarnpkg.com/proxy-addr/-/proxy-addr-2.0.6.tgz";
7009 sha1 = "fdc2336505447d3f2f2c638ed272caf614bbb2bf";
7010 };
7011 }
7012 {
7013 name = "prr___prr_1.0.1.tgz";
7014 path = fetchurl {
7015 name = "prr___prr_1.0.1.tgz";
7016 url = "https://registry.yarnpkg.com/prr/-/prr-1.0.1.tgz";
7017 sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
7018 };
7019 }
7020 {
7021 name = "pseudomap___pseudomap_1.0.2.tgz";
7022 path = fetchurl {
7023 name = "pseudomap___pseudomap_1.0.2.tgz";
7024 url = "https://registry.yarnpkg.com/pseudomap/-/pseudomap-1.0.2.tgz";
7025 sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
7026 };
7027 }
7028 {
7029 name = "psl___psl_1.8.0.tgz";
7030 path = fetchurl {
7031 name = "psl___psl_1.8.0.tgz";
7032 url = "https://registry.yarnpkg.com/psl/-/psl-1.8.0.tgz";
7033 sha1 = "9326f8bcfb013adcc005fdff056acce020e51c24";
7034 };
7035 }
7036 {
7037 name = "public_encrypt___public_encrypt_4.0.3.tgz";
7038 path = fetchurl {
7039 name = "public_encrypt___public_encrypt_4.0.3.tgz";
7040 url = "https://registry.yarnpkg.com/public-encrypt/-/public-encrypt-4.0.3.tgz";
7041 sha1 = "4fcc9d77a07e48ba7527e7cbe0de33d0701331e0";
7042 };
7043 }
7044 {
7045 name = "pump___pump_2.0.1.tgz";
7046 path = fetchurl {
7047 name = "pump___pump_2.0.1.tgz";
7048 url = "https://registry.yarnpkg.com/pump/-/pump-2.0.1.tgz";
7049 sha1 = "12399add6e4cf7526d973cbc8b5ce2e2908b3909";
7050 };
7051 }
7052 {
7053 name = "pump___pump_3.0.0.tgz";
7054 path = fetchurl {
7055 name = "pump___pump_3.0.0.tgz";
7056 url = "https://registry.yarnpkg.com/pump/-/pump-3.0.0.tgz";
7057 sha1 = "b4a2116815bde2f4e1ea602354e8c75565107a64";
7058 };
7059 }
7060 {
7061 name = "pumpify___pumpify_1.5.1.tgz";
7062 path = fetchurl {
7063 name = "pumpify___pumpify_1.5.1.tgz";
7064 url = "https://registry.yarnpkg.com/pumpify/-/pumpify-1.5.1.tgz";
7065 sha1 = "36513be246ab27570b1a374a5ce278bfd74370ce";
7066 };
7067 }
7068 {
7069 name = "punycode___punycode_1.3.2.tgz";
7070 path = fetchurl {
7071 name = "punycode___punycode_1.3.2.tgz";
7072 url = "https://registry.yarnpkg.com/punycode/-/punycode-1.3.2.tgz";
7073 sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
7074 };
7075 }
7076 {
7077 name = "punycode___punycode_1.4.1.tgz";
7078 path = fetchurl {
7079 name = "punycode___punycode_1.4.1.tgz";
7080 url = "https://registry.yarnpkg.com/punycode/-/punycode-1.4.1.tgz";
7081 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
7082 };
7083 }
7084 {
7085 name = "punycode___punycode_2.1.1.tgz";
7086 path = fetchurl {
7087 name = "punycode___punycode_2.1.1.tgz";
7088 url = "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz";
7089 sha1 = "b58b010ac40c22c5657616c8d2c2c02c7bf479ec";
7090 };
7091 }
7092 {
7093 name = "q___q_1.5.1.tgz";
7094 path = fetchurl {
7095 name = "q___q_1.5.1.tgz";
7096 url = "https://registry.yarnpkg.com/q/-/q-1.5.1.tgz";
7097 sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
7098 };
7099 }
7100 {
7101 name = "qs___qs_6.7.0.tgz";
7102 path = fetchurl {
7103 name = "qs___qs_6.7.0.tgz";
7104 url = "https://registry.yarnpkg.com/qs/-/qs-6.7.0.tgz";
7105 sha1 = "41dc1a015e3d581f1621776be31afb2876a9b1bc";
7106 };
7107 }
7108 {
7109 name = "qs___qs_6.5.2.tgz";
7110 path = fetchurl {
7111 name = "qs___qs_6.5.2.tgz";
7112 url = "https://registry.yarnpkg.com/qs/-/qs-6.5.2.tgz";
7113 sha1 = "cb3ae806e8740444584ef154ce8ee98d403f3e36";
7114 };
7115 }
7116 {
7117 name = "query_string___query_string_4.3.4.tgz";
7118 path = fetchurl {
7119 name = "query_string___query_string_4.3.4.tgz";
7120 url = "https://registry.yarnpkg.com/query-string/-/query-string-4.3.4.tgz";
7121 sha1 = "bbb693b9ca915c232515b228b1a02b609043dbeb";
7122 };
7123 }
7124 {
7125 name = "querystring_es3___querystring_es3_0.2.1.tgz";
7126 path = fetchurl {
7127 name = "querystring_es3___querystring_es3_0.2.1.tgz";
7128 url = "https://registry.yarnpkg.com/querystring-es3/-/querystring-es3-0.2.1.tgz";
7129 sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
7130 };
7131 }
7132 {
7133 name = "querystring___querystring_0.2.0.tgz";
7134 path = fetchurl {
7135 name = "querystring___querystring_0.2.0.tgz";
7136 url = "https://registry.yarnpkg.com/querystring/-/querystring-0.2.0.tgz";
7137 sha1 = "b209849203bb25df820da756e747005878521620";
7138 };
7139 }
7140 {
7141 name = "querystringify___querystringify_2.1.1.tgz";
7142 path = fetchurl {
7143 name = "querystringify___querystringify_2.1.1.tgz";
7144 url = "https://registry.yarnpkg.com/querystringify/-/querystringify-2.1.1.tgz";
7145 sha1 = "60e5a5fd64a7f8bfa4d2ab2ed6fdf4c85bad154e";
7146 };
7147 }
7148 {
7149 name = "randombytes___randombytes_2.1.0.tgz";
7150 path = fetchurl {
7151 name = "randombytes___randombytes_2.1.0.tgz";
7152 url = "https://registry.yarnpkg.com/randombytes/-/randombytes-2.1.0.tgz";
7153 sha1 = "df6f84372f0270dc65cdf6291349ab7a473d4f2a";
7154 };
7155 }
7156 {
7157 name = "randomfill___randomfill_1.0.4.tgz";
7158 path = fetchurl {
7159 name = "randomfill___randomfill_1.0.4.tgz";
7160 url = "https://registry.yarnpkg.com/randomfill/-/randomfill-1.0.4.tgz";
7161 sha1 = "c92196fc86ab42be983f1bf31778224931d61458";
7162 };
7163 }
7164 {
7165 name = "range_parser___range_parser_1.2.1.tgz";
7166 path = fetchurl {
7167 name = "range_parser___range_parser_1.2.1.tgz";
7168 url = "https://registry.yarnpkg.com/range-parser/-/range-parser-1.2.1.tgz";
7169 sha1 = "3cf37023d199e1c24d1a55b84800c2f3e6468031";
7170 };
7171 }
7172 {
7173 name = "raw_body___raw_body_2.4.0.tgz";
7174 path = fetchurl {
7175 name = "raw_body___raw_body_2.4.0.tgz";
7176 url = "https://registry.yarnpkg.com/raw-body/-/raw-body-2.4.0.tgz";
7177 sha1 = "a1ce6fb9c9bc356ca52e89256ab59059e13d0332";
7178 };
7179 }
7180 {
7181 name = "raw_loader___raw_loader_4.0.1.tgz";
7182 path = fetchurl {
7183 name = "raw_loader___raw_loader_4.0.1.tgz";
7184 url = "https://registry.yarnpkg.com/raw-loader/-/raw-loader-4.0.1.tgz";
7185 sha1 = "14e1f726a359b68437e183d5a5b7d33a3eba6933";
7186 };
7187 }
7188 {
7189 name = "read_pkg___read_pkg_5.2.0.tgz";
7190 path = fetchurl {
7191 name = "read_pkg___read_pkg_5.2.0.tgz";
7192 url = "https://registry.yarnpkg.com/read-pkg/-/read-pkg-5.2.0.tgz";
7193 sha1 = "7bf295438ca5a33e56cd30e053b34ee7250c93cc";
7194 };
7195 }
7196 {
7197 name = "readable_stream___readable_stream_2.3.7.tgz";
7198 path = fetchurl {
7199 name = "readable_stream___readable_stream_2.3.7.tgz";
7200 url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-2.3.7.tgz";
7201 sha1 = "1eca1cf711aef814c04f62252a36a62f6cb23b57";
7202 };
7203 }
7204 {
7205 name = "readable_stream___readable_stream_3.6.0.tgz";
7206 path = fetchurl {
7207 name = "readable_stream___readable_stream_3.6.0.tgz";
7208 url = "https://registry.yarnpkg.com/readable-stream/-/readable-stream-3.6.0.tgz";
7209 sha1 = "337bbda3adc0706bd3e024426a286d4b4b2c9198";
7210 };
7211 }
7212 {
7213 name = "readdirp___readdirp_2.2.1.tgz";
7214 path = fetchurl {
7215 name = "readdirp___readdirp_2.2.1.tgz";
7216 url = "https://registry.yarnpkg.com/readdirp/-/readdirp-2.2.1.tgz";
7217 sha1 = "0e87622a3325aa33e892285caf8b4e846529a525";
7218 };
7219 }
7220 {
7221 name = "readdirp___readdirp_3.4.0.tgz";
7222 path = fetchurl {
7223 name = "readdirp___readdirp_3.4.0.tgz";
7224 url = "https://registry.yarnpkg.com/readdirp/-/readdirp-3.4.0.tgz";
7225 sha1 = "9fdccdf9e9155805449221ac645e8303ab5b9ada";
7226 };
7227 }
7228 {
7229 name = "regenerate_unicode_properties___regenerate_unicode_properties_8.2.0.tgz";
7230 path = fetchurl {
7231 name = "regenerate_unicode_properties___regenerate_unicode_properties_8.2.0.tgz";
7232 url = "https://registry.yarnpkg.com/regenerate-unicode-properties/-/regenerate-unicode-properties-8.2.0.tgz";
7233 sha1 = "e5de7111d655e7ba60c057dbe9ff37c87e65cdec";
7234 };
7235 }
7236 {
7237 name = "regenerate___regenerate_1.4.1.tgz";
7238 path = fetchurl {
7239 name = "regenerate___regenerate_1.4.1.tgz";
7240 url = "https://registry.yarnpkg.com/regenerate/-/regenerate-1.4.1.tgz";
7241 sha1 = "cad92ad8e6b591773485fbe05a485caf4f457e6f";
7242 };
7243 }
7244 {
7245 name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
7246 path = fetchurl {
7247 name = "regenerator_runtime___regenerator_runtime_0.11.1.tgz";
7248 url = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
7249 sha1 = "be05ad7f9bf7d22e056f9726cee5017fbf19e2e9";
7250 };
7251 }
7252 {
7253 name = "regenerator_runtime___regenerator_runtime_0.13.5.tgz";
7254 path = fetchurl {
7255 name = "regenerator_runtime___regenerator_runtime_0.13.5.tgz";
7256 url = "https://registry.yarnpkg.com/regenerator-runtime/-/regenerator-runtime-0.13.5.tgz";
7257 sha1 = "d878a1d094b4306d10b9096484b33ebd55e26697";
7258 };
7259 }
7260 {
7261 name = "regenerator_transform___regenerator_transform_0.14.4.tgz";
7262 path = fetchurl {
7263 name = "regenerator_transform___regenerator_transform_0.14.4.tgz";
7264 url = "https://registry.yarnpkg.com/regenerator-transform/-/regenerator-transform-0.14.4.tgz";
7265 sha1 = "5266857896518d1616a78a0479337a30ea974cc7";
7266 };
7267 }
7268 {
7269 name = "regex_not___regex_not_1.0.2.tgz";
7270 path = fetchurl {
7271 name = "regex_not___regex_not_1.0.2.tgz";
7272 url = "https://registry.yarnpkg.com/regex-not/-/regex-not-1.0.2.tgz";
7273 sha1 = "1f4ece27e00b0b65e0247a6810e6a85d83a5752c";
7274 };
7275 }
7276 {
7277 name = "regexp.prototype.flags___regexp.prototype.flags_1.3.0.tgz";
7278 path = fetchurl {
7279 name = "regexp.prototype.flags___regexp.prototype.flags_1.3.0.tgz";
7280 url = "https://registry.yarnpkg.com/regexp.prototype.flags/-/regexp.prototype.flags-1.3.0.tgz";
7281 sha1 = "7aba89b3c13a64509dabcf3ca8d9fbb9bdf5cb75";
7282 };
7283 }
7284 {
7285 name = "regexpp___regexpp_3.1.0.tgz";
7286 path = fetchurl {
7287 name = "regexpp___regexpp_3.1.0.tgz";
7288 url = "https://registry.yarnpkg.com/regexpp/-/regexpp-3.1.0.tgz";
7289 sha1 = "206d0ad0a5648cffbdb8ae46438f3dc51c9f78e2";
7290 };
7291 }
7292 {
7293 name = "regexpu_core___regexpu_core_4.7.0.tgz";
7294 path = fetchurl {
7295 name = "regexpu_core___regexpu_core_4.7.0.tgz";
7296 url = "https://registry.yarnpkg.com/regexpu-core/-/regexpu-core-4.7.0.tgz";
7297 sha1 = "fcbf458c50431b0bb7b45d6967b8192d91f3d938";
7298 };
7299 }
7300 {
7301 name = "register_service_worker___register_service_worker_1.7.1.tgz";
7302 path = fetchurl {
7303 name = "register_service_worker___register_service_worker_1.7.1.tgz";
7304 url = "https://registry.yarnpkg.com/register-service-worker/-/register-service-worker-1.7.1.tgz";
7305 sha1 = "6308347ac6c0af0f6c0b22ea5d59d25e836bc932";
7306 };
7307 }
7308 {
7309 name = "regjsgen___regjsgen_0.5.2.tgz";
7310 path = fetchurl {
7311 name = "regjsgen___regjsgen_0.5.2.tgz";
7312 url = "https://registry.yarnpkg.com/regjsgen/-/regjsgen-0.5.2.tgz";
7313 sha1 = "92ff295fb1deecbf6ecdab2543d207e91aa33733";
7314 };
7315 }
7316 {
7317 name = "regjsparser___regjsparser_0.6.4.tgz";
7318 path = fetchurl {
7319 name = "regjsparser___regjsparser_0.6.4.tgz";
7320 url = "https://registry.yarnpkg.com/regjsparser/-/regjsparser-0.6.4.tgz";
7321 sha1 = "a769f8684308401a66e9b529d2436ff4d0666272";
7322 };
7323 }
7324 {
7325 name = "relateurl___relateurl_0.2.7.tgz";
7326 path = fetchurl {
7327 name = "relateurl___relateurl_0.2.7.tgz";
7328 url = "https://registry.yarnpkg.com/relateurl/-/relateurl-0.2.7.tgz";
7329 sha1 = "54dbf377e51440aca90a4cd274600d3ff2d888a9";
7330 };
7331 }
7332 {
7333 name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
7334 path = fetchurl {
7335 name = "remove_trailing_separator___remove_trailing_separator_1.1.0.tgz";
7336 url = "https://registry.yarnpkg.com/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
7337 sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
7338 };
7339 }
7340 {
7341 name = "renderkid___renderkid_2.0.3.tgz";
7342 path = fetchurl {
7343 name = "renderkid___renderkid_2.0.3.tgz";
7344 url = "https://registry.yarnpkg.com/renderkid/-/renderkid-2.0.3.tgz";
7345 sha1 = "380179c2ff5ae1365c522bf2fcfcff01c5b74149";
7346 };
7347 }
7348 {
7349 name = "repeat_element___repeat_element_1.1.3.tgz";
7350 path = fetchurl {
7351 name = "repeat_element___repeat_element_1.1.3.tgz";
7352 url = "https://registry.yarnpkg.com/repeat-element/-/repeat-element-1.1.3.tgz";
7353 sha1 = "782e0d825c0c5a3bb39731f84efee6b742e6b1ce";
7354 };
7355 }
7356 {
7357 name = "repeat_string___repeat_string_1.6.1.tgz";
7358 path = fetchurl {
7359 name = "repeat_string___repeat_string_1.6.1.tgz";
7360 url = "https://registry.yarnpkg.com/repeat-string/-/repeat-string-1.6.1.tgz";
7361 sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
7362 };
7363 }
7364 {
7365 name = "request_promise_core___request_promise_core_1.1.3.tgz";
7366 path = fetchurl {
7367 name = "request_promise_core___request_promise_core_1.1.3.tgz";
7368 url = "https://registry.yarnpkg.com/request-promise-core/-/request-promise-core-1.1.3.tgz";
7369 sha1 = "e9a3c081b51380dfea677336061fea879a829ee9";
7370 };
7371 }
7372 {
7373 name = "request_promise_native___request_promise_native_1.0.8.tgz";
7374 path = fetchurl {
7375 name = "request_promise_native___request_promise_native_1.0.8.tgz";
7376 url = "https://registry.yarnpkg.com/request-promise-native/-/request-promise-native-1.0.8.tgz";
7377 sha1 = "a455b960b826e44e2bf8999af64dff2bfe58cb36";
7378 };
7379 }
7380 {
7381 name = "request___request_2.88.2.tgz";
7382 path = fetchurl {
7383 name = "request___request_2.88.2.tgz";
7384 url = "https://registry.yarnpkg.com/request/-/request-2.88.2.tgz";
7385 sha1 = "d73c918731cb5a87da047e207234146f664d12b3";
7386 };
7387 }
7388 {
7389 name = "require_directory___require_directory_2.1.1.tgz";
7390 path = fetchurl {
7391 name = "require_directory___require_directory_2.1.1.tgz";
7392 url = "https://registry.yarnpkg.com/require-directory/-/require-directory-2.1.1.tgz";
7393 sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
7394 };
7395 }
7396 {
7397 name = "require_main_filename___require_main_filename_2.0.0.tgz";
7398 path = fetchurl {
7399 name = "require_main_filename___require_main_filename_2.0.0.tgz";
7400 url = "https://registry.yarnpkg.com/require-main-filename/-/require-main-filename-2.0.0.tgz";
7401 sha1 = "d0b329ecc7cc0f61649f62215be69af54aa8989b";
7402 };
7403 }
7404 {
7405 name = "requires_port___requires_port_1.0.0.tgz";
7406 path = fetchurl {
7407 name = "requires_port___requires_port_1.0.0.tgz";
7408 url = "https://registry.yarnpkg.com/requires-port/-/requires-port-1.0.0.tgz";
7409 sha1 = "925d2601d39ac485e091cf0da5c6e694dc3dcaff";
7410 };
7411 }
7412 {
7413 name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
7414 path = fetchurl {
7415 name = "resolve_cwd___resolve_cwd_2.0.0.tgz";
7416 url = "https://registry.yarnpkg.com/resolve-cwd/-/resolve-cwd-2.0.0.tgz";
7417 sha1 = "00a9f7387556e27038eae232caa372a6a59b665a";
7418 };
7419 }
7420 {
7421 name = "resolve_from___resolve_from_3.0.0.tgz";
7422 path = fetchurl {
7423 name = "resolve_from___resolve_from_3.0.0.tgz";
7424 url = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-3.0.0.tgz";
7425 sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
7426 };
7427 }
7428 {
7429 name = "resolve_from___resolve_from_4.0.0.tgz";
7430 path = fetchurl {
7431 name = "resolve_from___resolve_from_4.0.0.tgz";
7432 url = "https://registry.yarnpkg.com/resolve-from/-/resolve-from-4.0.0.tgz";
7433 sha1 = "4abcd852ad32dd7baabfe9b40e00a36db5f392e6";
7434 };
7435 }
7436 {
7437 name = "resolve_url___resolve_url_0.2.1.tgz";
7438 path = fetchurl {
7439 name = "resolve_url___resolve_url_0.2.1.tgz";
7440 url = "https://registry.yarnpkg.com/resolve-url/-/resolve-url-0.2.1.tgz";
7441 sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
7442 };
7443 }
7444 {
7445 name = "resolve___resolve_1.17.0.tgz";
7446 path = fetchurl {
7447 name = "resolve___resolve_1.17.0.tgz";
7448 url = "https://registry.yarnpkg.com/resolve/-/resolve-1.17.0.tgz";
7449 sha1 = "b25941b54968231cc2d1bb76a79cb7f2c0bf8444";
7450 };
7451 }
7452 {
7453 name = "restore_cursor___restore_cursor_2.0.0.tgz";
7454 path = fetchurl {
7455 name = "restore_cursor___restore_cursor_2.0.0.tgz";
7456 url = "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-2.0.0.tgz";
7457 sha1 = "9f7ee287f82fd326d4fd162923d62129eee0dfaf";
7458 };
7459 }
7460 {
7461 name = "restore_cursor___restore_cursor_3.1.0.tgz";
7462 path = fetchurl {
7463 name = "restore_cursor___restore_cursor_3.1.0.tgz";
7464 url = "https://registry.yarnpkg.com/restore-cursor/-/restore-cursor-3.1.0.tgz";
7465 sha1 = "39f67c54b3a7a58cea5236d95cf0034239631f7e";
7466 };
7467 }
7468 {
7469 name = "ret___ret_0.1.15.tgz";
7470 path = fetchurl {
7471 name = "ret___ret_0.1.15.tgz";
7472 url = "https://registry.yarnpkg.com/ret/-/ret-0.1.15.tgz";
7473 sha1 = "b8a4825d5bdb1fc3f6f53c2bc33f81388681c7bc";
7474 };
7475 }
7476 {
7477 name = "retry___retry_0.12.0.tgz";
7478 path = fetchurl {
7479 name = "retry___retry_0.12.0.tgz";
7480 url = "https://registry.yarnpkg.com/retry/-/retry-0.12.0.tgz";
7481 sha1 = "1b42a6266a21f07421d1b0b54b7dc167b01c013b";
7482 };
7483 }
7484 {
7485 name = "rgb_regex___rgb_regex_1.0.1.tgz";
7486 path = fetchurl {
7487 name = "rgb_regex___rgb_regex_1.0.1.tgz";
7488 url = "https://registry.yarnpkg.com/rgb-regex/-/rgb-regex-1.0.1.tgz";
7489 sha1 = "c0e0d6882df0e23be254a475e8edd41915feaeb1";
7490 };
7491 }
7492 {
7493 name = "rgba_regex___rgba_regex_1.0.0.tgz";
7494 path = fetchurl {
7495 name = "rgba_regex___rgba_regex_1.0.0.tgz";
7496 url = "https://registry.yarnpkg.com/rgba-regex/-/rgba-regex-1.0.0.tgz";
7497 sha1 = "43374e2e2ca0968b0ef1523460b7d730ff22eeb3";
7498 };
7499 }
7500 {
7501 name = "rimraf___rimraf_2.6.3.tgz";
7502 path = fetchurl {
7503 name = "rimraf___rimraf_2.6.3.tgz";
7504 url = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.6.3.tgz";
7505 sha1 = "b2d104fe0d8fb27cf9e0a1cda8262dd3833c6cab";
7506 };
7507 }
7508 {
7509 name = "rimraf___rimraf_2.7.1.tgz";
7510 path = fetchurl {
7511 name = "rimraf___rimraf_2.7.1.tgz";
7512 url = "https://registry.yarnpkg.com/rimraf/-/rimraf-2.7.1.tgz";
7513 sha1 = "35797f13a7fdadc566142c29d4f07ccad483e3ec";
7514 };
7515 }
7516 {
7517 name = "ripemd160___ripemd160_2.0.2.tgz";
7518 path = fetchurl {
7519 name = "ripemd160___ripemd160_2.0.2.tgz";
7520 url = "https://registry.yarnpkg.com/ripemd160/-/ripemd160-2.0.2.tgz";
7521 sha1 = "a1c1a6f624751577ba5d07914cbc92850585890c";
7522 };
7523 }
7524 {
7525 name = "run_async___run_async_2.4.1.tgz";
7526 path = fetchurl {
7527 name = "run_async___run_async_2.4.1.tgz";
7528 url = "https://registry.yarnpkg.com/run-async/-/run-async-2.4.1.tgz";
7529 sha1 = "8440eccf99ea3e70bd409d49aab88e10c189a455";
7530 };
7531 }
7532 {
7533 name = "run_queue___run_queue_1.0.3.tgz";
7534 path = fetchurl {
7535 name = "run_queue___run_queue_1.0.3.tgz";
7536 url = "https://registry.yarnpkg.com/run-queue/-/run-queue-1.0.3.tgz";
7537 sha1 = "e848396f057d223f24386924618e25694161ec47";
7538 };
7539 }
7540 {
7541 name = "rxjs___rxjs_6.5.5.tgz";
7542 path = fetchurl {
7543 name = "rxjs___rxjs_6.5.5.tgz";
7544 url = "https://registry.yarnpkg.com/rxjs/-/rxjs-6.5.5.tgz";
7545 sha1 = "c5c884e3094c8cfee31bf27eb87e54ccfc87f9ec";
7546 };
7547 }
7548 {
7549 name = "safe_buffer___safe_buffer_5.1.2.tgz";
7550 path = fetchurl {
7551 name = "safe_buffer___safe_buffer_5.1.2.tgz";
7552 url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.1.2.tgz";
7553 sha1 = "991ec69d296e0313747d59bdfd2b745c35f8828d";
7554 };
7555 }
7556 {
7557 name = "safe_buffer___safe_buffer_5.2.1.tgz";
7558 path = fetchurl {
7559 name = "safe_buffer___safe_buffer_5.2.1.tgz";
7560 url = "https://registry.yarnpkg.com/safe-buffer/-/safe-buffer-5.2.1.tgz";
7561 sha1 = "1eaf9fa9bdb1fdd4ec75f58f9cdb4e6b7827eec6";
7562 };
7563 }
7564 {
7565 name = "safe_regex___safe_regex_1.1.0.tgz";
7566 path = fetchurl {
7567 name = "safe_regex___safe_regex_1.1.0.tgz";
7568 url = "https://registry.yarnpkg.com/safe-regex/-/safe-regex-1.1.0.tgz";
7569 sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
7570 };
7571 }
7572 {
7573 name = "safer_buffer___safer_buffer_2.1.2.tgz";
7574 path = fetchurl {
7575 name = "safer_buffer___safer_buffer_2.1.2.tgz";
7576 url = "https://registry.yarnpkg.com/safer-buffer/-/safer-buffer-2.1.2.tgz";
7577 sha1 = "44fa161b0187b9549dd84bb91802f9bd8385cd6a";
7578 };
7579 }
7580 {
7581 name = "sass_loader___sass_loader_8.0.2.tgz";
7582 path = fetchurl {
7583 name = "sass_loader___sass_loader_8.0.2.tgz";
7584 url = "https://registry.yarnpkg.com/sass-loader/-/sass-loader-8.0.2.tgz";
7585 sha1 = "debecd8c3ce243c76454f2e8290482150380090d";
7586 };
7587 }
7588 {
7589 name = "sass___sass_1.26.8.tgz";
7590 path = fetchurl {
7591 name = "sass___sass_1.26.8.tgz";
7592 url = "https://registry.yarnpkg.com/sass/-/sass-1.26.8.tgz";
7593 sha1 = "312652530721f9568d4c4000b0db07ec6eb23325";
7594 };
7595 }
7596 {
7597 name = "sax___sax_1.2.4.tgz";
7598 path = fetchurl {
7599 name = "sax___sax_1.2.4.tgz";
7600 url = "https://registry.yarnpkg.com/sax/-/sax-1.2.4.tgz";
7601 sha1 = "2816234e2378bddc4e5354fab5caa895df7100d9";
7602 };
7603 }
7604 {
7605 name = "schema_utils___schema_utils_1.0.0.tgz";
7606 path = fetchurl {
7607 name = "schema_utils___schema_utils_1.0.0.tgz";
7608 url = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-1.0.0.tgz";
7609 sha1 = "0b79a93204d7b600d4b2850d1f66c2a34951c770";
7610 };
7611 }
7612 {
7613 name = "schema_utils___schema_utils_2.7.0.tgz";
7614 path = fetchurl {
7615 name = "schema_utils___schema_utils_2.7.0.tgz";
7616 url = "https://registry.yarnpkg.com/schema-utils/-/schema-utils-2.7.0.tgz";
7617 sha1 = "17151f76d8eae67fbbf77960c33c676ad9f4efc7";
7618 };
7619 }
7620 {
7621 name = "select_hose___select_hose_2.0.0.tgz";
7622 path = fetchurl {
7623 name = "select_hose___select_hose_2.0.0.tgz";
7624 url = "https://registry.yarnpkg.com/select-hose/-/select-hose-2.0.0.tgz";
7625 sha1 = "625d8658f865af43ec962bfc376a37359a4994ca";
7626 };
7627 }
7628 {
7629 name = "selfsigned___selfsigned_1.10.7.tgz";
7630 path = fetchurl {
7631 name = "selfsigned___selfsigned_1.10.7.tgz";
7632 url = "https://registry.yarnpkg.com/selfsigned/-/selfsigned-1.10.7.tgz";
7633 sha1 = "da5819fd049d5574f28e88a9bcc6dbc6e6f3906b";
7634 };
7635 }
7636 {
7637 name = "semver___semver_5.7.1.tgz";
7638 path = fetchurl {
7639 name = "semver___semver_5.7.1.tgz";
7640 url = "https://registry.yarnpkg.com/semver/-/semver-5.7.1.tgz";
7641 sha1 = "a954f931aeba508d307bbf069eff0c01c96116f7";
7642 };
7643 }
7644 {
7645 name = "semver___semver_7.0.0.tgz";
7646 path = fetchurl {
7647 name = "semver___semver_7.0.0.tgz";
7648 url = "https://registry.yarnpkg.com/semver/-/semver-7.0.0.tgz";
7649 sha1 = "5f3ca35761e47e05b206c6daff2cf814f0316b8e";
7650 };
7651 }
7652 {
7653 name = "semver___semver_6.3.0.tgz";
7654 path = fetchurl {
7655 name = "semver___semver_6.3.0.tgz";
7656 url = "https://registry.yarnpkg.com/semver/-/semver-6.3.0.tgz";
7657 sha1 = "ee0a64c8af5e8ceea67687b133761e1becbd1d3d";
7658 };
7659 }
7660 {
7661 name = "semver___semver_7.3.2.tgz";
7662 path = fetchurl {
7663 name = "semver___semver_7.3.2.tgz";
7664 url = "https://registry.yarnpkg.com/semver/-/semver-7.3.2.tgz";
7665 sha1 = "604962b052b81ed0786aae84389ffba70ffd3938";
7666 };
7667 }
7668 {
7669 name = "send___send_0.17.1.tgz";
7670 path = fetchurl {
7671 name = "send___send_0.17.1.tgz";
7672 url = "https://registry.yarnpkg.com/send/-/send-0.17.1.tgz";
7673 sha1 = "c1d8b059f7900f7466dd4938bdc44e11ddb376c8";
7674 };
7675 }
7676 {
7677 name = "serialize_javascript___serialize_javascript_2.1.2.tgz";
7678 path = fetchurl {
7679 name = "serialize_javascript___serialize_javascript_2.1.2.tgz";
7680 url = "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-2.1.2.tgz";
7681 sha1 = "ecec53b0e0317bdc95ef76ab7074b7384785fa61";
7682 };
7683 }
7684 {
7685 name = "serialize_javascript___serialize_javascript_3.1.0.tgz";
7686 path = fetchurl {
7687 name = "serialize_javascript___serialize_javascript_3.1.0.tgz";
7688 url = "https://registry.yarnpkg.com/serialize-javascript/-/serialize-javascript-3.1.0.tgz";
7689 sha1 = "8bf3a9170712664ef2561b44b691eafe399214ea";
7690 };
7691 }
7692 {
7693 name = "serve_index___serve_index_1.9.1.tgz";
7694 path = fetchurl {
7695 name = "serve_index___serve_index_1.9.1.tgz";
7696 url = "https://registry.yarnpkg.com/serve-index/-/serve-index-1.9.1.tgz";
7697 sha1 = "d3768d69b1e7d82e5ce050fff5b453bea12a9239";
7698 };
7699 }
7700 {
7701 name = "serve_static___serve_static_1.14.1.tgz";
7702 path = fetchurl {
7703 name = "serve_static___serve_static_1.14.1.tgz";
7704 url = "https://registry.yarnpkg.com/serve-static/-/serve-static-1.14.1.tgz";
7705 sha1 = "666e636dc4f010f7ef29970a88a674320898b2f9";
7706 };
7707 }
7708 {
7709 name = "set_blocking___set_blocking_2.0.0.tgz";
7710 path = fetchurl {
7711 name = "set_blocking___set_blocking_2.0.0.tgz";
7712 url = "https://registry.yarnpkg.com/set-blocking/-/set-blocking-2.0.0.tgz";
7713 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
7714 };
7715 }
7716 {
7717 name = "set_value___set_value_2.0.1.tgz";
7718 path = fetchurl {
7719 name = "set_value___set_value_2.0.1.tgz";
7720 url = "https://registry.yarnpkg.com/set-value/-/set-value-2.0.1.tgz";
7721 sha1 = "a18d40530e6f07de4228c7defe4227af8cad005b";
7722 };
7723 }
7724 {
7725 name = "setimmediate___setimmediate_1.0.5.tgz";
7726 path = fetchurl {
7727 name = "setimmediate___setimmediate_1.0.5.tgz";
7728 url = "https://registry.yarnpkg.com/setimmediate/-/setimmediate-1.0.5.tgz";
7729 sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
7730 };
7731 }
7732 {
7733 name = "setprototypeof___setprototypeof_1.1.0.tgz";
7734 path = fetchurl {
7735 name = "setprototypeof___setprototypeof_1.1.0.tgz";
7736 url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.0.tgz";
7737 sha1 = "d0bd85536887b6fe7c0d818cb962d9d91c54e656";
7738 };
7739 }
7740 {
7741 name = "setprototypeof___setprototypeof_1.1.1.tgz";
7742 path = fetchurl {
7743 name = "setprototypeof___setprototypeof_1.1.1.tgz";
7744 url = "https://registry.yarnpkg.com/setprototypeof/-/setprototypeof-1.1.1.tgz";
7745 sha1 = "7e95acb24aa92f5885e0abef5ba131330d4ae683";
7746 };
7747 }
7748 {
7749 name = "sha.js___sha.js_2.4.11.tgz";
7750 path = fetchurl {
7751 name = "sha.js___sha.js_2.4.11.tgz";
7752 url = "https://registry.yarnpkg.com/sha.js/-/sha.js-2.4.11.tgz";
7753 sha1 = "37a5cf0b81ecbc6943de109ba2960d1b26584ae7";
7754 };
7755 }
7756 {
7757 name = "shallow_clone___shallow_clone_3.0.1.tgz";
7758 path = fetchurl {
7759 name = "shallow_clone___shallow_clone_3.0.1.tgz";
7760 url = "https://registry.yarnpkg.com/shallow-clone/-/shallow-clone-3.0.1.tgz";
7761 sha1 = "8f2981ad92531f55035b01fb230769a40e02efa3";
7762 };
7763 }
7764 {
7765 name = "shebang_command___shebang_command_1.2.0.tgz";
7766 path = fetchurl {
7767 name = "shebang_command___shebang_command_1.2.0.tgz";
7768 url = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-1.2.0.tgz";
7769 sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
7770 };
7771 }
7772 {
7773 name = "shebang_command___shebang_command_2.0.0.tgz";
7774 path = fetchurl {
7775 name = "shebang_command___shebang_command_2.0.0.tgz";
7776 url = "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz";
7777 sha1 = "ccd0af4f8835fbdc265b82461aaf0c36663f34ea";
7778 };
7779 }
7780 {
7781 name = "shebang_regex___shebang_regex_1.0.0.tgz";
7782 path = fetchurl {
7783 name = "shebang_regex___shebang_regex_1.0.0.tgz";
7784 url = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-1.0.0.tgz";
7785 sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
7786 };
7787 }
7788 {
7789 name = "shebang_regex___shebang_regex_3.0.0.tgz";
7790 path = fetchurl {
7791 name = "shebang_regex___shebang_regex_3.0.0.tgz";
7792 url = "https://registry.yarnpkg.com/shebang-regex/-/shebang-regex-3.0.0.tgz";
7793 sha1 = "ae16f1644d873ecad843b0307b143362d4c42172";
7794 };
7795 }
7796 {
7797 name = "shell_quote___shell_quote_1.7.2.tgz";
7798 path = fetchurl {
7799 name = "shell_quote___shell_quote_1.7.2.tgz";
7800 url = "https://registry.yarnpkg.com/shell-quote/-/shell-quote-1.7.2.tgz";
7801 sha1 = "67a7d02c76c9da24f99d20808fcaded0e0e04be2";
7802 };
7803 }
7804 {
7805 name = "signal_exit___signal_exit_3.0.3.tgz";
7806 path = fetchurl {
7807 name = "signal_exit___signal_exit_3.0.3.tgz";
7808 url = "https://registry.yarnpkg.com/signal-exit/-/signal-exit-3.0.3.tgz";
7809 sha1 = "a1410c2edd8f077b08b4e253c8eacfcaf057461c";
7810 };
7811 }
7812 {
7813 name = "simple_swizzle___simple_swizzle_0.2.2.tgz";
7814 path = fetchurl {
7815 name = "simple_swizzle___simple_swizzle_0.2.2.tgz";
7816 url = "https://registry.yarnpkg.com/simple-swizzle/-/simple-swizzle-0.2.2.tgz";
7817 sha1 = "a4da6b635ffcccca33f70d17cb92592de95e557a";
7818 };
7819 }
7820 {
7821 name = "slash___slash_1.0.0.tgz";
7822 path = fetchurl {
7823 name = "slash___slash_1.0.0.tgz";
7824 url = "https://registry.yarnpkg.com/slash/-/slash-1.0.0.tgz";
7825 sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
7826 };
7827 }
7828 {
7829 name = "slash___slash_2.0.0.tgz";
7830 path = fetchurl {
7831 name = "slash___slash_2.0.0.tgz";
7832 url = "https://registry.yarnpkg.com/slash/-/slash-2.0.0.tgz";
7833 sha1 = "de552851a1759df3a8f206535442f5ec4ddeab44";
7834 };
7835 }
7836 {
7837 name = "slice_ansi___slice_ansi_2.1.0.tgz";
7838 path = fetchurl {
7839 name = "slice_ansi___slice_ansi_2.1.0.tgz";
7840 url = "https://registry.yarnpkg.com/slice-ansi/-/slice-ansi-2.1.0.tgz";
7841 sha1 = "cacd7693461a637a5788d92a7dd4fba068e81636";
7842 };
7843 }
7844 {
7845 name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
7846 path = fetchurl {
7847 name = "snapdragon_node___snapdragon_node_2.1.1.tgz";
7848 url = "https://registry.yarnpkg.com/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
7849 sha1 = "6c175f86ff14bdb0724563e8f3c1b021a286853b";
7850 };
7851 }
7852 {
7853 name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
7854 path = fetchurl {
7855 name = "snapdragon_util___snapdragon_util_3.0.1.tgz";
7856 url = "https://registry.yarnpkg.com/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
7857 sha1 = "f956479486f2acd79700693f6f7b805e45ab56e2";
7858 };
7859 }
7860 {
7861 name = "snapdragon___snapdragon_0.8.2.tgz";
7862 path = fetchurl {
7863 name = "snapdragon___snapdragon_0.8.2.tgz";
7864 url = "https://registry.yarnpkg.com/snapdragon/-/snapdragon-0.8.2.tgz";
7865 sha1 = "64922e7c565b0e14204ba1aa7d6964278d25182d";
7866 };
7867 }
7868 {
7869 name = "sockjs_client___sockjs_client_1.4.0.tgz";
7870 path = fetchurl {
7871 name = "sockjs_client___sockjs_client_1.4.0.tgz";
7872 url = "https://registry.yarnpkg.com/sockjs-client/-/sockjs-client-1.4.0.tgz";
7873 sha1 = "c9f2568e19c8fd8173b4997ea3420e0bb306c7d5";
7874 };
7875 }
7876 {
7877 name = "sockjs___sockjs_0.3.20.tgz";
7878 path = fetchurl {
7879 name = "sockjs___sockjs_0.3.20.tgz";
7880 url = "https://registry.yarnpkg.com/sockjs/-/sockjs-0.3.20.tgz";
7881 sha1 = "b26a283ec562ef8b2687b44033a4eeceac75d855";
7882 };
7883 }
7884 {
7885 name = "sort_keys___sort_keys_1.1.2.tgz";
7886 path = fetchurl {
7887 name = "sort_keys___sort_keys_1.1.2.tgz";
7888 url = "https://registry.yarnpkg.com/sort-keys/-/sort-keys-1.1.2.tgz";
7889 sha1 = "441b6d4d346798f1b4e49e8920adfba0e543f9ad";
7890 };
7891 }
7892 {
7893 name = "source_list_map___source_list_map_2.0.1.tgz";
7894 path = fetchurl {
7895 name = "source_list_map___source_list_map_2.0.1.tgz";
7896 url = "https://registry.yarnpkg.com/source-list-map/-/source-list-map-2.0.1.tgz";
7897 sha1 = "3993bd873bfc48479cca9ea3a547835c7c154b34";
7898 };
7899 }
7900 {
7901 name = "source_map_resolve___source_map_resolve_0.5.3.tgz";
7902 path = fetchurl {
7903 name = "source_map_resolve___source_map_resolve_0.5.3.tgz";
7904 url = "https://registry.yarnpkg.com/source-map-resolve/-/source-map-resolve-0.5.3.tgz";
7905 sha1 = "190866bece7553e1f8f267a2ee82c606b5509a1a";
7906 };
7907 }
7908 {
7909 name = "source_map_support___source_map_support_0.5.19.tgz";
7910 path = fetchurl {
7911 name = "source_map_support___source_map_support_0.5.19.tgz";
7912 url = "https://registry.yarnpkg.com/source-map-support/-/source-map-support-0.5.19.tgz";
7913 sha1 = "a98b62f86dcaf4f67399648c085291ab9e8fed61";
7914 };
7915 }
7916 {
7917 name = "source_map_url___source_map_url_0.4.0.tgz";
7918 path = fetchurl {
7919 name = "source_map_url___source_map_url_0.4.0.tgz";
7920 url = "https://registry.yarnpkg.com/source-map-url/-/source-map-url-0.4.0.tgz";
7921 sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
7922 };
7923 }
7924 {
7925 name = "source_map___source_map_0.5.7.tgz";
7926 path = fetchurl {
7927 name = "source_map___source_map_0.5.7.tgz";
7928 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.5.7.tgz";
7929 sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
7930 };
7931 }
7932 {
7933 name = "source_map___source_map_0.6.1.tgz";
7934 path = fetchurl {
7935 name = "source_map___source_map_0.6.1.tgz";
7936 url = "https://registry.yarnpkg.com/source-map/-/source-map-0.6.1.tgz";
7937 sha1 = "74722af32e9614e9c287a8d0bbde48b5e2f1a263";
7938 };
7939 }
7940 {
7941 name = "spdx_correct___spdx_correct_3.1.1.tgz";
7942 path = fetchurl {
7943 name = "spdx_correct___spdx_correct_3.1.1.tgz";
7944 url = "https://registry.yarnpkg.com/spdx-correct/-/spdx-correct-3.1.1.tgz";
7945 sha1 = "dece81ac9c1e6713e5f7d1b6f17d468fa53d89a9";
7946 };
7947 }
7948 {
7949 name = "spdx_exceptions___spdx_exceptions_2.3.0.tgz";
7950 path = fetchurl {
7951 name = "spdx_exceptions___spdx_exceptions_2.3.0.tgz";
7952 url = "https://registry.yarnpkg.com/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz";
7953 sha1 = "3f28ce1a77a00372683eade4a433183527a2163d";
7954 };
7955 }
7956 {
7957 name = "spdx_expression_parse___spdx_expression_parse_3.0.1.tgz";
7958 path = fetchurl {
7959 name = "spdx_expression_parse___spdx_expression_parse_3.0.1.tgz";
7960 url = "https://registry.yarnpkg.com/spdx-expression-parse/-/spdx-expression-parse-3.0.1.tgz";
7961 sha1 = "cf70f50482eefdc98e3ce0a6833e4a53ceeba679";
7962 };
7963 }
7964 {
7965 name = "spdx_license_ids___spdx_license_ids_3.0.5.tgz";
7966 path = fetchurl {
7967 name = "spdx_license_ids___spdx_license_ids_3.0.5.tgz";
7968 url = "https://registry.yarnpkg.com/spdx-license-ids/-/spdx-license-ids-3.0.5.tgz";
7969 sha1 = "3694b5804567a458d3c8045842a6358632f62654";
7970 };
7971 }
7972 {
7973 name = "spdy_transport___spdy_transport_3.0.0.tgz";
7974 path = fetchurl {
7975 name = "spdy_transport___spdy_transport_3.0.0.tgz";
7976 url = "https://registry.yarnpkg.com/spdy-transport/-/spdy-transport-3.0.0.tgz";
7977 sha1 = "00d4863a6400ad75df93361a1608605e5dcdcf31";
7978 };
7979 }
7980 {
7981 name = "spdy___spdy_4.0.2.tgz";
7982 path = fetchurl {
7983 name = "spdy___spdy_4.0.2.tgz";
7984 url = "https://registry.yarnpkg.com/spdy/-/spdy-4.0.2.tgz";
7985 sha1 = "b74f466203a3eda452c02492b91fb9e84a27677b";
7986 };
7987 }
7988 {
7989 name = "split_string___split_string_3.1.0.tgz";
7990 path = fetchurl {
7991 name = "split_string___split_string_3.1.0.tgz";
7992 url = "https://registry.yarnpkg.com/split-string/-/split-string-3.1.0.tgz";
7993 sha1 = "7cb09dda3a86585705c64b39a6466038682e8fe2";
7994 };
7995 }
7996 {
7997 name = "sprintf_js___sprintf_js_1.0.3.tgz";
7998 path = fetchurl {
7999 name = "sprintf_js___sprintf_js_1.0.3.tgz";
8000 url = "https://registry.yarnpkg.com/sprintf-js/-/sprintf-js-1.0.3.tgz";
8001 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
8002 };
8003 }
8004 {
8005 name = "sshpk___sshpk_1.16.1.tgz";
8006 path = fetchurl {
8007 name = "sshpk___sshpk_1.16.1.tgz";
8008 url = "https://registry.yarnpkg.com/sshpk/-/sshpk-1.16.1.tgz";
8009 sha1 = "fb661c0bef29b39db40769ee39fa70093d6f6877";
8010 };
8011 }
8012 {
8013 name = "ssri___ssri_6.0.1.tgz";
8014 path = fetchurl {
8015 name = "ssri___ssri_6.0.1.tgz";
8016 url = "https://registry.yarnpkg.com/ssri/-/ssri-6.0.1.tgz";
8017 sha1 = "2a3c41b28dd45b62b63676ecb74001265ae9edd8";
8018 };
8019 }
8020 {
8021 name = "ssri___ssri_7.1.0.tgz";
8022 path = fetchurl {
8023 name = "ssri___ssri_7.1.0.tgz";
8024 url = "https://registry.yarnpkg.com/ssri/-/ssri-7.1.0.tgz";
8025 sha1 = "92c241bf6de82365b5c7fb4bd76e975522e1294d";
8026 };
8027 }
8028 {
8029 name = "stable___stable_0.1.8.tgz";
8030 path = fetchurl {
8031 name = "stable___stable_0.1.8.tgz";
8032 url = "https://registry.yarnpkg.com/stable/-/stable-0.1.8.tgz";
8033 sha1 = "836eb3c8382fe2936feaf544631017ce7d47a3cf";
8034 };
8035 }
8036 {
8037 name = "stackframe___stackframe_1.2.0.tgz";
8038 path = fetchurl {
8039 name = "stackframe___stackframe_1.2.0.tgz";
8040 url = "https://registry.yarnpkg.com/stackframe/-/stackframe-1.2.0.tgz";
8041 sha1 = "52429492d63c62eb989804c11552e3d22e779303";
8042 };
8043 }
8044 {
8045 name = "static_extend___static_extend_0.1.2.tgz";
8046 path = fetchurl {
8047 name = "static_extend___static_extend_0.1.2.tgz";
8048 url = "https://registry.yarnpkg.com/static-extend/-/static-extend-0.1.2.tgz";
8049 sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
8050 };
8051 }
8052 {
8053 name = "statuses___statuses_1.5.0.tgz";
8054 path = fetchurl {
8055 name = "statuses___statuses_1.5.0.tgz";
8056 url = "https://registry.yarnpkg.com/statuses/-/statuses-1.5.0.tgz";
8057 sha1 = "161c7dac177659fd9811f43771fa99381478628c";
8058 };
8059 }
8060 {
8061 name = "stealthy_require___stealthy_require_1.1.1.tgz";
8062 path = fetchurl {
8063 name = "stealthy_require___stealthy_require_1.1.1.tgz";
8064 url = "https://registry.yarnpkg.com/stealthy-require/-/stealthy-require-1.1.1.tgz";
8065 sha1 = "35b09875b4ff49f26a777e509b3090a3226bf24b";
8066 };
8067 }
8068 {
8069 name = "stream_browserify___stream_browserify_2.0.2.tgz";
8070 path = fetchurl {
8071 name = "stream_browserify___stream_browserify_2.0.2.tgz";
8072 url = "https://registry.yarnpkg.com/stream-browserify/-/stream-browserify-2.0.2.tgz";
8073 sha1 = "87521d38a44aa7ee91ce1cd2a47df0cb49dd660b";
8074 };
8075 }
8076 {
8077 name = "stream_each___stream_each_1.2.3.tgz";
8078 path = fetchurl {
8079 name = "stream_each___stream_each_1.2.3.tgz";
8080 url = "https://registry.yarnpkg.com/stream-each/-/stream-each-1.2.3.tgz";
8081 sha1 = "ebe27a0c389b04fbcc233642952e10731afa9bae";
8082 };
8083 }
8084 {
8085 name = "stream_http___stream_http_2.8.3.tgz";
8086 path = fetchurl {
8087 name = "stream_http___stream_http_2.8.3.tgz";
8088 url = "https://registry.yarnpkg.com/stream-http/-/stream-http-2.8.3.tgz";
8089 sha1 = "b2d242469288a5a27ec4fe8933acf623de6514fc";
8090 };
8091 }
8092 {
8093 name = "stream_shift___stream_shift_1.0.1.tgz";
8094 path = fetchurl {
8095 name = "stream_shift___stream_shift_1.0.1.tgz";
8096 url = "https://registry.yarnpkg.com/stream-shift/-/stream-shift-1.0.1.tgz";
8097 sha1 = "d7088281559ab2778424279b0877da3c392d5a3d";
8098 };
8099 }
8100 {
8101 name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz";
8102 path = fetchurl {
8103 name = "strict_uri_encode___strict_uri_encode_1.1.0.tgz";
8104 url = "https://registry.yarnpkg.com/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz";
8105 sha1 = "279b225df1d582b1f54e65addd4352e18faa0713";
8106 };
8107 }
8108 {
8109 name = "string_width___string_width_2.1.1.tgz";
8110 path = fetchurl {
8111 name = "string_width___string_width_2.1.1.tgz";
8112 url = "https://registry.yarnpkg.com/string-width/-/string-width-2.1.1.tgz";
8113 sha1 = "ab93f27a8dc13d28cac815c462143a6d9012ae9e";
8114 };
8115 }
8116 {
8117 name = "string_width___string_width_3.1.0.tgz";
8118 path = fetchurl {
8119 name = "string_width___string_width_3.1.0.tgz";
8120 url = "https://registry.yarnpkg.com/string-width/-/string-width-3.1.0.tgz";
8121 sha1 = "22767be21b62af1081574306f69ac51b62203961";
8122 };
8123 }
8124 {
8125 name = "string_width___string_width_4.2.0.tgz";
8126 path = fetchurl {
8127 name = "string_width___string_width_4.2.0.tgz";
8128 url = "https://registry.yarnpkg.com/string-width/-/string-width-4.2.0.tgz";
8129 sha1 = "952182c46cc7b2c313d1596e623992bd163b72b5";
8130 };
8131 }
8132 {
8133 name = "string.prototype.trimend___string.prototype.trimend_1.0.1.tgz";
8134 path = fetchurl {
8135 name = "string.prototype.trimend___string.prototype.trimend_1.0.1.tgz";
8136 url = "https://registry.yarnpkg.com/string.prototype.trimend/-/string.prototype.trimend-1.0.1.tgz";
8137 sha1 = "85812a6b847ac002270f5808146064c995fb6913";
8138 };
8139 }
8140 {
8141 name = "string.prototype.trimleft___string.prototype.trimleft_2.1.2.tgz";
8142 path = fetchurl {
8143 name = "string.prototype.trimleft___string.prototype.trimleft_2.1.2.tgz";
8144 url = "https://registry.yarnpkg.com/string.prototype.trimleft/-/string.prototype.trimleft-2.1.2.tgz";
8145 sha1 = "4408aa2e5d6ddd0c9a80739b087fbc067c03b3cc";
8146 };
8147 }
8148 {
8149 name = "string.prototype.trimright___string.prototype.trimright_2.1.2.tgz";
8150 path = fetchurl {
8151 name = "string.prototype.trimright___string.prototype.trimright_2.1.2.tgz";
8152 url = "https://registry.yarnpkg.com/string.prototype.trimright/-/string.prototype.trimright-2.1.2.tgz";
8153 sha1 = "c76f1cef30f21bbad8afeb8db1511496cfb0f2a3";
8154 };
8155 }
8156 {
8157 name = "string.prototype.trimstart___string.prototype.trimstart_1.0.1.tgz";
8158 path = fetchurl {
8159 name = "string.prototype.trimstart___string.prototype.trimstart_1.0.1.tgz";
8160 url = "https://registry.yarnpkg.com/string.prototype.trimstart/-/string.prototype.trimstart-1.0.1.tgz";
8161 sha1 = "14af6d9f34b053f7cfc89b72f8f2ee14b9039a54";
8162 };
8163 }
8164 {
8165 name = "string_decoder___string_decoder_1.3.0.tgz";
8166 path = fetchurl {
8167 name = "string_decoder___string_decoder_1.3.0.tgz";
8168 url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.3.0.tgz";
8169 sha1 = "42f114594a46cf1a8e30b0a84f56c78c3edac21e";
8170 };
8171 }
8172 {
8173 name = "string_decoder___string_decoder_1.1.1.tgz";
8174 path = fetchurl {
8175 name = "string_decoder___string_decoder_1.1.1.tgz";
8176 url = "https://registry.yarnpkg.com/string_decoder/-/string_decoder-1.1.1.tgz";
8177 sha1 = "9cf1611ba62685d7030ae9e4ba34149c3af03fc8";
8178 };
8179 }
8180 {
8181 name = "stringify_object___stringify_object_3.3.0.tgz";
8182 path = fetchurl {
8183 name = "stringify_object___stringify_object_3.3.0.tgz";
8184 url = "https://registry.yarnpkg.com/stringify-object/-/stringify-object-3.3.0.tgz";
8185 sha1 = "703065aefca19300d3ce88af4f5b3956d7556629";
8186 };
8187 }
8188 {
8189 name = "strip_ansi___strip_ansi_3.0.1.tgz";
8190 path = fetchurl {
8191 name = "strip_ansi___strip_ansi_3.0.1.tgz";
8192 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-3.0.1.tgz";
8193 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
8194 };
8195 }
8196 {
8197 name = "strip_ansi___strip_ansi_4.0.0.tgz";
8198 path = fetchurl {
8199 name = "strip_ansi___strip_ansi_4.0.0.tgz";
8200 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-4.0.0.tgz";
8201 sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
8202 };
8203 }
8204 {
8205 name = "strip_ansi___strip_ansi_5.2.0.tgz";
8206 path = fetchurl {
8207 name = "strip_ansi___strip_ansi_5.2.0.tgz";
8208 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-5.2.0.tgz";
8209 sha1 = "8c9a536feb6afc962bdfa5b104a5091c1ad9c0ae";
8210 };
8211 }
8212 {
8213 name = "strip_ansi___strip_ansi_6.0.0.tgz";
8214 path = fetchurl {
8215 name = "strip_ansi___strip_ansi_6.0.0.tgz";
8216 url = "https://registry.yarnpkg.com/strip-ansi/-/strip-ansi-6.0.0.tgz";
8217 sha1 = "0b1571dd7669ccd4f3e06e14ef1eed26225ae532";
8218 };
8219 }
8220 {
8221 name = "strip_comments___strip_comments_1.0.2.tgz";
8222 path = fetchurl {
8223 name = "strip_comments___strip_comments_1.0.2.tgz";
8224 url = "https://registry.yarnpkg.com/strip-comments/-/strip-comments-1.0.2.tgz";
8225 sha1 = "82b9c45e7f05873bee53f37168af930aa368679d";
8226 };
8227 }
8228 {
8229 name = "strip_eof___strip_eof_1.0.0.tgz";
8230 path = fetchurl {
8231 name = "strip_eof___strip_eof_1.0.0.tgz";
8232 url = "https://registry.yarnpkg.com/strip-eof/-/strip-eof-1.0.0.tgz";
8233 sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf";
8234 };
8235 }
8236 {
8237 name = "strip_final_newline___strip_final_newline_2.0.0.tgz";
8238 path = fetchurl {
8239 name = "strip_final_newline___strip_final_newline_2.0.0.tgz";
8240 url = "https://registry.yarnpkg.com/strip-final-newline/-/strip-final-newline-2.0.0.tgz";
8241 sha1 = "89b852fb2fcbe936f6f4b3187afb0a12c1ab58ad";
8242 };
8243 }
8244 {
8245 name = "strip_indent___strip_indent_2.0.0.tgz";
8246 path = fetchurl {
8247 name = "strip_indent___strip_indent_2.0.0.tgz";
8248 url = "https://registry.yarnpkg.com/strip-indent/-/strip-indent-2.0.0.tgz";
8249 sha1 = "5ef8db295d01e6ed6cbf7aab96998d7822527b68";
8250 };
8251 }
8252 {
8253 name = "strip_json_comments___strip_json_comments_3.1.0.tgz";
8254 path = fetchurl {
8255 name = "strip_json_comments___strip_json_comments_3.1.0.tgz";
8256 url = "https://registry.yarnpkg.com/strip-json-comments/-/strip-json-comments-3.1.0.tgz";
8257 sha1 = "7638d31422129ecf4457440009fba03f9f9ac180";
8258 };
8259 }
8260 {
8261 name = "stylehacks___stylehacks_4.0.3.tgz";
8262 path = fetchurl {
8263 name = "stylehacks___stylehacks_4.0.3.tgz";
8264 url = "https://registry.yarnpkg.com/stylehacks/-/stylehacks-4.0.3.tgz";
8265 sha1 = "6718fcaf4d1e07d8a1318690881e8d96726a71d5";
8266 };
8267 }
8268 {
8269 name = "supports_color___supports_color_2.0.0.tgz";
8270 path = fetchurl {
8271 name = "supports_color___supports_color_2.0.0.tgz";
8272 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-2.0.0.tgz";
8273 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
8274 };
8275 }
8276 {
8277 name = "supports_color___supports_color_5.5.0.tgz";
8278 path = fetchurl {
8279 name = "supports_color___supports_color_5.5.0.tgz";
8280 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-5.5.0.tgz";
8281 sha1 = "e2e69a44ac8772f78a1ec0b35b689df6530efc8f";
8282 };
8283 }
8284 {
8285 name = "supports_color___supports_color_6.1.0.tgz";
8286 path = fetchurl {
8287 name = "supports_color___supports_color_6.1.0.tgz";
8288 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-6.1.0.tgz";
8289 sha1 = "0764abc69c63d5ac842dd4867e8d025e880df8f3";
8290 };
8291 }
8292 {
8293 name = "supports_color___supports_color_7.1.0.tgz";
8294 path = fetchurl {
8295 name = "supports_color___supports_color_7.1.0.tgz";
8296 url = "https://registry.yarnpkg.com/supports-color/-/supports-color-7.1.0.tgz";
8297 sha1 = "68e32591df73e25ad1c4b49108a2ec507962bfd1";
8298 };
8299 }
8300 {
8301 name = "svg_tags___svg_tags_1.0.0.tgz";
8302 path = fetchurl {
8303 name = "svg_tags___svg_tags_1.0.0.tgz";
8304 url = "https://registry.yarnpkg.com/svg-tags/-/svg-tags-1.0.0.tgz";
8305 sha1 = "58f71cee3bd519b59d4b2a843b6c7de64ac04764";
8306 };
8307 }
8308 {
8309 name = "svgo___svgo_1.3.2.tgz";
8310 path = fetchurl {
8311 name = "svgo___svgo_1.3.2.tgz";
8312 url = "https://registry.yarnpkg.com/svgo/-/svgo-1.3.2.tgz";
8313 sha1 = "b6dc511c063346c9e415b81e43401145b96d4167";
8314 };
8315 }
8316 {
8317 name = "table___table_5.4.6.tgz";
8318 path = fetchurl {
8319 name = "table___table_5.4.6.tgz";
8320 url = "https://registry.yarnpkg.com/table/-/table-5.4.6.tgz";
8321 sha1 = "1292d19500ce3f86053b05f0e8e7e4a3bb21079e";
8322 };
8323 }
8324 {
8325 name = "tapable___tapable_1.1.3.tgz";
8326 path = fetchurl {
8327 name = "tapable___tapable_1.1.3.tgz";
8328 url = "https://registry.yarnpkg.com/tapable/-/tapable-1.1.3.tgz";
8329 sha1 = "a1fccc06b58db61fd7a45da2da44f5f3a3e67ba2";
8330 };
8331 }
8332 {
8333 name = "terser_webpack_plugin___terser_webpack_plugin_1.4.4.tgz";
8334 path = fetchurl {
8335 name = "terser_webpack_plugin___terser_webpack_plugin_1.4.4.tgz";
8336 url = "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-1.4.4.tgz";
8337 sha1 = "2c63544347324baafa9a56baaddf1634c8abfc2f";
8338 };
8339 }
8340 {
8341 name = "terser_webpack_plugin___terser_webpack_plugin_2.3.7.tgz";
8342 path = fetchurl {
8343 name = "terser_webpack_plugin___terser_webpack_plugin_2.3.7.tgz";
8344 url = "https://registry.yarnpkg.com/terser-webpack-plugin/-/terser-webpack-plugin-2.3.7.tgz";
8345 sha1 = "4910ff5d1a872168cc7fa6cd3749e2b0d60a8a0b";
8346 };
8347 }
8348 {
8349 name = "terser___terser_4.7.0.tgz";
8350 path = fetchurl {
8351 name = "terser___terser_4.7.0.tgz";
8352 url = "https://registry.yarnpkg.com/terser/-/terser-4.7.0.tgz";
8353 sha1 = "15852cf1a08e3256a80428e865a2fa893ffba006";
8354 };
8355 }
8356 {
8357 name = "text_table___text_table_0.2.0.tgz";
8358 path = fetchurl {
8359 name = "text_table___text_table_0.2.0.tgz";
8360 url = "https://registry.yarnpkg.com/text-table/-/text-table-0.2.0.tgz";
8361 sha1 = "7f5ee823ae805207c00af2df4a84ec3fcfa570b4";
8362 };
8363 }
8364 {
8365 name = "thenify_all___thenify_all_1.6.0.tgz";
8366 path = fetchurl {
8367 name = "thenify_all___thenify_all_1.6.0.tgz";
8368 url = "https://registry.yarnpkg.com/thenify-all/-/thenify-all-1.6.0.tgz";
8369 sha1 = "1a1918d402d8fc3f98fbf234db0bcc8cc10e9726";
8370 };
8371 }
8372 {
8373 name = "thenify___thenify_3.3.0.tgz";
8374 path = fetchurl {
8375 name = "thenify___thenify_3.3.0.tgz";
8376 url = "https://registry.yarnpkg.com/thenify/-/thenify-3.3.0.tgz";
8377 sha1 = "e69e38a1babe969b0108207978b9f62b88604839";
8378 };
8379 }
8380 {
8381 name = "thread_loader___thread_loader_2.1.3.tgz";
8382 path = fetchurl {
8383 name = "thread_loader___thread_loader_2.1.3.tgz";
8384 url = "https://registry.yarnpkg.com/thread-loader/-/thread-loader-2.1.3.tgz";
8385 sha1 = "cbd2c139fc2b2de6e9d28f62286ab770c1acbdda";
8386 };
8387 }
8388 {
8389 name = "through2___through2_2.0.5.tgz";
8390 path = fetchurl {
8391 name = "through2___through2_2.0.5.tgz";
8392 url = "https://registry.yarnpkg.com/through2/-/through2-2.0.5.tgz";
8393 sha1 = "01c1e39eb31d07cb7d03a96a70823260b23132cd";
8394 };
8395 }
8396 {
8397 name = "through___through_2.3.8.tgz";
8398 path = fetchurl {
8399 name = "through___through_2.3.8.tgz";
8400 url = "https://registry.yarnpkg.com/through/-/through-2.3.8.tgz";
8401 sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
8402 };
8403 }
8404 {
8405 name = "thunky___thunky_1.1.0.tgz";
8406 path = fetchurl {
8407 name = "thunky___thunky_1.1.0.tgz";
8408 url = "https://registry.yarnpkg.com/thunky/-/thunky-1.1.0.tgz";
8409 sha1 = "5abaf714a9405db0504732bbccd2cedd9ef9537d";
8410 };
8411 }
8412 {
8413 name = "timers_browserify___timers_browserify_2.0.11.tgz";
8414 path = fetchurl {
8415 name = "timers_browserify___timers_browserify_2.0.11.tgz";
8416 url = "https://registry.yarnpkg.com/timers-browserify/-/timers-browserify-2.0.11.tgz";
8417 sha1 = "800b1f3eee272e5bc53ee465a04d0e804c31211f";
8418 };
8419 }
8420 {
8421 name = "timsort___timsort_0.3.0.tgz";
8422 path = fetchurl {
8423 name = "timsort___timsort_0.3.0.tgz";
8424 url = "https://registry.yarnpkg.com/timsort/-/timsort-0.3.0.tgz";
8425 sha1 = "405411a8e7e6339fe64db9a234de11dc31e02bd4";
8426 };
8427 }
8428 {
8429 name = "tmp___tmp_0.0.33.tgz";
8430 path = fetchurl {
8431 name = "tmp___tmp_0.0.33.tgz";
8432 url = "https://registry.yarnpkg.com/tmp/-/tmp-0.0.33.tgz";
8433 sha1 = "6d34335889768d21b2bcda0aa277ced3b1bfadf9";
8434 };
8435 }
8436 {
8437 name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
8438 path = fetchurl {
8439 name = "to_arraybuffer___to_arraybuffer_1.0.1.tgz";
8440 url = "https://registry.yarnpkg.com/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
8441 sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
8442 };
8443 }
8444 {
8445 name = "to_fast_properties___to_fast_properties_2.0.0.tgz";
8446 path = fetchurl {
8447 name = "to_fast_properties___to_fast_properties_2.0.0.tgz";
8448 url = "https://registry.yarnpkg.com/to-fast-properties/-/to-fast-properties-2.0.0.tgz";
8449 sha1 = "dc5e698cbd079265bc73e0377681a4e4e83f616e";
8450 };
8451 }
8452 {
8453 name = "to_object_path___to_object_path_0.3.0.tgz";
8454 path = fetchurl {
8455 name = "to_object_path___to_object_path_0.3.0.tgz";
8456 url = "https://registry.yarnpkg.com/to-object-path/-/to-object-path-0.3.0.tgz";
8457 sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
8458 };
8459 }
8460 {
8461 name = "to_regex_range___to_regex_range_2.1.1.tgz";
8462 path = fetchurl {
8463 name = "to_regex_range___to_regex_range_2.1.1.tgz";
8464 url = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-2.1.1.tgz";
8465 sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
8466 };
8467 }
8468 {
8469 name = "to_regex_range___to_regex_range_5.0.1.tgz";
8470 path = fetchurl {
8471 name = "to_regex_range___to_regex_range_5.0.1.tgz";
8472 url = "https://registry.yarnpkg.com/to-regex-range/-/to-regex-range-5.0.1.tgz";
8473 sha1 = "1648c44aae7c8d988a326018ed72f5b4dd0392e4";
8474 };
8475 }
8476 {
8477 name = "to_regex___to_regex_3.0.2.tgz";
8478 path = fetchurl {
8479 name = "to_regex___to_regex_3.0.2.tgz";
8480 url = "https://registry.yarnpkg.com/to-regex/-/to-regex-3.0.2.tgz";
8481 sha1 = "13cfdd9b336552f30b51f33a8ae1b42a7a7599ce";
8482 };
8483 }
8484 {
8485 name = "toidentifier___toidentifier_1.0.0.tgz";
8486 path = fetchurl {
8487 name = "toidentifier___toidentifier_1.0.0.tgz";
8488 url = "https://registry.yarnpkg.com/toidentifier/-/toidentifier-1.0.0.tgz";
8489 sha1 = "7e1be3470f1e77948bc43d94a3c8f4d7752ba553";
8490 };
8491 }
8492 {
8493 name = "toposort___toposort_1.0.7.tgz";
8494 path = fetchurl {
8495 name = "toposort___toposort_1.0.7.tgz";
8496 url = "https://registry.yarnpkg.com/toposort/-/toposort-1.0.7.tgz";
8497 sha1 = "2e68442d9f64ec720b8cc89e6443ac6caa950029";
8498 };
8499 }
8500 {
8501 name = "tough_cookie___tough_cookie_2.5.0.tgz";
8502 path = fetchurl {
8503 name = "tough_cookie___tough_cookie_2.5.0.tgz";
8504 url = "https://registry.yarnpkg.com/tough-cookie/-/tough-cookie-2.5.0.tgz";
8505 sha1 = "cd9fb2a0aa1d5a12b473bd9fb96fa3dcff65ade2";
8506 };
8507 }
8508 {
8509 name = "tryer___tryer_1.0.1.tgz";
8510 path = fetchurl {
8511 name = "tryer___tryer_1.0.1.tgz";
8512 url = "https://registry.yarnpkg.com/tryer/-/tryer-1.0.1.tgz";
8513 sha1 = "f2c85406800b9b0f74c9f7465b81eaad241252f8";
8514 };
8515 }
8516 {
8517 name = "ts_pnp___ts_pnp_1.2.0.tgz";
8518 path = fetchurl {
8519 name = "ts_pnp___ts_pnp_1.2.0.tgz";
8520 url = "https://registry.yarnpkg.com/ts-pnp/-/ts-pnp-1.2.0.tgz";
8521 sha1 = "a500ad084b0798f1c3071af391e65912c86bca92";
8522 };
8523 }
8524 {
8525 name = "tslib___tslib_1.13.0.tgz";
8526 path = fetchurl {
8527 name = "tslib___tslib_1.13.0.tgz";
8528 url = "https://registry.yarnpkg.com/tslib/-/tslib-1.13.0.tgz";
8529 sha1 = "c881e13cc7015894ed914862d276436fa9a47043";
8530 };
8531 }
8532 {
8533 name = "tty_browserify___tty_browserify_0.0.0.tgz";
8534 path = fetchurl {
8535 name = "tty_browserify___tty_browserify_0.0.0.tgz";
8536 url = "https://registry.yarnpkg.com/tty-browserify/-/tty-browserify-0.0.0.tgz";
8537 sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
8538 };
8539 }
8540 {
8541 name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
8542 path = fetchurl {
8543 name = "tunnel_agent___tunnel_agent_0.6.0.tgz";
8544 url = "https://registry.yarnpkg.com/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
8545 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
8546 };
8547 }
8548 {
8549 name = "tweetnacl___tweetnacl_0.14.5.tgz";
8550 path = fetchurl {
8551 name = "tweetnacl___tweetnacl_0.14.5.tgz";
8552 url = "https://registry.yarnpkg.com/tweetnacl/-/tweetnacl-0.14.5.tgz";
8553 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
8554 };
8555 }
8556 {
8557 name = "type_check___type_check_0.4.0.tgz";
8558 path = fetchurl {
8559 name = "type_check___type_check_0.4.0.tgz";
8560 url = "https://registry.yarnpkg.com/type-check/-/type-check-0.4.0.tgz";
8561 sha1 = "07b8203bfa7056c0657050e3ccd2c37730bab8f1";
8562 };
8563 }
8564 {
8565 name = "type_fest___type_fest_0.11.0.tgz";
8566 path = fetchurl {
8567 name = "type_fest___type_fest_0.11.0.tgz";
8568 url = "https://registry.yarnpkg.com/type-fest/-/type-fest-0.11.0.tgz";
8569 sha1 = "97abf0872310fed88a5c466b25681576145e33f1";
8570 };
8571 }
8572 {
8573 name = "type_fest___type_fest_0.6.0.tgz";
8574 path = fetchurl {
8575 name = "type_fest___type_fest_0.6.0.tgz";
8576 url = "https://registry.yarnpkg.com/type-fest/-/type-fest-0.6.0.tgz";
8577 sha1 = "8d2a2370d3df886eb5c90ada1c5bf6188acf838b";
8578 };
8579 }
8580 {
8581 name = "type_fest___type_fest_0.8.1.tgz";
8582 path = fetchurl {
8583 name = "type_fest___type_fest_0.8.1.tgz";
8584 url = "https://registry.yarnpkg.com/type-fest/-/type-fest-0.8.1.tgz";
8585 sha1 = "09e249ebde851d3b1e48d27c105444667f17b83d";
8586 };
8587 }
8588 {
8589 name = "type_is___type_is_1.6.18.tgz";
8590 path = fetchurl {
8591 name = "type_is___type_is_1.6.18.tgz";
8592 url = "https://registry.yarnpkg.com/type-is/-/type-is-1.6.18.tgz";
8593 sha1 = "4e552cd05df09467dcbc4ef739de89f2cf37c131";
8594 };
8595 }
8596 {
8597 name = "typedarray___typedarray_0.0.6.tgz";
8598 path = fetchurl {
8599 name = "typedarray___typedarray_0.0.6.tgz";
8600 url = "https://registry.yarnpkg.com/typedarray/-/typedarray-0.0.6.tgz";
8601 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
8602 };
8603 }
8604 {
8605 name = "uglify_js___uglify_js_3.4.10.tgz";
8606 path = fetchurl {
8607 name = "uglify_js___uglify_js_3.4.10.tgz";
8608 url = "https://registry.yarnpkg.com/uglify-js/-/uglify-js-3.4.10.tgz";
8609 sha1 = "9ad9563d8eb3acdfb8d38597d2af1d815f6a755f";
8610 };
8611 }
8612 {
8613 name = "unicode_canonical_property_names_ecmascript___unicode_canonical_property_names_ecmascript_1.0.4.tgz";
8614 path = fetchurl {
8615 name = "unicode_canonical_property_names_ecmascript___unicode_canonical_property_names_ecmascript_1.0.4.tgz";
8616 url = "https://registry.yarnpkg.com/unicode-canonical-property-names-ecmascript/-/unicode-canonical-property-names-ecmascript-1.0.4.tgz";
8617 sha1 = "2619800c4c825800efdd8343af7dd9933cbe2818";
8618 };
8619 }
8620 {
8621 name = "unicode_match_property_ecmascript___unicode_match_property_ecmascript_1.0.4.tgz";
8622 path = fetchurl {
8623 name = "unicode_match_property_ecmascript___unicode_match_property_ecmascript_1.0.4.tgz";
8624 url = "https://registry.yarnpkg.com/unicode-match-property-ecmascript/-/unicode-match-property-ecmascript-1.0.4.tgz";
8625 sha1 = "8ed2a32569961bce9227d09cd3ffbb8fed5f020c";
8626 };
8627 }
8628 {
8629 name = "unicode_match_property_value_ecmascript___unicode_match_property_value_ecmascript_1.2.0.tgz";
8630 path = fetchurl {
8631 name = "unicode_match_property_value_ecmascript___unicode_match_property_value_ecmascript_1.2.0.tgz";
8632 url = "https://registry.yarnpkg.com/unicode-match-property-value-ecmascript/-/unicode-match-property-value-ecmascript-1.2.0.tgz";
8633 sha1 = "0d91f600eeeb3096aa962b1d6fc88876e64ea531";
8634 };
8635 }
8636 {
8637 name = "unicode_property_aliases_ecmascript___unicode_property_aliases_ecmascript_1.1.0.tgz";
8638 path = fetchurl {
8639 name = "unicode_property_aliases_ecmascript___unicode_property_aliases_ecmascript_1.1.0.tgz";
8640 url = "https://registry.yarnpkg.com/unicode-property-aliases-ecmascript/-/unicode-property-aliases-ecmascript-1.1.0.tgz";
8641 sha1 = "dd57a99f6207bedff4628abefb94c50db941c8f4";
8642 };
8643 }
8644 {
8645 name = "union_value___union_value_1.0.1.tgz";
8646 path = fetchurl {
8647 name = "union_value___union_value_1.0.1.tgz";
8648 url = "https://registry.yarnpkg.com/union-value/-/union-value-1.0.1.tgz";
8649 sha1 = "0b6fe7b835aecda61c6ea4d4f02c14221e109847";
8650 };
8651 }
8652 {
8653 name = "uniq___uniq_1.0.1.tgz";
8654 path = fetchurl {
8655 name = "uniq___uniq_1.0.1.tgz";
8656 url = "https://registry.yarnpkg.com/uniq/-/uniq-1.0.1.tgz";
8657 sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
8658 };
8659 }
8660 {
8661 name = "uniqs___uniqs_2.0.0.tgz";
8662 path = fetchurl {
8663 name = "uniqs___uniqs_2.0.0.tgz";
8664 url = "https://registry.yarnpkg.com/uniqs/-/uniqs-2.0.0.tgz";
8665 sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
8666 };
8667 }
8668 {
8669 name = "unique_filename___unique_filename_1.1.1.tgz";
8670 path = fetchurl {
8671 name = "unique_filename___unique_filename_1.1.1.tgz";
8672 url = "https://registry.yarnpkg.com/unique-filename/-/unique-filename-1.1.1.tgz";
8673 sha1 = "1d69769369ada0583103a1e6ae87681b56573230";
8674 };
8675 }
8676 {
8677 name = "unique_slug___unique_slug_2.0.2.tgz";
8678 path = fetchurl {
8679 name = "unique_slug___unique_slug_2.0.2.tgz";
8680 url = "https://registry.yarnpkg.com/unique-slug/-/unique-slug-2.0.2.tgz";
8681 sha1 = "baabce91083fc64e945b0f3ad613e264f7cd4e6c";
8682 };
8683 }
8684 {
8685 name = "universalify___universalify_0.1.2.tgz";
8686 path = fetchurl {
8687 name = "universalify___universalify_0.1.2.tgz";
8688 url = "https://registry.yarnpkg.com/universalify/-/universalify-0.1.2.tgz";
8689 sha1 = "b646f69be3942dabcecc9d6639c80dc105efaa66";
8690 };
8691 }
8692 {
8693 name = "unpipe___unpipe_1.0.0.tgz";
8694 path = fetchurl {
8695 name = "unpipe___unpipe_1.0.0.tgz";
8696 url = "https://registry.yarnpkg.com/unpipe/-/unpipe-1.0.0.tgz";
8697 sha1 = "b2bf4ee8514aae6165b4817829d21b2ef49904ec";
8698 };
8699 }
8700 {
8701 name = "unquote___unquote_1.1.1.tgz";
8702 path = fetchurl {
8703 name = "unquote___unquote_1.1.1.tgz";
8704 url = "https://registry.yarnpkg.com/unquote/-/unquote-1.1.1.tgz";
8705 sha1 = "8fded7324ec6e88a0ff8b905e7c098cdc086d544";
8706 };
8707 }
8708 {
8709 name = "unset_value___unset_value_1.0.0.tgz";
8710 path = fetchurl {
8711 name = "unset_value___unset_value_1.0.0.tgz";
8712 url = "https://registry.yarnpkg.com/unset-value/-/unset-value-1.0.0.tgz";
8713 sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
8714 };
8715 }
8716 {
8717 name = "upath___upath_1.2.0.tgz";
8718 path = fetchurl {
8719 name = "upath___upath_1.2.0.tgz";
8720 url = "https://registry.yarnpkg.com/upath/-/upath-1.2.0.tgz";
8721 sha1 = "8f66dbcd55a883acdae4408af8b035a5044c1894";
8722 };
8723 }
8724 {
8725 name = "upper_case___upper_case_1.1.3.tgz";
8726 path = fetchurl {
8727 name = "upper_case___upper_case_1.1.3.tgz";
8728 url = "https://registry.yarnpkg.com/upper-case/-/upper-case-1.1.3.tgz";
8729 sha1 = "f6b4501c2ec4cdd26ba78be7222961de77621598";
8730 };
8731 }
8732 {
8733 name = "uri_js___uri_js_4.2.2.tgz";
8734 path = fetchurl {
8735 name = "uri_js___uri_js_4.2.2.tgz";
8736 url = "https://registry.yarnpkg.com/uri-js/-/uri-js-4.2.2.tgz";
8737 sha1 = "94c540e1ff772956e2299507c010aea6c8838eb0";
8738 };
8739 }
8740 {
8741 name = "urix___urix_0.1.0.tgz";
8742 path = fetchurl {
8743 name = "urix___urix_0.1.0.tgz";
8744 url = "https://registry.yarnpkg.com/urix/-/urix-0.1.0.tgz";
8745 sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
8746 };
8747 }
8748 {
8749 name = "url_loader___url_loader_2.3.0.tgz";
8750 path = fetchurl {
8751 name = "url_loader___url_loader_2.3.0.tgz";
8752 url = "https://registry.yarnpkg.com/url-loader/-/url-loader-2.3.0.tgz";
8753 sha1 = "e0e2ef658f003efb8ca41b0f3ffbf76bab88658b";
8754 };
8755 }
8756 {
8757 name = "url_parse___url_parse_1.4.7.tgz";
8758 path = fetchurl {
8759 name = "url_parse___url_parse_1.4.7.tgz";
8760 url = "https://registry.yarnpkg.com/url-parse/-/url-parse-1.4.7.tgz";
8761 sha1 = "a8a83535e8c00a316e403a5db4ac1b9b853ae278";
8762 };
8763 }
8764 {
8765 name = "url___url_0.11.0.tgz";
8766 path = fetchurl {
8767 name = "url___url_0.11.0.tgz";
8768 url = "https://registry.yarnpkg.com/url/-/url-0.11.0.tgz";
8769 sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
8770 };
8771 }
8772 {
8773 name = "use___use_3.1.1.tgz";
8774 path = fetchurl {
8775 name = "use___use_3.1.1.tgz";
8776 url = "https://registry.yarnpkg.com/use/-/use-3.1.1.tgz";
8777 sha1 = "d50c8cac79a19fbc20f2911f56eb973f4e10070f";
8778 };
8779 }
8780 {
8781 name = "util_deprecate___util_deprecate_1.0.2.tgz";
8782 path = fetchurl {
8783 name = "util_deprecate___util_deprecate_1.0.2.tgz";
8784 url = "https://registry.yarnpkg.com/util-deprecate/-/util-deprecate-1.0.2.tgz";
8785 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
8786 };
8787 }
8788 {
8789 name = "util.promisify___util.promisify_1.0.0.tgz";
8790 path = fetchurl {
8791 name = "util.promisify___util.promisify_1.0.0.tgz";
8792 url = "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.0.tgz";
8793 sha1 = "440f7165a459c9a16dc145eb8e72f35687097030";
8794 };
8795 }
8796 {
8797 name = "util.promisify___util.promisify_1.0.1.tgz";
8798 path = fetchurl {
8799 name = "util.promisify___util.promisify_1.0.1.tgz";
8800 url = "https://registry.yarnpkg.com/util.promisify/-/util.promisify-1.0.1.tgz";
8801 sha1 = "6baf7774b80eeb0f7520d8b81d07982a59abbaee";
8802 };
8803 }
8804 {
8805 name = "util___util_0.10.3.tgz";
8806 path = fetchurl {
8807 name = "util___util_0.10.3.tgz";
8808 url = "https://registry.yarnpkg.com/util/-/util-0.10.3.tgz";
8809 sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
8810 };
8811 }
8812 {
8813 name = "util___util_0.11.1.tgz";
8814 path = fetchurl {
8815 name = "util___util_0.11.1.tgz";
8816 url = "https://registry.yarnpkg.com/util/-/util-0.11.1.tgz";
8817 sha1 = "3236733720ec64bb27f6e26f421aaa2e1b588d61";
8818 };
8819 }
8820 {
8821 name = "utila___utila_0.4.0.tgz";
8822 path = fetchurl {
8823 name = "utila___utila_0.4.0.tgz";
8824 url = "https://registry.yarnpkg.com/utila/-/utila-0.4.0.tgz";
8825 sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c";
8826 };
8827 }
8828 {
8829 name = "utils_merge___utils_merge_1.0.1.tgz";
8830 path = fetchurl {
8831 name = "utils_merge___utils_merge_1.0.1.tgz";
8832 url = "https://registry.yarnpkg.com/utils-merge/-/utils-merge-1.0.1.tgz";
8833 sha1 = "9f95710f50a267947b2ccc124741c1028427e713";
8834 };
8835 }
8836 {
8837 name = "uuid___uuid_3.4.0.tgz";
8838 path = fetchurl {
8839 name = "uuid___uuid_3.4.0.tgz";
8840 url = "https://registry.yarnpkg.com/uuid/-/uuid-3.4.0.tgz";
8841 sha1 = "b23e4358afa8a202fe7a100af1f5f883f02007ee";
8842 };
8843 }
8844 {
8845 name = "v8_compile_cache___v8_compile_cache_2.1.1.tgz";
8846 path = fetchurl {
8847 name = "v8_compile_cache___v8_compile_cache_2.1.1.tgz";
8848 url = "https://registry.yarnpkg.com/v8-compile-cache/-/v8-compile-cache-2.1.1.tgz";
8849 sha1 = "54bc3cdd43317bca91e35dcaf305b1a7237de745";
8850 };
8851 }
8852 {
8853 name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
8854 path = fetchurl {
8855 name = "validate_npm_package_license___validate_npm_package_license_3.0.4.tgz";
8856 url = "https://registry.yarnpkg.com/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz";
8857 sha1 = "fc91f6b9c7ba15c857f4cb2c5defeec39d4f410a";
8858 };
8859 }
8860 {
8861 name = "vary___vary_1.1.2.tgz";
8862 path = fetchurl {
8863 name = "vary___vary_1.1.2.tgz";
8864 url = "https://registry.yarnpkg.com/vary/-/vary-1.1.2.tgz";
8865 sha1 = "2299f02c6ded30d4a5961b0b9f74524a18f634fc";
8866 };
8867 }
8868 {
8869 name = "vendors___vendors_1.0.4.tgz";
8870 path = fetchurl {
8871 name = "vendors___vendors_1.0.4.tgz";
8872 url = "https://registry.yarnpkg.com/vendors/-/vendors-1.0.4.tgz";
8873 sha1 = "e2b800a53e7a29b93506c3cf41100d16c4c4ad8e";
8874 };
8875 }
8876 {
8877 name = "verror___verror_1.10.0.tgz";
8878 path = fetchurl {
8879 name = "verror___verror_1.10.0.tgz";
8880 url = "https://registry.yarnpkg.com/verror/-/verror-1.10.0.tgz";
8881 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
8882 };
8883 }
8884 {
8885 name = "vm_browserify___vm_browserify_1.1.2.tgz";
8886 path = fetchurl {
8887 name = "vm_browserify___vm_browserify_1.1.2.tgz";
8888 url = "https://registry.yarnpkg.com/vm-browserify/-/vm-browserify-1.1.2.tgz";
8889 sha1 = "78641c488b8e6ca91a75f511e7a3b32a86e5dda0";
8890 };
8891 }
8892 {
8893 name = "vue_eslint_parser___vue_eslint_parser_7.1.0.tgz";
8894 path = fetchurl {
8895 name = "vue_eslint_parser___vue_eslint_parser_7.1.0.tgz";
8896 url = "https://registry.yarnpkg.com/vue-eslint-parser/-/vue-eslint-parser-7.1.0.tgz";
8897 sha1 = "9cdbcc823e656b087507a1911732b867ac101e83";
8898 };
8899 }
8900 {
8901 name = "vue_hot_reload_api___vue_hot_reload_api_2.3.4.tgz";
8902 path = fetchurl {
8903 name = "vue_hot_reload_api___vue_hot_reload_api_2.3.4.tgz";
8904 url = "https://registry.yarnpkg.com/vue-hot-reload-api/-/vue-hot-reload-api-2.3.4.tgz";
8905 sha1 = "532955cc1eb208a3d990b3a9f9a70574657e08f2";
8906 };
8907 }
8908 {
8909 name = "vue_loader___vue_loader_15.9.2.tgz";
8910 path = fetchurl {
8911 name = "vue_loader___vue_loader_15.9.2.tgz";
8912 url = "https://registry.yarnpkg.com/vue-loader/-/vue-loader-15.9.2.tgz";
8913 sha1 = "ae01f5f4c9c6a04bff4483912e72ef91a402c1ae";
8914 };
8915 }
8916 {
8917 name = "vue_style_loader___vue_style_loader_4.1.2.tgz";
8918 path = fetchurl {
8919 name = "vue_style_loader___vue_style_loader_4.1.2.tgz";
8920 url = "https://registry.yarnpkg.com/vue-style-loader/-/vue-style-loader-4.1.2.tgz";
8921 sha1 = "dedf349806f25ceb4e64f3ad7c0a44fba735fcf8";
8922 };
8923 }
8924 {
8925 name = "vue_template_compiler___vue_template_compiler_2.6.11.tgz";
8926 path = fetchurl {
8927 name = "vue_template_compiler___vue_template_compiler_2.6.11.tgz";
8928 url = "https://registry.yarnpkg.com/vue-template-compiler/-/vue-template-compiler-2.6.11.tgz";
8929 sha1 = "c04704ef8f498b153130018993e56309d4698080";
8930 };
8931 }
8932 {
8933 name = "vue_template_es2015_compiler___vue_template_es2015_compiler_1.9.1.tgz";
8934 path = fetchurl {
8935 name = "vue_template_es2015_compiler___vue_template_es2015_compiler_1.9.1.tgz";
8936 url = "https://registry.yarnpkg.com/vue-template-es2015-compiler/-/vue-template-es2015-compiler-1.9.1.tgz";
8937 sha1 = "1ee3bc9a16ecbf5118be334bb15f9c46f82f5825";
8938 };
8939 }
8940 {
8941 name = "vue___vue_2.6.11.tgz";
8942 path = fetchurl {
8943 name = "vue___vue_2.6.11.tgz";
8944 url = "https://registry.yarnpkg.com/vue/-/vue-2.6.11.tgz";
8945 sha1 = "76594d877d4b12234406e84e35275c6d514125c5";
8946 };
8947 }
8948 {
8949 name = "watchpack_chokidar2___watchpack_chokidar2_2.0.0.tgz";
8950 path = fetchurl {
8951 name = "watchpack_chokidar2___watchpack_chokidar2_2.0.0.tgz";
8952 url = "https://registry.yarnpkg.com/watchpack-chokidar2/-/watchpack-chokidar2-2.0.0.tgz";
8953 sha1 = "9948a1866cbbd6cb824dea13a7ed691f6c8ddff0";
8954 };
8955 }
8956 {
8957 name = "watchpack___watchpack_1.7.2.tgz";
8958 path = fetchurl {
8959 name = "watchpack___watchpack_1.7.2.tgz";
8960 url = "https://registry.yarnpkg.com/watchpack/-/watchpack-1.7.2.tgz";
8961 sha1 = "c02e4d4d49913c3e7e122c3325365af9d331e9aa";
8962 };
8963 }
8964 {
8965 name = "wbuf___wbuf_1.7.3.tgz";
8966 path = fetchurl {
8967 name = "wbuf___wbuf_1.7.3.tgz";
8968 url = "https://registry.yarnpkg.com/wbuf/-/wbuf-1.7.3.tgz";
8969 sha1 = "c1d8d149316d3ea852848895cb6a0bfe887b87df";
8970 };
8971 }
8972 {
8973 name = "wcwidth___wcwidth_1.0.1.tgz";
8974 path = fetchurl {
8975 name = "wcwidth___wcwidth_1.0.1.tgz";
8976 url = "https://registry.yarnpkg.com/wcwidth/-/wcwidth-1.0.1.tgz";
8977 sha1 = "f0b0dcf915bc5ff1528afadb2c0e17b532da2fe8";
8978 };
8979 }
8980 {
8981 name = "webpack_bundle_analyzer___webpack_bundle_analyzer_3.8.0.tgz";
8982 path = fetchurl {
8983 name = "webpack_bundle_analyzer___webpack_bundle_analyzer_3.8.0.tgz";
8984 url = "https://registry.yarnpkg.com/webpack-bundle-analyzer/-/webpack-bundle-analyzer-3.8.0.tgz";
8985 sha1 = "ce6b3f908daf069fd1f7266f692cbb3bded9ba16";
8986 };
8987 }
8988 {
8989 name = "webpack_chain___webpack_chain_6.4.0.tgz";
8990 path = fetchurl {
8991 name = "webpack_chain___webpack_chain_6.4.0.tgz";
8992 url = "https://registry.yarnpkg.com/webpack-chain/-/webpack-chain-6.4.0.tgz";
8993 sha1 = "22f0b27b6a9bc9ee3cba4f9e6513cf66394034e2";
8994 };
8995 }
8996 {
8997 name = "webpack_dev_middleware___webpack_dev_middleware_3.7.2.tgz";
8998 path = fetchurl {
8999 name = "webpack_dev_middleware___webpack_dev_middleware_3.7.2.tgz";
9000 url = "https://registry.yarnpkg.com/webpack-dev-middleware/-/webpack-dev-middleware-3.7.2.tgz";
9001 sha1 = "0019c3db716e3fa5cecbf64f2ab88a74bab331f3";
9002 };
9003 }
9004 {
9005 name = "webpack_dev_server___webpack_dev_server_3.11.0.tgz";
9006 path = fetchurl {
9007 name = "webpack_dev_server___webpack_dev_server_3.11.0.tgz";
9008 url = "https://registry.yarnpkg.com/webpack-dev-server/-/webpack-dev-server-3.11.0.tgz";
9009 sha1 = "8f154a3bce1bcfd1cc618ef4e703278855e7ff8c";
9010 };
9011 }
9012 {
9013 name = "webpack_log___webpack_log_2.0.0.tgz";
9014 path = fetchurl {
9015 name = "webpack_log___webpack_log_2.0.0.tgz";
9016 url = "https://registry.yarnpkg.com/webpack-log/-/webpack-log-2.0.0.tgz";
9017 sha1 = "5b7928e0637593f119d32f6227c1e0ac31e1b47f";
9018 };
9019 }
9020 {
9021 name = "webpack_merge___webpack_merge_4.2.2.tgz";
9022 path = fetchurl {
9023 name = "webpack_merge___webpack_merge_4.2.2.tgz";
9024 url = "https://registry.yarnpkg.com/webpack-merge/-/webpack-merge-4.2.2.tgz";
9025 sha1 = "a27c52ea783d1398afd2087f547d7b9d2f43634d";
9026 };
9027 }
9028 {
9029 name = "webpack_sources___webpack_sources_1.4.3.tgz";
9030 path = fetchurl {
9031 name = "webpack_sources___webpack_sources_1.4.3.tgz";
9032 url = "https://registry.yarnpkg.com/webpack-sources/-/webpack-sources-1.4.3.tgz";
9033 sha1 = "eedd8ec0b928fbf1cbfe994e22d2d890f330a933";
9034 };
9035 }
9036 {
9037 name = "webpack___webpack_4.43.0.tgz";
9038 path = fetchurl {
9039 name = "webpack___webpack_4.43.0.tgz";
9040 url = "https://registry.yarnpkg.com/webpack/-/webpack-4.43.0.tgz";
9041 sha1 = "c48547b11d563224c561dad1172c8aa0b8a678e6";
9042 };
9043 }
9044 {
9045 name = "websocket_driver___websocket_driver_0.6.5.tgz";
9046 path = fetchurl {
9047 name = "websocket_driver___websocket_driver_0.6.5.tgz";
9048 url = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.6.5.tgz";
9049 sha1 = "5cb2556ceb85f4373c6d8238aa691c8454e13a36";
9050 };
9051 }
9052 {
9053 name = "websocket_driver___websocket_driver_0.7.4.tgz";
9054 path = fetchurl {
9055 name = "websocket_driver___websocket_driver_0.7.4.tgz";
9056 url = "https://registry.yarnpkg.com/websocket-driver/-/websocket-driver-0.7.4.tgz";
9057 sha1 = "89ad5295bbf64b480abcba31e4953aca706f5760";
9058 };
9059 }
9060 {
9061 name = "websocket_extensions___websocket_extensions_0.1.4.tgz";
9062 path = fetchurl {
9063 name = "websocket_extensions___websocket_extensions_0.1.4.tgz";
9064 url = "https://registry.yarnpkg.com/websocket-extensions/-/websocket-extensions-0.1.4.tgz";
9065 sha1 = "7f8473bc839dfd87608adb95d7eb075211578a42";
9066 };
9067 }
9068 {
9069 name = "which_module___which_module_2.0.0.tgz";
9070 path = fetchurl {
9071 name = "which_module___which_module_2.0.0.tgz";
9072 url = "https://registry.yarnpkg.com/which-module/-/which-module-2.0.0.tgz";
9073 sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
9074 };
9075 }
9076 {
9077 name = "which___which_1.3.1.tgz";
9078 path = fetchurl {
9079 name = "which___which_1.3.1.tgz";
9080 url = "https://registry.yarnpkg.com/which/-/which-1.3.1.tgz";
9081 sha1 = "a45043d54f5805316da8d62f9f50918d3da70b0a";
9082 };
9083 }
9084 {
9085 name = "which___which_2.0.2.tgz";
9086 path = fetchurl {
9087 name = "which___which_2.0.2.tgz";
9088 url = "https://registry.yarnpkg.com/which/-/which-2.0.2.tgz";
9089 sha1 = "7c6a8dd0a636a0327e10b59c9286eee93f3f51b1";
9090 };
9091 }
9092 {
9093 name = "word_wrap___word_wrap_1.2.3.tgz";
9094 path = fetchurl {
9095 name = "word_wrap___word_wrap_1.2.3.tgz";
9096 url = "https://registry.yarnpkg.com/word-wrap/-/word-wrap-1.2.3.tgz";
9097 sha1 = "610636f6b1f703891bd34771ccb17fb93b47079c";
9098 };
9099 }
9100 {
9101 name = "workbox_background_sync___workbox_background_sync_4.3.1.tgz";
9102 path = fetchurl {
9103 name = "workbox_background_sync___workbox_background_sync_4.3.1.tgz";
9104 url = "https://registry.yarnpkg.com/workbox-background-sync/-/workbox-background-sync-4.3.1.tgz";
9105 sha1 = "26821b9bf16e9e37fd1d640289edddc08afd1950";
9106 };
9107 }
9108 {
9109 name = "workbox_broadcast_update___workbox_broadcast_update_4.3.1.tgz";
9110 path = fetchurl {
9111 name = "workbox_broadcast_update___workbox_broadcast_update_4.3.1.tgz";
9112 url = "https://registry.yarnpkg.com/workbox-broadcast-update/-/workbox-broadcast-update-4.3.1.tgz";
9113 sha1 = "e2c0280b149e3a504983b757606ad041f332c35b";
9114 };
9115 }
9116 {
9117 name = "workbox_build___workbox_build_4.3.1.tgz";
9118 path = fetchurl {
9119 name = "workbox_build___workbox_build_4.3.1.tgz";
9120 url = "https://registry.yarnpkg.com/workbox-build/-/workbox-build-4.3.1.tgz";
9121 sha1 = "414f70fb4d6de47f6538608b80ec52412d233e64";
9122 };
9123 }
9124 {
9125 name = "workbox_cacheable_response___workbox_cacheable_response_4.3.1.tgz";
9126 path = fetchurl {
9127 name = "workbox_cacheable_response___workbox_cacheable_response_4.3.1.tgz";
9128 url = "https://registry.yarnpkg.com/workbox-cacheable-response/-/workbox-cacheable-response-4.3.1.tgz";
9129 sha1 = "f53e079179c095a3f19e5313b284975c91428c91";
9130 };
9131 }
9132 {
9133 name = "workbox_core___workbox_core_4.3.1.tgz";
9134 path = fetchurl {
9135 name = "workbox_core___workbox_core_4.3.1.tgz";
9136 url = "https://registry.yarnpkg.com/workbox-core/-/workbox-core-4.3.1.tgz";
9137 sha1 = "005d2c6a06a171437afd6ca2904a5727ecd73be6";
9138 };
9139 }
9140 {
9141 name = "workbox_expiration___workbox_expiration_4.3.1.tgz";
9142 path = fetchurl {
9143 name = "workbox_expiration___workbox_expiration_4.3.1.tgz";
9144 url = "https://registry.yarnpkg.com/workbox-expiration/-/workbox-expiration-4.3.1.tgz";
9145 sha1 = "d790433562029e56837f341d7f553c4a78ebe921";
9146 };
9147 }
9148 {
9149 name = "workbox_google_analytics___workbox_google_analytics_4.3.1.tgz";
9150 path = fetchurl {
9151 name = "workbox_google_analytics___workbox_google_analytics_4.3.1.tgz";
9152 url = "https://registry.yarnpkg.com/workbox-google-analytics/-/workbox-google-analytics-4.3.1.tgz";
9153 sha1 = "9eda0183b103890b5c256e6f4ea15a1f1548519a";
9154 };
9155 }
9156 {
9157 name = "workbox_navigation_preload___workbox_navigation_preload_4.3.1.tgz";
9158 path = fetchurl {
9159 name = "workbox_navigation_preload___workbox_navigation_preload_4.3.1.tgz";
9160 url = "https://registry.yarnpkg.com/workbox-navigation-preload/-/workbox-navigation-preload-4.3.1.tgz";
9161 sha1 = "29c8e4db5843803b34cd96dc155f9ebd9afa453d";
9162 };
9163 }
9164 {
9165 name = "workbox_precaching___workbox_precaching_4.3.1.tgz";
9166 path = fetchurl {
9167 name = "workbox_precaching___workbox_precaching_4.3.1.tgz";
9168 url = "https://registry.yarnpkg.com/workbox-precaching/-/workbox-precaching-4.3.1.tgz";
9169 sha1 = "9fc45ed122d94bbe1f0ea9584ff5940960771cba";
9170 };
9171 }
9172 {
9173 name = "workbox_range_requests___workbox_range_requests_4.3.1.tgz";
9174 path = fetchurl {
9175 name = "workbox_range_requests___workbox_range_requests_4.3.1.tgz";
9176 url = "https://registry.yarnpkg.com/workbox-range-requests/-/workbox-range-requests-4.3.1.tgz";
9177 sha1 = "f8a470188922145cbf0c09a9a2d5e35645244e74";
9178 };
9179 }
9180 {
9181 name = "workbox_routing___workbox_routing_4.3.1.tgz";
9182 path = fetchurl {
9183 name = "workbox_routing___workbox_routing_4.3.1.tgz";
9184 url = "https://registry.yarnpkg.com/workbox-routing/-/workbox-routing-4.3.1.tgz";
9185 sha1 = "a675841af623e0bb0c67ce4ed8e724ac0bed0cda";
9186 };
9187 }
9188 {
9189 name = "workbox_strategies___workbox_strategies_4.3.1.tgz";
9190 path = fetchurl {
9191 name = "workbox_strategies___workbox_strategies_4.3.1.tgz";
9192 url = "https://registry.yarnpkg.com/workbox-strategies/-/workbox-strategies-4.3.1.tgz";
9193 sha1 = "d2be03c4ef214c115e1ab29c9c759c9fe3e9e646";
9194 };
9195 }
9196 {
9197 name = "workbox_streams___workbox_streams_4.3.1.tgz";
9198 path = fetchurl {
9199 name = "workbox_streams___workbox_streams_4.3.1.tgz";
9200 url = "https://registry.yarnpkg.com/workbox-streams/-/workbox-streams-4.3.1.tgz";
9201 sha1 = "0b57da70e982572de09c8742dd0cb40a6b7c2cc3";
9202 };
9203 }
9204 {
9205 name = "workbox_sw___workbox_sw_4.3.1.tgz";
9206 path = fetchurl {
9207 name = "workbox_sw___workbox_sw_4.3.1.tgz";
9208 url = "https://registry.yarnpkg.com/workbox-sw/-/workbox-sw-4.3.1.tgz";
9209 sha1 = "df69e395c479ef4d14499372bcd84c0f5e246164";
9210 };
9211 }
9212 {
9213 name = "workbox_webpack_plugin___workbox_webpack_plugin_4.3.1.tgz";
9214 path = fetchurl {
9215 name = "workbox_webpack_plugin___workbox_webpack_plugin_4.3.1.tgz";
9216 url = "https://registry.yarnpkg.com/workbox-webpack-plugin/-/workbox-webpack-plugin-4.3.1.tgz";
9217 sha1 = "47ff5ea1cc074b6c40fb5a86108863a24120d4bd";
9218 };
9219 }
9220 {
9221 name = "workbox_window___workbox_window_4.3.1.tgz";
9222 path = fetchurl {
9223 name = "workbox_window___workbox_window_4.3.1.tgz";
9224 url = "https://registry.yarnpkg.com/workbox-window/-/workbox-window-4.3.1.tgz";
9225 sha1 = "ee6051bf10f06afa5483c9b8dfa0531994ede0f3";
9226 };
9227 }
9228 {
9229 name = "worker_farm___worker_farm_1.7.0.tgz";
9230 path = fetchurl {
9231 name = "worker_farm___worker_farm_1.7.0.tgz";
9232 url = "https://registry.yarnpkg.com/worker-farm/-/worker-farm-1.7.0.tgz";
9233 sha1 = "26a94c5391bbca926152002f69b84a4bf772e5a8";
9234 };
9235 }
9236 {
9237 name = "wrap_ansi___wrap_ansi_5.1.0.tgz";
9238 path = fetchurl {
9239 name = "wrap_ansi___wrap_ansi_5.1.0.tgz";
9240 url = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-5.1.0.tgz";
9241 sha1 = "1fd1f67235d5b6d0fee781056001bfb694c03b09";
9242 };
9243 }
9244 {
9245 name = "wrap_ansi___wrap_ansi_6.2.0.tgz";
9246 path = fetchurl {
9247 name = "wrap_ansi___wrap_ansi_6.2.0.tgz";
9248 url = "https://registry.yarnpkg.com/wrap-ansi/-/wrap-ansi-6.2.0.tgz";
9249 sha1 = "e9393ba07102e6c91a3b221478f0257cd2856e53";
9250 };
9251 }
9252 {
9253 name = "wrappy___wrappy_1.0.2.tgz";
9254 path = fetchurl {
9255 name = "wrappy___wrappy_1.0.2.tgz";
9256 url = "https://registry.yarnpkg.com/wrappy/-/wrappy-1.0.2.tgz";
9257 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
9258 };
9259 }
9260 {
9261 name = "write___write_1.0.3.tgz";
9262 path = fetchurl {
9263 name = "write___write_1.0.3.tgz";
9264 url = "https://registry.yarnpkg.com/write/-/write-1.0.3.tgz";
9265 sha1 = "0800e14523b923a387e415123c865616aae0f5c3";
9266 };
9267 }
9268 {
9269 name = "ws___ws_6.2.1.tgz";
9270 path = fetchurl {
9271 name = "ws___ws_6.2.1.tgz";
9272 url = "https://registry.yarnpkg.com/ws/-/ws-6.2.1.tgz";
9273 sha1 = "442fdf0a47ed64f59b6a5d8ff130f4748ed524fb";
9274 };
9275 }
9276 {
9277 name = "xtend___xtend_4.0.2.tgz";
9278 path = fetchurl {
9279 name = "xtend___xtend_4.0.2.tgz";
9280 url = "https://registry.yarnpkg.com/xtend/-/xtend-4.0.2.tgz";
9281 sha1 = "bb72779f5fa465186b1f438f674fa347fdb5db54";
9282 };
9283 }
9284 {
9285 name = "y18n___y18n_4.0.0.tgz";
9286 path = fetchurl {
9287 name = "y18n___y18n_4.0.0.tgz";
9288 url = "https://registry.yarnpkg.com/y18n/-/y18n-4.0.0.tgz";
9289 sha1 = "95ef94f85ecc81d007c264e190a120f0a3c8566b";
9290 };
9291 }
9292 {
9293 name = "yallist___yallist_2.1.2.tgz";
9294 path = fetchurl {
9295 name = "yallist___yallist_2.1.2.tgz";
9296 url = "https://registry.yarnpkg.com/yallist/-/yallist-2.1.2.tgz";
9297 sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
9298 };
9299 }
9300 {
9301 name = "yallist___yallist_3.1.1.tgz";
9302 path = fetchurl {
9303 name = "yallist___yallist_3.1.1.tgz";
9304 url = "https://registry.yarnpkg.com/yallist/-/yallist-3.1.1.tgz";
9305 sha1 = "dbb7daf9bfd8bac9ab45ebf602b8cbad0d5d08fd";
9306 };
9307 }
9308 {
9309 name = "yallist___yallist_4.0.0.tgz";
9310 path = fetchurl {
9311 name = "yallist___yallist_4.0.0.tgz";
9312 url = "https://registry.yarnpkg.com/yallist/-/yallist-4.0.0.tgz";
9313 sha1 = "9bb92790d9c0effec63be73519e11a35019a3a72";
9314 };
9315 }
9316 {
9317 name = "yargs_parser___yargs_parser_13.1.2.tgz";
9318 path = fetchurl {
9319 name = "yargs_parser___yargs_parser_13.1.2.tgz";
9320 url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-13.1.2.tgz";
9321 sha1 = "130f09702ebaeef2650d54ce6e3e5706f7a4fb38";
9322 };
9323 }
9324 {
9325 name = "yargs_parser___yargs_parser_18.1.3.tgz";
9326 path = fetchurl {
9327 name = "yargs_parser___yargs_parser_18.1.3.tgz";
9328 url = "https://registry.yarnpkg.com/yargs-parser/-/yargs-parser-18.1.3.tgz";
9329 sha1 = "be68c4975c6b2abf469236b0c870362fab09a7b0";
9330 };
9331 }
9332 {
9333 name = "yargs___yargs_13.3.2.tgz";
9334 path = fetchurl {
9335 name = "yargs___yargs_13.3.2.tgz";
9336 url = "https://registry.yarnpkg.com/yargs/-/yargs-13.3.2.tgz";
9337 sha1 = "ad7ffefec1aa59565ac915f82dccb38a9c31a2dd";
9338 };
9339 }
9340 {
9341 name = "yargs___yargs_15.3.1.tgz";
9342 path = fetchurl {
9343 name = "yargs___yargs_15.3.1.tgz";
9344 url = "https://registry.yarnpkg.com/yargs/-/yargs-15.3.1.tgz";
9345 sha1 = "9505b472763963e54afe60148ad27a330818e98b";
9346 };
9347 }
9348 {
9349 name = "yorkie___yorkie_2.0.0.tgz";
9350 path = fetchurl {
9351 name = "yorkie___yorkie_2.0.0.tgz";
9352 url = "https://registry.yarnpkg.com/yorkie/-/yorkie-2.0.0.tgz";
9353 sha1 = "92411912d435214e12c51c2ae1093e54b6bb83d9";
9354 };
9355 }
9356 ];
9357}
diff --git a/systems/eldiron/websites/tools/ldap.nix b/systems/eldiron/websites/tools/ldap.nix
new file mode 100644
index 0000000..9509169
--- /dev/null
+++ b/systems/eldiron/websites/tools/ldap.nix
@@ -0,0 +1,77 @@
1{ lib, php, env, writeText, phpldapadmin, config }:
2rec {
3 keys."webapps/tools-ldap" = {
4 user = apache.user;
5 group = apache.group;
6 permissions = "0400";
7 text = ''
8 <?php
9 $config->custom->appearance['show_clear_password'] = true;
10 $config->custom->appearance['hide_template_warning'] = true;
11 $config->custom->appearance['theme'] = "tango";
12 $config->custom->appearance['minimalMode'] = false;
13 $config->custom->appearance['tree'] = 'AJAXTree';
14
15 $servers = new Datastore();
16
17 $servers->newServer('ldap_pla');
18 $servers->setValue('server','name','Immae&#x2019;s LDAP');
19 $servers->setValue('server','host','ldaps://${env.ldap.host}');
20 $servers->setValue('login','auth_type','cookie');
21 $servers->setValue('login','bind_id','${env.ldap.dn}');
22 $servers->setValue('login','bind_pass','${env.ldap.password}');
23 $servers->setValue('appearance','pla_password_hash','ssha');
24 $servers->setValue('login','attr','uid');
25 $servers->setValue('login','fallback_dn',true);
26 '';
27 };
28 webRoot = phpldapadmin.override { config = config.secrets.fullPaths."webapps/tools-ldap"; };
29 apache = rec {
30 user = "wwwrun";
31 group = "wwwrun";
32 modules = [ "proxy_fcgi" ];
33 root = "${webRoot}/htdocs";
34 vhostConf = socket: ''
35 Alias /ldap "${root}"
36 <Directory "${root}">
37 DirectoryIndex index.php
38 <FilesMatch "\.php$">
39 SetHandler "proxy:unix:${socket}|fcgi://localhost"
40 </FilesMatch>
41
42 AllowOverride None
43 Require all granted
44 </Directory>
45 '';
46 };
47 phpFpm = rec {
48 serviceDeps = [ "openldap.service" ];
49 basedir = builtins.concatStringsSep ":" [ webRoot config.secrets.fullPaths."webapps/tools-ldap" ];
50 pool = {
51 "listen.owner" = apache.user;
52 "listen.group" = apache.group;
53 "pm" = "ondemand";
54 "pm.max_children" = "60";
55 "pm.process_idle_timeout" = "60";
56
57 # Needed to avoid clashes in browser cookies (same domain)
58 "php_value[session.name]" = "LdapPHPSESSID";
59 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
60 "php_admin_value[session.save_handler]" = "redis";
61 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:PhpLDAPAdmin:'";
62 };
63 };
64 monitoringPlugins = [ "http" ];
65 monitoringObjects.service = [
66 {
67 service_description = "ldap website is running on tools.immae.eu";
68 host_name = config.hostEnv.fqdn;
69 use = "external-web-service";
70 check_command = ["check_https" "tools.immae.eu" "/ldap/" "<title>phpLDAPadmin"];
71
72 servicegroups = "webstatus-webapps";
73 _webstatus_name = "LDAP";
74 _webstatus_url = "https://tools.immae.eu/ldap/";
75 }
76 ];
77}
diff --git a/systems/eldiron/websites/tools/phpbb.nix b/systems/eldiron/websites/tools/phpbb.nix
new file mode 100644
index 0000000..c1cbd6f
--- /dev/null
+++ b/systems/eldiron/websites/tools/phpbb.nix
@@ -0,0 +1,69 @@
1{ lib, phpbb, gnused }:
2rec {
3 varDir = "/var/lib/phpbb";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 if [ ! -d ${varDir} ]; then
8 install -m 0755 -o ${apache.user} -g ${apache.user} -d ${varDir}
9 cp -a ${phpbb}/vars/* ${varDir}
10 chown -R ${apache.user}:${apache.user} ${varDir}
11 fi
12 '';
13 };
14 chatonsHostingProperties = {
15 file.datetime = "2022-08-21T22:50:00";
16 hosting = {
17 name = "phpBB";
18 description = "Forum software";
19 website = "https://tools.immae.eu/forum";
20 logo = "https://www.phpbb.com/favicon.ico";
21 type = "INSTANCE";
22 status.level = "OK";
23 status.description = "OK";
24 registration.load = "OPEN";
25 install.type = "PACKAGE";
26 };
27 };
28 webRoot = phpbb;
29 apache = rec {
30 user = "wwwrun";
31 group = "wwwrun";
32 modules = [ "proxy_fcgi" ];
33 root = webRoot;
34 vhostConf = socket: ''
35 Alias /forum "${root}"
36 <Directory "${root}">
37 DirectoryIndex index.php
38 <FilesMatch "\.php$">
39 SetHandler "proxy:unix:${socket}|fcgi://localhost"
40 </FilesMatch>
41
42 AllowOverride All
43 Options FollowSymlinks
44 Require all granted
45 </Directory>
46 # add instal to the list after install
47 <LocationMatch "^/(cache|files|install|store)>
48 Require all denied
49 </LocationMatch>
50 '';
51 };
52 phpFpm = rec {
53 serviceDeps = [ "postgresql.service" ];
54 basedir = builtins.concatStringsSep ":" [ "/run/wrappers/bin/sendmail" phpbb varDir ];
55 pool = {
56 "listen.owner" = apache.user;
57 "listen.group" = apache.group;
58 "pm" = "ondemand";
59 "pm.max_children" = "60";
60 "pm.process_idle_timeout" = "60";
61
62 # Needed to avoid clashes in browser cookies (same domain)
63 "php_value[session.name]" = "PhpBBPHPSESSID";
64 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
65 "php_admin_value[session.save_handler]" = "redis";
66 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:PhpBB:'";
67 };
68 };
69}
diff --git a/systems/eldiron/websites/tools/rompr.nix b/systems/eldiron/websites/tools/rompr.nix
new file mode 100644
index 0000000..a7308ce
--- /dev/null
+++ b/systems/eldiron/websites/tools/rompr.nix
@@ -0,0 +1,86 @@
1{ lib, env, rompr, config }:
2rec {
3 varDir = "/var/lib/rompr";
4 activationScript = ''
5 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
6 ${varDir}/prefs ${varDir}/albumart
7 '';
8 webRoot = rompr;
9 apache = rec {
10 user = "wwwrun";
11 group = "wwwrun";
12 modules = [ "headers" "mime" "proxy_fcgi" ];
13 root = webRoot;
14 vhostConf = socket: ''
15 Alias /rompr ${root}
16
17 <Directory ${root}>
18 Options Indexes FollowSymLinks
19 DirectoryIndex index.php
20 AllowOverride all
21 Require all granted
22 Order allow,deny
23 Allow from all
24 ErrorDocument 404 /rompr/404.php
25 AddType image/x-icon .ico
26
27 <FilesMatch "\.php$">
28 SetHandler "proxy:unix:${socket}|fcgi://localhost"
29 </FilesMatch>
30 </Directory>
31
32 <Directory ${root}/albumart/small>
33 Header Set Cache-Control "max-age=0, no-store"
34 Header Set Cache-Control "no-cache, must-revalidate"
35 </Directory>
36
37 <Directory ${root}/albumart/asdownloaded>
38 Header Set Cache-Control "max-age=0, no-store"
39 Header Set Cache-Control "no-cache, must-revalidate"
40 </Directory>
41
42 <LocationMatch "^/rompr">
43 Use LDAPConnect
44 Require ldap-group cn=users,cn=mpd,ou=services,dc=immae,dc=eu
45 </LocationMatch>
46 '';
47 };
48 phpFpm = rec {
49 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
50 pool = {
51 "listen.owner" = apache.user;
52 "listen.group" = apache.group;
53 "pm" = "ondemand";
54 "pm.max_children" = "60";
55 "pm.process_idle_timeout" = "60";
56
57 # Needed to avoid clashes in browser cookies (same domain)
58 "php_value[session.name]" = "RomprPHPSESSID";
59 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
60 "php_admin_value[session.save_handler]" = "redis";
61 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Rompr:'";
62 "php_flag[magic_quotes_gpc]" = "Off";
63 "php_flag[track_vars]" = "On";
64 "php_flag[register_globals]" = "Off";
65 "php_admin_flag[allow_url_fopen]" = "On";
66 "php_value[include_path]" = "${webRoot}";
67 "php_admin_value[upload_tmp_dir]" = "${varDir}/prefs";
68 "php_admin_value[post_max_size]" = "32M";
69 "php_admin_value[upload_max_filesize]" = "32M";
70 "php_admin_value[memory_limit]" = "256M";
71 };
72 };
73 monitoringPlugins = [ "http" ];
74 monitoringObjects.service = [
75 {
76 service_description = "rompr mpd website is running on tools.immae.eu";
77 host_name = config.hostEnv.fqdn;
78 use = "external-web-service";
79 check_command = ["check_https_auth" "tools.immae.eu" "/rompr/" "<title>RompЯ"];
80
81 servicegroups = "webstatus-webapps";
82 _webstatus_name = "MPD (ROMPR)";
83 _webstatus_url = "https://tools.immae.eu/rompr/";
84 }
85 ];
86}
diff --git a/systems/eldiron/websites/tools/shaarli.nix b/systems/eldiron/websites/tools/shaarli.nix
new file mode 100644
index 0000000..35f1edb
--- /dev/null
+++ b/systems/eldiron/websites/tools/shaarli.nix
@@ -0,0 +1,102 @@
1{ lib, env, stdenv, fetchurl, shaarli, config }:
2let
3 varDir = "/var/lib/shaarli";
4in rec {
5 activationScript = ''
6 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
7 ${varDir}/cache ${varDir}/pagecache ${varDir}/tmp ${varDir}/data
8 '';
9 webRoot = shaarli.override { inherit varDir; };
10 apache = rec {
11 user = "wwwrun";
12 group = "wwwrun";
13 modules = [ "proxy_fcgi" "rewrite" "env" ];
14 root = webRoot;
15 vhostConf = socket: ''
16 Alias /Shaarli "${root}"
17
18 Include ${config.secrets.fullPaths."webapps/tools-shaarli"}
19 <Location /Shaarli>
20 Header set Access-Control-Allow-Origin "*"
21 Header set Access-Control-Allow-Methods "GET, POST, PUT, DELETE, OPTIONS"
22 Header set Access-Control-Allow-Headers "Origin, X-Requested-With, Content-Type, Accept, Authorization, Client-Security-Token, Accept-Encoding"
23 </Location>
24 <Directory "${root}">
25 DirectoryIndex index.php index.htm index.html
26 Options Indexes FollowSymLinks MultiViews Includes
27 AllowOverride All
28 Require all granted
29 <FilesMatch "\.php$">
30 SetHandler "proxy:unix:${socket}|fcgi://localhost"
31 </FilesMatch>
32 </Directory>
33 '';
34 };
35 chatonsProperties = {
36 file.datetime = "2022-08-21T22:50:00";
37 service = {
38 name = "Shaarli";
39 description = "The personal, minimalist, super-fast, database free, bookmarking service - community repo";
40 website = "https://tools.immae.eu/Shaarli/";
41 logo = "https://tools.immae.eu/Shaarli/tpl/default/img/apple-touch-icon.png";
42 status.level = "OK";
43 status.description = "OK";
44 registration."" = ["MEMBER" "CLIENT"];
45 registration.load = "OPEN";
46 install.type = "PACKAGE";
47 };
48 software = {
49 name = "Shaarli";
50 website = "https://shaarli.readthedocs.io/";
51 license.url = "https://github.com/shaarli/Shaarli/blob/master/COPYING";
52 license.name = "GNU General Public License Version 3";
53 version = webRoot.version;
54 source.url = "https://github.com/shaarli/Shaarli";
55 modules = "ldap-connection-patch";
56 };
57 };
58 keys."webapps/tools-shaarli" = {
59 user = apache.user;
60 group = apache.group;
61 permissions = "0400";
62 text = ''
63 SetEnv SHAARLI_LDAP_PASSWORD "${env.ldap.password}"
64 SetEnv SHAARLI_LDAP_DN "${env.ldap.dn}"
65 SetEnv SHAARLI_LDAP_HOST "ldaps://${env.ldap.host}"
66 SetEnv SHAARLI_LDAP_BASE "${env.ldap.base}"
67 SetEnv SHAARLI_LDAP_FILTER "${env.ldap.filter}"
68 '';
69 };
70 phpFpm = rec {
71 serviceDeps = [ "openldap.service" ];
72 basedir = builtins.concatStringsSep ":" [ webRoot varDir ];
73 pool = {
74 "listen.owner" = apache.user;
75 "listen.group" = apache.group;
76 "pm" = "ondemand";
77 "pm.max_children" = "60";
78 "pm.process_idle_timeout" = "60";
79
80 # Needed to avoid clashes in browser cookies (same domain)
81 "php_value[session.name]" = "ShaarliPHPSESSID";
82 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
83 "php_admin_value[session.save_handler]" = "redis";
84 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Shaarli:'";
85 "php_admin_value[upload_max_filesize]" = "200M";
86 "php_admin_value[post_max_size]" = "200M";
87 };
88 };
89 monitoringPlugins = [ "http" ];
90 monitoringObjects.service = [
91 {
92 service_description = "shaarli website is running on tools.immae.eu";
93 host_name = config.hostEnv.fqdn;
94 use = "external-web-service";
95 check_command = ["check_https" "tools.immae.eu" "/Shaarli/immae" "<title>Immae"];
96
97 servicegroups = "webstatus-webapps";
98 _webstatus_name = "Shaarli";
99 _webstatus_url = "https://tools.immae.eu/Shaarli/";
100 }
101 ];
102}
diff --git a/systems/eldiron/websites/tools/ttrss.nix b/systems/eldiron/websites/tools/ttrss.nix
new file mode 100644
index 0000000..6393256
--- /dev/null
+++ b/systems/eldiron/websites/tools/ttrss.nix
@@ -0,0 +1,167 @@
1{ php, env, ttrss, ttrss-plugins, config }:
2rec {
3 varDir = "/var/lib/ttrss";
4 activationScript = {
5 deps = [ "wrappers" ];
6 text = ''
7 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
8 ${varDir}/lock ${varDir}/cache ${varDir}/feed-icons
9 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir}/cache/export/ \
10 ${varDir}/cache/feeds/ \
11 ${varDir}/cache/images/ \
12 ${varDir}/cache/js/ \
13 ${varDir}/cache/simplepie/ \
14 ${varDir}/cache/upload/
15 touch ${varDir}/feed-icons/index.html
16 '';
17 };
18 chatonsProperties = {
19 file.datetime = "2022-08-21T22:50:00";
20 service = {
21 name = "RSS";
22 description = "Tiny Tiny RSS is a free and open source web-based news feed (RSS/Atom) reader and aggregator";
23 website = "https://tools.immae.eu/ttrss/";
24 logo = "https://tools.immae.eu/ttrss/images/favicon.png";
25 status.level = "OK";
26 status.description = "OK";
27 registration."" = ["MEMBER" "CLIENT"];
28 registration.load = "OPEN";
29 install.type = "PACKAGE";
30 };
31 software = {
32 name = "Tiny Tiny RSS";
33 website = "https://tt-rss.org/";
34 license.url = "https://www.gnu.org/copyleft/gpl.html";
35 license.name = "GNU General Public License Version 3";
36 version = webRoot.version;
37 source.url = "https://git.tt-rss.org/fox/tt-rss.git/";
38 modules = map (p: p.pluginName) webRoot.plugins;
39 };
40 };
41 keys."webapps/tools-ttrss" = {
42 user = apache.user;
43 group = apache.group;
44 permissions = "0400";
45 keyDependencies = [ php ];
46 text = ''
47 <?php
48
49 define('PHP_EXECUTABLE', '${php}/bin/php');
50
51 define('LOCK_DIRECTORY', 'lock');
52 define('CACHE_DIR', 'cache');
53 define('ICONS_DIR', 'feed-icons');
54 define('ICONS_URL', 'feed-icons');
55 define('SELF_URL_PATH', 'https://tools.immae.eu/ttrss/');
56
57 define('MYSQL_CHARSET', 'UTF8');
58
59 define('DB_TYPE', 'pgsql');
60 define('DB_HOST', '${env.postgresql.socket}');
61 define('DB_USER', '${env.postgresql.user}');
62 define('DB_NAME', '${env.postgresql.database}');
63 define('DB_PASS', '${env.postgresql.password}');
64 define('DB_PORT', '${env.postgresql.port}');
65
66 define('AUTH_AUTO_CREATE', true);
67 define('AUTH_AUTO_LOGIN', true);
68
69 define('SINGLE_USER_MODE', false);
70
71 define('SIMPLE_UPDATE_MODE', false);
72 define('CHECK_FOR_UPDATES', true);
73
74 define('FORCE_ARTICLE_PURGE', 0);
75 define('SESSION_COOKIE_LIFETIME', 60*60*24*120);
76 define('ENABLE_GZIP_OUTPUT', false);
77
78 define('PLUGINS', 'auth_ldap, note, instances');
79
80 define('LOG_DESTINATION', ''');
81 define('CONFIG_VERSION', 26);
82
83 define('DAEMON_UPDATE_LOGIN_LIMIT', 0);
84
85 define('SPHINX_SERVER', 'localhost:9312');
86 define('SPHINX_INDEX', 'ttrss, delta');
87
88 define('ENABLE_REGISTRATION', false);
89 define('REG_NOTIFY_ADDRESS', 'ttrss@tools.immae.eu');
90 define('REG_MAX_USERS', 10);
91
92 define('SMTP_FROM_NAME', 'Tiny Tiny RSS');
93 define('SMTP_FROM_ADDRESS', 'ttrss@tools.immae.eu');
94 define('DIGEST_SUBJECT', '[tt-rss] New headlines for last 24 hours');
95
96 define('LDAP_AUTH_SERVER_URI', 'ldap://${env.ldap.host}:389/');
97 define('LDAP_AUTH_USETLS', TRUE);
98 define('LDAP_AUTH_ALLOW_UNTRUSTED_CERT', TRUE);
99 define('LDAP_AUTH_BASEDN', '${env.ldap.base}');
100 define('LDAP_AUTH_ANONYMOUSBEFOREBIND', FALSE);
101 define('LDAP_AUTH_SEARCHFILTER', '${env.ldap.filter}');
102
103 define('LDAP_AUTH_BINDDN', '${env.ldap.dn}');
104 define('LDAP_AUTH_BINDPW', '${env.ldap.password}');
105 define('LDAP_AUTH_LOGIN_ATTRIB', 'immaeTtrssLogin');
106
107 define('LDAP_AUTH_LOG_ATTEMPTS', FALSE);
108 define('LDAP_AUTH_DEBUG', FALSE);
109 '';
110 };
111 webRoot = (ttrss.override { ttrss_config = config.secrets.fullPaths."webapps/tools-ttrss"; }).withPlugins (p: [
112 p.auth_ldap p.ff_instagram p.tumblr_gdpr_ua
113 (p.af_feedmod.override { patched = true; })
114 (p.feediron.override { patched = true; })
115 ]);
116 apache = rec {
117 user = "wwwrun";
118 group = "wwwrun";
119 modules = [ "proxy_fcgi" ];
120 root = webRoot;
121 vhostConf = socket: ''
122 Alias /ttrss "${root}"
123 <Directory "${root}">
124 DirectoryIndex index.php
125 <FilesMatch "\.php$">
126 SetHandler "proxy:unix:${socket}|fcgi://localhost"
127 </FilesMatch>
128
129 AllowOverride All
130 Options FollowSymlinks
131 Require all granted
132 </Directory>
133 '';
134 };
135 phpFpm = rec {
136 serviceDeps = [ "postgresql.service" "openldap.service" ];
137 basedir = builtins.concatStringsSep ":" (
138 [ webRoot config.secrets.fullPaths."webapps/tools-ttrss" varDir ]
139 ++ webRoot.plugins);
140 pool = {
141 "listen.owner" = apache.user;
142 "listen.group" = apache.group;
143 "pm" = "ondemand";
144 "pm.max_children" = "60";
145 "pm.process_idle_timeout" = "60";
146
147 # Needed to avoid clashes in browser cookies (same domain)
148 "php_value[session.name]" = "TtrssPHPSESSID";
149 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
150 "php_admin_value[session.save_handler]" = "redis";
151 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:TTRSS:'";
152 };
153 };
154 monitoringPlugins = [ "http" ];
155 monitoringObjects.service = [
156 {
157 service_description = "ttrss website is running on tools.immae.eu";
158 host_name = config.hostEnv.fqdn;
159 use = "external-web-service";
160 check_command = ["check_https" "tools.immae.eu" "/ttrss/" "<title>Tiny Tiny RSS"];
161
162 servicegroups = "webstatus-webapps";
163 _webstatus_name = "TT-RSS";
164 _webstatus_url = "https://tools.immae.eu/ttrss/";
165 }
166 ];
167}
diff --git a/systems/eldiron/websites/tools/wallabag.nix b/systems/eldiron/websites/tools/wallabag.nix
new file mode 100644
index 0000000..0a5750d
--- /dev/null
+++ b/systems/eldiron/websites/tools/wallabag.nix
@@ -0,0 +1,180 @@
1{ env, wallabag, mylibs, config }:
2rec {
3 varDir = "/var/lib/wallabag";
4 keys."webapps/tools-wallabag" = {
5 user = apache.user;
6 group = apache.group;
7 permissions = "0400";
8 text = ''
9 # This file is auto-generated during the composer install
10 parameters:
11 database_driver: pdo_pgsql
12 database_driver_class: Wallabag\CoreBundle\Doctrine\DBAL\Driver\CustomPostgreSQLDriver
13 database_host: ${env.postgresql.socket}
14 database_port: ${env.postgresql.port}
15 database_name: ${env.postgresql.database}
16 database_user: ${env.postgresql.user}
17 database_password: ${env.postgresql.password}
18 database_path: null
19 database_table_prefix: wallabag_
20 database_socket: null
21 database_charset: utf8
22 domain_name: https://tools.immae.eu/wallabag
23 mailer_transport: sendmail
24 mailer_host: 127.0.0.1
25 mailer_user: null
26 mailer_password: null
27 locale: fr
28 secret: ${env.secret}
29 twofactor_auth: true
30 twofactor_sender: wallabag@tools.immae.eu
31 fosuser_registration: false
32 fosuser_confirmation: true
33 from_email: wallabag@tools.immae.eu
34 rss_limit: 50
35 rabbitmq_host: localhost
36 rabbitmq_port: 5672
37 rabbitmq_user: guest
38 rabbitmq_password: guest
39 rabbitmq_prefetch_count: 10
40 redis_scheme: unix
41 redis_host: null
42 redis_port: null
43 redis_path: ${env.redis.socket}
44 redis_password: null
45 sites_credentials: { }
46 ldap_enabled: true
47 ldap_host: ${env.ldap.host}
48 ldap_port: 636
49 ldap_tls: false
50 ldap_ssl: true
51 ldap_bind_requires_dn: true
52 ldap_base: '${env.ldap.base}'
53 ldap_manager_dn: '${env.ldap.dn}'
54 ldap_manager_pw: ${env.ldap.password}
55 ldap_filter: '${env.ldap.filter}'
56 ldap_admin_filter: '${env.ldap.admin_filter}'
57 ldap_username_attribute: uid
58 ldap_email_attribute: mail
59 ldap_name_attribute: cn
60 ldap_enabled_attribute: null
61 services:
62 swiftmailer.mailer.default.transport:
63 class: Swift_SendmailTransport
64 arguments: ['/run/wrappers/bin/sendmail -bs']
65 '';
66 };
67 chatonsProperties = {
68 file.datetime = "2022-08-21T22:50:00";
69 service = {
70 name = "Wallabag";
71 description = "wallabag is a self hostable application for saving web pages: Save and classify articles. Read them later. Freely.";
72 website = "https://tools.immae.eu/wallabag/";
73 logo = "https://tools.immae.eu/wallabag/wallassets/themes/_global/img/appicon/apple-touch-icon-120.png";
74 status.level = "OK";
75 status.description = "OK";
76 registration."" = ["MEMBER" "CLIENT"];
77 registration.load = "OPEN";
78 install.type = "PACKAGE";
79 };
80 software = {
81 name = "Wallabag";
82 website = "https://wallabag.org/en";
83 license.url = "https://github.com/wallabag/wallabag/blob/master/COPYING.md";
84 license.name = "MIT License";
85 version = webappDir.version;
86 source.url = "https://github.com/wallabag/wallabag";
87 modules = "ldap-patch";
88 };
89 };
90 webappDir = wallabag.override { ldap = true; wallabag_config = config.secrets.fullPaths."webapps/tools-wallabag"; };
91 activationScript = ''
92 install -m 0755 -o ${apache.user} -g ${apache.group} -d ${varDir} \
93 ${varDir}/var ${varDir}/data/db ${varDir}/assets/images
94 '';
95 webRoot = "${webappDir}/web";
96 # Domain migration: Table wallabag_entry contains whole
97 # https://tools.immae.eu/wallabag domain name in preview_picture
98 apache = rec {
99 user = "wwwrun";
100 group = "wwwrun";
101 modules = [ "proxy_fcgi" ];
102 root = webRoot;
103 vhostConf = socket: ''
104 Alias /wallabag "${root}"
105 <Directory "${root}">
106 AllowOverride None
107 Require all granted
108 # For OAuth (apps)
109 CGIPassAuth On
110
111 <FilesMatch "\.php$">
112 SetHandler "proxy:unix:${socket}|fcgi://localhost"
113 </FilesMatch>
114
115 <IfModule mod_rewrite.c>
116 Options -MultiViews
117 RewriteEngine On
118 RewriteCond %{REQUEST_FILENAME} !-f
119 RewriteRule ^(.*)$ app.php [QSA,L]
120 </IfModule>
121 </Directory>
122 <Directory "${root}/bundles">
123 <IfModule mod_rewrite.c>
124 RewriteEngine Off
125 </IfModule>
126 </Directory>
127 <Directory "${varDir}/assets">
128 AllowOverride None
129 Require all granted
130 </Directory>
131 '';
132 };
133 phpFpm = rec {
134 preStart = ''
135 if [ ! -f "${varDir}/currentWebappDir" -o \
136 ! -f "${varDir}/currentKey" -o \
137 "${webappDir}" != "$(cat ${varDir}/currentWebappDir 2>/dev/null)" ] \
138 || ! sha512sum -c --status ${varDir}/currentKey; then
139 pushd ${webappDir} > /dev/null
140 /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod cache:clear
141 rm -rf /var/lib/wallabag/var/cache/pro_
142 /run/wrappers/bin/sudo -u wwwrun ./bin/console --env=prod doctrine:migrations:migrate --no-interaction
143 popd > /dev/null
144 echo -n "${webappDir}" > ${varDir}/currentWebappDir
145 sha512sum ${config.secrets.fullPaths."webapps/tools-wallabag"} > ${varDir}/currentKey
146 fi
147 '';
148 serviceDeps = [ "postgresql.service" "openldap.service" ];
149 basedir = builtins.concatStringsSep ":" [ webappDir config.secrets.fullPaths."webapps/tools-wallabag" varDir ];
150 pool = {
151 "listen.owner" = apache.user;
152 "listen.group" = apache.group;
153 "pm" = "dynamic";
154 "pm.max_children" = "60";
155 "pm.start_servers" = "2";
156 "pm.min_spare_servers" = "1";
157 "pm.max_spare_servers" = "10";
158
159 # Needed to avoid clashes in browser cookies (same domain)
160 "php_value[session.name]" = "WallabagPHPSESSID";
161 "php_admin_value[session.save_handler]" = "redis";
162 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Wallabag:'";
163 "php_admin_value[open_basedir]" = "/run/wrappers/bin/sendmail:${basedir}:/tmp";
164 "php_value[max_execution_time]" = "300";
165 };
166 };
167 monitoringPlugins = [ "http" ];
168 monitoringObjects.service = [
169 {
170 service_description = "wallabag website is running on tools.immae.eu";
171 host_name = config.hostEnv.fqdn;
172 use = "external-web-service";
173 check_command = ["check_https" "tools.immae.eu" "/wallabag/" "<title>Bienvenue sur wallabag"];
174
175 servicegroups = "webstatus-webapps";
176 _webstatus_name = "Wallabag";
177 _webstatus_url = "https://tools.immae.eu/wallabag/";
178 }
179 ];
180}
diff --git a/systems/eldiron/websites/tools/webhooks.nix b/systems/eldiron/websites/tools/webhooks.nix
new file mode 100644
index 0000000..337c8f8
--- /dev/null
+++ b/systems/eldiron/websites/tools/webhooks.nix
@@ -0,0 +1,25 @@
1{ lib, env, binEnv }:
2{
3 keys = lib.attrsets.mapAttrs' (k: v:
4 lib.nameValuePair "webapps/webhooks/${k}.php" {
5 user = "wwwrun";
6 group = "wwwrun";
7 permissions = "0400";
8 text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v;
9 keyDependencies = [ binEnv ];
10 }) env // lib.attrsets.mapAttrs' (k: v:
11 lib.nameValuePair "webapps/webhooks/${k}/index.php" {
12 user = "wwwrun";
13 group = "wwwrun";
14 permissions = "0400";
15 text = builtins.replaceStrings ["{{webhooks-bin-env}}"] [ "${binEnv}" ] v;
16 keyDependencies = [ binEnv ];
17 }) env // {
18 "webapps/webhooks" = {
19 isDir = true;
20 user = "wwwrun";
21 group = "wwwrun";
22 permissions = "0500";
23 };
24 };
25}
diff --git a/systems/eldiron/websites/tools/ympd.nix b/systems/eldiron/websites/tools/ympd.nix
new file mode 100644
index 0000000..0d8d41d
--- /dev/null
+++ b/systems/eldiron/websites/tools/ympd.nix
@@ -0,0 +1,54 @@
1{ env, config }:
2let
3 ympd = rec {
4 config = {
5 webPort = "localhost:${toString env.listenPort}";
6 host = env.mpd.host;
7 port = env.mpd.port;
8 };
9 apache = {
10 modules = [
11 "proxy_wstunnel"
12 ];
13 vhostConf = ''
14 <LocationMatch "^/mpd(?!/music.(mp3|ogg))">
15 Use LDAPConnect
16 Require ldap-group cn=users,cn=mpd,ou=services,dc=immae,dc=eu
17 </LocationMatch>
18
19 RedirectMatch permanent "^/mpd$" "/mpd/"
20 <Location "/mpd/">
21 ProxyPass http://${config.webPort}/
22 ProxyPassReverse http://${config.webPort}/
23 ProxyPreserveHost on
24 </Location>
25 <Location "/mpd/ws">
26 ProxyPass ws://${config.webPort}/ws
27 </Location>
28 <Location "/mpd/music.mp3">
29 ProxyPass unix:///run/mpd/mp3.sock|http://tools.immae.eu/mpd/mp3
30 ProxyPassReverse unix:///run/mpd/mp3.sock|http://tools.immae.eu/mpd/mp3
31 </Location>
32 <Location "/mpd/music.ogg">
33 ProxyPass unix:///run/mpd/ogg.sock|http://tools.immae.eu/mpd/ogg
34 ProxyPassReverse unix:///run/mpd/ogg.sock|http://tools.immae.eu/mpd/ogg
35 </Location>
36 '';
37 };
38 };
39in
40 ympd // {
41 monitoringPlugins = [ "http" ];
42 monitoringObjects.service = [
43 {
44 service_description = "mpd website is running on tools.immae.eu";
45 host_name = config.hostEnv.fqdn;
46 use = "external-web-service";
47 check_command = ["check_https_auth" "tools.immae.eu" "/mpd/" "<title>ympd"];
48
49 servicegroups = "webstatus-webapps";
50 _webstatus_name = "MPD (YMPD)";
51 _webstatus_url = "https://tools.immae.eu/mpd/";
52 }
53 ];
54 }
diff --git a/systems/eldiron/websites/tools/yourls.nix b/systems/eldiron/websites/tools/yourls.nix
new file mode 100644
index 0000000..9e54b0d
--- /dev/null
+++ b/systems/eldiron/websites/tools/yourls.nix
@@ -0,0 +1,118 @@
1{ env, yourls, yourls-plugins, config }:
2rec {
3 keys."webapps/tools-yourls" = {
4 user = apache.user;
5 group = apache.group;
6 permissions = "0400";
7 text = ''
8 <?php
9 define( 'YOURLS_DB_USER', '${env.mysql.user}' );
10 define( 'YOURLS_DB_PASS', '${env.mysql.password}' );
11 define( 'YOURLS_DB_NAME', '${env.mysql.database}' );
12 define( 'YOURLS_DB_HOST', '${env.mysql.host}' );
13 define( 'YOURLS_DB_PREFIX', 'yourls_' );
14 define( 'YOURLS_SITE', 'https://tools.immae.eu/url' );
15 define( 'YOURLS_HOURS_OFFSET', 0 );
16 define( 'YOURLS_LANG', ''' );
17 define( 'YOURLS_UNIQUE_URLS', true );
18 define( 'YOURLS_PRIVATE', true );
19 define( 'YOURLS_COOKIEKEY', '${env.cookieKey}' );
20 $yourls_user_passwords = array();
21 define( 'YOURLS_DEBUG', false );
22 define( 'YOURLS_URL_CONVERT', 36 );
23 $yourls_reserved_URL = array();
24 define( 'LDAPAUTH_HOST', 'ldaps://${env.ldap.host}' );
25 define( 'LDAPAUTH_PORT', '636' );
26 define( 'LDAPAUTH_BASE', '${env.ldap.base}' );
27 define( 'LDAPAUTH_SEARCH_USER', '${env.ldap.dn}' );
28 define( 'LDAPAUTH_SEARCH_PASS', '${env.ldap.password}' );
29
30 define( 'LDAPAUTH_GROUP_ATTR', 'memberof' );
31 define( 'LDAPAUTH_GROUP_REQ', 'cn=admin,cn=yourls,ou=services,dc=immae,dc=eu');
32
33 define( 'LDAPAUTH_USERCACHE_TYPE', 0);
34 '';
35 };
36 chatonsProperties = {
37 file.datetime = "2022-08-27T18:00:00";
38 service = {
39 name = "Yourls";
40 description = "Your own URL shortener";
41 website = "https://tools.immae.eu/url/admin/";
42 logo = "https://tools.immae.eu/url/images/favicon.gif";
43 status.level = "OK";
44 status.description = "OK";
45 registration."" = ["MEMBER" "CLIENT"];
46 registration.load = "FULL";
47 install.type = "PACKAGE";
48 };
49 software = {
50 name = "YOURLS";
51 website = "http://yourls.org/";
52 license.url = "https://github.com/YOURLS/YOURLS/blob/master/LICENSE";
53 license.name = "MIT License";
54 version = webRoot.version;
55 source.url = "https://github.com/YOURLS/YOURLS";
56 modules = map (a: a.pluginName) webRoot.plugins;
57 };
58 };
59 webRoot = (yourls.override { yourls_config = config.secrets.fullPaths."webapps/tools-yourls"; }).withPlugins (p: [p.ldap]);
60 apache = rec {
61 user = "wwwrun";
62 group = "wwwrun";
63 modules = [ "proxy_fcgi" ];
64 root = webRoot;
65 vhostConf = socket: ''
66 Alias /url "${root}"
67 <Directory "${root}">
68 <FilesMatch "\.php$">
69 SetHandler "proxy:unix:${socket}|fcgi://localhost"
70 </FilesMatch>
71
72 AllowOverride None
73 Require all granted
74 <IfModule mod_rewrite.c>
75 RewriteEngine On
76 RewriteBase /url/
77 RewriteCond %{REQUEST_FILENAME} !-f
78 RewriteCond %{REQUEST_FILENAME} !-d
79 RewriteRule ^.*$ /url/yourls-loader.php [L]
80 </IfModule>
81 DirectoryIndex index.php
82 </Directory>
83 '';
84 };
85 phpFpm = rec {
86 serviceDeps = [ "mysql.service" "openldap.service" ];
87 basedir = builtins.concatStringsSep ":" (
88 [ webRoot config.secrets.fullPaths."webapps/tools-yourls" ]
89 ++ webRoot.plugins);
90 pool = {
91 "listen.owner" = apache.user;
92 "listen.group" = apache.group;
93 "pm" = "ondemand";
94 "pm.max_children" = "60";
95 "pm.process_idle_timeout" = "60";
96
97 # Needed to avoid clashes in browser cookies (same domain)
98 "php_value[session.name]" = "YourlsPHPSESSID";
99 "php_admin_value[session.save_handler]" = "redis";
100 "php_admin_value[session.save_path]" = "'unix:///run/redis-php-sessions/redis.sock?persistent=1&prefix=Tools:Yourls:'";
101 "php_admin_value[open_basedir]" = "${basedir}:/tmp";
102 };
103 };
104 monitoringPlugins = [ "http" ];
105 monitoringObjects.service = [
106 {
107 service_description = "yourl website is running on tools.immae.eu";
108 host_name = config.hostEnv.fqdn;
109 use = "external-web-service";
110 check_command = ["check_https" "tools.immae.eu" "/url/admin/" "<title>YOURLS"];
111
112 servicegroups = "webstatus-webapps";
113 _webstatus_name = "YOURLS";
114 _webstatus_url = "https://tools.immae.eu/url/admin/";
115 }
116
117 ];
118}
diff --git a/systems/eldiron/websites/visio/default.nix b/systems/eldiron/websites/visio/default.nix
new file mode 100644
index 0000000..76d1960
--- /dev/null
+++ b/systems/eldiron/websites/visio/default.nix
@@ -0,0 +1,63 @@
1{ lib, pkgs, config, ... }:
2let
3 port = config.myEnv.ports.galene_port;
4 cfg = config.myServices.websites.tools.visio;
5in {
6 options.myServices.websites.tools.visio = {
7 enable = lib.mkEnableOption "enable visio website";
8 };
9
10 config = lib.mkIf cfg.enable {
11 myServices.dns.zones."immae.eu".subdomains.visio =
12 with config.myServices.dns.helpers; ips servers.eldiron.ips.main;
13
14 myServices.chatonsProperties.services.galene = {
15 file.datetime = "2022-08-21T22:45:00";
16 service = {
17 name = "Galene";
18 description = "The Galène videoconference server";
19 website = "https://visio.immae.eu/";
20 status.level = "OK";
21 status.description = "OK";
22 registration."" = ["NONE"];
23 registration.load = "OPEN";
24 install.type = "PACKAGE";
25 };
26 software = {
27 name = "Galene";
28 website = "https://galene.org/";
29 license.url = "https://github.com/jech/galene/blob/master/LICENCE";
30 license.name = "MIT License";
31 version = pkgs.galene.version;
32 source.url = "https://github.com/jech/galene";
33 };
34 };
35 services.galene = {
36 enable = true;
37 httpPort = port;
38 insecure = true;
39 # hack to bypass module's limitations
40 dataDir = "/var/lib/galene/data -http localhost:${builtins.toString port}";
41 };
42 systemd.services.galene.serviceConfig.RestrictAddressFamilies = lib.mkForce [ "AF_INET" "AF_INET6" "AF_NETLINK" ];
43 security.acme.certs.eldiron.extraDomainNames = [ "visio.immae.eu" ];
44 services.websites.env.tools.vhostConfs.visio = {
45 certName = "eldiron";
46 hosts = ["visio.immae.eu" ];
47 root = null;
48 extraConfig = [
49 ''
50 ProxyPass /ws ws://localhost:${builtins.toString port}/ws
51 ProxyPassReverse /ws ws://localhost:${builtins.toString port}/ws
52
53 ProxyPass / http://localhost:${builtins.toString port}/
54 ProxyPassReverse / http://localhost:${builtins.toString port}/
55
56 ProxyPreserveHost On
57 ''
58 ];
59 };
60
61 };
62}
63
diff --git a/systems/eldiron/websites/vpn/default.nix b/systems/eldiron/websites/vpn/default.nix
new file mode 100644
index 0000000..ea54691
--- /dev/null
+++ b/systems/eldiron/websites/vpn/default.nix
@@ -0,0 +1,13 @@
1{ lib, pkgs, config, ... }:
2let
3 cfg = config.myServices.vpn;
4in {
5 config = lib.mkIf cfg.enable {
6 security.acme.certs.eldiron.extraDomainNames = [ "vpn.immae.eu" ];
7 services.websites.env.tools.vhostConfs.vpn = {
8 certName = "eldiron";
9 hosts = [ "vpn.immae.eu" ];
10 root = ./www;
11 };
12 };
13}
diff --git a/systems/eldiron/websites/vpn/www/index.html b/systems/eldiron/websites/vpn/www/index.html
new file mode 100644
index 0000000..fc2618a
--- /dev/null
+++ b/systems/eldiron/websites/vpn/www/index.html
@@ -0,0 +1,91 @@
1<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
2"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
3<html xmlns="http://www.w3.org/1999/xhtml">
4 <head>
5 <title>VPN configuration</title>
6 <meta content='text/html; charset=UTF-8' http-equiv='Content-Type'>
7 <link rel="stylesheet" href="style.css" type="text/css" />
8 <meta name="viewport" content="width=device-width, initial-scale=1" />
9 </head>
10 <body>
11 <div class="instructions">
12 <h2>Installation</h2>
13 <ul>
14 <li>Installer tinc</li>
15 <li>Créer un fichier /etc/tinc/Immae/tinc.conf sur ce modèle, en remplaçant la ligne <code>A choisir</code> par un nom de la forme DomaineMachine. La machine sera accessible par <code>machine.domaine.immae.eu</code> par la suite
16<pre>
17Name = A choisir
18Mode = switch
19Interface = vpn6
20ConnectTo = ImmaeEu
21
22# The tap device tinc will use.
23# Default is /dev/tap0 for ethertap or FreeBSD,
24# /dev/tun0 for Solaris and OpenBSD,
25# and /dev/net/tun for Linux tun/tap device.
26Device = /dev/net/tun
27LocalDiscovery = yes
28</pre>
29 </li>
30 <li>Vérifier l'existence du device indiqué à la ligne "<code>Device</code>" dans le système.
31 <pre>ls /dev/net/tun</pre>
32 </li>
33 <li><em class="important">Si tinc tourne déjà, l'arrêter !!</em></li>
34 <li>Générer les clés&nbsp;:
35 <pre>tincd -K -n Immae</pre>
36 Stocker la clé privée dans <code>/etc/tinc/Immae/rsa_key.priv</code> et la clé publique dans un autre dossier<br />
37 (<em>pas <code>/etc/tinc/Immae/hosts/</code> comme proposé par défaut</em>).<br />
38 L'endroit importe peu, elle ne sera pas conservée.</li>
39 <li>M'envoyer le nom choisi dans <code>tinc.conf</code>, et la clé publique</li>
40 <li>Cloner le dépôt des hôtes du réseau
41<pre>
42cd /etc/tinc/Immae
43git clone https://git.immae.eu/perso/Immae/Config/tinc/hosts
44</pre>
45 </li>
46 <li>Une fois que j'ai confirmé avoir reçu la clé&nbsp;:
47<pre>
48cd /etc/tinc/Immae/hosts
49git pull origin master
50</pre>
51 </li>
52 <li>Uniquement pour Debian/Ubuntu: Ajouter <code>Immae</code> dans <code>/etc/tinc/nets.boot</code> (créer le fichier si nécessaire).</li>
53 <li>Selon le système, démarrer tinc&nbsp;:
54<pre>
55/etc/init.d/tinc start
56</pre>
57 ou
58<pre>
59systemctl enable tincd@Immae.service
60systemctl start tincd@Immae.service
61</pre>
62 </li>
63 </ul>
64
65 <h2>Choix d'ip</h2>
66 <ul>
67 <li>Choisir une ip : <code>2001:aaaa:b:cccc:d::xxxx:yyyy/96</code> (le préfixe <code>2001:aaaa:b:cccc:d</code> est imposé). Choix uniquement sur le <code>yyyy</code> (n'importe quel nombre entre <code>1</code> et <code>ffff</code>), le <code>xxxx</code> est dépendant du domaine</li>
68 <li>M'envoyer le choix de l'ip</li>
69
70 <li>Si on veut éviter de passer systématiquement par le serveur immae.eu (Par
71 défaut linux préfère l'ipv6 dès qu'il en a possibilité), modifier le fichier
72 <code>/etc/gai.conf</code>. Quelques lignes à décommenter, tout est déjà dans le fichier :
73<pre>
74(...)
75#
76precedence ::1/128 50
77precedence ::/0 40
78precedence 2002::/16 30
79precedence ::/96 20
80#precedence ::ffff:0:0/96 10
81#
82# For sites which prefer IPv4 connections change the last line to
83#
84precedence ::ffff:0:0/96 100
85(...)
86</pre>
87 </li>
88 </ul>
89 </div>
90 </body>
91</html>
diff --git a/systems/eldiron/websites/vpn/www/style.css b/systems/eldiron/websites/vpn/www/style.css
new file mode 100644
index 0000000..b177fec
--- /dev/null
+++ b/systems/eldiron/websites/vpn/www/style.css
@@ -0,0 +1,61 @@
1* {
2 margin:0;
3 padding:0;
4 -webkit-box-sizing:border-box;
5 -moz-box-sizing:border-box;
6 box-sizing: border-box;
7}
8
9html {
10 min-height:100%;
11 border-top:10px solid #ECEEF1;
12 border-bottom:10px solid #ECEEF1;
13 color:#61666c;
14 font-weight:400;
15 font-size:1em;
16 font-family:'Open Sans', sans-serif;
17 line-height:2em;
18}
19body {
20 padding:20px;
21 -webkit-backface-visibility:hidden;
22}
23code {
24 font-family:consolas,monospace;
25}
26a {
27 color:#61666c;
28 text-decoration:none;
29}
30a, img {
31 border:none;
32 outline:none
33}
34a:hover {
35 color:#2a2a2a;
36}
37
38.instructions {
39 margin:0 auto;
40 padding-top:20px;
41 max-width:80%;
42}
43
44.instructions a {
45 text-decoration: underline;
46}
47
48.instructions h2 {
49 margin-top: 10px;
50}
51.instructions em.important:before {
52 content: "⚠ Important ⚠ ";
53 color: red;
54}
55.instructions pre {
56 width: 50em;
57 padding: 10px 15px;
58 display: table;
59 border: 1px inset black;
60 line-height: 1em;
61}
diff --git a/systems/eldiron/webstats/default.nix b/systems/eldiron/webstats/default.nix
new file mode 100644
index 0000000..0057f64
--- /dev/null
+++ b/systems/eldiron/webstats/default.nix
@@ -0,0 +1,80 @@
1{ lib, pkgs, config, ... }:
2let
3 name = "goaccess";
4 cfg = config.services.webstats;
5in {
6 options.services.webstats = {
7 dataDir = lib.mkOption {
8 type = lib.types.path;
9 default = "/var/lib/${name}";
10 description = ''
11 The directory where Goaccess stores its data.
12 '';
13 };
14 sites = lib.mkOption {
15 type = lib.types.listOf (lib.types.submodule {
16 options = {
17 conf = lib.mkOption {
18 type = lib.types.nullOr lib.types.path;
19 default = null;
20 description = ''
21 use custom goaccess configuration file instead of the
22 default one.
23 '';
24 };
25 name = lib.mkOption {
26 type = lib.types.str;
27 description = ''
28 Domain name. Corresponds to the Apache file name and the
29 folder name in which the state will be saved.
30 '';
31 };
32 };
33 });
34 default = [];
35 description = "Sites to generate stats";
36 };
37 };
38
39 config = lib.mkIf (builtins.length cfg.sites > 0) {
40 environment.systemPackages = [
41 pkgs.goaccess
42 ];
43
44 services.cron = {
45 enable = true;
46 systemCronJobs = let
47 stats = domain: conf: let
48 config = if builtins.isNull conf
49 then pkgs.runCommand "goaccess.conf" {
50 dbPath = "${cfg.dataDir}/${domain}";
51 } "substituteAll ${./goaccess.conf} $out"
52 else conf;
53 d = pkgs.writeScriptBin "stats-${domain}" ''
54 #!${pkgs.stdenv.shell}
55 set -e
56 shopt -s nullglob
57 TMPFILE=$(mktemp)
58 trap "rm -f $TMPFILE" EXIT
59
60 mkdir -p ${cfg.dataDir}/${domain}
61 for i in /var/log/httpd/access-${domain}*.gz /var/log/httpd/*/access-${domain}*.gz; do
62 zcat "$i" >> $TMPFILE
63 done
64 cat /var/log/httpd/*access-${domain}.log /var/log/httpd/*/access-${domain}.log > $TMPFILE
65 ${pkgs.goaccess}/bin/goaccess $TMPFILE --no-progress -o ${cfg.dataDir}/${domain}/index.html -p ${config}
66 '';
67 in "${d}/bin/stats-${domain}";
68 allStats = sites: pkgs.writeScript "stats" ''
69 #!${pkgs.stdenv.shell}
70
71 mkdir -p ${cfg.dataDir}
72 ${builtins.concatStringsSep "\n" (map (v: stats v.name v.conf) sites)}
73 '';
74 in
75 [
76 "5 0 * * * root ${allStats cfg.sites}"
77 ];
78 };
79 };
80}
diff --git a/systems/eldiron/webstats/goaccess.conf b/systems/eldiron/webstats/goaccess.conf
new file mode 100644
index 0000000..c6c244a
--- /dev/null
+++ b/systems/eldiron/webstats/goaccess.conf
@@ -0,0 +1,100 @@
1time-format %H:%M:%S
2date-format %d/%b/%Y
3
4log-format VCOMBINED
5#= %v:%^ %h %^[%d:%t %^] "%r" %s %b "%R" "%u"
6
7html-prefs {"theme":"bright","layout":"vertical"}
8
9# old
10exclude-ip 188.165.209.148
11exclude-ip 178.33.252.96
12exclude-ip 2001:41d0:2:9c94::1
13exclude-ip 2001:41d0:2:9c94::
14# eldiron
15exclude-ip 176.9.151.89
16exclude-ip 2a01:4f8:160:3445::
17# monitoring-1
18exclude-ip 95.216.164.150
19exclude-ip 2a01:4f9:c010:1c95::
20
21no-query-string true
22
23persist true
24restore true
25db-path @dbPath@
26
27ignore-panel REFERRERS
28ignore-panel KEYPHRASES
29
30static-file .css
31static-file .js
32static-file .jpg
33static-file .png
34static-file .gif
35static-file .ico
36static-file .jpeg
37static-file .pdf
38static-file .csv
39static-file .mpeg
40static-file .mpg
41static-file .swf
42static-file .woff
43static-file .woff2
44static-file .xls
45static-file .xlsx
46static-file .doc
47static-file .docx
48static-file .ppt
49static-file .pptx
50static-file .txt
51static-file .zip
52static-file .ogg
53static-file .mp3
54static-file .mp4
55static-file .exe
56static-file .iso
57static-file .gz
58static-file .rar
59static-file .svg
60static-file .bmp
61static-file .tar
62static-file .tgz
63static-file .tiff
64static-file .tif
65static-file .ttf
66static-file .flv
67#static-file .less
68#static-file .ac3
69#static-file .avi
70#static-file .bz2
71#static-file .class
72#static-file .cue
73#static-file .dae
74#static-file .dat
75#static-file .dts
76#static-file .ejs
77#static-file .eot
78#static-file .eps
79#static-file .img
80#static-file .jar
81#static-file .map
82#static-file .mid
83#static-file .midi
84#static-file .ogv
85#static-file .webm
86#static-file .mkv
87#static-file .odp
88#static-file .ods
89#static-file .odt
90#static-file .otf
91#static-file .pict
92#static-file .pls
93#static-file .ps
94#static-file .qt
95#static-file .rm
96#static-file .svgz
97#static-file .wav
98#static-file .webp
99
100
diff --git a/systems/monitoring-1/base.nix b/systems/monitoring-1/base.nix
new file mode 100644
index 0000000..8bfacc1
--- /dev/null
+++ b/systems/monitoring-1/base.nix
@@ -0,0 +1,75 @@
1{ config, pkgs, lib, nixpkgs, php, secrets, ... }:
2{
3 # ssh-keyscan monitoring-1 | nix-shell -p ssh-to-age --run ssh-to-age
4 secrets.ageKeys = [ "age1dn4lzhgxusqrpjjnzm7w8ml39ptf326htuzmpqdqs2gg3wq7cqzqxuvx8k" ];
5 boot.kernelPackages = pkgs.linuxPackages_latest;
6
7 imports = [
8 secrets.nixosModules.users-config-monitoring-1
9 (nixpkgs + "/nixos/modules/profiles/qemu-guest.nix")
10 ./monitoring-master.nix
11 ./monitoring.nix
12 ./status.nix
13 ./status_engine.nix
14 ];
15
16 nixpkgs.overlays = builtins.attrValues php.overlays;
17 nixpkgs.config.permittedInsecurePackages = [
18 "python-2.7.18.6" # for nagios-cli
19 ];
20
21 myServices.monitoring.enable = true;
22 myServices.monitoring.master = true;
23 myServices.status.enable = true;
24 networking = {
25 firewall.enable = true;
26 interfaces."ens3".ipv4.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
27 (n: ips: map (ip: { address = ip; prefixLength = 32; }) (ips.ip4 or []))
28 (pkgs.lib.attrsets.filterAttrs (n: v: n != "main") config.hostEnv.ips));
29 interfaces."ens3".ipv6.addresses = pkgs.lib.flatten (pkgs.lib.attrsets.mapAttrsToList
30 (n: ips: map (ip: { address = ip; prefixLength = (if n == "main" && ip == pkgs.lib.head ips.ip6 then 64 else 128); }) (ips.ip6 or []))
31 config.hostEnv.ips);
32 defaultGateway6 = { address = "fe80::1"; interface = "ens3"; };
33 };
34 boot.loader.grub.device = "nodev";
35 fileSystems."/" = { device = "/dev/sda1"; fsType = "ext4"; };
36 myServices.mailRelay.enable = true;
37
38 security.pki.certificateFiles = [
39 (pkgs.fetchurl {
40 url = "http://downloads.e.eriomem.net/eriomemca.pem";
41 sha256 = "1ixx4c6j3m26j8dp9a3dkvxc80v1nr5aqgmawwgs06bskasqkvvh";
42 })
43 ];
44
45 services.netdata.enable = true;
46 services.netdata.configDir."stream.conf" = config.secrets.fullPaths."netdata-stream.conf";
47 services.netdata.config.web."allow dashboard from" = "localhost";
48 services.netdata.config.web."allow badges from" = "*";
49 services.netdata.config.web."allow streaming from" = "*";
50 services.netdata.config.web."allow netdata.conf from" = "fd*";
51 services.netdata.config.web."allow management from" = "fd*";
52 networking.firewall.allowedTCPPorts = [ 19999 ];
53
54 secrets.keys = {
55 "netdata-stream.conf" = {
56 user = config.services.netdata.user;
57 group = config.services.netdata.group;
58 permissions = "0400";
59 text = builtins.concatStringsSep "\n" (pkgs.lib.mapAttrsToList (_: key: ''
60 [${key}]
61 enabled = yes
62 default history = 3600
63 default memory = ram
64 health enabled by default = auto
65 '') config.myEnv.monitoring.netdata_keys);
66 };
67 };
68 users.users."${config.services.netdata.user}".extraGroups = [ "keys" ];
69 # This value determines the NixOS release with which your system is
70 # to be compatible, in order to avoid breaking some software such as
71 # database servers. You should change this only after NixOS release
72 # notes say you should.
73 # https://nixos.org/nixos/manual/release-notes.html
74 system.stateVersion = "23.05"; # Did you read the comment?
75}
diff --git a/systems/monitoring-1/flake.lock b/systems/monitoring-1/flake.lock
new file mode 100644
index 0000000..d4a2c8d
--- /dev/null
+++ b/systems/monitoring-1/flake.lock
@@ -0,0 +1,790 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_3",
6 "nixpkgs": "nixpkgs_7"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "chatons": {
20 "inputs": {
21 "environment": "environment"
22 },
23 "locked": {
24 "lastModified": 1,
25 "narHash": "sha256-UNkS/IZGHCdSX4hCzpTZwNBj9B8RGCMr9Za+G9Xdm4Y=",
26 "path": "../../flakes/private/chatons",
27 "type": "path"
28 },
29 "original": {
30 "path": "../../flakes/private/chatons",
31 "type": "path"
32 }
33 },
34 "colmena": {
35 "inputs": {
36 "flake-compat": "flake-compat",
37 "flake-utils": "flake-utils",
38 "nixpkgs": "nixpkgs",
39 "stable": "stable"
40 },
41 "locked": {
42 "lastModified": 1687954574,
43 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
44 "owner": "immae",
45 "repo": "colmena",
46 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
47 "type": "github"
48 },
49 "original": {
50 "owner": "immae",
51 "ref": "add-lib-get-flake",
52 "repo": "colmena",
53 "type": "github"
54 }
55 },
56 "disko": {
57 "inputs": {
58 "nixpkgs": "nixpkgs_2"
59 },
60 "locked": {
61 "lastModified": 1687968164,
62 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
63 "owner": "nix-community",
64 "repo": "disko",
65 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
66 "type": "github"
67 },
68 "original": {
69 "owner": "nix-community",
70 "repo": "disko",
71 "type": "github"
72 }
73 },
74 "environment": {
75 "locked": {
76 "lastModified": 1,
77 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
78 "path": "../environment",
79 "type": "path"
80 },
81 "original": {
82 "path": "../environment",
83 "type": "path"
84 }
85 },
86 "environment_2": {
87 "locked": {
88 "lastModified": 1,
89 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
90 "path": "../../flakes/private/environment",
91 "type": "path"
92 },
93 "original": {
94 "path": "../../flakes/private/environment",
95 "type": "path"
96 }
97 },
98 "environment_3": {
99 "locked": {
100 "lastModified": 1,
101 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
102 "path": "../environment",
103 "type": "path"
104 },
105 "original": {
106 "path": "../environment",
107 "type": "path"
108 }
109 },
110 "environment_4": {
111 "locked": {
112 "lastModified": 1,
113 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
114 "path": "../environment",
115 "type": "path"
116 },
117 "original": {
118 "path": "../environment",
119 "type": "path"
120 }
121 },
122 "environment_5": {
123 "locked": {
124 "lastModified": 1,
125 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
126 "path": "../environment",
127 "type": "path"
128 },
129 "original": {
130 "path": "../environment",
131 "type": "path"
132 }
133 },
134 "files-watcher": {
135 "locked": {
136 "lastModified": 1,
137 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
138 "path": "../../flakes/files-watcher",
139 "type": "path"
140 },
141 "original": {
142 "path": "../../flakes/files-watcher",
143 "type": "path"
144 }
145 },
146 "flake-compat": {
147 "flake": false,
148 "locked": {
149 "lastModified": 1650374568,
150 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
151 "owner": "edolstra",
152 "repo": "flake-compat",
153 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
154 "type": "github"
155 },
156 "original": {
157 "owner": "edolstra",
158 "repo": "flake-compat",
159 "type": "github"
160 }
161 },
162 "flake-parts": {
163 "inputs": {
164 "nixpkgs-lib": "nixpkgs-lib_2"
165 },
166 "locked": {
167 "lastModified": 1687762428,
168 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
169 "owner": "hercules-ci",
170 "repo": "flake-parts",
171 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
172 "type": "github"
173 },
174 "original": {
175 "owner": "hercules-ci",
176 "repo": "flake-parts",
177 "type": "github"
178 }
179 },
180 "flake-parts_2": {
181 "inputs": {
182 "nixpkgs-lib": "nixpkgs-lib_3"
183 },
184 "locked": {
185 "lastModified": 1675295133,
186 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
187 "owner": "hercules-ci",
188 "repo": "flake-parts",
189 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
190 "type": "github"
191 },
192 "original": {
193 "owner": "hercules-ci",
194 "repo": "flake-parts",
195 "type": "github"
196 }
197 },
198 "flake-utils": {
199 "locked": {
200 "lastModified": 1659877975,
201 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
202 "owner": "numtide",
203 "repo": "flake-utils",
204 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
205 "type": "github"
206 },
207 "original": {
208 "owner": "numtide",
209 "repo": "flake-utils",
210 "type": "github"
211 }
212 },
213 "flake-utils_2": {
214 "locked": {
215 "lastModified": 1648297722,
216 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
217 "owner": "numtide",
218 "repo": "flake-utils",
219 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
220 "type": "github"
221 },
222 "original": {
223 "owner": "numtide",
224 "repo": "flake-utils",
225 "type": "github"
226 }
227 },
228 "flake-utils_3": {
229 "locked": {
230 "lastModified": 1667395993,
231 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
232 "owner": "numtide",
233 "repo": "flake-utils",
234 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
235 "type": "github"
236 },
237 "original": {
238 "owner": "numtide",
239 "repo": "flake-utils",
240 "type": "github"
241 }
242 },
243 "loginctl-linger": {
244 "locked": {
245 "lastModified": 1,
246 "narHash": "sha256-TLlUOhiQzYo6SwH0E3oPCDfhgW249qPZTlVar1VmpKw=",
247 "path": "../../flakes/loginctl-linger",
248 "type": "path"
249 },
250 "original": {
251 "path": "../../flakes/loginctl-linger",
252 "type": "path"
253 }
254 },
255 "mail-relay": {
256 "inputs": {
257 "environment": "environment_3",
258 "secrets": "secrets"
259 },
260 "locked": {
261 "lastModified": 1,
262 "narHash": "sha256-xISja892g6YTu9YjGwaD36BBWi/1+IcuREw6iUDqfVw=",
263 "path": "../../flakes/private/mail-relay",
264 "type": "path"
265 },
266 "original": {
267 "path": "../../flakes/private/mail-relay",
268 "type": "path"
269 }
270 },
271 "monitoring": {
272 "inputs": {
273 "environment": "environment_4",
274 "naemon": "naemon",
275 "nixpkgs-lib": "nixpkgs-lib",
276 "secrets": "secrets_2"
277 },
278 "locked": {
279 "lastModified": 1,
280 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
281 "path": "../../flakes/private/monitoring",
282 "type": "path"
283 },
284 "original": {
285 "path": "../../flakes/private/monitoring",
286 "type": "path"
287 }
288 },
289 "my-lib": {
290 "inputs": {
291 "colmena": "colmena",
292 "disko": "disko",
293 "flake-parts": "flake-parts",
294 "nixos-anywhere": "nixos-anywhere",
295 "nixpkgs": "nixpkgs_4"
296 },
297 "locked": {
298 "lastModified": 1,
299 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
300 "path": "../../flakes/lib",
301 "type": "path"
302 },
303 "original": {
304 "path": "../../flakes/lib",
305 "type": "path"
306 }
307 },
308 "mypackages": {
309 "inputs": {
310 "flake-parts": "flake-parts_2",
311 "nixpkgs": "nixpkgs_8",
312 "webapps-ttrss": "webapps-ttrss"
313 },
314 "locked": {
315 "lastModified": 1,
316 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
317 "path": "../../mypackages",
318 "type": "path"
319 },
320 "original": {
321 "path": "../../mypackages",
322 "type": "path"
323 }
324 },
325 "myuids": {
326 "locked": {
327 "lastModified": 1,
328 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
329 "path": "../../flakes/myuids",
330 "type": "path"
331 },
332 "original": {
333 "path": "../../flakes/myuids",
334 "type": "path"
335 }
336 },
337 "myuids_2": {
338 "locked": {
339 "lastModified": 1,
340 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
341 "path": "../../myuids",
342 "type": "path"
343 },
344 "original": {
345 "path": "../../myuids",
346 "type": "path"
347 }
348 },
349 "naemon": {
350 "locked": {
351 "lastModified": 1,
352 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
353 "path": "../../naemon",
354 "type": "path"
355 },
356 "original": {
357 "path": "../../naemon",
358 "type": "path"
359 }
360 },
361 "nixos-2305": {
362 "locked": {
363 "lastModified": 1687938137,
364 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
365 "owner": "NixOS",
366 "repo": "nixpkgs",
367 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
368 "type": "github"
369 },
370 "original": {
371 "owner": "NixOS",
372 "ref": "release-23.05",
373 "repo": "nixpkgs",
374 "type": "github"
375 }
376 },
377 "nixos-anywhere": {
378 "inputs": {
379 "disko": [
380 "my-lib",
381 "disko"
382 ],
383 "flake-parts": [
384 "my-lib",
385 "flake-parts"
386 ],
387 "nixos-2305": "nixos-2305",
388 "nixos-images": "nixos-images",
389 "nixpkgs": "nixpkgs_3",
390 "treefmt-nix": "treefmt-nix"
391 },
392 "locked": {
393 "lastModified": 1689945193,
394 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
395 "owner": "numtide",
396 "repo": "nixos-anywhere",
397 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
398 "type": "github"
399 },
400 "original": {
401 "owner": "numtide",
402 "repo": "nixos-anywhere",
403 "type": "github"
404 }
405 },
406 "nixos-images": {
407 "inputs": {
408 "nixos-2305": [
409 "my-lib",
410 "nixos-anywhere",
411 "nixos-2305"
412 ],
413 "nixos-unstable": [
414 "my-lib",
415 "nixos-anywhere",
416 "nixpkgs"
417 ]
418 },
419 "locked": {
420 "lastModified": 1686819168,
421 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
422 "owner": "nix-community",
423 "repo": "nixos-images",
424 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
425 "type": "github"
426 },
427 "original": {
428 "owner": "nix-community",
429 "repo": "nixos-images",
430 "type": "github"
431 }
432 },
433 "nixpkgs": {
434 "locked": {
435 "lastModified": 1683408522,
436 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
437 "owner": "NixOS",
438 "repo": "nixpkgs",
439 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
440 "type": "github"
441 },
442 "original": {
443 "owner": "NixOS",
444 "ref": "nixos-unstable",
445 "repo": "nixpkgs",
446 "type": "github"
447 }
448 },
449 "nixpkgs-4": {
450 "flake": false,
451 "locked": {
452 "lastModified": 1646497237,
453 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
454 "owner": "NixOS",
455 "repo": "nixpkgs",
456 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
457 "type": "github"
458 },
459 "original": {
460 "owner": "NixOS",
461 "repo": "nixpkgs",
462 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
463 "type": "github"
464 }
465 },
466 "nixpkgs-lib": {
467 "locked": {
468 "dir": "lib",
469 "lastModified": 1691269286,
470 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
471 "owner": "NixOS",
472 "repo": "nixpkgs",
473 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
474 "type": "github"
475 },
476 "original": {
477 "dir": "lib",
478 "owner": "NixOS",
479 "repo": "nixpkgs",
480 "type": "github"
481 }
482 },
483 "nixpkgs-lib_2": {
484 "locked": {
485 "dir": "lib",
486 "lastModified": 1685564631,
487 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
488 "owner": "NixOS",
489 "repo": "nixpkgs",
490 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
491 "type": "github"
492 },
493 "original": {
494 "dir": "lib",
495 "owner": "NixOS",
496 "ref": "nixos-unstable",
497 "repo": "nixpkgs",
498 "type": "github"
499 }
500 },
501 "nixpkgs-lib_3": {
502 "locked": {
503 "dir": "lib",
504 "lastModified": 1675183161,
505 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
506 "owner": "NixOS",
507 "repo": "nixpkgs",
508 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
509 "type": "github"
510 },
511 "original": {
512 "dir": "lib",
513 "owner": "NixOS",
514 "ref": "nixos-unstable",
515 "repo": "nixpkgs",
516 "type": "github"
517 }
518 },
519 "nixpkgs_2": {
520 "locked": {
521 "lastModified": 1687701825,
522 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
523 "owner": "NixOS",
524 "repo": "nixpkgs",
525 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
526 "type": "github"
527 },
528 "original": {
529 "owner": "NixOS",
530 "ref": "nixpkgs-unstable",
531 "repo": "nixpkgs",
532 "type": "github"
533 }
534 },
535 "nixpkgs_3": {
536 "locked": {
537 "lastModified": 1687893427,
538 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
539 "owner": "nixos",
540 "repo": "nixpkgs",
541 "rev": "4b14ab2a916508442e685089672681dff46805be",
542 "type": "github"
543 },
544 "original": {
545 "owner": "nixos",
546 "ref": "nixos-unstable-small",
547 "repo": "nixpkgs",
548 "type": "github"
549 }
550 },
551 "nixpkgs_4": {
552 "locked": {
553 "lastModified": 1648725829,
554 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
555 "owner": "NixOS",
556 "repo": "nixpkgs",
557 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
558 "type": "github"
559 },
560 "original": {
561 "owner": "NixOS",
562 "repo": "nixpkgs",
563 "type": "github"
564 }
565 },
566 "nixpkgs_5": {
567 "locked": {
568 "lastModified": 1693158576,
569 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
570 "owner": "nixos",
571 "repo": "nixpkgs",
572 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
573 "type": "github"
574 },
575 "original": {
576 "owner": "nixos",
577 "ref": "nixos-unstable",
578 "repo": "nixpkgs",
579 "type": "github"
580 }
581 },
582 "nixpkgs_6": {
583 "flake": false,
584 "locked": {
585 "lastModified": 1596265691,
586 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
587 "owner": "NixOS",
588 "repo": "nixpkgs",
589 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
590 "type": "github"
591 },
592 "original": {
593 "owner": "NixOS",
594 "repo": "nixpkgs",
595 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
596 "type": "github"
597 }
598 },
599 "nixpkgs_7": {
600 "locked": {
601 "lastModified": 1687502512,
602 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
603 "owner": "NixOS",
604 "repo": "nixpkgs",
605 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
606 "type": "github"
607 },
608 "original": {
609 "owner": "NixOS",
610 "ref": "nixos-unstable",
611 "repo": "nixpkgs",
612 "type": "github"
613 }
614 },
615 "nixpkgs_8": {
616 "locked": {
617 "lastModified": 1646497237,
618 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
619 "owner": "nixos",
620 "repo": "nixpkgs",
621 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
622 "type": "github"
623 },
624 "original": {
625 "owner": "nixos",
626 "repo": "nixpkgs",
627 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
628 "type": "github"
629 }
630 },
631 "php": {
632 "inputs": {
633 "flake-utils": "flake-utils_2",
634 "nixpkgs": "nixpkgs_6",
635 "nixpkgs-4": "nixpkgs-4"
636 },
637 "locked": {
638 "lastModified": 1,
639 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
640 "path": "../../flakes/private/php",
641 "type": "path"
642 },
643 "original": {
644 "path": "../../flakes/private/php",
645 "type": "path"
646 }
647 },
648 "root": {
649 "inputs": {
650 "chatons": "chatons",
651 "environment": "environment_2",
652 "files-watcher": "files-watcher",
653 "loginctl-linger": "loginctl-linger",
654 "mail-relay": "mail-relay",
655 "monitoring": "monitoring",
656 "my-lib": "my-lib",
657 "myuids": "myuids",
658 "nixpkgs": "nixpkgs_5",
659 "php": "php",
660 "secrets": "secrets_3",
661 "system": "system"
662 }
663 },
664 "secrets": {
665 "locked": {
666 "lastModified": 1,
667 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
668 "path": "../../secrets",
669 "type": "path"
670 },
671 "original": {
672 "path": "../../secrets",
673 "type": "path"
674 }
675 },
676 "secrets-public": {
677 "locked": {
678 "lastModified": 1,
679 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
680 "path": "../../secrets",
681 "type": "path"
682 },
683 "original": {
684 "path": "../../secrets",
685 "type": "path"
686 }
687 },
688 "secrets_2": {
689 "locked": {
690 "lastModified": 1,
691 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
692 "path": "../../secrets",
693 "type": "path"
694 },
695 "original": {
696 "path": "../../secrets",
697 "type": "path"
698 }
699 },
700 "secrets_3": {
701 "locked": {
702 "lastModified": 1,
703 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
704 "path": "../../flakes/secrets",
705 "type": "path"
706 },
707 "original": {
708 "path": "../../flakes/secrets",
709 "type": "path"
710 }
711 },
712 "stable": {
713 "locked": {
714 "lastModified": 1669735802,
715 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
716 "owner": "NixOS",
717 "repo": "nixpkgs",
718 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
719 "type": "github"
720 },
721 "original": {
722 "owner": "NixOS",
723 "ref": "nixos-22.11",
724 "repo": "nixpkgs",
725 "type": "github"
726 }
727 },
728 "system": {
729 "inputs": {
730 "backports": "backports",
731 "environment": "environment_5",
732 "mypackages": "mypackages",
733 "myuids": "myuids_2",
734 "secrets-public": "secrets-public"
735 },
736 "locked": {
737 "lastModified": 1,
738 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
739 "path": "../../flakes/private/system",
740 "type": "path"
741 },
742 "original": {
743 "path": "../../flakes/private/system",
744 "type": "path"
745 }
746 },
747 "treefmt-nix": {
748 "inputs": {
749 "nixpkgs": [
750 "my-lib",
751 "nixos-anywhere",
752 "nixpkgs"
753 ]
754 },
755 "locked": {
756 "lastModified": 1687940979,
757 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
758 "owner": "numtide",
759 "repo": "treefmt-nix",
760 "rev": "0a4f06c27610a99080b69433873885df82003aae",
761 "type": "github"
762 },
763 "original": {
764 "owner": "numtide",
765 "repo": "treefmt-nix",
766 "type": "github"
767 }
768 },
769 "webapps-ttrss": {
770 "flake": false,
771 "locked": {
772 "lastModified": 1546759381,
773 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
774 "ref": "master",
775 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
776 "revCount": 9256,
777 "type": "git",
778 "url": "https://git.tt-rss.org/fox/tt-rss.git"
779 },
780 "original": {
781 "ref": "master",
782 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
783 "type": "git",
784 "url": "https://git.tt-rss.org/fox/tt-rss.git"
785 }
786 }
787 },
788 "root": "root",
789 "version": 7
790}
diff --git a/systems/monitoring-1/flake.nix b/systems/monitoring-1/flake.nix
new file mode 100644
index 0000000..e97cb05
--- /dev/null
+++ b/systems/monitoring-1/flake.nix
@@ -0,0 +1,45 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4
5 my-lib.url = "path:../../flakes/lib";
6
7 monitoring.url = "path:../../flakes/private/monitoring";
8 mail-relay.url = "path:../../flakes/private/mail-relay";
9 chatons.url = "path:../../flakes/private/chatons";
10 environment.url = "path:../../flakes/private/environment";
11 system.url = "path:../../flakes/private/system";
12 php.url = "path:../../flakes/private/php";
13
14 myuids.url = "path:../../flakes/myuids";
15 secrets.url = "path:../../flakes/secrets";
16 files-watcher.url = "path:../../flakes/files-watcher";
17 loginctl-linger.url = "path:../../flakes/loginctl-linger";
18 };
19 outputs = inputs@{ self, my-lib, nixpkgs, ...}:
20 my-lib.lib.mkColmenaFlake {
21 name = "monitoring-1";
22 inherit self nixpkgs;
23 system = "x86_64-linux";
24 targetHost = "95.216.164.150";
25 targetUser = "root";
26 nixosModules = {
27 base = ./base.nix;
28 system = inputs.system.nixosModule;
29 mail-relay = inputs.mail-relay.nixosModule;
30 chatons = inputs.chatons.nixosModule;
31 monitoring = inputs.monitoring.nixosModule;
32 environment = inputs.environment.nixosModule;
33
34 myuids = inputs.myuids.nixosModule;
35 secrets = inputs.secrets.nixosModule;
36 files-watcher = inputs.files-watcher.nixosModule;
37 loginctl-linger = inputs.loginctl-linger.nixosModule;
38 };
39 moduleArgs = {
40 nixpkgs = inputs.nixpkgs;
41 monitoring = inputs.monitoring;
42 php = inputs.php;
43 };
44 };
45}
diff --git a/systems/monitoring-1/monitoring-master.nix b/systems/monitoring-1/monitoring-master.nix
new file mode 100644
index 0000000..09319b8
--- /dev/null
+++ b/systems/monitoring-1/monitoring-master.nix
@@ -0,0 +1,87 @@
1{ config, pkgs, lib, nodes, name, monitoring, ... }:
2let
3 mlib = monitoring.lib;
4 nodesWithMonitoring = lib.filterAttrs (n: v: (v.config.myServices or {}) ? "monitoring") nodes;
5in
6{
7 imports = [
8 ./monitoring/master.nix
9 ./monitoring/phare.nix
10 ./monitoring/ulminfo-fr.nix
11 ];
12 myServices.monitoring.activatedPlugins = lib.flatten (lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterActivatedPlugins) nodesWithMonitoring);
13 myServices.monitoring.objects = lib.mkMerge (
14 lib.mapAttrsToList (_: n:
15 mlib.toMasterPassiveObject "external-passive-service" 1.5 n.config.myServices.monitoring.objects
16 ) (lib.filterAttrs (n: v: n != name) nodesWithMonitoring)
17 ++
18 lib.mapAttrsToList (_: n: n.config.myServices.monitoring.fromMasterObjects) nodesWithMonitoring
19 );
20 myServices.chatonsProperties.hostings.monitoring = {
21 file.datetime = "2022-08-27T16:00:00";
22 hosting = {
23 name = "Monitoring";
24 description = "Website and server health monitoring";
25 website = "https://status.immae.eu";
26 logo = "https://www.naemon.io/favicon.ico";
27 status.level = "OK";
28 status.description = "OK";
29 registration.load = "OPEN";
30 install.type = "PACKAGE";
31 };
32 software = {
33 name = "naemon";
34 website = "https://www.naemon.io/";
35 license.url = "https://github.com/naemon/naemon-core/blob/master/COPYING";
36 license.name = "GNU General Public License v2.0";
37 version = config.services.naemon.package.version;
38 source.url = "https://github.com/naemon/naemon-core";
39 modules = "livestatus,status-engine";
40 };
41 };
42
43 services.nginx = {
44 virtualHosts."status.immae.eu".locations = {
45 "=/common/immae.cfg" = {
46 alias = pkgs.writeText "immae.cfg" ''
47 # put me for instance in /etc/naemon/module-conf.d/immae.cfg
48 # Make sure that you have include_dir=module-conf.d in
49 # naemon.cfg
50 log_initial_states=1
51 date_format=iso8601
52 admin_email=${config.myEnv.monitoring.email}
53 obsess_over_services=1
54 ocsp_command=notify-master
55 '';
56 };
57 "=/common/resource.cfg" = {
58 alias = pkgs.writeText "resource.cfg" ''
59 # Resource.cfg file
60 # Replace this with path to monitoring plugins
61 $USER1$=@@COMMON_PLUGINS@@
62 # Replace this with a path to scripts from
63 # https://git.immae.eu/cgit/perso/Immae/Config/Nix.git/tree/modules/private/monitoring/plugins
64 $USER2$=@@IMMAE_PLUGINS@@
65 $USER200$=https://status.immae.eu/
66 $USER201$=@@TOKEN@@
67 '';
68 };
69 };
70 };
71
72 secrets.keys = lib.mapAttrs' (k: v: lib.nameValuePair "${k}_access_key" {
73 user = "naemon";
74 group = "naemon";
75 permissions = "0400";
76 text = ''
77 export AWS_ACCESS_KEY_ID="${v.accessKeyId}"
78 export AWS_SECRET_ACCESS_KEY="${v.secretAccessKey}"
79 export BASE_URL="${v.remote "immae-eldiron"}"
80 '';
81 }) config.myEnv.backup.remotes;
82
83 services.naemon.extraConfig = ''
84 broker_module=${pkgs.naemon-livestatus}/lib/naemon-livestatus/livestatus.so ${config.services.naemon.runDir}/live
85 broker_module=${pkgs.status-engine-module}/lib/status-engine/naemon/statusengine-${pkgs.naemon.status_engine_version}.o use_service_perfdata=1 use_process_data=0 use_system_command_data=0 use_external_command_data=0 use_flapping_data=0 use_program_status_data=0 use_notification_data=0 use_contact_status_data=0 use_contact_notification_data=0 use_event_handler_data=0 use_object_data=0
86 '';
87}
diff --git a/systems/monitoring-1/monitoring.nix b/systems/monitoring-1/monitoring.nix
new file mode 100644
index 0000000..421c71f
--- /dev/null
+++ b/systems/monitoring-1/monitoring.nix
@@ -0,0 +1,61 @@
1{ config, pkgs, lib, name, monitoring, ... }:
2let
3 hostFQDN = config.hostEnv.fqdn;
4 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
5in
6{
7 config.myServices.monitoring.activatedPlugins = [ "memory" "command" "bandwidth" "emails" "ovh" "notify-primary" ];
8 config.myServices.monitoring.objects = lib.mkMerge [
9 (monitoring.lib.objectsCommon {
10 inherit hostFQDN;
11 hostName = name;
12 master = true;
13 processWarn = "70"; processAlert = "80";
14 loadWarn = "4.0"; loadAlert = "5.0";
15 load15Warn = "1.0"; load15Alert = "2.0";
16 interface = builtins.head (builtins.attrNames config.networking.interfaces);
17 })
18
19 {
20 service = [
21 (emailCheck "monitoring-1" hostFQDN)
22
23 {
24 service_description = "OVH account has enough sms";
25 host_name = hostFQDN;
26 use = "external-service";
27 check_command = "check_ovh_sms";
28
29 check_interval = 120;
30 notification_interval = "1440";
31 }
32
33 # Dummy service for testing
34 # {
35 # service_description = "Dummy failing test";
36 # host_name = "dummy-host";
37 # use = "local-service";
38 # check_interval = 0.3;
39 # max_check_attempts = "1";
40 # flap_detection_enabled = "0";
41 # notification_interval = "0.1";
42 # check_command = "check_critical";
43 # }
44 ];
45
46 host = {
47 # Dummy host for testing
48 # "dummy-host" = {
49 # alias = "dummy.host";
50 # check_interval = 0.3;
51 # max_check_attempts = "1";
52 # flap_detection_enabled = "0";
53 # notification_interval = "0.1";
54 # address = "dummy.host";
55 # use = "linux-server";
56 # check_command = "check_ok";
57 # };
58 };
59 }
60 ];
61}
diff --git a/systems/monitoring-1/monitoring/master.nix b/systems/monitoring-1/monitoring/master.nix
new file mode 100644
index 0000000..c8f52ea
--- /dev/null
+++ b/systems/monitoring-1/monitoring/master.nix
@@ -0,0 +1,43 @@
1{ config, ... }:
2{
3 myServices.monitoring.objects = {
4 contact = {
5 immae = {
6 alias = "Immae";
7 email = config.myEnv.monitoring.immae_contact;
8 use = "generic-contact";
9 contactgroups = "admins";
10 host_notification_commands = "notify-host-by-email,notify-host-by-apprise!$USER210$";
11 service_notification_commands = "notify-service-by-email,notify-service-by-apprise!$USER210$";
12 };
13 };
14 command = {
15 check_passive = "$USER1$/check_dummy 3 \"Service result are stale\"";
16 };
17 templates = {
18 service = {
19 external-passive-service = {
20 active_checks_enabled = "0";
21 check_freshness = "1";
22 check_period = "24x7";
23 contact_groups = "admins";
24 event_handler_enabled = "1";
25 flap_detection_enabled = "1";
26 is_volatile = "0";
27 max_check_attempts = "3";
28 notification_interval = "60";
29 notification_options = "w,u,c,r,f,s";
30 notification_period = "24x7";
31 notifications_enabled = "1";
32 passive_checks_enabled = "1";
33 process_perf_data = "1";
34 retain_nonstatus_information = "1";
35 retain_status_information = "1";
36 retry_interval = "2";
37 check_command = "check_passive";
38 _webstatus_namespace = "immae";
39 };
40 };
41 };
42 };
43}
diff --git a/systems/monitoring-1/monitoring/phare.nix b/systems/monitoring-1/monitoring/phare.nix
new file mode 100644
index 0000000..0ce9ffe
--- /dev/null
+++ b/systems/monitoring-1/monitoring/phare.nix
@@ -0,0 +1,20 @@
1{ monitoring, config, ... }:
2let
3 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
4in
5{
6 config.myServices.monitoring.activatedPlugins = [ "emails" ];
7 config.myServices.monitoring.objects.host = {
8 "phare.normalesup.org" = {
9 alias = "phare.normalesup.org";
10 address = "phare.normalesup.org";
11 use = "linux-server";
12 hostgroups = "webstatus-hosts";
13 _webstatus_name = "phare";
14 _webstatus_vhost = "status.immae.eu";
15 };
16 };
17 config.myServices.monitoring.objects.service = [
18 (emailCheck "phare" "phare.normalesup.org")
19 ];
20}
diff --git a/systems/monitoring-1/monitoring/ulminfo-fr.nix b/systems/monitoring-1/monitoring/ulminfo-fr.nix
new file mode 100644
index 0000000..b0c6657
--- /dev/null
+++ b/systems/monitoring-1/monitoring/ulminfo-fr.nix
@@ -0,0 +1,20 @@
1{ monitoring, config, ... }:
2let
3 emailCheck = monitoring.lib.emailCheck config.myEnv.monitoring.email_check;
4in
5{
6 config.myServices.monitoring.activatedPlugins = [ "emails" ];
7 config.myServices.monitoring.objects.host = {
8 "ulminfo.fr" = {
9 alias = "ulminfo.fr";
10 address = "ulminfo.fr";
11 use = "linux-server";
12 hostgroups = "webstatus-hosts";
13 _webstatus_name = "ulminfo";
14 _webstatus_vhost = "status.immae.eu";
15 };
16 };
17 config.myServices.monitoring.objects.service = [
18 (emailCheck "ulminfo" "ulminfo.fr")
19 ];
20}
diff --git a/systems/monitoring-1/status.nix b/systems/monitoring-1/status.nix
new file mode 100644
index 0000000..8b6615f
--- /dev/null
+++ b/systems/monitoring-1/status.nix
@@ -0,0 +1,84 @@
1{ config, pkgs, lib, name, ... }:
2{
3 options = {
4 myServices.status = {
5 enable = lib.mkOption {
6 type = lib.types.bool;
7 default = false;
8 description = ''
9 Whether to enable status app.
10 '';
11 };
12 };
13 };
14 config = lib.mkIf config.myServices.status.enable {
15 secrets.keys."naemon-status/environment" = {
16 user = "naemon";
17 group = "naemon";
18 permissions = "0400";
19 text = ''
20 TOKENS=${builtins.concatStringsSep " " config.myEnv.monitoring.nrdp_tokens}
21 '';
22 };
23 services.nginx = {
24 enable = true;
25 recommendedOptimisation = true;
26 recommendedGzipSettings = true;
27 recommendedProxySettings = true;
28 upstreams."netdata".servers = { "127.0.0.1:19999" = {}; };
29 upstreams."netdata".extraConfig = ''
30 keepalive 64;
31 '';
32 virtualHosts."status.immae.eu" = {
33 acmeRoot = config.security.acme.defaults.webroot;
34 useACMEHost = name;
35 forceSSL = true;
36 locations."/".proxyPass = "http://unix:/run/naemon-status/socket.sock:/";
37
38 locations."= /netdata".return = "301 /netdata/";
39 locations."~ /netdata/(?<ndpath>.*)".extraConfig = ''
40 proxy_redirect off;
41 proxy_set_header Host $host;
42
43 proxy_set_header X-Forwarded-Host $host;
44 proxy_set_header X-Forwarded-Server $host;
45 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
46 proxy_http_version 1.1;
47 proxy_pass_request_headers on;
48 proxy_set_header Connection "keep-alive";
49 proxy_store off;
50 proxy_pass http://netdata/$ndpath$is_args$args;
51
52 gzip on;
53 gzip_proxied any;
54 gzip_types *;
55 '';
56 };
57 };
58 security.acme.certs."${name}" = {
59 extraDomainNames = [ "status.immae.eu" ];
60 group = config.services.nginx.group;
61 };
62
63 networking.firewall.allowedTCPPorts = [ 80 443 ];
64 systemd.services.naemon-status = {
65 description = "Naemon status";
66 after = [ "network.target" ];
67 wantedBy = [ "multi-user.target" ];
68
69 serviceConfig = {
70 EnvironmentFile = config.secrets.fullPaths."naemon-status/environment";
71 Type = "simple";
72 WorkingDirectory = "${./status}";
73 ExecStart = let
74 python = pkgs.python3.withPackages (p: [ p.gunicorn p.flask p.flask_login ]);
75 in
76 "${python}/bin/gunicorn -w4 --bind unix:/run/naemon-status/socket.sock app:app";
77 User = "naemon";
78 RuntimeDirectory = "naemon-status";
79 StandardOutput = "journal";
80 StandardError = "inherit";
81 };
82 };
83 };
84}
diff --git a/systems/monitoring-1/status/app.py b/systems/monitoring-1/status/app.py
new file mode 100755
index 0000000..ff92891
--- /dev/null
+++ b/systems/monitoring-1/status/app.py
@@ -0,0 +1,414 @@
1from flask import Flask, request, render_template_string, jsonify, make_response
2from flask_login import LoginManager, UserMixin, login_required
3import socket
4import json
5import time
6import os
7
8login_manager = LoginManager()
9app = Flask(__name__)
10login_manager.init_app(app)
11
12STATUS = [
13 "ok",
14 "warning",
15 "error",
16 "unknown"
17 ]
18
19HOST_STATUS = [
20 "up",
21 "down",
22 "unreachable",
23 ]
24
25#### Push
26AUTHORIZED_KEYS = os.environ.get("TOKENS", "").split()
27COMMAND_FILE = "/var/run/naemon/naemon.cmd"
28
29ERROR_NO_REQUEST_HANDLER="NO REQUEST HANDLER"
30ERROR_NO_TOKEN_SUPPLIED="NO TOKEN"
31ERROR_BAD_TOKEN_SUPPLIED="BAD TOKEN"
32
33ERROR_BAD_COMMAND_FILE="BAD COMMAND FILE"
34ERROR_COMMAND_FILE_OPEN_WRITE="COMMAND FILE UNWRITEABLE"
35ERROR_COMMAND_FILE_OPEN="CANNOT OPEN COMMAND FILE"
36ERROR_BAD_WRITE="WRITE ERROR"
37
38ERROR_BAD_DATA="BAD DATA"
39ERROR_BAD_JSON="BAD JSON"
40
41ERROR_NO_CORRECT_STATUS="NO STATUS WAS CORRECT"
42#### /Push
43
44def get_lq(request):
45 # https://mathias-kettner.de/checkmk_livestatus.html
46 socket_path="/var/run/naemon/live"
47 s = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
48 s.connect(socket_path)
49 s.send(request.encode())
50 s.shutdown(socket.SHUT_WR)
51 chunks = []
52 while len(chunks) == 0 or len(chunks[-1]) > 0:
53 chunks.append(s.recv(4096))
54 s.close()
55 return b"".join(chunks).decode()
56
57class Host:
58 def __init__(self, name, alias, status, webname, vhost):
59 self.name = name
60 self.alias = alias
61 self.webname = webname or alias
62 self.vhost = vhost
63 self.status = status
64 self.services = []
65
66 @classmethod
67 def parse_hosts(cls, payload, vhost):
68 parsed = filter(lambda x: x.vhost == vhost, [cls.parse(p) for p in json.loads(payload)])
69 return {p.name: p for p in parsed}
70
71 @classmethod
72 def parse(cls, payload):
73 return cls(payload[0], payload[1], HOST_STATUS[payload[2]], payload[3].get("WEBSTATUS_NAME"), payload[3].get("WEBSTATUS_VHOST"))
74
75 def __repr__(self):
76 return "Host {}: {} ({})".format(self.name, self.alias, self.webname)
77
78 @classmethod
79 def query(cls, vhost):
80 answer = get_lq("""GET hosts
81Filter: groups >= webstatus-hosts
82Columns: name alias state custom_variables
83OutputFormat: json
84""")
85 return cls.parse_hosts(answer, vhost)
86
87 def fill_services(self, services):
88 self.services = [service for service in services if service.host == self.name]
89
90class ServiceGroup:
91 def __init__(self, name, alias):
92 self.name = name
93 self.alias = alias
94 self.services = []
95
96 @classmethod
97 def parse_groups(cls, payload):
98 parsed = [cls.parse(p) for p in json.loads(payload)]
99 return {p.name: p for p in parsed}
100
101 @classmethod
102 def parse(cls, payload):
103 return cls(payload[0], payload[1])
104
105 @classmethod
106 def query(cls):
107 answer = get_lq("""GET servicegroups
108Filter: name ~ ^webstatus-
109Columns: name alias custom_variables
110OutputFormat: json
111""")
112 return cls.parse_groups(answer)
113
114 def fill_services(self, services, hosts):
115 self.services = [service for service in services if any([group == self.name for group in service.groups]) and service.host in hosts]
116
117 def __repr__(self):
118 return "ServiceGroup {}: {}".format(self.name, self.alias)
119
120class Service:
121 def __init__(self, name, host, groups, status, webname, url, description, infos):
122 self.name = name
123 self.host = host
124 self.groups = groups
125 self.status = status
126 self.webname = webname
127 self.url = url
128 self.description = description
129 self.infos = infos
130
131 @classmethod
132 def parse_services(cls, payload):
133 parsed = json.loads(payload)
134 return [cls.parse(p) for p in parsed if cls.valid(p[2])]
135
136 @staticmethod
137 def valid(groups):
138 return any([b.startswith("webstatus-") for b in groups])
139
140 @classmethod
141 def parse(cls, payload):
142 return cls(payload[0],
143 payload[1],
144 payload[2],
145 STATUS[payload[3]],
146 payload[4].get("WEBSTATUS_NAME"),
147 payload[4].get("WEBSTATUS_URL"),
148 payload[5],
149 payload[6])
150
151 @classmethod
152 def query(cls):
153 answer = get_lq("""GET services
154Columns: display_name host_name groups state custom_variables description plugin_output
155OutputFormat: json
156""")
157 return cls.parse_services(answer)
158
159 def __repr__(self):
160 return "Service {}: {}".format(self.name, self.webname)
161
162def get_infos(vhost):
163 hosts = Host.query(vhost)
164 servicegroups = ServiceGroup.query()
165 services = Service.query()
166
167 for host in hosts:
168 hosts[host].fill_services(services)
169 for group in servicegroups:
170 servicegroups[group].fill_services(services, hosts)
171 return (hosts, servicegroups, services)
172
173TEMPLATE='''<?xml version="1.0" encoding="UTF-8"?>
174<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">
175<html lang="en" xmlns="http://www.w3.org/1999/xhtml">
176 <head>
177 <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
178 <meta name="viewport" content="width=device-width, initial-scale=1.0" />
179 <title>Status</title>
180 <meta name="referrer" content="no-referrer" />
181 <style type="text/css">
182 ul {
183 list-style: none;
184 margin: 0px;
185 }
186 ul li:nth-child(2n) {
187 background-color: rgb(240, 240, 240);
188 }
189 li.resource, li.service {
190 margin: 1px 0px;
191 }
192 span.status {
193 display: inline-block;
194 width: 150px;
195 text-align: center;
196 margin-right: 5px;
197 font-variant: small-caps;
198 font-size: 1.2em;
199 }
200 .status_ok,.status_up {
201 background-color: rgba(0, 255, 0, 0.5);;
202 }
203 .status_warning {
204 background-color: rgba(255, 255, 0, 0.5);;
205 }
206 .status_error,.status_down {
207 background-color: rgba(255, 0, 0, 0.5);;
208 }
209 .status_unknown,.status_unreachable {
210 background-color: rgba(0, 0, 255, 0.5);;
211 }
212 .infos {
213 margin-left: 40px;
214 color: rgb(100, 100, 100);
215 }
216 div#services {
217 column-count: auto;
218 column-width: 36em;
219 }
220 div.servicegroup {
221 -webkit-column-break-inside: avoid;
222 break-inside: avoid;
223 }
224 h3.servicegroup_title, h3.host_title {
225 margin: 1px 0px;
226 }
227 span.service_host, span.infos {
228 float: right;
229 display: inline-block;
230 color: rgb(100, 100, 100);
231 }
232 </style>
233 </head>
234 <body>
235 <h2>Hosts</h2>
236 {%- for host in hosts.values() %}
237 <h3 class="host_title">
238 <span class="status status_{{ host.status }}">{{ host.status }}</span>
239 <span class="host">{{ host.webname }}</span>
240 </h3>
241 {%- for service in servicegroups["webstatus-resources"].services if service.host == host.name -%}
242 {%- if loop.first %}
243 <ul class="resources">
244 {% endif %}
245
246 <li class="resource">
247 <span class="status status_{{ service.status }}">{{ service.status }}</span>
248 <span class="description">{{ service.description }}</span>
249 <span class="infos">{{ service.infos }}</span>
250 </li>
251
252 {%- if loop.last %}
253 </ul>
254 {% endif %}
255 {% endfor %}
256 {%- endfor %}
257
258 {%- for group in servicegroups.values() if group.services and group.name != "webstatus-resources" %}
259 {%- if loop.first %}
260 <h2>Services</h2>
261 <div id="services">
262 {%- endif %}
263 <div class="servicegroup">
264 <h3 class="servicegroup_title">{{ group.alias }}</h3>
265 {%- for service in group.services if service.host in hosts -%}
266 {%- if loop.first %}
267 <ul class="services">
268 {% endif %}
269
270 <li class="service" title="{{ service.infos }}">
271 <span class="status status_{{ service.status }}">{{ service.status }}</span>
272 <span class="description">
273 {% if service.url and service.url.startswith("https://") %}
274 <a href="{{ service.url }}">{{ service.webname or service.description }}</a>
275 {% else %}
276 {{ service.webname or service.description }}
277 {% endif %}
278 </span>
279 <span class="service_host">{{ hosts[service.host].webname }}</span>
280 </li>
281
282 {%- if loop.last %}
283 </ul>
284 {% endif %}
285 {%- endfor -%}
286 </div>
287 {%- if loop.last %}
288 </div>
289 {% endif %}
290 {%- endfor %}
291 </body>
292</html>
293'''
294
295@login_manager.request_loader
296def load_user_from_request(request):
297 api_key = request.headers.get('Token')
298 if api_key in AUTHORIZED_KEYS:
299 return UserMixin()
300 content = request.get_json(force=True, silent=True)
301 if content is not None and content.get("token") in AUTHORIZED_KEYS:
302 return UserMixin()
303
304@app.route("/live", methods=["POST"])
305@login_required
306def live():
307 query = request.get_data()
308 result = get_lq(query.decode() + "\n")
309 resp = make_response(result)
310 resp.content_type = "text/plain"
311 return resp
312
313@app.route("/", methods=["GET"])
314def get():
315 (hosts, servicegroups, services) = get_infos(request.host)
316 resp = make_response(render_template_string(TEMPLATE, hosts=hosts, servicegroups=servicegroups))
317 resp.content_type = "text/html"
318 return resp
319
320@app.route("/", methods=["POST"])
321@login_required
322def push():
323 content = request.get_json(force=True, silent=True)
324 if content is None:
325 return ERROR_BAD_JSON
326 if content.get("cmd") != "submitcheck":
327 return render_error(ERROR_NO_REQUEST_HANDLER)
328 if "checkresult" not in content or not isinstance(content["checkresult"], list):
329 return render_error(ERROR_BAD_DATA)
330
331 checks = 0
332 errors = 0
333 for check in map(lambda x: CheckResult.from_json(x), content["checkresult"]):
334 if check is None:
335 errors += 1
336 continue
337 try:
338 write_check_output(check)
339 except Exception as e:
340 return render_error(str(e))
341 checks += 1
342 return render_response(checks, errors)
343
344def write_check_output(check):
345 if check.type== "service":
346 command = "[{time}] PROCESS_SERVICE_CHECK_RESULT;{hostname};{servicename};{state};{output}";
347 else:
348 command = "[{time}] PROCESS_HOST_CHECK_RESULT;{hostname};{state};{output}";
349 formatted = command.format(
350 time=int(time.time()),
351 hostname=check.hostname,
352 state=check.state,
353 output=check.output,
354 servicename=check.servicename,
355 )
356
357 if not os.path.exists(COMMAND_FILE):
358 raise Exception(ERROR_BAD_COMMAND_FILE)
359 if not os.access(COMMAND_FILE, os.W_OK):
360 raise Exception(ERROR_COMMAND_FILE_OPEN_WRITE)
361 if not os.access(COMMAND_FILE, os.W_OK):
362 raise Exception(ERROR_COMMAND_FILE_OPEN_WRITE)
363 try:
364 with open(COMMAND_FILE, "w") as c:
365 c.write(formatted + "\n")
366 except Exception as e:
367 raise Exception(ERROR_BAD_WRITE)
368
369def render_error(error):
370 return jsonify({
371 "status": "error",
372 "message": error,
373 })
374
375def render_response(checks, errors):
376 if checks > 0:
377 return jsonify({
378 "status": "ok",
379 "result": {
380 "checks": checks,
381 "errors": errors,
382 }
383 })
384 else:
385 return jsonify({
386 "status": "error",
387 "message": ERROR_NO_CORRECT_STATUS,
388 })
389
390class CheckResult:
391 def __init__(self, hostname, state, output, servicename, checktype):
392 self.hostname = hostname
393 self.state = state
394 self.output = output
395 self.servicename = servicename
396 self.type = checktype
397
398 @classmethod
399 def from_json(klass, j):
400 if not isinstance(j, dict):
401 return None
402 for key in ["hostname", "state", "output"]:
403 if key not in j or not isinstance(j[key], str):
404 return None
405 for key in ["servicename", "type"]:
406 if key in j and not isinstance(j[key], str):
407 return None
408 return klass(
409 j["hostname"],
410 j["state"],
411 j["output"],
412 j.get("servicename", ""),
413 j.get("type", "host"))
414
diff --git a/systems/monitoring-1/status_engine.nix b/systems/monitoring-1/status_engine.nix
new file mode 100644
index 0000000..fc6afc0
--- /dev/null
+++ b/systems/monitoring-1/status_engine.nix
@@ -0,0 +1,123 @@
1{ config, pkgs, lib, name, ... }:
2let
3 package = pkgs.status-engine-worker.override { config_file = config.secrets.fullPaths."status_engine"; };
4 env = config.myEnv.tools.status_engine;
5in
6{
7 config = lib.mkIf config.myServices.status.enable {
8 systemd.services.gearmand = {
9 description = "Gearman daemon";
10 after = [ "network.target" ];
11 wantedBy = [ "multi-user.target" ];
12 serviceConfig = {
13 DynamicUser = true;
14 User = "gearmand";
15 Type = "simple";
16 ExecStart = "${pkgs.gearmand}/bin/gearmand --syslog -L 127.0.0.1 -q libsqlite3 --libsqlite3-db /var/lib/gearmand/gearmand.db --store-queue-on-shutdown -l stderr -P /run/gearmand/gearmand.pid";
17 RuntimeDirectory = "gearmand";
18 StateDirectory = "gearmand";
19 };
20 };
21
22 secrets.keys."status_engine" = {
23 permissions = "0400";
24 user = "naemon";
25 group = "naemon";
26 text = ''
27 node_name: ${name}
28 use_gearman: 1
29 gearman:
30 address: 127.0.0.1
31 port: 4730
32 timeout: 1000
33 use_rabbitmq: 0
34 use_redis: 1
35 redis:
36 address: 127.0.0.1
37 port: 6379
38 db: 0
39 store_live_data_in_archive_backend: 1
40 use_mysql: 1
41 mysql:
42 host: ${env.mysql.remoteHost}
43 port: ${builtins.toString env.mysql.port}
44 username: ${env.mysql.user}
45 password: ${env.mysql.password}
46 database: ${env.mysql.database}
47 use_crate: 0
48 number_of_bulk_records: 100
49 max_bulk_delay: 5
50 number_servicestatus_worker: 1
51 number_hoststatus_worker: 1
52 number_logentry_worker: 1
53 number_statechange_worker: 1
54 number_hostcheck_worker: 1
55 number_servicecheck_worker: 1
56 number_misc_worker: 1
57
58 process_perfdata: 1
59 number_perfdata_worker: 1
60 perfdata_backend:
61 - mysql
62
63 check_for_commands: 1
64 command_check_interval: 15
65 external_command_file: /run/naemon/naemon.cmd
66 query_handler: /run/naemon/naemon.qh
67 submit_method: qh
68
69 syslog_enabled: 1
70 syslog_tag: statusengine-worker
71
72 # Archive age
73 age_hostchecks: 5
74 age_host_acknowledgements: 60
75 age_host_notifications: 60
76 age_host_statehistory: 365
77 age_host_downtimes: 60
78 age_servicechecks: 5
79 age_service_acknowledgements: 60
80 age_service_notifications: 60
81 age_service_statehistory: 365
82 age_service_downtimes: 60
83 age_logentries: 5
84 age_tasks: 1
85 age_perfdata: 90
86
87 disable_http_proxy: 1
88 '';
89 };
90
91 services.redis.servers."" = rec {
92 enable = true;
93 bind = "127.0.0.1";
94 };
95
96 services.cron = {
97 mailto = "cron@immae.eu";
98 systemCronJobs = [
99 "0 0 * * * naemon cd ${package} && ./bin/Console.php cleanup"
100 ];
101 };
102
103 environment.systemPackages = [
104 pkgs.gearmand
105 (pkgs.writeScriptBin "status-engine-worker" ''
106 #! ${pkgs.stdenv.shell}
107 cd ${package}
108 exec sudo -E -u naemon ./bin/Console.php "$@"
109 '')
110 ];
111 systemd.services.status_engine_worker = {
112 description = "Status engine worker";
113 after = [ "network.target" ];
114 wantedBy = [ "multi-user.target" ];
115 serviceConfig = {
116 Type = "simple";
117 Restart = "on-failure";
118 User = "naemon";
119 ExecStart = "${package}/bin/StatusengineWorker.php";
120 };
121 };
122 };
123}
diff --git a/systems/quatresaisons/flake.lock b/systems/quatresaisons/flake.lock
new file mode 100644
index 0000000..6f2ccca
--- /dev/null
+++ b/systems/quatresaisons/flake.lock
@@ -0,0 +1,767 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_3",
6 "nixpkgs": "nixpkgs_7"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "colmena": {
20 "inputs": {
21 "flake-compat": "flake-compat",
22 "flake-utils": "flake-utils",
23 "nixpkgs": "nixpkgs",
24 "stable": "stable"
25 },
26 "locked": {
27 "lastModified": 1687954574,
28 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
29 "owner": "immae",
30 "repo": "colmena",
31 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
32 "type": "github"
33 },
34 "original": {
35 "owner": "immae",
36 "ref": "add-lib-get-flake",
37 "repo": "colmena",
38 "type": "github"
39 }
40 },
41 "disko": {
42 "inputs": {
43 "nixpkgs": "nixpkgs_2"
44 },
45 "locked": {
46 "lastModified": 1687968164,
47 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
48 "owner": "nix-community",
49 "repo": "disko",
50 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
51 "type": "github"
52 },
53 "original": {
54 "owner": "nix-community",
55 "repo": "disko",
56 "type": "github"
57 }
58 },
59 "environment": {
60 "locked": {
61 "lastModified": 1,
62 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
63 "path": "../../flakes/private/environment",
64 "type": "path"
65 },
66 "original": {
67 "path": "../../flakes/private/environment",
68 "type": "path"
69 }
70 },
71 "environment_2": {
72 "locked": {
73 "lastModified": 1,
74 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
75 "path": "../environment",
76 "type": "path"
77 },
78 "original": {
79 "path": "../environment",
80 "type": "path"
81 }
82 },
83 "environment_3": {
84 "locked": {
85 "lastModified": 1,
86 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
87 "path": "../environment",
88 "type": "path"
89 },
90 "original": {
91 "path": "../environment",
92 "type": "path"
93 }
94 },
95 "files-watcher": {
96 "locked": {
97 "lastModified": 1,
98 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
99 "path": "../../flakes/files-watcher",
100 "type": "path"
101 },
102 "original": {
103 "path": "../../flakes/files-watcher",
104 "type": "path"
105 }
106 },
107 "files-watcher_2": {
108 "locked": {
109 "lastModified": 1,
110 "narHash": "sha256-ZsdumUVoSPkV/DB6gO6dNDttjzalye0ToVBF9bl5W0k=",
111 "path": "../files-watcher",
112 "type": "path"
113 },
114 "original": {
115 "path": "../files-watcher",
116 "type": "path"
117 }
118 },
119 "flake-compat": {
120 "flake": false,
121 "locked": {
122 "lastModified": 1650374568,
123 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
124 "owner": "edolstra",
125 "repo": "flake-compat",
126 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
127 "type": "github"
128 },
129 "original": {
130 "owner": "edolstra",
131 "repo": "flake-compat",
132 "type": "github"
133 }
134 },
135 "flake-parts": {
136 "inputs": {
137 "nixpkgs-lib": "nixpkgs-lib_2"
138 },
139 "locked": {
140 "lastModified": 1687762428,
141 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
142 "owner": "hercules-ci",
143 "repo": "flake-parts",
144 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
145 "type": "github"
146 },
147 "original": {
148 "owner": "hercules-ci",
149 "repo": "flake-parts",
150 "type": "github"
151 }
152 },
153 "flake-parts_2": {
154 "inputs": {
155 "nixpkgs-lib": "nixpkgs-lib_3"
156 },
157 "locked": {
158 "lastModified": 1675295133,
159 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
160 "owner": "hercules-ci",
161 "repo": "flake-parts",
162 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
163 "type": "github"
164 },
165 "original": {
166 "owner": "hercules-ci",
167 "repo": "flake-parts",
168 "type": "github"
169 }
170 },
171 "flake-utils": {
172 "locked": {
173 "lastModified": 1659877975,
174 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
175 "owner": "numtide",
176 "repo": "flake-utils",
177 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
178 "type": "github"
179 },
180 "original": {
181 "owner": "numtide",
182 "repo": "flake-utils",
183 "type": "github"
184 }
185 },
186 "flake-utils_2": {
187 "locked": {
188 "lastModified": 1648297722,
189 "narHash": "sha256-W+qlPsiZd8F3XkzXOzAoR+mpFqzm3ekQkJNa+PIh1BQ=",
190 "owner": "numtide",
191 "repo": "flake-utils",
192 "rev": "0f8662f1319ad6abf89b3380dd2722369fc51ade",
193 "type": "github"
194 },
195 "original": {
196 "owner": "numtide",
197 "repo": "flake-utils",
198 "type": "github"
199 }
200 },
201 "flake-utils_3": {
202 "locked": {
203 "lastModified": 1667395993,
204 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
205 "owner": "numtide",
206 "repo": "flake-utils",
207 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
208 "type": "github"
209 },
210 "original": {
211 "owner": "numtide",
212 "repo": "flake-utils",
213 "type": "github"
214 }
215 },
216 "landing-page": {
217 "flake": false,
218 "locked": {
219 "lastModified": 1691524124,
220 "narHash": "sha256-JyHb02qUrct2t+dgaiOcT5KS8RHkXygjWQXl+55gSMY=",
221 "ref": "main",
222 "rev": "018344d9116b506c662ecdcee2d0d505c857f1cf",
223 "revCount": 573,
224 "type": "git",
225 "url": "https://github.com/bastienwirtz/homer.git"
226 },
227 "original": {
228 "ref": "main",
229 "type": "git",
230 "url": "https://github.com/bastienwirtz/homer.git"
231 }
232 },
233 "monitoring": {
234 "inputs": {
235 "environment": "environment_2",
236 "naemon": "naemon",
237 "nixpkgs-lib": "nixpkgs-lib",
238 "secrets": "secrets"
239 },
240 "locked": {
241 "lastModified": 1,
242 "narHash": "sha256-K720bqCEHPK0F7GBaxo/ioJ3LVAyhjl/ZZobWwO4ebU=",
243 "path": "../../flakes/private/monitoring",
244 "type": "path"
245 },
246 "original": {
247 "path": "../../flakes/private/monitoring",
248 "type": "path"
249 }
250 },
251 "multi-apache-container": {
252 "inputs": {
253 "files-watcher": "files-watcher_2",
254 "myuids": "myuids"
255 },
256 "locked": {
257 "lastModified": 1,
258 "narHash": "sha256-euh+K7DLk5B3hKTeK5Xwo6dvnvHk+7ZDCqaRdG48i8I=",
259 "path": "../../flakes/multi-apache-container",
260 "type": "path"
261 },
262 "original": {
263 "path": "../../flakes/multi-apache-container",
264 "type": "path"
265 }
266 },
267 "my-lib": {
268 "inputs": {
269 "colmena": "colmena",
270 "disko": "disko",
271 "flake-parts": "flake-parts",
272 "nixos-anywhere": "nixos-anywhere",
273 "nixpkgs": "nixpkgs_4"
274 },
275 "locked": {
276 "lastModified": 1,
277 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
278 "path": "../../flakes/lib",
279 "type": "path"
280 },
281 "original": {
282 "path": "../../flakes/lib",
283 "type": "path"
284 }
285 },
286 "mypackages": {
287 "inputs": {
288 "flake-parts": "flake-parts_2",
289 "nixpkgs": "nixpkgs_8",
290 "webapps-ttrss": "webapps-ttrss"
291 },
292 "locked": {
293 "lastModified": 1,
294 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
295 "path": "../../mypackages",
296 "type": "path"
297 },
298 "original": {
299 "path": "../../mypackages",
300 "type": "path"
301 }
302 },
303 "myuids": {
304 "locked": {
305 "lastModified": 1,
306 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
307 "path": "../myuids",
308 "type": "path"
309 },
310 "original": {
311 "path": "../myuids",
312 "type": "path"
313 }
314 },
315 "myuids_2": {
316 "locked": {
317 "lastModified": 1,
318 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
319 "path": "../../flakes/myuids",
320 "type": "path"
321 },
322 "original": {
323 "path": "../../flakes/myuids",
324 "type": "path"
325 }
326 },
327 "myuids_3": {
328 "locked": {
329 "lastModified": 1,
330 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
331 "path": "../../myuids",
332 "type": "path"
333 },
334 "original": {
335 "path": "../../myuids",
336 "type": "path"
337 }
338 },
339 "naemon": {
340 "locked": {
341 "lastModified": 1,
342 "narHash": "sha256-6le57WLKj1HXdhe4cgYO6N0Z9nJZC+plQY8HhOwzEIk=",
343 "path": "../../naemon",
344 "type": "path"
345 },
346 "original": {
347 "path": "../../naemon",
348 "type": "path"
349 }
350 },
351 "nixos-2305": {
352 "locked": {
353 "lastModified": 1687938137,
354 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
355 "owner": "NixOS",
356 "repo": "nixpkgs",
357 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
358 "type": "github"
359 },
360 "original": {
361 "owner": "NixOS",
362 "ref": "release-23.05",
363 "repo": "nixpkgs",
364 "type": "github"
365 }
366 },
367 "nixos-anywhere": {
368 "inputs": {
369 "disko": [
370 "my-lib",
371 "disko"
372 ],
373 "flake-parts": [
374 "my-lib",
375 "flake-parts"
376 ],
377 "nixos-2305": "nixos-2305",
378 "nixos-images": "nixos-images",
379 "nixpkgs": "nixpkgs_3",
380 "treefmt-nix": "treefmt-nix"
381 },
382 "locked": {
383 "lastModified": 1689945193,
384 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
385 "owner": "numtide",
386 "repo": "nixos-anywhere",
387 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
388 "type": "github"
389 },
390 "original": {
391 "owner": "numtide",
392 "repo": "nixos-anywhere",
393 "type": "github"
394 }
395 },
396 "nixos-images": {
397 "inputs": {
398 "nixos-2305": [
399 "my-lib",
400 "nixos-anywhere",
401 "nixos-2305"
402 ],
403 "nixos-unstable": [
404 "my-lib",
405 "nixos-anywhere",
406 "nixpkgs"
407 ]
408 },
409 "locked": {
410 "lastModified": 1686819168,
411 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
412 "owner": "nix-community",
413 "repo": "nixos-images",
414 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
415 "type": "github"
416 },
417 "original": {
418 "owner": "nix-community",
419 "repo": "nixos-images",
420 "type": "github"
421 }
422 },
423 "nixpkgs": {
424 "locked": {
425 "lastModified": 1683408522,
426 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
427 "owner": "NixOS",
428 "repo": "nixpkgs",
429 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
430 "type": "github"
431 },
432 "original": {
433 "owner": "NixOS",
434 "ref": "nixos-unstable",
435 "repo": "nixpkgs",
436 "type": "github"
437 }
438 },
439 "nixpkgs-4": {
440 "flake": false,
441 "locked": {
442 "lastModified": 1646497237,
443 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
444 "owner": "NixOS",
445 "repo": "nixpkgs",
446 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
447 "type": "github"
448 },
449 "original": {
450 "owner": "NixOS",
451 "repo": "nixpkgs",
452 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
453 "type": "github"
454 }
455 },
456 "nixpkgs-lib": {
457 "locked": {
458 "dir": "lib",
459 "lastModified": 1691269286,
460 "narHash": "sha256-7cPTz1bPhwq8smt9rHDcFtJsd1tFDcBukzj5jOXqjfk=",
461 "owner": "NixOS",
462 "repo": "nixpkgs",
463 "rev": "85d4248a4f5aa6bc55dd2cea8131bb68b2d43804",
464 "type": "github"
465 },
466 "original": {
467 "dir": "lib",
468 "owner": "NixOS",
469 "repo": "nixpkgs",
470 "type": "github"
471 }
472 },
473 "nixpkgs-lib_2": {
474 "locked": {
475 "dir": "lib",
476 "lastModified": 1685564631,
477 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
478 "owner": "NixOS",
479 "repo": "nixpkgs",
480 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
481 "type": "github"
482 },
483 "original": {
484 "dir": "lib",
485 "owner": "NixOS",
486 "ref": "nixos-unstable",
487 "repo": "nixpkgs",
488 "type": "github"
489 }
490 },
491 "nixpkgs-lib_3": {
492 "locked": {
493 "dir": "lib",
494 "lastModified": 1675183161,
495 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
496 "owner": "NixOS",
497 "repo": "nixpkgs",
498 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
499 "type": "github"
500 },
501 "original": {
502 "dir": "lib",
503 "owner": "NixOS",
504 "ref": "nixos-unstable",
505 "repo": "nixpkgs",
506 "type": "github"
507 }
508 },
509 "nixpkgs_2": {
510 "locked": {
511 "lastModified": 1687701825,
512 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
513 "owner": "NixOS",
514 "repo": "nixpkgs",
515 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
516 "type": "github"
517 },
518 "original": {
519 "owner": "NixOS",
520 "ref": "nixpkgs-unstable",
521 "repo": "nixpkgs",
522 "type": "github"
523 }
524 },
525 "nixpkgs_3": {
526 "locked": {
527 "lastModified": 1687893427,
528 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
529 "owner": "nixos",
530 "repo": "nixpkgs",
531 "rev": "4b14ab2a916508442e685089672681dff46805be",
532 "type": "github"
533 },
534 "original": {
535 "owner": "nixos",
536 "ref": "nixos-unstable-small",
537 "repo": "nixpkgs",
538 "type": "github"
539 }
540 },
541 "nixpkgs_4": {
542 "locked": {
543 "lastModified": 1648725829,
544 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
545 "owner": "NixOS",
546 "repo": "nixpkgs",
547 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
548 "type": "github"
549 },
550 "original": {
551 "owner": "NixOS",
552 "repo": "nixpkgs",
553 "type": "github"
554 }
555 },
556 "nixpkgs_5": {
557 "locked": {
558 "lastModified": 1693158576,
559 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
560 "owner": "nixos",
561 "repo": "nixpkgs",
562 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
563 "type": "github"
564 },
565 "original": {
566 "owner": "nixos",
567 "ref": "nixos-unstable",
568 "repo": "nixpkgs",
569 "type": "github"
570 }
571 },
572 "nixpkgs_6": {
573 "flake": false,
574 "locked": {
575 "lastModified": 1596265691,
576 "narHash": "sha256-9ofCzFqttTsGrvTaS4RrDSTNQO9PFOz5uyn8V+2eA5M=",
577 "owner": "NixOS",
578 "repo": "nixpkgs",
579 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
580 "type": "github"
581 },
582 "original": {
583 "owner": "NixOS",
584 "repo": "nixpkgs",
585 "rev": "840c782d507d60aaa49aa9e3f6d0b0e780912742",
586 "type": "github"
587 }
588 },
589 "nixpkgs_7": {
590 "locked": {
591 "lastModified": 1687502512,
592 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
593 "owner": "NixOS",
594 "repo": "nixpkgs",
595 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
596 "type": "github"
597 },
598 "original": {
599 "owner": "NixOS",
600 "ref": "nixos-unstable",
601 "repo": "nixpkgs",
602 "type": "github"
603 }
604 },
605 "nixpkgs_8": {
606 "locked": {
607 "lastModified": 1646497237,
608 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
609 "owner": "nixos",
610 "repo": "nixpkgs",
611 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
612 "type": "github"
613 },
614 "original": {
615 "owner": "nixos",
616 "repo": "nixpkgs",
617 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
618 "type": "github"
619 }
620 },
621 "php": {
622 "inputs": {
623 "flake-utils": "flake-utils_2",
624 "nixpkgs": "nixpkgs_6",
625 "nixpkgs-4": "nixpkgs-4"
626 },
627 "locked": {
628 "lastModified": 1,
629 "narHash": "sha256-Qs+O86L4sPArYWm7wMCFNKLCWfUwkz8STePsn5K9Xwk=",
630 "path": "../../flakes/private/php",
631 "type": "path"
632 },
633 "original": {
634 "path": "../../flakes/private/php",
635 "type": "path"
636 }
637 },
638 "root": {
639 "inputs": {
640 "environment": "environment",
641 "files-watcher": "files-watcher",
642 "landing-page": "landing-page",
643 "monitoring": "monitoring",
644 "multi-apache-container": "multi-apache-container",
645 "my-lib": "my-lib",
646 "myuids": "myuids_2",
647 "nixpkgs": "nixpkgs_5",
648 "php": "php",
649 "secrets": "secrets_2",
650 "system": "system"
651 }
652 },
653 "secrets": {
654 "locked": {
655 "lastModified": 1,
656 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
657 "path": "../../secrets",
658 "type": "path"
659 },
660 "original": {
661 "path": "../../secrets",
662 "type": "path"
663 }
664 },
665 "secrets-public": {
666 "locked": {
667 "lastModified": 1,
668 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
669 "path": "../../secrets",
670 "type": "path"
671 },
672 "original": {
673 "path": "../../secrets",
674 "type": "path"
675 }
676 },
677 "secrets_2": {
678 "locked": {
679 "lastModified": 1,
680 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
681 "path": "../../flakes/secrets",
682 "type": "path"
683 },
684 "original": {
685 "path": "../../flakes/secrets",
686 "type": "path"
687 }
688 },
689 "stable": {
690 "locked": {
691 "lastModified": 1669735802,
692 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
693 "owner": "NixOS",
694 "repo": "nixpkgs",
695 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
696 "type": "github"
697 },
698 "original": {
699 "owner": "NixOS",
700 "ref": "nixos-22.11",
701 "repo": "nixpkgs",
702 "type": "github"
703 }
704 },
705 "system": {
706 "inputs": {
707 "backports": "backports",
708 "environment": "environment_3",
709 "mypackages": "mypackages",
710 "myuids": "myuids_3",
711 "secrets-public": "secrets-public"
712 },
713 "locked": {
714 "lastModified": 1,
715 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
716 "path": "../../flakes/private/system",
717 "type": "path"
718 },
719 "original": {
720 "path": "../../flakes/private/system",
721 "type": "path"
722 }
723 },
724 "treefmt-nix": {
725 "inputs": {
726 "nixpkgs": [
727 "my-lib",
728 "nixos-anywhere",
729 "nixpkgs"
730 ]
731 },
732 "locked": {
733 "lastModified": 1687940979,
734 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
735 "owner": "numtide",
736 "repo": "treefmt-nix",
737 "rev": "0a4f06c27610a99080b69433873885df82003aae",
738 "type": "github"
739 },
740 "original": {
741 "owner": "numtide",
742 "repo": "treefmt-nix",
743 "type": "github"
744 }
745 },
746 "webapps-ttrss": {
747 "flake": false,
748 "locked": {
749 "lastModified": 1546759381,
750 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
751 "ref": "master",
752 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
753 "revCount": 9256,
754 "type": "git",
755 "url": "https://git.tt-rss.org/fox/tt-rss.git"
756 },
757 "original": {
758 "ref": "master",
759 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
760 "type": "git",
761 "url": "https://git.tt-rss.org/fox/tt-rss.git"
762 }
763 }
764 },
765 "root": "root",
766 "version": 7
767}
diff --git a/systems/quatresaisons/flake.nix b/systems/quatresaisons/flake.nix
new file mode 100644
index 0000000..8b269f6
--- /dev/null
+++ b/systems/quatresaisons/flake.nix
@@ -0,0 +1,49 @@
1{
2 inputs = {
3 nixpkgs.url = "github:nixos/nixpkgs/nixos-unstable";
4
5 my-lib.url = "path:../../flakes/lib";
6
7 monitoring.url = "path:../../flakes/private/monitoring";
8 environment.url = "path:../../flakes/private/environment";
9 php.url = "path:../../flakes/private/php";
10 system.url = "path:../../flakes/private/system";
11
12 myuids.url = "path:../../flakes/myuids";
13 secrets.url = "path:../../flakes/secrets";
14 files-watcher.url = "path:../../flakes/files-watcher";
15 multi-apache-container.url = "path:../../flakes/multi-apache-container";
16
17 landing-page = {
18 url = "https://github.com/bastienwirtz/homer.git";
19 ref = "main";
20 type = "git";
21 flake = false;
22 };
23 };
24 outputs = inputs@{ self, my-lib, nixpkgs, ...}:
25 my-lib.lib.mkColmenaFlake {
26 name = "quatresaisons";
27 inherit self nixpkgs;
28 system = "x86_64-linux";
29 targetHost = "144.76.76.162";
30 targetUser = "root";
31 nixosModules = {
32 base = { secrets, ... }: { imports = [ secrets.nixosModules.users-config-quatresaisons ]; };
33 system = inputs.system.nixosModule;
34 monitoring = inputs.monitoring.nixosModule;
35 environment = inputs.environment.nixosModule;
36
37 myuids = inputs.myuids.nixosModule;
38 secrets = inputs.secrets.nixosModule;
39 files-watcher = inputs.files-watcher.nixosModule;
40 multi-apache-container = inputs.multi-apache-container.nixosModule;
41 };
42 moduleArgs = {
43 monitoring = inputs.monitoring;
44 php = inputs.php;
45 landing-page = inputs.landing-page;
46 pkgs-no-overlay = inputs.nixpkgs.legacyPackages.x86_64-linux;
47 };
48 };
49}
diff --git a/systems/zoldene/Immae.pub b/systems/zoldene/Immae.pub
new file mode 100644
index 0000000..dd42b04
--- /dev/null
+++ b/systems/zoldene/Immae.pub
@@ -0,0 +1,322 @@
1-----BEGIN PGP PUBLIC KEY BLOCK-----
2
3mQINBFvwA+gBEADlchQGPyI2M9RNRUsk8wsL9XLc8qAFWTYlVp5p7177ucxTQf6S
4rny9yRCF69UqtE0ugwt+432sAAsDPi7BRA/JE95bIRBiewOiY1jYiivccP5dR6Jr
558HJ3QOHYPekqZIQhxzCWjdD2nRhhCbbxeWFJsJyaG8idGBiLkgNKxEEmqE5LIat
6tzMpQFwOpL2FoYZ7+e4ZTMc+x+yqpOnGcQD1qwouqx68okSCjrVBWo5S2tK5AzzU
7X8esBLNpgkhpUEZVltiNc4bmj7GZPdy4+mvS33/HQTed8YpatCFVWzcK+/uK0SYE
8P8Hj1mguT9idBhAf+kv7qbTycrFkTBliP3oDNUoARWDmfQdV4nlxqW03QxUY18mL
9KPByduK3hEXAZnD+/8QfVzbNVVP+70/jdSB+ckF88Li2g4bv/9uqjaObKVJB9ocG
10EWslm1h7tvdCLBRgIl8b2+Zl0fComRAMuwUr+LYlWLnfygAi8Uy9hl7UcRWAAj99
11PG4ba0+y8eD8k1J2IE8HpeIzMzRwYTLtvLyJBvrKiQHJb1PGM5cS8iry81wjUPZm
12dO5p5rbC8z99w7UNMaiz6iqAFAaDyLLsBZ5gWD+1ps9XxCA0zf28Z/Tc/Gj4QKAf
13kpMd7lQ+gprsFyRtzcRD4WhsOL2ogKYFHYi4LE0GYduspGdQPlK/YfrKQwARAQAB
14tB9Jc21hZWwgQm91eWEgPGlzbWFlbEBib3V5YS5vcmc+iQJRBBMBCAA7AhsDBQsJ
15CAcCBhUKCQgLAgQWAgMBAh4BAheAFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvw
16BU4CGQEACgkQyfztbKa3lFR/kA//cHVrb/RRTLQZy514vMkOBKgAk+dj+j0lrgvJ
17yR0JK1KjodduSoccPq7qRFAU+KVa3FsXMn8yY/lWaCXYJoF0DT5iEHsEuzJRc7Cn
18N4aq2h42DD7z8dJCXZvtvJs+vZ7G/rlLl322TjLb2OyIybBEoPOmJl0dVG0wKBFC
19r7EJmOKl3ytUWUpEbuxs1U/pP4GKrPT2CK3QcLF8JHKIPkEO347RorseeHcHhMxs
20Bz5JXojts1NyLJh7lErT42atgEdTGzSmkkGm8OifZVIH2rgmnRsPHnCqrXYsa7dE
21yPsC01Ns3DPYk4C5FtbpfiNvATbnkOicEwb2U55OpYUZLsFCKo7Bl+duJVY0nPRN
22WiLCALPcdJL+a6hbh1hSuqHt5eNGxyrDtRPowXRTS1D4nTCgAh6+wpH47xXWEwXZ
23mEnkXqHLIjsW4CSIz2gc+Bza40+wkWz6NQDEb3ncytDZu9vKK1CYwl7RGW4RFkAO
24j3FWZvZp8ETPLNRVy64BhZzHY3uOxbYreE+T6JfiIZux8X+Bh4cPJHizfhSMLLS5
25kwABzalaTD33XnjKn5wQ/DfGJ+fGbF54fMlGFjne5VTNwY1ju2ieXTgVrUyzfKPF
2696zcvnxo/MWwqcQ8+dXFCZjldP76puo1eVATEBeOCQs8Vj7eL9eN/eo+BfzhS3S8
27CfFFYWeIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgDAAoJEG0M
28r/3bHP6Q/TsAnA6vTjmrX4nY3QnevNrKefWaQvf3AJ0TALTqXhTcVYVLxfzRt/Qd
29u5W2/rQvSXNtYWVsIEJvdXlhIChXb3JrKSA8aXNtYWVsLmJvdXlhQGZyZXRsaW5r
30LmNvbT6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreUVAUCW/AFCwIbAwUL
31CQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVKlBD/sE/eDbJtL8UKc6
32CN7zmA038RSjxlcJrMRoBoThCFKOFtBsYLPebnIkzCDiUwQJaIMYe2RNBHKKz0p+
332Kvzf7q+xq8W1e72aK1DRhsBTL8/LA1kQkvh3GwMS8z3SOcbXLWqKQuQ7ztYReQG
34wsT2/S8reVM96eV67K9vMHKMDF3NyYZewahX0I44YIbQJfLVG5elCkBrfHjGSeIt
35tSAv56BhN8J8ky+9nGx5jwWmxc/4Oquyfe9Lf0NMTCjw1xess7UoHlzSMp57yF3T
36AaqDcqD2Jdgr2meN9Yo4/Yb9dEvHFy34ppXYanX1nrHGev7YaaQWLoKLVZc3f6gR
37+D7sEJUJm3IxO041CR7DBwQ1CQkx3sa66mcHxe+wchOoXBZdsqyl5Ds+zqh6eMyO
38UiixDcXDxZuimEY0/+7XjlFjtzhGVNKsjV/Azh+Hx3GZnGHMVpTw73qQFHkWeDrX
39FPUbinjtEVTxw0fS9PkDZB5ysgAWlXs2cqoNDMcbdyJn2xszbV5+vjlmcofsQZTr
40PiX+hB6P5RQP5ogtnotvbkPDSfPfqdUk5HjGFrGX08FoP4rCromHvSL6Un2lP4I2
41mJbbQzBU/bQUGzfz6U6VEbUHtOL+7woGuXuzTYsRZ/O7/fKohyi/+qsmOozQpLFN
42k5xocbF1PgpFphrKYpHaSkf6DS2/F4hdBBARAgAdFiEE3DhHSHCdJhn/KGchbQyv
43/dsc/pAFAlvwCAQACgkQbQyv/dsc/pDXWACeKMbL/Dtifpd466TqQP8isfWedtIA
44n2xbEmlpxG8yk0w4HQ4djwgY4RbutCpJc21hZWwgQm91eWEgPGlzbWFlbC5ib3V5
45YUBub3JtYWxlc3VwLm9yZz6JAk4EEwEIADgWIQT4KAb9ob9bmhswFOfJ/O1spreU
46VAUCW/AEawIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ/O1spreUVMGJ
47EAC5hKt5NCanRxEl13nQUu4+n05tdRl9C3sTczR8EUZ30zhpBV4chKgeJSD0r1VA
48zBSQHMNzroGawaQn38qxFtbcSmkGRDd+0y798x1HFHp+UFiYOdQDQJVsyDuwjq4k
49RF7zV+FBj0ffjn5JBy6R3wLmWCFxz1mPmkImdyyS8GEeifwTftC+SSotqfg1lh0K
50C+DSQGYtPk0jLvxVPRllnjltDOSPUt9xRE785I6E9oyYrCa5Om51e0eEMzwpkl4e
51QschAYILb6SNrVyEMRD5E3lJHD2r6dPvIPFNcLxIQuK/Kdco2jNq7dCL6ukdGI40
52j/oZi7XRrlFCQW321BuipJZ/7t9JWOXOrrEndQv+hOb6PeWkwF1rigjbQq+IipdJ
53DUXGBfiIzlpJM5tLhs7BGfLxYNn09rOpkotXrdBzRO62lYyRdQepKpD33v96bQV2
540w64U44+CxuicjGDw/6no54LY4J7bM1lLGwqvHSeqgYoc+Zs9WH95TNNSmaAHGSf
55An4LpzW5nOXbq2rsWVbZpvsVHz3VmC9qmpsYl5tT/ninkLta3tN6TrYUFHXcDWz9
56K+HW+/oARzEmN8eg3iMmWtOnV59YEr/x2vvOHndguUL0tUpRjwuTunH9KOGZE0Kb
57uI3ovgLLO2kCSGk4SdXlntu/eLq9FPYqlOpjM9CtLf9JdIhdBBARAgAdFiEE3DhH
58SHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pCHCQCfdPdGx0FmknAs
59rPvjuUmuCj9Q8xUAn32dsgQYTlgfTdwLSxWGj4mTD2h6tClJc21hZWwgQm91eWEg
60PGJvdXlhQHBoYXJlLm5vcm1hbGVzdXAub3JnPokCTgQTAQgAOBYhBPgoBv2hv1ua
61GzAU58n87Wymt5RUBQJb8ASdAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJ
62EMn87Wymt5RU58QQALMGlOJzcQj/arHezum5H/PiYIpZ1yY+QMCzpSgPdwupwawW
63VN88aQRfU6k9xwmsU+Ghjreja09AuqYi/D2+61TM/Tmqi/9HdU6NRYw0hvaZnwFc
64vudFBII2XrxmU5k9PnSR6Sq4uLUGkXmvhJddV0q+cjtif+vDi5pl9mqbWBQY8d9S
655Q6ZFZPeEeASUK7Xt/tSq9iXpb1tQsmEJ94Czl5G+gNFJcqj7nlHQ1/c9XeNsvJT
66GZVLGM/cAZNzB6AC8Kz+iWUypFuXifC2PYGpJDJ8klqTmDQikGQtM1HMHda6rnwU
67L7JIfbuwGbMk65CtG2YE8QqB+/GIfkzWySenmIrldn9Vp5EKB0DD529TyOwQWgzz
68+HuVP/4QfkNRxNquWxlAPXmcNfV1SV+/Xn1KwSspb7QlAjiXXOL13J2dwYFpV+21
69vsSW5XqJXfWUU8d4YVOdq1kUTwLjWnWyxwtt8j68KSuTOT4JTA8oNXg87r0B4Fzr
706AoxCM8ePywm5IW55gNAwViTKWBAcNrcwRTP647oNOM5+8D7NZIBpnKffNc/S2S5
71iI1tmaM0yXavmCm0Hb7lkFIsxM2Y2lxwHexPck2ftPXIrjhPYLcFVBdLVx2V2yXe
72cFW2vMGZiasVobFqqp1g8htmAlTkN0cTDY7l96wDuirC6OeCbVomEgxQEd0MiF0E
73EBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kHsv
74AJ4+zdfjTdO1FUWb42bWdPQfiFe9nACeMIRp1Iu3tNVJkfS9CGGqhrChpfu0LUlz
75bWFlbCBCb3V5YSA8aXNtYWVsLmJvdXlhLjA2QG5vcm1hbGVzdXAub3JnPokCTgQT
76AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ASsAhsDBQsJCAcCBhUKCQgL
77AgQWAgMBAh4BAheAAAoJEMn87Wymt5RUxa8P/i7zdQ9i5BfWITbdyCgXNoQYIcE3
78J6lIa15eLUcfDcL707zOrUSbhSkthLjeqZoNRCalqjeDOdgCQC1PNoISdkMGd9PO
79VOwS3G7Pjt4FSjPVHyw9+Su57pwTcLXBhEyBAkv+tx/QrB/UBCFzPUnsl71QH51y
80T8+bNdOiBxssdgn/9IrObn7tu8xDf+d/yGsA493x+mxalai+fhd/t0yzQcdcTrvD
81EKRxAaU8wXe8oSwcW5cRmXIi+N4aEnLRO/so9YDGf4z2FQVSL0ktoZYMqZ1ZvIb0
82MNCNl2NgNXThhrAPk9Rhs+S5nRzazJ+tS+D2S728EPpRHpUE43+vewtCdu5c5NWd
83Lz88o/jxLwcNwQa2iJoFMyqr15lHt+vM7OyD9X650IJwQw24n4tF6TijzH5GhWcN
84SnB7RpLSkftQldpK/zK+tmFH4vVpv+bI3JKAfzRga+5Fu42kB5uHVzXF3qMwYgEO
85sRNL5d4xV4SATce1mb8vFpsQmGOWnZAcCaQYhLKfMl7zR5ukytTjf3hRMRH0GAjh
8606QAoBMJZhWosYehPi1odjTngIf6hFOqA5prz8Cu/AFe/8aftp9UorJOekAj2io0
87CENRv21qrN8R4bNo04aTMD6WrY+mBL8MteR0ooD3ENQEAZ6UUyZwTzUJk2UUl+5M
88ch/HgJ+rQozmRGYeiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI
89BAAKCRBtDK/92xz+kPsmAJ4wGQ0Hly2eTVzsU8Ht4609Q5kf2wCdHGuu863a0GHv
90uUdEokzQEsumYPG0OElzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy
91ZSkgPGlfYm91eWFAeWFob28uZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfzt
92bKa3lFQFAlvwBMkCGwMFCwkIBwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3
93lFQTlxAAjbuDy3prdEBNMYfi/870MO5eeDOCMtiDJDae4fQjj2NANjeuDGNP659B
94/k9uS7o5nrWB7E6rdG4a1J+Qzj5I775xTP/zVbrNSchcLwSoHMMXBm2IdbIanCX0
95JX+dRg2YX6yX+6ZmL8UaWRVICQ84ZxGtYHZ8o8hMCFOuxFklNjYFEPciO9M9m+rv
96fUEihQgcBF7+x9KVntlxad61Aa9AzUJLULgY3snaZK687tHUq3yYwXpF9s1CuJ81
97SfZxH32dKqy+2cpJqwQ38BZrTUwjBxxIMR5TRC7h/O9aRIBKQZKlpLcmxWPv18i7
98DwWlrJVb2Sd2WUh+TwPNa7VQc3NjlGtu74SfZqmirE0FyuB86fnsQaF8zhJnRsqE
99lagnLoW24PCvc8A9TK95tj+0JO8DIeM49Gg+Br/NBtRB8q5q/ICJOREber6Ke+/I
100p90q5VkZafIgeuO+EkyQ6Dq+58NRqC2qEs209xnKOd6exxT+2tEzx6Hy0PKwaay3
101h8WzUamJOTqRv1WG4GmlCeRUQGx8BtdIAEMdww26cN8rmxh5Foh5CH+V75bcybkv
102yH+FBDoKFYSpEPg0axHM/e13/nujgLNnSTHuMf7ILvpwoNkkIcQwSpH17B5hZdgl
103y0xD7aIS5XU9OoP9mKs1unzUKerWQWY6CxgYOqpssyDTUG+fohuIXQQQEQIAHRYh
104BNw4R0hwnSYZ/yhnIW0Mr/3bHP6QBQJb8AgEAAoJEG0Mr/3bHP6QFPAAn3DbFqHo
105hjznqQvg15QjlGFaPJaaAJ4ps0+VWG9BN7UBQPG+fcCRwqLaVLQ0SXNtYWVsIEJv
106dXlhIChEb24ndCBjb250YWN0IG1lIHRoZXJlKSA8Ym91eWFAa3RoLnNlPokCTgQT
107AQgAOBYhBPgoBv2hv1uaGzAU58n87Wymt5RUBQJb8ATfAhsDBQsJCAcCBhUKCQgL
108AgQWAgMBAh4BAheAAAoJEMn87Wymt5RU2vAP/12b6S0yJdZ1rgNLj+ZohY36PhCm
10930/amkGPQp7HCBylYIRv+y5m4IdiqynzJoap547cFMWNsCyfyU2VKbcy1Uy44FCI
110PCUcBME95jD1JWviINDKqLhglciKlJnWUhupiolqFcr2ro+rJVc/fBMWJoBjM5fJ
1119eq1ge2LxuYKbu9cpSEtopk7ZBeo69khhrFACdZEqfJtW4qp0hEC0pAKLjN8LhpQ
112EEVcq4zejksB+1e1qkuJ6be3/Q2Sj+1ijaJBElJIVJ8qyYs9XSlTlUA1USfy3Yqu
113jOkFrIaycxYgKooFgwYfYXCniuqXWZ2geCm2IE90lanQC2w7ZDN/JGwwVuAFVi4H
114Mrx6x/yEreqy2AUMesB1eGxqQQG9cgssMLoMAN2IDDJ6FS+e0imWTTMZ6r3ou9W8
115+pFzSIT8LMnBNwp+RxrW3QzBs8sXDw5mS6WroiZMRlfJdA1sUPsrW0GV4/AFuEaK
116PhCUvIvoh6zxYR0lA/gYqtszCHGzHeNLoczOhytUZM+KQpOtO3TSING/+o59HHuM
117niD6k3mWcyk6MkSgIXquJRGUVGVFeLGlXXf7aWEkIOrXeqjBZpBchZUIxZfkg100
118xxmEgNVGG4vxB/UIGeVqV2S4JscJmCyDGs130nRp7Qp5YGfkaTLKyOdutssrqatP
119m5Zcjl2VGr4Xt4uXiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AI
120BAAKCRBtDK/92xz+kEViAJ9zBTPNNTYIxPxt8BEvb3pUDeZkiQCffsDGKi7kdlTj
121oZ26K7yxdjexaYS0OUlzbWFlbCBCb3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVy
122ZSkgPGJvdXlhQG1lY2gua3RoLnNlPokCTgQTAQgAOBYhBPgoBv2hv1uaGzAU58n8
1237Wymt5RUBQJb8ATwAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4BAheAAAoJEMn87Wym
124t5RUIzgP/0/7+y7UOgj4Yja6Lwa+Lm7ESRZnbVmR1ERSAa9RKKr8BbPT4KhgwN2R
125x8c3CedFupS02sG1G57u+4qQbEeZylaMu6rusf/XyQ+esh06cRXfR7Vb2d14yFQg
126xun9PgPR7jL0RiU2fsgvF6O+u9KwnGRmABZXILDBxzGZBXKBIkmqBM8+rBkXFVWc
127gezZqD106KcuGewciuWM7bfyLj+2yV9GhvX8iRyptgkx9/CNEdOqQzKYEbXVTSkh
128tUW4QUmNnIiTnD/pZ4kr3UsQV6y0GC1kf9G5EeQHbD+kVROFM0/sX6qGn99IeC+j
12996MflMnKuXJeXjlxNFZIYPoolBAC7CvpRfdky5q0KB2xWh+x2jQbn3fPpa6lVZdQ
130De14guXdcEsj1QVUMRL3wFCDwHIsi3gqOpCHdy5GmunFRNqUWmoGU+uHt3Kk031w
131DJdQY4YP+8tFWLPG3vKoPSf5EcG2Mf0hZiWiiIAX8sVw13W+oDlAQ0HKah/uxV77
132gM2ScBiiiOr92JIf3ftq2AjMuzrGhpKME/wG2DdcOqmq7U+tcVbambSc7SVa5nTM
133JXm8ZPOSH0Fax1PULPd3pyLLhfF0rnPiDLcVa6UzG1MaSJiGBurIf3D3OCHRjQQ6
134kVpF9VtXhWeziV8wkyt66HNcuqUs6HDBNkpxPTNacKcZmW8J/FlaiF0EEBECAB0W
135IQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/92xz+kKOiAJ4shO9b
136nZ2Nx9XzBBg4C0nUl05LyQCbBpk7t2NIPMKaNtjsPb+RV5HbiQa0O0lzbWFlbCBC
137b3V5YSAoRG9uJ3QgY29udGFjdCBtZSB0aGVyZSkgPGlzbWFlbC5ib3V5YUBlbnMu
138ZnI+iQJOBBMBCAA4FiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwBZYCGwMFCwkI
139BwIGFQoJCAsCBBYCAwECHgECF4AACgkQyfztbKa3lFRK1w//cqsweiuXGPepyn0t
140AL/S/scM6r9IwcjD3HrZqmUNSDAqU6PJ0FFialOPuSQIyEvrpY1GL+TiVtnYyAit
141sbotxNxNQFwiBvqchg6xd1ftpjJihuo7RysNdSNAnlOxFlEz9X+EGkRqq8rCTpoS
142GA9+4uFyFKzfv9CDg7YUVX5GVsE3bsPWymfCW1boW0TQyL7xNrDPfzKpVRHFu7hi
1435OghiTbHbifmIolj5Mo0hGuXxz26gFzrufCjgxK9ycW7LnHEnnK0zX8Qfueir8RV
144EisuAXtKILgS5mmOj0ywsrva4Qtf5JW5SKymhgsKCWskfz0lq6S6ceIKaYBr4Syk
1450MLI82M0zDfGlLuRP6yQ3DTiTC4lWfXHdjyd0w4SwcuAQPCWz34gtUEGfMTyrd6O
146le6pYreL1NPzd/NakYsR1H1fsXVJkgpESktoDIkzooLmBV6Pjr+PEt4DvPZYqgKl
147AyD+aZeZ5HlTZCLbN9O38nDttWdAvsGjq82qvNI8A/d2Vvz4L1ND6NT71+wtC2QT
148a95epSBD64l/JtK99SW/HjLjyvV9O+Nu2p8ESTOEaQhyIudnWYU+er+Vwy7YtLvY
149y8L9/Xu9KvlBMjHBXAAV047KwkIQNrNyoTla5yQFSpv57hFYbx5CKTprpsl9Ic4v
150uPjC/GMgkAJ3yTwIgxa47hgUAtKIXQQQEQIAHRYhBNw4R0hwnSYZ/yhnIW0Mr/3b
151HP6QBQJb8AgEAAoJEG0Mr/3bHP6QyCcAnRuTQIMOpwxbyzjj+t0C9GdNJYmGAJ9v
1525c5kvNCFiJAFCbUD4OxJBNA28rQ9SXNtYWVsIEJvdXlhIChEb24ndCBjb250YWN0
153IG1lIHRoZXJlKSA8Ym91eWFAbWF0aC5qdXNzaWV1LmZyPokCTgQTAQgAOBYhBPgo
154Bv2hv1uaGzAU58n87Wymt5RUBQJb8AW0AhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4B
155AheAAAoJEMn87Wymt5RUaT8P/2OvKAfgqu0zQX0JhKu/wd9AATVmLa8C48JPQMUn
1565Z9dQyDcFyKKfKbGCz9B5jTOrzHNX0VJfpDujOTiPIk6ci0KqAJ3Fz0gdpxIcEoW
157B2zg0nwDtGHsGMX8togpcbVgKqblp0XSsMAFV2FN5PsAnxkqdXPDmZ5iZSgs9roi
1589nxHPavbcr1cSAjsiRoFxFudzo7Q0Z/KLRlTuTSAX6B+vRAeyRB4NcXThKYZlAi6
159cr+xXTvPFddiQZgVBT+ICZRQY0gwgHpQcj70fNx1w6tTHfThlxInojKGlreOZov9
160A4TVeex/QagVTsjRAQuZ9yLMkx7JxakAxBPZ/OHuv7/K1Qdx90AJ8zQZ6uOXpUNl
161c2MDEBoTI/nbsgMeHI/Mj4ndxCBUMperZ1oCITl+AhaqEZ+LxTKyne41YJedlqjc
1625xnUVigz4ajmZPYmbO6eRDxisx4fMG7hI2HnNWak2xBDVOp1z2aqZY0xsG7o697d
163I9BeR9JxbIusx0Szq6GabwI5beEI1xLlT333Fe3XDtT0NIQQvW9byuYuyfp7H6Xm
164hFj2ut7jVI9xG932sJ8ioRJGCK1UcGYEL0ei4YZRv+mVysEJFjki2nlxspnG4C/V
165Q20jXnLAXOpKLiStkNJ15WsnzeoL4eq0AUOYMMmYKAquXXgpVs+xUDv6XathWA2v
166oZkAiF0EEBECAB0WIQTcOEdIcJ0mGf8oZyFtDK/92xz+kAUCW/AIBAAKCRBtDK/9
1672xz+kEBpAJ4x7hASmdnDcyFGTyuRHj6NwsDtNwCfRVfqoiRcGmvDRA8U25cPk5XT
168ZYTRzlXOUwEQAAEBAAAAAAAAAAAAAAAA/9j/4AAQSkZJRgABAQEASABIAAD/2wBD
169AAgGBgcGBQgHBwcJCQgKDBQNDAsLDBkSEw8UHRofHh0aHBwgJC4nICIsIxwcKDcp
170LDAxNDQ0Hyc5PTgyPC4zNDL/2wBDAQkJCQwLDBgNDRgyIRwhMjIyMjIyMjIyMjIy
171MjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjL/wAARCACMAG4D
172AREAAhEBAxEB/8QAHAAAAgIDAQEAAAAAAAAAAAAABgcEBQACAwEI/8QAQhAAAQIE
173BAIGBgYIBwEAAAAAAQIDAAQFEQYSITFBURMUImFxsQcjMoGRwUJDUmJjchUlNTaC
174odHwFiYzc4OS4bL/xAAZAQADAQEBAAAAAAAAAAAAAAAAAQIDBAX/xAAgEQEBAAID
175AQEBAQEBAAAAAAAAAQIRAyExQRJREyIy/9oADAMBAAIRAxEAPwB2JHaECEjiPGA4
1766GA3kMMgDy8AZAGQAp8XD/Nc5+VP/wAiJT9GeBv3e/5VQ4cEu8M3sAZAGQBFT7Qh
177JSOUBt4DZYww8O0AeQB5cc4AgzNXk5dfRh1Dj1r9Ghab/wAzpE3KQFdiSotTGIph
1784trQFpAFyDwtwjO8mqqYbHeByDQNCD61R0jTGyzcTrQmigyAMsYAyxgCtTNt5hqI
179SUnrKOYgN06yjnCVtnWUc4BtyenmWGVuurSlttJUpR2AGpMGyKbEHpZm3ulapLSW
180GTcIdWm6yOZ1sIj92q0Cf8UVp2Y6b9IOIVtZkkD366xOzkjujFc83mROKZcCjc9M
181kE/1hbV+Yq1VhC3TkUEKvcWNxE6UY3o4xKpueVIuKGRaSoWO5GsXhdXSM59Nhucb
182cbStJFlAEeEa7Q26yj7UPdJ71pv7Qhboedab+0Iexsu2p2ZuD0sJltZom5gkEuaQ
183jldxMPkZuk0gW2E05cetgIvfSJihZY/RcvODKpXr0NntKA4HkCeHdEWrkLBc67fK
184EoF+Khc/CEuMYZn5tYyMFwX0KQRbwtCtkXMbUk4eqBKgpC9eYN4n9xf+Vczh+fYv
185maUoDUHlD/cF47EmlTz0hPtFalsrQsdoGxtx1hs7DpolaTO5JZl7sdHmZPNKbAjx
186Fx7jFY34ys+rcl4/XGL0jbVQmODpgsG2JD/F1UVIVqmRKgcT8YbNcy8qOrqO/ZiL
1876uRLTKAU8WGloF/A3WpgUqjTc8gjOy0Si+2bYQr1C9pAzM469NOuKdUpxxRN766x
188LUXYWw6mYbEw+m9zpeMc8/kdPHh/THp9LaYQAlCR4CMvXRNLASSCbqSOUGha0ekW
189ym2QW8INBRVbCkjUJJ1BbCHCLpcA1SeBiscrEZ4ygLD1XmaFXUNzCypcutSSgnTX
190Q2jbf2OTLH5TvkHGpuVbfTey0hWpvvHRjdxzWdrJiXSraHRi1cZQlVjDhUFGqNgX
191zDaCxAtpjgepRcHFMQvHxaNIzUoG30YF/Cl9JM0sYVW2nNZb6EqI5an5ROXgw9LX
192DEiieniVpBCNLGMuTLUdPHNmzTpdEu2lKUgJHARzW9uqToQy1iBDhpRtaKJ4bFO0
193A+oTygLxKiXxS2WMSqWNFGyzaN8L/wAuXlnY9whWn2qX0SyS2k3bJ5co14/45uXX
194pjYYnOvpcUdcpt/KNazxaVWotys8W1HWwMBX0s0yM8sWyDbTtCK2z0ZNBys0INPO
195thwIsRmEQ0x8XLEzLimhBfazBNvaEJfwtMeU0PYXnCVIOSzicqrm4MK+Fj6XeBmg
1963LuuH2s9o5+V2cRgsz7DashKlHiEi8YadMqwYr9NS4lourSs8FIMVoerxDzTiLg7
197xW4WkWZqkhK9mYm2m1HYKO8IIipyXmFXYeQsDkYiztW+iwxmwheJAyDYrQlV78yY
19834/HNy+jOkUZCqQyEzLbRCbZSNY6OOfXHyW0Y4TXK0lp1ExNt3Uq4+EXU49K3Eja
199ahVS/LTSMmQJhwspuhRc20nUz7dvGIDZmYbWq6ZtKtDteAK1AeW0XElwoG6glRA9
2008JfTkp7MhSOnGoI3MTlLpWNm44YdkhKiYlr3UHLE8zaObO7jswx1dLadROyqkplz
201kSsi6xwiJZb231Z4i081l0zJnnAgIUOg49IL8deWusVlMNdFj/pvsZ0guO0txbg9
202Yi4FuNoz1dKvoPrM1WOtN9Tlm3hm7YNiUjgf75ReEx13U5/rf/MWtPdmzNOMvNhS
203Uq7DgTa45wrZL0NWzsP4ukutYokg3bpFNpzC17gE8PCNuPxy8vq1ammGWg31lQt9
204wxvjLI5rd1IYdMySJdb7pG/RsqV8orsumrs0GHC286+2sbpUyoHygLcQQhpSkHKk
205gnlFMqaOHZdkUI2Zb9k/RETV4+L2ntNijpSEJtk2AhxfwAzbTIdc9UjQn6IgjOg8
206ASlaW1fTQ352J1jhynseljd2X+ixltuYbGZIULcYjTqk6Y9KtMsKUEITpuBBelad
2076SvNT1FI02EOeM/XPqMu+c/RpUR3awo0+OqZZtkWQkCFpNnSfhuiSk3PzFYdZSp6
208XXkaWe5JGngSfjHXwzp53PQfOPFM1Mg7dKoD4x0uQZejxZWzM34OfKFVYIGMr/pw
209AH6seZhxOXoClnCpSQf71gSbmHf2D/CYmrx8XdO/Y6b75YIv4AZ0WcdP3j5xTOl7
210UOtMYkPS3U0U5m1HdQO49x090cvLjJt18Wdup/BfSpglsDhHNvT0ML0ytTWVlCm5
211hKXG1ZshTmze6FO7s8spEalVqeZQ+2uUzIOqFIQRvwsdovxHqdKz6lqz5wHL9pGX
212KbRF3LtpLPE1+ZyIzngLxU7RnlqC7CssZfDDeY3W6OkV4nWO3jx1HmZ5fqlhU05a
213g+k8XFecbRz0aejtIS3M2+2PKFkrBExgi9bB/DHmYIWfpdygs4k+ECThw5rQP4TC
214q8fF1TtaQm/2YS/gAqH+o9+Y+cUyoWxNklaVIzJSi/WVoJ2Psgxjyzrpvw3vtrSZ
2154XzZzkWNDyMcWUehhk7Lpk7Jzhf6wtTLlipIAKx/FBLNaaY49rlpMsWdVzpNtgtO
216/wAItprP+xBNPmUTInFzDnQJUAlpdlFPffv5RGV+M8vfXs9N5gWxYlZypHO8XxY7
217sjDlz1jaaVDFsPsDk2PKO5wTwqKwgmpPH8Q+cWxo09HySG5m/wBseULJeCNjAE1Z
218On0PmYIMi8ZFn0i0NmbeGz+oB+U+cTWmPi6p6gqlAjbLCXPC2xDPJpsnOTa05g1m
219OUfSN9BDt0zk3dF+1XprF9BmGX5Zlhlp3MwpBJUVW1uT7o5+XPVjq4uP1UyFWXIu
220dXfAQ6g+0rYjmIzuP67jWZfnqmXR6tIz8olsrvbTX+sYXCyujDOWLhFNkmLv5la8
221OkNoeulb0HazX2ULLSVZGxcbjwiphazyzkQKMtycfdnHgRlA6FJ5Hj746+HCTtwc
222/JbdHNQ1ZqAyfwx5RpU4+FnUtZ5/T6xXnF7ZaGGBT6t8Wt2h5Qsl4oWK1XrOX8MH
223+ZggsLmUN3UlXdDZG5hz9hC3IxFaY+Leln9Tp/LAv4RnpEqahUxIJPqkErcAO5US
224Nfd5wqWE+oWFZNtmTYlEG6bE35m+scXLv9Xbv4pNPK9hhbt1JbVobpUOELDPR54b
225DDTlTo7pBbK0g7jjGu8cmWssVpMY3qEzLpl0srFhYgA3I+EKYRV5MrHeh0KerlVQ
226/UG1NSvtKSrQqHL3w8spjOk443K9iOj1aVqU3PBgpSQuyUfdT2QR3aCOnj6mnLyz
227vZyUD93mf9sRVGPhbz6gZ18X+tV5xWmWxfgdeZDwtqFfKFkvFVYxWUV5JHFr5wQZ
228eoLHo+m21AmbR/1/9hbT+aNqVTHKdTjLqWFGxFwIVVjNRS1fGdOwpTTJqUJufCbB
229hs6A/ePDw3hKkIGqzj9QemZ15RW46orUfE/KBUTqDVxITjZevkvfSMuTj/U6bcef
2305vZryjrM3LocQpK0LFwRqDHJZ/XXL9jSYpjDuvRI8csJSKaWhBu20gHnYQi1GPI6
231tJulBAWoGyu+KhXwmqa9N0esKbKih9lw5rbf2fIx3Y3fccOWPyvqHB861UsKyr7S
232hZaMqkj6KhoR/fdFbZya6QH8DtPPrdM04CtRVaw4xX6R+FrQ6EmilwJeU4Fm/agt
2332cx0gV3DT1WqImEzCUAIy2y34wbFxBLWO6iUlSsgA3JhaR+rVZW/SJVJ1gyss6WE
234EWWtGi1DlfgPCE0k/oEecU4sklVz3wKQ7WcUyq2VYJT8x84DaS4DjRaX7aNP/YAJ
235sK4lVRpoSk8SZN09le/Rq5+HMRjycf67nrbj5Pz1fDWllNzDCXEKStChdKkm4UOY
236jm18rp3/AB4tnXQQtK2qag2S6G+65gKlJWQhzFs84kdkry+8C0dfF/5cvJ6JMO4w
237qeHWnGpZ31CiFKbUnMkm1r24HbaNWFgrlPSS/NKQkvNt3PaJJ0hzSLL8HWHKoupv
238qzPBxNgRlMOyQsbbe0bEdZnqbUQ1LrbyFN+2qx3hyDLLVJWamweyDoNkxC5jpXrW
239V7QG4lRO1r84DR5hpbqUqSrK4ghST3/0gPTmhwOuIeQLH2VjlASUUh1JSRfXUQGn
240UrGUzhR9ptbinZZau00o3FufcfD+cRlhMl48lxNuk12RrcqJiTdC08Qd0+Mc2WNl
2411XVjlMpuK/EU+mlyz02QCVdlNzbW0TMbbpWVkm6S70+/1t0hpokqvmNySd47ccZJ
242pw223bnKTU4mdbadc6Rp0ELSRsddRDSnq6RhwkXAuFAwGJsLYvn8NzqX2CHWFH1j
243K9ljuPA98BWbG9dqTGJ52Vnqcq7a2LqSrQoObVJ74ueMMuqVSlG+u8Q6HNSiIA8J
244SdYA8NucAQVlUrNlxKFKbXbOEi5B52hBKXMC3qknMRuRDCKqX6W/SDPffNxgDrTl
245zNImumkHXGuYQsix7v6QrJfTls8XFYxBO10s9YASptOWw0BPFXjE44TGqz5LlNVT
246mXGc+MWh6ZZKilRSCU8YA7FG45jSAMaJSgDkbQBd0SsPUxbuUZkKHsnnzh70jLHa
247qHHxiVtV6JvDDjt8YA3ygI4wBrlGf3QBsEjLtAbLDlAG6QIQcrdpR5GGTpYWvAGx
248FlECAPLa35QBooBPSW4C8ASZXVRvyhlX/9mJAk4EEwEIADgWIQT4KAb9ob9bmhsw
249FOfJ/O1spreUVAUCW/AHrgIbAwULCQgHAgYVCgkICwIEFgIDAQIeAQIXgAAKCRDJ
250/O1spreUVJ4nD/9tGS8cg2eUSwd0ExCl0dWsJRdM0mUYh17mXyVNLcvbglIkSdma
251v/Ty3ke533izRN/SkkU8vNthjKAohZmmXlaXrruEyHq2vfXcDg4+C7FJQ+O3PT2B
252S5ft3Ht2GmRpD2lWpeUlJ9BXF2EF5pSnHPOrlTHRUfjBCDU4uuSeKgioSyoc2iWb
253BBaSXyeQAUR+ppM1AYKUlCDxpLbe3nVCOUc+JgJzv+47EqwMyVODwzk7oFO4GMRm
254KTKlctb1ym75oV1tiZi2fL/KA2uAab/RMO0rfxa9HVWnJGvUEDMPlTfs7222zuLB
25555Fzllfx5rQlou+MLBQIV978HRZrDxZesQOOJ4/BwTPgQ42GREf+uf5/SG4Fn3Qh
256NZsvoaePMLN/QQEjM7eqOUzRJRVcdJfRH+LinIFrAqcmbbcp1bvq8LV5lbmlFJLF
257gimvW/shf/6Zu1YsfBhvLWInUCyoOPFa1tASF6qqi1hEOd8tQgNE/H/FSIehmTHT
25874kYPNRm+DzlvrW2JPVl24Nf/SWbOG/IzGBY/pDActTwYqnpXKR7eUt/YcPpmrPi
259kyIKX32U2vTBCE3yvCm0KRzrcSbTJGfVgmlxxqIuOtbeaBtf96m+o5z/xw9ro7Ek
260VZbsx6fPuWuLY/MqeLXl1EuiU6X1sr+skDY8lJeeiRt+Uq5mCZuEgWdM1IhdBBAR
261AgAdFiEE3DhHSHCdJhn/KGchbQyv/dsc/pAFAlvwCAQACgkQbQyv/dsc/pABQACf
262YaUOqzlafrzeGdwHwDleootu0UcAn2adbaKJ79QBtDVPkR77zV801JlXuQINBFvw
263A+gBEACt8AiUTMcyNXwN6kiOLPd+85IPlLwEVyofz8p2QBAxJsqKozlXXpnK7ahC
264RSiHt02EK39WiyZpeY1/2dGmdvyI1vc7ld3814Dveh4nf1GRSpDZ427cxayaclh+
265wRQ8nDWFOQUsMB3He/Z+aO6l/ZNvdVdzRUHda1XvN41nwXUL9FQUn/TLYgHbxa7P
266Yy18ZnNzH/xGSwDgRrqPEAZ8KOpbHEbNyYuYuv6IM8Xmbp8Q6bl2RyBNnrlphksJ
267kLvO6RLHUvvw5uX5bt+u3umoZ+yHUkP13NtQHTyZ8VTCQimkB6OisisOTnV8OjLG
268xtLEF/TjeGFAAoEnc8bQAPvrtONQL19rPkMB0gXYXPBbGw7eWYr3QpuOujUXcz9U
2690JSSEov7cUepdTY8LEYFw8U5WimKY6f/uJUVx/ukNPtuAljJji0cjIGEOX2XGlBV
270Ix/U3vywLBfUFW5hT+75z7UB3yG3Zexo0WSaQxxZ5PHxyPYBK1PvVkH0LvkbxJcr
271rouJJQ66chjRglUbv4lf85/cG1ZLu3Ds0UbuD0gE9sAEwXtfdgDmp/HB7mxwJr1O
272BRbTRv0Okx/lovWXkxt+hX+DXZ1u1qdZUW3zjmge8W7xag3epD21jIjFDODgUfDT
273fgJi2FQq+szpagfPN5j5aIQKHCZf0DLbBD+ZWYQdld5JZs2V5QARAQABiQI2BBgB
274CAAgFiEE+CgG/aG/W5obMBTnyfztbKa3lFQFAlvwA+gCGwwACgkQyfztbKa3lFTa
275yxAAxQo/9dvOO74J+9XznCYb5iO1B1ksnVegSGVuId45JKXkCkuWvDOkcU8+ma38
276wo3MBoPLpSMCXc/mKQ0p0ntO1tD/Wf4nBBCvseWcsR6RR5Su5jYorm0qZ89IOEPN
277K2W2Z41X6DHyteB1dAyIyexOYoLKD7iWcQzga4/EoUPEwcr8BWWgGLBfRhXsYySz
278F3fQPS7KaemDLGbJfTDZCSqmsZPnlksSvGxEBwUwfCjfY+QHxzWPRFPkuQJJR6YW
279tiZ3z7jBRdRk/R5v2CJZJuGHcPPYQy6j2TYGONojm+ifaq1hz+A0aoy4P9qRW5Nl
280mm6yiqEoJe07DrMLxn3H3ucuOo7DiNWmkkjW8DfhFSd+3pFMSvKGujOJWN27UDEp
281ERWFX50gE15Sq4aPbMPNRejFQ1n75B4jfFQXg6WuwF3kwgHK3Y5T5vTEkbPgce9c
282SyyFWU7EA4DJGnt7/FoaPDTKOWI9WSkmjOSABTBNSaUiMSFA3Wg/T0aS5pETpkv2
283S/GVVX022orAGK8zEY1vr2a24itOAKpQwFRuMjqDCBVgKAsMtlPu8jv3Zm/AMcYM
284sRRnDWJh2TO8bqXXUG/o783fcTE3d1Ff7s4BfmBqpGHigZeehNvu+FshRDYaDrDN
285IS0fTqbsX/JjaCXwU/o2E6G4aE79Ut/IMsCYzItTDh2UmcS5Ag0EW/G8wgEQALBi
2862/A7Ev/92mYi4Gm//IJEKjm2Vc3NcX5LdSyPwdSLlHSRwvzZz7M0VeflcTYqssto
287VPVf4maDtLGbQJn43CLqjvIW/C6jzjfvoZf0gbHpNfKY1ENs5xgE0wd3ZdsqpQC6
288W9Pu+kN31QS9+RUKwiG2bNBIREChL/omqiLhNu3hDbZnB+uSByOk901XVrNmKa8G
289NzXSfJSCt0gP7XU6VpMqjxppA8Y2Vo7jnylbrgVJriTt6jtjDylBBQqmHSOXMT+q
2909kIWDSocKhSFHBMO6LYnAwbMef2kqio5zaKzZAuwis0zjOqKHwW54xL2T7djFav9
291VlgcAYN105iMLUiIl39HLeZnS5pUESOXRUv/qLwiQRvBlWBPIep3+ycM2eK8r5a1
2925EwCgN2nSl3KYjzTOisCmK1nQs+gQ1RMraeBGYEG0uIUvDxfoONTuYkM3dhWq2Xx
293V/OO6yUkfyOlBGUREe1PXAOsP0LtAFJha7kbh7Eg6GGU7gRYh2dG2Ln6Vmx1ldbS
294F3woFYPGNMsQmgEKxwyjKaq0Qhd/sKHrTpPz8PXfGP4dHegExKegS7Yof1VrKBB+
295L8Q8o1Oi8JPCjRp47iga5OYS1Vn3h5a07ajzSAxPsmF0lmF4tYk2MFxSs403ShiE
296BTjN4t6rjmnoQV/b+CuhpmvzxaYr736/jkY7s0I5ABEBAAGJBGwEGAEIACAWIQT4
297KAb9ob9bmhswFOfJ/O1spreUVAUCW/G8wgIbAgJACRDJ/O1spreUVMF0IAQZAQgA
298HRYhBB2wOl45wX3kd77c+/0dTvV/qVkCBQJb8bzCAAoJEP0dTvV/qVkC3tUP/2rR
299VDaSPj9+UYJtHGDfQmYCEqxROm5wGCJbNrUQspLeL8+XrsaUDh1ldNAQtoDqGjRp
300kwjJAS0OZfvCv7pI052NK/KVGaK5Tj2+0lxTAcGbAKoH8E2HWPlERpU9CRLvzvDE
3014GGxw2nw7aobNGbf9d98c9RpZuAul92BOClnpGEU4VzjKUk9IsSjZQVJnggQujxL
302qWWiwfGwVsj2PdgPao/P48cYNl5CACBgY19AAh7WzgJVz/6je/5NLdAAV+E31qSE
303EaZsvTBqrMOtH6iTn1GpJ73FsJ0BYVt9X99bRT0Vi0iWulBuhYfZG4PdCY6fv6uC
304d+6pAC+Y/M9npaLbBHscSlJheTyvfuB7bzYBY+Q87VHSOMuNni7U08FuiILFoF+e
305/ESU/v0Hde44ghiXKSaFO8djxc874KM9UlGWvw9UbmI8Z2uM0kDcrPZ/8tcjXOhp
306PEBib54ab4tKCUCtOmsF9ZiT0hOqYdP9bXW+6OGfCignJ7ABhPpANfx2Sn/28L9l
307PbF1nA5CkHdyo/ku1Z/lNq44yvrB8r0Ljq6s3KS69dUZqqrADeogOdi0/TrghtKU
308DERWGmQagYSzMIvsXoAI56MxXFLriSObmpFLTWq7cr/+Ju3AcaSkrpDSYi3U6vLL
3098NuXPhul1S/+yPwvX6Mk1Zkip9/Wg4SQeiT2R7xj8zMP/RJ8uKbnKpOftY89Kv0Y
310FZ4hE3FeBR3UJvkuPdQYNLQRluzh63Bzc4ClSxB9Ma7fmAEiuFtgEi4HLTMBDOHO
311uVMuWYcgubu9VBlAGLJ++gnKxCAJXEntuB49il8MjMsy+uv/cFCjPG9z/1pmWYrE
312XBNA+vcaOrNTS2IykAbqybcPYbBcN47bm+A4i5yqiahk0q++j4LOW/nf88xXO7xI
313V/4vQgemh7RHgHJOkKfzOPw/Kx3UjV1jA9gEUrusHE4R3Upxh0ZeQW19hUnVlao1
314TxxKEUryrRzckuRfc5ziMWNyJaZsPMkeBEhyY/CizDFPrsSXIAijfu8KFnxCsnaM
315ylFBWOu5FwsKMDXxu0QdwqpL2CM8p+q12z1VruNjpIc8bAc0/YMndjYnxzsqQEMV
316GQIDKWqh/m6v7sqbn65ZQcVAzSAriGcQxCOIoT/TA/J+/4BSk5c8TKlqT8NBT77B
317Z70vMr41mZus1A/ciI8AxgbYwlhuvTehdm74k/c7NSzTxeG3OumTlBR1I18C4AIi
318y4iM3O4H4jvEssWBUzpm3VJG0NvcN/M4YVZHX5yxWQuIFcghzb7sLYddmRvR9B0M
319Xowot//r/sgn43xv54sIvwe9MkCCU6j7ePYUlOUnn+vQ5i7rFN/UPub3V3toI2gg
320DRuKdymWEii1jA9KlmheLTFr
321=r9L+
322-----END PGP PUBLIC KEY BLOCK-----
diff --git a/systems/zoldene/base.nix b/systems/zoldene/base.nix
new file mode 100644
index 0000000..8ca5d52
--- /dev/null
+++ b/systems/zoldene/base.nix
@@ -0,0 +1,122 @@
1{ name, config, lib, pkgs, secrets, ... }:
2let
3 # udev rules to be able to boot from qemu in a rescue
4 udev-qemu-rules =
5 let disks = config.disko.devices.disk;
6 in builtins.concatStringsSep "\n" (lib.imap1 (i: d: ''
7 SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="disk", ENV{ID_MODEL}=="QEMU_HARDDISK", ENV{ID_SERIAL_SHORT}=="QM0000${builtins.toString i}", SYMLINK+="${lib.removePrefix "/dev/" disks."${d}".device}"
8 SUBSYSTEM=="block", KERNEL=="sd*", ENV{DEVTYPE}=="partition", ENV{ID_MODEL}=="QEMU_HARDDISK", ENV{ID_SERIAL_SHORT}=="QM0000${builtins.toString i}", SYMLINK+="${lib.removePrefix "/dev/" disks."${d}".device}-part%E{PARTN}"
9 '') (builtins.attrNames disks));
10in
11{
12 services.openssh = {
13 settings.KbdInteractiveAuthentication = false;
14 hostKeys = [
15 {
16 path = "/persist/zpool/etc/ssh/ssh_host_ed25519_key";
17 type = "ed25519";
18 }
19 {
20 path = "/persist/zpool/etc/ssh/ssh_host_rsa_key";
21 type = "rsa";
22 bits = 4096;
23 }
24 ];
25 };
26
27 system.stateVersion = "23.05";
28
29 # Useful when booting from qemu in rescue
30 console = {
31 earlySetup = true;
32 keyMap = "fr";
33 };
34
35 services.udev.extraRules = udev-qemu-rules;
36 fileSystems."/persist/zfast".neededForBoot = true;
37 boot = {
38 zfs.forceImportAll = true; # needed for the first boot after
39 # install, because nixos-anywhere
40 # doesn't export filesystems properly
41 # after install (only affects fs not
42 # needed for boot, see fsNeededForBoot
43 # in nixos/lib/utils.nix
44 kernelParams = [ "boot.shell_on_fail" ];
45 loader.grub.devices = [
46 config.disko.devices.disk.sda.device
47 config.disko.devices.disk.sdb.device
48 ];
49 extraModulePackages = [ ];
50 kernelModules = [ "kvm-intel" ];
51 supportedFilesystems = [ "zfs" ];
52 kernelPackages = config.boot.zfs.package.latestCompatibleLinuxPackages;
53 initrd = {
54 postDeviceCommands = lib.mkAfter ''
55 zfs rollback -r zfast/root@blank
56 '';
57 services.udev.rules = udev-qemu-rules;
58 availableKernelModules = [ "e1000e" "ahci" "sd_mod" ];
59 network = {
60 enable = true;
61 postCommands = "echo 'cryptsetup-askpass' >> /root/.profile";
62 flushBeforeStage2 = true;
63 ssh = {
64 enable = true;
65 port = 2222;
66 authorizedKeys = config.users.extraUsers.root.openssh.authorizedKeys.keys;
67 hostKeys = [
68 "/boot/initrdSecrets/ssh_host_rsa_key"
69 "/boot/initrdSecrets/ssh_host_ed25519_key"
70 ];
71 };
72 };
73 };
74 };
75 networking = {
76 hostId = "6251d3d5";
77 firewall.enable = false;
78 firewall.allowedUDPPorts = [ 43484 ];
79 # needed for initrd proper network setup too
80 useDHCP = lib.mkDefault true;
81
82 wireguard.interfaces.wg0 = {
83 generatePrivateKeyFile = true;
84 privateKeyFile = "/persist/zpool/etc/wireguard/wg0";
85 #presharedKeyFile = config.secrets.fullPaths."wireguard/preshared_key";
86 listenPort = 43484;
87
88 ips = [
89 "192.168.1.25/24"
90 ];
91 peers = [
92 ];
93 };
94 };
95
96 powerManagement.cpuFreqGovernor = lib.mkDefault "powersave";
97 hardware.cpu.intel.updateMicrocode = lib.mkDefault config.hardware.enableRedistributableFirmware;
98 hardware.enableRedistributableFirmware = lib.mkDefault true;
99 system.activationScripts.createDatasets = {
100 deps = [ ];
101 text = ''
102 PATH=${pkgs.zfs}/bin:$PATH
103 '' + builtins.concatStringsSep "\n" (lib.mapAttrsToList (name: c: ''
104 if ! zfs list "${c._parent.name}/${name}" 2>/dev/null >/dev/null; then
105 ${c._create { zpool = c._parent.name; }}
106 fi
107 '') (config.disko.devices.zpool.zfast.datasets // config.disko.devices.zpool.zpool.datasets));
108 };
109
110 secrets.keys."wireguard/preshared_key/eldiron" = {
111 permissions = "0400";
112 user = "root";
113 group = "root";
114 text = let
115 key = builtins.concatStringsSep "_" (builtins.sort builtins.lessThan [ name "eldiron" ]);
116 in
117 "{{ .wireguard.preshared_keys.${key} }}";
118 };
119 secrets.decryptKey = "/persist/zpool/etc/ssh/ssh_host_ed25519_key";
120 # ssh-keyscan zoldene | nix-shell -p ssh-to-age --run ssh-to-age
121 secrets.ageKeys = [ "age1rqr7qdpjm8fy9nf3x07fa824v87n40g0ljrgdysuayuklnvhcynq4c8en8" ];
122}
diff --git a/systems/zoldene/disko.nix b/systems/zoldene/disko.nix
new file mode 100644
index 0000000..7df5697
--- /dev/null
+++ b/systems/zoldene/disko.nix
@@ -0,0 +1,87 @@
1{ cryptKeyFile, ... }: {
2 disko.devices = let
3 zpoolDatasets = {
4 "root" = { type = "zfs_fs"; options.mountpoint = "none"; };
5 "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zpool"; options.mountpoint = "legacy"; };
6 };
7 zfastDatasets = {
8 "root" = { type = "zfs_fs"; mountpoint = "/"; options.mountpoint = "legacy"; postCreateHook = "zfs snapshot zfast/root@blank"; };
9 "root/nix" = { type = "zfs_fs"; mountpoint = "/nix"; options.mountpoint = "legacy"; };
10 "root/persist" = { type = "zfs_fs"; mountpoint = "/persist/zfast"; options.mountpoint = "legacy"; };
11 "root/persist/var" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var"; options.mountpoint = "legacy"; };
12 "root/persist/var/lib" = { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib"; options.mountpoint = "legacy"; };
13 };
14 in {
15 disk = {
16 sda = {
17 type = "disk";
18 device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700613";
19 content = {
20 type = "table";
21 format = "gpt";
22 partitions = [
23 { start = "2GiB"; end = "-8GiB"; name = "ssdLuksA"; content = { type = "luks"; name = "ssdA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; }
24 { start = "-8GiB"; end = "-2MiB"; name = "swapA"; flags = [ "swap" ]; content = { type = "swap"; }; }
25 { start = "2048s"; end = "4095s"; name = "ssdGrubA"; flags = [ "bios_grub" ]; }
26 { start = "4096s"; end = "2GiB"; name = "ssdBootA"; content = { type = "filesystem"; format = "ext4"; mountpoint = "/boot"; }; }
27 ];
28 };
29 };
30 sdb = {
31 type = "disk";
32 device = "/dev/disk/by-id/ata-SAMSUNG_MZ7LM480HCHP-00003_S1YJNYAG700682";
33 content = {
34 type = "table";
35 format = "gpt";
36 partitions = [
37 { start = "2GiB"; end = "-8GiB"; name = "ssdLuksB"; content = { type = "luks"; name = "ssdB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zfast"; }; }; }
38 { start = "-8GiB"; end = "-2MiB"; name = "swapB"; flags = [ "swap" ]; content = { type = "swap"; }; }
39 { start = "2048s"; end = "4095s"; name = "ssdGrubB"; flags = [ "bios_grub" ]; }
40 #{ start = "4096s"; end = "2GiB"; name = "ssdBootB"; content = { type = "filesystem"; format = "ext4"; }; } # non monté
41 ];
42 };
43 };
44 sdc = {
45 type = "disk";
46 device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110SY1";
47 content = {
48 type = "table";
49 format = "gpt";
50 partitions = [
51 { start = "2048s"; end = "-34s"; name = "hddLuksA"; content = { type = "luks"; name = "bigA"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; }
52 ];
53 };
54 };
55 sdd = {
56 type = "disk";
57 device = "/dev/disk/by-id/ata-ST4000NM0245-1Z2107_ZC110YXX";
58 content = {
59 type = "table";
60 format = "gpt";
61 partitions = [
62 { start = "2048s"; end = "-34s"; name = "hddLuksB"; content = { type = "luks"; name = "bigB"; keyFile = cryptKeyFile; content = { type = "zfs"; pool = "zpool"; }; }; }
63 ];
64 };
65 };
66 };
67
68 zpool = {
69 zpool = {
70 type = "zpool";
71 mode = "mirror";
72 mountRoot = "/";
73 rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; };
74 options = { ashift = "12"; };
75 datasets = zpoolDatasets;
76 };
77 zfast = {
78 type = "zpool";
79 mode = "mirror";
80 mountRoot = "/";
81 rootFsOptions = { mountpoint = "none"; atime = "off"; xattr = "sa"; acltype = "posix"; };
82 options = { ashift = "12"; };
83 datasets = zfastDatasets;
84 };
85 };
86 };
87}
diff --git a/systems/zoldene/flake.lock b/systems/zoldene/flake.lock
new file mode 100644
index 0000000..0a9ba64
--- /dev/null
+++ b/systems/zoldene/flake.lock
@@ -0,0 +1,560 @@
1{
2 "nodes": {
3 "backports": {
4 "inputs": {
5 "flake-utils": "flake-utils_2",
6 "nixpkgs": "nixpkgs_6"
7 },
8 "locked": {
9 "lastModified": 1,
10 "narHash": "sha256-VewHWeZvwLvWVm2bMQk5UQ0G/HyO8X87BssvmbLWbrY=",
11 "path": "../../backports",
12 "type": "path"
13 },
14 "original": {
15 "path": "../../backports",
16 "type": "path"
17 }
18 },
19 "colmena": {
20 "inputs": {
21 "flake-compat": "flake-compat",
22 "flake-utils": "flake-utils",
23 "nixpkgs": "nixpkgs",
24 "stable": "stable"
25 },
26 "locked": {
27 "lastModified": 1687954574,
28 "narHash": "sha256-YasVTaNXq2xqZdejyIhuyqvNypmx+K/Y1ZZ4+raeeII=",
29 "owner": "immae",
30 "repo": "colmena",
31 "rev": "e427171150a35e23204c4c15a2483358d22a0eff",
32 "type": "github"
33 },
34 "original": {
35 "owner": "immae",
36 "ref": "add-lib-get-flake",
37 "repo": "colmena",
38 "type": "github"
39 }
40 },
41 "disko": {
42 "inputs": {
43 "nixpkgs": "nixpkgs_2"
44 },
45 "locked": {
46 "lastModified": 1687968164,
47 "narHash": "sha256-L9jr2zCB6NIaBE3towusjGBigsnE2pMID8wBGkYbTS4=",
48 "owner": "nix-community",
49 "repo": "disko",
50 "rev": "8002e7cb899bc2a02a2ebfb7f999fcd7c18b92a1",
51 "type": "github"
52 },
53 "original": {
54 "owner": "nix-community",
55 "repo": "disko",
56 "type": "github"
57 }
58 },
59 "environment": {
60 "locked": {
61 "lastModified": 1,
62 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
63 "path": "../environment",
64 "type": "path"
65 },
66 "original": {
67 "path": "../environment",
68 "type": "path"
69 }
70 },
71 "flake-compat": {
72 "flake": false,
73 "locked": {
74 "lastModified": 1650374568,
75 "narHash": "sha256-Z+s0J8/r907g149rllvwhb4pKi8Wam5ij0st8PwAh+E=",
76 "owner": "edolstra",
77 "repo": "flake-compat",
78 "rev": "b4a34015c698c7793d592d66adbab377907a2be8",
79 "type": "github"
80 },
81 "original": {
82 "owner": "edolstra",
83 "repo": "flake-compat",
84 "type": "github"
85 }
86 },
87 "flake-parts": {
88 "inputs": {
89 "nixpkgs-lib": "nixpkgs-lib"
90 },
91 "locked": {
92 "lastModified": 1687762428,
93 "narHash": "sha256-DIf7mi45PKo+s8dOYF+UlXHzE0Wl/+k3tXUyAoAnoGE=",
94 "owner": "hercules-ci",
95 "repo": "flake-parts",
96 "rev": "37dd7bb15791c86d55c5121740a1887ab55ee836",
97 "type": "github"
98 },
99 "original": {
100 "owner": "hercules-ci",
101 "repo": "flake-parts",
102 "type": "github"
103 }
104 },
105 "flake-parts_2": {
106 "inputs": {
107 "nixpkgs-lib": "nixpkgs-lib_2"
108 },
109 "locked": {
110 "lastModified": 1675295133,
111 "narHash": "sha256-dU8fuLL98WFXG0VnRgM00bqKX6CEPBLybhiIDIgO45o=",
112 "owner": "hercules-ci",
113 "repo": "flake-parts",
114 "rev": "bf53492df08f3178ce85e0c9df8ed8d03c030c9f",
115 "type": "github"
116 },
117 "original": {
118 "owner": "hercules-ci",
119 "repo": "flake-parts",
120 "type": "github"
121 }
122 },
123 "flake-utils": {
124 "locked": {
125 "lastModified": 1659877975,
126 "narHash": "sha256-zllb8aq3YO3h8B/U0/J1WBgAL8EX5yWf5pMj3G0NAmc=",
127 "owner": "numtide",
128 "repo": "flake-utils",
129 "rev": "c0e246b9b83f637f4681389ecabcb2681b4f3af0",
130 "type": "github"
131 },
132 "original": {
133 "owner": "numtide",
134 "repo": "flake-utils",
135 "type": "github"
136 }
137 },
138 "flake-utils_2": {
139 "locked": {
140 "lastModified": 1667395993,
141 "narHash": "sha256-nuEHfE/LcWyuSWnS8t12N1wc105Qtau+/OdUAjtQ0rA=",
142 "owner": "numtide",
143 "repo": "flake-utils",
144 "rev": "5aed5285a952e0b949eb3ba02c12fa4fcfef535f",
145 "type": "github"
146 },
147 "original": {
148 "owner": "numtide",
149 "repo": "flake-utils",
150 "type": "github"
151 }
152 },
153 "impermanence": {
154 "locked": {
155 "lastModified": 1684264534,
156 "narHash": "sha256-K0zr+ry3FwIo3rN2U/VWAkCJSgBslBisvfRIPwMbuCQ=",
157 "owner": "nix-community",
158 "repo": "impermanence",
159 "rev": "89253fb1518063556edd5e54509c30ac3089d5e6",
160 "type": "github"
161 },
162 "original": {
163 "owner": "nix-community",
164 "ref": "master",
165 "repo": "impermanence",
166 "type": "github"
167 }
168 },
169 "my-lib": {
170 "inputs": {
171 "colmena": "colmena",
172 "disko": "disko",
173 "flake-parts": "flake-parts",
174 "nixos-anywhere": "nixos-anywhere",
175 "nixpkgs": "nixpkgs_4"
176 },
177 "locked": {
178 "lastModified": 1,
179 "narHash": "sha256-wwpT+I5/zrln85BDzlZoEDC19GwYrcZSXbrJjyvC4jk=",
180 "path": "../../flakes/lib",
181 "type": "path"
182 },
183 "original": {
184 "path": "../../flakes/lib",
185 "type": "path"
186 }
187 },
188 "mypackages": {
189 "inputs": {
190 "flake-parts": "flake-parts_2",
191 "nixpkgs": "nixpkgs_7",
192 "webapps-ttrss": "webapps-ttrss"
193 },
194 "locked": {
195 "lastModified": 1,
196 "narHash": "sha256-C0plEL+g6kv5fo/VmTjMJK45RfFcGufqPKJVnviMyGY=",
197 "path": "../../mypackages",
198 "type": "path"
199 },
200 "original": {
201 "path": "../../mypackages",
202 "type": "path"
203 }
204 },
205 "myuids": {
206 "locked": {
207 "lastModified": 1,
208 "narHash": "sha256-HkW9YCLQCNBX3Em7J7MjraVEZO3I3PizkVV2QrUdULQ=",
209 "path": "../../myuids",
210 "type": "path"
211 },
212 "original": {
213 "path": "../../myuids",
214 "type": "path"
215 }
216 },
217 "nixos-2305": {
218 "locked": {
219 "lastModified": 1687938137,
220 "narHash": "sha256-Z00c0Pk3aE1aw9x44lVcqHmvx+oX7dxCXCvKcUuE150=",
221 "owner": "NixOS",
222 "repo": "nixpkgs",
223 "rev": "ba2ded3227a2992f2040fad4ba6f218a701884a5",
224 "type": "github"
225 },
226 "original": {
227 "owner": "NixOS",
228 "ref": "release-23.05",
229 "repo": "nixpkgs",
230 "type": "github"
231 }
232 },
233 "nixos-anywhere": {
234 "inputs": {
235 "disko": [
236 "my-lib",
237 "disko"
238 ],
239 "flake-parts": [
240 "my-lib",
241 "flake-parts"
242 ],
243 "nixos-2305": "nixos-2305",
244 "nixos-images": "nixos-images",
245 "nixpkgs": "nixpkgs_3",
246 "treefmt-nix": "treefmt-nix"
247 },
248 "locked": {
249 "lastModified": 1689945193,
250 "narHash": "sha256-+GPRt7ouE84A7GPNKnFYGU0cQL7skKxz0BAY0sUjUmw=",
251 "owner": "numtide",
252 "repo": "nixos-anywhere",
253 "rev": "27161266077a177ac116e2cb72cc70af5f145189",
254 "type": "github"
255 },
256 "original": {
257 "owner": "numtide",
258 "repo": "nixos-anywhere",
259 "type": "github"
260 }
261 },
262 "nixos-images": {
263 "inputs": {
264 "nixos-2305": [
265 "my-lib",
266 "nixos-anywhere",
267 "nixos-2305"
268 ],
269 "nixos-unstable": [
270 "my-lib",
271 "nixos-anywhere",
272 "nixpkgs"
273 ]
274 },
275 "locked": {
276 "lastModified": 1686819168,
277 "narHash": "sha256-IbRVStbKoMC2fUX6TxNO82KgpVfI8LL4Cq0bTgdYhnY=",
278 "owner": "nix-community",
279 "repo": "nixos-images",
280 "rev": "ccc1a2c08ce2fc38bcece85d2a6e7bf17bac9e37",
281 "type": "github"
282 },
283 "original": {
284 "owner": "nix-community",
285 "repo": "nixos-images",
286 "type": "github"
287 }
288 },
289 "nixpkgs": {
290 "locked": {
291 "lastModified": 1683408522,
292 "narHash": "sha256-9kcPh6Uxo17a3kK3XCHhcWiV1Yu1kYj22RHiymUhMkU=",
293 "owner": "NixOS",
294 "repo": "nixpkgs",
295 "rev": "897876e4c484f1e8f92009fd11b7d988a121a4e7",
296 "type": "github"
297 },
298 "original": {
299 "owner": "NixOS",
300 "ref": "nixos-unstable",
301 "repo": "nixpkgs",
302 "type": "github"
303 }
304 },
305 "nixpkgs-lib": {
306 "locked": {
307 "dir": "lib",
308 "lastModified": 1685564631,
309 "narHash": "sha256-8ywr3AkblY4++3lIVxmrWZFzac7+f32ZEhH/A8pNscI=",
310 "owner": "NixOS",
311 "repo": "nixpkgs",
312 "rev": "4f53efe34b3a8877ac923b9350c874e3dcd5dc0a",
313 "type": "github"
314 },
315 "original": {
316 "dir": "lib",
317 "owner": "NixOS",
318 "ref": "nixos-unstable",
319 "repo": "nixpkgs",
320 "type": "github"
321 }
322 },
323 "nixpkgs-lib_2": {
324 "locked": {
325 "dir": "lib",
326 "lastModified": 1675183161,
327 "narHash": "sha256-Zq8sNgAxDckpn7tJo7V1afRSk2eoVbu3OjI1QklGLNg=",
328 "owner": "NixOS",
329 "repo": "nixpkgs",
330 "rev": "e1e1b192c1a5aab2960bf0a0bd53a2e8124fa18e",
331 "type": "github"
332 },
333 "original": {
334 "dir": "lib",
335 "owner": "NixOS",
336 "ref": "nixos-unstable",
337 "repo": "nixpkgs",
338 "type": "github"
339 }
340 },
341 "nixpkgs_2": {
342 "locked": {
343 "lastModified": 1687701825,
344 "narHash": "sha256-aMC9hqsf+4tJL7aJWSdEUurW2TsjxtDcJBwM9Y4FIYM=",
345 "owner": "NixOS",
346 "repo": "nixpkgs",
347 "rev": "07059ee2fa34f1598758839b9af87eae7f7ae6ea",
348 "type": "github"
349 },
350 "original": {
351 "owner": "NixOS",
352 "ref": "nixpkgs-unstable",
353 "repo": "nixpkgs",
354 "type": "github"
355 }
356 },
357 "nixpkgs_3": {
358 "locked": {
359 "lastModified": 1687893427,
360 "narHash": "sha256-jJHj0Lxpvov1IPYQK441oLAKxxemHm16U9jf60bXAFU=",
361 "owner": "nixos",
362 "repo": "nixpkgs",
363 "rev": "4b14ab2a916508442e685089672681dff46805be",
364 "type": "github"
365 },
366 "original": {
367 "owner": "nixos",
368 "ref": "nixos-unstable-small",
369 "repo": "nixpkgs",
370 "type": "github"
371 }
372 },
373 "nixpkgs_4": {
374 "locked": {
375 "lastModified": 1648725829,
376 "narHash": "sha256-tXEzI38lLrzW2qCAIs0UAatE2xcsTsoKWaaXqAcF1NI=",
377 "owner": "NixOS",
378 "repo": "nixpkgs",
379 "rev": "72152ff5ad470ed1a5b97c0ba2737938c136c994",
380 "type": "github"
381 },
382 "original": {
383 "owner": "NixOS",
384 "repo": "nixpkgs",
385 "type": "github"
386 }
387 },
388 "nixpkgs_5": {
389 "locked": {
390 "lastModified": 1693158576,
391 "narHash": "sha256-aRTTXkYvhXosGx535iAFUaoFboUrZSYb1Ooih/auGp0=",
392 "owner": "nixos",
393 "repo": "nixpkgs",
394 "rev": "a999c1cc0c9eb2095729d5aa03e0d8f7ed256780",
395 "type": "github"
396 },
397 "original": {
398 "owner": "NixOS",
399 "ref": "nixos-unstable",
400 "repo": "nixpkgs",
401 "type": "github"
402 }
403 },
404 "nixpkgs_6": {
405 "locked": {
406 "lastModified": 1687502512,
407 "narHash": "sha256-dBL/01TayOSZYxtY4cMXuNCBk8UMLoqRZA+94xiFpJA=",
408 "owner": "NixOS",
409 "repo": "nixpkgs",
410 "rev": "3ae20aa58a6c0d1ca95c9b11f59a2d12eebc511f",
411 "type": "github"
412 },
413 "original": {
414 "owner": "NixOS",
415 "ref": "nixos-unstable",
416 "repo": "nixpkgs",
417 "type": "github"
418 }
419 },
420 "nixpkgs_7": {
421 "locked": {
422 "lastModified": 1646497237,
423 "narHash": "sha256-Ccpot1h/rV8MgcngDp5OrdmLTMaUTbStZTR5/sI7zW0=",
424 "owner": "nixos",
425 "repo": "nixpkgs",
426 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
427 "type": "github"
428 },
429 "original": {
430 "owner": "nixos",
431 "repo": "nixpkgs",
432 "rev": "062a0c5437b68f950b081bbfc8a699d57a4ee026",
433 "type": "github"
434 }
435 },
436 "private-environment": {
437 "locked": {
438 "lastModified": 1,
439 "narHash": "sha256-rMKbM7fHqWQbI7y59BsPG8KwoDj2jyrvN2niPWB24uE=",
440 "path": "../../flakes/private/environment",
441 "type": "path"
442 },
443 "original": {
444 "path": "../../flakes/private/environment",
445 "type": "path"
446 }
447 },
448 "private-system": {
449 "inputs": {
450 "backports": "backports",
451 "environment": "environment",
452 "mypackages": "mypackages",
453 "myuids": "myuids",
454 "secrets-public": "secrets-public"
455 },
456 "locked": {
457 "lastModified": 1,
458 "narHash": "sha256-vOs7fcQVsOSl/gsyzFXfsWE7u0/O9mIKpHnwDwHxJTQ=",
459 "path": "../../flakes/private/system",
460 "type": "path"
461 },
462 "original": {
463 "path": "../../flakes/private/system",
464 "type": "path"
465 }
466 },
467 "public-secrets": {
468 "locked": {
469 "lastModified": 1,
470 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
471 "path": "../../flakes/secrets",
472 "type": "path"
473 },
474 "original": {
475 "path": "../../flakes/secrets",
476 "type": "path"
477 }
478 },
479 "root": {
480 "inputs": {
481 "impermanence": "impermanence",
482 "my-lib": "my-lib",
483 "nixpkgs": "nixpkgs_5",
484 "private-environment": "private-environment",
485 "private-system": "private-system",
486 "public-secrets": "public-secrets"
487 }
488 },
489 "secrets-public": {
490 "locked": {
491 "lastModified": 1,
492 "narHash": "sha256-5AakznhrJFmwCD7lr4JEh55MtdAJL6WA/YuBks6ISSE=",
493 "path": "../../secrets",
494 "type": "path"
495 },
496 "original": {
497 "path": "../../secrets",
498 "type": "path"
499 }
500 },
501 "stable": {
502 "locked": {
503 "lastModified": 1669735802,
504 "narHash": "sha256-qtG/o/i5ZWZLmXw108N2aPiVsxOcidpHJYNkT45ry9Q=",
505 "owner": "NixOS",
506 "repo": "nixpkgs",
507 "rev": "731cc710aeebecbf45a258e977e8b68350549522",
508 "type": "github"
509 },
510 "original": {
511 "owner": "NixOS",
512 "ref": "nixos-22.11",
513 "repo": "nixpkgs",
514 "type": "github"
515 }
516 },
517 "treefmt-nix": {
518 "inputs": {
519 "nixpkgs": [
520 "my-lib",
521 "nixos-anywhere",
522 "nixpkgs"
523 ]
524 },
525 "locked": {
526 "lastModified": 1687940979,
527 "narHash": "sha256-D4ZFkgIG2s9Fyi78T3fVG9mqMD+/UnFDB62jS4gjZKY=",
528 "owner": "numtide",
529 "repo": "treefmt-nix",
530 "rev": "0a4f06c27610a99080b69433873885df82003aae",
531 "type": "github"
532 },
533 "original": {
534 "owner": "numtide",
535 "repo": "treefmt-nix",
536 "type": "github"
537 }
538 },
539 "webapps-ttrss": {
540 "flake": false,
541 "locked": {
542 "lastModified": 1546759381,
543 "narHash": "sha256-urjf4EoLWS7G0s0hRtaErrs2B8DUatNK/eoneuB0anY=",
544 "ref": "master",
545 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
546 "revCount": 9256,
547 "type": "git",
548 "url": "https://git.tt-rss.org/fox/tt-rss.git"
549 },
550 "original": {
551 "ref": "master",
552 "rev": "986ca251f995f7754a0470d3e0c44538a545081f",
553 "type": "git",
554 "url": "https://git.tt-rss.org/fox/tt-rss.git"
555 }
556 }
557 },
558 "root": "root",
559 "version": 7
560}
diff --git a/systems/zoldene/flake.nix b/systems/zoldene/flake.nix
new file mode 100644
index 0000000..42466e8
--- /dev/null
+++ b/systems/zoldene/flake.nix
@@ -0,0 +1,29 @@
1{
2 inputs = {
3 nixpkgs.url = "github:NixOS/nixpkgs/nixos-unstable";
4 impermanence.url = "github:nix-community/impermanence/master";
5 my-lib.url = "path:../../flakes/lib";
6 public-secrets.url = "path:../../flakes/secrets";
7 private-environment.url = "path:../../flakes/private/environment";
8 private-system.url = "path:../../flakes/private/system";
9 };
10 outputs = inputs@{ self, nixpkgs, my-lib, ... }:
11 my-lib.lib.mkColmenaFlake {
12 name = "zoldene";
13 inherit self nixpkgs;
14 system = "x86_64-linux";
15 targetHost = "88.198.39.152";
16 targetUser = "root";
17 nixosModules = with inputs; {
18 impermanence = impermanence.nixosModule;
19 base = ./base.nix;
20 disko = ./disko.nix;
21 logging = ./logging.nix;
22
23 secrets = public-secrets.nixosModule;
24
25 environment = private-environment.nixosModule;
26 system = private-system.nixosModule;
27 };
28 };
29}
diff --git a/systems/zoldene/logging.nix b/systems/zoldene/logging.nix
new file mode 100644
index 0000000..09ee104
--- /dev/null
+++ b/systems/zoldene/logging.nix
@@ -0,0 +1,138 @@
1{ config, pkgs, name, ... }:
2# Initialization
3# CREATE INDEX ON LOGS (tag);
4# CREATE INDEX ON LOGS (time);
5# CREATE INDEX ON LOGS (((data->>'PRIORITY')::int));
6# CREATE INDEX ON LOGS ((data->>'_SYSTEMD_UNIT'));
7# CREATE INDEX ON LOGS ((data->>'SYSLOG_IDENTIFIER'));
8let
9 fluent-bit-config = {
10 pipeline = {
11 inputs = [
12 {
13 name = "systemd";
14 tag = "${name}.systemd";
15 DB = "/var/lib/fluentbit/fluent-bit.db";
16 }
17 ];
18 outputs = [
19 {
20 name = "loki";
21 match = "${name}.systemd";
22 line_format = "json";
23 labels = "job=fluentbit, server=${name}, priority=$PRIORITY, syslog_identifier=$SYSLOG_IDENTIFIER, systemd_unit=$_SYSTEMD_UNIT";
24 }
25 {
26 name = "pgsql";
27 match = "*";
28 host = "/run/postgresql";
29 user = "fluentbit";
30 table = "logs";
31 database = "fluentbit";
32 timestamp_key = "event_timestamp";
33 }
34 ];
35 };
36 };
37 yamlFormat = pkgs.formats.yaml {};
38 psqlVersion = pkgs.postgresql_13.psqlSchema;
39in
40{
41 disko.devices.zpool.zfast.datasets."root/persist/var/lib/loki" =
42 { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/loki"; options.mountpoint = "legacy"; };
43 disko.devices.zpool.zfast.datasets."root/persist/var/lib/fluentbit" =
44 { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/fluentbit"; options.mountpoint = "legacy"; };
45 disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql" =
46 { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql"; options.mountpoint = "legacy"; };
47 disko.devices.zpool.zfast.datasets."root/persist/var/lib/postgresql/${psqlVersion}" =
48 { type = "zfs_fs"; mountpoint = "/persist/zfast/var/lib/postgresql/${psqlVersion}"; options.mountpoint = "legacy"; };
49 environment.persistence."/persist/zfast".directories = [
50 {
51 directory = "/var/lib/postgresql";
52 user = config.users.users.postgres.name;
53 group = config.users.users.postgres.group;
54 mode = "0755";
55 }
56 {
57 directory = "/var/lib/fluentbit";
58 user = config.users.users.fluentbit.name;
59 group = config.users.users.fluentbit.group;
60 mode = "0755";
61 }
62 {
63 directory = "/var/lib/loki";
64 user = config.users.users.loki.name;
65 group = config.users.users.loki.group;
66 mode = "0755";
67 }
68 ];
69
70 ids.uids.fluentbit = 500;
71 ids.gids.fluentbit = 500;
72 users.users.fluentbit = {
73 name = "fluentbit";
74 home = "/var/lib/fluentbit";
75 uid = config.ids.uids.fluentbit;
76 group = "fluentbit";
77 isSystemUser = true;
78 extraGroups = [ "systemd-journal" ];
79 };
80 users.groups.fluentbit.gid = config.ids.gids.fluentbit;
81
82 services.loki = {
83 enable = true;
84 configuration = {
85 auth_enabled = false;
86 common = {
87 ring.kvstore.store = "inmemory";
88 ring.instance_addr = "127.0.0.1";
89 replication_factor = 1;
90 path_prefix = "/var/lib/loki";
91 };
92 server.log_level = "warn";
93 limits_config = {
94 reject_old_samples = false;
95 ingestion_rate_mb = 100;
96 ingestion_burst_size_mb = 200;
97 per_stream_rate_limit = "100MB";
98 per_stream_rate_limit_burst = "200MB";
99 };
100
101 schema_config.configs = [
102 {
103 from = "2020-10-24";
104 store = "boltdb-shipper";
105 object_store = "filesystem";
106 schema = "v11";
107 index.prefix = "index_";
108 index.period = "24h";
109 }
110 ];
111 };
112 };
113 services.postgresql = {
114 enable = true;
115 package = pkgs.postgresql_13;
116 ensureDatabases = [ "fluentbit" ];
117 ensureUsers = [
118 {
119 name = "fluentbit";
120 ensurePermissions."DATABASE \"fluentbit\"" = "ALL PRIVILEGES";
121 }
122 ];
123 };
124
125 environment.systemPackages = [
126 pkgs.fluent-bit
127 ];
128 systemd.services.fluent-bit = {
129 description = "Fluent-bit daemon";
130 wantedBy = [ "multi-user.target" ];
131 serviceConfig = {
132 ExecStart = "${pkgs.fluent-bit}/bin/fluent-bit -c ${yamlFormat.generate "fluent.yaml" fluent-bit-config}";
133 User = "fluentbit";
134 Group = "fluentbit";
135 SupplementaryGroups = [ "systemd-journal" ];
136 };
137 };
138}