##// END OF EJS Templates
release: Merge default into stable for release preparation
marcink -
r3192:689a0c93 merge stable
parent child Browse files
Show More
@@ -0,0 +1,10 b''
1 {
2 "presets": [
3 ["env", {
4 "targets": {
5 "browsers": ["last 2 versions"]
6 }
7 }]
8 ],
9 "plugins": ["transform-object-rest-spread"]
10 }
@@ -0,0 +1,44 b''
1 .. _integrations-rcextensions:
2
3
4 rcextensions integrations
5 =========================
6
7
8 Since RhodeCode 4.14 release rcextensions aren't part of rhodecode-tools, and instead
9 they are shipped with the new or upgraded installations.
10
11 The rcextensions template `rcextensions.tmpl` is created in the `etc/` directory
12 of enterprise or community installation. It's always re-created and updated on upgrades.
13
14
15 Activating rcextensions
16 +++++++++++++++++++++++
17
18 To activate rcextensions simply copy or rename the created template rcextensions
19 into the path where the rhodecode.ini file is located::
20
21 pushd ~/rccontrol/enterprise-1/
22 or
23 pushd ~/rccontrol/community-1/
24
25 mv etc/rcextensions.tmpl rcextensions
26
27
28 rcextensions are loaded when |RCE| starts. So a restart is required after activation or
29 change of code in rcextensions.
30
31 Simply restart only the enterprise/community instance::
32
33 rccontrol restart enterprise-1
34 or
35 rccontrol restart community-1
36
37
38 Example usage
39 +++++++++++++
40
41
42 To see examples of usage please check the examples directory under:
43
44 https://code.rhodecode.com/rhodecode-enterprise-ce/files/stable/rhodecode/config/rcextensions/examples
@@ -0,0 +1,114 b''
1 |RCE| 4.14.0 |RNS|
2 ------------------
3
4 Release Date
5 ^^^^^^^^^^^^
6
7 - 2018-11-02
8
9
10 New Features
11 ^^^^^^^^^^^^
12
13 - Diffs: expose range diff inside the PR view. It's now possible to show
14 commit-per-commit view of changes in pull request.
15 - Diffs: new sticky context bar.
16 When browsing diffs we show file path of the current diff so users are aware all the time
17 what file they are reviewing.
18 - Diffs: added quick file selector in diffs views. Now it's possible to select a file
19 in large diffs from the sticky header for quicker access to certain interesting files
20 in diffs.
21 - Diffs: introducing diff menu for whitespace toggle and context changes.
22 It's now possible to show/hide whitespace changes and toggle the file context in
23 all diff places including pull requests.
24 - Comments: allow commenting on empty files without content.
25 - Repositories: added option to archive repositories instead of deleting them.
26 Archived repositories are useful for future auditing, but they are read-only.
27 - rcextensions: new rcextensions. We're introducing new `rcextensions` that will be base
28 for future low-level integrations. It's now possible to expose nice messages back
29 to the users when using `rcextensions`.
30 - Summary page: slightly re-organize summary page for better user experience.
31
32
33 General
34 ^^^^^^^
35
36 - Mailing: switched from custom library to pyramid_mailer with python3 compatibility.
37 - Frontend: Switched to Polymer 3.0.
38 - Frontend: fixed problems with IE11 and brought back support for that browser.
39 - Git: use a fetch_sync based creation of remote repositories.
40 This fixes problems with importing from Bitbucket.
41 - Comments: update comments email templates.
42 - Packaging: only wrap external dependency scripts. This makes execution of scripts
43 roughly 5x faster due to much smaller PATH tree.
44 - HTTP: use application wide detection of invalid bytes sent via URL/GET/POST data.
45 - Fonts/UI: use consistent fonts across the whole application.
46 Few places had non-standard custom fonts.
47 - Google: updated google auth plugin with latest API changes.
48 - Core: handle edge case requesting matched routes but with hg/svn/git or api context.
49 - Dependencies: bumped rhodecode-tools to 1.0.0 release using Apache2 license.
50 - Dependencies: atomicwrites==1.2.1
51 - Dependencies: attrs==18.2.0
52 - Dependencies: dogpile.cache==0.6.7
53 - Dependencies: psutil==5.4.7
54 - Dependencies: pathlib2==2.3.2
55 - Dependencies: subprocess32==3.5.2
56 - Dependencies: gevent==1.3.6
57 - Dependencies: greenlet==0.4.15
58 - Dependencies: pytest==3.8.2
59 - Dependencies: py==1.6.0
60 - Dependencies: pytest-cov==2.6.0
61 - Dependencies: pytest-timeout==1.3.2
62 - Dependencies: coverage==4.5.1
63 - Dependencies: psycopg2==2.7.5
64
65
66 Security
67 ^^^^^^^^
68
69 - RST: improve Javascript RST sandbox.
70 - Jupyter: sanitize markdown cells similar as we do for our own markdown cleanup.
71
72
73 Performance
74 ^^^^^^^^^^^
75
76 - SSH: improved SSH wrapper execution speed by using optimized binary script wrapping.
77 - Core: reduced font and JavaScript load times.
78
79
80 Fixes
81 ^^^^^
82
83 - Comments: ensure we always display unmatched comments.
84 - Branch Permissions: fixed changing rule order for branch permissions.
85 - Users: ensure get_first_superadmin actually gets the 1st created super-admin.
86 - Users: when deleting users ensure we also clear personal flag.
87 This fixes some problems with multiple personal groups.
88 - Diffs: disable the error border on highlight errors.
89 - Integrations: implement retry to HTTP[S] calls for integrations.
90 Web parts will do a 3x retry call in case service is not reachable or
91 responds with 5XX codes.
92 - Git: fixed pull-request updates in case branch names are the same as the file names.
93 - Supervisor: add patch for older kernel support.
94 - Compare: fixed file after/before links in compare view for cross repo compare.
95 - Emails: improve fonts and rendering of email HTML.
96 - Permissions: flush members of user groups permissions to clear caches.
97 - Repository: add check preventing of removal of repo with attached pull requests. Users
98 should use the new archive repo function instead.
99
100
101 Upgrade notes
102 ^^^^^^^^^^^^^
103
104 - In this release, we're shipping a new `rcextensions`. The changes made are
105 backward incompatible. An update of `rcextensions` is required
106 prior to using them again. Please check the new `rcextensions.tmpl` directory
107 located in `etc/rcextensions.tmpl` in your instance installation path.
108 Old code should be 100% portable by just copy&paste to the right function.
109
110 - Mailing: We introduced a new mailing library. The older options should be compatible and
111 generally, old configuration doesn't need any changes in order to send emails.
112 We, however, encourage users to re-check mailing setup in case of some more
113 sophisticated email setups.
114 There's a possibility to send a test email from admin > settings > email section.
@@ -0,0 +1,3 b''
1 self: super: {
2
3 }
@@ -0,0 +1,16 b''
1 diff -rup supervisor-3.3.4-orig/supervisor/options.py supervisor-3.3.4/supervisor/options.py
2 --- supervisor-3.3.4-orig/supervisor/options.py 1970-01-01 01:00:01.000000000 +0100
3 +++ supervisor-3.3.4/supervisor-new/options.py 2018-10-24 10:53:19.368503735 +0200
4 @@ -1395,7 +1395,11 @@ class ServerOptions(Options):
5 name = limit['name']
6 name = name # name is used below by locals()
7
8 - soft, hard = resource.getrlimit(res)
9 + try:
10 + soft, hard = resource.getrlimit(res)
11 + except Exception:
12 + # handle old kernel problems, this is not critical to execute
13 + soft, hard = -1, -1
14
15 if (soft < min) and (soft != -1): # -1 means unlimited
16 if (hard < min) and (hard != -1):
@@ -0,0 +1,3 b''
1 ## special libraries we could extend the requirements.txt file with to add some
2 ## custom libraries usefull for debug and memory tracing
3 objgraph==3.1.1
@@ -0,0 +1,7 b''
1 This is template rcextensions.
2
3 To edit rcextensions please edit hooks.py file.
4 The examples/ directory contain some basic example how to use hooks.
5
6
7 Changes to rcextensions requires restart of RhodeCode instances.
@@ -0,0 +1,56 b''
1 # Copyright (C) 2016-2018 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 """
20 rcextensions module, please edit `hooks.py` to over write hooks logic
21 """
22
23 from .hooks import (
24 _create_repo_hook,
25 _create_repo_group_hook,
26 _pre_create_user_hook,
27 _create_user_hook,
28 _delete_repo_hook,
29 _delete_user_hook,
30 _pre_push_hook,
31 _push_hook,
32 _pre_pull_hook,
33 _pull_hook,
34 _create_pull_request_hook,
35 _review_pull_request_hook,
36 _update_pull_request_hook,
37 _merge_pull_request_hook,
38 _close_pull_request_hook,
39 )
40
41 # set as module attributes, we use those to call hooks. *do not change this*
42 CREATE_REPO_HOOK = _create_repo_hook
43 CREATE_REPO_GROUP_HOOK = _create_repo_group_hook
44 PRE_CREATE_USER_HOOK = _pre_create_user_hook
45 CREATE_USER_HOOK = _create_user_hook
46 DELETE_REPO_HOOK = _delete_repo_hook
47 DELETE_USER_HOOK = _delete_user_hook
48 PRE_PUSH_HOOK = _pre_push_hook
49 PUSH_HOOK = _push_hook
50 PRE_PULL_HOOK = _pre_pull_hook
51 PULL_HOOK = _pull_hook
52 CREATE_PULL_REQUEST = _create_pull_request_hook
53 REVIEW_PULL_REQUEST = _review_pull_request_hook
54 UPDATE_PULL_REQUEST = _update_pull_request_hook
55 MERGE_PULL_REQUEST = _merge_pull_request_hook
56 CLOSE_PULL_REQUEST = _close_pull_request_hook
@@ -0,0 +1,36 b''
1 # Example to trigger a HTTP call via an HTTP helper via post_push hook
2
3
4 @has_kwargs({
5 'server_url': 'url of instance that triggered this hook',
6 'config': 'path to .ini config used',
7 'scm': 'type of version control "git", "hg", "svn"',
8 'username': 'username of actor who triggered this event',
9 'ip': 'ip address of actor who triggered this hook',
10 'action': '',
11 'repository': 'repository name',
12 'repo_store_path': 'full path to where repositories are stored',
13 'commit_ids': '',
14 'hook_type': '',
15 'user_agent': '',
16 })
17 def _push_hook(*args, **kwargs):
18 """
19 POST PUSH HOOK, this function will be executed after each push it's
20 executed after the build-in hook that RhodeCode uses for logging pushes
21 """
22
23 from .helpers import http_call, extra_fields
24 # returns list of dicts with key-val fetched from extra fields
25 repo_extra_fields = extra_fields.run(**kwargs)
26
27 if repo_extra_fields.get('endpoint_url'):
28 endpoint = repo_extra_fields['endpoint_url']
29 if endpoint:
30 data = {
31 'some_key': 'val'
32 }
33 response = http_call.run(url=endpoint, json_data=data)
34 return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response))
35
36 return HookResponse(0, '')
@@ -0,0 +1,36 b''
1 # Example to trigger a CI call via an HTTP helper via post_push hook
2
3
4 @has_kwargs({
5 'server_url': 'url of instance that triggered this hook',
6 'config': 'path to .ini config used',
7 'scm': 'type of version control "git", "hg", "svn"',
8 'username': 'username of actor who triggered this event',
9 'ip': 'ip address of actor who triggered this hook',
10 'action': '',
11 'repository': 'repository name',
12 'repo_store_path': 'full path to where repositories are stored',
13 'commit_ids': '',
14 'hook_type': '',
15 'user_agent': '',
16 })
17 def _push_hook(*args, **kwargs):
18 """
19 POST PUSH HOOK, this function will be executed after each push it's
20 executed after the build-in hook that RhodeCode uses for logging pushes
21 """
22
23 from .helpers import http_call, extra_fields
24 # returns list of dicts with key-val fetched from extra fields
25 repo_extra_fields = extra_fields.run(**kwargs)
26
27 if repo_extra_fields.get('endpoint_url'):
28 endpoint = repo_extra_fields['endpoint_url']
29 if endpoint:
30 data = {
31 'some_key': 'val'
32 }
33 response = http_call.run(url=endpoint, json_data=data)
34 return HookResponse(0, 'Called endpoint {}, with response {}'.format(endpoint, response))
35
36 return HookResponse(0, '')
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
1 NO CONTENT: new file 100644
NO CONTENT: new file 100644
@@ -0,0 +1,17 b''
1 # Copyright (C) 2016-2018 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
@@ -0,0 +1,40 b''
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2018 RhodeCode GmbH
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
6 # (only), as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU Affero General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #
16 # This program is dual-licensed. If you wish to learn more about the
17 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # and proprietary license terms, please see https://rhodecode.com/licenses/
19
20 """
21 us in hooks::
22
23 from .helpers import extra_fields
24 # returns list of dicts with key-val fetched from extra fields
25 repo_extra_fields = extra_fields.run(**kwargs)
26
27 """
28
29
30 def run(*args, **kwargs):
31 from rhodecode.model.db import Repository
32 # use temp name then the main one propagated
33 repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository']
34 repo = Repository.get_by_repo_name(repo_name)
35
36 fields = {}
37 for field in repo.extra_fields:
38 fields[field.field_key] = field.get_dict()
39
40 return fields
@@ -0,0 +1,61 b''
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2018 RhodeCode GmbH
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
6 # (only), as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU Affero General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #
16 # This program is dual-licensed. If you wish to learn more about the
17 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # and proprietary license terms, please see https://rhodecode.com/licenses/
19
20 """
21 Extract and serialize commits taken from a list of commit_ids. This should
22 be used in post_push hook
23
24 us in hooks::
25
26 from .helpers import extract_post_commits
27 # returns list of dicts with key-val fetched from extra fields
28 commit_list = extract_post_commits.run(**kwargs)
29 """
30 import traceback
31
32
33 def run(*args, **kwargs):
34 from rhodecode.lib.utils2 import extract_mentioned_users
35 from rhodecode.model.db import Repository
36
37 commit_ids = kwargs.get('commit_ids')
38 if not commit_ids:
39 return 0
40
41 # use temp name then the main one propagated
42 repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository']
43
44 repo = Repository.get_by_repo_name(repo_name)
45 commits = []
46
47 vcs_repo = repo.scm_instance(cache=False)
48 try:
49 for commit_id in commit_ids:
50 cs = vcs_repo.get_changeset(commit_id)
51 cs_data = cs.__json__()
52 cs_data['mentions'] = extract_mentioned_users(cs_data['message'])
53 # optionally add more logic to parse the commits, like reading extra
54 # fields of repository to read managers of reviewers ?
55 commits.append(cs_data)
56 except Exception:
57 print(traceback.format_exc())
58 # we don't send any commits when crash happens, only full list matters
59 # we short circuit then.
60 return []
61 return commits
@@ -0,0 +1,63 b''
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2018 RhodeCode GmbH
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
6 # (only), as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU Affero General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #
16 # This program is dual-licensed. If you wish to learn more about the
17 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # and proprietary license terms, please see https://rhodecode.com/licenses/
19
20 """
21 us in hooks::
22
23 from .helpers import extract_pre_commits
24 # returns list of dicts with key-val fetched from extra fields
25 commit_list = extract_pre_commits.run(**kwargs)
26
27 """
28 import re
29 import collections
30
31
32 def get_hg_commits(repo, refs):
33 commits = []
34 return commits
35
36
37 def get_git_commits(repo, refs):
38 commits = []
39 return commits
40
41
42 def run(*args, **kwargs):
43 from rhodecode.model.db import Repository
44
45 vcs_type = kwargs['scm']
46 # use temp name then the main one propagated
47 repo_name = kwargs.pop('REPOSITORY', None) or kwargs['repository']
48
49 repo = Repository.get_by_repo_name(repo_name)
50 vcs_repo = repo.scm_instance(cache=False)
51
52 commits = []
53
54 for rev_data in kwargs['commit_ids']:
55 new_environ = dict((k, v) for k, v in rev_data['hg_env'])
56
57 if vcs_type == 'git':
58 commits = get_git_commits(vcs_repo, kwargs['commit_ids'])
59
60 if vcs_type == 'hg':
61 commits = get_hg_commits(vcs_repo, kwargs['commit_ids'])
62
63 return commits
@@ -0,0 +1,36 b''
1 # -*- coding: utf-8 -*-
2 # Copyright (C) 2016-2018 RhodeCode GmbH
3 #
4 # This program is free software: you can redistribute it and/or modify
5 # it under the terms of the GNU Affero General Public License, version 3
6 # (only), as published by the Free Software Foundation.
7 #
8 # This program is distributed in the hope that it will be useful,
9 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # GNU General Public License for more details.
12 #
13 # You should have received a copy of the GNU Affero General Public License
14 # along with this program. If not, see <http://www.gnu.org/licenses/>.
15 #
16 # This program is dual-licensed. If you wish to learn more about the
17 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # and proprietary license terms, please see https://rhodecode.com/licenses/
19
20 """
21 us in hooks::
22
23 from .helpers import http_call
24 # returns response after making a POST call
25 response = http_call.run(url=url, json_data=data)
26
27 """
28
29 from rhodecode.integrations.types.base import requests_retry_call
30
31
32 def run(url, json_data, method='post'):
33 requests_session = requests_retry_call()
34 requests_session.verify = True # Verify SSL
35 resp = requests_session.post(url, json=json_data, timeout=60)
36 return resp.raise_for_status() # raise exception on a failed request
@@ -0,0 +1,431 b''
1 # Copyright (C) 2016-2018 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 from .utils import DotDict, HookResponse, has_kwargs
20
21
22 # Config shortcut to keep, all configuration in one place
23 # Example: api_key = CONFIG.my_config.api_key
24 CONFIG = DotDict(
25 my_config=DotDict(
26 api_key='<secret>',
27 ),
28
29 )
30
31
32 @has_kwargs({
33 'repo_name': '',
34 'repo_type': '',
35 'description': '',
36 'private': '',
37 'created_on': '',
38 'enable_downloads': '',
39 'repo_id': '',
40 'user_id': '',
41 'enable_statistics': '',
42 'clone_uri': '',
43 'fork_id': '',
44 'group_id': '',
45 'created_by': ''
46 })
47 def _create_repo_hook(*args, **kwargs):
48 """
49 POST CREATE REPOSITORY HOOK. This function will be executed after
50 each repository is created. kwargs available:
51
52 """
53 return HookResponse(0, '')
54
55
56 @has_kwargs({
57 'group_name': '',
58 'group_parent_id': '',
59 'group_description': '',
60 'group_id': '',
61 'user_id': '',
62 'created_by': '',
63 'created_on': '',
64 'enable_locking': ''
65 })
66 def _create_repo_group_hook(*args, **kwargs):
67 """
68 POST CREATE REPOSITORY GROUP HOOK, this function will be
69 executed after each repository group is created. kwargs available:
70 """
71 return HookResponse(0, '')
72
73
74 @has_kwargs({
75 'username': '',
76 'password': '',
77 'email': '',
78 'firstname': '',
79 'lastname': '',
80 'active': '',
81 'admin': '',
82 'created_by': '',
83 })
84 def _pre_create_user_hook(*args, **kwargs):
85 """
86 PRE CREATE USER HOOK, this function will be executed before each
87 user is created, it returns a tuple of bool, reason.
88 If bool is False the user creation will be stopped and reason
89 will be displayed to the user.
90
91 Return HookResponse(1, reason) to block user creation
92
93 """
94
95 reason = 'allowed'
96 return HookResponse(0, reason)
97
98
99 @has_kwargs({
100 'username': '',
101 'full_name_or_username': '',
102 'full_contact': '',
103 'user_id': '',
104 'name': '',
105 'firstname': '',
106 'short_contact': '',
107 'admin': '',
108 'lastname': '',
109 'ip_addresses': '',
110 'extern_type': '',
111 'extern_name': '',
112 'email': '',
113 'api_key': '',
114 'api_keys': '',
115 'last_login': '',
116 'full_name': '',
117 'active': '',
118 'password': '',
119 'emails': '',
120 'inherit_default_permissions': '',
121 'created_by': '',
122 'created_on': '',
123 })
124 def _create_user_hook(*args, **kwargs):
125 """
126 POST CREATE USER HOOK, this function will be executed after each user is created
127 """
128 return HookResponse(0, '')
129
130
131 @has_kwargs({
132 'repo_name': '',
133 'repo_type': '',
134 'description': '',
135 'private': '',
136 'created_on': '',
137 'enable_downloads': '',
138 'repo_id': '',
139 'user_id': '',
140 'enable_statistics': '',
141 'clone_uri': '',
142 'fork_id': '',
143 'group_id': '',
144 'deleted_by': '',
145 'deleted_on': '',
146 })
147 def _delete_repo_hook(*args, **kwargs):
148 """
149 POST DELETE REPOSITORY HOOK, this function will be executed after
150 each repository deletion
151 """
152 return HookResponse(0, '')
153
154
155 @has_kwargs({
156 'username': '',
157 'full_name_or_username': '',
158 'full_contact': '',
159 'user_id': '',
160 'name': '',
161 'short_contact': '',
162 'admin': '',
163 'firstname': '',
164 'lastname': '',
165 'ip_addresses': '',
166 'email': '',
167 'api_key': '',
168 'last_login': '',
169 'full_name': '',
170 'active': '',
171 'password': '',
172 'emails': '',
173 'inherit_default_permissions': '',
174 'deleted_by': '',
175 })
176 def _delete_user_hook(*args, **kwargs):
177 """
178 POST DELETE USER HOOK, this function will be executed after each
179 user is deleted kwargs available:
180 """
181 return HookResponse(0, '')
182
183
184 # =============================================================================
185 # PUSH/PULL RELATED HOOKS
186 # =============================================================================
187 @has_kwargs({
188 'server_url': 'url of instance that triggered this hook',
189 'config': 'path to .ini config used',
190 'scm': 'type of version control "git", "hg", "svn"',
191 'username': 'username of actor who triggered this event',
192 'ip': 'ip address of actor who triggered this hook',
193 'action': '',
194 'repository': 'repository name',
195 'repo_store_path': 'full path to where repositories are stored',
196 'commit_ids': 'pre transaction metadata for commit ids',
197 'hook_type': '',
198 'user_agent': 'Client user agent, e.g git or mercurial CLI version',
199 })
200 def _pre_push_hook(*args, **kwargs):
201 """
202 Post push hook
203 To stop version control from storing the transaction and send a message to user
204 use non-zero HookResponse with a message, e.g return HookResponse(1, 'Not allowed')
205
206 This message will be shown back to client during PUSH operation
207
208 Commit ids might look like that::
209
210 [{u'hg_env|git_env': ...,
211 u'multiple_heads': [],
212 u'name': u'default',
213 u'new_rev': u'd0befe0692e722e01d5677f27a104631cf798b69',
214 u'old_rev': u'd0befe0692e722e01d5677f27a104631cf798b69',
215 u'ref': u'',
216 u'total_commits': 2,
217 u'type': u'branch'}]
218 """
219 return HookResponse(0, '')
220
221
222 @has_kwargs({
223 'server_url': 'url of instance that triggered this hook',
224 'config': 'path to .ini config used',
225 'scm': 'type of version control "git", "hg", "svn"',
226 'username': 'username of actor who triggered this event',
227 'ip': 'ip address of actor who triggered this hook',
228 'action': '',
229 'repository': 'repository name',
230 'repo_store_path': 'full path to where repositories are stored',
231 'commit_ids': 'list of pushed commit_ids (sha1)',
232 'hook_type': '',
233 'user_agent': 'Client user agent, e.g git or mercurial CLI version',
234 })
235 def _push_hook(*args, **kwargs):
236 """
237 POST PUSH HOOK, this function will be executed after each push it's
238 executed after the build-in hook that RhodeCode uses for logging pushes
239 """
240 return HookResponse(0, '')
241
242
243 @has_kwargs({
244 'server_url': 'url of instance that triggered this hook',
245 'repo_store_path': 'full path to where repositories are stored',
246 'config': 'path to .ini config used',
247 'scm': 'type of version control "git", "hg", "svn"',
248 'username': 'username of actor who triggered this event',
249 'ip': 'ip address of actor who triggered this hook',
250 'action': '',
251 'repository': 'repository name',
252 'hook_type': '',
253 'user_agent': 'Client user agent, e.g git or mercurial CLI version',
254 })
255 def _pre_pull_hook(*args, **kwargs):
256 """
257 Post pull hook
258 """
259 return HookResponse(0, '')
260
261
262 @has_kwargs({
263 'server_url': 'url of instance that triggered this hook',
264 'repo_store_path': 'full path to where repositories are stored',
265 'config': 'path to .ini config used',
266 'scm': 'type of version control "git", "hg", "svn"',
267 'username': 'username of actor who triggered this event',
268 'ip': 'ip address of actor who triggered this hook',
269 'action': '',
270 'repository': 'repository name',
271 'hook_type': '',
272 'user_agent': 'Client user agent, e.g git or mercurial CLI version',
273 })
274 def _pull_hook(*args, **kwargs):
275 """
276 This hook will be executed after each code pull.
277 """
278 return HookResponse(0, '')
279
280
281 # =============================================================================
282 # PULL REQUEST RELATED HOOKS
283 # =============================================================================
284 @has_kwargs({
285 'server_url': 'url of instance that triggered this hook',
286 'config': 'path to .ini config used',
287 'scm': 'type of version control "git", "hg", "svn"',
288 'username': 'username of actor who triggered this event',
289 'ip': 'ip address of actor who triggered this hook',
290 'action': '',
291 'repository': 'repository name',
292 'pull_request_id': '',
293 'url': '',
294 'title': '',
295 'description': '',
296 'status': '',
297 'created_on': '',
298 'updated_on': '',
299 'commit_ids': '',
300 'review_status': '',
301 'mergeable': '',
302 'source': '',
303 'target': '',
304 'author': '',
305 'reviewers': '',
306 })
307 def _create_pull_request_hook(*args, **kwargs):
308 """
309 This hook will be executed after creation of a pull request.
310 """
311 return HookResponse(0, '')
312
313
314 @has_kwargs({
315 'server_url': 'url of instance that triggered this hook',
316 'config': 'path to .ini config used',
317 'scm': 'type of version control "git", "hg", "svn"',
318 'username': 'username of actor who triggered this event',
319 'ip': 'ip address of actor who triggered this hook',
320 'action': '',
321 'repository': 'repository name',
322 'pull_request_id': '',
323 'url': '',
324 'title': '',
325 'description': '',
326 'status': '',
327 'created_on': '',
328 'updated_on': '',
329 'commit_ids': '',
330 'review_status': '',
331 'mergeable': '',
332 'source': '',
333 'target': '',
334 'author': '',
335 'reviewers': '',
336 })
337 def _review_pull_request_hook(*args, **kwargs):
338 """
339 This hook will be executed after review action was made on a pull request.
340 """
341 return HookResponse(0, '')
342
343
344 @has_kwargs({
345 'server_url': 'url of instance that triggered this hook',
346 'config': 'path to .ini config used',
347 'scm': 'type of version control "git", "hg", "svn"',
348 'username': 'username of actor who triggered this event',
349 'ip': 'ip address of actor who triggered this hook',
350 'action': '',
351 'repository': 'repository name',
352 'pull_request_id': '',
353 'url': '',
354 'title': '',
355 'description': '',
356 'status': '',
357 'created_on': '',
358 'updated_on': '',
359 'commit_ids': '',
360 'review_status': '',
361 'mergeable': '',
362 'source': '',
363 'target': '',
364 'author': '',
365 'reviewers': '',
366 })
367 def _update_pull_request_hook(*args, **kwargs):
368 """
369 This hook will be executed after pull requests has been updated with new commits.
370 """
371 return HookResponse(0, '')
372
373
374 @has_kwargs({
375 'server_url': 'url of instance that triggered this hook',
376 'config': 'path to .ini config used',
377 'scm': 'type of version control "git", "hg", "svn"',
378 'username': 'username of actor who triggered this event',
379 'ip': 'ip address of actor who triggered this hook',
380 'action': '',
381 'repository': 'repository name',
382 'pull_request_id': '',
383 'url': '',
384 'title': '',
385 'description': '',
386 'status': '',
387 'created_on': '',
388 'updated_on': '',
389 'commit_ids': '',
390 'review_status': '',
391 'mergeable': '',
392 'source': '',
393 'target': '',
394 'author': '',
395 'reviewers': '',
396 })
397 def _merge_pull_request_hook(*args, **kwargs):
398 """
399 This hook will be executed after merge of a pull request.
400 """
401 return HookResponse(0, '')
402
403
404 @has_kwargs({
405 'server_url': 'url of instance that triggered this hook',
406 'config': 'path to .ini config used',
407 'scm': 'type of version control "git", "hg", "svn"',
408 'username': 'username of actor who triggered this event',
409 'ip': 'ip address of actor who triggered this hook',
410 'action': '',
411 'repository': 'repository name',
412 'pull_request_id': '',
413 'url': '',
414 'title': '',
415 'description': '',
416 'status': '',
417 'created_on': '',
418 'updated_on': '',
419 'commit_ids': '',
420 'review_status': '',
421 'mergeable': '',
422 'source': '',
423 'target': '',
424 'author': '',
425 'reviewers': '',
426 })
427 def _close_pull_request_hook(*args, **kwargs):
428 """
429 This hook will be executed after close of a pull request.
430 """
431 return HookResponse(0, '')
@@ -0,0 +1,21 b''
1 # =============================================================================
2 # END OF UTILITY FUNCTIONS HERE
3 # =============================================================================
4
5 # Additional mappings that are not present in the pygments lexers
6 # used for building stats
7 # format is {'ext':['Names']} eg. {'py':['Python']} note: there can be
8 # more than one name for extension
9 # NOTE: that this will override any mappings in LANGUAGES_EXTENSIONS_MAP
10 # build by pygments
11 EXTRA_MAPPINGS = {'html': ['Text']}
12
13 # additional lexer definitions for custom files it's overrides pygments lexers,
14 # and uses defined name of lexer to colorize the files. Format is {'ext':
15 # 'lexer_name'} List of lexers can be printed running:
16 # >> python -c "import pprint;from pygments import lexers;
17 # pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);"
18
19 EXTRA_LEXERS = {
20 'tt': 'vbnet'
21 }
@@ -0,0 +1,147 b''
1 # Copyright (C) 2016-2018 RhodeCode GmbH
2 #
3 # This program is free software: you can redistribute it and/or modify
4 # it under the terms of the GNU Affero General Public License, version 3
5 # (only), as published by the Free Software Foundation.
6 #
7 # This program is distributed in the hope that it will be useful,
8 # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 # GNU General Public License for more details.
11 #
12 # You should have received a copy of the GNU Affero General Public License
13 # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 #
15 # This program is dual-licensed. If you wish to learn more about the
16 # RhodeCode Enterprise Edition, including its added features, Support services,
17 # and proprietary license terms, please see https://rhodecode.com/licenses/
18
19 import os
20 import functools
21 import collections
22
23
24 class HookResponse(object):
25 def __init__(self, status, output):
26 self.status = status
27 self.output = output
28
29 def __add__(self, other):
30 other_status = getattr(other, 'status', 0)
31 new_status = max(self.status, other_status)
32 other_output = getattr(other, 'output', '')
33 new_output = self.output + other_output
34
35 return HookResponse(new_status, new_output)
36
37 def __bool__(self):
38 return self.status == 0
39
40
41 class DotDict(dict):
42
43 def __contains__(self, k):
44 try:
45 return dict.__contains__(self, k) or hasattr(self, k)
46 except:
47 return False
48
49 # only called if k not found in normal places
50 def __getattr__(self, k):
51 try:
52 return object.__getattribute__(self, k)
53 except AttributeError:
54 try:
55 return self[k]
56 except KeyError:
57 raise AttributeError(k)
58
59 def __setattr__(self, k, v):
60 try:
61 object.__getattribute__(self, k)
62 except AttributeError:
63 try:
64 self[k] = v
65 except:
66 raise AttributeError(k)
67 else:
68 object.__setattr__(self, k, v)
69
70 def __delattr__(self, k):
71 try:
72 object.__getattribute__(self, k)
73 except AttributeError:
74 try:
75 del self[k]
76 except KeyError:
77 raise AttributeError(k)
78 else:
79 object.__delattr__(self, k)
80
81 def toDict(self):
82 return unserialize(self)
83
84 def __repr__(self):
85 keys = list(self.keys())
86 keys.sort()
87 args = ', '.join(['%s=%r' % (key, self[key]) for key in keys])
88 return '%s(%s)' % (self.__class__.__name__, args)
89
90 @staticmethod
91 def fromDict(d):
92 return serialize(d)
93
94
95 def serialize(x):
96 if isinstance(x, dict):
97 return DotDict((k, serialize(v)) for k, v in x.items())
98 elif isinstance(x, (list, tuple)):
99 return type(x)(serialize(v) for v in x)
100 else:
101 return x
102
103
104 def unserialize(x):
105 if isinstance(x, dict):
106 return dict((k, unserialize(v)) for k, v in x.items())
107 elif isinstance(x, (list, tuple)):
108 return type(x)(unserialize(v) for v in x)
109 else:
110 return x
111
112
113 def _verify_kwargs(func_name, expected_parameters, kwargs):
114 """
115 Verify that exactly `expected_parameters` are passed in as `kwargs`.
116 """
117 expected_parameters = set(expected_parameters)
118 kwargs_keys = set(kwargs.keys())
119 if kwargs_keys != expected_parameters:
120 missing_kwargs = expected_parameters - kwargs_keys
121 unexpected_kwargs = kwargs_keys - expected_parameters
122 raise AssertionError(
123 "func:%s: missing parameters: %r, unexpected parameters: %s" %
124 (func_name, missing_kwargs, unexpected_kwargs))
125
126
127 def has_kwargs(required_args):
128 """
129 decorator to verify extension calls arguments.
130
131 :param required_args:
132 """
133 def wrap(func):
134 def wrapper(*args, **kwargs):
135 _verify_kwargs(func.func_name, required_args.keys(), kwargs)
136 # in case there's `calls` defined on module we store the data
137 maybe_log_call(func.func_name, args, kwargs)
138 return func(*args, **kwargs)
139 return wrapper
140 return wrap
141
142
143 def maybe_log_call(name, args, kwargs):
144 from rhodecode.config import rcextensions
145 if hasattr(rcextensions, 'calls'):
146 calls = rcextensions.calls
147 calls[name].append((args, kwargs))
@@ -0,0 +1,36 b''
1 import logging
2
3 from sqlalchemy import *
4
5 from rhodecode.model import meta
6 from rhodecode.lib.dbmigrate.versions import _reset_base, notify
7
8 log = logging.getLogger(__name__)
9
10
11 def upgrade(migrate_engine):
12 """
13 Upgrade operations go here.
14 Don't create your own engine; bind migrate_engine to your metadata
15 """
16 _reset_base(migrate_engine)
17 from rhodecode.lib.dbmigrate.schema import db_4_13_0_0 as db
18
19 repository_table = db.Repository.__table__
20
21 archived = Column('archived', Boolean(), nullable=True)
22 archived.create(table=repository_table)
23
24 # issue fixups
25 fixups(db, meta.Session)
26
27
28 def downgrade(migrate_engine):
29 meta = MetaData()
30 meta.bind = migrate_engine
31
32
33 def fixups(models, _SESSION):
34 pass
35
36
@@ -0,0 +1,7 b''
1 import '@polymer/iron-ajax/iron-ajax.js';
2 import './shared-styles.js';
3 import './channelstream-connection/channelstream-connection.js';
4 import './rhodecode-toast/rhodecode-toast.js';
5 import './rhodecode-toggle/rhodecode-toggle.js';
6 import './rhodecode-unsafe-html/rhodecode-unsafe-html.js';
7 import './rhodecode-app/rhodecode-app.js';
@@ -0,0 +1,12 b''
1 const styleElement = document.createElement('dom-module');
2 // this will use raw-loader
3 import sharedCSS from './style-polymer.css';
4
5 styleElement.innerHTML =
6 `<template>
7 <style>
8 ${sharedCSS}
9 </style>
10 </template>`;
11
12 styleElement.register('shared-styles');
@@ -0,0 +1,45 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2016-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import pytest
22
23 from rhodecode.tests import TestController
24 from rhodecode.tests.fixture import Fixture
25
26
27 class TestBadRequestData(TestController):
28
29 def test_bad_get_data(self):
30 self.app.get(
31 '/', params={'f\xfc': '\xfc%f6%22%20onmouseover%3dveA2(9352)%20'},
32 status=400)
33
34 def test_bad_url_data(self):
35 self.app.post(
36 '/f\xfc',
37 status=400)
38
39 def test_bad_post_data(self, csrf_token, xhr_header):
40 self.app.post(
41 '/_markup_preview',
42 params={'f\xfc': '\xfc%f6%22%20onmouseover%3dveA2(9352)%20',
43 'csrf_token': csrf_token},
44 extra_environ=xhr_header,
45 status=400)
@@ -0,0 +1,83 b''
1 /* webpack.config.js */
2 require('style-loader');
3 require('css-loader');
4 var path = require('path');
5
6 const projectName = 'rhodecode-components';
7 let destinationDirectory = path.join(process.cwd(), 'rhodecode', 'public', 'js')
8
9 if (process.env.RC_STATIC_DIR) {
10 destinationDirectory = process.env.RC_STATIC_DIR;
11 }
12
13 // doing it this way because it seems that plugin via grunt does not pick up .babelrc
14 let babelRCOptions = {
15 "presets": [
16 ["env", {
17 "targets": {
18 "browsers": ["last 2 versions"]
19 }
20 }]
21 ],
22 "plugins": ["transform-object-rest-spread"]
23 }
24
25 module.exports = {
26 // Tell Webpack which file kicks off our app.
27 entry: {
28 main: path.resolve(__dirname, 'rhodecode/public/js/src/components/index.js'),
29 },
30 output: {
31 filename: 'rhodecode-components.js',
32 path: path.resolve(destinationDirectory)
33 },
34 // Tell Webpack which directories to look in to resolve import statements.
35 // Normally Webpack will look in node_modules by default but since we’re overriding
36 resolve: {
37 modules: [
38 path.resolve(__dirname, 'node_modules'),
39 ]
40 },
41 // These rules tell Webpack how to process different module types.
42 // Remember, *everything* is a module in Webpack. That includes
43 // CSS, and (thanks to our loader) HTML.
44 module: {
45 rules: [
46 {
47 test: /style-polymer.css/,
48 use: 'raw-loader'
49 },
50 {
51 // If you see a file that ends in .html, send it to these loaders.
52 test: /\.html$/,
53 // This is an example of chained loaders in Webpack.
54 // Chained loaders run last to first. So it will run
55 // polymer-webpack-loader, and hand the output to
56 // babel-loader. This let's us transpile JS in our `<script>` elements.
57 use: [
58 {loader: 'babel-loader',
59 options: babelRCOptions},
60 {loader: 'polymer-webpack-loader',
61 options: {
62 processStyleLinks: true,
63 }
64 }
65 ],
66 },
67 {
68 // If you see a file that ends in .js, just send it to the babel-loader.
69 test: /\.js$/,
70 use: {loader: 'babel-loader', options: babelRCOptions}
71 // Optionally exclude node_modules from transpilation except for polymer-webpack-loader:
72 // exclude: /node_modules\/(?!polymer-webpack-loader\/).*/
73 },
74 // this is required because of bug:
75 // https://github.com/webpack-contrib/polymer-webpack-loader/issues/49
76 {
77 test: /intl-messageformat.min.js/,
78 use: 'imports-loader?this=>window'
79 }
80 ]
81 },
82 plugins: []
83 };
@@ -1,5 +1,5 b''
1 [bumpversion]
1 [bumpversion]
2 current_version = 4.13.3
2 current_version = 4.14.0
3 message = release: Bump version {current_version} to {new_version}
3 message = release: Bump version {current_version} to {new_version}
4
4
5 [bumpversion:file:rhodecode/VERSION]
5 [bumpversion:file:rhodecode/VERSION]
@@ -24,7 +24,6 b' syntax: regexp'
24 ^.dev
24 ^.dev
25 ^._dev
25 ^._dev
26 ^build/
26 ^build/
27 ^bower_components/
28 ^coverage\.xml$
27 ^coverage\.xml$
29 ^data$
28 ^data$
30 ^\.eggs/
29 ^\.eggs/
@@ -36,14 +35,15 b' syntax: regexp'
36 ^htmlcov
35 ^htmlcov
37 ^junit\.xml$
36 ^junit\.xml$
38 ^node_modules/
37 ^node_modules/
38 ^node_binaries/
39 ^pylint.log$
39 ^pylint.log$
40 ^rcextensions/
40 ^rcextensions/
41 ^result$
41 ^result$
42 ^rhodecode/public/css/style.css$
42 ^rhodecode/public/css/style.css$
43 ^rhodecode/public/css/style-polymer.css$
43 ^rhodecode/public/css/style-polymer.css$
44 ^rhodecode/public/js/rhodecode-components.html$
44 ^rhodecode/public/js/rhodecode-components.html$
45 ^rhodecode/public/js/rhodecode-components.js$
45 ^rhodecode/public/js/scripts.js$
46 ^rhodecode/public/js/scripts.js$
46 ^rhodecode/public/js/rhodecode-components.js$
47 ^rhodecode/public/js/src/components/root-styles.gen.html$
47 ^rhodecode/public/js/src/components/root-styles.gen.html$
48 ^rhodecode/public/js/vendors/webcomponentsjs/
48 ^rhodecode/public/js/vendors/webcomponentsjs/
49 ^rhodecode\.db$
49 ^rhodecode\.db$
@@ -5,25 +5,20 b' done = false'
5 done = true
5 done = true
6
6
7 [task:rc_tools_pinned]
7 [task:rc_tools_pinned]
8 done = true
9
8
10 [task:fixes_on_stable]
9 [task:fixes_on_stable]
11 done = true
12
10
13 [task:pip2nix_generated]
11 [task:pip2nix_generated]
14 done = true
15
12
16 [task:changelog_updated]
13 [task:changelog_updated]
17 done = true
18
14
19 [task:generate_api_docs]
15 [task:generate_api_docs]
20 done = true
16
17 [task:updated_translation]
21
18
22 [release]
19 [release]
23 state = prepared
20 state = in_progress
24 version = 4.13.3
21 version = 4.14.0
25
26 [task:updated_translation]
27
22
28 [task:generate_js_routes]
23 [task:generate_js_routes]
29
24
@@ -1,4 +1,12 b''
1 var gruntConfig = require('./grunt_config.json');
1 var gruntConfig = require('./grunt_config.json');
2 var webpackConfig = require('./webpack.config');
3 gruntConfig["webpack"] = {
4 options: {
5 stats: !process.env.NODE_ENV || process.env.NODE_ENV === 'development'
6 },
7 prod: webpackConfig,
8 dev: Object.assign({ watch: false }, webpackConfig)
9 };
2
10
3 module.exports = function(grunt) {
11 module.exports = function(grunt) {
4 grunt.initConfig(gruntConfig);
12 grunt.initConfig(gruntConfig);
@@ -7,9 +15,7 b' module.exports = function(grunt) {'
7 grunt.loadNpmTasks('grunt-contrib-concat');
15 grunt.loadNpmTasks('grunt-contrib-concat');
8 grunt.loadNpmTasks('grunt-contrib-watch');
16 grunt.loadNpmTasks('grunt-contrib-watch');
9 grunt.loadNpmTasks('grunt-contrib-jshint');
17 grunt.loadNpmTasks('grunt-contrib-jshint');
10 grunt.loadNpmTasks('grunt-vulcanize');
11 grunt.loadNpmTasks('grunt-crisper');
12 grunt.loadNpmTasks('grunt-contrib-copy');
18 grunt.loadNpmTasks('grunt-contrib-copy');
13
19 grunt.loadNpmTasks('grunt-webpack');
14 grunt.registerTask('default', ['less:production', 'less:components', 'concat:polymercss', 'copy', 'concat:dist', 'vulcanize', 'crisper']);
20 grunt.registerTask('default', ['less:production', 'less:components', 'copy', 'webpack', 'concat:dist']);
15 };
21 };
@@ -39,7 +39,6 b' include rhodecode/public/sounds/*.mp3'
39 include rhodecode/public/sounds/*.wav
39 include rhodecode/public/sounds/*.wav
40
40
41 # fonts
41 # fonts
42 recursive-include rhodecode/public/fonts/ProximaNova *
43 recursive-include rhodecode/public/fonts/RCIcons *
42 recursive-include rhodecode/public/fonts/RCIcons *
44
43
45 # js
44 # js
@@ -1,9 +1,9 b''
1
1
2 .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build
2 .PHONY: clean docs docs-clean docs-cleanup test test-clean test-only test-only-postgres test-only-mysql web-build
3
3
4 WEBPACK=./node_modules/webpack/bin/webpack.js
5 GRUNT=grunt
6 NODE_PATH=./node_modules
4 NODE_PATH=./node_modules
5 WEBPACK=./node_binaries/webpack
6 GRUNT=./node_binaries/grunt
7
7
8
8
9 clean:
9 clean:
@@ -26,8 +26,6 b' debug = true'
26 #smtp_port =
26 #smtp_port =
27 #smtp_use_tls = false
27 #smtp_use_tls = false
28 #smtp_use_ssl = true
28 #smtp_use_ssl = true
29 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
30 #smtp_auth =
31
29
32 [server:main]
30 [server:main]
33 ## COMMON ##
31 ## COMMON ##
@@ -281,8 +279,10 b' supervisor.group_id = dev'
281 ## Display extended labs settings
279 ## Display extended labs settings
282 labs_settings_active = true
280 labs_settings_active = true
283
281
284 ## custom exception store path, defaults to TMPDIR
282 ## Custom exception store path, defaults to TMPDIR
285 exception_tracker.store_path =
283 ## This is used to store exception from RhodeCode in shared directory
284 #exception_tracker.store_path =
285
286
286
287 ####################################
287 ####################################
288 ### CELERY CONFIG ####
288 ### CELERY CONFIG ####
@@ -506,7 +506,7 b' debug_style = true'
506 ###########################################
506 ###########################################
507 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
507 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
508 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
508 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
509 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
509 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
510 # pymysql is an alternative driver for MySQL, use in case of problems with default one
510 # pymysql is an alternative driver for MySQL, use in case of problems with default one
511 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
511 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
512
512
@@ -26,8 +26,6 b' debug = true'
26 #smtp_port =
26 #smtp_port =
27 #smtp_use_tls = false
27 #smtp_use_tls = false
28 #smtp_use_ssl = true
28 #smtp_use_ssl = true
29 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
30 #smtp_auth =
31
29
32 [server:main]
30 [server:main]
33 ## COMMON ##
31 ## COMMON ##
@@ -256,8 +254,9 b' supervisor.group_id = prod'
256 ## Display extended labs settings
254 ## Display extended labs settings
257 labs_settings_active = true
255 labs_settings_active = true
258
256
259 ## custom exception store path, defaults to TMPDIR
257 ## Custom exception store path, defaults to TMPDIR
260 exception_tracker.store_path =
258 ## This is used to store exception from RhodeCode in shared directory
259 #exception_tracker.store_path =
261
260
262
261
263 ####################################
262 ####################################
@@ -480,7 +479,7 b' set debug = false'
480 ###########################################
479 ###########################################
481 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
480 #sqlalchemy.db1.url = sqlite:///%(here)s/rhodecode.db?timeout=30
482 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
481 #sqlalchemy.db1.url = postgresql://postgres:qweqwe@localhost/rhodecode
483 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode
482 #sqlalchemy.db1.url = mysql://root:qweqwe@localhost/rhodecode?charset=utf8
484 # pymysql is an alternative driver for MySQL, use in case of problems with default one
483 # pymysql is an alternative driver for MySQL, use in case of problems with default one
485 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
484 #sqlalchemy.db1.url = mysql+pymysql://root:qweqwe@localhost/rhodecode
486
485
@@ -9,7 +9,7 b''
9 # {
9 # {
10 # # Thoughts on how to configure the dev environment
10 # # Thoughts on how to configure the dev environment
11 # rc = {
11 # rc = {
12 # codeInternalUrl = "https://usr:token@internal-code.rhodecode.com";
12 # codeInternalUrl = "https://usr:token@code.rhodecode.com/internal";
13 # sources = {
13 # sources = {
14 # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver";
14 # rhodecode-vcsserver = "/home/user/work/rhodecode-vcsserver";
15 # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce";
15 # rhodecode-enterprise-ce = "/home/user/work/rhodecode-enterprise-ce";
@@ -26,10 +26,18 b' args@'
26 }:
26 }:
27
27
28 let
28 let
29 # Use nixpkgs from args or import them. We use this indirect approach
29 pkgs_ = (import <nixpkgs> {});
30 # through args to be able to use the name `pkgs` for our customized packages.
30 in
31 # Otherwise we will end up with an infinite recursion.
31
32 pkgs = args.pkgs or (import <nixpkgs> { });
32 let
33 pkgs = import <nixpkgs> {
34 overlays = [
35 (import ./pkgs/overlays.nix)
36 ];
37 inherit
38 (pkgs_)
39 system;
40 };
33
41
34 # Works with the new python-packages, still can fallback to the old
42 # Works with the new python-packages, still can fallback to the old
35 # variant.
43 # variant.
@@ -46,7 +54,7 b' let'
46 in
54 in
47 !builtins.elem (basename path) [
55 !builtins.elem (basename path) [
48 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
56 ".git" ".hg" "__pycache__" ".eggs" ".idea" ".dev"
49 "bower_components" "node_modules"
57 "node_modules" "node_binaries"
50 "build" "data" "result" "tmp"] &&
58 "build" "data" "result" "tmp"] &&
51 !builtins.elem ext ["egg-info" "pyc"] &&
59 !builtins.elem ext ["egg-info" "pyc"] &&
52 # TODO: johbo: This check is wrong, since "path" contains an absolute path,
60 # TODO: johbo: This check is wrong, since "path" contains an absolute path,
@@ -55,7 +63,11 b' let'
55
63
56 sources =
64 sources =
57 let
65 let
58 inherit (pkgs.lib) all isString attrValues;
66 inherit
67 (pkgs.lib)
68 all
69 isString
70 attrValues;
59 sourcesConfig = pkgs.config.rc.sources or {};
71 sourcesConfig = pkgs.config.rc.sources or {};
60 in
72 in
61 # Ensure that sources are configured as strings. Using a path
73 # Ensure that sources are configured as strings. Using a path
@@ -66,18 +78,12 b' let'
66 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
78 version = builtins.readFile "${rhodecode-enterprise-ce-src}/rhodecode/VERSION";
67 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
79 rhodecode-enterprise-ce-src = builtins.filterSource src-filter ./.;
68
80
69 buildBowerComponents = pkgs.buildBowerComponents;
70 nodeEnv = import ./pkgs/node-default.nix {
81 nodeEnv = import ./pkgs/node-default.nix {
71 inherit pkgs;
82 inherit
83 pkgs;
72 };
84 };
73 nodeDependencies = nodeEnv.shell.nodeDependencies;
85 nodeDependencies = nodeEnv.shell.nodeDependencies;
74
86
75 bowerComponents = buildBowerComponents {
76 name = "enterprise-ce-${version}";
77 generated = ./pkgs/bower-packages.nix;
78 src = rhodecode-enterprise-ce-src;
79 };
80
81 rhodecode-testdata-src = sources.rhodecode-testdata or (
87 rhodecode-testdata-src = sources.rhodecode-testdata or (
82 pkgs.fetchhg {
88 pkgs.fetchhg {
83 url = "https://code.rhodecode.com/upstream/rc_testdata";
89 url = "https://code.rhodecode.com/upstream/rc_testdata";
@@ -95,23 +101,22 b' let'
95 pythonLocalOverrides = self: super: {
101 pythonLocalOverrides = self: super: {
96 rhodecode-enterprise-ce =
102 rhodecode-enterprise-ce =
97 let
103 let
98 linkNodeAndBowerPackages = ''
104 linkNodePackages = ''
99 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
105 export RHODECODE_CE_PATH=${rhodecode-enterprise-ce-src}
100
106
101 echo "[BEGIN]: Link node packages"
107 echo "[BEGIN]: Link node packages and binaries"
102 rm -fr node_modules
103 mkdir node_modules
104 # johbo: Linking individual packages allows us to run "npm install"
108 # johbo: Linking individual packages allows us to run "npm install"
105 # inside of a shell to try things out. Re-entering the shell will
109 # inside of a shell to try things out. Re-entering the shell will
106 # restore a clean environment.
110 # restore a clean environment.
111 rm -fr node_modules
112 mkdir node_modules
107 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
113 ln -s ${nodeDependencies}/lib/node_modules/* node_modules/
108 echo "[DONE]: Link node packages"
114 export NODE_PATH=./node_modules
109
115
110 echo "[BEGIN]: Link bower packages"
116 rm -fr node_binaries
111 rm -fr bower_components
117 mkdir node_binaries
112 mkdir bower_components
118 ln -s ${nodeDependencies}/bin/* node_binaries/
113 ln -s ${bowerComponents}/bower_components/* bower_components/
119 echo "[DONE ]: Link node packages and binaries"
114 echo "[DONE]: Link bower packages"
115 '';
120 '';
116
121
117 releaseName = "RhodeCodeEnterpriseCE-${version}";
122 releaseName = "RhodeCodeEnterpriseCE-${version}";
@@ -129,8 +134,7 b' let'
129 passthru = {
134 passthru = {
130 inherit
135 inherit
131 rhodecode-testdata
136 rhodecode-testdata
132 bowerComponents
137 linkNodePackages
133 linkNodeAndBowerPackages
134 myPythonPackagesUnfix
138 myPythonPackagesUnfix
135 pythonLocalOverrides
139 pythonLocalOverrides
136 pythonCommunityOverrides;
140 pythonCommunityOverrides;
@@ -141,8 +145,6 b' let'
141 buildInputs =
145 buildInputs =
142 attrs.buildInputs or [] ++ [
146 attrs.buildInputs or [] ++ [
143 rhodecode-testdata
147 rhodecode-testdata
144 pkgs.nodePackages.bower
145 pkgs.nodePackages.grunt-cli
146 ];
148 ];
147
149
148 #NOTE: option to inject additional propagatedBuildInputs
150 #NOTE: option to inject additional propagatedBuildInputs
@@ -175,39 +177,66 b' let'
175 '';
177 '';
176
178
177 preBuild = ''
179 preBuild = ''
178
180 echo "[BEGIN]: Building frontend assets"
179 echo "Building frontend assets"
181 ${linkNodePackages}
180 ${linkNodeAndBowerPackages}
182 make web-build
181 grunt
182 rm -fr node_modules
183 rm -fr node_modules
184 rm -fr node_binaries
185 echo "[DONE ]: Building frontend assets"
183 '';
186 '';
184
187
185 postInstall = ''
188 postInstall = ''
189 # check required files
190 STATIC_CHECK="/robots.txt /502.html
191 /js/scripts.js /js/rhodecode-components.js
192 /css/style.css /css/style-polymer.css"
193
194 for file in $STATIC_CHECK;
195 do
196 if [ ! -f rhodecode/public/$file ]; then
197 echo "Missing $file"
198 exit 1
199 fi
200 done
201
186 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
202 echo "Writing enterprise-ce meta information for rccontrol to nix-support/rccontrol"
187 mkdir -p $out/nix-support/rccontrol
203 mkdir -p $out/nix-support/rccontrol
188 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
204 cp -v rhodecode/VERSION $out/nix-support/rccontrol/version
189 echo "[DONE]: enterprise-ce meta information for rccontrol written"
205 echo "[DONE ]: enterprise-ce meta information for rccontrol written"
190
206
191 mkdir -p $out/etc
207 mkdir -p $out/etc
192 cp configs/production.ini $out/etc
208 cp configs/production.ini $out/etc
193 echo "[DONE]: saved enterprise-ce production.ini into $out/etc"
209 echo "[DONE ]: saved enterprise-ce production.ini into $out/etc"
210
211 cp -Rf rhodecode/config/rcextensions $out/etc/rcextensions.tmpl
212 echo "[DONE ]: saved enterprise-ce rcextensions into $out/etc/rcextensions.tmpl"
194
213
195 # python based programs need to be wrapped
214 # python based programs need to be wrapped
196 mkdir -p $out/bin
215 mkdir -p $out/bin
197 # rhodecode-tools
198 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
199
216
200 # required binaries from dependencies
217 # required binaries from dependencies
201 #ln -s ${self.python}/bin/python $out/bin
218 ln -s ${self.supervisor}/bin/supervisorctl $out/bin/
202 ln -s ${self.pyramid}/bin/* $out/bin/
219 ln -s ${self.supervisor}/bin/supervisord $out/bin/
203 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
204 ln -s ${self.supervisor}/bin/supervisor* $out/bin/
205 ln -s ${self.pastescript}/bin/paster $out/bin/
220 ln -s ${self.pastescript}/bin/paster $out/bin/
206 ln -s ${self.channelstream}/bin/channelstream $out/bin/
221 ln -s ${self.channelstream}/bin/channelstream $out/bin/
207 ln -s ${self.celery}/bin/celery $out/bin/
222 ln -s ${self.celery}/bin/celery $out/bin/
208 echo "[DONE]: created symlinks into $out/bin"
223 ln -s ${self.gunicorn}/bin/gunicorn $out/bin/
224 ln -s ${self.pyramid}/bin/prequest $out/bin/
225 ln -s ${self.pyramid}/bin/pserve $out/bin/
209
226
210 for file in $out/bin/*;
227 echo "[DONE ]: created symlinks into $out/bin"
228 DEPS="$out/bin/supervisorctl \
229 $out/bin/supervisord \
230 $out/bin/paster \
231 $out/bin/channelstream \
232 $out/bin/celery \
233 $out/bin/gunicorn \
234 $out/bin/prequest \
235 $out/bin/pserve"
236
237 # wrap only dependency scripts, they require to have full PYTHONPATH set
238 # to be able to import all packages
239 for file in $DEPS;
211 do
240 do
212 wrapProgram $file \
241 wrapProgram $file \
213 --prefix PATH : $PATH \
242 --prefix PATH : $PATH \
@@ -215,16 +244,18 b' let'
215 --set PYTHONHASHSEED random
244 --set PYTHONHASHSEED random
216 done
245 done
217
246
218 echo "[DONE]: enterprise-ce binary wrapping"
247 echo "[DONE ]: enterprise-ce binary wrapping"
248
249 # rhodecode-tools don't need wrapping
250 ln -s ${self.rhodecode-tools}/bin/rhodecode-* $out/bin/
219
251
220 if [ ! -f rhodecode/public/js/scripts.js ]; then
252 # expose sources of CE
221 echo "Missing scripts.js"
253 ln -s $out $out/etc/rhodecode_enterprise_ce_source
222 exit 1
254
223 fi
255 # expose static files folder
224 if [ ! -f rhodecode/public/css/style.css ]; then
256 cp -Rf $out/lib/${self.python.libPrefix}/site-packages/rhodecode/public/ $out/etc/static
225 echo "Missing style.css"
257 chmod 755 -R $out/etc/static
226 exit 1
258
227 fi
228 '';
259 '';
229 });
260 });
230
261
@@ -237,8 +268,13 b' let'
237 getAttr pythonPackages pkgs;
268 getAttr pythonPackages pkgs;
238
269
239 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
270 pythonGeneratedPackages = import ./pkgs/python-packages.nix {
240 inherit pkgs;
271 inherit
241 inherit (pkgs) fetchurl fetchgit fetchhg;
272 pkgs;
273 inherit
274 (pkgs)
275 fetchurl
276 fetchgit
277 fetchhg;
242 };
278 };
243
279
244 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
280 pythonCommunityOverrides = import ./pkgs/python-packages-overrides.nix {
@@ -162,7 +162,8 b' To add custom hooks to your instance, us'
162
162
163 1. Open :menuselection:`Admin --> Settings --> Hooks`
163 1. Open :menuselection:`Admin --> Settings --> Hooks`
164 2. Add your custom hook details, you can use a file path to specify custom
164 2. Add your custom hook details, you can use a file path to specify custom
165 hook scripts, for example: ``python:/path/to/custom_hook.py``
165 hook scripts, for example:
166 ``pretxnchangegroup.example`` with value ``python:/path/to/custom_hook.py:my_func_name``
166 3. Select :guilabel:`Save`
167 3. Select :guilabel:`Save`
167
168
168 Also, see the |RC| Extensions section of the :ref:`rc-tools` guide. |RC|
169 Also, see the |RC| Extensions section of the :ref:`rc-tools` guide. |RC|
@@ -18,8 +18,8 b' Prerequisites'
18 .. tip::
18 .. tip::
19
19
20 We recommend using Wandisco repositories which provide latest SVN versions
20 We recommend using Wandisco repositories which provide latest SVN versions
21 for most platforms. Below is example how to add the wandisco repositories
21 for most platforms.
22 for Ubuntu.
22 Here is an example how to add the Wandisco repositories for Ubuntu.
23
23
24 .. code-block:: bash
24 .. code-block:: bash
25
25
@@ -27,15 +27,28 b' Prerequisites'
27 $ sudo wget -q http://opensource.wandisco.com/wandisco-debian.gpg -O- | sudo apt-key add -
27 $ sudo wget -q http://opensource.wandisco.com/wandisco-debian.gpg -O- | sudo apt-key add -
28 $ sudo apt-get update
28 $ sudo apt-get update
29
29
30 Here is an example how to add the Wandisco repositories for Centos/Redhat. Using
31 a yum config
30
32
31 Using Ubuntu 14.04/16.04 Distribution as an example execute the following to
33 .. code-block:: bash
32 install required components:
34
35 [wandisco-Git]
36 name=CentOS-6 - Wandisco Git
37 baseurl=http://opensource.wandisco.com/centos/6/git/$basearch/
38 enabled=1
39 gpgcheck=1
40 gpgkey=http://opensource.wandisco.com/RPM-GPG-KEY-WANdisco
41
42
43
44 Example installation of required components for Ubuntu platform:
33
45
34 .. code-block:: bash
46 .. code-block:: bash
35
47
36 $ sudo apt-get install apache2 libapache2-mod-svn
48 $ sudo apt-get install apache2
49 $ sudo apt-get install libapache2-mod-svn
37
50
38 Once installed you need to enable ``dav_svn``:
51 Once installed you need to enable ``dav_svn`` on Ubuntu:
39
52
40 .. code-block:: bash
53 .. code-block:: bash
41
54
@@ -44,6 +57,26 b' Once installed you need to enable ``dav_'
44 $ sudo a2enmod authn_anon
57 $ sudo a2enmod authn_anon
45
58
46
59
60 Example installation of required components for RedHat/CentOS platform:
61
62 .. code-block:: bash
63
64 $ sudo yum install httpd
65 $ sudo yum install subversion mod_dav_svn
66
67
68 Once installed you need to enable ``dav_svn`` on RedHat/CentOS:
69
70 .. code-block:: bash
71
72 sudo vi /etc/httpd/conf.modules.d/10-subversion.conf
73 ## The file should read:
74
75 LoadModule dav_svn_module modules/mod_dav_svn.so
76 LoadModule headers_module modules/mod_headers.so
77 LoadModule authn_anon_module modules/mod_authn_anon.so
78
79
47 Configuring Apache Setup
80 Configuring Apache Setup
48 ========================
81 ========================
49
82
@@ -13,48 +13,4 b' dependencies for Python and JavaScript w'
13 this section to generate the needed Nix derivations.
13 this section to generate the needed Nix derivations.
14
14
15
15
16 Python dependencies
16 Please check pkgs/README.rst file for mor information on how to build the packages.
17 ===================
18
19 We use the tool `pip2nix` to generate the Nix derivations for our Python
20 dependencies.
21
22 Generating the dependencies should be done with the following command:
23
24 .. code:: shell
25
26 pip2nix generate --license
27
28
29 .. note::
30
31 License extraction support is still experimental, use the version from the
32 following pull request: https://github.com/ktosiek/pip2nix/pull/30
33
34
35
36 Node dependencies
37 =================
38
39 After adding new dependencies via ``npm install --save``, use `node2nix` to
40 update the corresponding Nix derivations:
41
42 .. code:: shell
43
44 cd pkgs
45 node2nix --input ../package.json \
46 -o node-packages.nix \
47 -e node-env.nix \
48 -c node-default.nix \
49 -d --flatten
50
51
52 Bower dependencies
53 ==================
54
55 Frontend dependencies are managed based on `bower`, with `bower2nix` a tool
56 exists which can generate the needed Nix derivations:
57
58 .. code:: shell
59
60 bower2nix bower.json pkgs/bower-packages.nix
@@ -14,12 +14,23 b' so to clarify what is meant each time, r'
14 between software components and can be used to trigger plugins, or their
14 between software components and can be used to trigger plugins, or their
15 extensions.
15 extensions.
16
16
17 .. toctree::
17
18 Hooks
19 -----
20
21 Within |RCM| there are two types of supported hooks.
18
22
19 rcx
23 * **Internal built-in hooks**: The internal |hg|, |git| or |svn| hooks are
20 install-ext
24 triggered by different VCS operations, like push, pull,
21 config-ext
25 or clone and are non-configurable, but you can add your own VCS hooks,
22 extensions
26 see :ref:`custom-hooks`.
23 hooks
27 * **Custom rcextensions hooks**: User defined hooks centre around the lifecycle of
24 full-blown-example
28 certain actions such are |repo| creation, user creation etc. The actions
25 int-slack
29 these hooks trigger can be rejected based on the API permissions of the
30 user calling them.
31
32 On instructions how to use the custom `rcextensions`
33 see :ref:`integrations-rcextensions` section.
34
35
36
@@ -19,9 +19,7 b' Once configured you can check the settin'
19 ## Additionally these settings will be used by the RhodeCode mailing system ##
19 ## Additionally these settings will be used by the RhodeCode mailing system ##
20 ################################################################################
20 ################################################################################
21 #email_to = admin@localhost
21 #email_to = admin@localhost
22 #error_email_from = paste_error@localhost
23 #app_email_from = rhodecode-noreply@localhost
22 #app_email_from = rhodecode-noreply@localhost
24 #error_message =
25 #email_prefix = [RhodeCode]
23 #email_prefix = [RhodeCode]
26
24
27 #smtp_server = mail.server.com
25 #smtp_server = mail.server.com
@@ -30,5 +28,3 b' Once configured you can check the settin'
30 #smtp_port =
28 #smtp_port =
31 #smtp_use_tls = false
29 #smtp_use_tls = false
32 #smtp_use_ssl = true
30 #smtp_use_ssl = true
33 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
34 #smtp_auth =
@@ -3,7 +3,7 b''
3 Integrations
3 Integrations
4 ------------
4 ------------
5
5
6 Rhodecode supports integrations with external services for various events,
6 |RCE| supports integrations with external services for various events,
7 such as commit pushes and pull requests. Multiple integrations of the same type
7 such as commit pushes and pull requests. Multiple integrations of the same type
8 can be added at the same time; this is useful for posting different events to
8 can be added at the same time; this is useful for posting different events to
9 different Slack channels, for example.
9 different Slack channels, for example.
@@ -11,18 +11,20 b' different Slack channels, for example.'
11 Supported integrations
11 Supported integrations
12 ^^^^^^^^^^^^^^^^^^^^^^
12 ^^^^^^^^^^^^^^^^^^^^^^
13
13
14 ============================ ============ =====================================
14 ================================ ============ ========================================
15 Type/Name |RC| Edition Description
15 Type/Name |RC| Edition Description
16 ============================ ============ =====================================
16 ================================ ============ ========================================
17 :ref:`integrations-slack` |RCCEshort| https://slack.com/
17 :ref:`integrations-webhook` |RCCEshort| Trigger events as `json` to a custom url
18 :ref:`integrations-hipchat` |RCCEshort| https://www.hipchat.com/
18 :ref:`integrations-slack` |RCCEshort| Integrate with https://slack.com/
19 :ref:`integrations-webhook` |RCCEshort| POST events as `json` to a custom url
19 :ref:`integrations-hipchat` |RCCEshort| Integrate with https://www.hipchat.com/
20 :ref:`integrations-ci` |RCCEshort| Trigger Builds for Common CI Systems
20 :ref:`integrations-email` |RCCEshort| Send repo push commits by email
21 :ref:`integrations-email` |RCCEshort| Send repo push commits by email
21 :ref:`integrations-ci` |RCCEshort| Trigger Builds for Common CI Systems
22 :ref:`integrations-jenkins` |RCEEshort| Trigger Builds for Jenkins CI System
22 :ref:`integrations-rcextensions` |RCCEshort| Advanced low-level integration framework
23 :ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference Redmine issues
23
24 :ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues
24 :ref:`integrations-jenkins` |RCEEshort| Trigger Builds for Jenkins CI System
25 ============================ ============ =====================================
25 :ref:`integrations-redmine` |RCEEshort| Close/Resolve/Reference Redmine issues
26 :ref:`integrations-jira` |RCEEshort| Close/Resolve/Reference JIRA issues
27 ================================ ============ ========================================
26
28
27 .. _creating-integrations:
29 .. _creating-integrations:
28
30
@@ -55,3 +57,4 b' See pages specific to each type of integ'
55 email
57 email
56 ci
58 ci
57 jenkins
59 jenkins
60 integrations-rcextensions
@@ -9,6 +9,7 b' Release Notes'
9 .. toctree::
9 .. toctree::
10 :maxdepth: 1
10 :maxdepth: 1
11
11
12 release-notes-4.14.0.rst
12 release-notes-4.13.3.rst
13 release-notes-4.13.3.rst
13 release-notes-4.13.2.rst
14 release-notes-4.13.2.rst
14 release-notes-4.13.1.rst
15 release-notes-4.13.1.rst
@@ -1,13 +1,13 b''
1 .menuselection, .guilabel {
1 .menuselection, .guilabel {
2 font-size: .90em;
2 font-size: .90em;
3 font-family: "proximanovaregular", "Proxima Nova Regular", "Proxima Nova", sans-serif;
3 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
4 font-style: oblique;
4 font-style: oblique;
5 }
5 }
6
6
7 .version{
7 .version {
8 display: none;
8 display: none;
9 }
9 }
10
10
11 .pre{
11 .pre {
12 color:#000
12 color: #000
13 }
13 }
@@ -273,107 +273,8 b' Use this to create or update a |RCE| con'
273 rhodecode-extensions
273 rhodecode-extensions
274 --------------------
274 --------------------
275
275
276 |RCT| adds additional mapping for :ref:`indexing-ref`, statistics, and adds
276 The `rcextensions` since version 4.14 are now shipped together with |RCE| please check
277 additional code for push/pull/create/delete |repo| hooks. These hooks can be
277 the using :ref:`integrations-rcextensions` section.
278 used to send signals to build-bots such as jenkins. Options:
279
280 .. rst-class:: dl-horizontal
281
282 \-c, - -config <config_file>
283 Create a configuration file. The default file is created
284 in ``~/.rhoderc``
285
286 \-h, - -help
287 Show help messages.
288
289 \-F, - -format {json,pretty}
290 Set the formatted representation.
291
292 \-I, - -install-dir <str>
293 Set the location of the |RCE| installation. The default location is
294 :file:`/home/{user}/.rccontrol/`.
295
296 \ - -ini-file <str>
297 Path to the :file:`rhodecode.ini` file for that instance.
298
299 \ - -instance-name <instance-id>
300 Set the instance name.
301
302 \ - -plugins
303 Add plugins to your |RCE| installation. See the
304 :ref:`extensions-hooks-ref` section for more details.
305
306 \ - -version
307 Display your |RCT| version.
308
309
310 Once installed, you will see a :file:`rcextensions` folder in the instance
311 directory, for example :file:`home/{user}/.rccontrol/{instance-id}/rcextensions`
312
313 To install ``rcextensions``, use the following example:
314
315 .. code-block:: bash
316
317 # install extensions on the given instance
318 # If using virtualenv prior to RCE 350
319 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
320 --ini-file=rhodecode.ini
321 Writen new extensions file to rcextensions
322
323 # install extensions with additional plugins on the given instance
324 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
325 --ini-file=rhodecode.ini --plugins
326 Writen new extensions file to rcextensions
327
328 # installing extensions from 350 onwards
329 # as they are packaged with RCE
330 $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \
331 --instance-name=enterprise-4 --ini-file=rhodecode.ini
332
333 Writen new extensions file to rcextensions
334
335 See the new extensions inside this directory for more details about the
336 additional hooks available, for example see the ``push_post.py`` file.
337
338 .. code-block:: python
339
340 import urllib
341 import urllib2
342
343 def run(*args, **kwargs):
344 """
345 Extra params
346
347 :param URL: url to send the data to
348 """
349
350 url = kwargs.pop('URL', None)
351 if url:
352 from rhodecode.lib.compat import json
353 from rhodecode.model.db import Repository
354
355 repo = Repository.get_by_repo_name(kwargs['repository'])
356 changesets = []
357 vcs_repo = repo.scm_instance_no_cache()
358 for r in kwargs['pushed_revs']:
359 cs = vcs_repo.get_changeset(r)
360 changesets.append(json.dumps(cs))
361
362 kwargs['pushed_revs'] = changesets
363 headers = {
364 'User-Agent': 'RhodeCode-SCM web hook',
365 'Content-type': 'application/x-www-form-urlencoded; charset=UTF-8',
366 'Accept': 'text/javascript, text/html, application/xml, '
367 'text/xml, */*',
368 'Accept-Encoding': 'gzip,deflate,sdch',
369 }
370
371 data = kwargs
372 data = urllib.urlencode(data)
373 req = urllib2.Request(url, data, headers)
374 response = urllib2.urlopen(req)
375 response.read()
376 return 0
377
278
378
279
379 rhodecode-gist
280 rhodecode-gist
@@ -54,23 +54,13 b' packaged with |RCE| by default.'
54
54
55 .. code-block:: bash
55 .. code-block:: bash
56
56
57 $ .rccontrol/enterprise-4/profile/bin/rhodecode-extensions --plugins \
57 $ .rccontrol/enterprise-4/profile/bin/rhodecode-api --instance-name=enterprise-4 get_ip [11:56:57 on 05/10/2018]
58 --instance-name=enterprise-4 --ini-file=rhodecode.ini
59
58
60 Writen new extensions file to rcextensions
59 {
61 Copied hipchat_push_notify.py plugin to rcextensions
60 "error": null,
62 Copied jira_pr_flow.py plugin to rcextensions
61 "id": 1000,
63 Copied default_reviewers.py plugin to rcextensions
62 "result": {
64 Copied extract_commits.py plugin to rcextensions
63 "server_ip_addr": "1.2.3.4",
65 Copied extract_issues.py plugin to rcextensions
64 "user_ips": []
66 Copied redmine_pr_flow.py plugin to rcextensions
65 }
67 Copied extra_fields.py plugin to rcextensions
66 }
68 Copied jira_smart_commits.py plugin to rcextensions
69 Copied http_notify.py plugin to rcextensions
70 Copied slack_push_notify.py plugin to rcextensions
71 Copied slack_message.py plugin to rcextensions
72 Copied extract_jira_issues.py plugin to rcextensions
73 Copied extract_redmine_issues.py plugin to rcextensions
74 Copied redmine_smart_commits.py plugin to rcextensions
75 Copied send_mail.py plugin to rcextensions
76
@@ -1,35 +1,33 b''
1 {
1 {
2 "dirs": {
2 "dirs": {
3 "css": {
3 "css": {
4 "src":"rhodecode/public/css",
4 "src": "rhodecode/public/css",
5 "dest":"rhodecode/public/css"
5 "dest": "rhodecode/public/css"
6 },
6 },
7 "js": {
7 "js": {
8 "src": "rhodecode/public/js/src",
8 "src": "rhodecode/public/js/src",
9 "src_rc": "rhodecode/public/js/rhodecode",
9 "src_rc": "rhodecode/public/js/rhodecode",
10 "dest": "rhodecode/public/js",
10 "dest": "rhodecode/public/js",
11 "bower": "bower_components",
12 "node_modules": "node_modules"
11 "node_modules": "node_modules"
13 }
12 }
14 },
13 },
15 "copy": {
14 "copy": {
16 "main": {
15 "main": {
17 "expand": true,
16 "files": [
18 "cwd": "bower_components",
17 {
19 "src": "webcomponentsjs/webcomponents-lite.js",
18 "expand": true,
20 "dest": "<%= dirs.js.dest %>/vendors"
19 "cwd": "node_modules/@webcomponents",
20 "src": "webcomponentsjs/*.*",
21 "dest": "<%= dirs.js.dest %>/vendors"
22 },
23 {
24 "src": "<%= dirs.css.src %>/style-polymer.css",
25 "dest": "<%= dirs.js.dest %>/src/components/style-polymer.css"
26 }
27 ]
21 }
28 }
22 },
29 },
23 "concat": {
30 "concat": {
24 "polymercss": {
25 "src": [
26 "<%= dirs.js.src %>/components/root-styles-prefix.html",
27 "<%= dirs.css.src %>/style-polymer.css",
28 "<%= dirs.js.src %>/components/root-styles-suffix.html"
29 ],
30 "dest": "<%= dirs.js.dest %>/src/components/root-styles.gen.html",
31 "nonull": true
32 },
33 "dist": {
31 "dist": {
34 "src": [
32 "src": [
35 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
33 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
@@ -37,6 +35,10 b''
37 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
35 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
38 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
36 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
39 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
37 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
38 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
39 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
40 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
41 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
40 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
42 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
41 "<%= dirs.js.src %>/logging.js",
43 "<%= dirs.js.src %>/logging.js",
42 "<%= dirs.js.src %>/bootstrap.js",
44 "<%= dirs.js.src %>/bootstrap.js",
@@ -89,22 +91,13 b''
89 "<%= dirs.js.src %>/rhodecode/tooltips.js",
91 "<%= dirs.js.src %>/rhodecode/tooltips.js",
90 "<%= dirs.js.src %>/rhodecode/users.js",
92 "<%= dirs.js.src %>/rhodecode/users.js",
91 "<%= dirs.js.src %>/rhodecode/appenlight.js",
93 "<%= dirs.js.src %>/rhodecode/appenlight.js",
92 "<%= dirs.js.src %>/rhodecode.js"
94 "<%= dirs.js.src %>/rhodecode.js",
95 "<%= dirs.js.dest %>/rhodecode-components.js"
93 ],
96 ],
94 "dest": "<%= dirs.js.dest %>/scripts.js",
97 "dest": "<%= dirs.js.dest %>/scripts.js",
95 "nonull": true
98 "nonull": true
96 }
99 }
97 },
100 },
98 "crisper": {
99 "dist": {
100 "options": {
101 "cleanup": false,
102 "onlySplit": true
103 },
104 "src": "<%= dirs.js.dest %>/rhodecode-components.html",
105 "dest": "<%= dirs.js.dest %>/rhodecode-components.js"
106 }
107 },
108 "less": {
101 "less": {
109 "development": {
102 "development": {
110 "options": {
103 "options": {
@@ -152,8 +145,7 b''
152 "less:development",
145 "less:development",
153 "less:components",
146 "less:components",
154 "concat:polymercss",
147 "concat:polymercss",
155 "vulcanize",
148 "webpack",
156 "crisper",
157 "concat:dist"
149 "concat:dist"
158 ]
150 ]
159 },
151 },
@@ -166,8 +158,7 b''
166 "tasks": [
158 "tasks": [
167 "less:components",
159 "less:components",
168 "concat:polymercss",
160 "concat:polymercss",
169 "vulcanize",
161 "webpack",
170 "crisper",
171 "concat:dist"
162 "concat:dist"
172 ]
163 ]
173 }
164 }
@@ -179,18 +170,5 b''
179 "jshintrc": ".jshintrc"
170 "jshintrc": ".jshintrc"
180 }
171 }
181 }
172 }
182 },
183 "vulcanize": {
184 "default": {
185 "options": {
186 "abspath": "",
187 "inlineScripts": true,
188 "inlineCss": true,
189 "stripComments": true
190 },
191 "files": {
192 "<%= dirs.js.dest %>/rhodecode-components.html": "<%= dirs.js.src %>/components/shared-components.html"
193 }
194 }
195 }
173 }
196 }
174 }
@@ -1,6 +1,6 b''
1 {
1 {
2 "name": "rhodecode-enterprise",
2 "name": "rhodecode-enterprise",
3 "version": "1.0.0",
3 "version": "2.0.0",
4 "private": true,
4 "private": true,
5 "description" : "RhodeCode JS packaged",
5 "description" : "RhodeCode JS packaged",
6 "license": "SEE LICENSE IN LICENSE.txt",
6 "license": "SEE LICENSE IN LICENSE.txt",
@@ -9,25 +9,50 b''
9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
9 "url" : "https://code.rhodecode.com/rhodecode-enterprise-ce"
10 },
10 },
11 "devDependencies": {
11 "devDependencies": {
12 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1",
13 "clipboard": "^2.0.1",
14 "exports-loader": "^0.6.4",
15 "favico.js": "^0.3.10",
12 "grunt": "^0.4.5",
16 "grunt": "^0.4.5",
17 "grunt-cli": "^1.3.1",
18 "grunt-contrib-concat": "^0.5.1",
13 "grunt-contrib-copy": "^1.0.0",
19 "grunt-contrib-copy": "^1.0.0",
14 "grunt-contrib-concat": "^0.5.1",
15 "grunt-contrib-jshint": "^0.12.0",
20 "grunt-contrib-jshint": "^0.12.0",
16 "grunt-contrib-less": "^1.1.0",
21 "grunt-contrib-less": "^1.1.0",
17 "grunt-contrib-watch": "^0.6.1",
22 "grunt-contrib-watch": "^0.6.1",
18 "crisper": "^2.1.1",
23 "grunt-webpack": "^3.1.3",
19 "vulcanize": "^1.16.0",
24 "jquery": "1.11.3",
20 "grunt-crisper": "^1.0.1",
21 "grunt-vulcanize": "^1.0.0",
22 "node2nix": "^1.0.0",
23 "jshint": "^2.9.1-rc3",
25 "jshint": "^2.9.1-rc3",
24 "bower": "^1.8.4",
25 "jquery": "1.11.3",
26 "favico.js": "^0.3.10",
27 "clipboard": "^2.0.1",
28 "qrious": "^4.0.2",
29 "moment": "^2.18.1",
26 "moment": "^2.18.1",
30 "mousetrap": "^1.6.1",
27 "mousetrap": "^1.6.1",
31 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
28 "qrious": "^4.0.2",
29 "sticky-sidebar": "3.3.1",
30 "waypoints": "4.0.1",
31 "webpack": "4.23.1",
32 "webpack-cli": "3.1.2",
33 "babel-core": "^6.26.3",
34 "babel-loader": "^7.1.2",
35 "babel-plugin-transform-object-rest-spread": "^6.26.0",
36 "babel-preset-env": "^1.6.0",
37 "copy-webpack-plugin": "^4.4.2",
38 "css-loader": "^0.28.11",
39 "html-loader": "^0.4.4",
40 "html-webpack-plugin": "^3.2.0",
41 "imports-loader": "^0.7.1",
42 "polymer-webpack-loader": "^2.0.1",
43 "style-loader": "^0.21.0",
44 "webpack-uglify-js-plugin": "^1.1.9",
45 "raw-loader": "1.0.0-beta.0",
46 "ts-loader": "^1.3.3",
47 "@webcomponents/webcomponentsjs": "^2.0.0",
48 "@polymer/polymer": "^3.0.0",
49 "@polymer/paper-button": "^3.0.0",
50 "@polymer/paper-spinner": "^3.0.0",
51 "@polymer/paper-tooltip": "^3.0.0",
52 "@polymer/paper-toast": "^3.0.0",
53 "@polymer/paper-toggle-button": "^3.0.0",
54 "@polymer/iron-ajax": "^3.0.0",
55 "@polymer/iron-autogrow-textarea": "^3.0.0",
56 "@polymer/iron-a11y-keys": "^3.0.0"
32 }
57 }
33 }
58 }
@@ -27,24 +27,29 b' Python dependencies'
27 NodeJS dependencies
27 NodeJS dependencies
28 ===================
28 ===================
29
29
30 Generate node-packages.nix file with all dependencies from NPM and package.json file
31 This should be run before entering nix-shell.
32
33 The sed at the end fixes a bug with http rewrite of re-generated packages
34
30 .. code:: shell
35 .. code:: shell
31
36
32 rm -rf node_modules
37 rm -rf node_modules &&
33 nix-shell pkgs/shell-generate.nix --command "
38 nix-shell pkgs/shell-generate.nix --command "
34 node2nix --input package.json \
39 node2nix --input package.json \
35 -o pkgs/node-packages.nix \
40 -o pkgs/node-packages.nix \
36 -e pkgs/node-env.nix \
41 -e pkgs/node-env.nix \
37 -c pkgs/node-default.nix \
42 -c pkgs/node-default.nix \
38 -d --flatten --nodejs-6 "
43 -d --flatten --nodejs-8 " &&
44 sed -i -e 's/http:\/\//https:\/\//g' pkgs/node-packages.nix
39
45
40
46
41
47 Generate license data
42 Bower dependencies
48 =====================
43 ==================
44
49
45 .. code:: shell
50 .. code:: shell
46
51
47 nix-shell pkgs/shell-generate.nix --command "bower2nix bower.json pkgs/bower-packages.nix"
52 nix-build pkgs/license-generate.nix -o result-license && cat result-license/licenses.json | python -m json.tool > rhodecode/config/licenses.json
48
53
49
54
50 .. Links
55 .. Links
@@ -2,9 +2,9 b''
2 #
2 #
3 # Usage:
3 # Usage:
4 #
4 #
5 # nix-build -I ~/dev license.nix -A result
5 # nix-build license.nix -o result-license
6 #
6 #
7 # Afterwards ./result will contain the license information as JSON files.
7 # Afterwards ./result-license will contain the license information as JSON files.
8 #
8 #
9 #
9 #
10 # Overview
10 # Overview
@@ -19,7 +19,7 b''
19 # dependencies. The results from step 1 are then limited to the ones which
19 # dependencies. The results from step 1 are then limited to the ones which
20 # are in this list.
20 # are in this list.
21 #
21 #
22 # The result is then available in ./result/license.json.
22 # The result is then available in ./result-license/license.json.
23 #
23 #
24
24
25
25
@@ -32,20 +32,20 b' let'
32 # Enterprise as simple as possible, goal here is just to identify the runtime
32 # Enterprise as simple as possible, goal here is just to identify the runtime
33 # dependencies. Ideally we could avoid building Enterprise at all and somehow
33 # dependencies. Ideally we could avoid building Enterprise at all and somehow
34 # figure it out without calling into nix-store.
34 # figure it out without calling into nix-store.
35 enterprise = import ./default.nix {
35 enterprise = import ../default.nix {
36 doCheck = false;
36 doCheck = false;
37 };
37 };
38
38
39 # For a given derivation, return the list of all dependencies
39 # For a given derivation, return the list of all dependencies
40 drvToDependencies = drv: nixpkgs.lib.flatten [
40 drvToDependencies = drv: nixpkgs.lib.flatten [
41 drv.nativeBuildInputs or []
41 drv.buildInputs or []
42 drv.propagatedNativeBuildInputs or []
42 drv.propagatedBuildInputs or []
43 ];
43 ];
44
44
45 # Transform the given derivation into the meta information which we need in
45 # Transform the given derivation into the meta information which we need in
46 # the resulting JSON files.
46 # the resulting JSON files.
47 drvToMeta = drv: {
47 drvToMeta = drv: {
48 name = drv.name or "UNNAMED";
48 name = drv.name or drv;
49 license = if drv ? meta.license then drv.meta.license else "UNKNOWN";
49 license = if drv ? meta.license then drv.meta.license else "UNKNOWN";
50 };
50 };
51
51
@@ -70,10 +70,8 b' let'
70 rawStorePaths = nixpkgs.lib.removeSuffix "\n" (
70 rawStorePaths = nixpkgs.lib.removeSuffix "\n" (
71 builtins.readFile srcPath);
71 builtins.readFile srcPath);
72 storePaths = nixpkgs.lib.splitString "\n" rawStorePaths;
72 storePaths = nixpkgs.lib.splitString "\n" rawStorePaths;
73 # TODO: johbo: Would be nice to use some sort of utility here to convert
74 # the path to a derivation name.
75 storePathPrefix = (
73 storePathPrefix = (
76 builtins.stringLength "/nix/store/zwy7aavnif9ayw30rya1k6xiacafzzl6-");
74 builtins.stringLength "/nix/store/afafafafafafafafafafafafafafafaf-");
77 storePathToName = path:
75 storePathToName = path:
78 builtins.substring storePathPrefix (builtins.stringLength path) path;
76 builtins.substring storePathPrefix (builtins.stringLength path) path;
79 in (map storePathToName storePaths);
77 in (map storePathToName storePaths);
@@ -147,6 +145,7 b' in rec {'
147 cat > build/licenses.json <<EOF
145 cat > build/licenses.json <<EOF
148 ${builtins.toJSON enterpriseRuntimeLicenses}
146 ${builtins.toJSON enterpriseRuntimeLicenses}
149 EOF
147 EOF
148
150 '';
149 '';
151
150
152 installPhase = ''
151 installPhase = ''
@@ -2,7 +2,7 b''
2
2
3 {pkgs ? import <nixpkgs> {
3 {pkgs ? import <nixpkgs> {
4 inherit system;
4 inherit system;
5 }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-6_x"}:
5 }, system ? builtins.currentSystem, nodejs ? pkgs."nodejs-8_x"}:
6
6
7 let
7 let
8 nodeEnv = import ./node-env.nix {
8 nodeEnv = import ./node-env.nix {
This diff has been collapsed as it changes many lines, (7641 lines changed) Show them Hide them
@@ -4,6 +4,222 b''
4
4
5 let
5 let
6 sources = {
6 sources = {
7 "@polymer/font-roboto-3.0.2" = {
8 name = "_at_polymer_slash_font-roboto";
9 packageName = "@polymer/font-roboto";
10 version = "3.0.2";
11 src = fetchurl {
12 url = "https://registry.npmjs.org/@polymer/font-roboto/-/font-roboto-3.0.2.tgz";
13 sha512 = "tx5TauYSmzsIvmSqepUPDYbs4/Ejz2XbZ1IkD7JEGqkdNUJlh+9KU85G56Tfdk/xjEZ8zorFfN09OSwiMrIQWA==";
14 };
15 };
16 "@polymer/iron-a11y-announcer-3.0.1" = {
17 name = "_at_polymer_slash_iron-a11y-announcer";
18 packageName = "@polymer/iron-a11y-announcer";
19 version = "3.0.1";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@polymer/iron-a11y-announcer/-/iron-a11y-announcer-3.0.1.tgz";
22 sha512 = "Xiqmpz0AEEbMNGYPpbrXBIrcI/xaR4tn77pmSLfxVKGGwjEUR/YrRgyIwXp4EN7lvst1dFC8kyl2hLga0uDIVQ==";
23 };
24 };
25 "@polymer/iron-a11y-keys-3.0.1" = {
26 name = "_at_polymer_slash_iron-a11y-keys";
27 packageName = "@polymer/iron-a11y-keys";
28 version = "3.0.1";
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@polymer/iron-a11y-keys/-/iron-a11y-keys-3.0.1.tgz";
31 sha512 = "zmTi8xHeY4ZMJLAitW2hAmW5zXZ35hVy/eHQUFadAlOccuBK3oRRmoPRQRaZgpyJrCVFDAQRXXzzJtUDil/0CA==";
32 };
33 };
34 "@polymer/iron-a11y-keys-behavior-3.0.1" = {
35 name = "_at_polymer_slash_iron-a11y-keys-behavior";
36 packageName = "@polymer/iron-a11y-keys-behavior";
37 version = "3.0.1";
38 src = fetchurl {
39 url = "https://registry.npmjs.org/@polymer/iron-a11y-keys-behavior/-/iron-a11y-keys-behavior-3.0.1.tgz";
40 sha512 = "lnrjKq3ysbBPT/74l0Fj0U9H9C35Tpw2C/tpJ8a+5g8Y3YJs1WSZYnEl1yOkw6sEyaxOq/1DkzH0+60gGu5/PQ==";
41 };
42 };
43 "@polymer/iron-ajax-3.0.1" = {
44 name = "_at_polymer_slash_iron-ajax";
45 packageName = "@polymer/iron-ajax";
46 version = "3.0.1";
47 src = fetchurl {
48 url = "https://registry.npmjs.org/@polymer/iron-ajax/-/iron-ajax-3.0.1.tgz";
49 sha512 = "7+TPEAfWsRdhj1Y8UeF1759ktpVu+c3sG16rJiUC3wF9+woQ9xI1zUm2d59i7Yc3aDEJrR/Q8Y262KlOvyGVNg==";
50 };
51 };
52 "@polymer/iron-autogrow-textarea-3.0.1" = {
53 name = "_at_polymer_slash_iron-autogrow-textarea";
54 packageName = "@polymer/iron-autogrow-textarea";
55 version = "3.0.1";
56 src = fetchurl {
57 url = "https://registry.npmjs.org/@polymer/iron-autogrow-textarea/-/iron-autogrow-textarea-3.0.1.tgz";
58 sha512 = "FgSL7APrOSL9Vu812sBCFlQ17hvnJsBAV2C2e1UAiaHhB+dyfLq8gGdGUpqVWuGJ50q4Y/49QwCNnLf85AdVYA==";
59 };
60 };
61 "@polymer/iron-behaviors-3.0.1" = {
62 name = "_at_polymer_slash_iron-behaviors";
63 packageName = "@polymer/iron-behaviors";
64 version = "3.0.1";
65 src = fetchurl {
66 url = "https://registry.npmjs.org/@polymer/iron-behaviors/-/iron-behaviors-3.0.1.tgz";
67 sha512 = "IMEwcv1lhf1HSQxuyWOUIL0lOBwmeaoSTpgCJeP9IBYnuB1SPQngmfRuHKgK6/m9LQ9F9miC7p3HeQQUdKAE0w==";
68 };
69 };
70 "@polymer/iron-checked-element-behavior-3.0.1" = {
71 name = "_at_polymer_slash_iron-checked-element-behavior";
72 packageName = "@polymer/iron-checked-element-behavior";
73 version = "3.0.1";
74 src = fetchurl {
75 url = "https://registry.npmjs.org/@polymer/iron-checked-element-behavior/-/iron-checked-element-behavior-3.0.1.tgz";
76 sha512 = "aDr0cbCNVq49q+pOqa6CZutFh+wWpwPMLpEth9swx+GkAj+gCURhuQkaUYhIo5f2egDbEioR1aeHMnPlU9dQZA==";
77 };
78 };
79 "@polymer/iron-fit-behavior-3.0.1" = {
80 name = "_at_polymer_slash_iron-fit-behavior";
81 packageName = "@polymer/iron-fit-behavior";
82 version = "3.0.1";
83 src = fetchurl {
84 url = "https://registry.npmjs.org/@polymer/iron-fit-behavior/-/iron-fit-behavior-3.0.1.tgz";
85 sha512 = "/M0B1L30k31vmwNBaGuZcxzUAhJSHoGccb/DF0CDKI/hT8UlkTvcyemaWdOpmHHLgY52ceKIkRwA3AeXrKyvaQ==";
86 };
87 };
88 "@polymer/iron-flex-layout-3.0.1" = {
89 name = "_at_polymer_slash_iron-flex-layout";
90 packageName = "@polymer/iron-flex-layout";
91 version = "3.0.1";
92 src = fetchurl {
93 url = "https://registry.npmjs.org/@polymer/iron-flex-layout/-/iron-flex-layout-3.0.1.tgz";
94 sha512 = "7gB869czArF+HZcPTVSgvA7tXYFze9EKckvM95NB7SqYF+NnsQyhoXgKnpFwGyo95lUjUW9TFDLUwDXnCYFtkw==";
95 };
96 };
97 "@polymer/iron-form-element-behavior-3.0.1" = {
98 name = "_at_polymer_slash_iron-form-element-behavior";
99 packageName = "@polymer/iron-form-element-behavior";
100 version = "3.0.1";
101 src = fetchurl {
102 url = "https://registry.npmjs.org/@polymer/iron-form-element-behavior/-/iron-form-element-behavior-3.0.1.tgz";
103 sha512 = "G/e2KXyL5AY7mMjmomHkGpgS0uAf4ovNpKhkuUTRnMuMJuf589bKqE85KN4ovE1Tzhv2hJoh/igyD6ekHiYU1A==";
104 };
105 };
106 "@polymer/iron-meta-3.0.1" = {
107 name = "_at_polymer_slash_iron-meta";
108 packageName = "@polymer/iron-meta";
109 version = "3.0.1";
110 src = fetchurl {
111 url = "https://registry.npmjs.org/@polymer/iron-meta/-/iron-meta-3.0.1.tgz";
112 sha512 = "pWguPugiLYmWFV9UWxLWzZ6gm4wBwQdDy4VULKwdHCqR7OP7u98h+XDdGZsSlDPv6qoryV/e3tGHlTIT0mbzJA==";
113 };
114 };
115 "@polymer/iron-overlay-behavior-3.0.2" = {
116 name = "_at_polymer_slash_iron-overlay-behavior";
117 packageName = "@polymer/iron-overlay-behavior";
118 version = "3.0.2";
119 src = fetchurl {
120 url = "https://registry.npmjs.org/@polymer/iron-overlay-behavior/-/iron-overlay-behavior-3.0.2.tgz";
121 sha512 = "j1qmt6mJHCwpe1mKOvqK5kcCUPQr5LSrlqpgRDbUuLgUfNJ/vGTipjrkBlfbEUagm5FEQdc1VLPLSQP6WVuP9g==";
122 };
123 };
124 "@polymer/iron-resizable-behavior-3.0.1" = {
125 name = "_at_polymer_slash_iron-resizable-behavior";
126 packageName = "@polymer/iron-resizable-behavior";
127 version = "3.0.1";
128 src = fetchurl {
129 url = "https://registry.npmjs.org/@polymer/iron-resizable-behavior/-/iron-resizable-behavior-3.0.1.tgz";
130 sha512 = "FyHxRxFspVoRaeZSWpT3y0C9awomb4tXXolIJcZ7RvXhMP632V5lez+ch5G5SwK0LpnAPkg35eB0LPMFv+YMMQ==";
131 };
132 };
133 "@polymer/iron-validatable-behavior-3.0.1" = {
134 name = "_at_polymer_slash_iron-validatable-behavior";
135 packageName = "@polymer/iron-validatable-behavior";
136 version = "3.0.1";
137 src = fetchurl {
138 url = "https://registry.npmjs.org/@polymer/iron-validatable-behavior/-/iron-validatable-behavior-3.0.1.tgz";
139 sha512 = "wwpYh6wOa4fNI+jH5EYKC7TVPYQ2OfgQqocWat7GsNWcsblKYhLYbwsvEY5nO0n2xKqNfZzDLrUom5INJN7msQ==";
140 };
141 };
142 "@polymer/paper-behaviors-3.0.1" = {
143 name = "_at_polymer_slash_paper-behaviors";
144 packageName = "@polymer/paper-behaviors";
145 version = "3.0.1";
146 src = fetchurl {
147 url = "https://registry.npmjs.org/@polymer/paper-behaviors/-/paper-behaviors-3.0.1.tgz";
148 sha512 = "6knhj69fPJejv8qR0kCSUY+Q0XjaUf0OSnkjRjmTJPAwSrRYtgqE+l6P1FfA+py1X/cUjgne9EF5rMZAKJIg1g==";
149 };
150 };
151 "@polymer/paper-button-3.0.1" = {
152 name = "_at_polymer_slash_paper-button";
153 packageName = "@polymer/paper-button";
154 version = "3.0.1";
155 src = fetchurl {
156 url = "https://registry.npmjs.org/@polymer/paper-button/-/paper-button-3.0.1.tgz";
157 sha512 = "JRNBc+Oj9EWnmyLr7FcCr8T1KAnEHPh6mosln9BUdkM+qYaYsudSICh3cjTIbnj6AuF5OJidoLkM1dlyj0j6Zg==";
158 };
159 };
160 "@polymer/paper-ripple-3.0.1" = {
161 name = "_at_polymer_slash_paper-ripple";
162 packageName = "@polymer/paper-ripple";
163 version = "3.0.1";
164 src = fetchurl {
165 url = "https://registry.npmjs.org/@polymer/paper-ripple/-/paper-ripple-3.0.1.tgz";
166 sha512 = "dgOe12GyCF1VZBLUQqnzGWlf3xb255FajNCVB1VFj/AtskYtoamnafa7m3a+1vs+C8qbg4Benn5KwgxVDSW4cg==";
167 };
168 };
169 "@polymer/paper-spinner-3.0.1" = {
170 name = "_at_polymer_slash_paper-spinner";
171 packageName = "@polymer/paper-spinner";
172 version = "3.0.1";
173 src = fetchurl {
174 url = "https://registry.npmjs.org/@polymer/paper-spinner/-/paper-spinner-3.0.1.tgz";
175 sha512 = "MYIU6qWZnhZ5yNFOBzROPgBteGfxKEnDZ6bCgjrvUtJkBuQEz0MQZzSE/zmZc0oaJ9u5QK5xAFuYdudsGv7+sQ==";
176 };
177 };
178 "@polymer/paper-styles-3.0.1" = {
179 name = "_at_polymer_slash_paper-styles";
180 packageName = "@polymer/paper-styles";
181 version = "3.0.1";
182 src = fetchurl {
183 url = "https://registry.npmjs.org/@polymer/paper-styles/-/paper-styles-3.0.1.tgz";
184 sha512 = "y6hmObLqlCx602TQiSBKHqjwkE7xmDiFkoxdYGaNjtv4xcysOTdVJsDR/R9UHwIaxJ7gHlthMSykir1nv78++g==";
185 };
186 };
187 "@polymer/paper-toast-3.0.1" = {
188 name = "_at_polymer_slash_paper-toast";
189 packageName = "@polymer/paper-toast";
190 version = "3.0.1";
191 src = fetchurl {
192 url = "https://registry.npmjs.org/@polymer/paper-toast/-/paper-toast-3.0.1.tgz";
193 sha512 = "pizuogzObniDdICUc6dSLrnDt2VzzoRne1gCmbD6sfOATVv5tc8UfrqhA2iHngbNBEbniBiciS3iogdp5KTVUQ==";
194 };
195 };
196 "@polymer/paper-toggle-button-3.0.1" = {
197 name = "_at_polymer_slash_paper-toggle-button";
198 packageName = "@polymer/paper-toggle-button";
199 version = "3.0.1";
200 src = fetchurl {
201 url = "https://registry.npmjs.org/@polymer/paper-toggle-button/-/paper-toggle-button-3.0.1.tgz";
202 sha512 = "jadZB60fycT7YnSAH0H23LYo6/2HYmMZTtNr9LpdSIRFPLX6mqqxewex92cFz019bMKaRJgORn308hRlJo2u6A==";
203 };
204 };
205 "@polymer/paper-tooltip-3.0.1" = {
206 name = "_at_polymer_slash_paper-tooltip";
207 packageName = "@polymer/paper-tooltip";
208 version = "3.0.1";
209 src = fetchurl {
210 url = "https://registry.npmjs.org/@polymer/paper-tooltip/-/paper-tooltip-3.0.1.tgz";
211 sha512 = "yiUk09opTEnE1lK+tb501ENb+yQBi4p++Ep0eGJAHesVYKVMPNgPphVKkIizkDaU+n0SE+zXfTsRbYyOMDYXSg==";
212 };
213 };
214 "@polymer/polymer-3.1.0" = {
215 name = "_at_polymer_slash_polymer";
216 packageName = "@polymer/polymer";
217 version = "3.1.0";
218 src = fetchurl {
219 url = "https://registry.npmjs.org/@polymer/polymer/-/polymer-3.1.0.tgz";
220 sha512 = "hwN8IMERsFATz/9dSMxYHL+84J9uBkPuuarxJWlTsppZ4CAYTZKnepBfNrKoyNsafBmA3yXBiiKPPf+fJtza7A==";
221 };
222 };
7 "@types/clone-0.1.30" = {
223 "@types/clone-0.1.30" = {
8 name = "_at_types_slash_clone";
224 name = "_at_types_slash_clone";
9 packageName = "@types/clone";
225 packageName = "@types/clone";
@@ -13,31 +229,220 b' let'
13 sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614";
229 sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614";
14 };
230 };
15 };
231 };
16 "@types/node-4.2.23" = {
232 "@types/node-6.14.0" = {
17 name = "_at_types_slash_node";
18 packageName = "@types/node";
19 version = "4.2.23";
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz";
22 sha512 = "U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==";
23 };
24 };
25 "@types/node-6.0.114" = {
26 name = "_at_types_slash_node";
233 name = "_at_types_slash_node";
27 packageName = "@types/node";
234 packageName = "@types/node";
28 version = "6.0.114";
235 version = "6.14.0";
29 src = fetchurl {
236 src = fetchurl {
30 url = "https://registry.npmjs.org/@types/node/-/node-6.0.114.tgz";
237 url = "https://registry.npmjs.org/@types/node/-/node-6.14.0.tgz";
31 sha512 = "5ViC9dwf1VIAtrOFTvOuN04lJgw28eKjuy0Vg2Bd/fSlxKP2feCSkIw04ZgOENL2ywdWrtbkthp1XVLEjJmouw==";
238 sha512 = "6tQyh4Q4B5pECcXBOQDZ5KjyBIxRZGzrweGPM47sAYTdVG4+7R+2EGMTmp0h6ZwgqHrFRCeg2gdhsG9xXEl2Sg==";
32 };
239 };
33 };
240 };
34 "@types/parse5-0.0.31" = {
241 "@types/parse5-2.2.34" = {
35 name = "_at_types_slash_parse5";
242 name = "_at_types_slash_parse5";
36 packageName = "@types/parse5";
243 packageName = "@types/parse5";
37 version = "0.0.31";
244 version = "2.2.34";
38 src = fetchurl {
245 src = fetchurl {
39 url = "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz";
246 url = "https://registry.npmjs.org/@types/parse5/-/parse5-2.2.34.tgz";
40 sha1 = "e827a493a443b156e1b582a2e4c3bdc0040f2ee7";
247 sha1 = "e3870a10e82735a720f62d71dcd183ba78ef3a9d";
248 };
249 };
250 "@webassemblyjs/ast-1.7.10" = {
251 name = "_at_webassemblyjs_slash_ast";
252 packageName = "@webassemblyjs/ast";
253 version = "1.7.10";
254 src = fetchurl {
255 url = "https://registry.npmjs.org/@webassemblyjs/ast/-/ast-1.7.10.tgz";
256 sha512 = "wTUeaByYN2EA6qVqhbgavtGc7fLTOx0glG2IBsFlrFG51uXIGlYBTyIZMf4SPLo3v1bgV/7lBN3l7Z0R6Hswew==";
257 };
258 };
259 "@webassemblyjs/floating-point-hex-parser-1.7.10" = {
260 name = "_at_webassemblyjs_slash_floating-point-hex-parser";
261 packageName = "@webassemblyjs/floating-point-hex-parser";
262 version = "1.7.10";
263 src = fetchurl {
264 url = "https://registry.npmjs.org/@webassemblyjs/floating-point-hex-parser/-/floating-point-hex-parser-1.7.10.tgz";
265 sha512 = "gMsGbI6I3p/P1xL2UxqhNh1ga2HCsx5VBB2i5VvJFAaqAjd2PBTRULc3BpTydabUQEGlaZCzEUQhLoLG7TvEYQ==";
266 };
267 };
268 "@webassemblyjs/helper-api-error-1.7.10" = {
269 name = "_at_webassemblyjs_slash_helper-api-error";
270 packageName = "@webassemblyjs/helper-api-error";
271 version = "1.7.10";
272 src = fetchurl {
273 url = "https://registry.npmjs.org/@webassemblyjs/helper-api-error/-/helper-api-error-1.7.10.tgz";
274 sha512 = "DoYRlPWtuw3yd5BOr9XhtrmB6X1enYF0/54yNvQWGXZEPDF5PJVNI7zQ7gkcKfTESzp8bIBWailaFXEK/jjCsw==";
275 };
276 };
277 "@webassemblyjs/helper-buffer-1.7.10" = {
278 name = "_at_webassemblyjs_slash_helper-buffer";
279 packageName = "@webassemblyjs/helper-buffer";
280 version = "1.7.10";
281 src = fetchurl {
282 url = "https://registry.npmjs.org/@webassemblyjs/helper-buffer/-/helper-buffer-1.7.10.tgz";
283 sha512 = "+RMU3dt/dPh4EpVX4u5jxsOlw22tp3zjqE0m3ftU2tsYxnPULb4cyHlgaNd2KoWuwasCQqn8Mhr+TTdbtj3LlA==";
284 };
285 };
286 "@webassemblyjs/helper-code-frame-1.7.10" = {
287 name = "_at_webassemblyjs_slash_helper-code-frame";
288 packageName = "@webassemblyjs/helper-code-frame";
289 version = "1.7.10";
290 src = fetchurl {
291 url = "https://registry.npmjs.org/@webassemblyjs/helper-code-frame/-/helper-code-frame-1.7.10.tgz";
292 sha512 = "UiytbpKAULOEab2hUZK2ywXen4gWJVrgxtwY3Kn+eZaaSWaRM8z/7dAXRSoamhKFiBh1uaqxzE/XD9BLlug3gw==";
293 };
294 };
295 "@webassemblyjs/helper-fsm-1.7.10" = {
296 name = "_at_webassemblyjs_slash_helper-fsm";
297 packageName = "@webassemblyjs/helper-fsm";
298 version = "1.7.10";
299 src = fetchurl {
300 url = "https://registry.npmjs.org/@webassemblyjs/helper-fsm/-/helper-fsm-1.7.10.tgz";
301 sha512 = "w2vDtUK9xeSRtt5+RnnlRCI7wHEvLjF0XdnxJpgx+LJOvklTZPqWkuy/NhwHSLP19sm9H8dWxKeReMR7sCkGZA==";
302 };
303 };
304 "@webassemblyjs/helper-module-context-1.7.10" = {
305 name = "_at_webassemblyjs_slash_helper-module-context";
306 packageName = "@webassemblyjs/helper-module-context";
307 version = "1.7.10";
308 src = fetchurl {
309 url = "https://registry.npmjs.org/@webassemblyjs/helper-module-context/-/helper-module-context-1.7.10.tgz";
310 sha512 = "yE5x/LzZ3XdPdREmJijxzfrf+BDRewvO0zl8kvORgSWmxpRrkqY39KZSq6TSgIWBxkK4SrzlS3BsMCv2s1FpsQ==";
311 };
312 };
313 "@webassemblyjs/helper-wasm-bytecode-1.7.10" = {
314 name = "_at_webassemblyjs_slash_helper-wasm-bytecode";
315 packageName = "@webassemblyjs/helper-wasm-bytecode";
316 version = "1.7.10";
317 src = fetchurl {
318 url = "https://registry.npmjs.org/@webassemblyjs/helper-wasm-bytecode/-/helper-wasm-bytecode-1.7.10.tgz";
319 sha512 = "u5qy4SJ/OrxKxZqJ9N3qH4ZQgHaAzsopsYwLvoWJY6Q33r8PhT3VPyNMaJ7ZFoqzBnZlCcS/0f4Sp8WBxylXfg==";
320 };
321 };
322 "@webassemblyjs/helper-wasm-section-1.7.10" = {
323 name = "_at_webassemblyjs_slash_helper-wasm-section";
324 packageName = "@webassemblyjs/helper-wasm-section";
325 version = "1.7.10";
326 src = fetchurl {
327 url = "https://registry.npmjs.org/@webassemblyjs/helper-wasm-section/-/helper-wasm-section-1.7.10.tgz";
328 sha512 = "Ecvww6sCkcjatcyctUrn22neSJHLN/TTzolMGG/N7S9rpbsTZ8c6Bl98GpSpV77EvzNijiNRHBG0+JO99qKz6g==";
329 };
330 };
331 "@webassemblyjs/ieee754-1.7.10" = {
332 name = "_at_webassemblyjs_slash_ieee754";
333 packageName = "@webassemblyjs/ieee754";
334 version = "1.7.10";
335 src = fetchurl {
336 url = "https://registry.npmjs.org/@webassemblyjs/ieee754/-/ieee754-1.7.10.tgz";
337 sha512 = "HRcWcY+YWt4+s/CvQn+vnSPfRaD4KkuzQFt5MNaELXXHSjelHlSEA8ZcqT69q0GTIuLWZ6JaoKar4yWHVpZHsQ==";
338 };
339 };
340 "@webassemblyjs/leb128-1.7.10" = {
341 name = "_at_webassemblyjs_slash_leb128";
342 packageName = "@webassemblyjs/leb128";
343 version = "1.7.10";
344 src = fetchurl {
345 url = "https://registry.npmjs.org/@webassemblyjs/leb128/-/leb128-1.7.10.tgz";
346 sha512 = "og8MciYlA8hvzCLR71hCuZKPbVBfLQeHv7ImKZ4nlyxrYbG7uJHYtHiHu6OV9SqrGuD03H/HtXC4Bgdjfm9FHw==";
347 };
348 };
349 "@webassemblyjs/utf8-1.7.10" = {
350 name = "_at_webassemblyjs_slash_utf8";
351 packageName = "@webassemblyjs/utf8";
352 version = "1.7.10";
353 src = fetchurl {
354 url = "https://registry.npmjs.org/@webassemblyjs/utf8/-/utf8-1.7.10.tgz";
355 sha512 = "Ng6Pxv6siyZp635xCSnH3mKmIFgqWPCcGdoo0GBYgyGdxu7cUj4agV7Uu1a8REP66UYUFXJLudeGgd4RvuJAnQ==";
356 };
357 };
358 "@webassemblyjs/wasm-edit-1.7.10" = {
359 name = "_at_webassemblyjs_slash_wasm-edit";
360 packageName = "@webassemblyjs/wasm-edit";
361 version = "1.7.10";
362 src = fetchurl {
363 url = "https://registry.npmjs.org/@webassemblyjs/wasm-edit/-/wasm-edit-1.7.10.tgz";
364 sha512 = "e9RZFQlb+ZuYcKRcW9yl+mqX/Ycj9+3/+ppDI8nEE/NCY6FoK8f3dKBcfubYV/HZn44b+ND4hjh+4BYBt+sDnA==";
365 };
366 };
367 "@webassemblyjs/wasm-gen-1.7.10" = {
368 name = "_at_webassemblyjs_slash_wasm-gen";
369 packageName = "@webassemblyjs/wasm-gen";
370 version = "1.7.10";
371 src = fetchurl {
372 url = "https://registry.npmjs.org/@webassemblyjs/wasm-gen/-/wasm-gen-1.7.10.tgz";
373 sha512 = "M0lb6cO2Y0PzDye/L39PqwV+jvO+2YxEG5ax+7dgq7EwXdAlpOMx1jxyXJTScQoeTpzOPIb+fLgX/IkLF8h2yw==";
374 };
375 };
376 "@webassemblyjs/wasm-opt-1.7.10" = {
377 name = "_at_webassemblyjs_slash_wasm-opt";
378 packageName = "@webassemblyjs/wasm-opt";
379 version = "1.7.10";
380 src = fetchurl {
381 url = "https://registry.npmjs.org/@webassemblyjs/wasm-opt/-/wasm-opt-1.7.10.tgz";
382 sha512 = "R66IHGCdicgF5ZliN10yn5HaC7vwYAqrSVJGjtJJQp5+QNPBye6heWdVH/at40uh0uoaDN/UVUfXK0gvuUqtVg==";
383 };
384 };
385 "@webassemblyjs/wasm-parser-1.7.10" = {
386 name = "_at_webassemblyjs_slash_wasm-parser";
387 packageName = "@webassemblyjs/wasm-parser";
388 version = "1.7.10";
389 src = fetchurl {
390 url = "https://registry.npmjs.org/@webassemblyjs/wasm-parser/-/wasm-parser-1.7.10.tgz";
391 sha512 = "AEv8mkXVK63n/iDR3T693EzoGPnNAwKwT3iHmKJNBrrALAhhEjuPzo/lTE4U7LquEwyvg5nneSNdTdgrBaGJcA==";
392 };
393 };
394 "@webassemblyjs/wast-parser-1.7.10" = {
395 name = "_at_webassemblyjs_slash_wast-parser";
396 packageName = "@webassemblyjs/wast-parser";
397 version = "1.7.10";
398 src = fetchurl {
399 url = "https://registry.npmjs.org/@webassemblyjs/wast-parser/-/wast-parser-1.7.10.tgz";
400 sha512 = "YTPEtOBljkCL0VjDp4sHe22dAYSm3ZwdJ9+2NTGdtC7ayNvuip1wAhaAS8Zt9Q6SW9E5Jf5PX7YE3XWlrzR9cw==";
401 };
402 };
403 "@webassemblyjs/wast-printer-1.7.10" = {
404 name = "_at_webassemblyjs_slash_wast-printer";
405 packageName = "@webassemblyjs/wast-printer";
406 version = "1.7.10";
407 src = fetchurl {
408 url = "https://registry.npmjs.org/@webassemblyjs/wast-printer/-/wast-printer-1.7.10.tgz";
409 sha512 = "mJ3QKWtCchL1vhU/kZlJnLPuQZnlDOdZsyP0bbLWPGdYsQDnSBvyTLhzwBA3QAMlzEL9V4JHygEmK6/OTEyytA==";
410 };
411 };
412 "@webcomponents/shadycss-1.5.2" = {
413 name = "_at_webcomponents_slash_shadycss";
414 packageName = "@webcomponents/shadycss";
415 version = "1.5.2";
416 src = fetchurl {
417 url = "https://registry.npmjs.org/@webcomponents/shadycss/-/shadycss-1.5.2.tgz";
418 sha512 = "0OyrmVc7S+INtzoqP2ofAo+OdVn2Nj0Qvq4wD9FEGN7nMmLRxaD2mzy6hD6EslzxUSuGH302CDU4KXiY66SEqg==";
419 };
420 };
421 "@webcomponents/webcomponentsjs-2.1.3" = {
422 name = "_at_webcomponents_slash_webcomponentsjs";
423 packageName = "@webcomponents/webcomponentsjs";
424 version = "2.1.3";
425 src = fetchurl {
426 url = "https://registry.npmjs.org/@webcomponents/webcomponentsjs/-/webcomponentsjs-2.1.3.tgz";
427 sha512 = "0UHJNY88lR3pnEYtBVT7F8cuuxOiITQGWJa0LxoELqkBSB7IabzJFOj5K99PajD3CGAsWpjB0CAeijfe376Y1w==";
428 };
429 };
430 "@xtuc/ieee754-1.2.0" = {
431 name = "_at_xtuc_slash_ieee754";
432 packageName = "@xtuc/ieee754";
433 version = "1.2.0";
434 src = fetchurl {
435 url = "https://registry.npmjs.org/@xtuc/ieee754/-/ieee754-1.2.0.tgz";
436 sha512 = "DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==";
437 };
438 };
439 "@xtuc/long-4.2.1" = {
440 name = "_at_xtuc_slash_long";
441 packageName = "@xtuc/long";
442 version = "4.2.1";
443 src = fetchurl {
444 url = "https://registry.npmjs.org/@xtuc/long/-/long-4.2.1.tgz";
445 sha512 = "FZdkNBDqBRHKQ2MEbSC17xnPFOhZxeJ2YGSfr2BKf3sujG49Qe3bB+rGCwQfIaA7WHnGeGkSijX4FuBCdrzW/g==";
41 };
446 };
42 };
447 };
43 "abbrev-1.1.1" = {
448 "abbrev-1.1.1" = {
@@ -58,13 +463,22 b' let'
58 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
463 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
59 };
464 };
60 };
465 };
61 "acorn-5.7.1" = {
466 "acorn-5.7.3" = {
62 name = "acorn";
467 name = "acorn";
63 packageName = "acorn";
468 packageName = "acorn";
64 version = "5.7.1";
469 version = "5.7.3";
65 src = fetchurl {
470 src = fetchurl {
66 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz";
471 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz";
67 sha512 = "d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==";
472 sha512 = "T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==";
473 };
474 };
475 "acorn-dynamic-import-3.0.0" = {
476 name = "acorn-dynamic-import";
477 packageName = "acorn-dynamic-import";
478 version = "3.0.0";
479 src = fetchurl {
480 url = "https://registry.npmjs.org/acorn-dynamic-import/-/acorn-dynamic-import-3.0.0.tgz";
481 sha512 = "zVWV8Z8lislJoOKKqdNMOB+s6+XV5WERty8MnKBeFgwA+19XJjJHs2RP5dzM57FftIs+jQnRToLiWazKr6sSWg==";
68 };
482 };
69 };
483 };
70 "acorn-jsx-3.0.1" = {
484 "acorn-jsx-3.0.1" = {
@@ -85,6 +499,42 b' let'
85 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
499 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
86 };
500 };
87 };
501 };
502 "ajv-6.5.4" = {
503 name = "ajv";
504 packageName = "ajv";
505 version = "6.5.4";
506 src = fetchurl {
507 url = "https://registry.npmjs.org/ajv/-/ajv-6.5.4.tgz";
508 sha512 = "4Wyjt8+t6YszqaXnLDfMmG/8AlO5Zbcsy3ATHncCzjW/NoPzAId8AK6749Ybjmdt+kUY1gP60fCu46oDxPv/mg==";
509 };
510 };
511 "ajv-keywords-3.2.0" = {
512 name = "ajv-keywords";
513 packageName = "ajv-keywords";
514 version = "3.2.0";
515 src = fetchurl {
516 url = "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.2.0.tgz";
517 sha1 = "e86b819c602cf8821ad637413698f1dec021847a";
518 };
519 };
520 "align-text-0.1.4" = {
521 name = "align-text";
522 packageName = "align-text";
523 version = "0.1.4";
524 src = fetchurl {
525 url = "https://registry.npmjs.org/align-text/-/align-text-0.1.4.tgz";
526 sha1 = "0cd90a561093f35d0a99256c22b7069433fad117";
527 };
528 };
529 "alphanum-sort-1.0.2" = {
530 name = "alphanum-sort";
531 packageName = "alphanum-sort";
532 version = "1.0.2";
533 src = fetchurl {
534 url = "https://registry.npmjs.org/alphanum-sort/-/alphanum-sort-1.0.2.tgz";
535 sha1 = "97a1119649b211ad33691d9f9f486a8ec9fbe0a3";
536 };
537 };
88 "amdefine-1.0.1" = {
538 "amdefine-1.0.1" = {
89 name = "amdefine";
539 name = "amdefine";
90 packageName = "amdefine";
540 packageName = "amdefine";
@@ -94,15 +544,6 b' let'
94 sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
544 sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
95 };
545 };
96 };
546 };
97 "ansi-escape-sequences-3.0.0" = {
98 name = "ansi-escape-sequences";
99 packageName = "ansi-escape-sequences";
100 version = "3.0.0";
101 src = fetchurl {
102 url = "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz";
103 sha1 = "1c18394b6af9b76ff9a63509fa497669fd2ce53e";
104 };
105 };
106 "ansi-regex-0.2.1" = {
547 "ansi-regex-0.2.1" = {
107 name = "ansi-regex";
548 name = "ansi-regex";
108 packageName = "ansi-regex";
549 packageName = "ansi-regex";
@@ -121,6 +562,15 b' let'
121 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
562 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
122 };
563 };
123 };
564 };
565 "ansi-regex-3.0.0" = {
566 name = "ansi-regex";
567 packageName = "ansi-regex";
568 version = "3.0.0";
569 src = fetchurl {
570 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.0.tgz";
571 sha1 = "ed0317c322064f79466c02966bddb605ab37d998";
572 };
573 };
124 "ansi-styles-1.1.0" = {
574 "ansi-styles-1.1.0" = {
125 name = "ansi-styles";
575 name = "ansi-styles";
126 packageName = "ansi-styles";
576 packageName = "ansi-styles";
@@ -139,6 +589,24 b' let'
139 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
589 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
140 };
590 };
141 };
591 };
592 "ansi-styles-3.2.1" = {
593 name = "ansi-styles";
594 packageName = "ansi-styles";
595 version = "3.2.1";
596 src = fetchurl {
597 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz";
598 sha512 = "VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==";
599 };
600 };
601 "anymatch-2.0.0" = {
602 name = "anymatch";
603 packageName = "anymatch";
604 version = "2.0.0";
605 src = fetchurl {
606 url = "https://registry.npmjs.org/anymatch/-/anymatch-2.0.0.tgz";
607 sha512 = "5teOsQWABXHHBFP9y3skS5P3d/WfWXpv3FUpy+LorMrNYaT9pI4oLMQX7jzQ2KklNpGpWHzdCXTDT2Y3XGlZBw==";
608 };
609 };
142 "appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" = {
610 "appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" = {
143 name = "appenlight-client";
611 name = "appenlight-client";
144 packageName = "appenlight-client";
612 packageName = "appenlight-client";
@@ -158,15 +626,6 b' let'
158 sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
626 sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
159 };
627 };
160 };
628 };
161 "are-we-there-yet-1.1.5" = {
162 name = "are-we-there-yet";
163 packageName = "are-we-there-yet";
164 version = "1.1.5";
165 src = fetchurl {
166 url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
167 sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==";
168 };
169 };
170 "argparse-0.1.16" = {
629 "argparse-0.1.16" = {
171 name = "argparse";
630 name = "argparse";
172 packageName = "argparse";
631 packageName = "argparse";
@@ -176,13 +635,94 b' let'
176 sha1 = "cfd01e0fbba3d6caed049fbd758d40f65196f57c";
635 sha1 = "cfd01e0fbba3d6caed049fbd758d40f65196f57c";
177 };
636 };
178 };
637 };
179 "array-back-1.0.4" = {
638 "argparse-1.0.10" = {
180 name = "array-back";
639 name = "argparse";
181 packageName = "array-back";
640 packageName = "argparse";
182 version = "1.0.4";
641 version = "1.0.10";
183 src = fetchurl {
642 src = fetchurl {
184 url = "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz";
643 url = "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz";
185 sha1 = "644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b";
644 sha512 = "o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==";
645 };
646 };
647 "arr-diff-4.0.0" = {
648 name = "arr-diff";
649 packageName = "arr-diff";
650 version = "4.0.0";
651 src = fetchurl {
652 url = "https://registry.npmjs.org/arr-diff/-/arr-diff-4.0.0.tgz";
653 sha1 = "d6461074febfec71e7e15235761a329a5dc7c520";
654 };
655 };
656 "arr-flatten-1.1.0" = {
657 name = "arr-flatten";
658 packageName = "arr-flatten";
659 version = "1.1.0";
660 src = fetchurl {
661 url = "https://registry.npmjs.org/arr-flatten/-/arr-flatten-1.1.0.tgz";
662 sha512 = "L3hKV5R/p5o81R7O02IGnwpDmkp6E982XhtbuwSe3O4qOtMMMtodicASA1Cny2U+aCXcNpml+m4dPsvsJ3jatg==";
663 };
664 };
665 "arr-union-3.1.0" = {
666 name = "arr-union";
667 packageName = "arr-union";
668 version = "3.1.0";
669 src = fetchurl {
670 url = "https://registry.npmjs.org/arr-union/-/arr-union-3.1.0.tgz";
671 sha1 = "e39b09aea9def866a8f206e288af63919bae39c4";
672 };
673 };
674 "array-each-1.0.1" = {
675 name = "array-each";
676 packageName = "array-each";
677 version = "1.0.1";
678 src = fetchurl {
679 url = "https://registry.npmjs.org/array-each/-/array-each-1.0.1.tgz";
680 sha1 = "a794af0c05ab1752846ee753a1f211a05ba0c44f";
681 };
682 };
683 "array-slice-1.1.0" = {
684 name = "array-slice";
685 packageName = "array-slice";
686 version = "1.1.0";
687 src = fetchurl {
688 url = "https://registry.npmjs.org/array-slice/-/array-slice-1.1.0.tgz";
689 sha512 = "B1qMD3RBP7O8o0H2KbrXDyB0IccejMF15+87Lvlor12ONPRHP6gTjXMNkt/d3ZuOGbAe66hFmaCfECI24Ufp6w==";
690 };
691 };
692 "array-union-1.0.2" = {
693 name = "array-union";
694 packageName = "array-union";
695 version = "1.0.2";
696 src = fetchurl {
697 url = "https://registry.npmjs.org/array-union/-/array-union-1.0.2.tgz";
698 sha1 = "9a34410e4f4e3da23dea375be5be70f24778ec39";
699 };
700 };
701 "array-uniq-1.0.3" = {
702 name = "array-uniq";
703 packageName = "array-uniq";
704 version = "1.0.3";
705 src = fetchurl {
706 url = "https://registry.npmjs.org/array-uniq/-/array-uniq-1.0.3.tgz";
707 sha1 = "af6ac877a25cc7f74e058894753858dfdb24fdb6";
708 };
709 };
710 "array-unique-0.3.2" = {
711 name = "array-unique";
712 packageName = "array-unique";
713 version = "0.3.2";
714 src = fetchurl {
715 url = "https://registry.npmjs.org/array-unique/-/array-unique-0.3.2.tgz";
716 sha1 = "a894b75d4bc4f6cd679ef3244a9fd8f46ae2d428";
717 };
718 };
719 "arrify-1.0.1" = {
720 name = "arrify";
721 packageName = "arrify";
722 version = "1.0.1";
723 src = fetchurl {
724 url = "https://registry.npmjs.org/arrify/-/arrify-1.0.1.tgz";
725 sha1 = "898508da2226f380df904728456849c1501a4b0d";
186 };
726 };
187 };
727 };
188 "asap-2.0.6" = {
728 "asap-2.0.6" = {
@@ -194,13 +734,31 b' let'
194 sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
734 sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
195 };
735 };
196 };
736 };
197 "asn1-0.2.3" = {
737 "asn1-0.2.4" = {
198 name = "asn1";
738 name = "asn1";
199 packageName = "asn1";
739 packageName = "asn1";
200 version = "0.2.3";
740 version = "0.2.4";
201 src = fetchurl {
741 src = fetchurl {
202 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz";
742 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
203 sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
743 sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
744 };
745 };
746 "asn1.js-4.10.1" = {
747 name = "asn1.js";
748 packageName = "asn1.js";
749 version = "4.10.1";
750 src = fetchurl {
751 url = "https://registry.npmjs.org/asn1.js/-/asn1.js-4.10.1.tgz";
752 sha512 = "p32cOF5q0Zqs9uBiONKYLm6BClCoBCM5O9JfeUSlnQLBTxYdTK+pW+nXflm8UkKd2UYlEbYz5qEi0JuZR9ckSw==";
753 };
754 };
755 "assert-1.4.1" = {
756 name = "assert";
757 packageName = "assert";
758 version = "1.4.1";
759 src = fetchurl {
760 url = "https://registry.npmjs.org/assert/-/assert-1.4.1.tgz";
761 sha1 = "99912d591836b5a6f5b345c0f07eefc08fc65d91";
204 };
762 };
205 };
763 };
206 "assert-plus-0.2.0" = {
764 "assert-plus-0.2.0" = {
@@ -221,6 +779,24 b' let'
221 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
779 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
222 };
780 };
223 };
781 };
782 "assign-symbols-1.0.0" = {
783 name = "assign-symbols";
784 packageName = "assign-symbols";
785 version = "1.0.0";
786 src = fetchurl {
787 url = "https://registry.npmjs.org/assign-symbols/-/assign-symbols-1.0.0.tgz";
788 sha1 = "59667f41fadd4f20ccbc2bb96b8d4f7f78ec0367";
789 };
790 };
791 "ast-types-0.9.6" = {
792 name = "ast-types";
793 packageName = "ast-types";
794 version = "0.9.6";
795 src = fetchurl {
796 url = "https://registry.npmjs.org/ast-types/-/ast-types-0.9.6.tgz";
797 sha1 = "102c9e9e9005d3e7e3829bf0c4fa24ee862ee9b9";
798 };
799 };
224 "async-0.1.22" = {
800 "async-0.1.22" = {
225 name = "async";
801 name = "async";
226 packageName = "async";
802 packageName = "async";
@@ -257,6 +833,15 b' let'
257 sha512 = "fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==";
833 sha512 = "fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==";
258 };
834 };
259 };
835 };
836 "async-each-1.0.1" = {
837 name = "async-each";
838 packageName = "async-each";
839 version = "1.0.1";
840 src = fetchurl {
841 url = "https://registry.npmjs.org/async-each/-/async-each-1.0.1.tgz";
842 sha1 = "19d386a1d9edc6e7c1c85d388aedbcc56d33602d";
843 };
844 };
260 "asynckit-0.4.0" = {
845 "asynckit-0.4.0" = {
261 name = "asynckit";
846 name = "asynckit";
262 packageName = "asynckit";
847 packageName = "asynckit";
@@ -266,6 +851,24 b' let'
266 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
851 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
267 };
852 };
268 };
853 };
854 "atob-2.1.2" = {
855 name = "atob";
856 packageName = "atob";
857 version = "2.1.2";
858 src = fetchurl {
859 url = "https://registry.npmjs.org/atob/-/atob-2.1.2.tgz";
860 sha512 = "Wm6ukoaOGJi/73p/cl2GvLjTI5JM1k/O14isD73YML8StrH/7/lRFgmg8nICZgD3bZZvjwCGxtMOD3wWNAu8cg==";
861 };
862 };
863 "autoprefixer-6.7.7" = {
864 name = "autoprefixer";
865 packageName = "autoprefixer";
866 version = "6.7.7";
867 src = fetchurl {
868 url = "https://registry.npmjs.org/autoprefixer/-/autoprefixer-6.7.7.tgz";
869 sha1 = "1dbd1c835658e35ce3f9984099db00585c782014";
870 };
871 };
269 "aws-sign2-0.6.0" = {
872 "aws-sign2-0.6.0" = {
270 name = "aws-sign2";
873 name = "aws-sign2";
271 packageName = "aws-sign2";
874 packageName = "aws-sign2";
@@ -275,22 +878,472 b' let'
275 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
878 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
276 };
879 };
277 };
880 };
278 "aws4-1.7.0" = {
881 "aws4-1.8.0" = {
279 name = "aws4";
882 name = "aws4";
280 packageName = "aws4";
883 packageName = "aws4";
884 version = "1.8.0";
885 src = fetchurl {
886 url = "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz";
887 sha512 = "ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==";
888 };
889 };
890 "babel-code-frame-6.26.0" = {
891 name = "babel-code-frame";
892 packageName = "babel-code-frame";
893 version = "6.26.0";
894 src = fetchurl {
895 url = "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz";
896 sha1 = "63fd43f7dc1e3bb7ce35947db8fe369a3f58c74b";
897 };
898 };
899 "babel-core-6.26.3" = {
900 name = "babel-core";
901 packageName = "babel-core";
902 version = "6.26.3";
903 src = fetchurl {
904 url = "https://registry.npmjs.org/babel-core/-/babel-core-6.26.3.tgz";
905 sha512 = "6jyFLuDmeidKmUEb3NM+/yawG0M2bDZ9Z1qbZP59cyHLz8kYGKYwpJP0UwUKKUiTRNvxfLesJnTedqczP7cTDA==";
906 };
907 };
908 "babel-generator-6.26.1" = {
909 name = "babel-generator";
910 packageName = "babel-generator";
911 version = "6.26.1";
912 src = fetchurl {
913 url = "https://registry.npmjs.org/babel-generator/-/babel-generator-6.26.1.tgz";
914 sha512 = "HyfwY6ApZj7BYTcJURpM5tznulaBvyio7/0d4zFOeMPUmfxkCjHocCuoLa2SAGzBI8AREcH3eP3758F672DppA==";
915 };
916 };
917 "babel-helper-builder-binary-assignment-operator-visitor-6.24.1" = {
918 name = "babel-helper-builder-binary-assignment-operator-visitor";
919 packageName = "babel-helper-builder-binary-assignment-operator-visitor";
920 version = "6.24.1";
921 src = fetchurl {
922 url = "https://registry.npmjs.org/babel-helper-builder-binary-assignment-operator-visitor/-/babel-helper-builder-binary-assignment-operator-visitor-6.24.1.tgz";
923 sha1 = "cce4517ada356f4220bcae8a02c2b346f9a56664";
924 };
925 };
926 "babel-helper-call-delegate-6.24.1" = {
927 name = "babel-helper-call-delegate";
928 packageName = "babel-helper-call-delegate";
929 version = "6.24.1";
930 src = fetchurl {
931 url = "https://registry.npmjs.org/babel-helper-call-delegate/-/babel-helper-call-delegate-6.24.1.tgz";
932 sha1 = "ece6aacddc76e41c3461f88bfc575bd0daa2df8d";
933 };
934 };
935 "babel-helper-define-map-6.26.0" = {
936 name = "babel-helper-define-map";
937 packageName = "babel-helper-define-map";
938 version = "6.26.0";
939 src = fetchurl {
940 url = "https://registry.npmjs.org/babel-helper-define-map/-/babel-helper-define-map-6.26.0.tgz";
941 sha1 = "a5f56dab41a25f97ecb498c7ebaca9819f95be5f";
942 };
943 };
944 "babel-helper-explode-assignable-expression-6.24.1" = {
945 name = "babel-helper-explode-assignable-expression";
946 packageName = "babel-helper-explode-assignable-expression";
947 version = "6.24.1";
948 src = fetchurl {
949 url = "https://registry.npmjs.org/babel-helper-explode-assignable-expression/-/babel-helper-explode-assignable-expression-6.24.1.tgz";
950 sha1 = "f25b82cf7dc10433c55f70592d5746400ac22caa";
951 };
952 };
953 "babel-helper-function-name-6.24.1" = {
954 name = "babel-helper-function-name";
955 packageName = "babel-helper-function-name";
956 version = "6.24.1";
957 src = fetchurl {
958 url = "https://registry.npmjs.org/babel-helper-function-name/-/babel-helper-function-name-6.24.1.tgz";
959 sha1 = "d3475b8c03ed98242a25b48351ab18399d3580a9";
960 };
961 };
962 "babel-helper-get-function-arity-6.24.1" = {
963 name = "babel-helper-get-function-arity";
964 packageName = "babel-helper-get-function-arity";
965 version = "6.24.1";
966 src = fetchurl {
967 url = "https://registry.npmjs.org/babel-helper-get-function-arity/-/babel-helper-get-function-arity-6.24.1.tgz";
968 sha1 = "8f7782aa93407c41d3aa50908f89b031b1b6853d";
969 };
970 };
971 "babel-helper-hoist-variables-6.24.1" = {
972 name = "babel-helper-hoist-variables";
973 packageName = "babel-helper-hoist-variables";
974 version = "6.24.1";
975 src = fetchurl {
976 url = "https://registry.npmjs.org/babel-helper-hoist-variables/-/babel-helper-hoist-variables-6.24.1.tgz";
977 sha1 = "1ecb27689c9d25513eadbc9914a73f5408be7a76";
978 };
979 };
980 "babel-helper-optimise-call-expression-6.24.1" = {
981 name = "babel-helper-optimise-call-expression";
982 packageName = "babel-helper-optimise-call-expression";
983 version = "6.24.1";
984 src = fetchurl {
985 url = "https://registry.npmjs.org/babel-helper-optimise-call-expression/-/babel-helper-optimise-call-expression-6.24.1.tgz";
986 sha1 = "f7a13427ba9f73f8f4fa993c54a97882d1244257";
987 };
988 };
989 "babel-helper-regex-6.26.0" = {
990 name = "babel-helper-regex";
991 packageName = "babel-helper-regex";
992 version = "6.26.0";
993 src = fetchurl {
994 url = "https://registry.npmjs.org/babel-helper-regex/-/babel-helper-regex-6.26.0.tgz";
995 sha1 = "325c59f902f82f24b74faceed0363954f6495e72";
996 };
997 };
998 "babel-helper-remap-async-to-generator-6.24.1" = {
999 name = "babel-helper-remap-async-to-generator";
1000 packageName = "babel-helper-remap-async-to-generator";
1001 version = "6.24.1";
1002 src = fetchurl {
1003 url = "https://registry.npmjs.org/babel-helper-remap-async-to-generator/-/babel-helper-remap-async-to-generator-6.24.1.tgz";
1004 sha1 = "5ec581827ad723fecdd381f1c928390676e4551b";
1005 };
1006 };
1007 "babel-helper-replace-supers-6.24.1" = {
1008 name = "babel-helper-replace-supers";
1009 packageName = "babel-helper-replace-supers";
1010 version = "6.24.1";
1011 src = fetchurl {
1012 url = "https://registry.npmjs.org/babel-helper-replace-supers/-/babel-helper-replace-supers-6.24.1.tgz";
1013 sha1 = "bf6dbfe43938d17369a213ca8a8bf74b6a90ab1a";
1014 };
1015 };
1016 "babel-helpers-6.24.1" = {
1017 name = "babel-helpers";
1018 packageName = "babel-helpers";
1019 version = "6.24.1";
1020 src = fetchurl {
1021 url = "https://registry.npmjs.org/babel-helpers/-/babel-helpers-6.24.1.tgz";
1022 sha1 = "3471de9caec388e5c850e597e58a26ddf37602b2";
1023 };
1024 };
1025 "babel-loader-7.1.5" = {
1026 name = "babel-loader";
1027 packageName = "babel-loader";
1028 version = "7.1.5";
1029 src = fetchurl {
1030 url = "https://registry.npmjs.org/babel-loader/-/babel-loader-7.1.5.tgz";
1031 sha512 = "iCHfbieL5d1LfOQeeVJEUyD9rTwBcP/fcEbRCfempxTDuqrKpu0AZjLAQHEQa3Yqyj9ORKe2iHfoj4rHLf7xpw==";
1032 };
1033 };
1034 "babel-messages-6.23.0" = {
1035 name = "babel-messages";
1036 packageName = "babel-messages";
1037 version = "6.23.0";
1038 src = fetchurl {
1039 url = "https://registry.npmjs.org/babel-messages/-/babel-messages-6.23.0.tgz";
1040 sha1 = "f3cdf4703858035b2a2951c6ec5edf6c62f2630e";
1041 };
1042 };
1043 "babel-plugin-check-es2015-constants-6.22.0" = {
1044 name = "babel-plugin-check-es2015-constants";
1045 packageName = "babel-plugin-check-es2015-constants";
1046 version = "6.22.0";
1047 src = fetchurl {
1048 url = "https://registry.npmjs.org/babel-plugin-check-es2015-constants/-/babel-plugin-check-es2015-constants-6.22.0.tgz";
1049 sha1 = "35157b101426fd2ffd3da3f75c7d1e91835bbf8a";
1050 };
1051 };
1052 "babel-plugin-syntax-async-functions-6.13.0" = {
1053 name = "babel-plugin-syntax-async-functions";
1054 packageName = "babel-plugin-syntax-async-functions";
1055 version = "6.13.0";
1056 src = fetchurl {
1057 url = "https://registry.npmjs.org/babel-plugin-syntax-async-functions/-/babel-plugin-syntax-async-functions-6.13.0.tgz";
1058 sha1 = "cad9cad1191b5ad634bf30ae0872391e0647be95";
1059 };
1060 };
1061 "babel-plugin-syntax-exponentiation-operator-6.13.0" = {
1062 name = "babel-plugin-syntax-exponentiation-operator";
1063 packageName = "babel-plugin-syntax-exponentiation-operator";
1064 version = "6.13.0";
1065 src = fetchurl {
1066 url = "https://registry.npmjs.org/babel-plugin-syntax-exponentiation-operator/-/babel-plugin-syntax-exponentiation-operator-6.13.0.tgz";
1067 sha1 = "9ee7e8337290da95288201a6a57f4170317830de";
1068 };
1069 };
1070 "babel-plugin-syntax-object-rest-spread-6.13.0" = {
1071 name = "babel-plugin-syntax-object-rest-spread";
1072 packageName = "babel-plugin-syntax-object-rest-spread";
1073 version = "6.13.0";
1074 src = fetchurl {
1075 url = "https://registry.npmjs.org/babel-plugin-syntax-object-rest-spread/-/babel-plugin-syntax-object-rest-spread-6.13.0.tgz";
1076 sha1 = "fd6536f2bce13836ffa3a5458c4903a597bb3bf5";
1077 };
1078 };
1079 "babel-plugin-syntax-trailing-function-commas-6.22.0" = {
1080 name = "babel-plugin-syntax-trailing-function-commas";
1081 packageName = "babel-plugin-syntax-trailing-function-commas";
1082 version = "6.22.0";
1083 src = fetchurl {
1084 url = "https://registry.npmjs.org/babel-plugin-syntax-trailing-function-commas/-/babel-plugin-syntax-trailing-function-commas-6.22.0.tgz";
1085 sha1 = "ba0360937f8d06e40180a43fe0d5616fff532cf3";
1086 };
1087 };
1088 "babel-plugin-transform-async-to-generator-6.24.1" = {
1089 name = "babel-plugin-transform-async-to-generator";
1090 packageName = "babel-plugin-transform-async-to-generator";
1091 version = "6.24.1";
1092 src = fetchurl {
1093 url = "https://registry.npmjs.org/babel-plugin-transform-async-to-generator/-/babel-plugin-transform-async-to-generator-6.24.1.tgz";
1094 sha1 = "6536e378aff6cb1d5517ac0e40eb3e9fc8d08761";
1095 };
1096 };
1097 "babel-plugin-transform-es2015-arrow-functions-6.22.0" = {
1098 name = "babel-plugin-transform-es2015-arrow-functions";
1099 packageName = "babel-plugin-transform-es2015-arrow-functions";
1100 version = "6.22.0";
1101 src = fetchurl {
1102 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-arrow-functions/-/babel-plugin-transform-es2015-arrow-functions-6.22.0.tgz";
1103 sha1 = "452692cb711d5f79dc7f85e440ce41b9f244d221";
1104 };
1105 };
1106 "babel-plugin-transform-es2015-block-scoped-functions-6.22.0" = {
1107 name = "babel-plugin-transform-es2015-block-scoped-functions";
1108 packageName = "babel-plugin-transform-es2015-block-scoped-functions";
1109 version = "6.22.0";
1110 src = fetchurl {
1111 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoped-functions/-/babel-plugin-transform-es2015-block-scoped-functions-6.22.0.tgz";
1112 sha1 = "bbc51b49f964d70cb8d8e0b94e820246ce3a6141";
1113 };
1114 };
1115 "babel-plugin-transform-es2015-block-scoping-6.26.0" = {
1116 name = "babel-plugin-transform-es2015-block-scoping";
1117 packageName = "babel-plugin-transform-es2015-block-scoping";
1118 version = "6.26.0";
1119 src = fetchurl {
1120 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-block-scoping/-/babel-plugin-transform-es2015-block-scoping-6.26.0.tgz";
1121 sha1 = "d70f5299c1308d05c12f463813b0a09e73b1895f";
1122 };
1123 };
1124 "babel-plugin-transform-es2015-classes-6.24.1" = {
1125 name = "babel-plugin-transform-es2015-classes";
1126 packageName = "babel-plugin-transform-es2015-classes";
1127 version = "6.24.1";
1128 src = fetchurl {
1129 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-classes/-/babel-plugin-transform-es2015-classes-6.24.1.tgz";
1130 sha1 = "5a4c58a50c9c9461e564b4b2a3bfabc97a2584db";
1131 };
1132 };
1133 "babel-plugin-transform-es2015-computed-properties-6.24.1" = {
1134 name = "babel-plugin-transform-es2015-computed-properties";
1135 packageName = "babel-plugin-transform-es2015-computed-properties";
1136 version = "6.24.1";
1137 src = fetchurl {
1138 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-computed-properties/-/babel-plugin-transform-es2015-computed-properties-6.24.1.tgz";
1139 sha1 = "6fe2a8d16895d5634f4cd999b6d3480a308159b3";
1140 };
1141 };
1142 "babel-plugin-transform-es2015-destructuring-6.23.0" = {
1143 name = "babel-plugin-transform-es2015-destructuring";
1144 packageName = "babel-plugin-transform-es2015-destructuring";
1145 version = "6.23.0";
1146 src = fetchurl {
1147 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-destructuring/-/babel-plugin-transform-es2015-destructuring-6.23.0.tgz";
1148 sha1 = "997bb1f1ab967f682d2b0876fe358d60e765c56d";
1149 };
1150 };
1151 "babel-plugin-transform-es2015-duplicate-keys-6.24.1" = {
1152 name = "babel-plugin-transform-es2015-duplicate-keys";
1153 packageName = "babel-plugin-transform-es2015-duplicate-keys";
1154 version = "6.24.1";
1155 src = fetchurl {
1156 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-duplicate-keys/-/babel-plugin-transform-es2015-duplicate-keys-6.24.1.tgz";
1157 sha1 = "73eb3d310ca969e3ef9ec91c53741a6f1576423e";
1158 };
1159 };
1160 "babel-plugin-transform-es2015-for-of-6.23.0" = {
1161 name = "babel-plugin-transform-es2015-for-of";
1162 packageName = "babel-plugin-transform-es2015-for-of";
1163 version = "6.23.0";
1164 src = fetchurl {
1165 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-for-of/-/babel-plugin-transform-es2015-for-of-6.23.0.tgz";
1166 sha1 = "f47c95b2b613df1d3ecc2fdb7573623c75248691";
1167 };
1168 };
1169 "babel-plugin-transform-es2015-function-name-6.24.1" = {
1170 name = "babel-plugin-transform-es2015-function-name";
1171 packageName = "babel-plugin-transform-es2015-function-name";
1172 version = "6.24.1";
1173 src = fetchurl {
1174 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-function-name/-/babel-plugin-transform-es2015-function-name-6.24.1.tgz";
1175 sha1 = "834c89853bc36b1af0f3a4c5dbaa94fd8eacaa8b";
1176 };
1177 };
1178 "babel-plugin-transform-es2015-literals-6.22.0" = {
1179 name = "babel-plugin-transform-es2015-literals";
1180 packageName = "babel-plugin-transform-es2015-literals";
1181 version = "6.22.0";
1182 src = fetchurl {
1183 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-literals/-/babel-plugin-transform-es2015-literals-6.22.0.tgz";
1184 sha1 = "4f54a02d6cd66cf915280019a31d31925377ca2e";
1185 };
1186 };
1187 "babel-plugin-transform-es2015-modules-amd-6.24.1" = {
1188 name = "babel-plugin-transform-es2015-modules-amd";
1189 packageName = "babel-plugin-transform-es2015-modules-amd";
1190 version = "6.24.1";
1191 src = fetchurl {
1192 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-amd/-/babel-plugin-transform-es2015-modules-amd-6.24.1.tgz";
1193 sha1 = "3b3e54017239842d6d19c3011c4bd2f00a00d154";
1194 };
1195 };
1196 "babel-plugin-transform-es2015-modules-commonjs-6.26.2" = {
1197 name = "babel-plugin-transform-es2015-modules-commonjs";
1198 packageName = "babel-plugin-transform-es2015-modules-commonjs";
1199 version = "6.26.2";
1200 src = fetchurl {
1201 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-commonjs/-/babel-plugin-transform-es2015-modules-commonjs-6.26.2.tgz";
1202 sha512 = "CV9ROOHEdrjcwhIaJNBGMBCodN+1cfkwtM1SbUHmvyy35KGT7fohbpOxkE2uLz1o6odKK2Ck/tz47z+VqQfi9Q==";
1203 };
1204 };
1205 "babel-plugin-transform-es2015-modules-systemjs-6.24.1" = {
1206 name = "babel-plugin-transform-es2015-modules-systemjs";
1207 packageName = "babel-plugin-transform-es2015-modules-systemjs";
1208 version = "6.24.1";
1209 src = fetchurl {
1210 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-systemjs/-/babel-plugin-transform-es2015-modules-systemjs-6.24.1.tgz";
1211 sha1 = "ff89a142b9119a906195f5f106ecf305d9407d23";
1212 };
1213 };
1214 "babel-plugin-transform-es2015-modules-umd-6.24.1" = {
1215 name = "babel-plugin-transform-es2015-modules-umd";
1216 packageName = "babel-plugin-transform-es2015-modules-umd";
1217 version = "6.24.1";
1218 src = fetchurl {
1219 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-modules-umd/-/babel-plugin-transform-es2015-modules-umd-6.24.1.tgz";
1220 sha1 = "ac997e6285cd18ed6176adb607d602344ad38468";
1221 };
1222 };
1223 "babel-plugin-transform-es2015-object-super-6.24.1" = {
1224 name = "babel-plugin-transform-es2015-object-super";
1225 packageName = "babel-plugin-transform-es2015-object-super";
1226 version = "6.24.1";
1227 src = fetchurl {
1228 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-object-super/-/babel-plugin-transform-es2015-object-super-6.24.1.tgz";
1229 sha1 = "24cef69ae21cb83a7f8603dad021f572eb278f8d";
1230 };
1231 };
1232 "babel-plugin-transform-es2015-parameters-6.24.1" = {
1233 name = "babel-plugin-transform-es2015-parameters";
1234 packageName = "babel-plugin-transform-es2015-parameters";
1235 version = "6.24.1";
1236 src = fetchurl {
1237 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-parameters/-/babel-plugin-transform-es2015-parameters-6.24.1.tgz";
1238 sha1 = "57ac351ab49caf14a97cd13b09f66fdf0a625f2b";
1239 };
1240 };
1241 "babel-plugin-transform-es2015-shorthand-properties-6.24.1" = {
1242 name = "babel-plugin-transform-es2015-shorthand-properties";
1243 packageName = "babel-plugin-transform-es2015-shorthand-properties";
1244 version = "6.24.1";
1245 src = fetchurl {
1246 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-shorthand-properties/-/babel-plugin-transform-es2015-shorthand-properties-6.24.1.tgz";
1247 sha1 = "24f875d6721c87661bbd99a4622e51f14de38aa0";
1248 };
1249 };
1250 "babel-plugin-transform-es2015-spread-6.22.0" = {
1251 name = "babel-plugin-transform-es2015-spread";
1252 packageName = "babel-plugin-transform-es2015-spread";
1253 version = "6.22.0";
1254 src = fetchurl {
1255 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-spread/-/babel-plugin-transform-es2015-spread-6.22.0.tgz";
1256 sha1 = "d6d68a99f89aedc4536c81a542e8dd9f1746f8d1";
1257 };
1258 };
1259 "babel-plugin-transform-es2015-sticky-regex-6.24.1" = {
1260 name = "babel-plugin-transform-es2015-sticky-regex";
1261 packageName = "babel-plugin-transform-es2015-sticky-regex";
1262 version = "6.24.1";
1263 src = fetchurl {
1264 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-sticky-regex/-/babel-plugin-transform-es2015-sticky-regex-6.24.1.tgz";
1265 sha1 = "00c1cdb1aca71112cdf0cf6126c2ed6b457ccdbc";
1266 };
1267 };
1268 "babel-plugin-transform-es2015-template-literals-6.22.0" = {
1269 name = "babel-plugin-transform-es2015-template-literals";
1270 packageName = "babel-plugin-transform-es2015-template-literals";
1271 version = "6.22.0";
1272 src = fetchurl {
1273 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-template-literals/-/babel-plugin-transform-es2015-template-literals-6.22.0.tgz";
1274 sha1 = "a84b3450f7e9f8f1f6839d6d687da84bb1236d8d";
1275 };
1276 };
1277 "babel-plugin-transform-es2015-typeof-symbol-6.23.0" = {
1278 name = "babel-plugin-transform-es2015-typeof-symbol";
1279 packageName = "babel-plugin-transform-es2015-typeof-symbol";
1280 version = "6.23.0";
1281 src = fetchurl {
1282 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-typeof-symbol/-/babel-plugin-transform-es2015-typeof-symbol-6.23.0.tgz";
1283 sha1 = "dec09f1cddff94b52ac73d505c84df59dcceb372";
1284 };
1285 };
1286 "babel-plugin-transform-es2015-unicode-regex-6.24.1" = {
1287 name = "babel-plugin-transform-es2015-unicode-regex";
1288 packageName = "babel-plugin-transform-es2015-unicode-regex";
1289 version = "6.24.1";
1290 src = fetchurl {
1291 url = "https://registry.npmjs.org/babel-plugin-transform-es2015-unicode-regex/-/babel-plugin-transform-es2015-unicode-regex-6.24.1.tgz";
1292 sha1 = "d38b12f42ea7323f729387f18a7c5ae1faeb35e9";
1293 };
1294 };
1295 "babel-plugin-transform-exponentiation-operator-6.24.1" = {
1296 name = "babel-plugin-transform-exponentiation-operator";
1297 packageName = "babel-plugin-transform-exponentiation-operator";
1298 version = "6.24.1";
1299 src = fetchurl {
1300 url = "https://registry.npmjs.org/babel-plugin-transform-exponentiation-operator/-/babel-plugin-transform-exponentiation-operator-6.24.1.tgz";
1301 sha1 = "2ab0c9c7f3098fa48907772bb813fe41e8de3a0e";
1302 };
1303 };
1304 "babel-plugin-transform-object-rest-spread-6.26.0" = {
1305 name = "babel-plugin-transform-object-rest-spread";
1306 packageName = "babel-plugin-transform-object-rest-spread";
1307 version = "6.26.0";
1308 src = fetchurl {
1309 url = "https://registry.npmjs.org/babel-plugin-transform-object-rest-spread/-/babel-plugin-transform-object-rest-spread-6.26.0.tgz";
1310 sha1 = "0f36692d50fef6b7e2d4b3ac1478137a963b7b06";
1311 };
1312 };
1313 "babel-plugin-transform-regenerator-6.26.0" = {
1314 name = "babel-plugin-transform-regenerator";
1315 packageName = "babel-plugin-transform-regenerator";
1316 version = "6.26.0";
1317 src = fetchurl {
1318 url = "https://registry.npmjs.org/babel-plugin-transform-regenerator/-/babel-plugin-transform-regenerator-6.26.0.tgz";
1319 sha1 = "e0703696fbde27f0a3efcacf8b4dca2f7b3a8f2f";
1320 };
1321 };
1322 "babel-plugin-transform-strict-mode-6.24.1" = {
1323 name = "babel-plugin-transform-strict-mode";
1324 packageName = "babel-plugin-transform-strict-mode";
1325 version = "6.24.1";
1326 src = fetchurl {
1327 url = "https://registry.npmjs.org/babel-plugin-transform-strict-mode/-/babel-plugin-transform-strict-mode-6.24.1.tgz";
1328 sha1 = "d5faf7aa578a65bbe591cf5edae04a0c67020758";
1329 };
1330 };
1331 "babel-preset-env-1.7.0" = {
1332 name = "babel-preset-env";
1333 packageName = "babel-preset-env";
281 version = "1.7.0";
1334 version = "1.7.0";
282 src = fetchurl {
1335 src = fetchurl {
283 url = "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz";
1336 url = "https://registry.npmjs.org/babel-preset-env/-/babel-preset-env-1.7.0.tgz";
284 sha512 = "32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==";
1337 sha512 = "9OR2afuKDneX2/q2EurSftUYM0xGu4O2D9adAhVfADDhrYDaxXV0rBbevVYoY9n6nyX1PmQW/0jtpJvUNr9CHg==";
285 };
1338 };
286 };
1339 };
287 "babel-polyfill-6.26.0" = {
1340 "babel-register-6.26.0" = {
288 name = "babel-polyfill";
1341 name = "babel-register";
289 packageName = "babel-polyfill";
1342 packageName = "babel-register";
290 version = "6.26.0";
1343 version = "6.26.0";
291 src = fetchurl {
1344 src = fetchurl {
292 url = "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz";
1345 url = "https://registry.npmjs.org/babel-register/-/babel-register-6.26.0.tgz";
293 sha1 = "379937abc67d7895970adc621f284cd966cf2153";
1346 sha1 = "6ed021173e2fcb486d7acb45c6009a856f647071";
294 };
1347 };
295 };
1348 };
296 "babel-runtime-6.26.0" = {
1349 "babel-runtime-6.26.0" = {
@@ -302,6 +1355,51 b' let'
302 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
1355 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
303 };
1356 };
304 };
1357 };
1358 "babel-template-6.26.0" = {
1359 name = "babel-template";
1360 packageName = "babel-template";
1361 version = "6.26.0";
1362 src = fetchurl {
1363 url = "https://registry.npmjs.org/babel-template/-/babel-template-6.26.0.tgz";
1364 sha1 = "de03e2d16396b069f46dd9fff8521fb1a0e35e02";
1365 };
1366 };
1367 "babel-traverse-6.26.0" = {
1368 name = "babel-traverse";
1369 packageName = "babel-traverse";
1370 version = "6.26.0";
1371 src = fetchurl {
1372 url = "https://registry.npmjs.org/babel-traverse/-/babel-traverse-6.26.0.tgz";
1373 sha1 = "46a9cbd7edcc62c8e5c064e2d2d8d0f4035766ee";
1374 };
1375 };
1376 "babel-types-6.26.0" = {
1377 name = "babel-types";
1378 packageName = "babel-types";
1379 version = "6.26.0";
1380 src = fetchurl {
1381 url = "https://registry.npmjs.org/babel-types/-/babel-types-6.26.0.tgz";
1382 sha1 = "a3b073f94ab49eb6fa55cd65227a334380632497";
1383 };
1384 };
1385 "babylon-6.18.0" = {
1386 name = "babylon";
1387 packageName = "babylon";
1388 version = "6.18.0";
1389 src = fetchurl {
1390 url = "https://registry.npmjs.org/babylon/-/babylon-6.18.0.tgz";
1391 sha512 = "q/UEjfGJ2Cm3oKV71DJz9d25TPnq5rhBVL2Q4fA5wcC3jcrdn7+SssEybFIxwAvvP+YCsCYNKughoF33GxgycQ==";
1392 };
1393 };
1394 "balanced-match-0.4.2" = {
1395 name = "balanced-match";
1396 packageName = "balanced-match";
1397 version = "0.4.2";
1398 src = fetchurl {
1399 url = "https://registry.npmjs.org/balanced-match/-/balanced-match-0.4.2.tgz";
1400 sha1 = "cb3f3e3c732dc0f01ee70b403f302e61d7709838";
1401 };
1402 };
305 "balanced-match-1.0.0" = {
1403 "balanced-match-1.0.0" = {
306 name = "balanced-match";
1404 name = "balanced-match";
307 packageName = "balanced-match";
1405 packageName = "balanced-match";
@@ -311,13 +1409,22 b' let'
311 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
1409 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
312 };
1410 };
313 };
1411 };
314 "base64-js-1.2.3" = {
1412 "base-0.11.2" = {
1413 name = "base";
1414 packageName = "base";
1415 version = "0.11.2";
1416 src = fetchurl {
1417 url = "https://registry.npmjs.org/base/-/base-0.11.2.tgz";
1418 sha512 = "5T6P4xPgpp0YDFvSWwEZ4NoE3aM4QBQXDzmVbraCkFj8zHM+mba8SyqB5DbZWyR7mYHo6Y7BdQo3MoA4m0TeQg==";
1419 };
1420 };
1421 "base64-js-1.3.0" = {
315 name = "base64-js";
1422 name = "base64-js";
316 packageName = "base64-js";
1423 packageName = "base64-js";
317 version = "1.2.3";
1424 version = "1.3.0";
318 src = fetchurl {
1425 src = fetchurl {
319 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz";
1426 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.3.0.tgz";
320 sha512 = "MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==";
1427 sha512 = "ccav/yGvoa80BQDljCxsmmQ3Xvx60/UpBIij5QN21W3wBi/hhIC9OoO+KLpu9IJTS9j4DRVJ3aDDF9cMSoa2lw==";
321 };
1428 };
322 };
1429 };
323 "bcrypt-pbkdf-1.0.2" = {
1430 "bcrypt-pbkdf-1.0.2" = {
@@ -329,6 +1436,51 b' let'
329 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
1436 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
330 };
1437 };
331 };
1438 };
1439 "big.js-3.2.0" = {
1440 name = "big.js";
1441 packageName = "big.js";
1442 version = "3.2.0";
1443 src = fetchurl {
1444 url = "https://registry.npmjs.org/big.js/-/big.js-3.2.0.tgz";
1445 sha512 = "+hN/Zh2D08Mx65pZ/4g5bsmNiZUuChDiQfTUQ7qJr4/kuopCr88xZsAXv6mBoZEsUI4OuGHlX59qE94K2mMW8Q==";
1446 };
1447 };
1448 "binary-extensions-1.12.0" = {
1449 name = "binary-extensions";
1450 packageName = "binary-extensions";
1451 version = "1.12.0";
1452 src = fetchurl {
1453 url = "https://registry.npmjs.org/binary-extensions/-/binary-extensions-1.12.0.tgz";
1454 sha512 = "DYWGk01lDcxeS/K9IHPGWfT8PsJmbXRtRd2Sx72Tnb8pcYZQFF1oSDb8hJtS1vhp212q1Rzi5dUf9+nq0o9UIg==";
1455 };
1456 };
1457 "bluebird-3.5.2" = {
1458 name = "bluebird";
1459 packageName = "bluebird";
1460 version = "3.5.2";
1461 src = fetchurl {
1462 url = "https://registry.npmjs.org/bluebird/-/bluebird-3.5.2.tgz";
1463 sha512 = "dhHTWMI7kMx5whMQntl7Vr9C6BvV10lFXDAasnqnrMYhXVCzzk6IO9Fo2L75jXHT07WrOngL1WDXOp+yYS91Yg==";
1464 };
1465 };
1466 "bn.js-4.11.8" = {
1467 name = "bn.js";
1468 packageName = "bn.js";
1469 version = "4.11.8";
1470 src = fetchurl {
1471 url = "https://registry.npmjs.org/bn.js/-/bn.js-4.11.8.tgz";
1472 sha512 = "ItfYfPLkWHUjckQCk8xC+LwxgK8NYcXywGigJgSwOP8Y2iyWT4f2vsZnoOXTTbo+o5yXmIUJ4gn5538SO5S3gA==";
1473 };
1474 };
1475 "boolbase-1.0.0" = {
1476 name = "boolbase";
1477 packageName = "boolbase";
1478 version = "1.0.0";
1479 src = fetchurl {
1480 url = "https://registry.npmjs.org/boolbase/-/boolbase-1.0.0.tgz";
1481 sha1 = "68dff5fbe60c51eb37725ea9e3ed310dcc1e776e";
1482 };
1483 };
332 "boom-2.10.1" = {
1484 "boom-2.10.1" = {
333 name = "boom";
1485 name = "boom";
334 packageName = "boom";
1486 packageName = "boom";
@@ -338,15 +1490,6 b' let'
338 sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
1490 sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
339 };
1491 };
340 };
1492 };
341 "bower-1.8.4" = {
342 name = "bower";
343 packageName = "bower";
344 version = "1.8.4";
345 src = fetchurl {
346 url = "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz";
347 sha1 = "e7876a076deb8137f7d06525dc5e8c66db82f28a";
348 };
349 };
350 "brace-expansion-1.1.11" = {
1493 "brace-expansion-1.1.11" = {
351 name = "brace-expansion";
1494 name = "brace-expansion";
352 packageName = "brace-expansion";
1495 packageName = "brace-expansion";
@@ -356,6 +1499,105 b' let'
356 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
1499 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
357 };
1500 };
358 };
1501 };
1502 "braces-2.3.2" = {
1503 name = "braces";
1504 packageName = "braces";
1505 version = "2.3.2";
1506 src = fetchurl {
1507 url = "https://registry.npmjs.org/braces/-/braces-2.3.2.tgz";
1508 sha512 = "aNdbnj9P8PjdXU4ybaWLK2IF3jc/EoDYbC7AazW6to3TRsfXxscC9UXOB5iDiEQrkyIbWp2SLQda4+QAa7nc3w==";
1509 };
1510 };
1511 "brorand-1.1.0" = {
1512 name = "brorand";
1513 packageName = "brorand";
1514 version = "1.1.0";
1515 src = fetchurl {
1516 url = "https://registry.npmjs.org/brorand/-/brorand-1.1.0.tgz";
1517 sha1 = "12c25efe40a45e3c323eb8675a0a0ce57b22371f";
1518 };
1519 };
1520 "browserify-aes-1.2.0" = {
1521 name = "browserify-aes";
1522 packageName = "browserify-aes";
1523 version = "1.2.0";
1524 src = fetchurl {
1525 url = "https://registry.npmjs.org/browserify-aes/-/browserify-aes-1.2.0.tgz";
1526 sha512 = "+7CHXqGuspUn/Sl5aO7Ea0xWGAtETPXNSAjHo48JfLdPWcMng33Xe4znFvQweqc/uzk5zSOI3H52CYnjCfb5hA==";
1527 };
1528 };
1529 "browserify-cipher-1.0.1" = {
1530 name = "browserify-cipher";
1531 packageName = "browserify-cipher";
1532 version = "1.0.1";
1533 src = fetchurl {
1534 url = "https://registry.npmjs.org/browserify-cipher/-/browserify-cipher-1.0.1.tgz";
1535 sha512 = "sPhkz0ARKbf4rRQt2hTpAHqn47X3llLkUGn+xEJzLjwY8LRs2p0v7ljvI5EyoRO/mexrNunNECisZs+gw2zz1w==";
1536 };
1537 };
1538 "browserify-des-1.0.2" = {
1539 name = "browserify-des";
1540 packageName = "browserify-des";
1541 version = "1.0.2";
1542 src = fetchurl {
1543 url = "https://registry.npmjs.org/browserify-des/-/browserify-des-1.0.2.tgz";
1544 sha512 = "BioO1xf3hFwz4kc6iBhI3ieDFompMhrMlnDFC4/0/vd5MokpuAc3R+LYbwTA9A5Yc9pq9UYPqffKpW2ObuwX5A==";
1545 };
1546 };
1547 "browserify-rsa-4.0.1" = {
1548 name = "browserify-rsa";
1549 packageName = "browserify-rsa";
1550 version = "4.0.1";
1551 src = fetchurl {
1552 url = "https://registry.npmjs.org/browserify-rsa/-/browserify-rsa-4.0.1.tgz";
1553 sha1 = "21e0abfaf6f2029cf2fafb133567a701d4135524";
1554 };
1555 };
1556 "browserify-sign-4.0.4" = {
1557 name = "browserify-sign";
1558 packageName = "browserify-sign";
1559 version = "4.0.4";
1560 src = fetchurl {
1561 url = "https://registry.npmjs.org/browserify-sign/-/browserify-sign-4.0.4.tgz";
1562 sha1 = "aa4eb68e5d7b658baa6bf6a57e630cbd7a93d298";
1563 };
1564 };
1565 "browserify-zlib-0.2.0" = {
1566 name = "browserify-zlib";
1567 packageName = "browserify-zlib";
1568 version = "0.2.0";
1569 src = fetchurl {
1570 url = "https://registry.npmjs.org/browserify-zlib/-/browserify-zlib-0.2.0.tgz";
1571 sha512 = "Z942RysHXmJrhqk88FmKBVq/v5tqmSkDz7p54G/MGyjMnCFFnC79XWNbg+Vta8W6Wb2qtSZTSxIGkJrRpCFEiA==";
1572 };
1573 };
1574 "browserslist-1.7.7" = {
1575 name = "browserslist";
1576 packageName = "browserslist";
1577 version = "1.7.7";
1578 src = fetchurl {
1579 url = "https://registry.npmjs.org/browserslist/-/browserslist-1.7.7.tgz";
1580 sha1 = "0bd76704258be829b2398bb50e4b62d1a166b0b9";
1581 };
1582 };
1583 "browserslist-3.2.8" = {
1584 name = "browserslist";
1585 packageName = "browserslist";
1586 version = "3.2.8";
1587 src = fetchurl {
1588 url = "https://registry.npmjs.org/browserslist/-/browserslist-3.2.8.tgz";
1589 sha512 = "WHVocJYavUwVgVViC0ORikPHQquXwVh939TaelZ4WDqpWgTX/FsGhl/+P4qBUAGcRvtOgDgC+xftNWWp2RUTAQ==";
1590 };
1591 };
1592 "buffer-4.9.1" = {
1593 name = "buffer";
1594 packageName = "buffer";
1595 version = "4.9.1";
1596 src = fetchurl {
1597 url = "https://registry.npmjs.org/buffer/-/buffer-4.9.1.tgz";
1598 sha1 = "6d1bb601b07a4efced97094132093027c95bc298";
1599 };
1600 };
359 "buffer-from-1.1.1" = {
1601 "buffer-from-1.1.1" = {
360 name = "buffer-from";
1602 name = "buffer-from";
361 packageName = "buffer-from";
1603 packageName = "buffer-from";
@@ -365,22 +1607,94 b' let'
365 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
1607 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
366 };
1608 };
367 };
1609 };
368 "builtin-modules-1.1.1" = {
1610 "buffer-xor-1.0.3" = {
369 name = "builtin-modules";
1611 name = "buffer-xor";
370 packageName = "builtin-modules";
1612 packageName = "buffer-xor";
371 version = "1.1.1";
372 src = fetchurl {
373 url = "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz";
374 sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
375 };
376 };
377 "builtins-1.0.3" = {
378 name = "builtins";
379 packageName = "builtins";
380 version = "1.0.3";
1613 version = "1.0.3";
381 src = fetchurl {
1614 src = fetchurl {
382 url = "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz";
1615 url = "https://registry.npmjs.org/buffer-xor/-/buffer-xor-1.0.3.tgz";
383 sha1 = "cb94faeb61c8696451db36534e1422f94f0aee88";
1616 sha1 = "26e61ed1422fb70dd42e6e36729ed51d855fe8d9";
1617 };
1618 };
1619 "builtin-status-codes-3.0.0" = {
1620 name = "builtin-status-codes";
1621 packageName = "builtin-status-codes";
1622 version = "3.0.0";
1623 src = fetchurl {
1624 url = "https://registry.npmjs.org/builtin-status-codes/-/builtin-status-codes-3.0.0.tgz";
1625 sha1 = "85982878e21b98e1c66425e03d0174788f569ee8";
1626 };
1627 };
1628 "cacache-10.0.4" = {
1629 name = "cacache";
1630 packageName = "cacache";
1631 version = "10.0.4";
1632 src = fetchurl {
1633 url = "https://registry.npmjs.org/cacache/-/cacache-10.0.4.tgz";
1634 sha512 = "Dph0MzuH+rTQzGPNT9fAnrPmMmjKfST6trxJeK7NQuHRaVw24VzPRWTmg9MpcwOVQZO0E1FBICUlFeNaKPIfHA==";
1635 };
1636 };
1637 "cache-base-1.0.1" = {
1638 name = "cache-base";
1639 packageName = "cache-base";
1640 version = "1.0.1";
1641 src = fetchurl {
1642 url = "https://registry.npmjs.org/cache-base/-/cache-base-1.0.1.tgz";
1643 sha512 = "AKcdTnFSWATd5/GCPRxr2ChwIJ85CeyrEyjRHlKxQ56d4XJMGym0uAiKn0xbLOGOl3+yRpOTi484dVCEc5AUzQ==";
1644 };
1645 };
1646 "camel-case-3.0.0" = {
1647 name = "camel-case";
1648 packageName = "camel-case";
1649 version = "3.0.0";
1650 src = fetchurl {
1651 url = "https://registry.npmjs.org/camel-case/-/camel-case-3.0.0.tgz";
1652 sha1 = "ca3c3688a4e9cf3a4cda777dc4dcbc713249cf73";
1653 };
1654 };
1655 "camelcase-1.2.1" = {
1656 name = "camelcase";
1657 packageName = "camelcase";
1658 version = "1.2.1";
1659 src = fetchurl {
1660 url = "https://registry.npmjs.org/camelcase/-/camelcase-1.2.1.tgz";
1661 sha1 = "9bb5304d2e0b56698b2c758b08a3eaa9daa58a39";
1662 };
1663 };
1664 "camelcase-4.1.0" = {
1665 name = "camelcase";
1666 packageName = "camelcase";
1667 version = "4.1.0";
1668 src = fetchurl {
1669 url = "https://registry.npmjs.org/camelcase/-/camelcase-4.1.0.tgz";
1670 sha1 = "d545635be1e33c542649c69173e5de6acfae34dd";
1671 };
1672 };
1673 "caniuse-api-1.6.1" = {
1674 name = "caniuse-api";
1675 packageName = "caniuse-api";
1676 version = "1.6.1";
1677 src = fetchurl {
1678 url = "https://registry.npmjs.org/caniuse-api/-/caniuse-api-1.6.1.tgz";
1679 sha1 = "b534e7c734c4f81ec5fbe8aca2ad24354b962c6c";
1680 };
1681 };
1682 "caniuse-db-1.0.30000900" = {
1683 name = "caniuse-db";
1684 packageName = "caniuse-db";
1685 version = "1.0.30000900";
1686 src = fetchurl {
1687 url = "https://registry.npmjs.org/caniuse-db/-/caniuse-db-1.0.30000900.tgz";
1688 sha512 = "fvicVRDlhHIQpt/bmbLl3hDHKUZb5ZP8O2OuZLz2fSEPlUBbvwwbhhqhGS617ldN6bDoo9A3+MQKQyFq0p7UXA==";
1689 };
1690 };
1691 "caniuse-lite-1.0.30000900" = {
1692 name = "caniuse-lite";
1693 packageName = "caniuse-lite";
1694 version = "1.0.30000900";
1695 src = fetchurl {
1696 url = "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30000900.tgz";
1697 sha512 = "xDVs8pBFr6bzq9pXUkLKpGQQnzsF/l6/yX38UnCkTcUcwC0rDl1NGZGildcJVTU+uGBxfsyniK/ZWagPNn1Oqw==";
384 };
1698 };
385 };
1699 };
386 "caseless-0.12.0" = {
1700 "caseless-0.12.0" = {
@@ -392,6 +1706,15 b' let'
392 sha1 = "1b681c21ff84033c826543090689420d187151dc";
1706 sha1 = "1b681c21ff84033c826543090689420d187151dc";
393 };
1707 };
394 };
1708 };
1709 "center-align-0.1.3" = {
1710 name = "center-align";
1711 packageName = "center-align";
1712 version = "0.1.3";
1713 src = fetchurl {
1714 url = "https://registry.npmjs.org/center-align/-/center-align-0.1.3.tgz";
1715 sha1 = "aa0d32629b6ee972200411cbd4461c907bc2b7ad";
1716 };
1717 };
395 "chalk-0.5.1" = {
1718 "chalk-0.5.1" = {
396 name = "chalk";
1719 name = "chalk";
397 packageName = "chalk";
1720 packageName = "chalk";
@@ -410,6 +1733,78 b' let'
410 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
1733 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
411 };
1734 };
412 };
1735 };
1736 "chalk-2.4.1" = {
1737 name = "chalk";
1738 packageName = "chalk";
1739 version = "2.4.1";
1740 src = fetchurl {
1741 url = "https://registry.npmjs.org/chalk/-/chalk-2.4.1.tgz";
1742 sha512 = "ObN6h1v2fTJSmUXoS3nMQ92LbDK9be4TV+6G+omQlGJFdcUX5heKi1LZ1YnRMIgwTLEj3E24bT6tYni50rlCfQ==";
1743 };
1744 };
1745 "chokidar-2.0.4" = {
1746 name = "chokidar";
1747 packageName = "chokidar";
1748 version = "2.0.4";
1749 src = fetchurl {
1750 url = "https://registry.npmjs.org/chokidar/-/chokidar-2.0.4.tgz";
1751 sha512 = "z9n7yt9rOvIJrMhvDtDictKrkFHeihkNl6uWMmZlmL6tJtX9Cs+87oK+teBx+JIgzvbX3yZHT3eF8vpbDxHJXQ==";
1752 };
1753 };
1754 "chownr-1.1.1" = {
1755 name = "chownr";
1756 packageName = "chownr";
1757 version = "1.1.1";
1758 src = fetchurl {
1759 url = "https://registry.npmjs.org/chownr/-/chownr-1.1.1.tgz";
1760 sha512 = "j38EvO5+LHX84jlo6h4UzmOwi0UgW61WRyPtJz4qaadK5eY3BTS5TY/S1Stc3Uk2lIM6TPevAlULiEJwie860g==";
1761 };
1762 };
1763 "chrome-trace-event-1.0.0" = {
1764 name = "chrome-trace-event";
1765 packageName = "chrome-trace-event";
1766 version = "1.0.0";
1767 src = fetchurl {
1768 url = "https://registry.npmjs.org/chrome-trace-event/-/chrome-trace-event-1.0.0.tgz";
1769 sha512 = "xDbVgyfDTT2piup/h8dK/y4QZfJRSa73bw1WZ8b4XM1o7fsFubUVGYcE+1ANtOzJJELGpYoG2961z0Z6OAld9A==";
1770 };
1771 };
1772 "cipher-base-1.0.4" = {
1773 name = "cipher-base";
1774 packageName = "cipher-base";
1775 version = "1.0.4";
1776 src = fetchurl {
1777 url = "https://registry.npmjs.org/cipher-base/-/cipher-base-1.0.4.tgz";
1778 sha512 = "Kkht5ye6ZGmwv40uUDZztayT2ThLQGfnj/T71N/XzeZeo3nf8foyW7zGTsPYkEya3m5f3cAypH+qe7YOrM1U2Q==";
1779 };
1780 };
1781 "clap-1.2.3" = {
1782 name = "clap";
1783 packageName = "clap";
1784 version = "1.2.3";
1785 src = fetchurl {
1786 url = "https://registry.npmjs.org/clap/-/clap-1.2.3.tgz";
1787 sha512 = "4CoL/A3hf90V3VIEjeuhSvlGFEHKzOz+Wfc2IVZc+FaUgU0ZQafJTP49fvnULipOPcAfqhyI2duwQyns6xqjYA==";
1788 };
1789 };
1790 "class-utils-0.3.6" = {
1791 name = "class-utils";
1792 packageName = "class-utils";
1793 version = "0.3.6";
1794 src = fetchurl {
1795 url = "https://registry.npmjs.org/class-utils/-/class-utils-0.3.6.tgz";
1796 sha512 = "qOhPa/Fj7s6TY8H8esGu5QNpMMQxz79h+urzrNYN6mn+9BnxlDGf5QZ+XeCDsxSjPqsSR56XOZOJmpeurnLMeg==";
1797 };
1798 };
1799 "clean-css-4.2.1" = {
1800 name = "clean-css";
1801 packageName = "clean-css";
1802 version = "4.2.1";
1803 src = fetchurl {
1804 url = "https://registry.npmjs.org/clean-css/-/clean-css-4.2.1.tgz";
1805 sha512 = "4ZxI6dy4lrY6FHzfiy1aEOXgu4LIsW2MhwG0VBKdcoGoH/XLFgaHSdLTGr4O8Be6A8r3MOphEiI8Gc1n0ecf3g==";
1806 };
1807 };
413 "cli-1.0.1" = {
1808 "cli-1.0.1" = {
414 name = "cli";
1809 name = "cli";
415 packageName = "cli";
1810 packageName = "cli";
@@ -428,6 +1823,24 b' let'
428 sha512 = "7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==";
1823 sha512 = "7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==";
429 };
1824 };
430 };
1825 };
1826 "cliui-2.1.0" = {
1827 name = "cliui";
1828 packageName = "cliui";
1829 version = "2.1.0";
1830 src = fetchurl {
1831 url = "https://registry.npmjs.org/cliui/-/cliui-2.1.0.tgz";
1832 sha1 = "4b475760ff80264c762c3a1719032e91c7fea0d1";
1833 };
1834 };
1835 "cliui-4.1.0" = {
1836 name = "cliui";
1837 packageName = "cliui";
1838 version = "4.1.0";
1839 src = fetchurl {
1840 url = "https://registry.npmjs.org/cliui/-/cliui-4.1.0.tgz";
1841 sha512 = "4FG+RSG9DL7uEwRUZXZn3SS34DiDPfzP0VOiEwtUWlE+AR2EIg+hSyvrIgUUfhdgR/UkAeW2QHgeP+hWrXs7jQ==";
1842 };
1843 };
431 "clone-1.0.4" = {
1844 "clone-1.0.4" = {
432 name = "clone";
1845 name = "clone";
433 packageName = "clone";
1846 packageName = "clone";
@@ -437,6 +1850,15 b' let'
437 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
1850 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
438 };
1851 };
439 };
1852 };
1853 "clone-2.1.2" = {
1854 name = "clone";
1855 packageName = "clone";
1856 version = "2.1.2";
1857 src = fetchurl {
1858 url = "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz";
1859 sha1 = "1b7f4b9f591f1e8f83670401600345a02887435f";
1860 };
1861 };
440 "co-4.6.0" = {
1862 "co-4.6.0" = {
441 name = "co";
1863 name = "co";
442 packageName = "co";
1864 packageName = "co";
@@ -446,6 +1868,15 b' let'
446 sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
1868 sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
447 };
1869 };
448 };
1870 };
1871 "coa-1.0.4" = {
1872 name = "coa";
1873 packageName = "coa";
1874 version = "1.0.4";
1875 src = fetchurl {
1876 url = "https://registry.npmjs.org/coa/-/coa-1.0.4.tgz";
1877 sha1 = "a9ef153660d6a86a8bdec0289a5c684d217432fd";
1878 };
1879 };
449 "code-point-at-1.1.0" = {
1880 "code-point-at-1.1.0" = {
450 name = "code-point-at";
1881 name = "code-point-at";
451 packageName = "code-point-at";
1882 packageName = "code-point-at";
@@ -464,6 +1895,60 b' let'
464 sha1 = "150d6b4cb522894369efed6a2101c20bc7f4a4f4";
1895 sha1 = "150d6b4cb522894369efed6a2101c20bc7f4a4f4";
465 };
1896 };
466 };
1897 };
1898 "collection-visit-1.0.0" = {
1899 name = "collection-visit";
1900 packageName = "collection-visit";
1901 version = "1.0.0";
1902 src = fetchurl {
1903 url = "https://registry.npmjs.org/collection-visit/-/collection-visit-1.0.0.tgz";
1904 sha1 = "4bc0373c164bc3291b4d368c829cf1a80a59dca0";
1905 };
1906 };
1907 "color-0.11.4" = {
1908 name = "color";
1909 packageName = "color";
1910 version = "0.11.4";
1911 src = fetchurl {
1912 url = "https://registry.npmjs.org/color/-/color-0.11.4.tgz";
1913 sha1 = "6d7b5c74fb65e841cd48792ad1ed5e07b904d764";
1914 };
1915 };
1916 "color-convert-1.9.3" = {
1917 name = "color-convert";
1918 packageName = "color-convert";
1919 version = "1.9.3";
1920 src = fetchurl {
1921 url = "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz";
1922 sha512 = "QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==";
1923 };
1924 };
1925 "color-name-1.1.3" = {
1926 name = "color-name";
1927 packageName = "color-name";
1928 version = "1.1.3";
1929 src = fetchurl {
1930 url = "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz";
1931 sha1 = "a7d0558bd89c42f795dd42328f740831ca53bc25";
1932 };
1933 };
1934 "color-string-0.3.0" = {
1935 name = "color-string";
1936 packageName = "color-string";
1937 version = "0.3.0";
1938 src = fetchurl {
1939 url = "https://registry.npmjs.org/color-string/-/color-string-0.3.0.tgz";
1940 sha1 = "27d46fb67025c5c2fa25993bfbf579e47841b991";
1941 };
1942 };
1943 "colormin-1.1.2" = {
1944 name = "colormin";
1945 packageName = "colormin";
1946 version = "1.1.2";
1947 src = fetchurl {
1948 url = "https://registry.npmjs.org/colormin/-/colormin-1.1.2.tgz";
1949 sha1 = "ea2f7420a72b96881a38aae59ec124a6f7298133";
1950 };
1951 };
467 "colors-0.6.2" = {
1952 "colors-0.6.2" = {
468 name = "colors";
1953 name = "colors";
469 packageName = "colors";
1954 packageName = "colors";
@@ -482,31 +1967,67 b' let'
482 sha1 = "0433f44d809680fdeb60ed260f1b0c262e82a40b";
1967 sha1 = "0433f44d809680fdeb60ed260f1b0c262e82a40b";
483 };
1968 };
484 };
1969 };
485 "combined-stream-1.0.6" = {
1970 "colors-1.1.2" = {
1971 name = "colors";
1972 packageName = "colors";
1973 version = "1.1.2";
1974 src = fetchurl {
1975 url = "https://registry.npmjs.org/colors/-/colors-1.1.2.tgz";
1976 sha1 = "168a4701756b6a7f51a12ce0c97bfa28c084ed63";
1977 };
1978 };
1979 "colors-1.3.2" = {
1980 name = "colors";
1981 packageName = "colors";
1982 version = "1.3.2";
1983 src = fetchurl {
1984 url = "https://registry.npmjs.org/colors/-/colors-1.3.2.tgz";
1985 sha512 = "rhP0JSBGYvpcNQj4s5AdShMeE5ahMop96cTeDl/v9qQQm2fYClE2QXZRi8wLzc+GmXSxdIqqbOIAhyObEXDbfQ==";
1986 };
1987 };
1988 "combined-stream-1.0.7" = {
486 name = "combined-stream";
1989 name = "combined-stream";
487 packageName = "combined-stream";
1990 packageName = "combined-stream";
488 version = "1.0.6";
1991 version = "1.0.7";
489 src = fetchurl {
1992 src = fetchurl {
490 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz";
1993 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz";
491 sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818";
1994 sha512 = "brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==";
492 };
1995 };
493 };
1996 };
494 "command-line-args-3.0.5" = {
1997 "commander-2.14.1" = {
495 name = "command-line-args";
1998 name = "commander";
496 packageName = "command-line-args";
1999 packageName = "commander";
497 version = "3.0.5";
2000 version = "2.14.1";
498 src = fetchurl {
2001 src = fetchurl {
499 url = "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz";
2002 url = "https://registry.npmjs.org/commander/-/commander-2.14.1.tgz";
500 sha1 = "5bd4ad45e7983e5c1344918e40280ee2693c5ac0";
2003 sha512 = "+YR16o3rK53SmWHU3rEM3tPAh2rwb1yPcQX5irVn7mb0gXbwuCCrnkbV5+PBfETdfg1vui07nM6PCG1zndcjQw==";
501 };
2004 };
502 };
2005 };
503 "command-line-usage-3.0.8" = {
2006 "commander-2.17.1" = {
504 name = "command-line-usage";
2007 name = "commander";
505 packageName = "command-line-usage";
2008 packageName = "commander";
506 version = "3.0.8";
2009 version = "2.17.1";
507 src = fetchurl {
2010 src = fetchurl {
508 url = "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz";
2011 url = "https://registry.npmjs.org/commander/-/commander-2.17.1.tgz";
509 sha1 = "b6a20978c1b383477f5c11a529428b880bfe0f4d";
2012 sha512 = "wPMUt6FnH2yzG95SA6mzjQOEKUU3aLaDEmzs1ti+1E9h+CsrZghRlqEM/EJ4KscsQVG8uNN4uVreUeT8+drlgg==";
2013 };
2014 };
2015 "commondir-1.0.1" = {
2016 name = "commondir";
2017 packageName = "commondir";
2018 version = "1.0.1";
2019 src = fetchurl {
2020 url = "https://registry.npmjs.org/commondir/-/commondir-1.0.1.tgz";
2021 sha1 = "ddd800da0c66127393cca5950ea968a3aaf1253b";
2022 };
2023 };
2024 "component-emitter-1.2.1" = {
2025 name = "component-emitter";
2026 packageName = "component-emitter";
2027 version = "1.2.1";
2028 src = fetchurl {
2029 url = "https://registry.npmjs.org/component-emitter/-/component-emitter-1.2.1.tgz";
2030 sha1 = "137918d6d78283f7df7a6b7c5a63e140e69425e6";
510 };
2031 };
511 };
2032 };
512 "concat-map-0.0.1" = {
2033 "concat-map-0.0.1" = {
@@ -527,15 +2048,6 b' let'
527 sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==";
2048 sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==";
528 };
2049 };
529 };
2050 };
530 "config-chain-1.1.11" = {
531 name = "config-chain";
532 packageName = "config-chain";
533 version = "1.1.11";
534 src = fetchurl {
535 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz";
536 sha1 = "aba09747dfbe4c3e70e766a6e41586e1859fc6f2";
537 };
538 };
539 "console-browserify-1.1.0" = {
2051 "console-browserify-1.1.0" = {
540 name = "console-browserify";
2052 name = "console-browserify";
541 packageName = "console-browserify";
2053 packageName = "console-browserify";
@@ -545,13 +2057,49 b' let'
545 sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
2057 sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
546 };
2058 };
547 };
2059 };
548 "console-control-strings-1.1.0" = {
2060 "constants-browserify-1.0.0" = {
549 name = "console-control-strings";
2061 name = "constants-browserify";
550 packageName = "console-control-strings";
2062 packageName = "constants-browserify";
551 version = "1.1.0";
2063 version = "1.0.0";
552 src = fetchurl {
2064 src = fetchurl {
553 url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";
2065 url = "https://registry.npmjs.org/constants-browserify/-/constants-browserify-1.0.0.tgz";
554 sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
2066 sha1 = "c20b96d8c617748aaf1c16021760cd27fcb8cb75";
2067 };
2068 };
2069 "convert-source-map-1.6.0" = {
2070 name = "convert-source-map";
2071 packageName = "convert-source-map";
2072 version = "1.6.0";
2073 src = fetchurl {
2074 url = "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.6.0.tgz";
2075 sha512 = "eFu7XigvxdZ1ETfbgPBohgyQ/Z++C0eEhTor0qRwBw9unw+L0/6V8wkSuGgzdThkiS5lSpdptOQPD8Ak40a+7A==";
2076 };
2077 };
2078 "copy-concurrently-1.0.5" = {
2079 name = "copy-concurrently";
2080 packageName = "copy-concurrently";
2081 version = "1.0.5";
2082 src = fetchurl {
2083 url = "https://registry.npmjs.org/copy-concurrently/-/copy-concurrently-1.0.5.tgz";
2084 sha512 = "f2domd9fsVDFtaFcbaRZuYXwtdmnzqbADSwhSWYxYB/Q8zsdUUFMXVRwXGDMWmbEzAn1kdRrtI1T/KTFOL4X2A==";
2085 };
2086 };
2087 "copy-descriptor-0.1.1" = {
2088 name = "copy-descriptor";
2089 packageName = "copy-descriptor";
2090 version = "0.1.1";
2091 src = fetchurl {
2092 url = "https://registry.npmjs.org/copy-descriptor/-/copy-descriptor-0.1.1.tgz";
2093 sha1 = "676f6eb3c39997c2ee1ac3a924fd6124748f578d";
2094 };
2095 };
2096 "copy-webpack-plugin-4.5.4" = {
2097 name = "copy-webpack-plugin";
2098 packageName = "copy-webpack-plugin";
2099 version = "4.5.4";
2100 src = fetchurl {
2101 url = "https://registry.npmjs.org/copy-webpack-plugin/-/copy-webpack-plugin-4.5.4.tgz";
2102 sha512 = "0lstlEyj74OAtYMrDxlNZsU7cwFijAI3Ofz2fD6Mpo9r4xCv4yegfa3uHIKvZY1NSuOtE9nvG6TAhJ+uz9gDaQ==";
555 };
2103 };
556 };
2104 };
557 "core-js-2.5.7" = {
2105 "core-js-2.5.7" = {
@@ -572,22 +2120,40 b' let'
572 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
2120 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
573 };
2121 };
574 };
2122 };
575 "crisper-1.2.0" = {
2123 "create-ecdh-4.0.3" = {
576 name = "crisper";
2124 name = "create-ecdh";
577 packageName = "crisper";
2125 packageName = "create-ecdh";
2126 version = "4.0.3";
2127 src = fetchurl {
2128 url = "https://registry.npmjs.org/create-ecdh/-/create-ecdh-4.0.3.tgz";
2129 sha512 = "GbEHQPMOswGpKXM9kCWVrremUcBmjteUaQ01T9rkKCPDXfUHX0IoP9LpHYo2NPFampa4e+/pFDc3jQdxrxQLaw==";
2130 };
2131 };
2132 "create-hash-1.2.0" = {
2133 name = "create-hash";
2134 packageName = "create-hash";
578 version = "1.2.0";
2135 version = "1.2.0";
579 src = fetchurl {
2136 src = fetchurl {
580 url = "https://registry.npmjs.org/crisper/-/crisper-1.2.0.tgz";
2137 url = "https://registry.npmjs.org/create-hash/-/create-hash-1.2.0.tgz";
581 sha1 = "9a91f597d71f6110294e076ad44dbb3408568e46";
2138 sha512 = "z00bCGNHDG8mHAkP7CtT1qVu+bFQUPjYq/4Iv3C3kWjTFV10zIjfSoeqXo9Asws8gwSHDGj/hl2u4OGIjapeCg==";
582 };
2139 };
583 };
2140 };
584 "crisper-2.1.1" = {
2141 "create-hmac-1.1.7" = {
585 name = "crisper";
2142 name = "create-hmac";
586 packageName = "crisper";
2143 packageName = "create-hmac";
587 version = "2.1.1";
2144 version = "1.1.7";
588 src = fetchurl {
2145 src = fetchurl {
589 url = "https://registry.npmjs.org/crisper/-/crisper-2.1.1.tgz";
2146 url = "https://registry.npmjs.org/create-hmac/-/create-hmac-1.1.7.tgz";
590 sha512 = "yxfj9nTbFunDASztAxVF8hCPwaZBvTjayNzG3YL/VVQfQaKBXX2+TM3p1xB1Pxd8RYeDQJkJIQRwM3FQSIa+pw==";
2147 sha512 = "MJG9liiZ+ogc4TzUwuvbER1JRdgvUFSB5+VR/g5h82fGaIRWMWddtKBHi7/sVhfjQZ6SehlyhvQYrcYkaUIpLg==";
2148 };
2149 };
2150 "cross-spawn-6.0.5" = {
2151 name = "cross-spawn";
2152 packageName = "cross-spawn";
2153 version = "6.0.5";
2154 src = fetchurl {
2155 url = "https://registry.npmjs.org/cross-spawn/-/cross-spawn-6.0.5.tgz";
2156 sha512 = "eTVLrBSt7fjbDygz805pMnstIs2VTBNkRm0qxZd+M7A5XDdxVRWO5MxGBXZhjY4cqLYLdtrGqRf8mBPmzwSpWQ==";
591 };
2157 };
592 };
2158 };
593 "cryptiles-2.0.5" = {
2159 "cryptiles-2.0.5" = {
@@ -599,6 +2165,87 b' let'
599 sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
2165 sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
600 };
2166 };
601 };
2167 };
2168 "crypto-browserify-3.12.0" = {
2169 name = "crypto-browserify";
2170 packageName = "crypto-browserify";
2171 version = "3.12.0";
2172 src = fetchurl {
2173 url = "https://registry.npmjs.org/crypto-browserify/-/crypto-browserify-3.12.0.tgz";
2174 sha512 = "fz4spIh+znjO2VjL+IdhEpRJ3YN6sMzITSBijk6FK2UvTqruSQW+/cCZTSNsMiZNvUeq0CqurF+dAbyiGOY6Wg==";
2175 };
2176 };
2177 "css-color-names-0.0.4" = {
2178 name = "css-color-names";
2179 packageName = "css-color-names";
2180 version = "0.0.4";
2181 src = fetchurl {
2182 url = "https://registry.npmjs.org/css-color-names/-/css-color-names-0.0.4.tgz";
2183 sha1 = "808adc2e79cf84738069b646cb20ec27beb629e0";
2184 };
2185 };
2186 "css-loader-0.28.11" = {
2187 name = "css-loader";
2188 packageName = "css-loader";
2189 version = "0.28.11";
2190 src = fetchurl {
2191 url = "https://registry.npmjs.org/css-loader/-/css-loader-0.28.11.tgz";
2192 sha512 = "wovHgjAx8ZIMGSL8pTys7edA1ClmzxHeY6n/d97gg5odgsxEgKjULPR0viqyC+FWMCL9sfqoC/QCUBo62tLvPg==";
2193 };
2194 };
2195 "css-select-1.2.0" = {
2196 name = "css-select";
2197 packageName = "css-select";
2198 version = "1.2.0";
2199 src = fetchurl {
2200 url = "https://registry.npmjs.org/css-select/-/css-select-1.2.0.tgz";
2201 sha1 = "2b3a110539c5355f1cd8d314623e870b121ec858";
2202 };
2203 };
2204 "css-selector-tokenizer-0.7.0" = {
2205 name = "css-selector-tokenizer";
2206 packageName = "css-selector-tokenizer";
2207 version = "0.7.0";
2208 src = fetchurl {
2209 url = "https://registry.npmjs.org/css-selector-tokenizer/-/css-selector-tokenizer-0.7.0.tgz";
2210 sha1 = "e6988474ae8c953477bf5e7efecfceccd9cf4c86";
2211 };
2212 };
2213 "css-what-2.1.2" = {
2214 name = "css-what";
2215 packageName = "css-what";
2216 version = "2.1.2";
2217 src = fetchurl {
2218 url = "https://registry.npmjs.org/css-what/-/css-what-2.1.2.tgz";
2219 sha512 = "wan8dMWQ0GUeF7DGEPVjhHemVW/vy6xUYmFzRY8RYqgA0JtXC9rJmbScBjqSu6dg9q0lwPQy6ZAmJVr3PPTvqQ==";
2220 };
2221 };
2222 "cssesc-0.1.0" = {
2223 name = "cssesc";
2224 packageName = "cssesc";
2225 version = "0.1.0";
2226 src = fetchurl {
2227 url = "https://registry.npmjs.org/cssesc/-/cssesc-0.1.0.tgz";
2228 sha1 = "c814903e45623371a0477b40109aaafbeeaddbb4";
2229 };
2230 };
2231 "cssnano-3.10.0" = {
2232 name = "cssnano";
2233 packageName = "cssnano";
2234 version = "3.10.0";
2235 src = fetchurl {
2236 url = "https://registry.npmjs.org/cssnano/-/cssnano-3.10.0.tgz";
2237 sha1 = "4f38f6cea2b9b17fa01490f23f1dc68ea65c1c38";
2238 };
2239 };
2240 "csso-2.3.2" = {
2241 name = "csso";
2242 packageName = "csso";
2243 version = "2.3.2";
2244 src = fetchurl {
2245 url = "https://registry.npmjs.org/csso/-/csso-2.3.2.tgz";
2246 sha1 = "ddd52c587033f49e94b71fc55569f252e8ff5f85";
2247 };
2248 };
602 "cycle-1.0.3" = {
2249 "cycle-1.0.3" = {
603 name = "cycle";
2250 name = "cycle";
604 packageName = "cycle";
2251 packageName = "cycle";
@@ -608,6 +2255,15 b' let'
608 sha1 = "21e80b2be8580f98b468f379430662b046c34ad2";
2255 sha1 = "21e80b2be8580f98b468f379430662b046c34ad2";
609 };
2256 };
610 };
2257 };
2258 "cyclist-0.2.2" = {
2259 name = "cyclist";
2260 packageName = "cyclist";
2261 version = "0.2.2";
2262 src = fetchurl {
2263 url = "https://registry.npmjs.org/cyclist/-/cyclist-0.2.2.tgz";
2264 sha1 = "1b33792e11e914a2fd6d6ed6447464444e5fa640";
2265 };
2266 };
611 "dashdash-1.14.1" = {
2267 "dashdash-1.14.1" = {
612 name = "dashdash";
2268 name = "dashdash";
613 packageName = "dashdash";
2269 packageName = "dashdash";
@@ -653,22 +2309,85 b' let'
653 sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
2309 sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
654 };
2310 };
655 };
2311 };
656 "deep-extend-0.4.2" = {
2312 "decamelize-1.2.0" = {
657 name = "deep-extend";
2313 name = "decamelize";
658 packageName = "deep-extend";
2314 packageName = "decamelize";
659 version = "0.4.2";
2315 version = "1.2.0";
660 src = fetchurl {
2316 src = fetchurl {
661 url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz";
2317 url = "https://registry.npmjs.org/decamelize/-/decamelize-1.2.0.tgz";
662 sha1 = "48b699c27e334bf89f10892be432f6e4c7d34a7f";
2318 sha1 = "f6534d15148269b20352e7bee26f501f9a191290";
663 };
2319 };
664 };
2320 };
665 "deep-is-0.1.3" = {
2321 "decamelize-2.0.0" = {
666 name = "deep-is";
2322 name = "decamelize";
667 packageName = "deep-is";
2323 packageName = "decamelize";
668 version = "0.1.3";
2324 version = "2.0.0";
669 src = fetchurl {
2325 src = fetchurl {
670 url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
2326 url = "https://registry.npmjs.org/decamelize/-/decamelize-2.0.0.tgz";
671 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
2327 sha512 = "Ikpp5scV3MSYxY39ymh45ZLEecsTdv/Xj2CaQfI8RLMuwi7XvjX9H/fhraiSuU+C5w5NTDu4ZU72xNiZnurBPg==";
2328 };
2329 };
2330 "decode-uri-component-0.2.0" = {
2331 name = "decode-uri-component";
2332 packageName = "decode-uri-component";
2333 version = "0.2.0";
2334 src = fetchurl {
2335 url = "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.0.tgz";
2336 sha1 = "eb3913333458775cb84cd1a1fae062106bb87545";
2337 };
2338 };
2339 "deep-for-each-2.0.3" = {
2340 name = "deep-for-each";
2341 packageName = "deep-for-each";
2342 version = "2.0.3";
2343 src = fetchurl {
2344 url = "https://registry.npmjs.org/deep-for-each/-/deep-for-each-2.0.3.tgz";
2345 sha512 = "Y9mu+rplGcNZ7veer+5rqcdI9w3aPb7/WyE/nYnsuPevaE2z5YuC2u7/Gz/hIKsa0zo8sE8gKoBimSNsO/sr+A==";
2346 };
2347 };
2348 "define-properties-1.1.3" = {
2349 name = "define-properties";
2350 packageName = "define-properties";
2351 version = "1.1.3";
2352 src = fetchurl {
2353 url = "https://registry.npmjs.org/define-properties/-/define-properties-1.1.3.tgz";
2354 sha512 = "3MqfYKj2lLzdMSf8ZIZE/V+Zuy+BgD6f164e8K2w7dgnpKArBDerGYpM46IYYcjnkdPNMjPk9A6VFB8+3SKlXQ==";
2355 };
2356 };
2357 "define-property-0.2.5" = {
2358 name = "define-property";
2359 packageName = "define-property";
2360 version = "0.2.5";
2361 src = fetchurl {
2362 url = "https://registry.npmjs.org/define-property/-/define-property-0.2.5.tgz";
2363 sha1 = "c35b1ef918ec3c990f9a5bc57be04aacec5c8116";
2364 };
2365 };
2366 "define-property-1.0.0" = {
2367 name = "define-property";
2368 packageName = "define-property";
2369 version = "1.0.0";
2370 src = fetchurl {
2371 url = "https://registry.npmjs.org/define-property/-/define-property-1.0.0.tgz";
2372 sha1 = "769ebaaf3f4a63aad3af9e8d304c9bbe79bfb0e6";
2373 };
2374 };
2375 "define-property-2.0.2" = {
2376 name = "define-property";
2377 packageName = "define-property";
2378 version = "2.0.2";
2379 src = fetchurl {
2380 url = "https://registry.npmjs.org/define-property/-/define-property-2.0.2.tgz";
2381 sha512 = "jwK2UV4cnPpbcG7+VRARKTZPUWowwXA8bzH5NP6ud0oeAxyYPuGZUAC7hMugpCdz4BeSZl2Dl9k66CHJ/46ZYQ==";
2382 };
2383 };
2384 "defined-1.0.0" = {
2385 name = "defined";
2386 packageName = "defined";
2387 version = "1.0.0";
2388 src = fetchurl {
2389 url = "https://registry.npmjs.org/defined/-/defined-1.0.0.tgz";
2390 sha1 = "c98d9bcef75674188e110969151199e39b1fa693";
672 };
2391 };
673 };
2392 };
674 "delayed-stream-1.0.0" = {
2393 "delayed-stream-1.0.0" = {
@@ -689,22 +2408,58 b' let'
689 sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==";
2408 sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==";
690 };
2409 };
691 };
2410 };
692 "delegates-1.0.0" = {
2411 "des.js-1.0.0" = {
693 name = "delegates";
2412 name = "des.js";
694 packageName = "delegates";
2413 packageName = "des.js";
2414 version = "1.0.0";
2415 src = fetchurl {
2416 url = "https://registry.npmjs.org/des.js/-/des.js-1.0.0.tgz";
2417 sha1 = "c074d2e2aa6a8a9a07dbd61f9a15c2cd83ec8ecc";
2418 };
2419 };
2420 "detect-file-1.0.0" = {
2421 name = "detect-file";
2422 packageName = "detect-file";
695 version = "1.0.0";
2423 version = "1.0.0";
696 src = fetchurl {
2424 src = fetchurl {
697 url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";
2425 url = "https://registry.npmjs.org/detect-file/-/detect-file-1.0.0.tgz";
698 sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
2426 sha1 = "f0d66d03672a825cb1b73bdb3fe62310c8e552b7";
699 };
2427 };
700 };
2428 };
701 "doctrine-0.7.2" = {
2429 "detect-indent-4.0.0" = {
702 name = "doctrine";
2430 name = "detect-indent";
703 packageName = "doctrine";
2431 packageName = "detect-indent";
704 version = "0.7.2";
2432 version = "4.0.0";
705 src = fetchurl {
2433 src = fetchurl {
706 url = "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz";
2434 url = "https://registry.npmjs.org/detect-indent/-/detect-indent-4.0.0.tgz";
707 sha1 = "7cb860359ba3be90e040b26b729ce4bfa654c523";
2435 sha1 = "f76d064352cdf43a1cb6ce619c4ee3a9475de208";
2436 };
2437 };
2438 "diffie-hellman-5.0.3" = {
2439 name = "diffie-hellman";
2440 packageName = "diffie-hellman";
2441 version = "5.0.3";
2442 src = fetchurl {
2443 url = "https://registry.npmjs.org/diffie-hellman/-/diffie-hellman-5.0.3.tgz";
2444 sha512 = "kqag/Nl+f3GwyK25fhUMYj81BUOrZ9IuJsjIcDE5icNM9FJHAVm3VcUDxdLPoQtTuUylWm6ZIknYJwwaPxsUzg==";
2445 };
2446 };
2447 "dir-glob-2.0.0" = {
2448 name = "dir-glob";
2449 packageName = "dir-glob";
2450 version = "2.0.0";
2451 src = fetchurl {
2452 url = "https://registry.npmjs.org/dir-glob/-/dir-glob-2.0.0.tgz";
2453 sha512 = "37qirFDz8cA5fimp9feo43fSuRo2gHwaIn6dXL8Ber1dGwUosDrGZeCCXq57WnIqE4aQ+u3eQZzsk1yOzhdwag==";
2454 };
2455 };
2456 "dom-converter-0.2.0" = {
2457 name = "dom-converter";
2458 packageName = "dom-converter";
2459 version = "0.2.0";
2460 src = fetchurl {
2461 url = "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz";
2462 sha512 = "gd3ypIPfOMr9h5jIKq8E3sHOTCjeirnl0WK5ZdS1AW0Odt0b1PaWaHdJ4Qk4klv+YB9aJBS7mESXjFoDQPu6DA==";
708 };
2463 };
709 };
2464 };
710 "dom-serializer-0.1.0" = {
2465 "dom-serializer-0.1.0" = {
@@ -716,22 +2471,22 b' let'
716 sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
2471 sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
717 };
2472 };
718 };
2473 };
719 "dom5-1.1.0" = {
2474 "dom5-2.3.0" = {
720 name = "dom5";
2475 name = "dom5";
721 packageName = "dom5";
2476 packageName = "dom5";
722 version = "1.1.0";
2477 version = "2.3.0";
723 src = fetchurl {
2478 src = fetchurl {
724 url = "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz";
2479 url = "https://registry.npmjs.org/dom5/-/dom5-2.3.0.tgz";
725 sha1 = "3a0c7700c083ab4c4d26938a78b0f0c6dcc37794";
2480 sha1 = "f8204975bd0dacbbe5b58a8a93ffc1fed0ffcd2a";
726 };
2481 };
727 };
2482 };
728 "dom5-1.3.6" = {
2483 "domain-browser-1.2.0" = {
729 name = "dom5";
2484 name = "domain-browser";
730 packageName = "dom5";
2485 packageName = "domain-browser";
731 version = "1.3.6";
2486 version = "1.2.0";
732 src = fetchurl {
2487 src = fetchurl {
733 url = "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz";
2488 url = "https://registry.npmjs.org/domain-browser/-/domain-browser-1.2.0.tgz";
734 sha1 = "a7088a9fc5f3b08dc9f6eda4c7abaeb241945e0d";
2489 sha512 = "jnjyiM6eRyZl2H+W8Q/zLMA481hzi0eszAaBUzIVnmYVDBbnLxVNnfu1HgEBvCbL+71FrxMl3E6lpKH7Ge3OXA==";
735 };
2490 };
736 };
2491 };
737 "domelementtype-1.1.3" = {
2492 "domelementtype-1.1.3" = {
@@ -752,6 +2507,15 b' let'
752 sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2";
2507 sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2";
753 };
2508 };
754 };
2509 };
2510 "domhandler-2.1.0" = {
2511 name = "domhandler";
2512 packageName = "domhandler";
2513 version = "2.1.0";
2514 src = fetchurl {
2515 url = "https://registry.npmjs.org/domhandler/-/domhandler-2.1.0.tgz";
2516 sha1 = "d2646f5e57f6c3bab11cf6cb05d3c0acf7412594";
2517 };
2518 };
755 "domhandler-2.3.0" = {
2519 "domhandler-2.3.0" = {
756 name = "domhandler";
2520 name = "domhandler";
757 packageName = "domhandler";
2521 packageName = "domhandler";
@@ -761,6 +2525,15 b' let'
761 sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738";
2525 sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738";
762 };
2526 };
763 };
2527 };
2528 "domutils-1.1.6" = {
2529 name = "domutils";
2530 packageName = "domutils";
2531 version = "1.1.6";
2532 src = fetchurl {
2533 url = "https://registry.npmjs.org/domutils/-/domutils-1.1.6.tgz";
2534 sha1 = "bddc3de099b9a2efacc51c623f28f416ecc57485";
2535 };
2536 };
764 "domutils-1.5.1" = {
2537 "domutils-1.5.1" = {
765 name = "domutils";
2538 name = "domutils";
766 packageName = "domutils";
2539 packageName = "domutils";
@@ -770,6 +2543,15 b' let'
770 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
2543 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
771 };
2544 };
772 };
2545 };
2546 "duplexify-3.6.1" = {
2547 name = "duplexify";
2548 packageName = "duplexify";
2549 version = "3.6.1";
2550 src = fetchurl {
2551 url = "https://registry.npmjs.org/duplexify/-/duplexify-3.6.1.tgz";
2552 sha512 = "vM58DwdnKmty+FSPzT14K9JXb90H+j5emaR4KYbr2KTIz00WHGbWOe5ghQTx233ZCLZtrGDALzKwcjEtSt35mA==";
2553 };
2554 };
773 "ecc-jsbn-0.1.2" = {
2555 "ecc-jsbn-0.1.2" = {
774 name = "ecc-jsbn";
2556 name = "ecc-jsbn";
775 packageName = "ecc-jsbn";
2557 packageName = "ecc-jsbn";
@@ -779,6 +2561,60 b' let'
779 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
2561 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
780 };
2562 };
781 };
2563 };
2564 "electron-to-chromium-1.3.82" = {
2565 name = "electron-to-chromium";
2566 packageName = "electron-to-chromium";
2567 version = "1.3.82";
2568 src = fetchurl {
2569 url = "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.3.82.tgz";
2570 sha512 = "NI4nB2IWGcU4JVT1AE8kBb/dFor4zjLHMLsOROPahppeHrR0FG5uslxMmkp/thO1MvPjM2xhlKoY29/I60s0ew==";
2571 };
2572 };
2573 "elliptic-6.4.1" = {
2574 name = "elliptic";
2575 packageName = "elliptic";
2576 version = "6.4.1";
2577 src = fetchurl {
2578 url = "https://registry.npmjs.org/elliptic/-/elliptic-6.4.1.tgz";
2579 sha512 = "BsXLz5sqX8OHcsh7CqBMztyXARmGQ3LWPtGjJi6DiJHq5C/qvi9P3OqgswKSDftbu8+IoI/QDTAm2fFnQ9SZSQ==";
2580 };
2581 };
2582 "emojis-list-2.1.0" = {
2583 name = "emojis-list";
2584 packageName = "emojis-list";
2585 version = "2.1.0";
2586 src = fetchurl {
2587 url = "https://registry.npmjs.org/emojis-list/-/emojis-list-2.1.0.tgz";
2588 sha1 = "4daa4d9db00f9819880c79fa457ae5b09a1fd389";
2589 };
2590 };
2591 "end-of-stream-1.4.1" = {
2592 name = "end-of-stream";
2593 packageName = "end-of-stream";
2594 version = "1.4.1";
2595 src = fetchurl {
2596 url = "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.1.tgz";
2597 sha512 = "1MkrZNvWTKCaigbn+W15elq2BB/L22nqrSY5DKlo3X6+vclJm8Bb5djXJBmEX6fS3+zCh/F4VBK5Z2KxJt4s2Q==";
2598 };
2599 };
2600 "enhanced-resolve-3.4.1" = {
2601 name = "enhanced-resolve";
2602 packageName = "enhanced-resolve";
2603 version = "3.4.1";
2604 src = fetchurl {
2605 url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-3.4.1.tgz";
2606 sha1 = "0421e339fd71419b3da13d129b3979040230476e";
2607 };
2608 };
2609 "enhanced-resolve-4.1.0" = {
2610 name = "enhanced-resolve";
2611 packageName = "enhanced-resolve";
2612 version = "4.1.0";
2613 src = fetchurl {
2614 url = "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-4.1.0.tgz";
2615 sha512 = "F/7vkyTtyc/llOIn8oWclcB25KdRaiPBpZYDgJHgh/UHtpgT2p2eldQgtQnLtUvfMKPKxbRaQM/hHkvLHt1Vng==";
2616 };
2617 };
782 "entities-1.0.0" = {
2618 "entities-1.0.0" = {
783 name = "entities";
2619 name = "entities";
784 packageName = "entities";
2620 packageName = "entities";
@@ -788,13 +2624,13 b' let'
788 sha1 = "b2987aa3821347fcde642b24fdfc9e4fb712bf26";
2624 sha1 = "b2987aa3821347fcde642b24fdfc9e4fb712bf26";
789 };
2625 };
790 };
2626 };
791 "entities-1.1.1" = {
2627 "entities-1.1.2" = {
792 name = "entities";
2628 name = "entities";
793 packageName = "entities";
2629 packageName = "entities";
794 version = "1.1.1";
2630 version = "1.1.2";
795 src = fetchurl {
2631 src = fetchurl {
796 url = "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz";
2632 url = "https://registry.npmjs.org/entities/-/entities-1.1.2.tgz";
797 sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0";
2633 sha512 = "f2LZMYl1Fzu7YSBKg+RoROelpOaNrcGmE9AZubeDfrCEia483oW4MI4VyFd5VNHIgQ/7qm1I0wUHK1eJnn2y2w==";
798 };
2634 };
799 };
2635 };
800 "errno-0.1.7" = {
2636 "errno-0.1.7" = {
@@ -806,22 +2642,40 b' let'
806 sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==";
2642 sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==";
807 };
2643 };
808 };
2644 };
809 "es6-promise-2.3.0" = {
2645 "es-abstract-1.12.0" = {
2646 name = "es-abstract";
2647 packageName = "es-abstract";
2648 version = "1.12.0";
2649 src = fetchurl {
2650 url = "https://registry.npmjs.org/es-abstract/-/es-abstract-1.12.0.tgz";
2651 sha512 = "C8Fx/0jFmV5IPoMOFPA9P9G5NtqW+4cOPit3MIuvR2t7Ag2K15EJTpxnHAYTzL+aYQJIESYeXZmDBfOBE1HcpA==";
2652 };
2653 };
2654 "es-to-primitive-1.2.0" = {
2655 name = "es-to-primitive";
2656 packageName = "es-to-primitive";
2657 version = "1.2.0";
2658 src = fetchurl {
2659 url = "https://registry.npmjs.org/es-to-primitive/-/es-to-primitive-1.2.0.tgz";
2660 sha512 = "qZryBOJjV//LaxLTV6UC//WewneB3LcXOL9NP++ozKVXsIIIpm/2c13UDiD9Jp2eThsecw9m3jPqDwTyobcdbg==";
2661 };
2662 };
2663 "es6-promise-4.2.5" = {
810 name = "es6-promise";
2664 name = "es6-promise";
811 packageName = "es6-promise";
2665 packageName = "es6-promise";
812 version = "2.3.0";
2666 version = "4.2.5";
813 src = fetchurl {
2667 src = fetchurl {
814 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz";
2668 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz";
815 sha1 = "96edb9f2fdb01995822b263dd8aadab6748181bc";
2669 sha512 = "n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==";
816 };
2670 };
817 };
2671 };
818 "es6-promise-4.2.4" = {
2672 "es6-templates-0.2.3" = {
819 name = "es6-promise";
2673 name = "es6-templates";
820 packageName = "es6-promise";
2674 packageName = "es6-templates";
821 version = "4.2.4";
2675 version = "0.2.3";
822 src = fetchurl {
2676 src = fetchurl {
823 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz";
2677 url = "https://registry.npmjs.org/es6-templates/-/es6-templates-0.2.3.tgz";
824 sha512 = "/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==";
2678 sha1 = "5cb9ac9fb1ded6eb1239342b81d792bbb4078ee4";
825 };
2679 };
826 };
2680 };
827 "escape-string-regexp-1.0.5" = {
2681 "escape-string-regexp-1.0.5" = {
@@ -833,13 +2687,13 b' let'
833 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
2687 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
834 };
2688 };
835 };
2689 };
836 "escodegen-1.11.0" = {
2690 "eslint-scope-4.0.0" = {
837 name = "escodegen";
2691 name = "eslint-scope";
838 packageName = "escodegen";
2692 packageName = "eslint-scope";
839 version = "1.11.0";
2693 version = "4.0.0";
840 src = fetchurl {
2694 src = fetchurl {
841 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz";
2695 url = "https://registry.npmjs.org/eslint-scope/-/eslint-scope-4.0.0.tgz";
842 sha512 = "IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==";
2696 sha512 = "1G6UTDi7Jc1ELFwnR58HV4fK9OQK4S6N985f166xqXxpjU6plxFISJa2Ba9KCQuFa8RCnj/lSFJbHo7UFDBnUA==";
843 };
2697 };
844 };
2698 };
845 "espree-3.5.4" = {
2699 "espree-3.5.4" = {
@@ -860,6 +2714,15 b' let'
860 sha1 = "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad";
2714 sha1 = "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad";
861 };
2715 };
862 };
2716 };
2717 "esprima-2.7.3" = {
2718 name = "esprima";
2719 packageName = "esprima";
2720 version = "2.7.3";
2721 src = fetchurl {
2722 url = "https://registry.npmjs.org/esprima/-/esprima-2.7.3.tgz";
2723 sha1 = "96e3b70d5779f6ad49cd032673d1c312767ba581";
2724 };
2725 };
863 "esprima-3.1.3" = {
2726 "esprima-3.1.3" = {
864 name = "esprima";
2727 name = "esprima";
865 packageName = "esprima";
2728 packageName = "esprima";
@@ -869,13 +2732,13 b' let'
869 sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
2732 sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
870 };
2733 };
871 };
2734 };
872 "estraverse-3.1.0" = {
2735 "esrecurse-4.2.1" = {
873 name = "estraverse";
2736 name = "esrecurse";
874 packageName = "estraverse";
2737 packageName = "esrecurse";
875 version = "3.1.0";
2738 version = "4.2.1";
876 src = fetchurl {
2739 src = fetchurl {
877 url = "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz";
2740 url = "https://registry.npmjs.org/esrecurse/-/esrecurse-4.2.1.tgz";
878 sha1 = "15e28a446b8b82bc700ccc8b96c78af4da0d6cba";
2741 sha512 = "64RBB++fIOAXPw3P9cy89qfMlvZEXZkqqJkjqqXIvzP5ezRZjW+lPWjw35UX/3EhUPFYbg5ER4JYgDw4007/DQ==";
879 };
2742 };
880 };
2743 };
881 "estraverse-4.2.0" = {
2744 "estraverse-4.2.0" = {
@@ -887,15 +2750,6 b' let'
887 sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
2750 sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
888 };
2751 };
889 };
2752 };
890 "esutils-1.1.6" = {
891 name = "esutils";
892 packageName = "esutils";
893 version = "1.1.6";
894 src = fetchurl {
895 url = "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz";
896 sha1 = "c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375";
897 };
898 };
899 "esutils-2.0.2" = {
2753 "esutils-2.0.2" = {
900 name = "esutils";
2754 name = "esutils";
901 packageName = "esutils";
2755 packageName = "esutils";
@@ -914,6 +2768,33 b' let'
914 sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab";
2768 sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab";
915 };
2769 };
916 };
2770 };
2771 "events-1.1.1" = {
2772 name = "events";
2773 packageName = "events";
2774 version = "1.1.1";
2775 src = fetchurl {
2776 url = "https://registry.npmjs.org/events/-/events-1.1.1.tgz";
2777 sha1 = "9ebdb7635ad099c70dcc4c2a1f5004288e8bd924";
2778 };
2779 };
2780 "evp_bytestokey-1.0.3" = {
2781 name = "evp_bytestokey";
2782 packageName = "evp_bytestokey";
2783 version = "1.0.3";
2784 src = fetchurl {
2785 url = "https://registry.npmjs.org/evp_bytestokey/-/evp_bytestokey-1.0.3.tgz";
2786 sha512 = "/f2Go4TognH/KvCISP7OUsHn85hT9nUkxxA9BEWxFn+Oj9o8ZNLm/40hdlgSLyuOimsrTKLUMEorQexp/aPQeA==";
2787 };
2788 };
2789 "execa-0.10.0" = {
2790 name = "execa";
2791 packageName = "execa";
2792 version = "0.10.0";
2793 src = fetchurl {
2794 url = "https://registry.npmjs.org/execa/-/execa-0.10.0.tgz";
2795 sha512 = "7XOMnz8Ynx1gGo/3hyV9loYNPWM94jG3+3T3Y8tsfSstFmETmENCMU/A/zj8Lyaj1lkgEepKepvd6240tBRvlw==";
2796 };
2797 };
917 "exit-0.1.2" = {
2798 "exit-0.1.2" = {
918 name = "exit";
2799 name = "exit";
919 packageName = "exit";
2800 packageName = "exit";
@@ -923,6 +2804,33 b' let'
923 sha1 = "0632638f8d877cc82107d30a0fff1a17cba1cd0c";
2804 sha1 = "0632638f8d877cc82107d30a0fff1a17cba1cd0c";
924 };
2805 };
925 };
2806 };
2807 "expand-brackets-2.1.4" = {
2808 name = "expand-brackets";
2809 packageName = "expand-brackets";
2810 version = "2.1.4";
2811 src = fetchurl {
2812 url = "https://registry.npmjs.org/expand-brackets/-/expand-brackets-2.1.4.tgz";
2813 sha1 = "b77735e315ce30f6b6eff0f83b04151a22449622";
2814 };
2815 };
2816 "expand-tilde-2.0.2" = {
2817 name = "expand-tilde";
2818 packageName = "expand-tilde";
2819 version = "2.0.2";
2820 src = fetchurl {
2821 url = "https://registry.npmjs.org/expand-tilde/-/expand-tilde-2.0.2.tgz";
2822 sha1 = "97e801aa052df02454de46b02bf621642cdc8502";
2823 };
2824 };
2825 "exports-loader-0.6.4" = {
2826 name = "exports-loader";
2827 packageName = "exports-loader";
2828 version = "0.6.4";
2829 src = fetchurl {
2830 url = "https://registry.npmjs.org/exports-loader/-/exports-loader-0.6.4.tgz";
2831 sha1 = "d70fc6121975b35fc12830cf52754be2740fc886";
2832 };
2833 };
926 "extend-3.0.2" = {
2834 "extend-3.0.2" = {
927 name = "extend";
2835 name = "extend";
928 packageName = "extend";
2836 packageName = "extend";
@@ -932,6 +2840,33 b' let'
932 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
2840 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
933 };
2841 };
934 };
2842 };
2843 "extend-shallow-2.0.1" = {
2844 name = "extend-shallow";
2845 packageName = "extend-shallow";
2846 version = "2.0.1";
2847 src = fetchurl {
2848 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-2.0.1.tgz";
2849 sha1 = "51af7d614ad9a9f610ea1bafbb989d6b1c56890f";
2850 };
2851 };
2852 "extend-shallow-3.0.2" = {
2853 name = "extend-shallow";
2854 packageName = "extend-shallow";
2855 version = "3.0.2";
2856 src = fetchurl {
2857 url = "https://registry.npmjs.org/extend-shallow/-/extend-shallow-3.0.2.tgz";
2858 sha1 = "26a71aaf073b39fb2127172746131c2704028db8";
2859 };
2860 };
2861 "extglob-2.0.4" = {
2862 name = "extglob";
2863 packageName = "extglob";
2864 version = "2.0.4";
2865 src = fetchurl {
2866 url = "https://registry.npmjs.org/extglob/-/extglob-2.0.4.tgz";
2867 sha512 = "Nmb6QXkELsuBr24CJSkilo6UHHgbekK5UiZgfE6UHD3Eb27YC6oD+bhcT+tJ6cl8dmsgdQxnWlcry8ksBIBLpw==";
2868 };
2869 };
935 "extract-zip-1.6.7" = {
2870 "extract-zip-1.6.7" = {
936 name = "extract-zip";
2871 name = "extract-zip";
937 packageName = "extract-zip";
2872 packageName = "extract-zip";
@@ -959,13 +2894,31 b' let'
959 sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0";
2894 sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0";
960 };
2895 };
961 };
2896 };
962 "fast-levenshtein-2.0.6" = {
2897 "fast-deep-equal-2.0.1" = {
963 name = "fast-levenshtein";
2898 name = "fast-deep-equal";
964 packageName = "fast-levenshtein";
2899 packageName = "fast-deep-equal";
965 version = "2.0.6";
2900 version = "2.0.1";
966 src = fetchurl {
2901 src = fetchurl {
967 url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
2902 url = "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-2.0.1.tgz";
968 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
2903 sha1 = "7b05218ddf9667bf7f370bf7fdb2cb15fdd0aa49";
2904 };
2905 };
2906 "fast-json-stable-stringify-2.0.0" = {
2907 name = "fast-json-stable-stringify";
2908 packageName = "fast-json-stable-stringify";
2909 version = "2.0.0";
2910 src = fetchurl {
2911 url = "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.0.0.tgz";
2912 sha1 = "d5142c0caee6b1189f87d3a76111064f86c8bbf2";
2913 };
2914 };
2915 "fastparse-1.1.1" = {
2916 name = "fastparse";
2917 packageName = "fastparse";
2918 version = "1.1.1";
2919 src = fetchurl {
2920 url = "https://registry.npmjs.org/fastparse/-/fastparse-1.1.1.tgz";
2921 sha1 = "d1e2643b38a94d7583b479060e6c4affc94071f8";
969 };
2922 };
970 };
2923 };
971 "favico.js-0.3.10" = {
2924 "favico.js-0.3.10" = {
@@ -995,15 +2948,6 b' let'
995 sha1 = "8b5bcbd9ec327c5041bf9ab023fd6750f1177e65";
2948 sha1 = "8b5bcbd9ec327c5041bf9ab023fd6750f1177e65";
996 };
2949 };
997 };
2950 };
998 "feature-detect-es6-1.5.0" = {
999 name = "feature-detect-es6";
1000 packageName = "feature-detect-es6";
1001 version = "1.5.0";
1002 src = fetchurl {
1003 url = "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.5.0.tgz";
1004 sha512 = "DzWPIGzTnfp3/KK1d/YPfmgLqeDju9F2DQYBL35VusgSApcA7XGqVtXfR4ETOOFEzdFJ3J7zh0Gkk011TiA4uQ==";
1005 };
1006 };
1007 "file-sync-cmp-0.1.1" = {
2951 "file-sync-cmp-0.1.1" = {
1008 name = "file-sync-cmp";
2952 name = "file-sync-cmp";
1009 packageName = "file-sync-cmp";
2953 packageName = "file-sync-cmp";
@@ -1013,22 +2957,40 b' let'
1013 sha1 = "a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b";
2957 sha1 = "a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b";
1014 };
2958 };
1015 };
2959 };
1016 "find-replace-1.0.3" = {
2960 "fill-range-4.0.0" = {
1017 name = "find-replace";
2961 name = "fill-range";
1018 packageName = "find-replace";
2962 packageName = "fill-range";
1019 version = "1.0.3";
2963 version = "4.0.0";
1020 src = fetchurl {
2964 src = fetchurl {
1021 url = "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz";
2965 url = "https://registry.npmjs.org/fill-range/-/fill-range-4.0.0.tgz";
1022 sha1 = "b88e7364d2d9c959559f388c66670d6130441fa0";
2966 sha1 = "d544811d428f98eb06a63dc402d2403c328c38f7";
1023 };
2967 };
1024 };
2968 };
1025 "findit-2.0.0" = {
2969 "find-cache-dir-1.0.0" = {
1026 name = "findit";
2970 name = "find-cache-dir";
1027 packageName = "findit";
2971 packageName = "find-cache-dir";
1028 version = "2.0.0";
2972 version = "1.0.0";
1029 src = fetchurl {
2973 src = fetchurl {
1030 url = "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz";
2974 url = "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-1.0.0.tgz";
1031 sha1 = "6509f0126af4c178551cfa99394e032e13a4d56e";
2975 sha1 = "9288e3e9e3cc3748717d39eade17cf71fc30ee6f";
2976 };
2977 };
2978 "find-up-2.1.0" = {
2979 name = "find-up";
2980 packageName = "find-up";
2981 version = "2.1.0";
2982 src = fetchurl {
2983 url = "https://registry.npmjs.org/find-up/-/find-up-2.1.0.tgz";
2984 sha1 = "45d1b7e506c717ddd482775a2b77920a3c0c57a7";
2985 };
2986 };
2987 "find-up-3.0.0" = {
2988 name = "find-up";
2989 packageName = "find-up";
2990 version = "3.0.0";
2991 src = fetchurl {
2992 url = "https://registry.npmjs.org/find-up/-/find-up-3.0.0.tgz";
2993 sha512 = "1yD6RmLI1XBfxugvORwlck6f75tYL+iR0jqwsOrOxMZyGYqUuDhJ0l4AXdO1iX/FTs9cBAMEk1gWSEx1kSbylg==";
1032 };
2994 };
1033 };
2995 };
1034 "findup-sync-0.1.3" = {
2996 "findup-sync-0.1.3" = {
@@ -1040,13 +3002,67 b' let'
1040 sha1 = "7f3e7a97b82392c653bf06589bd85190e93c3683";
3002 sha1 = "7f3e7a97b82392c653bf06589bd85190e93c3683";
1041 };
3003 };
1042 };
3004 };
1043 "foreachasync-3.0.0" = {
3005 "findup-sync-2.0.0" = {
1044 name = "foreachasync";
3006 name = "findup-sync";
1045 packageName = "foreachasync";
3007 packageName = "findup-sync";
1046 version = "3.0.0";
3008 version = "2.0.0";
1047 src = fetchurl {
3009 src = fetchurl {
1048 url = "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz";
3010 url = "https://registry.npmjs.org/findup-sync/-/findup-sync-2.0.0.tgz";
1049 sha1 = "5502987dc8714be3392097f32e0071c9dee07cf6";
3011 sha1 = "9326b1488c22d1a6088650a86901b2d9a90a2cbc";
3012 };
3013 };
3014 "fined-1.1.0" = {
3015 name = "fined";
3016 packageName = "fined";
3017 version = "1.1.0";
3018 src = fetchurl {
3019 url = "https://registry.npmjs.org/fined/-/fined-1.1.0.tgz";
3020 sha1 = "b37dc844b76a2f5e7081e884f7c0ae344f153476";
3021 };
3022 };
3023 "flagged-respawn-1.0.0" = {
3024 name = "flagged-respawn";
3025 packageName = "flagged-respawn";
3026 version = "1.0.0";
3027 src = fetchurl {
3028 url = "https://registry.npmjs.org/flagged-respawn/-/flagged-respawn-1.0.0.tgz";
3029 sha1 = "4e79ae9b2eb38bf86b3bb56bf3e0a56aa5fcabd7";
3030 };
3031 };
3032 "flatten-1.0.2" = {
3033 name = "flatten";
3034 packageName = "flatten";
3035 version = "1.0.2";
3036 src = fetchurl {
3037 url = "https://registry.npmjs.org/flatten/-/flatten-1.0.2.tgz";
3038 sha1 = "dae46a9d78fbe25292258cc1e780a41d95c03782";
3039 };
3040 };
3041 "flush-write-stream-1.0.3" = {
3042 name = "flush-write-stream";
3043 packageName = "flush-write-stream";
3044 version = "1.0.3";
3045 src = fetchurl {
3046 url = "https://registry.npmjs.org/flush-write-stream/-/flush-write-stream-1.0.3.tgz";
3047 sha512 = "calZMC10u0FMUqoiunI2AiGIIUtUIvifNwkHhNupZH4cbNnW1Itkoh/Nf5HFYmDrwWPjrUxpkZT0KhuCq0jmGw==";
3048 };
3049 };
3050 "for-in-1.0.2" = {
3051 name = "for-in";
3052 packageName = "for-in";
3053 version = "1.0.2";
3054 src = fetchurl {
3055 url = "https://registry.npmjs.org/for-in/-/for-in-1.0.2.tgz";
3056 sha1 = "81068d295a8142ec0ac726c6e2200c30fb6d5e80";
3057 };
3058 };
3059 "for-own-1.0.0" = {
3060 name = "for-own";
3061 packageName = "for-own";
3062 version = "1.0.0";
3063 src = fetchurl {
3064 url = "https://registry.npmjs.org/for-own/-/for-own-1.0.0.tgz";
3065 sha1 = "c63332f415cedc4b04dbfe70cf836494c53cb44b";
1050 };
3066 };
1051 };
3067 };
1052 "forever-agent-0.6.1" = {
3068 "forever-agent-0.6.1" = {
@@ -1067,13 +3083,22 b' let'
1067 sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1";
3083 sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1";
1068 };
3084 };
1069 };
3085 };
1070 "fs-extra-0.6.4" = {
3086 "fragment-cache-0.2.1" = {
1071 name = "fs-extra";
3087 name = "fragment-cache";
1072 packageName = "fs-extra";
3088 packageName = "fragment-cache";
1073 version = "0.6.4";
3089 version = "0.2.1";
1074 src = fetchurl {
3090 src = fetchurl {
1075 url = "https://registry.npmjs.org/fs-extra/-/fs-extra-0.6.4.tgz";
3091 url = "https://registry.npmjs.org/fragment-cache/-/fragment-cache-0.2.1.tgz";
1076 sha1 = "f46f0c75b7841f8d200b3348cd4d691d5a099d15";
3092 sha1 = "4290fad27f13e89be7f33799c6bc5a0abfff0d19";
3093 };
3094 };
3095 "from2-2.3.0" = {
3096 name = "from2";
3097 packageName = "from2";
3098 version = "2.3.0";
3099 src = fetchurl {
3100 url = "https://registry.npmjs.org/from2/-/from2-2.3.0.tgz";
3101 sha1 = "8bfb5502bde4a4d36cfdeea007fcca21d7e382af";
1077 };
3102 };
1078 };
3103 };
1079 "fs-extra-1.0.0" = {
3104 "fs-extra-1.0.0" = {
@@ -1085,13 +3110,13 b' let'
1085 sha1 = "cd3ce5f7e7cb6145883fcae3191e9877f8587950";
3110 sha1 = "cd3ce5f7e7cb6145883fcae3191e9877f8587950";
1086 };
3111 };
1087 };
3112 };
1088 "fs.extra-1.3.2" = {
3113 "fs-write-stream-atomic-1.0.10" = {
1089 name = "fs.extra";
3114 name = "fs-write-stream-atomic";
1090 packageName = "fs.extra";
3115 packageName = "fs-write-stream-atomic";
1091 version = "1.3.2";
3116 version = "1.0.10";
1092 src = fetchurl {
3117 src = fetchurl {
1093 url = "https://registry.npmjs.org/fs.extra/-/fs.extra-1.3.2.tgz";
3118 url = "https://registry.npmjs.org/fs-write-stream-atomic/-/fs-write-stream-atomic-1.0.10.tgz";
1094 sha1 = "dd023f93013bee24531f1b33514c37b20fd93349";
3119 sha1 = "b47df53493ef911df75731e70a9ded0189db40c9";
1095 };
3120 };
1096 };
3121 };
1097 "fs.realpath-1.0.0" = {
3122 "fs.realpath-1.0.0" = {
@@ -1103,13 +3128,22 b' let'
1103 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
3128 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
1104 };
3129 };
1105 };
3130 };
1106 "gauge-2.7.4" = {
3131 "fsevents-1.2.4" = {
1107 name = "gauge";
3132 name = "fsevents";
1108 packageName = "gauge";
3133 packageName = "fsevents";
1109 version = "2.7.4";
3134 version = "1.2.4";
1110 src = fetchurl {
3135 src = fetchurl {
1111 url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";
3136 url = "https://registry.npmjs.org/fsevents/-/fsevents-1.2.4.tgz";
1112 sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
3137 sha512 = "z8H8/diyk76B7q5wg+Ud0+CqzcAF3mBBI/bA5ne5zrRUUIvNkJY//D3BqyH571KuAC4Nr7Rw7CjWX4r0y9DvNg==";
3138 };
3139 };
3140 "function-bind-1.1.1" = {
3141 name = "function-bind";
3142 packageName = "function-bind";
3143 version = "1.1.1";
3144 src = fetchurl {
3145 url = "https://registry.npmjs.org/function-bind/-/function-bind-1.1.1.tgz";
3146 sha512 = "yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==";
1113 };
3147 };
1114 };
3148 };
1115 "gaze-0.5.2" = {
3149 "gaze-0.5.2" = {
@@ -1121,6 +3155,33 b' let'
1121 sha1 = "40b709537d24d1d45767db5a908689dfe69ac44f";
3155 sha1 = "40b709537d24d1d45767db5a908689dfe69ac44f";
1122 };
3156 };
1123 };
3157 };
3158 "get-caller-file-1.0.3" = {
3159 name = "get-caller-file";
3160 packageName = "get-caller-file";
3161 version = "1.0.3";
3162 src = fetchurl {
3163 url = "https://registry.npmjs.org/get-caller-file/-/get-caller-file-1.0.3.tgz";
3164 sha512 = "3t6rVToeoZfYSGd8YoLFR2DJkiQrIiUrGcjvFX2mDw3bn6k2OtwHN0TNCLbBO+w8qTvimhDkv+LSscbJY1vE6w==";
3165 };
3166 };
3167 "get-stream-3.0.0" = {
3168 name = "get-stream";
3169 packageName = "get-stream";
3170 version = "3.0.0";
3171 src = fetchurl {
3172 url = "https://registry.npmjs.org/get-stream/-/get-stream-3.0.0.tgz";
3173 sha1 = "8e943d1358dc37555054ecbe2edb05aa174ede14";
3174 };
3175 };
3176 "get-value-2.0.6" = {
3177 name = "get-value";
3178 packageName = "get-value";
3179 version = "2.0.6";
3180 src = fetchurl {
3181 url = "https://registry.npmjs.org/get-value/-/get-value-2.0.6.tgz";
3182 sha1 = "dc15ca1c672387ca76bd37ac0a395ba2042a2c28";
3183 };
3184 };
1124 "getobject-0.1.0" = {
3185 "getobject-0.1.0" = {
1125 name = "getobject";
3186 name = "getobject";
1126 packageName = "getobject";
3187 packageName = "getobject";
@@ -1157,13 +3218,67 b' let'
1157 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
3218 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
1158 };
3219 };
1159 };
3220 };
1160 "glob-7.1.2" = {
3221 "glob-7.1.3" = {
1161 name = "glob";
3222 name = "glob";
1162 packageName = "glob";
3223 packageName = "glob";
1163 version = "7.1.2";
3224 version = "7.1.3";
1164 src = fetchurl {
3225 src = fetchurl {
1165 url = "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz";
3226 url = "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz";
1166 sha512 = "MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==";
3227 sha512 = "vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==";
3228 };
3229 };
3230 "glob-parent-3.1.0" = {
3231 name = "glob-parent";
3232 packageName = "glob-parent";
3233 version = "3.1.0";
3234 src = fetchurl {
3235 url = "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz";
3236 sha1 = "9e6af6299d8d3bd2bd40430832bd113df906c5ae";
3237 };
3238 };
3239 "global-modules-1.0.0" = {
3240 name = "global-modules";
3241 packageName = "global-modules";
3242 version = "1.0.0";
3243 src = fetchurl {
3244 url = "https://registry.npmjs.org/global-modules/-/global-modules-1.0.0.tgz";
3245 sha512 = "sKzpEkf11GpOFuw0Zzjzmt4B4UZwjOcG757PPvrfhxcLFbq0wpsgpOqxpxtxFiCG4DtG93M6XRVbF2oGdev7bg==";
3246 };
3247 };
3248 "global-modules-path-2.3.0" = {
3249 name = "global-modules-path";
3250 packageName = "global-modules-path";
3251 version = "2.3.0";
3252 src = fetchurl {
3253 url = "https://registry.npmjs.org/global-modules-path/-/global-modules-path-2.3.0.tgz";
3254 sha512 = "HchvMJNYh9dGSCy8pOQ2O8u/hoXaL+0XhnrwH0RyLiSXMMTl9W3N6KUU73+JFOg5PGjtzl6VZzUQsnrpm7Szag==";
3255 };
3256 };
3257 "global-prefix-1.0.2" = {
3258 name = "global-prefix";
3259 packageName = "global-prefix";
3260 version = "1.0.2";
3261 src = fetchurl {
3262 url = "https://registry.npmjs.org/global-prefix/-/global-prefix-1.0.2.tgz";
3263 sha1 = "dbf743c6c14992593c655568cb66ed32c0122ebe";
3264 };
3265 };
3266 "globals-9.18.0" = {
3267 name = "globals";
3268 packageName = "globals";
3269 version = "9.18.0";
3270 src = fetchurl {
3271 url = "https://registry.npmjs.org/globals/-/globals-9.18.0.tgz";
3272 sha512 = "S0nG3CLEQiY/ILxqtztTWH/3iRRdyBLw6KMDxnKMchrtbj2OFmehVh0WUCfW3DUrIgx/qFrJPICrq4Z4sTR9UQ==";
3273 };
3274 };
3275 "globby-7.1.1" = {
3276 name = "globby";
3277 packageName = "globby";
3278 version = "7.1.1";
3279 src = fetchurl {
3280 url = "https://registry.npmjs.org/globby/-/globby-7.1.1.tgz";
3281 sha1 = "fb2ccff9401f8600945dfada97440cca972b8680";
1167 };
3282 };
1168 };
3283 };
1169 "globule-0.1.0" = {
3284 "globule-0.1.0" = {
@@ -1211,6 +3326,15 b' let'
1211 sha1 = "56937cd5194324adff6d207631832a9d6ba4e7f0";
3326 sha1 = "56937cd5194324adff6d207631832a9d6ba4e7f0";
1212 };
3327 };
1213 };
3328 };
3329 "grunt-cli-1.3.1" = {
3330 name = "grunt-cli";
3331 packageName = "grunt-cli";
3332 version = "1.3.1";
3333 src = fetchurl {
3334 url = "https://registry.npmjs.org/grunt-cli/-/grunt-cli-1.3.1.tgz";
3335 sha512 = "UwBRu/QpAjDc53DRLEkyilFdL0zenpxu+fddTIlsF/KJqdNcHaQmvyu1W3cDesZ9rqqZdKK5A8+QDIyLUEWoZQ==";
3336 };
3337 };
1214 "grunt-contrib-concat-0.5.1" = {
3338 "grunt-contrib-concat-0.5.1" = {
1215 name = "grunt-contrib-concat";
3339 name = "grunt-contrib-concat";
1216 packageName = "grunt-contrib-concat";
3340 packageName = "grunt-contrib-concat";
@@ -1256,13 +3380,13 b' let'
1256 sha1 = "64fdcba25a635f5b4da1b6ce6f90da0aeb6e3f15";
3380 sha1 = "64fdcba25a635f5b4da1b6ce6f90da0aeb6e3f15";
1257 };
3381 };
1258 };
3382 };
1259 "grunt-crisper-1.0.1" = {
3383 "grunt-known-options-1.1.1" = {
1260 name = "grunt-crisper";
3384 name = "grunt-known-options";
1261 packageName = "grunt-crisper";
3385 packageName = "grunt-known-options";
1262 version = "1.0.1";
3386 version = "1.1.1";
1263 src = fetchurl {
3387 src = fetchurl {
1264 url = "https://registry.npmjs.org/grunt-crisper/-/grunt-crisper-1.0.1.tgz";
3388 url = "https://registry.npmjs.org/grunt-known-options/-/grunt-known-options-1.1.1.tgz";
1265 sha1 = "e7c091dcaff10deb0091e3035ca7e54008991fe7";
3389 sha512 = "cHwsLqoighpu7TuYj5RonnEuxGVFnztcUqTqp5rXFGYL4OuPFofwC4Ycg7n9fYwvK6F5WbYgeVOwph9Crs2fsQ==";
1266 };
3390 };
1267 };
3391 };
1268 "grunt-legacy-log-0.1.3" = {
3392 "grunt-legacy-log-0.1.3" = {
@@ -1292,13 +3416,13 b' let'
1292 sha1 = "93324884dbf7e37a9ff7c026dff451d94a9e554b";
3416 sha1 = "93324884dbf7e37a9ff7c026dff451d94a9e554b";
1293 };
3417 };
1294 };
3418 };
1295 "grunt-vulcanize-1.0.0" = {
3419 "grunt-webpack-3.1.3" = {
1296 name = "grunt-vulcanize";
3420 name = "grunt-webpack";
1297 packageName = "grunt-vulcanize";
3421 packageName = "grunt-webpack";
1298 version = "1.0.0";
3422 version = "3.1.3";
1299 src = fetchurl {
3423 src = fetchurl {
1300 url = "https://registry.npmjs.org/grunt-vulcanize/-/grunt-vulcanize-1.0.0.tgz";
3424 url = "https://registry.npmjs.org/grunt-webpack/-/grunt-webpack-3.1.3.tgz";
1301 sha1 = "f4d6cfef274f8216c06f6c290e7dbb3b9e9e3b0f";
3425 sha512 = "SaZ8K8lG4iTxs7ClZxOWCf3kxqS2y+Eel8SbaEGgBKwhAp6e45beIu+vhBZRLX3vonKML2kjemKsQ21REaqNFQ==";
1302 };
3426 };
1303 };
3427 };
1304 "har-schema-1.0.5" = {
3428 "har-schema-1.0.5" = {
@@ -1319,6 +3443,15 b' let'
1319 sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a";
3443 sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a";
1320 };
3444 };
1321 };
3445 };
3446 "has-1.0.3" = {
3447 name = "has";
3448 packageName = "has";
3449 version = "1.0.3";
3450 src = fetchurl {
3451 url = "https://registry.npmjs.org/has/-/has-1.0.3.tgz";
3452 sha512 = "f2dvO0VU6Oej7RkWJGrehjbzMAjFp5/VKPp5tTpWIV4JHHZK1/BxbFRtf/siA2SWTe09caDmVtYYzWEIbBS4zw==";
3453 };
3454 };
1322 "has-ansi-0.1.0" = {
3455 "has-ansi-0.1.0" = {
1323 name = "has-ansi";
3456 name = "has-ansi";
1324 packageName = "has-ansi";
3457 packageName = "has-ansi";
@@ -1337,13 +3470,85 b' let'
1337 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
3470 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
1338 };
3471 };
1339 };
3472 };
1340 "has-unicode-2.0.1" = {
3473 "has-flag-1.0.0" = {
1341 name = "has-unicode";
3474 name = "has-flag";
1342 packageName = "has-unicode";
3475 packageName = "has-flag";
1343 version = "2.0.1";
3476 version = "1.0.0";
1344 src = fetchurl {
3477 src = fetchurl {
1345 url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";
3478 url = "https://registry.npmjs.org/has-flag/-/has-flag-1.0.0.tgz";
1346 sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
3479 sha1 = "9d9e793165ce017a00f00418c43f942a7b1d11fa";
3480 };
3481 };
3482 "has-flag-3.0.0" = {
3483 name = "has-flag";
3484 packageName = "has-flag";
3485 version = "3.0.0";
3486 src = fetchurl {
3487 url = "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz";
3488 sha1 = "b5d454dc2199ae225699f3467e5a07f3b955bafd";
3489 };
3490 };
3491 "has-symbols-1.0.0" = {
3492 name = "has-symbols";
3493 packageName = "has-symbols";
3494 version = "1.0.0";
3495 src = fetchurl {
3496 url = "https://registry.npmjs.org/has-symbols/-/has-symbols-1.0.0.tgz";
3497 sha1 = "ba1a8f1af2a0fc39650f5c850367704122063b44";
3498 };
3499 };
3500 "has-value-0.3.1" = {
3501 name = "has-value";
3502 packageName = "has-value";
3503 version = "0.3.1";
3504 src = fetchurl {
3505 url = "https://registry.npmjs.org/has-value/-/has-value-0.3.1.tgz";
3506 sha1 = "7b1f58bada62ca827ec0a2078025654845995e1f";
3507 };
3508 };
3509 "has-value-1.0.0" = {
3510 name = "has-value";
3511 packageName = "has-value";
3512 version = "1.0.0";
3513 src = fetchurl {
3514 url = "https://registry.npmjs.org/has-value/-/has-value-1.0.0.tgz";
3515 sha1 = "18b281da585b1c5c51def24c930ed29a0be6b177";
3516 };
3517 };
3518 "has-values-0.1.4" = {
3519 name = "has-values";
3520 packageName = "has-values";
3521 version = "0.1.4";
3522 src = fetchurl {
3523 url = "https://registry.npmjs.org/has-values/-/has-values-0.1.4.tgz";
3524 sha1 = "6d61de95d91dfca9b9a02089ad384bff8f62b771";
3525 };
3526 };
3527 "has-values-1.0.0" = {
3528 name = "has-values";
3529 packageName = "has-values";
3530 version = "1.0.0";
3531 src = fetchurl {
3532 url = "https://registry.npmjs.org/has-values/-/has-values-1.0.0.tgz";
3533 sha1 = "95b0b63fec2146619a6fe57fe75628d5a39efe4f";
3534 };
3535 };
3536 "hash-base-3.0.4" = {
3537 name = "hash-base";
3538 packageName = "hash-base";
3539 version = "3.0.4";
3540 src = fetchurl {
3541 url = "https://registry.npmjs.org/hash-base/-/hash-base-3.0.4.tgz";
3542 sha1 = "5fc8686847ecd73499403319a6b0a3f3f6ae4918";
3543 };
3544 };
3545 "hash.js-1.1.5" = {
3546 name = "hash.js";
3547 packageName = "hash.js";
3548 version = "1.1.5";
3549 src = fetchurl {
3550 url = "https://registry.npmjs.org/hash.js/-/hash.js-1.1.5.tgz";
3551 sha512 = "eWI5HG9Np+eHV1KQhisXWwM+4EPPYe5dFX1UZZH7k/E3JzDEazVH+VGlZi6R94ZqImq+A3D1mCEtrFIfg/E7sA==";
1347 };
3552 };
1348 };
3553 };
1349 "hasha-2.2.0" = {
3554 "hasha-2.2.0" = {
@@ -1364,6 +3569,24 b' let'
1364 sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
3569 sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
1365 };
3570 };
1366 };
3571 };
3572 "he-1.2.0" = {
3573 name = "he";
3574 packageName = "he";
3575 version = "1.2.0";
3576 src = fetchurl {
3577 url = "https://registry.npmjs.org/he/-/he-1.2.0.tgz";
3578 sha512 = "F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==";
3579 };
3580 };
3581 "hmac-drbg-1.0.1" = {
3582 name = "hmac-drbg";
3583 packageName = "hmac-drbg";
3584 version = "1.0.1";
3585 src = fetchurl {
3586 url = "https://registry.npmjs.org/hmac-drbg/-/hmac-drbg-1.0.1.tgz";
3587 sha1 = "d2745701025a6c775a6c545793ed502fc0c649a1";
3588 };
3589 };
1367 "hoek-2.16.3" = {
3590 "hoek-2.16.3" = {
1368 name = "hoek";
3591 name = "hoek";
1369 packageName = "hoek";
3592 packageName = "hoek";
@@ -1373,6 +3596,24 b' let'
1373 sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
3596 sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
1374 };
3597 };
1375 };
3598 };
3599 "home-or-tmp-2.0.0" = {
3600 name = "home-or-tmp";
3601 packageName = "home-or-tmp";
3602 version = "2.0.0";
3603 src = fetchurl {
3604 url = "https://registry.npmjs.org/home-or-tmp/-/home-or-tmp-2.0.0.tgz";
3605 sha1 = "e36c3f2d2cae7d746a857e38d18d5f32a7882db8";
3606 };
3607 };
3608 "homedir-polyfill-1.0.1" = {
3609 name = "homedir-polyfill";
3610 packageName = "homedir-polyfill";
3611 version = "1.0.1";
3612 src = fetchurl {
3613 url = "https://registry.npmjs.org/homedir-polyfill/-/homedir-polyfill-1.0.1.tgz";
3614 sha1 = "4c2bbc8a758998feebf5ed68580f76d46768b4bc";
3615 };
3616 };
1376 "hooker-0.2.3" = {
3617 "hooker-0.2.3" = {
1377 name = "hooker";
3618 name = "hooker";
1378 packageName = "hooker";
3619 packageName = "hooker";
@@ -1382,13 +3623,58 b' let'
1382 sha1 = "b834f723cc4a242aa65963459df6d984c5d3d959";
3623 sha1 = "b834f723cc4a242aa65963459df6d984c5d3d959";
1383 };
3624 };
1384 };
3625 };
1385 "hosted-git-info-2.7.1" = {
3626 "html-comment-regex-1.1.2" = {
1386 name = "hosted-git-info";
3627 name = "html-comment-regex";
1387 packageName = "hosted-git-info";
3628 packageName = "html-comment-regex";
1388 version = "2.7.1";
3629 version = "1.1.2";
1389 src = fetchurl {
3630 src = fetchurl {
1390 url = "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
3631 url = "https://registry.npmjs.org/html-comment-regex/-/html-comment-regex-1.1.2.tgz";
1391 sha512 = "7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==";
3632 sha512 = "P+M65QY2JQ5Y0G9KKdlDpo0zK+/OHptU5AaBwUfAIDJZk1MYf32Frm84EcOytfJE0t5JvkAnKlmjsXDnWzCJmQ==";
3633 };
3634 };
3635 "html-loader-0.4.5" = {
3636 name = "html-loader";
3637 packageName = "html-loader";
3638 version = "0.4.5";
3639 src = fetchurl {
3640 url = "https://registry.npmjs.org/html-loader/-/html-loader-0.4.5.tgz";
3641 sha1 = "5fbcd87cd63a5c49a7fce2fe56f425e05729c68c";
3642 };
3643 };
3644 "html-loader-0.5.5" = {
3645 name = "html-loader";
3646 packageName = "html-loader";
3647 version = "0.5.5";
3648 src = fetchurl {
3649 url = "https://registry.npmjs.org/html-loader/-/html-loader-0.5.5.tgz";
3650 sha512 = "7hIW7YinOYUpo//kSYcPB6dCKoceKLmOwjEMmhIobHuWGDVl0Nwe4l68mdG/Ru0wcUxQjVMEoZpkalZ/SE7zog==";
3651 };
3652 };
3653 "html-minifier-3.5.21" = {
3654 name = "html-minifier";
3655 packageName = "html-minifier";
3656 version = "3.5.21";
3657 src = fetchurl {
3658 url = "https://registry.npmjs.org/html-minifier/-/html-minifier-3.5.21.tgz";
3659 sha512 = "LKUKwuJDhxNa3uf/LPR/KVjm/l3rBqtYeCOAekvG8F1vItxMUpueGd94i/asDDr8/1u7InxzFA5EeGjhhG5mMA==";
3660 };
3661 };
3662 "html-webpack-plugin-3.2.0" = {
3663 name = "html-webpack-plugin";
3664 packageName = "html-webpack-plugin";
3665 version = "3.2.0";
3666 src = fetchurl {
3667 url = "https://registry.npmjs.org/html-webpack-plugin/-/html-webpack-plugin-3.2.0.tgz";
3668 sha1 = "b01abbd723acaaa7b37b6af4492ebda03d9dd37b";
3669 };
3670 };
3671 "htmlparser2-3.3.0" = {
3672 name = "htmlparser2";
3673 packageName = "htmlparser2";
3674 version = "3.3.0";
3675 src = fetchurl {
3676 url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.3.0.tgz";
3677 sha1 = "cc70d05a59f6542e43f0e685c982e14c924a9efe";
1392 };
3678 };
1393 };
3679 };
1394 "htmlparser2-3.8.3" = {
3680 "htmlparser2-3.8.3" = {
@@ -1409,13 +3695,13 b' let'
1409 sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf";
3695 sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf";
1410 };
3696 };
1411 };
3697 };
1412 "hydrolysis-1.25.0" = {
3698 "https-browserify-1.0.0" = {
1413 name = "hydrolysis";
3699 name = "https-browserify";
1414 packageName = "hydrolysis";
3700 packageName = "https-browserify";
1415 version = "1.25.0";
3701 version = "1.0.0";
1416 src = fetchurl {
3702 src = fetchurl {
1417 url = "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz";
3703 url = "https://registry.npmjs.org/https-browserify/-/https-browserify-1.0.0.tgz";
1418 sha1 = "a4fb14a37a1e03b0db52d8aaa57c682272a14d84";
3704 sha1 = "ec06c10e0a34c0f2faf199f7fd7fc78fffd03c73";
1419 };
3705 };
1420 };
3706 };
1421 "iconv-lite-0.2.11" = {
3707 "iconv-lite-0.2.11" = {
@@ -1427,6 +3713,51 b' let'
1427 sha1 = "1ce60a3a57864a292d1321ff4609ca4bb965adc8";
3713 sha1 = "1ce60a3a57864a292d1321ff4609ca4bb965adc8";
1428 };
3714 };
1429 };
3715 };
3716 "icss-replace-symbols-1.1.0" = {
3717 name = "icss-replace-symbols";
3718 packageName = "icss-replace-symbols";
3719 version = "1.1.0";
3720 src = fetchurl {
3721 url = "https://registry.npmjs.org/icss-replace-symbols/-/icss-replace-symbols-1.1.0.tgz";
3722 sha1 = "06ea6f83679a7749e386cfe1fe812ae5db223ded";
3723 };
3724 };
3725 "icss-utils-2.1.0" = {
3726 name = "icss-utils";
3727 packageName = "icss-utils";
3728 version = "2.1.0";
3729 src = fetchurl {
3730 url = "https://registry.npmjs.org/icss-utils/-/icss-utils-2.1.0.tgz";
3731 sha1 = "83f0a0ec378bf3246178b6c2ad9136f135b1c962";
3732 };
3733 };
3734 "ieee754-1.1.12" = {
3735 name = "ieee754";
3736 packageName = "ieee754";
3737 version = "1.1.12";
3738 src = fetchurl {
3739 url = "https://registry.npmjs.org/ieee754/-/ieee754-1.1.12.tgz";
3740 sha512 = "GguP+DRY+pJ3soyIiGPTvdiVXjZ+DbXOxGpXn3eMvNW4x4irjqXm4wHKscC+TfxSJ0yw/S1F24tqdMNsMZTiLA==";
3741 };
3742 };
3743 "iferr-0.1.5" = {
3744 name = "iferr";
3745 packageName = "iferr";
3746 version = "0.1.5";
3747 src = fetchurl {
3748 url = "https://registry.npmjs.org/iferr/-/iferr-0.1.5.tgz";
3749 sha1 = "c60eed69e6d8fdb6b3104a1fcbca1c192dc5b501";
3750 };
3751 };
3752 "ignore-3.3.10" = {
3753 name = "ignore";
3754 packageName = "ignore";
3755 version = "3.3.10";
3756 src = fetchurl {
3757 url = "https://registry.npmjs.org/ignore/-/ignore-3.3.10.tgz";
3758 sha512 = "Pgs951kaMm5GXP7MOvxERINe3gsaVjUWFm+UZPSq9xYriQAksyhg0csnS0KXSNRD5NmNdapXEpjxG49+AKh/ug==";
3759 };
3760 };
1430 "image-size-0.5.5" = {
3761 "image-size-0.5.5" = {
1431 name = "image-size";
3762 name = "image-size";
1432 packageName = "image-size";
3763 packageName = "image-size";
@@ -1436,6 +3767,51 b' let'
1436 sha1 = "09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c";
3767 sha1 = "09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c";
1437 };
3768 };
1438 };
3769 };
3770 "import-local-2.0.0" = {
3771 name = "import-local";
3772 packageName = "import-local";
3773 version = "2.0.0";
3774 src = fetchurl {
3775 url = "https://registry.npmjs.org/import-local/-/import-local-2.0.0.tgz";
3776 sha512 = "b6s04m3O+s3CGSbqDIyP4R6aAwAeYlVq9+WUWep6iHa8ETRf9yei1U48C5MmfJmV9AiLYYBKPMq/W+/WRpQmCQ==";
3777 };
3778 };
3779 "imports-loader-0.7.1" = {
3780 name = "imports-loader";
3781 packageName = "imports-loader";
3782 version = "0.7.1";
3783 src = fetchurl {
3784 url = "https://registry.npmjs.org/imports-loader/-/imports-loader-0.7.1.tgz";
3785 sha1 = "f204b5f34702a32c1db7d48d89d5e867a0441253";
3786 };
3787 };
3788 "imurmurhash-0.1.4" = {
3789 name = "imurmurhash";
3790 packageName = "imurmurhash";
3791 version = "0.1.4";
3792 src = fetchurl {
3793 url = "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz";
3794 sha1 = "9218b9b2b928a238b13dc4fb6b6d576f231453ea";
3795 };
3796 };
3797 "indexes-of-1.0.1" = {
3798 name = "indexes-of";
3799 packageName = "indexes-of";
3800 version = "1.0.1";
3801 src = fetchurl {
3802 url = "https://registry.npmjs.org/indexes-of/-/indexes-of-1.0.1.tgz";
3803 sha1 = "f30f716c8e2bd346c7b67d3df3915566a7c05607";
3804 };
3805 };
3806 "indexof-0.0.1" = {
3807 name = "indexof";
3808 packageName = "indexof";
3809 version = "0.0.1";
3810 src = fetchurl {
3811 url = "https://registry.npmjs.org/indexof/-/indexof-0.0.1.tgz";
3812 sha1 = "82dc336d232b9062179d05ab3293a66059fd435d";
3813 };
3814 };
1439 "inflight-1.0.6" = {
3815 "inflight-1.0.6" = {
1440 name = "inflight";
3816 name = "inflight";
1441 packageName = "inflight";
3817 packageName = "inflight";
@@ -1454,6 +3830,15 b' let'
1454 sha1 = "ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b";
3830 sha1 = "ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b";
1455 };
3831 };
1456 };
3832 };
3833 "inherits-2.0.1" = {
3834 name = "inherits";
3835 packageName = "inherits";
3836 version = "2.0.1";
3837 src = fetchurl {
3838 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.1.tgz";
3839 sha1 = "b17d08d326b4423e568eff719f91b0b1cbdf69f1";
3840 };
3841 };
1457 "inherits-2.0.3" = {
3842 "inherits-2.0.3" = {
1458 name = "inherits";
3843 name = "inherits";
1459 packageName = "inherits";
3844 packageName = "inherits";
@@ -1472,13 +3857,175 b' let'
1472 sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==";
3857 sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==";
1473 };
3858 };
1474 };
3859 };
1475 "is-builtin-module-1.0.0" = {
3860 "interpret-1.1.0" = {
1476 name = "is-builtin-module";
3861 name = "interpret";
1477 packageName = "is-builtin-module";
3862 packageName = "interpret";
3863 version = "1.1.0";
3864 src = fetchurl {
3865 url = "https://registry.npmjs.org/interpret/-/interpret-1.1.0.tgz";
3866 sha1 = "7ed1b1410c6a0e0f78cf95d3b8440c63f78b8614";
3867 };
3868 };
3869 "invariant-2.2.4" = {
3870 name = "invariant";
3871 packageName = "invariant";
3872 version = "2.2.4";
3873 src = fetchurl {
3874 url = "https://registry.npmjs.org/invariant/-/invariant-2.2.4.tgz";
3875 sha512 = "phJfQVBuaJM5raOpJjSfkiD6BpbCE4Ns//LaXl6wGYtUBY83nWS6Rf9tXm2e8VaK60JEjYldbPif/A2B1C2gNA==";
3876 };
3877 };
3878 "invert-kv-2.0.0" = {
3879 name = "invert-kv";
3880 packageName = "invert-kv";
3881 version = "2.0.0";
3882 src = fetchurl {
3883 url = "https://registry.npmjs.org/invert-kv/-/invert-kv-2.0.0.tgz";
3884 sha512 = "wPVv/y/QQ/Uiirj/vh3oP+1Ww+AWehmi1g5fFWGPF6IpCBCDVrhgHRMvrLfdYcwDh3QJbGXDW4JAuzxElLSqKA==";
3885 };
3886 };
3887 "is-absolute-1.0.0" = {
3888 name = "is-absolute";
3889 packageName = "is-absolute";
3890 version = "1.0.0";
3891 src = fetchurl {
3892 url = "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz";
3893 sha512 = "dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==";
3894 };
3895 };
3896 "is-absolute-url-2.1.0" = {
3897 name = "is-absolute-url";
3898 packageName = "is-absolute-url";
3899 version = "2.1.0";
3900 src = fetchurl {
3901 url = "https://registry.npmjs.org/is-absolute-url/-/is-absolute-url-2.1.0.tgz";
3902 sha1 = "50530dfb84fcc9aa7dbe7852e83a37b93b9f2aa6";
3903 };
3904 };
3905 "is-accessor-descriptor-0.1.6" = {
3906 name = "is-accessor-descriptor";
3907 packageName = "is-accessor-descriptor";
3908 version = "0.1.6";
3909 src = fetchurl {
3910 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-0.1.6.tgz";
3911 sha1 = "a9e12cb3ae8d876727eeef3843f8a0897b5c98d6";
3912 };
3913 };
3914 "is-accessor-descriptor-1.0.0" = {
3915 name = "is-accessor-descriptor";
3916 packageName = "is-accessor-descriptor";
1478 version = "1.0.0";
3917 version = "1.0.0";
1479 src = fetchurl {
3918 src = fetchurl {
1480 url = "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
3919 url = "https://registry.npmjs.org/is-accessor-descriptor/-/is-accessor-descriptor-1.0.0.tgz";
1481 sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
3920 sha512 = "m5hnHTkcVsPfqx3AKlyttIPb7J+XykHvJP2B9bZDjlhLIoEq4XoK64Vg7boZlVWYK6LUY94dYPEE7Lh0ZkZKcQ==";
3921 };
3922 };
3923 "is-binary-path-1.0.1" = {
3924 name = "is-binary-path";
3925 packageName = "is-binary-path";
3926 version = "1.0.1";
3927 src = fetchurl {
3928 url = "https://registry.npmjs.org/is-binary-path/-/is-binary-path-1.0.1.tgz";
3929 sha1 = "75f16642b480f187a711c814161fd3a4a7655898";
3930 };
3931 };
3932 "is-buffer-1.1.6" = {
3933 name = "is-buffer";
3934 packageName = "is-buffer";
3935 version = "1.1.6";
3936 src = fetchurl {
3937 url = "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz";
3938 sha512 = "NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w==";
3939 };
3940 };
3941 "is-callable-1.1.4" = {
3942 name = "is-callable";
3943 packageName = "is-callable";
3944 version = "1.1.4";
3945 src = fetchurl {
3946 url = "https://registry.npmjs.org/is-callable/-/is-callable-1.1.4.tgz";
3947 sha512 = "r5p9sxJjYnArLjObpjA4xu5EKI3CuKHkJXMhT7kwbpUyIFD1n5PMAsoPvWnvtZiNz7LjkYDRZhd7FlI0eMijEA==";
3948 };
3949 };
3950 "is-data-descriptor-0.1.4" = {
3951 name = "is-data-descriptor";
3952 packageName = "is-data-descriptor";
3953 version = "0.1.4";
3954 src = fetchurl {
3955 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-0.1.4.tgz";
3956 sha1 = "0b5ee648388e2c860282e793f1856fec3f301b56";
3957 };
3958 };
3959 "is-data-descriptor-1.0.0" = {
3960 name = "is-data-descriptor";
3961 packageName = "is-data-descriptor";
3962 version = "1.0.0";
3963 src = fetchurl {
3964 url = "https://registry.npmjs.org/is-data-descriptor/-/is-data-descriptor-1.0.0.tgz";
3965 sha512 = "jbRXy1FmtAoCjQkVmIVYwuuqDFUbaOeDjmed1tOGPrsMhtJA4rD9tkgA0F1qJ3gRFRXcHYVkdeaP50Q5rE/jLQ==";
3966 };
3967 };
3968 "is-date-object-1.0.1" = {
3969 name = "is-date-object";
3970 packageName = "is-date-object";
3971 version = "1.0.1";
3972 src = fetchurl {
3973 url = "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.1.tgz";
3974 sha1 = "9aa20eb6aeebbff77fbd33e74ca01b33581d3a16";
3975 };
3976 };
3977 "is-descriptor-0.1.6" = {
3978 name = "is-descriptor";
3979 packageName = "is-descriptor";
3980 version = "0.1.6";
3981 src = fetchurl {
3982 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-0.1.6.tgz";
3983 sha512 = "avDYr0SB3DwO9zsMov0gKCESFYqCnE4hq/4z3TdUlukEy5t9C0YRq7HLrsN52NAcqXKaepeCD0n+B0arnVG3Hg==";
3984 };
3985 };
3986 "is-descriptor-1.0.2" = {
3987 name = "is-descriptor";
3988 packageName = "is-descriptor";
3989 version = "1.0.2";
3990 src = fetchurl {
3991 url = "https://registry.npmjs.org/is-descriptor/-/is-descriptor-1.0.2.tgz";
3992 sha512 = "2eis5WqQGV7peooDyLmNEPUrps9+SXX5c9pL3xEB+4e9HnGuDa7mB7kHxHw4CbqS9k1T2hOH3miL8n8WtiYVtg==";
3993 };
3994 };
3995 "is-extendable-0.1.1" = {
3996 name = "is-extendable";
3997 packageName = "is-extendable";
3998 version = "0.1.1";
3999 src = fetchurl {
4000 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-0.1.1.tgz";
4001 sha1 = "62b110e289a471418e3ec36a617d472e301dfc89";
4002 };
4003 };
4004 "is-extendable-1.0.1" = {
4005 name = "is-extendable";
4006 packageName = "is-extendable";
4007 version = "1.0.1";
4008 src = fetchurl {
4009 url = "https://registry.npmjs.org/is-extendable/-/is-extendable-1.0.1.tgz";
4010 sha512 = "arnXMxT1hhoKo9k1LZdmlNyJdDDfy2v0fXjFlmok4+i8ul/6WlbVge9bhM74OpNPQPMGUToDtz+KXa1PneJxOA==";
4011 };
4012 };
4013 "is-extglob-2.1.1" = {
4014 name = "is-extglob";
4015 packageName = "is-extglob";
4016 version = "2.1.1";
4017 src = fetchurl {
4018 url = "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz";
4019 sha1 = "a88c02535791f02ed37c76a1b9ea9773c833f8c2";
4020 };
4021 };
4022 "is-finite-1.0.2" = {
4023 name = "is-finite";
4024 packageName = "is-finite";
4025 version = "1.0.2";
4026 src = fetchurl {
4027 url = "https://registry.npmjs.org/is-finite/-/is-finite-1.0.2.tgz";
4028 sha1 = "cc6677695602be550ef11e8b4aa6305342b6d0aa";
1482 };
4029 };
1483 };
4030 };
1484 "is-fullwidth-code-point-1.0.0" = {
4031 "is-fullwidth-code-point-1.0.0" = {
@@ -1490,6 +4037,78 b' let'
1490 sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
4037 sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
1491 };
4038 };
1492 };
4039 };
4040 "is-fullwidth-code-point-2.0.0" = {
4041 name = "is-fullwidth-code-point";
4042 packageName = "is-fullwidth-code-point";
4043 version = "2.0.0";
4044 src = fetchurl {
4045 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz";
4046 sha1 = "a3b30a5c4f199183167aaab93beefae3ddfb654f";
4047 };
4048 };
4049 "is-glob-3.1.0" = {
4050 name = "is-glob";
4051 packageName = "is-glob";
4052 version = "3.1.0";
4053 src = fetchurl {
4054 url = "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz";
4055 sha1 = "7ba5ae24217804ac70707b96922567486cc3e84a";
4056 };
4057 };
4058 "is-glob-4.0.0" = {
4059 name = "is-glob";
4060 packageName = "is-glob";
4061 version = "4.0.0";
4062 src = fetchurl {
4063 url = "https://registry.npmjs.org/is-glob/-/is-glob-4.0.0.tgz";
4064 sha1 = "9521c76845cc2610a85203ddf080a958c2ffabc0";
4065 };
4066 };
4067 "is-number-3.0.0" = {
4068 name = "is-number";
4069 packageName = "is-number";
4070 version = "3.0.0";
4071 src = fetchurl {
4072 url = "https://registry.npmjs.org/is-number/-/is-number-3.0.0.tgz";
4073 sha1 = "24fd6201a4782cf50561c810276afc7d12d71195";
4074 };
4075 };
4076 "is-plain-obj-1.1.0" = {
4077 name = "is-plain-obj";
4078 packageName = "is-plain-obj";
4079 version = "1.1.0";
4080 src = fetchurl {
4081 url = "https://registry.npmjs.org/is-plain-obj/-/is-plain-obj-1.1.0.tgz";
4082 sha1 = "71a50c8429dfca773c92a390a4a03b39fcd51d3e";
4083 };
4084 };
4085 "is-plain-object-2.0.4" = {
4086 name = "is-plain-object";
4087 packageName = "is-plain-object";
4088 version = "2.0.4";
4089 src = fetchurl {
4090 url = "https://registry.npmjs.org/is-plain-object/-/is-plain-object-2.0.4.tgz";
4091 sha512 = "h5PpgXkWitc38BBMYawTYMWJHFZJVnBquFE57xFpjB8pJFiF6gZ+bU+WyI/yqXiFR5mdLsgYNaPe8uao6Uv9Og==";
4092 };
4093 };
4094 "is-regex-1.0.4" = {
4095 name = "is-regex";
4096 packageName = "is-regex";
4097 version = "1.0.4";
4098 src = fetchurl {
4099 url = "https://registry.npmjs.org/is-regex/-/is-regex-1.0.4.tgz";
4100 sha1 = "5517489b547091b0930e095654ced25ee97e9491";
4101 };
4102 };
4103 "is-relative-1.0.0" = {
4104 name = "is-relative";
4105 packageName = "is-relative";
4106 version = "1.0.0";
4107 src = fetchurl {
4108 url = "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz";
4109 sha512 = "Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==";
4110 };
4111 };
1493 "is-stream-1.1.0" = {
4112 "is-stream-1.1.0" = {
1494 name = "is-stream";
4113 name = "is-stream";
1495 packageName = "is-stream";
4114 packageName = "is-stream";
@@ -1499,6 +4118,24 b' let'
1499 sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
4118 sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
1500 };
4119 };
1501 };
4120 };
4121 "is-svg-2.1.0" = {
4122 name = "is-svg";
4123 packageName = "is-svg";
4124 version = "2.1.0";
4125 src = fetchurl {
4126 url = "https://registry.npmjs.org/is-svg/-/is-svg-2.1.0.tgz";
4127 sha1 = "cf61090da0d9efbcab8722deba6f032208dbb0e9";
4128 };
4129 };
4130 "is-symbol-1.0.2" = {
4131 name = "is-symbol";
4132 packageName = "is-symbol";
4133 version = "1.0.2";
4134 src = fetchurl {
4135 url = "https://registry.npmjs.org/is-symbol/-/is-symbol-1.0.2.tgz";
4136 sha512 = "HS8bZ9ox60yCJLH9snBpIwv9pYUAkcuLhSA1oero1UB5y9aiQpRA8y2ex945AOtCZL1lJDeIk3G5LthswI46Lw==";
4137 };
4138 };
1502 "is-typedarray-1.0.0" = {
4139 "is-typedarray-1.0.0" = {
1503 name = "is-typedarray";
4140 name = "is-typedarray";
1504 packageName = "is-typedarray";
4141 packageName = "is-typedarray";
@@ -1508,6 +4145,24 b' let'
1508 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
4145 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
1509 };
4146 };
1510 };
4147 };
4148 "is-unc-path-1.0.0" = {
4149 name = "is-unc-path";
4150 packageName = "is-unc-path";
4151 version = "1.0.0";
4152 src = fetchurl {
4153 url = "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz";
4154 sha512 = "mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==";
4155 };
4156 };
4157 "is-windows-1.0.2" = {
4158 name = "is-windows";
4159 packageName = "is-windows";
4160 version = "1.0.2";
4161 src = fetchurl {
4162 url = "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz";
4163 sha512 = "eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==";
4164 };
4165 };
1511 "isarray-0.0.1" = {
4166 "isarray-0.0.1" = {
1512 name = "isarray";
4167 name = "isarray";
1513 packageName = "isarray";
4168 packageName = "isarray";
@@ -1535,6 +4190,24 b' let'
1535 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
4190 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
1536 };
4191 };
1537 };
4192 };
4193 "isobject-2.1.0" = {
4194 name = "isobject";
4195 packageName = "isobject";
4196 version = "2.1.0";
4197 src = fetchurl {
4198 url = "https://registry.npmjs.org/isobject/-/isobject-2.1.0.tgz";
4199 sha1 = "f065561096a3f1da2ef46272f815c840d87e0c89";
4200 };
4201 };
4202 "isobject-3.0.1" = {
4203 name = "isobject";
4204 packageName = "isobject";
4205 version = "3.0.1";
4206 src = fetchurl {
4207 url = "https://registry.npmjs.org/isobject/-/isobject-3.0.1.tgz";
4208 sha1 = "4e431e92b11a9731636aa1f9c8d1ccbcfdab78df";
4209 };
4210 };
1538 "isstream-0.1.2" = {
4211 "isstream-0.1.2" = {
1539 name = "isstream";
4212 name = "isstream";
1540 packageName = "isstream";
4213 packageName = "isstream";
@@ -1553,6 +4226,24 b' let'
1553 sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583";
4226 sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583";
1554 };
4227 };
1555 };
4228 };
4229 "js-base64-2.4.9" = {
4230 name = "js-base64";
4231 packageName = "js-base64";
4232 version = "2.4.9";
4233 src = fetchurl {
4234 url = "https://registry.npmjs.org/js-base64/-/js-base64-2.4.9.tgz";
4235 sha512 = "xcinL3AuDJk7VSzsHgb9DvvIXayBbadtMZ4HFPx8rUszbW1MuNMlwYVC4zzCZ6e1sqZpnNS5ZFYOhXqA39T7LQ==";
4236 };
4237 };
4238 "js-tokens-3.0.2" = {
4239 name = "js-tokens";
4240 packageName = "js-tokens";
4241 version = "3.0.2";
4242 src = fetchurl {
4243 url = "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz";
4244 sha1 = "9866df395102130e38f7f996bceb65443209c25b";
4245 };
4246 };
1556 "js-yaml-2.0.5" = {
4247 "js-yaml-2.0.5" = {
1557 name = "js-yaml";
4248 name = "js-yaml";
1558 packageName = "js-yaml";
4249 packageName = "js-yaml";
@@ -1562,6 +4253,15 b' let'
1562 sha1 = "a25ae6509999e97df278c6719da11bd0687743a8";
4253 sha1 = "a25ae6509999e97df278c6719da11bd0687743a8";
1563 };
4254 };
1564 };
4255 };
4256 "js-yaml-3.7.0" = {
4257 name = "js-yaml";
4258 packageName = "js-yaml";
4259 version = "3.7.0";
4260 src = fetchurl {
4261 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-3.7.0.tgz";
4262 sha1 = "5c967ddd837a9bfdca5f2de84253abe8a1c03b80";
4263 };
4264 };
1565 "jsbn-0.1.1" = {
4265 "jsbn-0.1.1" = {
1566 name = "jsbn";
4266 name = "jsbn";
1567 packageName = "jsbn";
4267 packageName = "jsbn";
@@ -1571,6 +4271,24 b' let'
1571 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
4271 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
1572 };
4272 };
1573 };
4273 };
4274 "jsesc-0.5.0" = {
4275 name = "jsesc";
4276 packageName = "jsesc";
4277 version = "0.5.0";
4278 src = fetchurl {
4279 url = "https://registry.npmjs.org/jsesc/-/jsesc-0.5.0.tgz";
4280 sha1 = "e7dee66e35d6fc16f710fe91d5cf69f70f08911d";
4281 };
4282 };
4283 "jsesc-1.3.0" = {
4284 name = "jsesc";
4285 packageName = "jsesc";
4286 version = "1.3.0";
4287 src = fetchurl {
4288 url = "https://registry.npmjs.org/jsesc/-/jsesc-1.3.0.tgz";
4289 sha1 = "46c3fec8c1892b12b0833db9bc7622176dbab34b";
4290 };
4291 };
1574 "jshint-2.9.6" = {
4292 "jshint-2.9.6" = {
1575 name = "jshint";
4293 name = "jshint";
1576 packageName = "jshint";
4294 packageName = "jshint";
@@ -1580,6 +4298,15 b' let'
1580 sha512 = "KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==";
4298 sha512 = "KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==";
1581 };
4299 };
1582 };
4300 };
4301 "json-parse-better-errors-1.0.2" = {
4302 name = "json-parse-better-errors";
4303 packageName = "json-parse-better-errors";
4304 version = "1.0.2";
4305 src = fetchurl {
4306 url = "https://registry.npmjs.org/json-parse-better-errors/-/json-parse-better-errors-1.0.2.tgz";
4307 sha512 = "mrqyZKfX5EhL7hvqcV6WG1yYjnjeuYDzDhhcAAUrq8Po85NBQBJP+ZDUT75qZQ98IkUoBqdkExkukOU7Ts2wrw==";
4308 };
4309 };
1583 "json-schema-0.2.3" = {
4310 "json-schema-0.2.3" = {
1584 name = "json-schema";
4311 name = "json-schema";
1585 packageName = "json-schema";
4312 packageName = "json-schema";
@@ -1589,6 +4316,15 b' let'
1589 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
4316 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
1590 };
4317 };
1591 };
4318 };
4319 "json-schema-traverse-0.4.1" = {
4320 name = "json-schema-traverse";
4321 packageName = "json-schema-traverse";
4322 version = "0.4.1";
4323 src = fetchurl {
4324 url = "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz";
4325 sha512 = "xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==";
4326 };
4327 };
1592 "json-stable-stringify-1.0.1" = {
4328 "json-stable-stringify-1.0.1" = {
1593 name = "json-stable-stringify";
4329 name = "json-stable-stringify";
1594 packageName = "json-stable-stringify";
4330 packageName = "json-stable-stringify";
@@ -1607,13 +4343,13 b' let'
1607 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
4343 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
1608 };
4344 };
1609 };
4345 };
1610 "jsonfile-1.0.1" = {
4346 "json5-0.5.1" = {
1611 name = "jsonfile";
4347 name = "json5";
1612 packageName = "jsonfile";
4348 packageName = "json5";
1613 version = "1.0.1";
4349 version = "0.5.1";
1614 src = fetchurl {
4350 src = fetchurl {
1615 url = "https://registry.npmjs.org/jsonfile/-/jsonfile-1.0.1.tgz";
4351 url = "https://registry.npmjs.org/json5/-/json5-0.5.1.tgz";
1616 sha1 = "ea5efe40b83690b98667614a7392fc60e842c0dd";
4352 sha1 = "1eade7acc012034ad84e2396767ead9fa5495821";
1617 };
4353 };
1618 };
4354 };
1619 "jsonfile-2.4.0" = {
4355 "jsonfile-2.4.0" = {
@@ -1652,6 +4388,42 b' let'
1652 sha1 = "79d93d2d33363d6fdd2970b335d9141ad591d79b";
4388 sha1 = "79d93d2d33363d6fdd2970b335d9141ad591d79b";
1653 };
4389 };
1654 };
4390 };
4391 "kind-of-3.2.2" = {
4392 name = "kind-of";
4393 packageName = "kind-of";
4394 version = "3.2.2";
4395 src = fetchurl {
4396 url = "https://registry.npmjs.org/kind-of/-/kind-of-3.2.2.tgz";
4397 sha1 = "31ea21a734bab9bbb0f32466d893aea51e4a3c64";
4398 };
4399 };
4400 "kind-of-4.0.0" = {
4401 name = "kind-of";
4402 packageName = "kind-of";
4403 version = "4.0.0";
4404 src = fetchurl {
4405 url = "https://registry.npmjs.org/kind-of/-/kind-of-4.0.0.tgz";
4406 sha1 = "20813df3d712928b207378691a45066fae72dd57";
4407 };
4408 };
4409 "kind-of-5.1.0" = {
4410 name = "kind-of";
4411 packageName = "kind-of";
4412 version = "5.1.0";
4413 src = fetchurl {
4414 url = "https://registry.npmjs.org/kind-of/-/kind-of-5.1.0.tgz";
4415 sha512 = "NGEErnH6F2vUuXDh+OlbcKW7/wOcfdRHaZ7VWtqCztfHri/++YKmP51OdWeGPuqCOba6kk2OTe5d02VmTB80Pw==";
4416 };
4417 };
4418 "kind-of-6.0.2" = {
4419 name = "kind-of";
4420 packageName = "kind-of";
4421 version = "6.0.2";
4422 src = fetchurl {
4423 url = "https://registry.npmjs.org/kind-of/-/kind-of-6.0.2.tgz";
4424 sha512 = "s5kLOcnH0XqDO+FvuaLX8DDjZ18CGFk7VygH40QoKPUQhW4e2rvM0rwUq0t8IQDOwYSeLK01U90OjzBTme2QqA==";
4425 };
4426 };
1655 "klaw-1.3.1" = {
4427 "klaw-1.3.1" = {
1656 name = "klaw";
4428 name = "klaw";
1657 packageName = "klaw";
4429 packageName = "klaw";
@@ -1661,6 +4433,24 b' let'
1661 sha1 = "4088433b46b3b1ba259d78785d8e96f73ba02439";
4433 sha1 = "4088433b46b3b1ba259d78785d8e96f73ba02439";
1662 };
4434 };
1663 };
4435 };
4436 "lazy-cache-1.0.4" = {
4437 name = "lazy-cache";
4438 packageName = "lazy-cache";
4439 version = "1.0.4";
4440 src = fetchurl {
4441 url = "https://registry.npmjs.org/lazy-cache/-/lazy-cache-1.0.4.tgz";
4442 sha1 = "a1d78fc3a50474cb80845d3b3b6e1da49a446e8e";
4443 };
4444 };
4445 "lcid-2.0.0" = {
4446 name = "lcid";
4447 packageName = "lcid";
4448 version = "2.0.0";
4449 src = fetchurl {
4450 url = "https://registry.npmjs.org/lcid/-/lcid-2.0.0.tgz";
4451 sha512 = "avPEb8P8EGnwXKClwsNUgryVjllcRqtMYa49NTsbQagYuT1DcXnl1915oxWjoyGrXR6zH/Y0Zc96xWsPcoDKeA==";
4452 };
4453 };
1664 "less-2.7.3" = {
4454 "less-2.7.3" = {
1665 name = "less";
4455 name = "less";
1666 packageName = "less";
4456 packageName = "less";
@@ -1670,13 +4460,58 b' let'
1670 sha512 = "KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==";
4460 sha512 = "KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==";
1671 };
4461 };
1672 };
4462 };
1673 "levn-0.3.0" = {
4463 "liftoff-2.5.0" = {
1674 name = "levn";
4464 name = "liftoff";
1675 packageName = "levn";
4465 packageName = "liftoff";
1676 version = "0.3.0";
4466 version = "2.5.0";
1677 src = fetchurl {
4467 src = fetchurl {
1678 url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
4468 url = "https://registry.npmjs.org/liftoff/-/liftoff-2.5.0.tgz";
1679 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
4469 sha1 = "2009291bb31cea861bbf10a7c15a28caf75c31ec";
4470 };
4471 };
4472 "loader-runner-2.3.1" = {
4473 name = "loader-runner";
4474 packageName = "loader-runner";
4475 version = "2.3.1";
4476 src = fetchurl {
4477 url = "https://registry.npmjs.org/loader-runner/-/loader-runner-2.3.1.tgz";
4478 sha512 = "By6ZFY7ETWOc9RFaAIb23IjJVcM4dvJC/N57nmdz9RSkMXvAXGI7SyVlAw3v8vjtDRlqThgVDVmTnr9fqMlxkw==";
4479 };
4480 };
4481 "loader-utils-0.2.17" = {
4482 name = "loader-utils";
4483 packageName = "loader-utils";
4484 version = "0.2.17";
4485 src = fetchurl {
4486 url = "https://registry.npmjs.org/loader-utils/-/loader-utils-0.2.17.tgz";
4487 sha1 = "f86e6374d43205a6e6c60e9196f17c0299bfb348";
4488 };
4489 };
4490 "loader-utils-1.1.0" = {
4491 name = "loader-utils";
4492 packageName = "loader-utils";
4493 version = "1.1.0";
4494 src = fetchurl {
4495 url = "https://registry.npmjs.org/loader-utils/-/loader-utils-1.1.0.tgz";
4496 sha1 = "c98aef488bcceda2ffb5e2de646d6a754429f5cd";
4497 };
4498 };
4499 "locate-path-2.0.0" = {
4500 name = "locate-path";
4501 packageName = "locate-path";
4502 version = "2.0.0";
4503 src = fetchurl {
4504 url = "https://registry.npmjs.org/locate-path/-/locate-path-2.0.0.tgz";
4505 sha1 = "2b568b265eec944c6d9c0de9c3dbbbca0354cd8e";
4506 };
4507 };
4508 "locate-path-3.0.0" = {
4509 name = "locate-path";
4510 packageName = "locate-path";
4511 version = "3.0.0";
4512 src = fetchurl {
4513 url = "https://registry.npmjs.org/locate-path/-/locate-path-3.0.0.tgz";
4514 sha512 = "7AO748wWnIhNqAuaty2ZWHkQHRSNfPVIsPIfwEOWO22AmaoVrWavlOcMR5nzTLNYvp36X220/maaRsrec1G65A==";
1680 };
4515 };
1681 };
4516 };
1682 "lodash-0.9.2" = {
4517 "lodash-0.9.2" = {
@@ -1706,13 +4541,85 b' let'
1706 sha1 = "fadd834b9683073da179b3eae6d9c0d15053f73e";
4541 sha1 = "fadd834b9683073da179b3eae6d9c0d15053f73e";
1707 };
4542 };
1708 };
4543 };
1709 "lodash-4.17.10" = {
4544 "lodash-4.17.11" = {
1710 name = "lodash";
4545 name = "lodash";
1711 packageName = "lodash";
4546 packageName = "lodash";
1712 version = "4.17.10";
4547 version = "4.17.11";
1713 src = fetchurl {
4548 src = fetchurl {
1714 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz";
4549 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz";
1715 sha512 = "UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==";
4550 sha512 = "cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==";
4551 };
4552 };
4553 "lodash.camelcase-4.3.0" = {
4554 name = "lodash.camelcase";
4555 packageName = "lodash.camelcase";
4556 version = "4.3.0";
4557 src = fetchurl {
4558 url = "https://registry.npmjs.org/lodash.camelcase/-/lodash.camelcase-4.3.0.tgz";
4559 sha1 = "b28aa6288a2b9fc651035c7711f65ab6190331a6";
4560 };
4561 };
4562 "lodash.debounce-4.0.8" = {
4563 name = "lodash.debounce";
4564 packageName = "lodash.debounce";
4565 version = "4.0.8";
4566 src = fetchurl {
4567 url = "https://registry.npmjs.org/lodash.debounce/-/lodash.debounce-4.0.8.tgz";
4568 sha1 = "82d79bff30a67c4005ffd5e2515300ad9ca4d7af";
4569 };
4570 };
4571 "lodash.isplainobject-4.0.6" = {
4572 name = "lodash.isplainobject";
4573 packageName = "lodash.isplainobject";
4574 version = "4.0.6";
4575 src = fetchurl {
4576 url = "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz";
4577 sha1 = "7c526a52d89b45c45cc690b88163be0497f550cb";
4578 };
4579 };
4580 "lodash.memoize-4.1.2" = {
4581 name = "lodash.memoize";
4582 packageName = "lodash.memoize";
4583 version = "4.1.2";
4584 src = fetchurl {
4585 url = "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz";
4586 sha1 = "bcc6c49a42a2840ed997f323eada5ecd182e0bfe";
4587 };
4588 };
4589 "lodash.uniq-4.5.0" = {
4590 name = "lodash.uniq";
4591 packageName = "lodash.uniq";
4592 version = "4.5.0";
4593 src = fetchurl {
4594 url = "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz";
4595 sha1 = "d0225373aeb652adc1bc82e4945339a842754773";
4596 };
4597 };
4598 "longest-1.0.1" = {
4599 name = "longest";
4600 packageName = "longest";
4601 version = "1.0.1";
4602 src = fetchurl {
4603 url = "https://registry.npmjs.org/longest/-/longest-1.0.1.tgz";
4604 sha1 = "30a0b2da38f73770e8294a0d22e6625ed77d0097";
4605 };
4606 };
4607 "loose-envify-1.4.0" = {
4608 name = "loose-envify";
4609 packageName = "loose-envify";
4610 version = "1.4.0";
4611 src = fetchurl {
4612 url = "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz";
4613 sha512 = "lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==";
4614 };
4615 };
4616 "lower-case-1.1.4" = {
4617 name = "lower-case";
4618 packageName = "lower-case";
4619 version = "1.1.4";
4620 src = fetchurl {
4621 url = "https://registry.npmjs.org/lower-case/-/lower-case-1.1.4.tgz";
4622 sha1 = "9a2cabd1b9e8e0ae993a4bf7d5875c39c42e8eac";
1716 };
4623 };
1717 };
4624 };
1718 "lru-cache-2.7.3" = {
4625 "lru-cache-2.7.3" = {
@@ -1724,6 +4631,114 b' let'
1724 sha1 = "6d4524e8b955f95d4f5b58851ce21dd72fb4e952";
4631 sha1 = "6d4524e8b955f95d4f5b58851ce21dd72fb4e952";
1725 };
4632 };
1726 };
4633 };
4634 "lru-cache-4.1.3" = {
4635 name = "lru-cache";
4636 packageName = "lru-cache";
4637 version = "4.1.3";
4638 src = fetchurl {
4639 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-4.1.3.tgz";
4640 sha512 = "fFEhvcgzuIoJVUF8fYr5KR0YqxD238zgObTps31YdADwPPAp82a4M8TrckkWyx7ekNlf9aBcVn81cFwwXngrJA==";
4641 };
4642 };
4643 "make-dir-1.3.0" = {
4644 name = "make-dir";
4645 packageName = "make-dir";
4646 version = "1.3.0";
4647 src = fetchurl {
4648 url = "https://registry.npmjs.org/make-dir/-/make-dir-1.3.0.tgz";
4649 sha512 = "2w31R7SJtieJJnQtGc7RVL2StM2vGYVfqUOvUDxH6bC6aJTxPxTF0GnIgCyu7tjockiUWAYQRbxa7vKn34s5sQ==";
4650 };
4651 };
4652 "make-iterator-1.0.1" = {
4653 name = "make-iterator";
4654 packageName = "make-iterator";
4655 version = "1.0.1";
4656 src = fetchurl {
4657 url = "https://registry.npmjs.org/make-iterator/-/make-iterator-1.0.1.tgz";
4658 sha512 = "pxiuXh0iVEq7VM7KMIhs5gxsfxCux2URptUQaXo4iZZJxBAzTPOLE2BumO5dbfVYq/hBJFBR/a1mFDmOx5AGmw==";
4659 };
4660 };
4661 "map-age-cleaner-0.1.2" = {
4662 name = "map-age-cleaner";
4663 packageName = "map-age-cleaner";
4664 version = "0.1.2";
4665 src = fetchurl {
4666 url = "https://registry.npmjs.org/map-age-cleaner/-/map-age-cleaner-0.1.2.tgz";
4667 sha512 = "UN1dNocxQq44IhJyMI4TU8phc2m9BddacHRPRjKGLYaF0jqd3xLz0jS0skpAU9WgYyoR4gHtUpzytNBS385FWQ==";
4668 };
4669 };
4670 "map-cache-0.2.2" = {
4671 name = "map-cache";
4672 packageName = "map-cache";
4673 version = "0.2.2";
4674 src = fetchurl {
4675 url = "https://registry.npmjs.org/map-cache/-/map-cache-0.2.2.tgz";
4676 sha1 = "c32abd0bd6525d9b051645bb4f26ac5dc98a0dbf";
4677 };
4678 };
4679 "map-visit-1.0.0" = {
4680 name = "map-visit";
4681 packageName = "map-visit";
4682 version = "1.0.0";
4683 src = fetchurl {
4684 url = "https://registry.npmjs.org/map-visit/-/map-visit-1.0.0.tgz";
4685 sha1 = "ecdca8f13144e660f1b5bd41f12f3479d98dfb8f";
4686 };
4687 };
4688 "math-expression-evaluator-1.2.17" = {
4689 name = "math-expression-evaluator";
4690 packageName = "math-expression-evaluator";
4691 version = "1.2.17";
4692 src = fetchurl {
4693 url = "https://registry.npmjs.org/math-expression-evaluator/-/math-expression-evaluator-1.2.17.tgz";
4694 sha1 = "de819fdbcd84dccd8fae59c6aeb79615b9d266ac";
4695 };
4696 };
4697 "md5.js-1.3.5" = {
4698 name = "md5.js";
4699 packageName = "md5.js";
4700 version = "1.3.5";
4701 src = fetchurl {
4702 url = "https://registry.npmjs.org/md5.js/-/md5.js-1.3.5.tgz";
4703 sha512 = "xitP+WxNPcTTOgnTJcrhM0xvdPepipPSf3I8EIpGKeFLjt3PlJLIDG3u8EX53ZIubkb+5U2+3rELYpEhHhzdkg==";
4704 };
4705 };
4706 "mem-4.0.0" = {
4707 name = "mem";
4708 packageName = "mem";
4709 version = "4.0.0";
4710 src = fetchurl {
4711 url = "https://registry.npmjs.org/mem/-/mem-4.0.0.tgz";
4712 sha512 = "WQxG/5xYc3tMbYLXoXPm81ET2WDULiU5FxbuIoNbJqLOOI8zehXFdZuiUEgfdrU2mVB1pxBZUGlYORSrpuJreA==";
4713 };
4714 };
4715 "memory-fs-0.4.1" = {
4716 name = "memory-fs";
4717 packageName = "memory-fs";
4718 version = "0.4.1";
4719 src = fetchurl {
4720 url = "https://registry.npmjs.org/memory-fs/-/memory-fs-0.4.1.tgz";
4721 sha1 = "3a9a20b8462523e447cfbc7e8bb80ed667bfc552";
4722 };
4723 };
4724 "micromatch-3.1.10" = {
4725 name = "micromatch";
4726 packageName = "micromatch";
4727 version = "3.1.10";
4728 src = fetchurl {
4729 url = "https://registry.npmjs.org/micromatch/-/micromatch-3.1.10.tgz";
4730 sha512 = "MWikgl9n9M3w+bpsY3He8L+w9eF9338xRl8IAO5viDizwSzziFEyUzo2xrrloB64ADbTf8uA8vRqqttDTOmccg==";
4731 };
4732 };
4733 "miller-rabin-4.0.1" = {
4734 name = "miller-rabin";
4735 packageName = "miller-rabin";
4736 version = "4.0.1";
4737 src = fetchurl {
4738 url = "https://registry.npmjs.org/miller-rabin/-/miller-rabin-4.0.1.tgz";
4739 sha512 = "115fLhvZVqWwHPbClyntxEVfVDfl9DLLTuJvq3g2O/Oxi8AiNouAHvDSzHS0viUJc+V5vm3eq91Xwqn9dp4jRA==";
4740 };
4741 };
1727 "mime-1.6.0" = {
4742 "mime-1.6.0" = {
1728 name = "mime";
4743 name = "mime";
1729 packageName = "mime";
4744 packageName = "mime";
@@ -1733,22 +4748,49 b' let'
1733 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
4748 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
1734 };
4749 };
1735 };
4750 };
1736 "mime-db-1.35.0" = {
4751 "mime-db-1.37.0" = {
1737 name = "mime-db";
4752 name = "mime-db";
1738 packageName = "mime-db";
4753 packageName = "mime-db";
1739 version = "1.35.0";
4754 version = "1.37.0";
1740 src = fetchurl {
4755 src = fetchurl {
1741 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz";
4756 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.37.0.tgz";
1742 sha512 = "JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==";
4757 sha512 = "R3C4db6bgQhlIhPU48fUtdVmKnflq+hRdad7IyKhtFj06VPNVdk2RhiYL3UjQIlso8L+YxAtFkobT0VK+S/ybg==";
1743 };
4758 };
1744 };
4759 };
1745 "mime-types-2.1.19" = {
4760 "mime-types-2.1.21" = {
1746 name = "mime-types";
4761 name = "mime-types";
1747 packageName = "mime-types";
4762 packageName = "mime-types";
1748 version = "2.1.19";
4763 version = "2.1.21";
1749 src = fetchurl {
4764 src = fetchurl {
1750 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz";
4765 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.21.tgz";
1751 sha512 = "P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==";
4766 sha512 = "3iL6DbwpyLzjR3xHSFNFeb9Nz/M8WDkX33t1GFQnFOllWk8pOrh/LSrB5OXlnlW5P9LH73X6loW/eogc+F5lJg==";
4767 };
4768 };
4769 "mimic-fn-1.2.0" = {
4770 name = "mimic-fn";
4771 packageName = "mimic-fn";
4772 version = "1.2.0";
4773 src = fetchurl {
4774 url = "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz";
4775 sha512 = "jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==";
4776 };
4777 };
4778 "minimalistic-assert-1.0.1" = {
4779 name = "minimalistic-assert";
4780 packageName = "minimalistic-assert";
4781 version = "1.0.1";
4782 src = fetchurl {
4783 url = "https://registry.npmjs.org/minimalistic-assert/-/minimalistic-assert-1.0.1.tgz";
4784 sha512 = "UtJcAD4yEaGtjPezWuO9wC4nwUnVH/8/Im3yEHQP4b67cXlD/Qr9hdITCU1xDbSEXg2XKNaP8jsReV7vQd00/A==";
4785 };
4786 };
4787 "minimalistic-crypto-utils-1.0.1" = {
4788 name = "minimalistic-crypto-utils";
4789 packageName = "minimalistic-crypto-utils";
4790 version = "1.0.1";
4791 src = fetchurl {
4792 url = "https://registry.npmjs.org/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz";
4793 sha1 = "f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a";
1752 };
4794 };
1753 };
4795 };
1754 "minimatch-0.2.14" = {
4796 "minimatch-0.2.14" = {
@@ -1787,31 +4829,22 b' let'
1787 sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
4829 sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
1788 };
4830 };
1789 };
4831 };
1790 "minipass-2.3.3" = {
4832 "mississippi-2.0.0" = {
1791 name = "minipass";
4833 name = "mississippi";
1792 packageName = "minipass";
4834 packageName = "mississippi";
1793 version = "2.3.3";
4835 version = "2.0.0";
1794 src = fetchurl {
4836 src = fetchurl {
1795 url = "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz";
4837 url = "https://registry.npmjs.org/mississippi/-/mississippi-2.0.0.tgz";
1796 sha512 = "/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==";
4838 sha512 = "zHo8v+otD1J10j/tC+VNoGK9keCuByhKovAvdn74dmxJl9+mWHnx6EMsDN4lgRoMI/eYo2nchAxniIbUPb5onw==";
1797 };
4839 };
1798 };
4840 };
1799 "minizlib-1.1.0" = {
4841 "mixin-deep-1.3.1" = {
1800 name = "minizlib";
4842 name = "mixin-deep";
1801 packageName = "minizlib";
4843 packageName = "mixin-deep";
1802 version = "1.1.0";
4844 version = "1.3.1";
1803 src = fetchurl {
4845 src = fetchurl {
1804 url = "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz";
4846 url = "https://registry.npmjs.org/mixin-deep/-/mixin-deep-1.3.1.tgz";
1805 sha512 = "4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==";
4847 sha512 = "8ZItLHeEgaqEvd5lYBXfm4EZSFCX29Jb9K+lAHhDKzReKBQKj3R+7NOF6tjqYi9t4oI8VUfaWITJQm86wnXGNQ==";
1806 };
1807 };
1808 "mkdirp-0.3.5" = {
1809 name = "mkdirp";
1810 packageName = "mkdirp";
1811 version = "0.3.5";
1812 src = fetchurl {
1813 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz";
1814 sha1 = "de3e5f8961c88c787ee1368df849ac4413eca8d7";
1815 };
4848 };
1816 };
4849 };
1817 "mkdirp-0.5.1" = {
4850 "mkdirp-0.5.1" = {
@@ -1841,6 +4874,15 b' let'
1841 sha512 = "jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==";
4874 sha512 = "jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==";
1842 };
4875 };
1843 };
4876 };
4877 "move-concurrently-1.0.1" = {
4878 name = "move-concurrently";
4879 packageName = "move-concurrently";
4880 version = "1.0.1";
4881 src = fetchurl {
4882 url = "https://registry.npmjs.org/move-concurrently/-/move-concurrently-1.0.1.tgz";
4883 sha1 = "be2c005fda32e0b29af1f05d7c4b33214c701f92";
4884 };
4885 };
1844 "ms-2.0.0" = {
4886 "ms-2.0.0" = {
1845 name = "ms";
4887 name = "ms";
1846 packageName = "ms";
4888 packageName = "ms";
@@ -1850,31 +4892,58 b' let'
1850 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
4892 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
1851 };
4893 };
1852 };
4894 };
1853 "ncp-0.4.2" = {
4895 "nan-2.11.1" = {
1854 name = "ncp";
4896 name = "nan";
1855 packageName = "ncp";
4897 packageName = "nan";
1856 version = "0.4.2";
4898 version = "2.11.1";
1857 src = fetchurl {
4899 src = fetchurl {
1858 url = "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz";
4900 url = "https://registry.npmjs.org/nan/-/nan-2.11.1.tgz";
1859 sha1 = "abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574";
4901 sha512 = "iji6k87OSXa0CcrLl9z+ZiYSuR2o+c0bGuNmXdrhTQTakxytAFsC56SArGYoiHlJlFoHSnvmhpceZJaXkVuOtA==";
1860 };
4902 };
1861 };
4903 };
1862 "nijs-0.0.25" = {
4904 "nanomatch-1.2.13" = {
1863 name = "nijs";
4905 name = "nanomatch";
1864 packageName = "nijs";
4906 packageName = "nanomatch";
1865 version = "0.0.25";
4907 version = "1.2.13";
1866 src = fetchurl {
4908 src = fetchurl {
1867 url = "https://registry.npmjs.org/nijs/-/nijs-0.0.25.tgz";
4909 url = "https://registry.npmjs.org/nanomatch/-/nanomatch-1.2.13.tgz";
1868 sha1 = "04b035cb530d46859d1018839a518c029133f676";
4910 sha512 = "fpoe2T0RbHwBTBUOftAfBPaDEi06ufaUai0mE6Yn1kacc3SnTErfb/h+X94VXzI64rKFHYImXSvdwGGCmwOqCA==";
1869 };
4911 };
1870 };
4912 };
1871 "node2nix-1.6.0" = {
4913 "neo-async-2.6.0" = {
1872 name = "node2nix";
4914 name = "neo-async";
1873 packageName = "node2nix";
4915 packageName = "neo-async";
1874 version = "1.6.0";
4916 version = "2.6.0";
1875 src = fetchurl {
4917 src = fetchurl {
1876 url = "https://registry.npmjs.org/node2nix/-/node2nix-1.6.0.tgz";
4918 url = "https://registry.npmjs.org/neo-async/-/neo-async-2.6.0.tgz";
1877 sha512 = "MJY6SsQH3pN59R9N3nMz/L8BsbQ0DlvSF38mgg1fwfwgnaJ+y600s3Nd0vZ+cnETUH+4OPETc4QohflccjPUYw==";
4919 sha512 = "MFh0d/Wa7vkKO3Y3LlacqAEeHK0mckVqzDieUKTT+KGxi+zIpeVsFxymkIiRpbpDziHc290Xr9A1O4Om7otoRA==";
4920 };
4921 };
4922 "nice-try-1.0.5" = {
4923 name = "nice-try";
4924 packageName = "nice-try";
4925 version = "1.0.5";
4926 src = fetchurl {
4927 url = "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz";
4928 sha512 = "1nh45deeb5olNY7eX82BkPO7SSxR5SSYJiPTrTdFUVYwAl8CKMA5N9PjTYkHiRjisVcxcQ1HXdLhx2qxxJzLNQ==";
4929 };
4930 };
4931 "no-case-2.3.2" = {
4932 name = "no-case";
4933 packageName = "no-case";
4934 version = "2.3.2";
4935 src = fetchurl {
4936 url = "https://registry.npmjs.org/no-case/-/no-case-2.3.2.tgz";
4937 sha512 = "rmTZ9kz+f3rCvK2TD1Ue/oZlns7OGoIWP4fc3llxxRXlOkHKoWPPWJOfFYpITabSow43QJbRIoHQXtt10VldyQ==";
4938 };
4939 };
4940 "node-libs-browser-2.1.0" = {
4941 name = "node-libs-browser";
4942 packageName = "node-libs-browser";
4943 version = "2.1.0";
4944 src = fetchurl {
4945 url = "https://registry.npmjs.org/node-libs-browser/-/node-libs-browser-2.1.0.tgz";
4946 sha512 = "5AzFzdoIMb89hBGMZglEegffzgRg+ZFoUmisQ8HI4j1KDdpx13J0taNp2y9xPbur6W61gepGDDotGBVQ7mfUCg==";
1878 };
4947 };
1879 };
4948 };
1880 "nopt-1.0.10" = {
4949 "nopt-1.0.10" = {
@@ -1895,13 +4964,13 b' let'
1895 sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d";
4964 sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d";
1896 };
4965 };
1897 };
4966 };
1898 "nopt-3.0.6" = {
4967 "nopt-4.0.1" = {
1899 name = "nopt";
4968 name = "nopt";
1900 packageName = "nopt";
4969 packageName = "nopt";
1901 version = "3.0.6";
4970 version = "4.0.1";
1902 src = fetchurl {
4971 src = fetchurl {
1903 url = "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz";
4972 url = "https://registry.npmjs.org/nopt/-/nopt-4.0.1.tgz";
1904 sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
4973 sha1 = "d0d4685afd5415193c8c7505602d0d17cd64474d";
1905 };
4974 };
1906 };
4975 };
1907 "noptify-0.0.3" = {
4976 "noptify-0.0.3" = {
@@ -1913,49 +4982,58 b' let'
1913 sha1 = "58f654a73d9753df0c51d9686dc92104a67f4bbb";
4982 sha1 = "58f654a73d9753df0c51d9686dc92104a67f4bbb";
1914 };
4983 };
1915 };
4984 };
1916 "normalize-package-data-2.4.0" = {
4985 "normalize-path-2.1.1" = {
1917 name = "normalize-package-data";
4986 name = "normalize-path";
1918 packageName = "normalize-package-data";
4987 packageName = "normalize-path";
1919 version = "2.4.0";
4988 version = "2.1.1";
1920 src = fetchurl {
4989 src = fetchurl {
1921 url = "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
4990 url = "https://registry.npmjs.org/normalize-path/-/normalize-path-2.1.1.tgz";
1922 sha512 = "9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==";
4991 sha1 = "1ab28b556e198363a8c1a6f7e6fa20137fe6aed9";
1923 };
4992 };
1924 };
4993 };
1925 "npm-package-arg-6.1.0" = {
4994 "normalize-range-0.1.2" = {
1926 name = "npm-package-arg";
4995 name = "normalize-range";
1927 packageName = "npm-package-arg";
4996 packageName = "normalize-range";
1928 version = "6.1.0";
4997 version = "0.1.2";
1929 src = fetchurl {
4998 src = fetchurl {
1930 url = "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz";
4999 url = "https://registry.npmjs.org/normalize-range/-/normalize-range-0.1.2.tgz";
1931 sha512 = "zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==";
5000 sha1 = "2d10c06bdfd312ea9777695a4d28439456b75942";
1932 };
5001 };
1933 };
5002 };
1934 "npm-registry-client-8.5.1" = {
5003 "normalize-url-1.9.1" = {
1935 name = "npm-registry-client";
5004 name = "normalize-url";
1936 packageName = "npm-registry-client";
5005 packageName = "normalize-url";
1937 version = "8.5.1";
5006 version = "1.9.1";
1938 src = fetchurl {
5007 src = fetchurl {
1939 url = "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.1.tgz";
5008 url = "https://registry.npmjs.org/normalize-url/-/normalize-url-1.9.1.tgz";
1940 sha512 = "7rjGF2eA7hKDidGyEWmHTiKfXkbrcQAsGL/Rh4Rt3x3YNRNHhwaTzVJfW3aNvvlhg4G62VCluif0sLCb/i51Hg==";
5009 sha1 = "2cc0d66b31ea23036458436e3620d85954c66c3c";
1941 };
5010 };
1942 };
5011 };
1943 "npmconf-2.1.3" = {
5012 "npm-run-path-2.0.2" = {
1944 name = "npmconf";
5013 name = "npm-run-path";
1945 packageName = "npmconf";
5014 packageName = "npm-run-path";
1946 version = "2.1.3";
5015 version = "2.0.2";
1947 src = fetchurl {
5016 src = fetchurl {
1948 url = "https://registry.npmjs.org/npmconf/-/npmconf-2.1.3.tgz";
5017 url = "https://registry.npmjs.org/npm-run-path/-/npm-run-path-2.0.2.tgz";
1949 sha512 = "iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA==";
5018 sha1 = "35a9232dfa35d7067b4cb2ddf2357b1871536c5f";
1950 };
5019 };
1951 };
5020 };
1952 "npmlog-4.1.2" = {
5021 "nth-check-1.0.2" = {
1953 name = "npmlog";
5022 name = "nth-check";
1954 packageName = "npmlog";
5023 packageName = "nth-check";
1955 version = "4.1.2";
5024 version = "1.0.2";
1956 src = fetchurl {
5025 src = fetchurl {
1957 url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";
5026 url = "https://registry.npmjs.org/nth-check/-/nth-check-1.0.2.tgz";
1958 sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==";
5027 sha512 = "WeBOdju8SnzPN5vTUJYxYUxLeXpCaVP5i5e0LF8fg7WORF2Wd7wFX/pk0tYZk7s8T+J7VLy0Da6J1+wCT0AtHg==";
5028 };
5029 };
5030 "num2fraction-1.2.2" = {
5031 name = "num2fraction";
5032 packageName = "num2fraction";
5033 version = "1.2.2";
5034 src = fetchurl {
5035 url = "https://registry.npmjs.org/num2fraction/-/num2fraction-1.2.2.tgz";
5036 sha1 = "6f682b6a027a4e9ddfa4564cd2589d1d4e669ede";
1959 };
5037 };
1960 };
5038 };
1961 "number-is-nan-1.0.1" = {
5039 "number-is-nan-1.0.1" = {
@@ -1985,13 +5063,67 b' let'
1985 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
5063 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
1986 };
5064 };
1987 };
5065 };
1988 "once-1.3.3" = {
5066 "object-copy-0.1.0" = {
1989 name = "once";
5067 name = "object-copy";
1990 packageName = "once";
5068 packageName = "object-copy";
1991 version = "1.3.3";
5069 version = "0.1.0";
1992 src = fetchurl {
5070 src = fetchurl {
1993 url = "https://registry.npmjs.org/once/-/once-1.3.3.tgz";
5071 url = "https://registry.npmjs.org/object-copy/-/object-copy-0.1.0.tgz";
1994 sha1 = "b2e261557ce4c314ec8304f3fa82663e4297ca20";
5072 sha1 = "7e7d858b781bd7c991a41ba975ed3812754e998c";
5073 };
5074 };
5075 "object-keys-1.0.12" = {
5076 name = "object-keys";
5077 packageName = "object-keys";
5078 version = "1.0.12";
5079 src = fetchurl {
5080 url = "https://registry.npmjs.org/object-keys/-/object-keys-1.0.12.tgz";
5081 sha512 = "FTMyFUm2wBcGHnH2eXmz7tC6IwlqQZ6mVZ+6dm6vZ4IQIHjs6FdNsQBuKGPuUUUY6NfJw2PshC08Tn6LzLDOag==";
5082 };
5083 };
5084 "object-visit-1.0.1" = {
5085 name = "object-visit";
5086 packageName = "object-visit";
5087 version = "1.0.1";
5088 src = fetchurl {
5089 url = "https://registry.npmjs.org/object-visit/-/object-visit-1.0.1.tgz";
5090 sha1 = "f79c4493af0c5377b59fe39d395e41042dd045bb";
5091 };
5092 };
5093 "object.defaults-1.1.0" = {
5094 name = "object.defaults";
5095 packageName = "object.defaults";
5096 version = "1.1.0";
5097 src = fetchurl {
5098 url = "https://registry.npmjs.org/object.defaults/-/object.defaults-1.1.0.tgz";
5099 sha1 = "3a7f868334b407dea06da16d88d5cd29e435fecf";
5100 };
5101 };
5102 "object.getownpropertydescriptors-2.0.3" = {
5103 name = "object.getownpropertydescriptors";
5104 packageName = "object.getownpropertydescriptors";
5105 version = "2.0.3";
5106 src = fetchurl {
5107 url = "https://registry.npmjs.org/object.getownpropertydescriptors/-/object.getownpropertydescriptors-2.0.3.tgz";
5108 sha1 = "8758c846f5b407adab0f236e0986f14b051caa16";
5109 };
5110 };
5111 "object.map-1.0.1" = {
5112 name = "object.map";
5113 packageName = "object.map";
5114 version = "1.0.1";
5115 src = fetchurl {
5116 url = "https://registry.npmjs.org/object.map/-/object.map-1.0.1.tgz";
5117 sha1 = "cf83e59dc8fcc0ad5f4250e1f78b3b81bd801d37";
5118 };
5119 };
5120 "object.pick-1.3.0" = {
5121 name = "object.pick";
5122 packageName = "object.pick";
5123 version = "1.3.0";
5124 src = fetchurl {
5125 url = "https://registry.npmjs.org/object.pick/-/object.pick-1.3.0.tgz";
5126 sha1 = "87a10ac4c1694bd2e1cbf53591a66141fb5dd747";
1995 };
5127 };
1996 };
5128 };
1997 "once-1.4.0" = {
5129 "once-1.4.0" = {
@@ -2003,22 +5135,13 b' let'
2003 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
5135 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
2004 };
5136 };
2005 };
5137 };
2006 "optionator-0.8.2" = {
5138 "os-browserify-0.3.0" = {
2007 name = "optionator";
5139 name = "os-browserify";
2008 packageName = "optionator";
5140 packageName = "os-browserify";
2009 version = "0.8.2";
5141 version = "0.3.0";
2010 src = fetchurl {
5142 src = fetchurl {
2011 url = "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz";
5143 url = "https://registry.npmjs.org/os-browserify/-/os-browserify-0.3.0.tgz";
2012 sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
5144 sha1 = "854373c7f5c2315914fc9bfc6bd8238fdda1ec27";
2013 };
2014 };
2015 "optparse-1.0.5" = {
2016 name = "optparse";
2017 packageName = "optparse";
2018 version = "1.0.5";
2019 src = fetchurl {
2020 url = "https://registry.npmjs.org/optparse/-/optparse-1.0.5.tgz";
2021 sha1 = "75e75a96506611eb1c65ba89018ff08a981e2c16";
2022 };
5145 };
2023 };
5146 };
2024 "os-homedir-1.0.2" = {
5147 "os-homedir-1.0.2" = {
@@ -2030,6 +5153,15 b' let'
2030 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
5153 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
2031 };
5154 };
2032 };
5155 };
5156 "os-locale-3.0.1" = {
5157 name = "os-locale";
5158 packageName = "os-locale";
5159 version = "3.0.1";
5160 src = fetchurl {
5161 url = "https://registry.npmjs.org/os-locale/-/os-locale-3.0.1.tgz";
5162 sha512 = "7g5e7dmXPtzcP4bgsZ8ixDVqA7oWYuEz4lOSujeWyliPai4gfVDiFIcwBg3aGCPnmSGfzOKTK3ccPn0CKv3DBw==";
5163 };
5164 };
2033 "os-tmpdir-1.0.2" = {
5165 "os-tmpdir-1.0.2" = {
2034 name = "os-tmpdir";
5166 name = "os-tmpdir";
2035 packageName = "os-tmpdir";
5167 packageName = "os-tmpdir";
@@ -2048,13 +5180,202 b' let'
2048 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
5180 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
2049 };
5181 };
2050 };
5182 };
2051 "parse5-1.5.1" = {
5183 "p-defer-1.0.0" = {
5184 name = "p-defer";
5185 packageName = "p-defer";
5186 version = "1.0.0";
5187 src = fetchurl {
5188 url = "https://registry.npmjs.org/p-defer/-/p-defer-1.0.0.tgz";
5189 sha1 = "9f6eb182f6c9aa8cd743004a7d4f96b196b0fb0c";
5190 };
5191 };
5192 "p-finally-1.0.0" = {
5193 name = "p-finally";
5194 packageName = "p-finally";
5195 version = "1.0.0";
5196 src = fetchurl {
5197 url = "https://registry.npmjs.org/p-finally/-/p-finally-1.0.0.tgz";
5198 sha1 = "3fbcfb15b899a44123b34b6dcc18b724336a2cae";
5199 };
5200 };
5201 "p-is-promise-1.1.0" = {
5202 name = "p-is-promise";
5203 packageName = "p-is-promise";
5204 version = "1.1.0";
5205 src = fetchurl {
5206 url = "https://registry.npmjs.org/p-is-promise/-/p-is-promise-1.1.0.tgz";
5207 sha1 = "9c9456989e9f6588017b0434d56097675c3da05e";
5208 };
5209 };
5210 "p-limit-1.3.0" = {
5211 name = "p-limit";
5212 packageName = "p-limit";
5213 version = "1.3.0";
5214 src = fetchurl {
5215 url = "https://registry.npmjs.org/p-limit/-/p-limit-1.3.0.tgz";
5216 sha512 = "vvcXsLAJ9Dr5rQOPk7toZQZJApBl2K4J6dANSsEuh6QI41JYcsS/qhTGa9ErIUUgK3WNQoJYvylxvjqmiqEA9Q==";
5217 };
5218 };
5219 "p-limit-2.0.0" = {
5220 name = "p-limit";
5221 packageName = "p-limit";
5222 version = "2.0.0";
5223 src = fetchurl {
5224 url = "https://registry.npmjs.org/p-limit/-/p-limit-2.0.0.tgz";
5225 sha512 = "fl5s52lI5ahKCernzzIyAP0QAZbGIovtVHGwpcu1Jr/EpzLVDI2myISHwGqK7m8uQFugVWSrbxH7XnhGtvEc+A==";
5226 };
5227 };
5228 "p-locate-2.0.0" = {
5229 name = "p-locate";
5230 packageName = "p-locate";
5231 version = "2.0.0";
5232 src = fetchurl {
5233 url = "https://registry.npmjs.org/p-locate/-/p-locate-2.0.0.tgz";
5234 sha1 = "20a0103b222a70c8fd39cc2e580680f3dde5ec43";
5235 };
5236 };
5237 "p-locate-3.0.0" = {
5238 name = "p-locate";
5239 packageName = "p-locate";
5240 version = "3.0.0";
5241 src = fetchurl {
5242 url = "https://registry.npmjs.org/p-locate/-/p-locate-3.0.0.tgz";
5243 sha512 = "x+12w/To+4GFfgJhBEpiDcLozRJGegY+Ei7/z0tSLkMmxGZNybVMSfWj9aJn8Z5Fc7dBUNJOOVgPv2H7IwulSQ==";
5244 };
5245 };
5246 "p-try-1.0.0" = {
5247 name = "p-try";
5248 packageName = "p-try";
5249 version = "1.0.0";
5250 src = fetchurl {
5251 url = "https://registry.npmjs.org/p-try/-/p-try-1.0.0.tgz";
5252 sha1 = "cbc79cdbaf8fd4228e13f621f2b1a237c1b207b3";
5253 };
5254 };
5255 "p-try-2.0.0" = {
5256 name = "p-try";
5257 packageName = "p-try";
5258 version = "2.0.0";
5259 src = fetchurl {
5260 url = "https://registry.npmjs.org/p-try/-/p-try-2.0.0.tgz";
5261 sha512 = "hMp0onDKIajHfIkdRk3P4CdCmErkYAxxDtP3Wx/4nZ3aGlau2VKh3mZpcuFkH27WQkL/3WBCPOktzA9ZOAnMQQ==";
5262 };
5263 };
5264 "pako-1.0.6" = {
5265 name = "pako";
5266 packageName = "pako";
5267 version = "1.0.6";
5268 src = fetchurl {
5269 url = "https://registry.npmjs.org/pako/-/pako-1.0.6.tgz";
5270 sha512 = "lQe48YPsMJAig+yngZ87Lus+NF+3mtu7DVOBu6b/gHO1YpKwIj5AWjZ/TOS7i46HD/UixzWb1zeWDZfGZ3iYcg==";
5271 };
5272 };
5273 "parallel-transform-1.1.0" = {
5274 name = "parallel-transform";
5275 packageName = "parallel-transform";
5276 version = "1.1.0";
5277 src = fetchurl {
5278 url = "https://registry.npmjs.org/parallel-transform/-/parallel-transform-1.1.0.tgz";
5279 sha1 = "d410f065b05da23081fcd10f28854c29bda33b06";
5280 };
5281 };
5282 "param-case-2.1.1" = {
5283 name = "param-case";
5284 packageName = "param-case";
5285 version = "2.1.1";
5286 src = fetchurl {
5287 url = "https://registry.npmjs.org/param-case/-/param-case-2.1.1.tgz";
5288 sha1 = "df94fd8cf6531ecf75e6bef9a0858fbc72be2247";
5289 };
5290 };
5291 "parse-asn1-5.1.1" = {
5292 name = "parse-asn1";
5293 packageName = "parse-asn1";
5294 version = "5.1.1";
5295 src = fetchurl {
5296 url = "https://registry.npmjs.org/parse-asn1/-/parse-asn1-5.1.1.tgz";
5297 sha512 = "KPx7flKXg775zZpnp9SxJlz00gTd4BmJ2yJufSc44gMCRrRQ7NSzAcSJQfifuOLgW6bEi+ftrALtsgALeB2Adw==";
5298 };
5299 };
5300 "parse-filepath-1.0.2" = {
5301 name = "parse-filepath";
5302 packageName = "parse-filepath";
5303 version = "1.0.2";
5304 src = fetchurl {
5305 url = "https://registry.npmjs.org/parse-filepath/-/parse-filepath-1.0.2.tgz";
5306 sha1 = "a632127f53aaf3d15876f5872f3ffac763d6c891";
5307 };
5308 };
5309 "parse-passwd-1.0.0" = {
5310 name = "parse-passwd";
5311 packageName = "parse-passwd";
5312 version = "1.0.0";
5313 src = fetchurl {
5314 url = "https://registry.npmjs.org/parse-passwd/-/parse-passwd-1.0.0.tgz";
5315 sha1 = "6d5b934a456993b23d37f40a382d6f1666a8e5c6";
5316 };
5317 };
5318 "parse5-2.2.3" = {
2052 name = "parse5";
5319 name = "parse5";
2053 packageName = "parse5";
5320 packageName = "parse5";
2054 version = "1.5.1";
5321 version = "2.2.3";
2055 src = fetchurl {
5322 src = fetchurl {
2056 url = "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz";
5323 url = "https://registry.npmjs.org/parse5/-/parse5-2.2.3.tgz";
2057 sha1 = "9b7f3b0de32be78dc2401b17573ccaf0f6f59d94";
5324 sha1 = "0c4fc41c1000c5e6b93d48b03f8083837834e9f6";
5325 };
5326 };
5327 "parse5-3.0.3" = {
5328 name = "parse5";
5329 packageName = "parse5";
5330 version = "3.0.3";
5331 src = fetchurl {
5332 url = "https://registry.npmjs.org/parse5/-/parse5-3.0.3.tgz";
5333 sha512 = "rgO9Zg5LLLkfJF9E6CCmXlSE4UVceloys8JrFqCcHloC3usd/kJCyPDwH2SOlzix2j3xaP9sUX3e8+kvkuleAA==";
5334 };
5335 };
5336 "parse5-utils-2.0.0" = {
5337 name = "parse5-utils";
5338 packageName = "parse5-utils";
5339 version = "2.0.0";
5340 src = fetchurl {
5341 url = "https://registry.npmjs.org/parse5-utils/-/parse5-utils-2.0.0.tgz";
5342 sha1 = "c926c1764e2431a450a5941f302db9beaec9d78a";
5343 };
5344 };
5345 "pascalcase-0.1.1" = {
5346 name = "pascalcase";
5347 packageName = "pascalcase";
5348 version = "0.1.1";
5349 src = fetchurl {
5350 url = "https://registry.npmjs.org/pascalcase/-/pascalcase-0.1.1.tgz";
5351 sha1 = "b363e55e8006ca6fe21784d2db22bd15d7917f14";
5352 };
5353 };
5354 "path-browserify-0.0.0" = {
5355 name = "path-browserify";
5356 packageName = "path-browserify";
5357 version = "0.0.0";
5358 src = fetchurl {
5359 url = "https://registry.npmjs.org/path-browserify/-/path-browserify-0.0.0.tgz";
5360 sha1 = "a0b870729aae214005b7d5032ec2cbbb0fb4451a";
5361 };
5362 };
5363 "path-dirname-1.0.2" = {
5364 name = "path-dirname";
5365 packageName = "path-dirname";
5366 version = "1.0.2";
5367 src = fetchurl {
5368 url = "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz";
5369 sha1 = "cc33d24d525e099a5388c0336c6e32b9160609e0";
5370 };
5371 };
5372 "path-exists-3.0.0" = {
5373 name = "path-exists";
5374 packageName = "path-exists";
5375 version = "3.0.0";
5376 src = fetchurl {
5377 url = "https://registry.npmjs.org/path-exists/-/path-exists-3.0.0.tgz";
5378 sha1 = "ce0ebeaa5f78cb18925ea7d810d7b59b010fd515";
2058 };
5379 };
2059 };
5380 };
2060 "path-is-absolute-1.0.1" = {
5381 "path-is-absolute-1.0.1" = {
@@ -2066,13 +5387,58 b' let'
2066 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
5387 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
2067 };
5388 };
2068 };
5389 };
2069 "path-posix-1.0.0" = {
5390 "path-key-2.0.1" = {
2070 name = "path-posix";
5391 name = "path-key";
2071 packageName = "path-posix";
5392 packageName = "path-key";
2072 version = "1.0.0";
5393 version = "2.0.1";
2073 src = fetchurl {
5394 src = fetchurl {
2074 url = "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz";
5395 url = "https://registry.npmjs.org/path-key/-/path-key-2.0.1.tgz";
2075 sha1 = "06b26113f56beab042545a23bfa88003ccac260f";
5396 sha1 = "411cadb574c5a140d3a4b1910d40d80cc9f40b40";
5397 };
5398 };
5399 "path-parse-1.0.6" = {
5400 name = "path-parse";
5401 packageName = "path-parse";
5402 version = "1.0.6";
5403 src = fetchurl {
5404 url = "https://registry.npmjs.org/path-parse/-/path-parse-1.0.6.tgz";
5405 sha512 = "GSmOT2EbHrINBf9SR7CDELwlJ8AENk3Qn7OikK4nFYAu3Ote2+JYNVvkpAEQm3/TLNEJFD/xZJjzyxg3KBWOzw==";
5406 };
5407 };
5408 "path-root-0.1.1" = {
5409 name = "path-root";
5410 packageName = "path-root";
5411 version = "0.1.1";
5412 src = fetchurl {
5413 url = "https://registry.npmjs.org/path-root/-/path-root-0.1.1.tgz";
5414 sha1 = "9a4a6814cac1c0cd73360a95f32083c8ea4745b7";
5415 };
5416 };
5417 "path-root-regex-0.1.2" = {
5418 name = "path-root-regex";
5419 packageName = "path-root-regex";
5420 version = "0.1.2";
5421 src = fetchurl {
5422 url = "https://registry.npmjs.org/path-root-regex/-/path-root-regex-0.1.2.tgz";
5423 sha1 = "bfccdc8df5b12dc52c8b43ec38d18d72c04ba96d";
5424 };
5425 };
5426 "path-type-3.0.0" = {
5427 name = "path-type";
5428 packageName = "path-type";
5429 version = "3.0.0";
5430 src = fetchurl {
5431 url = "https://registry.npmjs.org/path-type/-/path-type-3.0.0.tgz";
5432 sha512 = "T2ZUsdZFHgA3u4e5PfPbjd7HDDpxPnQb5jN0SrDsjNSuVXHJqtwTnWqG0B1jZrgmJ/7lj1EmVIByWt1gxGkWvg==";
5433 };
5434 };
5435 "pbkdf2-3.0.17" = {
5436 name = "pbkdf2";
5437 packageName = "pbkdf2";
5438 version = "3.0.17";
5439 src = fetchurl {
5440 url = "https://registry.npmjs.org/pbkdf2/-/pbkdf2-3.0.17.tgz";
5441 sha512 = "U/il5MsrZp7mGg3mSQfn742na2T+1/vHDCG5/iTI3X9MKUuYUZVLQhyRsg06mCgDBTd57TxzgZt7P+fYfjRLtA==";
2076 };
5442 };
2077 };
5443 };
2078 "pend-1.2.0" = {
5444 "pend-1.2.0" = {
@@ -2111,6 +5477,15 b' let'
2111 sha1 = "efd212a4a3966d3647684ea8ba788549be2aefef";
5477 sha1 = "efd212a4a3966d3647684ea8ba788549be2aefef";
2112 };
5478 };
2113 };
5479 };
5480 "pify-3.0.0" = {
5481 name = "pify";
5482 packageName = "pify";
5483 version = "3.0.0";
5484 src = fetchurl {
5485 url = "https://registry.npmjs.org/pify/-/pify-3.0.0.tgz";
5486 sha1 = "e5a4acd2c101fdf3d9a4d07f0dbc4db49dd28176";
5487 };
5488 };
2114 "pinkie-2.0.4" = {
5489 "pinkie-2.0.4" = {
2115 name = "pinkie";
5490 name = "pinkie";
2116 packageName = "pinkie";
5491 packageName = "pinkie";
@@ -2129,13 +5504,382 b' let'
2129 sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
5504 sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
2130 };
5505 };
2131 };
5506 };
2132 "prelude-ls-1.1.2" = {
5507 "pkg-dir-2.0.0" = {
2133 name = "prelude-ls";
5508 name = "pkg-dir";
2134 packageName = "prelude-ls";
5509 packageName = "pkg-dir";
2135 version = "1.1.2";
5510 version = "2.0.0";
2136 src = fetchurl {
5511 src = fetchurl {
2137 url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
5512 url = "https://registry.npmjs.org/pkg-dir/-/pkg-dir-2.0.0.tgz";
2138 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
5513 sha1 = "f6d5d1109e19d63edf428e0bd57e12777615334b";
5514 };
5515 };
5516 "pkg-dir-3.0.0" = {
5517 name = "pkg-dir";
5518 packageName = "pkg-dir";
5519 version = "3.0.0";
5520 src = fetchurl {
5521 url = "https://registry.npmjs.org/pkg-dir/-/pkg-dir-3.0.0.tgz";
5522 sha512 = "/E57AYkoeQ25qkxMj5PBOVgF8Kiu/h7cYS30Z5+R7WaiCCBfLq58ZI/dSeaEKb9WVJV5n/03QwrN3IeWIFllvw==";
5523 };
5524 };
5525 "polymer-webpack-loader-2.0.3" = {
5526 name = "polymer-webpack-loader";
5527 packageName = "polymer-webpack-loader";
5528 version = "2.0.3";
5529 src = fetchurl {
5530 url = "https://registry.npmjs.org/polymer-webpack-loader/-/polymer-webpack-loader-2.0.3.tgz";
5531 sha512 = "3SR+/qVAGeVKltvsSMA+euGdLwj8ZZJnwd5NvXRvbdQ7yO57sdcTpRw3d34pTc9YTZxncW/kozuI/9bHjr/rdg==";
5532 };
5533 };
5534 "posix-character-classes-0.1.1" = {
5535 name = "posix-character-classes";
5536 packageName = "posix-character-classes";
5537 version = "0.1.1";
5538 src = fetchurl {
5539 url = "https://registry.npmjs.org/posix-character-classes/-/posix-character-classes-0.1.1.tgz";
5540 sha1 = "01eac0fe3b5af71a2a6c02feabb8c1fef7e00eab";
5541 };
5542 };
5543 "postcss-5.2.18" = {
5544 name = "postcss";
5545 packageName = "postcss";
5546 version = "5.2.18";
5547 src = fetchurl {
5548 url = "https://registry.npmjs.org/postcss/-/postcss-5.2.18.tgz";
5549 sha512 = "zrUjRRe1bpXKsX1qAJNJjqZViErVuyEkMTRrwu4ud4sbTtIBRmtaYDrHmcGgmrbsW3MHfmtIf+vJumgQn+PrXg==";
5550 };
5551 };
5552 "postcss-6.0.23" = {
5553 name = "postcss";
5554 packageName = "postcss";
5555 version = "6.0.23";
5556 src = fetchurl {
5557 url = "https://registry.npmjs.org/postcss/-/postcss-6.0.23.tgz";
5558 sha512 = "soOk1h6J3VMTZtVeVpv15/Hpdl2cBLX3CAw4TAbkpTJiNPk9YP/zWcD1ND+xEtvyuuvKzbxliTOIyvkSeSJ6ag==";
5559 };
5560 };
5561 "postcss-calc-5.3.1" = {
5562 name = "postcss-calc";
5563 packageName = "postcss-calc";
5564 version = "5.3.1";
5565 src = fetchurl {
5566 url = "https://registry.npmjs.org/postcss-calc/-/postcss-calc-5.3.1.tgz";
5567 sha1 = "77bae7ca928ad85716e2fda42f261bf7c1d65b5e";
5568 };
5569 };
5570 "postcss-colormin-2.2.2" = {
5571 name = "postcss-colormin";
5572 packageName = "postcss-colormin";
5573 version = "2.2.2";
5574 src = fetchurl {
5575 url = "https://registry.npmjs.org/postcss-colormin/-/postcss-colormin-2.2.2.tgz";
5576 sha1 = "6631417d5f0e909a3d7ec26b24c8a8d1e4f96e4b";
5577 };
5578 };
5579 "postcss-convert-values-2.6.1" = {
5580 name = "postcss-convert-values";
5581 packageName = "postcss-convert-values";
5582 version = "2.6.1";
5583 src = fetchurl {
5584 url = "https://registry.npmjs.org/postcss-convert-values/-/postcss-convert-values-2.6.1.tgz";
5585 sha1 = "bbd8593c5c1fd2e3d1c322bb925dcae8dae4d62d";
5586 };
5587 };
5588 "postcss-discard-comments-2.0.4" = {
5589 name = "postcss-discard-comments";
5590 packageName = "postcss-discard-comments";
5591 version = "2.0.4";
5592 src = fetchurl {
5593 url = "https://registry.npmjs.org/postcss-discard-comments/-/postcss-discard-comments-2.0.4.tgz";
5594 sha1 = "befe89fafd5b3dace5ccce51b76b81514be00e3d";
5595 };
5596 };
5597 "postcss-discard-duplicates-2.1.0" = {
5598 name = "postcss-discard-duplicates";
5599 packageName = "postcss-discard-duplicates";
5600 version = "2.1.0";
5601 src = fetchurl {
5602 url = "https://registry.npmjs.org/postcss-discard-duplicates/-/postcss-discard-duplicates-2.1.0.tgz";
5603 sha1 = "b9abf27b88ac188158a5eb12abcae20263b91932";
5604 };
5605 };
5606 "postcss-discard-empty-2.1.0" = {
5607 name = "postcss-discard-empty";
5608 packageName = "postcss-discard-empty";
5609 version = "2.1.0";
5610 src = fetchurl {
5611 url = "https://registry.npmjs.org/postcss-discard-empty/-/postcss-discard-empty-2.1.0.tgz";
5612 sha1 = "d2b4bd9d5ced5ebd8dcade7640c7d7cd7f4f92b5";
5613 };
5614 };
5615 "postcss-discard-overridden-0.1.1" = {
5616 name = "postcss-discard-overridden";
5617 packageName = "postcss-discard-overridden";
5618 version = "0.1.1";
5619 src = fetchurl {
5620 url = "https://registry.npmjs.org/postcss-discard-overridden/-/postcss-discard-overridden-0.1.1.tgz";
5621 sha1 = "8b1eaf554f686fb288cd874c55667b0aa3668d58";
5622 };
5623 };
5624 "postcss-discard-unused-2.2.3" = {
5625 name = "postcss-discard-unused";
5626 packageName = "postcss-discard-unused";
5627 version = "2.2.3";
5628 src = fetchurl {
5629 url = "https://registry.npmjs.org/postcss-discard-unused/-/postcss-discard-unused-2.2.3.tgz";
5630 sha1 = "bce30b2cc591ffc634322b5fb3464b6d934f4433";
5631 };
5632 };
5633 "postcss-filter-plugins-2.0.3" = {
5634 name = "postcss-filter-plugins";
5635 packageName = "postcss-filter-plugins";
5636 version = "2.0.3";
5637 src = fetchurl {
5638 url = "https://registry.npmjs.org/postcss-filter-plugins/-/postcss-filter-plugins-2.0.3.tgz";
5639 sha512 = "T53GVFsdinJhgwm7rg1BzbeBRomOg9y5MBVhGcsV0CxurUdVj1UlPdKtn7aqYA/c/QVkzKMjq2bSV5dKG5+AwQ==";
5640 };
5641 };
5642 "postcss-merge-idents-2.1.7" = {
5643 name = "postcss-merge-idents";
5644 packageName = "postcss-merge-idents";
5645 version = "2.1.7";
5646 src = fetchurl {
5647 url = "https://registry.npmjs.org/postcss-merge-idents/-/postcss-merge-idents-2.1.7.tgz";
5648 sha1 = "4c5530313c08e1d5b3bbf3d2bbc747e278eea270";
5649 };
5650 };
5651 "postcss-merge-longhand-2.0.2" = {
5652 name = "postcss-merge-longhand";
5653 packageName = "postcss-merge-longhand";
5654 version = "2.0.2";
5655 src = fetchurl {
5656 url = "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-2.0.2.tgz";
5657 sha1 = "23d90cd127b0a77994915332739034a1a4f3d658";
5658 };
5659 };
5660 "postcss-merge-rules-2.1.2" = {
5661 name = "postcss-merge-rules";
5662 packageName = "postcss-merge-rules";
5663 version = "2.1.2";
5664 src = fetchurl {
5665 url = "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-2.1.2.tgz";
5666 sha1 = "d1df5dfaa7b1acc3be553f0e9e10e87c61b5f721";
5667 };
5668 };
5669 "postcss-message-helpers-2.0.0" = {
5670 name = "postcss-message-helpers";
5671 packageName = "postcss-message-helpers";
5672 version = "2.0.0";
5673 src = fetchurl {
5674 url = "https://registry.npmjs.org/postcss-message-helpers/-/postcss-message-helpers-2.0.0.tgz";
5675 sha1 = "a4f2f4fab6e4fe002f0aed000478cdf52f9ba60e";
5676 };
5677 };
5678 "postcss-minify-font-values-1.0.5" = {
5679 name = "postcss-minify-font-values";
5680 packageName = "postcss-minify-font-values";
5681 version = "1.0.5";
5682 src = fetchurl {
5683 url = "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-1.0.5.tgz";
5684 sha1 = "4b58edb56641eba7c8474ab3526cafd7bbdecb69";
5685 };
5686 };
5687 "postcss-minify-gradients-1.0.5" = {
5688 name = "postcss-minify-gradients";
5689 packageName = "postcss-minify-gradients";
5690 version = "1.0.5";
5691 src = fetchurl {
5692 url = "https://registry.npmjs.org/postcss-minify-gradients/-/postcss-minify-gradients-1.0.5.tgz";
5693 sha1 = "5dbda11373703f83cfb4a3ea3881d8d75ff5e6e1";
5694 };
5695 };
5696 "postcss-minify-params-1.2.2" = {
5697 name = "postcss-minify-params";
5698 packageName = "postcss-minify-params";
5699 version = "1.2.2";
5700 src = fetchurl {
5701 url = "https://registry.npmjs.org/postcss-minify-params/-/postcss-minify-params-1.2.2.tgz";
5702 sha1 = "ad2ce071373b943b3d930a3fa59a358c28d6f1f3";
5703 };
5704 };
5705 "postcss-minify-selectors-2.1.1" = {
5706 name = "postcss-minify-selectors";
5707 packageName = "postcss-minify-selectors";
5708 version = "2.1.1";
5709 src = fetchurl {
5710 url = "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-2.1.1.tgz";
5711 sha1 = "b2c6a98c0072cf91b932d1a496508114311735bf";
5712 };
5713 };
5714 "postcss-modules-extract-imports-1.2.0" = {
5715 name = "postcss-modules-extract-imports";
5716 packageName = "postcss-modules-extract-imports";
5717 version = "1.2.0";
5718 src = fetchurl {
5719 url = "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-1.2.0.tgz";
5720 sha1 = "66140ecece38ef06bf0d3e355d69bf59d141ea85";
5721 };
5722 };
5723 "postcss-modules-local-by-default-1.2.0" = {
5724 name = "postcss-modules-local-by-default";
5725 packageName = "postcss-modules-local-by-default";
5726 version = "1.2.0";
5727 src = fetchurl {
5728 url = "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-1.2.0.tgz";
5729 sha1 = "f7d80c398c5a393fa7964466bd19500a7d61c069";
5730 };
5731 };
5732 "postcss-modules-scope-1.1.0" = {
5733 name = "postcss-modules-scope";
5734 packageName = "postcss-modules-scope";
5735 version = "1.1.0";
5736 src = fetchurl {
5737 url = "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-1.1.0.tgz";
5738 sha1 = "d6ea64994c79f97b62a72b426fbe6056a194bb90";
5739 };
5740 };
5741 "postcss-modules-values-1.3.0" = {
5742 name = "postcss-modules-values";
5743 packageName = "postcss-modules-values";
5744 version = "1.3.0";
5745 src = fetchurl {
5746 url = "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-1.3.0.tgz";
5747 sha1 = "ecffa9d7e192518389f42ad0e83f72aec456ea20";
5748 };
5749 };
5750 "postcss-normalize-charset-1.1.1" = {
5751 name = "postcss-normalize-charset";
5752 packageName = "postcss-normalize-charset";
5753 version = "1.1.1";
5754 src = fetchurl {
5755 url = "https://registry.npmjs.org/postcss-normalize-charset/-/postcss-normalize-charset-1.1.1.tgz";
5756 sha1 = "ef9ee71212d7fe759c78ed162f61ed62b5cb93f1";
5757 };
5758 };
5759 "postcss-normalize-url-3.0.8" = {
5760 name = "postcss-normalize-url";
5761 packageName = "postcss-normalize-url";
5762 version = "3.0.8";
5763 src = fetchurl {
5764 url = "https://registry.npmjs.org/postcss-normalize-url/-/postcss-normalize-url-3.0.8.tgz";
5765 sha1 = "108f74b3f2fcdaf891a2ffa3ea4592279fc78222";
5766 };
5767 };
5768 "postcss-ordered-values-2.2.3" = {
5769 name = "postcss-ordered-values";
5770 packageName = "postcss-ordered-values";
5771 version = "2.2.3";
5772 src = fetchurl {
5773 url = "https://registry.npmjs.org/postcss-ordered-values/-/postcss-ordered-values-2.2.3.tgz";
5774 sha1 = "eec6c2a67b6c412a8db2042e77fe8da43f95c11d";
5775 };
5776 };
5777 "postcss-reduce-idents-2.4.0" = {
5778 name = "postcss-reduce-idents";
5779 packageName = "postcss-reduce-idents";
5780 version = "2.4.0";
5781 src = fetchurl {
5782 url = "https://registry.npmjs.org/postcss-reduce-idents/-/postcss-reduce-idents-2.4.0.tgz";
5783 sha1 = "c2c6d20cc958284f6abfbe63f7609bf409059ad3";
5784 };
5785 };
5786 "postcss-reduce-initial-1.0.1" = {
5787 name = "postcss-reduce-initial";
5788 packageName = "postcss-reduce-initial";
5789 version = "1.0.1";
5790 src = fetchurl {
5791 url = "https://registry.npmjs.org/postcss-reduce-initial/-/postcss-reduce-initial-1.0.1.tgz";
5792 sha1 = "68f80695f045d08263a879ad240df8dd64f644ea";
5793 };
5794 };
5795 "postcss-reduce-transforms-1.0.4" = {
5796 name = "postcss-reduce-transforms";
5797 packageName = "postcss-reduce-transforms";
5798 version = "1.0.4";
5799 src = fetchurl {
5800 url = "https://registry.npmjs.org/postcss-reduce-transforms/-/postcss-reduce-transforms-1.0.4.tgz";
5801 sha1 = "ff76f4d8212437b31c298a42d2e1444025771ae1";
5802 };
5803 };
5804 "postcss-selector-parser-2.2.3" = {
5805 name = "postcss-selector-parser";
5806 packageName = "postcss-selector-parser";
5807 version = "2.2.3";
5808 src = fetchurl {
5809 url = "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-2.2.3.tgz";
5810 sha1 = "f9437788606c3c9acee16ffe8d8b16297f27bb90";
5811 };
5812 };
5813 "postcss-svgo-2.1.6" = {
5814 name = "postcss-svgo";
5815 packageName = "postcss-svgo";
5816 version = "2.1.6";
5817 src = fetchurl {
5818 url = "https://registry.npmjs.org/postcss-svgo/-/postcss-svgo-2.1.6.tgz";
5819 sha1 = "b6df18aa613b666e133f08adb5219c2684ac108d";
5820 };
5821 };
5822 "postcss-unique-selectors-2.0.2" = {
5823 name = "postcss-unique-selectors";
5824 packageName = "postcss-unique-selectors";
5825 version = "2.0.2";
5826 src = fetchurl {
5827 url = "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-2.0.2.tgz";
5828 sha1 = "981d57d29ddcb33e7b1dfe1fd43b8649f933ca1d";
5829 };
5830 };
5831 "postcss-value-parser-3.3.1" = {
5832 name = "postcss-value-parser";
5833 packageName = "postcss-value-parser";
5834 version = "3.3.1";
5835 src = fetchurl {
5836 url = "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-3.3.1.tgz";
5837 sha512 = "pISE66AbVkp4fDQ7VHBwRNXzAAKJjw4Vw7nWI/+Q3vuly7SNfgYXvm6i5IgFylHGK5sP/xHAbB7N49OS4gWNyQ==";
5838 };
5839 };
5840 "postcss-zindex-2.2.0" = {
5841 name = "postcss-zindex";
5842 packageName = "postcss-zindex";
5843 version = "2.2.0";
5844 src = fetchurl {
5845 url = "https://registry.npmjs.org/postcss-zindex/-/postcss-zindex-2.2.0.tgz";
5846 sha1 = "d2109ddc055b91af67fc4cb3b025946639d2af22";
5847 };
5848 };
5849 "prepend-http-1.0.4" = {
5850 name = "prepend-http";
5851 packageName = "prepend-http";
5852 version = "1.0.4";
5853 src = fetchurl {
5854 url = "https://registry.npmjs.org/prepend-http/-/prepend-http-1.0.4.tgz";
5855 sha1 = "d4f4562b0ce3696e41ac52d0e002e57a635dc6dc";
5856 };
5857 };
5858 "pretty-error-2.1.1" = {
5859 name = "pretty-error";
5860 packageName = "pretty-error";
5861 version = "2.1.1";
5862 src = fetchurl {
5863 url = "https://registry.npmjs.org/pretty-error/-/pretty-error-2.1.1.tgz";
5864 sha1 = "5f4f87c8f91e5ae3f3ba87ab4cf5e03b1a17f1a3";
5865 };
5866 };
5867 "private-0.1.8" = {
5868 name = "private";
5869 packageName = "private";
5870 version = "0.1.8";
5871 src = fetchurl {
5872 url = "https://registry.npmjs.org/private/-/private-0.1.8.tgz";
5873 sha512 = "VvivMrbvd2nKkiG38qjULzlc+4Vx4wm/whI9pQD35YrARNnhxeiRktSOhSukRLFNlzg6Br/cJPet5J/u19r/mg==";
5874 };
5875 };
5876 "process-0.11.10" = {
5877 name = "process";
5878 packageName = "process";
5879 version = "0.11.10";
5880 src = fetchurl {
5881 url = "https://registry.npmjs.org/process/-/process-0.11.10.tgz";
5882 sha1 = "7332300e840161bda3e69a1d1d91a7d4bc16f182";
2139 };
5883 };
2140 };
5884 };
2141 "process-nextick-args-2.0.0" = {
5885 "process-nextick-args-2.0.0" = {
@@ -2165,13 +5909,13 b' let'
2165 sha512 = "nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==";
5909 sha512 = "nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==";
2166 };
5910 };
2167 };
5911 };
2168 "proto-list-1.2.4" = {
5912 "promise-inflight-1.0.1" = {
2169 name = "proto-list";
5913 name = "promise-inflight";
2170 packageName = "proto-list";
5914 packageName = "promise-inflight";
2171 version = "1.2.4";
5915 version = "1.0.1";
2172 src = fetchurl {
5916 src = fetchurl {
2173 url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz";
5917 url = "https://registry.npmjs.org/promise-inflight/-/promise-inflight-1.0.1.tgz";
2174 sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
5918 sha1 = "98472870bf228132fcbdd868129bad12c3c029e3";
2175 };
5919 };
2176 };
5920 };
2177 "prr-1.0.1" = {
5921 "prr-1.0.1" = {
@@ -2183,6 +5927,51 b' let'
2183 sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
5927 sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
2184 };
5928 };
2185 };
5929 };
5930 "pseudomap-1.0.2" = {
5931 name = "pseudomap";
5932 packageName = "pseudomap";
5933 version = "1.0.2";
5934 src = fetchurl {
5935 url = "https://registry.npmjs.org/pseudomap/-/pseudomap-1.0.2.tgz";
5936 sha1 = "f052a28da70e618917ef0a8ac34c1ae5a68286b3";
5937 };
5938 };
5939 "public-encrypt-4.0.3" = {
5940 name = "public-encrypt";
5941 packageName = "public-encrypt";
5942 version = "4.0.3";
5943 src = fetchurl {
5944 url = "https://registry.npmjs.org/public-encrypt/-/public-encrypt-4.0.3.tgz";
5945 sha512 = "zVpa8oKZSz5bTMTFClc1fQOnyyEzpl5ozpi1B5YcvBrdohMjH2rfsBtyXcuNuwjsDIXmBYlF2N5FlJYhR29t8Q==";
5946 };
5947 };
5948 "pump-2.0.1" = {
5949 name = "pump";
5950 packageName = "pump";
5951 version = "2.0.1";
5952 src = fetchurl {
5953 url = "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz";
5954 sha512 = "ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==";
5955 };
5956 };
5957 "pumpify-1.5.1" = {
5958 name = "pumpify";
5959 packageName = "pumpify";
5960 version = "1.5.1";
5961 src = fetchurl {
5962 url = "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz";
5963 sha512 = "oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==";
5964 };
5965 };
5966 "punycode-1.3.2" = {
5967 name = "punycode";
5968 packageName = "punycode";
5969 version = "1.3.2";
5970 src = fetchurl {
5971 url = "https://registry.npmjs.org/punycode/-/punycode-1.3.2.tgz";
5972 sha1 = "9653a036fb7c1ee42342f2325cceefea3926c48d";
5973 };
5974 };
2186 "punycode-1.4.1" = {
5975 "punycode-1.4.1" = {
2187 name = "punycode";
5976 name = "punycode";
2188 packageName = "punycode";
5977 packageName = "punycode";
@@ -2192,6 +5981,24 b' let'
2192 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
5981 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
2193 };
5982 };
2194 };
5983 };
5984 "punycode-2.1.1" = {
5985 name = "punycode";
5986 packageName = "punycode";
5987 version = "2.1.1";
5988 src = fetchurl {
5989 url = "https://registry.npmjs.org/punycode/-/punycode-2.1.1.tgz";
5990 sha512 = "XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==";
5991 };
5992 };
5993 "q-1.5.1" = {
5994 name = "q";
5995 packageName = "q";
5996 version = "1.5.1";
5997 src = fetchurl {
5998 url = "https://registry.npmjs.org/q/-/q-1.5.1.tgz";
5999 sha1 = "7e32f75b41381291d04611f1bf14109ac00651d7";
6000 };
6001 };
2195 "qrious-4.0.2" = {
6002 "qrious-4.0.2" = {
2196 name = "qrious";
6003 name = "qrious";
2197 packageName = "qrious";
6004 packageName = "qrious";
@@ -2219,6 +6026,69 b' let'
2219 sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
6026 sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
2220 };
6027 };
2221 };
6028 };
6029 "query-string-4.3.4" = {
6030 name = "query-string";
6031 packageName = "query-string";
6032 version = "4.3.4";
6033 src = fetchurl {
6034 url = "https://registry.npmjs.org/query-string/-/query-string-4.3.4.tgz";
6035 sha1 = "bbb693b9ca915c232515b228b1a02b609043dbeb";
6036 };
6037 };
6038 "querystring-0.2.0" = {
6039 name = "querystring";
6040 packageName = "querystring";
6041 version = "0.2.0";
6042 src = fetchurl {
6043 url = "https://registry.npmjs.org/querystring/-/querystring-0.2.0.tgz";
6044 sha1 = "b209849203bb25df820da756e747005878521620";
6045 };
6046 };
6047 "querystring-es3-0.2.1" = {
6048 name = "querystring-es3";
6049 packageName = "querystring-es3";
6050 version = "0.2.1";
6051 src = fetchurl {
6052 url = "https://registry.npmjs.org/querystring-es3/-/querystring-es3-0.2.1.tgz";
6053 sha1 = "9ec61f79049875707d69414596fd907a4d711e73";
6054 };
6055 };
6056 "randombytes-2.0.6" = {
6057 name = "randombytes";
6058 packageName = "randombytes";
6059 version = "2.0.6";
6060 src = fetchurl {
6061 url = "https://registry.npmjs.org/randombytes/-/randombytes-2.0.6.tgz";
6062 sha512 = "CIQ5OFxf4Jou6uOKe9t1AOgqpeU5fd70A8NPdHSGeYXqXsPe6peOwI0cUl88RWZ6sP1vPMV3avd/R6cZ5/sP1A==";
6063 };
6064 };
6065 "randomfill-1.0.4" = {
6066 name = "randomfill";
6067 packageName = "randomfill";
6068 version = "1.0.4";
6069 src = fetchurl {
6070 url = "https://registry.npmjs.org/randomfill/-/randomfill-1.0.4.tgz";
6071 sha512 = "87lcbR8+MhcWcUiQ+9e+Rwx8MyR2P7qnt15ynUlbm3TU/fjbgz4GsvfSUDTemtCCtVCqb4ZcEFlyPNTh9bBTLw==";
6072 };
6073 };
6074 "raw-loader-1.0.0-beta.0" = {
6075 name = "raw-loader";
6076 packageName = "raw-loader";
6077 version = "1.0.0-beta.0";
6078 src = fetchurl {
6079 url = "https://registry.npmjs.org/raw-loader/-/raw-loader-1.0.0-beta.0.tgz";
6080 sha512 = "guh4ZNAf96f+CDwfnPbFeFiO5YcfPllUmZrgcoOmx6iqZPq+DcKbnyjPuBxEAtQ3tqqd++qChsQfQB+VBzFT0Q==";
6081 };
6082 };
6083 "readable-stream-1.0.34" = {
6084 name = "readable-stream";
6085 packageName = "readable-stream";
6086 version = "1.0.34";
6087 src = fetchurl {
6088 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz";
6089 sha1 = "125820e34bc842d2f2aaafafe4c2916ee32c157c";
6090 };
6091 };
2222 "readable-stream-1.1.14" = {
6092 "readable-stream-1.1.14" = {
2223 name = "readable-stream";
6093 name = "readable-stream";
2224 packageName = "readable-stream";
6094 packageName = "readable-stream";
@@ -2237,22 +6107,58 b' let'
2237 sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==";
6107 sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==";
2238 };
6108 };
2239 };
6109 };
2240 "reduce-flatten-1.0.1" = {
6110 "readdirp-2.2.1" = {
2241 name = "reduce-flatten";
6111 name = "readdirp";
2242 packageName = "reduce-flatten";
6112 packageName = "readdirp";
2243 version = "1.0.1";
6113 version = "2.2.1";
2244 src = fetchurl {
6114 src = fetchurl {
2245 url = "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz";
6115 url = "https://registry.npmjs.org/readdirp/-/readdirp-2.2.1.tgz";
2246 sha1 = "258c78efd153ddf93cb561237f61184f3696e327";
6116 sha512 = "1JU/8q+VgFZyxwrJ+SVIOsh+KywWGpds3NTqikiKpDMZWScmAYyKIgqkO+ARvNWJfXeXR1zxz7aHF4u4CyH6vQ==";
2247 };
6117 };
2248 };
6118 };
2249 "regenerator-runtime-0.10.5" = {
6119 "recast-0.11.23" = {
2250 name = "regenerator-runtime";
6120 name = "recast";
2251 packageName = "regenerator-runtime";
6121 packageName = "recast";
2252 version = "0.10.5";
6122 version = "0.11.23";
2253 src = fetchurl {
6123 src = fetchurl {
2254 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz";
6124 url = "https://registry.npmjs.org/recast/-/recast-0.11.23.tgz";
2255 sha1 = "336c3efc1220adcedda2c9fab67b5a7955a33658";
6125 sha1 = "451fd3004ab1e4df9b4e4b66376b2a21912462d3";
6126 };
6127 };
6128 "rechoir-0.6.2" = {
6129 name = "rechoir";
6130 packageName = "rechoir";
6131 version = "0.6.2";
6132 src = fetchurl {
6133 url = "https://registry.npmjs.org/rechoir/-/rechoir-0.6.2.tgz";
6134 sha1 = "85204b54dba82d5742e28c96756ef43af50e3384";
6135 };
6136 };
6137 "reduce-css-calc-1.3.0" = {
6138 name = "reduce-css-calc";
6139 packageName = "reduce-css-calc";
6140 version = "1.3.0";
6141 src = fetchurl {
6142 url = "https://registry.npmjs.org/reduce-css-calc/-/reduce-css-calc-1.3.0.tgz";
6143 sha1 = "747c914e049614a4c9cfbba629871ad1d2927716";
6144 };
6145 };
6146 "reduce-function-call-1.0.2" = {
6147 name = "reduce-function-call";
6148 packageName = "reduce-function-call";
6149 version = "1.0.2";
6150 src = fetchurl {
6151 url = "https://registry.npmjs.org/reduce-function-call/-/reduce-function-call-1.0.2.tgz";
6152 sha1 = "5a200bf92e0e37751752fe45b0ab330fd4b6be99";
6153 };
6154 };
6155 "regenerate-1.4.0" = {
6156 name = "regenerate";
6157 packageName = "regenerate";
6158 version = "1.4.0";
6159 src = fetchurl {
6160 url = "https://registry.npmjs.org/regenerate/-/regenerate-1.4.0.tgz";
6161 sha512 = "1G6jJVDWrt0rK99kBjvEtziZNCICAuvIPkSiUFIQxVP06RCVpq3dmDo2oi6ABpYaDYaTRr67BEhL8r1wgEZZKg==";
2256 };
6162 };
2257 };
6163 };
2258 "regenerator-runtime-0.11.1" = {
6164 "regenerator-runtime-0.11.1" = {
@@ -2264,6 +6170,114 b' let'
2264 sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
6170 sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
2265 };
6171 };
2266 };
6172 };
6173 "regenerator-transform-0.10.1" = {
6174 name = "regenerator-transform";
6175 packageName = "regenerator-transform";
6176 version = "0.10.1";
6177 src = fetchurl {
6178 url = "https://registry.npmjs.org/regenerator-transform/-/regenerator-transform-0.10.1.tgz";
6179 sha512 = "PJepbvDbuK1xgIgnau7Y90cwaAmO/LCLMI2mPvaXq2heGMR3aWW5/BQvYrhJ8jgmQjXewXvBjzfqKcVOmhjZ6Q==";
6180 };
6181 };
6182 "regex-not-1.0.2" = {
6183 name = "regex-not";
6184 packageName = "regex-not";
6185 version = "1.0.2";
6186 src = fetchurl {
6187 url = "https://registry.npmjs.org/regex-not/-/regex-not-1.0.2.tgz";
6188 sha512 = "J6SDjUgDxQj5NusnOtdFxDwN/+HWykR8GELwctJ7mdqhcyy1xEc4SRFHUXvxTp661YaVKAjfRLZ9cCqS6tn32A==";
6189 };
6190 };
6191 "regexpu-core-1.0.0" = {
6192 name = "regexpu-core";
6193 packageName = "regexpu-core";
6194 version = "1.0.0";
6195 src = fetchurl {
6196 url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-1.0.0.tgz";
6197 sha1 = "86a763f58ee4d7c2f6b102e4764050de7ed90c6b";
6198 };
6199 };
6200 "regexpu-core-2.0.0" = {
6201 name = "regexpu-core";
6202 packageName = "regexpu-core";
6203 version = "2.0.0";
6204 src = fetchurl {
6205 url = "https://registry.npmjs.org/regexpu-core/-/regexpu-core-2.0.0.tgz";
6206 sha1 = "49d038837b8dcf8bfa5b9a42139938e6ea2ae240";
6207 };
6208 };
6209 "regjsgen-0.2.0" = {
6210 name = "regjsgen";
6211 packageName = "regjsgen";
6212 version = "0.2.0";
6213 src = fetchurl {
6214 url = "https://registry.npmjs.org/regjsgen/-/regjsgen-0.2.0.tgz";
6215 sha1 = "6c016adeac554f75823fe37ac05b92d5a4edb1f7";
6216 };
6217 };
6218 "regjsparser-0.1.5" = {
6219 name = "regjsparser";
6220 packageName = "regjsparser";
6221 version = "0.1.5";
6222 src = fetchurl {
6223 url = "https://registry.npmjs.org/regjsparser/-/regjsparser-0.1.5.tgz";
6224 sha1 = "7ee8f84dc6fa792d3fd0ae228d24bd949ead205c";
6225 };
6226 };
6227 "relateurl-0.2.7" = {
6228 name = "relateurl";
6229 packageName = "relateurl";
6230 version = "0.2.7";
6231 src = fetchurl {
6232 url = "https://registry.npmjs.org/relateurl/-/relateurl-0.2.7.tgz";
6233 sha1 = "54dbf377e51440aca90a4cd274600d3ff2d888a9";
6234 };
6235 };
6236 "remove-trailing-separator-1.1.0" = {
6237 name = "remove-trailing-separator";
6238 packageName = "remove-trailing-separator";
6239 version = "1.1.0";
6240 src = fetchurl {
6241 url = "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz";
6242 sha1 = "c24bce2a283adad5bc3f58e0d48249b92379d8ef";
6243 };
6244 };
6245 "renderkid-2.0.2" = {
6246 name = "renderkid";
6247 packageName = "renderkid";
6248 version = "2.0.2";
6249 src = fetchurl {
6250 url = "https://registry.npmjs.org/renderkid/-/renderkid-2.0.2.tgz";
6251 sha512 = "FsygIxevi1jSiPY9h7vZmBFUbAOcbYm9UwyiLNdVsLRs/5We9Ob5NMPbGYUTWiLq5L+ezlVdE0A8bbME5CWTpg==";
6252 };
6253 };
6254 "repeat-element-1.1.3" = {
6255 name = "repeat-element";
6256 packageName = "repeat-element";
6257 version = "1.1.3";
6258 src = fetchurl {
6259 url = "https://registry.npmjs.org/repeat-element/-/repeat-element-1.1.3.tgz";
6260 sha512 = "ahGq0ZnV5m5XtZLMb+vP76kcAM5nkLqk0lpqAuojSKGgQtn4eRi4ZZGm2olo2zKFH+sMsWaqOCW1dqAnOru72g==";
6261 };
6262 };
6263 "repeat-string-1.6.1" = {
6264 name = "repeat-string";
6265 packageName = "repeat-string";
6266 version = "1.6.1";
6267 src = fetchurl {
6268 url = "https://registry.npmjs.org/repeat-string/-/repeat-string-1.6.1.tgz";
6269 sha1 = "8dcae470e1c88abc2d600fff4a776286da75e637";
6270 };
6271 };
6272 "repeating-2.0.1" = {
6273 name = "repeating";
6274 packageName = "repeating";
6275 version = "2.0.1";
6276 src = fetchurl {
6277 url = "https://registry.npmjs.org/repeating/-/repeating-2.0.1.tgz";
6278 sha1 = "5214c53a926d3552707527fbab415dbc08d06dda";
6279 };
6280 };
2267 "request-2.81.0" = {
6281 "request-2.81.0" = {
2268 name = "request";
6282 name = "request";
2269 packageName = "request";
6283 packageName = "request";
@@ -2282,13 +6296,85 b' let'
2282 sha1 = "5d36bb57961c673aa5b788dbc8141fdf23b44e08";
6296 sha1 = "5d36bb57961c673aa5b788dbc8141fdf23b44e08";
2283 };
6297 };
2284 };
6298 };
2285 "retry-0.10.1" = {
6299 "require-directory-2.1.1" = {
2286 name = "retry";
6300 name = "require-directory";
2287 packageName = "retry";
6301 packageName = "require-directory";
2288 version = "0.10.1";
6302 version = "2.1.1";
2289 src = fetchurl {
6303 src = fetchurl {
2290 url = "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz";
6304 url = "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz";
2291 sha1 = "e76388d217992c252750241d3d3956fed98d8ff4";
6305 sha1 = "8c64ad5fd30dab1c976e2344ffe7f792a6a6df42";
6306 };
6307 };
6308 "require-main-filename-1.0.1" = {
6309 name = "require-main-filename";
6310 packageName = "require-main-filename";
6311 version = "1.0.1";
6312 src = fetchurl {
6313 url = "https://registry.npmjs.org/require-main-filename/-/require-main-filename-1.0.1.tgz";
6314 sha1 = "97f717b69d48784f5f526a6c5aa8ffdda055a4d1";
6315 };
6316 };
6317 "resolve-1.8.1" = {
6318 name = "resolve";
6319 packageName = "resolve";
6320 version = "1.8.1";
6321 src = fetchurl {
6322 url = "https://registry.npmjs.org/resolve/-/resolve-1.8.1.tgz";
6323 sha512 = "AicPrAC7Qu1JxPCZ9ZgCZlY35QgFnNqc+0LtbRNxnVw4TXvjQ72wnuL9JQcEBgXkI9JM8MsT9kaQoHcpCRJOYA==";
6324 };
6325 };
6326 "resolve-cwd-2.0.0" = {
6327 name = "resolve-cwd";
6328 packageName = "resolve-cwd";
6329 version = "2.0.0";
6330 src = fetchurl {
6331 url = "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-2.0.0.tgz";
6332 sha1 = "00a9f7387556e27038eae232caa372a6a59b665a";
6333 };
6334 };
6335 "resolve-dir-1.0.1" = {
6336 name = "resolve-dir";
6337 packageName = "resolve-dir";
6338 version = "1.0.1";
6339 src = fetchurl {
6340 url = "https://registry.npmjs.org/resolve-dir/-/resolve-dir-1.0.1.tgz";
6341 sha1 = "79a40644c362be82f26effe739c9bb5382046f43";
6342 };
6343 };
6344 "resolve-from-3.0.0" = {
6345 name = "resolve-from";
6346 packageName = "resolve-from";
6347 version = "3.0.0";
6348 src = fetchurl {
6349 url = "https://registry.npmjs.org/resolve-from/-/resolve-from-3.0.0.tgz";
6350 sha1 = "b22c7af7d9d6881bc8b6e653335eebcb0a188748";
6351 };
6352 };
6353 "resolve-url-0.2.1" = {
6354 name = "resolve-url";
6355 packageName = "resolve-url";
6356 version = "0.2.1";
6357 src = fetchurl {
6358 url = "https://registry.npmjs.org/resolve-url/-/resolve-url-0.2.1.tgz";
6359 sha1 = "2c637fe77c893afd2a663fe21aa9080068e2052a";
6360 };
6361 };
6362 "ret-0.1.15" = {
6363 name = "ret";
6364 packageName = "ret";
6365 version = "0.1.15";
6366 src = fetchurl {
6367 url = "https://registry.npmjs.org/ret/-/ret-0.1.15.tgz";
6368 sha512 = "TTlYpa+OL+vMMNG24xSlQGEJ3B/RzEfUlLct7b5G/ytav+wPrplCpVMFuwzXbkecJrb6IYo1iFb0S9v37754mg==";
6369 };
6370 };
6371 "right-align-0.1.3" = {
6372 name = "right-align";
6373 packageName = "right-align";
6374 version = "0.1.3";
6375 src = fetchurl {
6376 url = "https://registry.npmjs.org/right-align/-/right-align-0.1.3.tgz";
6377 sha1 = "61339b722fe6a3515689210d24e14c96148613ef";
2292 };
6378 };
2293 };
6379 };
2294 "rimraf-2.2.8" = {
6380 "rimraf-2.2.8" = {
@@ -2300,6 +6386,33 b' let'
2300 sha1 = "e439be2aaee327321952730f99a8929e4fc50582";
6386 sha1 = "e439be2aaee327321952730f99a8929e4fc50582";
2301 };
6387 };
2302 };
6388 };
6389 "rimraf-2.6.2" = {
6390 name = "rimraf";
6391 packageName = "rimraf";
6392 version = "2.6.2";
6393 src = fetchurl {
6394 url = "https://registry.npmjs.org/rimraf/-/rimraf-2.6.2.tgz";
6395 sha512 = "lreewLK/BlghmxtfH36YYVg1i8IAce4TI7oao75I1g245+6BctqTVQiBP3YUJ9C6DQOXJmkYR9X9fCLtCOJc5w==";
6396 };
6397 };
6398 "ripemd160-2.0.2" = {
6399 name = "ripemd160";
6400 packageName = "ripemd160";
6401 version = "2.0.2";
6402 src = fetchurl {
6403 url = "https://registry.npmjs.org/ripemd160/-/ripemd160-2.0.2.tgz";
6404 sha512 = "ii4iagi25WusVoiC4B4lq7pbXfAp3D9v5CwfkY33vffw2+pkDjY1D8GaN7spsxvCSx8dkPqOZCEZyfxcmJG2IA==";
6405 };
6406 };
6407 "run-queue-1.0.3" = {
6408 name = "run-queue";
6409 packageName = "run-queue";
6410 version = "1.0.3";
6411 src = fetchurl {
6412 url = "https://registry.npmjs.org/run-queue/-/run-queue-1.0.3.tgz";
6413 sha1 = "e848396f057d223f24386924618e25694161ec47";
6414 };
6415 };
2303 "safe-buffer-5.1.2" = {
6416 "safe-buffer-5.1.2" = {
2304 name = "safe-buffer";
6417 name = "safe-buffer";
2305 packageName = "safe-buffer";
6418 packageName = "safe-buffer";
@@ -2309,6 +6422,15 b' let'
2309 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
6422 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
2310 };
6423 };
2311 };
6424 };
6425 "safe-regex-1.1.0" = {
6426 name = "safe-regex";
6427 packageName = "safe-regex";
6428 version = "1.1.0";
6429 src = fetchurl {
6430 url = "https://registry.npmjs.org/safe-regex/-/safe-regex-1.1.0.tgz";
6431 sha1 = "40a3669f3b077d1e943d44629e157dd48023bf2e";
6432 };
6433 };
2312 "safer-buffer-2.1.2" = {
6434 "safer-buffer-2.1.2" = {
2313 name = "safer-buffer";
6435 name = "safer-buffer";
2314 packageName = "safer-buffer";
6436 packageName = "safer-buffer";
@@ -2318,6 +6440,24 b' let'
2318 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
6440 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
2319 };
6441 };
2320 };
6442 };
6443 "sax-1.2.4" = {
6444 name = "sax";
6445 packageName = "sax";
6446 version = "1.2.4";
6447 src = fetchurl {
6448 url = "https://registry.npmjs.org/sax/-/sax-1.2.4.tgz";
6449 sha512 = "NqVDv9TpANUjFm0N8uM5GxL36UgKi9/atZw+x7YFnQ8ckwFGKrl4xX4yWtrey3UJm5nP1kUbnYgLopqWNSRhWw==";
6450 };
6451 };
6452 "schema-utils-0.4.7" = {
6453 name = "schema-utils";
6454 packageName = "schema-utils";
6455 version = "0.4.7";
6456 src = fetchurl {
6457 url = "https://registry.npmjs.org/schema-utils/-/schema-utils-0.4.7.tgz";
6458 sha512 = "v/iwU6wvwGK8HbU9yi3/nhGzP0yGSuhQMzL6ySiec1FSrZZDkhm4noOSWzrNFo/jEc+SJY6jRTwuwbSXJPDUnQ==";
6459 };
6460 };
2321 "select-1.1.2" = {
6461 "select-1.1.2" = {
2322 name = "select";
6462 name = "select";
2323 packageName = "select";
6463 packageName = "select";
@@ -2327,22 +6467,22 b' let'
2327 sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d";
6467 sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d";
2328 };
6468 };
2329 };
6469 };
2330 "semver-4.3.6" = {
6470 "semver-5.6.0" = {
2331 name = "semver";
6471 name = "semver";
2332 packageName = "semver";
6472 packageName = "semver";
2333 version = "4.3.6";
6473 version = "5.6.0";
2334 src = fetchurl {
6474 src = fetchurl {
2335 url = "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz";
6475 url = "https://registry.npmjs.org/semver/-/semver-5.6.0.tgz";
2336 sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
6476 sha512 = "RS9R6R35NYgQn++fkDWaOmqGoj4Ek9gGs+DPxNUZKuwE183xjJroKvyo1IzVFeXvUrvmALy6FWD5xrdJT25gMg==";
2337 };
6477 };
2338 };
6478 };
2339 "semver-5.5.0" = {
6479 "serialize-javascript-1.5.0" = {
2340 name = "semver";
6480 name = "serialize-javascript";
2341 packageName = "semver";
6481 packageName = "serialize-javascript";
2342 version = "5.5.0";
6482 version = "1.5.0";
2343 src = fetchurl {
6483 src = fetchurl {
2344 url = "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz";
6484 url = "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-1.5.0.tgz";
2345 sha512 = "4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==";
6485 sha512 = "Ga8c8NjAAp46Br4+0oZ2WxJCwIzwP60Gq1YPgU+39PiTVxyed/iKE/zyZI6+UlVYH5Q4PaQdHhcegIFPZTUfoQ==";
2346 };
6486 };
2347 };
6487 };
2348 "set-blocking-2.0.0" = {
6488 "set-blocking-2.0.0" = {
@@ -2354,6 +6494,60 b' let'
2354 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
6494 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
2355 };
6495 };
2356 };
6496 };
6497 "set-value-0.4.3" = {
6498 name = "set-value";
6499 packageName = "set-value";
6500 version = "0.4.3";
6501 src = fetchurl {
6502 url = "https://registry.npmjs.org/set-value/-/set-value-0.4.3.tgz";
6503 sha1 = "7db08f9d3d22dc7f78e53af3c3bf4666ecdfccf1";
6504 };
6505 };
6506 "set-value-2.0.0" = {
6507 name = "set-value";
6508 packageName = "set-value";
6509 version = "2.0.0";
6510 src = fetchurl {
6511 url = "https://registry.npmjs.org/set-value/-/set-value-2.0.0.tgz";
6512 sha512 = "hw0yxk9GT/Hr5yJEYnHNKYXkIA8mVJgd9ditYZCe16ZczcaELYYcfvaXesNACk2O8O0nTiPQcQhGUQj8JLzeeg==";
6513 };
6514 };
6515 "setimmediate-1.0.5" = {
6516 name = "setimmediate";
6517 packageName = "setimmediate";
6518 version = "1.0.5";
6519 src = fetchurl {
6520 url = "https://registry.npmjs.org/setimmediate/-/setimmediate-1.0.5.tgz";
6521 sha1 = "290cbb232e306942d7d7ea9b83732ab7856f8285";
6522 };
6523 };
6524 "sha.js-2.4.11" = {
6525 name = "sha.js";
6526 packageName = "sha.js";
6527 version = "2.4.11";
6528 src = fetchurl {
6529 url = "https://registry.npmjs.org/sha.js/-/sha.js-2.4.11.tgz";
6530 sha512 = "QMEp5B7cftE7APOjk5Y6xgrbWu+WkLVQwk8JNjZ8nKRciZaByEW6MubieAiToS7+dwvrjGhH8jRXz3MVd0AYqQ==";
6531 };
6532 };
6533 "shebang-command-1.2.0" = {
6534 name = "shebang-command";
6535 packageName = "shebang-command";
6536 version = "1.2.0";
6537 src = fetchurl {
6538 url = "https://registry.npmjs.org/shebang-command/-/shebang-command-1.2.0.tgz";
6539 sha1 = "44aac65b695b03398968c39f363fee5deafdf1ea";
6540 };
6541 };
6542 "shebang-regex-1.0.0" = {
6543 name = "shebang-regex";
6544 packageName = "shebang-regex";
6545 version = "1.0.0";
6546 src = fetchurl {
6547 url = "https://registry.npmjs.org/shebang-regex/-/shebang-regex-1.0.0.tgz";
6548 sha1 = "da42f49740c0b42db2ca9728571cb190c98efea3";
6549 };
6550 };
2357 "shelljs-0.3.0" = {
6551 "shelljs-0.3.0" = {
2358 name = "shelljs";
6552 name = "shelljs";
2359 packageName = "shelljs";
6553 packageName = "shelljs";
@@ -2381,22 +6575,40 b' let'
2381 sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
6575 sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
2382 };
6576 };
2383 };
6577 };
2384 "slasp-0.0.4" = {
6578 "slash-1.0.0" = {
2385 name = "slasp";
6579 name = "slash";
2386 packageName = "slasp";
6580 packageName = "slash";
2387 version = "0.0.4";
6581 version = "1.0.0";
2388 src = fetchurl {
6582 src = fetchurl {
2389 url = "https://registry.npmjs.org/slasp/-/slasp-0.0.4.tgz";
6583 url = "https://registry.npmjs.org/slash/-/slash-1.0.0.tgz";
2390 sha1 = "9adc26ee729a0f95095851a5489f87a5258d57a9";
6584 sha1 = "c41f2f6c39fc16d1cd17ad4b5d896114ae470d55";
2391 };
6585 };
2392 };
6586 };
2393 "slide-1.1.6" = {
6587 "snapdragon-0.8.2" = {
2394 name = "slide";
6588 name = "snapdragon";
2395 packageName = "slide";
6589 packageName = "snapdragon";
2396 version = "1.1.6";
6590 version = "0.8.2";
2397 src = fetchurl {
6591 src = fetchurl {
2398 url = "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz";
6592 url = "https://registry.npmjs.org/snapdragon/-/snapdragon-0.8.2.tgz";
2399 sha1 = "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707";
6593 sha512 = "FtyOnWN/wCHTVXOMwvSv26d+ko5vWlIDD6zoUJ7LW8vh+ZBC8QdljveRP+crNrtBwioEUWy/4dMtbBjA4ioNlg==";
6594 };
6595 };
6596 "snapdragon-node-2.1.1" = {
6597 name = "snapdragon-node";
6598 packageName = "snapdragon-node";
6599 version = "2.1.1";
6600 src = fetchurl {
6601 url = "https://registry.npmjs.org/snapdragon-node/-/snapdragon-node-2.1.1.tgz";
6602 sha512 = "O27l4xaMYt/RSQ5TR3vpWCAB5Kb/czIcqUFOM/C4fYcLnbZUc1PkjTAMjof2pBWaSTwOUd6qUHcFGVGj7aIwnw==";
6603 };
6604 };
6605 "snapdragon-util-3.0.1" = {
6606 name = "snapdragon-util";
6607 packageName = "snapdragon-util";
6608 version = "3.0.1";
6609 src = fetchurl {
6610 url = "https://registry.npmjs.org/snapdragon-util/-/snapdragon-util-3.0.1.tgz";
6611 sha512 = "mbKkMdQKsjX4BAL4bRYTj21edOf8cN7XHdYUJEe+Zn99hVEYcMvKPct1IqNe7+AZPirn8BCDOQBHQZknqmKlZQ==";
2400 };
6612 };
2401 };
6613 };
2402 "sntp-1.0.9" = {
6614 "sntp-1.0.9" = {
@@ -2408,6 +6620,33 b' let'
2408 sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
6620 sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
2409 };
6621 };
2410 };
6622 };
6623 "sort-keys-1.1.2" = {
6624 name = "sort-keys";
6625 packageName = "sort-keys";
6626 version = "1.1.2";
6627 src = fetchurl {
6628 url = "https://registry.npmjs.org/sort-keys/-/sort-keys-1.1.2.tgz";
6629 sha1 = "441b6d4d346798f1b4e49e8920adfba0e543f9ad";
6630 };
6631 };
6632 "source-list-map-0.1.8" = {
6633 name = "source-list-map";
6634 packageName = "source-list-map";
6635 version = "0.1.8";
6636 src = fetchurl {
6637 url = "https://registry.npmjs.org/source-list-map/-/source-list-map-0.1.8.tgz";
6638 sha1 = "c550b2ab5427f6b3f21f5afead88c4f5587b2106";
6639 };
6640 };
6641 "source-list-map-2.0.1" = {
6642 name = "source-list-map";
6643 packageName = "source-list-map";
6644 version = "2.0.1";
6645 src = fetchurl {
6646 url = "https://registry.npmjs.org/source-list-map/-/source-list-map-2.0.1.tgz";
6647 sha512 = "qnQ7gVMxGNxsiL4lEuJwe/To8UnK7fAnmbGEEH8RpLouuKbeEm0lhbQVFIrNSuB+G7tVrAlVsZgETT5nljf+Iw==";
6648 };
6649 };
2411 "source-map-0.3.0" = {
6650 "source-map-0.3.0" = {
2412 name = "source-map";
6651 name = "source-map";
2413 packageName = "source-map";
6652 packageName = "source-map";
@@ -2417,6 +6656,15 b' let'
2417 sha1 = "8586fb9a5a005e5b501e21cd18b6f21b457ad1f9";
6656 sha1 = "8586fb9a5a005e5b501e21cd18b6f21b457ad1f9";
2418 };
6657 };
2419 };
6658 };
6659 "source-map-0.4.4" = {
6660 name = "source-map";
6661 packageName = "source-map";
6662 version = "0.4.4";
6663 src = fetchurl {
6664 url = "https://registry.npmjs.org/source-map/-/source-map-0.4.4.tgz";
6665 sha1 = "eba4f5da9c0dc999de68032d8b4f76173652036b";
6666 };
6667 };
2420 "source-map-0.5.7" = {
6668 "source-map-0.5.7" = {
2421 name = "source-map";
6669 name = "source-map";
2422 packageName = "source-map";
6670 packageName = "source-map";
@@ -2435,40 +6683,31 b' let'
2435 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
6683 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
2436 };
6684 };
2437 };
6685 };
2438 "spdx-correct-3.0.0" = {
6686 "source-map-resolve-0.5.2" = {
2439 name = "spdx-correct";
6687 name = "source-map-resolve";
2440 packageName = "spdx-correct";
6688 packageName = "source-map-resolve";
2441 version = "3.0.0";
6689 version = "0.5.2";
2442 src = fetchurl {
6690 src = fetchurl {
2443 url = "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz";
6691 url = "https://registry.npmjs.org/source-map-resolve/-/source-map-resolve-0.5.2.tgz";
2444 sha512 = "N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==";
6692 sha512 = "MjqsvNwyz1s0k81Goz/9vRBe9SZdB09Bdw+/zYyO+3CuPk6fouTaxscHkgtE8jKvf01kVfl8riHzERQ/kefaSA==";
2445 };
6693 };
2446 };
6694 };
2447 "spdx-exceptions-2.1.0" = {
6695 "source-map-support-0.4.18" = {
2448 name = "spdx-exceptions";
6696 name = "source-map-support";
2449 packageName = "spdx-exceptions";
6697 packageName = "source-map-support";
2450 version = "2.1.0";
6698 version = "0.4.18";
2451 src = fetchurl {
6699 src = fetchurl {
2452 url = "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz";
6700 url = "https://registry.npmjs.org/source-map-support/-/source-map-support-0.4.18.tgz";
2453 sha512 = "4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==";
6701 sha512 = "try0/JqxPLF9nOjvSta7tVondkP5dwgyLDjVoyMDlmjugT2lRZ1OfsrYTkCd2hkDnJTKRbO/Rl3orm8vlsUzbA==";
2454 };
6702 };
2455 };
6703 };
2456 "spdx-expression-parse-3.0.0" = {
6704 "source-map-url-0.4.0" = {
2457 name = "spdx-expression-parse";
6705 name = "source-map-url";
2458 packageName = "spdx-expression-parse";
6706 packageName = "source-map-url";
2459 version = "3.0.0";
6707 version = "0.4.0";
2460 src = fetchurl {
6708 src = fetchurl {
2461 url = "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
6709 url = "https://registry.npmjs.org/source-map-url/-/source-map-url-0.4.0.tgz";
2462 sha512 = "Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==";
6710 sha1 = "3e935d7ddd73631b97659956d55128e87b5084a3";
2463 };
2464 };
2465 "spdx-license-ids-3.0.0" = {
2466 name = "spdx-license-ids";
2467 packageName = "spdx-license-ids";
2468 version = "3.0.0";
2469 src = fetchurl {
2470 url = "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz";
2471 sha512 = "2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==";
2472 };
6711 };
2473 };
6712 };
2474 "split-1.0.1" = {
6713 "split-1.0.1" = {
@@ -2480,13 +6719,31 b' let'
2480 sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==";
6719 sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==";
2481 };
6720 };
2482 };
6721 };
2483 "sshpk-1.14.2" = {
6722 "split-string-3.1.0" = {
6723 name = "split-string";
6724 packageName = "split-string";
6725 version = "3.1.0";
6726 src = fetchurl {
6727 url = "https://registry.npmjs.org/split-string/-/split-string-3.1.0.tgz";
6728 sha512 = "NzNVhJDYpwceVVii8/Hu6DKfD2G+NrQHlS/V/qgv763EYudVwEcMQNxd2lh+0VrUByXN/oJkl5grOhYWvQUYiw==";
6729 };
6730 };
6731 "sprintf-js-1.0.3" = {
6732 name = "sprintf-js";
6733 packageName = "sprintf-js";
6734 version = "1.0.3";
6735 src = fetchurl {
6736 url = "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz";
6737 sha1 = "04e6926f662895354f3dd015203633b857297e2c";
6738 };
6739 };
6740 "sshpk-1.15.1" = {
2484 name = "sshpk";
6741 name = "sshpk";
2485 packageName = "sshpk";
6742 packageName = "sshpk";
2486 version = "1.14.2";
6743 version = "1.15.1";
2487 src = fetchurl {
6744 src = fetchurl {
2488 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz";
6745 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz";
2489 sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98";
6746 sha512 = "mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==";
2490 };
6747 };
2491 };
6748 };
2492 "ssri-5.3.0" = {
6749 "ssri-5.3.0" = {
@@ -2507,6 +6764,69 b' let'
2507 sha1 = "547c70b347e8d32b4e108ea1a2a159e5fdde19c0";
6764 sha1 = "547c70b347e8d32b4e108ea1a2a159e5fdde19c0";
2508 };
6765 };
2509 };
6766 };
6767 "static-extend-0.1.2" = {
6768 name = "static-extend";
6769 packageName = "static-extend";
6770 version = "0.1.2";
6771 src = fetchurl {
6772 url = "https://registry.npmjs.org/static-extend/-/static-extend-0.1.2.tgz";
6773 sha1 = "60809c39cbff55337226fd5e0b520f341f1fb5c6";
6774 };
6775 };
6776 "sticky-sidebar-3.3.1" = {
6777 name = "sticky-sidebar";
6778 packageName = "sticky-sidebar";
6779 version = "3.3.1";
6780 src = fetchurl {
6781 url = "https://registry.npmjs.org/sticky-sidebar/-/sticky-sidebar-3.3.1.tgz";
6782 sha1 = "142bf6b64c2b416e4b707ebf8f09b8b5a5043877";
6783 };
6784 };
6785 "stream-browserify-2.0.1" = {
6786 name = "stream-browserify";
6787 packageName = "stream-browserify";
6788 version = "2.0.1";
6789 src = fetchurl {
6790 url = "https://registry.npmjs.org/stream-browserify/-/stream-browserify-2.0.1.tgz";
6791 sha1 = "66266ee5f9bdb9940a4e4514cafb43bb71e5c9db";
6792 };
6793 };
6794 "stream-each-1.2.3" = {
6795 name = "stream-each";
6796 packageName = "stream-each";
6797 version = "1.2.3";
6798 src = fetchurl {
6799 url = "https://registry.npmjs.org/stream-each/-/stream-each-1.2.3.tgz";
6800 sha512 = "vlMC2f8I2u/bZGqkdfLQW/13Zihpej/7PmSiMQsbYddxuTsJp8vRe2x2FvVExZg7FaOds43ROAuFJwPR4MTZLw==";
6801 };
6802 };
6803 "stream-http-2.8.3" = {
6804 name = "stream-http";
6805 packageName = "stream-http";
6806 version = "2.8.3";
6807 src = fetchurl {
6808 url = "https://registry.npmjs.org/stream-http/-/stream-http-2.8.3.tgz";
6809 sha512 = "+TSkfINHDo4J+ZobQLWiMouQYB+UVYFttRA94FpEzzJ7ZdqcL4uUUQ7WkdkI4DSozGmgBUE/a47L+38PenXhUw==";
6810 };
6811 };
6812 "stream-shift-1.0.0" = {
6813 name = "stream-shift";
6814 packageName = "stream-shift";
6815 version = "1.0.0";
6816 src = fetchurl {
6817 url = "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.0.tgz";
6818 sha1 = "d5c752825e5367e786f78e18e445ea223a155952";
6819 };
6820 };
6821 "strict-uri-encode-1.1.0" = {
6822 name = "strict-uri-encode";
6823 packageName = "strict-uri-encode";
6824 version = "1.1.0";
6825 src = fetchurl {
6826 url = "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-1.1.0.tgz";
6827 sha1 = "279b225df1d582b1f54e65addd4352e18faa0713";
6828 };
6829 };
2510 "string-width-1.0.2" = {
6830 "string-width-1.0.2" = {
2511 name = "string-width";
6831 name = "string-width";
2512 packageName = "string-width";
6832 packageName = "string-width";
@@ -2516,6 +6836,15 b' let'
2516 sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
6836 sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
2517 };
6837 };
2518 };
6838 };
6839 "string-width-2.1.1" = {
6840 name = "string-width";
6841 packageName = "string-width";
6842 version = "2.1.1";
6843 src = fetchurl {
6844 url = "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz";
6845 sha512 = "nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==";
6846 };
6847 };
2519 "string_decoder-0.10.31" = {
6848 "string_decoder-0.10.31" = {
2520 name = "string_decoder";
6849 name = "string_decoder";
2521 packageName = "string_decoder";
6850 packageName = "string_decoder";
@@ -2561,6 +6890,24 b' let'
2561 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
6890 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
2562 };
6891 };
2563 };
6892 };
6893 "strip-ansi-4.0.0" = {
6894 name = "strip-ansi";
6895 packageName = "strip-ansi";
6896 version = "4.0.0";
6897 src = fetchurl {
6898 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz";
6899 sha1 = "a8479022eb1ac368a871389b635262c505ee368f";
6900 };
6901 };
6902 "strip-eof-1.0.0" = {
6903 name = "strip-eof";
6904 packageName = "strip-eof";
6905 version = "1.0.0";
6906 src = fetchurl {
6907 url = "https://registry.npmjs.org/strip-eof/-/strip-eof-1.0.0.tgz";
6908 sha1 = "bb43ff5598a6eb05d89b59fcd129c983313606bf";
6909 };
6910 };
2564 "strip-json-comments-1.0.4" = {
6911 "strip-json-comments-1.0.4" = {
2565 name = "strip-json-comments";
6912 name = "strip-json-comments";
2566 packageName = "strip-json-comments";
6913 packageName = "strip-json-comments";
@@ -2570,6 +6917,15 b' let'
2570 sha1 = "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91";
6917 sha1 = "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91";
2571 };
6918 };
2572 };
6919 };
6920 "style-loader-0.21.0" = {
6921 name = "style-loader";
6922 packageName = "style-loader";
6923 version = "0.21.0";
6924 src = fetchurl {
6925 url = "https://registry.npmjs.org/style-loader/-/style-loader-0.21.0.tgz";
6926 sha512 = "T+UNsAcl3Yg+BsPKs1vd22Fr8sVT+CJMtzqc6LEw9bbJZb43lm9GoeIfUcDEefBSWC0BhYbcdupV1GtI4DGzxg==";
6927 };
6928 };
2573 "supports-color-0.2.0" = {
6929 "supports-color-0.2.0" = {
2574 name = "supports-color";
6930 name = "supports-color";
2575 packageName = "supports-color";
6931 packageName = "supports-color";
@@ -2588,40 +6944,49 b' let'
2588 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
6944 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
2589 };
6945 };
2590 };
6946 };
2591 "table-layout-0.3.0" = {
6947 "supports-color-3.2.3" = {
2592 name = "table-layout";
6948 name = "supports-color";
2593 packageName = "table-layout";
6949 packageName = "supports-color";
2594 version = "0.3.0";
6950 version = "3.2.3";
2595 src = fetchurl {
6951 src = fetchurl {
2596 url = "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz";
6952 url = "https://registry.npmjs.org/supports-color/-/supports-color-3.2.3.tgz";
2597 sha1 = "6ee20dc483db371b3e5c87f704ed2f7c799d2c9a";
6953 sha1 = "65ac0504b3954171d8a64946b2ae3cbb8a5f54f6";
2598 };
6954 };
2599 };
6955 };
2600 "tar-3.1.15" = {
6956 "supports-color-5.5.0" = {
2601 name = "tar";
6957 name = "supports-color";
2602 packageName = "tar";
6958 packageName = "supports-color";
2603 version = "3.1.15";
6959 version = "5.5.0";
2604 src = fetchurl {
6960 src = fetchurl {
2605 url = "https://registry.npmjs.org/tar/-/tar-3.1.15.tgz";
6961 url = "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz";
2606 sha512 = "pQNFsg+Wb6VXsrIPUnuQwrHR4wD5ASBR0jRyiT4/AALFA2Nl+CjhkDX5fTmIwCuULRtyQR3Dae2BBnP2EFHscw==";
6962 sha512 = "QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==";
2607 };
6963 };
2608 };
6964 };
2609 "temp-0.8.3" = {
6965 "svgo-0.7.2" = {
2610 name = "temp";
6966 name = "svgo";
2611 packageName = "temp";
6967 packageName = "svgo";
2612 version = "0.8.3";
6968 version = "0.7.2";
2613 src = fetchurl {
6969 src = fetchurl {
2614 url = "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz";
6970 url = "https://registry.npmjs.org/svgo/-/svgo-0.7.2.tgz";
2615 sha1 = "e0c6bc4d26b903124410e4fed81103014dfc1f59";
6971 sha1 = "9f5772413952135c6fefbf40afe6a4faa88b4bb5";
2616 };
6972 };
2617 };
6973 };
2618 "test-value-2.1.0" = {
6974 "tapable-0.2.8" = {
2619 name = "test-value";
6975 name = "tapable";
2620 packageName = "test-value";
6976 packageName = "tapable";
2621 version = "2.1.0";
6977 version = "0.2.8";
2622 src = fetchurl {
6978 src = fetchurl {
2623 url = "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz";
6979 url = "https://registry.npmjs.org/tapable/-/tapable-0.2.8.tgz";
2624 sha1 = "11da6ff670f3471a73b625ca4f3fdcf7bb748291";
6980 sha1 = "99372a5c999bf2df160afc0d74bed4f47948cd22";
6981 };
6982 };
6983 "tapable-1.1.0" = {
6984 name = "tapable";
6985 packageName = "tapable";
6986 version = "1.1.0";
6987 src = fetchurl {
6988 url = "https://registry.npmjs.org/tapable/-/tapable-1.1.0.tgz";
6989 sha512 = "IlqtmLVaZA2qab8epUXbVWRn3aB1imbDMJtjB3nu4X0NqPkcY/JH9ZtCBWKHWPxs8Svi9tyo8w2dBoi07qZbBA==";
2625 };
6990 };
2626 };
6991 };
2627 "throttleit-1.0.0" = {
6992 "throttleit-1.0.0" = {
@@ -2642,6 +7007,24 b' let'
2642 sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
7007 sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
2643 };
7008 };
2644 };
7009 };
7010 "through2-2.0.3" = {
7011 name = "through2";
7012 packageName = "through2";
7013 version = "2.0.3";
7014 src = fetchurl {
7015 url = "https://registry.npmjs.org/through2/-/through2-2.0.3.tgz";
7016 sha1 = "0004569b37c7c74ba39c43f3ced78d1ad94140be";
7017 };
7018 };
7019 "timers-browserify-2.0.10" = {
7020 name = "timers-browserify";
7021 packageName = "timers-browserify";
7022 version = "2.0.10";
7023 src = fetchurl {
7024 url = "https://registry.npmjs.org/timers-browserify/-/timers-browserify-2.0.10.tgz";
7025 sha512 = "YvC1SV1XdOUaL6gx5CoGroT3Gu49pK9+TZ38ErPldOWW4j49GI1HKs9DV+KGq/w6y+LZ72W1c8cKz2vzY+qpzg==";
7026 };
7027 };
2645 "tiny-emitter-2.0.2" = {
7028 "tiny-emitter-2.0.2" = {
2646 name = "tiny-emitter";
7029 name = "tiny-emitter";
2647 packageName = "tiny-emitter";
7030 packageName = "tiny-emitter";
@@ -2660,6 +7043,60 b' let'
2660 sha1 = "1e99e1e2a8469b736ab97d97eefa98c71f76ed0a";
7043 sha1 = "1e99e1e2a8469b736ab97d97eefa98c71f76ed0a";
2661 };
7044 };
2662 };
7045 };
7046 "to-arraybuffer-1.0.1" = {
7047 name = "to-arraybuffer";
7048 packageName = "to-arraybuffer";
7049 version = "1.0.1";
7050 src = fetchurl {
7051 url = "https://registry.npmjs.org/to-arraybuffer/-/to-arraybuffer-1.0.1.tgz";
7052 sha1 = "7d229b1fcc637e466ca081180836a7aabff83f43";
7053 };
7054 };
7055 "to-fast-properties-1.0.3" = {
7056 name = "to-fast-properties";
7057 packageName = "to-fast-properties";
7058 version = "1.0.3";
7059 src = fetchurl {
7060 url = "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-1.0.3.tgz";
7061 sha1 = "b83571fa4d8c25b82e231b06e3a3055de4ca1a47";
7062 };
7063 };
7064 "to-object-path-0.3.0" = {
7065 name = "to-object-path";
7066 packageName = "to-object-path";
7067 version = "0.3.0";
7068 src = fetchurl {
7069 url = "https://registry.npmjs.org/to-object-path/-/to-object-path-0.3.0.tgz";
7070 sha1 = "297588b7b0e7e0ac08e04e672f85c1f4999e17af";
7071 };
7072 };
7073 "to-regex-3.0.2" = {
7074 name = "to-regex";
7075 packageName = "to-regex";
7076 version = "3.0.2";
7077 src = fetchurl {
7078 url = "https://registry.npmjs.org/to-regex/-/to-regex-3.0.2.tgz";
7079 sha512 = "FWtleNAtZ/Ki2qtqej2CXTOayOH9bHDQF+Q48VpWyDXjbYxA4Yz8iDB31zXOBUlOHHKidDbqGVrTUvQMPmBGBw==";
7080 };
7081 };
7082 "to-regex-range-2.1.1" = {
7083 name = "to-regex-range";
7084 packageName = "to-regex-range";
7085 version = "2.1.1";
7086 src = fetchurl {
7087 url = "https://registry.npmjs.org/to-regex-range/-/to-regex-range-2.1.1.tgz";
7088 sha1 = "7c80c17b9dfebe599e27367e0d4dd5590141db38";
7089 };
7090 };
7091 "toposort-1.0.7" = {
7092 name = "toposort";
7093 packageName = "toposort";
7094 version = "1.0.7";
7095 src = fetchurl {
7096 url = "https://registry.npmjs.org/toposort/-/toposort-1.0.7.tgz";
7097 sha1 = "2e68442d9f64ec720b8cc89e6443ac6caa950029";
7098 };
7099 };
2663 "tough-cookie-2.3.4" = {
7100 "tough-cookie-2.3.4" = {
2664 name = "tough-cookie";
7101 name = "tough-cookie";
2665 packageName = "tough-cookie";
7102 packageName = "tough-cookie";
@@ -2669,6 +7106,42 b' let'
2669 sha512 = "TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==";
7106 sha512 = "TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==";
2670 };
7107 };
2671 };
7108 };
7109 "trim-right-1.0.1" = {
7110 name = "trim-right";
7111 packageName = "trim-right";
7112 version = "1.0.1";
7113 src = fetchurl {
7114 url = "https://registry.npmjs.org/trim-right/-/trim-right-1.0.1.tgz";
7115 sha1 = "cb2e1203067e0c8de1f614094b9fe45704ea6003";
7116 };
7117 };
7118 "ts-loader-1.3.3" = {
7119 name = "ts-loader";
7120 packageName = "ts-loader";
7121 version = "1.3.3";
7122 src = fetchurl {
7123 url = "https://registry.npmjs.org/ts-loader/-/ts-loader-1.3.3.tgz";
7124 sha1 = "30c6203e1e66b841a88701ed8858f1725d94b026";
7125 };
7126 };
7127 "tslib-1.9.3" = {
7128 name = "tslib";
7129 packageName = "tslib";
7130 version = "1.9.3";
7131 src = fetchurl {
7132 url = "https://registry.npmjs.org/tslib/-/tslib-1.9.3.tgz";
7133 sha512 = "4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ==";
7134 };
7135 };
7136 "tty-browserify-0.0.0" = {
7137 name = "tty-browserify";
7138 packageName = "tty-browserify";
7139 version = "0.0.0";
7140 src = fetchurl {
7141 url = "https://registry.npmjs.org/tty-browserify/-/tty-browserify-0.0.0.tgz";
7142 sha1 = "a157ba402da24e9bf957f9aa69d524eed42901a6";
7143 };
7144 };
2672 "tunnel-agent-0.6.0" = {
7145 "tunnel-agent-0.6.0" = {
2673 name = "tunnel-agent";
7146 name = "tunnel-agent";
2674 packageName = "tunnel-agent";
7147 packageName = "tunnel-agent";
@@ -2687,15 +7160,6 b' let'
2687 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
7160 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
2688 };
7161 };
2689 };
7162 };
2690 "type-check-0.3.2" = {
2691 name = "type-check";
2692 packageName = "type-check";
2693 version = "0.3.2";
2694 src = fetchurl {
2695 url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
2696 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
2697 };
2698 };
2699 "typedarray-0.0.6" = {
7163 "typedarray-0.0.6" = {
2700 name = "typedarray";
7164 name = "typedarray";
2701 packageName = "typedarray";
7165 packageName = "typedarray";
@@ -2705,22 +7169,58 b' let'
2705 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
7169 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
2706 };
7170 };
2707 };
7171 };
2708 "typical-2.6.1" = {
7172 "uglify-es-3.3.10" = {
2709 name = "typical";
7173 name = "uglify-es";
2710 packageName = "typical";
7174 packageName = "uglify-es";
2711 version = "2.6.1";
7175 version = "3.3.10";
2712 src = fetchurl {
7176 src = fetchurl {
2713 url = "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz";
7177 url = "https://registry.npmjs.org/uglify-es/-/uglify-es-3.3.10.tgz";
2714 sha1 = "5c080e5d661cbbe38259d2e70a3c7253e873881d";
7178 sha512 = "rPzPisCzW68Okj1zNrfa2dR9uEm43SevDmpR6FChoZABFk9dANGnzzBMgHYUXI3609//63fnVkyQ1SQmAMyjww==";
2715 };
7179 };
2716 };
7180 };
2717 "uid-number-0.0.5" = {
7181 "uglify-js-2.8.29" = {
2718 name = "uid-number";
7182 name = "uglify-js";
2719 packageName = "uid-number";
7183 packageName = "uglify-js";
2720 version = "0.0.5";
7184 version = "2.8.29";
2721 src = fetchurl {
7185 src = fetchurl {
2722 url = "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz";
7186 url = "https://registry.npmjs.org/uglify-js/-/uglify-js-2.8.29.tgz";
2723 sha1 = "5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e";
7187 sha1 = "29c5733148057bb4e1f75df35b7a9cb72e6a59dd";
7188 };
7189 };
7190 "uglify-js-3.4.9" = {
7191 name = "uglify-js";
7192 packageName = "uglify-js";
7193 version = "3.4.9";
7194 src = fetchurl {
7195 url = "https://registry.npmjs.org/uglify-js/-/uglify-js-3.4.9.tgz";
7196 sha512 = "8CJsbKOtEbnJsTyv6LE6m6ZKniqMiFWmm9sRbopbkGs3gMPPfd3Fh8iIA4Ykv5MgaTbqHr4BaoGLJLZNhsrW1Q==";
7197 };
7198 };
7199 "uglify-to-browserify-1.0.2" = {
7200 name = "uglify-to-browserify";
7201 packageName = "uglify-to-browserify";
7202 version = "1.0.2";
7203 src = fetchurl {
7204 url = "https://registry.npmjs.org/uglify-to-browserify/-/uglify-to-browserify-1.0.2.tgz";
7205 sha1 = "6e0924d6bda6b5afe349e39a6d632850a0f882b7";
7206 };
7207 };
7208 "uglifyjs-webpack-plugin-1.3.0" = {
7209 name = "uglifyjs-webpack-plugin";
7210 packageName = "uglifyjs-webpack-plugin";
7211 version = "1.3.0";
7212 src = fetchurl {
7213 url = "https://registry.npmjs.org/uglifyjs-webpack-plugin/-/uglifyjs-webpack-plugin-1.3.0.tgz";
7214 sha512 = "ovHIch0AMlxjD/97j9AYovZxG5wnHOPkL7T1GKochBADp/Zwc44pEWNqpKl1Loupp1WhFg7SlYmHZRUfdAacgw==";
7215 };
7216 };
7217 "unc-path-regex-0.1.2" = {
7218 name = "unc-path-regex";
7219 packageName = "unc-path-regex";
7220 version = "0.1.2";
7221 src = fetchurl {
7222 url = "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz";
7223 sha1 = "e73dd3d7b0d7c5ed86fbac6b0ae7d8c6a69d50fa";
2724 };
7224 };
2725 };
7225 };
2726 "underscore-1.7.0" = {
7226 "underscore-1.7.0" = {
@@ -2768,6 +7268,132 b' let'
2768 sha512 = "KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==";
7268 sha512 = "KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==";
2769 };
7269 };
2770 };
7270 };
7271 "union-value-1.0.0" = {
7272 name = "union-value";
7273 packageName = "union-value";
7274 version = "1.0.0";
7275 src = fetchurl {
7276 url = "https://registry.npmjs.org/union-value/-/union-value-1.0.0.tgz";
7277 sha1 = "5c71c34cb5bad5dcebe3ea0cd08207ba5aa1aea4";
7278 };
7279 };
7280 "uniq-1.0.1" = {
7281 name = "uniq";
7282 packageName = "uniq";
7283 version = "1.0.1";
7284 src = fetchurl {
7285 url = "https://registry.npmjs.org/uniq/-/uniq-1.0.1.tgz";
7286 sha1 = "b31c5ae8254844a3a8281541ce2b04b865a734ff";
7287 };
7288 };
7289 "uniqs-2.0.0" = {
7290 name = "uniqs";
7291 packageName = "uniqs";
7292 version = "2.0.0";
7293 src = fetchurl {
7294 url = "https://registry.npmjs.org/uniqs/-/uniqs-2.0.0.tgz";
7295 sha1 = "ffede4b36b25290696e6e165d4a59edb998e6b02";
7296 };
7297 };
7298 "unique-filename-1.1.1" = {
7299 name = "unique-filename";
7300 packageName = "unique-filename";
7301 version = "1.1.1";
7302 src = fetchurl {
7303 url = "https://registry.npmjs.org/unique-filename/-/unique-filename-1.1.1.tgz";
7304 sha512 = "Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==";
7305 };
7306 };
7307 "unique-slug-2.0.1" = {
7308 name = "unique-slug";
7309 packageName = "unique-slug";
7310 version = "2.0.1";
7311 src = fetchurl {
7312 url = "https://registry.npmjs.org/unique-slug/-/unique-slug-2.0.1.tgz";
7313 sha512 = "n9cU6+gITaVu7VGj1Z8feKMmfAjEAQGhwD9fE3zvpRRa0wEIx8ODYkVGfSc94M2OX00tUFV8wH3zYbm1I8mxFg==";
7314 };
7315 };
7316 "unset-value-1.0.0" = {
7317 name = "unset-value";
7318 packageName = "unset-value";
7319 version = "1.0.0";
7320 src = fetchurl {
7321 url = "https://registry.npmjs.org/unset-value/-/unset-value-1.0.0.tgz";
7322 sha1 = "8376873f7d2335179ffb1e6fc3a8ed0dfc8ab559";
7323 };
7324 };
7325 "upath-1.1.0" = {
7326 name = "upath";
7327 packageName = "upath";
7328 version = "1.1.0";
7329 src = fetchurl {
7330 url = "https://registry.npmjs.org/upath/-/upath-1.1.0.tgz";
7331 sha512 = "bzpH/oBhoS/QI/YtbkqCg6VEiPYjSZtrHQM6/QnJS6OL9pKUFLqb3aFh4Scvwm45+7iAgiMkLhSbaZxUqmrprw==";
7332 };
7333 };
7334 "upper-case-1.1.3" = {
7335 name = "upper-case";
7336 packageName = "upper-case";
7337 version = "1.1.3";
7338 src = fetchurl {
7339 url = "https://registry.npmjs.org/upper-case/-/upper-case-1.1.3.tgz";
7340 sha1 = "f6b4501c2ec4cdd26ba78be7222961de77621598";
7341 };
7342 };
7343 "uri-js-4.2.2" = {
7344 name = "uri-js";
7345 packageName = "uri-js";
7346 version = "4.2.2";
7347 src = fetchurl {
7348 url = "https://registry.npmjs.org/uri-js/-/uri-js-4.2.2.tgz";
7349 sha512 = "KY9Frmirql91X2Qgjry0Wd4Y+YTdrdZheS8TFwvkbLWf/G5KNJDCh6pKL5OZctEW4+0Baa5idK2ZQuELRwPznQ==";
7350 };
7351 };
7352 "urix-0.1.0" = {
7353 name = "urix";
7354 packageName = "urix";
7355 version = "0.1.0";
7356 src = fetchurl {
7357 url = "https://registry.npmjs.org/urix/-/urix-0.1.0.tgz";
7358 sha1 = "da937f7a62e21fec1fd18d49b35c2935067a6c72";
7359 };
7360 };
7361 "url-0.11.0" = {
7362 name = "url";
7363 packageName = "url";
7364 version = "0.11.0";
7365 src = fetchurl {
7366 url = "https://registry.npmjs.org/url/-/url-0.11.0.tgz";
7367 sha1 = "3838e97cfc60521eb73c525a8e55bfdd9e2e28f1";
7368 };
7369 };
7370 "use-3.1.1" = {
7371 name = "use";
7372 packageName = "use";
7373 version = "3.1.1";
7374 src = fetchurl {
7375 url = "https://registry.npmjs.org/use/-/use-3.1.1.tgz";
7376 sha512 = "cwESVXlO3url9YWlFW/TA9cshCEhtu7IKJ/p5soJ/gGpj7vbvFrAY/eIioQ6Dw23KjZhYgiIo8HOs1nQ2vr/oQ==";
7377 };
7378 };
7379 "util-0.10.3" = {
7380 name = "util";
7381 packageName = "util";
7382 version = "0.10.3";
7383 src = fetchurl {
7384 url = "https://registry.npmjs.org/util/-/util-0.10.3.tgz";
7385 sha1 = "7afb1afe50805246489e3db7fe0ed379336ac0f9";
7386 };
7387 };
7388 "util-0.10.4" = {
7389 name = "util";
7390 packageName = "util";
7391 version = "0.10.4";
7392 src = fetchurl {
7393 url = "https://registry.npmjs.org/util/-/util-0.10.4.tgz";
7394 sha512 = "0Pm9hTQ3se5ll1XihRic3FDIku70C+iHUdT/W926rSgHV5QgXsYbKZN8MSC3tJtSkhuROzvsQjAaFENRXr+19A==";
7395 };
7396 };
2771 "util-deprecate-1.0.2" = {
7397 "util-deprecate-1.0.2" = {
2772 name = "util-deprecate";
7398 name = "util-deprecate";
2773 packageName = "util-deprecate";
7399 packageName = "util-deprecate";
@@ -2777,6 +7403,24 b' let'
2777 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
7403 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
2778 };
7404 };
2779 };
7405 };
7406 "util.promisify-1.0.0" = {
7407 name = "util.promisify";
7408 packageName = "util.promisify";
7409 version = "1.0.0";
7410 src = fetchurl {
7411 url = "https://registry.npmjs.org/util.promisify/-/util.promisify-1.0.0.tgz";
7412 sha512 = "i+6qA2MPhvoKLuxnJNpXAGhg7HphQOSUq2LKMZD0m15EiskXUkMvKdF4Uui0WYeCUGea+o2cw/ZuwehtfsrNkA==";
7413 };
7414 };
7415 "utila-0.4.0" = {
7416 name = "utila";
7417 packageName = "utila";
7418 version = "0.4.0";
7419 src = fetchurl {
7420 url = "https://registry.npmjs.org/utila/-/utila-0.4.0.tgz";
7421 sha1 = "8a16a05d445657a3aea5eecc5b12a4fa5379772c";
7422 };
7423 };
2780 "uuid-3.3.2" = {
7424 "uuid-3.3.2" = {
2781 name = "uuid";
7425 name = "uuid";
2782 packageName = "uuid";
7426 packageName = "uuid";
@@ -2786,22 +7430,31 b' let'
2786 sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==";
7430 sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==";
2787 };
7431 };
2788 };
7432 };
2789 "validate-npm-package-license-3.0.3" = {
7433 "v8-compile-cache-2.0.2" = {
2790 name = "validate-npm-package-license";
7434 name = "v8-compile-cache";
2791 packageName = "validate-npm-package-license";
7435 packageName = "v8-compile-cache";
2792 version = "3.0.3";
7436 version = "2.0.2";
2793 src = fetchurl {
7437 src = fetchurl {
2794 url = "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz";
7438 url = "https://registry.npmjs.org/v8-compile-cache/-/v8-compile-cache-2.0.2.tgz";
2795 sha512 = "63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==";
7439 sha512 = "1wFuMUIM16MDJRCrpbpuEPTUGmM5QMUg0cr3KFwra2XgOgFcPGDQHDh3CszSCD2Zewc/dh/pamNEW8CbfDebUw==";
2796 };
7440 };
2797 };
7441 };
2798 "validate-npm-package-name-3.0.0" = {
7442 "v8flags-3.0.2" = {
2799 name = "validate-npm-package-name";
7443 name = "v8flags";
2800 packageName = "validate-npm-package-name";
7444 packageName = "v8flags";
2801 version = "3.0.0";
7445 version = "3.0.2";
2802 src = fetchurl {
7446 src = fetchurl {
2803 url = "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz";
7447 url = "https://registry.npmjs.org/v8flags/-/v8flags-3.0.2.tgz";
2804 sha1 = "5fa912d81eb7d0c74afc140de7317f0ca7df437e";
7448 sha512 = "6sgSKoFw1UpUPd3cFdF7QGnrH6tDeBgW1F3v9gy8gLY0mlbiBXq8soy8aQpY6xeeCjH5K+JvC62Acp7gtl7wWA==";
7449 };
7450 };
7451 "vendors-1.0.2" = {
7452 name = "vendors";
7453 packageName = "vendors";
7454 version = "1.0.2";
7455 src = fetchurl {
7456 url = "https://registry.npmjs.org/vendors/-/vendors-1.0.2.tgz";
7457 sha512 = "w/hry/368nO21AN9QljsaIhb9ZiZtZARoVH5f3CsFbawdLdayCgKRPup7CggujvySMxx0I91NOyxdVENohprLQ==";
2805 };
7458 };
2806 };
7459 };
2807 "verror-1.10.0" = {
7460 "verror-1.10.0" = {
@@ -2813,22 +7466,85 b' let'
2813 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
7466 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
2814 };
7467 };
2815 };
7468 };
2816 "vulcanize-1.16.0" = {
7469 "vm-browserify-0.0.4" = {
2817 name = "vulcanize";
7470 name = "vm-browserify";
2818 packageName = "vulcanize";
7471 packageName = "vm-browserify";
2819 version = "1.16.0";
7472 version = "0.0.4";
2820 src = fetchurl {
7473 src = fetchurl {
2821 url = "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz";
7474 url = "https://registry.npmjs.org/vm-browserify/-/vm-browserify-0.0.4.tgz";
2822 sha512 = "TYlFljSc896b5+0FmMiw0JAMrHNBiHx0IAFC/dQR3Dxdb9Nx43ohm6wMWTlPXQn4sk/0WkqfgoAA6SLxyvPCLQ==";
7475 sha1 = "5d7ea45bbef9e4a6ff65f95438e0a87c357d5a73";
2823 };
7476 };
2824 };
7477 };
2825 "walk-2.3.14" = {
7478 "watchpack-1.6.0" = {
2826 name = "walk";
7479 name = "watchpack";
2827 packageName = "walk";
7480 packageName = "watchpack";
2828 version = "2.3.14";
7481 version = "1.6.0";
2829 src = fetchurl {
7482 src = fetchurl {
2830 url = "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz";
7483 url = "https://registry.npmjs.org/watchpack/-/watchpack-1.6.0.tgz";
2831 sha512 = "5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==";
7484 sha512 = "i6dHe3EyLjMmDlU1/bGQpEw25XSjkJULPuAVKCbNRefQVq48yXKUpwg538F7AZTf9kyr57zj++pQFltUa5H7yA==";
7485 };
7486 };
7487 "waypoints-4.0.1" = {
7488 name = "waypoints";
7489 packageName = "waypoints";
7490 version = "4.0.1";
7491 src = fetchurl {
7492 url = "https://registry.npmjs.org/waypoints/-/waypoints-4.0.1.tgz";
7493 sha1 = "09979a0573810b29627cba4366a284a062ec69c8";
7494 };
7495 };
7496 "webpack-4.23.1" = {
7497 name = "webpack";
7498 packageName = "webpack";
7499 version = "4.23.1";
7500 src = fetchurl {
7501 url = "https://registry.npmjs.org/webpack/-/webpack-4.23.1.tgz";
7502 sha512 = "iE5Cu4rGEDk7ONRjisTOjVHv3dDtcFfwitSxT7evtYj/rANJpt1OuC/Kozh1pBa99AUBr1L/LsaNB+D9Xz3CEg==";
7503 };
7504 };
7505 "webpack-cli-3.1.2" = {
7506 name = "webpack-cli";
7507 packageName = "webpack-cli";
7508 version = "3.1.2";
7509 src = fetchurl {
7510 url = "https://registry.npmjs.org/webpack-cli/-/webpack-cli-3.1.2.tgz";
7511 sha512 = "Cnqo7CeqeSvC6PTdts+dywNi5CRlIPbLx1AoUPK2T6vC1YAugMG3IOoO9DmEscd+Dghw7uRlnzV1KwOe5IrtgQ==";
7512 };
7513 };
7514 "webpack-core-0.6.9" = {
7515 name = "webpack-core";
7516 packageName = "webpack-core";
7517 version = "0.6.9";
7518 src = fetchurl {
7519 url = "https://registry.npmjs.org/webpack-core/-/webpack-core-0.6.9.tgz";
7520 sha1 = "fc571588c8558da77be9efb6debdc5a3b172bdc2";
7521 };
7522 };
7523 "webpack-sources-1.3.0" = {
7524 name = "webpack-sources";
7525 packageName = "webpack-sources";
7526 version = "1.3.0";
7527 src = fetchurl {
7528 url = "https://registry.npmjs.org/webpack-sources/-/webpack-sources-1.3.0.tgz";
7529 sha512 = "OiVgSrbGu7NEnEvQJJgdSFPl2qWKkWq5lHMhgiToIiN9w34EBnjYzSYs+VbL5KoYiLNtFFa7BZIKxRED3I32pA==";
7530 };
7531 };
7532 "webpack-uglify-js-plugin-1.1.9" = {
7533 name = "webpack-uglify-js-plugin";
7534 packageName = "webpack-uglify-js-plugin";
7535 version = "1.1.9";
7536 src = fetchurl {
7537 url = "https://registry.npmjs.org/webpack-uglify-js-plugin/-/webpack-uglify-js-plugin-1.1.9.tgz";
7538 sha1 = "ecd4c27843a4ac17ee318f45229cdf1d2fb5e103";
7539 };
7540 };
7541 "whet.extend-0.9.9" = {
7542 name = "whet.extend";
7543 packageName = "whet.extend";
7544 version = "0.9.9";
7545 src = fetchurl {
7546 url = "https://registry.npmjs.org/whet.extend/-/whet.extend-0.9.9.tgz";
7547 sha1 = "f877d5bf648c97e5aa542fadc16d6a259b9c11a1";
2832 };
7548 };
2833 };
7549 };
2834 "which-1.0.9" = {
7550 "which-1.0.9" = {
@@ -2849,40 +7565,58 b' let'
2849 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
7565 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
2850 };
7566 };
2851 };
7567 };
2852 "wide-align-1.1.3" = {
7568 "which-module-2.0.0" = {
2853 name = "wide-align";
7569 name = "which-module";
2854 packageName = "wide-align";
7570 packageName = "which-module";
2855 version = "1.1.3";
7571 version = "2.0.0";
2856 src = fetchurl {
7572 src = fetchurl {
2857 url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";
7573 url = "https://registry.npmjs.org/which-module/-/which-module-2.0.0.tgz";
2858 sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==";
7574 sha1 = "d9ef07dce77b9902b8a3a8fa4b31c3e3f7e6e87a";
2859 };
7575 };
2860 };
7576 };
2861 "winston-2.4.3" = {
7577 "window-size-0.1.0" = {
7578 name = "window-size";
7579 packageName = "window-size";
7580 version = "0.1.0";
7581 src = fetchurl {
7582 url = "https://registry.npmjs.org/window-size/-/window-size-0.1.0.tgz";
7583 sha1 = "5438cd2ea93b202efa3a19fe8887aee7c94f9c9d";
7584 };
7585 };
7586 "winston-2.4.4" = {
2862 name = "winston";
7587 name = "winston";
2863 packageName = "winston";
7588 packageName = "winston";
2864 version = "2.4.3";
7589 version = "2.4.4";
2865 src = fetchurl {
7590 src = fetchurl {
2866 url = "https://registry.npmjs.org/winston/-/winston-2.4.3.tgz";
7591 url = "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz";
2867 sha512 = "GYKuysPz2pxYAVJD2NPsDLP5Z79SDEzPm9/j4tCjkF/n89iBNGBMJcR+dMUqxgPNgoSs6fVygPi+Vl2oxIpBuw==";
7592 sha512 = "NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==";
2868 };
7593 };
2869 };
7594 };
2870 "wordwrap-1.0.0" = {
7595 "wordwrap-0.0.2" = {
2871 name = "wordwrap";
7596 name = "wordwrap";
2872 packageName = "wordwrap";
7597 packageName = "wordwrap";
2873 version = "1.0.0";
7598 version = "0.0.2";
2874 src = fetchurl {
7599 src = fetchurl {
2875 url = "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz";
7600 url = "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.2.tgz";
2876 sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
7601 sha1 = "b79669bb42ecb409f83d583cad52ca17eaa1643f";
2877 };
7602 };
2878 };
7603 };
2879 "wordwrapjs-2.0.0" = {
7604 "worker-farm-1.6.0" = {
2880 name = "wordwrapjs";
7605 name = "worker-farm";
2881 packageName = "wordwrapjs";
7606 packageName = "worker-farm";
2882 version = "2.0.0";
7607 version = "1.6.0";
2883 src = fetchurl {
7608 src = fetchurl {
2884 url = "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz";
7609 url = "https://registry.npmjs.org/worker-farm/-/worker-farm-1.6.0.tgz";
2885 sha1 = "ab55f695e6118da93858fdd70c053d1c5e01ac20";
7610 sha512 = "6w+3tHbM87WnSWnENBUvA2pxJPLhQUg5LKwUQHq3r+XPhIM+Gh2R5ycbwPCyuGbNg+lPgdcnQUhuC02kJCvffQ==";
7611 };
7612 };
7613 "wrap-ansi-2.1.0" = {
7614 name = "wrap-ansi";
7615 packageName = "wrap-ansi";
7616 version = "2.1.0";
7617 src = fetchurl {
7618 url = "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-2.1.0.tgz";
7619 sha1 = "d8fc3d284dd05794fe84973caecdd1cf824fdd85";
2886 };
7620 };
2887 };
7621 };
2888 "wrappy-1.0.2" = {
7622 "wrappy-1.0.2" = {
@@ -2894,13 +7628,67 b' let'
2894 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
7628 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
2895 };
7629 };
2896 };
7630 };
2897 "yallist-3.0.2" = {
7631 "xregexp-4.0.0" = {
7632 name = "xregexp";
7633 packageName = "xregexp";
7634 version = "4.0.0";
7635 src = fetchurl {
7636 url = "https://registry.npmjs.org/xregexp/-/xregexp-4.0.0.tgz";
7637 sha512 = "PHyM+sQouu7xspQQwELlGwwd05mXUFqwFYfqPO0cC7x4fxyHnnuetmQr6CjJiafIDoH4MogHb9dOoJzR/Y4rFg==";
7638 };
7639 };
7640 "xtend-4.0.1" = {
7641 name = "xtend";
7642 packageName = "xtend";
7643 version = "4.0.1";
7644 src = fetchurl {
7645 url = "https://registry.npmjs.org/xtend/-/xtend-4.0.1.tgz";
7646 sha1 = "a5c6d532be656e23db820efb943a1f04998d63af";
7647 };
7648 };
7649 "y18n-4.0.0" = {
7650 name = "y18n";
7651 packageName = "y18n";
7652 version = "4.0.0";
7653 src = fetchurl {
7654 url = "https://registry.npmjs.org/y18n/-/y18n-4.0.0.tgz";
7655 sha512 = "r9S/ZyXu/Xu9q1tYlpsLIsa3EeLXXk0VwlxqTcFRfg9EhMW+17kbt9G0NrgCmhGb5vT2hyhJZLfDGx+7+5Uj/w==";
7656 };
7657 };
7658 "yallist-2.1.2" = {
2898 name = "yallist";
7659 name = "yallist";
2899 packageName = "yallist";
7660 packageName = "yallist";
2900 version = "3.0.2";
7661 version = "2.1.2";
2901 src = fetchurl {
7662 src = fetchurl {
2902 url = "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz";
7663 url = "https://registry.npmjs.org/yallist/-/yallist-2.1.2.tgz";
2903 sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9";
7664 sha1 = "1c11f9218f076089a47dd512f93c6699a6a81d52";
7665 };
7666 };
7667 "yargs-12.0.2" = {
7668 name = "yargs";
7669 packageName = "yargs";
7670 version = "12.0.2";
7671 src = fetchurl {
7672 url = "https://registry.npmjs.org/yargs/-/yargs-12.0.2.tgz";
7673 sha512 = "e7SkEx6N6SIZ5c5H22RTZae61qtn3PYUE8JYbBFlK9sYmh3DMQ6E5ygtaG/2BW0JZi4WGgTR2IV5ChqlqrDGVQ==";
7674 };
7675 };
7676 "yargs-3.10.0" = {
7677 name = "yargs";
7678 packageName = "yargs";
7679 version = "3.10.0";
7680 src = fetchurl {
7681 url = "https://registry.npmjs.org/yargs/-/yargs-3.10.0.tgz";
7682 sha1 = "f7ee7bd857dd7c1d2d38c0e74efbd681d1431fd1";
7683 };
7684 };
7685 "yargs-parser-10.1.0" = {
7686 name = "yargs-parser";
7687 packageName = "yargs-parser";
7688 version = "10.1.0";
7689 src = fetchurl {
7690 url = "https://registry.npmjs.org/yargs-parser/-/yargs-parser-10.1.0.tgz";
7691 sha512 = "VCIyR1wJoEBZUqk5PA+oOBF6ypbwh5aNB3I50guxAL/quggdfs4TtNHQrSazFA3fYZ+tEqfs0zIGlv0c/rgjbQ==";
2904 };
7692 };
2905 };
7693 };
2906 "yauzl-2.4.1" = {
7694 "yauzl-2.4.1" = {
@@ -2916,82 +7704,396 b' let'
2916 args = {
7704 args = {
2917 name = "rhodecode-enterprise";
7705 name = "rhodecode-enterprise";
2918 packageName = "rhodecode-enterprise";
7706 packageName = "rhodecode-enterprise";
2919 version = "1.0.0";
7707 version = "2.0.0";
2920 src = ./..;
7708 src = ./..;
2921 dependencies = [
7709 dependencies = [
7710 sources."@polymer/font-roboto-3.0.2"
7711 sources."@polymer/iron-a11y-announcer-3.0.1"
7712 sources."@polymer/iron-a11y-keys-3.0.1"
7713 sources."@polymer/iron-a11y-keys-behavior-3.0.1"
7714 sources."@polymer/iron-ajax-3.0.1"
7715 sources."@polymer/iron-autogrow-textarea-3.0.1"
7716 sources."@polymer/iron-behaviors-3.0.1"
7717 sources."@polymer/iron-checked-element-behavior-3.0.1"
7718 sources."@polymer/iron-fit-behavior-3.0.1"
7719 sources."@polymer/iron-flex-layout-3.0.1"
7720 sources."@polymer/iron-form-element-behavior-3.0.1"
7721 sources."@polymer/iron-meta-3.0.1"
7722 sources."@polymer/iron-overlay-behavior-3.0.2"
7723 sources."@polymer/iron-resizable-behavior-3.0.1"
7724 sources."@polymer/iron-validatable-behavior-3.0.1"
7725 sources."@polymer/paper-behaviors-3.0.1"
7726 sources."@polymer/paper-button-3.0.1"
7727 sources."@polymer/paper-ripple-3.0.1"
7728 sources."@polymer/paper-spinner-3.0.1"
7729 sources."@polymer/paper-styles-3.0.1"
7730 sources."@polymer/paper-toast-3.0.1"
7731 sources."@polymer/paper-toggle-button-3.0.1"
7732 sources."@polymer/paper-tooltip-3.0.1"
7733 sources."@polymer/polymer-3.1.0"
2922 sources."@types/clone-0.1.30"
7734 sources."@types/clone-0.1.30"
2923 sources."@types/node-4.2.23"
7735 sources."@types/node-6.14.0"
2924 (sources."@types/parse5-0.0.31" // {
7736 sources."@types/parse5-2.2.34"
2925 dependencies = [
7737 sources."@webassemblyjs/ast-1.7.10"
2926 sources."@types/node-6.0.114"
7738 sources."@webassemblyjs/floating-point-hex-parser-1.7.10"
2927 ];
7739 sources."@webassemblyjs/helper-api-error-1.7.10"
2928 })
7740 sources."@webassemblyjs/helper-buffer-1.7.10"
7741 sources."@webassemblyjs/helper-code-frame-1.7.10"
7742 sources."@webassemblyjs/helper-fsm-1.7.10"
7743 sources."@webassemblyjs/helper-module-context-1.7.10"
7744 sources."@webassemblyjs/helper-wasm-bytecode-1.7.10"
7745 sources."@webassemblyjs/helper-wasm-section-1.7.10"
7746 sources."@webassemblyjs/ieee754-1.7.10"
7747 sources."@webassemblyjs/leb128-1.7.10"
7748 sources."@webassemblyjs/utf8-1.7.10"
7749 sources."@webassemblyjs/wasm-edit-1.7.10"
7750 sources."@webassemblyjs/wasm-gen-1.7.10"
7751 sources."@webassemblyjs/wasm-opt-1.7.10"
7752 sources."@webassemblyjs/wasm-parser-1.7.10"
7753 sources."@webassemblyjs/wast-parser-1.7.10"
7754 sources."@webassemblyjs/wast-printer-1.7.10"
7755 sources."@webcomponents/shadycss-1.5.2"
7756 sources."@webcomponents/webcomponentsjs-2.1.3"
7757 sources."@xtuc/ieee754-1.2.0"
7758 sources."@xtuc/long-4.2.1"
2929 sources."abbrev-1.1.1"
7759 sources."abbrev-1.1.1"
2930 sources."acorn-3.3.0"
7760 sources."acorn-5.7.3"
2931 sources."acorn-jsx-3.0.1"
7761 sources."acorn-dynamic-import-3.0.0"
7762 (sources."acorn-jsx-3.0.1" // {
7763 dependencies = [
7764 sources."acorn-3.3.0"
7765 ];
7766 })
2932 sources."ajv-4.11.8"
7767 sources."ajv-4.11.8"
7768 sources."ajv-keywords-3.2.0"
7769 (sources."align-text-0.1.4" // {
7770 dependencies = [
7771 sources."kind-of-3.2.2"
7772 ];
7773 })
7774 sources."alphanum-sort-1.0.2"
2933 sources."amdefine-1.0.1"
7775 sources."amdefine-1.0.1"
2934 sources."ansi-escape-sequences-3.0.0"
7776 sources."ansi-regex-0.2.1"
2935 sources."ansi-regex-2.1.1"
7777 sources."ansi-styles-1.1.0"
2936 sources."ansi-styles-2.2.1"
7778 sources."anymatch-2.0.0"
2937 sources."appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
7779 sources."appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
2938 sources."aproba-1.2.0"
7780 sources."aproba-1.2.0"
2939 sources."are-we-there-yet-1.1.5"
2940 (sources."argparse-0.1.16" // {
7781 (sources."argparse-0.1.16" // {
2941 dependencies = [
7782 dependencies = [
2942 sources."underscore.string-2.4.0"
7783 sources."underscore.string-2.4.0"
2943 ];
7784 ];
2944 })
7785 })
2945 sources."array-back-1.0.4"
7786 sources."arr-diff-4.0.0"
7787 sources."arr-flatten-1.1.0"
7788 sources."arr-union-3.1.0"
7789 sources."array-each-1.0.1"
7790 sources."array-slice-1.1.0"
7791 sources."array-union-1.0.2"
7792 sources."array-uniq-1.0.3"
7793 sources."array-unique-0.3.2"
7794 sources."arrify-1.0.1"
2946 sources."asap-2.0.6"
7795 sources."asap-2.0.6"
2947 sources."asn1-0.2.3"
7796 sources."asn1-0.2.4"
7797 sources."asn1.js-4.10.1"
7798 (sources."assert-1.4.1" // {
7799 dependencies = [
7800 sources."inherits-2.0.1"
7801 sources."util-0.10.3"
7802 ];
7803 })
2948 sources."assert-plus-0.2.0"
7804 sources."assert-plus-0.2.0"
7805 sources."assign-symbols-1.0.0"
7806 sources."ast-types-0.9.6"
2949 sources."async-0.1.22"
7807 sources."async-0.1.22"
7808 sources."async-each-1.0.1"
2950 sources."asynckit-0.4.0"
7809 sources."asynckit-0.4.0"
7810 sources."atob-2.1.2"
7811 (sources."autoprefixer-6.7.7" // {
7812 dependencies = [
7813 sources."browserslist-1.7.7"
7814 ];
7815 })
2951 sources."aws-sign2-0.6.0"
7816 sources."aws-sign2-0.6.0"
2952 sources."aws4-1.7.0"
7817 sources."aws4-1.8.0"
2953 sources."babel-polyfill-6.26.0"
7818 (sources."babel-code-frame-6.26.0" // {
2954 (sources."babel-runtime-6.26.0" // {
7819 dependencies = [
2955 dependencies = [
7820 sources."ansi-regex-2.1.1"
2956 sources."regenerator-runtime-0.11.1"
7821 sources."ansi-styles-2.2.1"
2957 ];
7822 sources."chalk-1.1.3"
2958 })
7823 sources."has-ansi-2.0.0"
7824 sources."strip-ansi-3.0.1"
7825 sources."supports-color-2.0.0"
7826 ];
7827 })
7828 (sources."babel-core-6.26.3" // {
7829 dependencies = [
7830 sources."lodash-4.17.11"
7831 sources."minimatch-3.0.4"
7832 ];
7833 })
7834 (sources."babel-generator-6.26.1" // {
7835 dependencies = [
7836 sources."lodash-4.17.11"
7837 ];
7838 })
7839 sources."babel-helper-builder-binary-assignment-operator-visitor-6.24.1"
7840 sources."babel-helper-call-delegate-6.24.1"
7841 (sources."babel-helper-define-map-6.26.0" // {
7842 dependencies = [
7843 sources."lodash-4.17.11"
7844 ];
7845 })
7846 sources."babel-helper-explode-assignable-expression-6.24.1"
7847 sources."babel-helper-function-name-6.24.1"
7848 sources."babel-helper-get-function-arity-6.24.1"
7849 sources."babel-helper-hoist-variables-6.24.1"
7850 sources."babel-helper-optimise-call-expression-6.24.1"
7851 (sources."babel-helper-regex-6.26.0" // {
7852 dependencies = [
7853 sources."lodash-4.17.11"
7854 ];
7855 })
7856 sources."babel-helper-remap-async-to-generator-6.24.1"
7857 sources."babel-helper-replace-supers-6.24.1"
7858 sources."babel-helpers-6.24.1"
7859 sources."babel-loader-7.1.5"
7860 sources."babel-messages-6.23.0"
7861 sources."babel-plugin-check-es2015-constants-6.22.0"
7862 sources."babel-plugin-syntax-async-functions-6.13.0"
7863 sources."babel-plugin-syntax-exponentiation-operator-6.13.0"
7864 sources."babel-plugin-syntax-object-rest-spread-6.13.0"
7865 sources."babel-plugin-syntax-trailing-function-commas-6.22.0"
7866 sources."babel-plugin-transform-async-to-generator-6.24.1"
7867 sources."babel-plugin-transform-es2015-arrow-functions-6.22.0"
7868 sources."babel-plugin-transform-es2015-block-scoped-functions-6.22.0"
7869 (sources."babel-plugin-transform-es2015-block-scoping-6.26.0" // {
7870 dependencies = [
7871 sources."lodash-4.17.11"
7872 ];
7873 })
7874 sources."babel-plugin-transform-es2015-classes-6.24.1"
7875 sources."babel-plugin-transform-es2015-computed-properties-6.24.1"
7876 sources."babel-plugin-transform-es2015-destructuring-6.23.0"
7877 sources."babel-plugin-transform-es2015-duplicate-keys-6.24.1"
7878 sources."babel-plugin-transform-es2015-for-of-6.23.0"
7879 sources."babel-plugin-transform-es2015-function-name-6.24.1"
7880 sources."babel-plugin-transform-es2015-literals-6.22.0"
7881 sources."babel-plugin-transform-es2015-modules-amd-6.24.1"
7882 sources."babel-plugin-transform-es2015-modules-commonjs-6.26.2"
7883 sources."babel-plugin-transform-es2015-modules-systemjs-6.24.1"
7884 sources."babel-plugin-transform-es2015-modules-umd-6.24.1"
7885 sources."babel-plugin-transform-es2015-object-super-6.24.1"
7886 sources."babel-plugin-transform-es2015-parameters-6.24.1"
7887 sources."babel-plugin-transform-es2015-shorthand-properties-6.24.1"
7888 sources."babel-plugin-transform-es2015-spread-6.22.0"
7889 sources."babel-plugin-transform-es2015-sticky-regex-6.24.1"
7890 sources."babel-plugin-transform-es2015-template-literals-6.22.0"
7891 sources."babel-plugin-transform-es2015-typeof-symbol-6.23.0"
7892 sources."babel-plugin-transform-es2015-unicode-regex-6.24.1"
7893 sources."babel-plugin-transform-exponentiation-operator-6.24.1"
7894 sources."babel-plugin-transform-object-rest-spread-6.26.0"
7895 sources."babel-plugin-transform-regenerator-6.26.0"
7896 sources."babel-plugin-transform-strict-mode-6.24.1"
7897 sources."babel-preset-env-1.7.0"
7898 (sources."babel-register-6.26.0" // {
7899 dependencies = [
7900 sources."lodash-4.17.11"
7901 ];
7902 })
7903 sources."babel-runtime-6.26.0"
7904 (sources."babel-template-6.26.0" // {
7905 dependencies = [
7906 sources."lodash-4.17.11"
7907 ];
7908 })
7909 (sources."babel-traverse-6.26.0" // {
7910 dependencies = [
7911 sources."lodash-4.17.11"
7912 ];
7913 })
7914 (sources."babel-types-6.26.0" // {
7915 dependencies = [
7916 sources."lodash-4.17.11"
7917 ];
7918 })
7919 sources."babylon-6.18.0"
2959 sources."balanced-match-1.0.0"
7920 sources."balanced-match-1.0.0"
2960 sources."base64-js-1.2.3"
7921 (sources."base-0.11.2" // {
7922 dependencies = [
7923 sources."define-property-1.0.0"
7924 ];
7925 })
7926 sources."base64-js-1.3.0"
2961 sources."bcrypt-pbkdf-1.0.2"
7927 sources."bcrypt-pbkdf-1.0.2"
7928 sources."big.js-3.2.0"
7929 sources."binary-extensions-1.12.0"
7930 sources."bluebird-3.5.2"
7931 sources."bn.js-4.11.8"
7932 sources."boolbase-1.0.0"
2962 sources."boom-2.10.1"
7933 sources."boom-2.10.1"
2963 sources."bower-1.8.4"
2964 sources."brace-expansion-1.1.11"
7934 sources."brace-expansion-1.1.11"
7935 (sources."braces-2.3.2" // {
7936 dependencies = [
7937 sources."extend-shallow-2.0.1"
7938 ];
7939 })
7940 sources."brorand-1.1.0"
7941 sources."browserify-aes-1.2.0"
7942 sources."browserify-cipher-1.0.1"
7943 sources."browserify-des-1.0.2"
7944 sources."browserify-rsa-4.0.1"
7945 sources."browserify-sign-4.0.4"
7946 sources."browserify-zlib-0.2.0"
7947 sources."browserslist-3.2.8"
7948 sources."buffer-4.9.1"
2965 sources."buffer-from-1.1.1"
7949 sources."buffer-from-1.1.1"
2966 sources."builtin-modules-1.1.1"
7950 sources."buffer-xor-1.0.3"
2967 sources."builtins-1.0.3"
7951 sources."builtin-status-codes-3.0.0"
7952 (sources."cacache-10.0.4" // {
7953 dependencies = [
7954 sources."glob-7.1.3"
7955 sources."graceful-fs-4.1.11"
7956 sources."lru-cache-4.1.3"
7957 sources."minimatch-3.0.4"
7958 sources."rimraf-2.6.2"
7959 ];
7960 })
7961 sources."cache-base-1.0.1"
7962 sources."camel-case-3.0.0"
7963 sources."camelcase-4.1.0"
7964 (sources."caniuse-api-1.6.1" // {
7965 dependencies = [
7966 sources."browserslist-1.7.7"
7967 ];
7968 })
7969 sources."caniuse-db-1.0.30000900"
7970 sources."caniuse-lite-1.0.30000900"
2968 sources."caseless-0.12.0"
7971 sources."caseless-0.12.0"
2969 sources."chalk-1.1.3"
7972 sources."center-align-0.1.3"
7973 sources."chalk-0.5.1"
7974 (sources."chokidar-2.0.4" // {
7975 dependencies = [
7976 sources."is-glob-4.0.0"
7977 ];
7978 })
7979 sources."chownr-1.1.1"
7980 sources."chrome-trace-event-1.0.0"
7981 sources."cipher-base-1.0.4"
7982 (sources."clap-1.2.3" // {
7983 dependencies = [
7984 sources."ansi-regex-2.1.1"
7985 sources."ansi-styles-2.2.1"
7986 sources."chalk-1.1.3"
7987 sources."has-ansi-2.0.0"
7988 sources."strip-ansi-3.0.1"
7989 sources."supports-color-2.0.0"
7990 ];
7991 })
7992 (sources."class-utils-0.3.6" // {
7993 dependencies = [
7994 sources."define-property-0.2.5"
7995 (sources."is-accessor-descriptor-0.1.6" // {
7996 dependencies = [
7997 sources."kind-of-3.2.2"
7998 ];
7999 })
8000 (sources."is-data-descriptor-0.1.4" // {
8001 dependencies = [
8002 sources."kind-of-3.2.2"
8003 ];
8004 })
8005 sources."is-descriptor-0.1.6"
8006 sources."kind-of-5.1.0"
8007 ];
8008 })
8009 (sources."clean-css-4.2.1" // {
8010 dependencies = [
8011 sources."source-map-0.6.1"
8012 ];
8013 })
2970 (sources."cli-1.0.1" // {
8014 (sources."cli-1.0.1" // {
2971 dependencies = [
8015 dependencies = [
2972 sources."glob-7.1.2"
8016 sources."glob-7.1.3"
2973 sources."minimatch-3.0.4"
8017 sources."minimatch-3.0.4"
2974 ];
8018 ];
2975 })
8019 })
2976 sources."clipboard-2.0.1"
8020 sources."clipboard-2.0.1"
8021 (sources."cliui-4.1.0" // {
8022 dependencies = [
8023 sources."ansi-regex-3.0.0"
8024 sources."strip-ansi-4.0.0"
8025 ];
8026 })
2977 sources."clone-1.0.4"
8027 sources."clone-1.0.4"
2978 sources."co-4.6.0"
8028 sources."co-4.6.0"
8029 sources."coa-1.0.4"
2979 sources."code-point-at-1.1.0"
8030 sources."code-point-at-1.1.0"
2980 sources."coffee-script-1.3.3"
8031 sources."coffee-script-1.3.3"
8032 sources."collection-visit-1.0.0"
8033 sources."color-0.11.4"
8034 sources."color-convert-1.9.3"
8035 sources."color-name-1.1.3"
8036 sources."color-string-0.3.0"
8037 sources."colormin-1.1.2"
2981 sources."colors-0.6.2"
8038 sources."colors-0.6.2"
2982 sources."combined-stream-1.0.6"
8039 sources."combined-stream-1.0.7"
2983 sources."command-line-args-3.0.5"
8040 sources."commander-2.14.1"
2984 sources."command-line-usage-3.0.8"
8041 sources."commondir-1.0.1"
8042 sources."component-emitter-1.2.1"
2985 sources."concat-map-0.0.1"
8043 sources."concat-map-0.0.1"
2986 sources."concat-stream-1.6.2"
8044 (sources."concat-stream-1.6.2" // {
2987 sources."config-chain-1.1.11"
8045 dependencies = [
8046 sources."readable-stream-2.3.6"
8047 sources."string_decoder-1.1.1"
8048 ];
8049 })
2988 sources."console-browserify-1.1.0"
8050 sources."console-browserify-1.1.0"
2989 sources."console-control-strings-1.1.0"
8051 sources."constants-browserify-1.0.0"
8052 sources."convert-source-map-1.6.0"
8053 (sources."copy-concurrently-1.0.5" // {
8054 dependencies = [
8055 sources."glob-7.1.3"
8056 sources."minimatch-3.0.4"
8057 sources."rimraf-2.6.2"
8058 ];
8059 })
8060 sources."copy-descriptor-0.1.1"
8061 (sources."copy-webpack-plugin-4.5.4" // {
8062 dependencies = [
8063 sources."is-glob-4.0.0"
8064 sources."minimatch-3.0.4"
8065 ];
8066 })
2990 sources."core-js-2.5.7"
8067 sources."core-js-2.5.7"
2991 sources."core-util-is-1.0.2"
8068 sources."core-util-is-1.0.2"
2992 sources."crisper-2.1.1"
8069 sources."create-ecdh-4.0.3"
8070 sources."create-hash-1.2.0"
8071 sources."create-hmac-1.1.7"
8072 (sources."cross-spawn-6.0.5" // {
8073 dependencies = [
8074 sources."which-1.3.1"
8075 ];
8076 })
2993 sources."cryptiles-2.0.5"
8077 sources."cryptiles-2.0.5"
8078 sources."crypto-browserify-3.12.0"
8079 sources."css-color-names-0.0.4"
8080 sources."css-loader-0.28.11"
8081 sources."css-select-1.2.0"
8082 (sources."css-selector-tokenizer-0.7.0" // {
8083 dependencies = [
8084 sources."regexpu-core-1.0.0"
8085 ];
8086 })
8087 sources."css-what-2.1.2"
8088 sources."cssesc-0.1.0"
8089 (sources."cssnano-3.10.0" // {
8090 dependencies = [
8091 sources."decamelize-1.2.0"
8092 ];
8093 })
8094 sources."csso-2.3.2"
2994 sources."cycle-1.0.3"
8095 sources."cycle-1.0.3"
8096 sources."cyclist-0.2.2"
2995 (sources."dashdash-1.14.1" // {
8097 (sources."dashdash-1.14.1" // {
2996 dependencies = [
8098 dependencies = [
2997 sources."assert-plus-1.0.0"
8099 sources."assert-plus-1.0.0"
@@ -2999,62 +8101,120 b' let'
2999 })
8101 })
3000 sources."date-now-0.1.4"
8102 sources."date-now-0.1.4"
3001 sources."dateformat-1.0.2-1.2.3"
8103 sources."dateformat-1.0.2-1.2.3"
3002 sources."debug-0.7.4"
8104 sources."debug-2.6.9"
3003 sources."deep-extend-0.4.2"
8105 sources."decamelize-2.0.0"
3004 sources."deep-is-0.1.3"
8106 sources."decode-uri-component-0.2.0"
8107 sources."deep-for-each-2.0.3"
8108 sources."define-properties-1.1.3"
8109 sources."define-property-2.0.2"
8110 sources."defined-1.0.0"
3005 sources."delayed-stream-1.0.0"
8111 sources."delayed-stream-1.0.0"
3006 sources."delegate-3.2.0"
8112 sources."delegate-3.2.0"
3007 sources."delegates-1.0.0"
8113 sources."des.js-1.0.0"
3008 sources."doctrine-0.7.2"
8114 sources."detect-file-1.0.0"
8115 sources."detect-indent-4.0.0"
8116 sources."diffie-hellman-5.0.3"
8117 sources."dir-glob-2.0.0"
8118 sources."dom-converter-0.2.0"
3009 (sources."dom-serializer-0.1.0" // {
8119 (sources."dom-serializer-0.1.0" // {
3010 dependencies = [
8120 dependencies = [
3011 sources."domelementtype-1.1.3"
8121 sources."domelementtype-1.1.3"
3012 sources."entities-1.1.1"
8122 sources."entities-1.1.2"
3013 ];
8123 ];
3014 })
8124 })
3015 sources."dom5-1.3.6"
8125 (sources."dom5-2.3.0" // {
8126 dependencies = [
8127 sources."clone-2.1.2"
8128 sources."parse5-2.2.3"
8129 ];
8130 })
8131 sources."domain-browser-1.2.0"
3016 sources."domelementtype-1.3.0"
8132 sources."domelementtype-1.3.0"
3017 sources."domhandler-2.3.0"
8133 sources."domhandler-2.3.0"
3018 sources."domutils-1.5.1"
8134 sources."domutils-1.5.1"
8135 (sources."duplexify-3.6.1" // {
8136 dependencies = [
8137 sources."readable-stream-2.3.6"
8138 sources."string_decoder-1.1.1"
8139 ];
8140 })
3019 sources."ecc-jsbn-0.1.2"
8141 sources."ecc-jsbn-0.1.2"
8142 sources."electron-to-chromium-1.3.82"
8143 sources."elliptic-6.4.1"
8144 sources."emojis-list-2.1.0"
8145 sources."end-of-stream-1.4.1"
8146 (sources."enhanced-resolve-4.1.0" // {
8147 dependencies = [
8148 sources."graceful-fs-4.1.11"
8149 ];
8150 })
3020 sources."entities-1.0.0"
8151 sources."entities-1.0.0"
3021 sources."errno-0.1.7"
8152 sources."errno-0.1.7"
3022 sources."es6-promise-2.3.0"
8153 sources."es-abstract-1.12.0"
8154 sources."es-to-primitive-1.2.0"
8155 sources."es6-promise-4.2.5"
8156 sources."es6-templates-0.2.3"
3023 sources."escape-string-regexp-1.0.5"
8157 sources."escape-string-regexp-1.0.5"
3024 (sources."escodegen-1.11.0" // {
8158 sources."eslint-scope-4.0.0"
3025 dependencies = [
8159 sources."espree-3.5.4"
3026 sources."esprima-3.1.3"
3027 sources."estraverse-4.2.0"
3028 sources."esutils-2.0.2"
3029 sources."source-map-0.6.1"
3030 ];
3031 })
3032 (sources."espree-3.5.4" // {
3033 dependencies = [
3034 sources."acorn-5.7.1"
3035 ];
3036 })
3037 sources."esprima-1.0.4"
8160 sources."esprima-1.0.4"
3038 sources."estraverse-3.1.0"
8161 sources."esrecurse-4.2.1"
3039 sources."esutils-1.1.6"
8162 sources."estraverse-4.2.0"
8163 sources."esutils-2.0.2"
3040 sources."eventemitter2-0.4.14"
8164 sources."eventemitter2-0.4.14"
8165 sources."events-1.1.1"
8166 sources."evp_bytestokey-1.0.3"
8167 sources."execa-0.10.0"
3041 sources."exit-0.1.2"
8168 sources."exit-0.1.2"
8169 (sources."expand-brackets-2.1.4" // {
8170 dependencies = [
8171 sources."define-property-0.2.5"
8172 sources."extend-shallow-2.0.1"
8173 (sources."is-accessor-descriptor-0.1.6" // {
8174 dependencies = [
8175 sources."kind-of-3.2.2"
8176 ];
8177 })
8178 (sources."is-data-descriptor-0.1.4" // {
8179 dependencies = [
8180 sources."kind-of-3.2.2"
8181 ];
8182 })
8183 sources."is-descriptor-0.1.6"
8184 sources."kind-of-5.1.0"
8185 ];
8186 })
8187 sources."expand-tilde-2.0.2"
8188 sources."exports-loader-0.6.4"
3042 sources."extend-3.0.2"
8189 sources."extend-3.0.2"
3043 (sources."extract-zip-1.6.7" // {
8190 (sources."extend-shallow-3.0.2" // {
3044 dependencies = [
8191 dependencies = [
3045 sources."debug-2.6.9"
8192 sources."is-extendable-1.0.1"
3046 ];
8193 ];
3047 })
8194 })
8195 (sources."extglob-2.0.4" // {
8196 dependencies = [
8197 sources."define-property-1.0.0"
8198 sources."extend-shallow-2.0.1"
8199 ];
8200 })
8201 sources."extract-zip-1.6.7"
3048 sources."extsprintf-1.3.0"
8202 sources."extsprintf-1.3.0"
3049 sources."eyes-0.1.8"
8203 sources."eyes-0.1.8"
3050 sources."fast-levenshtein-2.0.6"
8204 sources."fast-deep-equal-2.0.1"
8205 sources."fast-json-stable-stringify-2.0.0"
8206 sources."fastparse-1.1.1"
3051 sources."favico.js-0.3.10"
8207 sources."favico.js-0.3.10"
3052 sources."faye-websocket-0.4.4"
8208 sources."faye-websocket-0.4.4"
3053 sources."fd-slicer-1.0.1"
8209 sources."fd-slicer-1.0.1"
3054 sources."feature-detect-es6-1.5.0"
3055 sources."file-sync-cmp-0.1.1"
8210 sources."file-sync-cmp-0.1.1"
3056 sources."find-replace-1.0.3"
8211 (sources."fill-range-4.0.0" // {
3057 sources."findit-2.0.0"
8212 dependencies = [
8213 sources."extend-shallow-2.0.1"
8214 ];
8215 })
8216 sources."find-cache-dir-1.0.0"
8217 sources."find-up-2.1.0"
3058 (sources."findup-sync-0.1.3" // {
8218 (sources."findup-sync-0.1.3" // {
3059 dependencies = [
8219 dependencies = [
3060 sources."glob-3.2.11"
8220 sources."glob-3.2.11"
@@ -3062,22 +8222,43 b' let'
3062 sources."minimatch-0.3.0"
8222 sources."minimatch-0.3.0"
3063 ];
8223 ];
3064 })
8224 })
3065 sources."foreachasync-3.0.0"
8225 sources."fined-1.1.0"
8226 sources."flagged-respawn-1.0.0"
8227 sources."flatten-1.0.2"
8228 (sources."flush-write-stream-1.0.3" // {
8229 dependencies = [
8230 sources."readable-stream-2.3.6"
8231 sources."string_decoder-1.1.1"
8232 ];
8233 })
8234 sources."for-in-1.0.2"
8235 sources."for-own-1.0.0"
3066 sources."forever-agent-0.6.1"
8236 sources."forever-agent-0.6.1"
3067 sources."form-data-2.1.4"
8237 sources."form-data-2.1.4"
3068 (sources."fs-extra-0.6.4" // {
8238 sources."fragment-cache-0.2.1"
3069 dependencies = [
8239 (sources."from2-2.3.0" // {
3070 sources."mkdirp-0.3.5"
8240 dependencies = [
3071 ];
8241 sources."readable-stream-2.3.6"
3072 })
8242 sources."string_decoder-1.1.1"
3073 (sources."fs.extra-1.3.2" // {
8243 ];
3074 dependencies = [
8244 })
3075 sources."mkdirp-0.3.5"
8245 (sources."fs-extra-1.0.0" // {
8246 dependencies = [
8247 sources."graceful-fs-4.1.11"
8248 ];
8249 })
8250 (sources."fs-write-stream-atomic-1.0.10" // {
8251 dependencies = [
8252 sources."graceful-fs-4.1.11"
3076 ];
8253 ];
3077 })
8254 })
3078 sources."fs.realpath-1.0.0"
8255 sources."fs.realpath-1.0.0"
3079 sources."gauge-2.7.4"
8256 sources."fsevents-1.2.4"
8257 sources."function-bind-1.1.1"
3080 sources."gaze-0.5.2"
8258 sources."gaze-0.5.2"
8259 sources."get-caller-file-1.0.3"
8260 sources."get-stream-3.0.0"
8261 sources."get-value-2.0.6"
3081 sources."getobject-0.1.0"
8262 sources."getobject-0.1.0"
3082 (sources."getpass-0.1.7" // {
8263 (sources."getpass-0.1.7" // {
3083 dependencies = [
8264 dependencies = [
@@ -3089,6 +8270,21 b' let'
3089 sources."inherits-1.0.2"
8270 sources."inherits-1.0.2"
3090 ];
8271 ];
3091 })
8272 })
8273 sources."glob-parent-3.1.0"
8274 sources."global-modules-1.0.0"
8275 sources."global-modules-path-2.3.0"
8276 (sources."global-prefix-1.0.2" // {
8277 dependencies = [
8278 sources."which-1.3.1"
8279 ];
8280 })
8281 sources."globals-9.18.0"
8282 (sources."globby-7.1.1" // {
8283 dependencies = [
8284 sources."glob-7.1.3"
8285 sources."minimatch-3.0.4"
8286 ];
8287 })
3092 (sources."globule-0.1.0" // {
8288 (sources."globule-0.1.0" // {
3093 dependencies = [
8289 dependencies = [
3094 sources."lodash-1.0.2"
8290 sources."lodash-1.0.2"
@@ -3097,22 +8293,37 b' let'
3097 sources."good-listener-1.2.2"
8293 sources."good-listener-1.2.2"
3098 sources."graceful-fs-1.2.3"
8294 sources."graceful-fs-1.2.3"
3099 sources."grunt-0.4.5"
8295 sources."grunt-0.4.5"
8296 (sources."grunt-cli-1.3.1" // {
8297 dependencies = [
8298 sources."nopt-4.0.1"
8299 ];
8300 })
3100 (sources."grunt-contrib-concat-0.5.1" // {
8301 (sources."grunt-contrib-concat-0.5.1" // {
3101 dependencies = [
8302 dependencies = [
3102 sources."ansi-regex-0.2.1"
8303 sources."source-map-0.3.0"
3103 sources."ansi-styles-1.1.0"
8304 ];
3104 sources."chalk-0.5.1"
8305 })
3105 sources."has-ansi-0.1.0"
8306 (sources."grunt-contrib-copy-1.0.0" // {
3106 sources."strip-ansi-0.3.0"
8307 dependencies = [
3107 sources."supports-color-0.2.0"
8308 sources."ansi-regex-2.1.1"
3108 ];
8309 sources."ansi-styles-2.2.1"
3109 })
8310 sources."chalk-1.1.3"
3110 sources."grunt-contrib-copy-1.0.0"
8311 sources."has-ansi-2.0.0"
8312 sources."strip-ansi-3.0.1"
8313 sources."supports-color-2.0.0"
8314 ];
8315 })
3111 sources."grunt-contrib-jshint-0.12.0"
8316 sources."grunt-contrib-jshint-0.12.0"
3112 (sources."grunt-contrib-less-1.4.1" // {
8317 (sources."grunt-contrib-less-1.4.1" // {
3113 dependencies = [
8318 dependencies = [
8319 sources."ansi-regex-2.1.1"
8320 sources."ansi-styles-2.2.1"
3114 sources."async-2.6.1"
8321 sources."async-2.6.1"
3115 sources."lodash-4.17.10"
8322 sources."chalk-1.1.3"
8323 sources."has-ansi-2.0.0"
8324 sources."lodash-4.17.11"
8325 sources."strip-ansi-3.0.1"
8326 sources."supports-color-2.0.0"
3116 ];
8327 ];
3117 })
8328 })
3118 (sources."grunt-contrib-watch-0.6.1" // {
8329 (sources."grunt-contrib-watch-0.6.1" // {
@@ -3121,7 +8332,7 b' let'
3121 sources."lodash-2.4.2"
8332 sources."lodash-2.4.2"
3122 ];
8333 ];
3123 })
8334 })
3124 sources."grunt-crisper-1.0.1"
8335 sources."grunt-known-options-1.1.1"
3125 (sources."grunt-legacy-log-0.1.3" // {
8336 (sources."grunt-legacy-log-0.1.3" // {
3126 dependencies = [
8337 dependencies = [
3127 sources."lodash-2.4.2"
8338 sources."lodash-2.4.2"
@@ -3135,58 +8346,140 b' let'
3135 ];
8346 ];
3136 })
8347 })
3137 sources."grunt-legacy-util-0.2.0"
8348 sources."grunt-legacy-util-0.2.0"
3138 (sources."grunt-vulcanize-1.0.0" // {
8349 (sources."grunt-webpack-3.1.3" // {
3139 dependencies = [
8350 dependencies = [
3140 sources."crisper-1.2.0"
8351 sources."lodash-4.17.11"
3141 sources."nopt-3.0.6"
3142 ];
8352 ];
3143 })
8353 })
3144 sources."har-schema-1.0.5"
8354 sources."har-schema-1.0.5"
3145 sources."har-validator-4.2.1"
8355 sources."har-validator-4.2.1"
3146 sources."has-ansi-2.0.0"
8356 sources."has-1.0.3"
3147 sources."has-unicode-2.0.1"
8357 sources."has-ansi-0.1.0"
8358 sources."has-flag-3.0.0"
8359 sources."has-symbols-1.0.0"
8360 sources."has-value-1.0.0"
8361 (sources."has-values-1.0.0" // {
8362 dependencies = [
8363 sources."kind-of-4.0.0"
8364 ];
8365 })
8366 sources."hash-base-3.0.4"
8367 sources."hash.js-1.1.5"
3148 sources."hasha-2.2.0"
8368 sources."hasha-2.2.0"
3149 sources."hawk-3.1.3"
8369 sources."hawk-3.1.3"
8370 sources."he-1.2.0"
8371 sources."hmac-drbg-1.0.1"
3150 sources."hoek-2.16.3"
8372 sources."hoek-2.16.3"
8373 sources."home-or-tmp-2.0.0"
8374 sources."homedir-polyfill-1.0.1"
3151 sources."hooker-0.2.3"
8375 sources."hooker-0.2.3"
3152 sources."hosted-git-info-2.7.1"
8376 sources."html-comment-regex-1.1.2"
3153 (sources."htmlparser2-3.8.3" // {
8377 sources."html-loader-0.4.5"
3154 dependencies = [
8378 (sources."html-minifier-3.5.21" // {
3155 sources."readable-stream-1.1.14"
8379 dependencies = [
3156 sources."string_decoder-0.10.31"
8380 sources."commander-2.17.1"
3157 ];
8381 ];
3158 })
8382 })
8383 (sources."html-webpack-plugin-3.2.0" // {
8384 dependencies = [
8385 sources."loader-utils-0.2.17"
8386 sources."lodash-4.17.11"
8387 ];
8388 })
8389 sources."htmlparser2-3.8.3"
3159 sources."http-signature-1.1.1"
8390 sources."http-signature-1.1.1"
3160 (sources."hydrolysis-1.25.0" // {
8391 sources."https-browserify-1.0.0"
3161 dependencies = [
3162 sources."dom5-1.1.0"
3163 ];
3164 })
3165 sources."iconv-lite-0.2.11"
8392 sources."iconv-lite-0.2.11"
8393 sources."icss-replace-symbols-1.1.0"
8394 (sources."icss-utils-2.1.0" // {
8395 dependencies = [
8396 sources."ansi-styles-3.2.1"
8397 sources."chalk-2.4.1"
8398 sources."postcss-6.0.23"
8399 sources."source-map-0.6.1"
8400 sources."supports-color-5.5.0"
8401 ];
8402 })
8403 sources."ieee754-1.1.12"
8404 sources."iferr-0.1.5"
8405 sources."ignore-3.3.10"
3166 sources."image-size-0.5.5"
8406 sources."image-size-0.5.5"
8407 (sources."import-local-2.0.0" // {
8408 dependencies = [
8409 sources."find-up-3.0.0"
8410 sources."locate-path-3.0.0"
8411 sources."p-limit-2.0.0"
8412 sources."p-locate-3.0.0"
8413 sources."p-try-2.0.0"
8414 sources."pkg-dir-3.0.0"
8415 ];
8416 })
8417 sources."imports-loader-0.7.1"
8418 sources."imurmurhash-0.1.4"
8419 sources."indexes-of-1.0.1"
8420 sources."indexof-0.0.1"
3167 sources."inflight-1.0.6"
8421 sources."inflight-1.0.6"
3168 sources."inherits-2.0.3"
8422 sources."inherits-2.0.3"
3169 sources."ini-1.3.5"
8423 sources."ini-1.3.5"
3170 sources."is-builtin-module-1.0.0"
8424 sources."interpret-1.1.0"
8425 sources."invariant-2.2.4"
8426 sources."invert-kv-2.0.0"
8427 sources."is-absolute-1.0.0"
8428 sources."is-absolute-url-2.1.0"
8429 sources."is-accessor-descriptor-1.0.0"
8430 sources."is-binary-path-1.0.1"
8431 sources."is-buffer-1.1.6"
8432 sources."is-callable-1.1.4"
8433 sources."is-data-descriptor-1.0.0"
8434 sources."is-date-object-1.0.1"
8435 sources."is-descriptor-1.0.2"
8436 sources."is-extendable-0.1.1"
8437 sources."is-extglob-2.1.1"
8438 sources."is-finite-1.0.2"
3171 sources."is-fullwidth-code-point-1.0.0"
8439 sources."is-fullwidth-code-point-1.0.0"
8440 sources."is-glob-3.1.0"
8441 (sources."is-number-3.0.0" // {
8442 dependencies = [
8443 sources."kind-of-3.2.2"
8444 ];
8445 })
8446 sources."is-plain-obj-1.1.0"
8447 sources."is-plain-object-2.0.4"
8448 sources."is-regex-1.0.4"
8449 sources."is-relative-1.0.0"
3172 sources."is-stream-1.1.0"
8450 sources."is-stream-1.1.0"
8451 sources."is-svg-2.1.0"
8452 sources."is-symbol-1.0.2"
3173 sources."is-typedarray-1.0.0"
8453 sources."is-typedarray-1.0.0"
3174 sources."isarray-0.0.1"
8454 sources."is-unc-path-1.0.0"
8455 sources."is-windows-1.0.2"
8456 sources."isarray-1.0.0"
3175 sources."isexe-2.0.0"
8457 sources."isexe-2.0.0"
8458 sources."isobject-3.0.1"
3176 sources."isstream-0.1.2"
8459 sources."isstream-0.1.2"
3177 sources."jquery-1.11.3"
8460 sources."jquery-1.11.3"
8461 sources."js-base64-2.4.9"
8462 sources."js-tokens-3.0.2"
3178 sources."js-yaml-2.0.5"
8463 sources."js-yaml-2.0.5"
3179 sources."jsbn-0.1.1"
8464 sources."jsbn-0.1.1"
8465 sources."jsesc-1.3.0"
3180 (sources."jshint-2.9.6" // {
8466 (sources."jshint-2.9.6" // {
3181 dependencies = [
8467 dependencies = [
3182 sources."lodash-4.17.10"
8468 sources."lodash-4.17.11"
3183 sources."minimatch-3.0.4"
8469 sources."minimatch-3.0.4"
3184 ];
8470 ];
3185 })
8471 })
8472 sources."json-parse-better-errors-1.0.2"
3186 sources."json-schema-0.2.3"
8473 sources."json-schema-0.2.3"
8474 sources."json-schema-traverse-0.4.1"
3187 sources."json-stable-stringify-1.0.1"
8475 sources."json-stable-stringify-1.0.1"
3188 sources."json-stringify-safe-5.0.1"
8476 sources."json-stringify-safe-5.0.1"
3189 sources."jsonfile-1.0.1"
8477 sources."json5-0.5.1"
8478 (sources."jsonfile-2.4.0" // {
8479 dependencies = [
8480 sources."graceful-fs-4.1.11"
8481 ];
8482 })
3190 sources."jsonify-0.0.0"
8483 sources."jsonify-0.0.0"
3191 (sources."jsprim-1.4.1" // {
8484 (sources."jsprim-1.4.1" // {
3192 dependencies = [
8485 dependencies = [
@@ -3194,180 +8487,680 b' let'
3194 ];
8487 ];
3195 })
8488 })
3196 sources."kew-0.7.0"
8489 sources."kew-0.7.0"
8490 sources."kind-of-6.0.2"
3197 (sources."klaw-1.3.1" // {
8491 (sources."klaw-1.3.1" // {
3198 dependencies = [
8492 dependencies = [
3199 sources."graceful-fs-4.1.11"
8493 sources."graceful-fs-4.1.11"
3200 ];
8494 ];
3201 })
8495 })
8496 sources."lazy-cache-1.0.4"
8497 sources."lcid-2.0.0"
3202 (sources."less-2.7.3" // {
8498 (sources."less-2.7.3" // {
3203 dependencies = [
8499 dependencies = [
3204 sources."graceful-fs-4.1.11"
8500 sources."graceful-fs-4.1.11"
3205 sources."source-map-0.5.7"
8501 ];
3206 ];
8502 })
3207 })
8503 (sources."liftoff-2.5.0" // {
3208 sources."levn-0.3.0"
8504 dependencies = [
8505 sources."findup-sync-2.0.0"
8506 ];
8507 })
8508 sources."loader-runner-2.3.1"
8509 sources."loader-utils-1.1.0"
8510 sources."locate-path-2.0.0"
3209 sources."lodash-0.9.2"
8511 sources."lodash-0.9.2"
8512 sources."lodash.camelcase-4.3.0"
8513 sources."lodash.debounce-4.0.8"
8514 sources."lodash.isplainobject-4.0.6"
8515 sources."lodash.memoize-4.1.2"
8516 sources."lodash.uniq-4.5.0"
8517 sources."longest-1.0.1"
8518 sources."loose-envify-1.4.0"
8519 sources."lower-case-1.1.4"
3210 sources."lru-cache-2.7.3"
8520 sources."lru-cache-2.7.3"
8521 sources."make-dir-1.3.0"
8522 sources."make-iterator-1.0.1"
8523 sources."map-age-cleaner-0.1.2"
8524 sources."map-cache-0.2.2"
8525 sources."map-visit-1.0.0"
8526 sources."math-expression-evaluator-1.2.17"
8527 sources."md5.js-1.3.5"
8528 sources."mem-4.0.0"
8529 (sources."memory-fs-0.4.1" // {
8530 dependencies = [
8531 sources."readable-stream-2.3.6"
8532 sources."string_decoder-1.1.1"
8533 ];
8534 })
8535 sources."micromatch-3.1.10"
8536 sources."miller-rabin-4.0.1"
3211 sources."mime-1.6.0"
8537 sources."mime-1.6.0"
3212 sources."mime-db-1.35.0"
8538 sources."mime-db-1.37.0"
3213 sources."mime-types-2.1.19"
8539 sources."mime-types-2.1.21"
8540 sources."mimic-fn-1.2.0"
8541 sources."minimalistic-assert-1.0.1"
8542 sources."minimalistic-crypto-utils-1.0.1"
3214 sources."minimatch-0.2.14"
8543 sources."minimatch-0.2.14"
3215 sources."minimist-0.0.8"
8544 sources."minimist-0.0.8"
3216 sources."minipass-2.3.3"
8545 sources."mississippi-2.0.0"
3217 sources."minizlib-1.1.0"
8546 (sources."mixin-deep-1.3.1" // {
8547 dependencies = [
8548 sources."is-extendable-1.0.1"
8549 ];
8550 })
3218 sources."mkdirp-0.5.1"
8551 sources."mkdirp-0.5.1"
3219 sources."moment-2.22.2"
8552 sources."moment-2.22.2"
3220 sources."mousetrap-1.6.2"
8553 sources."mousetrap-1.6.2"
8554 (sources."move-concurrently-1.0.1" // {
8555 dependencies = [
8556 sources."glob-7.1.3"
8557 sources."minimatch-3.0.4"
8558 sources."rimraf-2.6.2"
8559 ];
8560 })
3221 sources."ms-2.0.0"
8561 sources."ms-2.0.0"
3222 sources."ncp-0.4.2"
8562 sources."nan-2.11.1"
3223 sources."nijs-0.0.25"
8563 sources."nanomatch-1.2.13"
3224 sources."node2nix-1.6.0"
8564 sources."neo-async-2.6.0"
8565 sources."nice-try-1.0.5"
8566 sources."no-case-2.3.2"
8567 (sources."node-libs-browser-2.1.0" // {
8568 dependencies = [
8569 sources."readable-stream-2.3.6"
8570 sources."string_decoder-1.1.1"
8571 ];
8572 })
3225 sources."nopt-1.0.10"
8573 sources."nopt-1.0.10"
3226 (sources."noptify-0.0.3" // {
8574 (sources."noptify-0.0.3" // {
3227 dependencies = [
8575 dependencies = [
3228 sources."nopt-2.0.0"
8576 sources."nopt-2.0.0"
3229 ];
8577 ];
3230 })
8578 })
3231 sources."normalize-package-data-2.4.0"
8579 sources."normalize-path-2.1.1"
3232 sources."npm-package-arg-6.1.0"
8580 sources."normalize-range-0.1.2"
3233 (sources."npm-registry-client-8.5.1" // {
8581 sources."normalize-url-1.9.1"
3234 dependencies = [
8582 sources."npm-run-path-2.0.2"
3235 sources."graceful-fs-4.1.11"
8583 sources."nth-check-1.0.2"
3236 ];
8584 sources."num2fraction-1.2.2"
3237 })
3238 (sources."npmconf-2.1.3" // {
3239 dependencies = [
3240 sources."nopt-3.0.6"
3241 sources."once-1.3.3"
3242 sources."semver-4.3.6"
3243 ];
3244 })
3245 sources."npmlog-4.1.2"
3246 sources."number-is-nan-1.0.1"
8585 sources."number-is-nan-1.0.1"
3247 sources."oauth-sign-0.8.2"
8586 sources."oauth-sign-0.8.2"
3248 sources."object-assign-4.1.1"
8587 sources."object-assign-4.1.1"
8588 (sources."object-copy-0.1.0" // {
8589 dependencies = [
8590 sources."define-property-0.2.5"
8591 sources."is-accessor-descriptor-0.1.6"
8592 sources."is-data-descriptor-0.1.4"
8593 (sources."is-descriptor-0.1.6" // {
8594 dependencies = [
8595 sources."kind-of-5.1.0"
8596 ];
8597 })
8598 sources."kind-of-3.2.2"
8599 ];
8600 })
8601 sources."object-keys-1.0.12"
8602 sources."object-visit-1.0.1"
8603 sources."object.defaults-1.1.0"
8604 sources."object.getownpropertydescriptors-2.0.3"
8605 sources."object.map-1.0.1"
8606 sources."object.pick-1.3.0"
3249 sources."once-1.4.0"
8607 sources."once-1.4.0"
3250 sources."optionator-0.8.2"
8608 sources."os-browserify-0.3.0"
3251 sources."optparse-1.0.5"
3252 sources."os-homedir-1.0.2"
8609 sources."os-homedir-1.0.2"
8610 sources."os-locale-3.0.1"
3253 sources."os-tmpdir-1.0.2"
8611 sources."os-tmpdir-1.0.2"
3254 sources."osenv-0.1.5"
8612 sources."osenv-0.1.5"
3255 sources."parse5-1.5.1"
8613 sources."p-defer-1.0.0"
8614 sources."p-finally-1.0.0"
8615 sources."p-is-promise-1.1.0"
8616 sources."p-limit-1.3.0"
8617 sources."p-locate-2.0.0"
8618 sources."p-try-1.0.0"
8619 sources."pako-1.0.6"
8620 (sources."parallel-transform-1.1.0" // {
8621 dependencies = [
8622 sources."readable-stream-2.3.6"
8623 sources."string_decoder-1.1.1"
8624 ];
8625 })
8626 sources."param-case-2.1.1"
8627 sources."parse-asn1-5.1.1"
8628 sources."parse-filepath-1.0.2"
8629 sources."parse-passwd-1.0.0"
8630 sources."parse5-3.0.3"
8631 (sources."parse5-utils-2.0.0" // {
8632 dependencies = [
8633 sources."parse5-2.2.3"
8634 ];
8635 })
8636 sources."pascalcase-0.1.1"
8637 sources."path-browserify-0.0.0"
8638 sources."path-dirname-1.0.2"
8639 sources."path-exists-3.0.0"
3256 sources."path-is-absolute-1.0.1"
8640 sources."path-is-absolute-1.0.1"
3257 sources."path-posix-1.0.0"
8641 sources."path-key-2.0.1"
8642 sources."path-parse-1.0.6"
8643 sources."path-root-0.1.1"
8644 sources."path-root-regex-0.1.2"
8645 sources."path-type-3.0.0"
8646 sources."pbkdf2-3.0.17"
3258 sources."pend-1.2.0"
8647 sources."pend-1.2.0"
3259 sources."performance-now-0.2.0"
8648 sources."performance-now-0.2.0"
3260 sources."phantom-4.0.12"
8649 sources."phantom-4.0.12"
3261 (sources."phantomjs-prebuilt-2.1.16" // {
8650 (sources."phantomjs-prebuilt-2.1.16" // {
3262 dependencies = [
8651 dependencies = [
3263 sources."es6-promise-4.2.4"
3264 sources."fs-extra-1.0.0"
3265 sources."graceful-fs-4.1.11"
3266 sources."jsonfile-2.4.0"
3267 sources."which-1.3.1"
8652 sources."which-1.3.1"
3268 ];
8653 ];
3269 })
8654 })
8655 sources."pify-3.0.0"
3270 sources."pinkie-2.0.4"
8656 sources."pinkie-2.0.4"
3271 sources."pinkie-promise-2.0.1"
8657 sources."pinkie-promise-2.0.1"
3272 sources."prelude-ls-1.1.2"
8658 sources."pkg-dir-2.0.0"
8659 (sources."polymer-webpack-loader-2.0.3" // {
8660 dependencies = [
8661 sources."ansi-styles-3.2.1"
8662 sources."chalk-2.4.1"
8663 sources."html-loader-0.5.5"
8664 (sources."postcss-6.0.23" // {
8665 dependencies = [
8666 sources."source-map-0.6.1"
8667 ];
8668 })
8669 sources."supports-color-5.5.0"
8670 ];
8671 })
8672 sources."posix-character-classes-0.1.1"
8673 (sources."postcss-5.2.18" // {
8674 dependencies = [
8675 sources."ansi-regex-2.1.1"
8676 sources."ansi-styles-2.2.1"
8677 (sources."chalk-1.1.3" // {
8678 dependencies = [
8679 sources."supports-color-2.0.0"
8680 ];
8681 })
8682 sources."has-ansi-2.0.0"
8683 sources."has-flag-1.0.0"
8684 sources."strip-ansi-3.0.1"
8685 sources."supports-color-3.2.3"
8686 ];
8687 })
8688 sources."postcss-calc-5.3.1"
8689 sources."postcss-colormin-2.2.2"
8690 sources."postcss-convert-values-2.6.1"
8691 sources."postcss-discard-comments-2.0.4"
8692 sources."postcss-discard-duplicates-2.1.0"
8693 sources."postcss-discard-empty-2.1.0"
8694 sources."postcss-discard-overridden-0.1.1"
8695 sources."postcss-discard-unused-2.2.3"
8696 sources."postcss-filter-plugins-2.0.3"
8697 sources."postcss-merge-idents-2.1.7"
8698 sources."postcss-merge-longhand-2.0.2"
8699 (sources."postcss-merge-rules-2.1.2" // {
8700 dependencies = [
8701 sources."browserslist-1.7.7"
8702 ];
8703 })
8704 sources."postcss-message-helpers-2.0.0"
8705 sources."postcss-minify-font-values-1.0.5"
8706 sources."postcss-minify-gradients-1.0.5"
8707 sources."postcss-minify-params-1.2.2"
8708 sources."postcss-minify-selectors-2.1.1"
8709 (sources."postcss-modules-extract-imports-1.2.0" // {
8710 dependencies = [
8711 sources."ansi-styles-3.2.1"
8712 sources."chalk-2.4.1"
8713 sources."postcss-6.0.23"
8714 sources."source-map-0.6.1"
8715 sources."supports-color-5.5.0"
8716 ];
8717 })
8718 (sources."postcss-modules-local-by-default-1.2.0" // {
8719 dependencies = [
8720 sources."ansi-styles-3.2.1"
8721 sources."chalk-2.4.1"
8722 sources."postcss-6.0.23"
8723 sources."source-map-0.6.1"
8724 sources."supports-color-5.5.0"
8725 ];
8726 })
8727 (sources."postcss-modules-scope-1.1.0" // {
8728 dependencies = [
8729 sources."ansi-styles-3.2.1"
8730 sources."chalk-2.4.1"
8731 sources."postcss-6.0.23"
8732 sources."source-map-0.6.1"
8733 sources."supports-color-5.5.0"
8734 ];
8735 })
8736 (sources."postcss-modules-values-1.3.0" // {
8737 dependencies = [
8738 sources."ansi-styles-3.2.1"
8739 sources."chalk-2.4.1"
8740 sources."postcss-6.0.23"
8741 sources."source-map-0.6.1"
8742 sources."supports-color-5.5.0"
8743 ];
8744 })
8745 sources."postcss-normalize-charset-1.1.1"
8746 sources."postcss-normalize-url-3.0.8"
8747 sources."postcss-ordered-values-2.2.3"
8748 sources."postcss-reduce-idents-2.4.0"
8749 sources."postcss-reduce-initial-1.0.1"
8750 sources."postcss-reduce-transforms-1.0.4"
8751 sources."postcss-selector-parser-2.2.3"
8752 sources."postcss-svgo-2.1.6"
8753 sources."postcss-unique-selectors-2.0.2"
8754 sources."postcss-value-parser-3.3.1"
8755 sources."postcss-zindex-2.2.0"
8756 sources."prepend-http-1.0.4"
8757 sources."pretty-error-2.1.1"
8758 sources."private-0.1.8"
8759 sources."process-0.11.10"
3273 sources."process-nextick-args-2.0.0"
8760 sources."process-nextick-args-2.0.0"
3274 sources."progress-1.1.8"
8761 sources."progress-1.1.8"
3275 sources."promise-7.3.1"
8762 sources."promise-7.3.1"
3276 sources."proto-list-1.2.4"
8763 sources."promise-inflight-1.0.1"
3277 sources."prr-1.0.1"
8764 sources."prr-1.0.1"
8765 sources."pseudomap-1.0.2"
8766 sources."public-encrypt-4.0.3"
8767 sources."pump-2.0.1"
8768 sources."pumpify-1.5.1"
3278 sources."punycode-1.4.1"
8769 sources."punycode-1.4.1"
8770 sources."q-1.5.1"
3279 sources."qrious-4.0.2"
8771 sources."qrious-4.0.2"
3280 sources."qs-6.4.0"
8772 sources."qs-6.4.0"
3281 (sources."readable-stream-2.3.6" // {
8773 sources."query-string-4.3.4"
3282 dependencies = [
8774 sources."querystring-0.2.0"
3283 sources."isarray-1.0.0"
8775 sources."querystring-es3-0.2.1"
3284 ];
8776 sources."randombytes-2.0.6"
3285 })
8777 sources."randomfill-1.0.4"
3286 sources."reduce-flatten-1.0.1"
8778 sources."raw-loader-1.0.0-beta.0"
3287 sources."regenerator-runtime-0.10.5"
8779 (sources."readable-stream-1.1.14" // {
8780 dependencies = [
8781 sources."isarray-0.0.1"
8782 ];
8783 })
8784 (sources."readdirp-2.2.1" // {
8785 dependencies = [
8786 sources."graceful-fs-4.1.11"
8787 sources."readable-stream-2.3.6"
8788 sources."string_decoder-1.1.1"
8789 ];
8790 })
8791 (sources."recast-0.11.23" // {
8792 dependencies = [
8793 sources."esprima-3.1.3"
8794 ];
8795 })
8796 sources."rechoir-0.6.2"
8797 (sources."reduce-css-calc-1.3.0" // {
8798 dependencies = [
8799 sources."balanced-match-0.4.2"
8800 ];
8801 })
8802 (sources."reduce-function-call-1.0.2" // {
8803 dependencies = [
8804 sources."balanced-match-0.4.2"
8805 ];
8806 })
8807 sources."regenerate-1.4.0"
8808 sources."regenerator-runtime-0.11.1"
8809 sources."regenerator-transform-0.10.1"
8810 sources."regex-not-1.0.2"
8811 sources."regexpu-core-2.0.0"
8812 sources."regjsgen-0.2.0"
8813 (sources."regjsparser-0.1.5" // {
8814 dependencies = [
8815 sources."jsesc-0.5.0"
8816 ];
8817 })
8818 sources."relateurl-0.2.7"
8819 sources."remove-trailing-separator-1.1.0"
8820 (sources."renderkid-2.0.2" // {
8821 dependencies = [
8822 sources."ansi-regex-2.1.1"
8823 sources."domhandler-2.1.0"
8824 sources."domutils-1.1.6"
8825 sources."htmlparser2-3.3.0"
8826 sources."isarray-0.0.1"
8827 sources."readable-stream-1.0.34"
8828 sources."strip-ansi-3.0.1"
8829 ];
8830 })
8831 sources."repeat-element-1.1.3"
8832 sources."repeat-string-1.6.1"
8833 sources."repeating-2.0.1"
3288 sources."request-2.81.0"
8834 sources."request-2.81.0"
3289 sources."request-progress-2.0.1"
8835 sources."request-progress-2.0.1"
3290 sources."retry-0.10.1"
8836 sources."require-directory-2.1.1"
8837 sources."require-main-filename-1.0.1"
8838 sources."resolve-1.8.1"
8839 sources."resolve-cwd-2.0.0"
8840 sources."resolve-dir-1.0.1"
8841 sources."resolve-from-3.0.0"
8842 sources."resolve-url-0.2.1"
8843 sources."ret-0.1.15"
8844 sources."right-align-0.1.3"
3291 sources."rimraf-2.2.8"
8845 sources."rimraf-2.2.8"
8846 sources."ripemd160-2.0.2"
8847 sources."run-queue-1.0.3"
3292 sources."safe-buffer-5.1.2"
8848 sources."safe-buffer-5.1.2"
8849 sources."safe-regex-1.1.0"
3293 sources."safer-buffer-2.1.2"
8850 sources."safer-buffer-2.1.2"
8851 sources."sax-1.2.4"
8852 (sources."schema-utils-0.4.7" // {
8853 dependencies = [
8854 sources."ajv-6.5.4"
8855 ];
8856 })
3294 sources."select-1.1.2"
8857 sources."select-1.1.2"
3295 sources."semver-5.5.0"
8858 sources."semver-5.6.0"
8859 sources."serialize-javascript-1.5.0"
3296 sources."set-blocking-2.0.0"
8860 sources."set-blocking-2.0.0"
8861 (sources."set-value-2.0.0" // {
8862 dependencies = [
8863 sources."extend-shallow-2.0.1"
8864 ];
8865 })
8866 sources."setimmediate-1.0.5"
8867 sources."sha.js-2.4.11"
8868 sources."shebang-command-1.2.0"
8869 sources."shebang-regex-1.0.0"
3297 sources."shelljs-0.3.0"
8870 sources."shelljs-0.3.0"
3298 sources."sigmund-1.0.1"
8871 sources."sigmund-1.0.1"
3299 sources."signal-exit-3.0.2"
8872 sources."signal-exit-3.0.2"
3300 sources."slasp-0.0.4"
8873 sources."slash-1.0.0"
3301 sources."slide-1.1.6"
8874 (sources."snapdragon-0.8.2" // {
8875 dependencies = [
8876 sources."define-property-0.2.5"
8877 sources."extend-shallow-2.0.1"
8878 (sources."is-accessor-descriptor-0.1.6" // {
8879 dependencies = [
8880 sources."kind-of-3.2.2"
8881 ];
8882 })
8883 (sources."is-data-descriptor-0.1.4" // {
8884 dependencies = [
8885 sources."kind-of-3.2.2"
8886 ];
8887 })
8888 sources."is-descriptor-0.1.6"
8889 sources."kind-of-5.1.0"
8890 ];
8891 })
8892 (sources."snapdragon-node-2.1.1" // {
8893 dependencies = [
8894 sources."define-property-1.0.0"
8895 ];
8896 })
8897 (sources."snapdragon-util-3.0.1" // {
8898 dependencies = [
8899 sources."kind-of-3.2.2"
8900 ];
8901 })
3302 sources."sntp-1.0.9"
8902 sources."sntp-1.0.9"
3303 sources."source-map-0.3.0"
8903 sources."sort-keys-1.1.2"
3304 sources."spdx-correct-3.0.0"
8904 sources."source-list-map-2.0.1"
3305 sources."spdx-exceptions-2.1.0"
8905 sources."source-map-0.5.7"
3306 sources."spdx-expression-parse-3.0.0"
8906 sources."source-map-resolve-0.5.2"
3307 sources."spdx-license-ids-3.0.0"
8907 sources."source-map-support-0.4.18"
8908 sources."source-map-url-0.4.0"
3308 sources."split-1.0.1"
8909 sources."split-1.0.1"
3309 (sources."sshpk-1.14.2" // {
8910 sources."split-string-3.1.0"
8911 sources."sprintf-js-1.0.3"
8912 (sources."sshpk-1.15.1" // {
3310 dependencies = [
8913 dependencies = [
3311 sources."assert-plus-1.0.0"
8914 sources."assert-plus-1.0.0"
3312 ];
8915 ];
3313 })
8916 })
3314 sources."ssri-5.3.0"
8917 sources."ssri-5.3.0"
3315 sources."stack-trace-0.0.10"
8918 sources."stack-trace-0.0.10"
3316 sources."string-width-1.0.2"
8919 (sources."static-extend-0.1.2" // {
3317 sources."string_decoder-1.1.1"
8920 dependencies = [
8921 sources."define-property-0.2.5"
8922 (sources."is-accessor-descriptor-0.1.6" // {
8923 dependencies = [
8924 sources."kind-of-3.2.2"
8925 ];
8926 })
8927 (sources."is-data-descriptor-0.1.4" // {
8928 dependencies = [
8929 sources."kind-of-3.2.2"
8930 ];
8931 })
8932 sources."is-descriptor-0.1.6"
8933 sources."kind-of-5.1.0"
8934 ];
8935 })
8936 sources."sticky-sidebar-3.3.1"
8937 (sources."stream-browserify-2.0.1" // {
8938 dependencies = [
8939 sources."readable-stream-2.3.6"
8940 sources."string_decoder-1.1.1"
8941 ];
8942 })
8943 sources."stream-each-1.2.3"
8944 (sources."stream-http-2.8.3" // {
8945 dependencies = [
8946 sources."readable-stream-2.3.6"
8947 sources."string_decoder-1.1.1"
8948 ];
8949 })
8950 sources."stream-shift-1.0.0"
8951 sources."strict-uri-encode-1.1.0"
8952 (sources."string-width-2.1.1" // {
8953 dependencies = [
8954 sources."ansi-regex-3.0.0"
8955 sources."is-fullwidth-code-point-2.0.0"
8956 sources."strip-ansi-4.0.0"
8957 ];
8958 })
8959 sources."string_decoder-0.10.31"
3318 sources."stringstream-0.0.6"
8960 sources."stringstream-0.0.6"
3319 sources."strip-ansi-3.0.1"
8961 sources."strip-ansi-0.3.0"
8962 sources."strip-eof-1.0.0"
3320 sources."strip-json-comments-1.0.4"
8963 sources."strip-json-comments-1.0.4"
3321 sources."supports-color-2.0.0"
8964 sources."style-loader-0.21.0"
3322 sources."table-layout-0.3.0"
8965 sources."supports-color-0.2.0"
3323 sources."tar-3.1.15"
8966 (sources."svgo-0.7.2" // {
3324 sources."temp-0.8.3"
8967 dependencies = [
3325 sources."test-value-2.1.0"
8968 sources."argparse-1.0.10"
8969 sources."colors-1.1.2"
8970 sources."esprima-2.7.3"
8971 sources."js-yaml-3.7.0"
8972 ];
8973 })
8974 sources."tapable-1.1.0"
3326 sources."throttleit-1.0.0"
8975 sources."throttleit-1.0.0"
3327 sources."through-2.3.8"
8976 sources."through-2.3.8"
8977 (sources."through2-2.0.3" // {
8978 dependencies = [
8979 sources."readable-stream-2.3.6"
8980 sources."string_decoder-1.1.1"
8981 ];
8982 })
8983 sources."timers-browserify-2.0.10"
3328 sources."tiny-emitter-2.0.2"
8984 sources."tiny-emitter-2.0.2"
3329 (sources."tiny-lr-fork-0.0.5" // {
8985 (sources."tiny-lr-fork-0.0.5" // {
3330 dependencies = [
8986 dependencies = [
8987 sources."debug-0.7.4"
3331 sources."qs-0.5.6"
8988 sources."qs-0.5.6"
3332 ];
8989 ];
3333 })
8990 })
8991 sources."to-arraybuffer-1.0.1"
8992 sources."to-fast-properties-1.0.3"
8993 (sources."to-object-path-0.3.0" // {
8994 dependencies = [
8995 sources."kind-of-3.2.2"
8996 ];
8997 })
8998 sources."to-regex-3.0.2"
8999 sources."to-regex-range-2.1.1"
9000 sources."toposort-1.0.7"
3334 sources."tough-cookie-2.3.4"
9001 sources."tough-cookie-2.3.4"
9002 sources."trim-right-1.0.1"
9003 (sources."ts-loader-1.3.3" // {
9004 dependencies = [
9005 sources."colors-1.3.2"
9006 sources."enhanced-resolve-3.4.1"
9007 sources."graceful-fs-4.1.11"
9008 sources."loader-utils-0.2.17"
9009 sources."tapable-0.2.8"
9010 ];
9011 })
9012 sources."tslib-1.9.3"
9013 sources."tty-browserify-0.0.0"
3335 sources."tunnel-agent-0.6.0"
9014 sources."tunnel-agent-0.6.0"
3336 sources."tweetnacl-0.14.5"
9015 sources."tweetnacl-0.14.5"
3337 sources."type-check-0.3.2"
3338 sources."typedarray-0.0.6"
9016 sources."typedarray-0.0.6"
3339 sources."typical-2.6.1"
9017 (sources."uglify-es-3.3.10" // {
3340 sources."uid-number-0.0.5"
9018 dependencies = [
9019 sources."source-map-0.6.1"
9020 ];
9021 })
9022 (sources."uglify-js-3.4.9" // {
9023 dependencies = [
9024 sources."commander-2.17.1"
9025 sources."source-map-0.6.1"
9026 ];
9027 })
9028 sources."uglify-to-browserify-1.0.2"
9029 (sources."uglifyjs-webpack-plugin-1.3.0" // {
9030 dependencies = [
9031 sources."source-map-0.6.1"
9032 ];
9033 })
9034 sources."unc-path-regex-0.1.2"
3341 sources."underscore-1.7.0"
9035 sources."underscore-1.7.0"
3342 sources."underscore.string-2.2.1"
9036 sources."underscore.string-2.2.1"
3343 sources."unicode-5.2.0-0.7.5"
9037 sources."unicode-5.2.0-0.7.5"
9038 (sources."union-value-1.0.0" // {
9039 dependencies = [
9040 sources."extend-shallow-2.0.1"
9041 sources."set-value-0.4.3"
9042 ];
9043 })
9044 sources."uniq-1.0.1"
9045 sources."uniqs-2.0.0"
9046 sources."unique-filename-1.1.1"
9047 sources."unique-slug-2.0.1"
9048 (sources."unset-value-1.0.0" // {
9049 dependencies = [
9050 (sources."has-value-0.3.1" // {
9051 dependencies = [
9052 sources."isobject-2.1.0"
9053 ];
9054 })
9055 sources."has-values-0.1.4"
9056 ];
9057 })
9058 sources."upath-1.1.0"
9059 sources."upper-case-1.1.3"
9060 (sources."uri-js-4.2.2" // {
9061 dependencies = [
9062 sources."punycode-2.1.1"
9063 ];
9064 })
9065 sources."urix-0.1.0"
9066 (sources."url-0.11.0" // {
9067 dependencies = [
9068 sources."punycode-1.3.2"
9069 ];
9070 })
9071 sources."use-3.1.1"
9072 sources."util-0.10.4"
3344 sources."util-deprecate-1.0.2"
9073 sources."util-deprecate-1.0.2"
9074 sources."util.promisify-1.0.0"
9075 sources."utila-0.4.0"
3345 sources."uuid-3.3.2"
9076 sources."uuid-3.3.2"
3346 sources."validate-npm-package-license-3.0.3"
9077 sources."v8-compile-cache-2.0.2"
3347 sources."validate-npm-package-name-3.0.0"
9078 sources."v8flags-3.0.2"
9079 sources."vendors-1.0.2"
3348 (sources."verror-1.10.0" // {
9080 (sources."verror-1.10.0" // {
3349 dependencies = [
9081 dependencies = [
3350 sources."assert-plus-1.0.0"
9082 sources."assert-plus-1.0.0"
3351 ];
9083 ];
3352 })
9084 })
3353 (sources."vulcanize-1.16.0" // {
9085 sources."vm-browserify-0.0.4"
3354 dependencies = [
9086 (sources."watchpack-1.6.0" // {
3355 sources."nopt-3.0.6"
9087 dependencies = [
3356 ];
9088 sources."graceful-fs-4.1.11"
3357 })
9089 ];
3358 sources."walk-2.3.14"
9090 })
9091 sources."waypoints-4.0.1"
9092 (sources."webpack-4.23.1" // {
9093 dependencies = [
9094 sources."ajv-6.5.4"
9095 ];
9096 })
9097 (sources."webpack-cli-3.1.2" // {
9098 dependencies = [
9099 sources."ansi-styles-3.2.1"
9100 sources."chalk-2.4.1"
9101 sources."supports-color-5.5.0"
9102 ];
9103 })
9104 (sources."webpack-core-0.6.9" // {
9105 dependencies = [
9106 sources."source-list-map-0.1.8"
9107 sources."source-map-0.4.4"
9108 ];
9109 })
9110 (sources."webpack-sources-1.3.0" // {
9111 dependencies = [
9112 sources."source-map-0.6.1"
9113 ];
9114 })
9115 (sources."webpack-uglify-js-plugin-1.1.9" // {
9116 dependencies = [
9117 sources."ansi-regex-2.1.1"
9118 sources."ansi-styles-2.2.1"
9119 sources."camelcase-1.2.1"
9120 sources."chalk-1.1.3"
9121 sources."cliui-2.1.0"
9122 sources."decamelize-1.2.0"
9123 sources."has-ansi-2.0.0"
9124 sources."strip-ansi-3.0.1"
9125 sources."supports-color-2.0.0"
9126 sources."uglify-js-2.8.29"
9127 sources."yargs-3.10.0"
9128 ];
9129 })
9130 sources."whet.extend-0.9.9"
3359 sources."which-1.0.9"
9131 sources."which-1.0.9"
3360 sources."wide-align-1.1.3"
9132 sources."which-module-2.0.0"
3361 (sources."winston-2.4.3" // {
9133 sources."window-size-0.1.0"
9134 (sources."winston-2.4.4" // {
3362 dependencies = [
9135 dependencies = [
3363 sources."async-1.0.0"
9136 sources."async-1.0.0"
3364 sources."colors-1.0.3"
9137 sources."colors-1.0.3"
3365 ];
9138 ];
3366 })
9139 })
3367 sources."wordwrap-1.0.0"
9140 sources."wordwrap-0.0.2"
3368 sources."wordwrapjs-2.0.0"
9141 sources."worker-farm-1.6.0"
9142 (sources."wrap-ansi-2.1.0" // {
9143 dependencies = [
9144 sources."ansi-regex-2.1.1"
9145 sources."string-width-1.0.2"
9146 sources."strip-ansi-3.0.1"
9147 ];
9148 })
3369 sources."wrappy-1.0.2"
9149 sources."wrappy-1.0.2"
3370 sources."yallist-3.0.2"
9150 sources."xregexp-4.0.0"
9151 sources."xtend-4.0.1"
9152 sources."y18n-4.0.0"
9153 sources."yallist-2.1.2"
9154 (sources."yargs-12.0.2" // {
9155 dependencies = [
9156 sources."find-up-3.0.0"
9157 sources."locate-path-3.0.0"
9158 sources."p-limit-2.0.0"
9159 sources."p-locate-3.0.0"
9160 sources."p-try-2.0.0"
9161 ];
9162 })
9163 sources."yargs-parser-10.1.0"
3371 sources."yauzl-2.4.1"
9164 sources."yauzl-2.4.1"
3372 ];
9165 ];
3373 buildInputs = globalBuildInputs;
9166 buildInputs = globalBuildInputs;
@@ -3376,7 +9169,7 b' let'
3376 license = "SEE LICENSE IN LICENSE.txt";
9169 license = "SEE LICENSE IN LICENSE.txt";
3377 };
9170 };
3378 production = false;
9171 production = false;
3379 bypassCache = false;
9172 bypassCache = true;
3380 };
9173 };
3381 in
9174 in
3382 {
9175 {
1 NO CONTENT: file renamed from pkgs/patch_beaker/patch-beaker-lock-func-debug.diff to pkgs/patches/beaker/patch-beaker-lock-func-debug.diff
NO CONTENT: file renamed from pkgs/patch_beaker/patch-beaker-lock-func-debug.diff to pkgs/patches/beaker/patch-beaker-lock-func-debug.diff
1 NO CONTENT: file renamed from pkgs/patch_beaker/patch-beaker-metadata-reuse.diff to pkgs/patches/beaker/patch-beaker-metadata-reuse.diff
NO CONTENT: file renamed from pkgs/patch_beaker/patch-beaker-metadata-reuse.diff to pkgs/patches/beaker/patch-beaker-metadata-reuse.diff
@@ -30,8 +30,8 b' self: super: {'
30
30
31 "beaker" = super."beaker".override (attrs: {
31 "beaker" = super."beaker".override (attrs: {
32 patches = [
32 patches = [
33 ./patch_beaker/patch-beaker-lock-func-debug.diff
33 ./patches/beaker/patch-beaker-lock-func-debug.diff
34 ./patch_beaker/patch-beaker-metadata-reuse.diff
34 ./patches/beaker/patch-beaker-metadata-reuse.diff
35 ];
35 ];
36 });
36 });
37
37
@@ -240,6 +240,12 b' self: super: {'
240 };
240 };
241 });
241 });
242
242
243 "supervisor" = super."supervisor".override (attrs: {
244 patches = [
245 ./patches/supervisor/patch-rlimits-old-kernel.diff
246 ];
247 });
248
243 # Avoid that base packages screw up the build process
249 # Avoid that base packages screw up the build process
244 inherit (basePythonPackages)
250 inherit (basePythonPackages)
245 setuptools;
251 setuptools;
@@ -52,22 +52,22 b' self: super: {'
52 };
52 };
53 };
53 };
54 "atomicwrites" = super.buildPythonPackage {
54 "atomicwrites" = super.buildPythonPackage {
55 name = "atomicwrites-1.1.5";
55 name = "atomicwrites-1.2.1";
56 doCheck = false;
56 doCheck = false;
57 src = fetchurl {
57 src = fetchurl {
58 url = "https://files.pythonhosted.org/packages/a1/e1/2d9bc76838e6e6667fde5814aa25d7feb93d6fa471bf6816daac2596e8b2/atomicwrites-1.1.5.tar.gz";
58 url = "https://files.pythonhosted.org/packages/ac/ed/a311712ef6b4355035489f665e63e1a73f9eb371929e3c98e5efd451069e/atomicwrites-1.2.1.tar.gz";
59 sha256 = "11bm90fwm2avvf4f3ib8g925w7jr4m11vcsinn1bi6ns4bm32214";
59 sha256 = "1vmkbw9j0qammwxbxycrs39gvdg4lc2d4lk98kwf8ag2manyi6pc";
60 };
60 };
61 meta = {
61 meta = {
62 license = [ pkgs.lib.licenses.mit ];
62 license = [ pkgs.lib.licenses.mit ];
63 };
63 };
64 };
64 };
65 "attrs" = super.buildPythonPackage {
65 "attrs" = super.buildPythonPackage {
66 name = "attrs-18.1.0";
66 name = "attrs-18.2.0";
67 doCheck = false;
67 doCheck = false;
68 src = fetchurl {
68 src = fetchurl {
69 url = "https://files.pythonhosted.org/packages/e4/ac/a04671e118b57bee87dabca1e0f2d3bda816b7a551036012d0ca24190e71/attrs-18.1.0.tar.gz";
69 url = "https://files.pythonhosted.org/packages/0f/9e/26b1d194aab960063b266170e53c39f73ea0d0d3f5ce23313e0ec8ee9bdf/attrs-18.2.0.tar.gz";
70 sha256 = "0yzqz8wv3w1srav5683a55v49i0szkm47dyrnkd56fqs8j8ypl70";
70 sha256 = "0s9ydh058wmmf5v391pym877x4ahxg45dw6a0w4c7s5wgpigdjqh";
71 };
71 };
72 meta = {
72 meta = {
73 license = [ pkgs.lib.licenses.mit ];
73 license = [ pkgs.lib.licenses.mit ];
@@ -160,17 +160,6 b' self: super: {'
160 license = [ pkgs.lib.licenses.asl20 ];
160 license = [ pkgs.lib.licenses.asl20 ];
161 };
161 };
162 };
162 };
163 "bottle" = super.buildPythonPackage {
164 name = "bottle-0.12.13";
165 doCheck = false;
166 src = fetchurl {
167 url = "https://files.pythonhosted.org/packages/bd/99/04dc59ced52a8261ee0f965a8968717a255ea84a36013e527944dbf3468c/bottle-0.12.13.tar.gz";
168 sha256 = "0m9k2a7yxvggc4kw8fsvj381vgsvfcdshg5nzy6vwrxiw2p53drr";
169 };
170 meta = {
171 license = [ pkgs.lib.licenses.mit ];
172 };
173 };
174 "bumpversion" = super.buildPythonPackage {
163 "bumpversion" = super.buildPythonPackage {
175 name = "bumpversion-0.5.3";
164 name = "bumpversion-0.5.3";
176 doCheck = false;
165 doCheck = false;
@@ -295,28 +284,14 b' self: super: {'
295 };
284 };
296 };
285 };
297 "coverage" = super.buildPythonPackage {
286 "coverage" = super.buildPythonPackage {
298 name = "coverage-3.7.1";
287 name = "coverage-4.5.1";
299 doCheck = false;
288 doCheck = false;
300 src = fetchurl {
289 src = fetchurl {
301 url = "https://files.pythonhosted.org/packages/09/4f/89b06c7fdc09687bca507dc411c342556ef9c5a3b26756137a4878ff19bf/coverage-3.7.1.tar.gz";
290 url = "https://files.pythonhosted.org/packages/35/fe/e7df7289d717426093c68d156e0fd9117c8f4872b6588e8a8928a0f68424/coverage-4.5.1.tar.gz";
302 sha256 = "0knlbq79g2ww6xzsyknj9rirrgrgc983dpa2d9nkdf31mb2a3bni";
291 sha256 = "1wbrzpxka3xd4nmmkc6q0ir343d91kymwsm8pbmwa0d2a7q4ir2n";
303 };
292 };
304 meta = {
293 meta = {
305 license = [ pkgs.lib.licenses.bsdOriginal ];
294 license = [ pkgs.lib.licenses.asl20 ];
306 };
307 };
308 "cprofilev" = super.buildPythonPackage {
309 name = "cprofilev-1.0.7";
310 doCheck = false;
311 propagatedBuildInputs = [
312 self."bottle"
313 ];
314 src = fetchurl {
315 url = "https://files.pythonhosted.org/packages/df/50/d8c1ada7d537c64b0f76453fa31dedb6af6e27b82fcf0331e5f71a4cf98b/CProfileV-1.0.7.tar.gz";
316 sha256 = "0xwszfhxgndpcjkpq89dix6vi02hj1gzvhr7r716hd1x3y5p94c7";
317 };
318 meta = {
319 license = [ pkgs.lib.licenses.mit ];
320 };
295 };
321 };
296 };
322 "cssselect" = super.buildPythonPackage {
297 "cssselect" = super.buildPythonPackage {
@@ -372,11 +347,11 b' self: super: {'
372 };
347 };
373 };
348 };
374 "dogpile.cache" = super.buildPythonPackage {
349 "dogpile.cache" = super.buildPythonPackage {
375 name = "dogpile.cache-0.6.6";
350 name = "dogpile.cache-0.6.7";
376 doCheck = false;
351 doCheck = false;
377 src = fetchurl {
352 src = fetchurl {
378 url = "https://files.pythonhosted.org/packages/48/ca/604154d835c3668efb8a31bd979b0ea4bf39c2934a40ffecc0662296cb51/dogpile.cache-0.6.6.tar.gz";
353 url = "https://files.pythonhosted.org/packages/ee/bd/440da735a11c6087eed7cc8747fc4b995cbac2464168682f8ee1c8e43844/dogpile.cache-0.6.7.tar.gz";
379 sha256 = "1h8n1lxd4l2qvahfkiinljkqz7pww7w3sgag0j8j9ixbl2h4wk84";
354 sha256 = "1aw8rx8vhb75y7zc6gi67g21sw057jdx7i8m3jq7kf3nqavxx9zw";
380 };
355 };
381 meta = {
356 meta = {
382 license = [ pkgs.lib.licenses.bsdOriginal ];
357 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -515,14 +490,14 b' self: super: {'
515 };
490 };
516 };
491 };
517 "gevent" = super.buildPythonPackage {
492 "gevent" = super.buildPythonPackage {
518 name = "gevent-1.3.5";
493 name = "gevent-1.3.6";
519 doCheck = false;
494 doCheck = false;
520 propagatedBuildInputs = [
495 propagatedBuildInputs = [
521 self."greenlet"
496 self."greenlet"
522 ];
497 ];
523 src = fetchurl {
498 src = fetchurl {
524 url = "https://files.pythonhosted.org/packages/e6/0a/fc345c6e6161f84484870dbcaa58e427c10bd9bdcd08a69bed3d6b398bf1/gevent-1.3.5.tar.gz";
499 url = "https://files.pythonhosted.org/packages/49/13/aa4bb3640b5167fe58875d3d7e65390cdb14f9682a41a741a566bb560842/gevent-1.3.6.tar.gz";
525 sha256 = "1w3gydxirgd2f60c5yv579w4903ds9s4g3587ik4jby97hgqc5bz";
500 sha256 = "1ih4k73dqz2zb561hda99vbanja3m6cdch3mgxxn1mla3qwkqhbv";
526 };
501 };
527 meta = {
502 meta = {
528 license = [ pkgs.lib.licenses.mit ];
503 license = [ pkgs.lib.licenses.mit ];
@@ -550,23 +525,12 b' self: super: {'
550 license = [ { fullName = "GNU Lesser General Public License v3 or later (LGPLv3+)"; } { fullName = "LGPL"; } ];
525 license = [ { fullName = "GNU Lesser General Public License v3 or later (LGPLv3+)"; } { fullName = "LGPL"; } ];
551 };
526 };
552 };
527 };
553 "graphviz" = super.buildPythonPackage {
528 "greenlet" = super.buildPythonPackage {
554 name = "graphviz-0.9";
529 name = "greenlet-0.4.15";
555 doCheck = false;
530 doCheck = false;
556 src = fetchurl {
531 src = fetchurl {
557 url = "https://files.pythonhosted.org/packages/2b/e6/71521bab8fb99833133f08f6ac0460e2f6b425a7f75ac4b02323c3c3b512/graphviz-0.9.zip";
532 url = "https://files.pythonhosted.org/packages/f8/e8/b30ae23b45f69aa3f024b46064c0ac8e5fcb4f22ace0dca8d6f9c8bbe5e7/greenlet-0.4.15.tar.gz";
558 sha256 = "14r9brj4r31b3qy1nnn34v3l4h0n39bqxg9sn2fz4p3pp5mglnl6";
533 sha256 = "1g4g1wwc472ds89zmqlpyan3fbnzpa8qm48z3z1y6mlk44z485ll";
559 };
560 meta = {
561 license = [ pkgs.lib.licenses.mit ];
562 };
563 };
564 "greenlet" = super.buildPythonPackage {
565 name = "greenlet-0.4.13";
566 doCheck = false;
567 src = fetchurl {
568 url = "https://files.pythonhosted.org/packages/13/de/ba92335e9e76040ca7274224942282a80d54f85e342a5e33c5277c7f87eb/greenlet-0.4.13.tar.gz";
569 sha256 = "1r412gfx25jrdiv444prmz5a8igrfabwnwqyr6b52ypq7ga87vqg";
570 };
534 };
571 meta = {
535 meta = {
572 license = [ pkgs.lib.licenses.mit ];
536 license = [ pkgs.lib.licenses.mit ];
@@ -599,11 +563,11 b' self: super: {'
599 };
563 };
600 };
564 };
601 "hupper" = super.buildPythonPackage {
565 "hupper" = super.buildPythonPackage {
602 name = "hupper-1.3";
566 name = "hupper-1.3.1";
603 doCheck = false;
567 doCheck = false;
604 src = fetchurl {
568 src = fetchurl {
605 url = "https://files.pythonhosted.org/packages/51/0c/96335b1f2f32245fb871eea5bb9773196505ddb71fad15190056a282df9e/hupper-1.3.tar.gz";
569 url = "https://files.pythonhosted.org/packages/cf/4b/467b826a84c8594b81f414b5ab6794e981951dac90ca40abaf9ea1cb36b0/hupper-1.3.1.tar.gz";
606 sha256 = "1pkyrm9c2crc32ps00k1ahnc5clj3pjwiarc7j0x8aykwih7ff10";
570 sha256 = "03mf13n6i4dd60wlb9m99ddl4m3lmly70cjp7f82vdkibfl1v6l9";
607 };
571 };
608 meta = {
572 meta = {
609 license = [ pkgs.lib.licenses.mit ];
573 license = [ pkgs.lib.licenses.mit ];
@@ -850,11 +814,11 b' self: super: {'
850 };
814 };
851 };
815 };
852 "mistune" = super.buildPythonPackage {
816 "mistune" = super.buildPythonPackage {
853 name = "mistune-0.8.3";
817 name = "mistune-0.8.4";
854 doCheck = false;
818 doCheck = false;
855 src = fetchurl {
819 src = fetchurl {
856 url = "https://files.pythonhosted.org/packages/9d/be/e06d4346cc608a01dec6bf770d7d0303a4fd6db588b318ced18f5f257145/mistune-0.8.3.tar.gz";
820 url = "https://files.pythonhosted.org/packages/2d/a4/509f6e7783ddd35482feda27bc7f72e65b5e7dc910eca4ab2164daf9c577/mistune-0.8.4.tar.gz";
857 sha256 = "06b662p6kf46wh2jsabaqhaq4bz1srh2zxkrnx4yg96azlxw645w";
821 sha256 = "0vkmsh0x480rni51lhyvigfdf06b9247z868pk3bal1wnnfl58sr";
858 };
822 };
859 meta = {
823 meta = {
860 license = [ pkgs.lib.licenses.bsdOriginal ];
824 license = [ pkgs.lib.licenses.bsdOriginal ];
@@ -947,20 +911,6 b' self: super: {'
947 license = [ pkgs.lib.licenses.bsdOriginal ];
911 license = [ pkgs.lib.licenses.bsdOriginal ];
948 };
912 };
949 };
913 };
950 "objgraph" = super.buildPythonPackage {
951 name = "objgraph-3.1.1";
952 doCheck = false;
953 propagatedBuildInputs = [
954 self."graphviz"
955 ];
956 src = fetchurl {
957 url = "https://files.pythonhosted.org/packages/be/58/9ca81a20cc837054e94866df1475d899caaa94f3732b8a46006858b015f7/objgraph-3.1.1.tar.gz";
958 sha256 = "17aq4cwainiwvj8x61j0hx45c313bkwza5fijnmmw8v8glyy2bcc";
959 };
960 meta = {
961 license = [ pkgs.lib.licenses.mit ];
962 };
963 };
964 "packaging" = super.buildPythonPackage {
914 "packaging" = super.buildPythonPackage {
965 name = "packaging-15.2";
915 name = "packaging-15.2";
966 doCheck = false;
916 doCheck = false;
@@ -1025,15 +975,15 b' self: super: {'
1025 };
975 };
1026 };
976 };
1027 "pathlib2" = super.buildPythonPackage {
977 "pathlib2" = super.buildPythonPackage {
1028 name = "pathlib2-2.3.0";
978 name = "pathlib2-2.3.2";
1029 doCheck = false;
979 doCheck = false;
1030 propagatedBuildInputs = [
980 propagatedBuildInputs = [
1031 self."six"
981 self."six"
1032 self."scandir"
982 self."scandir"
1033 ];
983 ];
1034 src = fetchurl {
984 src = fetchurl {
1035 url = "https://files.pythonhosted.org/packages/a1/14/df0deb867c2733f7d857523c10942b3d6612a1b222502fdffa9439943dfb/pathlib2-2.3.0.tar.gz";
985 url = "https://files.pythonhosted.org/packages/db/a8/7d6439c1aec525ed70810abee5b7d7f3aa35347f59bc28343e8f62019aa2/pathlib2-2.3.2.tar.gz";
1036 sha256 = "1cx5gs2v9j2vnzmcrbq5l8fq2mwrr1h6pyf1sjdji2w1bavm09fk";
986 sha256 = "10yb0iv5x2hs631rcppkhbddx799d3h8pcwmkbh2a66ns3w71ccf";
1037 };
987 };
1038 meta = {
988 meta = {
1039 license = [ pkgs.lib.licenses.mit ];
989 license = [ pkgs.lib.licenses.mit ];
@@ -1065,14 +1015,14 b' self: super: {'
1065 };
1015 };
1066 };
1016 };
1067 "pickleshare" = super.buildPythonPackage {
1017 "pickleshare" = super.buildPythonPackage {
1068 name = "pickleshare-0.7.4";
1018 name = "pickleshare-0.7.5";
1069 doCheck = false;
1019 doCheck = false;
1070 propagatedBuildInputs = [
1020 propagatedBuildInputs = [
1071 self."pathlib2"
1021 self."pathlib2"
1072 ];
1022 ];
1073 src = fetchurl {
1023 src = fetchurl {
1074 url = "https://files.pythonhosted.org/packages/69/fe/dd137d84daa0fd13a709e448138e310d9ea93070620c9db5454e234af525/pickleshare-0.7.4.tar.gz";
1024 url = "https://files.pythonhosted.org/packages/d8/b6/df3c1c9b616e9c0edbc4fbab6ddd09df9535849c64ba51fcb6531c32d4d8/pickleshare-0.7.5.tar.gz";
1075 sha256 = "0yvk14dzxk7g6qpr7iw23vzqbsr0dh4ij4xynkhnzpfz4xr2bac4";
1025 sha256 = "1jmghg3c53yp1i8cm6pcrm280ayi8621rwyav9fac7awjr3kss47";
1076 };
1026 };
1077 meta = {
1027 meta = {
1078 license = [ pkgs.lib.licenses.mit ];
1028 license = [ pkgs.lib.licenses.mit ];
@@ -1108,11 +1058,11 b' self: super: {'
1108 };
1058 };
1109 };
1059 };
1110 "pluggy" = super.buildPythonPackage {
1060 "pluggy" = super.buildPythonPackage {
1111 name = "pluggy-0.6.0";
1061 name = "pluggy-0.8.0";
1112 doCheck = false;
1062 doCheck = false;
1113 src = fetchurl {
1063 src = fetchurl {
1114 url = "https://files.pythonhosted.org/packages/11/bf/cbeb8cdfaffa9f2ea154a30ae31a9d04a1209312e2919138b4171a1f8199/pluggy-0.6.0.tar.gz";
1064 url = "https://files.pythonhosted.org/packages/65/25/81d0de17cd00f8ca994a4e74e3c4baf7cd25072c0b831dad5c7d9d6138f8/pluggy-0.8.0.tar.gz";
1115 sha256 = "1zqckndfn85l1cd8pndw212zg1bq9fkg1nnj32kp2mppppsyg2kz";
1065 sha256 = "1580p47l2zqzsza8jcnw1h2wh3vvmygk6ly8bvi4w0g8j14sjys4";
1116 };
1066 };
1117 meta = {
1067 meta = {
1118 license = [ pkgs.lib.licenses.mit ];
1068 license = [ pkgs.lib.licenses.mit ];
@@ -1134,22 +1084,22 b' self: super: {'
1134 };
1084 };
1135 };
1085 };
1136 "psutil" = super.buildPythonPackage {
1086 "psutil" = super.buildPythonPackage {
1137 name = "psutil-5.4.6";
1087 name = "psutil-5.4.7";
1138 doCheck = false;
1088 doCheck = false;
1139 src = fetchurl {
1089 src = fetchurl {
1140 url = "https://files.pythonhosted.org/packages/51/9e/0f8f5423ce28c9109807024f7bdde776ed0b1161de20b408875de7e030c3/psutil-5.4.6.tar.gz";
1090 url = "https://files.pythonhosted.org/packages/7d/9a/1e93d41708f8ed2b564395edfa3389f0fd6d567597401c2e5e2775118d8b/psutil-5.4.7.tar.gz";
1141 sha256 = "1xmw4qi6hnrhw81xqzkvmsm9im7j2vkk4v26ycjwq2jczqsmlvk8";
1091 sha256 = "0fsgmvzwbdbszkwfnqhib8jcxm4w6zyhvlxlcda0rfm5cyqj4qsv";
1142 };
1092 };
1143 meta = {
1093 meta = {
1144 license = [ pkgs.lib.licenses.bsdOriginal ];
1094 license = [ pkgs.lib.licenses.bsdOriginal ];
1145 };
1095 };
1146 };
1096 };
1147 "psycopg2" = super.buildPythonPackage {
1097 "psycopg2" = super.buildPythonPackage {
1148 name = "psycopg2-2.7.4";
1098 name = "psycopg2-2.7.5";
1149 doCheck = false;
1099 doCheck = false;
1150 src = fetchurl {
1100 src = fetchurl {
1151 url = "https://files.pythonhosted.org/packages/74/83/51580322ed0e82cba7ad8e0af590b8fb2cf11bd5aaa1ed872661bd36f462/psycopg2-2.7.4.tar.gz";
1101 url = "https://files.pythonhosted.org/packages/b2/c1/7bf6c464e903ffc4f3f5907c389e5a4199666bf57f6cd6bf46c17912a1f9/psycopg2-2.7.5.tar.gz";
1152 sha256 = "02b2yaf1hlwb91xkscbzmajpfj5z3d8yikzh5r48fs8gss8i3xcb";
1102 sha256 = "17klx964gw8z0znl0raz3by8vdc7cq5gxj4pdcrfcina84nrdkzc";
1153 };
1103 };
1154 meta = {
1104 meta = {
1155 license = [ pkgs.lib.licenses.zpl21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
1105 license = [ pkgs.lib.licenses.zpl21 { fullName = "GNU Library or Lesser General Public License (LGPL)"; } { fullName = "LGPL with exceptions or ZPL"; } ];
@@ -1167,11 +1117,11 b' self: super: {'
1167 };
1117 };
1168 };
1118 };
1169 "py" = super.buildPythonPackage {
1119 "py" = super.buildPythonPackage {
1170 name = "py-1.5.3";
1120 name = "py-1.6.0";
1171 doCheck = false;
1121 doCheck = false;
1172 src = fetchurl {
1122 src = fetchurl {
1173 url = "https://files.pythonhosted.org/packages/f7/84/b4c6e84672c4ceb94f727f3da8344037b62cee960d80e999b1cd9b832d83/py-1.5.3.tar.gz";
1123 url = "https://files.pythonhosted.org/packages/4f/38/5f427d1eedae73063ce4da680d2bae72014995f9fdeaa57809df61c968cd/py-1.6.0.tar.gz";
1174 sha256 = "10gq2lckvgwlk9w6yzijhzkarx44hsaknd0ypa08wlnpjnsgmj99";
1124 sha256 = "1wcs3zv9wl5m5x7p16avqj2gsrviyb23yvc3pr330isqs0sh98q6";
1175 };
1125 };
1176 meta = {
1126 meta = {
1177 license = [ pkgs.lib.licenses.mit ];
1127 license = [ pkgs.lib.licenses.mit ];
@@ -1393,6 +1343,22 b' self: super: {'
1393 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1343 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1394 };
1344 };
1395 };
1345 };
1346 "pyramid-mailer" = super.buildPythonPackage {
1347 name = "pyramid-mailer-0.15.1";
1348 doCheck = false;
1349 propagatedBuildInputs = [
1350 self."pyramid"
1351 self."repoze.sendmail"
1352 self."transaction"
1353 ];
1354 src = fetchurl {
1355 url = "https://files.pythonhosted.org/packages/a0/f2/6febf5459dff4d7e653314d575469ad2e11b9d2af2c3606360e1c67202f2/pyramid_mailer-0.15.1.tar.gz";
1356 sha256 = "16vg8jb203jgb7b0hd6wllfqvp542qh2ry1gjai2m6qpv5agy2pc";
1357 };
1358 meta = {
1359 license = [ pkgs.lib.licenses.bsdOriginal ];
1360 };
1361 };
1396 "pyramid-mako" = super.buildPythonPackage {
1362 "pyramid-mako" = super.buildPythonPackage {
1397 name = "pyramid-mako-1.0.2";
1363 name = "pyramid-mako-1.0.2";
1398 doCheck = false;
1364 doCheck = false;
@@ -1420,7 +1386,7 b' self: super: {'
1420 };
1386 };
1421 };
1387 };
1422 "pytest" = super.buildPythonPackage {
1388 "pytest" = super.buildPythonPackage {
1423 name = "pytest-3.6.0";
1389 name = "pytest-3.8.2";
1424 doCheck = false;
1390 doCheck = false;
1425 propagatedBuildInputs = [
1391 propagatedBuildInputs = [
1426 self."py"
1392 self."py"
@@ -1431,25 +1397,26 b' self: super: {'
1431 self."atomicwrites"
1397 self."atomicwrites"
1432 self."pluggy"
1398 self."pluggy"
1433 self."funcsigs"
1399 self."funcsigs"
1400 self."pathlib2"
1434 ];
1401 ];
1435 src = fetchurl {
1402 src = fetchurl {
1436 url = "https://files.pythonhosted.org/packages/67/6a/5bcdc22f8dbada1d2910d6e1a3a03f6b14306c78f81122890735b28be4bf/pytest-3.6.0.tar.gz";
1403 url = "https://files.pythonhosted.org/packages/5f/d2/7f77f406ac505abda02ab4afb50d06ebf304f6ea42fca34f8f37529106b2/pytest-3.8.2.tar.gz";
1437 sha256 = "0bdfazvjjbxssqzyvkb3m2x2in7xv56ipr899l00s87k7815sm9r";
1404 sha256 = "18nrwzn61kph2y6gxwfz9ms68rfvr9d4vcffsxng9p7jk9z18clk";
1438 };
1405 };
1439 meta = {
1406 meta = {
1440 license = [ pkgs.lib.licenses.mit ];
1407 license = [ pkgs.lib.licenses.mit ];
1441 };
1408 };
1442 };
1409 };
1443 "pytest-cov" = super.buildPythonPackage {
1410 "pytest-cov" = super.buildPythonPackage {
1444 name = "pytest-cov-2.5.1";
1411 name = "pytest-cov-2.6.0";
1445 doCheck = false;
1412 doCheck = false;
1446 propagatedBuildInputs = [
1413 propagatedBuildInputs = [
1447 self."pytest"
1414 self."pytest"
1448 self."coverage"
1415 self."coverage"
1449 ];
1416 ];
1450 src = fetchurl {
1417 src = fetchurl {
1451 url = "https://files.pythonhosted.org/packages/24/b4/7290d65b2f3633db51393bdf8ae66309b37620bc3ec116c5e357e3e37238/pytest-cov-2.5.1.tar.gz";
1418 url = "https://files.pythonhosted.org/packages/d9/e2/58f90a316fbd94dd50bf5c826a23f3f5d079fb3cc448c1e9f0e3c33a3d2a/pytest-cov-2.6.0.tar.gz";
1452 sha256 = "0bbfpwdh9k3636bxc88vz9fa7vf4akchgn513ql1vd0xy4n7bah3";
1419 sha256 = "0qnpp9y3ygx4jk4pf5ad71fh2skbvnr6gl54m7rg5qysnx4g0q73";
1453 };
1420 };
1454 meta = {
1421 meta = {
1455 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.mit ];
1422 license = [ pkgs.lib.licenses.bsdOriginal pkgs.lib.licenses.mit ];
@@ -1498,14 +1465,14 b' self: super: {'
1498 };
1465 };
1499 };
1466 };
1500 "pytest-timeout" = super.buildPythonPackage {
1467 "pytest-timeout" = super.buildPythonPackage {
1501 name = "pytest-timeout-1.2.1";
1468 name = "pytest-timeout-1.3.2";
1502 doCheck = false;
1469 doCheck = false;
1503 propagatedBuildInputs = [
1470 propagatedBuildInputs = [
1504 self."pytest"
1471 self."pytest"
1505 ];
1472 ];
1506 src = fetchurl {
1473 src = fetchurl {
1507 url = "https://files.pythonhosted.org/packages/be/e9/a9106b8bc87521c6813060f50f7d1fdc15665bc1bbbe71c0ffc1c571aaa2/pytest-timeout-1.2.1.tar.gz";
1474 url = "https://files.pythonhosted.org/packages/8c/3e/1b6a319d12ae7baa3acb7c18ff2c8630a09471a0319d43535c683b4d03eb/pytest-timeout-1.3.2.tar.gz";
1508 sha256 = "1kdp6qbh5v1168l99rba5yfzvy05gmzkmkhldgp36p9xcdjd5dv8";
1475 sha256 = "09wnmzvnls2mnsdz7x3c3sk2zdp6jl4dryvyj5i8hqz16q2zq5qi";
1509 };
1476 };
1510 meta = {
1477 meta = {
1511 license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ];
1478 license = [ pkgs.lib.licenses.mit { fullName = "DFSG approved"; } ];
@@ -1620,6 +1587,22 b' self: super: {'
1620 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1587 license = [ { fullName = "Repoze Public License"; } { fullName = "BSD-derived (http://www.repoze.org/LICENSE.txt)"; } ];
1621 };
1588 };
1622 };
1589 };
1590 "repoze.sendmail" = super.buildPythonPackage {
1591 name = "repoze.sendmail-4.4.1";
1592 doCheck = false;
1593 propagatedBuildInputs = [
1594 self."setuptools"
1595 self."zope.interface"
1596 self."transaction"
1597 ];
1598 src = fetchurl {
1599 url = "https://files.pythonhosted.org/packages/12/4e/8ef1fd5c42765d712427b9c391419a77bd48877886d2cbc5e9f23c8cad9b/repoze.sendmail-4.4.1.tar.gz";
1600 sha256 = "096ln02jr2afk7ab9j2czxqv2ryqq7m86ah572nqplx52iws73ks";
1601 };
1602 meta = {
1603 license = [ pkgs.lib.licenses.zpl21 ];
1604 };
1605 };
1623 "requests" = super.buildPythonPackage {
1606 "requests" = super.buildPythonPackage {
1624 name = "requests-2.9.1";
1607 name = "requests-2.9.1";
1625 doCheck = false;
1608 doCheck = false;
@@ -1632,7 +1615,7 b' self: super: {'
1632 };
1615 };
1633 };
1616 };
1634 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1617 "rhodecode-enterprise-ce" = super.buildPythonPackage {
1635 name = "rhodecode-enterprise-ce-4.13.3";
1618 name = "rhodecode-enterprise-ce-4.14.0";
1636 buildInputs = [
1619 buildInputs = [
1637 self."pytest"
1620 self."pytest"
1638 self."py"
1621 self."py"
@@ -1640,8 +1623,8 b' self: super: {'
1640 self."pytest-sugar"
1623 self."pytest-sugar"
1641 self."pytest-runner"
1624 self."pytest-runner"
1642 self."pytest-profiling"
1625 self."pytest-profiling"
1626 self."pytest-timeout"
1643 self."gprof2dot"
1627 self."gprof2dot"
1644 self."pytest-timeout"
1645 self."mock"
1628 self."mock"
1646 self."webtest"
1629 self."webtest"
1647 self."cov-core"
1630 self."cov-core"
@@ -1688,7 +1671,6 b' self: super: {'
1688 self."mysql-python"
1671 self."mysql-python"
1689 self."pymysql"
1672 self."pymysql"
1690 self."pyotp"
1673 self."pyotp"
1691 self."objgraph"
1692 self."packaging"
1674 self."packaging"
1693 self."paste"
1675 self."paste"
1694 self."pastedeploy"
1676 self."pastedeploy"
@@ -1709,6 +1691,7 b' self: super: {'
1709 self."pyramid-jinja2"
1691 self."pyramid-jinja2"
1710 self."pyramid-mako"
1692 self."pyramid-mako"
1711 self."pyramid"
1693 self."pyramid"
1694 self."pyramid-mailer"
1712 self."pysqlite"
1695 self."pysqlite"
1713 self."python-dateutil"
1696 self."python-dateutil"
1714 self."python-ldap"
1697 self."python-ldap"
@@ -1722,7 +1705,6 b' self: super: {'
1722 self."repoze.lru"
1705 self."repoze.lru"
1723 self."requests"
1706 self."requests"
1724 self."routes"
1707 self."routes"
1725 self."setproctitle"
1726 self."simplejson"
1708 self."simplejson"
1727 self."six"
1709 self."six"
1728 self."sqlalchemy"
1710 self."sqlalchemy"
@@ -1756,10 +1738,9 b' self: super: {'
1756 self."greenlet"
1738 self."greenlet"
1757 self."gunicorn"
1739 self."gunicorn"
1758 self."waitress"
1740 self."waitress"
1741 self."setproctitle"
1759 self."ipdb"
1742 self."ipdb"
1760 self."ipython"
1743 self."ipython"
1761 self."cprofilev"
1762 self."bottle"
1763 self."rhodecode-tools"
1744 self."rhodecode-tools"
1764 self."appenlight-client"
1745 self."appenlight-client"
1765 self."pytest"
1746 self."pytest"
@@ -1768,8 +1749,8 b' self: super: {'
1768 self."pytest-sugar"
1749 self."pytest-sugar"
1769 self."pytest-runner"
1750 self."pytest-runner"
1770 self."pytest-profiling"
1751 self."pytest-profiling"
1752 self."pytest-timeout"
1771 self."gprof2dot"
1753 self."gprof2dot"
1772 self."pytest-timeout"
1773 self."mock"
1754 self."mock"
1774 self."webtest"
1755 self."webtest"
1775 self."cov-core"
1756 self."cov-core"
@@ -1781,7 +1762,7 b' self: super: {'
1781 };
1762 };
1782 };
1763 };
1783 "rhodecode-tools" = super.buildPythonPackage {
1764 "rhodecode-tools" = super.buildPythonPackage {
1784 name = "rhodecode-tools-0.16.0";
1765 name = "rhodecode-tools-1.0.1";
1785 doCheck = false;
1766 doCheck = false;
1786 propagatedBuildInputs = [
1767 propagatedBuildInputs = [
1787 self."click"
1768 self."click"
@@ -1796,11 +1777,11 b' self: super: {'
1796 self."whoosh"
1777 self."whoosh"
1797 ];
1778 ];
1798 src = fetchurl {
1779 src = fetchurl {
1799 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.16.0.tar.gz?md5=87f81286b49156c2ac36f1a1acfa2164";
1780 url = "https://code.rhodecode.com/rhodecode-tools-ce/archive/v1.0.1.tar.gz?md5=ffb5d6bcb855305b93cfe23ad42e500b";
1800 sha256 = "00xcc2mj99lx9d0ksml0p2xrd00kf5ypwyigg58cc9j9bznx7mzr";
1781 sha256 = "0nr300s4sg685qs4wgbwlplwriawrwi6jq79z37frcnpyc89gpvm";
1801 };
1782 };
1802 meta = {
1783 meta = {
1803 license = [ { fullName = "AGPLv3 and Proprietary"; } ];
1784 license = [ { fullName = "Apache 2.0 and Proprietary"; } ];
1804 };
1785 };
1805 };
1786 };
1806 "routes" = super.buildPythonPackage {
1787 "routes" = super.buildPythonPackage {
@@ -1841,11 +1822,11 b' self: super: {'
1841 };
1822 };
1842 };
1823 };
1843 "setuptools" = super.buildPythonPackage {
1824 "setuptools" = super.buildPythonPackage {
1844 name = "setuptools-40.1.0";
1825 name = "setuptools-40.4.3";
1845 doCheck = false;
1826 doCheck = false;
1846 src = fetchurl {
1827 src = fetchurl {
1847 url = "https://files.pythonhosted.org/packages/5a/df/b2e3d9693bb0dcbeac516a73dd7a9eb82b126ae52e4a74605a9b01beddd5/setuptools-40.1.0.zip";
1828 url = "https://files.pythonhosted.org/packages/6e/9c/6a003320b00ef237f94aa74e4ad66c57a7618f6c79d67527136e2544b728/setuptools-40.4.3.zip";
1848 sha256 = "0w1blx5ajga5y15dci0mddk49cf2xpq0mp7rp7jrqr2diqk00ib6";
1829 sha256 = "058v6zns4634n4al2nmmvp15j8nrgwn8wjrbdks47wk3vm05gg5c";
1849 };
1830 };
1850 meta = {
1831 meta = {
1851 license = [ pkgs.lib.licenses.mit ];
1832 license = [ pkgs.lib.licenses.mit ];
@@ -1922,11 +1903,11 b' self: super: {'
1922 };
1903 };
1923 };
1904 };
1924 "subprocess32" = super.buildPythonPackage {
1905 "subprocess32" = super.buildPythonPackage {
1925 name = "subprocess32-3.5.1";
1906 name = "subprocess32-3.5.2";
1926 doCheck = false;
1907 doCheck = false;
1927 src = fetchurl {
1908 src = fetchurl {
1928 url = "https://files.pythonhosted.org/packages/de/fb/fd3e91507021e2aecdb081d1b920082628d6b8869ead845e3e87b3d2e2ca/subprocess32-3.5.1.tar.gz";
1909 url = "https://files.pythonhosted.org/packages/c3/5f/7117737fc7114061837a4f51670d863dd7f7f9c762a6546fa8a0dcfe61c8/subprocess32-3.5.2.tar.gz";
1929 sha256 = "0wgi3bfnssid1g6h0v803z3k1wjal6il16nr3r9c587cfzwfkv0q";
1910 sha256 = "11v62shwmdys48g7ncs3a8jwwnkcl8d4zcwy6dk73z1zy2f9hazb";
1930 };
1911 };
1931 meta = {
1912 meta = {
1932 license = [ pkgs.lib.licenses.psfl ];
1913 license = [ pkgs.lib.licenses.psfl ];
@@ -1969,11 +1950,11 b' self: super: {'
1969 };
1950 };
1970 };
1951 };
1971 "testpath" = super.buildPythonPackage {
1952 "testpath" = super.buildPythonPackage {
1972 name = "testpath-0.3.1";
1953 name = "testpath-0.4.2";
1973 doCheck = false;
1954 doCheck = false;
1974 src = fetchurl {
1955 src = fetchurl {
1975 url = "https://files.pythonhosted.org/packages/f4/8b/b71e9ee10e5f751e9d959bc750ab122ba04187f5aa52aabdc4e63b0e31a7/testpath-0.3.1.tar.gz";
1956 url = "https://files.pythonhosted.org/packages/06/30/9a7e917066d851d8b4117e85794b5f14516419ea714a8a2681ec6aa8a981/testpath-0.4.2.tar.gz";
1976 sha256 = "02bnmkvm6a8a1p5kcygylcd19v2s040qw3zp1n8ab3bqkj1kflqd";
1957 sha256 = "1y40hywscnnyb734pnzm55nd8r8kp1072bjxbil83gcd53cv755n";
1977 };
1958 };
1978 meta = {
1959 meta = {
1979 license = [ ];
1960 license = [ ];
@@ -1996,6 +1977,20 b' self: super: {'
1996 license = [ pkgs.lib.licenses.bsdOriginal ];
1977 license = [ pkgs.lib.licenses.bsdOriginal ];
1997 };
1978 };
1998 };
1979 };
1980 "transaction" = super.buildPythonPackage {
1981 name = "transaction-2.4.0";
1982 doCheck = false;
1983 propagatedBuildInputs = [
1984 self."zope.interface"
1985 ];
1986 src = fetchurl {
1987 url = "https://files.pythonhosted.org/packages/9d/7d/0e8af0d059e052b9dcf2bb5a08aad20ae3e238746bdd3f8701a60969b363/transaction-2.4.0.tar.gz";
1988 sha256 = "17wz1y524ca07vr03yddy8dv0gbscs06dbdywmllxv5rc725jq3j";
1989 };
1990 meta = {
1991 license = [ pkgs.lib.licenses.zpl21 ];
1992 };
1993 };
1999 "translationstring" = super.buildPythonPackage {
1994 "translationstring" = super.buildPythonPackage {
2000 name = "translationstring-1.3";
1995 name = "translationstring-1.3";
2001 doCheck = false;
1996 doCheck = false;
@@ -23,9 +23,6 b' pkgs.stdenv.mkDerivation {'
23 pip2nix.pip2nix
23 pip2nix.pip2nix
24 pythonPackages.pip-tools
24 pythonPackages.pip-tools
25
25
26 # Allows to generate bower dependencies
27 pkgs.nodePackages.bower2nix
28
29 # Allows to generate node dependencies
26 # Allows to generate node dependencies
30 pkgs.nodePackages.node2nix
27 pkgs.nodePackages.node2nix
31
28
@@ -1,14 +1,12 b''
1 # This file defines how to "build" for packaging.
1 # This file defines how to "build" for packaging.
2
2
3 { pkgs ? import <nixpkgs> {}
3 { doCheck ? false
4 , doCheck ? false
5 }:
4 }:
6
5
7 let
6 let
8 enterprise_ce = import ./default.nix {
7 enterprise_ce = import ./default.nix {
9 inherit
8 inherit
10 doCheck
9 doCheck;
11 pkgs;
12
10
13 # disable checkPhase for build
11 # disable checkPhase for build
14 checkPhase = ''
12 checkPhase = ''
@@ -4,8 +4,8 b' setuptools-scm==2.1.0'
4 amqp==2.3.1
4 amqp==2.3.1
5 # not released authomatic that has updated some oauth providers
5 # not released authomatic that has updated some oauth providers
6 https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801#egg=authomatic==0.1.0.post1
6 https://code.rhodecode.com/upstream/authomatic/archive/90a9ce60cc405ae8a2bf5c3713acd5d78579a04e.tar.gz?md5=3c68720a1322b25254009518d1ff6801#egg=authomatic==0.1.0.post1
7 atomicwrites==1.1.5
7 atomicwrites==1.2.1
8 attrs==18.1.0
8 attrs==18.2.0
9 babel==1.3
9 babel==1.3
10 beaker==1.9.1
10 beaker==1.9.1
11 celery==4.1.1
11 celery==4.1.1
@@ -19,7 +19,7 b' cssselect==1.0.3'
19 decorator==4.1.2
19 decorator==4.1.2
20 deform==2.0.5
20 deform==2.0.5
21 docutils==0.14.0
21 docutils==0.14.0
22 dogpile.cache==0.6.6
22 dogpile.cache==0.6.7
23 dogpile.core==0.4.1
23 dogpile.core==0.4.1
24 ecdsa==0.13
24 ecdsa==0.13
25 formencode==1.2.4
25 formencode==1.2.4
@@ -40,15 +40,14 b' msgpack-python==0.5.6'
40 mysql-python==1.2.5
40 mysql-python==1.2.5
41 pymysql==0.8.1
41 pymysql==0.8.1
42 pyotp==2.2.6
42 pyotp==2.2.6
43 objgraph==3.1.1
44 packaging==15.2
43 packaging==15.2
45 paste==2.0.3
44 paste==2.0.3
46 pastedeploy==1.5.2
45 pastedeploy==1.5.2
47 pastescript==2.0.2
46 pastescript==2.0.2
48 pathlib2==2.3.0
47 pathlib2==2.3.2
49 peppercorn==0.5
48 peppercorn==0.5
50 psutil==5.4.6
49 psutil==5.4.7
51 psycopg2==2.7.4
50 psycopg2==2.7.5
52 py-bcrypt==0.4
51 py-bcrypt==0.4
53 pycrypto==2.6.1
52 pycrypto==2.6.1
54 pycurl==7.43.0.2
53 pycurl==7.43.0.2
@@ -61,6 +60,7 b' pyramid-debugtoolbar==4.4.0'
61 pyramid-jinja2==2.7
60 pyramid-jinja2==2.7
62 pyramid-mako==1.0.2
61 pyramid-mako==1.0.2
63 pyramid==1.9.2
62 pyramid==1.9.2
63 pyramid_mailer==0.15.1
64 pysqlite==2.8.3
64 pysqlite==2.8.3
65 python-dateutil
65 python-dateutil
66 python-ldap==3.1.0
66 python-ldap==3.1.0
@@ -74,12 +74,11 b' redis==2.10.6'
74 repoze.lru==0.7
74 repoze.lru==0.7
75 requests==2.9.1
75 requests==2.9.1
76 routes==2.4.1
76 routes==2.4.1
77 setproctitle==1.1.10
78 simplejson==3.11.1
77 simplejson==3.11.1
79 six==1.11.0
78 six==1.11.0
80 sqlalchemy==1.1.18
79 sqlalchemy==1.1.18
81 sshpubkeys==2.2.0
80 sshpubkeys==2.2.0
82 subprocess32==3.5.1
81 subprocess32==3.5.2
83 supervisor==3.3.4
82 supervisor==3.3.4
84 tempita==0.5.2
83 tempita==0.5.2
85 translationstring==1.3
84 translationstring==1.3
@@ -113,22 +112,24 b' invoke==0.13.0'
113 bumpversion==0.5.3
112 bumpversion==0.5.3
114
113
115 ## http servers
114 ## http servers
116 gevent==1.3.5
115 gevent==1.3.6
117 greenlet==0.4.13
116 greenlet==0.4.15
118 gunicorn==19.9.0
117 gunicorn==19.9.0
119 waitress==1.1.0
118 waitress==1.1.0
119 setproctitle==1.1.10
120
120
121 ## debug
121 ## debug
122 ipdb==0.11.0
122 ipdb==0.11.0
123 ipython==5.1.0
123 ipython==5.1.0
124 cprofilev==1.0.7
125 bottle==0.12.13
126
124
127 ## rhodecode-tools, special case
125 ## rhodecode-tools, special case
128 https://code.rhodecode.com/rhodecode-tools-ce/archive/v0.16.0.tar.gz?md5=87f81286b49156c2ac36f1a1acfa2164#egg=rhodecode-tools==0.16.0
126 https://code.rhodecode.com/rhodecode-tools-ce/archive/v1.0.1.tar.gz?md5=ffb5d6bcb855305b93cfe23ad42e500b#egg=rhodecode-tools==1.0.1
129
127
130 ## appenlight
128 ## appenlight
131 appenlight-client==0.6.25
129 appenlight-client==0.6.25
132
130
133 ## test related requirements
131 ## test related requirements
134 -r requirements_test.txt
132 -r requirements_test.txt
133
134 ## uncomment to add the debug libraries
135 #-r requirements_debug.txt
@@ -1,14 +1,14 b''
1 # test related requirements
1 # test related requirements
2 pytest==3.6.0
2 pytest==3.8.2
3 py==1.5.3
3 py==1.6.0
4 pytest-cov==2.5.1
4 pytest-cov==2.6.0
5 pytest-sugar==0.9.1
5 pytest-sugar==0.9.1
6 pytest-runner==4.2.0
6 pytest-runner==4.2.0
7 pytest-profiling==1.3.0
7 pytest-profiling==1.3.0
8 pytest-timeout==1.3.2
8 gprof2dot==2017.9.19
9 gprof2dot==2017.9.19
9 pytest-timeout==1.2.1
10
10
11 mock==1.0.1
11 mock==1.0.1
12 webtest==2.0.29
12 webtest==2.0.29
13 cov-core==1.15.0
13 cov-core==1.15.0
14 coverage==3.7.1
14 coverage==4.5.1
@@ -1,1 +1,1 b''
1 4.13.3 No newline at end of file
1 4.14.0 No newline at end of file
@@ -51,7 +51,7 b' PYRAMID_SETTINGS = {}'
51 EXTENSIONS = {}
51 EXTENSIONS = {}
52
52
53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
53 __version__ = ('.'.join((str(each) for each in VERSION[:3])))
54 __dbversion__ = 90 # defines current db version for migrations
54 __dbversion__ = 91 # defines current db version for migrations
55 __platform__ = platform.system()
55 __platform__ = platform.system()
56 __license__ = 'AGPLv3, and Commercial License'
56 __license__ = 'AGPLv3, and Commercial License'
57 __author__ = 'RhodeCode GmbH'
57 __author__ = 'RhodeCode GmbH'
@@ -204,7 +204,7 b' def request_view(request):'
204 message='Request from IP:%s not allowed' % (
204 message='Request from IP:%s not allowed' % (
205 request.rpc_ip_addr,))
205 request.rpc_ip_addr,))
206 else:
206 else:
207 log.info('Access for IP:%s allowed' % (request.rpc_ip_addr,))
207 log.info('Access for IP:%s allowed', request.rpc_ip_addr)
208
208
209 # register our auth-user
209 # register our auth-user
210 request.rpc_user = auth_u
210 request.rpc_user = auth_u
@@ -352,8 +352,7 b' def setup_request(request):'
352 request.rpc_params = json_body['args'] \
352 request.rpc_params = json_body['args'] \
353 if isinstance(json_body['args'], dict) else {}
353 if isinstance(json_body['args'], dict) else {}
354
354
355 log.debug(
355 log.debug('method: %s, params: %s', request.rpc_method, request.rpc_params)
356 'method: %s, params: %s' % (request.rpc_method, request.rpc_params))
357 except KeyError as e:
356 except KeyError as e:
358 raise JSONRPCError('Incorrect JSON data. Missing %s' % e)
357 raise JSONRPCError('Incorrect JSON data. Missing %s' % e)
359
358
@@ -20,7 +20,9 b''
20
20
21
21
22 class JSONRPCBaseError(Exception):
22 class JSONRPCBaseError(Exception):
23 pass
23 def __init__(self, message='', *args):
24 self.message = message
25 super(JSONRPCBaseError, self).__init__(message, *args)
24
26
25
27
26 class JSONRPCError(JSONRPCBaseError):
28 class JSONRPCError(JSONRPCBaseError):
@@ -31,7 +33,8 b' class JSONRPCValidationError(JSONRPCBase'
31
33
32 def __init__(self, *args, **kwargs):
34 def __init__(self, *args, **kwargs):
33 self.colander_exception = kwargs.pop('colander_exc')
35 self.colander_exception = kwargs.pop('colander_exc')
34 super(JSONRPCValidationError, self).__init__(*args, **kwargs)
36 super(JSONRPCValidationError, self).__init__(
37 message=self.colander_exception, *args)
35
38
36
39
37 class JSONRPCForbidden(JSONRPCBaseError):
40 class JSONRPCForbidden(JSONRPCBaseError):
@@ -65,7 +65,7 b' class TestCommentCommit(object):'
65 self, backend, status_change, message, commit_id,
65 self, backend, status_change, message, commit_id,
66 no_notifications):
66 no_notifications):
67
67
68 commit_id = backend.repo.scm_instance().get_changeset(commit_id).raw_id
68 commit_id = backend.repo.scm_instance().get_commit(commit_id).raw_id
69
69
70 id_, params = build_data(
70 id_, params = build_data(
71 self.apikey, 'comment_commit', repoid=backend.repo_name,
71 self.apikey, 'comment_commit', repoid=backend.repo_name,
@@ -74,7 +74,7 b' class TestCommentCommit(object):'
74 repo = backend.repo.scm_instance()
74 repo = backend.repo.scm_instance()
75 expected = {
75 expected = {
76 'msg': 'Commented on commit `%s` for repository `%s`' % (
76 'msg': 'Commented on commit `%s` for repository `%s`' % (
77 repo.get_changeset().raw_id, backend.repo_name),
77 repo.get_commit().raw_id, backend.repo_name),
78 'status_change': status_change,
78 'status_change': status_change,
79 'success': True
79 'success': True
80 }
80 }
@@ -66,6 +66,7 b' class TestCreatePullRequestApi(object):'
66 expected_message = "Created new pull request `{title}`".format(
66 expected_message = "Created new pull request `{title}`".format(
67 title=data['title'])
67 title=data['title'])
68 result = response.json
68 result = response.json
69 assert result['error'] == None
69 assert result['result']['msg'] == expected_message
70 assert result['result']['msg'] == expected_message
70 pull_request_id = result['result']['pull_request_id']
71 pull_request_id = result['result']['pull_request_id']
71 pull_request = PullRequestModel().get(pull_request_id)
72 pull_request = PullRequestModel().get(pull_request_id)
@@ -88,6 +89,7 b' class TestCreatePullRequestApi(object):'
88 expected_message = "Created new pull request `{title}`".format(
89 expected_message = "Created new pull request `{title}`".format(
89 title=data['title'])
90 title=data['title'])
90 result = response.json
91 result = response.json
92 assert result['error'] == None
91 assert result['result']['msg'] == expected_message
93 assert result['result']['msg'] == expected_message
92 pull_request_id = result['result']['pull_request_id']
94 pull_request_id = result['result']['pull_request_id']
93 pull_request = PullRequestModel().get(pull_request_id)
95 pull_request = PullRequestModel().get(pull_request_id)
@@ -127,6 +129,7 b' class TestCreatePullRequestApi(object):'
127 expected_message = "Created new pull request `{title}`".format(
129 expected_message = "Created new pull request `{title}`".format(
128 title=data['title'])
130 title=data['title'])
129 result = response.json
131 result = response.json
132 assert result['error'] == None
130 assert result['result']['msg'] == expected_message
133 assert result['result']['msg'] == expected_message
131 pull_request_id = result['result']['pull_request_id']
134 pull_request_id = result['result']['pull_request_id']
132 pull_request = PullRequestModel().get(pull_request_id)
135 pull_request = PullRequestModel().get(pull_request_id)
@@ -170,6 +173,7 b' class TestCreatePullRequestApi(object):'
170 expected_message = "Created new pull request `{title}`".format(
173 expected_message = "Created new pull request `{title}`".format(
171 title=data['title'])
174 title=data['title'])
172 result = response.json
175 result = response.json
176 assert result['error'] == None
173 assert result['result']['msg'] == expected_message
177 assert result['result']['msg'] == expected_message
174 pull_request_id = result['result']['pull_request_id']
178 pull_request_id = result['result']['pull_request_id']
175 pull_request = PullRequestModel().get(pull_request_id)
179 pull_request = PullRequestModel().get(pull_request_id)
@@ -19,7 +19,7 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
20
21 import os
21 import os
22
22 import mock
23 import pytest
23 import pytest
24
24
25 from rhodecode.tests import TESTS_TMP_PATH
25 from rhodecode.tests import TESTS_TMP_PATH
@@ -29,6 +29,7 b' from rhodecode.api.tests.utils import ('
29
29
30 @pytest.mark.usefixtures("testuser_api", "app")
30 @pytest.mark.usefixtures("testuser_api", "app")
31 class TestPull(object):
31 class TestPull(object):
32
32 @pytest.mark.backends("git", "hg")
33 @pytest.mark.backends("git", "hg")
33 def test_api_pull(self, backend):
34 def test_api_pull(self, backend):
34 r = backend.create_repo()
35 r = backend.create_repo()
@@ -37,12 +38,13 b' class TestPull(object):'
37 r.clone_uri = clone_uri
38 r.clone_uri = clone_uri
38
39
39 id_, params = build_data(self.apikey, 'pull', repoid=repo_name,)
40 id_, params = build_data(self.apikey, 'pull', repoid=repo_name,)
40 response = api_call(self.app, params)
41 with mock.patch('rhodecode.model.scm.url_validator'):
41 msg = 'Pulled from url `%s` on repo `%s`' % (
42 response = api_call(self.app, params)
42 clone_uri, repo_name)
43 msg = 'Pulled from url `%s` on repo `%s`' % (
43 expected = {'msg': msg,
44 clone_uri, repo_name)
44 'repository': repo_name}
45 expected = {'msg': msg,
45 assert_ok(id_, expected, given=response.body)
46 'repository': repo_name}
47 assert_ok(id_, expected, given=response.body)
46
48
47 def test_api_pull_error(self, backend):
49 def test_api_pull_error(self, backend):
48 id_, params = build_data(
50 id_, params = build_data(
@@ -89,7 +89,6 b' class TestUpdatePullRequest(object):'
89 pr_util.update_source_repository(head='c')
89 pr_util.update_source_repository(head='c')
90 repo = pull_request.source_repo.scm_instance()
90 repo = pull_request.source_repo.scm_instance()
91 commits = [x for x in repo.get_commits()]
91 commits = [x for x in repo.get_commits()]
92 print commits
93
92
94 added_commit_id = commits[-1].raw_id # c commit
93 added_commit_id = commits[-1].raw_id # c commit
95 common_commit_id = commits[1].raw_id # b commit is common ancestor
94 common_commit_id = commits[1].raw_id # b commit is common ancestor
@@ -26,7 +26,7 b' from rhodecode.tests import TEST_USER_AD'
26 from rhodecode.api.tests.utils import (
26 from rhodecode.api.tests.utils import (
27 build_data, api_call, assert_error, assert_ok, crash, jsonify)
27 build_data, api_call, assert_error, assert_ok, crash, jsonify)
28 from rhodecode.tests.fixture import Fixture
28 from rhodecode.tests.fixture import Fixture
29 from rhodecode.tests.plugin import http_host_stub, http_host_only_stub
29 from rhodecode.tests.plugin import plain_http_host_only_stub
30
30
31 fixture = Fixture()
31 fixture = Fixture()
32
32
@@ -56,9 +56,15 b' class TestApiUpdateRepo(object):'
56 ({'clone_uri': ''},
56 ({'clone_uri': ''},
57 {'clone_uri': ''}),
57 {'clone_uri': ''}),
58
58
59 ({'clone_uri': 'http://example.com/repo_pull'},
60 {'clone_uri': 'http://example.com/repo_pull'}),
61
59 ({'push_uri': ''},
62 ({'push_uri': ''},
60 {'push_uri': ''}),
63 {'push_uri': ''}),
61
64
65 ({'push_uri': 'http://example.com/repo_push'},
66 {'push_uri': 'http://example.com/repo_push'}),
67
62 ({'landing_rev': 'rev:tip'},
68 ({'landing_rev': 'rev:tip'},
63 {'landing_rev': ['rev', 'tip']}),
69 {'landing_rev': ['rev', 'tip']}),
64
70
@@ -74,7 +80,7 b' class TestApiUpdateRepo(object):'
74 ({'repo_name': 'new_repo_name'},
80 ({'repo_name': 'new_repo_name'},
75 {
81 {
76 'repo_name': 'new_repo_name',
82 'repo_name': 'new_repo_name',
77 'url': 'http://{}/new_repo_name'.format(http_host_only_stub())
83 'url': 'http://{}/new_repo_name'.format(plain_http_host_only_stub())
78 }),
84 }),
79
85
80 ({'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME),
86 ({'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME),
@@ -82,7 +88,7 b' class TestApiUpdateRepo(object):'
82 {
88 {
83 'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME),
89 'repo_name': 'test_group_for_update/{}'.format(UPDATE_REPO_NAME),
84 'url': 'http://{}/test_group_for_update/{}'.format(
90 'url': 'http://{}/test_group_for_update/{}'.format(
85 http_host_only_stub(), UPDATE_REPO_NAME)
91 plain_http_host_only_stub(), UPDATE_REPO_NAME)
86 }),
92 }),
87 ])
93 ])
88 def test_api_update_repo(self, updates, expected, backend):
94 def test_api_update_repo(self, updates, expected, backend):
@@ -33,7 +33,7 b' from rhodecode.lib import audit_logger'
33 from rhodecode.lib import repo_maintenance
33 from rhodecode.lib import repo_maintenance
34 from rhodecode.lib.auth import HasPermissionAnyApi, HasUserGroupPermissionAnyApi
34 from rhodecode.lib.auth import HasPermissionAnyApi, HasUserGroupPermissionAnyApi
35 from rhodecode.lib.celerylib.utils import get_task_id
35 from rhodecode.lib.celerylib.utils import get_task_id
36 from rhodecode.lib.utils2 import str2bool, time_to_datetime
36 from rhodecode.lib.utils2 import str2bool, time_to_datetime, safe_str
37 from rhodecode.lib.ext_json import json
37 from rhodecode.lib.ext_json import json
38 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
38 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
39 from rhodecode.model.changeset_status import ChangesetStatusModel
39 from rhodecode.model.changeset_status import ChangesetStatusModel
@@ -316,7 +316,7 b' def get_repo_changeset(request, apiuser,'
316 try:
316 try:
317 cs = repo.get_commit(commit_id=revision, pre_load=pre_load)
317 cs = repo.get_commit(commit_id=revision, pre_load=pre_load)
318 except TypeError as e:
318 except TypeError as e:
319 raise JSONRPCError(e.message)
319 raise JSONRPCError(safe_str(e))
320 _cs_json = cs.__json__()
320 _cs_json = cs.__json__()
321 _cs_json['diff'] = build_commit_data(cs, changes_details)
321 _cs_json['diff'] = build_commit_data(cs, changes_details)
322 if changes_details == 'full':
322 if changes_details == 'full':
@@ -382,7 +382,7 b' def get_repo_changesets(request, apiuser'
382 commits = vcs_repo.get_commits(
382 commits = vcs_repo.get_commits(
383 start_id=start_rev, pre_load=pre_load)
383 start_id=start_rev, pre_load=pre_load)
384 except TypeError as e:
384 except TypeError as e:
385 raise JSONRPCError(e.message)
385 raise JSONRPCError(safe_str(e))
386 except Exception:
386 except Exception:
387 log.exception('Fetching of commits failed')
387 log.exception('Fetching of commits failed')
388 raise JSONRPCError('Error occurred during commit fetching')
388 raise JSONRPCError('Error occurred during commit fetching')
@@ -1433,7 +1433,7 b' def comment_commit('
1433 commit_id = repo.scm_instance().get_commit(commit_id=commit_id).raw_id
1433 commit_id = repo.scm_instance().get_commit(commit_id=commit_id).raw_id
1434 except Exception as e:
1434 except Exception as e:
1435 log.exception('Failed to fetch commit')
1435 log.exception('Failed to fetch commit')
1436 raise JSONRPCError(e.message)
1436 raise JSONRPCError(safe_str(e))
1437
1437
1438 if isinstance(userid, Optional):
1438 if isinstance(userid, Optional):
1439 userid = apiuser.user_id
1439 userid = apiuser.user_id
@@ -25,7 +25,8 b' import operator'
25 from pyramid.httpexceptions import HTTPFound, HTTPForbidden, HTTPBadRequest
25 from pyramid.httpexceptions import HTTPFound, HTTPForbidden, HTTPBadRequest
26
26
27 from rhodecode.lib import helpers as h, diffs
27 from rhodecode.lib import helpers as h, diffs
28 from rhodecode.lib.utils2 import StrictAttributeDict, safe_int, datetime_to_time
28 from rhodecode.lib.utils2 import (
29 StrictAttributeDict, safe_int, datetime_to_time, safe_unicode)
29 from rhodecode.lib.vcs.exceptions import RepositoryRequirementError
30 from rhodecode.lib.vcs.exceptions import RepositoryRequirementError
30 from rhodecode.model import repo
31 from rhodecode.model import repo
31 from rhodecode.model import repo_group
32 from rhodecode.model import repo_group
@@ -61,12 +62,13 b' def add_route_with_slash(config,name, pa'
61 config.add_route(name + '_slash', pattern + '/', **kw)
62 config.add_route(name + '_slash', pattern + '/', **kw)
62
63
63
64
64 def add_route_requirements(route_path, requirements=URL_NAME_REQUIREMENTS):
65 def add_route_requirements(route_path, requirements=None):
65 """
66 """
66 Adds regex requirements to pyramid routes using a mapping dict
67 Adds regex requirements to pyramid routes using a mapping dict
67 e.g::
68 e.g::
68 add_route_requirements('{repo_name}/settings')
69 add_route_requirements('{repo_name}/settings')
69 """
70 """
71 requirements = requirements or URL_NAME_REQUIREMENTS
70 for key, regex in requirements.items():
72 for key, regex in requirements.items():
71 route_path = route_path.replace('{%s}' % key, '{%s:%s}' % (key, regex))
73 route_path = route_path.replace('{%s}' % key, '{%s:%s}' % (key, regex))
72 return route_path
74 return route_path
@@ -201,7 +203,7 b' class RepoAppView(BaseAppView):'
201 def _handle_missing_requirements(self, error):
203 def _handle_missing_requirements(self, error):
202 log.error(
204 log.error(
203 'Requirements are missing for repository %s: %s',
205 'Requirements are missing for repository %s: %s',
204 self.db_repo_name, error.message)
206 self.db_repo_name, safe_unicode(error))
205
207
206 def _get_local_tmpl_context(self, include_app_defaults=True):
208 def _get_local_tmpl_context(self, include_app_defaults=True):
207 _ = self.request.translate
209 _ = self.request.translate
@@ -301,7 +303,8 b' class PathFilter(object):'
301
303
302 def render_patchset_filtered(self, diffset, patchset, source_ref=None, target_ref=None):
304 def render_patchset_filtered(self, diffset, patchset, source_ref=None, target_ref=None):
303 filtered_patchset, has_hidden_changes = self.filter_patchset(patchset)
305 filtered_patchset, has_hidden_changes = self.filter_patchset(patchset)
304 result = diffset.render_patchset(filtered_patchset, source_ref=source_ref, target_ref=target_ref)
306 result = diffset.render_patchset(
307 filtered_patchset, source_ref=source_ref, target_ref=target_ref)
305 result.has_hidden_changes = has_hidden_changes
308 result.has_hidden_changes = has_hidden_changes
306 return result
309 return result
307
310
@@ -505,6 +508,36 b' class RepoRoutePredicate(object):'
505 return False
508 return False
506
509
507
510
511 class RepoForbidArchivedRoutePredicate(object):
512 def __init__(self, val, config):
513 self.val = val
514
515 def text(self):
516 return 'repo_forbid_archived = %s' % self.val
517
518 phash = text
519
520 def __call__(self, info, request):
521 _ = request.translate
522 rhodecode_db_repo = request.db_repo
523
524 log.debug(
525 '%s checking if archived flag for repo for %s',
526 self.__class__.__name__, rhodecode_db_repo.repo_name)
527
528 if rhodecode_db_repo.archived:
529 log.warning('Current view is not supported for archived repo:%s',
530 rhodecode_db_repo.repo_name)
531
532 h.flash(
533 h.literal(_('Action not supported for archived repository.')),
534 category='warning')
535 summary_url = request.route_path(
536 'repo_summary', repo_name=rhodecode_db_repo.repo_name)
537 raise HTTPFound(summary_url)
538 return True
539
540
508 class RepoTypeRoutePredicate(object):
541 class RepoTypeRoutePredicate(object):
509 def __init__(self, val, config):
542 def __init__(self, val, config):
510 self.val = val or ['hg', 'git', 'svn']
543 self.val = val or ['hg', 'git', 'svn']
@@ -530,13 +563,6 b' class RepoTypeRoutePredicate(object):'
530 else:
563 else:
531 log.warning('Current view is not supported for repo type:%s',
564 log.warning('Current view is not supported for repo type:%s',
532 rhodecode_db_repo.repo_type)
565 rhodecode_db_repo.repo_type)
533
534 # h.flash(h.literal(
535 # _('Action not supported for %s.' % rhodecode_repo.alias)),
536 # category='warning')
537 # return redirect(
538 # route_path('repo_summary', repo_name=cls.rhodecode_db_repo.repo_name))
539
540 return False
566 return False
541
567
542
568
@@ -643,10 +669,12 b' def includeme(config):'
643 config.add_route_predicate(
669 config.add_route_predicate(
644 'repo_accepted_types', RepoTypeRoutePredicate)
670 'repo_accepted_types', RepoTypeRoutePredicate)
645 config.add_route_predicate(
671 config.add_route_predicate(
672 'repo_forbid_when_archived', RepoForbidArchivedRoutePredicate)
673 config.add_route_predicate(
646 'repo_group_route', RepoGroupRoutePredicate)
674 'repo_group_route', RepoGroupRoutePredicate)
647 config.add_route_predicate(
675 config.add_route_predicate(
648 'user_group_route', UserGroupRoutePredicate)
676 'user_group_route', UserGroupRoutePredicate)
649 config.add_route_predicate(
677 config.add_route_predicate(
650 'user_route_with_default', UserRouteWithDefaultPredicate)
678 'user_route_with_default', UserRouteWithDefaultPredicate)
651 config.add_route_predicate(
679 config.add_route_predicate(
652 'user_route', UserRoutePredicate) No newline at end of file
680 'user_route', UserRoutePredicate)
@@ -488,14 +488,30 b' class TestLabsSettings(object):'
488 class TestOpenSourceLicenses(object):
488 class TestOpenSourceLicenses(object):
489
489
490 def test_records_are_displayed(self, autologin_user):
490 def test_records_are_displayed(self, autologin_user):
491 sample_licenses = {
491 sample_licenses = [
492 "python2.7-pytest-2.7.1": {
492 {
493 "UNKNOWN": None
493 "license": [
494 {
495 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
496 "shortName": "bsdOriginal",
497 "spdxId": "BSD-4-Clause",
498 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
499 }
500 ],
501 "name": "python2.7-coverage-3.7.1"
494 },
502 },
495 "python2.7-Markdown-2.6.2": {
503 {
496 "BSD-3-Clause": "http://spdx.org/licenses/BSD-3-Clause"
504 "license": [
497 }
505 {
498 }
506 "fullName": "MIT License",
507 "shortName": "mit",
508 "spdxId": "MIT",
509 "url": "http://spdx.org/licenses/MIT.html"
510 }
511 ],
512 "name": "python2.7-bootstrapped-pip-9.0.1"
513 },
514 ]
499 read_licenses_patch = mock.patch(
515 read_licenses_patch = mock.patch(
500 'rhodecode.apps.admin.views.open_source_licenses.read_opensource_licenses',
516 'rhodecode.apps.admin.views.open_source_licenses.read_opensource_licenses',
501 return_value=sample_licenses)
517 return_value=sample_licenses)
@@ -506,10 +522,9 b' class TestOpenSourceLicenses(object):'
506 assert_response = AssertResponse(response)
522 assert_response = AssertResponse(response)
507 assert_response.element_contains(
523 assert_response.element_contains(
508 '.panel-heading', 'Licenses of Third Party Packages')
524 '.panel-heading', 'Licenses of Third Party Packages')
509 for name in sample_licenses:
525 for license_data in sample_licenses:
510 response.mustcontain(name)
526 response.mustcontain(license_data["license"][0]["spdxId"])
511 for license in sample_licenses[name]:
527 assert_response.element_contains('.panel-body', license_data["name"])
512 assert_response.element_contains('.panel-body', license)
513
528
514 def test_records_can_be_read(self, autologin_user):
529 def test_records_can_be_read(self, autologin_user):
515 response = self.app.get(
530 response = self.app.get(
@@ -35,7 +35,6 b' class OpenSourceLicensesAdminSettingsVie'
35
35
36 def load_default_context(self):
36 def load_default_context(self):
37 c = self._get_local_tmpl_context()
37 c = self._get_local_tmpl_context()
38
39 return c
38 return c
40
39
41 @LoginRequired()
40 @LoginRequired()
@@ -47,7 +46,6 b' class OpenSourceLicensesAdminSettingsVie'
47 c = self.load_default_context()
46 c = self.load_default_context()
48 c.active = 'open_source'
47 c.active = 'open_source'
49 c.navlist = navigation_list(self.request)
48 c.navlist = navigation_list(self.request)
50 items = sorted(read_opensource_licenses().items(), key=lambda t: t[0])
49 c.opensource_licenses = sorted(
51 c.opensource_licenses = collections.OrderedDict(items)
50 read_opensource_licenses(), key=lambda d: d["name"])
52
53 return self._get_template_context(c)
51 return self._get_template_context(c)
@@ -26,6 +26,7 b' from pyramid.view import view_config'
26
26
27 from rhodecode.apps._base import BaseAppView
27 from rhodecode.apps._base import BaseAppView
28 from rhodecode.apps.admin.navigation import navigation_list
28 from rhodecode.apps.admin.navigation import navigation_list
29 from rhodecode.lib import system_info
29 from rhodecode.lib.auth import (
30 from rhodecode.lib.auth import (
30 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
31 LoginRequired, HasPermissionAllDecorator, CSRFRequired)
31 from rhodecode.lib.utils2 import safe_int, StrictAttributeDict
32 from rhodecode.lib.utils2 import safe_int, StrictAttributeDict
@@ -71,6 +72,16 b' class AdminProcessManagementView(BaseApp'
71
72
72 return proc_list
73 return proc_list
73
74
75 def get_workers(self):
76 workers = None
77 try:
78 rc_config = system_info.rhodecode_config().value['config']
79 workers = rc_config['server:main'].get('workers')
80 except Exception:
81 pass
82
83 return workers or '?'
84
74 @LoginRequired()
85 @LoginRequired()
75 @HasPermissionAllDecorator('hg.admin')
86 @HasPermissionAllDecorator('hg.admin')
76 @view_config(
87 @view_config(
@@ -83,6 +94,7 b' class AdminProcessManagementView(BaseApp'
83 c.active = 'process_management'
94 c.active = 'process_management'
84 c.navlist = navigation_list(self.request)
95 c.navlist = navigation_list(self.request)
85 c.gunicorn_processes = self.get_processes()
96 c.gunicorn_processes = self.get_processes()
97 c.gunicorn_workers = self.get_workers()
86 return self._get_template_context(c)
98 return self._get_template_context(c)
87
99
88 @LoginRequired()
100 @LoginRequired()
@@ -26,7 +26,7 b' from pyramid.httpexceptions import HTTPB'
26
26
27 from rhodecode.apps._base import BaseAppView
27 from rhodecode.apps._base import BaseAppView
28 from rhodecode.lib.channelstream import (
28 from rhodecode.lib.channelstream import (
29 channelstream_request,
29 channelstream_request, get_channelstream_server_url,
30 ChannelstreamConnectionException,
30 ChannelstreamConnectionException,
31 ChannelstreamPermissionException,
31 ChannelstreamPermissionException,
32 check_channel_permissions,
32 check_channel_permissions,
@@ -56,8 +56,9 b' class ChannelstreamView(BaseAppView):'
56 @NotAnonymous()
56 @NotAnonymous()
57 @view_config(route_name='channelstream_connect', renderer='json_ext')
57 @view_config(route_name='channelstream_connect', renderer='json_ext')
58 def connect(self):
58 def connect(self):
59 """ handle authorization of users trying to connect """
60
59 self.load_default_context()
61 self.load_default_context()
60 """ handle authorization of users trying to connect """
61 try:
62 try:
62 json_body = self.request.json_body
63 json_body = self.request.json_body
63 except Exception:
64 except Exception:
@@ -107,11 +108,14 b' class ChannelstreamView(BaseAppView):'
107 'broadcast_presence_with_user_lists': True
108 'broadcast_presence_with_user_lists': True
108 }
109 }
109 # connect user to server
110 # connect user to server
111 channelstream_url = get_channelstream_server_url(
112 self.channelstream_config, '/connect')
110 try:
113 try:
111 connect_result = channelstream_request(self.channelstream_config,
114 connect_result = channelstream_request(
112 payload, '/connect')
115 self.channelstream_config, payload, '/connect')
113 except ChannelstreamConnectionException:
116 except ChannelstreamConnectionException:
114 log.exception('Channelstream service is down')
117 log.exception(
118 'Channelstream service at {} is down'.format(channelstream_url))
115 return HTTPBadGateway()
119 return HTTPBadGateway()
116
120
117 connect_result['channels'] = channels
121 connect_result['channels'] = channels
@@ -153,17 +157,21 b' class ChannelstreamView(BaseAppView):'
153 'store_history': True,
157 'store_history': True,
154 'broadcast_presence_with_user_lists': True
158 'broadcast_presence_with_user_lists': True
155 }
159 }
160
161 channelstream_url = get_channelstream_server_url(
162 self.channelstream_config, '/subscribe')
156 try:
163 try:
157 connect_result = channelstream_request(
164 connect_result = channelstream_request(
158 self.channelstream_config, payload, '/subscribe')
165 self.channelstream_config, payload, '/subscribe')
159 except ChannelstreamConnectionException:
166 except ChannelstreamConnectionException:
160 log.exception('Channelstream service is down')
167 log.exception(
168 'Channelstream service at {} is down'.format(channelstream_url))
161 return HTTPBadGateway()
169 return HTTPBadGateway()
162 # include_channel_info will limit history only to new channel
170 # include_channel_info will limit history only to new channel
163 # to not overwrite histories on other channels in client
171 # to not overwrite histories on other channels in client
164 connect_result['channels_info'] = parse_channels_info(
172 connect_result['channels_info'] = parse_channels_info(
165 connect_result['channels_info'],
173 connect_result['channels_info'],
166 include_channel_info=filtered_channels)
174 include_channel_info=filtered_channels)
167 update_history_from_logs(self.channelstream_config,
175 update_history_from_logs(
168 filtered_channels, connect_result)
176 self.channelstream_config, filtered_channels, connect_result)
169 return connect_result
177 return connect_result
@@ -21,22 +21,31 b' from rhodecode.apps._base import ADMIN_P'
21 from rhodecode.lib.utils2 import str2bool
21 from rhodecode.lib.utils2 import str2bool
22
22
23
23
24 def debug_style_enabled(info, request):
24 class DebugStylePredicate(object):
25 return str2bool(request.registry.settings.get('debug_style'))
25 def __init__(self, val, config):
26 self.val = val
27
28 def text(self):
29 return 'debug style route = %s' % self.val
30
31 phash = text
32
33 def __call__(self, info, request):
34 return str2bool(request.registry.settings.get('debug_style'))
26
35
27
36
28 def includeme(config):
37 def includeme(config):
38 config.add_route_predicate(
39 'debug_style', DebugStylePredicate)
40
29 config.add_route(
41 config.add_route(
30 name='debug_style_home',
42 name='debug_style_home',
31 pattern=ADMIN_PREFIX + '/debug_style',
43 pattern=ADMIN_PREFIX + '/debug_style',
32 custom_predicates=(debug_style_enabled,))
44 debug_style=True)
33 config.add_route(
45 config.add_route(
34 name='debug_style_template',
46 name='debug_style_template',
35 pattern=ADMIN_PREFIX + '/debug_style/t/{t_path}',
47 pattern=ADMIN_PREFIX + '/debug_style/t/{t_path}',
36 custom_predicates=(debug_style_enabled,))
48 debug_style=True)
37
49
38 # Scan module for configuration decorators.
50 # Scan module for configuration decorators.
39 config.scan('.views', ignore='.tests')
51 config.scan('.views', ignore='.tests')
40
41
42
@@ -405,8 +405,8 b' class GistView(BaseAppView):'
405 revision = self.request.GET.get('revision')
405 revision = self.request.GET.get('revision')
406
406
407 if revision != last_rev.raw_id:
407 if revision != last_rev.raw_id:
408 log.error('Last revision %s is different then submitted %s'
408 log.error('Last revision %s is different then submitted %s',
409 % (revision, last_rev))
409 revision, last_rev)
410 # our gist has newer version than we
410 # our gist has newer version than we
411 success = False
411 success = False
412
412
@@ -63,6 +63,10 b' def includeme(config):'
63 name='markup_preview',
63 name='markup_preview',
64 pattern='/_markup_preview')
64 pattern='/_markup_preview')
65
65
66 config.add_route(
67 name='store_user_session_value',
68 pattern='/_store_session_attr')
69
66 # register our static links via redirection mechanism
70 # register our static links via redirection mechanism
67 routing_links.connect_redirection_links(config)
71 routing_links.connect_redirection_links(config)
68
72
@@ -60,10 +60,9 b' class TestHomeController(TestController)'
60 response = self.app.get(route_path('home'))
60 response = self.app.get(route_path('home'))
61
61
62 rhodecode_version_hash = calculate_version_hash(
62 rhodecode_version_hash = calculate_version_hash(
63 {'beaker.session.secret':'test-rc-uytcxaz'})
63 {'beaker.session.secret': 'test-rc-uytcxaz'})
64 response.mustcontain('style.css?ver={0}'.format(rhodecode_version_hash))
64 response.mustcontain('style.css?ver={0}'.format(rhodecode_version_hash))
65 response.mustcontain('rhodecode-components.js?ver={0}'.format(
65 response.mustcontain('scripts.js?ver={0}'.format(rhodecode_version_hash))
66 rhodecode_version_hash))
67
66
68 def test_index_contains_backend_specific_details(self, backend):
67 def test_index_contains_backend_specific_details(self, backend):
69 self.log_user()
68 self.log_user()
@@ -33,7 +33,7 b' from rhodecode.lib.index import searcher'
33 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
33 from rhodecode.lib.utils2 import safe_unicode, str2bool, safe_int
34 from rhodecode.lib.ext_json import json
34 from rhodecode.lib.ext_json import json
35 from rhodecode.model.db import (
35 from rhodecode.model.db import (
36 func, or_, in_filter_generator, Repository, RepoGroup, User, UserGroup)
36 func, true, or_, in_filter_generator, Repository, RepoGroup, User, UserGroup)
37 from rhodecode.model.repo import RepoModel
37 from rhodecode.model.repo import RepoModel
38 from rhodecode.model.repo_group import RepoGroupModel
38 from rhodecode.model.repo_group import RepoGroupModel
39 from rhodecode.model.scm import RepoGroupList, RepoList
39 from rhodecode.model.scm import RepoGroupList, RepoList
@@ -114,6 +114,7 b' class HomeView(BaseAppView):'
114 query = Repository.query()\
114 query = Repository.query()\
115 .order_by(func.length(Repository.repo_name))\
115 .order_by(func.length(Repository.repo_name))\
116 .order_by(Repository.repo_name)\
116 .order_by(Repository.repo_name)\
117 .filter(Repository.archived.isnot(true()))\
117 .filter(or_(
118 .filter(or_(
118 # generate multiple IN to fix limitation problems
119 # generate multiple IN to fix limitation problems
119 *in_filter_generator(Repository.repo_id, allowed_ids)
120 *in_filter_generator(Repository.repo_id, allowed_ids)
@@ -444,3 +445,18 b' class HomeView(BaseAppView):'
444 if text:
445 if text:
445 return h.render(text, renderer=renderer, mentions=True)
446 return h.render(text, renderer=renderer, mentions=True)
446 return ''
447 return ''
448
449 @LoginRequired()
450 @CSRFRequired()
451 @view_config(
452 route_name='store_user_session_value', request_method='POST',
453 renderer='string', xhr=True)
454 def store_user_session_attr(self):
455 key = self.request.POST.get('key')
456 val = self.request.POST.get('val')
457
458 existing_value = self.request.session.get(key)
459 if existing_value != val:
460 self.request.session[key] = val
461
462 return 'stored:{}'.format(key)
@@ -93,16 +93,16 b' def get_came_from(request):'
93 allowed_schemes = ['http', 'https']
93 allowed_schemes = ['http', 'https']
94 default_came_from = h.route_path('home')
94 default_came_from = h.route_path('home')
95 if parsed.scheme and parsed.scheme not in allowed_schemes:
95 if parsed.scheme and parsed.scheme not in allowed_schemes:
96 log.error('Suspicious URL scheme detected %s for url %s' %
96 log.error('Suspicious URL scheme detected %s for url %s',
97 (parsed.scheme, parsed))
97 parsed.scheme, parsed)
98 came_from = default_came_from
98 came_from = default_came_from
99 elif parsed.netloc and request.host != parsed.netloc:
99 elif parsed.netloc and request.host != parsed.netloc:
100 log.error('Suspicious NETLOC detected %s for url %s server url '
100 log.error('Suspicious NETLOC detected %s for url %s server url '
101 'is: %s' % (parsed.netloc, parsed, request.host))
101 'is: %s', parsed.netloc, parsed, request.host)
102 came_from = default_came_from
102 came_from = default_came_from
103 elif any(bad_str in parsed.path for bad_str in ('\r', '\n')):
103 elif any(bad_str in parsed.path for bad_str in ('\r', '\n')):
104 log.error('Header injection detected `%s` for url %s server url ' %
104 log.error('Header injection detected `%s` for url %s server url ',
105 (parsed.path, parsed))
105 parsed.path, parsed)
106 came_from = default_came_from
106 came_from = default_came_from
107
107
108 return came_from or default_came_from
108 return came_from or default_came_from
@@ -29,6 +29,8 b' from rhodecode.lib import helpers as h'
29 from rhodecode.lib import audit_logger
29 from rhodecode.lib import audit_logger
30 from rhodecode.lib.auth import (
30 from rhodecode.lib.auth import (
31 LoginRequired, HasRepoGroupPermissionAnyDecorator, CSRFRequired)
31 LoginRequired, HasRepoGroupPermissionAnyDecorator, CSRFRequired)
32 from rhodecode.lib.utils2 import safe_int
33 from rhodecode.model.db import UserGroup
32 from rhodecode.model.repo_group import RepoGroupModel
34 from rhodecode.model.repo_group import RepoGroupModel
33 from rhodecode.model.forms import RepoGroupPermsForm
35 from rhodecode.model.forms import RepoGroupPermsForm
34 from rhodecode.model.meta import Session
36 from rhodecode.model.meta import Session
@@ -101,6 +103,11 b' class RepoGroupPermissionsView(RepoGroup'
101 for change in changes['added'] + changes['updated'] + changes['deleted']:
103 for change in changes['added'] + changes['updated'] + changes['deleted']:
102 if change['type'] == 'user':
104 if change['type'] == 'user':
103 affected_user_ids.append(change['id'])
105 affected_user_ids.append(change['id'])
106 if change['type'] == 'user_group':
107 user_group = UserGroup.get(safe_int(change['id']))
108 if user_group:
109 group_members_ids = [x.user_id for x in user_group.members]
110 affected_user_ids.extend(group_members_ids)
104
111
105 events.trigger(events.UserPermissionsChange(affected_user_ids))
112 events.trigger(events.UserPermissionsChange(affected_user_ids))
106
113
@@ -231,11 +231,13 b' def includeme(config):'
231 config.add_route(
231 config.add_route(
232 name='repo_fork_new',
232 name='repo_fork_new',
233 pattern='/{repo_name:.*?[^/]}/fork', repo_route=True,
233 pattern='/{repo_name:.*?[^/]}/fork', repo_route=True,
234 repo_forbid_when_archived=True,
234 repo_accepted_types=['hg', 'git'])
235 repo_accepted_types=['hg', 'git'])
235
236
236 config.add_route(
237 config.add_route(
237 name='repo_fork_create',
238 name='repo_fork_create',
238 pattern='/{repo_name:.*?[^/]}/fork/create', repo_route=True,
239 pattern='/{repo_name:.*?[^/]}/fork/create', repo_route=True,
240 repo_forbid_when_archived=True,
239 repo_accepted_types=['hg', 'git'])
241 repo_accepted_types=['hg', 'git'])
240
242
241 config.add_route(
243 config.add_route(
@@ -276,27 +278,29 b' def includeme(config):'
276 config.add_route(
278 config.add_route(
277 name='pullrequest_new',
279 name='pullrequest_new',
278 pattern='/{repo_name:.*?[^/]}/pull-request/new',
280 pattern='/{repo_name:.*?[^/]}/pull-request/new',
279 repo_route=True, repo_accepted_types=['hg', 'git'])
281 repo_route=True, repo_accepted_types=['hg', 'git'],
282 repo_forbid_when_archived=True)
280
283
281 config.add_route(
284 config.add_route(
282 name='pullrequest_create',
285 name='pullrequest_create',
283 pattern='/{repo_name:.*?[^/]}/pull-request/create',
286 pattern='/{repo_name:.*?[^/]}/pull-request/create',
284 repo_route=True, repo_accepted_types=['hg', 'git'])
287 repo_route=True, repo_accepted_types=['hg', 'git'],
288 repo_forbid_when_archived=True)
285
289
286 config.add_route(
290 config.add_route(
287 name='pullrequest_update',
291 name='pullrequest_update',
288 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/update',
292 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/update',
289 repo_route=True)
293 repo_route=True, repo_forbid_when_archived=True)
290
294
291 config.add_route(
295 config.add_route(
292 name='pullrequest_merge',
296 name='pullrequest_merge',
293 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/merge',
297 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/merge',
294 repo_route=True)
298 repo_route=True, repo_forbid_when_archived=True)
295
299
296 config.add_route(
300 config.add_route(
297 name='pullrequest_delete',
301 name='pullrequest_delete',
298 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/delete',
302 pattern='/{repo_name:.*?[^/]}/pull-request/{pull_request_id:\d+}/delete',
299 repo_route=True)
303 repo_route=True, repo_forbid_when_archived=True)
300
304
301 config.add_route(
305 config.add_route(
302 name='pullrequest_comment_create',
306 name='pullrequest_comment_create',
@@ -319,6 +323,9 b' def includeme(config):'
319 name='edit_repo_advanced',
323 name='edit_repo_advanced',
320 pattern='/{repo_name:.*?[^/]}/settings/advanced', repo_route=True)
324 pattern='/{repo_name:.*?[^/]}/settings/advanced', repo_route=True)
321 config.add_route(
325 config.add_route(
326 name='edit_repo_advanced_archive',
327 pattern='/{repo_name:.*?[^/]}/settings/advanced/archive', repo_route=True)
328 config.add_route(
322 name='edit_repo_advanced_delete',
329 name='edit_repo_advanced_delete',
323 pattern='/{repo_name:.*?[^/]}/settings/advanced/delete', repo_route=True)
330 pattern='/{repo_name:.*?[^/]}/settings/advanced/delete', repo_route=True)
324 config.add_route(
331 config.add_route(
@@ -97,9 +97,10 b' class TestRepoCommitCommentsView(TestCon'
97 comment_id = ChangesetComment.query().first().comment_id
97 comment_id = ChangesetComment.query().first().comment_id
98 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
98 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
99
99
100 sbj = 'left {0} on commit `{1}` in the {2} repository'.format(
100 author = notification.created_by_user.username_and_name
101 comment_type, h.show_id(commit), backend.repo_name)
101 sbj = '{0} left a {1} on commit `{2}` in the {3} repository'.format(
102 assert sbj in notification.subject
102 author, comment_type, h.show_id(commit), backend.repo_name)
103 assert sbj == notification.subject
103
104
104 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
105 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
105 backend.repo_name, commit_id, comment_id))
106 backend.repo_name, commit_id, comment_id))
@@ -134,12 +135,18 b' class TestRepoCommitCommentsView(TestCon'
134 if backend.alias == 'svn':
135 if backend.alias == 'svn':
135 response.mustcontain(
136 response.mustcontain(
136 '''data-f-path="vcs/commands/summary.py" '''
137 '''data-f-path="vcs/commands/summary.py" '''
137 '''id="a_c--ad05457a43f8"'''
138 '''data-anchor-id="c-300-ad05457a43f8"'''
138 )
139 )
139 else:
140 if backend.alias == 'git':
140 response.mustcontain(
141 response.mustcontain(
141 '''data-f-path="vcs/backends/hg.py" '''
142 '''data-f-path="vcs/backends/hg.py" '''
142 '''id="a_c--9c390eb52cd6"'''
143 '''data-anchor-id="c-883e775e89ea-9c390eb52cd6"'''
144 )
145
146 if backend.alias == 'hg':
147 response.mustcontain(
148 '''data-f-path="vcs/backends/hg.py" '''
149 '''data-anchor-id="c-e58d85a3973b-9c390eb52cd6"'''
143 )
150 )
144
151
145 assert Notification.query().count() == 1
152 assert Notification.query().count() == 1
@@ -150,12 +157,12 b' class TestRepoCommitCommentsView(TestCon'
150 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
157 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
151
158
152 assert comment.revision == commit_id
159 assert comment.revision == commit_id
153 sbj = 'left {comment_type} on commit `{commit}` ' \
160
154 '(file: `{f_path}`) in the {repo} repository'.format(
161 author = notification.created_by_user.username_and_name
155 commit=h.show_id(commit),
162 sbj = '{0} left a {1} on file `{2}` in commit `{3}` in the {4} repository'.format(
156 f_path=f_path, line=line, repo=backend.repo_name,
163 author, comment_type, f_path, h.show_id(commit), backend.repo_name)
157 comment_type=comment_type)
164
158 assert sbj in notification.subject
165 assert sbj == notification.subject
159
166
160 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
167 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
161 backend.repo_name, commit_id, comment.comment_id))
168 backend.repo_name, commit_id, comment.comment_id))
@@ -222,10 +229,10 b' class TestRepoCommitCommentsView(TestCon'
222 comment_id = ChangesetComment.query().first().comment_id
229 comment_id = ChangesetComment.query().first().comment_id
223 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
230 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
224
231
225 sbj = 'left note on commit `{0}` (status: Approved) ' \
232 author = notification.created_by_user.username_and_name
226 'in the {1} repository'.format(
233 sbj = '[status: Approved] {0} left a note on commit `{1}` in the {2} repository'.format(
227 h.show_id(commit), backend.repo_name)
234 author, h.show_id(commit), backend.repo_name)
228 assert sbj in notification.subject
235 assert sbj == notification.subject
229
236
230 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
237 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
231 backend.repo_name, commit_id, comment_id))
238 backend.repo_name, commit_id, comment_id))
@@ -283,7 +290,7 b' class TestRepoCommitCommentsView(TestCon'
283 commit_id = '0' * 16 # fake this for tests
290 commit_id = '0' * 16 # fake this for tests
284 response = self.app.post(
291 response = self.app.post(
285 route_path('repo_commit_comment_preview',
292 route_path('repo_commit_comment_preview',
286 repo_name=backend.repo_name, commit_id=commit_id,),
293 repo_name=backend.repo_name, commit_id=commit_id,),
287 params=params,
294 params=params,
288 extra_environ=xhr_header)
295 extra_environ=xhr_header)
289
296
@@ -88,7 +88,7 b' class TestRepoCommitView(object):'
88 response.mustcontain('21 files changed: 943 inserted, 288 deleted')
88 response.mustcontain('21 files changed: 943 inserted, 288 deleted')
89
89
90 # files op files
90 # files op files
91 response.mustcontain('File no longer present at commit: %s' %
91 response.mustcontain('File not present at commit: %s' %
92 _shorten_commit_id(commit_id))
92 _shorten_commit_id(commit_id))
93
93
94 # svn uses a different filename
94 # svn uses a different filename
@@ -133,7 +133,7 b' class TestRepoCommitView(object):'
133 response.mustcontain('21 files changed: 943 inserted, 288 deleted')
133 response.mustcontain('21 files changed: 943 inserted, 288 deleted')
134
134
135 # files op files
135 # files op files
136 response.mustcontain('File no longer present at commit: %s' %
136 response.mustcontain('File not present at commit: %s' %
137 _shorten_commit_id(commit_ids[1]))
137 _shorten_commit_id(commit_ids[1]))
138 response.mustcontain('Added docstrings to vcs.cli') # commit msg
138 response.mustcontain('Added docstrings to vcs.cli') # commit msg
139 response.mustcontain('Changed theme to ADC theme') # commit msg
139 response.mustcontain('Changed theme to ADC theme') # commit msg
@@ -163,7 +163,7 b' class TestRepoCommitView(object):'
163 response.mustcontain(_shorten_commit_id(commit_ids[1]))
163 response.mustcontain(_shorten_commit_id(commit_ids[1]))
164
164
165 # files op files
165 # files op files
166 response.mustcontain('File no longer present at commit: %s' %
166 response.mustcontain('File not present at commit: %s' %
167 _shorten_commit_id(commit_ids[1]))
167 _shorten_commit_id(commit_ids[1]))
168
168
169 # svn is special
169 # svn is special
@@ -293,26 +293,13 b' Added a symlink'
293 """ + diffs['svn'],
293 """ + diffs['svn'],
294 }
294 }
295
295
296 def _check_diff_menus(self, response, right_menu=False,):
296 def _check_new_diff_menus(self, response, right_menu=False,):
297 # diff menus
297 # individual file diff menus
298 for elem in ['Show File', 'Unified Diff', 'Side-by-side Diff',
298 for elem in ['Show file before', 'Show file after']:
299 'Raw Diff', 'Download Diff']:
300 response.mustcontain(elem)
299 response.mustcontain(elem)
301
300
302 # right pane diff menus
301 # right pane diff menus
303 if right_menu:
302 if right_menu:
304 for elem in ['Ignore whitespace', 'Increase context',
303 for elem in ['Hide whitespace changes', 'Toggle Wide Mode diff',
305 'Hide comments']:
304 'Show full context diff']:
306 response.mustcontain(elem)
305 response.mustcontain(elem)
307
308 def _check_new_diff_menus(self, response, right_menu=False,):
309 # diff menus
310 for elem in ['Show file before', 'Show file after',
311 'Raw diff', 'Download diff']:
312 response.mustcontain(elem)
313
314 # right pane diff menus
315 if right_menu:
316 for elem in ['Ignore whitespace', 'Increase context',
317 'Hide comments']:
318 response.mustcontain(elem)
@@ -104,13 +104,11 b' class TestCompareView(object):'
104 # Comparing the revisions
104 # Comparing the revisions
105 response = self.app.get(
105 response = self.app.get(
106 route_path('repo_compare',
106 route_path('repo_compare',
107 repo_name=origin.repo_name,
107 repo_name=origin.repo_name,
108 source_ref_type="rev",
108 source_ref_type="rev", source_ref=commit3.raw_id,
109 source_ref=commit3.raw_id,
109 target_ref_type="rev", target_ref=commit4.raw_id,
110 target_ref_type="rev",
110 params=dict(merge='1', target_repo=fork.repo_name)
111 target_ref=commit4.raw_id,
111 ))
112 params=dict(merge='1', target_repo=fork.repo_name)
113 ))
114
112
115 compare_page = ComparePage(response)
113 compare_page = ComparePage(response)
116 compare_page.contains_commits([commit4])
114 compare_page.contains_commits([commit4])
@@ -142,13 +140,11 b' class TestCompareView(object):'
142
140
143 response = self.app.get(
141 response = self.app.get(
144 route_path('repo_compare',
142 route_path('repo_compare',
145 repo_name=repo1.repo_name,
143 repo_name=repo1.repo_name,
146 source_ref_type="branch",
144 source_ref_type="branch", source_ref=commit_id2,
147 source_ref=commit_id2,
145 target_ref_type="branch", target_ref=commit_id1,
148 target_ref_type="branch",
146 params=dict(merge='1', target_repo=repo2.repo_name)
149 target_ref=commit_id1,
147 ))
150 params=dict(merge='1', target_repo=repo2.repo_name)
151 ))
152
148
153 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
149 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
154 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
150 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
@@ -156,9 +152,9 b' class TestCompareView(object):'
156 compare_page = ComparePage(response)
152 compare_page = ComparePage(response)
157 compare_page.contains_change_summary(1, 2, 0)
153 compare_page.contains_change_summary(1, 2, 0)
158 compare_page.contains_commits([commit1, commit2])
154 compare_page.contains_commits([commit1, commit2])
159 compare_page.contains_file_links_and_anchors([
155
160 ('file1', 'a_c--826e8142e6ba'),
156 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
161 ])
157 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
162
158
163 # Swap is removed when comparing branches since it's a PR feature and
159 # Swap is removed when comparing branches since it's a PR feature and
164 # it is then a preview mode
160 # it is then a preview mode
@@ -199,13 +195,11 b' class TestCompareView(object):'
199
195
200 response = self.app.get(
196 response = self.app.get(
201 route_path('repo_compare',
197 route_path('repo_compare',
202 repo_name=repo1.repo_name,
198 repo_name=repo1.repo_name,
203 source_ref_type="branch",
199 source_ref_type="branch", source_ref=commit_id2,
204 source_ref=commit_id2,
200 target_ref_type="branch", target_ref=commit_id1,
205 target_ref_type="branch",
201 params=dict(merge='1', target_repo=repo2.repo_name),
206 target_ref=commit_id1,
202 ))
207 params=dict(merge='1', target_repo=repo2.repo_name),
208 ))
209
203
210 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
204 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
211 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
205 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
@@ -213,9 +207,8 b' class TestCompareView(object):'
213 compare_page = ComparePage(response)
207 compare_page = ComparePage(response)
214 compare_page.contains_change_summary(1, 2, 0)
208 compare_page.contains_change_summary(1, 2, 0)
215 compare_page.contains_commits([commit1, commit2])
209 compare_page.contains_commits([commit1, commit2])
216 compare_page.contains_file_links_and_anchors([
210 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
217 ('file1', 'a_c--826e8142e6ba'),
211 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
218 ])
219
212
220 # Swap is removed when comparing branches since it's a PR feature and
213 # Swap is removed when comparing branches since it's a PR feature and
221 # it is then a preview mode
214 # it is then a preview mode
@@ -230,13 +223,11 b' class TestCompareView(object):'
230
223
231 response = self.app.get(
224 response = self.app.get(
232 route_path('repo_compare',
225 route_path('repo_compare',
233 repo_name=orig.repo_name,
226 repo_name=orig.repo_name,
234 source_ref_type="rev",
227 source_ref_type="rev", source_ref="tip",
235 source_ref="tip",
228 target_ref_type="rev", target_ref="tip",
236 target_ref_type="rev",
229 params=dict(merge='1', target_repo=fork.repo_name),
237 target_ref="tip",
230 ),
238 params=dict(merge='1', target_repo=fork.repo_name),
239 ),
240 status=302)
231 status=302)
241 response = response.follow()
232 response = response.follow()
242 response.mustcontain("Repositories unrelated.")
233 response.mustcontain("Repositories unrelated.")
@@ -289,14 +280,12 b' class TestCompareView(object):'
289
280
290 response = self.app.get(
281 response = self.app.get(
291 route_path('repo_compare',
282 route_path('repo_compare',
292 repo_name=repo2.repo_name,
283 repo_name=repo2.repo_name,
293 source_ref_type="rev",
284 # parent of commit2, in target repo2
294 # parent of commit2, in target repo2
285 source_ref_type="rev", source_ref=commit1.raw_id,
295 source_ref=commit1.raw_id,
286 target_ref_type="rev", target_ref=commit4.raw_id,
296 target_ref_type="rev",
287 params=dict(merge='1', target_repo=repo1.repo_name),
297 target_ref=commit4.raw_id,
288 ))
298 params=dict(merge='1', target_repo=repo1.repo_name),
299 ))
300 response.mustcontain('%s@%s' % (repo2.repo_name, commit1.short_id))
289 response.mustcontain('%s@%s' % (repo2.repo_name, commit1.short_id))
301 response.mustcontain('%s@%s' % (repo1.repo_name, commit4.short_id))
290 response.mustcontain('%s@%s' % (repo1.repo_name, commit4.short_id))
302
291
@@ -304,9 +293,8 b' class TestCompareView(object):'
304 compare_page = ComparePage(response)
293 compare_page = ComparePage(response)
305 compare_page.contains_change_summary(1, 3, 0)
294 compare_page.contains_change_summary(1, 3, 0)
306 compare_page.contains_commits([commit2, commit3, commit4])
295 compare_page.contains_commits([commit2, commit3, commit4])
307 compare_page.contains_file_links_and_anchors([
296 anchor = 'a_c-{}-826e8142e6ba'.format(commit1.short_id)
308 ('file1', 'a_c--826e8142e6ba'),
297 compare_page.contains_file_links_and_anchors([('file1', anchor),])
309 ])
310
298
311 @pytest.mark.xfail_backends("svn")
299 @pytest.mark.xfail_backends("svn")
312 def test_compare_cherry_pick_commits_from_top(self, backend):
300 def test_compare_cherry_pick_commits_from_top(self, backend):
@@ -355,14 +343,11 b' class TestCompareView(object):'
355
343
356 response = self.app.get(
344 response = self.app.get(
357 route_path('repo_compare',
345 route_path('repo_compare',
358 repo_name=repo1.repo_name,
346 repo_name=repo1.repo_name,
359 source_ref_type="rev",
347 # parent of commit3, not in source repo2
360 # parent of commit3, not in source repo2
348 source_ref_type="rev", source_ref=commit2.raw_id,
361 source_ref=commit2.raw_id,
349 target_ref_type="rev", target_ref=commit5.raw_id,
362 target_ref_type="rev",
350 params=dict(merge='1'),))
363 target_ref=commit5.raw_id,
364 params=dict(merge='1'),
365 ))
366
351
367 response.mustcontain('%s@%s' % (repo1.repo_name, commit2.short_id))
352 response.mustcontain('%s@%s' % (repo1.repo_name, commit2.short_id))
368 response.mustcontain('%s@%s' % (repo1.repo_name, commit5.short_id))
353 response.mustcontain('%s@%s' % (repo1.repo_name, commit5.short_id))
@@ -372,9 +357,8 b' class TestCompareView(object):'
372 compare_page.contains_commits([commit3, commit4, commit5])
357 compare_page.contains_commits([commit3, commit4, commit5])
373
358
374 # files
359 # files
375 compare_page.contains_file_links_and_anchors([
360 anchor = 'a_c-{}-826e8142e6ba'.format(commit2.short_id)
376 ('file1', 'a_c--826e8142e6ba'),
361 compare_page.contains_file_links_and_anchors([('file1', anchor),])
377 ])
378
362
379 @pytest.mark.xfail_backends("svn")
363 @pytest.mark.xfail_backends("svn")
380 def test_compare_remote_branches(self, backend):
364 def test_compare_remote_branches(self, backend):
@@ -382,17 +366,17 b' class TestCompareView(object):'
382 repo2 = backend.create_fork()
366 repo2 = backend.create_fork()
383
367
384 commit_id1 = repo1.get_commit(commit_idx=3).raw_id
368 commit_id1 = repo1.get_commit(commit_idx=3).raw_id
369 commit_id1_short = repo1.get_commit(commit_idx=3).short_id
385 commit_id2 = repo1.get_commit(commit_idx=6).raw_id
370 commit_id2 = repo1.get_commit(commit_idx=6).raw_id
371 commit_id2_short = repo1.get_commit(commit_idx=6).short_id
386
372
387 response = self.app.get(
373 response = self.app.get(
388 route_path('repo_compare',
374 route_path('repo_compare',
389 repo_name=repo1.repo_name,
375 repo_name=repo1.repo_name,
390 source_ref_type="rev",
376 source_ref_type="rev", source_ref=commit_id1,
391 source_ref=commit_id1,
377 target_ref_type="rev", target_ref=commit_id2,
392 target_ref_type="rev",
378 params=dict(merge='1', target_repo=repo2.repo_name),
393 target_ref=commit_id2,
379 ))
394 params=dict(merge='1', target_repo=repo2.repo_name),
395 ))
396
380
397 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id1))
381 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id1))
398 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id2))
382 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id2))
@@ -405,9 +389,9 b' class TestCompareView(object):'
405
389
406 # files
390 # files
407 compare_page.contains_file_links_and_anchors([
391 compare_page.contains_file_links_and_anchors([
408 ('vcs/backends/hg.py', 'a_c--9c390eb52cd6'),
392 ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(commit_id2_short)),
409 ('vcs/backends/__init__.py', 'a_c--41b41c1f2796'),
393 ('vcs/backends/__init__.py', 'a_c-{}-41b41c1f2796'.format(commit_id1_short)),
410 ('vcs/backends/base.py', 'a_c--2f574d260608'),
394 ('vcs/backends/base.py', 'a_c-{}-2f574d260608'.format(commit_id1_short)),
411 ])
395 ])
412
396
413 @pytest.mark.xfail_backends("svn")
397 @pytest.mark.xfail_backends("svn")
@@ -451,13 +435,11 b' class TestCompareView(object):'
451
435
452 response = self.app.get(
436 response = self.app.get(
453 route_path('repo_compare',
437 route_path('repo_compare',
454 repo_name=r2_name,
438 repo_name=r2_name,
455 source_ref_type="branch",
439 source_ref_type="branch", source_ref=commit_id1,
456 source_ref=commit_id1,
440 target_ref_type="branch", target_ref=commit_id2,
457 target_ref_type="branch",
441 params=dict(merge='1', target_repo=r1_name),
458 target_ref=commit_id2,
442 ))
459 params=dict(merge='1', target_repo=r1_name),
460 ))
461
443
462 response.mustcontain('%s@%s' % (r2_name, commit_id1))
444 response.mustcontain('%s@%s' % (r2_name, commit_id1))
463 response.mustcontain('%s@%s' % (r1_name, commit_id2))
445 response.mustcontain('%s@%s' % (r1_name, commit_id2))
@@ -472,13 +454,11 b' class TestCompareView(object):'
472 # compare !
454 # compare !
473 response = self.app.get(
455 response = self.app.get(
474 route_path('repo_compare',
456 route_path('repo_compare',
475 repo_name=r2_name,
457 repo_name=r2_name,
476 source_ref_type="branch",
458 source_ref_type="branch", source_ref=commit_id1,
477 source_ref=commit_id1,
459 target_ref_type="branch", target_ref=commit_id2,
478 target_ref_type="branch",
460 params=dict(merge='1', target_repo=r1_name),
479 target_ref=commit_id2,
461 ))
480 params=dict(merge='1', target_repo=r1_name),
481 ))
482
462
483 response.mustcontain('%s@%s' % (r2_name, commit_id1))
463 response.mustcontain('%s@%s' % (r2_name, commit_id1))
484 response.mustcontain('%s@%s' % (r1_name, commit_id2))
464 response.mustcontain('%s@%s' % (r1_name, commit_id2))
@@ -495,14 +475,12 b' class TestCompareView(object):'
495
475
496 response = self.app.get(
476 response = self.app.get(
497 route_path('repo_compare',
477 route_path('repo_compare',
498 repo_name=backend.repo_name,
478 repo_name=backend.repo_name,
499 source_ref_type="rev",
479 source_ref_type="rev", source_ref=commit0.raw_id,
500 source_ref=commit0.raw_id,
480 target_ref_type="rev", target_ref=commit1.raw_id,
501 target_ref_type="rev",
481 params=dict(merge='1')
502 target_ref=commit1.raw_id,
482 ),
503 params=dict(merge='1')
483 extra_environ=xhr_header, )
504 ),
505 extra_environ=xhr_header,)
506
484
507 # outgoing commits between those commits
485 # outgoing commits between those commits
508 compare_page = ComparePage(response)
486 compare_page = ComparePage(response)
@@ -514,13 +492,11 b' class TestCompareView(object):'
514
492
515 response = self.app.get(
493 response = self.app.get(
516 route_path('repo_compare',
494 route_path('repo_compare',
517 repo_name=badrepo,
495 repo_name=badrepo,
518 source_ref_type="rev",
496 source_ref_type="rev", source_ref='tip',
519 source_ref='tip',
497 target_ref_type="rev", target_ref='tip',
520 target_ref_type="rev",
498 params=dict(merge='1', target_repo=repo.repo_name)
521 target_ref='tip',
499 ),
522 params=dict(merge='1', target_repo=repo.repo_name)
523 ),
524 status=404)
500 status=404)
525
501
526 def test_errors_when_comparing_unknown_target_repo(self, backend):
502 def test_errors_when_comparing_unknown_target_repo(self, backend):
@@ -529,13 +505,11 b' class TestCompareView(object):'
529
505
530 response = self.app.get(
506 response = self.app.get(
531 route_path('repo_compare',
507 route_path('repo_compare',
532 repo_name=repo.repo_name,
508 repo_name=repo.repo_name,
533 source_ref_type="rev",
509 source_ref_type="rev", source_ref='tip',
534 source_ref='tip',
510 target_ref_type="rev", target_ref='tip',
535 target_ref_type="rev",
511 params=dict(merge='1', target_repo=badrepo),
536 target_ref='tip',
512 ),
537 params=dict(merge='1', target_repo=badrepo),
538 ),
539 status=302)
513 status=302)
540 redirected = response.follow()
514 redirected = response.follow()
541 redirected.mustcontain(
515 redirected.mustcontain(
@@ -547,12 +521,10 b' class TestCompareView(object):'
547
521
548 response = self.app.get(
522 response = self.app.get(
549 route_path('repo_compare',
523 route_path('repo_compare',
550 repo_name=backend_stub.repo_name,
524 repo_name=backend_stub.repo_name,
551 source_ref_type="rev",
525 source_ref_type="rev", source_ref=commit0.raw_id,
552 source_ref=commit0.raw_id,
526 target_ref_type="rev", target_ref=commit1.raw_id,
553 target_ref_type="rev",
527 ))
554 target_ref=commit1.raw_id,
555 ))
556
528
557 # outgoing commits between those commits
529 # outgoing commits between those commits
558 compare_page = ComparePage(response)
530 compare_page = ComparePage(response)
@@ -575,13 +547,11 b' class TestCompareView(object):'
575
547
576 response = self.app.get(
548 response = self.app.get(
577 route_path('repo_compare',
549 route_path('repo_compare',
578 repo_name=orig.repo_name,
550 repo_name=orig.repo_name,
579 source_ref_type="rev",
551 source_ref_type="rev", source_ref="tip",
580 source_ref="tip",
552 target_ref_type="rev", target_ref="tip",
581 target_ref_type="rev",
553 params=dict(merge='1', target_repo=fork.repo_name),
582 target_ref="tip",
554 ),
583 params=dict(merge='1', target_repo=fork.repo_name),
584 ),
585 status=302)
555 status=302)
586
556
587 assert_session_flash(
557 assert_session_flash(
@@ -597,13 +567,13 b' class TestCompareControllerSvn(object):'
597 commit_id = repo.get_commit(commit_idx=-1).raw_id
567 commit_id = repo.get_commit(commit_idx=-1).raw_id
598 response = app.get(
568 response = app.get(
599 route_path('repo_compare',
569 route_path('repo_compare',
600 repo_name=repo.repo_name,
570 repo_name=repo.repo_name,
601 source_ref_type="tag",
571 source_ref_type="tag",
602 source_ref="%s@%s" % ('tags/v0.1', commit_id),
572 source_ref="%s@%s" % ('tags/v0.1', commit_id),
603 target_ref_type="tag",
573 target_ref_type="tag",
604 target_ref="%s@%s" % ('tags/v0.2', commit_id),
574 target_ref="%s@%s" % ('tags/v0.2', commit_id),
605 params=dict(merge='1'),
575 params=dict(merge='1'),
606 ),
576 ),
607 status=200)
577 status=200)
608
578
609 # Expecting no commits, since both paths are at the same revision
579 # Expecting no commits, since both paths are at the same revision
@@ -620,13 +590,13 b' class TestCompareControllerSvn(object):'
620 target_id = repo.get_commit(commit_idx=-1).raw_id
590 target_id = repo.get_commit(commit_idx=-1).raw_id
621 response = app.get(
591 response = app.get(
622 route_path('repo_compare',
592 route_path('repo_compare',
623 repo_name=repo.repo_name,
593 repo_name=repo.repo_name,
624 source_ref_type="tag",
594 source_ref_type="tag",
625 source_ref="%s@%s" % ('tags/v0.1', source_id),
595 source_ref="%s@%s" % ('tags/v0.1', source_id),
626 target_ref_type="tag",
596 target_ref_type="tag",
627 target_ref="%s@%s" % ('tags/v0.2', target_id),
597 target_ref="%s@%s" % ('tags/v0.2', target_id),
628 params=dict(merge='1')
598 params=dict(merge='1')
629 ),
599 ),
630 status=200)
600 status=200)
631
601
632 # It should show commits
602 # It should show commits
@@ -648,7 +618,7 b' class ComparePage(AssertResponse):'
648 for filename, file_id in files:
618 for filename, file_id in files:
649 self.contains_one_anchor(file_id)
619 self.contains_one_anchor(file_id)
650 diffblock = doc.cssselect('[data-f-path="%s"]' % filename)
620 diffblock = doc.cssselect('[data-f-path="%s"]' % filename)
651 assert len(diffblock) == 1
621 assert len(diffblock) == 2
652 assert len(diffblock[0].cssselect('a[href="#%s"]' % file_id)) == 1
622 assert len(diffblock[0].cssselect('a[href="#%s"]' % file_id)) == 1
653
623
654 def contains_change_summary(self, files_changed, inserted, deleted):
624 def contains_change_summary(self, files_changed, inserted, deleted):
@@ -694,4 +664,3 b' class ComparePage(AssertResponse):'
694 def target_source_are_enabled(self):
664 def target_source_are_enabled(self):
695 response = self.response
665 response = self.response
696 response.mustcontain("var enable_fields = true;")
666 response.mustcontain("var enable_fields = true;")
697
@@ -47,10 +47,8 b' class TestCompareView(object):'
47 route_path(
47 route_path(
48 'repo_compare',
48 'repo_compare',
49 repo_name=backend.repo_name,
49 repo_name=backend.repo_name,
50 source_ref_type="tag",
50 source_ref_type="tag", source_ref=tag1,
51 source_ref=tag1,
51 target_ref_type="tag", target_ref=tag2),
52 target_ref_type="tag",
53 target_ref=tag2),
54 status=200)
52 status=200)
55
53
56 response.mustcontain('%s@%s' % (backend.repo_name, tag1))
54 response.mustcontain('%s@%s' % (backend.repo_name, tag1))
@@ -69,18 +67,28 b' class TestCompareView(object):'
69 compare_page.contains_commits(commits)
67 compare_page.contains_commits(commits)
70
68
71 # files diff
69 # files diff
70 short_id = short_id_new = ''
71 if backend.alias == 'git':
72 short_id = '5a3a8fb00555'
73 short_id_new = '0ba5f8a46600'
74 if backend.alias == 'hg':
75 short_id = '17544fbfcd33'
76 short_id_new = 'a7e60bff65d5'
77
72 compare_page.contains_file_links_and_anchors([
78 compare_page.contains_file_links_and_anchors([
73 ('docs/api/utils/index.rst', 'a_c--1c5cf9e91c12'),
79 # modified
74 ('test_and_report.sh', 'a_c--e3305437df55'),
80 ('docs/api/utils/index.rst', 'a_c-{}-1c5cf9e91c12'.format(short_id)),
75 ('.hgignore', 'a_c--c8e92ef85cd1'),
81 ('test_and_report.sh', 'a_c-{}-e3305437df55'.format(short_id)),
76 ('.hgtags', 'a_c--6e08b694d687'),
82 # added
77 ('docs/api/index.rst', 'a_c--2c14b00f3393'),
83 ('.hgignore', 'a_c-{}-c8e92ef85cd1'.format(short_id_new)),
78 ('vcs/__init__.py', 'a_c--430ccbc82bdf'),
84 ('.hgtags', 'a_c-{}-6e08b694d687'.format(short_id_new)),
79 ('vcs/backends/hg.py', 'a_c--9c390eb52cd6'),
85 ('docs/api/index.rst', 'a_c-{}-2c14b00f3393'.format(short_id_new)),
80 ('vcs/utils/__init__.py', 'a_c--ebb592c595c0'),
86 ('vcs/__init__.py', 'a_c-{}-430ccbc82bdf'.format(short_id_new)),
81 ('vcs/utils/annotate.py', 'a_c--7abc741b5052'),
87 ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(short_id_new)),
82 ('vcs/utils/diffs.py', 'a_c--2ef0ef106c56'),
88 ('vcs/utils/__init__.py', 'a_c-{}-ebb592c595c0'.format(short_id_new)),
83 ('vcs/utils/lazy.py', 'a_c--3150cb87d4b7'),
89 ('vcs/utils/annotate.py', 'a_c-{}-7abc741b5052'.format(short_id_new)),
90 ('vcs/utils/diffs.py', 'a_c-{}-2ef0ef106c56'.format(short_id_new)),
91 ('vcs/utils/lazy.py', 'a_c-{}-3150cb87d4b7'.format(short_id_new)),
84 ])
92 ])
85
93
86 @pytest.mark.xfail_backends("svn", msg="Depends on branch and tag support")
94 @pytest.mark.xfail_backends("svn", msg="Depends on branch and tag support")
@@ -104,12 +112,10 b' class TestCompareView(object):'
104
112
105 response = self.app.get(
113 response = self.app.get(
106 route_path(
114 route_path(
107 'repo_compare',
115 'repo_compare',
108 repo_name=backend.repo_name,
116 repo_name=backend.repo_name,
109 source_ref_type='branch',
117 source_ref_type='branch', source_ref=data['branch'],
110 source_ref=data['branch'],
118 target_ref_type="tag", target_ref=data['tag'],
111 target_ref_type="tag",
112 target_ref=data['tag'],
113 ))
119 ))
114
120
115 response.mustcontain('%s@%s' % (backend.repo_name, data['branch']))
121 response.mustcontain('%s@%s' % (backend.repo_name, data['branch']))
@@ -121,12 +127,10 b' class TestCompareView(object):'
121 head_id = backend.default_head_id
127 head_id = backend.default_head_id
122 response = self.app.get(
128 response = self.app.get(
123 route_path(
129 route_path(
124 'repo_compare',
130 'repo_compare',
125 repo_name=backend.repo_name,
131 repo_name=backend.repo_name,
126 source_ref_type="branch",
132 source_ref_type="branch", source_ref=head_id,
127 source_ref=head_id,
133 target_ref_type="branch", target_ref=head_id,
128 target_ref_type="branch",
129 target_ref=head_id,
130 ))
134 ))
131
135
132 response.mustcontain('%s@%s' % (backend.repo_name, head_id))
136 response.mustcontain('%s@%s' % (backend.repo_name, head_id))
@@ -138,16 +142,16 b' class TestCompareView(object):'
138 def test_compare_commits(self, backend):
142 def test_compare_commits(self, backend):
139 repo = backend.repo
143 repo = backend.repo
140 commit1 = repo.get_commit(commit_idx=0)
144 commit1 = repo.get_commit(commit_idx=0)
145 commit1_short_id = commit1.short_id
141 commit2 = repo.get_commit(commit_idx=1)
146 commit2 = repo.get_commit(commit_idx=1)
147 commit2_short_id = commit2.short_id
142
148
143 response = self.app.get(
149 response = self.app.get(
144 route_path(
150 route_path(
145 'repo_compare',
151 'repo_compare',
146 repo_name=backend.repo_name,
152 repo_name=backend.repo_name,
147 source_ref_type="rev",
153 source_ref_type="rev", source_ref=commit1.raw_id,
148 source_ref=commit1.raw_id,
154 target_ref_type="rev", target_ref=commit2.raw_id,
149 target_ref_type="rev",
150 target_ref=commit2.raw_id,
151 ))
155 ))
152 response.mustcontain('%s@%s' % (backend.repo_name, commit1.raw_id))
156 response.mustcontain('%s@%s' % (backend.repo_name, commit1.raw_id))
153 response.mustcontain('%s@%s' % (backend.repo_name, commit2.raw_id))
157 response.mustcontain('%s@%s' % (backend.repo_name, commit2.raw_id))
@@ -158,6 +162,6 b' class TestCompareView(object):'
158
162
159 # outgoing commits between those commits
163 # outgoing commits between those commits
160 compare_page.contains_commits([commit2])
164 compare_page.contains_commits([commit2])
161 compare_page.contains_file_links_and_anchors([
165 anchor = 'a_c-{}-c8e92ef85cd1'.format(commit2_short_id)
162 ('.hgignore', 'a_c--c8e92ef85cd1'),
166 response.mustcontain(anchor)
163 ])
167 compare_page.contains_file_links_and_anchors([('.hgignore', anchor),])
@@ -303,6 +303,27 b' class TestRepoForkViewTests(TestControll'
303 assert response.json == {u'data': [], u'draw': None,
303 assert response.json == {u'data': [], u'draw': None,
304 u'recordsFiltered': 0, u'recordsTotal': 0}
304 u'recordsFiltered': 0, u'recordsTotal': 0}
305
305
306 @pytest.mark.parametrize('url_type', [
307 'repo_fork_new',
308 'repo_fork_create'
309 ])
310 def test_fork_is_forbidden_on_archived_repo(self, backend, xhr_header, user_util, url_type):
311 user = user_util.create_user(password='qweqwe')
312 self.log_user(user.username, 'qweqwe')
313
314 # create a temporary repo
315 source = user_util.create_repo(repo_type=backend.alias)
316 repo_name = source.repo_name
317 repo = Repository.get_by_repo_name(repo_name)
318 repo.archived = True
319 Session().commit()
320
321 response = self.app.get(
322 route_path(url_type, repo_name=repo_name), status=302)
323
324 msg = 'Action not supported for archived repository.'
325 assert_session_flash(response, msg)
326
306
327
307 class TestSVNFork(TestController):
328 class TestSVNFork(TestController):
308 @pytest.mark.parametrize('route_name', [
329 @pytest.mark.parametrize('route_name', [
@@ -26,7 +26,7 b' from rhodecode.lib.vcs.nodes import File'
26 from rhodecode.lib import helpers as h
26 from rhodecode.lib import helpers as h
27 from rhodecode.model.changeset_status import ChangesetStatusModel
27 from rhodecode.model.changeset_status import ChangesetStatusModel
28 from rhodecode.model.db import (
28 from rhodecode.model.db import (
29 PullRequest, ChangesetStatus, UserLog, Notification, ChangesetComment)
29 PullRequest, ChangesetStatus, UserLog, Notification, ChangesetComment, Repository)
30 from rhodecode.model.meta import Session
30 from rhodecode.model.meta import Session
31 from rhodecode.model.pull_request import PullRequestModel
31 from rhodecode.model.pull_request import PullRequestModel
32 from rhodecode.model.user import UserModel
32 from rhodecode.model.user import UserModel
@@ -81,20 +81,21 b' class TestPullrequestsView(object):'
81 repo = backend.repo
81 repo = backend.repo
82
82
83 self.app.get(
83 self.app.get(
84 route_path('pullrequest_new',
84 route_path('pullrequest_new', repo_name=repo.repo_name,
85 repo_name=repo.repo_name,
85 commit=repo.get_commit().raw_id),
86 commit=repo.get_commit().raw_id),
87 status=200)
86 status=200)
88
87
89 @pytest.mark.parametrize('pr_merge_enabled', [True, False])
88 @pytest.mark.parametrize('pr_merge_enabled', [True, False])
90 def test_show(self, pr_util, pr_merge_enabled):
89 @pytest.mark.parametrize('range_diff', ["0", "1"])
90 def test_show(self, pr_util, pr_merge_enabled, range_diff):
91 pull_request = pr_util.create_pull_request(
91 pull_request = pr_util.create_pull_request(
92 mergeable=pr_merge_enabled, enable_notifications=False)
92 mergeable=pr_merge_enabled, enable_notifications=False)
93
93
94 response = self.app.get(route_path(
94 response = self.app.get(route_path(
95 'pullrequest_show',
95 'pullrequest_show',
96 repo_name=pull_request.target_repo.scm_instance().name,
96 repo_name=pull_request.target_repo.scm_instance().name,
97 pull_request_id=pull_request.pull_request_id))
97 pull_request_id=pull_request.pull_request_id,
98 params={'range-diff': range_diff}))
98
99
99 for commit_id in pull_request.revisions:
100 for commit_id in pull_request.revisions:
100 response.mustcontain(commit_id)
101 response.mustcontain(commit_id)
@@ -105,9 +106,13 b' class TestPullrequestsView(object):'
105 assert target_clone_url in response
106 assert target_clone_url in response
106
107
107 assert 'class="pull-request-merge"' in response
108 assert 'class="pull-request-merge"' in response
108 assert (
109 if pr_merge_enabled:
109 'Server-side pull request merging is disabled.'
110 response.mustcontain('Pull request reviewer approval is pending')
110 in response) != pr_merge_enabled
111 else:
112 response.mustcontain('Server-side pull request merging is disabled.')
113
114 if range_diff == "1":
115 response.mustcontain('Turn off: Show the diff as commit range')
111
116
112 def test_close_status_visibility(self, pr_util, user_util, csrf_token):
117 def test_close_status_visibility(self, pr_util, user_util, csrf_token):
113 # Logout
118 # Logout
@@ -573,11 +578,11 b' class TestPullrequestsView(object):'
573 assert actions[-1].action_data['commit_ids'] == pr_commit_ids
578 assert actions[-1].action_data['commit_ids'] == pr_commit_ids
574
579
575 # Check post_push rcextension was really executed
580 # Check post_push rcextension was really executed
576 push_calls = rhodecode.EXTENSIONS.calls['post_push']
581 push_calls = rhodecode.EXTENSIONS.calls['_push_hook']
577 assert len(push_calls) == 1
582 assert len(push_calls) == 1
578 unused_last_call_args, last_call_kwargs = push_calls[0]
583 unused_last_call_args, last_call_kwargs = push_calls[0]
579 assert last_call_kwargs['action'] == 'push'
584 assert last_call_kwargs['action'] == 'push'
580 assert last_call_kwargs['pushed_revs'] == pr_commit_ids
585 assert last_call_kwargs['commit_ids'] == pr_commit_ids
581
586
582 def test_merge_pull_request_disabled(self, pr_util, csrf_token):
587 def test_merge_pull_request_disabled(self, pr_util, csrf_token):
583 pull_request = pr_util.create_pull_request(mergeable=False)
588 pull_request = pr_util.create_pull_request(mergeable=False)
@@ -1191,6 +1196,28 b' class TestPullrequestsControllerDelete(o'
1191 )
1196 )
1192 assert response.body == 'true'
1197 assert response.body == 'true'
1193
1198
1199 @pytest.mark.parametrize('url_type', [
1200 'pullrequest_new',
1201 'pullrequest_create',
1202 'pullrequest_update',
1203 'pullrequest_merge',
1204 ])
1205 def test_pull_request_is_forbidden_on_archived_repo(
1206 self, autologin_user, backend, xhr_header, user_util, url_type):
1207
1208 # create a temporary repo
1209 source = user_util.create_repo(repo_type=backend.alias)
1210 repo_name = source.repo_name
1211 repo = Repository.get_by_repo_name(repo_name)
1212 repo.archived = True
1213 Session().commit()
1214
1215 response = self.app.get(
1216 route_path(url_type, repo_name=repo_name, pull_request_id=1), status=302)
1217
1218 msg = 'Action not supported for archived repository.'
1219 assert_session_flash(response, msg)
1220
1194
1221
1195 def assert_pull_request_status(pull_request, expected_status):
1222 def assert_pull_request_status(pull_request, expected_status):
1196 status = ChangesetStatusModel().calculated_review_status(
1223 status = ChangesetStatusModel().calculated_review_status(
@@ -39,6 +39,7 b' def route_path(name, params=None, **kwar'
39 'repo_summary': '/{repo_name}',
39 'repo_summary': '/{repo_name}',
40 'edit_repo_advanced': '/{repo_name}/settings/advanced',
40 'edit_repo_advanced': '/{repo_name}/settings/advanced',
41 'edit_repo_advanced_delete': '/{repo_name}/settings/advanced/delete',
41 'edit_repo_advanced_delete': '/{repo_name}/settings/advanced/delete',
42 'edit_repo_advanced_archive': '/{repo_name}/settings/advanced/archive',
42 'edit_repo_advanced_fork': '/{repo_name}/settings/advanced/fork',
43 'edit_repo_advanced_fork': '/{repo_name}/settings/advanced/fork',
43 'edit_repo_advanced_locking': '/{repo_name}/settings/advanced/locking',
44 'edit_repo_advanced_locking': '/{repo_name}/settings/advanced/locking',
44 'edit_repo_advanced_journal': '/{repo_name}/settings/advanced/journal',
45 'edit_repo_advanced_journal': '/{repo_name}/settings/advanced/journal',
@@ -133,7 +134,7 b' class TestAdminRepoSettingsAdvanced(obje'
133 "suffix",
134 "suffix",
134 ['', u'ąęł' , '123'],
135 ['', u'ąęł' , '123'],
135 ids=no_newline_id_generator)
136 ids=no_newline_id_generator)
136 def test_advanced_delete(self, autologin_user, backend, suffix, csrf_token):
137 def test_advanced_repo_delete(self, autologin_user, backend, suffix, csrf_token):
137 repo = backend.create_repo(name_suffix=suffix)
138 repo = backend.create_repo(name_suffix=suffix)
138 repo_name = repo.repo_name
139 repo_name = repo.repo_name
139 repo_name_str = safe_str(repo.repo_name)
140 repo_name_str = safe_str(repo.repo_name)
@@ -148,3 +149,25 b' class TestAdminRepoSettingsAdvanced(obje'
148 # check if repo was deleted from db
149 # check if repo was deleted from db
149 assert RepoModel().get_by_repo_name(repo_name) is None
150 assert RepoModel().get_by_repo_name(repo_name) is None
150 assert not repo_on_filesystem(repo_name_str)
151 assert not repo_on_filesystem(repo_name_str)
152
153 @pytest.mark.parametrize(
154 "suffix",
155 ['', u'ąęł' , '123'],
156 ids=no_newline_id_generator)
157 def test_advanced_repo_archive(self, autologin_user, backend, suffix, csrf_token):
158 repo = backend.create_repo(name_suffix=suffix)
159 repo_name = repo.repo_name
160 repo_name_str = safe_str(repo.repo_name)
161
162 response = self.app.post(
163 route_path('edit_repo_advanced_archive', repo_name=repo_name_str),
164 params={'csrf_token': csrf_token})
165
166 assert_session_flash(response,
167 u'Archived repository `{}`'.format(repo_name))
168
169 response = self.app.get(route_path('repo_summary', repo_name=repo_name_str))
170 response.mustcontain('This repository has been archived. It is now read-only.')
171
172 # check if repo was deleted from db
173 assert RepoModel().get_by_repo_name(repo_name).archived is True
@@ -34,7 +34,9 b' from rhodecode.lib.auth import ('
34 LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, CSRFRequired)
34 LoginRequired, HasRepoPermissionAnyDecorator, NotAnonymous, CSRFRequired)
35
35
36 from rhodecode.lib.compat import OrderedDict
36 from rhodecode.lib.compat import OrderedDict
37 from rhodecode.lib.diffs import cache_diff, load_cached_diff, diff_cache_exist
37 from rhodecode.lib.diffs import (
38 cache_diff, load_cached_diff, diff_cache_exist, get_diff_context,
39 get_diff_whitespace_flag)
38 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
40 from rhodecode.lib.exceptions import StatusChangeOnClosedPullRequestError
39 import rhodecode.lib.helpers as h
41 import rhodecode.lib.helpers as h
40 from rhodecode.lib.utils2 import safe_unicode, str2bool
42 from rhodecode.lib.utils2 import safe_unicode, str2bool
@@ -55,96 +57,8 b' def _update_with_GET(params, request):'
55 params[k] += request.GET.getall(k)
57 params[k] += request.GET.getall(k)
56
58
57
59
58 def get_ignore_ws(fid, request):
59 ig_ws_global = request.GET.get('ignorews')
60 ig_ws = filter(lambda k: k.startswith('WS'), request.GET.getall(fid))
61 if ig_ws:
62 try:
63 return int(ig_ws[0].split(':')[-1])
64 except Exception:
65 pass
66 return ig_ws_global
67
60
68
61
69 def _ignorews_url(request, fileid=None):
70 _ = request.translate
71 fileid = str(fileid) if fileid else None
72 params = collections.defaultdict(list)
73 _update_with_GET(params, request)
74 label = _('Show whitespace')
75 tooltiplbl = _('Show whitespace for all diffs')
76 ig_ws = get_ignore_ws(fileid, request)
77 ln_ctx = get_line_ctx(fileid, request)
78
79 if ig_ws is None:
80 params['ignorews'] += [1]
81 label = _('Ignore whitespace')
82 tooltiplbl = _('Ignore whitespace for all diffs')
83 ctx_key = 'context'
84 ctx_val = ln_ctx
85
86 # if we have passed in ln_ctx pass it along to our params
87 if ln_ctx:
88 params[ctx_key] += [ctx_val]
89
90 if fileid:
91 params['anchor'] = 'a_' + fileid
92 return h.link_to(label, request.current_route_path(_query=params),
93 title=tooltiplbl, class_='tooltip')
94
95
96 def get_line_ctx(fid, request):
97 ln_ctx_global = request.GET.get('context')
98 if fid:
99 ln_ctx = filter(lambda k: k.startswith('C'), request.GET.getall(fid))
100 else:
101 _ln_ctx = filter(lambda k: k.startswith('C'), request.GET)
102 ln_ctx = request.GET.get(_ln_ctx[0]) if _ln_ctx else ln_ctx_global
103 if ln_ctx:
104 ln_ctx = [ln_ctx]
105
106 if ln_ctx:
107 retval = ln_ctx[0].split(':')[-1]
108 else:
109 retval = ln_ctx_global
110
111 try:
112 return int(retval)
113 except Exception:
114 return 3
115
116
117 def _context_url(request, fileid=None):
118 """
119 Generates a url for context lines.
120
121 :param fileid:
122 """
123
124 _ = request.translate
125 fileid = str(fileid) if fileid else None
126 ig_ws = get_ignore_ws(fileid, request)
127 ln_ctx = (get_line_ctx(fileid, request) or 3) * 2
128
129 params = collections.defaultdict(list)
130 _update_with_GET(params, request)
131
132 if ln_ctx > 0:
133 params['context'] += [ln_ctx]
134
135 if ig_ws:
136 ig_ws_key = 'ignorews'
137 ig_ws_val = 1
138 params[ig_ws_key] += [ig_ws_val]
139
140 lbl = _('Increase context')
141 tooltiplbl = _('Increase context for all diffs')
142
143 if fileid:
144 params['anchor'] = 'a_' + fileid
145 return h.link_to(lbl, request.current_route_path(_query=params),
146 title=tooltiplbl, class_='tooltip')
147
148
62
149 class RepoCommitsView(RepoAppView):
63 class RepoCommitsView(RepoAppView):
150 def load_default_context(self):
64 def load_default_context(self):
@@ -162,13 +76,11 b' class RepoCommitsView(RepoAppView):'
162 def _commit(self, commit_id_range, method):
76 def _commit(self, commit_id_range, method):
163 _ = self.request.translate
77 _ = self.request.translate
164 c = self.load_default_context()
78 c = self.load_default_context()
165 c.ignorews_url = _ignorews_url
166 c.context_url = _context_url
167 c.fulldiff = self.request.GET.get('fulldiff')
79 c.fulldiff = self.request.GET.get('fulldiff')
168
80
169 # fetch global flags of ignore ws or context lines
81 # fetch global flags of ignore ws or context lines
170 context_lcl = get_line_ctx('', self.request)
82 diff_context = get_diff_context(self.request)
171 ign_whitespace_lcl = get_ignore_ws('', self.request)
83 hide_whitespace_changes = get_diff_whitespace_flag(self.request)
172
84
173 # diff_limit will cut off the whole diff if the limit is applied
85 # diff_limit will cut off the whole diff if the limit is applied
174 # otherwise it will just hide the big files from the front-end
86 # otherwise it will just hide the big files from the front-end
@@ -245,7 +157,7 b' class RepoCommitsView(RepoAppView):'
245 c.changes[commit.raw_id] = []
157 c.changes[commit.raw_id] = []
246
158
247 commit2 = commit
159 commit2 = commit
248 commit1 = commit.parents[0] if commit.parents else EmptyCommit()
160 commit1 = commit.first_parent
249
161
250 if method == 'show':
162 if method == 'show':
251 inline_comments = CommentsModel().get_inline_comments(
163 inline_comments = CommentsModel().get_inline_comments(
@@ -258,7 +170,7 b' class RepoCommitsView(RepoAppView):'
258 self.db_repo)
170 self.db_repo)
259 cache_file_path = diff_cache_exist(
171 cache_file_path = diff_cache_exist(
260 cache_path, 'diff', commit.raw_id,
172 cache_path, 'diff', commit.raw_id,
261 ign_whitespace_lcl, context_lcl, c.fulldiff)
173 hide_whitespace_changes, diff_context, c.fulldiff)
262
174
263 caching_enabled = self._is_diff_cache_enabled(self.db_repo)
175 caching_enabled = self._is_diff_cache_enabled(self.db_repo)
264 force_recache = str2bool(self.request.GET.get('force_recache'))
176 force_recache = str2bool(self.request.GET.get('force_recache'))
@@ -273,8 +185,8 b' class RepoCommitsView(RepoAppView):'
273 else:
185 else:
274 vcs_diff = self.rhodecode_vcs_repo.get_diff(
186 vcs_diff = self.rhodecode_vcs_repo.get_diff(
275 commit1, commit2,
187 commit1, commit2,
276 ignore_whitespace=ign_whitespace_lcl,
188 ignore_whitespace=hide_whitespace_changes,
277 context=context_lcl)
189 context=diff_context)
278
190
279 diff_processor = diffs.DiffProcessor(
191 diff_processor = diffs.DiffProcessor(
280 vcs_diff, format='newdiff', diff_limit=diff_limit,
192 vcs_diff, format='newdiff', diff_limit=diff_limit,
@@ -300,7 +212,7 b' class RepoCommitsView(RepoAppView):'
300 # TODO(marcink): no cache usage here...
212 # TODO(marcink): no cache usage here...
301 _diff = self.rhodecode_vcs_repo.get_diff(
213 _diff = self.rhodecode_vcs_repo.get_diff(
302 commit1, commit2,
214 commit1, commit2,
303 ignore_whitespace=ign_whitespace_lcl, context=context_lcl)
215 ignore_whitespace=hide_whitespace_changes, context=diff_context)
304 diff_processor = diffs.DiffProcessor(
216 diff_processor = diffs.DiffProcessor(
305 _diff, format='newdiff', diff_limit=diff_limit,
217 _diff, format='newdiff', diff_limit=diff_limit,
306 file_limit=file_limit, show_full_diff=c.fulldiff)
218 file_limit=file_limit, show_full_diff=c.fulldiff)
@@ -44,10 +44,7 b' log = logging.getLogger(__name__)'
44 class RepoCompareView(RepoAppView):
44 class RepoCompareView(RepoAppView):
45 def load_default_context(self):
45 def load_default_context(self):
46 c = self._get_local_tmpl_context(include_app_defaults=True)
46 c = self._get_local_tmpl_context(include_app_defaults=True)
47
48 c.rhodecode_repo = self.rhodecode_vcs_repo
47 c.rhodecode_repo = self.rhodecode_vcs_repo
49
50
51 return c
48 return c
52
49
53 def _get_commit_or_redirect(
50 def _get_commit_or_redirect(
@@ -145,6 +142,10 b' class RepoCompareView(RepoAppView):'
145 # c.fulldiff disables cut_off_limit
142 # c.fulldiff disables cut_off_limit
146 c.fulldiff = str2bool(self.request.GET.get('fulldiff'))
143 c.fulldiff = str2bool(self.request.GET.get('fulldiff'))
147
144
145 # fetch global flags of ignore ws or context lines
146 diff_context = diffs.get_diff_context(self.request)
147 hide_whitespace_changes = diffs.get_diff_whitespace_flag(self.request)
148
148 c.file_path = target_path
149 c.file_path = target_path
149 c.commit_statuses = ChangesetStatus.STATUSES
150 c.commit_statuses = ChangesetStatus.STATUSES
150
151
@@ -256,8 +257,8 b' class RepoCompareView(RepoAppView):'
256 # case we want a simple diff without incoming commits,
257 # case we want a simple diff without incoming commits,
257 # previewing what will be merged.
258 # previewing what will be merged.
258 # Make the diff on target repo (which is known to have target_ref)
259 # Make the diff on target repo (which is known to have target_ref)
259 log.debug('Using ancestor %s as source_ref instead of %s'
260 log.debug('Using ancestor %s as source_ref instead of %s',
260 % (c.ancestor, source_ref))
261 c.ancestor, source_ref)
261 source_repo = target_repo
262 source_repo = target_repo
262 source_commit = target_repo.get_commit(commit_id=c.ancestor)
263 source_commit = target_repo.get_commit(commit_id=c.ancestor)
263
264
@@ -288,7 +289,8 b' class RepoCompareView(RepoAppView):'
288
289
289 txt_diff = source_repo.scm_instance().get_diff(
290 txt_diff = source_repo.scm_instance().get_diff(
290 commit1=source_commit, commit2=target_commit,
291 commit1=source_commit, commit2=target_commit,
291 path=target_path, path1=source_path)
292 path=target_path, path1=source_path,
293 ignore_whitespace=hide_whitespace_changes, context=diff_context)
292
294
293 diff_processor = diffs.DiffProcessor(
295 diff_processor = diffs.DiffProcessor(
294 txt_diff, format='newdiff', diff_limit=diff_limit,
296 txt_diff, format='newdiff', diff_limit=diff_limit,
@@ -298,6 +300,7 b' class RepoCompareView(RepoAppView):'
298 diffset = codeblocks.DiffSet(
300 diffset = codeblocks.DiffSet(
299 repo_name=source_repo.repo_name,
301 repo_name=source_repo.repo_name,
300 source_node_getter=codeblocks.diffset_node_getter(source_commit),
302 source_node_getter=codeblocks.diffset_node_getter(source_commit),
303 target_repo_name=self.db_repo_name,
301 target_node_getter=codeblocks.diffset_node_getter(target_commit),
304 target_node_getter=codeblocks.diffset_node_getter(target_commit),
302 )
305 )
303 c.diffset = self.path_filter.render_patchset_filtered(
306 c.diffset = self.path_filter.render_patchset_filtered(
@@ -29,6 +29,8 b' from rhodecode.lib import helpers as h'
29 from rhodecode.lib import audit_logger
29 from rhodecode.lib import audit_logger
30 from rhodecode.lib.auth import (
30 from rhodecode.lib.auth import (
31 LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired)
31 LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired)
32 from rhodecode.lib.utils2 import safe_int
33 from rhodecode.model.db import UserGroup
32 from rhodecode.model.forms import RepoPermsForm
34 from rhodecode.model.forms import RepoPermsForm
33 from rhodecode.model.meta import Session
35 from rhodecode.model.meta import Session
34 from rhodecode.model.repo import RepoModel
36 from rhodecode.model.repo import RepoModel
@@ -88,6 +90,11 b' class RepoSettingsPermissionsView(RepoAp'
88 for change in changes['added'] + changes['updated'] + changes['deleted']:
90 for change in changes['added'] + changes['updated'] + changes['deleted']:
89 if change['type'] == 'user':
91 if change['type'] == 'user':
90 affected_user_ids.append(change['id'])
92 affected_user_ids.append(change['id'])
93 if change['type'] == 'user_group':
94 user_group = UserGroup.get(safe_int(change['id']))
95 if user_group:
96 group_members_ids = [x.user_id for x in user_group.members]
97 affected_user_ids.extend(group_members_ids)
91
98
92 events.trigger(events.UserPermissionsChange(affected_user_ids))
99 events.trigger(events.UserPermissionsChange(affected_user_ids))
93
100
@@ -138,6 +138,13 b' class RepoPullRequestsView(RepoAppView, '
138 })
138 })
139 return data
139 return data
140
140
141 def get_recache_flag(self):
142 for flag_name in ['force_recache', 'force-recache', 'no-cache']:
143 flag_val = self.request.GET.get(flag_name)
144 if str2bool(flag_val):
145 return True
146 return False
147
141 @LoginRequired()
148 @LoginRequired()
142 @HasRepoPermissionAnyDecorator(
149 @HasRepoPermissionAnyDecorator(
143 'repository.read', 'repository.write', 'repository.admin')
150 'repository.read', 'repository.write', 'repository.admin')
@@ -212,10 +219,11 b' class RepoPullRequestsView(RepoAppView, '
212 def _get_diffset(self, source_repo_name, source_repo,
219 def _get_diffset(self, source_repo_name, source_repo,
213 source_ref_id, target_ref_id,
220 source_ref_id, target_ref_id,
214 target_commit, source_commit, diff_limit, file_limit,
221 target_commit, source_commit, diff_limit, file_limit,
215 fulldiff):
222 fulldiff, hide_whitespace_changes, diff_context):
216
223
217 vcs_diff = PullRequestModel().get_diff(
224 vcs_diff = PullRequestModel().get_diff(
218 source_repo, source_ref_id, target_ref_id)
225 source_repo, source_ref_id, target_ref_id,
226 hide_whitespace_changes, diff_context)
219
227
220 diff_processor = diffs.DiffProcessor(
228 diff_processor = diffs.DiffProcessor(
221 vcs_diff, format='newdiff', diff_limit=diff_limit,
229 vcs_diff, format='newdiff', diff_limit=diff_limit,
@@ -234,6 +242,30 b' class RepoPullRequestsView(RepoAppView, '
234
242
235 return diffset
243 return diffset
236
244
245 def _get_range_diffset(self, source_scm, source_repo,
246 commit1, commit2, diff_limit, file_limit,
247 fulldiff, hide_whitespace_changes, diff_context):
248 vcs_diff = source_scm.get_diff(
249 commit1, commit2,
250 ignore_whitespace=hide_whitespace_changes,
251 context=diff_context)
252
253 diff_processor = diffs.DiffProcessor(
254 vcs_diff, format='newdiff', diff_limit=diff_limit,
255 file_limit=file_limit, show_full_diff=fulldiff)
256
257 _parsed = diff_processor.prepare()
258
259 diffset = codeblocks.DiffSet(
260 repo_name=source_repo.repo_name,
261 source_node_getter=codeblocks.diffset_node_getter(commit1),
262 target_node_getter=codeblocks.diffset_node_getter(commit2))
263
264 diffset = self.path_filter.render_patchset_filtered(
265 diffset, _parsed, commit1.raw_id, commit2.raw_id)
266
267 return diffset
268
237 @LoginRequired()
269 @LoginRequired()
238 @HasRepoPermissionAnyDecorator(
270 @HasRepoPermissionAnyDecorator(
239 'repository.read', 'repository.write', 'repository.admin')
271 'repository.read', 'repository.write', 'repository.admin')
@@ -249,6 +281,11 b' class RepoPullRequestsView(RepoAppView, '
249 from_version = self.request.GET.get('from_version') or version
281 from_version = self.request.GET.get('from_version') or version
250 merge_checks = self.request.GET.get('merge_checks')
282 merge_checks = self.request.GET.get('merge_checks')
251 c.fulldiff = str2bool(self.request.GET.get('fulldiff'))
283 c.fulldiff = str2bool(self.request.GET.get('fulldiff'))
284
285 # fetch global flags of ignore ws or context lines
286 diff_context = diffs.get_diff_context(self.request)
287 hide_whitespace_changes = diffs.get_diff_whitespace_flag(self.request)
288
252 force_refresh = str2bool(self.request.GET.get('force_refresh'))
289 force_refresh = str2bool(self.request.GET.get('force_refresh'))
253
290
254 (pull_request_latest,
291 (pull_request_latest,
@@ -265,6 +302,9 b' class RepoPullRequestsView(RepoAppView, '
265 pull_request_id=pull_request_id))
302 pull_request_id=pull_request_id))
266
303
267 versions = pull_request_display_obj.versions()
304 versions = pull_request_display_obj.versions()
305 # used to store per-commit range diffs
306 c.changes = collections.OrderedDict()
307 c.range_diff_on = self.request.GET.get('range-diff') == "1"
268
308
269 c.at_version = at_version
309 c.at_version = at_version
270 c.at_version_num = (at_version
310 c.at_version_num = (at_version
@@ -453,14 +493,14 b' class RepoPullRequestsView(RepoAppView, '
453 version_normalized = version or 'latest'
493 version_normalized = version or 'latest'
454 from_version_normalized = from_version or 'latest'
494 from_version_normalized = from_version or 'latest'
455
495
456 cache_path = self.rhodecode_vcs_repo.get_create_shadow_cache_pr_path(
496 cache_path = self.rhodecode_vcs_repo.get_create_shadow_cache_pr_path(target_repo)
457 target_repo)
458 cache_file_path = diff_cache_exist(
497 cache_file_path = diff_cache_exist(
459 cache_path, 'pull_request', pull_request_id, version_normalized,
498 cache_path, 'pull_request', pull_request_id, version_normalized,
460 from_version_normalized, source_ref_id, target_ref_id, c.fulldiff)
499 from_version_normalized, source_ref_id, target_ref_id,
500 hide_whitespace_changes, diff_context, c.fulldiff)
461
501
462 caching_enabled = self._is_diff_cache_enabled(c.target_repo)
502 caching_enabled = self._is_diff_cache_enabled(c.target_repo)
463 force_recache = str2bool(self.request.GET.get('force_recache'))
503 force_recache = self.get_recache_flag()
464
504
465 cached_diff = None
505 cached_diff = None
466 if caching_enabled:
506 if caching_enabled:
@@ -471,7 +511,8 b' class RepoPullRequestsView(RepoAppView, '
471 and len(cached_diff.get('commits', [])) == 5
511 and len(cached_diff.get('commits', [])) == 5
472 and cached_diff.get('commits')[0]
512 and cached_diff.get('commits')[0]
473 and cached_diff.get('commits')[3])
513 and cached_diff.get('commits')[3])
474 if not force_recache and has_proper_commit_cache:
514
515 if not force_recache and not c.range_diff_on and has_proper_commit_cache:
475 diff_commit_cache = \
516 diff_commit_cache = \
476 (ancestor_commit, commit_cache, missing_requirements,
517 (ancestor_commit, commit_cache, missing_requirements,
477 source_commit, target_commit) = cached_diff['commits']
518 source_commit, target_commit) = cached_diff['commits']
@@ -527,7 +568,8 b' class RepoPullRequestsView(RepoAppView, '
527 c.source_repo.repo_name, commits_source_repo,
568 c.source_repo.repo_name, commits_source_repo,
528 source_ref_id, target_ref_id,
569 source_ref_id, target_ref_id,
529 target_commit, source_commit,
570 target_commit, source_commit,
530 diff_limit, file_limit, c.fulldiff)
571 diff_limit, file_limit, c.fulldiff,
572 hide_whitespace_changes, diff_context)
531
573
532 # save cached diff
574 # save cached diff
533 if caching_enabled:
575 if caching_enabled:
@@ -546,8 +588,41 b' class RepoPullRequestsView(RepoAppView, '
546 c.deleted_files_comments[fname]['stats'] = 0
588 c.deleted_files_comments[fname]['stats'] = 0
547 c.deleted_files_comments[fname]['comments'] = list()
589 c.deleted_files_comments[fname]['comments'] = list()
548 for lno, comments in per_line_comments.items():
590 for lno, comments in per_line_comments.items():
549 c.deleted_files_comments[fname]['comments'].extend(
591 c.deleted_files_comments[fname]['comments'].extend(comments)
550 comments)
592
593 # maybe calculate the range diff
594 if c.range_diff_on:
595 # TODO(marcink): set whitespace/context
596 context_lcl = 3
597 ign_whitespace_lcl = False
598
599 for commit in c.commit_ranges:
600 commit2 = commit
601 commit1 = commit.first_parent
602
603 range_diff_cache_file_path = diff_cache_exist(
604 cache_path, 'diff', commit.raw_id,
605 ign_whitespace_lcl, context_lcl, c.fulldiff)
606
607 cached_diff = None
608 if caching_enabled:
609 cached_diff = load_cached_diff(range_diff_cache_file_path)
610
611 has_proper_diff_cache = cached_diff and cached_diff.get('diff')
612 if not force_recache and has_proper_diff_cache:
613 diffset = cached_diff['diff']
614 else:
615 diffset = self._get_range_diffset(
616 source_scm, source_repo,
617 commit1, commit2, diff_limit, file_limit,
618 c.fulldiff, ign_whitespace_lcl, context_lcl
619 )
620
621 # save cached diff
622 if caching_enabled:
623 cache_diff(range_diff_cache_file_path, diffset, None)
624
625 c.changes[commit.raw_id] = diffset
551
626
552 # this is a hack to properly display links, when creating PR, the
627 # this is a hack to properly display links, when creating PR, the
553 # compare view and others uses different notation, and
628 # compare view and others uses different notation, and
@@ -607,7 +682,7 b' class RepoPullRequestsView(RepoAppView, '
607 commit_cache = collections.OrderedDict()
682 commit_cache = collections.OrderedDict()
608 missing_requirements = False
683 missing_requirements = False
609 try:
684 try:
610 pre_load = ["author", "branch", "date", "message"]
685 pre_load = ["author", "branch", "date", "message", "parents"]
611 show_revs = pull_request_at_ver.revisions
686 show_revs = pull_request_at_ver.revisions
612 for rev in show_revs:
687 for rev in show_revs:
613 comm = commits_source_repo.get_commit(
688 comm = commits_source_repo.get_commit(
@@ -23,13 +23,14 b' import logging'
23 from pyramid.view import view_config
23 from pyramid.view import view_config
24 from pyramid.httpexceptions import HTTPFound
24 from pyramid.httpexceptions import HTTPFound
25
25
26 from rhodecode import events
26 from rhodecode.apps._base import RepoAppView
27 from rhodecode.apps._base import RepoAppView
27 from rhodecode.lib import helpers as h
28 from rhodecode.lib import helpers as h
28 from rhodecode.lib import audit_logger
29 from rhodecode.lib import audit_logger
29 from rhodecode.lib.auth import (
30 from rhodecode.lib.auth import (
30 LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired,
31 LoginRequired, HasRepoPermissionAnyDecorator, CSRFRequired,
31 HasRepoPermissionAny)
32 HasRepoPermissionAny)
32 from rhodecode.lib.exceptions import AttachedForksError
33 from rhodecode.lib.exceptions import AttachedForksError, AttachedPullRequestsError
33 from rhodecode.lib.utils2 import safe_int
34 from rhodecode.lib.utils2 import safe_int
34 from rhodecode.lib.vcs import RepositoryError
35 from rhodecode.lib.vcs import RepositoryError
35 from rhodecode.model.db import Session, UserFollowing, User, Repository
36 from rhodecode.model.db import Session, UserFollowing, User, Repository
@@ -45,6 +46,13 b' class RepoSettingsView(RepoAppView):'
45 c = self._get_local_tmpl_context()
46 c = self._get_local_tmpl_context()
46 return c
47 return c
47
48
49 def _get_users_with_permissions(self):
50 user_permissions = {}
51 for perm in self.db_repo.permissions():
52 user_permissions[perm.user_id] = perm
53
54 return user_permissions
55
48 @LoginRequired()
56 @LoginRequired()
49 @HasRepoPermissionAnyDecorator('repository.admin')
57 @HasRepoPermissionAnyDecorator('repository.admin')
50 @view_config(
58 @view_config(
@@ -71,6 +79,49 b' class RepoSettingsView(RepoAppView):'
71 @HasRepoPermissionAnyDecorator('repository.admin')
79 @HasRepoPermissionAnyDecorator('repository.admin')
72 @CSRFRequired()
80 @CSRFRequired()
73 @view_config(
81 @view_config(
82 route_name='edit_repo_advanced_archive', request_method='POST',
83 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
84 def edit_advanced_archive(self):
85 """
86 Archives the repository. It will become read-only, and not visible in search
87 or other queries. But still visible for super-admins.
88 """
89
90 _ = self.request.translate
91
92 try:
93 old_data = self.db_repo.get_api_data()
94 RepoModel().archive(self.db_repo)
95
96 repo = audit_logger.RepoWrap(repo_id=None, repo_name=self.db_repo.repo_name)
97 audit_logger.store_web(
98 'repo.archive', action_data={'old_data': old_data},
99 user=self._rhodecode_user, repo=repo)
100
101 ScmModel().mark_for_invalidation(self.db_repo_name, delete=True)
102 h.flash(
103 _('Archived repository `%s`') % self.db_repo_name,
104 category='success')
105 Session().commit()
106 except Exception:
107 log.exception("Exception during archiving of repository")
108 h.flash(_('An error occurred during archiving of `%s`')
109 % self.db_repo_name, category='error')
110 # redirect to advanced for more deletion options
111 raise HTTPFound(
112 h.route_path('edit_repo_advanced', repo_name=self.db_repo_name,
113 _anchor='advanced-archive'))
114
115 # flush permissions for all users defined in permissions
116 affected_user_ids = self._get_users_with_permissions().keys()
117 events.trigger(events.UserPermissionsChange(affected_user_ids))
118
119 raise HTTPFound(h.route_path('home'))
120
121 @LoginRequired()
122 @HasRepoPermissionAnyDecorator('repository.admin')
123 @CSRFRequired()
124 @view_config(
74 route_name='edit_repo_advanced_delete', request_method='POST',
125 route_name='edit_repo_advanced_delete', request_method='POST',
75 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
126 renderer='rhodecode:templates/admin/repos/repo_edit.mako')
76 def edit_advanced_delete(self):
127 def edit_advanced_delete(self):
@@ -80,22 +131,23 b' class RepoSettingsView(RepoAppView):'
80 """
131 """
81 _ = self.request.translate
132 _ = self.request.translate
82 handle_forks = self.request.POST.get('forks', None)
133 handle_forks = self.request.POST.get('forks', None)
134 if handle_forks == 'detach_forks':
135 handle_forks = 'detach'
136 elif handle_forks == 'delete_forks':
137 handle_forks = 'delete'
83
138
84 try:
139 try:
140 old_data = self.db_repo.get_api_data()
141 RepoModel().delete(self.db_repo, forks=handle_forks)
142
85 _forks = self.db_repo.forks.count()
143 _forks = self.db_repo.forks.count()
86 if _forks and handle_forks:
144 if _forks and handle_forks:
87 if handle_forks == 'detach_forks':
145 if handle_forks == 'detach_forks':
88 handle_forks = 'detach'
89 h.flash(_('Detached %s forks') % _forks, category='success')
146 h.flash(_('Detached %s forks') % _forks, category='success')
90 elif handle_forks == 'delete_forks':
147 elif handle_forks == 'delete_forks':
91 handle_forks = 'delete'
92 h.flash(_('Deleted %s forks') % _forks, category='success')
148 h.flash(_('Deleted %s forks') % _forks, category='success')
93
149
94 old_data = self.db_repo.get_api_data()
150 repo = audit_logger.RepoWrap(repo_id=None, repo_name=self.db_repo.repo_name)
95 RepoModel().delete(self.db_repo, forks=handle_forks)
96
97 repo = audit_logger.RepoWrap(repo_id=None,
98 repo_name=self.db_repo.repo_name)
99 audit_logger.store_web(
151 audit_logger.store_web(
100 'repo.delete', action_data={'old_data': old_data},
152 'repo.delete', action_data={'old_data': old_data},
101 user=self._rhodecode_user, repo=repo)
153 user=self._rhodecode_user, repo=repo)
@@ -118,6 +170,20 b' class RepoSettingsView(RepoAppView):'
118 # redirect to advanced for forks handle action ?
170 # redirect to advanced for forks handle action ?
119 raise HTTPFound(repo_advanced_url)
171 raise HTTPFound(repo_advanced_url)
120
172
173 except AttachedPullRequestsError:
174 repo_advanced_url = h.route_path(
175 'edit_repo_advanced', repo_name=self.db_repo_name,
176 _anchor='advanced-delete')
177 attached_prs = len(self.db_repo.pull_requests_source +
178 self.db_repo.pull_requests_target)
179 h.flash(
180 _('Cannot delete `{repo}` it still contains {num} attached pull requests. '
181 'Consider archiving the repository instead.').format(
182 repo=self.db_repo_name, num=attached_prs), category='warning')
183
184 # redirect to advanced for forks handle action ?
185 raise HTTPFound(repo_advanced_url)
186
121 except Exception:
187 except Exception:
122 log.exception("Exception during deletion of repository")
188 log.exception("Exception during deletion of repository")
123 h.flash(_('An error occurred during deletion of `%s`')
189 h.flash(_('An error occurred during deletion of `%s`')
@@ -65,7 +65,7 b' class StripView(RepoAppView):'
65 check = rp.get(chset)
65 check = rp.get(chset)
66
66
67 if check:
67 if check:
68 data[i] = self.db_repo.get_changeset(rp[chset])
68 data[i] = self.db_repo.get_commit(rp[chset])
69 if isinstance(data[i], EmptyCommit):
69 if isinstance(data[i], EmptyCommit):
70 data[i] = {'rev': None, 'commit': h.escape(rp[chset])}
70 data[i] = {'rev': None, 'commit': h.escape(rp[chset])}
71 else:
71 else:
@@ -98,8 +98,8 b' class StripView(RepoAppView):'
98 ScmModel().strip(
98 ScmModel().strip(
99 repo=self.db_repo,
99 repo=self.db_repo,
100 commit_id=commit['rev'], branch=commit['branch'])
100 commit_id=commit['rev'], branch=commit['branch'])
101 log.info('Stripped commit %s from repo `%s` by %s' % (
101 log.info('Stripped commit %s from repo `%s` by %s',
102 commit['rev'], self.db_repo_name, user))
102 commit['rev'], self.db_repo_name, user)
103 data[commit['rev']] = True
103 data[commit['rev']] = True
104
104
105 audit_logger.store_web(
105 audit_logger.store_web(
@@ -108,6 +108,6 b' class StripView(RepoAppView):'
108
108
109 except Exception as e:
109 except Exception as e:
110 data[commit['rev']] = False
110 data[commit['rev']] = False
111 log.debug('Stripped commit %s from repo `%s` failed by %s, exeption %s' % (
111 log.debug('Stripped commit %s from repo `%s` failed by %s, exeption %s',
112 commit['rev'], self.db_repo_name, user, e.message))
112 commit['rev'], self.db_repo_name, user, e.message)
113 return data
113 return data
@@ -103,6 +103,7 b' class VcsServer(object):'
103 'repository': self.repo_name,
103 'repository': self.repo_name,
104 'scm': self.backend,
104 'scm': self.backend,
105 'config': self.ini_path,
105 'config': self.ini_path,
106 'repo_store': self.store,
106 'make_lock': None,
107 'make_lock': None,
107 'locked_by': [None, None],
108 'locked_by': [None, None],
108 'server_url': None,
109 'server_url': None,
@@ -41,8 +41,7 b' def dummy_conf_file(tmpdir):'
41 return os.path.join(f_path)
41 return os.path.join(f_path)
42
42
43
43
44 @pytest.fixture
44 def plain_dummy_env():
45 def dummy_env():
46 return {
45 return {
47 'request':
46 'request':
48 AttributeDict(host_url='http://localhost', script_name='/')
47 AttributeDict(host_url='http://localhost', script_name='/')
@@ -50,8 +49,17 b' def dummy_env():'
50
49
51
50
52 @pytest.fixture
51 @pytest.fixture
52 def dummy_env():
53 return plain_dummy_env()
54
55
56 def plain_dummy_user():
57 return AttributeDict(username='test_user')
58
59
60 @pytest.fixture
53 def dummy_user():
61 def dummy_user():
54 return AttributeDict(username='test_user')
62 return plain_dummy_user()
55
63
56
64
57 @pytest.fixture
65 @pytest.fixture
@@ -23,7 +23,7 b' import mock'
23 import pytest
23 import pytest
24
24
25 from rhodecode.apps.ssh_support.lib.backends.git import GitServer
25 from rhodecode.apps.ssh_support.lib.backends.git import GitServer
26 from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user
26 from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user
27
27
28
28
29 class GitServerCreator(object):
29 class GitServerCreator(object):
@@ -37,7 +37,7 b' class GitServerCreator(object):'
37 }
37 }
38 repo_name = 'test_git'
38 repo_name = 'test_git'
39 repo_mode = 'receive-pack'
39 repo_mode = 'receive-pack'
40 user = dummy_user()
40 user = plain_dummy_user()
41
41
42 def __init__(self):
42 def __init__(self):
43 def config_get(part, key):
43 def config_get(part, key):
@@ -56,7 +56,7 b' class GitServerCreator(object):'
56 self.repo_name: 'repository.admin'
56 self.repo_name: 'repository.admin'
57 },
57 },
58 'config': self.config_mock,
58 'config': self.config_mock,
59 'env': dummy_env()
59 'env': plain_dummy_env()
60 }
60 }
61 parameters.update(kwargs)
61 parameters.update(kwargs)
62 server = GitServer(**parameters)
62 server = GitServer(**parameters)
@@ -121,6 +121,8 b' class TestGitServer(object):'
121 ])
121 ])
122 def test_update_environment(self, git_server, repo_mode, action):
122 def test_update_environment(self, git_server, repo_mode, action):
123 server = git_server.create(repo_mode=repo_mode)
123 server = git_server.create(repo_mode=repo_mode)
124 store = server.store
125
124 with mock.patch('os.environ', {'SSH_CLIENT': '10.10.10.10 b'}):
126 with mock.patch('os.environ', {'SSH_CLIENT': '10.10.10.10 b'}):
125 with mock.patch('os.putenv') as putenv_mock:
127 with mock.patch('os.putenv') as putenv_mock:
126 server.update_environment(action)
128 server.update_environment(action)
@@ -135,6 +137,7 b' class TestGitServer(object):'
135 'ip': '10.10.10.10',
137 'ip': '10.10.10.10',
136 'locked_by': [None, None],
138 'locked_by': [None, None],
137 'config': '',
139 'config': '',
140 'repo_store': store,
138 'server_url': None,
141 'server_url': None,
139 'hooks': ['push', 'pull'],
142 'hooks': ['push', 'pull'],
140 'is_shadow_repo': False,
143 'is_shadow_repo': False,
@@ -22,7 +22,7 b' import mock'
22 import pytest
22 import pytest
23
23
24 from rhodecode.apps.ssh_support.lib.backends.hg import MercurialServer
24 from rhodecode.apps.ssh_support.lib.backends.hg import MercurialServer
25 from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user
25 from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user
26
26
27
27
28 class MercurialServerCreator(object):
28 class MercurialServerCreator(object):
@@ -36,7 +36,7 b' class MercurialServerCreator(object):'
36 }
36 }
37 }
37 }
38 repo_name = 'test_hg'
38 repo_name = 'test_hg'
39 user = dummy_user()
39 user = plain_dummy_user()
40
40
41 def __init__(self):
41 def __init__(self):
42 def config_get(part, key):
42 def config_get(part, key):
@@ -54,7 +54,7 b' class MercurialServerCreator(object):'
54 'test_hg': 'repository.admin'
54 'test_hg': 'repository.admin'
55 },
55 },
56 'config': self.config_mock,
56 'config': self.config_mock,
57 'env': dummy_env()
57 'env': plain_dummy_env()
58 }
58 }
59 parameters.update(kwargs)
59 parameters.update(kwargs)
60 server = MercurialServer(**parameters)
60 server = MercurialServer(**parameters)
@@ -22,7 +22,7 b' import mock'
22 import pytest
22 import pytest
23
23
24 from rhodecode.apps.ssh_support.lib.backends.svn import SubversionServer
24 from rhodecode.apps.ssh_support.lib.backends.svn import SubversionServer
25 from rhodecode.apps.ssh_support.tests.conftest import dummy_env, dummy_user
25 from rhodecode.apps.ssh_support.tests.conftest import plain_dummy_env, plain_dummy_user
26
26
27
27
28 class SubversionServerCreator(object):
28 class SubversionServerCreator(object):
@@ -35,7 +35,7 b' class SubversionServerCreator(object):'
35 }
35 }
36 }
36 }
37 repo_name = 'test-svn'
37 repo_name = 'test-svn'
38 user = dummy_user()
38 user = plain_dummy_user()
39
39
40 def __init__(self):
40 def __init__(self):
41 def config_get(part, key):
41 def config_get(part, key):
@@ -53,7 +53,7 b' class SubversionServerCreator(object):'
53 self.repo_name: 'repository.admin'
53 self.repo_name: 'repository.admin'
54 },
54 },
55 'config': self.config_mock,
55 'config': self.config_mock,
56 'env': dummy_env()
56 'env': plain_dummy_env()
57 }
57 }
58
58
59 parameters.update(kwargs)
59 parameters.update(kwargs)
@@ -28,7 +28,7 b' class TestSSHWrapper(object):'
28 ssh_wrapper.serve(
28 ssh_wrapper.serve(
29 vcs='microsoft-tfs', repo='test-repo', mode=None, user='test',
29 vcs='microsoft-tfs', repo='test-repo', mode=None, user='test',
30 permissions={}, branch_permissions={})
30 permissions={}, branch_permissions={})
31 assert exc_info.value.message == 'Unrecognised VCS: microsoft-tfs'
31 assert str(exc_info.value) == 'Unrecognised VCS: microsoft-tfs'
32
32
33 def test_parse_config(self, ssh_wrapper):
33 def test_parse_config(self, ssh_wrapper):
34 config = ssh_wrapper.parse_config(ssh_wrapper.ini_path)
34 config = ssh_wrapper.parse_config(ssh_wrapper.ini_path)
@@ -40,8 +40,8 b' from rhodecode.apps._base import UserGro'
40 from rhodecode.lib.auth import (
40 from rhodecode.lib.auth import (
41 LoginRequired, HasUserGroupPermissionAnyDecorator, CSRFRequired)
41 LoginRequired, HasUserGroupPermissionAnyDecorator, CSRFRequired)
42 from rhodecode.lib import helpers as h, audit_logger
42 from rhodecode.lib import helpers as h, audit_logger
43 from rhodecode.lib.utils2 import str2bool
43 from rhodecode.lib.utils2 import str2bool, safe_int
44 from rhodecode.model.db import User
44 from rhodecode.model.db import User, UserGroup
45 from rhodecode.model.meta import Session
45 from rhodecode.model.meta import Session
46 from rhodecode.model.user_group import UserGroupModel
46 from rhodecode.model.user_group import UserGroupModel
47
47
@@ -377,6 +377,11 b' class UserGroupsView(UserGroupAppView):'
377 for change in changes['added'] + changes['updated'] + changes['deleted']:
377 for change in changes['added'] + changes['updated'] + changes['deleted']:
378 if change['type'] == 'user':
378 if change['type'] == 'user':
379 affected_user_ids.append(change['id'])
379 affected_user_ids.append(change['id'])
380 if change['type'] == 'user_group':
381 user_group = UserGroup.get(safe_int(change['id']))
382 if user_group:
383 group_members_ids = [x.user_id for x in user_group.members]
384 affected_user_ids.extend(group_members_ids)
380
385
381 events.trigger(events.UserPermissionsChange(affected_user_ids))
386 events.trigger(events.UserPermissionsChange(affected_user_ids))
382
387
@@ -241,16 +241,16 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
241 log.debug('Empty username or password skipping...')
241 log.debug('Empty username or password skipping...')
242 return None
242 return None
243
243
244 log.debug("Crowd settings: \n%s" % (formatted_json(settings)))
244 log.debug("Crowd settings: \n%s", formatted_json(settings))
245 server = CrowdServer(**settings)
245 server = CrowdServer(**settings)
246 server.set_credentials(settings["app_name"], settings["app_password"])
246 server.set_credentials(settings["app_name"], settings["app_password"])
247 crowd_user = server.user_auth(username, password)
247 crowd_user = server.user_auth(username, password)
248 log.debug("Crowd returned: \n%s" % (formatted_json(crowd_user)))
248 log.debug("Crowd returned: \n%s", formatted_json(crowd_user))
249 if not crowd_user["status"]:
249 if not crowd_user["status"]:
250 return None
250 return None
251
251
252 res = server.user_groups(crowd_user["name"])
252 res = server.user_groups(crowd_user["name"])
253 log.debug("Crowd groups: \n%s" % (formatted_json(res)))
253 log.debug("Crowd groups: \n%s", formatted_json(res))
254 crowd_user["groups"] = [x["name"] for x in res["groups"]]
254 crowd_user["groups"] = [x["name"] for x in res["groups"]]
255
255
256 # old attrs fetched from RhodeCode database
256 # old attrs fetched from RhodeCode database
@@ -280,6 +280,6 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
280 for group in settings["admin_groups"]:
280 for group in settings["admin_groups"]:
281 if group in user_attrs["groups"]:
281 if group in user_attrs["groups"]:
282 user_attrs["admin"] = True
282 user_attrs["admin"] = True
283 log.debug("Final crowd user object: \n%s" % (formatted_json(user_attrs)))
283 log.debug("Final crowd user object: \n%s", formatted_json(user_attrs))
284 log.info('user `%s` authenticated correctly' % user_attrs['username'])
284 log.info('user `%s` authenticated correctly', user_attrs['username'])
285 return user_attrs
285 return user_attrs
@@ -125,24 +125,24 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
125 username = None
125 username = None
126 environ = environ or {}
126 environ = environ or {}
127 if not environ:
127 if not environ:
128 log.debug('got empty environ: %s' % environ)
128 log.debug('got empty environ: %s', environ)
129
129
130 settings = settings or {}
130 settings = settings or {}
131 if settings.get('header'):
131 if settings.get('header'):
132 header = settings.get('header')
132 header = settings.get('header')
133 username = environ.get(header)
133 username = environ.get(header)
134 log.debug('extracted %s:%s' % (header, username))
134 log.debug('extracted %s:%s', header, username)
135
135
136 # fallback mode
136 # fallback mode
137 if not username and settings.get('fallback_header'):
137 if not username and settings.get('fallback_header'):
138 header = settings.get('fallback_header')
138 header = settings.get('fallback_header')
139 username = environ.get(header)
139 username = environ.get(header)
140 log.debug('extracted %s:%s' % (header, username))
140 log.debug('extracted %s:%s', header, username)
141
141
142 if username and str2bool(settings.get('clean_username')):
142 if username and str2bool(settings.get('clean_username')):
143 log.debug('Received username `%s` from headers' % username)
143 log.debug('Received username `%s` from headers', username)
144 username = self._clean_username(username)
144 username = self._clean_username(username)
145 log.debug('New cleanup user is:%s' % username)
145 log.debug('New cleanup user is:%s', username)
146 return username
146 return username
147
147
148 def get_user(self, username=None, **kwargs):
148 def get_user(self, username=None, **kwargs):
@@ -221,5 +221,5 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
221 'extern_type': extern_type,
221 'extern_type': extern_type,
222 }
222 }
223
223
224 log.info('user `%s` authenticated correctly' % user_attrs['username'])
224 log.info('user `%s` authenticated correctly', user_attrs['username'])
225 return user_attrs
225 return user_attrs
@@ -134,10 +134,10 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
134 try:
134 try:
135 response = urllib2.urlopen(request)
135 response = urllib2.urlopen(request)
136 except urllib2.HTTPError as e:
136 except urllib2.HTTPError as e:
137 log.debug("HTTPError when requesting Jasig CAS (status code: %d)" % e.code)
137 log.debug("HTTPError when requesting Jasig CAS (status code: %d)", e.code)
138 return None
138 return None
139 except urllib2.URLError as e:
139 except urllib2.URLError as e:
140 log.debug("URLError when requesting Jasig CAS url: %s " % url)
140 log.debug("URLError when requesting Jasig CAS url: %s ", url)
141 return None
141 return None
142
142
143 # old attrs fetched from RhodeCode database
143 # old attrs fetched from RhodeCode database
@@ -163,5 +163,5 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
163 'extern_type': extern_type,
163 'extern_type': extern_type,
164 }
164 }
165
165
166 log.info('user `%s` authenticated correctly' % user_attrs['username'])
166 log.info('user `%s` authenticated correctly', user_attrs['username'])
167 return user_attrs
167 return user_attrs
@@ -115,10 +115,10 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
115 auth_result = _pam.authenticate(username, password, settings["service"])
115 auth_result = _pam.authenticate(username, password, settings["service"])
116
116
117 if not auth_result:
117 if not auth_result:
118 log.error("PAM was unable to authenticate user: %s" % (username, ))
118 log.error("PAM was unable to authenticate user: %s", username)
119 return None
119 return None
120
120
121 log.debug('Got PAM response %s' % (auth_result, ))
121 log.debug('Got PAM response %s', auth_result)
122
122
123 # old attrs fetched from RhodeCode database
123 # old attrs fetched from RhodeCode database
124 default_email = "%s@%s" % (username, socket.gethostname())
124 default_email = "%s@%s" % (username, socket.gethostname())
@@ -157,5 +157,5 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
157 pass
157 pass
158
158
159 log.debug("pamuser: %s", user_attrs)
159 log.debug("pamuser: %s", user_attrs)
160 log.info('user `%s` authenticated correctly' % user_attrs['username'])
160 log.info('user `%s` authenticated correctly', user_attrs['username'])
161 return user_attrs
161 return user_attrs
@@ -87,12 +87,12 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
87
87
88 def auth(self, userobj, username, password, settings, **kwargs):
88 def auth(self, userobj, username, password, settings, **kwargs):
89 if not userobj:
89 if not userobj:
90 log.debug('userobj was:%s skipping' % (userobj, ))
90 log.debug('userobj was:%s skipping', userobj)
91 return None
91 return None
92 if userobj.extern_type != self.name:
92 if userobj.extern_type != self.name:
93 log.warning(
93 log.warning(
94 "userobj:%s extern_type mismatch got:`%s` expected:`%s`" %
94 "userobj:%s extern_type mismatch got:`%s` expected:`%s`",
95 (userobj, userobj.extern_type, self.name))
95 userobj, userobj.extern_type, self.name)
96 return None
96 return None
97
97
98 user_attrs = {
98 user_attrs = {
@@ -109,7 +109,7 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
109 "extern_type": userobj.extern_type,
109 "extern_type": userobj.extern_type,
110 }
110 }
111
111
112 log.debug("User attributes:%s" % (user_attrs, ))
112 log.debug("User attributes:%s", user_attrs)
113 if userobj.active:
113 if userobj.active:
114 from rhodecode.lib import auth
114 from rhodecode.lib import auth
115 crypto_backend = auth.crypto_backend()
115 crypto_backend = auth.crypto_backend()
@@ -103,7 +103,7 b' class RhodeCodeAuthPlugin(RhodeCodeAuthP'
103
103
104 def auth(self, userobj, username, password, settings, **kwargs):
104 def auth(self, userobj, username, password, settings, **kwargs):
105 if not userobj:
105 if not userobj:
106 log.debug('userobj was:%s skipping' % (userobj, ))
106 log.debug('userobj was:%s skipping', userobj)
107 return None
107 return None
108
108
109 user_attrs = {
109 user_attrs = {
This diff has been collapsed as it changes many lines, (2270 lines changed) Show them Hide them
@@ -1,369 +1,1901 b''
1 {
1 [
2 "libnghttp2-1.7.1": {
2 {
3 "MIT License": "http://spdx.org/licenses/MIT"
3 "license": [
4 },
4 {
5 "nodejs-4.3.1": {
5 "fullName": "Python Software Foundation License version 2",
6 "MIT License": "http://spdx.org/licenses/MIT"
6 "shortName": "psfl",
7 },
7 "spdxId": "Python-2.0",
8 "python-2.7.12": {
8 "url": "http://spdx.org/licenses/Python-2.0.html"
9 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
9 },
10 },
10 {
11 "python2.7-Babel-1.3": {
11 "fullName": "Zope Public License 2.0",
12 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
12 "shortName": "zpl20",
13 },
13 "spdxId": "ZPL-2.0",
14 "python2.7-Beaker-1.7.0": {
14 "url": "http://spdx.org/licenses/ZPL-2.0.html"
15 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
15 }
16 },
16 ],
17 "python2.7-Chameleon-2.24": {
17 "name": "python2.7-setuptools-38.4.0"
18 "BSD-like": "http://repoze.org/license.html"
18 },
19 },
19 {
20 "python2.7-FormEncode-1.2.4": {
20 "license": {
21 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
21 "fullName": "Python Software Foundation License version 2",
22 },
22 "shortName": "psfl",
23 "python2.7-Jinja2-2.7.3": {
23 "spdxId": "Python-2.0",
24 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
24 "url": "http://spdx.org/licenses/Python-2.0.html"
25 },
25 },
26 "python2.7-Mako-1.0.6": {
26 "name": "python-2.7.15"
27 "MIT License": "http://spdx.org/licenses/MIT"
27 },
28 },
28 {
29 "python2.7-Markdown-2.6.7": {
29 "license": [
30 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
30 {
31 },
31 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
32 "python2.7-MarkupSafe-0.23": {
32 "shortName": "bsdOriginal",
33 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
33 "spdxId": "BSD-4-Clause",
34 },
34 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
35 "python2.7-Paste-2.0.3": {
35 }
36 "MIT License": "http://spdx.org/licenses/MIT"
36 ],
37 },
37 "name": "python2.7-coverage-3.7.1"
38 "python2.7-PasteDeploy-1.5.2": {
38 },
39 "MIT License": "http://spdx.org/licenses/MIT"
39 {
40 },
40 "license": [
41 "python2.7-PasteScript-1.7.5": {
41 {
42 "MIT License": "http://spdx.org/licenses/MIT"
42 "fullName": "MIT License",
43 },
43 "shortName": "mit",
44 "python2.7-Pygments-2.2.0": {
44 "spdxId": "MIT",
45 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
45 "url": "http://spdx.org/licenses/MIT.html"
46 },
46 }
47 "python2.7-Routes-1.13": {
47 ],
48 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
48 "name": "python2.7-bootstrapped-pip-9.0.1"
49 },
49 },
50 "python2.7-SQLAlchemy-0.9.9": {
50 {
51 "MIT License": "http://spdx.org/licenses/MIT"
51 "license": [
52 },
52 {
53 "python2.7-Tempita-0.5.2": {
53 "fullName": "MIT License",
54 "MIT License": "http://spdx.org/licenses/MIT"
54 "shortName": "mit",
55 },
55 "spdxId": "MIT",
56 "python2.7-URLObject-2.4.0": {
56 "url": "http://spdx.org/licenses/MIT.html"
57 "The Unlicense": "http://unlicense.org/"
57 }
58 },
58 ],
59 "python2.7-WebError-0.10.3": {
59 "name": "python2.7-cov-core-1.15.0"
60 "MIT License": "http://spdx.org/licenses/MIT"
60 },
61 },
61 {
62 "python2.7-WebHelpers-1.3": {
62 "license": [
63 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
63 {
64 },
64 "fullName": "MIT License",
65 "python2.7-WebHelpers2-2.0": {
65 "shortName": "mit",
66 "MIT License": "http://spdx.org/licenses/MIT"
66 "spdxId": "MIT",
67 },
67 "url": "http://spdx.org/licenses/MIT.html"
68 "python2.7-WebOb-1.3.1": {
68 }
69 "MIT License": "http://spdx.org/licenses/MIT"
69 ],
70 },
70 "name": "python2.7-webtest-2.0.29"
71 "python2.7-Whoosh-2.7.4": {
71 },
72 "BSD 2-clause \"Simplified\" License": "http://spdx.org/licenses/BSD-2-Clause",
72 {
73 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
73 "license": [
74 },
74 {
75 "python2.7-alembic-0.8.4": {
75 "fullName": "MIT License",
76 "MIT License": "http://spdx.org/licenses/MIT"
76 "shortName": "mit",
77 },
77 "spdxId": "MIT",
78 "python2.7-appenlight-client-0.6.14": {
78 "url": "http://spdx.org/licenses/MIT.html"
79 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
79 }
80 },
80 ],
81 "python2.7-authomatic-0.1.0.post1": {
81 "name": "python2.7-beautifulsoup4-4.6.3"
82 "MIT License": "http://spdx.org/licenses/MIT"
82 },
83 },
83 {
84 "python2.7-backports.shutil-get-terminal-size-1.0.0": {
84 "license": [
85 "MIT License": "http://spdx.org/licenses/MIT"
85 {
86 },
86 "fullName": "Zope Public License 2.1",
87 "python2.7-bleach-1.5.0": {
87 "shortName": "zpl21",
88 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
88 "spdxId": "ZPL-2.1",
89 },
89 "url": "http://spdx.org/licenses/ZPL-2.1.html"
90 "python2.7-celery-2.2.10": {
90 }
91 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
91 ],
92 },
92 "name": "python2.7-waitress-1.1.0"
93 "python2.7-channelstream-0.5.2": {
93 },
94 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
94 {
95 },
95 "license": [
96 "python2.7-click-5.1": {
96 {
97 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
97 "fullName": "MIT License",
98 },
98 "shortName": "mit",
99 "python2.7-colander-1.2": {
99 "spdxId": "MIT",
100 "Repoze License": "http://www.repoze.org/LICENSE.txt"
100 "url": "http://spdx.org/licenses/MIT.html"
101 },
101 }
102 "python2.7-configobj-5.0.6": {
102 ],
103 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
103 "name": "python2.7-webob-1.7.4"
104 },
104 },
105 "python2.7-configparser-3.5.0": {
105 {
106 "MIT License": "http://spdx.org/licenses/MIT"
106 "license": [
107 },
107 {
108 "python2.7-cssselect-1.0.1": {
108 "fullName": "MIT License",
109 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
109 "shortName": "mit",
110 },
110 "spdxId": "MIT",
111 "python2.7-decorator-4.0.11": {
111 "url": "http://spdx.org/licenses/MIT.html"
112 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
112 }
113 },
113 ],
114 "python2.7-deform-2.0a2": {
114 "name": "python2.7-six-1.11.0"
115 "BSD-derived": "http://www.repoze.org/LICENSE.txt"
115 },
116 },
116 {
117 "python2.7-docutils-0.12": {
117 "license": [
118 "BSD 2-clause \"Simplified\" License": "http://spdx.org/licenses/BSD-2-Clause"
118 {
119 },
119 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
120 "python2.7-dogpile.cache-0.6.1": {
120 "shortName": "bsdOriginal",
121 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
121 "spdxId": "BSD-4-Clause",
122 },
122 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
123 "python2.7-dogpile.core-0.4.1": {
123 }
124 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
124 ],
125 },
125 "name": "python2.7-mock-1.0.1"
126 "python2.7-elasticsearch-2.3.0": {
126 },
127 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
127 {
128 },
128 "license": [
129 "python2.7-elasticsearch-dsl-2.2.0": {
129 {
130 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
130 "fullName": "MIT License",
131 },
131 "shortName": "mit",
132 "python2.7-entrypoints-0.2.2": {
132 "spdxId": "MIT",
133 "MIT License": "http://spdx.org/licenses/MIT"
133 "url": "http://spdx.org/licenses/MIT.html"
134 },
134 },
135 "python2.7-enum34-1.1.6": {
135 {
136 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
136 "fullName": "DFSG approved"
137 },
137 }
138 "python2.7-functools32-3.2.3.post2": {
138 ],
139 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
139 "name": "python2.7-pytest-timeout-1.2.1"
140 },
140 },
141 "python2.7-future-0.14.3": {
141 {
142 "MIT License": "http://spdx.org/licenses/MIT"
142 "license": [
143 },
143 {
144 "python2.7-futures-3.0.2": {
144 "fullName": "MIT License",
145 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
145 "shortName": "mit",
146 },
146 "spdxId": "MIT",
147 "python2.7-gevent-1.1.2": {
147 "url": "http://spdx.org/licenses/MIT.html"
148 "MIT License": "http://spdx.org/licenses/MIT"
148 }
149 },
149 ],
150 "python2.7-gnureadline-6.3.3": {
150 "name": "python2.7-pytest-3.6.0"
151 "GNU General Public License v1.0 only": "http://spdx.org/licenses/GPL-1.0"
151 },
152 },
152 {
153 "python2.7-gprof2dot-2016.10.13": {
153 "license": [
154 "GNU Lesser General Public License v3.0 or later": "http://spdx.org/licenses/LGPL-3.0+"
154 {
155 },
155 "fullName": "ASL"
156 "python2.7-greenlet-0.4.10": {
156 },
157 "MIT License": "http://spdx.org/licenses/MIT"
157 {
158 },
158 "fullName": "Apache License 2.0",
159 "python2.7-gunicorn-19.6.0": {
159 "shortName": "asl20",
160 "MIT License": "http://spdx.org/licenses/MIT"
160 "spdxId": "Apache-2.0",
161 },
161 "url": "http://spdx.org/licenses/Apache-2.0.html"
162 "python2.7-html5lib-0.9999999": {
162 }
163 "MIT License": "http://spdx.org/licenses/MIT"
163 ],
164 },
164 "name": "python2.7-funcsigs-1.0.2"
165 "python2.7-infrae.cache-1.0.1": {
165 },
166 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
166 {
167 },
167 "license": [
168 "python2.7-ipython-5.1.0": {
168 {
169 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
169 "fullName": "MIT License",
170 },
170 "shortName": "mit",
171 "python2.7-ipython-genutils-0.2.0": {
171 "spdxId": "MIT",
172 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
172 "url": "http://spdx.org/licenses/MIT.html"
173 },
173 }
174 "python2.7-iso8601-0.1.11": {
174 ],
175 "MIT License": "http://spdx.org/licenses/MIT"
175 "name": "python2.7-pluggy-0.6.0"
176 },
176 },
177 "python2.7-itsdangerous-0.24": {
177 {
178 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
178 "license": [
179 },
179 {
180 "python2.7-jsonschema-2.6.0": {
180 "fullName": "MIT License",
181 "MIT License": "http://spdx.org/licenses/MIT"
181 "shortName": "mit",
182 },
182 "spdxId": "MIT",
183 "python2.7-jupyter-client-5.0.0": {
183 "url": "http://spdx.org/licenses/MIT.html"
184 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
184 }
185 },
185 ],
186 "python2.7-jupyter-core-4.3.0": {
186 "name": "python2.7-atomicwrites-1.1.5"
187 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
187 },
188 },
188 {
189 "python2.7-kombu-4.1.0": {
189 "license": [
190 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
190 {
191 },
191 "fullName": "MIT License",
192 "python2.7-mistune-0.7.4": {
192 "shortName": "mit",
193 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
193 "spdxId": "MIT",
194 },
194 "url": "http://spdx.org/licenses/MIT.html"
195 "python2.7-msgpack-python-0.4.8": {
195 }
196 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
196 ],
197 },
197 "name": "python2.7-more-itertools-4.3.0"
198 "python2.7-nbconvert-5.1.1": {
198 },
199 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
199 {
200 },
200 "license": [
201 "python2.7-nbformat-4.3.0": {
201 {
202 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
202 "fullName": "MIT License",
203 },
203 "shortName": "mit",
204 "python2.7-packaging-15.2": {
204 "spdxId": "MIT",
205 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
205 "url": "http://spdx.org/licenses/MIT.html"
206 },
206 }
207 "python2.7-pandocfilters-1.4.1": {
207 ],
208 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
208 "name": "python2.7-attrs-18.1.0"
209 },
209 },
210 "python2.7-pathlib2-2.1.0": {
210 {
211 "MIT License": "http://spdx.org/licenses/MIT"
211 "license": [
212 },
212 {
213 "python2.7-peppercorn-0.5": {
213 "fullName": "MIT License",
214 "BSD-derived": "http://www.repoze.org/LICENSE.txt"
214 "shortName": "mit",
215 },
215 "spdxId": "MIT",
216 "python2.7-pexpect-4.2.1": {
216 "url": "http://spdx.org/licenses/MIT.html"
217 "ISC License": "http://spdx.org/licenses/ISC"
217 }
218 },
218 ],
219 "python2.7-pickleshare-0.7.4": {
219 "name": "python2.7-py-1.5.3"
220 "MIT License": "http://spdx.org/licenses/MIT"
220 },
221 },
221 {
222 "python2.7-prompt-toolkit-1.0.14": {
222 "license": [
223 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
223 {
224 },
224 "fullName": "GNU Lesser General Public License v3 or later (LGPLv3+)"
225 "python2.7-psutil-4.3.1": {
225 },
226 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
226 {
227 },
227 "fullName": "LGPL"
228 "python2.7-psycopg2-2.6.1": {
228 }
229 "GNU Lesser General Public License v3.0 or later": "http://spdx.org/licenses/LGPL-3.0+"
229 ],
230 },
230 "name": "python2.7-gprof2dot-2017.9.19"
231 "python2.7-ptyprocess-0.5.1": {
231 },
232 "ISC License": "http://opensource.org/licenses/ISC"
232 {
233 },
233 "license": [
234 "python2.7-py-1.4.31": {
234 {
235 "MIT License": "http://spdx.org/licenses/MIT"
235 "fullName": "MIT License",
236 },
236 "shortName": "mit",
237 "python2.7-py-bcrypt-0.4": {
237 "spdxId": "MIT",
238 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
238 "url": "http://spdx.org/licenses/MIT.html"
239 },
239 }
240 "python2.7-py-gfm-0.1.3.rhodecode-upstream1": {
240 ],
241 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
241 "name": "python2.7-pytest-profiling-1.3.0"
242 },
242 },
243 "python2.7-pycrypto-2.6.1": {
243 {
244 "Public Domain": null
244 "license": [
245 },
245 {
246 "python2.7-pycurl-7.19.5": {
246 "fullName": "MIT License",
247 "MIT License": "http://spdx.org/licenses/MIT"
247 "shortName": "mit",
248 },
248 "spdxId": "MIT",
249 "python2.7-pygments-markdown-lexer-0.1.0.dev39": {
249 "url": "http://spdx.org/licenses/MIT.html"
250 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
250 }
251 },
251 ],
252 "python2.7-pyparsing-1.5.7": {
252 "name": "python2.7-pytest-runner-4.2"
253 "MIT License": "http://spdx.org/licenses/MIT"
253 },
254 },
254 {
255 "python2.7-pyramid-1.7.4": {
255 "license": [
256 "Repoze License": "http://www.repoze.org/LICENSE.txt"
256 {
257 },
257 "fullName": "MIT License",
258 "python2.7-pyramid-beaker-0.8": {
258 "shortName": "mit",
259 "Repoze License": "http://www.repoze.org/LICENSE.txt"
259 "spdxId": "MIT",
260 },
260 "url": "http://spdx.org/licenses/MIT.html"
261 "python2.7-pyramid-debugtoolbar-3.0.5": {
261 }
262 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause",
262 ],
263 "Repoze License": "http://www.repoze.org/LICENSE.txt"
263 "name": "python2.7-setuptools-scm-2.1.0"
264 },
264 },
265 "python2.7-pyramid-jinja2-2.5": {
265 {
266 "BSD-derived": "http://www.repoze.org/LICENSE.txt"
266 "license": [
267 },
267 {
268 "python2.7-pyramid-mako-1.0.2": {
268 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
269 "Repoze License": "http://www.repoze.org/LICENSE.txt"
269 "shortName": "bsdOriginal",
270 },
270 "spdxId": "BSD-4-Clause",
271 "python2.7-pysqlite-2.6.3": {
271 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
272 "libpng License": "http://spdx.org/licenses/Libpng",
272 }
273 "zlib License": "http://spdx.org/licenses/Zlib"
273 ],
274 },
274 "name": "python2.7-pytest-sugar-0.9.1"
275 "python2.7-pytest-3.0.5": {
275 },
276 "MIT License": "http://spdx.org/licenses/MIT"
276 {
277 },
277 "license": [
278 "python2.7-pytest-profiling-1.2.2": {
278 {
279 "MIT License": "http://spdx.org/licenses/MIT"
279 "fullName": "MIT License",
280 },
280 "shortName": "mit",
281 "python2.7-pytest-runner-2.9": {
281 "spdxId": "MIT",
282 "MIT License": "http://spdx.org/licenses/MIT"
282 "url": "http://spdx.org/licenses/MIT.html"
283 },
283 }
284 "python2.7-pytest-sugar-0.7.1": {
284 ],
285 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
285 "name": "python2.7-termcolor-1.1.0"
286 },
286 },
287 "python2.7-pytest-timeout-1.2.0": {
287 {
288 "MIT License": "http://spdx.org/licenses/MIT"
288 "license": [
289 },
289 {
290 "python2.7-python-dateutil-2.1": {
290 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
291 "Simplified BSD": null
291 "shortName": "bsdOriginal",
292 },
292 "spdxId": "BSD-4-Clause",
293 "python2.7-python-editor-1.0.3": {
293 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
294 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
294 },
295 },
295 {
296 "python2.7-python-ldap-2.4.19": {
296 "fullName": "MIT License",
297 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
297 "shortName": "mit",
298 },
298 "spdxId": "MIT",
299 "python2.7-python-memcached-1.57": {
299 "url": "http://spdx.org/licenses/MIT.html"
300 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
300 }
301 },
301 ],
302 "python2.7-pytz-2015.4": {
302 "name": "python2.7-pytest-cov-2.5.1"
303 "MIT License": "http://spdx.org/licenses/MIT"
303 },
304 },
304 {
305 "python2.7-pyzmq-14.6.0": {
305 "license": [
306 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
306 {
307 },
307 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
308 "python2.7-repoze.lru-0.6": {
308 "shortName": "bsdOriginal",
309 "Repoze License": "http://www.repoze.org/LICENSE.txt"
309 "spdxId": "BSD-4-Clause",
310 },
310 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
311 "python2.7-requests-2.9.1": {
311 }
312 "Apache License 2.0": "http://spdx.org/licenses/Apache-2.0"
312 ],
313 },
313 "name": "python2.7-appenlight-client-0.6.25"
314 "python2.7-setuptools-scm-1.15.6": {
314 },
315 "MIT License": "http://spdx.org/licenses/MIT"
315 {
316 },
316 "license": [
317 "python2.7-simplegeneric-0.8.1": {
317 {
318 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
318 "fullName": "Apache License 2.0",
319 },
319 "shortName": "asl20",
320 "python2.7-simplejson-3.7.2": {
320 "spdxId": "Apache-2.0",
321 "MIT License": "http://spdx.org/licenses/MIT"
321 "url": "http://spdx.org/licenses/Apache-2.0.html"
322 },
322 }
323 "python2.7-six-1.9.0": {
323 ],
324 "MIT License": "http://spdx.org/licenses/MIT"
324 "name": "python2.7-requests-2.9.1"
325 },
325 },
326 "python2.7-subprocess32-3.2.6": {
326 {
327 "Python Software Foundation License version 2": "http://spdx.org/licenses/Python-2.0"
327 "license": [
328 },
328 {
329 "python2.7-termcolor-1.1.0": {
329 "fullName": "AGPLv3 and Proprietary"
330 "MIT License": "http://spdx.org/licenses/MIT"
330 }
331 },
331 ],
332 "python2.7-testpath-0.1": {
332 "name": "python2.7-rhodecode-tools-0.16.0"
333 "MIT License": "http://spdx.org/licenses/MIT"
333 },
334 },
334 {
335 "python2.7-traitlets-4.3.2": {
335 "license": [
336 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
336 {
337 },
337 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
338 "python2.7-translationstring-1.3": {
338 "shortName": "bsdOriginal",
339 "Repoze License": "http://www.repoze.org/LICENSE.txt"
339 "spdxId": "BSD-4-Clause",
340 },
340 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
341 "python2.7-urllib3-1.16": {
341 },
342 "MIT License": "http://spdx.org/licenses/MIT"
342 {
343 },
343 "fullName": "BSD 2-clause \"Simplified\" License",
344 "python2.7-venusian-1.0": {
344 "shortName": "bsd2",
345 "Repoze License": "http://www.repoze.org/LICENSE.txt"
345 "spdxId": "BSD-2-Clause",
346 },
346 "url": "http://spdx.org/licenses/BSD-2-Clause.html"
347 "python2.7-waitress-1.0.1": {
347 }
348 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
348 ],
349 },
349 "name": "python2.7-whoosh-2.7.4"
350 "python2.7-wcwidth-0.1.7": {
350 },
351 "MIT License": "http://spdx.org/licenses/MIT"
351 {
352 },
352 "license": [
353 "python2.7-ws4py-0.3.5": {
353 {
354 "BSD 4-clause \"Original\" or \"Old\" License": "http://spdx.org/licenses/BSD-4-Clause"
354 "fullName": "MIT License",
355 },
355 "shortName": "mit",
356 "python2.7-zope.cachedescriptors-4.0.0": {
356 "spdxId": "MIT",
357 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
357 "url": "http://spdx.org/licenses/MIT.html"
358 },
358 }
359 "python2.7-zope.deprecation-4.1.2": {
359 ],
360 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
360 "name": "python2.7-urllib3-1.21"
361 },
361 },
362 "python2.7-zope.interface-4.1.3": {
362 {
363 "Zope Public License 2.1": "http://spdx.org/licenses/ZPL-2.1"
363 "license": [
364 },
364 {
365 "xz-5.2.2": {
365 "fullName": "Apache License 2.0",
366 "GNU General Public License v2.0 or later": "http://spdx.org/licenses/GPL-2.0+",
366 "shortName": "asl20",
367 "GNU Library General Public License v2.1 or later": "http://spdx.org/licenses/LGPL-2.1+"
367 "spdxId": "Apache-2.0",
368 }
368 "url": "http://spdx.org/licenses/Apache-2.0.html"
369 } No newline at end of file
369 }
370 ],
371 "name": "python2.7-elasticsearch-dsl-2.2.0"
372 },
373 {
374 "license": [
375 {
376 "fullName": "Apache License 2.0",
377 "shortName": "asl20",
378 "spdxId": "Apache-2.0",
379 "url": "http://spdx.org/licenses/Apache-2.0.html"
380 }
381 ],
382 "name": "python2.7-elasticsearch-2.3.0"
383 },
384 {
385 "license": [
386 {
387 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
388 "shortName": "bsdOriginal",
389 "spdxId": "BSD-4-Clause",
390 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
391 },
392 {
393 "fullName": "Apache License 2.0",
394 "shortName": "asl20",
395 "spdxId": "Apache-2.0",
396 "url": "http://spdx.org/licenses/Apache-2.0.html"
397 },
398 {
399 "fullName": "Dual License"
400 }
401 ],
402 "name": "python2.7-python-dateutil-2.7.3"
403 },
404 {
405 "license": [
406 {
407 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
408 "shortName": "bsdOriginal",
409 "spdxId": "BSD-4-Clause",
410 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
411 }
412 ],
413 "name": "python2.7-markupsafe-1.0"
414 },
415 {
416 "license": [
417 {
418 "fullName": "MIT License",
419 "shortName": "mit",
420 "spdxId": "MIT",
421 "url": "http://spdx.org/licenses/MIT.html"
422 }
423 ],
424 "name": "python2.7-mako-1.0.7"
425 },
426 {
427 "license": [
428 {
429 "fullName": "MIT License",
430 "shortName": "mit",
431 "spdxId": "MIT",
432 "url": "http://spdx.org/licenses/MIT.html"
433 }
434 ],
435 "name": "python2.7-future-0.14.3"
436 },
437 {
438 "license": [
439 {
440 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
441 "shortName": "bsdOriginal",
442 "spdxId": "BSD-4-Clause",
443 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
444 }
445 ],
446 "name": "python2.7-click-6.6"
447 },
448 {
449 "license": [
450 {
451 "fullName": "MIT License",
452 "shortName": "mit",
453 "spdxId": "MIT",
454 "url": "http://spdx.org/licenses/MIT.html"
455 }
456 ],
457 "name": "python2.7-bottle-0.12.13"
458 },
459 {
460 "license": [
461 {
462 "fullName": "MIT License",
463 "shortName": "mit",
464 "spdxId": "MIT",
465 "url": "http://spdx.org/licenses/MIT.html"
466 }
467 ],
468 "name": "python2.7-cprofilev-1.0.7"
469 },
470 {
471 "license": [
472 {
473 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
474 "shortName": "bsdOriginal",
475 "spdxId": "BSD-4-Clause",
476 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
477 }
478 ],
479 "name": "python2.7-ipython-5.1.0"
480 },
481 {
482 "license": [
483 {
484 "fullName": "GNU General Public License v3 (GPLv3)"
485 },
486 {
487 "fullName": "GNU General Public License v1.0 only",
488 "shortName": "gpl1",
489 "spdxId": "GPL-1.0",
490 "url": "http://spdx.org/licenses/GPL-1.0.html"
491 }
492 ],
493 "name": "python2.7-gnureadline-6.3.8"
494 },
495 {
496 "license": [
497 {
498 "fullName": "ISC License",
499 "shortName": "isc",
500 "spdxId": "ISC",
501 "url": "http://spdx.org/licenses/ISC.html"
502 },
503 {
504 "fullName": "ISC License (ISCL)"
505 }
506 ],
507 "name": "python2.7-pexpect-4.6.0"
508 },
509 {
510 "license": [],
511 "name": "python2.7-ptyprocess-0.6.0"
512 },
513 {
514 "license": [
515 {
516 "fullName": "MIT License",
517 "shortName": "mit",
518 "spdxId": "MIT",
519 "url": "http://spdx.org/licenses/MIT.html"
520 }
521 ],
522 "name": "python2.7-pathlib2-2.3.0"
523 },
524 {
525 "license": [
526 {
527 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
528 "shortName": "bsdOriginal",
529 "spdxId": "BSD-4-Clause",
530 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
531 },
532 {
533 "fullName": "New BSD License"
534 }
535 ],
536 "name": "python2.7-scandir-1.9.0"
537 },
538 {
539 "license": [
540 {
541 "fullName": "MIT License",
542 "shortName": "mit",
543 "spdxId": "MIT",
544 "url": "http://spdx.org/licenses/MIT.html"
545 }
546 ],
547 "name": "python2.7-backports.shutil-get-terminal-size-1.0.0"
548 },
549 {
550 "license": [
551 {
552 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
553 "shortName": "bsdOriginal",
554 "spdxId": "BSD-4-Clause",
555 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
556 }
557 ],
558 "name": "python2.7-pygments-2.2.0"
559 },
560 {
561 "license": [
562 {
563 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
564 "shortName": "bsdOriginal",
565 "spdxId": "BSD-4-Clause",
566 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
567 }
568 ],
569 "name": "python2.7-prompt-toolkit-1.0.15"
570 },
571 {
572 "license": [
573 {
574 "fullName": "MIT License",
575 "shortName": "mit",
576 "spdxId": "MIT",
577 "url": "http://spdx.org/licenses/MIT.html"
578 }
579 ],
580 "name": "python2.7-wcwidth-0.1.7"
581 },
582 {
583 "license": [
584 {
585 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
586 "shortName": "bsdOriginal",
587 "spdxId": "BSD-4-Clause",
588 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
589 }
590 ],
591 "name": "python2.7-traitlets-4.3.2"
592 },
593 {
594 "license": [
595 {
596 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
597 "shortName": "bsdOriginal",
598 "spdxId": "BSD-4-Clause",
599 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
600 }
601 ],
602 "name": "python2.7-enum34-1.1.6"
603 },
604 {
605 "license": [
606 {
607 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
608 "shortName": "bsdOriginal",
609 "spdxId": "BSD-4-Clause",
610 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
611 },
612 {
613 "fullName": "new BSD License"
614 }
615 ],
616 "name": "python2.7-decorator-4.1.2"
617 },
618 {
619 "license": [
620 {
621 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
622 "shortName": "bsdOriginal",
623 "spdxId": "BSD-4-Clause",
624 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
625 }
626 ],
627 "name": "python2.7-ipython-genutils-0.2.0"
628 },
629 {
630 "license": [
631 {
632 "fullName": "Zope Public License 2.1",
633 "shortName": "zpl21",
634 "spdxId": "ZPL-2.1",
635 "url": "http://spdx.org/licenses/ZPL-2.1.html"
636 }
637 ],
638 "name": "python2.7-simplegeneric-0.8.1"
639 },
640 {
641 "license": [
642 {
643 "fullName": "MIT License",
644 "shortName": "mit",
645 "spdxId": "MIT",
646 "url": "http://spdx.org/licenses/MIT.html"
647 }
648 ],
649 "name": "python2.7-pickleshare-0.7.4"
650 },
651 {
652 "license": [
653 {
654 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
655 "shortName": "bsdOriginal",
656 "spdxId": "BSD-4-Clause",
657 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
658 }
659 ],
660 "name": "python2.7-ipdb-0.11"
661 },
662 {
663 "license": [
664 {
665 "fullName": "MIT License",
666 "shortName": "mit",
667 "spdxId": "MIT",
668 "url": "http://spdx.org/licenses/MIT.html"
669 }
670 ],
671 "name": "python2.7-gunicorn-19.9.0"
672 },
673 {
674 "license": [
675 {
676 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
677 "shortName": "bsdOriginal",
678 "spdxId": "BSD-4-Clause",
679 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
680 }
681 ],
682 "name": "python2.7-futures-3.0.2"
683 },
684 {
685 "license": [
686 {
687 "fullName": "MIT License",
688 "shortName": "mit",
689 "spdxId": "MIT",
690 "url": "http://spdx.org/licenses/MIT.html"
691 }
692 ],
693 "name": "python2.7-greenlet-0.4.13"
694 },
695 {
696 "license": [
697 {
698 "fullName": "MIT License",
699 "shortName": "mit",
700 "spdxId": "MIT",
701 "url": "http://spdx.org/licenses/MIT.html"
702 }
703 ],
704 "name": "python2.7-gevent-1.3.5"
705 },
706 {
707 "license": [
708 {
709 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
710 "shortName": "bsdOriginal",
711 "spdxId": "BSD-4-Clause",
712 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
713 }
714 ],
715 "name": "python2.7-psutil-5.4.6"
716 },
717 {
718 "license": [
719 {
720 "fullName": "MIT License",
721 "shortName": "mit",
722 "spdxId": "MIT",
723 "url": "http://spdx.org/licenses/MIT.html"
724 }
725 ],
726 "name": "python2.7-bumpversion-0.5.3"
727 },
728 {
729 "license": [
730 {
731 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
732 "shortName": "bsdOriginal",
733 "spdxId": "BSD-4-Clause",
734 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
735 }
736 ],
737 "name": "python2.7-invoke-0.13.0"
738 },
739 {
740 "license": [
741 {
742 "fullName": "MIT License",
743 "shortName": "mit",
744 "spdxId": "MIT",
745 "url": "http://spdx.org/licenses/MIT.html"
746 }
747 ],
748 "name": "python2.7-alembic-0.9.9"
749 },
750 {
751 "license": {
752 "fullName": "Apache License 2.0",
753 "shortName": "asl20",
754 "spdxId": "Apache-2.0",
755 "url": "http://spdx.org/licenses/Apache-2.0.html"
756 },
757 "name": "python2.7-python-editor-1.0.3"
758 },
759 {
760 "license": [
761 {
762 "fullName": "MIT License",
763 "shortName": "mit",
764 "spdxId": "MIT",
765 "url": "http://spdx.org/licenses/MIT.html"
766 }
767 ],
768 "name": "python2.7-sqlalchemy-1.1.18"
769 },
770 {
771 "license": [
772 {
773 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
774 "shortName": "bsdOriginal",
775 "spdxId": "BSD-4-Clause",
776 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
777 }
778 ],
779 "name": "python2.7-jupyter-client-5.0.0"
780 },
781 {
782 "license": [
783 {
784 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
785 "shortName": "bsdOriginal",
786 "spdxId": "BSD-4-Clause",
787 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
788 },
789 {
790 "fullName": "LGPL+BSD"
791 },
792 {
793 "fullName": "GNU Library or Lesser General Public License (LGPL)"
794 }
795 ],
796 "name": "python2.7-pyzmq-14.6.0"
797 },
798 {
799 "license": [
800 {
801 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
802 "shortName": "bsdOriginal",
803 "spdxId": "BSD-4-Clause",
804 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
805 }
806 ],
807 "name": "python2.7-jupyter-core-4.4.0"
808 },
809 {
810 "license": [
811 {
812 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
813 "shortName": "bsdOriginal",
814 "spdxId": "BSD-4-Clause",
815 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
816 }
817 ],
818 "name": "python2.7-nbformat-4.4.0"
819 },
820 {
821 "license": [
822 {
823 "fullName": "MIT License",
824 "shortName": "mit",
825 "spdxId": "MIT",
826 "url": "http://spdx.org/licenses/MIT.html"
827 }
828 ],
829 "name": "python2.7-jsonschema-2.6.0"
830 },
831 {
832 "license": [
833 {
834 "fullName": "Python Software Foundation License version 2",
835 "shortName": "psfl",
836 "spdxId": "Python-2.0",
837 "url": "http://spdx.org/licenses/Python-2.0.html"
838 }
839 ],
840 "name": "python2.7-functools32-3.2.3.post2"
841 },
842 {
843 "license": [
844 {
845 "fullName": "Apache License 2.0",
846 "shortName": "asl20",
847 "spdxId": "Apache-2.0",
848 "url": "http://spdx.org/licenses/Apache-2.0.html"
849 }
850 ],
851 "name": "python2.7-bleach-2.1.4"
852 },
853 {
854 "license": [
855 {
856 "fullName": "MIT License",
857 "shortName": "mit",
858 "spdxId": "MIT",
859 "url": "http://spdx.org/licenses/MIT.html"
860 }
861 ],
862 "name": "python2.7-html5lib-1.0.1"
863 },
864 {
865 "license": [
866 {
867 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
868 "shortName": "bsdOriginal",
869 "spdxId": "BSD-4-Clause",
870 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
871 }
872 ],
873 "name": "python2.7-webencodings-0.5.1"
874 },
875 {
876 "license": [
877 {
878 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
879 "shortName": "bsdOriginal",
880 "spdxId": "BSD-4-Clause",
881 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
882 }
883 ],
884 "name": "python2.7-nbconvert-5.3.1"
885 },
886 {
887 "license": [
888 {
889 "fullName": "MIT License",
890 "shortName": "mit",
891 "spdxId": "MIT",
892 "url": "http://spdx.org/licenses/MIT.html"
893 }
894 ],
895 "name": "python2.7-testpath-0.3.1"
896 },
897 {
898 "license": [
899 {
900 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
901 "shortName": "bsdOriginal",
902 "spdxId": "BSD-4-Clause",
903 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
904 }
905 ],
906 "name": "python2.7-pandocfilters-1.4.2"
907 },
908 {
909 "license": [
910 {
911 "fullName": "MIT License",
912 "shortName": "mit",
913 "spdxId": "MIT",
914 "url": "http://spdx.org/licenses/MIT.html"
915 }
916 ],
917 "name": "python2.7-entrypoints-0.2.2"
918 },
919 {
920 "license": [
921 {
922 "fullName": "MIT License",
923 "shortName": "mit",
924 "spdxId": "MIT",
925 "url": "http://spdx.org/licenses/MIT.html"
926 }
927 ],
928 "name": "python2.7-configparser-3.5.0"
929 },
930 {
931 "license": [
932 {
933 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
934 "shortName": "bsdOriginal",
935 "spdxId": "BSD-4-Clause",
936 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
937 }
938 ],
939 "name": "python2.7-jinja2-2.9.6"
940 },
941 {
942 "license": [
943 {
944 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
945 "shortName": "bsdOriginal",
946 "spdxId": "BSD-4-Clause",
947 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
948 }
949 ],
950 "name": "python2.7-mistune-0.8.3"
951 },
952 {
953 "license": [
954 {
955 "fullName": "Zope Public License 2.1",
956 "shortName": "zpl21",
957 "spdxId": "ZPL-2.1",
958 "url": "http://spdx.org/licenses/ZPL-2.1.html"
959 }
960 ],
961 "name": "python2.7-zope.interface-4.5.0"
962 },
963 {
964 "license": [
965 {
966 "fullName": "Zope Public License 2.1",
967 "shortName": "zpl21",
968 "spdxId": "ZPL-2.1",
969 "url": "http://spdx.org/licenses/ZPL-2.1.html"
970 }
971 ],
972 "name": "python2.7-zope.event-4.3.0"
973 },
974 {
975 "license": [
976 {
977 "fullName": "Zope Public License 2.1",
978 "shortName": "zpl21",
979 "spdxId": "ZPL-2.1",
980 "url": "http://spdx.org/licenses/ZPL-2.1.html"
981 }
982 ],
983 "name": "python2.7-zope.deprecation-4.3.0"
984 },
985 {
986 "license": [
987 {
988 "fullName": "Zope Public License 2.1",
989 "shortName": "zpl21",
990 "spdxId": "ZPL-2.1",
991 "url": "http://spdx.org/licenses/ZPL-2.1.html"
992 }
993 ],
994 "name": "python2.7-zope.cachedescriptors-4.3.1"
995 },
996 {
997 "license": [
998 {
999 "fullName": "PSF or ZPL"
1000 }
1001 ],
1002 "name": "python2.7-wsgiref-0.1.2"
1003 },
1004 {
1005 "license": [
1006 {
1007 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1008 "shortName": "bsdOriginal",
1009 "spdxId": "BSD-4-Clause",
1010 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1011 }
1012 ],
1013 "name": "python2.7-webhelpers-1.3"
1014 },
1015 {
1016 "license": [
1017 {
1018 "fullName": "MIT License",
1019 "shortName": "mit",
1020 "spdxId": "MIT",
1021 "url": "http://spdx.org/licenses/MIT.html"
1022 }
1023 ],
1024 "name": "python2.7-webhelpers2-2.0"
1025 },
1026 {
1027 "license": [
1028 {
1029 "fullName": "MIT License",
1030 "shortName": "mit",
1031 "spdxId": "MIT",
1032 "url": "http://spdx.org/licenses/MIT.html"
1033 }
1034 ],
1035 "name": "python2.7-weberror-0.10.3"
1036 },
1037 {
1038 "license": [
1039 {
1040 "fullName": "MIT License",
1041 "shortName": "mit",
1042 "spdxId": "MIT",
1043 "url": "http://spdx.org/licenses/MIT.html"
1044 }
1045 ],
1046 "name": "python2.7-paste-2.0.3"
1047 },
1048 {
1049 "license": [
1050 {
1051 "fullName": "MIT License",
1052 "shortName": "mit",
1053 "spdxId": "MIT",
1054 "url": "http://spdx.org/licenses/MIT.html"
1055 }
1056 ],
1057 "name": "python2.7-tempita-0.5.2"
1058 },
1059 {
1060 "license": {
1061 "fullName": "Repoze License",
1062 "url": "http://www.repoze.org/LICENSE.txt"
1063 },
1064 "name": "python2.7-venusian-1.1.0"
1065 },
1066 {
1067 "license": {
1068 "fullName": "The Unlicense",
1069 "spdxId": "Unlicense",
1070 "url": "http://unlicense.org/"
1071 },
1072 "name": "python2.7-urlobject-2.4.3"
1073 },
1074 {
1075 "license": [
1076 {
1077 "fullName": "Apache License 2.0",
1078 "shortName": "asl20",
1079 "spdxId": "Apache-2.0",
1080 "url": "http://spdx.org/licenses/Apache-2.0.html"
1081 }
1082 ],
1083 "name": "python2.7-trollius-1.0.4"
1084 },
1085 {
1086 "license": {
1087 "fullName": "Repoze License",
1088 "url": "http://www.repoze.org/LICENSE.txt"
1089 },
1090 "name": "python2.7-translationstring-1.3"
1091 },
1092 {
1093 "license": [
1094 {
1095 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1096 }
1097 ],
1098 "name": "python2.7-supervisor-3.3.4"
1099 },
1100 {
1101 "license": [
1102 {
1103 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1104 }
1105 ],
1106 "name": "python2.7-meld3-1.0.2"
1107 },
1108 {
1109 "license": [
1110 {
1111 "fullName": "Python Software Foundation License version 2",
1112 "shortName": "psfl",
1113 "spdxId": "Python-2.0",
1114 "url": "http://spdx.org/licenses/Python-2.0.html"
1115 }
1116 ],
1117 "name": "python2.7-subprocess32-3.5.1"
1118 },
1119 {
1120 "license": [
1121 {
1122 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1123 "shortName": "bsdOriginal",
1124 "spdxId": "BSD-4-Clause",
1125 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1126 }
1127 ],
1128 "name": "python2.7-sshpubkeys-2.2.0"
1129 },
1130 {
1131 "license": [
1132 {
1133 "fullName": "MIT License",
1134 "shortName": "mit",
1135 "spdxId": "MIT",
1136 "url": "http://spdx.org/licenses/MIT.html"
1137 }
1138 ],
1139 "name": "python2.7-ecdsa-0.13"
1140 },
1141 {
1142 "license": [
1143 {
1144 "fullName": "Public Domain",
1145 "shortName": "publicDomain"
1146 }
1147 ],
1148 "name": "python2.7-pycrypto-2.6.1"
1149 },
1150 {
1151 "license": [
1152 {
1153 "fullName": "Academic Free License (AFL)"
1154 },
1155 {
1156 "fullName": "MIT License",
1157 "shortName": "mit",
1158 "spdxId": "MIT",
1159 "url": "http://spdx.org/licenses/MIT.html"
1160 }
1161 ],
1162 "name": "python2.7-simplejson-3.11.1"
1163 },
1164 {
1165 "license": [
1166 {
1167 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1168 "shortName": "bsdOriginal",
1169 "spdxId": "BSD-4-Clause",
1170 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1171 }
1172 ],
1173 "name": "python2.7-setproctitle-1.1.10"
1174 },
1175 {
1176 "license": [
1177 {
1178 "fullName": "MIT License",
1179 "shortName": "mit",
1180 "spdxId": "MIT",
1181 "url": "http://spdx.org/licenses/MIT.html"
1182 }
1183 ],
1184 "name": "python2.7-routes-2.4.1"
1185 },
1186 {
1187 "license": {
1188 "fullName": "Repoze License",
1189 "url": "http://www.repoze.org/LICENSE.txt"
1190 },
1191 "name": "python2.7-repoze.lru-0.7"
1192 },
1193 {
1194 "license": [
1195 {
1196 "fullName": "MIT License",
1197 "shortName": "mit",
1198 "spdxId": "MIT",
1199 "url": "http://spdx.org/licenses/MIT.html"
1200 }
1201 ],
1202 "name": "python2.7-redis-2.10.6"
1203 },
1204 {
1205 "license": [
1206 {
1207 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1208 "shortName": "bsdOriginal",
1209 "spdxId": "BSD-4-Clause",
1210 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1211 }
1212 ],
1213 "name": "python2.7-py-gfm-0.1.3"
1214 },
1215 {
1216 "license": [
1217 {
1218 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1219 "shortName": "bsdOriginal",
1220 "spdxId": "BSD-4-Clause",
1221 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1222 }
1223 ],
1224 "name": "python2.7-markdown-2.6.11"
1225 },
1226 {
1227 "license": [
1228 {
1229 "fullName": "MIT License",
1230 "shortName": "mit",
1231 "spdxId": "MIT",
1232 "url": "http://spdx.org/licenses/MIT.html"
1233 }
1234 ],
1235 "name": "python2.7-tzlocal-1.5.1"
1236 },
1237 {
1238 "license": [
1239 {
1240 "fullName": "MIT License",
1241 "shortName": "mit",
1242 "spdxId": "MIT",
1243 "url": "http://spdx.org/licenses/MIT.html"
1244 }
1245 ],
1246 "name": "python2.7-pytz-2018.4"
1247 },
1248 {
1249 "license": [
1250 {
1251 "fullName": "License :: OSI Approved :: MIT License"
1252 },
1253 {
1254 "fullName": "MIT License",
1255 "shortName": "mit",
1256 "spdxId": "MIT",
1257 "url": "http://spdx.org/licenses/MIT.html"
1258 }
1259 ],
1260 "name": "python2.7-python-pam-1.8.4"
1261 },
1262 {
1263 "license": [
1264 {
1265 "fullName": "GNU General Public License v1.0 only",
1266 "shortName": "gpl1",
1267 "spdxId": "GPL-1.0",
1268 "url": "http://spdx.org/licenses/GPL-1.0.html"
1269 }
1270 ],
1271 "name": "linux-pam-1.3.0"
1272 },
1273 {
1274 "license": [
1275 {
1276 "fullName": "Python Software Foundation License version 2",
1277 "shortName": "psfl",
1278 "spdxId": "Python-2.0",
1279 "url": "http://spdx.org/licenses/Python-2.0.html"
1280 }
1281 ],
1282 "name": "python2.7-python-memcached-1.59"
1283 },
1284 {
1285 "license": [
1286 {
1287 "fullName": "Python Software Foundation License version 2",
1288 "shortName": "psfl",
1289 "spdxId": "Python-2.0",
1290 "url": "http://spdx.org/licenses/Python-2.0.html"
1291 }
1292 ],
1293 "name": "python2.7-python-ldap-3.1.0"
1294 },
1295 {
1296 "license": {
1297 "fullName": "MIT License",
1298 "shortName": "mit",
1299 "spdxId": "MIT",
1300 "url": "http://spdx.org/licenses/MIT.html"
1301 },
1302 "name": "libkrb5-1.15.2"
1303 },
1304 {
1305 "license":{
1306 "fullName": "BSD-derived (https://www.openldap.org/software/release/license.html)"
1307 },
1308 "name": "openldap-2.4.45"
1309 },
1310 {
1311 "license": [
1312 {
1313 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1314 "shortName": "bsdOriginal",
1315 "spdxId": "BSD-4-Clause",
1316 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1317 }
1318 ],
1319 "name": "python2.7-pyasn1-modules-0.2.2"
1320 },
1321 {
1322 "license": [
1323 {
1324 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1325 "shortName": "bsdOriginal",
1326 "spdxId": "BSD-4-Clause",
1327 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1328 }
1329 ],
1330 "name": "python2.7-pyasn1-0.4.4"
1331 },
1332 {
1333 "license": [
1334 {
1335 "fullName": "zlib License",
1336 "shortName": "zlib",
1337 "spdxId": "Zlib",
1338 "url": "http://spdx.org/licenses/Zlib.html"
1339 },
1340 {
1341 "fullName": "libpng License",
1342 "shortName": "libpng",
1343 "spdxId": "Libpng",
1344 "url": "http://spdx.org/licenses/Libpng.html"
1345 }
1346 ],
1347 "name": "python2.7-pysqlite-2.8.3"
1348 },
1349 {
1350 "license": {
1351 "fullName": "Repoze License",
1352 "url": "http://www.repoze.org/LICENSE.txt"
1353 },
1354 "name": "python2.7-pyramid-1.9.2"
1355 },
1356 {
1357 "license": [
1358 {
1359 "fullName": "MIT License",
1360 "shortName": "mit",
1361 "spdxId": "MIT",
1362 "url": "http://spdx.org/licenses/MIT.html"
1363 }
1364 ],
1365 "name": "python2.7-hupper-1.3"
1366 },
1367 {
1368 "license": [
1369 {
1370 "fullName": "MIT License",
1371 "shortName": "mit",
1372 "spdxId": "MIT",
1373 "url": "http://spdx.org/licenses/MIT.html"
1374 }
1375 ],
1376 "name": "python2.7-plaster-pastedeploy-0.6"
1377 },
1378 {
1379 "license": [
1380 {
1381 "fullName": "MIT License",
1382 "shortName": "mit",
1383 "spdxId": "MIT",
1384 "url": "http://spdx.org/licenses/MIT.html"
1385 }
1386 ],
1387 "name": "python2.7-plaster-1.0"
1388 },
1389 {
1390 "license": [
1391 {
1392 "fullName": "MIT License",
1393 "shortName": "mit",
1394 "spdxId": "MIT",
1395 "url": "http://spdx.org/licenses/MIT.html"
1396 }
1397 ],
1398 "name": "python2.7-pastedeploy-1.5.2"
1399 },
1400 {
1401 "license": {
1402 "fullName": "Repoze License",
1403 "url": "http://www.repoze.org/LICENSE.txt"
1404 },
1405 "name": "python2.7-pyramid-mako-1.0.2"
1406 },
1407 {
1408 "license": [
1409 {
1410 "fullName": "Repoze Public License"
1411 },
1412 {
1413 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1414 }
1415 ],
1416 "name": "python2.7-pyramid-jinja2-2.7"
1417 },
1418 {
1419 "license": [
1420 {
1421 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1422 "shortName": "bsdOriginal",
1423 "spdxId": "BSD-4-Clause",
1424 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1425 },
1426 {
1427 "fullName": "Repoze License",
1428 "url": "http://www.repoze.org/LICENSE.txt"
1429 }
1430 ],
1431 "name": "python2.7-pyramid-debugtoolbar-4.4"
1432 },
1433 {
1434 "license": [
1435 {
1436 "fullName": "Python Software Foundation License version 2",
1437 "shortName": "psfl",
1438 "spdxId": "Python-2.0",
1439 "url": "http://spdx.org/licenses/Python-2.0.html"
1440 }
1441 ],
1442 "name": "python2.7-ipaddress-1.0.22"
1443 },
1444 {
1445 "license": {
1446 "fullName": "Repoze License",
1447 "url": "http://www.repoze.org/LICENSE.txt"
1448 },
1449 "name": "python2.7-pyramid-beaker-0.8"
1450 },
1451 {
1452 "license": [
1453 {
1454 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1455 "shortName": "bsdOriginal",
1456 "spdxId": "BSD-4-Clause",
1457 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1458 }
1459 ],
1460 "name": "python2.7-beaker-1.9.1"
1461 },
1462 {
1463 "license": [
1464 {
1465 "fullName": "MIT License",
1466 "shortName": "mit",
1467 "spdxId": "MIT",
1468 "url": "http://spdx.org/licenses/MIT.html"
1469 }
1470 ],
1471 "name": "python2.7-pyparsing-1.5.7"
1472 },
1473 {
1474 "license": [
1475 {
1476 "fullName": "Apache License 2.0",
1477 "shortName": "asl20",
1478 "spdxId": "Apache-2.0",
1479 "url": "http://spdx.org/licenses/Apache-2.0.html"
1480 }
1481 ],
1482 "name": "python2.7-pygments-markdown-lexer-0.1.0.dev39"
1483 },
1484 {
1485 "license": [
1486 {
1487 "fullName": "MIT License",
1488 "shortName": "mit",
1489 "spdxId": "MIT",
1490 "url": "http://spdx.org/licenses/MIT.html"
1491 }
1492 ],
1493 "name": "python2.7-pyflakes-0.8.1"
1494 },
1495 {
1496 "license": {
1497 "fullName": "MIT License",
1498 "shortName": "mit",
1499 "spdxId": "MIT",
1500 "url": "http://spdx.org/licenses/MIT.html"
1501 },
1502 "name": "python2.7-pycurl-7.43.0.2"
1503 },
1504 {
1505 "license": [
1506 {
1507 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1508 "shortName": "bsdOriginal",
1509 "spdxId": "BSD-4-Clause",
1510 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1511 }
1512 ],
1513 "name": "python2.7-py-bcrypt-0.4"
1514 },
1515 {
1516 "license": {
1517 "fullName": "GNU Lesser General Public License v3.0 or later",
1518 "shortName": "lgpl3Plus",
1519 "spdxId": "LGPL-3.0+",
1520 "url": "http://spdx.org/licenses/LGPL-3.0+.html"
1521 },
1522 "name": "python2.7-psycopg2-2.7.4"
1523 },
1524 {
1525 "license": {
1526 "fullName": "PostgreSQL License",
1527 "shortName": "postgresql",
1528 "spdxId": "PostgreSQL",
1529 "url": "http://spdx.org/licenses/PostgreSQL.html"
1530 },
1531 "name": "postgresql-9.6.10"
1532 },
1533 {
1534 "license": [
1535 {
1536 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1537 }
1538 ],
1539 "name": "python2.7-peppercorn-0.5"
1540 },
1541 {
1542 "license": [
1543 {
1544 "fullName": "MIT License",
1545 "shortName": "mit",
1546 "spdxId": "MIT",
1547 "url": "http://spdx.org/licenses/MIT.html"
1548 }
1549 ],
1550 "name": "python2.7-pastescript-2.0.2"
1551 },
1552 {
1553 "license": [
1554 {
1555 "fullName": "Apache License 2.0",
1556 "shortName": "asl20",
1557 "spdxId": "Apache-2.0",
1558 "url": "http://spdx.org/licenses/Apache-2.0.html"
1559 }
1560 ],
1561 "name": "python2.7-packaging-15.2"
1562 },
1563 {
1564 "license": [
1565 {
1566 "fullName": "MIT License",
1567 "shortName": "mit",
1568 "spdxId": "MIT",
1569 "url": "http://spdx.org/licenses/MIT.html"
1570 }
1571 ],
1572 "name": "python2.7-objgraph-3.1.1"
1573 },
1574 {
1575 "license": [
1576 {
1577 "fullName": "MIT License",
1578 "shortName": "mit",
1579 "spdxId": "MIT",
1580 "url": "http://spdx.org/licenses/MIT.html"
1581 }
1582 ],
1583 "name": "python2.7-graphviz-0.9"
1584 },
1585 {
1586 "license": [
1587 {
1588 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1589 "shortName": "bsdOriginal",
1590 "spdxId": "BSD-4-Clause",
1591 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1592 }
1593 ],
1594 "name": "python2.7-pyotp-2.2.6"
1595 },
1596 {
1597 "license": [
1598 {
1599 "fullName": "MIT License",
1600 "shortName": "mit",
1601 "spdxId": "MIT",
1602 "url": "http://spdx.org/licenses/MIT.html"
1603 }
1604 ],
1605 "name": "python2.7-pymysql-0.8.1"
1606 },
1607 {
1608 "license": [
1609 {
1610 "fullName": "GNU General Public License v1.0 only",
1611 "shortName": "gpl1",
1612 "spdxId": "GPL-1.0",
1613 "url": "http://spdx.org/licenses/GPL-1.0.html"
1614 }
1615 ],
1616 "name": "python2.7-mysql-python-1.2.5"
1617 },
1618 {
1619 "license": {
1620 "fullName": "GNU Library General Public License v2.1 only",
1621 "shortName": "lgpl21",
1622 "spdxId": "LGPL-2.1",
1623 "url": "http://spdx.org/licenses/LGPL-2.1.html"
1624 },
1625 "name": "mariadb-connector-c-2.3.4"
1626 },
1627 {
1628 "license": [
1629 {
1630 "fullName": "Apache License 2.0",
1631 "shortName": "asl20",
1632 "spdxId": "Apache-2.0",
1633 "url": "http://spdx.org/licenses/Apache-2.0.html"
1634 }
1635 ],
1636 "name": "python2.7-msgpack-python-0.5.6"
1637 },
1638 {
1639 "license": [
1640 {
1641 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1642 "shortName": "bsdOriginal",
1643 "spdxId": "BSD-4-Clause",
1644 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1645 }
1646 ],
1647 "name": "python2.7-lxml-3.7.3"
1648 },
1649 {
1650 "license": [
1651 {
1652 "fullName": "MIT License",
1653 "shortName": "mit",
1654 "spdxId": "MIT",
1655 "url": "http://spdx.org/licenses/MIT.html"
1656 }
1657 ],
1658 "name": "python2.7-wheel-0.30.0"
1659 },
1660 {
1661 "license": [
1662 {
1663 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1664 "shortName": "bsdOriginal",
1665 "spdxId": "BSD-4-Clause",
1666 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1667 }
1668 ],
1669 "name": "python2.7-kombu-4.2.0"
1670 },
1671 {
1672 "license": [
1673 {
1674 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1675 "shortName": "bsdOriginal",
1676 "spdxId": "BSD-4-Clause",
1677 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1678 }
1679 ],
1680 "name": "python2.7-amqp-2.3.1"
1681 },
1682 {
1683 "license": [
1684 {
1685 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1686 "shortName": "bsdOriginal",
1687 "spdxId": "BSD-4-Clause",
1688 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1689 }
1690 ],
1691 "name": "python2.7-vine-1.1.4"
1692 },
1693 {
1694 "license": [
1695 {
1696 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1697 "shortName": "bsdOriginal",
1698 "spdxId": "BSD-4-Clause",
1699 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1700 }
1701 ],
1702 "name": "python2.7-billiard-3.5.0.3"
1703 },
1704 {
1705 "license": [
1706 {
1707 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1708 "shortName": "bsdOriginal",
1709 "spdxId": "BSD-4-Clause",
1710 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1711 }
1712 ],
1713 "name": "python2.7-itsdangerous-0.24"
1714 },
1715 {
1716 "license": [
1717 {
1718 "fullName": "MIT License",
1719 "shortName": "mit",
1720 "spdxId": "MIT",
1721 "url": "http://spdx.org/licenses/MIT.html"
1722 }
1723 ],
1724 "name": "python2.7-iso8601-0.1.11"
1725 },
1726 {
1727 "license": [
1728 {
1729 "fullName": "Zope Public License 2.1",
1730 "shortName": "zpl21",
1731 "spdxId": "ZPL-2.1",
1732 "url": "http://spdx.org/licenses/ZPL-2.1.html"
1733 }
1734 ],
1735 "name": "python2.7-infrae.cache-1.0.1"
1736 },
1737 {
1738 "license": [
1739 {
1740 "fullName": "Python Software Foundation License version 2",
1741 "shortName": "psfl",
1742 "spdxId": "Python-2.0",
1743 "url": "http://spdx.org/licenses/Python-2.0.html"
1744 }
1745 ],
1746 "name": "python2.7-formencode-1.2.4"
1747 },
1748 {
1749 "license": [
1750 {
1751 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1752 "shortName": "bsdOriginal",
1753 "spdxId": "BSD-4-Clause",
1754 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1755 }
1756 ],
1757 "name": "python2.7-dogpile.core-0.4.1"
1758 },
1759 {
1760 "license": [
1761 {
1762 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1763 "shortName": "bsdOriginal",
1764 "spdxId": "BSD-4-Clause",
1765 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1766 }
1767 ],
1768 "name": "python2.7-dogpile.cache-0.6.6"
1769 },
1770 {
1771 "license": {
1772 "fullName": "BSD 2-clause \"Simplified\" License",
1773 "shortName": "bsd2",
1774 "spdxId": "BSD-2-Clause",
1775 "url": "http://spdx.org/licenses/BSD-2-Clause.html"
1776 },
1777 "name": "python2.7-docutils-0.14"
1778 },
1779 {
1780 "license": [
1781 {
1782 "fullName": "BSD-derived (http://www.repoze.org/LICENSE.txt)"
1783 }
1784 ],
1785 "name": "python2.7-deform-2.0.5"
1786 },
1787 {
1788 "license": {
1789 "fullName": "Repoze License",
1790 "url": "http://www.repoze.org/LICENSE.txt"
1791 },
1792 "name": "python2.7-colander-1.4"
1793 },
1794 {
1795 "license": [
1796 {
1797 "fullName": "BSD-like (http://repoze.org/license.html)"
1798 }
1799 ],
1800 "name": "python2.7-chameleon-2.24"
1801 },
1802 {
1803 "license": [
1804 {
1805 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1806 "shortName": "bsdOriginal",
1807 "spdxId": "BSD-4-Clause",
1808 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1809 }
1810 ],
1811 "name": "python2.7-cssselect-1.0.3"
1812 },
1813 {
1814 "license": [
1815 {
1816 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1817 "shortName": "bsdOriginal",
1818 "spdxId": "BSD-4-Clause",
1819 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1820 }
1821 ],
1822 "name": "python2.7-configobj-5.0.6"
1823 },
1824 {
1825 "license": [
1826 {
1827 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1828 "shortName": "bsdOriginal",
1829 "spdxId": "BSD-4-Clause",
1830 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1831 }
1832 ],
1833 "name": "python2.7-channelstream-0.5.2"
1834 },
1835 {
1836 "license": [
1837 {
1838 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1839 "shortName": "bsdOriginal",
1840 "spdxId": "BSD-4-Clause",
1841 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1842 }
1843 ],
1844 "name": "python2.7-ws4py-0.5.1"
1845 },
1846 {
1847 "license": [
1848 {
1849 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1850 "shortName": "bsdOriginal",
1851 "spdxId": "BSD-4-Clause",
1852 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1853 }
1854 ],
1855 "name": "python2.7-celery-4.1.1"
1856 },
1857 {
1858 "license": [
1859 {
1860 "fullName": "BSD 4-clause \"Original\" or \"Old\" License",
1861 "shortName": "bsdOriginal",
1862 "spdxId": "BSD-4-Clause",
1863 "url": "http://spdx.org/licenses/BSD-4-Clause.html"
1864 }
1865 ],
1866 "name": "python2.7-babel-1.3"
1867 },
1868 {
1869 "license": [
1870 {
1871 "fullName": "MIT License",
1872 "shortName": "mit",
1873 "spdxId": "MIT",
1874 "url": "http://spdx.org/licenses/MIT.html"
1875 }
1876 ],
1877 "name": "python2.7-authomatic-0.1.0.post1"
1878 },
1879 {
1880 "license": [
1881 {
1882 "fullName": "MIT License",
1883 "shortName": "mit",
1884 "spdxId": "MIT",
1885 "url": "http://spdx.org/licenses/MIT.html"
1886 }
1887 ],
1888 "name": "node-grunt-cli-1.2.0"
1889 },
1890 {
1891 "license": [
1892 {
1893 "fullName": "MIT License",
1894 "shortName": "mit",
1895 "spdxId": "MIT",
1896 "url": "http://spdx.org/licenses/MIT.html"
1897 }
1898 ],
1899 "name": "python2.7-rhodecode-testdata-0.10.0"
1900 }
1901 ]
@@ -99,7 +99,7 b' def _commits_as_dict(event, commit_ids, '
99
99
100 else:
100 else:
101 try:
101 try:
102 cs = vcs_repo.get_changeset(commit_id)
102 cs = vcs_repo.get_commit(commit_id)
103 except CommitDoesNotExistError:
103 except CommitDoesNotExistError:
104 continue # maybe its in next repo
104 continue # maybe its in next repo
105
105
@@ -133,7 +133,7 b' def _commits_as_dict(event, commit_ids, '
133 missing_commits = set(commit_ids) - set(c['raw_id'] for c in commits)
133 missing_commits = set(commit_ids) - set(c['raw_id'] for c in commits)
134 if missing_commits:
134 if missing_commits:
135 log.error('Inconsistent repository state. '
135 log.error('Inconsistent repository state. '
136 'Missing commits: %s' % ', '.join(missing_commits))
136 'Missing commits: %s', ', '.join(missing_commits))
137
137
138 return commits
138 return commits
139
139
@@ -66,8 +66,8 b' def integrations_event_handler(event):'
66 exc_info = sys.exc_info()
66 exc_info = sys.exc_info()
67 store_exception(id(exc_info), exc_info)
67 store_exception(id(exc_info), exc_info)
68 log.exception(
68 log.exception(
69 'failure occurred when sending event %s to integration %s' % (
69 'failure occurred when sending event %s to integration %s',
70 event, integration))
70 event, integration)
71
71
72
72
73 def includeme(config):
73 def includeme(config):
@@ -31,8 +31,7 b' class IntegrationTypeRegistry(collection'
31 key = IntegrationType.key
31 key = IntegrationType.key
32 if key in self:
32 if key in self:
33 log.debug(
33 log.debug(
34 'Overriding existing integration type %s (%s) with %s' % (
34 'Overriding existing integration type %s (%s) with %s',
35 self[key], key, IntegrationType))
35 self[key], key, IntegrationType)
36
36
37 self[key] = IntegrationType
37 self[key] = IntegrationType
38
@@ -28,7 +28,57 b' from rhodecode.integrations import integ'
28 log = logging.getLogger(__name__)
28 log = logging.getLogger(__name__)
29
29
30
30
31 class ValidIntegrationPredicate(object):
32 def __init__(self, val, config):
33 self.val = val
34
35 def text(self):
36 return 'valid_integration_route = %s' % self.val
37
38 phash = text
39
40 def __call__(self, info, request):
41 integration_type = info['match']['integration']
42 integration_id = info['match'].get('integration_id')
43
44 if integration_type not in integration_type_registry:
45 return False
46
47 if integration_id:
48 if not safe_int(integration_id):
49 return False
50
51 integration = Integration.get(integration_id)
52 if not integration:
53 return False
54 if integration.integration_type != integration_type:
55 return False
56
57 # match types to repo or repo group
58 repo_name = info['match'].get('repo_name')
59 repo_group_name = info['match'].get('repo_group_name')
60 repo, repo_group = None, None
61 if repo_name:
62 repo = Repository.get_by_repo_name(repo_name)
63 if not repo:
64 return False
65
66 if repo_group_name:
67 repo_group = RepoGroup.get_by_group_name(repo_group_name)
68 if not repo_group:
69 return False
70
71 if repo and repo.repo_id != integration.repo_id:
72 return False
73 if repo_group and repo_group.group_id != integration.repo_group_id:
74 return False
75
76 return True
77
78
31 def includeme(config):
79 def includeme(config):
80 config.add_route_predicate(
81 'valid_integration', ValidIntegrationPredicate)
32
82
33 # global integrations
83 # global integrations
34 config.add_route('global_integrations_new',
84 config.add_route('global_integrations_new',
@@ -52,10 +102,10 b' def includeme(config):'
52
102
53 config.add_route('global_integrations_create',
103 config.add_route('global_integrations_create',
54 ADMIN_PREFIX + '/integrations/{integration}/new',
104 ADMIN_PREFIX + '/integrations/{integration}/new',
55 custom_predicates=(valid_integration,))
105 valid_integration=True)
56 config.add_route('global_integrations_edit',
106 config.add_route('global_integrations_edit',
57 ADMIN_PREFIX + '/integrations/{integration}/{integration_id}',
107 ADMIN_PREFIX + '/integrations/{integration}/{integration_id}',
58 custom_predicates=(valid_integration,))
108 valid_integration=True)
59
109
60 for route_name in ['global_integrations_create', 'global_integrations_edit']:
110 for route_name in ['global_integrations_create', 'global_integrations_edit']:
61 config.add_view('rhodecode.integrations.views.GlobalIntegrationsView',
111 config.add_view('rhodecode.integrations.views.GlobalIntegrationsView',
@@ -92,7 +142,7 b' def includeme(config):'
92 config.add_route('repo_group_integrations_list',
142 config.add_route('repo_group_integrations_list',
93 add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}'),
143 add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}'),
94 repo_group_route=True,
144 repo_group_route=True,
95 custom_predicates=(valid_integration,))
145 valid_integration=True)
96 config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView',
146 config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView',
97 attr='integration_list',
147 attr='integration_list',
98 renderer='rhodecode:templates/admin/integrations/list.mako',
148 renderer='rhodecode:templates/admin/integrations/list.mako',
@@ -102,7 +152,7 b' def includeme(config):'
102 config.add_route('repo_group_integrations_create',
152 config.add_route('repo_group_integrations_create',
103 add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}/new'),
153 add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}/new'),
104 repo_group_route=True,
154 repo_group_route=True,
105 custom_predicates=(valid_integration,))
155 valid_integration=True)
106 config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView',
156 config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView',
107 attr='settings_get',
157 attr='settings_get',
108 renderer='rhodecode:templates/admin/integrations/form.mako',
158 renderer='rhodecode:templates/admin/integrations/form.mako',
@@ -117,7 +167,7 b' def includeme(config):'
117 config.add_route('repo_group_integrations_edit',
167 config.add_route('repo_group_integrations_edit',
118 add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}/{integration_id}'),
168 add_route_requirements('/{repo_group_name}/_settings/integrations/{integration}/{integration_id}'),
119 repo_group_route=True,
169 repo_group_route=True,
120 custom_predicates=(valid_integration,))
170 valid_integration=True)
121
171
122 config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView',
172 config.add_view('rhodecode.integrations.views.RepoGroupIntegrationsView',
123 attr='settings_get',
173 attr='settings_get',
@@ -152,7 +202,7 b' def includeme(config):'
152 config.add_route('repo_integrations_list',
202 config.add_route('repo_integrations_list',
153 add_route_requirements('/{repo_name}/settings/integrations/{integration}'),
203 add_route_requirements('/{repo_name}/settings/integrations/{integration}'),
154 repo_route=True,
204 repo_route=True,
155 custom_predicates=(valid_integration,))
205 valid_integration=True)
156 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
206 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
157 attr='integration_list',
207 attr='integration_list',
158 request_method='GET',
208 request_method='GET',
@@ -162,7 +212,7 b' def includeme(config):'
162 config.add_route('repo_integrations_create',
212 config.add_route('repo_integrations_create',
163 add_route_requirements('/{repo_name}/settings/integrations/{integration}/new'),
213 add_route_requirements('/{repo_name}/settings/integrations/{integration}/new'),
164 repo_route=True,
214 repo_route=True,
165 custom_predicates=(valid_integration,))
215 valid_integration=True)
166 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
216 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
167 attr='settings_get',
217 attr='settings_get',
168 renderer='rhodecode:templates/admin/integrations/form.mako',
218 renderer='rhodecode:templates/admin/integrations/form.mako',
@@ -177,7 +227,7 b' def includeme(config):'
177 config.add_route('repo_integrations_edit',
227 config.add_route('repo_integrations_edit',
178 add_route_requirements('/{repo_name}/settings/integrations/{integration}/{integration_id}'),
228 add_route_requirements('/{repo_name}/settings/integrations/{integration}/{integration_id}'),
179 repo_route=True,
229 repo_route=True,
180 custom_predicates=(valid_integration,))
230 valid_integration=True)
181 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
231 config.add_view('rhodecode.integrations.views.RepoIntegrationsView',
182 attr='settings_get',
232 attr='settings_get',
183 renderer='rhodecode:templates/admin/integrations/form.mako',
233 renderer='rhodecode:templates/admin/integrations/form.mako',
@@ -188,43 +238,3 b' def includeme(config):'
188 renderer='rhodecode:templates/admin/integrations/form.mako',
238 renderer='rhodecode:templates/admin/integrations/form.mako',
189 request_method='POST',
239 request_method='POST',
190 route_name='repo_integrations_edit')
240 route_name='repo_integrations_edit')
191
192
193
194 def valid_integration(info, request):
195 integration_type = info['match']['integration']
196 integration_id = info['match'].get('integration_id')
197
198 if integration_type not in integration_type_registry:
199 return False
200
201 if integration_id:
202 if not safe_int(integration_id):
203 return False
204
205 integration = Integration.get(integration_id)
206 if not integration:
207 return False
208 if integration.integration_type != integration_type:
209 return False
210
211 # match types to repo or repo group
212 repo_name = info['match'].get('repo_name')
213 repo_group_name = info['match'].get('repo_group_name')
214 repo, repo_group = None, None
215 if repo_name:
216 repo = Repository.get_by_repo_name(repo_name)
217 if not repo:
218 return False
219
220 if repo_group_name:
221 repo_group = RepoGroup.get_by_group_name(repo_group_name)
222 if not repo_group:
223 return False
224
225 if repo and repo.repo_id != integration.repo_id:
226 return False
227 if repo_group and repo_group.group_id != integration.repo_group_id:
228 return False
229
230 return True
@@ -22,6 +22,9 b' import colander'
22 import string
22 import string
23 import collections
23 import collections
24 import logging
24 import logging
25 import requests
26 from requests.adapters import HTTPAdapter
27 from requests.packages.urllib3.util.retry import Retry
25
28
26 from mako import exceptions
29 from mako import exceptions
27
30
@@ -320,3 +323,33 b' def render_with_traceback(template, *arg'
320 except Exception:
323 except Exception:
321 log.error(exceptions.text_error_template().render())
324 log.error(exceptions.text_error_template().render())
322 raise
325 raise
326
327
328 STATUS_400 = (400, 401, 403)
329 STATUS_500 = (500, 502, 504)
330
331
332 def requests_retry_call(
333 retries=3, backoff_factor=0.3, status_forcelist=STATUS_400+STATUS_500,
334 session=None):
335 """
336 session = requests_retry_session()
337 response = session.get('http://example.com')
338
339 :param retries:
340 :param backoff_factor:
341 :param status_forcelist:
342 :param session:
343 """
344 session = session or requests.Session()
345 retry = Retry(
346 total=retries,
347 read=retries,
348 connect=retries,
349 backoff_factor=backoff_factor,
350 status_forcelist=status_forcelist,
351 )
352 adapter = HTTPAdapter(max_retries=retry)
353 session.mount('http://', adapter)
354 session.mount('https://', adapter)
355 return session
@@ -35,7 +35,7 b' from rhodecode.integrations.types.base i'
35
35
36 log = logging.getLogger(__name__)
36 log = logging.getLogger(__name__)
37
37
38 repo_push_template_plaintext = Template('''
38 REPO_PUSH_TEMPLATE_PLAINTEXT = Template('''
39 Commits:
39 Commits:
40
40
41 % for commit in data['push']['commits']:
41 % for commit in data['push']['commits']:
@@ -46,9 +46,7 b' Commits:'
46 % endfor
46 % endfor
47 ''')
47 ''')
48
48
49 ## TODO (marcink): think about putting this into a file, or use base.mako email template
49 REPO_PUSH_TEMPLATE_HTML = Template('''
50
51 repo_push_template_html = Template('''
52 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
50 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
53 <html xmlns="http://www.w3.org/1999/xhtml">
51 <html xmlns="http://www.w3.org/1999/xhtml">
54 <head>
52 <head>
@@ -283,13 +281,13 b' def repo_push_handler(data, settings):'
283 branch['name'] for branch in data['push']['branches']))
281 branch['name'] for branch in data['push']['branches']))
284
282
285 email_body_plaintext = render_with_traceback(
283 email_body_plaintext = render_with_traceback(
286 repo_push_template_plaintext,
284 REPO_PUSH_TEMPLATE_PLAINTEXT,
287 data=data,
285 data=data,
288 subject=subject,
286 subject=subject,
289 instance_url=server_url)
287 instance_url=server_url)
290
288
291 email_body_html = render_with_traceback(
289 email_body_html = render_with_traceback(
292 repo_push_template_html,
290 REPO_PUSH_TEMPLATE_HTML,
293 data=data,
291 data=data,
294 subject=subject,
292 subject=subject,
295 instance_url=server_url)
293 instance_url=server_url)
@@ -31,7 +31,8 b' from rhodecode.lib import helpers as h'
31 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
31 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
32 from rhodecode.lib.colander_utils import strip_whitespace
32 from rhodecode.lib.colander_utils import strip_whitespace
33 from rhodecode.integrations.types.base import (
33 from rhodecode.integrations.types.base import (
34 IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback)
34 IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback,
35 requests_retry_call)
35
36
36 log = logging.getLogger(__name__)
37 log = logging.getLogger(__name__)
37
38
@@ -119,11 +120,11 b' class HipchatIntegrationType(Integration'
119
120
120 def send_event(self, event):
121 def send_event(self, event):
121 if event.__class__ not in self.valid_events:
122 if event.__class__ not in self.valid_events:
122 log.debug('event not valid: %r' % event)
123 log.debug('event not valid: %r', event)
123 return
124 return
124
125
125 if event.name not in self.settings['events']:
126 if event.name not in self.settings['events']:
126 log.debug('event ignored: %r' % event)
127 log.debug('event ignored: %r', event)
127 return
128 return
128
129
129 data = event.as_dict()
130 data = event.as_dict()
@@ -131,7 +132,7 b' class HipchatIntegrationType(Integration'
131 text = '<b>%s<b> caused a <b>%s</b> event' % (
132 text = '<b>%s<b> caused a <b>%s</b> event' % (
132 data['actor']['username'], event.name)
133 data['actor']['username'], event.name)
133
134
134 log.debug('handling hipchat event for %s' % event.name)
135 log.debug('handling hipchat event for %s', event.name)
135
136
136 if isinstance(event, events.PullRequestCommentEvent):
137 if isinstance(event, events.PullRequestCommentEvent):
137 text = self.format_pull_request_comment_event(event, data)
138 text = self.format_pull_request_comment_event(event, data)
@@ -144,7 +145,7 b' class HipchatIntegrationType(Integration'
144 elif isinstance(event, events.RepoCreateEvent):
145 elif isinstance(event, events.RepoCreateEvent):
145 text = self.format_repo_create_event(data)
146 text = self.format_repo_create_event(data)
146 else:
147 else:
147 log.error('unhandled event type: %r' % event)
148 log.error('unhandled event type: %r', event)
148
149
149 run_task(post_text_to_hipchat, self.settings, text)
150 run_task(post_text_to_hipchat, self.settings, text)
150
151
@@ -242,12 +243,12 b' class HipchatIntegrationType(Integration'
242
243
243 @async_task(ignore_result=True, base=RequestContextTask)
244 @async_task(ignore_result=True, base=RequestContextTask)
244 def post_text_to_hipchat(settings, text):
245 def post_text_to_hipchat(settings, text):
245 log.debug('sending %s to hipchat %s' % (text, settings['server_url']))
246 log.debug('sending %s to hipchat %s', text, settings['server_url'])
246 json_message = {
247 json_message = {
247 "message": text,
248 "message": text,
248 "color": settings.get('color', 'yellow'),
249 "color": settings.get('color', 'yellow'),
249 "notify": settings.get('notify', False),
250 "notify": settings.get('notify', False),
250 }
251 }
251
252 req_session = requests_retry_call()
252 resp = requests.post(settings['server_url'], json=json_message, timeout=60)
253 resp = req_session.post(settings['server_url'], json=json_message, timeout=60)
253 resp.raise_for_status() # raise exception on a failed request
254 resp.raise_for_status() # raise exception on a failed request
@@ -35,7 +35,8 b' from rhodecode.lib import helpers as h'
35 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
35 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
36 from rhodecode.lib.colander_utils import strip_whitespace
36 from rhodecode.lib.colander_utils import strip_whitespace
37 from rhodecode.integrations.types.base import (
37 from rhodecode.integrations.types.base import (
38 IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback)
38 IntegrationTypeBase, CommitParsingDataHandler, render_with_traceback,
39 requests_retry_call)
39
40
40 log = logging.getLogger(__name__)
41 log = logging.getLogger(__name__)
41
42
@@ -110,11 +111,11 b' class SlackIntegrationType(IntegrationTy'
110
111
111 def send_event(self, event):
112 def send_event(self, event):
112 if event.__class__ not in self.valid_events:
113 if event.__class__ not in self.valid_events:
113 log.debug('event not valid: %r' % event)
114 log.debug('event not valid: %r', event)
114 return
115 return
115
116
116 if event.name not in self.settings['events']:
117 if event.name not in self.settings['events']:
117 log.debug('event ignored: %r' % event)
118 log.debug('event ignored: %r', event)
118 return
119 return
119
120
120 data = event.as_dict()
121 data = event.as_dict()
@@ -127,7 +128,7 b' class SlackIntegrationType(IntegrationTy'
127 fields = None
128 fields = None
128 overrides = None
129 overrides = None
129
130
130 log.debug('handling slack event for %s' % event.name)
131 log.debug('handling slack event for %s', event.name)
131
132
132 if isinstance(event, events.PullRequestCommentEvent):
133 if isinstance(event, events.PullRequestCommentEvent):
133 (title, text, fields, overrides) \
134 (title, text, fields, overrides) \
@@ -141,7 +142,7 b' class SlackIntegrationType(IntegrationTy'
141 elif isinstance(event, events.RepoCreateEvent):
142 elif isinstance(event, events.RepoCreateEvent):
142 title, text = self.format_repo_create_event(data)
143 title, text = self.format_repo_create_event(data)
143 else:
144 else:
144 log.error('unhandled event type: %r' % event)
145 log.error('unhandled event type: %r', event)
145
146
146 run_task(post_text_to_slack, self.settings, title, text, fields, overrides)
147 run_task(post_text_to_slack, self.settings, title, text, fields, overrides)
147
148
@@ -314,8 +315,7 b' def html_to_slack_links(message):'
314
315
315 @async_task(ignore_result=True, base=RequestContextTask)
316 @async_task(ignore_result=True, base=RequestContextTask)
316 def post_text_to_slack(settings, title, text, fields=None, overrides=None):
317 def post_text_to_slack(settings, title, text, fields=None, overrides=None):
317 log.debug('sending %s (%s) to slack %s' % (
318 log.debug('sending %s (%s) to slack %s', title, text, settings['service'])
318 title, text, settings['service']))
319
319
320 fields = fields or []
320 fields = fields or []
321 overrides = overrides or {}
321 overrides = overrides or {}
@@ -345,6 +345,6 b' def post_text_to_slack(settings, title, '
345 "username": settings.get('username', 'Rhodecode'),
345 "username": settings.get('username', 'Rhodecode'),
346 "attachments": [message_data]
346 "attachments": [message_data]
347 }
347 }
348
348 req_session = requests_retry_call()
349 resp = requests.post(settings['service'], json=json_message, timeout=60)
349 resp = req_session.post(settings['service'], json=json_message, timeout=60)
350 resp.raise_for_status() # raise exception on a failed request
350 resp.raise_for_status() # raise exception on a failed request
@@ -23,17 +23,14 b' from __future__ import unicode_literals'
23 import deform
23 import deform
24 import deform.widget
24 import deform.widget
25 import logging
25 import logging
26 import requests
27 import requests.adapters
28 import colander
26 import colander
29 from requests.packages.urllib3.util.retry import Retry
30
27
31 import rhodecode
28 import rhodecode
32 from rhodecode import events
29 from rhodecode import events
33 from rhodecode.translation import _
30 from rhodecode.translation import _
34 from rhodecode.integrations.types.base import (
31 from rhodecode.integrations.types.base import (
35 IntegrationTypeBase, get_auth, get_web_token, get_url_vars,
32 IntegrationTypeBase, get_auth, get_web_token, get_url_vars,
36 WebhookDataHandler, WEBHOOK_URL_VARS)
33 WebhookDataHandler, WEBHOOK_URL_VARS, requests_retry_call)
37 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
34 from rhodecode.lib.celerylib import run_task, async_task, RequestContextTask
38 from rhodecode.model.validation_schema import widgets
35 from rhodecode.model.validation_schema import widgets
39
36
@@ -171,11 +168,11 b' class WebhookIntegrationType(Integration'
171 'handling event %s with Webhook integration %s', event.name, self)
168 'handling event %s with Webhook integration %s', event.name, self)
172
169
173 if event.__class__ not in self.valid_events:
170 if event.__class__ not in self.valid_events:
174 log.debug('event not valid: %r' % event)
171 log.debug('event not valid: %r', event)
175 return
172 return
176
173
177 if event.name not in self.settings['events']:
174 if event.name not in self.settings['events']:
178 log.debug('event ignored: %r' % event)
175 log.debug('event ignored: %r', event)
179 return
176 return
180
177
181 data = event.as_dict()
178 data = event.as_dict()
@@ -233,11 +230,6 b' def post_to_webhook(url_calls, settings)'
233 'utc_timestamp': datetime.datetime(2017, 11, 30, 13, 0, 1, 569276)
230 'utc_timestamp': datetime.datetime(2017, 11, 30, 13, 0, 1, 569276)
234
231
235 """
232 """
236 max_retries = 3
237 retries = Retry(
238 total=max_retries,
239 backoff_factor=0.15,
240 status_forcelist=[500, 502, 503, 504])
241 call_headers = {
233 call_headers = {
242 'User-Agent': 'RhodeCode-webhook-caller/{}'.format(
234 'User-Agent': 'RhodeCode-webhook-caller/{}'.format(
243 rhodecode.__version__)
235 rhodecode.__version__)
@@ -247,9 +239,7 b' def post_to_webhook(url_calls, settings)'
247 token = get_web_token(settings)
239 token = get_web_token(settings)
248
240
249 for url, headers, data in url_calls:
241 for url, headers, data in url_calls:
250 req_session = requests.Session()
242 req_session = requests_retry_call()
251 req_session.mount( # retry max N times
252 'http://', requests.adapters.HTTPAdapter(max_retries=retries))
253
243
254 method = settings.get('method_type') or 'post'
244 method = settings.get('method_type') or 'post'
255 call_method = getattr(req_session, method)
245 call_method = getattr(req_session, method)
@@ -65,6 +65,7 b' ACTIONS_V1 = {'
65 'repo.edit': {'old_data': {}},
65 'repo.edit': {'old_data': {}},
66 'repo.edit.permissions': {},
66 'repo.edit.permissions': {},
67 'repo.edit.permissions.branch': {},
67 'repo.edit.permissions.branch': {},
68 'repo.archive': {'old_data': {}},
68 'repo.delete': {'old_data': {}},
69 'repo.delete': {'old_data': {}},
69
70
70 'repo.archive.download': {'user_agent': '', 'archive_name': '',
71 'repo.archive.download': {'user_agent': '', 'archive_name': '',
@@ -68,7 +68,6 b' class PasswordGenerator(object):'
68 This is a simple class for generating password from different sets of
68 This is a simple class for generating password from different sets of
69 characters
69 characters
70 usage::
70 usage::
71
72 passwd_gen = PasswordGenerator()
71 passwd_gen = PasswordGenerator()
73 #print 8-letter password containing only big and small letters
72 #print 8-letter password containing only big and small letters
74 of alphabet
73 of alphabet
@@ -322,6 +321,7 b' def _cached_perms_data(user_id, scope, u'
322
321
323 class PermOrigin(object):
322 class PermOrigin(object):
324 SUPER_ADMIN = 'superadmin'
323 SUPER_ADMIN = 'superadmin'
324 ARCHIVED = 'archived'
325
325
326 REPO_USER = 'user:%s'
326 REPO_USER = 'user:%s'
327 REPO_USERGROUP = 'usergroup:%s'
327 REPO_USERGROUP = 'usergroup:%s'
@@ -463,8 +463,14 b' class PermissionCalculator(object):'
463 # repositories
463 # repositories
464 for perm in self.default_repo_perms:
464 for perm in self.default_repo_perms:
465 r_k = perm.UserRepoToPerm.repository.repo_name
465 r_k = perm.UserRepoToPerm.repository.repo_name
466 archived = perm.UserRepoToPerm.repository.archived
466 p = 'repository.admin'
467 p = 'repository.admin'
467 self.permissions_repositories[r_k] = p, PermOrigin.SUPER_ADMIN
468 self.permissions_repositories[r_k] = p, PermOrigin.SUPER_ADMIN
469 # special case for archived repositories, which we block still even for
470 # super admins
471 if archived:
472 p = 'repository.read'
473 self.permissions_repositories[r_k] = p, PermOrigin.ARCHIVED
468
474
469 # repository groups
475 # repository groups
470 for perm in self.default_repo_groups_perms:
476 for perm in self.default_repo_groups_perms:
@@ -572,6 +578,7 b' class PermissionCalculator(object):'
572 def _calculate_default_permissions_repositories(self, user_inherit_object_permissions):
578 def _calculate_default_permissions_repositories(self, user_inherit_object_permissions):
573 for perm in self.default_repo_perms:
579 for perm in self.default_repo_perms:
574 r_k = perm.UserRepoToPerm.repository.repo_name
580 r_k = perm.UserRepoToPerm.repository.repo_name
581 archived = perm.UserRepoToPerm.repository.archived
575 p = perm.Permission.permission_name
582 p = perm.Permission.permission_name
576 o = PermOrigin.REPO_DEFAULT
583 o = PermOrigin.REPO_DEFAULT
577 self.permissions_repositories[r_k] = p, o
584 self.permissions_repositories[r_k] = p, o
@@ -602,6 +609,15 b' class PermissionCalculator(object):'
602 o = PermOrigin.SUPER_ADMIN
609 o = PermOrigin.SUPER_ADMIN
603 self.permissions_repositories[r_k] = p, o
610 self.permissions_repositories[r_k] = p, o
604
611
612 # finally in case of archived repositories, we downgrade higher
613 # permissions to read
614 if archived:
615 current_perm = self.permissions_repositories[r_k]
616 if current_perm in ['repository.write', 'repository.admin']:
617 p = 'repository.read'
618 o = PermOrigin.ARCHIVED
619 self.permissions_repositories[r_k] = p, o
620
605 def _calculate_default_permissions_repository_branches(self, user_inherit_object_permissions):
621 def _calculate_default_permissions_repository_branches(self, user_inherit_object_permissions):
606 for perm in self.default_branch_repo_perms:
622 for perm in self.default_branch_repo_perms:
607
623
@@ -611,8 +627,11 b' class PermissionCalculator(object):'
611 o = PermOrigin.REPO_USER % perm.UserRepoToPerm.user.username
627 o = PermOrigin.REPO_USER % perm.UserRepoToPerm.user.username
612
628
613 if not self.explicit:
629 if not self.explicit:
614 # TODO(marcink): fix this for multiple entries
630 cur_perm = self.permissions_repository_branches.get(r_k)
615 cur_perm = self.permissions_repository_branches.get(r_k) or 'branch.none'
631 if cur_perm:
632 cur_perm = cur_perm[pattern]
633 cur_perm = cur_perm or 'branch.none'
634
616 p = self._choose_permission(p, cur_perm)
635 p = self._choose_permission(p, cur_perm)
617
636
618 # NOTE(marcink): register all pattern/perm instances in this
637 # NOTE(marcink): register all pattern/perm instances in this
@@ -784,8 +803,7 b' class PermissionCalculator(object):'
784
803
785 multiple_counter[r_k] += 1
804 multiple_counter[r_k] += 1
786 if multiple_counter[r_k] > 1:
805 if multiple_counter[r_k] > 1:
787 # TODO(marcink): fix this for multi branch support, and multiple entries
806 cur_perm = self.permissions_repository_branches[r_k][pattern]
788 cur_perm = self.permissions_repository_branches[r_k]
789 p = self._choose_permission(p, cur_perm)
807 p = self._choose_permission(p, cur_perm)
790
808
791 self.permissions_repository_branches[r_k] = pattern, p, o
809 self.permissions_repository_branches[r_k] = pattern, p, o
@@ -803,8 +821,10 b' class PermissionCalculator(object):'
803 o = PermOrigin.REPO_USER % perm.UserRepoToPerm.user.username
821 o = PermOrigin.REPO_USER % perm.UserRepoToPerm.user.username
804
822
805 if not self.explicit:
823 if not self.explicit:
806 # TODO(marcink): fix this for multiple entries
824 cur_perm = self.permissions_repository_branches.get(r_k)
807 cur_perm = self.permissions_repository_branches.get(r_k) or 'branch.none'
825 if cur_perm:
826 cur_perm = cur_perm[pattern]
827 cur_perm = cur_perm or 'branch.none'
808 p = self._choose_permission(p, cur_perm)
828 p = self._choose_permission(p, cur_perm)
809
829
810 # NOTE(marcink): register all pattern/perm instances in this
830 # NOTE(marcink): register all pattern/perm instances in this
@@ -858,8 +878,7 b' class PermissionCalculator(object):'
858 p = perm.Permission.permission_name
878 p = perm.Permission.permission_name
859
879
860 if not self.explicit:
880 if not self.explicit:
861 cur_perm = self.permissions_repository_groups.get(
881 cur_perm = self.permissions_repository_groups.get(rg_k, 'group.none')
862 rg_k, 'group.none')
863 p = self._choose_permission(p, cur_perm)
882 p = self._choose_permission(p, cur_perm)
864
883
865 self.permissions_repository_groups[rg_k] = p, o
884 self.permissions_repository_groups[rg_k] = p, o
@@ -920,8 +939,7 b' class PermissionCalculator(object):'
920 p = perm.Permission.permission_name
939 p = perm.Permission.permission_name
921
940
922 if not self.explicit:
941 if not self.explicit:
923 cur_perm = self.permissions_user_groups.get(
942 cur_perm = self.permissions_user_groups.get(ug_k, 'usergroup.none')
924 ug_k, 'usergroup.none')
925 p = self._choose_permission(p, cur_perm)
943 p = self._choose_permission(p, cur_perm)
926
944
927 self.permissions_user_groups[ug_k] = p, o
945 self.permissions_user_groups[ug_k] = p, o
@@ -979,7 +997,7 b' def allowed_auth_token_access(view_name,'
979 }
997 }
980
998
981 log.debug(
999 log.debug(
982 'Allowed views for AUTH TOKEN access: %s' % (whitelist,))
1000 'Allowed views for AUTH TOKEN access: %s', whitelist)
983 auth_token_access_valid = False
1001 auth_token_access_valid = False
984
1002
985 for entry in whitelist:
1003 for entry in whitelist:
@@ -998,8 +1016,9 b' def allowed_auth_token_access(view_name,'
998 break
1016 break
999
1017
1000 if auth_token_access_valid:
1018 if auth_token_access_valid:
1001 log.debug('view: `%s` matches entry in whitelist: %s'
1019 log.debug('view: `%s` matches entry in whitelist: %s',
1002 % (view_name, whitelist))
1020 view_name, whitelist)
1021
1003 else:
1022 else:
1004 msg = ('view: `%s` does *NOT* match any entry in whitelist: %s'
1023 msg = ('view: `%s` does *NOT* match any entry in whitelist: %s'
1005 % (view_name, whitelist))
1024 % (view_name, whitelist))
@@ -1190,7 +1209,7 b' class AuthUser(object):'
1190
1209
1191 log.debug(
1210 log.debug(
1192 'Computing PERMISSION tree for user %s scope `%s` '
1211 'Computing PERMISSION tree for user %s scope `%s` '
1193 'with caching: %s[TTL: %ss]' % (user, scope, cache_on, cache_seconds or 0))
1212 'with caching: %s[TTL: %ss]', user, scope, cache_on, cache_seconds or 0)
1194
1213
1195 cache_namespace_uid = 'cache_user_auth.{}'.format(user_id)
1214 cache_namespace_uid = 'cache_user_auth.{}'.format(user_id)
1196 region = rc_cache.get_or_create_region('cache_perms', cache_namespace_uid)
1215 region = rc_cache.get_or_create_region('cache_perms', cache_namespace_uid)
@@ -1214,8 +1233,8 b' class AuthUser(object):'
1214 for k in result:
1233 for k in result:
1215 result_repr.append((k, len(result[k])))
1234 result_repr.append((k, len(result[k])))
1216 total = time.time() - start
1235 total = time.time() - start
1217 log.debug('PERMISSION tree for user %s computed in %.3fs: %s' % (
1236 log.debug('PERMISSION tree for user %s computed in %.3fs: %s',
1218 user, total, result_repr))
1237 user, total, result_repr)
1219
1238
1220 return result
1239 return result
1221
1240
@@ -1352,12 +1371,12 b' class AuthUser(object):'
1352 allowed_ips = AuthUser.get_allowed_ips(
1371 allowed_ips = AuthUser.get_allowed_ips(
1353 user_id, cache=True, inherit_from_default=inherit_from_default)
1372 user_id, cache=True, inherit_from_default=inherit_from_default)
1354 if check_ip_access(source_ip=ip_addr, allowed_ips=allowed_ips):
1373 if check_ip_access(source_ip=ip_addr, allowed_ips=allowed_ips):
1355 log.debug('IP:%s for user %s is in range of %s' % (
1374 log.debug('IP:%s for user %s is in range of %s',
1356 ip_addr, user_id, allowed_ips))
1375 ip_addr, user_id, allowed_ips)
1357 return True
1376 return True
1358 else:
1377 else:
1359 log.info('Access for IP:%s forbidden for user %s, '
1378 log.info('Access for IP:%s forbidden for user %s, '
1360 'not in %s' % (ip_addr, user_id, allowed_ips))
1379 'not in %s', ip_addr, user_id, allowed_ips)
1361 return False
1380 return False
1362
1381
1363 def get_branch_permissions(self, repo_name, perms=None):
1382 def get_branch_permissions(self, repo_name, perms=None):
@@ -1593,7 +1612,7 b' class LoginRequired(object):'
1593 _ = request.translate
1612 _ = request.translate
1594
1613
1595 loc = "%s:%s" % (cls.__class__.__name__, func.__name__)
1614 loc = "%s:%s" % (cls.__class__.__name__, func.__name__)
1596 log.debug('Starting login restriction checks for user: %s' % (user,))
1615 log.debug('Starting login restriction checks for user: %s', user)
1597 # check if our IP is allowed
1616 # check if our IP is allowed
1598 ip_access_valid = True
1617 ip_access_valid = True
1599 if not user.ip_allowed:
1618 if not user.ip_allowed:
@@ -1610,7 +1629,7 b' class LoginRequired(object):'
1610
1629
1611 # explicit controller is enabled or API is in our whitelist
1630 # explicit controller is enabled or API is in our whitelist
1612 if self.auth_token_access or auth_token_access_valid:
1631 if self.auth_token_access or auth_token_access_valid:
1613 log.debug('Checking AUTH TOKEN access for %s' % (cls,))
1632 log.debug('Checking AUTH TOKEN access for %s', cls)
1614 db_user = user.get_instance()
1633 db_user = user.get_instance()
1615
1634
1616 if db_user:
1635 if db_user:
@@ -1626,36 +1645,33 b' class LoginRequired(object):'
1626
1645
1627 if _auth_token and token_match:
1646 if _auth_token and token_match:
1628 auth_token_access_valid = True
1647 auth_token_access_valid = True
1629 log.debug('AUTH TOKEN ****%s is VALID' % (_auth_token[-4:],))
1648 log.debug('AUTH TOKEN ****%s is VALID', _auth_token[-4:])
1630 else:
1649 else:
1631 auth_token_access_valid = False
1650 auth_token_access_valid = False
1632 if not _auth_token:
1651 if not _auth_token:
1633 log.debug("AUTH TOKEN *NOT* present in request")
1652 log.debug("AUTH TOKEN *NOT* present in request")
1634 else:
1653 else:
1635 log.warning(
1654 log.warning("AUTH TOKEN ****%s *NOT* valid", _auth_token[-4:])
1636 "AUTH TOKEN ****%s *NOT* valid" % _auth_token[-4:])
1655
1637
1656 log.debug('Checking if %s is authenticated @ %s', user.username, loc)
1638 log.debug('Checking if %s is authenticated @ %s' % (user.username, loc))
1639 reason = 'RHODECODE_AUTH' if user.is_authenticated \
1657 reason = 'RHODECODE_AUTH' if user.is_authenticated \
1640 else 'AUTH_TOKEN_AUTH'
1658 else 'AUTH_TOKEN_AUTH'
1641
1659
1642 if ip_access_valid and (
1660 if ip_access_valid and (
1643 user.is_authenticated or auth_token_access_valid):
1661 user.is_authenticated or auth_token_access_valid):
1644 log.info(
1662 log.info('user %s authenticating with:%s IS authenticated on func %s',
1645 'user %s authenticating with:%s IS authenticated on func %s'
1663 user, reason, loc)
1646 % (user, reason, loc))
1647
1664
1648 return func(*fargs, **fkwargs)
1665 return func(*fargs, **fkwargs)
1649 else:
1666 else:
1650 log.warning(
1667 log.warning(
1651 'user %s authenticating with:%s NOT authenticated on '
1668 'user %s authenticating with:%s NOT authenticated on '
1652 'func: %s: IP_ACCESS:%s AUTH_TOKEN_ACCESS:%s'
1669 'func: %s: IP_ACCESS:%s AUTH_TOKEN_ACCESS:%s',
1653 % (user, reason, loc, ip_access_valid,
1670 user, reason, loc, ip_access_valid, auth_token_access_valid)
1654 auth_token_access_valid))
1655 # we preserve the get PARAM
1671 # we preserve the get PARAM
1656 came_from = get_came_from(request)
1672 came_from = get_came_from(request)
1657
1673
1658 log.debug('redirecting to login page with %s' % (came_from,))
1674 log.debug('redirecting to login page with %s', came_from)
1659 raise HTTPFound(
1675 raise HTTPFound(
1660 h.route_path('login', _query={'came_from': came_from}))
1676 h.route_path('login', _query={'came_from': came_from}))
1661
1677
@@ -1678,7 +1694,7 b' class NotAnonymous(object):'
1678 self.user = cls._rhodecode_user
1694 self.user = cls._rhodecode_user
1679 request = self._get_request()
1695 request = self._get_request()
1680 _ = request.translate
1696 _ = request.translate
1681 log.debug('Checking if user is not anonymous @%s' % cls)
1697 log.debug('Checking if user is not anonymous @%s', cls)
1682
1698
1683 anonymous = self.user.username == User.DEFAULT_USER
1699 anonymous = self.user.username == User.DEFAULT_USER
1684
1700
@@ -1939,7 +1955,7 b' class PermsFunction(object):'
1939 frame = inspect.currentframe()
1955 frame = inspect.currentframe()
1940 stack_trace = traceback.format_stack(frame)
1956 stack_trace = traceback.format_stack(frame)
1941 log.error('Checking bool value on a class instance of perm '
1957 log.error('Checking bool value on a class instance of perm '
1942 'function is not allowed: %s' % ''.join(stack_trace))
1958 'function is not allowed: %s', ''.join(stack_trace))
1943 # rather than throwing errors, here we always return False so if by
1959 # rather than throwing errors, here we always return False so if by
1944 # accident someone checks truth for just an instance it will always end
1960 # accident someone checks truth for just an instance it will always end
1945 # up in returning False
1961 # up in returning False
@@ -2182,9 +2198,8 b' class _BaseApiPerm(object):'
2182 if user_group_name:
2198 if user_group_name:
2183 check_scope += ', user_group_name:%s' % (user_group_name,)
2199 check_scope += ', user_group_name:%s' % (user_group_name,)
2184
2200
2185 log.debug(
2201 log.debug('checking cls:%s %s %s @ %s',
2186 'checking cls:%s %s %s @ %s'
2202 cls_name, self.required_perms, check_scope, check_location)
2187 % (cls_name, self.required_perms, check_scope, check_location))
2188 if not user:
2203 if not user:
2189 log.debug('Empty User passed into arguments')
2204 log.debug('Empty User passed into arguments')
2190 return False
2205 return False
@@ -2305,7 +2320,7 b' def check_ip_access(source_ip, allowed_i'
2305 :param source_ip:
2320 :param source_ip:
2306 :param allowed_ips: list of allowed ips together with mask
2321 :param allowed_ips: list of allowed ips together with mask
2307 """
2322 """
2308 log.debug('checking if ip:%s is subnet of %s' % (source_ip, allowed_ips))
2323 log.debug('checking if ip:%s is subnet of %s', source_ip, allowed_ips)
2309 source_ip_address = ipaddress.ip_address(safe_unicode(source_ip))
2324 source_ip_address = ipaddress.ip_address(safe_unicode(source_ip))
2310 if isinstance(allowed_ips, (tuple, list, set)):
2325 if isinstance(allowed_ips, (tuple, list, set)):
2311 for ip in allowed_ips:
2326 for ip in allowed_ips:
@@ -2313,8 +2328,7 b' def check_ip_access(source_ip, allowed_i'
2313 try:
2328 try:
2314 network_address = ipaddress.ip_network(ip, strict=False)
2329 network_address = ipaddress.ip_network(ip, strict=False)
2315 if source_ip_address in network_address:
2330 if source_ip_address in network_address:
2316 log.debug('IP %s is network %s' %
2331 log.debug('IP %s is network %s', source_ip_address, network_address)
2317 (source_ip_address, network_address))
2318 return True
2332 return True
2319 # for any case we cannot determine the IP, don't crash just
2333 # for any case we cannot determine the IP, don't crash just
2320 # skip it and log as error, we want to say forbidden still when
2334 # skip it and log as error, we want to say forbidden still when
@@ -180,7 +180,12 b' def vcs_operation_context('
180 ui_settings = settings_model.get_ui_settings()
180 ui_settings = settings_model.get_ui_settings()
181
181
182 # NOTE(marcink): This should be also in sync with
182 # NOTE(marcink): This should be also in sync with
183 # rhodecode/apps/ssh_support/lib/backends/base.py:update_enviroment scm_data
183 # rhodecode/apps/ssh_support/lib/backends/base.py:update_environment scm_data
184 store = [x for x in ui_settings if x.key == '/']
185 repo_store = ''
186 if store:
187 repo_store = store[0].value
188
184 scm_data = {
189 scm_data = {
185 'ip': get_ip_addr(environ),
190 'ip': get_ip_addr(environ),
186 'username': username,
191 'username': username,
@@ -189,6 +194,7 b' def vcs_operation_context('
189 'repository': repo_name,
194 'repository': repo_name,
190 'scm': scm,
195 'scm': scm,
191 'config': rhodecode.CONFIG['__file__'],
196 'config': rhodecode.CONFIG['__file__'],
197 'repo_store': repo_store,
192 'make_lock': make_lock,
198 'make_lock': make_lock,
193 'locked_by': locked_by,
199 'locked_by': locked_by,
194 'server_url': utils2.get_server_url(environ),
200 'server_url': utils2.get_server_url(environ),
@@ -216,7 +222,7 b' class BasicAuth(AuthBasicAuthenticator):'
216 try:
222 try:
217 return get_exception(safe_int(http_code))
223 return get_exception(safe_int(http_code))
218 except Exception:
224 except Exception:
219 log.exception('Failed to fetch response for code %s' % http_code)
225 log.exception('Failed to fetch response for code %s', http_code)
220 return HTTPForbidden
226 return HTTPForbidden
221
227
222 def get_rc_realm(self):
228 def get_rc_realm(self):
@@ -357,6 +363,28 b' def attach_context_attributes(context, r'
357 'appenlight.api_public_key', '')
363 'appenlight.api_public_key', '')
358 context.appenlight_server_url = config.get('appenlight.server_url', '')
364 context.appenlight_server_url = config.get('appenlight.server_url', '')
359
365
366 diffmode = {
367 "unified": "unified",
368 "sideside": "sideside"
369 }.get(request.GET.get('diffmode'))
370
371 if diffmode and diffmode != request.session.get('rc_user_session_attr.diffmode'):
372 request.session['rc_user_session_attr.diffmode'] = diffmode
373
374 # session settings per user
375 session_attrs = {
376 # defaults
377 "clone_url_format": "http",
378 "diffmode": "sideside"
379 }
380 for k, v in request.session.items():
381 pref = 'rc_user_session_attr.'
382 if k and k.startswith(pref):
383 k = k[len(pref):]
384 session_attrs[k] = v
385
386 context.user_session_attrs = session_attrs
387
360 # JS template context
388 # JS template context
361 context.template_context = {
389 context.template_context = {
362 'repo_name': None,
390 'repo_name': None,
@@ -367,6 +395,7 b' def attach_context_attributes(context, r'
367 'email': None,
395 'email': None,
368 'notification_status': False
396 'notification_status': False
369 },
397 },
398 'session_attrs': session_attrs,
370 'visual': {
399 'visual': {
371 'default_renderer': None
400 'default_renderer': None
372 },
401 },
@@ -385,18 +414,6 b' def attach_context_attributes(context, r'
385 }
414 }
386 # END CONFIG VARS
415 # END CONFIG VARS
387
416
388 diffmode = 'sideside'
389 if request.GET.get('diffmode'):
390 if request.GET['diffmode'] == 'unified':
391 diffmode = 'unified'
392 elif request.session.get('diffmode'):
393 diffmode = request.session['diffmode']
394
395 context.diffmode = diffmode
396
397 if request.session.get('diffmode') != diffmode:
398 request.session['diffmode'] = diffmode
399
400 context.csrf_token = auth.get_csrf_token(session=request.session)
417 context.csrf_token = auth.get_csrf_token(session=request.session)
401 context.backends = rhodecode.BACKENDS.keys()
418 context.backends = rhodecode.BACKENDS.keys()
402 context.backends.sort()
419 context.backends.sort()
@@ -26,11 +26,13 b' by celery daemon'
26 import os
26 import os
27 import time
27 import time
28
28
29 from pyramid_mailer.mailer import Mailer
30 from pyramid_mailer.message import Message
31
29 import rhodecode
32 import rhodecode
30 from rhodecode.lib import audit_logger
33 from rhodecode.lib import audit_logger
31 from rhodecode.lib.celerylib import get_logger, async_task, RequestContextTask
34 from rhodecode.lib.celerylib import get_logger, async_task, RequestContextTask
32 from rhodecode.lib.hooks_base import log_create_repository
35 from rhodecode.lib.hooks_base import log_create_repository
33 from rhodecode.lib.rcmail.smtp_mailer import SmtpMailer
34 from rhodecode.lib.utils2 import safe_int, str2bool
36 from rhodecode.lib.utils2 import safe_int, str2bool
35 from rhodecode.model.db import Session, IntegrityError, Repository, User, true
37 from rhodecode.model.db import Session, IntegrityError, Repository, User, true
36
38
@@ -49,8 +51,20 b' def send_email(recipients, subject, body'
49 log = get_logger(send_email)
51 log = get_logger(send_email)
50
52
51 email_config = email_config or rhodecode.CONFIG
53 email_config = email_config or rhodecode.CONFIG
54
55 mail_server = email_config.get('smtp_server') or None
56 if mail_server is None:
57 log.error("SMTP server information missing. Sending email failed. "
58 "Make sure that `smtp_server` variable is configured "
59 "inside the .ini file")
60 return False
61
52 subject = "%s %s" % (email_config.get('email_prefix', ''), subject)
62 subject = "%s %s" % (email_config.get('email_prefix', ''), subject)
53 if not recipients:
63
64 if recipients:
65 if isinstance(recipients, basestring):
66 recipients = recipients.split(',')
67 else:
54 # if recipients are not defined we send to email_config + all admins
68 # if recipients are not defined we send to email_config + all admins
55 admins = []
69 admins = []
56 for u in User.query().filter(User.admin == true()).all():
70 for u in User.query().filter(User.admin == true()).all():
@@ -62,26 +76,44 b' def send_email(recipients, subject, body'
62 recipients += [config_email]
76 recipients += [config_email]
63 recipients += admins
77 recipients += admins
64
78
65 mail_server = email_config.get('smtp_server') or None
79 # translate our LEGACY config into the one that pyramid_mailer supports
66 if mail_server is None:
80 email_conf = dict(
67 log.error("SMTP server information missing. Sending email failed. "
81 host=mail_server,
68 "Make sure that `smtp_server` variable is configured "
82 port=email_config.get('smtp_port'),
69 "inside the .ini file")
83 username=email_config.get('smtp_username'),
70 return False
84 password=email_config.get('smtp_password'),
85
86 tls=str2bool(email_config.get('smtp_use_tls')),
87 ssl=str2bool(email_config.get('smtp_use_ssl')),
88
89 # SSL key file
90 # keyfile='',
71
91
72 mail_from = email_config.get('app_email_from', 'RhodeCode')
92 # SSL certificate file
73 user = email_config.get('smtp_username')
93 # certfile='',
74 passwd = email_config.get('smtp_password')
94
75 mail_port = email_config.get('smtp_port')
95 # Location of maildir
76 tls = str2bool(email_config.get('smtp_use_tls'))
96 # queue_path='',
77 ssl = str2bool(email_config.get('smtp_use_ssl'))
97
78 debug = str2bool(email_config.get('debug'))
98 default_sender=email_config.get('app_email_from', 'RhodeCode'),
79 smtp_auth = email_config.get('smtp_auth')
99
100 debug=str2bool(email_config.get('smtp_debug')),
101 # /usr/sbin/sendmail Sendmail executable
102 # sendmail_app='',
103
104 # {sendmail_app} -t -i -f {sender} Template for sendmail execution
105 # sendmail_template='',
106 )
80
107
81 try:
108 try:
82 m = SmtpMailer(mail_from, user, passwd, mail_server, smtp_auth,
109 mailer = Mailer(**email_conf)
83 mail_port, ssl, tls, debug=debug)
110
84 m.send(recipients, subject, body, html_body)
111 message = Message(subject=subject,
112 sender=email_conf['default_sender'],
113 recipients=recipients,
114 body=body, html=html_body)
115 mailer.send_immediately(message)
116
85 except Exception:
117 except Exception:
86 log.exception('Mail sending failed')
118 log.exception('Mail sending failed')
87 return False
119 return False
@@ -122,7 +154,7 b' def create_repo(form_data, cur_user):'
122 'enable_downloads', defs.get('repo_enable_downloads'))
154 'enable_downloads', defs.get('repo_enable_downloads'))
123
155
124 try:
156 try:
125 repo = RepoModel()._create_repo(
157 RepoModel()._create_repo(
126 repo_name=repo_name_full,
158 repo_name=repo_name_full,
127 repo_type=repo_type,
159 repo_type=repo_type,
128 description=description,
160 description=description,
@@ -53,23 +53,27 b' class ChannelstreamPermissionException(C'
53 pass
53 pass
54
54
55
55
56 def get_channelstream_server_url(config, endpoint):
57 return 'http://{}{}'.format(config['server'], endpoint)
58
59
56 def channelstream_request(config, payload, endpoint, raise_exc=True):
60 def channelstream_request(config, payload, endpoint, raise_exc=True):
57 signer = itsdangerous.TimestampSigner(config['secret'])
61 signer = itsdangerous.TimestampSigner(config['secret'])
58 sig_for_server = signer.sign(endpoint)
62 sig_for_server = signer.sign(endpoint)
59 secret_headers = {'x-channelstream-secret': sig_for_server,
63 secret_headers = {'x-channelstream-secret': sig_for_server,
60 'x-channelstream-endpoint': endpoint,
64 'x-channelstream-endpoint': endpoint,
61 'Content-Type': 'application/json'}
65 'Content-Type': 'application/json'}
62 req_url = 'http://{}{}'.format(config['server'], endpoint)
66 req_url = get_channelstream_server_url(config, endpoint)
63 response = None
67 response = None
64 try:
68 try:
65 response = requests.post(req_url, data=json.dumps(payload),
69 response = requests.post(req_url, data=json.dumps(payload),
66 headers=secret_headers).json()
70 headers=secret_headers).json()
67 except requests.ConnectionError:
71 except requests.ConnectionError:
68 log.exception('ConnectionError happened')
72 log.exception('ConnectionError occurred for endpoint %s', req_url)
69 if raise_exc:
73 if raise_exc:
70 raise ChannelstreamConnectionException()
74 raise ChannelstreamConnectionException(req_url)
71 except Exception:
75 except Exception:
72 log.exception('Exception related to channelstream happened')
76 log.exception('Exception related to Channelstream happened')
73 if raise_exc:
77 if raise_exc:
74 raise ChannelstreamConnectionException()
78 raise ChannelstreamConnectionException()
75 return response
79 return response
@@ -25,15 +25,16 b' from itertools import groupby'
25 from pygments import lex
25 from pygments import lex
26 from pygments.formatters.html import _get_ttype_class as pygment_token_class
26 from pygments.formatters.html import _get_ttype_class as pygment_token_class
27 from pygments.lexers.special import TextLexer, Token
27 from pygments.lexers.special import TextLexer, Token
28 from pygments.lexers import get_lexer_by_name
28
29
29 from rhodecode.lib.helpers import (
30 from rhodecode.lib.helpers import (
30 get_lexer_for_filenode, html_escape, get_custom_lexer)
31 get_lexer_for_filenode, html_escape, get_custom_lexer)
31 from rhodecode.lib.utils2 import AttributeDict, StrictAttributeDict
32 from rhodecode.lib.utils2 import AttributeDict, StrictAttributeDict, safe_unicode
32 from rhodecode.lib.vcs.nodes import FileNode
33 from rhodecode.lib.vcs.nodes import FileNode
33 from rhodecode.lib.vcs.exceptions import VCSError, NodeDoesNotExistError
34 from rhodecode.lib.vcs.exceptions import VCSError, NodeDoesNotExistError
34 from rhodecode.lib.diff_match_patch import diff_match_patch
35 from rhodecode.lib.diff_match_patch import diff_match_patch
35 from rhodecode.lib.diffs import LimitedDiffContainer
36 from rhodecode.lib.diffs import LimitedDiffContainer, DEL_FILENODE, BIN_FILENODE
36 from pygments.lexers import get_lexer_by_name
37
37
38
38 plain_text_lexer = get_lexer_by_name(
39 plain_text_lexer = get_lexer_by_name(
39 'text', stripall=False, stripnl=False, ensurenl=False)
40 'text', stripall=False, stripnl=False, ensurenl=False)
@@ -306,7 +307,7 b' def tokens_diff(old_tokens, new_tokens, '
306
307
307 if use_diff_match_patch:
308 if use_diff_match_patch:
308 dmp = diff_match_patch()
309 dmp = diff_match_patch()
309 dmp.Diff_EditCost = 11 # TODO: dan: extract this to a setting
310 dmp.Diff_EditCost = 11 # TODO: dan: extract this to a setting
310 reps = dmp.diff_main(old_string, new_string)
311 reps = dmp.diff_main(old_string, new_string)
311 dmp.diff_cleanupEfficiency(reps)
312 dmp.diff_cleanupEfficiency(reps)
312
313
@@ -368,19 +369,19 b' class DiffSet(object):'
368 adding highlighting, side by side/unified renderings and line diffs
369 adding highlighting, side by side/unified renderings and line diffs
369 """
370 """
370
371
371 HL_REAL = 'REAL' # highlights using original file, slow
372 HL_REAL = 'REAL' # highlights using original file, slow
372 HL_FAST = 'FAST' # highlights using just the line, fast but not correct
373 HL_FAST = 'FAST' # highlights using just the line, fast but not correct
373 # in the case of multiline code
374 # in the case of multiline code
374 HL_NONE = 'NONE' # no highlighting, fastest
375 HL_NONE = 'NONE' # no highlighting, fastest
375
376
376 def __init__(self, highlight_mode=HL_REAL, repo_name=None,
377 def __init__(self, highlight_mode=HL_REAL, repo_name=None,
377 source_repo_name=None,
378 source_repo_name=None,
378 source_node_getter=lambda filename: None,
379 source_node_getter=lambda filename: None,
380 target_repo_name=None,
379 target_node_getter=lambda filename: None,
381 target_node_getter=lambda filename: None,
380 source_nodes=None, target_nodes=None,
382 source_nodes=None, target_nodes=None,
381 max_file_size_limit=150 * 1024, # files over this size will
383 # files over this size will use fast highlighting
382 # use fast highlighting
384 max_file_size_limit=150 * 1024,
383 comments=None,
384 ):
385 ):
385
386
386 self.highlight_mode = highlight_mode
387 self.highlight_mode = highlight_mode
@@ -390,9 +391,8 b' class DiffSet(object):'
390 self.source_nodes = source_nodes or {}
391 self.source_nodes = source_nodes or {}
391 self.target_nodes = target_nodes or {}
392 self.target_nodes = target_nodes or {}
392 self.repo_name = repo_name
393 self.repo_name = repo_name
394 self.target_repo_name = target_repo_name or repo_name
393 self.source_repo_name = source_repo_name or repo_name
395 self.source_repo_name = source_repo_name or repo_name
394 self.comments = comments or {}
395 self.comments_store = self.comments.copy()
396 self.max_file_size_limit = max_file_size_limit
396 self.max_file_size_limit = max_file_size_limit
397
397
398 def render_patchset(self, patchset, source_ref=None, target_ref=None):
398 def render_patchset(self, patchset, source_ref=None, target_ref=None):
@@ -404,6 +404,7 b' class DiffSet(object):'
404 file_stats={},
404 file_stats={},
405 limited_diff=isinstance(patchset, LimitedDiffContainer),
405 limited_diff=isinstance(patchset, LimitedDiffContainer),
406 repo_name=self.repo_name,
406 repo_name=self.repo_name,
407 target_repo_name=self.target_repo_name,
407 source_repo_name=self.source_repo_name,
408 source_repo_name=self.source_repo_name,
408 source_ref=source_ref,
409 source_ref=source_ref,
409 target_ref=target_ref,
410 target_ref=target_ref,
@@ -416,6 +417,7 b' class DiffSet(object):'
416 target_ref=diffset.target_ref,
417 target_ref=diffset.target_ref,
417 repo_name=diffset.repo_name,
418 repo_name=diffset.repo_name,
418 source_repo_name=diffset.source_repo_name,
419 source_repo_name=diffset.source_repo_name,
420 target_repo_name=diffset.target_repo_name,
419 ))
421 ))
420 diffset.files.append(filediff)
422 diffset.files.append(filediff)
421 diffset.changed_files += 1
423 diffset.changed_files += 1
@@ -442,7 +444,7 b' class DiffSet(object):'
442 return self._lexer_cache[filename]
444 return self._lexer_cache[filename]
443
445
444 def render_patch(self, patch):
446 def render_patch(self, patch):
445 log.debug('rendering diff for %r' % patch['filename'])
447 log.debug('rendering diff for %r', patch['filename'])
446
448
447 source_filename = patch['original_filename']
449 source_filename = patch['original_filename']
448 target_filename = patch['filename']
450 target_filename = patch['filename']
@@ -451,7 +453,10 b' class DiffSet(object):'
451 target_lexer = plain_text_lexer
453 target_lexer = plain_text_lexer
452
454
453 if not patch['stats']['binary']:
455 if not patch['stats']['binary']:
454 if self.highlight_mode == self.HL_REAL:
456 node_hl_mode = self.HL_NONE if patch['chunks'] == [] else None
457 hl_mode = node_hl_mode or self.highlight_mode
458
459 if hl_mode == self.HL_REAL:
455 if (source_filename and patch['operation'] in ('D', 'M')
460 if (source_filename and patch['operation'] in ('D', 'M')
456 and source_filename not in self.source_nodes):
461 and source_filename not in self.source_nodes):
457 self.source_nodes[source_filename] = (
462 self.source_nodes[source_filename] = (
@@ -462,12 +467,19 b' class DiffSet(object):'
462 self.target_nodes[target_filename] = (
467 self.target_nodes[target_filename] = (
463 self.target_node_getter(target_filename))
468 self.target_node_getter(target_filename))
464
469
465 elif self.highlight_mode == self.HL_FAST:
470 elif hl_mode == self.HL_FAST:
466 source_lexer = self._get_lexer_for_filename(source_filename)
471 source_lexer = self._get_lexer_for_filename(source_filename)
467 target_lexer = self._get_lexer_for_filename(target_filename)
472 target_lexer = self._get_lexer_for_filename(target_filename)
468
473
469 source_file = self.source_nodes.get(source_filename, source_filename)
474 source_file = self.source_nodes.get(source_filename, source_filename)
470 target_file = self.target_nodes.get(target_filename, target_filename)
475 target_file = self.target_nodes.get(target_filename, target_filename)
476 raw_id_uid = ''
477 if self.source_nodes.get(source_filename):
478 raw_id_uid = self.source_nodes[source_filename].commit.raw_id
479
480 if not raw_id_uid and self.target_nodes.get(target_filename):
481 # in case this is a new file we only have it in target
482 raw_id_uid = self.target_nodes[target_filename].commit.raw_id
471
483
472 source_filenode, target_filenode = None, None
484 source_filenode, target_filenode = None, None
473
485
@@ -509,29 +521,43 b' class DiffSet(object):'
509 'target_mode': patch['stats']['new_mode'],
521 'target_mode': patch['stats']['new_mode'],
510 'limited_diff': isinstance(patch, LimitedDiffContainer),
522 'limited_diff': isinstance(patch, LimitedDiffContainer),
511 'hunks': [],
523 'hunks': [],
524 'hunk_ops': None,
512 'diffset': self,
525 'diffset': self,
526 'raw_id': raw_id_uid,
513 })
527 })
514
528
515 for hunk in patch['chunks'][1:]:
529 file_chunks = patch['chunks'][1:]
530 for hunk in file_chunks:
516 hunkbit = self.parse_hunk(hunk, source_file, target_file)
531 hunkbit = self.parse_hunk(hunk, source_file, target_file)
517 hunkbit.source_file_path = source_file_path
532 hunkbit.source_file_path = source_file_path
518 hunkbit.target_file_path = target_file_path
533 hunkbit.target_file_path = target_file_path
519 filediff.hunks.append(hunkbit)
534 filediff.hunks.append(hunkbit)
520
535
521 left_comments = {}
536 # Simulate hunk on OPS type line which doesn't really contain any diff
522 if source_file_path in self.comments_store:
537 # this allows commenting on those
523 for lineno, comments in self.comments_store[source_file_path].items():
538 if not file_chunks:
524 left_comments[lineno] = comments
539 actions = []
540 for op_id, op_text in filediff.patch['stats']['ops'].items():
541 if op_id == DEL_FILENODE:
542 actions.append(u'file was removed')
543 elif op_id == BIN_FILENODE:
544 actions.append(u'binary diff hidden')
545 else:
546 actions.append(safe_unicode(op_text))
547 action_line = u'NO CONTENT: ' + \
548 u', '.join(actions) or u'UNDEFINED_ACTION'
525
549
526 if target_file_path in self.comments_store:
550 hunk_ops = {'source_length': 0, 'source_start': 0,
527 for lineno, comments in self.comments_store[target_file_path].items():
551 'lines': [
528 left_comments[lineno] = comments
552 {'new_lineno': 0, 'old_lineno': 1,
553 'action': 'unmod-no-hl', 'line': action_line}
554 ],
555 'section_header': u'', 'target_start': 1, 'target_length': 1}
529
556
530 # left comments are one that we couldn't place in diff lines.
557 hunkbit = self.parse_hunk(hunk_ops, source_file, target_file)
531 # could be outdated, or the diff changed and this line is no
558 hunkbit.source_file_path = source_file_path
532 # longer available
559 hunkbit.target_file_path = target_file_path
533 filediff.left_comments = left_comments
560 filediff.hunk_ops = hunkbit
534
535 return filediff
561 return filediff
536
562
537 def parse_hunk(self, hunk, source_file, target_file):
563 def parse_hunk(self, hunk, source_file, target_file):
@@ -546,10 +572,10 b' class DiffSet(object):'
546 before, after = [], []
572 before, after = [], []
547
573
548 for line in hunk['lines']:
574 for line in hunk['lines']:
549
575 if line['action'] in ['unmod', 'unmod-no-hl']:
550 if line['action'] == 'unmod':
576 no_hl = line['action'] == 'unmod-no-hl'
551 result.lines.extend(
577 result.lines.extend(
552 self.parse_lines(before, after, source_file, target_file))
578 self.parse_lines(before, after, source_file, target_file, no_hl=no_hl))
553 after.append(line)
579 after.append(line)
554 before.append(line)
580 before.append(line)
555 elif line['action'] == 'add':
581 elif line['action'] == 'add':
@@ -561,14 +587,18 b' class DiffSet(object):'
561 elif line['action'] == 'new-no-nl':
587 elif line['action'] == 'new-no-nl':
562 after.append(line)
588 after.append(line)
563
589
590 all_actions = [x['action'] for x in after] + [x['action'] for x in before]
591 no_hl = {x for x in all_actions} == {'unmod-no-hl'}
564 result.lines.extend(
592 result.lines.extend(
565 self.parse_lines(before, after, source_file, target_file))
593 self.parse_lines(before, after, source_file, target_file, no_hl=no_hl))
594 # NOTE(marcink): we must keep list() call here so we can cache the result...
566 result.unified = list(self.as_unified(result.lines))
595 result.unified = list(self.as_unified(result.lines))
567 result.sideside = result.lines
596 result.sideside = result.lines
568
597
569 return result
598 return result
570
599
571 def parse_lines(self, before_lines, after_lines, source_file, target_file):
600 def parse_lines(self, before_lines, after_lines, source_file, target_file,
601 no_hl=False):
572 # TODO: dan: investigate doing the diff comparison and fast highlighting
602 # TODO: dan: investigate doing the diff comparison and fast highlighting
573 # on the entire before and after buffered block lines rather than by
603 # on the entire before and after buffered block lines rather than by
574 # line, this means we can get better 'fast' highlighting if the context
604 # line, this means we can get better 'fast' highlighting if the context
@@ -612,9 +642,8 b' class DiffSet(object):'
612 before_tokens = [('nonl', before['line'])]
642 before_tokens = [('nonl', before['line'])]
613 else:
643 else:
614 before_tokens = self.get_line_tokens(
644 before_tokens = self.get_line_tokens(
615 line_text=before['line'],
645 line_text=before['line'], line_number=before['old_lineno'],
616 line_number=before['old_lineno'],
646 input_file=source_file, no_hl=no_hl)
617 file=source_file)
618 original.lineno = before['old_lineno']
647 original.lineno = before['old_lineno']
619 original.content = before['line']
648 original.content = before['line']
620 original.action = self.action_to_op(before['action'])
649 original.action = self.action_to_op(before['action'])
@@ -628,13 +657,12 b' class DiffSet(object):'
628 else:
657 else:
629 after_tokens = self.get_line_tokens(
658 after_tokens = self.get_line_tokens(
630 line_text=after['line'], line_number=after['new_lineno'],
659 line_text=after['line'], line_number=after['new_lineno'],
631 file=target_file)
660 input_file=target_file, no_hl=no_hl)
632 modified.lineno = after['new_lineno']
661 modified.lineno = after['new_lineno']
633 modified.content = after['line']
662 modified.content = after['line']
634 modified.action = self.action_to_op(after['action'])
663 modified.action = self.action_to_op(after['action'])
635
664
636 modified.get_comment_args = (
665 modified.get_comment_args = (target_file, 'n', after['new_lineno'])
637 target_file, 'n', after['new_lineno'])
638
666
639 # diff the lines
667 # diff the lines
640 if before_tokens and after_tokens:
668 if before_tokens and after_tokens:
@@ -663,24 +691,25 b' class DiffSet(object):'
663
691
664 return lines
692 return lines
665
693
666 def get_line_tokens(self, line_text, line_number, file=None):
694 def get_line_tokens(self, line_text, line_number, input_file=None, no_hl=False):
667 filenode = None
695 filenode = None
668 filename = None
696 filename = None
669
697
670 if isinstance(file, basestring):
698 if isinstance(input_file, basestring):
671 filename = file
699 filename = input_file
672 elif isinstance(file, FileNode):
700 elif isinstance(input_file, FileNode):
673 filenode = file
701 filenode = input_file
674 filename = file.unicode_path
702 filename = input_file.unicode_path
675
703
676 if self.highlight_mode == self.HL_REAL and filenode:
704 hl_mode = self.HL_NONE if no_hl else self.highlight_mode
705 if hl_mode == self.HL_REAL and filenode:
677 lexer = self._get_lexer_for_filename(filename)
706 lexer = self._get_lexer_for_filename(filename)
678 file_size_allowed = file.size < self.max_file_size_limit
707 file_size_allowed = input_file.size < self.max_file_size_limit
679 if line_number and file_size_allowed:
708 if line_number and file_size_allowed:
680 return self.get_tokenized_filenode_line(
709 return self.get_tokenized_filenode_line(
681 file, line_number, lexer)
710 input_file, line_number, lexer)
682
711
683 if self.highlight_mode in (self.HL_REAL, self.HL_FAST) and filename:
712 if hl_mode in (self.HL_REAL, self.HL_FAST) and filename:
684 lexer = self._get_lexer_for_filename(filename)
713 lexer = self._get_lexer_for_filename(filename)
685 return list(tokenize_string(line_text, lexer))
714 return list(tokenize_string(line_text, lexer))
686
715
@@ -698,6 +727,7 b' class DiffSet(object):'
698 'add': '+',
727 'add': '+',
699 'del': '-',
728 'del': '-',
700 'unmod': ' ',
729 'unmod': ' ',
730 'unmod-no-hl': ' ',
701 'old-no-nl': ' ',
731 'old-no-nl': ' ',
702 'new-no-nl': ' ',
732 'new-no-nl': ' ',
703 }.get(action, action)
733 }.get(action, action)
@@ -107,7 +107,7 b' class DbManage(object):'
107
107
108 checkfirst = not override
108 checkfirst = not override
109 Base.metadata.create_all(checkfirst=checkfirst)
109 Base.metadata.create_all(checkfirst=checkfirst)
110 log.info('Created tables for %s' % self.dbname)
110 log.info('Created tables for %s', self.dbname)
111
111
112 def set_db_version(self):
112 def set_db_version(self):
113 ver = DbMigrateVersion()
113 ver = DbMigrateVersion()
@@ -115,7 +115,7 b' class DbManage(object):'
115 ver.repository_id = 'rhodecode_db_migrations'
115 ver.repository_id = 'rhodecode_db_migrations'
116 ver.repository_path = 'versions'
116 ver.repository_path = 'versions'
117 self.sa.add(ver)
117 self.sa.add(ver)
118 log.info('db version set to: %s' % __dbversion__)
118 log.info('db version set to: %s', __dbversion__)
119
119
120 def run_pre_migration_tasks(self):
120 def run_pre_migration_tasks(self):
121 """
121 """
@@ -138,7 +138,7 b' class DbManage(object):'
138 DatabaseNotControlledError
138 DatabaseNotControlledError
139
139
140 if 'sqlite' in self.dburi:
140 if 'sqlite' in self.dburi:
141 print (
141 print(
142 '********************** WARNING **********************\n'
142 '********************** WARNING **********************\n'
143 'Make sure your version of sqlite is at least 3.7.X. \n'
143 'Make sure your version of sqlite is at least 3.7.X. \n'
144 'Earlier versions are known to fail on some migrations\n'
144 'Earlier versions are known to fail on some migrations\n'
@@ -402,7 +402,7 b' class DbManage(object):'
402 ('auth_rhodecode_enabled', 'True', 'bool')]:
402 ('auth_rhodecode_enabled', 'True', 'bool')]:
403 if (skip_existing and
403 if (skip_existing and
404 SettingsModel().get_setting_by_name(k) is not None):
404 SettingsModel().get_setting_by_name(k) is not None):
405 log.debug('Skipping option %s' % k)
405 log.debug('Skipping option %s', k)
406 continue
406 continue
407 setting = RhodeCodeSetting(k, v, t)
407 setting = RhodeCodeSetting(k, v, t)
408 self.sa.add(setting)
408 self.sa.add(setting)
@@ -419,7 +419,7 b' class DbManage(object):'
419
419
420 if (skip_existing and
420 if (skip_existing and
421 SettingsModel().get_setting_by_name(k) is not None):
421 SettingsModel().get_setting_by_name(k) is not None):
422 log.debug('Skipping option %s' % k)
422 log.debug('Skipping option %s', k)
423 continue
423 continue
424 setting = RhodeCodeSetting(k, v, t)
424 setting = RhodeCodeSetting(k, v, t)
425 self.sa.add(setting)
425 self.sa.add(setting)
@@ -436,7 +436,7 b' class DbManage(object):'
436 .scalar()
436 .scalar()
437
437
438 if default is None:
438 if default is None:
439 log.debug('missing default permission for group %s adding' % g)
439 log.debug('missing default permission for group %s adding', g)
440 perm_obj = RepoGroupModel()._create_default_perms(g)
440 perm_obj = RepoGroupModel()._create_default_perms(g)
441 self.sa.add(perm_obj)
441 self.sa.add(perm_obj)
442
442
@@ -484,20 +484,20 b' class DbManage(object):'
484 # check proper dir
484 # check proper dir
485 if not os.path.isdir(path):
485 if not os.path.isdir(path):
486 path_ok = False
486 path_ok = False
487 log.error('Given path %s is not a valid directory' % (path,))
487 log.error('Given path %s is not a valid directory', path)
488
488
489 elif not os.path.isabs(path):
489 elif not os.path.isabs(path):
490 path_ok = False
490 path_ok = False
491 log.error('Given path %s is not an absolute path' % (path,))
491 log.error('Given path %s is not an absolute path', path)
492
492
493 # check if path is at least readable.
493 # check if path is at least readable.
494 if not os.access(path, os.R_OK):
494 if not os.access(path, os.R_OK):
495 path_ok = False
495 path_ok = False
496 log.error('Given path %s is not readable' % (path,))
496 log.error('Given path %s is not readable', path)
497
497
498 # check write access, warn user about non writeable paths
498 # check write access, warn user about non writeable paths
499 elif not os.access(path, os.W_OK) and path_ok:
499 elif not os.access(path, os.W_OK) and path_ok:
500 log.warning('No write permission to given path %s' % (path,))
500 log.warning('No write permission to given path %s', path)
501
501
502 q = ('Given path %s is not writeable, do you want to '
502 q = ('Given path %s is not writeable, do you want to '
503 'continue with read only mode ? [y/n]' % (path,))
503 'continue with read only mode ? [y/n]' % (path,))
@@ -573,7 +573,7 b' class DbManage(object):'
573
573
574 def create_user(self, username, password, email='', admin=False,
574 def create_user(self, username, password, email='', admin=False,
575 strict_creation_check=True, api_key=None):
575 strict_creation_check=True, api_key=None):
576 log.info('creating user `%s`' % username)
576 log.info('creating user `%s`', username)
577 user = UserModel().create_or_update(
577 user = UserModel().create_or_update(
578 username, password, email, firstname=u'RhodeCode', lastname=u'Admin',
578 username, password, email, firstname=u'RhodeCode', lastname=u'Admin',
579 active=True, admin=admin, extern_type="rhodecode",
579 active=True, admin=admin, extern_type="rhodecode",
@@ -13,25 +13,25 b' log = logging.getLogger(__name__)'
13
13
14 def usage():
14 def usage():
15 """Gives usage information."""
15 """Gives usage information."""
16 print """Usage: %(prog)s repository-to-migrate
16 print("""Usage: %(prog)s repository-to-migrate
17
17
18 Upgrade your repository to the new flat format.
18 Upgrade your repository to the new flat format.
19
19
20 NOTE: You should probably make a backup before running this.
20 NOTE: You should probably make a backup before running this.
21 """ % {'prog': sys.argv[0]}
21 """ % {'prog': sys.argv[0]})
22
22
23 sys.exit(1)
23 sys.exit(1)
24
24
25
25
26 def delete_file(filepath):
26 def delete_file(filepath):
27 """Deletes a file and prints a message."""
27 """Deletes a file and prints a message."""
28 log.info('Deleting file: %s' % filepath)
28 log.info('Deleting file: %s', filepath)
29 os.remove(filepath)
29 os.remove(filepath)
30
30
31
31
32 def move_file(src, tgt):
32 def move_file(src, tgt):
33 """Moves a file and prints a message."""
33 """Moves a file and prints a message."""
34 log.info('Moving file %s to %s' % (src, tgt))
34 log.info('Moving file %s to %s', src, tgt)
35 if os.path.exists(tgt):
35 if os.path.exists(tgt):
36 raise Exception(
36 raise Exception(
37 'Cannot move file %s because target %s already exists' % \
37 'Cannot move file %s because target %s already exists' % \
@@ -41,13 +41,13 b' def move_file(src, tgt):'
41
41
42 def delete_directory(dirpath):
42 def delete_directory(dirpath):
43 """Delete a directory and print a message."""
43 """Delete a directory and print a message."""
44 log.info('Deleting directory: %s' % dirpath)
44 log.info('Deleting directory: %s', dirpath)
45 os.rmdir(dirpath)
45 os.rmdir(dirpath)
46
46
47
47
48 def migrate_repository(repos):
48 def migrate_repository(repos):
49 """Does the actual migration to the new repository format."""
49 """Does the actual migration to the new repository format."""
50 log.info('Migrating repository at: %s to new format' % repos)
50 log.info('Migrating repository at: %s to new format', repos)
51 versions = '%s/versions' % repos
51 versions = '%s/versions' % repos
52 dirs = os.listdir(versions)
52 dirs = os.listdir(versions)
53 # Only use int's in list.
53 # Only use int's in list.
@@ -55,7 +55,7 b' def migrate_repository(repos):'
55 numdirs.sort() # Sort list.
55 numdirs.sort() # Sort list.
56 for dirname in numdirs:
56 for dirname in numdirs:
57 origdir = '%s/%s' % (versions, dirname)
57 origdir = '%s/%s' % (versions, dirname)
58 log.info('Working on directory: %s' % origdir)
58 log.info('Working on directory: %s', origdir)
59 files = os.listdir(origdir)
59 files = os.listdir(origdir)
60 files.sort()
60 files.sort()
61 for filename in files:
61 for filename in files:
@@ -35,7 +35,7 b' class Pathed(KeyedInstance):'
35 """Try to initialize this object's parent, if it has one"""
35 """Try to initialize this object's parent, if it has one"""
36 parent_path = self.__class__._parent_path(path)
36 parent_path = self.__class__._parent_path(path)
37 self.parent = self.__class__.parent(parent_path)
37 self.parent = self.__class__.parent(parent_path)
38 log.debug("Getting parent %r:%r" % (self.__class__.parent, parent_path))
38 log.debug("Getting parent %r:%r", self.__class__.parent, parent_path)
39 self.parent._init_child(path, self)
39 self.parent._init_child(path, self)
40
40
41 def _init_child(self, child, path):
41 def _init_child(self, child, path):
@@ -73,14 +73,14 b' class Repository(pathed.Pathed):'
73 _versions = 'versions'
73 _versions = 'versions'
74
74
75 def __init__(self, path):
75 def __init__(self, path):
76 log.debug('Loading repository %s...' % path)
76 log.debug('Loading repository %s...', path)
77 self.verify(path)
77 self.verify(path)
78 super(Repository, self).__init__(path)
78 super(Repository, self).__init__(path)
79 self.config = cfgparse.Config(os.path.join(self.path, self._config))
79 self.config = cfgparse.Config(os.path.join(self.path, self._config))
80 self.versions = version.Collection(os.path.join(self.path,
80 self.versions = version.Collection(os.path.join(self.path,
81 self._versions))
81 self._versions))
82 log.debug('Repository %s loaded successfully' % path)
82 log.debug('Repository %s loaded successfully', path)
83 log.debug('Config: %r' % self.config.to_dict())
83 log.debug('Config: %r', self.config.to_dict())
84
84
85 @classmethod
85 @classmethod
86 def verify(cls, path):
86 def verify(cls, path):
@@ -24,10 +24,10 b' class BaseScript(pathed.Pathed):'
24 """ # TODO: sphinxfy this and implement it correctly
24 """ # TODO: sphinxfy this and implement it correctly
25
25
26 def __init__(self, path):
26 def __init__(self, path):
27 log.debug('Loading script %s...' % path)
27 log.debug('Loading script %s...', path)
28 self.verify(path)
28 self.verify(path)
29 super(BaseScript, self).__init__(path)
29 super(BaseScript, self).__init__(path)
30 log.debug('Script %s loaded successfully' % path)
30 log.debug('Script %s loaded successfully', path)
31
31
32 @classmethod
32 @classmethod
33 def verify(cls, path):
33 def verify(cls, path):
@@ -311,7 +311,7 b' class User(Base, BaseModel):'
311 self.last_login = datetime.datetime.now()
311 self.last_login = datetime.datetime.now()
312 Session.add(self)
312 Session.add(self)
313 Session.commit()
313 Session.commit()
314 log.debug('updated user %s lastlogin' % self.username)
314 log.debug('updated user %s lastlogin', self.username)
315
315
316 @classmethod
316 @classmethod
317 def create(cls, form_data):
317 def create(cls, form_data):
@@ -656,7 +656,7 b' class Repository(Base, BaseModel):'
656
656
657 try:
657 try:
658 alias = get_scm(repo_full_path)[0]
658 alias = get_scm(repo_full_path)[0]
659 log.debug('Creating instance of %s repository' % alias)
659 log.debug('Creating instance of %s repository', alias)
660 backend = get_backend(alias)
660 backend = get_backend(alias)
661 except VCSError:
661 except VCSError:
662 log.error(traceback.format_exc())
662 log.error(traceback.format_exc())
@@ -731,7 +731,7 b' class Group(Base, BaseModel):'
731 break
731 break
732 if cnt == parents_recursion_limit:
732 if cnt == parents_recursion_limit:
733 # this will prevent accidental infinit loops
733 # this will prevent accidental infinit loops
734 log.error('group nested more than %s' %
734 log.error('group nested more than %s',
735 parents_recursion_limit)
735 parents_recursion_limit)
736 break
736 break
737
737
@@ -1006,7 +1006,7 b' class CacheInvalidation(Base, BaseModel)'
1006 :param key:
1006 :param key:
1007 """
1007 """
1008
1008
1009 log.debug('marking %s for invalidation' % key)
1009 log.debug('marking %s for invalidation', key)
1010 inv_obj = Session.query(cls)\
1010 inv_obj = Session.query(cls)\
1011 .filter(cls.cache_key == key).scalar()
1011 .filter(cls.cache_key == key).scalar()
1012 if inv_obj:
1012 if inv_obj:
@@ -379,7 +379,7 b' class User(Base, BaseModel):'
379 """Update user lastlogin"""
379 """Update user lastlogin"""
380 self.last_login = datetime.datetime.now()
380 self.last_login = datetime.datetime.now()
381 Session.add(self)
381 Session.add(self)
382 log.debug('updated user %s lastlogin' % self.username)
382 log.debug('updated user %s lastlogin', self.username)
383
383
384 def __json__(self):
384 def __json__(self):
385 return dict(
385 return dict(
@@ -676,7 +676,7 b' class Repository(Base, BaseModel):'
676 repo_full_path = self.repo_full_path
676 repo_full_path = self.repo_full_path
677 try:
677 try:
678 alias = get_scm(repo_full_path)[0]
678 alias = get_scm(repo_full_path)[0]
679 log.debug('Creating instance of %s repository' % alias)
679 log.debug('Creating instance of %s repository', alias)
680 backend = get_backend(alias)
680 backend = get_backend(alias)
681 except VCSError:
681 except VCSError:
682 log.error(traceback.format_exc())
682 log.error(traceback.format_exc())
@@ -760,8 +760,7 b' class RepoGroup(Base, BaseModel):'
760 break
760 break
761 if cnt == parents_recursion_limit:
761 if cnt == parents_recursion_limit:
762 # this will prevent accidental infinit loops
762 # this will prevent accidental infinit loops
763 log.error('group nested more than %s' %
763 log.error('group nested more than %s', parents_recursion_limit)
764 parents_recursion_limit)
765 break
764 break
766
765
767 groups.insert(0, gr)
766 groups.insert(0, gr)
@@ -1095,8 +1094,7 b' class CacheInvalidation(Base, BaseModel)'
1095
1094
1096 key, _prefix, _org_key = cls._get_key(key)
1095 key, _prefix, _org_key = cls._get_key(key)
1097 inv_objs = Session.query(cls).filter(cls.cache_args == _org_key).all()
1096 inv_objs = Session.query(cls).filter(cls.cache_args == _org_key).all()
1098 log.debug('marking %s key[s] %s for invalidation' % (len(inv_objs),
1097 log.debug('marking %s key[s] %s for invalidation', len(inv_objs), _org_key)
1099 _org_key))
1100 try:
1098 try:
1101 for inv_obj in inv_objs:
1099 for inv_obj in inv_objs:
1102 if inv_obj:
1100 if inv_obj:
@@ -614,15 +614,13 b' class Repository(Base, BaseModel):'
614 if (cs_cache != self.changeset_cache or not self.changeset_cache):
614 if (cs_cache != self.changeset_cache or not self.changeset_cache):
615 _default = datetime.datetime.fromtimestamp(0)
615 _default = datetime.datetime.fromtimestamp(0)
616 last_change = cs_cache.get('date') or _default
616 last_change = cs_cache.get('date') or _default
617 log.debug('updated repo %s with new cs cache %s'
617 log.debug('updated repo %s with new cs cache %s', self.repo_name, cs_cache)
618 % (self.repo_name, cs_cache))
619 self.updated_on = last_change
618 self.updated_on = last_change
620 self.changeset_cache = cs_cache
619 self.changeset_cache = cs_cache
621 Session().add(self)
620 Session().add(self)
622 Session().commit()
621 Session().commit()
623 else:
622 else:
624 log.debug('Skipping repo:%s already with latest changes'
623 log.debug('Skipping repo:%s already with latest changes', self.repo_name)
625 % self.repo_name)
626
624
627 class RepoGroup(Base, BaseModel):
625 class RepoGroup(Base, BaseModel):
628 __tablename__ = 'groups'
626 __tablename__ = 'groups'
@@ -2415,8 +2415,8 b' class RepoGroup(Base, BaseModel):'
2415 break
2415 break
2416 if cnt == parents_recursion_limit:
2416 if cnt == parents_recursion_limit:
2417 # this will prevent accidental infinit loops
2417 # this will prevent accidental infinit loops
2418 log.error(('more than %s parents found for group %s, stopping '
2418 log.error('more than %s parents found for group %s, stopping '
2419 'recursive parent fetching' % (parents_recursion_limit, self)))
2419 'recursive parent fetching', parents_recursion_limit, self)
2420 break
2420 break
2421
2421
2422 groups.insert(0, gr)
2422 groups.insert(0, gr)
@@ -2481,8 +2481,8 b' class RepoGroup(Base, BaseModel):'
2481 break
2481 break
2482 if cnt == parents_recursion_limit:
2482 if cnt == parents_recursion_limit:
2483 # this will prevent accidental infinit loops
2483 # this will prevent accidental infinit loops
2484 log.error(('more than %s parents found for group %s, stopping '
2484 log.error('more than %s parents found for group %s, stopping '
2485 'recursive parent fetching' % (parents_recursion_limit, self)))
2485 'recursive parent fetching', parents_recursion_limit, self)
2486 break
2486 break
2487
2487
2488 groups.insert(0, gr)
2488 groups.insert(0, gr)
@@ -2108,8 +2108,8 b' class RepoGroup(Base, BaseModel):'
2108 break
2108 break
2109 if cnt == parents_recursion_limit:
2109 if cnt == parents_recursion_limit:
2110 # this will prevent accidental infinit loops
2110 # this will prevent accidental infinit loops
2111 log.error(('more than %s parents found for group %s, stopping '
2111 log.error('more than %s parents found for group %s, stopping '
2112 'recursive parent fetching' % (parents_recursion_limit, self)))
2112 'recursive parent fetching', parents_recursion_limit, self)
2113 break
2113 break
2114
2114
2115 groups.insert(0, gr)
2115 groups.insert(0, gr)
@@ -2100,8 +2100,8 b' class RepoGroup(Base, BaseModel):'
2100 break
2100 break
2101 if cnt == parents_recursion_limit:
2101 if cnt == parents_recursion_limit:
2102 # this will prevent accidental infinit loops
2102 # this will prevent accidental infinit loops
2103 log.error(('more than %s parents found for group %s, stopping '
2103 log.error('more than %s parents found for group %s, stopping '
2104 'recursive parent fetching' % (parents_recursion_limit, self)))
2104 'recursive parent fetching', parents_recursion_limit, self)
2105 break
2105 break
2106
2106
2107 groups.insert(0, gr)
2107 groups.insert(0, gr)
@@ -2100,8 +2100,8 b' class RepoGroup(Base, BaseModel):'
2100 break
2100 break
2101 if cnt == parents_recursion_limit:
2101 if cnt == parents_recursion_limit:
2102 # this will prevent accidental infinit loops
2102 # this will prevent accidental infinit loops
2103 log.error(('more than %s parents found for group %s, stopping '
2103 log.error('more than %s parents found for group %s, stopping '
2104 'recursive parent fetching' % (parents_recursion_limit, self)))
2104 'recursive parent fetching', parents_recursion_limit, self)
2105 break
2105 break
2106
2106
2107 groups.insert(0, gr)
2107 groups.insert(0, gr)
@@ -2104,8 +2104,8 b' class RepoGroup(Base, BaseModel):'
2104 break
2104 break
2105 if cnt == parents_recursion_limit:
2105 if cnt == parents_recursion_limit:
2106 # this will prevent accidental infinit loops
2106 # this will prevent accidental infinit loops
2107 log.error(('more than %s parents found for group %s, stopping '
2107 log.error('more than %s parents found for group %s, stopping '
2108 'recursive parent fetching' % (parents_recursion_limit, self)))
2108 'recursive parent fetching', parents_recursion_limit, self)
2109 break
2109 break
2110
2110
2111 groups.insert(0, gr)
2111 groups.insert(0, gr)
@@ -2104,8 +2104,8 b' class RepoGroup(Base, BaseModel):'
2104 break
2104 break
2105 if cnt == parents_recursion_limit:
2105 if cnt == parents_recursion_limit:
2106 # this will prevent accidental infinit loops
2106 # this will prevent accidental infinit loops
2107 log.error(('more than %s parents found for group %s, stopping '
2107 log.error('more than %s parents found for group %s, stopping '
2108 'recursive parent fetching' % (parents_recursion_limit, self)))
2108 'recursive parent fetching', parents_recursion_limit, self)
2109 break
2109 break
2110
2110
2111 groups.insert(0, gr)
2111 groups.insert(0, gr)
@@ -2154,8 +2154,8 b' class RepoGroup(Base, BaseModel):'
2154 break
2154 break
2155 if cnt == parents_recursion_limit:
2155 if cnt == parents_recursion_limit:
2156 # this will prevent accidental infinit loops
2156 # this will prevent accidental infinit loops
2157 log.error(('more than %s parents found for group %s, stopping '
2157 log.error('more than %s parents found for group %s, stopping '
2158 'recursive parent fetching' % (parents_recursion_limit, self)))
2158 'recursive parent fetching', parents_recursion_limit, self)
2159 break
2159 break
2160
2160
2161 groups.insert(0, gr)
2161 groups.insert(0, gr)
@@ -2155,8 +2155,8 b' class RepoGroup(Base, BaseModel):'
2155 break
2155 break
2156 if cnt == parents_recursion_limit:
2156 if cnt == parents_recursion_limit:
2157 # this will prevent accidental infinit loops
2157 # this will prevent accidental infinit loops
2158 log.error(('more than %s parents found for group %s, stopping '
2158 log.error('more than %s parents found for group %s, stopping '
2159 'recursive parent fetching' % (parents_recursion_limit, self)))
2159 'recursive parent fetching', parents_recursion_limit, self)
2160 break
2160 break
2161
2161
2162 groups.insert(0, gr)
2162 groups.insert(0, gr)
@@ -2352,8 +2352,8 b' class RepoGroup(Base, BaseModel):'
2352 break
2352 break
2353 if cnt == parents_recursion_limit:
2353 if cnt == parents_recursion_limit:
2354 # this will prevent accidental infinit loops
2354 # this will prevent accidental infinit loops
2355 log.error(('more than %s parents found for group %s, stopping '
2355 log.error('more than %s parents found for group %s, stopping '
2356 'recursive parent fetching' % (parents_recursion_limit, self)))
2356 'recursive parent fetching', parents_recursion_limit, self)
2357 break
2357 break
2358
2358
2359 groups.insert(0, gr)
2359 groups.insert(0, gr)
@@ -74,7 +74,7 b' class User(Base):'
74 self.last_login = datetime.datetime.now()
74 self.last_login = datetime.datetime.now()
75 session.add(self)
75 session.add(self)
76 session.commit()
76 session.commit()
77 log.debug('updated user %s lastlogin' % self.username)
77 log.debug('updated user %s lastlogin', self.username)
78 except (DatabaseError,):
78 except (DatabaseError,):
79 session.rollback()
79 session.rollback()
80
80
@@ -33,7 +33,7 b' def upgrade(migrate_engine):'
33 old_cons = UniqueConstraint('user_id', 'repository_id', table=tbl)
33 old_cons = UniqueConstraint('user_id', 'repository_id', table=tbl)
34 else:
34 else:
35 # sqlite doesn't support dropping constraints...
35 # sqlite doesn't support dropping constraints...
36 print """Please manually drop UniqueConstraint('user_id', 'repository_id')"""
36 print("""Please manually drop UniqueConstraint('user_id', 'repository_id')""")
37
37
38 if old_cons:
38 if old_cons:
39 try:
39 try:
@@ -41,7 +41,7 b' def upgrade(migrate_engine):'
41 except Exception as e:
41 except Exception as e:
42 # we don't care if this fails really... better to pass migration than
42 # we don't care if this fails really... better to pass migration than
43 # leave this in intermidiate state
43 # leave this in intermidiate state
44 print 'Failed to remove Unique for user_id, repository_id reason %s' % e
44 print('Failed to remove Unique for user_id, repository_id reason %s' % e)
45
45
46
46
47 #==========================================================================
47 #==========================================================================
@@ -61,7 +61,7 b' def upgrade(migrate_engine):'
61 old_cons = UniqueConstraint('group_id', 'permission_id', table=tbl, name='group_to_perm_group_id_permission_id_key')
61 old_cons = UniqueConstraint('group_id', 'permission_id', table=tbl, name='group_to_perm_group_id_permission_id_key')
62 else:
62 else:
63 # sqlite doesn't support dropping constraints...
63 # sqlite doesn't support dropping constraints...
64 print """Please manually drop UniqueConstraint('group_id', 'permission_id')"""
64 print("""Please manually drop UniqueConstraint('group_id', 'permission_id')""")
65
65
66 if old_cons:
66 if old_cons:
67 try:
67 try:
@@ -69,7 +69,7 b' def upgrade(migrate_engine):'
69 except Exception as e:
69 except Exception as e:
70 # we don't care if this fails really... better to pass migration than
70 # we don't care if this fails really... better to pass migration than
71 # leave this in intermidiate state
71 # leave this in intermidiate state
72 print 'Failed to remove Unique for user_id, repository_id reason %s' % e
72 print('Failed to remove Unique for user_id, repository_id reason %s' % e)
73
73
74 return
74 return
75
75
@@ -80,7 +80,7 b' def fixups(models, _SESSION):'
80 new_perm = models.Permission()
80 new_perm = models.Permission()
81 new_perm.permission_name = p[0]
81 new_perm.permission_name = p[0]
82 new_perm.permission_longname = p[0] #translation err with p[1]
82 new_perm.permission_longname = p[0] #translation err with p[1]
83 print 'Creating new permission %s' % p[0]
83 print('Creating new permission %s' % p[0])
84 _SESSION().add(new_perm)
84 _SESSION().add(new_perm)
85
85
86 _SESSION().commit()
86 _SESSION().commit()
@@ -102,7 +102,7 b' def fixups(models, _SESSION):'
102 perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all()
102 perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all()
103 defined_perms_groups = map(
103 defined_perms_groups = map(
104 _get_group, (x.permission.permission_name for x in perms))
104 _get_group, (x.permission.permission_name for x in perms))
105 log.debug('GOT ALREADY DEFINED:%s' % perms)
105 log.debug('GOT ALREADY DEFINED:%s', perms)
106 DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS
106 DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS
107
107
108 # for every default permission that needs to be created, we check if
108 # for every default permission that needs to be created, we check if
@@ -110,8 +110,7 b' def fixups(models, _SESSION):'
110 for perm_name in DEFAULT_PERMS:
110 for perm_name in DEFAULT_PERMS:
111 gr = _get_group(perm_name)
111 gr = _get_group(perm_name)
112 if gr not in defined_perms_groups:
112 if gr not in defined_perms_groups:
113 log.debug('GR:%s not found, creating permission %s'
113 log.debug('GR:%s not found, creating permission %s', gr, perm_name)
114 % (gr, perm_name))
115 new_perm = _make_perm(perm_name)
114 new_perm = _make_perm(perm_name)
116 _SESSION().add(new_perm)
115 _SESSION().add(new_perm)
117 _SESSION().commit()
116 _SESSION().commit()
@@ -127,7 +126,7 b' def fixups(models, _SESSION):'
127 ('default_repo_type', 'hg')]:
126 ('default_repo_type', 'hg')]:
128
127
129 if skip_existing and get_by_name(models.RhodeCodeSetting, k) is not None:
128 if skip_existing and get_by_name(models.RhodeCodeSetting, k) is not None:
130 log.debug('Skipping option %s' % k)
129 log.debug('Skipping option %s', k)
131 continue
130 continue
132 setting = models.RhodeCodeSetting(k, v)
131 setting = models.RhodeCodeSetting(k, v)
133 _SESSION().add(setting)
132 _SESSION().add(setting)
@@ -44,6 +44,6 b' def fixups(models, _SESSION):'
44 notify('Upgrading repositories Caches')
44 notify('Upgrading repositories Caches')
45 repositories = models.Repository.getAll()
45 repositories = models.Repository.getAll()
46 for repo in repositories:
46 for repo in repositories:
47 print repo
47 print(repo)
48 repo.update_commit_cache()
48 repo.update_commit_cache()
49 _SESSION().commit()
49 _SESSION().commit()
@@ -99,7 +99,7 b' def fixups(models, _SESSION):'
99 perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all()
99 perms = models.UserToPerm.query().filter(models.UserToPerm.user == user).all()
100 defined_perms_groups = map(_get_group,
100 defined_perms_groups = map(_get_group,
101 (x.permission.permission_name for x in perms))
101 (x.permission.permission_name for x in perms))
102 log.debug('GOT ALREADY DEFINED:%s' % perms)
102 log.debug('GOT ALREADY DEFINED:%s', perms)
103 DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS
103 DEFAULT_PERMS = models.Permission.DEFAULT_USER_PERMISSIONS
104
104
105 # for every default permission that needs to be created, we check if
105 # for every default permission that needs to be created, we check if
@@ -107,8 +107,7 b' def fixups(models, _SESSION):'
107 for perm_name in DEFAULT_PERMS:
107 for perm_name in DEFAULT_PERMS:
108 gr = _get_group(perm_name)
108 gr = _get_group(perm_name)
109 if gr not in defined_perms_groups:
109 if gr not in defined_perms_groups:
110 log.debug('GR:%s not found, creating permission %s'
110 log.debug('GR:%s not found, creating permission %s', gr, perm_name)
111 % (gr, perm_name))
112 new_perm = _make_perm(perm_name)
111 new_perm = _make_perm(perm_name)
113 _SESSION().add(new_perm)
112 _SESSION().add(new_perm)
114 _SESSION().commit()
113 _SESSION().commit()
@@ -73,7 +73,7 b' def fixups(models, _SESSION):'
73 repo_store_path = get_repos_location(models.RhodeCodeUi)
73 repo_store_path = get_repos_location(models.RhodeCodeUi)
74 _store = os.path.join(repo_store_path, '.cache', 'largefiles')
74 _store = os.path.join(repo_store_path, '.cache', 'largefiles')
75 notify('Setting largefiles usercache')
75 notify('Setting largefiles usercache')
76 print _store
76 print(_store)
77
77
78 if not models.RhodeCodeUi.query().filter(
78 if not models.RhodeCodeUi.query().filter(
79 models.RhodeCodeUi.ui_key == 'usercache').scalar():
79 models.RhodeCodeUi.ui_key == 'usercache').scalar():
@@ -39,7 +39,7 b' def fixups(models, _SESSION):'
39 notify('fixing new schema for landing_rev')
39 notify('fixing new schema for landing_rev')
40
40
41 for repo in models.Repository.get_all():
41 for repo in models.Repository.get_all():
42 print u'repo %s old landing rev is: %s' % (repo, repo.landing_rev)
42 print(u'repo %s old landing rev is: %s' % (repo, repo.landing_rev))
43 _rev = repo.landing_rev[1]
43 _rev = repo.landing_rev[1]
44 _rev_type = 'rev' # default
44 _rev_type = 'rev' # default
45
45
@@ -58,13 +58,13 b' def fixups(models, _SESSION):'
58 elif _rev in known_bookmarks:
58 elif _rev in known_bookmarks:
59 _rev_type = 'book'
59 _rev_type = 'book'
60 except Exception as e:
60 except Exception as e:
61 print e
61 print(e)
62 print 'continue...'
62 print('continue...')
63 #we don't want any error to break the process
63 #we don't want any error to break the process
64 pass
64 pass
65
65
66 _new_landing_rev = '%s:%s' % (_rev_type, _rev)
66 _new_landing_rev = '%s:%s' % (_rev_type, _rev)
67 print u'setting to %s' % _new_landing_rev
67 print(u'setting to %s' % _new_landing_rev)
68 repo.landing_rev = _new_landing_rev
68 repo.landing_rev = _new_landing_rev
69 _SESSION().add(repo)
69 _SESSION().add(repo)
70 _SESSION().commit()
70 _SESSION().commit()
@@ -47,7 +47,7 b' def fixups(models, _SESSION):'
47 new_perm = models.Permission()
47 new_perm = models.Permission()
48 new_perm.permission_name = p[0]
48 new_perm.permission_name = p[0]
49 new_perm.permission_longname = p[0] #translation err with p[1]
49 new_perm.permission_longname = p[0] #translation err with p[1]
50 print 'Creating new permission %s' % p[0]
50 print('Creating new permission %s' % p[0])
51 _SESSION().add(new_perm)
51 _SESSION().add(new_perm)
52
52
53 _SESSION().commit()
53 _SESSION().commit()
@@ -60,6 +60,6 b' def fixups(models, _SESSION):'
60 new = models.UserToPerm()
60 new = models.UserToPerm()
61 new.user = user
61 new.user = user
62 new.permission = get_by_key(models.Permission, _def)
62 new.permission = get_by_key(models.Permission, _def)
63 print 'Setting default to %s' % _def
63 print('Setting default to %s' % _def)
64 _SESSION().add(new)
64 _SESSION().add(new)
65 _SESSION().commit()
65 _SESSION().commit()
@@ -38,7 +38,7 b' def downgrade(migrate_engine):'
38 def fixups(models, _SESSION):
38 def fixups(models, _SESSION):
39 notify('Setting default renderer to rst')
39 notify('Setting default renderer to rst')
40 for cs_comment in models.ChangesetComment.get_all():
40 for cs_comment in models.ChangesetComment.get_all():
41 print 'comment_id %s renderer rst' % (cs_comment.comment_id)
41 print('comment_id %s renderer rst' % (cs_comment.comment_id))
42 cs_comment.renderer = 'rst'
42 cs_comment.renderer = 'rst'
43 _SESSION().add(cs_comment)
43 _SESSION().add(cs_comment)
44 _SESSION().commit()
44 _SESSION().commit()
@@ -41,7 +41,16 b' log = logging.getLogger(__name__)'
41
41
42 # define max context, a file with more than this numbers of lines is unusable
42 # define max context, a file with more than this numbers of lines is unusable
43 # in browser anyway
43 # in browser anyway
44 MAX_CONTEXT = 1024 * 1014
44 MAX_CONTEXT = 20 * 1024
45 DEFAULT_CONTEXT = 3
46
47
48 def get_diff_context(request):
49 return MAX_CONTEXT if request.GET.get('fullcontext', '') == '1' else DEFAULT_CONTEXT
50
51
52 def get_diff_whitespace_flag(request):
53 return request.GET.get('ignorews', '') == '1'
45
54
46
55
47 class OPS(object):
56 class OPS(object):
@@ -446,7 +455,7 b' class DiffProcessor(object):'
446
455
447 for chunk in self._diff.chunks():
456 for chunk in self._diff.chunks():
448 head = chunk.header
457 head = chunk.header
449 log.debug('parsing diff %r' % head)
458 log.debug('parsing diff %r', head)
450
459
451 raw_diff = chunk.raw
460 raw_diff = chunk.raw
452 limited_diff = False
461 limited_diff = False
@@ -1134,10 +1143,23 b' class DiffLimitExceeded(Exception):'
1134 pass
1143 pass
1135
1144
1136
1145
1146 # NOTE(marcink): if diffs.mako change, probably this
1147 # needs a bump to next version
1148 CURRENT_DIFF_VERSION = 'v4'
1149
1150
1151 def _cleanup_cache_file(cached_diff_file):
1152 # cleanup file to not store it "damaged"
1153 try:
1154 os.remove(cached_diff_file)
1155 except Exception:
1156 log.exception('Failed to cleanup path %s', cached_diff_file)
1157
1158
1137 def cache_diff(cached_diff_file, diff, commits):
1159 def cache_diff(cached_diff_file, diff, commits):
1138
1160
1139 struct = {
1161 struct = {
1140 'version': 'v1',
1162 'version': CURRENT_DIFF_VERSION,
1141 'diff': diff,
1163 'diff': diff,
1142 'commits': commits
1164 'commits': commits
1143 }
1165 }
@@ -1148,17 +1170,13 b' def cache_diff(cached_diff_file, diff, c'
1148 log.debug('Saved diff cache under %s', cached_diff_file)
1170 log.debug('Saved diff cache under %s', cached_diff_file)
1149 except Exception:
1171 except Exception:
1150 log.warn('Failed to save cache', exc_info=True)
1172 log.warn('Failed to save cache', exc_info=True)
1151 # cleanup file to not store it "damaged"
1173 _cleanup_cache_file(cached_diff_file)
1152 try:
1153 os.remove(cached_diff_file)
1154 except Exception:
1155 log.exception('Failed to cleanup path %s', cached_diff_file)
1156
1174
1157
1175
1158 def load_cached_diff(cached_diff_file):
1176 def load_cached_diff(cached_diff_file):
1159
1177
1160 default_struct = {
1178 default_struct = {
1161 'version': 'v1',
1179 'version': CURRENT_DIFF_VERSION,
1162 'diff': None,
1180 'diff': None,
1163 'commits': None
1181 'commits': None
1164 }
1182 }
@@ -1182,6 +1200,12 b' def load_cached_diff(cached_diff_file):'
1182 # old version of data ?
1200 # old version of data ?
1183 data = default_struct
1201 data = default_struct
1184
1202
1203 # check version
1204 if data.get('version') != CURRENT_DIFF_VERSION:
1205 # purge cache
1206 _cleanup_cache_file(cached_diff_file)
1207 return default_struct
1208
1185 return data
1209 return data
1186
1210
1187
1211
@@ -70,6 +70,10 b' class AttachedForksError(Exception):'
70 pass
70 pass
71
71
72
72
73 class AttachedPullRequestsError(Exception):
74 pass
75
76
73 class RepoGroupAssignmentError(Exception):
77 class RepoGroupAssignmentError(Exception):
74 pass
78 pass
75
79
@@ -1249,15 +1249,18 b' class InitialsGravatar(object):'
1249 """
1249 """
1250 generates the svg metadata for image
1250 generates the svg metadata for image
1251 """
1251 """
1252
1252 fonts = [
1253 font_family = ','.join([
1253 '-apple-system',
1254 'proximanovaregular',
1254 'BlinkMacSystemFont',
1255 'Proxima Nova Regular',
1255 'Segoe UI',
1256 'Proxima Nova',
1256 'Roboto',
1257 'Arial',
1257 'Oxygen-Sans',
1258 'Lucida Grande',
1258 'Ubuntu',
1259 'sans-serif'
1259 'Cantarell',
1260 ])
1260 'Helvetica Neue',
1261 'sans-serif'
1262 ]
1263 font_family = ','.join(fonts)
1261 if svg_type:
1264 if svg_type:
1262 return self.get_img_data_by_type(font_family, svg_type)
1265 return self.get_img_data_by_type(font_family, svg_type)
1263
1266
@@ -1712,14 +1715,14 b' def process_patterns(text_string, repo_n'
1712 newtext = text_string
1715 newtext = text_string
1713
1716
1714 for uid, entry in active_entries.items():
1717 for uid, entry in active_entries.items():
1715 log.debug('found issue tracker entry with uid %s' % (uid,))
1718 log.debug('found issue tracker entry with uid %s', uid)
1716
1719
1717 if not (entry['pat'] and entry['url']):
1720 if not (entry['pat'] and entry['url']):
1718 log.debug('skipping due to missing data')
1721 log.debug('skipping due to missing data')
1719 continue
1722 continue
1720
1723
1721 log.debug('issue tracker entry: uid: `%s` PAT:%s URL:%s PREFIX:%s'
1724 log.debug('issue tracker entry: uid: `%s` PAT:%s URL:%s PREFIX:%s',
1722 % (uid, entry['pat'], entry['url'], entry['pref']))
1725 uid, entry['pat'], entry['url'], entry['pref'])
1723
1726
1724 try:
1727 try:
1725 pattern = re.compile(r'%s' % entry['pat'])
1728 pattern = re.compile(r'%s' % entry['pat'])
@@ -1741,7 +1744,7 b' def process_patterns(text_string, repo_n'
1741 link_format=link_format)
1744 link_format=link_format)
1742
1745
1743 newtext = pattern.sub(url_func, newtext)
1746 newtext = pattern.sub(url_func, newtext)
1744 log.debug('processed prefix:uid `%s`' % (uid,))
1747 log.debug('processed prefix:uid `%s`', uid)
1745
1748
1746 return newtext, issues_data
1749 return newtext, issues_data
1747
1750
@@ -39,7 +39,21 b' from rhodecode.model.db import Repositor'
39 log = logging.getLogger(__name__)
39 log = logging.getLogger(__name__)
40
40
41
41
42 HookResponse = collections.namedtuple('HookResponse', ('status', 'output'))
42 class HookResponse(object):
43 def __init__(self, status, output):
44 self.status = status
45 self.output = output
46
47 def __add__(self, other):
48 other_status = getattr(other, 'status', 0)
49 new_status = max(self.status, other_status)
50 other_output = getattr(other, 'output', '')
51 new_output = self.output + other_output
52
53 return HookResponse(new_status, new_output)
54
55 def __bool__(self):
56 return self.status == 0
43
57
44
58
45 def is_shadow_repo(extras):
59 def is_shadow_repo(extras):
@@ -110,6 +124,7 b' def pre_push(extras):'
110 else:
124 else:
111 raise _http_ret
125 raise _http_ret
112
126
127 hook_response = ''
113 if not is_shadow_repo(extras):
128 if not is_shadow_repo(extras):
114 if extras.commit_ids and extras.check_branch_perms:
129 if extras.commit_ids and extras.check_branch_perms:
115
130
@@ -152,11 +167,12 b' def pre_push(extras):'
152
167
153 # Propagate to external components. This is done after checking the
168 # Propagate to external components. This is done after checking the
154 # lock, for consistent behavior.
169 # lock, for consistent behavior.
155 pre_push_extension(repo_store_path=Repository.base_path(), **extras)
170 hook_response = pre_push_extension(
171 repo_store_path=Repository.base_path(), **extras)
156 events.trigger(events.RepoPrePushEvent(
172 events.trigger(events.RepoPrePushEvent(
157 repo_name=extras.repository, extras=extras))
173 repo_name=extras.repository, extras=extras))
158
174
159 return HookResponse(0, output)
175 return HookResponse(0, output) + hook_response
160
176
161
177
162 def pre_pull(extras):
178 def pre_pull(extras):
@@ -182,12 +198,15 b' def pre_pull(extras):'
182
198
183 # Propagate to external components. This is done after checking the
199 # Propagate to external components. This is done after checking the
184 # lock, for consistent behavior.
200 # lock, for consistent behavior.
201 hook_response = ''
185 if not is_shadow_repo(extras):
202 if not is_shadow_repo(extras):
186 pre_pull_extension(**extras)
203 extras.hook_type = extras.hook_type or 'pre_pull'
204 hook_response = pre_pull_extension(
205 repo_store_path=Repository.base_path(), **extras)
187 events.trigger(events.RepoPrePullEvent(
206 events.trigger(events.RepoPrePullEvent(
188 repo_name=extras.repository, extras=extras))
207 repo_name=extras.repository, extras=extras))
189
208
190 return HookResponse(0, output)
209 return HookResponse(0, output) + hook_response
191
210
192
211
193 def post_pull(extras):
212 def post_pull(extras):
@@ -198,16 +217,9 b' def post_pull(extras):'
198 ip_addr=extras.ip)
217 ip_addr=extras.ip)
199 repo = audit_logger.RepoWrap(repo_name=extras.repository)
218 repo = audit_logger.RepoWrap(repo_name=extras.repository)
200 audit_logger.store(
219 audit_logger.store(
201 'user.pull', action_data={
220 'user.pull', action_data={'user_agent': extras.user_agent},
202 'user_agent': extras.user_agent},
203 user=audit_user, repo=repo, commit=True)
221 user=audit_user, repo=repo, commit=True)
204
222
205 # Propagate to external components.
206 if not is_shadow_repo(extras):
207 post_pull_extension(**extras)
208 events.trigger(events.RepoPullEvent(
209 repo_name=extras.repository, extras=extras))
210
211 output = ''
223 output = ''
212 # make lock is a tri state False, True, None. We only make lock on True
224 # make lock is a tri state False, True, None. We only make lock on True
213 if extras.make_lock is True and not is_shadow_repo(extras):
225 if extras.make_lock is True and not is_shadow_repo(extras):
@@ -227,7 +239,16 b' def post_pull(extras):'
227 # 2xx Codes don't raise exceptions
239 # 2xx Codes don't raise exceptions
228 output += _http_ret.title
240 output += _http_ret.title
229
241
230 return HookResponse(0, output)
242 # Propagate to external components.
243 hook_response = ''
244 if not is_shadow_repo(extras):
245 extras.hook_type = extras.hook_type or 'post_pull'
246 hook_response = post_pull_extension(
247 repo_store_path=Repository.base_path(), **extras)
248 events.trigger(events.RepoPullEvent(
249 repo_name=extras.repository, extras=extras))
250
251 return HookResponse(0, output) + hook_response
231
252
232
253
233 def post_push(extras):
254 def post_push(extras):
@@ -245,16 +266,6 b' def post_push(extras):'
245 user=audit_user, repo=repo, commit=True)
266 user=audit_user, repo=repo, commit=True)
246
267
247 # Propagate to external components.
268 # Propagate to external components.
248 if not is_shadow_repo(extras):
249 post_push_extension(
250 repo_store_path=Repository.base_path(),
251 pushed_revs=commit_ids,
252 **extras)
253 events.trigger(events.RepoPushEvent(
254 repo_name=extras.repository,
255 pushed_commit_ids=commit_ids,
256 extras=extras))
257
258 output = ''
269 output = ''
259 # make lock is a tri state False, True, None. We only release lock on False
270 # make lock is a tri state False, True, None. We only release lock on False
260 if extras.make_lock is False and not is_shadow_repo(extras):
271 if extras.make_lock is False and not is_shadow_repo(extras):
@@ -285,8 +296,16 b' def post_push(extras):'
285 output += 'RhodeCode: open pull request link: {}\n'.format(
296 output += 'RhodeCode: open pull request link: {}\n'.format(
286 tmpl.format(ref_type='bookmark', ref_name=book_name))
297 tmpl.format(ref_type='bookmark', ref_name=book_name))
287
298
299 hook_response = ''
300 if not is_shadow_repo(extras):
301 hook_response = post_push_extension(
302 repo_store_path=Repository.base_path(),
303 **extras)
304 events.trigger(events.RepoPushEvent(
305 repo_name=extras.repository, pushed_commit_ids=commit_ids, extras=extras))
306
288 output += 'RhodeCode: push completed\n'
307 output += 'RhodeCode: push completed\n'
289 return HookResponse(0, output)
308 return HookResponse(0, output) + hook_response
290
309
291
310
292 def _locked_by_explanation(repo_name, user_name, reason):
311 def _locked_by_explanation(repo_name, user_name, reason):
@@ -299,8 +318,10 b' def _locked_by_explanation(repo_name, us'
299 def check_allowed_create_user(user_dict, created_by, **kwargs):
318 def check_allowed_create_user(user_dict, created_by, **kwargs):
300 # pre create hooks
319 # pre create hooks
301 if pre_create_user.is_active():
320 if pre_create_user.is_active():
302 allowed, reason = pre_create_user(created_by=created_by, **user_dict)
321 hook_result = pre_create_user(created_by=created_by, **user_dict)
322 allowed = hook_result.status == 0
303 if not allowed:
323 if not allowed:
324 reason = hook_result.output
304 raise UserCreationError(reason)
325 raise UserCreationError(reason)
305
326
306
327
@@ -319,8 +340,15 b' class ExtensionCallback(object):'
319
340
320 def __call__(self, *args, **kwargs):
341 def __call__(self, *args, **kwargs):
321 log.debug('Calling extension callback for %s', self._hook_name)
342 log.debug('Calling extension callback for %s', self._hook_name)
343 kwargs_to_pass = {}
344 for key in self._kwargs_keys:
345 try:
346 kwargs_to_pass[key] = kwargs[key]
347 except KeyError:
348 log.error('Failed to fetch %s key. Expected keys: %s',
349 key, self._kwargs_keys)
350 raise
322
351
323 kwargs_to_pass = dict((key, kwargs[key]) for key in self._kwargs_keys)
324 # backward compat for removed api_key for old hooks. THis was it works
352 # backward compat for removed api_key for old hooks. THis was it works
325 # with older rcextensions that require api_key present
353 # with older rcextensions that require api_key present
326 if self._hook_name in ['CREATE_USER_HOOK', 'DELETE_USER_HOOK']:
354 if self._hook_name in ['CREATE_USER_HOOK', 'DELETE_USER_HOOK']:
@@ -343,28 +371,28 b' pre_pull_extension = ExtensionCallback('
343 hook_name='PRE_PULL_HOOK',
371 hook_name='PRE_PULL_HOOK',
344 kwargs_keys=(
372 kwargs_keys=(
345 'server_url', 'config', 'scm', 'username', 'ip', 'action',
373 'server_url', 'config', 'scm', 'username', 'ip', 'action',
346 'repository'))
374 'repository', 'hook_type', 'user_agent', 'repo_store_path',))
347
375
348
376
349 post_pull_extension = ExtensionCallback(
377 post_pull_extension = ExtensionCallback(
350 hook_name='PULL_HOOK',
378 hook_name='PULL_HOOK',
351 kwargs_keys=(
379 kwargs_keys=(
352 'server_url', 'config', 'scm', 'username', 'ip', 'action',
380 'server_url', 'config', 'scm', 'username', 'ip', 'action',
353 'repository'))
381 'repository', 'hook_type', 'user_agent', 'repo_store_path',))
354
382
355
383
356 pre_push_extension = ExtensionCallback(
384 pre_push_extension = ExtensionCallback(
357 hook_name='PRE_PUSH_HOOK',
385 hook_name='PRE_PUSH_HOOK',
358 kwargs_keys=(
386 kwargs_keys=(
359 'server_url', 'config', 'scm', 'username', 'ip', 'action',
387 'server_url', 'config', 'scm', 'username', 'ip', 'action',
360 'repository', 'repo_store_path', 'commit_ids'))
388 'repository', 'repo_store_path', 'commit_ids', 'hook_type', 'user_agent',))
361
389
362
390
363 post_push_extension = ExtensionCallback(
391 post_push_extension = ExtensionCallback(
364 hook_name='PUSH_HOOK',
392 hook_name='PUSH_HOOK',
365 kwargs_keys=(
393 kwargs_keys=(
366 'server_url', 'config', 'scm', 'username', 'ip', 'action',
394 'server_url', 'config', 'scm', 'username', 'ip', 'action',
367 'repository', 'repo_store_path', 'pushed_revs'))
395 'repository', 'repo_store_path', 'commit_ids', 'hook_type', 'user_agent',))
368
396
369
397
370 pre_create_user = ExtensionCallback(
398 pre_create_user = ExtensionCallback(
@@ -245,7 +245,6 b' def prepare_callback_daemon(extras, prot'
245
245
246 # register txn_id
246 # register txn_id
247 extras['txn_id'] = txn_id
247 extras['txn_id'] = txn_id
248
249 log.debug('Prepared a callback daemon: %s at url `%s`',
248 log.debug('Prepared a callback daemon: %s at url `%s`',
250 callback_daemon.__class__.__name__, callback_daemon.hooks_uri)
249 callback_daemon.__class__.__name__, callback_daemon.hooks_uri)
251 return callback_daemon, extras
250 return callback_daemon, extras
@@ -292,6 +291,9 b' class Hooks(object):'
292
291
293 try:
292 try:
294 result = hook(extras)
293 result = hook(extras)
294 if result is None:
295 raise Exception(
296 'Failed to obtain hook result from func: {}'.format(hook))
295 except HTTPBranchProtected as handled_error:
297 except HTTPBranchProtected as handled_error:
296 # Those special cases doesn't need error reporting. It's a case of
298 # Those special cases doesn't need error reporting. It's a case of
297 # locked repo or protected branch
299 # locked repo or protected branch
@@ -47,7 +47,7 b' def _get_rc_scm_extras(username, repo_na'
47
47
48
48
49 def trigger_post_push_hook(
49 def trigger_post_push_hook(
50 username, action, repo_name, repo_alias, commit_ids):
50 username, action, hook_type, repo_name, repo_alias, commit_ids):
51 """
51 """
52 Triggers push action hooks
52 Triggers push action hooks
53
53
@@ -59,6 +59,7 b' def trigger_post_push_hook('
59 """
59 """
60 extras = _get_rc_scm_extras(username, repo_name, repo_alias, action)
60 extras = _get_rc_scm_extras(username, repo_name, repo_alias, action)
61 extras.commit_ids = commit_ids
61 extras.commit_ids = commit_ids
62 extras.hook_type = hook_type
62 hooks_base.post_push(extras)
63 hooks_base.post_push(extras)
63
64
64
65
@@ -122,7 +122,7 b' class Search(BaseSearch):'
122 search_user, repo_name)
122 search_user, repo_name)
123 try:
123 try:
124 query = qp.parse(safe_unicode(query))
124 query = qp.parse(safe_unicode(query))
125 log.debug('query: %s (%s)' % (query, repr(query)))
125 log.debug('query: %s (%s)', query, repr(query))
126
126
127 reverse, sortedby = False, None
127 reverse, sortedby = False, None
128 if search_type == 'message':
128 if search_type == 'message':
@@ -217,8 +217,8 b' class Search(BaseSearch):'
217 'path': self.file_schema
217 'path': self.file_schema
218 }.get(cur_type, self.file_schema)
218 }.get(cur_type, self.file_schema)
219
219
220 log.debug('IDX: %s' % index_name)
220 log.debug('IDX: %s', index_name)
221 log.debug('SCHEMA: %s' % schema_defn)
221 log.debug('SCHEMA: %s', schema_defn)
222 return search_type, index_name, schema_defn
222 return search_type, index_name, schema_defn
223
223
224 def _init_searcher(self, index_name):
224 def _init_searcher(self, index_name):
@@ -60,7 +60,9 b' class CustomHTMLTranslator(writers.html4'
60 refuri = node['refuri']
60 refuri = node['refuri']
61 if ':' in refuri:
61 if ':' in refuri:
62 prefix, link = refuri.lstrip().split(':', 1)
62 prefix, link = refuri.lstrip().split(':', 1)
63 if prefix == 'javascript':
63 prefix = prefix or ''
64
65 if prefix.lower() == 'javascript':
64 # we don't allow javascript type of refs...
66 # we don't allow javascript type of refs...
65 node['refuri'] = 'javascript:alert("SandBoxedJavascript")'
67 node['refuri'] = 'javascript:alert("SandBoxedJavascript")'
66
68
@@ -434,12 +436,20 b' class MarkupRenderer(object):'
434 def preprocess(self, nb, resources):
436 def preprocess(self, nb, resources):
435 sandbox_text = 'SandBoxed(IPython.core.display.Javascript object)'
437 sandbox_text = 'SandBoxed(IPython.core.display.Javascript object)'
436 for cell in nb['cells']:
438 for cell in nb['cells']:
437 if safe and 'outputs' in cell:
439 if not safe:
440 continue
441
442 if 'outputs' in cell:
438 for cell_output in cell['outputs']:
443 for cell_output in cell['outputs']:
439 if 'data' in cell_output:
444 if 'data' in cell_output:
440 if 'application/javascript' in cell_output['data']:
445 if 'application/javascript' in cell_output['data']:
441 cell_output['data']['text/plain'] = sandbox_text
446 cell_output['data']['text/plain'] = sandbox_text
442 cell_output['data'].pop('application/javascript', None)
447 cell_output['data'].pop('application/javascript', None)
448
449 if 'source' in cell and cell['cell_type'] == 'markdown':
450 # sanitize similar like in markdown
451 cell['source'] = cls.bleach_clean(cell['source'])
452
443 return nb, resources
453 return nb, resources
444
454
445 def _sanitize_resources(resources):
455 def _sanitize_resources(resources):
@@ -67,7 +67,7 b' class LRUDictDebug(LRUDict):'
67 fmt = '\n'
67 fmt = '\n'
68 for cnt, elem in enumerate(self.keys()):
68 for cnt, elem in enumerate(self.keys()):
69 fmt += '%s - %s\n' % (cnt+1, safe_str(elem))
69 fmt += '%s - %s\n' % (cnt+1, safe_str(elem))
70 log.debug('current LRU keys (%s):%s' % (elems_cnt, fmt))
70 log.debug('current LRU keys (%s):%s', elems_cnt, fmt)
71
71
72 def __getitem__(self, key):
72 def __getitem__(self, key):
73 self._report_keys()
73 self._report_keys()
@@ -44,10 +44,11 b' class RequestWrapperTween(object):'
44 finally:
44 finally:
45 end = time.time()
45 end = time.time()
46 total = end - start
46 total = end - start
47 log.info('IP: %s Request to %s time: %.3fs [%s]' % (
47 log.info(
48 'IP: %s Request to %s time: %.3fs [%s]',
48 get_ip_addr(request.environ),
49 get_ip_addr(request.environ),
49 safe_str(get_access_path(request.environ)), total,
50 safe_str(get_access_path(request.environ)), total,
50 get_user_agent(request. environ),)
51 get_user_agent(request. environ)
51 )
52 )
52
53
53 return response
54 return response
@@ -114,13 +114,17 b' class VcsHttpProxy(object):'
114 stream=True)
114 stream=True)
115
115
116 log.debug('http-app: got vcsserver response: %s', response)
116 log.debug('http-app: got vcsserver response: %s', response)
117 if response.status_code >= 500:
118 log.error('Exception returned by vcsserver at: %s %s, %s',
119 url, response.status_code, response.content)
120
117 # Preserve the headers of the response, except hop_by_hop ones
121 # Preserve the headers of the response, except hop_by_hop ones
118 response_headers = [
122 response_headers = [
119 (h, v) for h, v in response.headers.items()
123 (h, v) for h, v in response.headers.items()
120 if not wsgiref.util.is_hop_by_hop(h)
124 if not wsgiref.util.is_hop_by_hop(h)
121 ]
125 ]
122
126
123 # Build status argument for start_reponse callable.
127 # Build status argument for start_response callable.
124 status = '{status_code} {reason_phrase}'.format(
128 status = '{status_code} {reason_phrase}'.format(
125 status_code=response.status_code,
129 status_code=response.status_code,
126 reason_phrase=response.reason)
130 reason_phrase=response.reason)
@@ -59,7 +59,7 b' class DaemonLock(object):'
59 def _on_finalize(lock, debug):
59 def _on_finalize(lock, debug):
60 if lock.held:
60 if lock.held:
61 if debug:
61 if debug:
62 print 'leck held finilazing and running lock.release()'
62 print('leck held finilazing and running lock.release()')
63 lock.release()
63 lock.release()
64
64
65 def lock(self):
65 def lock(self):
@@ -69,7 +69,7 b' class DaemonLock(object):'
69 """
69 """
70 lockname = '%s' % (os.getpid())
70 lockname = '%s' % (os.getpid())
71 if self.debug:
71 if self.debug:
72 print 'running lock'
72 print('running lock')
73 self.trylock()
73 self.trylock()
74 self.makelock(lockname, self.pidfile)
74 self.makelock(lockname, self.pidfile)
75 return True
75 return True
@@ -77,7 +77,7 b' class DaemonLock(object):'
77 def trylock(self):
77 def trylock(self):
78 running_pid = False
78 running_pid = False
79 if self.debug:
79 if self.debug:
80 print 'checking for already running process'
80 print('checking for already running process')
81 try:
81 try:
82 with open(self.pidfile, 'r') as f:
82 with open(self.pidfile, 'r') as f:
83 try:
83 try:
@@ -86,8 +86,8 b' class DaemonLock(object):'
86 running_pid = -1
86 running_pid = -1
87
87
88 if self.debug:
88 if self.debug:
89 print ('lock file present running_pid: %s, '
89 print('lock file present running_pid: %s, '
90 'checking for execution' % (running_pid,))
90 'checking for execution' % (running_pid,))
91 # Now we check the PID from lock file matches to the current
91 # Now we check the PID from lock file matches to the current
92 # process PID
92 # process PID
93 if running_pid:
93 if running_pid:
@@ -95,15 +95,15 b' class DaemonLock(object):'
95 kill(running_pid, 0)
95 kill(running_pid, 0)
96 except OSError as exc:
96 except OSError as exc:
97 if exc.errno in (errno.ESRCH, errno.EPERM):
97 if exc.errno in (errno.ESRCH, errno.EPERM):
98 print ("Lock File is there but"
98 print("Lock File is there but"
99 " the program is not running")
99 " the program is not running")
100 print "Removing lock file for the: %s" % running_pid
100 print("Removing lock file for the: %s" % running_pid)
101 self.release()
101 self.release()
102 else:
102 else:
103 raise
103 raise
104 else:
104 else:
105 print "You already have an instance of the program running"
105 print("You already have an instance of the program running")
106 print "It is running as process %s" % running_pid
106 print("It is running as process %s" % running_pid)
107 raise LockHeld()
107 raise LockHeld()
108
108
109 except IOError as e:
109 except IOError as e:
@@ -114,21 +114,21 b' class DaemonLock(object):'
114 """releases the pid by removing the pidfile
114 """releases the pid by removing the pidfile
115 """
115 """
116 if self.debug:
116 if self.debug:
117 print 'trying to release the pidlock'
117 print('trying to release the pidlock')
118
118
119 if self.callbackfn:
119 if self.callbackfn:
120 #execute callback function on release
120 # execute callback function on release
121 if self.debug:
121 if self.debug:
122 print 'executing callback function %s' % self.callbackfn
122 print('executing callback function %s' % self.callbackfn)
123 self.callbackfn()
123 self.callbackfn()
124 try:
124 try:
125 if self.debug:
125 if self.debug:
126 print 'removing pidfile %s' % self.pidfile
126 print('removing pidfile %s' % self.pidfile)
127 os.remove(self.pidfile)
127 os.remove(self.pidfile)
128 self.held = False
128 self.held = False
129 except OSError as e:
129 except OSError as e:
130 if self.debug:
130 if self.debug:
131 print 'removing pidfile failed %s' % e
131 print('removing pidfile failed %s' % e)
132 pass
132 pass
133
133
134 def makelock(self, lockname, pidfile):
134 def makelock(self, lockname, pidfile):
@@ -139,7 +139,7 b' class DaemonLock(object):'
139 :param pidfile: the file to write the pid in
139 :param pidfile: the file to write the pid in
140 """
140 """
141 if self.debug:
141 if self.debug:
142 print 'creating a file %s and pid: %s' % (pidfile, lockname)
142 print('creating a file %s and pid: %s' % (pidfile, lockname))
143
143
144 dir_, file_ = os.path.split(pidfile)
144 dir_, file_ = os.path.split(pidfile)
145 if not os.path.isdir(dir_):
145 if not os.path.isdir(dir_):
@@ -237,7 +237,7 b' class InvalidationContext(object):'
237 result = heavy_compute(*args)
237 result = heavy_compute(*args)
238
238
239 compute_time = inv_context_manager.compute_time
239 compute_time = inv_context_manager.compute_time
240 log.debug('result computed in %.3fs' ,compute_time)
240 log.debug('result computed in %.3fs', compute_time)
241
241
242 # To send global invalidation signal, simply run
242 # To send global invalidation signal, simply run
243 CacheKey.set_invalidate(invalidation_namespace)
243 CacheKey.set_invalidate(invalidation_namespace)
@@ -74,10 +74,17 b' def get_storage_size(storage_path):'
74 return sum(sizes)
74 return sum(sizes)
75
75
76
76
77 def get_resource(resource_type):
78 try:
79 return resource.getrlimit(resource_type)
80 except Exception:
81 return 'NOT_SUPPORTED'
82
83
77 class SysInfoRes(object):
84 class SysInfoRes(object):
78 def __init__(self, value, state=STATE_OK_DEFAULT, human_value=None):
85 def __init__(self, value, state=None, human_value=None):
79 self.value = value
86 self.value = value
80 self.state = state
87 self.state = state or STATE_OK_DEFAULT
81 self.human_value = human_value or value
88 self.human_value = human_value or value
82
89
83 def __json__(self):
90 def __json__(self):
@@ -159,16 +166,16 b' def locale_info():'
159
166
160 def ulimit_info():
167 def ulimit_info():
161 data = collections.OrderedDict([
168 data = collections.OrderedDict([
162 ('cpu time (seconds)', resource.getrlimit(resource.RLIMIT_CPU)),
169 ('cpu time (seconds)', get_resource(resource.RLIMIT_CPU)),
163 ('file size', resource.getrlimit(resource.RLIMIT_FSIZE)),
170 ('file size', get_resource(resource.RLIMIT_FSIZE)),
164 ('stack size', resource.getrlimit(resource.RLIMIT_STACK)),
171 ('stack size', get_resource(resource.RLIMIT_STACK)),
165 ('core file size', resource.getrlimit(resource.RLIMIT_CORE)),
172 ('core file size', get_resource(resource.RLIMIT_CORE)),
166 ('address space size', resource.getrlimit(resource.RLIMIT_AS)),
173 ('address space size', get_resource(resource.RLIMIT_AS)),
167 ('locked in mem size', resource.getrlimit(resource.RLIMIT_MEMLOCK)),
174 ('locked in mem size', get_resource(resource.RLIMIT_MEMLOCK)),
168 ('heap size', resource.getrlimit(resource.RLIMIT_DATA)),
175 ('heap size', get_resource(resource.RLIMIT_DATA)),
169 ('rss size', resource.getrlimit(resource.RLIMIT_RSS)),
176 ('rss size', get_resource(resource.RLIMIT_RSS)),
170 ('number of processes', resource.getrlimit(resource.RLIMIT_NPROC)),
177 ('number of processes', get_resource(resource.RLIMIT_NPROC)),
171 ('open files', resource.getrlimit(resource.RLIMIT_NOFILE)),
178 ('open files', get_resource(resource.RLIMIT_NOFILE)),
172 ])
179 ])
173
180
174 text = ', '.join('{}:{}'.format(k,v) for k,v in data.items())
181 text = ', '.join('{}:{}'.format(k,v) for k,v in data.items())
@@ -49,13 +49,13 b' def user_log_filter(user_log, search_ter'
49 :param user_log:
49 :param user_log:
50 :param search_term:
50 :param search_term:
51 """
51 """
52 log.debug('Initial search term: %r' % search_term)
52 log.debug('Initial search term: %r', search_term)
53 qry = None
53 qry = None
54 if search_term:
54 if search_term:
55 qp = QueryParser('repository', schema=JOURNAL_SCHEMA)
55 qp = QueryParser('repository', schema=JOURNAL_SCHEMA)
56 qp.add_plugin(DateParserPlugin())
56 qp.add_plugin(DateParserPlugin())
57 qry = qp.parse(safe_unicode(search_term))
57 qry = qp.parse(safe_unicode(search_term))
58 log.debug('Filtering using parsed query %r' % qry)
58 log.debug('Filtering using parsed query %r', qry)
59
59
60 def wildcard_handler(col, wc_term):
60 def wildcard_handler(col, wc_term):
61 if wc_term.startswith('*') and not wc_term.endswith('*'):
61 if wc_term.startswith('*') and not wc_term.endswith('*'):
@@ -80,7 +80,7 b' def user_log_filter(user_log, search_ter'
80 field = getattr(UserLog, 'username')
80 field = getattr(UserLog, 'username')
81 else:
81 else:
82 field = getattr(UserLog, field)
82 field = getattr(UserLog, field)
83 log.debug('filter field: %s val=>%s' % (field, val))
83 log.debug('filter field: %s val=>%s', field, val)
84
84
85 # sql filtering
85 # sql filtering
86 if isinstance(term, query.Wildcard):
86 if isinstance(term, query.Wildcard):
@@ -28,6 +28,7 b' import json'
28 import logging
28 import logging
29 import os
29 import os
30 import re
30 import re
31 import sys
31 import shutil
32 import shutil
32 import tempfile
33 import tempfile
33 import traceback
34 import traceback
@@ -43,7 +44,6 b' from mako import exceptions'
43 from pyramid.threadlocal import get_current_registry
44 from pyramid.threadlocal import get_current_registry
44 from rhodecode.lib.request import Request
45 from rhodecode.lib.request import Request
45
46
46 from rhodecode.lib.fakemod import create_module
47 from rhodecode.lib.vcs.backends.base import Config
47 from rhodecode.lib.vcs.backends.base import Config
48 from rhodecode.lib.vcs.exceptions import VCSError
48 from rhodecode.lib.vcs.exceptions import VCSError
49 from rhodecode.lib.vcs.utils.helpers import get_scm, get_scm_backend
49 from rhodecode.lib.vcs.utils.helpers import get_scm, get_scm_backend
@@ -291,8 +291,7 b' def is_valid_repo_group(repo_group_name,'
291
291
292 # check if it's not a repo
292 # check if it's not a repo
293 if is_valid_repo(repo_group_name, base_path):
293 if is_valid_repo(repo_group_name, base_path):
294 log.debug('Repo called %s exist, it is not a valid '
294 log.debug('Repo called %s exist, it is not a valid repo group', repo_group_name)
295 'repo group' % repo_group_name)
296 return False
295 return False
297
296
298 try:
297 try:
@@ -632,21 +631,21 b' def load_rcextensions(root_path):'
632 import rhodecode
631 import rhodecode
633 from rhodecode.config import conf
632 from rhodecode.config import conf
634
633
635 path = os.path.join(root_path, 'rcextensions', '__init__.py')
634 path = os.path.join(root_path)
636 if os.path.isfile(path):
635 sys.path.append(path)
637 rcext = create_module('rc', path)
636 try:
638 EXT = rhodecode.EXTENSIONS = rcext
637 rcextensions = __import__('rcextensions')
639 log.debug('Found rcextensions now loading %s...', rcext)
638 except ImportError:
639 log.warn('Unable to load rcextensions from %s', path)
640 rcextensions = None
641
642 if rcextensions:
643 log.debug('Found rcextensions module loaded %s...', rcextensions)
644 rhodecode.EXTENSIONS = rcextensions
640
645
641 # Additional mappings that are not present in the pygments lexers
646 # Additional mappings that are not present in the pygments lexers
642 conf.LANGUAGES_EXTENSIONS_MAP.update(getattr(EXT, 'EXTRA_MAPPINGS', {}))
647 conf.LANGUAGES_EXTENSIONS_MAP.update(
643
648 getattr(rhodecode.EXTENSIONS, 'EXTRA_MAPPINGS', {}))
644 # auto check if the module is not missing any data, set to default if is
645 # this will help autoupdate new feature of rcext module
646 #from rhodecode.config import rcextensions
647 #for k in dir(rcextensions):
648 # if not k.startswith('_') and not hasattr(EXT, k):
649 # setattr(EXT, k, getattr(rcextensions, k))
650
649
651
650
652 def get_custom_lexer(extension):
651 def get_custom_lexer(extension):
@@ -778,5 +777,5 b' def generate_platform_uuid():'
778 uuid_list = [platform.platform()]
777 uuid_list = [platform.platform()]
779 return hashlib.sha256(':'.join(uuid_list)).hexdigest()
778 return hashlib.sha256(':'.join(uuid_list)).hexdigest()
780 except Exception as e:
779 except Exception as e:
781 log.error('Failed to generate host uuid: %s' % e)
780 log.error('Failed to generate host uuid: %s', e)
782 return 'UNDEFINED'
781 return 'UNDEFINED'
@@ -821,6 +821,13 b' class BaseCommit(object):'
821 """
821 """
822 raise NotImplementedError
822 raise NotImplementedError
823
823
824 @LazyProperty
825 def first_parent(self):
826 """
827 Returns list of parent commits.
828 """
829 return self.parents[0] if self.parents else EmptyCommit()
830
824 @property
831 @property
825 def merge(self):
832 def merge(self):
826 """
833 """
@@ -1099,8 +1106,7 b' class BaseCommit(object):'
1099 """
1106 """
1100 Returns a `Diff` object representing the change made by this commit.
1107 Returns a `Diff` object representing the change made by this commit.
1101 """
1108 """
1102 parent = (
1109 parent = self.first_parent
1103 self.parents[0] if self.parents else self.repository.EMPTY_COMMIT)
1104 diff = self.repository.get_diff(
1110 diff = self.repository.get_diff(
1105 parent, self,
1111 parent, self,
1106 ignore_whitespace=ignore_whitespace,
1112 ignore_whitespace=ignore_whitespace,
@@ -58,13 +58,13 b' class GitRepository(BaseRepository):'
58 contact = BaseRepository.DEFAULT_CONTACT
58 contact = BaseRepository.DEFAULT_CONTACT
59
59
60 def __init__(self, repo_path, config=None, create=False, src_url=None,
60 def __init__(self, repo_path, config=None, create=False, src_url=None,
61 update_after_clone=False, with_wire=None, bare=False):
61 do_workspace_checkout=False, with_wire=None, bare=False):
62
62
63 self.path = safe_str(os.path.abspath(repo_path))
63 self.path = safe_str(os.path.abspath(repo_path))
64 self.config = config if config else self.get_default_config()
64 self.config = config if config else self.get_default_config()
65 self.with_wire = with_wire
65 self.with_wire = with_wire
66
66
67 self._init_repo(create, src_url, update_after_clone, bare)
67 self._init_repo(create, src_url, do_workspace_checkout, bare)
68
68
69 # caches
69 # caches
70 self._commit_ids = {}
70 self._commit_ids = {}
@@ -145,24 +145,36 b' class GitRepository(BaseRepository):'
145 pass
145 pass
146 return False
146 return False
147
147
148 def _init_repo(self, create, src_url=None, update_after_clone=False,
148 def _init_repo(self, create, src_url=None, do_workspace_checkout=False,
149 bare=False):
149 bare=False):
150 if create and os.path.exists(self.path):
150 if create and os.path.exists(self.path):
151 raise RepositoryError(
151 raise RepositoryError(
152 "Cannot create repository at %s, location already exist"
152 "Cannot create repository at %s, location already exist"
153 % self.path)
153 % self.path)
154
154
155 if bare and do_workspace_checkout:
156 raise RepositoryError("Cannot update a bare repository")
155 try:
157 try:
156 if create and src_url:
158
159 if src_url:
160 # check URL before any actions
157 GitRepository.check_url(src_url, self.config)
161 GitRepository.check_url(src_url, self.config)
158 self.clone(src_url, update_after_clone, bare)
162
159 elif create:
163 if create:
160 os.makedirs(self.path, mode=0755)
164 os.makedirs(self.path, mode=0755)
161
165
162 if bare:
166 if bare:
163 self._remote.init_bare()
167 self._remote.init_bare()
164 else:
168 else:
165 self._remote.init()
169 self._remote.init()
170
171 if src_url and bare:
172 # bare repository only allows a fetch and checkout is not allowed
173 self.fetch(src_url, commit_ids=None)
174 elif src_url:
175 self.pull(src_url, commit_ids=None,
176 update_after=do_workspace_checkout)
177
166 else:
178 else:
167 if not self._remote.assert_correct_path():
179 if not self._remote.assert_correct_path():
168 raise RepositoryError(
180 raise RepositoryError(
@@ -630,49 +642,27 b' class GitRepository(BaseRepository):'
630 """
642 """
631 return GitInMemoryCommit(self)
643 return GitInMemoryCommit(self)
632
644
633 def clone(self, url, update_after_clone=True, bare=False):
645 def pull(self, url, commit_ids=None, update_after=False):
634 """
646 """
635 Tries to clone commits from external location.
647 Pull changes from external location. Pull is different in GIT
636
648 that fetch since it's doing a checkout
637 :param update_after_clone: If set to ``False``, git won't checkout
638 working directory
639 :param bare: If set to ``True``, repository would be cloned into
640 *bare* git repository (no working directory at all).
641 """
642 # init_bare and init expect empty dir created to proceed
643 if not os.path.exists(self.path):
644 os.mkdir(self.path)
645
649
646 if bare:
650 :param commit_ids: Optional. Can be set to a list of commit ids
647 self._remote.init_bare()
651 which shall be pulled from the other repository.
648 else:
649 self._remote.init()
650
651 deferred = '^{}'
652 valid_refs = ('refs/heads', 'refs/tags', 'HEAD')
653
654 return self._remote.clone(
655 url, deferred, valid_refs, update_after_clone)
656
657 def pull(self, url, commit_ids=None):
658 """
652 """
659 Tries to pull changes from external location. We use fetch here since
653 refs = None
660 pull in get does merges and we want to be compatible with hg backend so
654 if commit_ids is not None:
661 pull == fetch in this case
655 remote_refs = self._remote.get_remote_refs(url)
662 """
656 refs = [ref for ref in remote_refs if remote_refs[ref] in commit_ids]
663 self.fetch(url, commit_ids=commit_ids)
657 self._remote.pull(url, refs=refs, update_after=update_after)
658 self._remote.invalidate_vcs_cache()
664
659
665 def fetch(self, url, commit_ids=None):
660 def fetch(self, url, commit_ids=None):
666 """
661 """
667 Tries to fetch changes from external location.
662 Fetch all git objects from external location.
668 """
663 """
669 refs = None
664 self._remote.sync_fetch(url, refs=commit_ids)
670
665 self._remote.invalidate_vcs_cache()
671 if commit_ids is not None:
672 remote_refs = self._remote.get_remote_refs(url)
673 refs = [
674 ref for ref in remote_refs if remote_refs[ref] in commit_ids]
675 self._remote.fetch(url, refs=refs)
676
666
677 def push(self, url):
667 def push(self, url):
678 refs = None
668 refs = None
@@ -778,7 +768,7 b' class GitRepository(BaseRepository):'
778
768
779 def _local_reset(self, branch_name):
769 def _local_reset(self, branch_name):
780 branch_name = '{}'.format(branch_name)
770 branch_name = '{}'.format(branch_name)
781 cmd = ['reset', '--hard', branch_name]
771 cmd = ['reset', '--hard', branch_name, '--']
782 self.run_git_command(cmd, fail_on_stderr=False)
772 self.run_git_command(cmd, fail_on_stderr=False)
783
773
784 def _last_fetch_heads(self):
774 def _last_fetch_heads(self):
@@ -57,7 +57,7 b' class MercurialRepository(BaseRepository'
57 DEFAULT_BRANCH_NAME = 'default'
57 DEFAULT_BRANCH_NAME = 'default'
58
58
59 def __init__(self, repo_path, config=None, create=False, src_url=None,
59 def __init__(self, repo_path, config=None, create=False, src_url=None,
60 update_after_clone=False, with_wire=None):
60 do_workspace_checkout=False, with_wire=None, bare=False):
61 """
61 """
62 Raises RepositoryError if repository could not be find at the given
62 Raises RepositoryError if repository could not be find at the given
63 ``repo_path``.
63 ``repo_path``.
@@ -67,8 +67,9 b' class MercurialRepository(BaseRepository'
67 :param create=False: if set to True, would try to create repository if
67 :param create=False: if set to True, would try to create repository if
68 it does not exist rather than raising exception
68 it does not exist rather than raising exception
69 :param src_url=None: would try to clone repository from given location
69 :param src_url=None: would try to clone repository from given location
70 :param update_after_clone=False: sets update of working copy after
70 :param do_workspace_checkout=False: sets update of working copy after
71 making a clone
71 making a clone
72 :param bare: not used, compatible with other VCS
72 """
73 """
73
74
74 self.path = safe_str(os.path.abspath(repo_path))
75 self.path = safe_str(os.path.abspath(repo_path))
@@ -79,7 +80,7 b' class MercurialRepository(BaseRepository'
79 default=[('extensions', 'largefiles', '1')])
80 default=[('extensions', 'largefiles', '1')])
80 self.with_wire = with_wire
81 self.with_wire = with_wire
81
82
82 self._init_repo(create, src_url, update_after_clone)
83 self._init_repo(create, src_url, do_workspace_checkout)
83
84
84 # caches
85 # caches
85 self._commit_ids = {}
86 self._commit_ids = {}
@@ -328,7 +329,7 b' class MercurialRepository(BaseRepository'
328 def is_valid_repository(path):
329 def is_valid_repository(path):
329 return os.path.isdir(os.path.join(path, '.hg'))
330 return os.path.isdir(os.path.join(path, '.hg'))
330
331
331 def _init_repo(self, create, src_url=None, update_after_clone=False):
332 def _init_repo(self, create, src_url=None, do_workspace_checkout=False):
332 """
333 """
333 Function will check for mercurial repository in given path. If there
334 Function will check for mercurial repository in given path. If there
334 is no repository in that path it will raise an exception unless
335 is no repository in that path it will raise an exception unless
@@ -337,7 +338,7 b' class MercurialRepository(BaseRepository'
337
338
338 If `src_url` is given, would try to clone repository from the
339 If `src_url` is given, would try to clone repository from the
339 location at given clone_point. Additionally it'll make update to
340 location at given clone_point. Additionally it'll make update to
340 working copy accordingly to `update_after_clone` flag.
341 working copy accordingly to `do_workspace_checkout` flag.
341 """
342 """
342 if create and os.path.exists(self.path):
343 if create and os.path.exists(self.path):
343 raise RepositoryError(
344 raise RepositoryError(
@@ -348,7 +349,7 b' class MercurialRepository(BaseRepository'
348 url = str(self._get_url(src_url))
349 url = str(self._get_url(src_url))
349 MercurialRepository.check_url(url, self.config)
350 MercurialRepository.check_url(url, self.config)
350
351
351 self._remote.clone(url, self.path, update_after_clone)
352 self._remote.clone(url, self.path, do_workspace_checkout)
352
353
353 # Don't try to create if we've already cloned repo
354 # Don't try to create if we've already cloned repo
354 create = False
355 create = False
@@ -538,7 +539,7 b' class MercurialRepository(BaseRepository'
538
539
539 def pull(self, url, commit_ids=None):
540 def pull(self, url, commit_ids=None):
540 """
541 """
541 Tries to pull changes from external location.
542 Pull changes from external location.
542
543
543 :param commit_ids: Optional. Can be set to a list of commit ids
544 :param commit_ids: Optional. Can be set to a list of commit ids
544 which shall be pulled from the other repository.
545 which shall be pulled from the other repository.
@@ -547,6 +548,12 b' class MercurialRepository(BaseRepository'
547 self._remote.pull(url, commit_ids=commit_ids)
548 self._remote.pull(url, commit_ids=commit_ids)
548 self._remote.invalidate_vcs_cache()
549 self._remote.invalidate_vcs_cache()
549
550
551 def fetch(self, url, commit_ids=None):
552 """
553 Backward compatibility with GIT fetch==pull
554 """
555 return self.pull(url, commit_ids=commit_ids)
556
550 def push(self, url):
557 def push(self, url):
551 url = self._get_url(url)
558 url = self._get_url(url)
552 self._remote.sync_push(url)
559 self._remote.sync_push(url)
@@ -68,7 +68,7 b' class SubversionRepository(base.BaseRepo'
68 contact = base.BaseRepository.DEFAULT_CONTACT
68 contact = base.BaseRepository.DEFAULT_CONTACT
69 description = base.BaseRepository.DEFAULT_DESCRIPTION
69 description = base.BaseRepository.DEFAULT_DESCRIPTION
70
70
71 def __init__(self, repo_path, config=None, create=False, src_url=None,
71 def __init__(self, repo_path, config=None, create=False, src_url=None, bare=False,
72 **kwargs):
72 **kwargs):
73 self.path = safe_str(os.path.abspath(repo_path))
73 self.path = safe_str(os.path.abspath(repo_path))
74 self.config = config if config else self.get_default_config()
74 self.config = config if config else self.get_default_config()
@@ -739,13 +739,18 b' class User(Base, BaseModel):'
739 plain_tokens = []
739 plain_tokens = []
740 hash_tokens = []
740 hash_tokens = []
741
741
742 for token in tokens_q.all():
742 user_tokens = tokens_q.all()
743 # verify scope first
743 log.debug('Found %s user tokens to check for authentication', len(user_tokens))
744 for token in user_tokens:
745 log.debug('AUTH_TOKEN: checking if user token with id `%s` matches',
746 token.user_api_key_id)
747 # verify scope first, since it's way faster than hash calculation of
748 # encrypted tokens
744 if token.repo_id:
749 if token.repo_id:
745 # token has a scope, we need to verify it
750 # token has a scope, we need to verify it
746 if scope_repo_id != token.repo_id:
751 if scope_repo_id != token.repo_id:
747 log.debug(
752 log.debug(
748 'Scope mismatch: token has a set repo scope: %s, '
753 'AUTH_TOKEN: scope mismatch, token has a set repo scope: %s, '
749 'and calling scope is:%s, skipping further checks',
754 'and calling scope is:%s, skipping further checks',
750 token.repo, scope_repo_id)
755 token.repo, scope_repo_id)
751 # token has a scope, and it doesn't match, skip token
756 # token has a scope, and it doesn't match, skip token
@@ -761,7 +766,7 b' class User(Base, BaseModel):'
761 return True
766 return True
762
767
763 for hashed in hash_tokens:
768 for hashed in hash_tokens:
764 # TODO(marcink): this is expensive to calculate, but most secure
769 # NOTE(marcink): this is expensive to calculate, but most secure
765 match = crypto_backend.hash_check(auth_token, hashed)
770 match = crypto_backend.hash_check(auth_token, hashed)
766 if match:
771 if match:
767 return True
772 return True
@@ -938,7 +943,11 b' class User(Base, BaseModel):'
938
943
939 @classmethod
944 @classmethod
940 def get_first_super_admin(cls):
945 def get_first_super_admin(cls):
941 user = User.query().filter(User.admin == true()).first()
946 user = User.query()\
947 .filter(User.admin == true()) \
948 .order_by(User.user_id.asc()) \
949 .first()
950
942 if user is None:
951 if user is None:
943 raise Exception('FATAL: Missing administrative account!')
952 raise Exception('FATAL: Missing administrative account!')
944 return user
953 return user
@@ -1576,6 +1585,8 b' class Repository(Base, BaseModel):'
1576 unique=False, default=None)
1585 unique=False, default=None)
1577 private = Column(
1586 private = Column(
1578 "private", Boolean(), nullable=True, unique=None, default=None)
1587 "private", Boolean(), nullable=True, unique=None, default=None)
1588 archived = Column(
1589 "archived", Boolean(), nullable=True, unique=None, default=None)
1579 enable_statistics = Column(
1590 enable_statistics = Column(
1580 "statistics", Boolean(), nullable=True, unique=None, default=True)
1591 "statistics", Boolean(), nullable=True, unique=None, default=True)
1581 enable_downloads = Column(
1592 enable_downloads = Column(
@@ -1774,9 +1785,12 b' class Repository(Base, BaseModel):'
1774
1785
1775 @classmethod
1786 @classmethod
1776 def get_all_repos(cls, user_id=Optional(None), group_id=Optional(None),
1787 def get_all_repos(cls, user_id=Optional(None), group_id=Optional(None),
1777 case_insensitive=True):
1788 case_insensitive=True, archived=False):
1778 q = Repository.query()
1789 q = Repository.query()
1779
1790
1791 if not archived:
1792 q = q.filter(Repository.archived.isnot(true()))
1793
1780 if not isinstance(user_id, Optional):
1794 if not isinstance(user_id, Optional):
1781 q = q.filter(Repository.user_id == user_id)
1795 q = q.filter(Repository.user_id == user_id)
1782
1796
@@ -1787,6 +1801,7 b' class Repository(Base, BaseModel):'
1787 q = q.order_by(func.lower(Repository.repo_name))
1801 q = q.order_by(func.lower(Repository.repo_name))
1788 else:
1802 else:
1789 q = q.order_by(Repository.repo_name)
1803 q = q.order_by(Repository.repo_name)
1804
1790 return q.all()
1805 return q.all()
1791
1806
1792 @property
1807 @property
@@ -2536,8 +2551,8 b' class RepoGroup(Base, BaseModel):'
2536 break
2551 break
2537 if cnt == parents_recursion_limit:
2552 if cnt == parents_recursion_limit:
2538 # this will prevent accidental infinit loops
2553 # this will prevent accidental infinit loops
2539 log.error(('more than %s parents found for group %s, stopping '
2554 log.error('more than %s parents found for group %s, stopping '
2540 'recursive parent fetching' % (parents_recursion_limit, self)))
2555 'recursive parent fetching', parents_recursion_limit, self)
2541 break
2556 break
2542
2557
2543 groups.insert(0, gr)
2558 groups.insert(0, gr)
@@ -73,7 +73,7 b' class PullRequestModel(BaseModel):'
73
73
74 cls = PullRequest
74 cls = PullRequest
75
75
76 DIFF_CONTEXT = 3
76 DIFF_CONTEXT = diffs.DEFAULT_CONTEXT
77
77
78 MERGE_STATUS_MESSAGES = {
78 MERGE_STATUS_MESSAGES = {
79 MergeFailureReason.NONE: lazy_ugettext(
79 MergeFailureReason.NONE: lazy_ugettext(
@@ -590,6 +590,7 b' class PullRequestModel(BaseModel):'
590
590
591 def merge_repo(self, pull_request, user, extras):
591 def merge_repo(self, pull_request, user, extras):
592 log.debug("Merging pull request %s", pull_request.pull_request_id)
592 log.debug("Merging pull request %s", pull_request.pull_request_id)
593 extras['user_agent'] = 'internal-merge'
593 merge_state = self._merge_pull_request(pull_request, user, extras)
594 merge_state = self._merge_pull_request(pull_request, user, extras)
594 if merge_state.executed:
595 if merge_state.executed:
595 log.debug(
596 log.debug(
@@ -876,19 +877,21 b' class PullRequestModel(BaseModel):'
876 diff_context = (
877 diff_context = (
877 self.DIFF_CONTEXT +
878 self.DIFF_CONTEXT +
878 CommentsModel.needed_extra_diff_context())
879 CommentsModel.needed_extra_diff_context())
879
880 hide_whitespace_changes = False
880 source_repo = pull_request_version.source_repo
881 source_repo = pull_request_version.source_repo
881 source_ref_id = pull_request_version.source_ref_parts.commit_id
882 source_ref_id = pull_request_version.source_ref_parts.commit_id
882 target_ref_id = pull_request_version.target_ref_parts.commit_id
883 target_ref_id = pull_request_version.target_ref_parts.commit_id
883 old_diff = self._get_diff_from_pr_or_version(
884 old_diff = self._get_diff_from_pr_or_version(
884 source_repo, source_ref_id, target_ref_id, context=diff_context)
885 source_repo, source_ref_id, target_ref_id,
886 hide_whitespace_changes=hide_whitespace_changes, diff_context=diff_context)
885
887
886 source_repo = pull_request.source_repo
888 source_repo = pull_request.source_repo
887 source_ref_id = pull_request.source_ref_parts.commit_id
889 source_ref_id = pull_request.source_ref_parts.commit_id
888 target_ref_id = pull_request.target_ref_parts.commit_id
890 target_ref_id = pull_request.target_ref_parts.commit_id
889
891
890 new_diff = self._get_diff_from_pr_or_version(
892 new_diff = self._get_diff_from_pr_or_version(
891 source_repo, source_ref_id, target_ref_id, context=diff_context)
893 source_repo, source_ref_id, target_ref_id,
894 hide_whitespace_changes=hide_whitespace_changes, diff_context=diff_context)
892
895
893 old_diff_data = diffs.DiffProcessor(old_diff)
896 old_diff_data = diffs.DiffProcessor(old_diff)
894 old_diff_data.prepare()
897 old_diff_data.prepare()
@@ -1487,12 +1490,17 b' class PullRequestModel(BaseModel):'
1487 raise EmptyRepositoryError()
1490 raise EmptyRepositoryError()
1488 return groups, selected
1491 return groups, selected
1489
1492
1490 def get_diff(self, source_repo, source_ref_id, target_ref_id, context=DIFF_CONTEXT):
1493 def get_diff(self, source_repo, source_ref_id, target_ref_id,
1494 hide_whitespace_changes, diff_context):
1495
1491 return self._get_diff_from_pr_or_version(
1496 return self._get_diff_from_pr_or_version(
1492 source_repo, source_ref_id, target_ref_id, context=context)
1497 source_repo, source_ref_id, target_ref_id,
1498 hide_whitespace_changes=hide_whitespace_changes, diff_context=diff_context)
1493
1499
1494 def _get_diff_from_pr_or_version(
1500 def _get_diff_from_pr_or_version(
1495 self, source_repo, source_ref_id, target_ref_id, context):
1501 self, source_repo, source_ref_id, target_ref_id,
1502 hide_whitespace_changes, diff_context):
1503
1496 target_commit = source_repo.get_commit(
1504 target_commit = source_repo.get_commit(
1497 commit_id=safe_str(target_ref_id))
1505 commit_id=safe_str(target_ref_id))
1498 source_commit = source_repo.get_commit(
1506 source_commit = source_repo.get_commit(
@@ -1516,7 +1524,8 b' class PullRequestModel(BaseModel):'
1516 safe_unicode(vcs_repo.path))
1524 safe_unicode(vcs_repo.path))
1517
1525
1518 vcs_diff = vcs_repo.get_diff(
1526 vcs_diff = vcs_repo.get_diff(
1519 commit1=target_commit, commit2=source_commit, context=context)
1527 commit1=target_commit, commit2=source_commit,
1528 ignore_whitespace=hide_whitespace_changes, context=diff_context)
1520 return vcs_diff
1529 return vcs_diff
1521
1530
1522 def _is_merge_enabled(self, pull_request):
1531 def _is_merge_enabled(self, pull_request):
@@ -32,7 +32,7 b' from zope.cachedescriptors.property impo'
32 from rhodecode import events
32 from rhodecode import events
33 from rhodecode.lib.auth import HasUserGroupPermissionAny
33 from rhodecode.lib.auth import HasUserGroupPermissionAny
34 from rhodecode.lib.caching_query import FromCache
34 from rhodecode.lib.caching_query import FromCache
35 from rhodecode.lib.exceptions import AttachedForksError
35 from rhodecode.lib.exceptions import AttachedForksError, AttachedPullRequestsError
36 from rhodecode.lib.hooks_base import log_delete_repository
36 from rhodecode.lib.hooks_base import log_delete_repository
37 from rhodecode.lib.user_log_filter import user_log_filter
37 from rhodecode.lib.user_log_filter import user_log_filter
38 from rhodecode.lib.utils import make_db_config
38 from rhodecode.lib.utils import make_db_config
@@ -207,8 +207,8 b' class RepoModel(BaseModel):'
207 def quick_menu(repo_name):
207 def quick_menu(repo_name):
208 return _render('quick_menu', repo_name)
208 return _render('quick_menu', repo_name)
209
209
210 def repo_lnk(name, rtype, rstate, private, fork_of):
210 def repo_lnk(name, rtype, rstate, private, archived, fork_of):
211 return _render('repo_name', name, rtype, rstate, private, fork_of,
211 return _render('repo_name', name, rtype, rstate, private, archived, fork_of,
212 short_name=not admin, admin=False)
212 short_name=not admin, admin=False)
213
213
214 def last_change(last_change):
214 def last_change(last_change):
@@ -246,8 +246,8 b' class RepoModel(BaseModel):'
246 row = {
246 row = {
247 "menu": quick_menu(repo.repo_name),
247 "menu": quick_menu(repo.repo_name),
248
248
249 "name": repo_lnk(repo.repo_name, repo.repo_type,
249 "name": repo_lnk(repo.repo_name, repo.repo_type, repo.repo_state,
250 repo.repo_state, repo.private, repo.fork),
250 repo.private, repo.archived, repo.fork),
251 "name_raw": repo.repo_name.lower(),
251 "name_raw": repo.repo_name.lower(),
252
252
253 "last_change": last_change(repo.last_db_change),
253 "last_change": last_change(repo.last_db_change),
@@ -427,6 +427,7 b' class RepoModel(BaseModel):'
427 new_repo.group = repo_group
427 new_repo.group = repo_group
428 new_repo.description = description or repo_name
428 new_repo.description = description or repo_name
429 new_repo.private = private
429 new_repo.private = private
430 new_repo.archived = False
430 new_repo.clone_uri = clone_uri
431 new_repo.clone_uri = clone_uri
431 new_repo.landing_rev = landing_rev
432 new_repo.landing_rev = landing_rev
432
433
@@ -608,7 +609,24 b' class RepoModel(BaseModel):'
608 from rhodecode.lib.celerylib import tasks, run_task
609 from rhodecode.lib.celerylib import tasks, run_task
609 return run_task(tasks.create_repo_fork, form_data, cur_user)
610 return run_task(tasks.create_repo_fork, form_data, cur_user)
610
611
611 def delete(self, repo, forks=None, fs_remove=True, cur_user=None):
612 def archive(self, repo):
613 """
614 Archive given repository. Set archive flag.
615
616 :param repo:
617 """
618 repo = self._get_repo(repo)
619 if repo:
620
621 try:
622 repo.archived = True
623 self.sa.add(repo)
624 self.sa.commit()
625 except Exception:
626 log.error(traceback.format_exc())
627 raise
628
629 def delete(self, repo, forks=None, pull_requests=None, fs_remove=True, cur_user=None):
612 """
630 """
613 Delete given repository, forks parameter defines what do do with
631 Delete given repository, forks parameter defines what do do with
614 attached forks. Throws AttachedForksError if deleted repo has attached
632 attached forks. Throws AttachedForksError if deleted repo has attached
@@ -616,6 +634,7 b' class RepoModel(BaseModel):'
616
634
617 :param repo:
635 :param repo:
618 :param forks: str 'delete' or 'detach'
636 :param forks: str 'delete' or 'detach'
637 :param pull_requests: str 'delete' or None
619 :param fs_remove: remove(archive) repo from filesystem
638 :param fs_remove: remove(archive) repo from filesystem
620 """
639 """
621 if not cur_user:
640 if not cur_user:
@@ -632,6 +651,12 b' class RepoModel(BaseModel):'
632 elif [f for f in repo.forks]:
651 elif [f for f in repo.forks]:
633 raise AttachedForksError()
652 raise AttachedForksError()
634
653
654 # check for pull requests
655 pr_sources = repo.pull_requests_source
656 pr_targets = repo.pull_requests_target
657 if pull_requests != 'delete' and (pr_sources or pr_targets):
658 raise AttachedPullRequestsError()
659
635 old_repo_dict = repo.get_dict()
660 old_repo_dict = repo.get_dict()
636 events.trigger(events.RepoPreDeleteEvent(repo))
661 events.trigger(events.RepoPreDeleteEvent(repo))
637 try:
662 try:
@@ -23,12 +23,9 b' Scm model for RhodeCode'
23 """
23 """
24
24
25 import os.path
25 import os.path
26 import re
27 import sys
28 import traceback
26 import traceback
29 import logging
27 import logging
30 import cStringIO
28 import cStringIO
31 import pkg_resources
32
29
33 from sqlalchemy import func
30 from sqlalchemy import func
34 from zope.cachedescriptors.property import Lazy as LazyProperty
31 from zope.cachedescriptors.property import Lazy as LazyProperty
@@ -53,6 +50,7 b' from rhodecode.model.db import ('
53 Repository, CacheKey, UserFollowing, UserLog, User, RepoGroup,
50 Repository, CacheKey, UserFollowing, UserLog, User, RepoGroup,
54 PullRequest)
51 PullRequest)
55 from rhodecode.model.settings import VcsSettingsModel
52 from rhodecode.model.settings import VcsSettingsModel
53 from rhodecode.model.validation_schema.validators import url_validator, InvalidCloneUrl
56
54
57 log = logging.getLogger(__name__)
55 log = logging.getLogger(__name__)
58
56
@@ -379,29 +377,36 b' class ScmModel(BaseModel):'
379 self.sa.add(repo)
377 self.sa.add(repo)
380 return repo
378 return repo
381
379
382 def pull_changes(self, repo, username, remote_uri=None):
380 def pull_changes(self, repo, username, remote_uri=None, validate_uri=True):
383 dbrepo = self._get_repo(repo)
381 dbrepo = self._get_repo(repo)
384 remote_uri = remote_uri or dbrepo.clone_uri
382 remote_uri = remote_uri or dbrepo.clone_uri
385 if not remote_uri:
383 if not remote_uri:
386 raise Exception("This repository doesn't have a clone uri")
384 raise Exception("This repository doesn't have a clone uri")
387
385
388 repo = dbrepo.scm_instance(cache=False)
386 repo = dbrepo.scm_instance(cache=False)
389 # TODO: marcink fix this an re-enable since we need common logic
390 # for hg/git remove hooks so we don't trigger them on fetching
391 # commits from remote
392 repo.config.clear_section('hooks')
387 repo.config.clear_section('hooks')
393
388
389 try:
390 # NOTE(marcink): add extra validation so we skip invalid urls
391 # this is due this tasks can be executed via scheduler without
392 # proper validation of remote_uri
393 if validate_uri:
394 config = make_db_config(clear_session=False)
395 url_validator(remote_uri, dbrepo.repo_type, config)
396 except InvalidCloneUrl:
397 raise
398
394 repo_name = dbrepo.repo_name
399 repo_name = dbrepo.repo_name
395 try:
400 try:
396 # TODO: we need to make sure those operations call proper hooks !
401 # TODO: we need to make sure those operations call proper hooks !
397 repo.pull(remote_uri)
402 repo.fetch(remote_uri)
398
403
399 self.mark_for_invalidation(repo_name)
404 self.mark_for_invalidation(repo_name)
400 except Exception:
405 except Exception:
401 log.error(traceback.format_exc())
406 log.error(traceback.format_exc())
402 raise
407 raise
403
408
404 def push_changes(self, repo, username, remote_uri=None):
409 def push_changes(self, repo, username, remote_uri=None, validate_uri=True):
405 dbrepo = self._get_repo(repo)
410 dbrepo = self._get_repo(repo)
406 remote_uri = remote_uri or dbrepo.push_uri
411 remote_uri = remote_uri or dbrepo.push_uri
407 if not remote_uri:
412 if not remote_uri:
@@ -411,6 +416,16 b' class ScmModel(BaseModel):'
411 repo.config.clear_section('hooks')
416 repo.config.clear_section('hooks')
412
417
413 try:
418 try:
419 # NOTE(marcink): add extra validation so we skip invalid urls
420 # this is due this tasks can be executed via scheduler without
421 # proper validation of remote_uri
422 if validate_uri:
423 config = make_db_config(clear_session=False)
424 url_validator(remote_uri, dbrepo.repo_type, config)
425 except InvalidCloneUrl:
426 raise
427
428 try:
414 repo.push(remote_uri)
429 repo.push(remote_uri)
415 except Exception:
430 except Exception:
416 log.error(traceback.format_exc())
431 log.error(traceback.format_exc())
@@ -450,8 +465,8 b' class ScmModel(BaseModel):'
450
465
451 # We trigger the post-push action
466 # We trigger the post-push action
452 hooks_utils.trigger_post_push_hook(
467 hooks_utils.trigger_post_push_hook(
453 username=user.username, action='push_local', repo_name=repo_name,
468 username=user.username, action='push_local', hook_type='post_push',
454 repo_alias=repo.alias, commit_ids=[tip.raw_id])
469 repo_name=repo_name, repo_alias=repo.alias, commit_ids=[tip.raw_id])
455 return tip
470 return tip
456
471
457 def _sanitize_path(self, f_path):
472 def _sanitize_path(self, f_path):
@@ -629,6 +644,7 b' class ScmModel(BaseModel):'
629 hooks_utils.trigger_post_push_hook(
644 hooks_utils.trigger_post_push_hook(
630 username=user.username, action='push_local',
645 username=user.username, action='push_local',
631 repo_name=repo.repo_name, repo_alias=scm_instance.alias,
646 repo_name=repo.repo_name, repo_alias=scm_instance.alias,
647 hook_type='post_push',
632 commit_ids=[tip.raw_id])
648 commit_ids=[tip.raw_id])
633 return tip
649 return tip
634
650
@@ -693,7 +709,7 b' class ScmModel(BaseModel):'
693
709
694 if trigger_push_hook:
710 if trigger_push_hook:
695 hooks_utils.trigger_post_push_hook(
711 hooks_utils.trigger_post_push_hook(
696 username=user.username, action='push_local',
712 username=user.username, action='push_local', hook_type='post_push',
697 repo_name=repo.repo_name, repo_alias=scm_instance.alias,
713 repo_name=repo.repo_name, repo_alias=scm_instance.alias,
698 commit_ids=[tip.raw_id])
714 commit_ids=[tip.raw_id])
699
715
@@ -753,7 +769,7 b' class ScmModel(BaseModel):'
753 self.mark_for_invalidation(repo.repo_name)
769 self.mark_for_invalidation(repo.repo_name)
754 if trigger_push_hook:
770 if trigger_push_hook:
755 hooks_utils.trigger_post_push_hook(
771 hooks_utils.trigger_post_push_hook(
756 username=user.username, action='push_local',
772 username=user.username, action='push_local', hook_type='post_push',
757 repo_name=repo.repo_name, repo_alias=scm_instance.alias,
773 repo_name=repo.repo_name, repo_alias=scm_instance.alias,
758 commit_ids=[tip.raw_id])
774 commit_ids=[tip.raw_id])
759 return tip
775 return tip
@@ -241,9 +241,8 b' class SettingsModel(BaseModel):'
241 region.invalidate()
241 region.invalidate()
242
242
243 result = _get_all_settings('rhodecode_settings', key)
243 result = _get_all_settings('rhodecode_settings', key)
244 log.debug(
244 log.debug('Fetching app settings for key: %s took: %.3fs', key,
245 'Fetching app settings for key: %s took: %.3fs', key,
245 inv_context_manager.compute_time)
246 inv_context_manager.compute_time)
247
246
248 return result
247 return result
249
248
@@ -300,11 +300,11 b' class UserModel(BaseModel):'
300
300
301 if updating_user_id:
301 if updating_user_id:
302 log.debug('Checking for existing account in RhodeCode '
302 log.debug('Checking for existing account in RhodeCode '
303 'database with user_id `%s` ' % (updating_user_id,))
303 'database with user_id `%s` ', updating_user_id)
304 user = User.get(updating_user_id)
304 user = User.get(updating_user_id)
305 else:
305 else:
306 log.debug('Checking for existing account in RhodeCode '
306 log.debug('Checking for existing account in RhodeCode '
307 'database with username `%s` ' % (username,))
307 'database with username `%s` ', username)
308 user = User.get_by_username(username, case_insensitive=True)
308 user = User.get_by_username(username, case_insensitive=True)
309
309
310 if user is None:
310 if user is None:
@@ -626,7 +626,7 b' class UserGroupModel(BaseModel):'
626 self.remove_user_from_group(gr, user)
626 self.remove_user_from_group(gr, user)
627 else:
627 else:
628 log.debug('Skipping removal from group %s since it is '
628 log.debug('Skipping removal from group %s since it is '
629 'not set to be automatically synchronized' % gr)
629 'not set to be automatically synchronized', gr)
630
630
631 # now we calculate in which groups user should be == groups params
631 # now we calculate in which groups user should be == groups params
632 owner = User.get_first_super_admin().username
632 owner = User.get_first_super_admin().username
@@ -647,7 +647,7 b' class UserGroupModel(BaseModel):'
647 UserGroupModel().add_user_to_group(existing_group, user)
647 UserGroupModel().add_user_to_group(existing_group, user)
648 else:
648 else:
649 log.debug('Skipping addition to group %s since it is '
649 log.debug('Skipping addition to group %s since it is '
650 'not set to be automatically synchronized' % gr)
650 'not set to be automatically synchronized', gr)
651
651
652 def change_groups(self, user, groups):
652 def change_groups(self, user, groups):
653 """
653 """
@@ -12,7 +12,7 b''
12 body {
12 body {
13 background:#eeeeee;
13 background:#eeeeee;
14 color: #323232;
14 color: #323232;
15 font-family: "proximanovaregular","Proxima Nova Regular","Proxima Nova",sans-serif;
15 font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
16 margin: 0 auto;
16 margin: 0 auto;
17 max-width: 1000px;
17 max-width: 1000px;
18 letter-spacing: .02em;
18 letter-spacing: .02em;
@@ -44,8 +44,6 b''
44
44
45 @font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
45 @font-family-sans-serif: "Helvetica Neue", Helvetica, Arial, sans-serif;
46 @font-family-serif: Georgia, "Times New Roman", Times, serif;
46 @font-family-serif: Georgia, "Times New Roman", Times, serif;
47 //** Default monospace fonts for `<code>`, `<kbd>`, and `<pre>`.
48 @font-family-monospace: Consolas, "Liberation Mono", Menlo, Monaco, Courier, monospace;
49
47
50 @font-family-base: @font-family-sans-serif;
48 @font-family-base: @font-family-sans-serif;
51
49
@@ -79,6 +79,7 b' div.diffblock {'
79 min-width: 5em;
79 min-width: 5em;
80 margin: 0;
80 margin: 0;
81 padding: @button-padding @button-padding @button-padding 0;
81 padding: @button-padding @button-padding @button-padding 0;
82 font-weight: @text-semibold-weight;
82 font-family: @text-semibold;
83 font-family: @text-semibold;
83 }
84 }
84
85
@@ -422,6 +423,7 b' div.codeblock {'
422 .author {
423 .author {
423 clear: both;
424 clear: both;
424 vertical-align: middle;
425 vertical-align: middle;
426 font-weight: @text-bold-weight;
425 font-family: @text-bold;
427 font-family: @text-bold;
426 }
428 }
427
429
@@ -543,7 +545,7 b' div.search-code-body {'
543 border-right: 1px solid #ccc !important;
545 border-right: 1px solid #ccc !important;
544 padding-right: 10px;
546 padding-right: 10px;
545 text-align: right;
547 text-align: right;
546 font-family: "Lucida Console",Monaco,monospace;
548 font-family: @text-monospace;
547 span {
549 span {
548 white-space: pre-wrap;
550 white-space: pre-wrap;
549 color: #666666;
551 color: #666666;
@@ -571,7 +573,7 b' div.annotatediv { margin-left: 2px; marg'
571 .codehilite {
573 .codehilite {
572 .hll { background-color: #ffffcc }
574 .hll { background-color: #ffffcc }
573 .c { color: #408080; font-style: italic } /* Comment */
575 .c { color: #408080; font-style: italic } /* Comment */
574 .err, .codehilite .err { border: @border-thickness solid #FF0000 } /* Error */
576 .err, .codehilite .err { border: none } /* Error */
575 .k { color: #008000; font-weight: bold } /* Keyword */
577 .k { color: #008000; font-weight: bold } /* Keyword */
576 .o { color: #666666 } /* Operator */
578 .o { color: #666666 } /* Operator */
577 .cm { color: #408080; font-style: italic } /* Comment.Multiline */
579 .cm { color: #408080; font-style: italic } /* Comment.Multiline */
@@ -648,6 +650,7 b' pre.literal-block, .codehilite pre{'
648 @cb-text-padding: 5px;
650 @cb-text-padding: 5px;
649
651
650 @pill-padding: 2px 7px;
652 @pill-padding: 2px 7px;
653 @pill-padding-small: 2px 2px 1px 2px;
651
654
652 input.filediff-collapse-state {
655 input.filediff-collapse-state {
653 display: none;
656 display: none;
@@ -667,7 +670,7 b' input.filediff-collapse-state {'
667 .filediff-menu {
670 .filediff-menu {
668 display: none;
671 display: none;
669 }
672 }
670 margin: 10px 0 0 0;
673
671 }
674 }
672
675
673 &+ .filediff { /* file diff is expanded */
676 &+ .filediff { /* file diff is expanded */
@@ -689,10 +692,66 b' input.filediff-collapse-state {'
689 }
692 }
690 }
693 }
691 }
694 }
695
696 .filediffs .anchor {
697 display: block;
698 height: 40px;
699 margin-top: -40px;
700 visibility: hidden;
701 }
702
703 .filediffs .anchor:nth-of-type(1) {
704 display: block;
705 height: 80px;
706 margin-top: -80px;
707 visibility: hidden;
708 }
709
692 .cs_files {
710 .cs_files {
693 clear: both;
711 clear: both;
694 }
712 }
695
713
714 #diff-file-sticky{
715 will-change: min-height;
716 }
717
718 .sidebar__inner{
719 transform: translate(0, 0); /* For browsers don't support translate3d. */
720 transform: translate3d(0, 0, 0);
721 will-change: position, transform;
722 height: 70px;
723 z-index: 30;
724 background-color: #fff;
725 padding: 5px 0px;
726 }
727
728 .sidebar__bar {
729 padding: 5px 0px 0px 0px
730 }
731
732 .fpath-placeholder {
733 clear: both;
734 visibility: hidden
735 }
736
737 .is-affixed {
738 .sidebar_inner_shadow {
739 position: fixed;
740 top: 75px;
741 right: -100%;
742 left: -100%;
743 z-index: 28;
744 display: block;
745 height: 5px;
746 content: "";
747 background: linear-gradient(rgba(0, 0, 0, 0.075), rgba(0, 0, 0, 0.001)) repeat-x 0 0;
748 border-top: 1px solid rgba(0, 0, 0, 0.15);
749 }
750 .fpath-placeholder {
751 visibility: visible !important;
752 }
753 }
754
696 .diffset-menu {
755 .diffset-menu {
697 margin-bottom: 20px;
756 margin-bottom: 20px;
698 }
757 }
@@ -725,14 +784,27 b' input.filediff-collapse-state {'
725 }
784 }
726 }
785 }
727
786
787 .filelist {
788 .pill {
789 display: block;
790 float: left;
791 padding: @pill-padding-small;
792 }
793 }
794
728 .pill {
795 .pill {
729 display: block;
796 display: block;
730 float: left;
797 float: left;
731 padding: @pill-padding;
798 padding: @pill-padding;
732 }
799 }
800
733 .pill-group {
801 .pill-group {
734 .pill {
802 .pill {
735 opacity: .8;
803 opacity: .8;
804 margin-right: 3px;
805 font-size: 12px;
806 font-weight: normal;
807
736 &:first-child {
808 &:first-child {
737 border-radius: @border-radius 0 0 @border-radius;
809 border-radius: @border-radius 0 0 @border-radius;
738 }
810 }
@@ -741,6 +813,7 b' input.filediff-collapse-state {'
741 }
813 }
742 &:only-child {
814 &:only-child {
743 border-radius: @border-radius;
815 border-radius: @border-radius;
816 margin-right: 0;
744 }
817 }
745 }
818 }
746 }
819 }
@@ -815,6 +888,56 b' input.filediff-collapse-state {'
815 }
888 }
816 }
889 }
817
890
891 .filediff-collapse-button, .filediff-expand-button {
892 cursor: pointer;
893 }
894 .filediff-collapse-button {
895 display: inline;
896 }
897 .filediff-expand-button {
898 display: none;
899 }
900 .filediff-collapsed .filediff-collapse-button {
901 display: none;
902 }
903 .filediff-collapsed .filediff-expand-button {
904 display: inline;
905 }
906
907 /**** COMMENTS ****/
908
909 .filediff-menu {
910 .show-comment-button {
911 display: none;
912 }
913 }
914 &.hide-comments {
915 .inline-comments {
916 display: none;
917 }
918 .filediff-menu {
919 .show-comment-button {
920 display: inline;
921 }
922 .hide-comment-button {
923 display: none;
924 }
925 }
926 }
927
928 .hide-line-comments {
929 .inline-comments {
930 display: none;
931 }
932 }
933
934 /**** END COMMENTS ****/
935
936 }
937
938
939
940 .filediff, .filelist {
818 .pill {
941 .pill {
819 &[op="name"] {
942 &[op="name"] {
820 background: none;
943 background: none;
@@ -868,53 +991,8 b' input.filediff-collapse-state {'
868 color: white;
991 color: white;
869 }
992 }
870 }
993 }
871
994 }
872 .filediff-collapse-button, .filediff-expand-button {
873 cursor: pointer;
874 }
875 .filediff-collapse-button {
876 display: inline;
877 }
878 .filediff-expand-button {
879 display: none;
880 }
881 .filediff-collapsed .filediff-collapse-button {
882 display: none;
883 }
884 .filediff-collapsed .filediff-expand-button {
885 display: inline;
886 }
887
888 /**** COMMENTS ****/
889
995
890 .filediff-menu {
891 .show-comment-button {
892 display: none;
893 }
894 }
895 &.hide-comments {
896 .inline-comments {
897 display: none;
898 }
899 .filediff-menu {
900 .show-comment-button {
901 display: inline;
902 }
903 .hide-comment-button {
904 display: none;
905 }
906 }
907 }
908
909 .hide-line-comments {
910 .inline-comments {
911 display: none;
912 }
913 }
914
915 /**** END COMMENTS ****/
916
917 }
918
996
919 .filediff-outdated {
997 .filediff-outdated {
920 padding: 8px 0;
998 padding: 8px 0;
@@ -950,6 +1028,9 b' table.cb {'
950 .cb-collapse {
1028 .cb-collapse {
951 display: none;
1029 display: none;
952 }
1030 }
1031 .cb-hunk {
1032 display: none;
1033 }
953 }
1034 }
954
1035
955 /* intentionally general selector since .cb-line-selected must override it
1036 /* intentionally general selector since .cb-line-selected must override it
@@ -976,8 +1057,18 b' table.cb {'
976 border-top: 1px solid #eee;
1057 border-top: 1px solid #eee;
977 }
1058 }
978
1059
1060 &.cb-comment-info {
1061 border-top: 1px solid #eee;
1062 color: rgba(0, 0, 0, 0.3);
1063 background: #edf2f9;
1064
1065 td {
1066
1067 }
1068 }
1069
979 &.cb-hunk {
1070 &.cb-hunk {
980 font-family: @font-family-monospace;
1071 font-family: @text-monospace;
981 color: rgba(0, 0, 0, 0.3);
1072 color: rgba(0, 0, 0, 0.3);
982
1073
983 td {
1074 td {
@@ -1009,11 +1100,22 b' table.cb {'
1009 padding-right: @cb-line-code-padding;
1100 padding-right: @cb-line-code-padding;
1010 display: block;
1101 display: block;
1011 white-space: pre-wrap;
1102 white-space: pre-wrap;
1012 font-family: @font-family-monospace;
1103 font-family: @text-monospace;
1013 word-break: break-all;
1104 word-break: break-all;
1014 .nonl {
1105 .nonl {
1015 color: @color5;
1106 color: @color5;
1016 }
1107 }
1108 .cb-action {
1109 &:before {
1110 content: " ";
1111 }
1112 &.cb-deletion:before {
1113 content: "- ";
1114 }
1115 &.cb-addition:before {
1116 content: "+ ";
1117 }
1118 }
1017 }
1119 }
1018
1120
1019 &> button.cb-comment-box-opener {
1121 &> button.cb-comment-box-opener {
@@ -1043,11 +1145,14 b' table.cb {'
1043 &.cb-data {
1145 &.cb-data {
1044 text-align: right;
1146 text-align: right;
1045 width: 30px;
1147 width: 30px;
1046 font-family: @font-family-monospace;
1148 font-family: @text-monospace;
1047
1149
1048 .icon-comment {
1150 .icon-comment {
1049 cursor: pointer;
1151 cursor: pointer;
1050 }
1152 }
1153 &.cb-line-selected {
1154 background: @comment-highlight-color !important;
1155 }
1051 &.cb-line-selected > div {
1156 &.cb-line-selected > div {
1052 display: block;
1157 display: block;
1053 background: @comment-highlight-color !important;
1158 background: @comment-highlight-color !important;
@@ -1062,13 +1167,15 b' table.cb {'
1062 color: rgba(0, 0, 0, 0.3);
1167 color: rgba(0, 0, 0, 0.3);
1063 text-align: right;
1168 text-align: right;
1064 border-right: 1px solid #eee;
1169 border-right: 1px solid #eee;
1065 font-family: @font-family-monospace;
1170 font-family: @text-monospace;
1171 -webkit-user-select: none;
1172 -moz-user-select: none;
1066 user-select: none;
1173 user-select: none;
1067
1174
1068 a::before {
1175 a::before {
1069 content: attr(data-line-no);
1176 content: attr(data-line-no);
1070 }
1177 }
1071 &.cb-line-selected a {
1178 &.cb-line-selected {
1072 background: @comment-highlight-color !important;
1179 background: @comment-highlight-color !important;
1073 }
1180 }
1074
1181
@@ -62,6 +62,7 b' tr.inline-comments div {'
62 line-height: .8em;
62 line-height: .8em;
63
63
64 font-family: @text-italic;
64 font-family: @text-italic;
65 font-style: italic;
65 background: #fff none;
66 background: #fff none;
66 color: @grey4;
67 color: @grey4;
67 border: 1px solid @grey4;
68 border: 1px solid @grey4;
@@ -72,6 +73,8 b' tr.inline-comments div {'
72
73
73 &.todo {
74 &.todo {
74 color: @color5;
75 color: @color5;
76 font-style: italic;
77 font-weight: @text-bold-italic-weight;
75 font-family: @text-bold-italic;
78 font-family: @text-bold-italic;
76 }
79 }
77
80
@@ -92,6 +95,7 b' tr.inline-comments div {'
92 color: @color1;
95 color: @color1;
93 margin: 2px 8px;
96 margin: 2px 8px;
94 font-family: @text-italic;
97 font-family: @text-italic;
98 font-style: italic;
95 }
99 }
96 }
100 }
97
101
@@ -336,7 +340,7 b' div.comment-form {'
336 .comment-form textarea {
340 .comment-form textarea {
337 width: 100%;
341 width: 100%;
338 height: 100px;
342 height: 100px;
339 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
343 font-family: @text-monospace;
340 }
344 }
341
345
342 form.comment-form {
346 form.comment-form {
@@ -95,6 +95,7 b' div.diffblock.margined.comm tr {'
95
95
96 .compare-label {
96 .compare-label {
97 clear: both;
97 clear: both;
98 font-weight: @text-semibold-weight;
98 font-family: @text-semibold;
99 font-family: @text-semibold;
99 }
100 }
100 }
101 }
@@ -180,7 +180,7 b' div.markdown-block table {'
180 margin: 3px 0px 13px 0px !important;
180 margin: 3px 0px 13px 0px !important;
181 color: #424242 !important;
181 color: #424242 !important;
182 font-size: 13px !important;
182 font-size: 13px !important;
183 font-family: "Helvetica" !important;
183 font-family: @text-regular;
184 font-weight: normal !important;
184 font-weight: normal !important;
185 overflow: visible !important;
185 overflow: visible !important;
186 line-height: 140% !important;
186 line-height: 140% !important;
@@ -256,7 +256,7 b' div.markdown-block code,'
256 div.markdown-block pre,
256 div.markdown-block pre,
257 div.markdown-block #ws,
257 div.markdown-block #ws,
258 div.markdown-block #message {
258 div.markdown-block #message {
259 font-family: Monaco;
259 font-family: @text-monospace;
260 font-size: 11px;
260 font-size: 11px;
261 .border-radius(@border-radius);
261 .border-radius(@border-radius);
262 background-color: white;
262 background-color: white;
@@ -91,7 +91,7 b''
91 }
91 }
92
92
93 .input-monospace {
93 .input-monospace {
94 font-family: @font-family-monospace;
94 font-family: @text-monospace;
95 }
95 }
96
96
97 .fields {
97 .fields {
@@ -5,7 +5,6 b''
5 @import 'helpers';
5 @import 'helpers';
6 @import 'mixins';
6 @import 'mixins';
7 @import 'rcicons';
7 @import 'rcicons';
8 @import 'fonts';
9 @import 'variables';
8 @import 'variables';
10 @import 'bootstrap-variables';
9 @import 'bootstrap-variables';
11 @import 'form-bootstrap';
10 @import 'form-bootstrap';
@@ -30,16 +29,17 b''
30
29
31 //--- BASE ------------------//
30 //--- BASE ------------------//
32 .noscript-error {
31 .noscript-error {
33 top: 0;
32 top: 0;
34 left: 0;
33 left: 0;
35 width: 100%;
34 width: 100%;
36 z-index: 101;
35 z-index: 101;
37 text-align: center;
36 text-align: center;
38 font-family: @text-semibold;
37 font-size: 120%;
39 font-size: 120%;
38 color: white;
40 color: white;
39 background-color: @alert2;
41 background-color: @alert2;
40 padding: 5px 0 5px 0;
42 padding: 5px 0 5px 0;
41 font-weight: @text-semibold-weight;
42 font-family: @text-semibold;
43 }
43 }
44
44
45 html {
45 html {
@@ -161,8 +161,9 b' input.inline[type="file"] {'
161 }
161 }
162
162
163 .error-branding {
163 .error-branding {
164 font-family: @text-semibold;
164 color: @grey4;
165 color: @grey4;
165 font-weight: @text-semibold-weight;
166 font-family: @text-semibold;
166 }
167 }
167
168
168 .error_message {
169 .error_message {
@@ -214,8 +215,9 b' input.inline[type="file"] {'
214 }
215 }
215
216
216 h4 {
217 h4 {
217 margin: 0 0 @padding;
218 margin: 0 0 @padding;
218 font-family: @text-semibold;
219 font-weight: @text-semibold-weight;
220 font-family: @text-semibold;
219 }
221 }
220 }
222 }
221 }
223 }
@@ -349,10 +351,11 b' ul.auth_plugins {'
349 // Pull Requests
351 // Pull Requests
350
352
351 .pullrequests_section_head {
353 .pullrequests_section_head {
352 display: block;
354 display: block;
353 clear: both;
355 clear: both;
354 margin: @padding 0;
356 margin: @padding 0;
355 font-family: @text-bold;
357 font-weight: @text-bold-weight;
358 font-family: @text-bold;
356 }
359 }
357
360
358 .pr-origininfo, .pr-targetinfo {
361 .pr-origininfo, .pr-targetinfo {
@@ -391,14 +394,15 b' ul.auth_plugins {'
391
394
392
395
393 #pr-title-input {
396 #pr-title-input {
394 width: 72%;
397 width: 72%;
395 font-size: 1em;
398 font-size: 1em;
396 font-family: @text-bold;
399 margin: 0;
397 margin: 0;
400 padding: 0 0 0 @padding/4;
398 padding: 0 0 0 @padding/4;
401 line-height: 1.7em;
399 line-height: 1.7em;
402 color: @text-color;
400 color: @text-color;
403 letter-spacing: .02em;
401 letter-spacing: .02em;
404 font-weight: @text-bold-weight;
405 font-family: @text-bold;
402 }
406 }
403
407
404 #pullrequest_title {
408 #pullrequest_title {
@@ -471,19 +475,20 b' ul.auth_plugins {'
471
475
472 // Server Announcement
476 // Server Announcement
473 #server-announcement {
477 #server-announcement {
474 width: 95%;
478 width: 95%;
475 margin: @padding auto;
479 margin: @padding auto;
476 padding: @padding;
480 padding: @padding;
477 border-width: 2px;
481 border-width: 2px;
478 border-style: solid;
482 border-style: solid;
479 .border-radius(2px);
483 .border-radius(2px);
480 font-family: @text-bold;
484 font-weight: @text-bold-weight;
481
485 font-family: @text-bold;
482 &.info { border-color: @alert4; background-color: @alert4-inner; }
486
483 &.warning { border-color: @alert3; background-color: @alert3-inner; }
487 &.info { border-color: @alert4; background-color: @alert4-inner; }
484 &.error { border-color: @alert2; background-color: @alert2-inner; }
488 &.warning { border-color: @alert3; background-color: @alert3-inner; }
485 &.success { border-color: @alert1; background-color: @alert1-inner; }
489 &.error { border-color: @alert2; background-color: @alert2-inner; }
486 &.neutral { border-color: @grey3; background-color: @grey6; }
490 &.success { border-color: @alert1; background-color: @alert1-inner; }
491 &.neutral { border-color: @grey3; background-color: @grey6; }
487 }
492 }
488
493
489 // Fixed Sidebar Column
494 // Fixed Sidebar Column
@@ -618,11 +623,6 b' input::-moz-focus-inner { border:0; padd'
618 display: block;
623 display: block;
619 }
624 }
620
625
621 //TODO: lisa: this should be in tables
622 .show_more_col {
623 width: 20px;
624 }
625
626 //FORMS
626 //FORMS
627
627
628 .medium-inline,
628 .medium-inline,
@@ -1546,19 +1546,15 b' table.integrations {'
1546
1546
1547 .show_more {
1547 .show_more {
1548 display: inline-block;
1548 display: inline-block;
1549 position: relative;
1549 width: 0;
1550 height: 0;
1550 vertical-align: middle;
1551 vertical-align: middle;
1551 width: 4px;
1552 content: "";
1552 height: @basefontsize;
1553 border: 4px solid;
1553
1554 border-right-color: transparent;
1554 &:after {
1555 border-bottom-color: transparent;
1555 content: "\00A0\25BE";
1556 border-left-color: transparent;
1556 display: inline-block;
1557 font-size: 0;
1557 width:10px;
1558 line-height: 5px;
1559 font-size: 12px;
1560 cursor: pointer;
1561 }
1562 }
1558 }
1563
1559
1564 .journal_more .show_more {
1560 .journal_more .show_more {
@@ -1569,13 +1565,6 b' table.integrations {'
1569 }
1565 }
1570 }
1566 }
1571
1567
1572 .open .show_more:after,
1573 .select2-dropdown-open .show_more:after {
1574 .rotate(180deg);
1575 margin-left: 4px;
1576 }
1577
1578
1579 .compare_view_commits .collapse_commit:after {
1568 .compare_view_commits .collapse_commit:after {
1580 cursor: pointer;
1569 cursor: pointer;
1581 content: "\00A0\25B4";
1570 content: "\00A0\25B4";
@@ -2214,9 +2203,10 b' h3.files_location{'
2214 margin-left: 0.5em;
2203 margin-left: 0.5em;
2215 display: inline-block;
2204 display: inline-block;
2216
2205
2217 em{
2206 em {
2218 font-family: @text-bold;
2207 font-weight: @text-bold-weight;
2219 }
2208 font-family: @text-bold;
2209 }
2220 }
2210 }
2221 }
2211 }
2222
2212
@@ -2250,7 +2240,6 b' h3.files_location{'
2250
2240
2251 div.search-feedback-items {
2241 div.search-feedback-items {
2252 display: inline-block;
2242 display: inline-block;
2253 padding:0px 0px 0px 96px;
2254 }
2243 }
2255
2244
2256 div.search-code-body {
2245 div.search-code-body {
@@ -2388,6 +2377,21 b' table.dataTable {'
2388 }
2377 }
2389 }
2378 }
2390
2379
2380 table.rctable {
2381 &.permissions {
2382
2383 th.td-owner {
2384 padding: 0;
2385 }
2386
2387 th {
2388 font-weight: normal;
2389 padding: 0 5px;
2390 }
2391
2392 }
2393 }
2394
2391
2395
2392 // TODO: johbo: Fix for IE10, this avoids that we see a border
2396 // TODO: johbo: Fix for IE10, this avoids that we see a border
2393 // and padding around checkboxes and radio boxes. Move to the right place,
2397 // and padding around checkboxes and radio boxes. Move to the right place,
@@ -2443,7 +2447,7 b' div.markup-form {'
2443 .markup-form textarea {
2447 .markup-form textarea {
2444 width: 100%;
2448 width: 100%;
2445 height: 100px;
2449 height: 100px;
2446 font-family: 'Monaco', 'Courier', 'Courier New', monospace;
2450 font-family: @text-monospace;
2447 }
2451 }
2448
2452
2449 form.markup-form {
2453 form.markup-form {
@@ -119,11 +119,6 b''
119 &.has_select2 a {
119 &.has_select2 a {
120 display: block;
120 display: block;
121 padding: 10px 0 2px;
121 padding: 10px 0 2px;
122
123 .show_more {
124 margin-top: -4px;
125 padding-right: .5em;
126 }
127 }
122 }
128
123
129 .menulabel {
124 .menulabel {
@@ -170,17 +165,13 b''
170
165
171 &:hover { color: @grey1; }
166 &:hover { color: @grey1; }
172 }
167 }
173
174 .show_more {
175 padding-left: .5em;
176 }
177 }
168 }
178
169
179 #quick_login_link {
170 #quick_login_link {
180 display: inline-block;
171 display: inline-block;
181
172
182 .gravatar {
173 .gravatar {
183 border: 1px solid @grey2;
174 border: 1px solid @grey5;
184 }
175 }
185
176
186 .gravatar-login {
177 .gravatar-login {
@@ -205,6 +196,10 b''
205 &:hover #quick_login_link {
196 &:hover #quick_login_link {
206 color: inherit;
197 color: inherit;
207 }
198 }
199
200 .menu_link_user {
201 padding: 0 2px;
202 }
208 }
203 }
209
204
210 &:before { content: none; }
205 &:before { content: none; }
@@ -649,7 +644,7 b' ul#context-pages {'
649 border-bottom: 1px solid @grey4;
644 border-bottom: 1px solid @grey4;
650 display: inline-block;
645 display: inline-block;
651 vertical-align: top;
646 vertical-align: top;
652 margin-left: -5px;
647 margin-left: -7px;
653 background: @grey3;
648 background: @grey3;
654 }
649 }
655
650
@@ -673,10 +668,11 b' ul#context-pages {'
673 }
668 }
674
669
675 .main_filter_input {
670 .main_filter_input {
676 padding: 6px;
671 padding: 5px;
677 min-width: 220px;
672 min-width: 220px;
678 color: @nav-grey;
673 color: @nav-grey;
679 background: @grey3;
674 background: @grey3;
675 min-height: 18px;
680 }
676 }
681
677
682 .main_filter_input::placeholder {
678 .main_filter_input::placeholder {
@@ -90,6 +90,12 b''
90
90
91 .icon-more:before { content: '\e815'; } /* '' */
91 .icon-more:before { content: '\e815'; } /* '' */
92
92
93 .icon-more-linked { cursor: pointer; color: @grey3 }
94 .icon-more-linked:before { content: '\e815'; } /* '' */
95
96 .icon-expand-linked { cursor: pointer; color: @grey3; font-size: 8px }
97 .icon-expand-linked:before { content: '\e80e'; } /* '' */
98
93 .icon-git-inv:before { content: '\e80f'; } /* '' */
99 .icon-git-inv:before { content: '\e80f'; } /* '' */
94 .icon-hg-inv:before { content: '\e810'; } /* '' */
100 .icon-hg-inv:before { content: '\e810'; } /* '' */
95 .icon-svn-inv:before { content: '\e811'; } /* '' */
101 .icon-svn-inv:before { content: '\e811'; } /* '' */
@@ -71,7 +71,7 b' div.readme_box table {'
71 margin: 3px 0px 13px 0px !important;
71 margin: 3px 0px 13px 0px !important;
72 color: #424242 !important;
72 color: #424242 !important;
73 font-size: 13px !important;
73 font-size: 13px !important;
74 font-family: "Helvetica" !important;
74 font-family: @text-regular;
75 font-weight: normal !important;
75 font-weight: normal !important;
76 overflow: visible !important;
76 overflow: visible !important;
77 line-height: 140% !important;
77 line-height: 140% !important;
@@ -136,7 +136,7 b' div.readme_box button {'
136
136
137 div.readme_box code,
137 div.readme_box code,
138 div.readme_box pre {
138 div.readme_box pre {
139 font-family: Monaco;
139 font-family: @text-monospace;
140 font-size: 11px;
140 font-size: 11px;
141 .border-radius(@border-radius);
141 .border-radius(@border-radius);
142 background-color: white;
142 background-color: white;
@@ -127,11 +127,11 b' select.select2{height:28px;visibility:hi'
127 &:after {
127 &:after {
128 position: absolute;
128 position: absolute;
129 content: "\00A0\25BE";
129 content: "\00A0\25BE";
130 right: .6em;
130 right: .1em;
131 line-height: 1em;
131 line-height: 1em;
132 top: 0.9em;
132 top: 0.4em;
133 width: 1em;
133 width: 1em;
134 font-size: 1em;
134 font-size: 20px;
135 }
135 }
136 }
136 }
137 }
137 }
@@ -198,9 +198,10 b' select.select2{height:28px;visibility:hi'
198 &.select2-result-with-children {
198 &.select2-result-with-children {
199
199
200 .select2-result-label {
200 .select2-result-label {
201 font-family: @text-semibold;
202 color: @rcdarkblue;
201 color: @rcdarkblue;
203 cursor: default;
202 cursor: default;
203 font-weight: @text-semibold-weight;
204 font-family: @text-semibold;
204 }
205 }
205
206
206 ul.select2-result-sub li .select2-result-label {
207 ul.select2-result-sub li .select2-result-label {
@@ -62,6 +62,7 b''
62 height: 30px;
62 height: 30px;
63 margin: 0;
63 margin: 0;
64 padding: 0;
64 padding: 0;
65 font-weight: @text-semibold-weight;
65 font-family: @text-semibold;
66 font-family: @text-semibold;
66 }
67 }
67
68
@@ -165,8 +166,14 b''
165 width: 25%;
166 width: 25%;
166 margin: 0;
167 margin: 0;
167 padding: 0;
168 padding: 0;
169 font-weight: @text-semibold-weight;
168 font-family: @text-semibold;
170 font-family: @text-semibold;
169 }
171 }
172
173 .left-label-summary {
174 .left-label;
175 width: 150px;
176 }
170
177
171 .right-content { // similar to form fields
178 .right-content { // similar to form fields
172 float: left;
179 float: left;
@@ -247,13 +254,19 b''
247 display: block;
254 display: block;
248 width: 100%;
255 width: 100%;
249 margin: 0;
256 margin: 0;
250 padding: @space 0 @padding 0;
257 padding: @space 0 10px 0;
251 border-top: @border-thickness solid @border-default-color;
258 border-top: @border-thickness solid @border-default-color;
252
259
253 .stats {
260 .stats {
254 float: left;
261 float: left;
255 width: 50%;
262 width: 50%;
256 }
263 }
264 .stats-filename {
265 font-size: 120%;
266 }
267 .stats-first-item {
268 padding: 0px 0px 0px 3px;
269 }
257
270
258 .buttons {
271 .buttons {
259 float: right;
272 float: right;
@@ -65,13 +65,9 b' table.dataTable {'
65 background-color: @grey7;
65 background-color: @grey7;
66 }
66 }
67
67
68 .td-radio + .td-owner {
69 padding-left: 1em;
70 }
71
72
73 th {
68 th {
74 text-align: left;
69 text-align: left;
70 font-weight: @text-semibold-weight;
75 font-family: @text-semibold;
71 font-family: @text-semibold;
76 }
72 }
77
73
@@ -139,7 +135,7 b' table.dataTable {'
139 white-space: nowrap;
135 white-space: nowrap;
140 overflow: hidden;
136 overflow: hidden;
141 text-overflow: ellipsis;
137 text-overflow: ellipsis;
142 max-width: 450px;
138 max-width: 350px;
143 }
139 }
144 }
140 }
145
141
@@ -234,6 +230,8 b' table.dataTable {'
234 &.expand_commit {
230 &.expand_commit {
235 padding-right: 0;
231 padding-right: 0;
236 padding-left: 1em;
232 padding-left: 1em;
233 cursor: pointer;
234 width: 20px;
237 }
235 }
238 }
236 }
239
237
@@ -327,6 +325,7 b' table#repo_list_table {'
327 table.keyboard-mappings {
325 table.keyboard-mappings {
328 th {
326 th {
329 text-align: left;
327 text-align: left;
328 font-weight: @text-semibold-weight;
330 font-family: @text-semibold;
329 font-family: @text-semibold;
331 }
330 }
332 }
331 }
@@ -372,6 +371,7 b' table.keyboard-mappings {'
372 table.rctable.dl-settings {
371 table.rctable.dl-settings {
373 td {
372 td {
374 border: none;
373 border: none;
374 vertical-align: baseline;
375 }
375 }
376 }
376 }
377
377
@@ -447,6 +447,8 b' table.trending_language_tbl {'
447
447
448 &.expand_commit {
448 &.expand_commit {
449 padding-right: 0;
449 padding-right: 0;
450 cursor: pointer;
451 width: 20px;
450 }
452 }
451 }
453 }
452 }
454 }
@@ -35,16 +35,16 b' h1, h2, h3, h4, h5, h6,'
35 }
35 }
36 }
36 }
37
37
38 h1, .h1 { font-size: 1.54em; font-family: @text-bold; }
38 h1, .h1 { font-size: 1.54em; font-weight: @text-bold-weight; font-family: @text-bold; }
39 h2, .h2 { font-size: 1.23em; font-family: @text-semibold; }
39 h2, .h2 { font-size: 1.23em; font-weight: @text-semibold-weight; font-family: @text-semibold; }
40 h3, .h3 { font-size: 1.23em; font-family: @text-regular; }
40 h3, .h3 { font-size: 1.23em; font-family: @text-regular; }
41 h4, .h4 { font-size: 1em; font-family: @text-bold; }
41 h4, .h4 { font-size: 1em; font-weight: @text-bold-weight; font-family: @text-bold; }
42 h5, .h5 { font-size: 1em; font-family: @text-bold-italic; }
42 h5, .h5 { font-size: 1em; font-weight: @text-bold-weight; font-family: @text-bold; }
43 h6, .h6 { font-size: 1em; font-family: @text-bold-italic; }
43 h6, .h6 { font-size: 1em; font-weight: @text-bold-weight; font-family: @text-bold; }
44
44
45 // Breadcrumbs
45 // Breadcrumbs
46 .breadcrumbs {
46 .breadcrumbs {
47 &:extend(h1);
47 font-size: @repo-title-fontsize;
48 margin: 0;
48 margin: 0;
49 }
49 }
50
50
@@ -95,15 +95,19 b' img {'
95 }
95 }
96
96
97 strong {
97 strong {
98 font-weight: @text-bold-weight;
98 font-family: @text-bold;
99 font-family: @text-bold;
99 }
100 }
100
101
101 em {
102 em {
102 font-family: @text-italic;
103 font-family: @text-italic;
104 font-style: italic;
103 }
105 }
104
106
105 strong em,
107 strong em,
106 em strong {
108 em strong {
109 font-style: italic;
110 font-weight: @text-bold-italic-weight;
107 font-family: @text-bold-italic;
111 font-family: @text-bold-italic;
108 }
112 }
109
113
@@ -230,7 +234,7 b' mark,'
230 width: 100%;
234 width: 100%;
231 margin: @pagepadding/2 0 @pagepadding;
235 margin: @pagepadding/2 0 @pagepadding;
232
236
233 .breadcrumbs{
237 .breadcrumbs {
234 float: left;
238 float: left;
235 clear: both;
239 clear: both;
236 width: 700px;
240 width: 700px;
@@ -384,6 +388,7 b' dd {'
384
388
385 dt {
389 dt {
386 margin: @textmargin 0 0 0;
390 margin: @textmargin 0 0 0;
391 font-weight: @text-bold-weight;
387 font-family: @text-bold;
392 font-family: @text-bold;
388 }
393 }
389
394
@@ -53,16 +53,26 b''
53 @text-color: @grey2;
53 @text-color: @grey2;
54 @repo-title-fontsize: 18px;
54 @repo-title-fontsize: 18px;
55
55
56 @text-regular: "proximanovaregular","Proxima Nova Regular", "Proxima Nova", sans-serif;
56 @text-regular: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
57 @text-italic: "proximanovaitalic","Proxima Nova Italic", "Proxima Nova", sans-serif;
57 @text-monospace: 'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace;
58 @text-bold: "proximanovabold","Proxima Nova Bold", "Proxima Nova", sans-serif;
58
59 @text-semibold: "proximanovasemibold","Proxima Nova Semibold", "Proxima Nova", sans-serif;
59 @text-italic: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
60 @text-bold-italic: "proximanovabolditalic","Proxima Nova Bold Italic", "Proxima Nova", sans-serif;
60
61 @text-code: "Lucida Console", Menlo, Monaco, monospace;
61 @text-bold: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
62 @text-bold-weight: 600;
63
64 @text-semibold: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
65 @text-semibold-weight: 500;
66
67 @text-bold-italic: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
68 @text-bold-italic-weight: 600;
69
70 @text-code: @text-monospace;
62 @text-light: @text-regular;
71 @text-light: @text-regular;
63 @text-light-italic: @text-italic;
72
73
64 // Used for .close buttons
74 // Used for .close buttons
65 @text-bootstrap: "Helvetica Neue", Helvetica, Arial, sans-serif;
75 @text-bootstrap: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen-Sans, Ubuntu, Cantarell, "Helvetica Neue", sans-serif;
66
76
67 @panel-title: @basefontsize;
77 @panel-title: @basefontsize;
68 @panel-footer: @basefontsize;
78 @panel-footer: @basefontsize;
@@ -150,6 +150,7 b' function registerRCRoutes() {'
150 pyroutes.register('repo_list_data', '/_repos', []);
150 pyroutes.register('repo_list_data', '/_repos', []);
151 pyroutes.register('goto_switcher_data', '/_goto_data', []);
151 pyroutes.register('goto_switcher_data', '/_goto_data', []);
152 pyroutes.register('markup_preview', '/_markup_preview', []);
152 pyroutes.register('markup_preview', '/_markup_preview', []);
153 pyroutes.register('store_user_session_value', '/_store_session_attr', []);
153 pyroutes.register('journal', '/_admin/journal', []);
154 pyroutes.register('journal', '/_admin/journal', []);
154 pyroutes.register('journal_rss', '/_admin/journal/rss', []);
155 pyroutes.register('journal_rss', '/_admin/journal/rss', []);
155 pyroutes.register('journal_atom', '/_admin/journal/atom', []);
156 pyroutes.register('journal_atom', '/_admin/journal/atom', []);
@@ -227,6 +228,7 b' function registerRCRoutes() {'
227 pyroutes.register('pullrequest_comment_delete', '/%(repo_name)s/pull-request/%(pull_request_id)s/comment/%(comment_id)s/delete', ['repo_name', 'pull_request_id', 'comment_id']);
228 pyroutes.register('pullrequest_comment_delete', '/%(repo_name)s/pull-request/%(pull_request_id)s/comment/%(comment_id)s/delete', ['repo_name', 'pull_request_id', 'comment_id']);
228 pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']);
229 pyroutes.register('edit_repo', '/%(repo_name)s/settings', ['repo_name']);
229 pyroutes.register('edit_repo_advanced', '/%(repo_name)s/settings/advanced', ['repo_name']);
230 pyroutes.register('edit_repo_advanced', '/%(repo_name)s/settings/advanced', ['repo_name']);
231 pyroutes.register('edit_repo_advanced_archive', '/%(repo_name)s/settings/advanced/archive', ['repo_name']);
230 pyroutes.register('edit_repo_advanced_delete', '/%(repo_name)s/settings/advanced/delete', ['repo_name']);
232 pyroutes.register('edit_repo_advanced_delete', '/%(repo_name)s/settings/advanced/delete', ['repo_name']);
231 pyroutes.register('edit_repo_advanced_locking', '/%(repo_name)s/settings/advanced/locking', ['repo_name']);
233 pyroutes.register('edit_repo_advanced_locking', '/%(repo_name)s/settings/advanced/locking', ['repo_name']);
232 pyroutes.register('edit_repo_advanced_journal', '/%(repo_name)s/settings/advanced/journal', ['repo_name']);
234 pyroutes.register('edit_repo_advanced_journal', '/%(repo_name)s/settings/advanced/journal', ['repo_name']);
@@ -1,6 +1,81 b''
1 import {Polymer, html} from '@polymer/polymer/polymer-legacy';
2 import '@polymer/iron-ajax/iron-ajax.js';
3
4 const elemTemplate = html`
5 <iron-ajax
6 id="ajaxConnect"
7 url=""
8 handle-as="json"
9 method="post"
10 content-type="application/json"
11 loading="{{loadingConnect}}"
12 last-response="{{connectLastResponse}}"
13 on-response="_handleConnect"
14 on-error="_handleConnectError"
15 debounce-duration="100"></iron-ajax>
16
17 <iron-ajax
18 id="ajaxDisconnect"
19 url=""
20 handle-as="json"
21 method="post"
22 content-type="application/json"
23 loading="{{loadingDisconnect}}"
24 last-response="{{_disconnectLastResponse}}"
25 on-response="_handleDisconnect"
26 debounce-duration="100"></iron-ajax>
27
28 <iron-ajax
29 id="ajaxSubscribe"
30 url=""
31 handle-as="json"
32 method="post"
33 content-type="application/json"
34 loading="{{loadingSubscribe}}"
35 last-response="{{subscribeLastResponse}}"
36 on-response="_handleSubscribe"
37 debounce-duration="100"></iron-ajax>
38
39 <iron-ajax
40 id="ajaxUnsubscribe"
41 url=""
42 handle-as="json"
43 method="post"
44 content-type="application/json"
45 loading="{{loadingUnsubscribe}}"
46 last-response="{{unsubscribeLastResponse}}"
47 on-response="_handleUnsubscribe"
48 debounce-duration="100"></iron-ajax>
49
50 <iron-ajax
51 id="ajaxMessage"
52 url=""
53 handle-as="json"
54 method="post"
55 content-type="application/json"
56 loading="{{loadingMessage}}"
57 last-response="{{messageLastResponse}}"
58 on-response="_handleMessage"
59 on-error="_handleMessageError"
60 debounce-duration="100"></iron-ajax>
61
62 <iron-ajax
63 id="ajaxListen"
64 url=""
65 handle-as="text"
66 loading="{{loadingListen}}"
67 last-response="{{listenLastResponse}}"
68 on-request="_handleListenOpen"
69 on-error="_handleListenError"
70 on-response="_handleListenMessageEvent"
71 debounce-duration="100"></iron-ajax>
72 `
73
1 Polymer({
74 Polymer({
2 is: 'channelstream-connection',
75 is: 'channelstream-connection',
3
76
77 _template: elemTemplate,
78
4 /**
79 /**
5 * Fired when `channels` array changes.
80 * Fired when `channels` array changes.
6 *
81 *
@@ -1,9 +1,31 b''
1 ccLog = Logger.get('RhodeCodeApp');
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2 import '../channelstream-connection/channelstream-connection.js';
3 import '../rhodecode-toast/rhodecode-toast.js';
4 import '../rhodecode-favicon/rhodecode-favicon.js';
5
6 var ccLog = Logger.get('RhodeCodeApp');
2 ccLog.setLevel(Logger.OFF);
7 ccLog.setLevel(Logger.OFF);
3
8
4 var rhodeCodeApp = Polymer({
9 export class RhodecodeApp extends PolymerElement {
5 is: 'rhodecode-app',
10
6 attached: function () {
11 static get is() {
12 return 'rhodecode-app';
13 }
14
15 static get template(){
16 return html`
17 <channelstream-connection
18 id="channelstream-connection"
19 on-channelstream-listen-message="receivedMessage"
20 on-channelstream-connected="handleConnected"
21 on-channelstream-subscribed="handleSubscribed">
22 </channelstream-connection>
23 <rhodecode-favicon></rhodecode-favicon>
24 `
25 }
26
27 connectedCallback() {
28 super.connectedCallback();
7 ccLog.debug('rhodeCodeApp created');
29 ccLog.debug('rhodeCodeApp created');
8 $.Topic('/notifications').subscribe(this.handleNotifications.bind(this));
30 $.Topic('/notifications').subscribe(this.handleNotifications.bind(this));
9 $.Topic('/favicon/update').subscribe(this.faviconUpdate.bind(this));
31 $.Topic('/favicon/update').subscribe(this.faviconUpdate.bind(this));
@@ -21,46 +43,47 b' var rhodeCodeApp = Polymer({'
21 $(document).ready(function () {
43 $(document).ready(function () {
22 this.kickoffChannelstreamPlugin();
44 this.kickoffChannelstreamPlugin();
23 }.bind(this));
45 }.bind(this));
24 },
46 }
25
47
26 initPlugins: function(){
48 initPlugins() {
27 for (var i = 0; i < window.APPLICATION_PLUGINS.length; i++) {
49 for (var i = 0; i < window.APPLICATION_PLUGINS.length; i++) {
28 var pluginDef = window.APPLICATION_PLUGINS[i];
50 var pluginDef = window.APPLICATION_PLUGINS[i];
29 if (pluginDef.component){
51 if (pluginDef.component) {
30 var pluginElem = document.createElement(pluginDef.component);
52 var pluginElem = document.createElement(pluginDef.component);
31 this.shadowRoot.appendChild(pluginElem);
53 this.shadowRoot.appendChild(pluginElem);
32 if (typeof pluginElem.init !== 'undefined'){
54 if (typeof pluginElem.init !== 'undefined') {
33 pluginElem.init();
55 pluginElem.init();
34 }
56 }
35 }
57 }
36 }
58 }
37 },
59 }
60
38 /** proxy to channelstream connection */
61 /** proxy to channelstream connection */
39 getChannelStreamConnection: function () {
62 getChannelStreamConnection() {
40 return this.$['channelstream-connection'];
63 return this.$['channelstream-connection'];
41 },
64 }
42
65
43 handleNotifications: function (data) {
66 handleNotifications(data) {
44 var elem = document.getElementById('notifications');
67 var elem = document.getElementById('notifications');
45 if(elem){
68 if (elem) {
46 elem.handleNotification(data);
69 elem.handleNotification(data);
47 }
70 }
48
71
49 },
72 }
50
73
51 faviconUpdate: function (data) {
74 faviconUpdate(data) {
52 this.shadowRoot.querySelector('rhodecode-favicon').counter = data.count;
75 this.shadowRoot.querySelector('rhodecode-favicon').counter = data.count;
53 },
76 }
54
77
55 /** opens connection to ws server */
78 /** opens connection to ws server */
56 kickoffChannelstreamPlugin: function (data) {
79 kickoffChannelstreamPlugin(data) {
57 ccLog.debug('kickoffChannelstreamPlugin');
80 ccLog.debug('kickoffChannelstreamPlugin');
58 var channels = ['broadcast'];
81 var channels = ['broadcast'];
59 var addChannels = this.checkViewChannels();
82 var addChannels = this.checkViewChannels();
60 for (var i = 0; i < addChannels.length; i++) {
83 for (var i = 0; i < addChannels.length; i++) {
61 channels.push(addChannels[i]);
84 channels.push(addChannels[i]);
62 }
85 }
63 if (window.CHANNELSTREAM_SETTINGS && CHANNELSTREAM_SETTINGS.enabled){
86 if (window.CHANNELSTREAM_SETTINGS && CHANNELSTREAM_SETTINGS.enabled) {
64 var channelstreamConnection = this.getChannelStreamConnection();
87 var channelstreamConnection = this.getChannelStreamConnection();
65 channelstreamConnection.connectUrl = CHANNELSTREAM_URLS.connect;
88 channelstreamConnection.connectUrl = CHANNELSTREAM_URLS.connect;
66 channelstreamConnection.subscribeUrl = CHANNELSTREAM_URLS.subscribe;
89 channelstreamConnection.subscribeUrl = CHANNELSTREAM_URLS.subscribe;
@@ -74,9 +97,9 b' var rhodeCodeApp = Polymer({'
74 $.Topic('/connection_controller/subscribe').processPrepared();
97 $.Topic('/connection_controller/subscribe').processPrepared();
75 channelstreamConnection.connect();
98 channelstreamConnection.connect();
76 }
99 }
77 },
100 }
78
101
79 checkViewChannels: function () {
102 checkViewChannels() {
80 // subscribe to different channels data is sent.
103 // subscribe to different channels data is sent.
81
104
82 var channels = [];
105 var channels = [];
@@ -94,10 +117,10 b' var rhodeCodeApp = Polymer({'
94 }
117 }
95
118
96 return channels;
119 return channels;
97 },
120 }
98
121
99 /** subscribes users from channels in channelstream */
122 /** subscribes users from channels in channelstream */
100 subscribeToChannelTopic: function (channels) {
123 subscribeToChannelTopic(channels) {
101 var channelstreamConnection = this.getChannelStreamConnection();
124 var channelstreamConnection = this.getChannelStreamConnection();
102 var toSubscribe = channelstreamConnection.calculateSubscribe(channels);
125 var toSubscribe = channelstreamConnection.calculateSubscribe(channels);
103 ccLog.debug('subscribeToChannelTopic', toSubscribe);
126 ccLog.debug('subscribeToChannelTopic', toSubscribe);
@@ -113,34 +136,35 b' var rhodeCodeApp = Polymer({'
113 }
136 }
114 }
137 }
115 }
138 }
116 },
139 }
117
140
118 /** publish received messages into correct topic */
141 /** publish received messages into correct topic */
119 receivedMessage: function (event) {
142 receivedMessage(event) {
120 for (var i = 0; i < event.detail.length; i++) {
143 for (var i = 0; i < event.detail.length; i++) {
121 var message = event.detail[i];
144 var message = event.detail[i];
122 if (message.message.topic) {
145 if (message.message.topic) {
123 ccLog.debug('publishing', message.message.topic);
146 ccLog.debug('publishing', message.message.topic);
124 $.Topic(message.message.topic).publish(message);
147 $.Topic(message.message.topic).publish(message);
125 }
148 }
126 else if (message.type === 'presence'){
149 else if (message.type === 'presence') {
127 $.Topic('/connection_controller/presence').publish(message);
150 $.Topic('/connection_controller/presence').publish(message);
128 }
151 }
129 else {
152 else {
130 ccLog.warn('unhandled message', message);
153 ccLog.warn('unhandled message', message);
131 }
154 }
132 }
155 }
133 },
156 }
134
157
135 handleConnected: function (event) {
158 handleConnected(event) {
136 var channelstreamConnection = this.getChannelStreamConnection();
159 var channelstreamConnection = this.getChannelStreamConnection();
137 channelstreamConnection.set('channelsState',
160 channelstreamConnection.set('channelsState',
138 event.detail.channels_info);
161 event.detail.channels_info);
139 channelstreamConnection.set('userState', event.detail.state);
162 channelstreamConnection.set('userState', event.detail.state);
140 channelstreamConnection.set('channels', event.detail.channels);
163 channelstreamConnection.set('channels', event.detail.channels);
141 this.propagageChannelsState();
164 this.propagageChannelsState();
142 },
165 }
143 handleSubscribed: function (event) {
166
167 handleSubscribed(event) {
144 var channelstreamConnection = this.getChannelStreamConnection();
168 var channelstreamConnection = this.getChannelStreamConnection();
145 var channelInfo = event.detail.channels_info;
169 var channelInfo = event.detail.channels_info;
146 var channelKeys = Object.keys(event.detail.channels_info);
170 var channelKeys = Object.keys(event.detail.channels_info);
@@ -150,9 +174,10 b' var rhodeCodeApp = Polymer({'
150 }
174 }
151 channelstreamConnection.set('channels', event.detail.channels);
175 channelstreamConnection.set('channels', event.detail.channels);
152 this.propagageChannelsState();
176 this.propagageChannelsState();
153 },
177 }
178
154 /** propagates channel states on topics */
179 /** propagates channel states on topics */
155 propagageChannelsState: function (event) {
180 propagageChannelsState(event) {
156 var channelstreamConnection = this.getChannelStreamConnection();
181 var channelstreamConnection = this.getChannelStreamConnection();
157 var channel_data = channelstreamConnection.channelsState;
182 var channel_data = channelstreamConnection.channelsState;
158 var channels = channelstreamConnection.channels;
183 var channels = channelstreamConnection.channels;
@@ -163,4 +188,7 b' var rhodeCodeApp = Polymer({'
163 );
188 );
164 }
189 }
165 }
190 }
166 });
191
192 }
193
194 customElements.define(RhodecodeApp.is, RhodecodeApp);
@@ -1,20 +1,33 b''
1 Polymer({
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2 is: 'rhodecode-favicon',
2
3 properties: {
3 export class RhodecodeFavicon extends PolymerElement {
4 favicon: Object,
4
5 counter: {
5 static get is() {
6 type: Number,
6 return 'rhodecode-favicon';
7 observer: '_handleCounter'
7 }
8
9 static get properties() {
10 return {
11 favicon: Object,
12 counter: {
13 type: Number,
14 observer: '_handleCounter'
15 }
8 }
16 }
9 },
17 }
10
18
11 ready: function () {
19 connectedCallback() {
20 super.connectedCallback();
12 this.favicon = new Favico({
21 this.favicon = new Favico({
13 type: 'rectangle',
22 type: 'rectangle',
14 animation: 'none'
23 animation: 'none'
15 });
24 });
16 },
25 }
17 _handleCounter: function (newVal, oldVal) {
26
27 _handleCounter(newVal, oldVal) {
18 this.favicon.badge(this.counter);
28 this.favicon.badge(this.counter);
19 }
29 }
20 });
30
31 }
32
33 customElements.define(RhodecodeFavicon.is, RhodecodeFavicon);
@@ -1,98 +1,231 b''
1 Polymer({
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2 is: 'rhodecode-toast',
2 import '@polymer/paper-toggle-button/paper-toggle-button.js';
3 properties: {
3 import {mixinBehaviors} from '@polymer/polymer/lib/legacy/class.js';
4 toasts: {
4 import {IronA11yKeysBehavior} from '@polymer/iron-a11y-keys-behavior/iron-a11y-keys-behavior.js';
5 type: Array,
5 import '../rhodecode-unsafe-html/rhodecode-unsafe-html.js';
6 value: function(){
6
7 return []
7 export class RhodecodeToast extends mixinBehaviors([IronA11yKeysBehavior], PolymerElement) {
8
9 static get is() {
10 return 'rhodecode-toast';
11 }
12
13 static get template(){
14 return html`
15 <style include="shared-styles">
16 /* inset border for buttons - does not work in ie */
17 /* rounded borders */
18 /* rounded borders - bottom only */
19 /* rounded borders - top only */
20 /* text shadow */
21 /* centers text in a circle - input diameter of circle and color */
22 /* pill version of the circle */
23 .absolute-center {
24 margin: auto;
25 position: absolute;
26 top: 0;
27 left: 0;
28 bottom: 0;
29 right: 0;
30 }
31
32 .top-left-rounded-corner {
33 -webkit-border-top-left-radius: 2px;
34 -khtml-border-radius-topleft: 2px;
35 border-top-left-radius: 2px;
36 }
37
38 .top-right-rounded-corner {
39 -webkit-border-top-right-radius: 2px;
40 -khtml-border-radius-topright: 2px;
41 border-top-right-radius: 2px;
42 }
43
44 .bottom-left-rounded-corner {
45 -webkit-border-bottom-left-radius: 2px;
46 -khtml-border-radius-bottomleft: 2px;
47 border-bottom-left-radius: 2px;
48 }
49
50 .bottom-right-rounded-corner {
51 -webkit-border-bottom-right-radius: 2px;
52 -khtml-border-radius-bottomright: 2px;
53 border-bottom-right-radius: 2px;
54 }
55
56 .top-left-rounded-corner-mid {
57 -webkit-border-top-left-radius: 2px;
58 -khtml-border-radius-topleft: 2px;
59 border-top-left-radius: 2px;
60 }
61
62 .top-right-rounded-corner-mid {
63 -webkit-border-top-right-radius: 2px;
64 -khtml-border-radius-topright: 2px;
65 border-top-right-radius: 2px;
8 }
66 }
9 },
67
10 isFixed: {
68 .bottom-left-rounded-corner-mid {
11 type: Boolean,
69 -webkit-border-bottom-left-radius: 2px;
12 value: false
70 -khtml-border-radius-bottomleft: 2px;
13 },
71 border-bottom-left-radius: 2px;
14 hasToasts: {
72 }
15 type: Boolean,
73
16 computed: '_computeHasToasts(toasts.*)'
74 .bottom-right-rounded-corner-mid {
17 },
75 -webkit-border-bottom-right-radius: 2px;
18 keyEventTarget: {
76 -khtml-border-radius-bottomright: 2px;
19 type: Object,
77 border-bottom-right-radius: 2px;
20 value: function() {
78 }
21 return document.body;
79
80 .alert {
81 margin: 10px 0;
82 }
83
84 .toast-close {
85 margin: 0;
86 float: right;
87 cursor: pointer;
88 }
89
90 .toast-message-holder {
91 background: rgba(255, 255, 255, 0.25);
92 }
93
94 .toast-message-holder.fixed {
95 position: fixed;
96 padding: 10px 0;
97 margin-left: 10px;
98 margin-right: 10px;
99 top: 0;
100 left: 0;
101 right: 0;
102 z-index: 100;
103 }
104 </style>
105
106 <template is="dom-if" if="[[hasToasts]]">
107 <div class$="container toast-message-holder [[conditionalClass(isFixed)]]">
108 <template is="dom-repeat" items="[[toasts]]">
109 <div class$="alert alert-[[item.level]]">
110 <div on-click="dismissNotification" class="toast-close" index-pos="[[index]]">
111 <span>[[_gettext('Close')]]</span>
112 </div>
113 <rhodecode-unsafe-html text="[[item.message]]"></rhodecode-unsafe-html>
114 </div>
115 </template>
116 </div>
117 </template>
118 `
119 }
120
121 static get properties() {
122 return {
123 toasts: {
124 type: Array,
125 value() {
126 return []
127 }
128 },
129 isFixed: {
130 type: Boolean,
131 value: false
132 },
133 hasToasts: {
134 type: Boolean,
135 computed: '_computeHasToasts(toasts.*)'
136 },
137 keyEventTarget: {
138 type: Object,
139 value() {
140 return document.body;
141 }
22 }
142 }
23 }
143 }
24 },
144 }
25 behaviors: [
145
26 Polymer.IronA11yKeysBehavior
146 get keyBindings() {
27 ],
147 return {
28 observers: [
148 'esc:keyup': '_hideOnEsc'
29 '_changedToasts(toasts.splices)'
149 }
30 ],
150 }
31
151
32 keyBindings: {
152 static get observers() {
33 'esc:keyup': '_hideOnEsc'
153 return [
34 },
154 '_changedToasts(toasts.splices)'
155 ]
156 }
35
157
36 _hideOnEsc: function (event) {
158 _hideOnEsc(event) {
37 return this.dismissNotifications();
159 return this.dismissNotifications();
38 },
160 }
39
161
40 _computeHasToasts: function(){
162 _computeHasToasts() {
41 return this.toasts.length > 0;
163 return this.toasts.length > 0;
42 },
164 }
43
165
44 _debouncedCalc: function(){
166 _debouncedCalc() {
45 // calculate once in a while
167 // calculate once in a while
46 this.debounce('debouncedCalc', this.toastInWindow, 25);
168 this.debounce('debouncedCalc', this.toastInWindow, 25);
47 },
169 }
48
170
49 conditionalClass: function(){
171 conditionalClass() {
50 return this.isFixed ? 'fixed': '';
172 return this.isFixed ? 'fixed' : '';
51 },
173 }
52
174
53 toastInWindow: function() {
175 toastInWindow() {
54 if (!this._headerNode){
176 if (!this._headerNode) {
55 return true
177 return true
56 }
178 }
57 var headerHeight = this._headerNode.offsetHeight;
179 var headerHeight = this._headerNode.offsetHeight;
58 var scrollPosition = window.scrollY;
180 var scrollPosition = window.scrollY;
59
181
60 if (this.isFixed){
182 if (this.isFixed) {
61 this.isFixed = 1 <= scrollPosition;
183 this.isFixed = 1 <= scrollPosition;
62 }
184 }
63 else{
185 else {
64 this.isFixed = headerHeight <= scrollPosition;
186 this.isFixed = headerHeight <= scrollPosition;
65 }
187 }
66 },
188 }
67
189
68 attached: function(){
190 connectedCallback() {
191 super.connectedCallback();
69 this._headerNode = document.querySelector('.header', document);
192 this._headerNode = document.querySelector('.header', document);
70 this.listen(window,'scroll', '_debouncedCalc');
193 this.listen(window, 'scroll', '_debouncedCalc');
71 this.listen(window,'resize', '_debouncedCalc');
194 this.listen(window, 'resize', '_debouncedCalc');
72 this._debouncedCalc();
195 this._debouncedCalc();
73 },
196 }
74 _changedToasts: function(newValue, oldValue){
197
198 _changedToasts(newValue, oldValue) {
75 $.Topic('/favicon/update').publish({count: this.toasts.length});
199 $.Topic('/favicon/update').publish({count: this.toasts.length});
76 },
200 }
77 dismissNotification: function(e) {
201
78 $.Topic('/favicon/update').publish({count: this.toasts.length-1});
202 dismissNotification(e) {
203 $.Topic('/favicon/update').publish({count: this.toasts.length - 1});
79 var idx = e.target.parentNode.indexPos
204 var idx = e.target.parentNode.indexPos
80 this.splice('toasts', idx, 1);
205 this.splice('toasts', idx, 1);
81
206
82 },
207 }
83 dismissNotifications: function(){
208
209 dismissNotifications() {
84 $.Topic('/favicon/update').publish({count: 0});
210 $.Topic('/favicon/update').publish({count: 0});
85 this.splice('toasts', 0);
211 this.splice('toasts', 0);
86 },
212 }
87 handleNotification: function(data){
213
214 handleNotification(data) {
88 if (!templateContext.rhodecode_user.notification_status && !data.message.force) {
215 if (!templateContext.rhodecode_user.notification_status && !data.message.force) {
89 // do not act if notifications are disabled
216 // do not act if notifications are disabled
90 return
217 return
91 }
218 }
92 this.push('toasts',{
219 this.push('toasts', {
93 level: data.message.level,
220 level: data.message.level,
94 message: data.message.message
221 message: data.message.message
95 });
222 });
96 },
223 }
97 _gettext: _gettext
224
98 });
225 _gettext(x){
226 return _gettext(x)
227 }
228
229 }
230
231 customElements.define(RhodecodeToast.is, RhodecodeToast);
@@ -1,16 +1,57 b''
1 Polymer({
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2 is: 'rhodecode-toggle',
2 import '@polymer/paper-toggle-button/paper-toggle-button.js';
3 properties: {
3 import '@polymer/paper-spinner/paper-spinner.js';
4 noSpinner: { type: Boolean, value: false, reflectToAttribute:true},
4 import '@polymer/paper-tooltip/paper-tooltip.js';
5 tooltipText: { type: String, value: "Click to toggle", reflectToAttribute:true},
5
6 checked: { type: Boolean, value: false, reflectToAttribute:true},
6 export class RhodecodeToggle extends PolymerElement {
7 active: { type: Boolean, value: false, reflectToAttribute:true, notify:true}
7
8 },
8 static get is() {
9 shouldShow: function(){
9 return 'rhodecode-toggle';
10 return !this.noSpinner
10 }
11 },
11
12 labelStatus: function(isActive){
12 static get template() {
13 return this.checked? 'Enabled' : "Disabled"
13 return html`
14 }
14 <style include="shared-styles">
15
15 .rc-toggle {
16 }); No newline at end of file
16 float: left;
17 position: relative;
18 }
19
20 .rc-toggle paper-spinner {
21 position: absolute;
22 top: 0;
23 left: -30px;
24 width: 20px;
25 height: 20px;
26 }
27 </style>
28 <div class="rc-toggle">
29 <paper-toggle-button checked={{checked}}>[[labelStatus(checked)]]
30 </paper-toggle-button>
31 <paper-tooltip>[[tooltipText]]</paper-tooltip>
32 <template is="dom-if" if="[[shouldShow(noSpinner)]]">
33 <paper-spinner active=[[active]]></paper-spinner>
34 </template>
35 </div>
36 `;
37 }
38
39 static get properties() {
40 return {
41 noSpinner: {type: Boolean, value: false, reflectToAttribute: true},
42 tooltipText: {type: String, value: "Click to toggle", reflectToAttribute: true},
43 checked: {type: Boolean, value: false, reflectToAttribute: true},
44 active: {type: Boolean, value: false, reflectToAttribute: true, notify: true}
45 }
46 }
47
48 shouldShow() {
49 return !this.noSpinner
50 }
51
52 labelStatus(isActive) {
53 return this.checked ? 'Enabled' : "Disabled"
54 }
55 }
56
57 customElements.define(RhodecodeToggle.is, RhodecodeToggle);
@@ -1,12 +1,30 b''
1 Polymer({
1 import {PolymerElement, html} from '@polymer/polymer/polymer-element.js';
2 is: 'rhodecode-unsafe-html',
2
3 properties: {
3 export class RhodecodeUnsafeHtml extends PolymerElement {
4 text: {
4
5 type: String,
5 static get is() {
6 observer: '_handleText'
6 return 'rhodecode-unsafe-html';
7 }
8
9 static get template() {
10 return html`
11 <style include="shared-styles"></style>
12 <slot></slot>
13 `;
14 }
15
16 static get properties() {
17 return {
18 text: {
19 type: String,
20 observer: '_handleText'
21 }
7 }
22 }
8 },
23 }
9 _handleText: function(newVal, oldVal){
24
25 _handleText(newVal, oldVal) {
10 this.innerHTML = this.text;
26 this.innerHTML = this.text;
11 }
27 }
12 })
28 }
29
30 customElements.define(RhodecodeUnsafeHtml.is, RhodecodeUnsafeHtml);
@@ -295,75 +295,81 b' function scrollToElement(element, percen'
295 });
295 });
296
296
297 $('body').on('click', '.cb-lineno a', function(event) {
297 $('body').on('click', '.cb-lineno a', function(event) {
298 function sortNumber(a,b) {
299 return a - b;
300 }
298
301
299 function sortNumber(a,b) {
302 var lineNo = $(this).data('lineNo');
300 return a - b;
303 var lineName = $(this).attr('name');
304
305 if (lineNo) {
306 var prevLine = $('.cb-line-selected a').data('lineNo');
307
308 // on shift, we do a range selection, if we got previous line
309 if (event.shiftKey && prevLine !== undefined) {
310 var prevLine = parseInt(prevLine);
311 var nextLine = parseInt(lineNo);
312 var pos = [prevLine, nextLine].sort(sortNumber);
313 var anchor = '#L{0}-{1}'.format(pos[0], pos[1]);
314
315 // single click
316 } else {
317 var nextLine = parseInt(lineNo);
318 var pos = [nextLine, nextLine];
319 var anchor = '#L{0}'.format(pos[0]);
320
321 }
322 // highlight
323 var range = [];
324 for (var i = pos[0]; i <= pos[1]; i++) {
325 range.push(i);
326 }
327 // clear old selected lines
328 $('.cb-line-selected').removeClass('cb-line-selected');
329
330 $.each(range, function (i, lineNo) {
331 var line_td = $('td.cb-lineno#L' + lineNo);
332
333 if (line_td.length) {
334 line_td.addClass('cb-line-selected'); // line number td
335 line_td.prev().addClass('cb-line-selected'); // line data
336 line_td.next().addClass('cb-line-selected'); // line content
337 }
338 });
339
340 } else if (lineName !== undefined) { // lineName only occurs in diffs
341 // clear old selected lines
342 $('td.cb-line-selected').removeClass('cb-line-selected');
343 var anchor = '#{0}'.format(lineName);
344 var diffmode = templateContext.session_attrs.diffmode || "sideside";
345
346 if (diffmode === "unified") {
347 $(this).closest('tr').find('td').addClass('cb-line-selected');
348 } else {
349 var activeTd = $(this).closest('td');
350 activeTd.addClass('cb-line-selected');
351 activeTd.next('td').addClass('cb-line-selected');
301 }
352 }
302
353
303 var lineNo = $(this).data('lineNo');
354 }
304 if (lineNo) {
305
306 // on shift, we do a range selection, if we got previous line
307 var prevLine = $('.cb-line-selected a').data('lineNo');
308 if (event.shiftKey && prevLine !== undefined) {
309 var prevLine = parseInt(prevLine);
310 var nextLine = parseInt(lineNo);
311 var pos = [prevLine, nextLine].sort(sortNumber);
312 var anchor = '#L{0}-{1}'.format(pos[0], pos[1]);
313
314 } else {
315
316 var nextLine = parseInt(lineNo);
317 var pos = [nextLine, nextLine];
318 var anchor = '#L{0}'.format(pos[0]);
319
355
320 }
356 // Replace URL without jumping to it if browser supports.
321 // highlight
357 // Default otherwise
322 var range = [];
358 if (history.pushState && anchor !== undefined) {
323 for (var i = pos[0]; i <= pos[1]; i++) {
359 var new_location = location.href.rstrip('#');
324 range.push(i);
360 if (location.hash) {
325 }
361 // location without hash
326 // clear selection
362 new_location = new_location.replace(location.hash, "");
327 $('.cb-line-selected').removeClass('cb-line-selected');
328
329 $.each(range, function (i, lineNo) {
330 var line_td = $('td.cb-lineno#L' + lineNo);
331 if (line_td.length) {
332 line_td.addClass('cb-line-selected'); // line number td
333 line_td.prev().addClass('cb-line-selected'); // line data
334 line_td.next().addClass('cb-line-selected'); // line content
335 }
336 });
337
338
339 } else {
340 if ($(this).attr('name') !== undefined) {
341 // clear selection
342 $('td.cb-line-selected').removeClass('cb-line-selected');
343 var aEl = $(this).closest('td');
344 aEl.addClass('cb-line-selected');
345 aEl.next('td').addClass('cb-line-selected');
346 }
347 }
363 }
348
364
349 // Replace URL without jumping to it if browser supports.
365 // Make new anchor url
350 // Default otherwise
366 new_location = new_location + anchor;
351 if (history.pushState && anchor !== undefined) {
367 history.pushState(true, document.title, new_location);
352 var new_location = location.href.rstrip('#');
353 if (location.hash) {
354 // location without hash
355 new_location = new_location.replace(location.hash, "");
356 }
357
368
358 // Make new anchor url
369 return false;
359 new_location = new_location + anchor;
370 }
360 history.pushState(true, document.title, new_location);
361
371
362 return false;
372 });
363 }
364
365 });
366
367
373
368 $('.collapse_file').on('click', function(e) {
374 $('.collapse_file').on('click', function(e) {
369 e.stopPropagation();
375 e.stopPropagation();
@@ -553,3 +559,20 b' var feedLifetimeOptions = function(query'
553
559
554 query.callback(data);
560 query.callback(data);
555 };
561 };
562
563
564 var storeUserSessionAttr = function (key, val) {
565
566 var postData = {
567 'key': key,
568 'val': val,
569 'csrf_token': CSRF_TOKEN
570 };
571
572 var success = function(o) {
573 return true
574 };
575
576 ajaxPOST(pyroutes.url('store_user_session_value'), postData, success);
577 return false;
578 };
@@ -142,7 +142,8 b' var CommitsController = function () {'
142 })
142 })
143 };
143 };
144
144
145 this.expandCommit = function (node) {
145 this.expandCommit = function (node, reloadGraph) {
146 reloadGraph = reloadGraph || false;
146
147
147 var target_expand = $(node);
148 var target_expand = $(node);
148 var cid = target_expand.data('commitId');
149 var cid = target_expand.data('commitId');
@@ -179,7 +180,10 b' var CommitsController = function () {'
179 });
180 });
180 target_expand.addClass('open');
181 target_expand.addClass('open');
181 }
182 }
182 // redraw the graph
183
183 self.reloadGraph();
184 if (reloadGraph) {
185 // redraw the graph
186 self.reloadGraph();
187 }
184 }
188 }
185 };
189 };
@@ -774,6 +774,13 b' var CommentsController = function() {'
774 // re trigger the linkification of next/prev navigation
774 // re trigger the linkification of next/prev navigation
775 linkifyComments($('.inline-comment-injected'));
775 linkifyComments($('.inline-comment-injected'));
776 timeagoActivate();
776 timeagoActivate();
777
778 if (window.updateSticky !== undefined) {
779 // potentially our comments change the active window size, so we
780 // notify sticky elements
781 updateSticky()
782 }
783
777 commentForm.setActionButtonsDisabled(false);
784 commentForm.setActionButtonsDisabled(false);
778
785
779 };
786 };
@@ -40,10 +40,10 b' def make_web_build_callback(filename):'
40 stdout = ''.join(stdout)
40 stdout = ''.join(stdout)
41 stderr = ''.join(stderr)
41 stderr = ''.join(stderr)
42 if stdout:
42 if stdout:
43 print stdout
43 print(stdout)
44 if stderr:
44 if stderr:
45 print ('%s %s %s' % ('-' * 20, 'ERRORS', '-' * 20))
45 print('%s %s %s' % ('-' * 20, 'ERRORS', '-' * 20))
46 print stderr
46 print(stderr)
47
47
48
48
49 MAXFD = 1024
49 MAXFD = 1024
@@ -19,15 +19,14 b''
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20 import io
20 import io
21 import re
21 import re
22 import os
22 import datetime
23 import datetime
23 import logging
24 import logging
24 import Queue
25 import Queue
25 import subprocess32
26 import subprocess32
26 import os
27
27
28
28
29 from dateutil.parser import parse
29 from dateutil.parser import parse
30 from pyramid.i18n import get_localizer
31 from pyramid.threadlocal import get_current_request
30 from pyramid.threadlocal import get_current_request
32 from pyramid.interfaces import IRoutesMapper
31 from pyramid.interfaces import IRoutesMapper
33 from pyramid.settings import asbool
32 from pyramid.settings import asbool
@@ -39,7 +38,6 b' from rhodecode.config.jsroutes import ge'
39 from rhodecode.lib import auth
38 from rhodecode.lib import auth
40 from rhodecode.lib.base import get_auth_user
39 from rhodecode.lib.base import get_auth_user
41
40
42
43 import rhodecode
41 import rhodecode
44
42
45
43
@@ -7,6 +7,8 b''
7 (_('Updated on'), h.format_date(c.rhodecode_db_repo.updated_on), '', ''),
7 (_('Updated on'), h.format_date(c.rhodecode_db_repo.updated_on), '', ''),
8 (_('Cached Commit id'), lambda: h.link_to(c.rhodecode_db_repo.changeset_cache.get('short_id'), h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.rhodecode_db_repo.changeset_cache.get('raw_id'))), '', ''),
8 (_('Cached Commit id'), lambda: h.link_to(c.rhodecode_db_repo.changeset_cache.get('short_id'), h.route_path('repo_commit',repo_name=c.repo_name,commit_id=c.rhodecode_db_repo.changeset_cache.get('raw_id'))), '', ''),
9 (_('Attached scoped tokens'), len(c.rhodecode_db_repo.scoped_tokens), '', [x.user for x in c.rhodecode_db_repo.scoped_tokens]),
9 (_('Attached scoped tokens'), len(c.rhodecode_db_repo.scoped_tokens), '', [x.user for x in c.rhodecode_db_repo.scoped_tokens]),
10 (_('Pull requests source'), len(c.rhodecode_db_repo.pull_requests_source), '', ['pr_id:{}, repo:{}'.format(x.pull_request_id,x.source_repo.repo_name) for x in c.rhodecode_db_repo.pull_requests_source]),
11 (_('Pull requests target'), len(c.rhodecode_db_repo.pull_requests_target), '', ['pr_id:{}, repo:{}'.format(x.pull_request_id,x.target_repo.repo_name) for x in c.rhodecode_db_repo.pull_requests_target]),
10 ]
12 ]
11 %>
13 %>
12
14
@@ -96,7 +98,7 b''
96 <button class="btn btn-small" type="submit"
98 <button class="btn btn-small" type="submit"
97 onclick="return confirm('${_('Confirm to lock repository.')}');">
99 onclick="return confirm('${_('Confirm to lock repository.')}');">
98 <i class="icon-lock"></i>
100 <i class="icon-lock"></i>
99 ${_('Lock Repository')}
101 ${_('Lock repository')}
100 </button>
102 </button>
101 %endif
103 %endif
102 </div>
104 </div>
@@ -109,6 +111,35 b''
109 </div>
111 </div>
110 </div>
112 </div>
111
113
114
115 <div class="panel panel-warning">
116 <div class="panel-heading" id="advanced-archive">
117 <h3 class="panel-title">${_('Archive repository')} <a class="permalink" href="#advanced-archive"></a></h3>
118 </div>
119 <div class="panel-body">
120 ${h.secure_form(h.route_path('edit_repo_advanced_archive', repo_name=c.repo_name), request=request)}
121
122 <div style="margin: 0 0 20px 0" class="fake-space"></div>
123
124 <div class="field">
125 <button class="btn btn-small btn-danger" type="submit"
126 onclick="return confirm('${_('Confirm to archive this repository: %s') % c.repo_name}');">
127 <i class="icon-remove-sign"></i>
128 ${_('Archive this repository')}
129 </button>
130 </div>
131 <div class="field">
132 <span class="help-block">
133 ${_('Archiving the repository will make it entirely read-only. The repository cannot be committed to.'
134 'It is hidden from the search results and dashboard. ')}
135 </span>
136 </div>
137
138 ${h.end_form()}
139 </div>
140 </div>
141
142
112 <div class="panel panel-danger">
143 <div class="panel panel-danger">
113 <div class="panel-heading" id="advanced-delete">
144 <div class="panel-heading" id="advanced-delete">
114 <h3 class="panel-title">${_('Delete repository')} <a class="permalink" href="#advanced-delete"></a></h3>
145 <h3 class="panel-title">${_('Delete repository')} <a class="permalink" href="#advanced-delete"></a></h3>
@@ -131,6 +162,18 b''
131 %endif
162 %endif
132 </td>
163 </td>
133 </tr>
164 </tr>
165 <% attached_prs = len(c.rhodecode_db_repo.pull_requests_source + c.rhodecode_db_repo.pull_requests_target) %>
166 % if c.rhodecode_db_repo.pull_requests_source or c.rhodecode_db_repo.pull_requests_target:
167 <tr>
168 <td>
169 ${_ungettext('This repository has %s attached pull request.', 'This repository has %s attached pull requests.', attached_prs) % attached_prs}
170 <br/>
171 ${_('Consider to archive this repository instead.')}
172 </td>
173 <td></td>
174 <td></td>
175 </tr>
176 % endif
134 </table>
177 </table>
135 <div style="margin: 0 0 20px 0" class="fake-space"></div>
178 <div style="margin: 0 0 20px 0" class="fake-space"></div>
136
179
@@ -138,7 +181,7 b''
138 <button class="btn btn-small btn-danger" type="submit"
181 <button class="btn btn-small btn-danger" type="submit"
139 onclick="return confirm('${_('Confirm to delete this repository: %s') % c.repo_name}');">
182 onclick="return confirm('${_('Confirm to delete this repository: %s') % c.repo_name}');">
140 <i class="icon-remove-sign"></i>
183 <i class="icon-remove-sign"></i>
141 ${_('Delete This Repository')}
184 ${_('Delete this repository')}
142 </button>
185 </button>
143 </div>
186 </div>
144 <div class="field">
187 <div class="field">
@@ -67,8 +67,11 b''
67 <pre>
67 <pre>
68 region: ${c.region.name}
68 region: ${c.region.name}
69 backend: ${c.region.actual_backend.__class__}
69 backend: ${c.region.actual_backend.__class__}
70 % if c.rhodecode_user.is_admin:
70 store: ${c.region.actual_backend.get_store()}
71 store: ${c.region.actual_backend.get_store()}
71
72 % else:
73 store: ${c.region.actual_backend.get_store().__class__}
74 % endif
72
75
73 % if c.repo_keys:
76 % if c.repo_keys:
74 ${len(c.repo_keys)} <a href="#showKeys" onclick="$('#show-keys').toggle()">${_('Show all')}</a>
77 ${len(c.repo_keys)} <a href="#showKeys" onclick="$('#show-keys').toggle()">${_('Show all')}</a>
@@ -118,7 +121,11 b' store: ${c.region.actual_backend.get_sto'
118 <table class="rctable edit_cache">
121 <table class="rctable edit_cache">
119 <tr>
122 <tr>
120 <td>${_('Cached diff name')}:</td>
123 <td>${_('Cached diff name')}:</td>
121 <td>${c.rhodecode_db_repo.cached_diffs_relative_dir}</td>
124 % if c.rhodecode_user.is_admin:
125 <td>${c.rhodecode_db_repo.cached_diffs_dir}</td>
126 % else:
127 <td>${c.rhodecode_db_repo.cached_diffs_relative_dir}</td>
128 % endif
122 </tr>
129 </tr>
123 <tr>
130 <tr>
124 <td>${_('Cached diff files')}:</td>
131 <td>${_('Cached diff files')}:</td>
@@ -6,9 +6,7 b''
6 <%
6 <%
7 elems = [
7 elems = [
8 (_('Email prefix'), c.rhodecode_ini.get('email_prefix'), ''),
8 (_('Email prefix'), c.rhodecode_ini.get('email_prefix'), ''),
9 (_('RhodeCode email from'), c.rhodecode_ini.get('app_email_from'), ''),
9 (_('Email from'), c.rhodecode_ini.get('app_email_from'), ''),
10 (_('Error email from'), c.rhodecode_ini.get('error_email_from'), ''),
11 (_('Error email recipients'), c.rhodecode_ini.get('email_to'), ''),
12
10
13 (_('SMTP server'), c.rhodecode_ini.get('smtp_server'), ''),
11 (_('SMTP server'), c.rhodecode_ini.get('smtp_server'), ''),
14 (_('SMTP username'), c.rhodecode_ini.get('smtp_username'), ''),
12 (_('SMTP username'), c.rhodecode_ini.get('smtp_username'), ''),
@@ -17,7 +15,7 b''
17
15
18 (_('SMTP use TLS'), c.rhodecode_ini.get('smtp_use_tls'), ''),
16 (_('SMTP use TLS'), c.rhodecode_ini.get('smtp_use_tls'), ''),
19 (_('SMTP use SSL'), c.rhodecode_ini.get('smtp_use_ssl'), ''),
17 (_('SMTP use SSL'), c.rhodecode_ini.get('smtp_use_ssl'), ''),
20 (_('SMTP auth'), c.rhodecode_ini.get('smtp_auth'), ''),
18
21 ]
19 ]
22 %>
20 %>
23 <dl class="dl-horizontal settings">
21 <dl class="dl-horizontal settings">
@@ -54,7 +52,3 b''
54 ${h.end_form()}
52 ${h.end_form()}
55 </div>
53 </div>
56 </div>
54 </div>
57
58
59
60
@@ -1,3 +1,11 b''
1 <%def name="show_license(license_data)">
2 % if isinstance(license_data, dict):
3 <a href="${license_data.get('url', "#noUrl")}">${license_data.get('spdxId') or license_data.get('fullName')}</a>
4 % else:
5 ${license_data}
6 % endif
7 </%def>
8
1 <div class="panel panel-default">
9 <div class="panel panel-default">
2 <div class="panel-heading">
10 <div class="panel-heading">
3 <h3 class="panel-title">${_('Licenses of Third Party Packages')}</h3>
11 <h3 class="panel-title">${_('Licenses of Third Party Packages')}</h3>
@@ -7,24 +15,29 b''
7 RhodeCode Enterprise uses various third party packages, many of them
15 RhodeCode Enterprise uses various third party packages, many of them
8 provided by the open source community.
16 provided by the open source community.
9 </p>
17 </p>
10
11 % if c.opensource_licenses:
18 % if c.opensource_licenses:
12 <table class="rctable dl-settings">
19 <table class="rctable dl-settings">
13 <thead>
20 <thead>
14 <th>Product</th>
21 <th>Product</th>
15 <th>License</th>
22 <th>License</th>
16 </thead>
23 </thead>
17 %for product, licenses in c.opensource_licenses.items():
24 % for lib in c.opensource_licenses:
18 <tr>
25 <tr>
19 <td>${product}</td>
26 <td>${lib["name"]}</td>
20 <td>
27 <td>
21 ${h.literal(', '.join([
28 <ol>
22 '<a href="%(link)s" title="%(name)s">%(name)s</a>' % {'link':link, 'name':name}
29 % if isinstance(lib["license"], list):
23 if link else name
30 % for license_data in lib["license"]:
24 for name,link in licenses.items()]))}
31 <li>${show_license(license_data)}</li>
25 </td>
32 % endfor
26 </tr>
33 % else:
27 %endfor
34 <% license_data = lib["license"] %>
35 <li>${show_license(license_data)}</li>
36 % endif
37 </ol>
38 </td>
39 </tr>
40 % endfor
28 </table>
41 </table>
29 % endif
42 % endif
30 </div>
43 </div>
@@ -14,6 +14,7 b''
14 </div>
14 </div>
15 <div class="panel-body" id="app">
15 <div class="panel-body" id="app">
16 <h3>List of Gunicorn processes on this machine</h3>
16 <h3>List of Gunicorn processes on this machine</h3>
17 <p>RhodeCode workers set: ${c.gunicorn_workers}</p>
17 <%
18 <%
18 def get_name(proc):
19 def get_name(proc):
19 cmd = ' '.join(proc.cmdline())
20 cmd = ' '.join(proc.cmdline())
@@ -287,6 +287,11 b''
287 </div>
287 </div>
288 <div class="clear"></div>
288 <div class="clear"></div>
289 </div>
289 </div>
290 % if c.rhodecode_db_repo.archived:
291 <div class="alert alert-warning text-center">
292 <strong>${_('This repository has been archived. It is now read-only.')}</strong>
293 </div>
294 % endif
290 <!--- END CONTEXT BAR -->
295 <!--- END CONTEXT BAR -->
291
296
292 </%def>
297 </%def>
@@ -27,8 +27,9 b" c.template_context['default_user'] = {"
27 %>
27 %>
28 <html xmlns="http://www.w3.org/1999/xhtml">
28 <html xmlns="http://www.w3.org/1999/xhtml">
29 <head>
29 <head>
30 <script src="${h.asset('js/vendors/webcomponentsjs/webcomponents-lite.js', ver=c.rhodecode_version_hash)}"></script>
30
31 <link rel="import" href="${h.asset('js/rhodecode-components.html', ver=c.rhodecode_version_hash)}">
31 <script src="${h.asset('js/vendors/webcomponentsjs/custom-elements-es5-adapter.js', ver=c.rhodecode_version_hash)}"></script>
32 <script src="${h.asset('js/vendors/webcomponentsjs/webcomponents-bundle.js', ver=c.rhodecode_version_hash)}"></script>
32 <title>${self.title()}</title>
33 <title>${self.title()}</title>
33 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
34 <meta http-equiv="Content-Type" content="text/html;charset=utf-8" />
34
35
@@ -49,9 +50,6 b" c.template_context['default_user'] = {"
49 ## CSS definitions
50 ## CSS definitions
50 <%def name="css()">
51 <%def name="css()">
51 <link rel="stylesheet" type="text/css" href="${h.asset('css/style.css', ver=c.rhodecode_version_hash)}" media="screen"/>
52 <link rel="stylesheet" type="text/css" href="${h.asset('css/style.css', ver=c.rhodecode_version_hash)}" media="screen"/>
52 <!--[if lt IE 9]>
53 <link rel="stylesheet" type="text/css" href="${h.asset('css/ie.css', ver=c.rhodecode_version_hash)}" media="screen"/>
54 <![endif]-->
55 ## EXTRA FOR CSS
53 ## EXTRA FOR CSS
56 ${self.css_extra()}
54 ${self.css_extra()}
57 </%def>
55 </%def>
@@ -101,7 +99,7 b" c.template_context['default_user'] = {"
101 <script language="javascript" type="text/javascript" src="${h.asset('js/rhodecode/routes.js', ver=c.rhodecode_version_hash)}"></script>
99 <script language="javascript" type="text/javascript" src="${h.asset('js/rhodecode/routes.js', ver=c.rhodecode_version_hash)}"></script>
102 <script> var alertMessagePayloads = ${h.flash.json_alerts(request=request)|n}; </script>
100 <script> var alertMessagePayloads = ${h.flash.json_alerts(request=request)|n}; </script>
103 ## avoide escaping the %N
101 ## avoide escaping the %N
104 <script language="javascript" type="text/javascript" src="${h.asset('js/rhodecode-components.js', ver=c.rhodecode_version_hash)}"></script>
102 <script language="javascript" type="text/javascript" src="${h.asset('js/scripts.js', ver=c.rhodecode_version_hash)}"></script>
105 <script>CodeMirror.modeURL = "${h.asset('') + 'js/mode/%N/%N.js?ver='+c.rhodecode_version_hash}";</script>
103 <script>CodeMirror.modeURL = "${h.asset('') + 'js/mode/%N/%N.js?ver='+c.rhodecode_version_hash}";</script>
106
104
107
105
@@ -142,16 +140,6 b" c.template_context['default_user'] = {"
142 ${_('Please enable JavaScript to use RhodeCode Enterprise')}
140 ${_('Please enable JavaScript to use RhodeCode Enterprise')}
143 </div>
141 </div>
144 </noscript>
142 </noscript>
145 ## IE hacks
146 <!--[if IE 7]>
147 <script>$(document.body).addClass('ie7')</script>
148 <![endif]-->
149 <!--[if IE 8]>
150 <script>$(document.body).addClass('ie8')</script>
151 <![endif]-->
152 <!--[if IE 9]>
153 <script>$(document.body).addClass('ie9')</script>
154 <![endif]-->
155
143
156 ${next.body()}
144 ${next.body()}
157 %if c.post_code:
145 %if c.post_code:
@@ -1,7 +1,6 b''
1 ## small box that displays changed/added/removed details fetched by AJAX
1 ## small box that displays changed/added/removed details fetched by AJAX
2 <%namespace name="base" file="/base/base.mako"/>
2 <%namespace name="base" file="/base/base.mako"/>
3
3
4
5 % if c.prev_page:
4 % if c.prev_page:
6 <tr>
5 <tr>
7 <td colspan="9" class="load-more-commits">
6 <td colspan="9" class="load-more-commits">
@@ -80,14 +79,12 b''
80 % endif
79 % endif
81 % endif
80 % endif
82 </td>
81 </td>
83 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_('Expand commit message')}" onclick="commitsController.expandCommit(this); return false">
82 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_('Expand commit message')}" onclick="commitsController.expandCommit(this, true); return false">
84 <div class="show_more_col">
83 <i class="icon-expand-linked"></i>&nbsp;
85 <i class="show_more"></i>&nbsp;
86 </div>
87 </td>
84 </td>
88 <td class="td-description mid">
85 <td class="td-description mid">
89 <div class="log-container truncate-wrap">
86 <div class="log-container truncate-wrap">
90 <div class="message truncate" id="c-${commit.raw_id}">${urlify_commit_message(commit.message, c.repo_name)}</div>
87 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${urlify_commit_message(commit.message, c.repo_name)}</div>
91 </div>
88 </div>
92 </td>
89 </td>
93
90
@@ -150,10 +150,6 b''
150 <a href="${h.route_path('repo_commit_download',repo_name=c.repo_name,commit_id=c.commit.raw_id,_query=dict(diff='download'))}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
150 <a href="${h.route_path('repo_commit_download',repo_name=c.repo_name,commit_id=c.commit.raw_id,_query=dict(diff='download'))}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
151 ${_('Download Diff')}
151 ${_('Download Diff')}
152 </a>
152 </a>
153 |
154 ${c.ignorews_url(request)}
155 |
156 ${c.context_url(request)}
157 </div>
153 </div>
158 </div>
154 </div>
159 </div>
155 </div>
@@ -211,7 +207,7 b''
211 </div> <!-- end summary -->
207 </div> <!-- end summary -->
212 <div class="cs_files">
208 <div class="cs_files">
213 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
209 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
214 ${cbdiffs.render_diffset_menu()}
210 ${cbdiffs.render_diffset_menu(c.changes[c.commit.raw_id])}
215 ${cbdiffs.render_diffset(
211 ${cbdiffs.render_diffset(
216 c.changes[c.commit.raw_id], commit=c.commit, use_comments=True,inline_comments=c.inline_comments )}
212 c.changes[c.commit.raw_id], commit=c.commit, use_comments=True,inline_comments=c.inline_comments )}
217 </div>
213 </div>
@@ -28,7 +28,7 b''
28
28
29 <div class="meta">
29 <div class="meta">
30 <div class="comment-type-label">
30 <div class="comment-type-label">
31 <div class="comment-label ${comment.comment_type or 'note'}" id="comment-label-${comment.comment_id}">
31 <div class="comment-label ${comment.comment_type or 'note'}" id="comment-label-${comment.comment_id}" title="line: ${comment.line_no}">
32 % if comment.comment_type == 'todo':
32 % if comment.comment_type == 'todo':
33 % if comment.resolved:
33 % if comment.resolved:
34 <div class="resolved tooltip" title="${_('Resolved by comment #{}').format(comment.resolved.comment_id)}">
34 <div class="resolved tooltip" title="${_('Resolved by comment #{}').format(comment.resolved.comment_id)}">
@@ -3,9 +3,9 b''
3
3
4 <%def name="title()">
4 <%def name="title()">
5 ${_('%s Commits') % c.repo_name} -
5 ${_('%s Commits') % c.repo_name} -
6 r${c.commit_ranges[0].revision}:${h.short_id(c.commit_ranges[0].raw_id)}
6 r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}
7 ...
7 ...
8 r${c.commit_ranges[-1].revision}:${h.short_id(c.commit_ranges[-1].raw_id)}
8 r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)}
9 ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)}
9 ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)}
10 %if c.rhodecode_name:
10 %if c.rhodecode_name:
11 &middot; ${h.branding(c.rhodecode_name)}
11 &middot; ${h.branding(c.rhodecode_name)}
@@ -14,9 +14,9 b''
14
14
15 <%def name="breadcrumbs_links()">
15 <%def name="breadcrumbs_links()">
16 ${_('Commits')} -
16 ${_('Commits')} -
17 r${c.commit_ranges[0].revision}:${h.short_id(c.commit_ranges[0].raw_id)}
17 r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}
18 ...
18 ...
19 r${c.commit_ranges[-1].revision}:${h.short_id(c.commit_ranges[-1].raw_id)}
19 r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)}
20 ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)}
20 ${_ungettext('(%s commit)','(%s commits)', len(c.commit_ranges)) % len(c.commit_ranges)}
21 </%def>
21 </%def>
22
22
@@ -43,7 +43,7 b''
43 <h4>
43 <h4>
44 ${_('Commit Range')}
44 ${_('Commit Range')}
45 <code>
45 <code>
46 r${c.commit_ranges[0].revision}:${h.short_id(c.commit_ranges[0].raw_id)}...r${c.commit_ranges[-1].revision}:${h.short_id(c.commit_ranges[-1].raw_id)}
46 r${c.commit_ranges[0].idx}:${h.short_id(c.commit_ranges[0].raw_id)}...r${c.commit_ranges[-1].idx}:${h.short_id(c.commit_ranges[-1].raw_id)}
47 </code>
47 </code>
48 </h4>
48 </h4>
49 </span>
49 </span>
@@ -54,7 +54,7 b''
54 ${_('Diff option')}:
54 ${_('Diff option')}:
55 </div>
55 </div>
56 <div class="right-content">
56 <div class="right-content">
57 <div class="header-buttons">
57 <div class="btn btn-primary">
58 <a href="${h.route_path('repo_compare',
58 <a href="${h.route_path('repo_compare',
59 repo_name=c.repo_name,
59 repo_name=c.repo_name,
60 source_ref_type='rev',
60 source_ref_type='rev',
@@ -68,29 +68,6 b''
68 </div>
68 </div>
69 </div>
69 </div>
70
70
71 <%doc>
72 ##TODO(marcink): implement this and diff menus
73 <div class="fieldset">
74 <div class="left-label">
75 ${_('Diff options')}:
76 </div>
77 <div class="right-content">
78 <div class="diff-actions">
79 <a href="${h.route_path('repo_commit_raw',repo_name=c.repo_name,commit_id='?')}" class="tooltip" title="${h.tooltip(_('Raw diff'))}">
80 ${_('Raw Diff')}
81 </a>
82 |
83 <a href="${h.route_path('repo_commit_patch',repo_name=c.repo_name,commit_id='?')}" class="tooltip" title="${h.tooltip(_('Patch diff'))}">
84 ${_('Patch Diff')}
85 </a>
86 |
87 <a href="${h.route_path('repo_commit_download',repo_name=c.repo_name,commit_id='?',_query=dict(diff='download'))}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
88 ${_('Download Diff')}
89 </a>
90 </div>
91 </div>
92 </div>
93 </%doc>
94 </div> <!-- end summary-detail -->
71 </div> <!-- end summary-detail -->
95
72
96 </div> <!-- end summary -->
73 </div> <!-- end summary -->
This diff has been collapsed as it changes many lines, (714 lines changed) Show them Hide them
@@ -1,7 +1,7 b''
1 <%namespace name="commentblock" file="/changeset/changeset_file_comment.mako"/>
1 <%namespace name="commentblock" file="/changeset/changeset_file_comment.mako"/>
2
2
3 <%def name="diff_line_anchor(filename, line, type)"><%
3 <%def name="diff_line_anchor(commit, filename, line, type)"><%
4 return '%s_%s_%i' % (h.safeid(filename), type, line)
4 return '%s_%s_%i' % (h.md5_safe(commit+filename), type, line)
5 %></%def>
5 %></%def>
6
6
7 <%def name="action_class(action)">
7 <%def name="action_class(action)">
@@ -47,7 +47,7 b" return '%s_%s_%i' % (h.safeid(filename),"
47 deleted_files_comments=None,
47 deleted_files_comments=None,
48
48
49 # for cache purpose
49 # for cache purpose
50 inline_comments=None
50 inline_comments=None,
51
51
52 )">
52 )">
53 %if use_comments:
53 %if use_comments:
@@ -83,7 +83,7 b" return '%s_%s_%i' % (h.safeid(filename),"
83 collapse_all = len(diffset.files) > collapse_when_files_over
83 collapse_all = len(diffset.files) > collapse_when_files_over
84 %>
84 %>
85
85
86 %if c.diffmode == 'sideside':
86 %if c.user_session_attrs["diffmode"] == 'sideside':
87 <style>
87 <style>
88 .wrapper {
88 .wrapper {
89 max-width: 1600px !important;
89 max-width: 1600px !important;
@@ -116,20 +116,24 b' collapse_all = len(diffset.files) > coll'
116 </div>
116 </div>
117 %endif
117 %endif
118 <h2 class="clearinner">
118 <h2 class="clearinner">
119 %if commit:
119 ## invidual commit
120 <a class="tooltip revision" title="${h.tooltip(commit.message)}" href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=commit.raw_id)}">${'r%s:%s' % (commit.revision,h.short_id(commit.raw_id))}</a> -
120 % if commit:
121 ${h.age_component(commit.date)} -
121 <a class="tooltip revision" title="${h.tooltip(commit.message)}" href="${h.route_path('repo_commit',repo_name=diffset.repo_name,commit_id=commit.raw_id)}">${('r%s:%s' % (commit.idx,h.short_id(commit.raw_id)))}</a> -
122 %endif
122 ${h.age_component(commit.date)}
123
123 % if diffset.limited_diff:
124 %if diffset.limited_diff:
124 - ${_('The requested commit is too big and content was truncated.')}
125 ${_('The requested commit is too big and content was truncated.')}
125 ${_ungettext('%(num)s file changed.', '%(num)s files changed.', diffset.changed_files) % {'num': diffset.changed_files}}
126
126 <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
127 ${_ungettext('%(num)s file changed.', '%(num)s files changed.', diffset.changed_files) % {'num': diffset.changed_files}}
127 % elif hasattr(c, 'commit_ranges') and len(c.commit_ranges) > 1:
128 <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
128 ## compare diff, has no file-selector and we want to show stats anyway
129 %else:
129 ${_ungettext('{num} file changed: {linesadd} inserted, ''{linesdel} deleted',
130 ${_ungettext('%(num)s file changed: %(linesadd)s inserted, ''%(linesdel)s deleted',
130 '{num} files changed: {linesadd} inserted, {linesdel} deleted', diffset.changed_files) \
131 '%(num)s files changed: %(linesadd)s inserted, %(linesdel)s deleted', diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}}
131 .format(num=diffset.changed_files, linesadd=diffset.lines_added, linesdel=diffset.lines_deleted)}
132 %endif
132 % endif
133 % else:
134 ## pull requests/compare
135 ${_('File Changes')}
136 % endif
133
137
134 </h2>
138 </h2>
135 </div>
139 </div>
@@ -141,6 +145,7 b' collapse_all = len(diffset.files) > coll'
141 %endif
145 %endif
142
146
143 <div class="filediffs">
147 <div class="filediffs">
148
144 ## initial value could be marked as False later on
149 ## initial value could be marked as False later on
145 <% over_lines_changed_limit = False %>
150 <% over_lines_changed_limit = False %>
146 %for i, filediff in enumerate(diffset.files):
151 %for i, filediff in enumerate(diffset.files):
@@ -149,111 +154,128 b' collapse_all = len(diffset.files) > coll'
149 lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
154 lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
150 over_lines_changed_limit = lines_changed > lines_changed_limit
155 over_lines_changed_limit = lines_changed > lines_changed_limit
151 %>
156 %>
152 <input ${collapse_all and 'checked' or ''} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox">
157 ## anchor with support of sticky header
158 <div class="anchor" id="a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"></div>
159
160 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox" onchange="updateSticky();">
153 <div
161 <div
154 class="filediff"
162 class="filediff"
155 data-f-path="${filediff.patch['filename']}"
163 data-f-path="${filediff.patch['filename']}"
156 id="a_${h.FID('', filediff.patch['filename'])}">
164 data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}"
157 <label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
165 >
158 <div class="filediff-collapse-indicator"></div>
166 <label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
159 ${diff_ops(filediff)}
167 <div class="filediff-collapse-indicator"></div>
160 </label>
168 ${diff_ops(filediff)}
161 ${diff_menu(filediff, use_comments=use_comments)}
169 </label>
162 <table class="cb cb-diff-${c.diffmode} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
170
163 %if not filediff.hunks:
171 ${diff_menu(filediff, use_comments=use_comments)}
164 %for op_id, op_text in filediff.patch['stats']['ops'].items():
172 <table data-f-path="${filediff.patch['filename']}" data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}" class="code-visible-block cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
165 <tr>
173
166 <td class="cb-text cb-${op_class(op_id)}" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=6'}>
174 ## new/deleted/empty content case
167 %if op_id == DEL_FILENODE:
175 % if not filediff.hunks:
168 ${_('File was deleted')}
176 ## Comment container, on "fakes" hunk that contains all data to render comments
169 %elif op_id == BIN_FILENODE:
177 ${render_hunk_lines(filediff, c.user_session_attrs["diffmode"], filediff.hunk_ops, use_comments=use_comments, inline_comments=inline_comments)}
170 ${_('Binary file hidden')}
178 % endif
171 %else:
179
172 ${op_text}
173 %endif
174 </td>
175 </tr>
176 %endfor
177 %endif
178 %if filediff.limited_diff:
180 %if filediff.limited_diff:
179 <tr class="cb-warning cb-collapser">
181 <tr class="cb-warning cb-collapser">
180 <td class="cb-text" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=6'}>
182 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
181 ${_('The requested commit is too big and content was truncated.')} <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
183 ${_('The requested commit is too big and content was truncated.')} <a href="${h.current_route_path(request, fulldiff=1)}" onclick="return confirm('${_("Showing a big diff might take some time and resources, continue?")}')">${_('Show full diff')}</a>
182 </td>
184 </td>
183 </tr>
185 </tr>
184 %else:
186 %else:
185 %if over_lines_changed_limit:
187 %if over_lines_changed_limit:
186 <tr class="cb-warning cb-collapser">
188 <tr class="cb-warning cb-collapser">
187 <td class="cb-text" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=6'}>
189 <td class="cb-text" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=6')}>
188 ${_('This diff has been collapsed as it changes many lines, (%i lines changed)' % lines_changed)}
190 ${_('This diff has been collapsed as it changes many lines, (%i lines changed)' % lines_changed)}
189 <a href="#" class="cb-expand"
191 <a href="#" class="cb-expand"
190 onclick="$(this).closest('table').removeClass('cb-collapsed'); return false;">${_('Show them')}
192 onclick="$(this).closest('table').removeClass('cb-collapsed'); updateSticky(); return false;">${_('Show them')}
191 </a>
193 </a>
192 <a href="#" class="cb-collapse"
194 <a href="#" class="cb-collapse"
193 onclick="$(this).closest('table').addClass('cb-collapsed'); return false;">${_('Hide them')}
195 onclick="$(this).closest('table').addClass('cb-collapsed'); updateSticky(); return false;">${_('Hide them')}
194 </a>
196 </a>
195 </td>
197 </td>
196 </tr>
198 </tr>
197 %endif
199 %endif
198 %endif
200 %endif
199
201
200 %for hunk in filediff.hunks:
202 % for hunk in filediff.hunks:
201 <tr class="cb-hunk">
203 <tr class="cb-hunk">
202 <td ${c.diffmode == 'unified' and 'colspan=3' or ''}>
204 <td ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=3' or '')}>
203 ## TODO: dan: add ajax loading of more context here
205 ## TODO: dan: add ajax loading of more context here
204 ## <a href="#">
206 ## <a href="#">
205 <i class="icon-more"></i>
207 <i class="icon-more"></i>
206 ## </a>
208 ## </a>
207 </td>
209 </td>
208 <td ${c.diffmode == 'sideside' and 'colspan=5' or ''}>
210 <td ${(c.user_session_attrs["diffmode"] == 'sideside' and 'colspan=5' or '')}>
209 @@
211 @@
210 -${hunk.source_start},${hunk.source_length}
212 -${hunk.source_start},${hunk.source_length}
211 +${hunk.target_start},${hunk.target_length}
213 +${hunk.target_start},${hunk.target_length}
212 ${hunk.section_header}
214 ${hunk.section_header}
213 </td>
215 </td>
214 </tr>
216 </tr>
215 %if c.diffmode == 'unified':
217 ${render_hunk_lines(filediff, c.user_session_attrs["diffmode"], hunk, use_comments=use_comments, inline_comments=inline_comments)}
216 ${render_hunk_lines_unified(hunk, use_comments=use_comments, inline_comments=inline_comments)}
218 % endfor
217 %elif c.diffmode == 'sideside':
219
218 ${render_hunk_lines_sideside(hunk, use_comments=use_comments, inline_comments=inline_comments)}
220 <% unmatched_comments = (inline_comments or {}).get(filediff.patch['filename'], {}) %>
219 %else:
220 <tr class="cb-line">
221 <td>unknown diff mode</td>
222 </tr>
223 %endif
224 %endfor
225
221
226 ## outdated comments that do not fit into currently displayed lines
222 ## outdated comments that do not fit into currently displayed lines
227 % for lineno, comments in filediff.left_comments.items():
223 % for lineno, comments in unmatched_comments.items():
228
224
229 %if c.diffmode == 'unified':
225 %if c.user_session_attrs["diffmode"] == 'unified':
230 <tr class="cb-line">
226 % if loop.index == 0:
231 <td class="cb-data cb-context"></td>
227 <tr class="cb-hunk">
232 <td class="cb-lineno cb-context"></td>
228 <td colspan="3"></td>
233 <td class="cb-lineno cb-context"></td>
229 <td>
234 <td class="cb-content cb-context">
230 <div>
235 ${inline_comments_container(comments, inline_comments)}
231 ${_('Unmatched inline comments below')}
236 </td>
232 </div>
237 </tr>
233 </td>
238 %elif c.diffmode == 'sideside':
234 </tr>
239 <tr class="cb-line">
235 % endif
240 <td class="cb-data cb-context"></td>
236 <tr class="cb-line">
241 <td class="cb-lineno cb-context"></td>
237 <td class="cb-data cb-context"></td>
242 <td class="cb-content cb-context">
238 <td class="cb-lineno cb-context"></td>
243 % if lineno.startswith('o'):
239 <td class="cb-lineno cb-context"></td>
240 <td class="cb-content cb-context">
244 ${inline_comments_container(comments, inline_comments)}
241 ${inline_comments_container(comments, inline_comments)}
245 % endif
242 </td>
246 </td>
243 </tr>
244 %elif c.user_session_attrs["diffmode"] == 'sideside':
245 % if loop.index == 0:
246 <tr class="cb-comment-info">
247 <td colspan="2"></td>
248 <td class="cb-line">
249 <div>
250 ${_('Unmatched inline comments below')}
251 </div>
252 </td>
253 <td colspan="2"></td>
254 <td class="cb-line">
255 <div>
256 ${_('Unmatched comments below')}
257 </div>
258 </td>
259 </tr>
260 % endif
261 <tr class="cb-line">
262 <td class="cb-data cb-context"></td>
263 <td class="cb-lineno cb-context"></td>
264 <td class="cb-content cb-context">
265 % if lineno.startswith('o'):
266 ${inline_comments_container(comments, inline_comments)}
267 % endif
268 </td>
247
269
248 <td class="cb-data cb-context"></td>
270 <td class="cb-data cb-context"></td>
249 <td class="cb-lineno cb-context"></td>
271 <td class="cb-lineno cb-context"></td>
250 <td class="cb-content cb-context">
272 <td class="cb-content cb-context">
251 % if lineno.startswith('n'):
273 % if lineno.startswith('n'):
252 ${inline_comments_container(comments, inline_comments)}
274 ${inline_comments_container(comments, inline_comments)}
253 % endif
275 % endif
254 </td>
276 </td>
255 </tr>
277 </tr>
256 %endif
278 %endif
257
279
258 % endfor
280 % endfor
259
281
@@ -270,8 +292,8 b' collapse_all = len(diffset.files) > coll'
270 display_state = ''
292 display_state = ''
271 %>
293 %>
272 <div class="filediffs filediff-outdated" style="${display_state}">
294 <div class="filediffs filediff-outdated" style="${display_state}">
273 <input ${collapse_all and 'checked' or ''} class="filediff-collapse-state" id="filediff-collapse-${id(filename)}" type="checkbox">
295 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filename)}" type="checkbox" onchange="updateSticky();">
274 <div class="filediff" data-f-path="${filename}" id="a_${h.FID('', filename)}">
296 <div class="filediff" data-f-path="${filename}" id="a_${h.FID(filediff.raw_id, filename)}">
275 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
297 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
276 <div class="filediff-collapse-indicator"></div>
298 <div class="filediff-collapse-indicator"></div>
277 <span class="pill">
299 <span class="pill">
@@ -282,24 +304,24 b' collapse_all = len(diffset.files) > coll'
282 ## file op, doesn't need translation
304 ## file op, doesn't need translation
283 <span class="pill" op="removed">removed in this version</span>
305 <span class="pill" op="removed">removed in this version</span>
284 </span>
306 </span>
285 <a class="pill filediff-anchor" href="#a_${h.FID('', filename)}"></a>
307 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filename)}"></a>
286 <span class="pill-group" style="float: right">
308 <span class="pill-group" style="float: right">
287 <span class="pill" op="deleted">-${comments_dict['stats']}</span>
309 <span class="pill" op="deleted">-${comments_dict['stats']}</span>
288 </span>
310 </span>
289 </label>
311 </label>
290
312
291 <table class="cb cb-diff-${c.diffmode} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
313 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${over_lines_changed_limit and 'cb-collapsed' or ''}">
292 <tr>
314 <tr>
293 % if c.diffmode == 'unified':
315 % if c.user_session_attrs["diffmode"] == 'unified':
294 <td></td>
316 <td></td>
295 %endif
317 %endif
296
318
297 <td></td>
319 <td></td>
298 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${c.diffmode == 'unified' and 'colspan=4' or 'colspan=5'}>
320 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=4' or 'colspan=5')}>
299 ${_('File was deleted in this version. There are still outdated/unresolved comments attached to it.')}
321 ${_('File was deleted in this version. There are still outdated/unresolved comments attached to it.')}
300 </td>
322 </td>
301 </tr>
323 </tr>
302 %if c.diffmode == 'unified':
324 %if c.user_session_attrs["diffmode"] == 'unified':
303 <tr class="cb-line">
325 <tr class="cb-line">
304 <td class="cb-data cb-context"></td>
326 <td class="cb-data cb-context"></td>
305 <td class="cb-lineno cb-context"></td>
327 <td class="cb-lineno cb-context"></td>
@@ -308,7 +330,7 b' collapse_all = len(diffset.files) > coll'
308 ${inline_comments_container(comments_dict['comments'], inline_comments)}
330 ${inline_comments_container(comments_dict['comments'], inline_comments)}
309 </td>
331 </td>
310 </tr>
332 </tr>
311 %elif c.diffmode == 'sideside':
333 %elif c.user_session_attrs["diffmode"] == 'sideside':
312 <tr class="cb-line">
334 <tr class="cb-line">
313 <td class="cb-data cb-context"></td>
335 <td class="cb-data cb-context"></td>
314 <td class="cb-lineno cb-context"></td>
336 <td class="cb-lineno cb-context"></td>
@@ -364,19 +386,16 b' from rhodecode.lib.diffs import NEW_FILE'
364 %endif
386 %endif
365 <i style="color: #aaa" class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${final_path}" title="${_('Copy the full path')}" onclick="return false;"></i>
387 <i style="color: #aaa" class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${final_path}" title="${_('Copy the full path')}" onclick="return false;"></i>
366 </span>
388 </span>
367 <span class="pill-group" style="float: left">
389 ## anchor link
390 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"></a>
391
392 <span class="pill-group" style="float: right">
393
394 ## ops pills
368 %if filediff.limited_diff:
395 %if filediff.limited_diff:
369 <span class="pill tooltip" op="limited" title="The stats for this diff are not complete">limited diff</span>
396 <span class="pill tooltip" op="limited" title="The stats for this diff are not complete">limited diff</span>
370 %endif
397 %endif
371
398
372 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
373 <span class="pill" op="renamed">renamed</span>
374 %endif
375
376 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
377 <span class="pill" op="copied">copied</span>
378 %endif
379
380 %if NEW_FILENODE in filediff.patch['stats']['ops']:
399 %if NEW_FILENODE in filediff.patch['stats']['ops']:
381 <span class="pill" op="created">created</span>
400 <span class="pill" op="created">created</span>
382 %if filediff['target_mode'].startswith('120'):
401 %if filediff['target_mode'].startswith('120'):
@@ -386,6 +405,14 b' from rhodecode.lib.diffs import NEW_FILE'
386 %endif
405 %endif
387 %endif
406 %endif
388
407
408 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
409 <span class="pill" op="renamed">renamed</span>
410 %endif
411
412 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
413 <span class="pill" op="copied">copied</span>
414 %endif
415
389 %if DEL_FILENODE in filediff.patch['stats']['ops']:
416 %if DEL_FILENODE in filediff.patch['stats']['ops']:
390 <span class="pill" op="removed">removed</span>
417 <span class="pill" op="removed">removed</span>
391 %endif
418 %endif
@@ -395,38 +422,35 b' from rhodecode.lib.diffs import NEW_FILE'
395 ${nice_mode(filediff['source_mode'])}${nice_mode(filediff['target_mode'])}
422 ${nice_mode(filediff['source_mode'])}${nice_mode(filediff['target_mode'])}
396 </span>
423 </span>
397 %endif
424 %endif
398 </span>
399
425
400 <a class="pill filediff-anchor" href="#a_${h.FID('', filediff.patch['filename'])}"></a>
401
402 <span class="pill-group" style="float: right">
403 %if BIN_FILENODE in filediff.patch['stats']['ops']:
426 %if BIN_FILENODE in filediff.patch['stats']['ops']:
404 <span class="pill" op="binary">binary</span>
427 <span class="pill" op="binary">binary</span>
405 %if MOD_FILENODE in filediff.patch['stats']['ops']:
428 %if MOD_FILENODE in filediff.patch['stats']['ops']:
406 <span class="pill" op="modified">modified</span>
429 <span class="pill" op="modified">modified</span>
407 %endif
430 %endif
408 %endif
431 %endif
409 %if filediff.patch['stats']['added']:
432
410 <span class="pill" op="added">+${filediff.patch['stats']['added']}</span>
433 <span class="pill" op="added">${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}</span>
411 %endif
434 <span class="pill" op="deleted">${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}</span>
412 %if filediff.patch['stats']['deleted']:
435
413 <span class="pill" op="deleted">-${filediff.patch['stats']['deleted']}</span>
414 %endif
415 </span>
436 </span>
416
437
417 </%def>
438 </%def>
418
439
419 <%def name="nice_mode(filemode)">
440 <%def name="nice_mode(filemode)">
420 ${filemode.startswith('100') and filemode[3:] or filemode}
441 ${(filemode.startswith('100') and filemode[3:] or filemode)}
421 </%def>
442 </%def>
422
443
423 <%def name="diff_menu(filediff, use_comments=False)">
444 <%def name="diff_menu(filediff, use_comments=False)">
424 <div class="filediff-menu">
445 <div class="filediff-menu">
425 %if filediff.diffset.source_ref:
446
447 %if filediff.diffset.source_ref:
448
449 ## FILE BEFORE CHANGES
426 %if filediff.operation in ['D', 'M']:
450 %if filediff.operation in ['D', 'M']:
427 <a
451 <a
428 class="tooltip"
452 class="tooltip"
429 href="${h.route_path('repo_files',repo_name=filediff.diffset.repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
453 href="${h.route_path('repo_files',repo_name=filediff.diffset.target_repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
430 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
454 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
431 >
455 >
432 ${_('Show file before')}
456 ${_('Show file before')}
@@ -434,11 +458,13 b' from rhodecode.lib.diffs import NEW_FILE'
434 %else:
458 %else:
435 <span
459 <span
436 class="tooltip"
460 class="tooltip"
437 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
461 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
438 >
462 >
439 ${_('Show file before')}
463 ${_('Show file before')}
440 </span> |
464 </span> |
441 %endif
465 %endif
466
467 ## FILE AFTER CHANGES
442 %if filediff.operation in ['A', 'M']:
468 %if filediff.operation in ['A', 'M']:
443 <a
469 <a
444 class="tooltip"
470 class="tooltip"
@@ -446,47 +472,25 b' from rhodecode.lib.diffs import NEW_FILE'
446 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
472 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
447 >
473 >
448 ${_('Show file after')}
474 ${_('Show file after')}
449 </a> |
475 </a>
450 %else:
476 %else:
451 <span
477 <span
452 class="tooltip"
478 class="tooltip"
453 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
479 title="${h.tooltip(_('File not present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
454 >
480 >
455 ${_('Show file after')}
481 ${_('Show file after')}
456 </span> |
482 </span>
457 %endif
483 %endif
458 <a
459 class="tooltip"
460 title="${h.tooltip(_('Raw diff'))}"
461 href="${h.route_path('repo_files_diff',repo_name=filediff.diffset.repo_name,f_path=filediff.target_file_path, _query=dict(diff2=filediff.diffset.target_ref,diff1=filediff.diffset.source_ref,diff='raw'))}"
462 >
463 ${_('Raw diff')}
464 </a> |
465 <a
466 class="tooltip"
467 title="${h.tooltip(_('Download diff'))}"
468 href="${h.route_path('repo_files_diff',repo_name=filediff.diffset.repo_name,f_path=filediff.target_file_path, _query=dict(diff2=filediff.diffset.target_ref,diff1=filediff.diffset.source_ref,diff='download'))}"
469 >
470 ${_('Download diff')}
471 </a>
472 % if use_comments:
473 |
474 % endif
475
484
476 ## TODO: dan: refactor ignorews_url and context_url into the diff renderer same as diffmode=unified/sideside. Also use ajax to load more context (by clicking hunks)
485 % if use_comments:
477 %if hasattr(c, 'ignorews_url'):
486 |
478 ${c.ignorews_url(request, h.FID('', filediff.patch['filename']))}
487 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
479 %endif
488 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
480 %if hasattr(c, 'context_url'):
489 </a>
481 ${c.context_url(request, h.FID('', filediff.patch['filename']))}
490 % endif
482 %endif
483
491
484 %if use_comments:
492 %endif
485 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
493
486 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
487 </a>
488 %endif
489 %endif
490 </div>
494 </div>
491 </%def>
495 </%def>
492
496
@@ -512,29 +516,31 b' from rhodecode.lib.diffs import NEW_FILE'
512 </%def>
516 </%def>
513
517
514 <%!
518 <%!
515 def get_comments_for(comments, filename, line_version, line_number):
519 def get_comments_for(diff_type, comments, filename, line_version, line_number):
516 if hasattr(filename, 'unicode_path'):
520 if hasattr(filename, 'unicode_path'):
517 filename = filename.unicode_path
521 filename = filename.unicode_path
518
522
519 if not isinstance(filename, basestring):
523 if not isinstance(filename, basestring):
520 return None
524 return None
521
525
522 line_key = '{}{}'.format(line_version, line_number)
526 line_key = '{}{}'.format(line_version, line_number) ## e.g o37, n12
527
523 if comments and filename in comments:
528 if comments and filename in comments:
524 file_comments = comments[filename]
529 file_comments = comments[filename]
525 if line_key in file_comments:
530 if line_key in file_comments:
526 return file_comments[line_key]
531 data = file_comments.pop(line_key)
532 return data
527 %>
533 %>
528
534
529 <%def name="render_hunk_lines_sideside(hunk, use_comments=False, inline_comments=None)">
535 <%def name="render_hunk_lines_sideside(filediff, hunk, use_comments=False, inline_comments=None)">
530
531 %for i, line in enumerate(hunk.sideside):
536 %for i, line in enumerate(hunk.sideside):
532 <%
537 <%
533 old_line_anchor, new_line_anchor = None, None
538 old_line_anchor, new_line_anchor = None, None
539
534 if line.original.lineno:
540 if line.original.lineno:
535 old_line_anchor = diff_line_anchor(hunk.source_file_path, line.original.lineno, 'o')
541 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, line.original.lineno, 'o')
536 if line.modified.lineno:
542 if line.modified.lineno:
537 new_line_anchor = diff_line_anchor(hunk.target_file_path, line.modified.lineno, 'n')
543 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, line.modified.lineno, 'n')
538 %>
544 %>
539
545
540 <tr class="cb-line">
546 <tr class="cb-line">
@@ -542,16 +548,17 b' def get_comments_for(comments, filename,'
542 data-line-no="${line.original.lineno}"
548 data-line-no="${line.original.lineno}"
543 >
549 >
544 <div>
550 <div>
545 <% loc = None %>
551
552 <% line_old_comments = None %>
546 %if line.original.get_comment_args:
553 %if line.original.get_comment_args:
547 <% loc = get_comments_for(inline_comments, *line.original.get_comment_args) %>
554 <% line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args) %>
548 %endif
555 %endif
549 %if loc:
556 %if line_old_comments:
550 <% has_outdated = any([x.outdated for x in loc]) %>
557 <% has_outdated = any([x.outdated for x in line_old_comments]) %>
551 % if has_outdated:
558 % if has_outdated:
552 <i title="${_('comments including outdated')}:${len(loc)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
559 <i title="${_('comments including outdated')}:${len(line_old_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
553 % else:
560 % else:
554 <i title="${_('comments')}: ${len(loc)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
561 <i title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
555 % endif
562 % endif
556 %endif
563 %endif
557 </div>
564 </div>
@@ -572,10 +579,10 b' def get_comments_for(comments, filename,'
572 %if use_comments and line.original.lineno:
579 %if use_comments and line.original.lineno:
573 ${render_add_comment_button()}
580 ${render_add_comment_button()}
574 %endif
581 %endif
575 <span class="cb-code">${line.original.action} ${line.original.content or '' | n}</span>
582 <span class="cb-code"><span class="cb-action ${action_class(line.original.action)}"></span>${line.original.content or '' | n}</span>
576
583
577 %if use_comments and line.original.lineno and loc:
584 %if use_comments and line.original.lineno and line_old_comments:
578 ${inline_comments_container(loc, inline_comments)}
585 ${inline_comments_container(line_old_comments, inline_comments)}
579 %endif
586 %endif
580
587
581 </td>
588 </td>
@@ -585,16 +592,16 b' def get_comments_for(comments, filename,'
585 <div>
592 <div>
586
593
587 %if line.modified.get_comment_args:
594 %if line.modified.get_comment_args:
588 <% lmc = get_comments_for(inline_comments, *line.modified.get_comment_args) %>
595 <% line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args) %>
589 %else:
596 %else:
590 <% lmc = None%>
597 <% line_new_comments = None%>
591 %endif
598 %endif
592 %if lmc:
599 %if line_new_comments:
593 <% has_outdated = any([x.outdated for x in lmc]) %>
600 <% has_outdated = any([x.outdated for x in line_new_comments]) %>
594 % if has_outdated:
601 % if has_outdated:
595 <i title="${_('comments including outdated')}:${len(lmc)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
602 <i title="${_('comments including outdated')}:${len(line_new_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
596 % else:
603 % else:
597 <i title="${_('comments')}: ${len(lmc)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
604 <i title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
598 % endif
605 % endif
599 %endif
606 %endif
600 </div>
607 </div>
@@ -615,9 +622,9 b' def get_comments_for(comments, filename,'
615 %if use_comments and line.modified.lineno:
622 %if use_comments and line.modified.lineno:
616 ${render_add_comment_button()}
623 ${render_add_comment_button()}
617 %endif
624 %endif
618 <span class="cb-code">${line.modified.action} ${line.modified.content or '' | n}</span>
625 <span class="cb-code"><span class="cb-action ${action_class(line.modified.action)}"></span>${line.modified.content or '' | n}</span>
619 %if use_comments and line.modified.lineno and lmc:
626 %if use_comments and line.modified.lineno and line_new_comments:
620 ${inline_comments_container(lmc, inline_comments)}
627 ${inline_comments_container(line_new_comments, inline_comments)}
621 %endif
628 %endif
622 </td>
629 </td>
623 </tr>
630 </tr>
@@ -625,23 +632,24 b' def get_comments_for(comments, filename,'
625 </%def>
632 </%def>
626
633
627
634
628 <%def name="render_hunk_lines_unified(hunk, use_comments=False, inline_comments=None)">
635 <%def name="render_hunk_lines_unified(filediff, hunk, use_comments=False, inline_comments=None)">
629 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
636 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
637
630 <%
638 <%
631 old_line_anchor, new_line_anchor = None, None
639 old_line_anchor, new_line_anchor = None, None
632 if old_line_no:
640 if old_line_no:
633 old_line_anchor = diff_line_anchor(hunk.source_file_path, old_line_no, 'o')
641 old_line_anchor = diff_line_anchor(filediff.raw_id, hunk.source_file_path, old_line_no, 'o')
634 if new_line_no:
642 if new_line_no:
635 new_line_anchor = diff_line_anchor(hunk.target_file_path, new_line_no, 'n')
643 new_line_anchor = diff_line_anchor(filediff.raw_id, hunk.target_file_path, new_line_no, 'n')
636 %>
644 %>
637 <tr class="cb-line">
645 <tr class="cb-line">
638 <td class="cb-data ${action_class(action)}">
646 <td class="cb-data ${action_class(action)}">
639 <div>
647 <div>
640
648
641 %if comments_args:
649 %if comments_args:
642 <% comments = get_comments_for(inline_comments, *comments_args) %>
650 <% comments = get_comments_for('unified', inline_comments, *comments_args) %>
643 %else:
651 %else:
644 <% comments = None%>
652 <% comments = None %>
645 %endif
653 %endif
646
654
647 % if comments:
655 % if comments:
@@ -675,12 +683,12 b' def get_comments_for(comments, filename,'
675 %endif
683 %endif
676 </td>
684 </td>
677 <td class="cb-content ${action_class(action)}"
685 <td class="cb-content ${action_class(action)}"
678 data-line-no="${new_line_no and 'n' or 'o'}${new_line_no or old_line_no}"
686 data-line-no="${(new_line_no and 'n' or 'o')}${(new_line_no or old_line_no)}"
679 >
687 >
680 %if use_comments:
688 %if use_comments:
681 ${render_add_comment_button()}
689 ${render_add_comment_button()}
682 %endif
690 %endif
683 <span class="cb-code">${action} ${content or '' | n}</span>
691 <span class="cb-code"><span class="cb-action ${action_class(action)}"></span> ${content or '' | n}</span>
684 %if use_comments and comments:
692 %if use_comments and comments:
685 ${inline_comments_container(comments, inline_comments)}
693 ${inline_comments_container(comments, inline_comments)}
686 %endif
694 %endif
@@ -689,47 +697,327 b' def get_comments_for(comments, filename,'
689 %endfor
697 %endfor
690 </%def>
698 </%def>
691
699
700
701 <%def name="render_hunk_lines(filediff, diff_mode, hunk, use_comments, inline_comments)">
702 % if diff_mode == 'unified':
703 ${render_hunk_lines_unified(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments)}
704 % elif diff_mode == 'sideside':
705 ${render_hunk_lines_sideside(filediff, hunk, use_comments=use_comments, inline_comments=inline_comments)}
706 % else:
707 <tr class="cb-line">
708 <td>unknown diff mode</td>
709 </tr>
710 % endif
711 </%def>file changes
712
713
692 <%def name="render_add_comment_button()">
714 <%def name="render_add_comment_button()">
693 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
715 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
694 <span><i class="icon-comment"></i></span>
716 <span><i class="icon-comment"></i></span>
695 </button>
717 </button>
696 </%def>
718 </%def>
697
719
698 <%def name="render_diffset_menu()">
720 <%def name="render_diffset_menu(diffset=None, range_diff_on=None)">
699
721
700 <div class="diffset-menu clearinner">
722 <div id="diff-file-sticky" class="diffset-menu clearinner">
701 <div class="pull-right">
723 ## auto adjustable
724 <div class="sidebar__inner">
725 <div class="sidebar__bar">
726 <div class="pull-right">
702 <div class="btn-group">
727 <div class="btn-group">
703
728
729 ## DIFF OPTIONS via Select2
730 <div class="pull-left">
731 ${h.hidden('diff_menu')}
732 </div>
733
704 <a
734 <a
705 class="btn ${c.diffmode == 'sideside' and 'btn-primary'} tooltip"
735 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-primary')} tooltip"
706 title="${h.tooltip(_('View side by side'))}"
736 title="${h.tooltip(_('View side by side'))}"
707 href="${h.current_route_path(request, diffmode='sideside')}">
737 href="${h.current_route_path(request, diffmode='sideside')}">
708 <span>${_('Side by Side')}</span>
738 <span>${_('Side by Side')}</span>
709 </a>
739 </a>
740
710 <a
741 <a
711 class="btn ${c.diffmode == 'unified' and 'btn-primary'} tooltip"
742 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-primary')} tooltip"
712 title="${h.tooltip(_('View unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
743 title="${h.tooltip(_('View unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
713 <span>${_('Unified')}</span>
744 <span>${_('Unified')}</span>
714 </a>
745 </a>
746
747 % if range_diff_on is True:
748 <a
749 title="${_('Turn off: Show the diff as commit range')}"
750 class="btn btn-primary"
751 href="${h.current_route_path(request, **{"range-diff":"0"})}">
752 <span>${_('Range Diff')}</span>
753 </a>
754 % elif range_diff_on is False:
755 <a
756 title="${_('Show the diff as commit range')}"
757 class="btn"
758 href="${h.current_route_path(request, **{"range-diff":"1"})}">
759 <span>${_('Range Diff')}</span>
760 </a>
761 % endif
715 </div>
762 </div>
716 </div>
763 </div>
717
764 <div class="pull-left">
718 <div class="pull-left">
765 <div class="btn-group">
719 <div class="btn-group">
766 <div class="pull-left">
767 ${h.hidden('file_filter')}
768 </div>
769 <a
770 class="btn"
771 href="#"
772 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); updateSticky(); return false">${_('Expand All Files')}</a>
720 <a
773 <a
721 class="btn"
774 class="btn"
722 href="#"
775 href="#"
723 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); return false">${_('Expand All Files')}</a>
776 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); updateSticky(); return false">${_('Collapse All Files')}</a>
724 <a
777 </div>
725 class="btn"
778 </div>
726 href="#"
779 </div>
727 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); return false">${_('Collapse All Files')}</a>
780 <div class="fpath-placeholder">
728 <a
781 <i class="icon-file-text"></i>
729 class="btn"
782 <strong class="fpath-placeholder-text">
730 href="#"
783 Context file:
731 onclick="return Rhodecode.comments.toggleWideMode(this)">${_('Wide Mode Diff')}</a>
784 </strong>
732 </div>
785 </div>
786 <div class="sidebar_inner_shadow"></div>
733 </div>
787 </div>
734 </div>
788 </div>
789
790 % if diffset:
791
792 %if diffset.limited_diff:
793 <% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files} %>
794 %else:
795 <% file_placeholder = _ungettext('%(num)s file changed: %(linesadd)s inserted, ''%(linesdel)s deleted', '%(num)s files changed: %(linesadd)s inserted, %(linesdel)s deleted', diffset.changed_files) % {'num': diffset.changed_files, 'linesadd': diffset.lines_added, 'linesdel': diffset.lines_deleted}%>
796 %endif
797 ## case on range-diff placeholder needs to be updated
798 % if range_diff_on is True:
799 <% file_placeholder = _('Disabled on range diff') %>
800 % endif
801
802 <script>
803
804 var feedFilesOptions = function (query, initialData) {
805 var data = {results: []};
806 var isQuery = typeof query.term !== 'undefined';
807
808 var section = _gettext('Changed files');
809 var filteredData = [];
810
811 //filter results
812 $.each(initialData.results, function (idx, value) {
813
814 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
815 filteredData.push({
816 'id': this.id,
817 'text': this.text,
818 "ops": this.ops,
819 })
820 }
821
822 });
823
824 data.results = filteredData;
825
826 query.callback(data);
827 };
828
829 var formatFileResult = function(result, container, query, escapeMarkup) {
830 return function(data, escapeMarkup) {
831 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
832 var tmpl = '<span style="margin-right:-50px"><strong>{0}</strong></span>'.format(escapeMarkup(data['text']));
833 var pill = '<span class="pill-group" style="float: right;margin-right: -100px">' +
834 '<span class="pill" op="added">{0}</span>' +
835 '<span class="pill" op="deleted">{1}</span>' +
836 '</span>'
837 ;
838 var added = data['ops']['added'];
839 if (added === 0) {
840 // don't show +0
841 added = 0;
842 } else {
843 added = '+' + added;
844 }
845
846 var deleted = -1*data['ops']['deleted'];
847
848 tmpl += pill.format(added, deleted);
849 return container.format(tmpl);
850
851 }(result, escapeMarkup);
852 };
853
854 var preloadFileFilterData = {
855 results: [
856 % for filediff in diffset.files:
857 {id:"a_${h.FID(filediff.raw_id, filediff.patch['filename'])}",
858 text:"${filediff.patch['filename']}",
859 ops:${h.json.dumps(filediff.patch['stats'])|n}}${('' if loop.last else ',')}
860 % endfor
861 ]
862 };
863
864 $(document).ready(function () {
865
866 var fileFilter = $("#file_filter").select2({
867 'dropdownAutoWidth': true,
868 'width': 'auto',
869 'placeholder': "${file_placeholder}",
870 containerCssClass: "drop-menu",
871 dropdownCssClass: "drop-menu-dropdown",
872 data: preloadFileFilterData,
873 query: function(query) {
874 feedFilesOptions(query, preloadFileFilterData);
875 },
876 formatResult: formatFileResult
877 });
878
879 % if range_diff_on is True:
880 fileFilter.select2("enable", false);
881 % endif
882
883 $("#file_filter").on('click', function (e) {
884 e.preventDefault();
885 var selected = $('#file_filter').select2('data');
886 var idSelector = "#"+selected.id;
887 window.location.hash = idSelector;
888 // expand the container if we quick-select the field
889 $(idSelector).next().prop('checked', false);
890 updateSticky()
891 });
892
893 var contextPrefix = _gettext('Context file: ');
894 ## sticky sidebar
895 var sidebarElement = document.getElementById('diff-file-sticky');
896 sidebar = new StickySidebar(sidebarElement, {
897 topSpacing: 0,
898 bottomSpacing: 0,
899 innerWrapperSelector: '.sidebar__inner'
900 });
901 sidebarElement.addEventListener('affixed.static.stickySidebar', function () {
902 // reset our file so it's not holding new value
903 $('.fpath-placeholder-text').html(contextPrefix)
904 });
905
906 updateSticky = function () {
907 sidebar.updateSticky();
908 Waypoint.refreshAll();
909 };
910
911 var animateText = $.debounce(100, function(fPath, anchorId) {
912 // animate setting the text
913 var callback = function () {
914 $('.fpath-placeholder-text').animate({'opacity': 1.00}, 200)
915 $('.fpath-placeholder-text').html(contextPrefix + '<a href="#a_' + anchorId + '">' + fPath + '</a>')
916 };
917 $('.fpath-placeholder-text').animate({'opacity': 0.15}, 200, callback);
918 });
919
920 ## dynamic file waypoints
921 var setFPathInfo = function(fPath, anchorId){
922 animateText(fPath, anchorId)
923 };
924
925 var codeBlock = $('.filediff');
926 // forward waypoint
927 codeBlock.waypoint(
928 function(direction) {
929 if (direction === "down"){
930 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
931 }
932 }, {
933 offset: 70,
934 context: '.fpath-placeholder'
935 }
936 );
937
938 // backward waypoint
939 codeBlock.waypoint(
940 function(direction) {
941 if (direction === "up"){
942 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
943 }
944 }, {
945 offset: function () {
946 return -this.element.clientHeight + 90
947 },
948 context: '.fpath-placeholder'
949 }
950 );
951
952 var preloadDiffMenuData = {
953 results: [
954 ## Wide diff mode
955 {
956 id: 1,
957 text: _gettext('Toggle Wide Mode diff'),
958 action: function () {
959 updateSticky();
960 Rhodecode.comments.toggleWideMode(this);
961 return null;
962 },
963 url: null,
964 },
965
966 ## Whitespace change
967 % if request.GET.get('ignorews', '') == '1':
968 {
969 id: 2,
970 text: _gettext('Show whitespace changes'),
971 action: function () {},
972 url: "${h.current_route_path(request, ignorews=0)|n}"
973 },
974 % else:
975 {
976 id: 2,
977 text: _gettext('Hide whitespace changes'),
978 action: function () {},
979 url: "${h.current_route_path(request, ignorews=1)|n}"
980 },
981 % endif
982
983 ## FULL CONTEXT
984 % if request.GET.get('fullcontext', '') == '1':
985 {
986 id: 3,
987 text: _gettext('Hide full context diff'),
988 action: function () {},
989 url: "${h.current_route_path(request, fullcontext=0)|n}"
990 },
991 % else:
992 {
993 id: 3,
994 text: _gettext('Show full context diff'),
995 action: function () {},
996 url: "${h.current_route_path(request, fullcontext=1)|n}"
997 },
998 % endif
999
1000 ]
1001 };
1002
1003 $("#diff_menu").select2({
1004 minimumResultsForSearch: -1,
1005 containerCssClass: "drop-menu",
1006 dropdownCssClass: "drop-menu-dropdown",
1007 dropdownAutoWidth: true,
1008 data: preloadDiffMenuData,
1009 placeholder: "${_('Diff Options')}",
1010 });
1011 $("#diff_menu").on('select2-selecting', function (e) {
1012 e.choice.action();
1013 if (e.choice.url !== null) {
1014 window.location = e.choice.url
1015 }
1016 });
1017
1018 });
1019
1020 </script>
1021 % endif
1022
735 </%def>
1023 </%def>
@@ -9,7 +9,7 b''
9 %>
9 %>
10 <tr class="cb-line cb-line-fresh ${'cb-annotate' if show_annotation else ''}"
10 <tr class="cb-line cb-line-fresh ${'cb-annotate' if show_annotation else ''}"
11 %if annotation:
11 %if annotation:
12 data-revision="${annotation.revision}"
12 data-revision="${annotation.idx}"
13 %endif
13 %endif
14 >
14 >
15
15
@@ -28,11 +28,11 b''
28 </td>
28 </td>
29 <td
29 <td
30 class="cb-annotate-revision"
30 class="cb-annotate-revision"
31 data-revision="${annotation.revision}"
31 data-revision="${annotation.idx}"
32 onclick="$('[data-revision=${annotation.revision}]').toggleClass('cb-line-fresh')"
32 onclick="$('[data-revision=${annotation.idx}]').toggleClass('cb-line-fresh')"
33 style="background: ${bgcolor}">
33 style="background: ${bgcolor}">
34 <a class="cb-annotate" href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=annotation.raw_id)}">
34 <a class="cb-annotate" href="${h.route_path('repo_commit',repo_name=c.repo_name,commit_id=annotation.raw_id)}">
35 r${annotation.revision}
35 r${annotation.idx}
36 </a>
36 </a>
37 </td>
37 </td>
38 % else:
38 % else:
@@ -40,8 +40,8 b''
40 <td class="cb-annotate-message-spacer"></td>
40 <td class="cb-annotate-message-spacer"></td>
41 <td
41 <td
42 class="cb-annotate-revision"
42 class="cb-annotate-revision"
43 data-revision="${annotation.revision}"
43 data-revision="${annotation.idx}"
44 onclick="$('[data-revision=${annotation.revision}]').toggleClass('cb-line-fresh')"
44 onclick="$('[data-revision=${annotation.idx}]').toggleClass('cb-line-fresh')"
45 style="background: ${bgcolor}">
45 style="background: ${bgcolor}">
46 </td>
46 </td>
47 % endif
47 % endif
@@ -40,28 +40,17 b''
40 <td class="td-hash">
40 <td class="td-hash">
41 <code>
41 <code>
42 <a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=commit.raw_id)}">
42 <a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=commit.raw_id)}">
43 r${commit.revision}:${h.short_id(commit.raw_id)}
43 r${commit.idx}:${h.short_id(commit.raw_id)}
44 </a>
44 </a>
45 ${h.hidden('revisions',commit.raw_id)}
45 ${h.hidden('revisions',commit.raw_id)}
46 </code>
46 </code>
47 </td>
47 </td>
48 <td class="expand_commit"
48 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_('Expand commit message')}" onclick="commitsController.expandCommit(this); return false">
49 data-commit-id="${commit.raw_id}"
49 <i class="icon-expand-linked"></i>
50 title="${_( 'Expand commit message')}"
51 >
52 <div class="show_more_col">
53 <i class="show_more"></i>
54 </div>
55 </td>
50 </td>
56 <td class="mid td-description">
51 <td class="mid td-description">
57 <div class="log-container truncate-wrap">
52 <div class="log-container truncate-wrap">
58 <div
53 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${urlify_commit_message(commit.message, c.repo_name)}</div>
59 id="c-${commit.raw_id}"
60 class="message truncate"
61 data-message-raw="${commit.message}"
62 >
63 ${urlify_commit_message(commit.message, c.repo_name)}
64 </div>
65 </div>
54 </div>
66 </td>
55 </td>
67 </tr>
56 </tr>
@@ -85,31 +74,7 b''
85 </div>
74 </div>
86
75
87 <script>
76 <script>
88 $('.expand_commit').on('click',function(e){
77 commitsController = new CommitsController();
89 var target_expand = $(this);
90 var cid = target_expand.data('commitId');
91
92 // ## TODO: dan: extract styles into css, and just toggleClass('open') here
93 if (target_expand.hasClass('open')){
94 $('#c-'+cid).css({
95 'height': '1.5em',
96 'white-space': 'nowrap',
97 'text-overflow': 'ellipsis',
98 'overflow':'hidden'
99 });
100 target_expand.removeClass('open');
101 }
102 else {
103 $('#c-'+cid).css({
104 'height': 'auto',
105 'white-space': 'pre-line',
106 'text-overflow': 'initial',
107 'overflow':'visible'
108 });
109 target_expand.addClass('open');
110 }
111 });
112
113 $('.compare_select').on('click',function(e){
78 $('.compare_select').on('click',function(e){
114 var cid = $(this).attr('commit_id');
79 var cid = $(this).attr('commit_id');
115 $('#row-'+cid).toggleClass('hl', !$('#row-'+cid).hasClass('hl'));
80 $('#row-'+cid).toggleClass('hl', !$('#row-'+cid).hasClass('hl'));
@@ -48,7 +48,7 b''
48
48
49 % if c.commit_ranges:
49 % if c.commit_ranges:
50 <code>
50 <code>
51 r${c.source_commit.revision}:${h.short_id(c.source_commit.raw_id)}...r${c.target_commit.revision}:${h.short_id(c.target_commit.raw_id)}
51 r${c.source_commit.idx}:${h.short_id(c.source_commit.raw_id)}...r${c.target_commit.idx}:${h.short_id(c.target_commit.raw_id)}
52 </code>
52 </code>
53 % endif
53 % endif
54 </h4>
54 </h4>
@@ -129,30 +129,6 b''
129 </div>
129 </div>
130 </div>
130 </div>
131
131
132 <%doc>
133 ##TODO(marcink): implement this and diff menus
134 <div class="fieldset">
135 <div class="left-label">
136 ${_('Diff options')}:
137 </div>
138 <div class="right-content">
139 <div class="diff-actions">
140 <a href="${h.route_path('repo_commit_raw',repo_name=c.repo_name,commit_id='?')}" class="tooltip" title="${h.tooltip(_('Raw diff'))}">
141 ${_('Raw Diff')}
142 </a>
143 |
144 <a href="${h.route_path('repo_commit_patch',repo_name=c.repo_name,commit_id='?')}" class="tooltip" title="${h.tooltip(_('Patch diff'))}">
145 ${_('Patch Diff')}
146 </a>
147 |
148 <a href="${h.route_path('repo_commit_download',repo_name=c.repo_name,commit_id='?',_query=dict(diff='download'))}" class="tooltip" title="${h.tooltip(_('Download diff'))}">
149 ${_('Download Diff')}
150 </a>
151 </div>
152 </div>
153 </div>
154 </%doc>
155
156 ## commit status form
132 ## commit status form
157 <div class="fieldset" id="compare_changeset_status" style="display: none; margin-bottom: -80px;">
133 <div class="fieldset" id="compare_changeset_status" style="display: none; margin-bottom: -80px;">
158 <div class="left-label">
134 <div class="left-label">
@@ -322,7 +298,7 b''
322 <div style="padding:0 10px 10px 0px" class="pull-left"></div>
298 <div style="padding:0 10px 10px 0px" class="pull-left"></div>
323 ## commit compare generated below
299 ## commit compare generated below
324 <%include file="compare_commits.mako"/>
300 <%include file="compare_commits.mako"/>
325 ${cbdiffs.render_diffset_menu()}
301 ${cbdiffs.render_diffset_menu(c.diffset)}
326 ${cbdiffs.render_diffset(c.diffset)}
302 ${cbdiffs.render_diffset(c.diffset)}
327 </div>
303 </div>
328 % endif
304 % endif
@@ -330,4 +306,4 b''
330 </div>
306 </div>
331 </div>
307 </div>
332
308
333 </%def> No newline at end of file
309 </%def>
@@ -66,7 +66,7 b''
66 </div>
66 </div>
67 </%def>
67 </%def>
68
68
69 <%def name="repo_name(name,rtype,rstate,private,fork_of,short_name=False,admin=False)">
69 <%def name="repo_name(name,rtype,rstate,private,archived,fork_of,short_name=False,admin=False)">
70 <%
70 <%
71 def get_name(name,short_name=short_name):
71 def get_name(name,short_name=short_name):
72 if short_name:
72 if short_name:
@@ -105,6 +105,7 b''
105 (${_('creating...')})
105 (${_('creating...')})
106 </span>
106 </span>
107 %endif
107 %endif
108
108 </div>
109 </div>
109 </%def>
110 </%def>
110
111
@@ -25,6 +25,13 b''
25 <span style="font-weight:bold;font-size:12px;padding:.2em;${color_scheme.get(tag_type, color_scheme['default'])}">${text}</span>
25 <span style="font-weight:bold;font-size:12px;padding:.2em;${color_scheme.get(tag_type, color_scheme['default'])}">${text}</span>
26 </%def>
26 </%def>
27
27
28 ## Constants
29 <%
30 text_regular = "-apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen-Sans, Ubuntu, Cantarell, 'Helvetica Neue', sans-serif;"
31 text_monospace = "'Menlo', 'Liberation Mono', 'Consolas', 'DejaVu Sans Mono', 'Ubuntu Mono', 'Courier New', 'andale mono', 'lucida console', monospace;"
32
33 %>
34
28 ## headers we additionally can set for email
35 ## headers we additionally can set for email
29 <%def name="headers()" filter="n,trim"></%def>
36 <%def name="headers()" filter="n,trim"></%def>
30
37
@@ -47,7 +54,7 b''
47 <style type="text/css">
54 <style type="text/css">
48 /* Based on The MailChimp Reset INLINE: Yes. */
55 /* Based on The MailChimp Reset INLINE: Yes. */
49 #outlook a {padding:0;} /* Force Outlook to provide a "view in browser" menu link. */
56 #outlook a {padding:0;} /* Force Outlook to provide a "view in browser" menu link. */
50 body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0;}
57 body{width:100% !important; -webkit-text-size-adjust:100%; -ms-text-size-adjust:100%; margin:0; padding:0; font-family: ${text_regular|n}}
51 /* Prevent Webkit and Windows Mobile platforms from changing default font sizes.*/
58 /* Prevent Webkit and Windows Mobile platforms from changing default font sizes.*/
52 .ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */
59 .ExternalClass {width:100%;} /* Force Hotmail to display emails at full width */
53 .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;}
60 .ExternalClass, .ExternalClass p, .ExternalClass span, .ExternalClass font, .ExternalClass td, .ExternalClass div {line-height: 100%;}
@@ -124,8 +131,12 b''
124 </tr>
131 </tr>
125 </table>
132 </table>
126 <!-- End of wrapper table -->
133 <!-- End of wrapper table -->
127 <p><a style="margin-top:15px;margin-left:1%;font-family:sans-serif;font-weight:100;font-size:11px;color:#666666;text-decoration:none;" href="${instance_url}">
134
135 <div style="clear: both"></div>
136 <p>
137 <a style="margin-top:15px;margin-left:1%;font-weight:100;font-size:11px;color:#666666;text-decoration:none;font-family:${text_monospace} " href="${instance_url}">
128 ${self.plaintext_footer()}
138 ${self.plaintext_footer()}
129 </a></p>
139 </a>
140 </p>
130 </body>
141 </body>
131 </html>
142 </html>
@@ -18,12 +18,12 b' data = {'
18 ${_('[mention]') if mention else ''} \
18 ${_('[mention]') if mention else ''} \
19
19
20 % if comment_file:
20 % if comment_file:
21 ${_('%(user)s left %(comment_type)s on commit `%(commit_id)s` (file: `%(comment_file)s`)') % data} ${_('in the %(repo_name)s repository') % data |n}
21 ${_('{user} left a {comment_type} on file `{comment_file}` in commit `{commit_id}`').format(**data)} ${_('in the {repo_name} repository').format(**data) |n}
22 % else:
22 % else:
23 % if status_change:
23 % if status_change:
24 ${_('%(user)s left %(comment_type)s on commit `%(commit_id)s` (status: %(status)s)') % data |n} ${_('in the %(repo_name)s repository') % data |n}
24 ${_('[status: {status}] {user} left a {comment_type} on commit `{commit_id}`').format(**data) |n} ${_('in the {repo_name} repository').format(**data) |n}
25 % else:
25 % else:
26 ${_('%(user)s left %(comment_type)s on commit `%(commit_id)s`') % data |n} ${_('in the %(repo_name)s repository') % data |n}
26 ${_('{user} left a {comment_type} on commit `{commit_id}`').format(**data) |n} ${_('in the {repo_name} repository').format(**data) |n}
27 % endif
27 % endif
28 % endif
28 % endif
29
29
@@ -49,7 +49,7 b' data = {'
49 * ${_('Commit')}: ${h.show_id(commit)}
49 * ${_('Commit')}: ${h.show_id(commit)}
50
50
51 %if comment_file:
51 %if comment_file:
52 * ${_('File: %(comment_file)s on line %(comment_line)s') % data}
52 * ${_('File: {comment_file} on line {comment_line}').format(**data)}
53 %endif
53 %endif
54
54
55 ---
55 ---
@@ -79,9 +79,9 b' data = {'
79 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;">
79 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;">
80
80
81 % if comment_file:
81 % if comment_file:
82 <h4><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('%(user)s commented on commit `%(commit_id)s` (file:`%(comment_file)s`)') % data}</a> ${_('in the %(repo)s repository') % data |n}</h4>
82 <h4><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('{user} left a {comment_type} on file `{comment_file}` in commit `{commit_id}`').format(**data)}</a> ${_('in the {repo} repository').format(**data) |n}</h4>
83 % else:
83 % else:
84 <h4><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('%(user)s commented on commit `%(commit_id)s`') % data |n}</a> ${_('in the %(repo)s repository') % data |n}</h4>
84 <h4><a href="${commit_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('{user} left a {comment_type} on commit `{commit_id}`').format(**data) |n}</a> ${_('in the {repo} repository').format(**data) |n}</h4>
85 % endif
85 % endif
86 </td></tr>
86 </td></tr>
87
87
@@ -89,16 +89,19 b' data = {'
89 <tr><td style="padding-right:20px;">${_('Description')}</td><td style="white-space:pre-wrap">${h.urlify_commit_message(commit.message, repo_name)}</td></tr>
89 <tr><td style="padding-right:20px;">${_('Description')}</td><td style="white-space:pre-wrap">${h.urlify_commit_message(commit.message, repo_name)}</td></tr>
90
90
91 % if status_change:
91 % if status_change:
92 <tr><td style="padding-right:20px;">${_('Status')}</td>
92 <tr>
93 <td>${_('The commit status was changed to')}: ${base.status_text(status_change, tag_type=status_change_type)}</td>
93 <td style="padding-right:20px;">${_('Status')}</td>
94 <td>
95 ${_('The commit status was changed to')}: ${base.status_text(status_change, tag_type=status_change_type)}
96 </td>
94 </tr>
97 </tr>
95 % endif
98 % endif
96 <tr>
99 <tr>
97 <td style="padding-right:20px;">
100 <td style="padding-right:20px;">
98 % if comment_type == 'todo':
101 % if comment_type == 'todo':
99 ${(_('TODO comment on line: %(comment_line)s') if comment_file else _('TODO comment')) % data}
102 ${(_('TODO comment on line: {comment_line}') if comment_file else _('TODO comment')).format(**data)}
100 % else:
103 % else:
101 ${(_('Note comment on line: %(comment_line)s') if comment_file else _('Note comment')) % data}
104 ${(_('Note comment on line: {comment_line}') if comment_file else _('Note comment')).format(**data)}
102 % endif
105 % endif
103 </td>
106 </td>
104 <td style="line-height:1.2em;white-space:pre-wrap">${h.render(comment_body, renderer=renderer_type, mentions=True)}</td></tr>
107 <td style="line-height:1.2em;white-space:pre-wrap">${h.render(comment_body, renderer=renderer_type, mentions=True)}</td></tr>
@@ -16,15 +16,15 b' data = {'
16 }
16 }
17 %>
17 %>
18
18
19 ${_('[mention]') if mention else ''} \
19 ${(_('[mention]') if mention else '')} \
20
20
21 % if comment_file:
21 % if comment_file:
22 ${_('%(user)s left %(comment_type)s on pull request #%(pr_id)s "%(pr_title)s" (file: `%(comment_file)s`)') % data |n}
22 ${_('{user} left a {comment_type} on file `{comment_file}` in pull request #{pr_id} "{pr_title}"').format(**data) |n}
23 % else:
23 % else:
24 % if status_change:
24 % if status_change:
25 ${_('%(user)s left %(comment_type)s on pull request #%(pr_id)s "%(pr_title)s" (status: %(status)s)') % data |n}
25 ${_('[status: {status}] {user} left a {comment_type} on pull request #{pr_id} "{pr_title}"').format(**data) |n}
26 % else:
26 % else:
27 ${_('%(user)s left %(comment_type)s on pull request #%(pr_id)s "%(pr_title)s"') % data |n}
27 ${_('{user} left a {comment_type} on pull request #{pr_id} "{pr_title}"').format(**data) |n}
28 % endif
28 % endif
29 % endif
29 % endif
30 </%def>
30 </%def>
@@ -49,18 +49,18 b' data = {'
49 * ${_('Source repository')}: ${pr_source_repo_url}
49 * ${_('Source repository')}: ${pr_source_repo_url}
50
50
51 %if comment_file:
51 %if comment_file:
52 * ${_('File: %(comment_file)s on line %(comment_line)s') % {'comment_file': comment_file, 'comment_line': comment_line}}
52 * ${_('File: {comment_file} on line {comment_line}').format(comment_file=comment_file, comment_line=comment_line)}
53 %endif
53 %endif
54
54
55 ---
55 ---
56
56
57 %if status_change and not closing_pr:
57 %if status_change and not closing_pr:
58 ${_('%(user)s submitted pull request #%(pr_id)s status: *%(status)s*') % data}
58 ${_('{user} submitted pull request #{pr_id} status: *{status}*').format(**data)}
59 %elif status_change and closing_pr:
59 %elif status_change and closing_pr:
60 ${_('%(user)s submitted pull request #%(pr_id)s status: *%(status)s and closed*') % data}
60 ${_('{user} submitted pull request #{pr_id} status: *{status} and closed*').format(**data)}
61 %endif
61 %endif
62
62
63 ${comment_body|n}
63 ${comment_body |n}
64
64
65 ${self.plaintext_footer()}
65 ${self.plaintext_footer()}
66 </%def>
66 </%def>
@@ -81,9 +81,9 b' data = {'
81 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;">
81 <tr><td colspan="2" style="width:100%;padding-bottom:15px;border-bottom:1px solid #dbd9da;">
82
82
83 % if comment_file:
83 % if comment_file:
84 <h4><a href="${pr_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('%(user)s commented on pull request #%(pr_id)s "%(pr_title)s" (file:`%(comment_file)s`)') % data |n}</a></h4>
84 <h4><a href="${pr_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('{user} left a {comment_type} on file `{comment_file}` in pull request #{pr_id} "{pr_title}"').format(**data) |n}</a></h4>
85 % else:
85 % else:
86 <h4><a href="${pr_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('%(user)s commented on pull request #%(pr_id)s "%(pr_title)s"') % data |n}</a></h4>
86 <h4><a href="${pr_comment_url}" style="color:#427cc9;text-decoration:none;cursor:pointer">${_('{user} left a {comment_type} on pull request #{pr_id} "{pr_title}"').format(**data) |n}</a></h4>
87 % endif
87 % endif
88
88
89 </td></tr>
89 </td></tr>
@@ -104,9 +104,9 b' data = {'
104 <tr>
104 <tr>
105 <td style="padding-right:20px;">
105 <td style="padding-right:20px;">
106 % if comment_type == 'todo':
106 % if comment_type == 'todo':
107 ${(_('TODO comment on line: %(comment_line)s') if comment_file else _('TODO comment')) % data}
107 ${(_('TODO comment on line: {comment_line}') if comment_file else _('TODO comment')).format(**data)}
108 % else:
108 % else:
109 ${(_('Note comment on line: %(comment_line)s') if comment_file else _('Note comment')) % data}
109 ${(_('Note comment on line: {comment_line}') if comment_file else _('Note comment')).format(**data)}
110 % endif
110 % endif
111 </td>
111 </td>
112 <td style="line-height:1.2em;white-space:pre-wrap">${h.render(comment_body, renderer=renderer_type, mentions=True)}</td>
112 <td style="line-height:1.2em;white-space:pre-wrap">${h.render(comment_body, renderer=renderer_type, mentions=True)}</td>
@@ -13,9 +13,6 b''
13 %endif
13 %endif
14
14
15 <link rel="stylesheet" type="text/css" href="${h.asset('css/style.css', ver=c.rhodecode_version_hash)}" media="screen"/>
15 <link rel="stylesheet" type="text/css" href="${h.asset('css/style.css', ver=c.rhodecode_version_hash)}" media="screen"/>
16 <!--[if IE]>
17 <link rel="stylesheet" type="text/css" href="${h.asset('css/ie.css')}" media="screen"/>
18 <![endif]-->
19 <style>body { background:#eeeeee; }</style>
16 <style>body { background:#eeeeee; }</style>
20 <script type="text/javascript">
17 <script type="text/javascript">
21 // register templateContext to pass template variables to JS
18 // register templateContext to pass template variables to JS
@@ -8,7 +8,7 b''
8 <div class="info_box_elem previous">
8 <div class="info_box_elem previous">
9 <a id="prev_commit_link" data-commit-id="${c.prev_commit.raw_id}" class="pjax-link ${'disabled' if c.url_prev == '#' else ''}" href="${c.url_prev}" title="${_('Previous commit')}"><i class="icon-left"></i></a>
9 <a id="prev_commit_link" data-commit-id="${c.prev_commit.raw_id}" class="pjax-link ${'disabled' if c.url_prev == '#' else ''}" href="${c.url_prev}" title="${_('Previous commit')}"><i class="icon-left"></i></a>
10 </div>
10 </div>
11 <div class="info_box_elem">${h.text('at_rev',value=c.commit.revision)}</div>
11 <div class="info_box_elem">${h.text('at_rev',value=c.commit.idx)}</div>
12 <div class="info_box_elem next">
12 <div class="info_box_elem next">
13 <a id="next_commit_link" data-commit-id="${c.next_commit.raw_id}" class="pjax-link ${'disabled' if c.url_next == '#' else ''}" href="${c.url_next}" title="${_('Next commit')}"><i class="icon-right"></i></a>
13 <a id="next_commit_link" data-commit-id="${c.next_commit.raw_id}" class="pjax-link ${'disabled' if c.url_next == '#' else ''}" href="${c.url_next}" title="${_('Next commit')}"><i class="icon-right"></i></a>
14 </div>
14 </div>
@@ -59,7 +59,7 b''
59 <td class="td-hash" data-attr-name="commit_id">
59 <td class="td-hash" data-attr-name="commit_id">
60 % if c.full_load:
60 % if c.full_load:
61 <div class="tooltip" title="${h.tooltip(node.last_commit.message)}">
61 <div class="tooltip" title="${h.tooltip(node.last_commit.message)}">
62 <pre data-commit-id="${node.last_commit.raw_id}">r${node.last_commit.revision}:${node.last_commit.short_id}</pre>
62 <pre data-commit-id="${node.last_commit.raw_id}">r${node.last_commit.idx}:${node.last_commit.short_id}</pre>
63 </div>
63 </div>
64 % endif
64 % endif
65 </td>
65 </td>
@@ -3,20 +3,24 b''
3 <div id="codeblock" class="codeblock">
3 <div id="codeblock" class="codeblock">
4 <div class="codeblock-header">
4 <div class="codeblock-header">
5 <div class="stats">
5 <div class="stats">
6 <span>
6 <span class="stats-filename">
7 <strong>
7 <strong>
8 <i class="icon-file-text"></i>
8 <i class="icon-file-text"></i>
9 ${c.file.unicode_path_safe}
9 ${c.file.unicode_path_safe}
10 </strong>
10 </strong>
11 </span>
11 </span>
12 <span class="item last"><i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${c.f_path}" title="${_('Copy the full path')}"></i></span>
13 <br/>
14
12 % if c.lf_node:
15 % if c.lf_node:
13 <span title="${_('This file is a pointer to large binary file')}"> | ${_('LargeFile')} ${h.format_byte_size_binary(c.lf_node.size)} </span>
16 <span title="${_('This file is a pointer to large binary file')}"> | ${_('LargeFile')} ${h.format_byte_size_binary(c.lf_node.size)} </span>
14 % endif
17 % endif
15 <span> | ${c.file.lines()[0]} ${_ungettext('line', 'lines', c.file.lines()[0])}</span>
18
19 <span class="stats-first-item">${c.file.lines()[0]} ${_ungettext('line', 'lines', c.file.lines()[0])}</span>
16 <span> | ${h.format_byte_size_binary(c.file.size)}</span>
20 <span> | ${h.format_byte_size_binary(c.file.size)}</span>
17 <span> | ${c.file.mimetype} </span>
21 <span> | ${c.file.mimetype} </span>
18 <span> | ${h.get_lexer_for_filenode(c.file).__class__.__name__}</span>
22 <span> | ${h.get_lexer_for_filenode(c.file).__class__.__name__}</span>
19 <span class="item last"> | <i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${c.f_path}" title="${_('Copy the full path')}"></i></span>
23
20 </div>
24 </div>
21 <div class="buttons">
25 <div class="buttons">
22 <a id="file_history_overview" href="#">
26 <a id="file_history_overview" href="#">
@@ -50,13 +50,13 b''
50 <!-- end box / title -->
50 <!-- end box / title -->
51 <div class="table">
51 <div class="table">
52 <div id="groups_list_wrap">
52 <div id="groups_list_wrap">
53 <table id="group_list_table" class="display"></table>
53 <table id="group_list_table" class="display" style="width: 100%"></table>
54 </div>
54 </div>
55 </div>
55 </div>
56
56
57 <div class="table">
57 <div class="table">
58 <div id="repos_list_wrap">
58 <div id="repos_list_wrap">
59 <table id="repo_list_table" class="display"></table>
59 <table id="repo_list_table" class="display" style="width: 100%"></table>
60 </div>
60 </div>
61 </div>
61 </div>
62
62
@@ -511,21 +511,17 b''
511 <td class="td-hash">
511 <td class="td-hash">
512 <code>
512 <code>
513 <a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=commit.raw_id)}">
513 <a href="${h.route_path('repo_commit', repo_name=c.target_repo.repo_name, commit_id=commit.raw_id)}">
514 r${commit.revision}:${h.short_id(commit.raw_id)}
514 r${commit.idx}:${h.short_id(commit.raw_id)}
515 </a>
515 </a>
516 ${h.hidden('revisions', commit.raw_id)}
516 ${h.hidden('revisions', commit.raw_id)}
517 </code>
517 </code>
518 </td>
518 </td>
519 <td class="expand_commit" data-commit-id="${commit.raw_id}" title="${_( 'Expand commit message')}">
519 <td class="td-message expand_commit" data-commit-id="${commit.raw_id}" title="${_( 'Expand commit message')}" onclick="commitsController.expandCommit(this); return false">
520 <div class="show_more_col">
520 <i class="icon-expand-linked"></i>
521 <i class="show_more"></i>
522 </div>
523 </td>
521 </td>
524 <td class="mid td-description">
522 <td class="mid td-description">
525 <div class="log-container truncate-wrap">
523 <div class="log-container truncate-wrap">
526 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">
524 <div class="message truncate" id="c-${commit.raw_id}" data-message-raw="${commit.message}">${h.urlify_commit_message(commit.message, c.repo_name)}</div>
527 ${h.urlify_commit_message(commit.message, c.repo_name)}
528 </div>
529 </div>
525 </div>
530 </td>
526 </td>
531 </tr>
527 </tr>
@@ -534,32 +530,6 b''
534 </table>
530 </table>
535 </div>
531 </div>
536
532
537 <script>
538 $('.expand_commit').on('click',function(e){
539 var target_expand = $(this);
540 var cid = target_expand.data('commitId');
541
542 if (target_expand.hasClass('open')){
543 $('#c-'+cid).css({
544 'height': '1.5em',
545 'white-space': 'nowrap',
546 'text-overflow': 'ellipsis',
547 'overflow':'hidden'
548 });
549 target_expand.removeClass('open');
550 }
551 else {
552 $('#c-'+cid).css({
553 'height': 'auto',
554 'white-space': 'pre-line',
555 'text-overflow': 'initial',
556 'overflow':'visible'
557 });
558 target_expand.addClass('open');
559 }
560 });
561 </script>
562
563 % endif
533 % endif
564
534
565 % else:
535 % else:
@@ -568,13 +538,28 b''
568
538
569 <div class="cs_files">
539 <div class="cs_files">
570 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
540 <%namespace name="cbdiffs" file="/codeblocks/diffs.mako"/>
571 ${cbdiffs.render_diffset_menu()}
541
572 ${cbdiffs.render_diffset(
542 ${cbdiffs.render_diffset_menu(c.diffset, range_diff_on=c.range_diff_on)}
573 c.diffset, use_comments=True,
543
574 collapse_when_files_over=30,
544 % if c.range_diff_on:
575 disable_new_comments=not c.allowed_to_comment,
545 % for commit in c.commit_ranges:
576 deleted_files_comments=c.deleted_files_comments,
546 ${cbdiffs.render_diffset(
577 inline_comments=c.inline_comments)}
547 c.changes[commit.raw_id],
548 commit=commit, use_comments=True,
549 collapse_when_files_over=5,
550 disable_new_comments=True,
551 deleted_files_comments=c.deleted_files_comments,
552 inline_comments=c.inline_comments)}
553 % endfor
554 % else:
555 ${cbdiffs.render_diffset(
556 c.diffset, use_comments=True,
557 collapse_when_files_over=30,
558 disable_new_comments=not c.allowed_to_comment,
559 deleted_files_comments=c.deleted_files_comments,
560 inline_comments=c.inline_comments)}
561 % endif
562
578 </div>
563 </div>
579 % else:
564 % else:
580 ## skipping commits we need to clear the view for missing commits
565 ## skipping commits we need to clear the view for missing commits
@@ -641,6 +626,7 b''
641 versionController.init();
626 versionController.init();
642
627
643 reviewersController = new ReviewersController();
628 reviewersController = new ReviewersController();
629 commitsController = new CommitsController();
644
630
645 $(function(){
631 $(function(){
646
632
@@ -57,8 +57,7 b''
57 %endif
57 %endif
58 <div class="form search-form">
58 <div class="form search-form">
59 <div class="fields">
59 <div class="fields">
60 <label for="q">${_('Search item')}:</label>
60 ${h.text('q', c.cur_query, placeholder="Enter query...")}
61 ${h.text('q', c.cur_query)}
62
61
63 ${h.select('type',c.search_type,[('content',_('File contents')), ('commit',_('Commit messages')), ('path',_('File names')),],id='id_search_type')}
62 ${h.select('type',c.search_type,[('content',_('File contents')), ('commit',_('Commit messages')), ('path',_('File names')),],id='id_search_type')}
64 <input type="submit" value="${_('Search')}" class="btn"/>
63 <input type="submit" value="${_('Search')}" class="btn"/>
@@ -34,8 +34,8 b''
34 h.route_path('repo_commit',repo_name=entry['repository'],commit_id=entry['commit_id']))}
34 h.route_path('repo_commit',repo_name=entry['repository'],commit_id=entry['commit_id']))}
35 </td>
35 </td>
36 <td class="td-message expand_commit search open" data-commit-id="${h.md5_safe(entry['repository'])+entry['commit_id']}" id="t-${h.md5_safe(entry['repository'])+entry['commit_id']}" title="${_('Expand commit message')}">
36 <td class="td-message expand_commit search open" data-commit-id="${h.md5_safe(entry['repository'])+entry['commit_id']}" id="t-${h.md5_safe(entry['repository'])+entry['commit_id']}" title="${_('Expand commit message')}">
37 <div class="show_more_col">
37 <div>
38 <i class="show_more"></i>&nbsp;
38 <i class="icon-expand-linked"></i>&nbsp;
39 </div>
39 </div>
40 </td>
40 </td>
41 <td data-commit-id="${h.md5_safe(entry['repository'])+entry['commit_id']}" id="c-${h.md5_safe(entry['repository'])+entry['commit_id']}" class="message td-description open">
41 <td data-commit-id="${h.md5_safe(entry['repository'])+entry['commit_id']}" id="c-${h.md5_safe(entry['repository'])+entry['commit_id']}" class="message td-description open">
@@ -84,7 +84,56 b''
84 </div>
84 </div>
85
85
86 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
86 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
87 <div class="left-label">
87 <div class="left-label-summary">
88 ${_('Information')}:
89 </div>
90 <div class="right-content">
91 <div class="commit-info">
92 <div class="tags">
93 <% commit_rev = c.rhodecode_db_repo.changeset_cache.get('revision') %>
94 % if c.rhodecode_repo:
95 ${refs_counters(
96 c.rhodecode_repo.branches,
97 c.rhodecode_repo.branches_closed,
98 c.rhodecode_repo.tags,
99 c.rhodecode_repo.bookmarks)}
100 % else:
101 ## missing requirements can make c.rhodecode_repo None
102 ${refs_counters([], [], [], [])}
103 % endif
104
105 ## commits
106 <span class="tag">
107 % if commit_rev == -1:
108 ${_ungettext('%(num)s Commit', '%(num)s Commits', 0) % {'num': 0}},
109 % else:
110 <a href="${h.route_path('repo_changelog', repo_name=c.repo_name)}">
111 ${_ungettext('%(num)s Commit', '%(num)s Commits', commit_rev) % {'num': commit_rev}}</a>,
112 % endif
113 </span>
114
115 ## forks
116 <span class="tag">
117 <a title="${_('Number of Repository Forks')}" href="${h.route_path('repo_forks_show_all', repo_name=c.repo_name)}">
118 ${c.repository_forks} ${_ungettext('Fork', 'Forks', c.repository_forks)}</a>,
119 </span>
120
121 ## repo size
122 % if commit_rev == -1:
123 <span class="stats-bullet">0 B</span>
124 % else:
125 <span class="stats-bullet" id="repo_size_container">
126 ${_('Calculating Repository Size...')}
127 </span>
128 % endif
129
130 </div>
131 </div>
132 </div>
133 </div>
134
135 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
136 <div class="left-label-summary">
88 ${_('Description')}:
137 ${_('Description')}:
89 </div>
138 </div>
90 <div class="right-content">
139 <div class="right-content">
@@ -95,95 +144,23 b''
95 </div>
144 </div>
96 </div>
145 </div>
97
146
98 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
99 <div class="left-label">
100 ${_('Information')}:
101 </div>
102 <div class="right-content">
103
104 <div class="repo-size">
105 <% commit_rev = c.rhodecode_db_repo.changeset_cache.get('revision') %>
106
107 ## commits
108 % if commit_rev == -1:
109 ${_ungettext('%(num)s Commit', '%(num)s Commits', 0) % {'num': 0}},
110 % else:
111 <a href="${h.route_path('repo_changelog', repo_name=c.repo_name)}">
112 ${_ungettext('%(num)s Commit', '%(num)s Commits', commit_rev) % {'num': commit_rev}}</a>,
113 % endif
114
115 ## forks
116 <a title="${_('Number of Repository Forks')}" href="${h.route_path('repo_forks_show_all', repo_name=c.repo_name)}">
117 ${c.repository_forks} ${_ungettext('Fork', 'Forks', c.repository_forks)}</a>,
118
119 ## repo size
120 % if commit_rev == -1:
121 <span class="stats-bullet">0 B</span>
122 % else:
123 <span class="stats-bullet" id="repo_size_container">
124 ${_('Calculating Repository Size...')}
125 </span>
126 % endif
127 </div>
128
129 <div class="commit-info">
130 <div class="tags">
131 % if c.rhodecode_repo:
132 ${refs_counters(
133 c.rhodecode_repo.branches,
134 c.rhodecode_repo.branches_closed,
135 c.rhodecode_repo.tags,
136 c.rhodecode_repo.bookmarks)}
137 % else:
138 ## missing requirements can make c.rhodecode_repo None
139 ${refs_counters([], [], [], [])}
140 % endif
141 </div>
142 </div>
143
144 </div>
145 </div>
146
147 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
148 <div class="left-label">
149 ${_('Statistics')}:
150 </div>
151 <div class="right-content">
152 <div class="input ${summary(c.show_stats)} statistics">
153 % if c.show_stats:
154 <div id="lang_stats" class="enabled">
155 ${_('Calculating Code Statistics...')}
156 </div>
157 % else:
158 <span class="disabled">
159 ${_('Statistics are disabled for this repository')}
160 </span>
161 % if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
162 , ${h.link_to(_('enable statistics'),h.route_path('edit_repo',repo_name=c.repo_name, _anchor='repo_enable_statistics'))}
163 % endif
164 % endif
165 </div>
166
167 </div>
168 </div>
169
170 % if show_downloads:
147 % if show_downloads:
171 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
148 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
172 <div class="left-label">
149 <div class="left-label-summary">
173 ${_('Downloads')}:
150 ${_('Downloads')}:
174 </div>
151 </div>
175 <div class="right-content">
152 <div class="right-content">
176 <div class="input ${summary(c.show_stats)} downloads">
153 <div class="input ${summary(c.show_stats)} downloads">
177 % if c.rhodecode_repo and len(c.rhodecode_repo.revisions) == 0:
154 % if c.rhodecode_repo and len(c.rhodecode_repo.commit_ids) == 0:
178 <span class="disabled">
155 <span class="disabled">
179 ${_('There are no downloads yet')}
156 ${_('There are no downloads yet')}
180 </span>
157 </span>
181 % elif not c.enable_downloads:
158 % elif not c.enable_downloads:
182 <span class="disabled">
159 <span class="disabled">
183 ${_('Downloads are disabled for this repository')}
160 ${_('Downloads are disabled for this repository')}.
184 </span>
161 </span>
185 % if h.HasPermissionAll('hg.admin')('enable downloads on from summary'):
162 % if h.HasPermissionAll('hg.admin')('enable downloads on from summary'):
186 , ${h.link_to(_('enable downloads'),h.route_path('edit_repo',repo_name=c.repo_name, _anchor='repo_enable_downloads'))}
163 ${h.link_to(_('Enable downloads'),h.route_path('edit_repo',repo_name=c.repo_name, _anchor='repo_enable_downloads'))}
187 % endif
164 % endif
188 % else:
165 % else:
189 <span class="enabled">
166 <span class="enabled">
@@ -199,6 +176,30 b''
199 </div>
176 </div>
200 % endif
177 % endif
201
178
179 ## Statistics
180 <div class="fieldset collapsable-content" data-toggle="summary-details" style="display: none;">
181 <div class="left-label-summary">
182 ${_('Statistics')}:
183 </div>
184 <div class="right-content">
185 <div class="input ${summary(c.show_stats)} statistics">
186 % if c.show_stats:
187 <div id="lang_stats" class="enabled">
188 ${_('Calculating Code Statistics...')}
189 </div>
190 % else:
191 <span class="disabled">
192 ${_('Statistics are disabled for this repository')}.
193 </span>
194 % if h.HasPermissionAll('hg.admin')('enable stats on from summary'):
195 ${h.link_to(_('Enable statistics'),h.route_path('edit_repo',repo_name=c.repo_name, _anchor='repo_enable_statistics'))}
196 % endif
197 % endif
198 </div>
199
200 </div>
201 </div>
202
202 </div><!--end summary-detail-->
203 </div><!--end summary-detail-->
203 </%def>
204 </%def>
204
205
@@ -60,15 +60,25 b''
60
60
61 <script type="text/javascript">
61 <script type="text/javascript">
62 $(document).ready(function(){
62 $(document).ready(function(){
63 $('#clone_option').on('change', function(e) {
63
64 var selected = $(this).val();
64 var showCloneField = function(clone_url_format){
65 $.each(['http', 'http_id', 'ssh'], function (idx, val) {
65 $.each(['http', 'http_id', 'ssh'], function (idx, val) {
66 if(val === selected){
66 if(val === clone_url_format){
67 $('#clone_option_' + val).show();
67 $('#clone_option_' + val).show();
68 $('#clone_option').val(val)
68 } else {
69 } else {
69 $('#clone_option_' + val).hide();
70 $('#clone_option_' + val).hide();
70 }
71 }
71 });
72 });
73 };
74 // default taken from session
75 showCloneField(templateContext.session_attrs.clone_url_format);
76
77 $('#clone_option').on('change', function(e) {
78 var selected = $(this).val();
79
80 storeUserSessionAttr('rc_user_session_attr.clone_url_format', selected);
81 showCloneField(selected)
72 });
82 });
73
83
74 var initialCommitData = {
84 var initialCommitData = {
@@ -45,7 +45,10 b''
45 %endif
45 %endif
46 </td>
46 </td>
47 <td class="td-commit">
47 <td class="td-commit">
48 <pre><a href="${h.route_path('repo_commit', repo_name=c.repo_name, commit_id=cs.raw_id)}">${h.show_id(cs)}</a></pre>
48 <code>
49 <a href="${h.route_path('repo_commit', repo_name=c.repo_name, commit_id=cs.raw_id)}">${h.show_id(cs)}</a>
50 <i class="tooltip icon-clipboard clipboard-action" data-clipboard-text="${cs.raw_id}" title="${_('Copy the full commit id')}"></i>
51 </code>
49 </td>
52 </td>
50
53
51 <td class="td-description mid">
54 <td class="td-description mid">
@@ -236,7 +236,7 b' def no_newline_id_generator(test_name):'
236 nicer output of progress of test
236 nicer output of progress of test
237 """
237 """
238 org_name = test_name
238 org_name = test_name
239 test_name = test_name\
239 test_name = safe_str(test_name)\
240 .replace('\n', '_N') \
240 .replace('\n', '_N') \
241 .replace('\r', '_N') \
241 .replace('\r', '_N') \
242 .replace('\t', '_T') \
242 .replace('\t', '_T') \
@@ -99,8 +99,8 b' class RhodeCodeAuthPlugin(RhodeCodeExter'
99 'extern_type': extern_type,
99 'extern_type': extern_type,
100 }
100 }
101
101
102 log.debug('EXTERNAL user: \n%s' % formatted_json(user_attrs))
102 log.debug('EXTERNAL user: \n%s', formatted_json(user_attrs))
103 log.info('user `%s` authenticated correctly' % user_attrs['username'])
103 log.info('user `%s` authenticated correctly', user_attrs['username'])
104
104
105 return user_attrs
105 return user_attrs
106
106
@@ -34,7 +34,7 b' def _get_dbs_from_metafunc(metafunc):'
34 if hasattr(metafunc.function, 'dbs'):
34 if hasattr(metafunc.function, 'dbs'):
35 # Supported backends by this test function, created from
35 # Supported backends by this test function, created from
36 # pytest.mark.dbs
36 # pytest.mark.dbs
37 backends = metafunc.function.dbs.args
37 backends = metafunc.definition.get_closest_marker('dbs').args
38 else:
38 else:
39 backends = metafunc.config.getoption('--dbs')
39 backends = metafunc.config.getoption('--dbs')
40 return backends
40 return backends
@@ -42,11 +42,13 b' def scm_extras(user_regular, repo_stub):'
42 'repository': repo_stub.repo_name,
42 'repository': repo_stub.repo_name,
43 'scm': repo_stub.scm_instance().alias,
43 'scm': repo_stub.scm_instance().alias,
44 'config': '',
44 'config': '',
45 'repo_store': '',
45 'server_url': 'http://example.com',
46 'server_url': 'http://example.com',
46 'make_lock': None,
47 'make_lock': None,
47 'user-agent': 'some-client',
48 'user_agent': 'some-client',
48 'locked_by': [None],
49 'locked_by': [None],
49 'commit_ids': ['a' * 40] * 3,
50 'commit_ids': ['a' * 40] * 3,
51 'hook_type': 'scm_extras_test',
50 'is_shadow_repo': False,
52 'is_shadow_repo': False,
51 })
53 })
52 return extras
54 return extras
@@ -53,7 +53,7 b' class TestINI(object):'
53 data. Example usage::
53 data. Example usage::
54
54
55 with TestINI('test.ini', [{'section':{'key':val'}]) as new_test_ini_path:
55 with TestINI('test.ini', [{'section':{'key':val'}]) as new_test_ini_path:
56 print 'paster server %s' % new_test_ini
56 print('paster server %s' % new_test_ini)
57 """
57 """
58
58
59 def __init__(self, ini_file_path, ini_params, new_file_prefix='DEFAULT',
59 def __init__(self, ini_file_path, ini_params, new_file_prefix='DEFAULT',
@@ -226,7 +226,7 b' class Fixture(object):'
226 return r
226 return r
227
227
228 def destroy_repo(self, repo_name, **kwargs):
228 def destroy_repo(self, repo_name, **kwargs):
229 RepoModel().delete(repo_name, **kwargs)
229 RepoModel().delete(repo_name, pull_requests='delete', **kwargs)
230 Session().commit()
230 Session().commit()
231
231
232 def destroy_repo_on_filesystem(self, repo_name):
232 def destroy_repo_on_filesystem(self, repo_name):
@@ -43,6 +43,7 b' def repo_push_event(backend, user_regula'
43 'repository': repo.repo_name,
43 'repository': repo.repo_name,
44 'scm': repo.scm_instance().alias,
44 'scm': repo.scm_instance().alias,
45 'config': '',
45 'config': '',
46 'repo_store': '',
46 'server_url': 'http://example.com',
47 'server_url': 'http://example.com',
47 'make_lock': None,
48 'make_lock': None,
48 'locked_by': [None],
49 'locked_by': [None],
@@ -194,7 +194,7 b' class TestSimpleSvnApp(object):'
194 ]
194 ]
195 request_mock.assert_called_once_with(
195 request_mock.assert_called_once_with(
196 self.environment['REQUEST_METHOD'], expected_url,
196 self.environment['REQUEST_METHOD'], expected_url,
197 data=self.data, headers=expected_request_headers)
197 data=self.data, headers=expected_request_headers, stream=False)
198 response_mock.iter_content.assert_called_once_with(chunk_size=1024)
198 response_mock.iter_content.assert_called_once_with(chunk_size=1024)
199 args, _ = start_response.call_args
199 args, _ = start_response.call_args
200 assert args[0] == '200 OK'
200 assert args[0] == '200 OK'
@@ -33,7 +33,7 b' class TestTokenizeString(object):'
33 import this
33 import this
34
34
35 var = 6
35 var = 6
36 print "this"
36 print("this")
37
37
38 '''
38 '''
39
39
@@ -58,10 +58,11 b' class TestTokenizeString(object):'
58 ('', u'\n'),
58 ('', u'\n'),
59 ('', u' '),
59 ('', u' '),
60 ('k', u'print'),
60 ('k', u'print'),
61 ('', u' '),
61 ('p', u'('),
62 ('s2', u'"'),
62 ('s2', u'"'),
63 ('s2', u'this'),
63 ('s2', u'this'),
64 ('s2', u'"'),
64 ('s2', u'"'),
65 ('p', u')'),
65 ('', u'\n'),
66 ('', u'\n'),
66 ('', u'\n'),
67 ('', u'\n'),
67 ('', u' ')
68 ('', u' ')
@@ -73,7 +74,7 b' class TestTokenizeString(object):'
73
74
74 assert tokens == [
75 assert tokens == [
75 ('',
76 ('',
76 u'\n import this\n\n var = 6\n print "this"\n\n ')
77 u'\n import this\n\n var = 6\n print("this")\n\n ')
77 ]
78 ]
78
79
79
80
@@ -38,6 +38,7 b' def test_post_push_truncates_commits(use'
38 'user_agent': 'some-client',
38 'user_agent': 'some-client',
39 'locked_by': [None],
39 'locked_by': [None],
40 'commit_ids': ['abcde12345' * 4] * 30000,
40 'commit_ids': ['abcde12345' * 4] * 30000,
41 'hook_type': 'large_push_test_type',
41 'is_shadow_repo': False,
42 'is_shadow_repo': False,
42 }
43 }
43 extras = utils2.AttributeDict(extras)
44 extras = utils2.AttributeDict(extras)
@@ -70,11 +71,13 b' def hook_extras(user_regular, repo_stub)'
70 'repository': repo_stub.repo_name,
71 'repository': repo_stub.repo_name,
71 'scm': '',
72 'scm': '',
72 'config': '',
73 'config': '',
74 'repo_store': '',
73 'server_url': 'http://example.com',
75 'server_url': 'http://example.com',
74 'make_lock': None,
76 'make_lock': None,
75 'user_agent': 'some-client',
77 'user_agent': 'some-client',
76 'locked_by': [None],
78 'locked_by': [None],
77 'commit_ids': [],
79 'commit_ids': [],
80 'hook_type': 'test_type',
78 'is_shadow_repo': False,
81 'is_shadow_repo': False,
79 })
82 })
80 return extras
83 return extras
@@ -91,7 +94,12 b' def test_hooks_propagate(func, extension'
91 Tests that our hook code propagates to rhodecode extensions and triggers
94 Tests that our hook code propagates to rhodecode extensions and triggers
92 the appropriate event.
95 the appropriate event.
93 """
96 """
94 extension_mock = mock.Mock()
97 class ExtensionMock(mock.Mock):
98 @property
99 def output(self):
100 return 'MOCK'
101
102 extension_mock = ExtensionMock()
95 events_mock = mock.Mock()
103 events_mock = mock.Mock()
96 patches = {
104 patches = {
97 'Repository': mock.Mock(),
105 'Repository': mock.Mock(),
@@ -561,7 +561,7 b' def test_get_repo_by_id(test, expected):'
561
561
562
562
563 def test_invalidation_context(baseapp):
563 def test_invalidation_context(baseapp):
564 repo_id = 999
564 repo_id = 9999
565
565
566 cache_namespace_uid = 'cache_repo_instance.{}_{}'.format(
566 cache_namespace_uid = 'cache_repo_instance.{}_{}'.format(
567 repo_id, CacheKey.CACHE_TYPE_README)
567 repo_id, CacheKey.CACHE_TYPE_README)
@@ -302,7 +302,7 b' class TestPasswordChanged(object):'
302 assert result is True
302 assert result is True
303
303
304
304
305 class TestReadOpensourceLicenses(object):
305 class TestReadOpenSourceLicenses(object):
306 def test_success(self):
306 def test_success(self):
307 utils._license_cache = None
307 utils._license_cache = None
308 json_data = '''
308 json_data = '''
@@ -343,10 +343,14 b' class TestReadOpensourceLicenses(object)'
343 def test_licenses_file_contains_no_unknown_licenses(self):
343 def test_licenses_file_contains_no_unknown_licenses(self):
344 utils._license_cache = None
344 utils._license_cache = None
345 result = utils.read_opensource_licenses()
345 result = utils.read_opensource_licenses()
346 license_names = []
346
347 for licenses in result.values():
347 for license_data in result:
348 license_names.extend(licenses.keys())
348 if isinstance(license_data["license"], list):
349 assert 'UNKNOWN' not in license_names
349 for lic_data in license_data["license"]:
350 assert 'UNKNOWN' not in lic_data["fullName"]
351 else:
352 full_name = license_data.get("fullName") or license_data
353 assert 'UNKNOWN' not in full_name
350
354
351
355
352 class TestMakeDbConfig(object):
356 class TestMakeDbConfig(object):
@@ -90,7 +90,7 b' def execute(*popenargs, **kwargs):'
90 cmd = kwargs.get("args")
90 cmd = kwargs.get("args")
91 if cmd is None:
91 if cmd is None:
92 cmd = popenargs[0]
92 cmd = popenargs[0]
93 print cmd, output, error
93 print('{} {} {} '.format(cmd, output, error))
94 raise subprocess32.CalledProcessError(retcode, cmd, output=output)
94 raise subprocess32.CalledProcessError(retcode, cmd, output=output)
95 return output
95 return output
96
96
@@ -125,14 +125,14 b' class TestPerformanceBase(object):'
125 try:
125 try:
126 self.test()
126 self.test()
127 except Exception as error:
127 except Exception as error:
128 print error
128 print(error)
129 finally:
129 finally:
130 self.cleanup()
130 self.cleanup()
131
131
132 print 'Clone time :', self.clone_time
132 print('Clone time :{}'.format(self.clone_time))
133 print 'Push time :', mean(self.push_times)
133 print('Push time :{}'.format(mean(self.push_times)))
134 print 'Pull time :', mean(self.pull_times)
134 print('Pull time :{}'.format(mean(self.pull_times)))
135 print 'Empty pull time:', mean(self.empty_pull_times)
135 print('Empty pull time:{}'.format(mean(self.empty_pull_times)))
136
136
137 return {
137 return {
138 'clone': self.clone_time,
138 'clone': self.clone_time,
@@ -163,10 +163,10 b' class TestPerformanceBase(object):'
163 self.orig_repo, commits[self.skip_commits - 1], 'upstream')
163 self.orig_repo, commits[self.skip_commits - 1], 'upstream')
164 commits = commits[self.skip_commits:self.max_commits]
164 commits = commits[self.skip_commits:self.max_commits]
165
165
166 print 'Working with %d commits' % len(commits)
166 print('Working with %d commits' % len(commits))
167 for i in xrange(self.n_commits - 1, len(commits), self.n_commits):
167 for i in range(self.n_commits - 1, len(commits), self.n_commits):
168 commit = commits[i]
168 commit = commits[i]
169 print 'Processing commit %s (%d)' % (commit, i + 1)
169 print('Processing commit %s (%d)' % (commit, i + 1))
170 self.push_times.append(
170 self.push_times.append(
171 self.push(self.orig_repo, commit, 'upstream'))
171 self.push(self.orig_repo, commit, 'upstream'))
172 self.check_remote_last_commit_is(commit, upstream_url)
172 self.check_remote_last_commit_is(commit, upstream_url)
@@ -402,7 +402,7 b' def main(argv):'
402 '--api-key', dest='api_key', action='store', required=True,
402 '--api-key', dest='api_key', action='store', required=True,
403 help='The api key of RhodeCode')
403 help='The api key of RhodeCode')
404 options = parser.parse_args(argv[1:])
404 options = parser.parse_args(argv[1:])
405 print options
405 print(options)
406
406
407 test_config = {
407 test_config = {
408 'python': {
408 'python': {
@@ -434,8 +434,8 b' def main(argv):'
434 if test_names == ['all']:
434 if test_names == ['all']:
435 test_names = test_config.keys()
435 test_names = test_config.keys()
436 if not set(test_names) <= set(test_config.keys()):
436 if not set(test_names) <= set(test_config.keys()):
437 print ('Invalid tests: only %s are valid but specified %s' %
437 print('Invalid tests: only %s are valid but specified %s' %
438 (test_config.keys(), test_names))
438 (test_config.keys(), test_names))
439 return 1
439 return 1
440
440
441 sizes = options.sizes.split(',')
441 sizes = options.sizes.split(',')
@@ -452,9 +452,9 b' def main(argv):'
452 test_config[test_name]['limit'],
452 test_config[test_name]['limit'],
453 test_config[test_name].get('skip', 0),
453 test_config[test_name].get('skip', 0),
454 api_key)
454 api_key)
455 print '*' * 80
455 print('*' * 80)
456 print 'Running performance test: %s with size %d' % (test_name, size)
456 print('Running performance test: %s with size %d' % (test_name, size))
457 print '*' * 80
457 print('*' * 80)
458 results[test_name][size] = test.run()
458 results[test_name][size] = test.run()
459 pprint.pprint(dict(results))
459 pprint.pprint(dict(results))
460
460
@@ -51,7 +51,7 b' def profile():'
51 try:
51 try:
52 process = psutil.Process(config.pid)
52 process = psutil.Process(config.pid)
53 except psutil.NoSuchProcess:
53 except psutil.NoSuchProcess:
54 print "Process {pid} does not exist!".format(pid=config.pid)
54 print("Process {pid} does not exist!".format(pid=config.pid))
55 sys.exit(1)
55 sys.exit(1)
56
56
57 while True:
57 while True:
@@ -105,7 +105,7 b' def process_stats(process):'
105
105
106 def dump_stats(stats):
106 def dump_stats(stats):
107 for sample in stats:
107 for sample in stats:
108 print json.dumps(sample)
108 print(json.dumps(sample))
109
109
110
110
111 class AppenlightClient():
111 class AppenlightClient():
@@ -43,7 +43,7 b' RC_WEBSITE = "http://localhost:5001/"'
43
43
44 def get_file(prefix):
44 def get_file(prefix):
45 out_file = None
45 out_file = None
46 for i in xrange(100):
46 for i in range(100):
47 file_path = "%s_profile%.3d.csv" % (prefix, i)
47 file_path = "%s_profile%.3d.csv" % (prefix, i)
48 if os.path.exists(file_path):
48 if os.path.exists(file_path):
49 continue
49 continue
@@ -54,15 +54,15 b' def get_file(prefix):'
54
54
55
55
56 def dump_system():
56 def dump_system():
57 print "System Overview..."
57 print("System Overview...")
58 print "\nCPU Count: %d (%d real)" % \
58 print("\nCPU Count: %d (%d real)" %
59 (psutil.cpu_count(), psutil.cpu_count(logical=False))
59 (psutil.cpu_count(), psutil.cpu_count(logical=False)))
60 print "\nDisk:"
60 print("\nDisk:")
61 print psutil.disk_usage(os.sep)
61 print(psutil.disk_usage(os.sep))
62 print "\nMemory:"
62 print("\nMemory:")
63 print psutil.virtual_memory()
63 print(psutil.virtual_memory())
64 print "\nMemory (swap):"
64 print("\nMemory (swap):")
65 print psutil.swap_memory()
65 print(psutil.swap_memory())
66
66
67
67
68 def count_dulwich_fds(proc):
68 def count_dulwich_fds(proc):
@@ -97,30 +97,30 b' def dump_process(pid, out_file):'
97 # Open output files
97 # Open output files
98 vcs_out = get_file("vcs")
98 vcs_out = get_file("vcs")
99 if vcs_out is None:
99 if vcs_out is None:
100 print "Unable to enumerate output file for VCS"
100 print("Unable to enumerate output file for VCS")
101 sys.exit(1)
101 sys.exit(1)
102 rc_out = get_file("rc")
102 rc_out = get_file("rc")
103 if rc_out is None:
103 if rc_out is None:
104 print "Unable to enumerate output file for RC"
104 print("Unable to enumerate output file for RC")
105 sys.exit(1)
105 sys.exit(1)
106
106
107 # Show system information
107 # Show system information
108 dump_system()
108 dump_system()
109
109
110 print "\nStarting VCS..."
110 print("\nStarting VCS...")
111 vcs = psutil.Popen(["vcsserver"])
111 vcs = psutil.Popen(["vcsserver"])
112 time.sleep(1)
112 time.sleep(1)
113 if not vcs.is_running():
113 if not vcs.is_running():
114 print "VCS - Failed to start"
114 print("VCS - Failed to start")
115 sys.exit(1)
115 sys.exit(1)
116 print "VCS - Ok"
116 print("VCS - Ok")
117
117
118 print "\nStarting RhodeCode..."
118 print("\nStarting RhodeCode...")
119 rc = psutil.Popen("RC_VCSSERVER_TEST_DISABLE=1 paster serve test.ini",
119 rc = psutil.Popen("RC_VCSSERVER_TEST_DISABLE=1 paster serve test.ini",
120 shell=True, stdin=subprocess32.PIPE)
120 shell=True, stdin=subprocess32.PIPE)
121 time.sleep(1)
121 time.sleep(1)
122 if not rc.is_running():
122 if not rc.is_running():
123 print "RC - Failed to start"
123 print("RC - Failed to start")
124 vcs.terminate()
124 vcs.terminate()
125 sys.exit(1)
125 sys.exit(1)
126
126
@@ -132,19 +132,19 b' time.sleep(4)'
132 try:
132 try:
133 urllib.urlopen(RC_WEBSITE)
133 urllib.urlopen(RC_WEBSITE)
134 except IOError:
134 except IOError:
135 print "RC - Website not started"
135 print("RC - Website not started")
136 vcs.terminate()
136 vcs.terminate()
137 sys.exit(1)
137 sys.exit(1)
138 print "RC - Ok"
138 print("RC - Ok")
139
139
140 print "\nProfiling...\n%s\n" % ("-"*80)
140 print("\nProfiling...\n%s\n" % ("-"*80))
141 while True:
141 while True:
142 try:
142 try:
143 dump_process(vcs, vcs_out)
143 dump_process(vcs, vcs_out)
144 dump_process(rc, rc_out)
144 dump_process(rc, rc_out)
145 time.sleep(PROFILING_INTERVAL)
145 time.sleep(PROFILING_INTERVAL)
146 except Exception:
146 except Exception:
147 print traceback.format_exc()
147 print(traceback.format_exc())
148 break
148 break
149
149
150 # Finalize the profiling
150 # Finalize the profiling
@@ -56,14 +56,14 b' svn_pages = ['
56
56
57 repeat = 10
57 repeat = 10
58
58
59 print "Repeating each URL x%d\n" % repeat
59 print("Repeating each URL x%d\n" % repeat)
60 for page in pages:
60 for page in pages:
61 url = "http://%s/%s" % (server, page)
61 url = "http://%s/%s" % (server, page)
62 print url
62 print(url)
63
63
64 stmt = "urllib2.urlopen('%s', timeout=120)" % url
64 stmt = "urllib2.urlopen('%s', timeout=120)" % url
65 t = timeit.Timer(stmt=stmt, setup="import urllib2")
65 t = timeit.Timer(stmt=stmt, setup="import urllib2")
66
66
67 result = t.repeat(repeat=repeat, number=1)
67 result = t.repeat(repeat=repeat, number=1)
68 print "\t%.3f (min) - %.3f (max) - %.3f (avg)\n" % \
68 print("\t%.3f (min) - %.3f (max) - %.3f (avg)\n" %
69 (min(result), max(result), sum(result)/len(result))
69 (min(result), max(result), sum(result)/len(result)))
@@ -49,7 +49,7 b' class TestIssueTrackerSettingsModel(obje'
49 model = IssueTrackerSettingsModel()
49 model = IssueTrackerSettingsModel()
50 with pytest.raises(Exception) as exc_info:
50 with pytest.raises(Exception) as exc_info:
51 model.get_repo_settings(cache=True)
51 model.get_repo_settings(cache=True)
52 assert exc_info.value.message == 'Repository is not specified'
52 assert str(exc_info.value) == 'Repository is not specified'
53
53
54 def test_get_repo_settings(self, repo_stub):
54 def test_get_repo_settings(self, repo_stub):
55 model = IssueTrackerSettingsModel(repo=repo_stub.repo_name)
55 model = IssueTrackerSettingsModel(repo=repo_stub.repo_name)
@@ -491,7 +491,7 b' class TestDeleteUiValue(object):'
491 model = SettingsModel()
491 model = SettingsModel()
492 with pytest.raises(SettingNotFound) as exc_info:
492 with pytest.raises(SettingNotFound) as exc_info:
493 model.delete_ui(id_)
493 model.delete_ui(id_)
494 assert exc_info.value.message == 'Setting `{}` is not found'.format(id_)
494 assert str(exc_info.value) == 'Setting `{}` is not found'.format(id_)
495
495
496 def test_delete_ui_when_repo_is_not_set(self, settings_util):
496 def test_delete_ui_when_repo_is_not_set(self, settings_util):
497 model = SettingsModel()
497 model = SettingsModel()
@@ -53,7 +53,7 b' class TestInheritGlobalSettingsProperty('
53 model = VcsSettingsModel()
53 model = VcsSettingsModel()
54 with pytest.raises(Exception) as exc_info:
54 with pytest.raises(Exception) as exc_info:
55 model.inherit_global_settings
55 model.inherit_global_settings
56 assert exc_info.value.message == 'Repository is not specified'
56 assert str(exc_info.value) == 'Repository is not specified'
57
57
58 def test_true_is_returned_when_value_is_not_found(self, repo_stub):
58 def test_true_is_returned_when_value_is_not_found(self, repo_stub):
59 model = VcsSettingsModel(repo=repo_stub.repo_name)
59 model = VcsSettingsModel(repo=repo_stub.repo_name)
@@ -81,7 +81,7 b' class TestInheritGlobalSettingsProperty('
81 model = VcsSettingsModel()
81 model = VcsSettingsModel()
82 with pytest.raises(Exception) as exc_info:
82 with pytest.raises(Exception) as exc_info:
83 model.inherit_global_settings = False
83 model.inherit_global_settings = False
84 assert exc_info.value.message == 'Repository is not specified'
84 assert str(exc_info.value) == 'Repository is not specified'
85
85
86
86
87 class TestVcsSettingsModel(object):
87 class TestVcsSettingsModel(object):
@@ -114,7 +114,7 b' class TestVcsSettingsModel(object):'
114 model = VcsSettingsModel()
114 model = VcsSettingsModel()
115 with pytest.raises(Exception) as exc_info:
115 with pytest.raises(Exception) as exc_info:
116 model.get_repo_svn_branch_patterns()
116 model.get_repo_svn_branch_patterns()
117 assert exc_info.value.message == 'Repository is not specified'
117 assert str(exc_info.value) == 'Repository is not specified'
118
118
119 def test_global_svn_tag_patterns(self):
119 def test_global_svn_tag_patterns(self):
120 model = VcsSettingsModel()
120 model = VcsSettingsModel()
@@ -144,7 +144,7 b' class TestVcsSettingsModel(object):'
144 model = VcsSettingsModel()
144 model = VcsSettingsModel()
145 with pytest.raises(Exception) as exc_info:
145 with pytest.raises(Exception) as exc_info:
146 model.get_repo_svn_tag_patterns()
146 model.get_repo_svn_tag_patterns()
147 assert exc_info.value.message == 'Repository is not specified'
147 assert str(exc_info.value) == 'Repository is not specified'
148
148
149 def test_get_global_settings(self):
149 def test_get_global_settings(self):
150 expected_result = {'test': 'test'}
150 expected_result = {'test': 'test'}
@@ -277,9 +277,8 b' class TestCreateOrUpdateRepoHookSettings'
277
277
278 with pytest.raises(ValueError) as exc_info:
278 with pytest.raises(ValueError) as exc_info:
279 model.create_or_update_repo_hook_settings(data)
279 model.create_or_update_repo_hook_settings(data)
280 assert (
280 msg = 'The given data does not contain {} key'.format(deleted_key)
281 exc_info.value.message ==
281 assert str(exc_info.value) == msg
282 'The given data does not contain {} key'.format(deleted_key))
283
282
284 def test_update_when_repo_object_found(self, repo_stub, settings_util):
283 def test_update_when_repo_object_found(self, repo_stub, settings_util):
285 model = VcsSettingsModel(repo=repo_stub.repo_name)
284 model = VcsSettingsModel(repo=repo_stub.repo_name)
@@ -310,9 +309,8 b' class TestUpdateGlobalHookSettings(objec'
310
309
311 with pytest.raises(ValueError) as exc_info:
310 with pytest.raises(ValueError) as exc_info:
312 model.update_global_hook_settings(data)
311 model.update_global_hook_settings(data)
313 assert (
312 msg = 'The given data does not contain {} key'.format(deleted_key)
314 exc_info.value.message ==
313 assert str(exc_info.value) == msg
315 'The given data does not contain {} key'.format(deleted_key))
316
314
317 def test_update_global_hook_settings(self, settings_util):
315 def test_update_global_hook_settings(self, settings_util):
318 model = VcsSettingsModel()
316 model = VcsSettingsModel()
@@ -342,7 +340,7 b' class TestCreateOrUpdateRepoGeneralSetti'
342 model = VcsSettingsModel()
340 model = VcsSettingsModel()
343 with pytest.raises(Exception) as exc_info:
341 with pytest.raises(Exception) as exc_info:
344 model.create_or_update_repo_pr_settings(GENERAL_FORM_DATA)
342 model.create_or_update_repo_pr_settings(GENERAL_FORM_DATA)
345 assert exc_info.value.message == 'Repository is not specified'
343 assert str(exc_info.value) == 'Repository is not specified'
346
344
347
345
348 class TestCreateOrUpdatGlobalGeneralSettings(object):
346 class TestCreateOrUpdatGlobalGeneralSettings(object):
@@ -382,9 +380,9 b' class TestCreateOrUpdateGeneralSettings('
382
380
383 with pytest.raises(ValueError) as exc_info:
381 with pytest.raises(ValueError) as exc_info:
384 model._create_or_update_general_settings(model.repo_settings, data)
382 model._create_or_update_general_settings(model.repo_settings, data)
385 assert (
383
386 exc_info.value.message ==
384 msg = 'The given data does not contain {} key'.format(deleted_key)
387 'The given data does not contain {} key'.format(deleted_key))
385 assert str(exc_info.value) == msg
388
386
389 def test_update_when_repo_setting_found(self, repo_stub, settings_util):
387 def test_update_when_repo_setting_found(self, repo_stub, settings_util):
390 model = VcsSettingsModel(repo=repo_stub.repo_name)
388 model = VcsSettingsModel(repo=repo_stub.repo_name)
@@ -411,7 +409,7 b' class TestCreateRepoSvnSettings(object):'
411 model = VcsSettingsModel()
409 model = VcsSettingsModel()
412 with pytest.raises(Exception) as exc_info:
410 with pytest.raises(Exception) as exc_info:
413 model.create_repo_svn_settings(SVN_FORM_DATA)
411 model.create_repo_svn_settings(SVN_FORM_DATA)
414 assert exc_info.value.message == 'Repository is not specified'
412 assert str(exc_info.value) == 'Repository is not specified'
415
413
416
414
417 class TestCreateSvnSettings(object):
415 class TestCreateSvnSettings(object):
@@ -550,13 +548,13 b' class TestCreateOrUpdateRepoHgSettings(o'
550 model.create_or_update_repo_hg_settings(data)
548 model.create_or_update_repo_hg_settings(data)
551 expected_message = 'The given data does not contain {} key'.format(
549 expected_message = 'The given data does not contain {} key'.format(
552 field_to_remove)
550 field_to_remove)
553 assert exc_info.value.message == expected_message
551 assert str(exc_info.value) == expected_message
554
552
555 def test_create_raises_exception_when_repository_not_specified(self):
553 def test_create_raises_exception_when_repository_not_specified(self):
556 model = VcsSettingsModel()
554 model = VcsSettingsModel()
557 with pytest.raises(Exception) as exc_info:
555 with pytest.raises(Exception) as exc_info:
558 model.create_or_update_repo_hg_settings(self.FORM_DATA)
556 model.create_or_update_repo_hg_settings(self.FORM_DATA)
559 assert exc_info.value.message == 'Repository is not specified'
557 assert str(exc_info.value) == 'Repository is not specified'
560
558
561
559
562 class TestUpdateGlobalSslSetting(object):
560 class TestUpdateGlobalSslSetting(object):
@@ -613,7 +611,7 b' class TestCreateOrUpdateGlobalHgSettings'
613 model.create_or_update_global_hg_settings(data)
611 model.create_or_update_global_hg_settings(data)
614 expected_message = 'The given data does not contain {} key'.format(
612 expected_message = 'The given data does not contain {} key'.format(
615 field_to_remove)
613 field_to_remove)
616 assert exc_info.value.message == expected_message
614 assert str(exc_info.value) == expected_message
617
615
618
616
619 class TestCreateOrUpdateGlobalGitSettings(object):
617 class TestCreateOrUpdateGlobalGitSettings(object):
@@ -659,7 +657,7 b' class TestDeleteRepoSvnPattern(object):'
659 model = VcsSettingsModel()
657 model = VcsSettingsModel()
660 with pytest.raises(Exception) as exc_info:
658 with pytest.raises(Exception) as exc_info:
661 model.delete_repo_svn_pattern(123)
659 model.delete_repo_svn_pattern(123)
662 assert exc_info.value.message == 'Repository is not specified'
660 assert str(exc_info.value) == 'Repository is not specified'
663
661
664
662
665 class TestDeleteGlobalSvnPattern(object):
663 class TestDeleteGlobalSvnPattern(object):
@@ -783,7 +781,7 b' class TestGetRepoUiSettings(object):'
783 model = VcsSettingsModel()
781 model = VcsSettingsModel()
784 with pytest.raises(Exception) as exc_info:
782 with pytest.raises(Exception) as exc_info:
785 model.get_repo_ui_settings()
783 model.get_repo_ui_settings()
786 assert exc_info.value.message == 'Repository is not specified'
784 assert str(exc_info.value) == 'Repository is not specified'
787
785
788
786
789 class TestGetRepoGeneralSettings(object):
787 class TestGetRepoGeneralSettings(object):
@@ -809,7 +807,7 b' class TestGetRepoGeneralSettings(object)'
809 model = VcsSettingsModel()
807 model = VcsSettingsModel()
810 with pytest.raises(Exception) as exc_info:
808 with pytest.raises(Exception) as exc_info:
811 model.get_repo_general_settings()
809 model.get_repo_general_settings()
812 assert exc_info.value.message == 'Repository is not specified'
810 assert str(exc_info.value) == 'Repository is not specified'
813
811
814
812
815 class TestGetGlobalGeneralSettings(object):
813 class TestGetGlobalGeneralSettings(object):
@@ -994,7 +992,7 b' class TestCreateOrUpdateRepoSettings(obj'
994 model = VcsSettingsModel()
992 model = VcsSettingsModel()
995 with pytest.raises(Exception) as exc_info:
993 with pytest.raises(Exception) as exc_info:
996 model.create_or_update_repo_settings(data=self.FORM_DATA)
994 model.create_or_update_repo_settings(data=self.FORM_DATA)
997 assert exc_info.value.message == 'Repository is not specified'
995 assert str(exc_info.value) == 'Repository is not specified'
998
996
999 def test_only_svn_settings_are_updated_when_type_is_svn(self, backend_svn):
997 def test_only_svn_settings_are_updated_when_type_is_svn(self, backend_svn):
1000 repo = backend_svn.create_repo()
998 repo = backend_svn.create_repo()
@@ -373,7 +373,8 b' class TestPullRequestModel(object):'
373 source_ref_id = pull_request.source_ref_parts.commit_id
373 source_ref_id = pull_request.source_ref_parts.commit_id
374 target_ref_id = pull_request.target_ref_parts.commit_id
374 target_ref_id = pull_request.target_ref_parts.commit_id
375 diff = PullRequestModel()._get_diff_from_pr_or_version(
375 diff = PullRequestModel()._get_diff_from_pr_or_version(
376 source_repo, source_ref_id, target_ref_id, context=6)
376 source_repo, source_ref_id, target_ref_id,
377 hide_whitespace_changes=False, diff_context=6)
377 assert 'file_1' in diff.raw
378 assert 'file_1' in diff.raw
378
379
379 def test_generate_title_returns_unicode(self):
380 def test_generate_title_returns_unicode(self):
@@ -393,6 +394,7 b' class TestIntegrationMerge(object):'
393 def test_merge_triggers_push_hooks(
394 def test_merge_triggers_push_hooks(
394 self, pr_util, user_admin, capture_rcextensions, merge_extras,
395 self, pr_util, user_admin, capture_rcextensions, merge_extras,
395 extra_config):
396 extra_config):
397
396 pull_request = pr_util.create_pull_request(
398 pull_request = pr_util.create_pull_request(
397 approved=True, mergeable=True)
399 approved=True, mergeable=True)
398 # TODO: johbo: Needed for sqlite, try to find an automatic way for it
400 # TODO: johbo: Needed for sqlite, try to find an automatic way for it
@@ -404,8 +406,8 b' class TestIntegrationMerge(object):'
404 pull_request, user_admin, extras=merge_extras)
406 pull_request, user_admin, extras=merge_extras)
405
407
406 assert merge_state.executed
408 assert merge_state.executed
407 assert 'pre_push' in capture_rcextensions
409 assert '_pre_push_hook' in capture_rcextensions
408 assert 'post_push' in capture_rcextensions
410 assert '_push_hook' in capture_rcextensions
409
411
410 def test_merge_can_be_rejected_by_pre_push_hook(
412 def test_merge_can_be_rejected_by_pre_push_hook(
411 self, pr_util, user_admin, capture_rcextensions, merge_extras):
413 self, pr_util, user_admin, capture_rcextensions, merge_extras):
@@ -471,6 +473,7 b' def merge_extras(user_regular):'
471 'repository': 'fake_target_repo_name',
473 'repository': 'fake_target_repo_name',
472 'scm': 'git',
474 'scm': 'git',
473 'config': 'fake_config_ini_path',
475 'config': 'fake_config_ini_path',
476 'repo_store': '',
474 'make_lock': None,
477 'make_lock': None,
475 'locked_by': [None, None, None],
478 'locked_by': [None, None, None],
476 'server_url': 'http://test.example.com:5000',
479 'server_url': 'http://test.example.com:5000',
@@ -60,7 +60,8 b' class TestGetDiffForPrOrVersion(object):'
60 source_ref_id = pr_or_version.source_ref_parts.commit_id
60 source_ref_id = pr_or_version.source_ref_parts.commit_id
61 target_ref_id = pr_or_version.target_ref_parts.commit_id
61 target_ref_id = pr_or_version.target_ref_parts.commit_id
62 diff = PullRequestModel()._get_diff_from_pr_or_version(
62 diff = PullRequestModel()._get_diff_from_pr_or_version(
63 source_repo, source_ref_id, target_ref_id, context=6)
63 source_repo, source_ref_id, target_ref_id,
64 hide_whitespace_changes=False, diff_context=6)
64 assert 'file_b' in diff.raw
65 assert 'file_b' in diff.raw
65
66
66 def assert_commit_cannot_be_accessed(
67 def assert_commit_cannot_be_accessed(
@@ -106,7 +106,7 b' def test_strip_with_multiple_heads(backe'
106 model.strip(repo, commit_ids['b'], branch=None)
106 model.strip(repo, commit_ids['b'], branch=None)
107
107
108 vcs_repo = repo.scm_instance()
108 vcs_repo = repo.scm_instance()
109 rest_commit_ids = [c.raw_id for c in vcs_repo.get_changesets()]
109 rest_commit_ids = [c.raw_id for c in vcs_repo.get_commits()]
110 assert len(rest_commit_ids) == 4
110 assert len(rest_commit_ids) == 4
111 assert commit_ids['b'] not in rest_commit_ids
111 assert commit_ids['b'] not in rest_commit_ids
112
112
@@ -124,7 +124,7 b' def test_strip_with_single_heads(backend'
124 model.strip(repo, commit_ids['b'], branch=None)
124 model.strip(repo, commit_ids['b'], branch=None)
125
125
126 vcs_repo = repo.scm_instance()
126 vcs_repo = repo.scm_instance()
127 rest_commit_ids = [c.raw_id for c in vcs_repo.get_changesets()]
127 rest_commit_ids = [c.raw_id for c in vcs_repo.get_commits()]
128 assert len(rest_commit_ids) == 2
128 assert len(rest_commit_ids) == 2
129 assert commit_ids['b'] not in rest_commit_ids
129 assert commit_ids['b'] not in rest_commit_ids
130
130
@@ -139,7 +139,7 b' def get_backends_from_metafunc(metafunc)'
139 if hasattr(metafunc.function, 'backends'):
139 if hasattr(metafunc.function, 'backends'):
140 # Supported backends by this test function, created from
140 # Supported backends by this test function, created from
141 # pytest.mark.backends
141 # pytest.mark.backends
142 backends = metafunc.function.backends.args
142 backends = metafunc.definition.get_closest_marker('backends').args
143 elif hasattr(metafunc.cls, 'backend_alias'):
143 elif hasattr(metafunc.cls, 'backend_alias'):
144 # Support class attribute "backend_alias", this is mainly
144 # Support class attribute "backend_alias", this is mainly
145 # for legacy reasons for tests not yet using pytest.mark.backends
145 # for legacy reasons for tests not yet using pytest.mark.backends
@@ -154,10 +154,11 b' def activate_example_rcextensions(reques'
154 """
154 """
155 Patch in an example rcextensions module which verifies passed in kwargs.
155 Patch in an example rcextensions module which verifies passed in kwargs.
156 """
156 """
157 from rhodecode.tests.other import example_rcextensions
157 from rhodecode.config import rcextensions
158
158
159 old_extensions = rhodecode.EXTENSIONS
159 old_extensions = rhodecode.EXTENSIONS
160 rhodecode.EXTENSIONS = example_rcextensions
160 rhodecode.EXTENSIONS = rcextensions
161 rhodecode.EXTENSIONS.calls = collections.defaultdict(list)
161
162
162 @request.addfinalizer
163 @request.addfinalizer
163 def cleanup():
164 def cleanup():
@@ -182,8 +183,14 b' def http_environ_session():'
182 """
183 """
183 Allow to use "http_environ" in session scope.
184 Allow to use "http_environ" in session scope.
184 """
185 """
185 return http_environ(
186 return plain_http_environ()
186 http_host_stub=http_host_stub())
187
188
189 def plain_http_host_stub():
190 """
191 Value of HTTP_HOST in the test run.
192 """
193 return 'example.com:80'
187
194
188
195
189 @pytest.fixture
196 @pytest.fixture
@@ -191,7 +198,14 b' def http_host_stub():'
191 """
198 """
192 Value of HTTP_HOST in the test run.
199 Value of HTTP_HOST in the test run.
193 """
200 """
194 return 'example.com:80'
201 return plain_http_host_stub()
202
203
204 def plain_http_host_only_stub():
205 """
206 Value of HTTP_HOST in the test run.
207 """
208 return plain_http_host_stub().split(':')[0]
195
209
196
210
197 @pytest.fixture
211 @pytest.fixture
@@ -199,11 +213,10 b' def http_host_only_stub():'
199 """
213 """
200 Value of HTTP_HOST in the test run.
214 Value of HTTP_HOST in the test run.
201 """
215 """
202 return http_host_stub().split(':')[0]
216 return plain_http_host_only_stub()
203
217
204
218
205 @pytest.fixture
219 def plain_http_environ():
206 def http_environ(http_host_stub):
207 """
220 """
208 HTTP extra environ keys.
221 HTTP extra environ keys.
209
222
@@ -212,14 +225,26 b' def http_environ(http_host_stub):'
212 to override this for a specific test case.
225 to override this for a specific test case.
213 """
226 """
214 return {
227 return {
215 'SERVER_NAME': http_host_only_stub(),
228 'SERVER_NAME': plain_http_host_only_stub(),
216 'SERVER_PORT': http_host_stub.split(':')[1],
229 'SERVER_PORT': plain_http_host_stub().split(':')[1],
217 'HTTP_HOST': http_host_stub,
230 'HTTP_HOST': plain_http_host_stub(),
218 'HTTP_USER_AGENT': 'rc-test-agent',
231 'HTTP_USER_AGENT': 'rc-test-agent',
219 'REQUEST_METHOD': 'GET'
232 'REQUEST_METHOD': 'GET'
220 }
233 }
221
234
222
235
236 @pytest.fixture
237 def http_environ():
238 """
239 HTTP extra environ keys.
240
241 User by the test application and as well for setting up the pylons
242 environment. In the case of the fixture "app" it should be possible
243 to override this for a specific test case.
244 """
245 return plain_http_environ()
246
247
223 @pytest.fixture(scope='session')
248 @pytest.fixture(scope='session')
224 def baseapp(ini_config, vcsserver, http_environ_session):
249 def baseapp(ini_config, vcsserver, http_environ_session):
225 from rhodecode.lib.pyramid_utils import get_app_config
250 from rhodecode.lib.pyramid_utils import get_app_config
@@ -423,18 +448,7 b' class TestRepoContainer(object):'
423 self._fixture.destroy_repo(repo_name)
448 self._fixture.destroy_repo(repo_name)
424
449
425
450
426 @pytest.fixture
451 def backend_base(request, backend_alias, baseapp, test_repo):
427 def backend(request, backend_alias, baseapp, test_repo):
428 """
429 Parametrized fixture which represents a single backend implementation.
430
431 It respects the option `--backends` to focus the test run on specific
432 backend implementations.
433
434 It also supports `pytest.mark.xfail_backends` to mark tests as failing
435 for specific backends. This is intended as a utility for incremental
436 development of a new backend implementation.
437 """
438 if backend_alias not in request.config.getoption('--backends'):
452 if backend_alias not in request.config.getoption('--backends'):
439 pytest.skip("Backend %s not selected." % (backend_alias, ))
453 pytest.skip("Backend %s not selected." % (backend_alias, ))
440
454
@@ -452,18 +466,33 b' def backend(request, backend_alias, base'
452
466
453
467
454 @pytest.fixture
468 @pytest.fixture
469 def backend(request, backend_alias, baseapp, test_repo):
470 """
471 Parametrized fixture which represents a single backend implementation.
472
473 It respects the option `--backends` to focus the test run on specific
474 backend implementations.
475
476 It also supports `pytest.mark.xfail_backends` to mark tests as failing
477 for specific backends. This is intended as a utility for incremental
478 development of a new backend implementation.
479 """
480 return backend_base(request, backend_alias, baseapp, test_repo)
481
482
483 @pytest.fixture
455 def backend_git(request, baseapp, test_repo):
484 def backend_git(request, baseapp, test_repo):
456 return backend(request, 'git', baseapp, test_repo)
485 return backend_base(request, 'git', baseapp, test_repo)
457
486
458
487
459 @pytest.fixture
488 @pytest.fixture
460 def backend_hg(request, baseapp, test_repo):
489 def backend_hg(request, baseapp, test_repo):
461 return backend(request, 'hg', baseapp, test_repo)
490 return backend_base(request, 'hg', baseapp, test_repo)
462
491
463
492
464 @pytest.fixture
493 @pytest.fixture
465 def backend_svn(request, baseapp, test_repo):
494 def backend_svn(request, baseapp, test_repo):
466 return backend(request, 'svn', baseapp, test_repo)
495 return backend_base(request, 'svn', baseapp, test_repo)
467
496
468
497
469 @pytest.fixture
498 @pytest.fixture
@@ -581,7 +610,7 b' class Backend(object):'
581
610
582 def create_repo(
611 def create_repo(
583 self, commits=None, number_of_commits=0, heads=None,
612 self, commits=None, number_of_commits=0, heads=None,
584 name_suffix=u'', **kwargs):
613 name_suffix=u'', bare=False, **kwargs):
585 """
614 """
586 Create a repository and record it for later cleanup.
615 Create a repository and record it for later cleanup.
587
616
@@ -591,16 +620,17 b' class Backend(object):'
591 commits will be added to the new repository.
620 commits will be added to the new repository.
592 :param heads: Optional. Can be set to a sequence of of commit
621 :param heads: Optional. Can be set to a sequence of of commit
593 names which shall be pulled in from the master repository.
622 names which shall be pulled in from the master repository.
594
623 :param name_suffix: adds special suffix to generated repo name
624 :param bare: set a repo as bare (no checkout)
595 """
625 """
596 self.repo_name = self._next_repo_name() + name_suffix
626 self.repo_name = self._next_repo_name() + name_suffix
597 repo = self._fixture.create_repo(
627 repo = self._fixture.create_repo(
598 self.repo_name, repo_type=self.alias, **kwargs)
628 self.repo_name, repo_type=self.alias, bare=bare, **kwargs)
599 self._cleanup_repos.append(repo.repo_name)
629 self._cleanup_repos.append(repo.repo_name)
600
630
601 commits = commits or [
631 commits = commits or [
602 {'message': 'Commit %s of %s' % (x, self.repo_name)}
632 {'message': 'Commit %s of %s' % (x, self.repo_name)}
603 for x in xrange(number_of_commits)]
633 for x in range(number_of_commits)]
604 self._add_commits_to_repo(repo.scm_instance(), commits)
634 self._add_commits_to_repo(repo.scm_instance(), commits)
605 if heads:
635 if heads:
606 self.pull_heads(repo, heads)
636 self.pull_heads(repo, heads)
@@ -674,17 +704,7 b' class Backend(object):'
674 repo.set_refs(ref_name, refs[ref_name])
704 repo.set_refs(ref_name, refs[ref_name])
675
705
676
706
677 @pytest.fixture
707 def vcsbackend_base(request, backend_alias, tests_tmp_path, baseapp, test_repo):
678 def vcsbackend(request, backend_alias, tests_tmp_path, baseapp, test_repo):
679 """
680 Parametrized fixture which represents a single vcs backend implementation.
681
682 See the fixture `backend` for more details. This one implements the same
683 concept, but on vcs level. So it does not provide model instances etc.
684
685 Parameters are generated dynamically, see :func:`pytest_generate_tests`
686 for how this works.
687 """
688 if backend_alias not in request.config.getoption('--backends'):
708 if backend_alias not in request.config.getoption('--backends'):
689 pytest.skip("Backend %s not selected." % (backend_alias, ))
709 pytest.skip("Backend %s not selected." % (backend_alias, ))
690
710
@@ -703,31 +723,32 b' def vcsbackend(request, backend_alias, t'
703
723
704
724
705 @pytest.fixture
725 @pytest.fixture
726 def vcsbackend(request, backend_alias, tests_tmp_path, baseapp, test_repo):
727 """
728 Parametrized fixture which represents a single vcs backend implementation.
729
730 See the fixture `backend` for more details. This one implements the same
731 concept, but on vcs level. So it does not provide model instances etc.
732
733 Parameters are generated dynamically, see :func:`pytest_generate_tests`
734 for how this works.
735 """
736 return vcsbackend_base(request, backend_alias, tests_tmp_path, baseapp, test_repo)
737
738
739 @pytest.fixture
706 def vcsbackend_git(request, tests_tmp_path, baseapp, test_repo):
740 def vcsbackend_git(request, tests_tmp_path, baseapp, test_repo):
707 return vcsbackend(request, 'git', tests_tmp_path, baseapp, test_repo)
741 return vcsbackend_base(request, 'git', tests_tmp_path, baseapp, test_repo)
708
742
709
743
710 @pytest.fixture
744 @pytest.fixture
711 def vcsbackend_hg(request, tests_tmp_path, baseapp, test_repo):
745 def vcsbackend_hg(request, tests_tmp_path, baseapp, test_repo):
712 return vcsbackend(request, 'hg', tests_tmp_path, baseapp, test_repo)
746 return vcsbackend_base(request, 'hg', tests_tmp_path, baseapp, test_repo)
713
747
714
748
715 @pytest.fixture
749 @pytest.fixture
716 def vcsbackend_svn(request, tests_tmp_path, baseapp, test_repo):
750 def vcsbackend_svn(request, tests_tmp_path, baseapp, test_repo):
717 return vcsbackend(request, 'svn', tests_tmp_path, baseapp, test_repo)
751 return vcsbackend_base(request, 'svn', tests_tmp_path, baseapp, test_repo)
718
719
720 @pytest.fixture
721 def vcsbackend_random(vcsbackend_git):
722 """
723 Use this to express that your tests need "a vcsbackend".
724
725 The fixture `vcsbackend` would run the test multiple times for each
726 available vcs backend which is a pure waste of time if the test is
727 independent of the vcs backend type.
728 """
729 # TODO: johbo: Change this to pick a random backend
730 return vcsbackend_git
731
752
732
753
733 @pytest.fixture
754 @pytest.fixture
@@ -773,14 +794,15 b' class VcsBackend(object):'
773 """
794 """
774 return get_backend(self.alias)
795 return get_backend(self.alias)
775
796
776 def create_repo(self, commits=None, number_of_commits=0, _clone_repo=None):
797 def create_repo(self, commits=None, number_of_commits=0, _clone_repo=None,
798 bare=False):
777 repo_name = self._next_repo_name()
799 repo_name = self._next_repo_name()
778 self._repo_path = get_new_dir(repo_name)
800 self._repo_path = get_new_dir(repo_name)
779 repo_class = get_backend(self.alias)
801 repo_class = get_backend(self.alias)
780 src_url = None
802 src_url = None
781 if _clone_repo:
803 if _clone_repo:
782 src_url = _clone_repo.path
804 src_url = _clone_repo.path
783 repo = repo_class(self._repo_path, create=True, src_url=src_url)
805 repo = repo_class(self._repo_path, create=True, src_url=src_url, bare=bare)
784 self._cleanup_repos.append(repo)
806 self._cleanup_repos.append(repo)
785
807
786 commits = commits or [
808 commits = commits or [
@@ -1158,13 +1180,13 b' class UserUtility(object):'
1158 return repo_group
1180 return repo_group
1159
1181
1160 def create_repo(self, owner=TEST_USER_ADMIN_LOGIN, parent=None,
1182 def create_repo(self, owner=TEST_USER_ADMIN_LOGIN, parent=None,
1161 auto_cleanup=True, repo_type='hg'):
1183 auto_cleanup=True, repo_type='hg', bare=False):
1162 repo_name = "{prefix}_repository_{count}".format(
1184 repo_name = "{prefix}_repository_{count}".format(
1163 prefix=self._test_name,
1185 prefix=self._test_name,
1164 count=len(self.repos_ids))
1186 count=len(self.repos_ids))
1165
1187
1166 repository = self.fixture.create_repo(
1188 repository = self.fixture.create_repo(
1167 repo_name, cur_user=owner, repo_group=parent, repo_type=repo_type)
1189 repo_name, cur_user=owner, repo_group=parent, repo_type=repo_type, bare=bare)
1168 if auto_cleanup:
1190 if auto_cleanup:
1169 self.repos_ids.append(repository.repo_id)
1191 self.repos_ids.append(repository.repo_id)
1170 return repository
1192 return repository
@@ -25,21 +25,12 b' debug = true'
25 ## note: using appenlight for error handling doesn't need this to be uncommented
25 ## note: using appenlight for error handling doesn't need this to be uncommented
26 #email_to = admin@localhost
26 #email_to = admin@localhost
27
27
28 ## in case of Application errors, sent an error email form
29 #error_email_from = rhodecode_error@localhost
30
31 ## additional error message to be send in case of server crash
32 #error_message =
33
34
35 #smtp_server = mail.server.com
28 #smtp_server = mail.server.com
36 #smtp_username =
29 #smtp_username =
37 #smtp_password =
30 #smtp_password =
38 #smtp_port =
31 #smtp_port =
39 #smtp_use_tls = false
32 #smtp_use_tls = false
40 #smtp_use_ssl = true
33 #smtp_use_ssl = true
41 ## Specify available auth parameters here (e.g. LOGIN PLAIN CRAM-MD5, etc.)
42 #smtp_auth =
43
34
44 [server:main]
35 [server:main]
45 ## COMMON ##
36 ## COMMON ##
@@ -61,7 +61,7 b' class Command(object):'
61 """
61 """
62
62
63 command = cmd + ' ' + ' '.join(args)
63 command = cmd + ' ' + ' '.join(args)
64 log.debug('Executing %s' % command)
64 log.debug('Executing %s', command)
65 if DEBUG:
65 if DEBUG:
66 print(command)
66 print(command)
67 p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd)
67 p = Popen(command, shell=True, stdout=PIPE, stderr=PIPE, cwd=self.cwd)
@@ -56,7 +56,7 b' if len(sys.argv) == 2:'
56 if not BASE_URI.endswith('/'):
56 if not BASE_URI.endswith('/'):
57 BASE_URI += '/'
57 BASE_URI += '/'
58
58
59 print 'Crawling @ %s' % BASE_URI
59 print('Crawling @ %s' % BASE_URI)
60 BASE_URI += '%s'
60 BASE_URI += '%s'
61 PROJECT_PATH = jn('/', 'home', 'marcink', 'repos')
61 PROJECT_PATH = jn('/', 'home', 'marcink', 'repos')
62 PROJECTS = [
62 PROJECTS = [
@@ -104,16 +104,16 b' def test_changelog_walk(proj, pages=100)'
104 size = len(f.read())
104 size = len(f.read())
105 e = time.time() - s
105 e = time.time() - s
106 total_time += e
106 total_time += e
107 print 'visited %s size:%s req:%s ms' % (full_uri, size, e)
107 print('visited %s size:%s req:%s ms' % (full_uri, size, e))
108
108
109 print 'total_time', total_time
109 print('total_time {}'.format(total_time))
110 print 'average on req', total_time / float(pages)
110 print('average on req {}'.format(total_time / float(pages)))
111
111
112
112
113 def test_commit_walk(proj, limit=None):
113 def test_commit_walk(proj, limit=None):
114 repo, proj = _get_repo(proj)
114 repo, proj = _get_repo(proj)
115
115
116 print 'processing', jn(PROJECT_PATH, proj)
116 print('processing', jn(PROJECT_PATH, proj))
117 total_time = 0
117 total_time = 0
118
118
119 cnt = 0
119 cnt = 0
@@ -124,22 +124,22 b' def test_commit_walk(proj, limit=None):'
124 break
124 break
125
125
126 full_uri = (BASE_URI % raw_cs)
126 full_uri = (BASE_URI % raw_cs)
127 print '%s visiting %s\%s' % (cnt, full_uri, i)
127 print('%s visiting %s\%s' % (cnt, full_uri, i))
128 s = time.time()
128 s = time.time()
129 f = o.open(full_uri)
129 f = o.open(full_uri)
130 size = len(f.read())
130 size = len(f.read())
131 e = time.time() - s
131 e = time.time() - s
132 total_time += e
132 total_time += e
133 print '%s visited %s\%s size:%s req:%s ms' % (cnt, full_uri, i, size, e)
133 print('%s visited %s\%s size:%s req:%s ms' % (cnt, full_uri, i, size, e))
134
134
135 print 'total_time', total_time
135 print('total_time {}'.format(total_time))
136 print 'average on req', total_time / float(cnt)
136 print('average on req {}'.format(total_time / float(cnt)))
137
137
138
138
139 def test_files_walk(proj, limit=100):
139 def test_files_walk(proj, limit=100):
140 repo, proj = _get_repo(proj)
140 repo, proj = _get_repo(proj)
141
141
142 print 'processing', jn(PROJECT_PATH, proj)
142 print('processing {}'.format(jn(PROJECT_PATH, proj)))
143 total_time = 0
143 total_time = 0
144
144
145 paths_ = OrderedSet([''])
145 paths_ = OrderedSet([''])
@@ -166,22 +166,22 b' def test_files_walk(proj, limit=100):'
166
166
167 file_path = '/'.join((proj, 'files', 'tip', f))
167 file_path = '/'.join((proj, 'files', 'tip', f))
168 full_uri = (BASE_URI % file_path)
168 full_uri = (BASE_URI % file_path)
169 print '%s visiting %s' % (cnt, full_uri)
169 print('%s visiting %s' % (cnt, full_uri))
170 s = time.time()
170 s = time.time()
171 f = o.open(full_uri)
171 f = o.open(full_uri)
172 size = len(f.read())
172 size = len(f.read())
173 e = time.time() - s
173 e = time.time() - s
174 total_time += e
174 total_time += e
175 print '%s visited OK size:%s req:%s ms' % (cnt, size, e)
175 print('%s visited OK size:%s req:%s ms' % (cnt, size, e))
176
176
177 print 'total_time', total_time
177 print('total_time {}'.format(total_time))
178 print 'average on req', total_time / float(cnt)
178 print('average on req {}'.format(total_time / float(cnt)))
179
179
180 if __name__ == '__main__':
180 if __name__ == '__main__':
181 for path in PROJECTS:
181 for path in PROJECTS:
182 repo = vcs.get_repo(jn(PROJECT_PATH, path))
182 repo = vcs.get_repo(jn(PROJECT_PATH, path))
183 for i in range(PASES):
183 for i in range(PASES):
184 print 'PASS %s/%s' % (i, PASES)
184 print('PASS %s/%s' % (i, PASES))
185 test_changelog_walk(repo, pages=80)
185 test_changelog_walk(repo, pages=80)
186 test_commit_walk(repo, limit=100)
186 test_commit_walk(repo, limit=100)
187 test_files_walk(repo, limit=100)
187 test_files_walk(repo, limit=100)
@@ -156,7 +156,7 b' def set_anonymous_access(enabled):'
156 def check_xfail_backends(node, backend_alias):
156 def check_xfail_backends(node, backend_alias):
157 # Using "xfail_backends" here intentionally, since this marks work
157 # Using "xfail_backends" here intentionally, since this marks work
158 # which is "to be done" soon.
158 # which is "to be done" soon.
159 skip_marker = node.get_marker('xfail_backends')
159 skip_marker = node.get_closest_marker('xfail_backends')
160 if skip_marker and backend_alias in skip_marker.args:
160 if skip_marker and backend_alias in skip_marker.args:
161 msg = "Support for backend %s to be developed." % (backend_alias, )
161 msg = "Support for backend %s to be developed." % (backend_alias, )
162 msg = skip_marker.kwargs.get('reason', msg)
162 msg = skip_marker.kwargs.get('reason', msg)
@@ -166,7 +166,7 b' def check_xfail_backends(node, backend_a'
166 def check_skip_backends(node, backend_alias):
166 def check_skip_backends(node, backend_alias):
167 # Using "skip_backends" here intentionally, since this marks work which is
167 # Using "skip_backends" here intentionally, since this marks work which is
168 # not supported.
168 # not supported.
169 skip_marker = node.get_marker('skip_backends')
169 skip_marker = node.get_closest_marker('skip_backends')
170 if skip_marker and backend_alias in skip_marker.args:
170 if skip_marker and backend_alias in skip_marker.args:
171 msg = "Feature not supported for backend %s." % (backend_alias, )
171 msg = "Feature not supported for backend %s." % (backend_alias, )
172 msg = skip_marker.kwargs.get('reason', msg)
172 msg = skip_marker.kwargs.get('reason', msg)
@@ -94,7 +94,7 b' class TestGitRepository:'
94 repo = GitRepository(TEST_GIT_REPO)
94 repo = GitRepository(TEST_GIT_REPO)
95 repo_clone = GitRepository(
95 repo_clone = GitRepository(
96 TEST_GIT_REPO_CLONE,
96 TEST_GIT_REPO_CLONE,
97 src_url=TEST_GIT_REPO, create=True, update_after_clone=True)
97 src_url=TEST_GIT_REPO, create=True, do_workspace_checkout=True)
98 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
98 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
99 # Checking hashes of commits should be enough
99 # Checking hashes of commits should be enough
100 for commit in repo.get_commits():
100 for commit in repo.get_commits():
@@ -111,7 +111,7 b' class TestGitRepository:'
111 clone_path = TEST_GIT_REPO_CLONE + '_with_update'
111 clone_path = TEST_GIT_REPO_CLONE + '_with_update'
112 repo_clone = GitRepository(
112 repo_clone = GitRepository(
113 clone_path,
113 clone_path,
114 create=True, src_url=TEST_GIT_REPO, update_after_clone=True)
114 create=True, src_url=TEST_GIT_REPO, do_workspace_checkout=True)
115 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
115 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
116
116
117 # check if current workdir was updated
117 # check if current workdir was updated
@@ -123,7 +123,7 b' class TestGitRepository:'
123 clone_path = TEST_GIT_REPO_CLONE + '_without_update'
123 clone_path = TEST_GIT_REPO_CLONE + '_without_update'
124 repo_clone = GitRepository(
124 repo_clone = GitRepository(
125 clone_path,
125 clone_path,
126 create=True, src_url=TEST_GIT_REPO, update_after_clone=False)
126 create=True, src_url=TEST_GIT_REPO, do_workspace_checkout=False)
127 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
127 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
128 # check if current workdir was *NOT* updated
128 # check if current workdir was *NOT* updated
129 fpath = os.path.join(clone_path, 'MANIFEST.in')
129 fpath = os.path.join(clone_path, 'MANIFEST.in')
@@ -153,7 +153,7 b' class TestGitRepository:'
153 # Note: This is a git specific part of the API, it's only implemented
153 # Note: This is a git specific part of the API, it's only implemented
154 # by the git backend.
154 # by the git backend.
155 source_repo = vcsbackend_git.repo
155 source_repo = vcsbackend_git.repo
156 target_repo = vcsbackend_git.create_repo()
156 target_repo = vcsbackend_git.create_repo(bare=True)
157 target_repo.fetch(source_repo.path)
157 target_repo.fetch(source_repo.path)
158 # Note: Get a fresh instance, avoids caching trouble
158 # Note: Get a fresh instance, avoids caching trouble
159 target_repo = vcsbackend_git.backend(target_repo.path)
159 target_repo = vcsbackend_git.backend(target_repo.path)
@@ -162,32 +162,31 b' class TestGitRepository:'
162 def test_commit_ids(self):
162 def test_commit_ids(self):
163 # there are 112 commits (by now)
163 # there are 112 commits (by now)
164 # so we can assume they would be available from now on
164 # so we can assume they would be available from now on
165 subset = set([
165 subset = {'c1214f7e79e02fc37156ff215cd71275450cffc3',
166 'c1214f7e79e02fc37156ff215cd71275450cffc3',
166 '38b5fe81f109cb111f549bfe9bb6b267e10bc557',
167 '38b5fe81f109cb111f549bfe9bb6b267e10bc557',
167 'fa6600f6848800641328adbf7811fd2372c02ab2',
168 'fa6600f6848800641328adbf7811fd2372c02ab2',
168 '102607b09cdd60e2793929c4f90478be29f85a17',
169 '102607b09cdd60e2793929c4f90478be29f85a17',
169 '49d3fd156b6f7db46313fac355dca1a0b94a0017',
170 '49d3fd156b6f7db46313fac355dca1a0b94a0017',
170 '2d1028c054665b962fa3d307adfc923ddd528038',
171 '2d1028c054665b962fa3d307adfc923ddd528038',
171 'd7e0d30fbcae12c90680eb095a4f5f02505ce501',
172 'd7e0d30fbcae12c90680eb095a4f5f02505ce501',
172 'ff7ca51e58c505fec0dd2491de52c622bb7a806b',
173 'ff7ca51e58c505fec0dd2491de52c622bb7a806b',
173 'dd80b0f6cf5052f17cc738c2951c4f2070200d7f',
174 'dd80b0f6cf5052f17cc738c2951c4f2070200d7f',
174 '8430a588b43b5d6da365400117c89400326e7992',
175 '8430a588b43b5d6da365400117c89400326e7992',
175 'd955cd312c17b02143c04fa1099a352b04368118',
176 'd955cd312c17b02143c04fa1099a352b04368118',
176 'f67b87e5c629c2ee0ba58f85197e423ff28d735b',
177 'f67b87e5c629c2ee0ba58f85197e423ff28d735b',
177 'add63e382e4aabc9e1afdc4bdc24506c269b7618',
178 'add63e382e4aabc9e1afdc4bdc24506c269b7618',
178 'f298fe1189f1b69779a4423f40b48edf92a703fc',
179 'f298fe1189f1b69779a4423f40b48edf92a703fc',
179 'bd9b619eb41994cac43d67cf4ccc8399c1125808',
180 'bd9b619eb41994cac43d67cf4ccc8399c1125808',
180 '6e125e7c890379446e98980d8ed60fba87d0f6d1',
181 '6e125e7c890379446e98980d8ed60fba87d0f6d1',
181 'd4a54db9f745dfeba6933bf5b1e79e15d0af20bd',
182 'd4a54db9f745dfeba6933bf5b1e79e15d0af20bd',
182 '0b05e4ed56c802098dfc813cbe779b2f49e92500',
183 '0b05e4ed56c802098dfc813cbe779b2f49e92500',
183 '191caa5b2c81ed17c0794bf7bb9958f4dcb0b87e',
184 '191caa5b2c81ed17c0794bf7bb9958f4dcb0b87e',
184 '45223f8f114c64bf4d6f853e3c35a369a6305520',
185 '45223f8f114c64bf4d6f853e3c35a369a6305520',
185 'ca1eb7957a54bce53b12d1a51b13452f95bc7c7e',
186 'ca1eb7957a54bce53b12d1a51b13452f95bc7c7e',
186 'f5ea29fc42ef67a2a5a7aecff10e1566699acd68',
187 'f5ea29fc42ef67a2a5a7aecff10e1566699acd68',
187 '27d48942240f5b91dfda77accd2caac94708cc7d',
188 '27d48942240f5b91dfda77accd2caac94708cc7d',
188 '622f0eb0bafd619d2560c26f80f09e3b0b0d78af',
189 '622f0eb0bafd619d2560c26f80f09e3b0b0d78af',
189 'e686b958768ee96af8029fe19c6050b1a8dd3b2b'}
190 'e686b958768ee96af8029fe19c6050b1a8dd3b2b'])
191 assert subset.issubset(set(self.repo.commit_ids))
190 assert subset.issubset(set(self.repo.commit_ids))
192
191
193 def test_slicing(self):
192 def test_slicing(self):
@@ -281,12 +280,12 b' TODO: To be written...'
281
280
282 new_branch = 'new_branch'
281 new_branch = 'new_branch'
283 assert repo_clone._current_branch() == 'master'
282 assert repo_clone._current_branch() == 'master'
284 assert set(repo_clone.branches) == set(('master',))
283 assert set(repo_clone.branches) == {'master'}
285 repo_clone._checkout(new_branch, create=True)
284 repo_clone._checkout(new_branch, create=True)
286
285
287 # Branches is a lazy property so we need to recrete the Repo object.
286 # Branches is a lazy property so we need to recrete the Repo object.
288 repo_clone = GitRepository(repo_clone.path)
287 repo_clone = GitRepository(repo_clone.path)
289 assert set(repo_clone.branches) == set(('master', new_branch))
288 assert set(repo_clone.branches) == {'master', new_branch}
290 assert repo_clone._current_branch() == new_branch
289 assert repo_clone._current_branch() == new_branch
291
290
292 def test_checkout(self):
291 def test_checkout(self):
@@ -1171,7 +1170,7 b' class TestGitRegression(BackendTestMixin'
1171 assert paths == expected_paths
1170 assert paths == expected_paths
1172
1171
1173
1172
1174 class TestDiscoverGitVersion:
1173 class TestDiscoverGitVersion(object):
1175
1174
1176 def test_returns_git_version(self, baseapp):
1175 def test_returns_git_version(self, baseapp):
1177 version = discover_git_version()
1176 version = discover_git_version()
@@ -122,7 +122,7 b' class TestMercurialRepository:'
122 repo = MercurialRepository(TEST_HG_REPO)
122 repo = MercurialRepository(TEST_HG_REPO)
123 repo_clone = MercurialRepository(
123 repo_clone = MercurialRepository(
124 TEST_HG_REPO_CLONE + '_w_update',
124 TEST_HG_REPO_CLONE + '_w_update',
125 src_url=TEST_HG_REPO, update_after_clone=True)
125 src_url=TEST_HG_REPO, do_workspace_checkout=True)
126 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
126 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
127
127
128 # check if current workdir was updated
128 # check if current workdir was updated
@@ -133,7 +133,7 b' class TestMercurialRepository:'
133 repo = MercurialRepository(TEST_HG_REPO)
133 repo = MercurialRepository(TEST_HG_REPO)
134 repo_clone = MercurialRepository(
134 repo_clone = MercurialRepository(
135 TEST_HG_REPO_CLONE + '_wo_update',
135 TEST_HG_REPO_CLONE + '_wo_update',
136 src_url=TEST_HG_REPO, update_after_clone=False)
136 src_url=TEST_HG_REPO, do_workspace_checkout=False)
137 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
137 assert len(repo.commit_ids) == len(repo_clone.commit_ids)
138 assert not os.path.isfile(
138 assert not os.path.isfile(
139 os.path.join(TEST_HG_REPO_CLONE + '_wo_update', 'MANIFEST.in'))
139 os.path.join(TEST_HG_REPO_CLONE + '_wo_update', 'MANIFEST.in'))
@@ -57,7 +57,7 b' class Command(object):'
57
57
58 command = cmd + ' ' + ' '.join(args)
58 command = cmd + ' ' + ' '.join(args)
59 if DEBUG:
59 if DEBUG:
60 log.debug('*** CMD %s ***' % (command,))
60 log.debug('*** CMD %s ***', command)
61
61
62 env = dict(os.environ)
62 env = dict(os.environ)
63 # Delete coverage variables, as they make the test fail for Mercurial
63 # Delete coverage variables, as they make the test fail for Mercurial
@@ -69,8 +69,8 b' class Command(object):'
69 cwd=self.cwd, env=env)
69 cwd=self.cwd, env=env)
70 stdout, stderr = self.process.communicate()
70 stdout, stderr = self.process.communicate()
71 if DEBUG:
71 if DEBUG:
72 log.debug('STDOUT:%s' % (stdout,))
72 log.debug('STDOUT:%s', stdout)
73 log.debug('STDERR:%s' % (stderr,))
73 log.debug('STDERR:%s', stderr)
74 return stdout, stderr
74 return stdout, stderr
75
75
76 def assert_returncode_success(self):
76 def assert_returncode_success(self):
@@ -25,10 +25,13 b' import pytest'
25 from rhodecode.lib.vcs.backends.git.repository import GitRepository
25 from rhodecode.lib.vcs.backends.git.repository import GitRepository
26 from rhodecode.lib.vcs.backends.hg.repository import MercurialRepository
26 from rhodecode.lib.vcs.backends.hg.repository import MercurialRepository
27 from rhodecode.lib.vcs.nodes import FileNode
27 from rhodecode.lib.vcs.nodes import FileNode
28 from rhodecode.model.db import Repository
28 from rhodecode.model.meta import Session
29 from rhodecode.model.meta import Session
30 from rhodecode.tests import GIT_REPO, HG_REPO
29
31
30 from rhodecode.tests.vcs_operations import (
32 from rhodecode.tests.vcs_operations import (
31 Command, _check_proper_clone, _check_proper_git_push, _check_proper_hg_push)
33 Command, _check_proper_clone, _check_proper_git_push, _check_proper_hg_push,
34 _add_files_and_push)
32
35
33
36
34 @pytest.mark.usefixtures("disable_locking")
37 @pytest.mark.usefixtures("disable_locking")
@@ -242,3 +245,37 b' class TestVCSOperationsSpecial(object):'
242 assert 'remote: RhodeCode: open pull request link: {}'.format(ref) in stdout
245 assert 'remote: RhodeCode: open pull request link: {}'.format(ref) in stdout
243 assert 'remote: RhodeCode: push completed' in stdout
246 assert 'remote: RhodeCode: push completed' in stdout
244 assert 'exporting bookmark feature2' in stdout
247 assert 'exporting bookmark feature2' in stdout
248
249 def test_push_is_forbidden_on_archived_repo_hg(self, backend_hg, rc_web_server, tmpdir):
250 empty_repo = backend_hg.create_repo()
251 repo_name = empty_repo.repo_name
252
253 repo = Repository.get_by_repo_name(repo_name)
254 repo.archived = True
255 Session().commit()
256
257 clone_url = rc_web_server.repo_clone_url(repo_name)
258 stdout, stderr = Command('/tmp').execute(
259 'hg clone', clone_url, tmpdir.strpath)
260
261 stdout, stderr = _add_files_and_push(
262 'hg', tmpdir.strpath, clone_url=clone_url)
263
264 assert 'abort: HTTP Error 403: Forbidden' in stderr
265
266 def test_push_is_forbidden_on_archived_repo_git(self, backend_git, rc_web_server, tmpdir):
267 empty_repo = backend_git.create_repo()
268 repo_name = empty_repo.repo_name
269
270 repo = Repository.get_by_repo_name(repo_name)
271 repo.archived = True
272 Session().commit()
273
274 clone_url = rc_web_server.repo_clone_url(repo_name)
275 stdout, stderr = Command('/tmp').execute(
276 'git clone', clone_url, tmpdir.strpath)
277
278 stdout, stderr = _add_files_and_push(
279 'git', tmpdir.strpath, clone_url=clone_url)
280
281 assert "The requested URL returned error: 403" in stderr
@@ -20,6 +20,7 b''
20
20
21
21
22 import logging
22 import logging
23 from pyramid.httpexceptions import HTTPException, HTTPBadRequest
23
24
24 from rhodecode.lib.middleware.vcs import (
25 from rhodecode.lib.middleware.vcs import (
25 detect_vcs_request, VCS_TYPE_KEY, VCS_TYPE_SKIP)
26 detect_vcs_request, VCS_TYPE_KEY, VCS_TYPE_SKIP)
@@ -56,6 +57,53 b' def vcs_detection_tween_factory(handler,'
56 return vcs_detection_tween
57 return vcs_detection_tween
57
58
58
59
60 def junk_encoding_detector(request):
61 """
62 Detect bad encoded GET params, and fail immediately with BadRequest
63 """
64
65 try:
66 request.GET.get("", None)
67 except UnicodeDecodeError:
68 raise HTTPBadRequest("Invalid bytes in query string.")
69
70
71 def bad_url_data_detector(request):
72 """
73 Detect invalid bytes in a path.
74 """
75 try:
76 request.path_info
77 except UnicodeDecodeError:
78 raise HTTPBadRequest("Invalid bytes in URL.")
79
80
81 def junk_form_data_detector(request):
82 """
83 Detect bad encoded POST params, and fail immediately with BadRequest
84 """
85
86 if request.method == "POST":
87 try:
88 request.POST.get("", None)
89 except ValueError:
90 raise HTTPBadRequest("Invalid bytes in form data.")
91
92
93 def sanity_check_factory(handler, registry):
94 def sanity_check(request):
95 try:
96 junk_encoding_detector(request)
97 bad_url_data_detector(request)
98 junk_form_data_detector(request)
99 except HTTPException as exc:
100 return exc
101
102 return handler(request)
103
104 return sanity_check
105
106
59 def includeme(config):
107 def includeme(config):
60 config.add_subscriber('rhodecode.subscribers.add_renderer_globals',
108 config.add_subscriber('rhodecode.subscribers.add_renderer_globals',
61 'pyramid.events.BeforeRender')
109 'pyramid.events.BeforeRender')
@@ -65,5 +113,5 b' def includeme(config):'
65 'pyramid.events.NewRequest')
113 'pyramid.events.NewRequest')
66 config.add_subscriber('rhodecode.subscribers.add_request_user_context',
114 config.add_subscriber('rhodecode.subscribers.add_request_user_context',
67 'pyramid.events.ContextFound')
115 'pyramid.events.ContextFound')
68
116 config.add_tween('rhodecode.tweens.sanity_check_factory')
69 config.add_tween('rhodecode.tweens.vcs_detection_tween_factory')
117 config.add_tween('rhodecode.tweens.vcs_detection_tween_factory')
@@ -14,7 +14,6 b' let'
14
14
15 enterprise-ce = import ./default.nix {
15 enterprise-ce = import ./default.nix {
16 inherit
16 inherit
17 pkgs
18 pythonPackages
17 pythonPackages
19 doCheck;
18 doCheck;
20 };
19 };
@@ -51,7 +50,9 b' let'
51 nixFile = "${path}/default.nix";
50 nixFile = "${path}/default.nix";
52
51
53 derivate = import "${nixFile}" {
52 derivate = import "${nixFile}" {
54 inherit doCheck pkgs pythonPackages;
53 inherit
54 doCheck
55 pythonPackages;
55 };
56 };
56 in
57 in
57 pkgs.lib.lists.optionals doIt (
58 pkgs.lib.lists.optionals doIt (
@@ -93,7 +94,7 b' in enterprise-ce.override (attrs: {'
93 export PS1="\n\[\033[1;32m\][CE-shell:\w]$\[\033[0m\] "
94 export PS1="\n\[\033[1;32m\][CE-shell:\w]$\[\033[0m\] "
94
95
95 echo "Building frontend assets"
96 echo "Building frontend assets"
96 ${enterprise-ce.linkNodeAndBowerPackages}
97 ${enterprise-ce.linkNodePackages}
97
98
98 # Setup a temporary directory.
99 # Setup a temporary directory.
99 tmp_path=$(mktemp -d)
100 tmp_path=$(mktemp -d)
@@ -1,17 +0,0 b''
1 {
2 "name": "rhodecode-elements",
3 "description": "User interface for elements for rhodecode",
4 "main": "index.html",
5 "dependencies": {
6 "webcomponentsjs": "^1.2.3",
7 "polymer": "Polymer/polymer#^2.6.0",
8 "paper-button": "PolymerElements/paper-button#^2.1.2",
9 "paper-spinner": "PolymerElements/paper-spinner#^2.1.0",
10 "paper-tooltip": "PolymerElements/paper-tooltip#^2.1.1",
11 "paper-toast": "PolymerElements/paper-toast#^2.1.2",
12 "paper-toggle-button": "PolymerElements/paper-toggle-button#^2.1.1",
13 "iron-ajax": "PolymerElements/iron-ajax#^2.1.3",
14 "iron-autogrow-textarea": "PolymerElements/iron-autogrow-textarea#^2.2.0",
15 "iron-a11y-keys": "PolymerElements/iron-a11y-keys#^2.1.2"
16 }
17 }
@@ -1,150 +0,0 b''
1 .. _config-ext:
2
3 Configure |RCX|
4 ---------------
5
6 To get the the built in plugins and extensions working the way you want them
7 to, you have to configure them to work with your services. An overview of
8 what needs to be done is:
9
10 * :ref:`config-rcx-plugin` to carry out your desired actions once its hook is
11 triggered. There are default actions built in, but you may wish to alter
12 those.
13 * :ref:`config-rcx-hook` to execute actions for the plugin, when certain
14 actions are carried out with |RCE|.
15
16 .. _config-rcx-plugin:
17
18 Tweak a Default Plugin
19 ^^^^^^^^^^^^^^^^^^^^^^
20
21 Each of the default plugins comes with a standard configuration, but you may
22 wish to change those settings. In this example, the Redmine plugin watches
23 for the words defined in the ``HASH_REGEX`` variable and takes actions if one
24 of those words is used in conjunction with a ``#{number}``, which matches a
25 ticket number in Redmine. You can configure this to work differently based on
26 the `Redmine documentation`_.
27
28 .. code-block:: python
29 :emphasize-lines: 3-5, 37
30
31 import re
32
33 HASH_REGEX = re.compile(
34 r"(?:fix|fixes|fixing|close|closes|closing)\s*#([0-9]+)\b",
35 re.IGNORECASE)
36
37
38 def link_to_commit(repo_url, commit_id):
39 rev_url = '%s/changeset/%s' % (repo_url, commit_id)
40 return '"%s":%s' % (commit_id[:6], rev_url)
41
42
43 def run(*args, **kwargs):
44 issues = kwargs['RM_ISSUES']
45 if not issues:
46 return 0
47
48 # repo extra fields can control this, they should be propagated with
49 # extract repo fields
50 tracker_url = kwargs.get('redmine_tracker_url') or kwargs['RM_URL']
51 project_id = kwargs.get('redmine_project_id') or kwargs['RM_PROJECT']
52 api_key = kwargs.get('redmine_api_key') or kwargs['RM_APIKEY']
53
54 if project_id:
55 from redmine import Redmine
56 remote_redmine = Redmine(tracker_url, key=api_key)
57 project = remote_redmine.project.get(project_id)
58 repo_url = '%(server_url)s/%(repository)s' % kwargs
59 # for each fetched issue id make a redmine api call
60 for _id, details in issues.items():
61 commits = ', '.join([link_to_commit(repo_url,
62 x['raw_id'],)
63 for x in details])
64 issue = project.issues.get(int(_id))
65 if issue:
66 issue.notes = 'Issue resolved by %s' % (commits,)
67 issue.status_id = 3 # Resolved
68 issue.save()
69
70
71 .. _config-rcx-hook:
72
73 Configure a Hook
74 ^^^^^^^^^^^^^^^^
75
76 To configure the default hooks in the
77 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init.py__` file,
78 use the following steps.
79
80 1. Configure the connection details, either in the file or import from a
81 dictionary. For these connection scenarios the following details need to
82 be configured.
83
84 * **REDMINE_URL** = '<redmine-url>'
85 * **REDMINE_API_KEY** = '<secret>'
86 * **SLACK_API_URL** = '<slack-url>?token=<secret>'
87 * **SLACK_API_KEY** = '<secret>'
88
89 2. You will also need to configure other variables, such as the
90 **SLACK_ROOM** or **RM_PROJECT** (Redmine Project). These set where the
91 commit message is posted. Various hooks can take different variables and
92 they are documented in the file.
93
94 3. Inside each hook you can then configure it to carry out actions
95 per service. In this example, the push hook is pushing to the Redmine and
96 Slack plugins on each push if the hook criteria are matched.
97
98 .. code-block:: python
99 :emphasize-lines: 21-29, 37-44
100
101 def _push_hook(*args, **kwargs):
102 kwargs['commit_ids'] = kwargs['pushed_revs']
103
104 call = load_extension('extra_fields.py')
105 if call:
106 repo_extra_fields = call(**kwargs)
107 # now update if we have extra fields, they have precedence
108 # this way users can store any configuration inside
109 # the database per repo
110 for key, data in repo_extra_fields.items():
111 kwargs[key] = data['field_value']
112
113 # fetch pushed commits
114 call = load_extension('extract_commits.py')
115 extracted_commits = {}
116 if call:
117 extracted_commits = call(**kwargs)
118 # store the commits for the next call chain
119 kwargs['COMMITS'] = extracted_commits
120
121 # slack !
122 call = load_extension('slack.py')
123 if call:
124 kwargs['INCOMING_WEBHOOK_URL'] = SLACK_API_URL
125 kwargs['SLACK_TOKEN'] = SLACK_API_KEY
126 kwargs['SLACK_ROOM'] = '#slack-channel'
127 kwargs['SLACK_FROM'] = 'Slack-Message-Poster'
128 kwargs['SLACK_FROM_ICON_EMOJI'] = ':slack-emoji:'
129 call(**kwargs)
130
131 # fetch issues from given commits
132 call = load_extension('extract_issues.py')
133 issues = {}
134 if call:
135 issues = call(**kwargs)
136
137 # redmine smart commits
138 call = load_extension('redmine_smart_commits.py')
139 if call:
140 kwargs['RM_URL'] = REDMINE_URL
141 kwargs['RM_APIKEY'] = REDMINE_API_KEY
142 kwargs['RM_PROJECT'] = None # uses extra_fields from repo
143 kwargs['RM_ISSUES'] = issues
144 call(**kwargs)
145
146 return 0
147 PUSH_HOOK = _push_hook
148
149
150 .. _Redmine documentation: http://www.redmine.org/projects/redmine/wiki/Rest_api
This diff has been collapsed as it changes many lines, (823 lines changed) Show them Hide them
@@ -1,823 +0,0 b''
1 """
2 rcextensions module.
3
4 """
5
6
7 import os
8 import imp
9 import string
10 import functools
11
12 here = os.path.dirname(os.path.abspath(__file__))
13 registered_extensions = dict()
14
15 class DotDict(dict):
16
17 def __contains__(self, k):
18 try:
19 return dict.__contains__(self, k) or hasattr(self, k)
20 except:
21 return False
22
23 # only called if k not found in normal places
24 def __getattr__(self, k):
25 try:
26 return object.__getattribute__(self, k)
27 except AttributeError:
28 try:
29 return self[k]
30 except KeyError:
31 raise AttributeError(k)
32
33 def __setattr__(self, k, v):
34 try:
35 object.__getattribute__(self, k)
36 except AttributeError:
37 try:
38 self[k] = v
39 except:
40 raise AttributeError(k)
41 else:
42 object.__setattr__(self, k, v)
43
44 def __delattr__(self, k):
45 try:
46 object.__getattribute__(self, k)
47 except AttributeError:
48 try:
49 del self[k]
50 except KeyError:
51 raise AttributeError(k)
52 else:
53 object.__delattr__(self, k)
54
55 def toDict(self):
56 return unserialize(self)
57
58 def __repr__(self):
59 keys = list(self.iterkeys())
60 keys.sort()
61 args = ', '.join(['%s=%r' % (key, self[key]) for key in keys])
62 return '%s(%s)' % (self.__class__.__name__, args)
63
64 @staticmethod
65 def fromDict(d):
66 return serialize(d)
67
68
69 def serialize(x):
70 if isinstance(x, dict):
71 return DotDict((k, serialize(v)) for k, v in x.iteritems())
72 elif isinstance(x, (list, tuple)):
73 return type(x)(serialize(v) for v in x)
74 else:
75 return x
76
77
78 def unserialize(x):
79 if isinstance(x, dict):
80 return dict((k, unserialize(v)) for k, v in x.iteritems())
81 elif isinstance(x, (list, tuple)):
82 return type(x)(unserialize(v) for v in x)
83 else:
84 return x
85
86
87 def load_extension(filename, async=False):
88 """
89 use to load extensions inside rcextension folder.
90 for example::
91
92 callback = load_extension('email.py', async=False)
93 if callback:
94 callback('foobar')
95
96 put file named email.py inside rcextensions folder to load it. Changing
97 async=True will make the call of the plugin async, it's useful for
98 blocking calls like sending an email or notification with APIs.
99 """
100 mod = ''.join(filename.split('.')[:-1])
101 loaded = imp.load_source(mod, os.path.join(here, filename))
102
103 callback = getattr(loaded, 'run', None)
104 if not callback:
105 raise Exception('Plugin missing `run` method')
106 if async:
107 # modify callback so it's actually an async call
108 def _async_callback(*args, **kwargs):
109 import threading
110 thr = threading.Thread(target=callback, args=args, kwargs=kwargs)
111 thr.start()
112 if kwargs.get('_async_block'):
113 del kwargs['_async_block']
114 thr.join()
115
116 return _async_callback
117 return callback
118
119
120 def _verify_kwargs(expected_parameters, kwargs):
121 """
122 Verify that exactly `expected_parameters` are passed in as `kwargs`.
123 """
124 expected_parameters = set(expected_parameters)
125 kwargs_keys = set(kwargs.keys())
126 if kwargs_keys != expected_parameters:
127 missing_kwargs = expected_parameters - kwargs_keys
128 unexpected_kwargs = kwargs_keys - expected_parameters
129 raise AssertionError(
130 "Missing parameters: %r, unexpected parameters: %s" %
131 (missing_kwargs, unexpected_kwargs))
132
133
134 def verify_kwargs(required_args):
135 """
136 decorator to verify extension calls arguments.
137
138 :param required_args:
139 """
140 def wrap(func):
141 def wrapper(*args, **kwargs):
142 _verify_kwargs(required_args, kwargs)
143 return func(*args, **kwargs)
144 return wrapper
145 return wrap
146
147
148 def register(name=None):
149 def wrap(func):
150 @functools.wraps(func)
151 def wrapper(*args, **kwargs):
152 # register load_extensions in kwargs, so we can chain plugins
153 kwargs['_load_extension'] = load_extension
154 # append this path for us to use added plugins or modules
155 import sys
156 _cur_path = os.path.dirname(os.path.abspath(__file__))
157 if _cur_path not in sys.path:
158 sys.path.append(_cur_path)
159
160 registered_extensions[func.__name__] = func
161 return func(*args, **kwargs)
162 return wrapper
163 return wrap
164
165 # =============================================================================
166 # END OF UTILITY FUNCTIONS HERE
167 # =============================================================================
168
169 # Additional mappings that are not present in the pygments lexers
170 # used for building stats
171 # format is {'ext':['Names']} eg. {'py':['Python']} note: there can be
172 # more than one name for extension
173 # NOTE: that this will override any mappings in LANGUAGES_EXTENSIONS_MAP
174 # build by pygments
175 EXTRA_MAPPINGS = {}
176
177 # additional lexer definitions for custom files it's overrides pygments lexers,
178 # and uses defined name of lexer to colorize the files. Format is {'ext':
179 # 'lexer_name'} List of lexers can be printed running:
180 # >> python -c "import pprint;from pygments import lexers;
181 # pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);"
182
183 EXTRA_LEXERS = {}
184
185
186 CONFIG = DotDict(
187 slack=DotDict(
188 api_key='api-key',
189 api_url='slack-incoming-hook-url',
190 default_room='#slack-channel',
191 default_plugin_config={},
192 ),
193 redmine=DotDict(
194 api_key='api-key',
195 default_tracker_url='https://redmine.tracker.url',
196 default_project_id=None,
197 default_status_resolved_id=3
198 ),
199 )
200
201 # slack conf
202 CONFIG.slack.default_plugin_config = {
203 'INCOMING_WEBHOOK_URL': CONFIG.slack.api_url,
204 'SLACK_TOKEN': CONFIG.slack.api_key,
205 'SLACK_ROOM': CONFIG.slack.default_room,
206 'SLACK_FROM': 'RhodeCode',
207 'SLACK_FROM_ICON_EMOJI': ':rhodecode:',
208 }
209
210 # redmine smart_pr configuration
211 def configure_redmine_smart_pr(issues, kwargs):
212 kwargs['REDMINE_ISSUES'] = issues
213 kwargs['redmine_tracker_url'] = kwargs.pop(
214 'redmine_tracker_url', '') or CONFIG.redmine.default_tracker_url
215 kwargs['redmine_api_key'] = kwargs.pop(
216 'redmine_api_key', '') or CONFIG.redmine.api_key
217 kwargs['redmine_project_id'] = kwargs.pop(
218 'redmine_project_id', '') or CONFIG.redmine.default_project_id
219
220
221 @register('CREATE_REPO_HOOK')
222 @verify_kwargs(
223 ['_load_extension', 'repo_name', 'repo_type', 'description', 'private',
224 'created_on', 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics',
225 'clone_uri', 'fork_id', 'group_id', 'created_by'])
226 def _create_repo_hook(*args, **kwargs):
227 """
228 POST CREATE REPOSITORY HOOK. This function will be executed after
229 each repository is created. kwargs available:
230
231 :param repo_name:
232 :param repo_type:
233 :param description:
234 :param private:
235 :param created_on:
236 :param enable_downloads:
237 :param repo_id:
238 :param user_id:
239 :param enable_statistics:
240 :param clone_uri:
241 :param fork_id:
242 :param group_id:
243 :param created_by:
244 """
245 return 0
246 CREATE_REPO_HOOK = _create_repo_hook
247
248
249 @register('CREATE_REPO_GROUP_HOOK')
250 @verify_kwargs(
251 ['_load_extension', 'group_name', 'group_parent_id', 'group_description',
252 'group_id', 'user_id', 'created_by', 'created_on', 'enable_locking'])
253 def _create_repo_group_hook(*args, **kwargs):
254 """
255 POST CREATE REPOSITORY GROUP HOOK, this function will be
256 executed after each repository group is created. kwargs available:
257
258 :param group_name:
259 :param group_parent_id:
260 :param group_description:
261 :param group_id:
262 :param user_id:
263 :param created_by:
264 :param created_on:
265 :param enable_locking:
266 """
267 return 0
268 CREATE_REPO_GROUP_HOOK = _create_repo_group_hook
269
270
271 @register('PRE_CREATE_USER_HOOK')
272 @verify_kwargs(
273 ['_load_extension', 'username', 'password', 'email', 'firstname',
274 'lastname', 'active', 'admin', 'created_by'])
275 def _pre_create_user_hook(*args, **kwargs):
276 """
277 PRE CREATE USER HOOK, this function will be executed before each
278 user is created, it returns a tuple of bool, reason.
279 If bool is False the user creation will be stopped and reason
280 will be displayed to the user. kwargs available:
281
282 :param username:
283 :param password:
284 :param email:
285 :param firstname:
286 :param lastname:
287 :param active:
288 :param admin:
289 :param created_by:
290 """
291
292 reason = 'allowed'
293 return True, reason
294 PRE_CREATE_USER_HOOK = _pre_create_user_hook
295
296
297 @register('CREATE_USER_HOOK')
298 @verify_kwargs(
299 ['_load_extension', 'username', 'full_name_or_username', 'full_contact',
300 'user_id', 'name', 'firstname', 'short_contact', 'admin', 'lastname',
301 'ip_addresses', 'extern_type', 'extern_name', 'email', 'api_key',
302 'api_keys', 'last_login', 'full_name', 'active', 'password', 'emails',
303 'inherit_default_permissions', 'created_by', 'created_on'])
304 def _create_user_hook(*args, **kwargs):
305 """
306 POST CREATE USER HOOK, this function will be executed after each user is created
307 kwargs available:
308
309 :param username:
310 :param full_name_or_username:
311 :param full_contact:
312 :param user_id:
313 :param name:
314 :param firstname:
315 :param short_contact:
316 :param admin:
317 :param lastname:
318 :param ip_addresses:
319 :param extern_type:
320 :param extern_name:
321 :param email:
322 :param api_key:
323 :param api_keys:
324 :param last_login:
325 :param full_name:
326 :param active:
327 :param password:
328 :param emails:
329 :param inherit_default_permissions:
330 :param created_by:
331 :param created_on:
332 """
333 return 0
334 CREATE_USER_HOOK = _create_user_hook
335
336
337 @register('DELETE_REPO_HOOK')
338 @verify_kwargs(
339 ['_load_extension', 'repo_name', 'repo_type', 'description', 'private',
340 'created_on', 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics',
341 'clone_uri', 'fork_id', 'group_id', 'deleted_by', 'deleted_on'])
342 def _delete_repo_hook(*args, **kwargs):
343 """
344 POST DELETE REPOSITORY HOOK, this function will be executed after
345 each repository deletion kwargs available:
346
347 :param repo_name:
348 :param repo_type:
349 :param description:
350 :param private:
351 :param created_on:
352 :param enable_downloads:
353 :param repo_id:
354 :param user_id:
355 :param enable_statistics:
356 :param clone_uri:
357 :param fork_id:
358 :param group_id:
359 :param deleted_by:
360 :param deleted_on:
361 """
362 return 0
363 DELETE_REPO_HOOK = _delete_repo_hook
364
365
366 @register('DELETE_USER_HOOK')
367 @verify_kwargs(
368 ['_load_extension', 'username', 'full_name_or_username', 'full_contact',
369 'user_id', 'name', 'firstname', 'short_contact', 'admin', 'lastname',
370 'ip_addresses', 'email', 'api_key', 'last_login', 'full_name', 'active',
371 'password', 'emails', 'inherit_default_permissions', 'deleted_by'
372 ])
373 def _delete_user_hook(*args, **kwargs):
374 """
375 POST DELETE USER HOOK, this function will be executed after each
376 user is deleted kwargs available:
377
378 :param username:
379 :param full_name_or_username:
380 :param full_contact:
381 :param user_id:
382 :param name:
383 :param firstname:
384 :param short_contact:
385 :param admin:
386 :param lastname:
387 :param ip_addresses:
388 :param ldap_dn:
389 :param email:
390 :param api_key:
391 :param last_login:
392 :param full_name:
393 :param active:
394 :param password:
395 :param emails:
396 :param inherit_default_permissions:
397 :param deleted_by:
398 """
399 return 0
400 DELETE_USER_HOOK = _delete_user_hook
401
402
403 @register('PRE_PUSH_HOOK')
404 @verify_kwargs(
405 ['_load_extension', 'server_url', 'config', 'scm', 'username',
406 'ip', 'action', 'repository', 'repo_store_path'])
407 def _pre_push_hook(*args, **kwargs):
408 """
409 Post push hook
410 kwargs available:
411
412 :param server_url: url of instance that triggered this hook
413 :param config: path to .ini config used
414 :param scm: type of VS 'git' or 'hg'
415 :param username: name of user who pushed
416 :param ip: ip of who pushed
417 :param action: push
418 :param repository: repository name
419 :param repo_store_path: full path to where repositories are stored
420 """
421 return 0
422 PRE_PUSH_HOOK = _pre_push_hook
423
424
425 @register('PUSH_HOOK')
426 @verify_kwargs(
427 ['_load_extension', 'server_url', 'config', 'scm', 'username',
428 'ip', 'action', 'repository', 'repo_store_path', 'pushed_revs'])
429 def _push_hook(*args, **kwargs):
430 """
431 POST PUSH HOOK, this function will be executed after each push it's
432 executed after the build-in hook that RhodeCode uses for logging pushes
433 kwargs available:
434
435 :param server_url: url of instance that triggered this hook
436 :param config: path to .ini config used
437 :param scm: type of VS 'git' or 'hg'
438 :param username: name of user who pushed
439 :param ip: ip of who pushed
440 :param action: push
441 :param repository: repository name
442 :param repo_store_path: full path to where repositories are stored
443 :param pushed_revs: list of pushed commit ids
444 """
445 # backward compat
446 kwargs['commit_ids'] = kwargs['pushed_revs']
447
448 # fetch extra fields from repository
449 call = load_extension('extra_fields.py')
450 _extra_fields = {}
451 if call:
452 repo_extra_fields = call(**kwargs)
453 # now update if we have extra fields, they have precedence
454 # this way users can store any configuration inside the database per
455 # repo
456 for key, data in repo_extra_fields.items():
457 kwargs[key] = data['field_value']
458 _extra_fields[key] = data['field_value']
459
460 # fetch pushed commits, from commit_ids list
461 call = load_extension('extract_commits.py')
462 extracted_commits = {}
463 if call:
464 extracted_commits = call(**kwargs)
465 # store the commits for the next call chain
466 kwargs['COMMITS'] = extracted_commits
467
468 # slack !
469 call = load_extension('slack_push_notify.py')
470 if call:
471 kwargs.update(CONFIG.slack.default_plugin_config)
472 call(**kwargs)
473
474 # fetch redmine issues from given commits
475 call = load_extension('extract_redmine_issues.py')
476 issues = {}
477 if call:
478 issues = call(**kwargs)
479
480 # redmine smart commits
481 call = load_extension('redmine_smart_commits.py')
482 if call:
483 kwargs['REDMINE_ISSUES'] = issues
484
485 kwargs['redmine_tracker_url'] = kwargs.pop(
486 'redmine_tracker_url', '') or CONFIG.redmine.default_tracker_url
487 kwargs['redmine_api_key'] = kwargs.pop(
488 'redmine_api_key', '') or CONFIG.redmine.api_key
489 kwargs['redmine_status_resolved_id'] = kwargs.pop(
490 'redmine_status_resolved_id', '') or CONFIG.redmine.default_status_resolved_id
491 kwargs['redmine_project_id'] = kwargs.pop(
492 'redmine_project_id', '') or CONFIG.redmine.default_project_id
493 call(**kwargs)
494
495 return 0
496 PUSH_HOOK = _push_hook
497
498
499 @register('PRE_PULL_HOOK')
500 @verify_kwargs(
501 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
502 'action', 'repository'])
503 def _pre_pull_hook(*args, **kwargs):
504 """
505 Post pull hook
506 kwargs available::
507
508 :param server_url: url of instance that triggered this hook
509 :param config: path to .ini config used
510 :param scm: type of VS 'git' or 'hg'
511 :param username: name of user who pulled
512 :param ip: ip of who pulled
513 :param action: pull
514 :param repository: repository name
515 """
516 return 0
517 PRE_PULL_HOOK = _pre_pull_hook
518
519
520 @register('PULL_HOOK')
521 @verify_kwargs(
522 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
523 'action', 'repository'])
524 def _pull_hook(*args, **kwargs):
525 """
526 POST PULL HOOK, this function will be executed after each push it's
527 executed after the build-in hook that RhodeCode uses for logging pulls
528
529 kwargs available:
530
531 :param server_url: url of instance that triggered this hook
532 :param config: path to .ini config used
533 :param scm: type of VS 'git' or 'hg'
534 :param username: name of user who pulled
535 :param ip: ip of who pulled
536 :param action: pull
537 :param repository: repository name
538 """
539 return 0
540 PULL_HOOK = _pull_hook
541
542
543 # =============================================================================
544 # PULL REQUEST RELATED HOOKS
545 # =============================================================================
546 @register('CREATE_PULL_REQUEST')
547 @verify_kwargs(
548 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
549 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
550 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
551 'mergeable', 'source', 'target', 'author', 'reviewers'])
552 def _create_pull_request_hook(*args, **kwargs):
553 """
554
555 """
556 # extract extra fields and default reviewers from target
557 kwargs['REPOSITORY'] = kwargs['target']['repository']
558
559 call = load_extension('extra_fields.py')
560 if call:
561 repo_extra_fields = call(**kwargs)
562 # now update if we have extra fields, they have precedence
563 # this way users can store any configuration inside the database per
564 # repo
565 for key, data in repo_extra_fields.items():
566 kwargs[key] = data['field_value']
567
568 call = load_extension('default_reviewers.py')
569 if call:
570 # read default_reviewers key propagated from extra fields
571 kwargs['default_reviewers'] = map(string.strip, kwargs.pop(
572 'default_reviewers', '').split(','))
573 call(**kwargs)
574
575 # extract below from source repo as commits are there
576 kwargs['REPOSITORY'] = kwargs['source']['repository']
577
578 # # fetch pushed commits, from commit_ids list
579 # call = load_extension('extract_commits.py')
580 # extracted_commits = {}
581 # if call:
582 # extracted_commits = call(**kwargs)
583 # # store the commits for the next call chain
584 # kwargs['COMMITS'] = extracted_commits
585 #
586 # # fetch issues from given commits
587 # call = load_extension('extract_redmine_issues.py')
588 # issues = {}
589 # if call:
590 # issues = call(**kwargs)
591 #
592 # # redmine smart pr update
593 # call = load_extension('redmine_pr_flow.py')
594 # if call:
595 # # updates kwargs on the fly
596 # configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
597 # call(**kwargs)
598 #
599 # # slack notification on merging PR
600 # call = load_extension('slack_message.py')
601 # if call:
602 # kwargs.update(CONFIG.slack.default_plugin_config)
603 # kwargs['SLACK_ROOM'] = '#develop'
604 # kwargs['SLACK_MESSAGE'] = 'Pull request <%s|#%s> (%s) was created.' % (
605 # kwargs.get('url'), kwargs.get('pull_request_id'), kwargs.get('title'))
606 #
607 # call(**kwargs)
608
609 return 0
610 CREATE_PULL_REQUEST = _create_pull_request_hook
611
612
613 @register('REVIEW_PULL_REQUEST')
614 @verify_kwargs(
615 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
616 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
617 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
618 'mergeable', 'source', 'target', 'author', 'reviewers'])
619 def _review_pull_request_hook(*args, **kwargs):
620 """
621
622 """
623 # extract extra fields and default reviewers from target
624 kwargs['REPOSITORY'] = kwargs['target']['repository']
625
626 # fetch extra fields
627 call = load_extension('extra_fields.py')
628 if call:
629 repo_extra_fields = call(**kwargs)
630 # now update if we have extra fields, they have precedence
631 # this way users can store any configuration inside the database per
632 # repo
633 for key, data in repo_extra_fields.items():
634 kwargs[key] = data['field_value']
635
636 # extract below from source repo as commits are there
637 kwargs['REPOSITORY'] = kwargs['source']['repository']
638
639 # fetch pushed commits, from commit_ids list
640 call = load_extension('extract_commits.py')
641 extracted_commits = {}
642 if call:
643 extracted_commits = call(**kwargs)
644 # store the commits for the next call chain
645 kwargs['COMMITS'] = extracted_commits
646
647 # fetch issues from given commits
648 call = load_extension('extract_redmine_issues.py')
649 issues = {}
650 if call:
651 issues = call(**kwargs)
652
653 # redmine smart pr update
654 call = load_extension('redmine_pr_flow.py')
655 if call:
656 # updates kwargs on the fly
657 configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
658 call(**kwargs)
659
660 return 0
661 REVIEW_PULL_REQUEST = _review_pull_request_hook
662
663
664 @register('UPDATE_PULL_REQUEST')
665 @verify_kwargs(
666 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
667 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
668 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
669 'mergeable', 'source', 'target', 'author', 'reviewers'])
670 def _update_pull_request_hook(*args, **kwargs):
671 """
672
673 """
674 # extract extra fields and default reviewers from target
675 kwargs['REPOSITORY'] = kwargs['target']['repository']
676
677 # fetch extra fields
678 call = load_extension('extra_fields.py')
679 if call:
680 repo_extra_fields = call(**kwargs)
681 # now update if we have extra fields, they have precedence
682 # this way users can store any configuration inside the database per
683 # repo
684 for key, data in repo_extra_fields.items():
685 kwargs[key] = data['field_value']
686
687 # extract below from source repo as commits are there
688 kwargs['REPOSITORY'] = kwargs['source']['repository']
689
690 # fetch pushed commits, from commit_ids list
691 call = load_extension('extract_commits.py')
692 extracted_commits = {}
693 if call:
694 extracted_commits = call(**kwargs)
695 # store the commits for the next call chain
696 kwargs['COMMITS'] = extracted_commits
697
698 # fetch issues from given commits
699 call = load_extension('extract_redmine_issues.py')
700 issues = {}
701 if call:
702 issues = call(**kwargs)
703
704 # redmine smart pr updated
705 call = load_extension('redmine_pr_flow.py')
706 if call:
707 # updates kwargs on the fly
708 configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
709 call(**kwargs)
710
711 return 0
712 UPDATE_PULL_REQUEST = _update_pull_request_hook
713
714
715 @register('MERGE_PULL_REQUEST')
716 @verify_kwargs(
717 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
718 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
719 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
720 'mergeable', 'source', 'target', 'author', 'reviewers'])
721 def _merge_pull_request_hook(*args, **kwargs):
722 """
723
724 """
725 # extract extra fields and default reviewers from target
726 kwargs['REPOSITORY'] = kwargs['target']['repository']
727
728 # fetch extra fields
729 call = load_extension('extra_fields.py')
730 if call:
731 repo_extra_fields = call(**kwargs)
732 # now update if we have extra fields, they have precedence
733 # this way users can store any configuration inside the database per
734 # repo
735 for key, data in repo_extra_fields.items():
736 kwargs[key] = data['field_value']
737
738 # extract below from source repo as commits are there
739 kwargs['REPOSITORY'] = kwargs['source']['repository']
740
741 # fetch pushed commits, from commit_ids list
742 call = load_extension('extract_commits.py')
743 extracted_commits = {}
744 if call:
745 extracted_commits = call(**kwargs)
746 # store the commits for the next call chain
747 kwargs['COMMITS'] = extracted_commits
748
749 # fetch issues from given commits
750 call = load_extension('extract_redmine_issues.py')
751 issues = {}
752 if call:
753 issues = call(**kwargs)
754
755 # redmine smart pr update
756 call = load_extension('redmine_pr_flow.py')
757 if call:
758 # updates kwargs on the fly
759 configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
760 call(**kwargs)
761
762 # slack notification on merging PR
763 call = load_extension('slack_message.py')
764 if call:
765 kwargs.update(CONFIG.slack.default_plugin_config)
766 kwargs['SLACK_ROOM'] = '#develop'
767 kwargs['SLACK_MESSAGE'] = 'Pull request <%s|#%s> (%s) was merged.' % (
768 kwargs.get('url'), kwargs.get('pull_request_id'), kwargs.get('title'))
769 call(**kwargs)
770
771 return 0
772 MERGE_PULL_REQUEST = _merge_pull_request_hook
773
774
775 @register('CLOSE_PULL_REQUEST')
776 @verify_kwargs(
777 ['_load_extension', 'server_url', 'config', 'scm', 'username', 'ip',
778 'action', 'repository', 'pull_request_id', 'url', 'title', 'description',
779 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
780 'mergeable', 'source', 'target', 'author', 'reviewers'])
781 def _close_pull_request_hook(*args, **kwargs):
782 """
783
784 """
785 # extract extra fields and default reviewers from target
786 kwargs['REPOSITORY'] = kwargs['target']['repository']
787
788 # fetch extra fields
789 call = load_extension('extra_fields.py')
790 if call:
791 repo_extra_fields = call(**kwargs)
792 # now update if we have extra fields, they have precedence
793 # this way users can store any configuration inside the database per
794 # repo
795 for key, data in repo_extra_fields.items():
796 kwargs[key] = data['field_value']
797
798 # extract below from source repo as commits are there
799 kwargs['REPOSITORY'] = kwargs['source']['repository']
800
801 # fetch pushed commits, from commit_ids list
802 call = load_extension('extract_commits.py')
803 extracted_commits = {}
804 if call:
805 extracted_commits = call(**kwargs)
806 # store the commits for the next call chain
807 kwargs['COMMITS'] = extracted_commits
808
809 # fetch issues from given commits
810 call = load_extension('extract_redmine_issues.py')
811 issues = {}
812 if call:
813 issues = call(**kwargs)
814
815 # redmine smart pr update
816 call = load_extension('redmine_pr_flow.py')
817 if call:
818 # updates kwargs on the fly
819 configure_redmine_smart_pr(issues=issues, kwargs=kwargs)
820 call(**kwargs)
821
822 return 0
823 CLOSE_PULL_REQUEST = _close_pull_request_hook
@@ -1,59 +0,0 b''
1 .. _dev-plug:
2
3 Developing Plugins/Extensions
4 -----------------------------
5
6 An Extension or a Plugin is simply a |PY| module with a ``run`` method that
7 expects a number of parameters, depending on which event it is listening
8 for. To get an extension working, use the following steps:
9
10 1. Create an extension or plugin using the below example.
11 2. Save the plugin inside the
12 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions` folder.
13 3. Add a hook to the
14 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init__.py` file.
15 For more information, see :ref:`event-listener`.
16 4. Restart your |RCM| instance.
17
18 Extension example
19 ^^^^^^^^^^^^^^^^^
20
21 In the following example, the ``run`` method listens for a push to a |repo|
22 and parses the commit.
23
24 .. code-block:: python
25
26 def run(*args, **kwargs):
27
28 revs = kwargs.get('pushed_revs')
29 if not revs:
30 return 0
31
32 from rhodecode.lib.utils2 import extract_mentioned_users
33 from rhodecode.model.db import Repository
34
35 repo = Repository.get_by_repo_name(kwargs['repository'])
36 changesets = []
37 reviewers = []
38
39 # reviewer fields from extra_fields, users can store their custom
40 # reviewers inside the extra fields to pre-define a set of people who
41 # will get notifications about changesets
42 field_key = kwargs.get('reviewers_extra_field')
43 if field_key:
44 for xfield in repo.extra_fields:
45 if xfield.field_key == field_key:
46 reviewers.extend(xfield.field_value.split())
47
48 vcs_repo = repo.scm_instance_no_cache()
49 for rev in kwargs['pushed_revs']:
50 cs = vcs_repo.get_changeset(rev) # or get_commit. See API doc
51 cs_data = cs.__json__()
52 cs_data['mentions'] = extract_mentioned_users(cs_data['message'])
53 cs_data['reviewers'] = reviewers
54 # optionally add more logic to parse the commits, like reading extra
55 # fields of repository to read managers of reviewers
56 changesets.append(cs_data)
57
58 return changesets
59 No newline at end of file
@@ -1,19 +0,0 b''
1 .. _int-full-blown:
2
3 Extensions Extended Example
4 ---------------------------
5
6 This example
7 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init.py__` file
8 has been highlighted to show a Redmine integration in full. To extend your
9 |RCE| instances, use the below example to integrate with other
10 applications.
11
12 This example file also contains a Slack integration, but it is not
13 highlighted.
14
15
16 .. literalinclude:: example-ext.py
17 :language: python
18 :emphasize-lines: 186,193-198,210-218,474-496,648-660,749-760,810-822
19 :linenos:
@@ -1,86 +0,0 b''
1 .. _hooks:
2
3 Hooks
4 -----
5
6 Within |RCM| there are two types of supported hooks.
7
8 * **Internal built-in hooks**: The internal |hg| or |git| hooks are
9 triggered by different VCS operations, like push, pull,
10 or clone and are non-configurable, but you can add your own VCS hooks,
11 see :ref:`custom-hooks`.
12 * **User defined hooks**: User defined hooks centre around the lifecycle of
13 certain actions such are |repo| creation, user creation etc. The actions
14 these hooks trigger can be rejected based on the API permissions of the
15 user calling them.
16
17 Those custom hooks can be called using |RCT|, see :ref:`rc-tools`. To create
18 a custom hook, see the :ref:`event-listener` section.
19
20 .. _event-listener:
21
22 Making your Extension listen for Events
23 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
24
25 To create a hook to work with a plugin or extension,
26 you need configure a listener in the
27 :file:`/home/{user}/{instance-id}/rcextensions/__init__.py` file,
28 and use the ``load_extension`` method.
29
30 Use the following example to create your extensions.
31 In this example:
32
33 * The hook is calling the ``('my_post_push_extension.py')`` extension.
34 * The hook is listening to |RCM| for pushes to |repos|.
35 * This highlighted code is the hook, and configured in the ``__init__.py`` file.
36 * It is inserted into the ``def _pushhook(*args, **kwargs)`` section,
37 if it is not in the default ``__ini__.py`` file, use the below
38 non-highlighted section to create it.
39
40 .. code-block:: python
41 :emphasize-lines: 23-38
42
43 # ==========================================================================
44 # POST PUSH HOOK
45 # ==========================================================================
46
47 # this function will be executed after each push is executed after the
48 # build-in hook that RhodeCode uses for logging pushes
49 def _pushhook(*args, **kwargs):
50 """
51 Post push hook
52 kwargs available:
53
54 :param server_url: url of instance that triggered this hook
55 :param config: path to .ini config used
56 :param scm: type of VS 'git' or 'hg'
57 :param username: name of user who pushed
58 :param ip: ip of who pushed
59 :param action: push
60 :param repository: repository name
61 :param repo_store_path: full path to where repositories are stored
62 :param pushed_revs: list of pushed revisions
63 """
64
65 # Your hook code goes in here
66 call = load_extension('my_post_push_extension.py')
67 if call:
68 # extra arguments in kwargs
69 call_kwargs = dict()
70 call_kwargs.update(kwargs)
71 my_kw = {
72 'reviewers_extra_field': 'reviewers',
73 # defines if we have a comma
74 # separated list of reviewers
75 # in this repo stored in extra_fields
76 }
77 call_kwargs.update(my_kw) # pass in hook args
78 parsed_revs = call(**call_kwargs)
79 # returns list of dicts with changesets data
80
81 # Default code
82 return 0
83 PUSH_HOOK = _pushhook
84
85 Once your plugin and hook are configured, restart your instance of |RCM| and
86 your event listener will triggered as soon as a user pushes to a |repo|.
@@ -1,55 +0,0 b''
1 .. _install-rcx:
2
3 Install |RCX|
4 -------------
5
6 To install |RCX|, you need to have |RCT| installed. See the :ref:`install-tools`
7 and :ref:`tools-cli` sections. Use the ``--plugins`` option with
8 the ``rhodecode-extensions`` argument.
9
10 Upgrading |RCX|
11 ^^^^^^^^^^^^^^^
12
13 .. important::
14
15 You should back up any plugins or extensions that you have created before
16 continuing.
17
18 To upgrade your |RCX|, use the following example:
19
20 1. From inside the |RCT| virtualenv, upgrade to the latest version:
21
22 .. code-block:: bash
23
24 (venv)$ pip install -U https://my.rhodecode.com/dl/rhodecode-tools/latest
25 Downloading/unpacking https://my.rhodecode.com/dl/rhodecode-tools/latest
26 Downloading latest (143kB): 143kB downloaded
27 Running setup.py (path:/tmp/pip-9qYsxf-build/setup.py) egg_info
28 for package from https://my.rhodecode.com/dl/rhodecode-tools/latest
29
30 2. Once |RCT| are upgraded to the latest version, you can install the latest
31 extensions using the following example:
32
33 .. code-block:: bash
34
35 (venv)$ rhodecode-extensions --instance-name=enterprise-1 \
36 --ini-file=rhodecode.ini --plugins
37
38 Extension file already exists, do you want to overwrite it? [y/N]: y
39 Writen new extensions file to rcextensions
40 Copied hipchat_push_notify.py plugin to rcextensions
41 Copied jira_pr_flow.py plugin to rcextensions
42 Copied default_reviewers.py plugin to rcextensions
43 Copied extract_commits.py plugin to rcextensions
44 Copied extract_issues.py plugin to rcextensions
45 Copied redmine_pr_flow.py plugin to rcextensions
46 Copied extra_fields.py plugin to rcextensions
47 Copied jira_smart_commits.py plugin to rcextensions
48 Copied http_notify.py plugin to rcextensions
49 Copied slack_push_notify.py plugin to rcextensions
50 Copied slack_message.py plugin to rcextensions
51 Copied extract_jira_issues.py plugin to rcextensions
52 Copied extract_redmine_issues.py plugin to rcextensions
53 Copied redmine_smart_commits.py plugin to rcextensions
54 Copied send_mail.py plugin to rcextensions
55
@@ -1,151 +0,0 b''
1 .. _slack-int:
2
3 Integrate Slack
4 ===============
5
6 To integrate |RCE| and Slack, you need to configure some things on the Slack
7 side of the integration, and some things on the |RCE| side.
8
9 On the Slack side you need to allow incoming webhooks, see their
10 documentation on this, `Slack Webhooks`_. You will also need to get an
11 Authorization Token from Slack that will allow |RCE| to post to your account.
12
13 On the |RCE| side, this is an overview of what you need to do:
14
15 1. Configure the built-in Slack extensions to post to the correct Slack URL.
16 2. Set your Slack authentication details in the |RCX| :file:`__init.py__` file.
17 3. Configure the different hooks in the :file:`__init.py__` file to extract
18 whatever information you want from |RCE|, and then using the Slack extensions
19 post that information to your Slack channel.
20
21 .. hint::
22
23 The below examples should help you to get started. Once you have your
24 integration up and running, there is a more detailed Slack integration in
25 the :ref:`int-full-blown` section.
26
27 Configure Built-in Extensions
28 -----------------------------
29
30 |RCE| comes with 3 Slack extensions: ``slack_message.py``,
31 ``slack_push_notify.py``, and ``slack.py``. The default
32 location is :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions`.
33
34 To enable these to post to your Slack account, configure each of
35 these files with the following Slack details.
36
37 .. code-block:: python
38
39 BASE_URL = 'https://your.slack.com/api/link'
40 INCOMING_WEBHOOK_URL = 'https://hooks.slack.com/services/your/hook/link'
41 API_VERSION = 1
42
43 Configure |RCE| to Post to Slack
44 --------------------------------
45
46 In the |RCX| :file:`__init.py__` file, configure your Slack authentication
47 details. The default location is
48 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions`
49
50 .. code-block:: python
51
52 CONFIG = DotDict(
53 slack=DotDict(
54 api_key='api-key',
55 api_url='slack-incoming-hook-url',
56 default_room='#slack-channel',
57 default_plugin_config={},
58 ),
59 )
60
61 # slack conf
62 CONFIG.slack.default_plugin_config = {
63 'INCOMING_WEBHOOK_URL': CONFIG.slack.api_url,
64 'SLACK_TOKEN': CONFIG.slack.api_key,
65 'SLACK_ROOM': CONFIG.slack.default_room,
66 'SLACK_FROM': 'RhodeCode',
67 'SLACK_FROM_ICON_EMOJI': ':rhodecode:',
68 }
69
70 Add Push Notifications to Slack
71 -------------------------------
72
73 To add notification to Slack when someone pushes to |RCE|, configure the push
74 hook to extract the commits pushed, and then call the built-in
75 ``slack_push_notify.py`` extension to post them into your chosen Slack
76 channel. To do this, add the following code to the push hook section of the
77 :file:`__init.py__` file
78
79 .. code-block:: python
80 :emphasize-lines: 10-16,18-22
81
82 def _push_hook(*args, **kwargs):
83 """
84 POST PUSH HOOK, this function will be executed after each push, it's
85 executed after the build-in hook that RhodeCode uses for logging pushes
86 kwargs available:
87 """
88 # backward compat
89 kwargs['commit_ids'] = kwargs['pushed_revs']
90
91 # fetch pushed commits, from commit_ids list
92 call = load_extension('extract_commits.py')
93 extracted_commits = {}
94 if call:
95 extracted_commits = call(**kwargs)
96 # store the commits for the next call chain
97 kwargs['COMMITS'] = extracted_commits
98
99 # slack !
100 call = load_extension('slack_push_notify.py')
101 if call:
102 kwargs.update(CONFIG.slack.default_plugin_config)
103 call(**kwargs)
104 return 0
105 PUSH_HOOK = _push_hook
106
107
108 Add Pull Request Notifications to Slack
109 ---------------------------------------
110
111 To add |pr| notifications to Slack, use the following example. This example
112 shows a merged |pr| notification. You can add similar notifications to the
113 following hooks in the :file:`__init.py__` file, and for those examples see
114 the :ref:`int-full-blown` section:
115
116 * ``_create_pull_request_hook``
117 * ``_review_pull_request_hook``
118 * ``_update_pull_request_hook``
119 * ``_close_pull_request_hook``
120
121 .. code-block:: python
122 :emphasize-lines: 5-23
123
124 def _merge_pull_request_hook(*args, **kwargs):
125 """
126
127 """
128 # extract below from source repo as commits are there
129 kwargs['REPOSITORY'] = kwargs['source']['repository']
130
131 # fetch pushed commits, from commit_ids list
132 call = load_extension('extract_commits.py')
133 extracted_commits = {}
134 if call:
135 extracted_commits = call(**kwargs)
136 # store the commits for the next call chain
137 kwargs['COMMITS'] = extracted_commits
138
139 # slack notification on merging PR
140 call = load_extension('slack_message.py')
141 if call:
142 kwargs.update(CONFIG.slack.default_plugin_config)
143 kwargs['SLACK_ROOM'] = '#develop'
144 kwargs['SLACK_MESSAGE'] = 'Pull request <%s|#%s> (%s) was merged.' % (
145 kwargs.get('url'), kwargs.get('pull_request_id'), kwargs.get('title'))
146 call(**kwargs)
147
148 return 0
149 MERGE_PULL_REQUEST = _merge_pull_request_hook
150
151 .. _Slack Webhooks: https://api.slack.com/incoming-webhooks
@@ -1,53 +0,0 b''
1 .. _rc-ext:
2
3 |RCX|
4 -----
5
6 |RCX| add additional functionality for push/pull/create/delete |repo| hooks.
7 These hooks can be used to send signals to build-bots such as `Jenkins`_. It
8 also adds built in plugin and extension support. Once installed, you will see
9 a :file:`rcextensions` folder in the instance directory, for example:
10 :file:`home/{user}/.rccontrol/{instance-id}/rcextensions`
11
12 Built-in Plugins
13 ^^^^^^^^^^^^^^^^
14
15 * A number of `Jira`_ plugins, enabling you to integrate with that issue
16 tracker: ``extract_jira_issues.py``, ``jira_pr_flow.py``,
17 ``jira_smart_commits.py``
18 * A number of `Redmine`_ plugins, enabling you to integrate with that issue
19 tracker: ``extract_redmine_issues.py``, ``redmine_pr_flow.py``,
20 ``redmine_smart_commits.py``.
21 * ``hipchat.py`` and ``hipchat_push.py`` enable you to integrate with
22 `HipChat`_ and set channel or user notifications.
23 * ``slack.py``, ``slack_message.py``, and ``slack_push_notify.py`` enable
24 you to integrate with `Slack`_ and set channel or user notifications.
25
26 Built-in Extensions
27 ^^^^^^^^^^^^^^^^^^^
28
29 * ``commit_parser.py``: Enables you to parse commit messages,
30 and set a list of users to get notifications about change sets.
31 * ``default_reviewers.py``: Enables you to add default reviewers to a |pr|.
32 * ``extra_fields.py``: Returns a list of extra fields added to a |repo|.
33 * ``http_notify``: Enables you to send data over a web hook.
34 * ``mail.py`` : This extension uses the |RCE| mail configuration from the
35 instance :file:`rhodecode.ini` file to send email.
36 * ``push_post.py``: Enables you to set up push based actions such as
37 automated Jenkins builds.
38
39 Event Listeners
40 ^^^^^^^^^^^^^^^
41
42 To enable the extensions to listen to the different events that they are
43 configured for, you need to also set up an event listener (hook). Event
44 listeners are configured in the
45 :file:`/home/{user}/.rccontrol/{instance-id}/rcextensions/__init.__.py` file.
46
47 For more details, see the example hook in :ref:`event-listener`.
48
49 .. _Jenkins: http://jenkins-ci.org/
50 .. _HipChat: https://www.hipchat.com/
51 .. _Slack: https://slack.com/
52 .. _Redmine: http://www.redmine.org/
53 .. _Jira: https://www.atlassian.com/software/jira
@@ -1,30 +0,0 b''
1 # Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
2 { fetchbower, buildEnv }:
3 buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
4 (fetchbower "webcomponentsjs" "1.2.3" "^1.2.3" "0db2fjk779rhl9d4ifpk1j9a83vngx6j3hk7si1752dqxj857267")
5 (fetchbower "polymer" "Polymer/polymer#2.6.0" "Polymer/polymer#^2.6.0" "1jw5syjn0naa7dlxzxvsgwb20zbkbpx0pcg0wzjq4wr49c20nw0k")
6 (fetchbower "paper-button" "PolymerElements/paper-button#2.1.2" "PolymerElements/paper-button#^2.1.2" "1lwmjwhvimh02gss39yjp5h7yg9mxl1ig59yrk085v86y5f5ilz1")
7 (fetchbower "paper-spinner" "PolymerElements/paper-spinner#2.1.0" "PolymerElements/paper-spinner#^2.1.0" "07jamgxzvy4r9pgf5ikj1fm8nkrw6sywgcxvmm7ax58hjvmd4i45")
8 (fetchbower "paper-tooltip" "PolymerElements/paper-tooltip#2.1.1" "PolymerElements/paper-tooltip#^2.1.1" "0ja9vz4xps7dxfx6kmrwq0gifbjsyc3pk9l3hd5233ss72ghlvgb")
9 (fetchbower "paper-toast" "PolymerElements/paper-toast#2.1.2" "PolymerElements/paper-toast#^2.1.2" "0mkj9ayjx2l9hvrz4kw3yjbgrs9w873k05ywv94nh92mzpjkxn04")
10 (fetchbower "paper-toggle-button" "PolymerElements/paper-toggle-button#2.1.1" "PolymerElements/paper-toggle-button#^2.1.1" "1rl5ar3ny6r3v9hr8s68v8b3zh5yl52pikhi4b9iv9grv29g5999")
11 (fetchbower "iron-ajax" "PolymerElements/iron-ajax#2.1.3" "PolymerElements/iron-ajax#^2.1.3" "187zb6lkv18yapl292qhn611mbl4i2bqs2dimlwmdjaln285nc1l")
12 (fetchbower "iron-autogrow-textarea" "PolymerElements/iron-autogrow-textarea#2.2.0" "PolymerElements/iron-autogrow-textarea#^2.2.0" "1cx7g49m20z08x25z24g2pvv6m6dwfbkga3nsw0rpi3jk7xhznqw")
13 (fetchbower "iron-a11y-keys" "PolymerElements/iron-a11y-keys#2.1.2" "PolymerElements/iron-a11y-keys#^2.1.2" "0zdn3bzfrk88iwahmmzvcjn3m90zga1l8dx42b365n8if0n0zapj")
14 (fetchbower "shadycss" "webcomponents/shadycss#1.3.5" "webcomponents/shadycss#^v1.1.0" "1xp07d6jlmc3ywg4cdp2nijwi0vrbzw468242xz0s6zx5z2n2wzf")
15 (fetchbower "iron-flex-layout" "PolymerElements/iron-flex-layout#2.0.3" "PolymerElements/iron-flex-layout#1 - 2" "1ir9ili3rkcgbfj6is5s70vyb7m6avz0av0lpjjlhhsplrrl90bk")
16 (fetchbower "paper-behaviors" "PolymerElements/paper-behaviors#2.1.1" "PolymerElements/paper-behaviors#1 - 2" "0wzyznmy1q64jsm6lck0xma92lg2hz9h9m05r68iy20iyrvbjld7")
17 (fetchbower "paper-styles" "PolymerElements/paper-styles#2.1.0" "PolymerElements/paper-styles#1 - 2" "0xzsd7pvjsk7lgcmvx4q0dvps40q3mymkx26zgs8ns91s1ssfqbx")
18 (fetchbower "iron-a11y-announcer" "PolymerElements/iron-a11y-announcer#2.1.0" "PolymerElements/iron-a11y-announcer#1 - 2" "1hvmw76im8y3pxmg1yfnlkzap429q9i4v1z42y7m8lz0996jmxrz")
19 (fetchbower "iron-overlay-behavior" "PolymerElements/iron-overlay-behavior#2.3.4" "PolymerElements/iron-overlay-behavior#1 - 2" "0hk2fxhfz7kg27349qz1c87vq6nfdcnjr9az3q95ak3rigsb71wg")
20 (fetchbower "iron-fit-behavior" "PolymerElements/iron-fit-behavior#2.2.1" "PolymerElements/iron-fit-behavior#1 - 2" "0v89am4r2fncr7m9k0f2xqh5bvgn2dqjjc7p515ix4grk89whbs3")
21 (fetchbower "iron-checked-element-behavior" "PolymerElements/iron-checked-element-behavior#2.1.1" "PolymerElements/iron-checked-element-behavior#1 - 2" "00gpvnb7anspadw59av7lca6p03qlx59dgnhw3lqf5v223dsh0l3")
22 (fetchbower "iron-behaviors" "PolymerElements/iron-behaviors#2.1.1" "PolymerElements/iron-behaviors#1 - 2" "0c71l1il76jg8gvyh8bwlqraif53gfnz5700vpg35qyr1biwbr1w")
23 (fetchbower "iron-validatable-behavior" "PolymerElements/iron-validatable-behavior#2.1.0" "PolymerElements/iron-validatable-behavior#1 - 2" "1j65zv7hcxdcyyanzhp2wap3bnx7cz8ghd44m12fad2206jj6ysi")
24 (fetchbower "iron-a11y-keys-behavior" "PolymerElements/iron-a11y-keys-behavior#2.1.1" "PolymerElements/iron-a11y-keys-behavior#1 - 2" "0jsw7wvh4wzcjqdbvxyha99h1ph61lykyyyvdb6hm8m8w40bhs9b")
25 (fetchbower "paper-ripple" "PolymerElements/paper-ripple#2.1.1" "PolymerElements/paper-ripple#1 - 2" "0sam6w83nxf9mss79j6hjfsx0288pf4hwr1bw5xclzgpddcjmrm5")
26 (fetchbower "font-roboto" "PolymerElements/font-roboto#1.1.0" "PolymerElements/font-roboto#^1.0.1" "0z4msvaa5pnr84j2r957g313fmdbdbrknhdw1axy5g48845yv04s")
27 (fetchbower "iron-resizable-behavior" "PolymerElements/iron-resizable-behavior#2.1.1" "PolymerElements/iron-resizable-behavior#1 - 2" "0169rg6kby0ypfiwbkin46ywaszwj7r91yn081yqd96l1115aqnk")
28 (fetchbower "iron-form-element-behavior" "PolymerElements/iron-form-element-behavior#2.1.3" "PolymerElements/iron-form-element-behavior#1 - 2" "1c83kkfqvb5pdlvrhad3l7b11i244a8lykc8kzfnb9ya0xrln0cn")
29 (fetchbower "iron-meta" "PolymerElements/iron-meta#2.1.1" "PolymerElements/iron-meta#1 - 2" "12w1pcl3w97xpxihqddbf2d9dx8xz5i1jd9bz1xrmfsh25isni40")
30 ]; }
@@ -1,33 +0,0 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 import imp
22
23
24 def create_module(name, path):
25 """
26 Returns module created *on the fly*. Returned module would have name same
27 as given ``name`` and would contain code read from file at the given
28 ``path`` (it may also be a zip or package containing *__main__* module).
29 """
30 module = imp.new_module(name)
31 module.__file__ = path
32 execfile(path, module.__dict__)
33 return module
1 NO CONTENT: file was removed
NO CONTENT: file was removed
@@ -1,13 +0,0 b''
1
2
3 class InvalidMessage(RuntimeError):
4 """
5 Raised if message is missing vital headers, such
6 as recipients or sender address.
7 """
8
9
10 class BadHeaders(RuntimeError):
11 """
12 Raised if message contains newlines in headers.
13 """
@@ -1,188 +0,0 b''
1 from rhodecode.lib.rcmail.response import MailResponse
2
3 from rhodecode.lib.rcmail.exceptions import BadHeaders
4 from rhodecode.lib.rcmail.exceptions import InvalidMessage
5
6
7 class Attachment(object):
8 """
9 Encapsulates file attachment information.
10
11 :param filename: filename of attachment
12 :param content_type: file mimetype
13 :param data: the raw file data, either as string or file obj
14 :param disposition: content-disposition (if any)
15 """
16
17 def __init__(self,
18 filename=None,
19 content_type=None,
20 data=None,
21 disposition=None):
22
23 self.filename = filename
24 self.content_type = content_type
25 self.disposition = disposition or 'attachment'
26 self._data = data
27
28 @property
29 def data(self):
30 if isinstance(self._data, basestring):
31 return self._data
32 self._data = self._data.read()
33 return self._data
34
35
36 class Message(object):
37 """
38 Encapsulates an email message.
39
40 :param subject: email subject header
41 :param recipients: list of email addresses
42 :param body: plain text message
43 :param html: HTML message
44 :param sender: email sender address
45 :param cc: CC list
46 :param bcc: BCC list
47 :param extra_headers: dict of extra email headers
48 :param attachments: list of Attachment instances
49 :param recipients_separator: alternative separator for any of
50 'From', 'To', 'Delivered-To', 'Cc', 'Bcc' fields
51 """
52
53 def __init__(self,
54 subject=None,
55 recipients=None,
56 body=None,
57 html=None,
58 sender=None,
59 cc=None,
60 bcc=None,
61 extra_headers=None,
62 attachments=None,
63 recipients_separator="; "):
64
65 self.subject = subject or ''
66 self.sender = sender
67 self.body = body
68 self.html = html
69
70 self.recipients = recipients or []
71 self.attachments = attachments or []
72 self.cc = cc or []
73 self.bcc = bcc or []
74 self.extra_headers = extra_headers or {}
75
76 self.recipients_separator = recipients_separator
77
78 @property
79 def send_to(self):
80 return set(self.recipients) | set(self.bcc or ()) | set(self.cc or ())
81
82 def to_message(self):
83 """
84 Returns raw email.Message instance.Validates message first.
85 """
86
87 self.validate()
88
89 return self.get_response().to_message()
90
91 def get_response(self):
92 """
93 Creates a Lamson MailResponse instance
94 """
95
96 response = MailResponse(Subject=self.subject,
97 To=self.recipients,
98 From=self.sender,
99 Body=self.body,
100 Html=self.html,
101 separator=self.recipients_separator)
102
103 if self.cc:
104 response.base['Cc'] = self.cc
105
106 for attachment in self.attachments:
107
108 response.attach(attachment.filename,
109 attachment.content_type,
110 attachment.data,
111 attachment.disposition)
112
113 response.update(self.extra_headers)
114
115 return response
116
117 def _get_headers(self):
118 headers = [self.subject, self.sender]
119 headers += list(self.send_to)
120 headers += self.extra_headers.values()
121 return headers
122
123 def is_bad_headers(self):
124 """
125 Checks for bad headers i.e. newlines in subject, sender or recipients.
126 """
127
128 headers = self._get_headers()
129
130 for val in headers:
131 for c in '\r\n':
132 if c in val:
133 return True
134 return False
135
136 def validate(self):
137 """
138 Checks if message is valid and raises appropriate exception.
139 """
140
141 if not self.recipients:
142 raise InvalidMessage("No recipients have been added")
143
144 if not self.body and not self.html:
145 raise InvalidMessage("No body has been set")
146
147 if not self.sender:
148 raise InvalidMessage("No sender address has been set")
149
150 if self.is_bad_headers():
151 headers = self._get_headers()
152 raise BadHeaders(headers)
153
154 def add_recipient(self, recipient):
155 """
156 Adds another recipient to the message.
157
158 :param recipient: email address of recipient.
159 """
160
161 self.recipients.append(recipient)
162
163 def add_cc(self, recipient):
164 """
165 Adds an email address to the CC list.
166
167 :param recipient: email address of recipient.
168 """
169
170 self.cc.append(recipient)
171
172 def add_bcc(self, recipient):
173 """
174 Adds an email address to the BCC list.
175
176 :param recipient: email address of recipient.
177 """
178
179 self.bcc.append(recipient)
180
181 def attach(self, attachment):
182 """
183 Adds an attachment to the message.
184
185 :param attachment: an **Attachment** instance.
186 """
187
188 self.attachments.append(attachment)
@@ -1,454 +0,0 b''
1 # The code in this module is entirely lifted from the Lamson project
2 # (http://lamsonproject.org/). Its copyright is:
3
4 # Copyright (c) 2008, Zed A. Shaw
5 # All rights reserved.
6
7 # It is provided under this license:
8
9 # Redistribution and use in source and binary forms, with or without
10 # modification, are permitted provided that the following conditions are met:
11
12 # * Redistributions of source code must retain the above copyright notice, this
13 # list of conditions and the following disclaimer.
14
15 # * Redistributions in binary form must reproduce the above copyright notice,
16 # this list of conditions and the following disclaimer in the documentation
17 # and/or other materials provided with the distribution.
18
19 # * Neither the name of the Zed A. Shaw nor the names of its contributors may
20 # be used to endorse or promote products derived from this software without
21 # specific prior written permission.
22
23 # THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24 # "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25 # LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
26 # FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
27 # COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
28 # INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
29 # (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
30 # SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
31 # HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
32 # STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
33 # ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
34 # POSSIBILITY OF SUCH DAMAGE.
35
36 import os
37 import mimetypes
38 import string
39 from email import encoders
40 from email.charset import Charset
41 from email.utils import parseaddr
42 from email.mime.base import MIMEBase
43
44 ADDRESS_HEADERS_WHITELIST = ['From', 'To', 'Delivered-To', 'Cc']
45 DEFAULT_ENCODING = "utf-8"
46 VALUE_IS_EMAIL_ADDRESS = lambda v: '@' in v
47
48
49 def normalize_header(header):
50 return string.capwords(header.lower(), '-')
51
52
53 class EncodingError(Exception):
54 """Thrown when there is an encoding error."""
55 pass
56
57
58 class MailBase(object):
59 """MailBase is used as the basis of lamson.mail and contains the basics of
60 encoding an email. You actually can do all your email processing with this
61 class, but it's more raw.
62 """
63 def __init__(self, items=()):
64 self.headers = dict(items)
65 self.parts = []
66 self.body = None
67 self.content_encoding = {'Content-Type': (None, {}),
68 'Content-Disposition': (None, {}),
69 'Content-Transfer-Encoding': (None, {})}
70
71 def __getitem__(self, key):
72 return self.headers.get(normalize_header(key), None)
73
74 def __len__(self):
75 return len(self.headers)
76
77 def __iter__(self):
78 return iter(self.headers)
79
80 def __contains__(self, key):
81 return normalize_header(key) in self.headers
82
83 def __setitem__(self, key, value):
84 self.headers[normalize_header(key)] = value
85
86 def __delitem__(self, key):
87 del self.headers[normalize_header(key)]
88
89 def __nonzero__(self):
90 return self.body is not None or len(self.headers) > 0 or len(self.parts) > 0
91
92 def keys(self):
93 """Returns the sorted keys."""
94 return sorted(self.headers.keys())
95
96 def attach_file(self, filename, data, ctype, disposition):
97 """
98 A file attachment is a raw attachment with a disposition that
99 indicates the file name.
100 """
101 assert filename, "You can't attach a file without a filename."
102 ctype = ctype.lower()
103
104 part = MailBase()
105 part.body = data
106 part.content_encoding['Content-Type'] = (ctype, {'name': filename})
107 part.content_encoding['Content-Disposition'] = (disposition,
108 {'filename': filename})
109 self.parts.append(part)
110
111 def attach_text(self, data, ctype):
112 """
113 This attaches a simpler text encoded part, which doesn't have a
114 filename.
115 """
116 ctype = ctype.lower()
117
118 part = MailBase()
119 part.body = data
120 part.content_encoding['Content-Type'] = (ctype, {})
121 self.parts.append(part)
122
123 def walk(self):
124 for p in self.parts:
125 yield p
126 for x in p.walk():
127 yield x
128
129
130 class MailResponse(object):
131 """
132 You are given MailResponse objects from the lamson.view methods, and
133 whenever you want to generate an email to send to someone. It has the
134 same basic functionality as MailRequest, but it is designed to be written
135 to, rather than read from (although you can do both).
136
137 You can easily set a Body or Html during creation or after by passing it
138 as __init__ parameters, or by setting those attributes.
139
140 You can initially set the From, To, and Subject, but they are headers so
141 use the dict notation to change them: msg['From'] = 'joe@test.com'.
142
143 The message is not fully crafted until right when you convert it with
144 MailResponse.to_message. This lets you change it and work with it, then
145 send it out when it's ready.
146 """
147 def __init__(self, To=None, From=None, Subject=None, Body=None, Html=None,
148 separator="; "):
149 self.Body = Body
150 self.Html = Html
151 self.base = MailBase([('To', To), ('From', From), ('Subject', Subject)])
152 self.multipart = self.Body and self.Html
153 self.attachments = []
154 self.separator = separator
155
156 def __contains__(self, key):
157 return self.base.__contains__(key)
158
159 def __getitem__(self, key):
160 return self.base.__getitem__(key)
161
162 def __setitem__(self, key, val):
163 return self.base.__setitem__(key, val)
164
165 def __delitem__(self, name):
166 del self.base[name]
167
168 def attach(self, filename=None, content_type=None, data=None,
169 disposition=None):
170 """
171
172 Simplifies attaching files from disk or data as files. To attach
173 simple text simple give data and a content_type. To attach a file,
174 give the data/content_type/filename/disposition combination.
175
176 For convenience, if you don't give data and only a filename, then it
177 will read that file's contents when you call to_message() later. If
178 you give data and filename then it will assume you've filled data
179 with what the file's contents are and filename is just the name to
180 use.
181 """
182
183 assert filename or data, ("You must give a filename or some data to "
184 "attach.")
185 assert data or os.path.exists(filename), ("File doesn't exist, and no "
186 "data given.")
187
188 self.multipart = True
189
190 if filename and not content_type:
191 content_type, encoding = mimetypes.guess_type(filename)
192
193 assert content_type, ("No content type given, and couldn't guess "
194 "from the filename: %r" % filename)
195
196 self.attachments.append({'filename': filename,
197 'content_type': content_type,
198 'data': data,
199 'disposition': disposition,})
200
201 def attach_part(self, part):
202 """
203 Attaches a raw MailBase part from a MailRequest (or anywhere)
204 so that you can copy it over.
205 """
206 self.multipart = True
207
208 self.attachments.append({'filename': None,
209 'content_type': None,
210 'data': None,
211 'disposition': None,
212 'part': part,
213 })
214
215 def attach_all_parts(self, mail_request):
216 """
217 Used for copying the attachment parts of a mail.MailRequest
218 object for mailing lists that need to maintain attachments.
219 """
220 for part in mail_request.all_parts():
221 self.attach_part(part)
222
223 self.base.content_encoding = mail_request.base.content_encoding.copy()
224
225 def clear(self):
226 """
227 Clears out the attachments so you can redo them. Use this to keep the
228 headers for a series of different messages with different attachments.
229 """
230 del self.attachments[:]
231 del self.base.parts[:]
232 self.multipart = False
233
234 def update(self, message):
235 """
236 Used to easily set a bunch of heading from another dict
237 like object.
238 """
239 for k in message.keys():
240 self.base[k] = message[k]
241
242 def __str__(self):
243 """
244 Converts to a string.
245 """
246 return self.to_message().as_string()
247
248 def _encode_attachment(self, filename=None, content_type=None, data=None,
249 disposition=None, part=None):
250 """
251 Used internally to take the attachments mentioned in self.attachments
252 and do the actual encoding in a lazy way when you call to_message.
253 """
254 if part:
255 self.base.parts.append(part)
256 elif filename:
257 if not data:
258 with open(filename) as f:
259 data = f.read()
260
261 self.base.attach_file(filename, data, content_type,
262 disposition or 'attachment')
263 else:
264 self.base.attach_text(data, content_type)
265
266 ctype = self.base.content_encoding['Content-Type'][0]
267
268 if ctype and not ctype.startswith('multipart'):
269 self.base.content_encoding['Content-Type'] = ('multipart/mixed', {})
270
271 def to_message(self):
272 """
273 Figures out all the required steps to finally craft the
274 message you need and return it. The resulting message
275 is also available as a self.base attribute.
276
277 What is returned is a Python email API message you can
278 use with those APIs. The self.base attribute is the raw
279 lamson.encoding.MailBase.
280 """
281 del self.base.parts[:]
282
283 if self.Body and self.Html:
284 self.multipart = True
285 self.base.content_encoding['Content-Type'] = (
286 'multipart/alternative', {})
287
288 if self.multipart:
289 self.base.body = None
290 if self.Body:
291 self.base.attach_text(self.Body, 'text/plain')
292
293 if self.Html:
294 self.base.attach_text(self.Html, 'text/html')
295
296 for args in self.attachments:
297 self._encode_attachment(**args)
298
299 elif self.Body:
300 self.base.body = self.Body
301 self.base.content_encoding['Content-Type'] = ('text/plain', {})
302
303 elif self.Html:
304 self.base.body = self.Html
305 self.base.content_encoding['Content-Type'] = ('text/html', {})
306
307 return to_message(self.base, separator=self.separator)
308
309 def all_parts(self):
310 """
311 Returns all the encoded parts. Only useful for debugging
312 or inspecting after calling to_message().
313 """
314 return self.base.parts
315
316 def keys(self):
317 return self.base.keys()
318
319
320 def to_message(mail, separator="; "):
321 """
322 Given a MailBase message, this will construct a MIMEPart
323 that is canonicalized for use with the Python email API.
324 """
325 ctype, params = mail.content_encoding['Content-Type']
326
327 if not ctype:
328 if mail.parts:
329 ctype = 'multipart/mixed'
330 else:
331 ctype = 'text/plain'
332 else:
333 if mail.parts:
334 assert ctype.startswith(("multipart", "message")), \
335 "Content type should be multipart or message, not %r" % ctype
336
337 # adjust the content type according to what it should be now
338 mail.content_encoding['Content-Type'] = (ctype, params)
339
340 try:
341 out = MIMEPart(ctype, **params)
342 except TypeError as exc: # pragma: no cover
343 raise EncodingError("Content-Type malformed, not allowed: %r; "
344 "%r (Python ERROR: %s" %
345 (ctype, params, exc.message))
346
347 for k in mail.keys():
348 if k in ADDRESS_HEADERS_WHITELIST:
349 out[k.encode('ascii')] = header_to_mime_encoding(
350 mail[k],
351 not_email=False,
352 separator=separator
353 )
354 else:
355 out[k.encode('ascii')] = header_to_mime_encoding(
356 mail[k],
357 not_email=True
358 )
359
360 out.extract_payload(mail)
361
362 # go through the children
363 for part in mail.parts:
364 out.attach(to_message(part))
365
366 return out
367
368
369 class MIMEPart(MIMEBase):
370 """
371 A reimplementation of nearly everything in email.mime to be more useful
372 for actually attaching things. Rather than one class for every type of
373 thing you'd encode, there's just this one, and it figures out how to
374 encode what you ask it.
375 """
376 def __init__(self, type, **params):
377 self.maintype, self.subtype = type.split('/')
378 MIMEBase.__init__(self, self.maintype, self.subtype, **params)
379
380 def add_text(self, content):
381 # this is text, so encode it in canonical form
382 try:
383 encoded = content.encode('ascii')
384 charset = 'ascii'
385 except UnicodeError:
386 encoded = content.encode('utf-8')
387 charset = 'utf-8'
388
389 self.set_payload(encoded, charset=charset)
390
391 def extract_payload(self, mail):
392 if mail.body is None:
393 return # only None, '' is still ok
394
395 ctype, ctype_params = mail.content_encoding['Content-Type']
396 cdisp, cdisp_params = mail.content_encoding['Content-Disposition']
397
398 assert ctype, ("Extract payload requires that mail.content_encoding "
399 "have a valid Content-Type.")
400
401 if ctype.startswith("text/"):
402 self.add_text(mail.body)
403 else:
404 if cdisp:
405 # replicate the content-disposition settings
406 self.add_header('Content-Disposition', cdisp, **cdisp_params)
407
408 self.set_payload(mail.body)
409 encoders.encode_base64(self)
410
411 def __repr__(self):
412 return "<MIMEPart '%s/%s': %r, %r, multipart=%r>" % (
413 self.subtype,
414 self.maintype,
415 self['Content-Type'],
416 self['Content-Disposition'],
417 self.is_multipart())
418
419
420 def header_to_mime_encoding(value, not_email=False, separator=", "):
421 if not value:
422 return ""
423
424 encoder = Charset(DEFAULT_ENCODING)
425 if type(value) == list:
426 return separator.join(properly_encode_header(
427 v, encoder, not_email) for v in value)
428 else:
429 return properly_encode_header(value, encoder, not_email)
430
431
432 def properly_encode_header(value, encoder, not_email):
433 """
434 The only thing special (weird) about this function is that it tries
435 to do a fast check to see if the header value has an email address in
436 it. Since random headers could have an email address, and email addresses
437 have weird special formatting rules, we have to check for it.
438
439 Normally this works fine, but in Librelist, we need to "obfuscate" email
440 addresses by changing the '@' to '-AT-'. This is where
441 VALUE_IS_EMAIL_ADDRESS exists. It's a simple lambda returning True/False
442 to check if a header value has an email address. If you need to make this
443 check different, then change this.
444 """
445 try:
446 return value.encode("ascii")
447 except UnicodeEncodeError:
448 if not not_email and VALUE_IS_EMAIL_ADDRESS(value):
449 # this could have an email address, make sure we don't screw it up
450 name, address = parseaddr(value)
451 return '"%s" <%s>' % (
452 encoder.header_encode(name.encode("utf-8")), address)
453
454 return encoder.header_encode(value.encode("utf-8"))
@@ -1,120 +0,0 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2013-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 """
22 Simple smtp mailer used in RhodeCode
23 """
24
25 import time
26 import logging
27 import socket
28 from email.utils import formatdate
29
30 from rhodecode.lib.rcmail.message import Message
31 from rhodecode.lib.rcmail.utils import DNS_NAME
32
33 log = logging.getLogger(__name__)
34
35
36 class SmtpMailer(object):
37 """
38 SMTP mailer class
39
40 mailer = SmtpMailer(mail_from, user, passwd, mail_server, smtp_auth
41 mail_port, ssl, tls)
42 mailer.send(recipients, subject, body, attachment_files)
43
44 :param recipients might be a list of string or single string
45 :param attachment_files is a dict of {filename:location}
46 it tries to guess the mimetype and attach the file
47
48 """
49
50 def __init__(self, mail_from, user, passwd, mail_server, smtp_auth=None,
51 mail_port=None, ssl=False, tls=False, debug=False):
52
53 self.mail_from = mail_from
54 self.mail_server = mail_server
55 self.mail_port = mail_port
56 self.user = user
57 self.passwd = passwd
58 self.ssl = ssl
59 self.tls = tls
60 self.debug = debug
61 self.auth = smtp_auth
62
63 def _get_smptlib(self):
64 # patch the output
65 import smtplib
66
67 class StderrLogger(object):
68
69 def write(self, message):
70 log.debug(message)
71
72 org_stderr = smtplib.stderr
73 smtplib.stderr = StderrLogger()
74 return smtplib
75
76 def send(self, recipients=None, subject='', body='', html='',
77 attachment_files=None):
78 recipients = recipients or []
79 if isinstance(recipients, basestring):
80 recipients = [recipients]
81 headers = {
82 'Date': formatdate(time.time())
83 }
84 msg = Message(subject, recipients, body, html, self.mail_from,
85 recipients_separator=", ", extra_headers=headers)
86 raw_msg = msg.to_message()
87
88 # patched smtplib without stderr
89 smtplib = self._get_smptlib()
90 if self.ssl:
91 smtp_serv = smtplib.SMTP_SSL(self.mail_server, self.mail_port,
92 local_hostname=DNS_NAME.get_fqdn())
93 else:
94 smtp_serv = smtplib.SMTP(self.mail_server, self.mail_port,
95 local_hostname=DNS_NAME.get_fqdn())
96
97 if self.tls:
98 smtp_serv.ehlo()
99 smtp_serv.starttls()
100
101 if self.debug:
102 smtp_serv.set_debuglevel(1)
103
104 smtp_serv.ehlo()
105 if self.auth:
106 smtp_serv.esmtp_features["auth"] = self.auth
107
108 # if server requires authorization you must provide login and password
109 # but only if we have them
110 if self.user and self.passwd:
111 smtp_serv.login(self.user, self.passwd)
112
113 smtp_serv.sendmail(msg.sender, msg.send_to, raw_msg.as_string())
114 log.info('email sent to: %s' % recipients)
115
116 try:
117 smtp_serv.quit()
118 except socket.sslerror:
119 # sslerror is raised in tls connections on closing sometimes
120 smtp_serv.close()
@@ -1,39 +0,0 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 """
22 Email message and email sending related helper functions.
23 """
24
25 import socket
26
27
28 # Cache the hostname, but do it lazily: socket.getfqdn() can take a couple of
29 # seconds, which slows down the restart of the server.
30 class CachedDnsName(object):
31 def __str__(self):
32 return self.get_fqdn()
33
34 def get_fqdn(self):
35 if not hasattr(self, '_fqdn'):
36 self._fqdn = socket.getfqdn()
37 return self._fqdn
38
39 DNS_NAME = CachedDnsName()
@@ -1,51 +0,0 b''
1
2 @font-face {
3 font-family: 'proximanovaregular';
4 src: url('../fonts/ProximaNova/ProximaNova-Regular.eot'); /* IE9 Compat Modes */
5 src: url('../fonts/ProximaNova/ProximaNova-Regular.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
6 url('../fonts/ProximaNova/ProximaNova-Regular.woff') format('woff'), /* Modern Browsers */
7 url('../fonts/ProximaNova/ProximaNova-Regular.ttf') format('truetype');
8 font-style: normal;
9 font-weight: normal;
10 text-rendering: optimizeLegibility;
11 }
12 @font-face {
13 font-family: 'proximanovaitalic';
14 src: url('../fonts/ProximaNova/ProximaNova-Italic.eot'); /* IE9 Compat Modes */
15 src: url('../fonts/ProximaNova/ProximaNova-Italic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
16 url('../fonts/ProximaNova/ProximaNova-Italic.woff') format('woff'), /* Modern Browsers */
17 url('../fonts/ProximaNova/ProximaNova-Italic.ttf') format('truetype');
18 font-style: italic;
19 font-weight: normal;
20 text-rendering: optimizeLegibility;
21 }
22 @font-face {
23 font-family: 'proximanovasemibold';
24 src: url('../fonts/ProximaNova/ProximaNova-Semibold.eot'); /* IE9 Compat Modes */
25 src: url('../fonts/ProximaNova/ProximaNova-Semibold.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
26 url('../fonts/ProximaNova/ProximaNova-Semibold.woff') format('woff'), /* Modern Browsers */
27 url('../fonts/ProximaNova/ProximaNova-Semibold.ttf') format('truetype');
28 font-style: normal;
29 font-weight: bold;
30 text-rendering: optimizeLegibility;
31 }
32 @font-face {
33 font-family: 'proximanovabold';
34 src: url('../fonts/ProximaNova/ProximaNova-Bold.eot'); /* IE9 Compat Modes */
35 src: url('../fonts/ProximaNova/ProximaNova-Bold.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
36 url('../fonts/ProximaNova/ProximaNova-Bold.woff') format('woff'), /* Modern Browsers */
37 url('../fonts/ProximaNova/ProximaNova-Bold.ttf') format('truetype');
38 font-style: normal;
39 font-weight: bold;
40 text-rendering: optimizeLegibility;
41 }
42 @font-face {
43 font-family: 'proximanovabolditalic';
44 src: url('../fonts/ProximaNova/ProximaNova-BoldItalic.eot'); /* IE9 Compat Modes */
45 src: url('../fonts/ProximaNova/ProximaNova-BoldItalic.eot?#iefix') format('embedded-opentype'), /* IE6-IE8 */
46 url('../fonts/ProximaNova/ProximaNova-BoldItalic.woff') format('woff'), /* Modern Browsers */
47 url('../fonts/ProximaNova/ProximaNova-BoldItalic.ttf') format('truetype');
48 font-style: italic;
49 font-weight: bold;
50 text-rendering: optimizeLegibility;
51 } No newline at end of file
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
1 NO CONTENT: file was removed, binary diff hidden
NO CONTENT: file was removed, binary diff hidden
@@ -1,106 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2 <link rel="import" href="../../../../../../bower_components/iron-ajax/iron-ajax.html">
3
4 <!--
5
6 `<channelstream-connection>` allows you to connect and interact with channelstream server
7 abstracting websocket/long-polling connections from you.
8
9 In typical use, just slap some `<channelstream-connection>` at the top of your body:
10
11 <body>
12 <channelstream-connection
13 username="{{user.username}}"
14 connect-url="http://127.0.0.1:8000/demo/connect"
15 disconnect-url="http://127.0.0.1:8000/disconnect"
16 subscribe-url="http://127.0.0.1:8000/demo/subscribe"
17 message-url="http://127.0.0.1:8000/demo/message"
18 long-poll-url="http://127.0.0.1:8000/listen"
19 websocket-url="http://127.0.0.1:8000/ws"
20 channels-url='["channel1", "channel2"]' />
21
22 Then you can do `channelstreamElem.connect()` to kick off your connection.
23 This element also handles automatic reconnections.
24
25 ## Default handlers
26
27 By default element has a listener attached that will fire `startListening()` handler on `channelstream-connected` event.
28
29 By default element has a listener attached that will fire `retryConnection()` handler on `channelstream-connect-error` event,
30 this handler will forever try to re-establish connection to the server incrementing intervals between retries up to 1 minute.
31
32 -->
33 <dom-module id="channelstream-connection">
34 <template>
35
36 <iron-ajax
37 id="ajaxConnect"
38 url=""
39 handle-as="json"
40 method="post"
41 content-type="application/json"
42 loading="{{loadingConnect}}"
43 last-response="{{connectLastResponse}}"
44 on-response="_handleConnect"
45 on-error="_handleConnectError"
46 debounce-duration="100"></iron-ajax>
47
48 <iron-ajax
49 id="ajaxDisconnect"
50 url=""
51 handle-as="json"
52 method="post"
53 content-type="application/json"
54 loading="{{loadingDisconnect}}"
55 last-response="{{_disconnectLastResponse}}"
56 on-response="_handleDisconnect"
57 debounce-duration="100"></iron-ajax>
58
59 <iron-ajax
60 id="ajaxSubscribe"
61 url=""
62 handle-as="json"
63 method="post"
64 content-type="application/json"
65 loading="{{loadingSubscribe}}"
66 last-response="{{subscribeLastResponse}}"
67 on-response="_handleSubscribe"
68 debounce-duration="100"></iron-ajax>
69
70 <iron-ajax
71 id="ajaxUnsubscribe"
72 url=""
73 handle-as="json"
74 method="post"
75 content-type="application/json"
76 loading="{{loadingUnsubscribe}}"
77 last-response="{{unsubscribeLastResponse}}"
78 on-response="_handleUnsubscribe"
79 debounce-duration="100"></iron-ajax>
80
81 <iron-ajax
82 id="ajaxMessage"
83 url=""
84 handle-as="json"
85 method="post"
86 content-type="application/json"
87 loading="{{loadingMessage}}"
88 last-response="{{messageLastResponse}}"
89 on-response="_handleMessage"
90 on-error="_handleMessageError"
91 debounce-duration="100"></iron-ajax>
92
93 <iron-ajax
94 id="ajaxListen"
95 url=""
96 handle-as="text"
97 loading="{{loadingListen}}"
98 last-response="{{listenLastResponse}}"
99 on-request="_handleListenOpen"
100 on-error="_handleListenError"
101 on-response="_handleListenMessageEvent"
102 debounce-duration="100"></iron-ajax>
103
104 </template>
105 <script src="channelstream-connection.js"></script>
106 </dom-module>
@@ -1,17 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2 <link rel="import" href="../channelstream-connection/channelstream-connection.html">
3 <link rel="import" href="../rhodecode-toast/rhodecode-toast.html">
4 <link rel="import" href="../rhodecode-favicon/rhodecode-favicon.html">
5
6 <dom-module id="rhodecode-app">
7 <template>
8 <channelstream-connection
9 id="channelstream-connection"
10 on-channelstream-listen-message="receivedMessage"
11 on-channelstream-connected="handleConnected"
12 on-channelstream-subscribed="handleSubscribed">
13 </channelstream-connection>
14 <rhodecode-favicon></rhodecode-favicon>
15 </template>
16 <script src="rhodecode-app.js"></script>
17 </dom-module>
@@ -1,7 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2
3 <dom-module id="rhodecode-favicon">
4 <template>
5 </template>
6 <script src="rhodecode-favicon.js"></script>
7 </dom-module>
@@ -1,7 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2 <dom-module id="rhodecode-legacy-js">
3 <template>
4 <script src="../../../scripts.js"></script>
5 </template>
6 <script src="rhodecode-legacy-js.js"></script>
7 </dom-module>
@@ -1,3 +0,0 b''
1 Polymer({
2 is: 'rhodecode-legacy-js',
3 });
@@ -1,23 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/paper-button/paper-button.html">
2 <link rel="import" href="../../../../../../bower_components/iron-a11y-keys-behavior/iron-a11y-keys-behavior.html">
3 <link rel="import" href="../rhodecode-unsafe-html/rhodecode-unsafe-html.html">
4 <dom-module id="rhodecode-toast">
5 <template>
6 <style include="shared-styles"></style>
7 <link rel="stylesheet" href="rhodecode-toast.css">
8 <template is="dom-if" if="[[hasToasts]]">
9 <div class$="container toast-message-holder [[conditionalClass(isFixed)]]">
10 <template is="dom-repeat" items="[[toasts]]">
11 <div class$="alert alert-[[item.level]]">
12 <div on-tap="dismissNotification" class="toast-close" index-pos="[[index]]">
13 <span>[[_gettext('Close')]]</span>
14 </div>
15 <rhodecode-unsafe-html text="[[item.message]]"></rhodecode-unsafe-html>
16 </div>
17 </template>
18 </div>
19 </template>
20 </template>
21
22 <script src="rhodecode-toast.js"></script>
23 </dom-module>
@@ -1,21 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/paper-toggle-button/paper-toggle-button.html">
2 <link rel="import" href="../../../../../../bower_components/paper-spinner/paper-spinner.html">
3 <link rel="import" href="../../../../../../bower_components/paper-tooltip/paper-tooltip.html">
4
5 <dom-module id="rhodecode-toggle">
6
7 <style include="shared-styles"></style>
8 <link rel="stylesheet" href="rhodecode-toggle.css">
9
10 <template>
11 <div class="rc-toggle">
12 <paper-toggle-button checked={{checked}}>[[labelStatus(checked)]]</paper-toggle-button>
13 <paper-tooltip>[[tooltipText]]</paper-tooltip>
14 <template is="dom-if" if="[[shouldShow(noSpinner)]]">
15 <paper-spinner active=[[active]]></paper-spinner>
16 </template>
17 </div>
18 </template>
19
20 <script src="rhodecode-toggle.js"></script>
21 </dom-module> No newline at end of file
@@ -1,9 +0,0 b''
1 <link rel="import" href="../../../../../../bower_components/polymer/polymer.html">
2
3 <dom-module id="rhodecode-unsafe-html">
4 <template>
5 <style include="shared-styles"></style>
6 <slot></slot>
7 </template>
8 <script src="rhodecode-unsafe-html.js"></script>
9 </dom-module>
@@ -1,3 +0,0 b''
1 <dom-module id="root-styles">
2 <template>
3 <style>
@@ -1,3 +0,0 b''
1 </style>
2 </template>
3 </dom-module>
@@ -1,9 +0,0 b''
1 <!-- required for stamped out templates that might use common elements -->
2 <link rel="import" href="rhodecode-legacy-js/rhodecode-legacy-js.html">
3 <link rel="import" href="../../../../../bower_components/iron-ajax/iron-ajax.html">
4 <link rel="import" href="shared-styles.html">
5 <link rel="import" href="channelstream-connection/channelstream-connection.html">
6 <link rel="import" href="rhodecode-toast/rhodecode-toast.html">
7 <link rel="import" href="rhodecode-toggle/rhodecode-toggle.html">
8 <link rel="import" href="rhodecode-unsafe-html/rhodecode-unsafe-html.html">
9 <link rel="import" href="rhodecode-app/rhodecode-app.html">
@@ -1,5 +0,0 b''
1 <dom-module id="shared-styles">
2 <template>
3 <link rel="stylesheet" href="../../../css/style-polymer.css">
4 </template>
5 </dom-module>
@@ -1,230 +0,0 b''
1 /**
2 @license @nocompile
3 Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
4 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7 Code distributed by Google as part of the polymer project is also
8 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9 */
10 (function(){/*
11
12 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
13 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
14 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
15 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
16 Code distributed by Google as part of the polymer project is also
17 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
18 */
19 'use strict';var p,aa="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},ea="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;function ha(){ha=function(){};ea.Symbol||(ea.Symbol=ia)}var ia=function(){var a=0;return function(b){return"jscomp_symbol_"+(b||"")+a++}}();
20 function ja(){ha();var a=ea.Symbol.iterator;a||(a=ea.Symbol.iterator=ea.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&aa(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ka(this)}});ja=function(){}}function ka(a){var b=0;return la(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function la(a){ja();a={next:a};a[ea.Symbol.iterator]=function(){return this};return a}function ma(a){ja();var b=a[Symbol.iterator];return b?b.call(a):ka(a)}
21 function na(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}
22 (function(){if(!function(){var a=document.createEvent("Event");a.initEvent("foo",!0,!0);a.preventDefault();return a.defaultPrevented}()){var a=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(a.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var b=/Trident/.test(navigator.userAgent);if(!window.CustomEvent||b&&"function"!==typeof window.CustomEvent)window.CustomEvent=function(a,b){b=b||{};var c=document.createEvent("CustomEvent");
23 c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c},window.CustomEvent.prototype=window.Event.prototype;if(!window.Event||b&&"function"!==typeof window.Event){var c=window.Event;window.Event=function(a,b){b=b||{};var c=document.createEvent("Event");c.initEvent(a,!!b.bubbles,!!b.cancelable);return c};if(c)for(var d in c)window.Event[d]=c[d];window.Event.prototype=c.prototype}if(!window.MouseEvent||b&&"function"!==typeof window.MouseEvent){b=window.MouseEvent;window.MouseEvent=function(a,
24 b){b=b||{};var c=document.createEvent("MouseEvent");c.initMouseEvent(a,!!b.bubbles,!!b.cancelable,b.view||window,b.detail,b.screenX,b.screenY,b.clientX,b.clientY,b.ctrlKey,b.altKey,b.shiftKey,b.metaKey,b.button,b.relatedTarget);return c};if(b)for(d in b)window.MouseEvent[d]=b[d];window.MouseEvent.prototype=b.prototype}Array.from||(Array.from=function(a){return[].slice.call(a)});Object.assign||(Object.assign=function(a,b){for(var c=[].slice.call(arguments,1),d=0,e;d<c.length;d++)if(e=c[d])for(var f=
25 a,m=e,n=Object.getOwnPropertyNames(m),t=0;t<n.length;t++)e=n[t],f[e]=m[e];return a})})(window.WebComponents);(function(){function a(){}function b(a,b){if(!a.childNodes.length)return[];switch(a.nodeType){case Node.DOCUMENT_NODE:return ya.call(a,b);case Node.DOCUMENT_FRAGMENT_NODE:return qb.call(a,b);default:return ba.call(a,b)}}var c="undefined"===typeof HTMLTemplateElement,d=!(document.createDocumentFragment().cloneNode()instanceof DocumentFragment),e=!1;/Trident/.test(navigator.userAgent)&&function(){function a(a,b){if(a instanceof DocumentFragment)for(var d;d=a.firstChild;)c.call(this,d,b);else c.call(this,
26 a,b);return a}e=!0;var b=Node.prototype.cloneNode;Node.prototype.cloneNode=function(a){a=b.call(this,a);this instanceof DocumentFragment&&(a.__proto__=DocumentFragment.prototype);return a};DocumentFragment.prototype.querySelectorAll=HTMLElement.prototype.querySelectorAll;DocumentFragment.prototype.querySelector=HTMLElement.prototype.querySelector;Object.defineProperties(DocumentFragment.prototype,{nodeType:{get:function(){return Node.DOCUMENT_FRAGMENT_NODE},configurable:!0},localName:{get:function(){},
27 configurable:!0},nodeName:{get:function(){return"#document-fragment"},configurable:!0}});var c=Node.prototype.insertBefore;Node.prototype.insertBefore=a;var d=Node.prototype.appendChild;Node.prototype.appendChild=function(b){b instanceof DocumentFragment?a.call(this,b,null):d.call(this,b);return b};var f=Node.prototype.removeChild,h=Node.prototype.replaceChild;Node.prototype.replaceChild=function(b,c){b instanceof DocumentFragment?(a.call(this,b,c),f.call(this,c)):h.call(this,b,c);return c};Document.prototype.createDocumentFragment=
28 function(){var a=this.createElement("df");a.__proto__=DocumentFragment.prototype;return a};var g=Document.prototype.importNode;Document.prototype.importNode=function(a,b){b=g.call(this,a,b||!1);a instanceof DocumentFragment&&(b.__proto__=DocumentFragment.prototype);return b}}();var f=Node.prototype.cloneNode,h=Document.prototype.createElement,g=Document.prototype.importNode,k=Node.prototype.removeChild,l=Node.prototype.appendChild,m=Node.prototype.replaceChild,n=DOMParser.prototype.parseFromString,
29 t=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),C=Object.getOwnPropertyDescriptor(window.Node.prototype,"childNodes"),ba=Element.prototype.querySelectorAll,ya=Document.prototype.querySelectorAll,qb=DocumentFragment.prototype.querySelectorAll,rb=function(){if(!c){var a=document.createElement("template"),b=document.createElement("template");b.content.appendChild(document.createElement("div"));a.content.appendChild(b);a=a.cloneNode(!0);return 0===a.content.childNodes.length||
30 0===a.content.firstChild.content.childNodes.length||d}}();if(c){var V=document.implementation.createHTMLDocument("template"),D=!0,ca=document.createElement("style");ca.textContent="template{display:none;}";var oa=document.head;oa.insertBefore(ca,oa.firstElementChild);a.prototype=Object.create(HTMLElement.prototype);var za=!document.createElement("div").hasOwnProperty("innerHTML");a.I=function(b){if(!b.content&&b.namespaceURI===document.documentElement.namespaceURI){b.content=V.createDocumentFragment();
31 for(var c;c=b.firstChild;)l.call(b.content,c);if(za)b.__proto__=a.prototype;else if(b.cloneNode=function(b){return a.a(this,b)},D)try{T(b),da(b)}catch(Gh){D=!1}a.C(b.content)}};var fa={option:["select"],thead:["table"],col:["colgroup","table"],tr:["tbody","table"],th:["tr","tbody","table"],td:["tr","tbody","table"]},T=function(b){Object.defineProperty(b,"innerHTML",{get:function(){return sb(this)},set:function(b){var c=fa[(/<([a-z][^/\0>\x20\t\r\n\f]+)/i.exec(b)||["",""])[1].toLowerCase()];if(c)for(var d=
32 0;d<c.length;d++)b="<"+c[d]+">"+b+"</"+c[d]+">";V.body.innerHTML=b;for(a.C(V);this.content.firstChild;)k.call(this.content,this.content.firstChild);b=V.body;if(c)for(d=0;d<c.length;d++)b=b.lastChild;for(;b.firstChild;)l.call(this.content,b.firstChild)},configurable:!0})},da=function(a){Object.defineProperty(a,"outerHTML",{get:function(){return"<template>"+this.innerHTML+"</template>"},set:function(a){if(this.parentNode){V.body.innerHTML=a;for(a=this.ownerDocument.createDocumentFragment();V.body.firstChild;)l.call(a,
33 V.body.firstChild);m.call(this.parentNode,a,this)}else throw Error("Failed to set the 'outerHTML' property on 'Element': This element has no parent node.");},configurable:!0})};T(a.prototype);da(a.prototype);a.C=function(c){c=b(c,"template");for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)a.I(f)};document.addEventListener("DOMContentLoaded",function(){a.C(document)});Document.prototype.createElement=function(){var b=h.apply(this,arguments);"template"===b.localName&&a.I(b);return b};DOMParser.prototype.parseFromString=
34 function(){var b=n.apply(this,arguments);a.C(b);return b};Object.defineProperty(HTMLElement.prototype,"innerHTML",{get:function(){return sb(this)},set:function(b){t.set.call(this,b);a.C(this)},configurable:!0,enumerable:!0});var sf=/[&\u00A0"]/g,Kc=/[&\u00A0<>]/g,Lc=function(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}};ca=function(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b};var tf=ca("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),
35 uf=ca("style script xmp iframe noembed noframes plaintext noscript".split(" ")),sb=function(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):C.get.call(a),e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var T=g.localName,m="<"+T,da=g.attributes,n=0;k=da[n];n++)m+=" "+k.name+'="'+k.value.replace(sf,Lc)+'"';m+=">";g=tf[T]?m:m+sb(g,l)+"</"+T+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&uf[k.localName]?g:g.replace(Kc,Lc);
36 break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),Error("not implemented");}}c+=g}return c}}if(c||rb){a.a=function(a,b){var c=f.call(a,!1);this.I&&this.I(c);b&&(l.call(c.content,f.call(a.content,!0)),tb(c.content,a.content));return c};var tb=function(c,d){if(d.querySelectorAll&&(d=b(d,"template"),0!==d.length)){c=b(c,"template");for(var e=0,f=c.length,h,g;e<f;e++)g=d[e],h=c[e],a&&a.I&&a.I(g),m.call(h.parentNode,vf.call(g,!0),h)}},vf=Node.prototype.cloneNode=
37 function(b){if(!e&&d&&this instanceof DocumentFragment)if(b)var c=wf.call(this.ownerDocument,this,!0);else return this.ownerDocument.createDocumentFragment();else this.nodeType===Node.ELEMENT_NODE&&"template"===this.localName&&this.namespaceURI==document.documentElement.namespaceURI?c=a.a(this,b):c=f.call(this,b);b&&tb(c,this);return c},wf=Document.prototype.importNode=function(c,d){d=d||!1;if("template"===c.localName)return a.a(c,d);var e=g.call(this,c,d);if(d){tb(e,c);c=b(e,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"]');
38 for(var f,k=0;k<c.length;k++){f=c[k];d=h.call(document,"script");d.textContent=f.textContent;for(var l=f.attributes,T=0,da;T<l.length;T++)da=l[T],d.setAttribute(da.name,da.value);m.call(f.parentNode,d,f)}}return e}}c&&(window.HTMLTemplateElement=a)})();var pa;Array.isArray?pa=Array.isArray:pa=function(a){return"[object Array]"===Object.prototype.toString.call(a)};var qa=pa;var ra=0,sa,ta="undefined"!==typeof window?window:void 0,ua=ta||{},va=ua.MutationObserver||ua.WebKitMutationObserver,wa="undefined"!==typeof Uint8ClampedArray&&"undefined"!==typeof importScripts&&"undefined"!==typeof MessageChannel;function xa(){return"undefined"!==typeof sa?function(){sa(Aa)}:Ba()}function Ca(){var a=0,b=new va(Aa),c=document.createTextNode("");b.observe(c,{characterData:!0});return function(){c.data=a=++a%2}}
39 function Da(){var a=new MessageChannel;a.port1.onmessage=Aa;return function(){return a.port2.postMessage(0)}}function Ba(){var a=setTimeout;return function(){return a(Aa,1)}}var Ea=Array(1E3);function Aa(){for(var a=0;a<ra;a+=2)(0,Ea[a])(Ea[a+1]),Ea[a]=void 0,Ea[a+1]=void 0;ra=0}var Fa,Ga;
40 if("undefined"===typeof self&&"undefined"!==typeof process&&"[object process]"==={}.toString.call(process))Ga=function(){return process.vb(Aa)};else{var Ha;if(va)Ha=Ca();else{var Ia;if(wa)Ia=Da();else{var Ja;if(void 0===ta&&"function"===typeof require)try{var Ka=require("vertx");sa=Ka.xb||Ka.wb;Ja=xa()}catch(a){Ja=Ba()}else Ja=Ba();Ia=Ja}Ha=Ia}Ga=Ha}Fa=Ga;function La(a,b){Ea[ra]=a;Ea[ra+1]=b;ra+=2;2===ra&&Fa()};function Ma(a,b){var c=this,d=new this.constructor(Na);void 0===d[Oa]&&Pa(d);var e=c.h;if(e){var f=arguments[e-1];La(function(){return Qa(e,d,f,c.f)})}else Ra(c,d,a,b);return d};function Sa(a){if(a&&"object"===typeof a&&a.constructor===this)return a;var b=new this(Na);Ta(b,a);return b};var Oa=Math.random().toString(36).substring(16);function Na(){}var Va=new Ua;function Wa(a){try{return a.then}catch(b){return Va.error=b,Va}}function Xa(a,b,c,d){try{a.call(b,c,d)}catch(e){return e}}function Ya(a,b,c){La(function(a){var d=!1,f=Xa(c,b,function(c){d||(d=!0,b!==c?Ta(a,c):q(a,c))},function(b){d||(d=!0,r(a,b))});!d&&f&&(d=!0,r(a,f))},a)}function Za(a,b){1===b.h?q(a,b.f):2===b.h?r(a,b.f):Ra(b,void 0,function(b){return Ta(a,b)},function(b){return r(a,b)})}
41 function $a(a,b,c){b.constructor===a.constructor&&c===Ma&&b.constructor.resolve===Sa?Za(a,b):c===Va?(r(a,Va.error),Va.error=null):void 0===c?q(a,b):"function"===typeof c?Ya(a,b,c):q(a,b)}function Ta(a,b){if(a===b)r(a,new TypeError("You cannot resolve a promise with itself"));else{var c=typeof b;null===b||"object"!==c&&"function"!==c?q(a,b):$a(a,b,Wa(b))}}function ab(a){a.va&&a.va(a.f);bb(a)}function q(a,b){void 0===a.h&&(a.f=b,a.h=1,0!==a.M.length&&La(bb,a))}
42 function r(a,b){void 0===a.h&&(a.h=2,a.f=b,La(ab,a))}function Ra(a,b,c,d){var e=a.M,f=e.length;a.va=null;e[f]=b;e[f+1]=c;e[f+2]=d;0===f&&a.h&&La(bb,a)}function bb(a){var b=a.M,c=a.h;if(0!==b.length){for(var d,e,f=a.f,h=0;h<b.length;h+=3)d=b[h],e=b[h+c],d?Qa(c,d,e,f):e(f);a.M.length=0}}function Ua(){this.error=null}var cb=new Ua;
43 function Qa(a,b,c,d){var e="function"===typeof c;if(e){try{var f=c(d)}catch(l){cb.error=l,f=cb}if(f===cb){var h=!0;var g=f.error;f.error=null}else var k=!0;if(b===f){r(b,new TypeError("A promises callback cannot return that same promise."));return}}else f=d,k=!0;void 0===b.h&&(e&&k?Ta(b,f):h?r(b,g):1===a?q(b,f):2===a&&r(b,f))}function db(a,b){try{b(function(b){Ta(a,b)},function(b){r(a,b)})}catch(c){r(a,c)}}var eb=0;function Pa(a){a[Oa]=eb++;a.h=void 0;a.f=void 0;a.M=[]};function fb(a,b){this.Ka=a;this.F=new a(Na);this.F[Oa]||Pa(this.F);if(qa(b))if(this.V=this.length=b.length,this.f=Array(this.length),0===this.length)q(this.F,this.f);else{this.length=this.length||0;for(a=0;void 0===this.h&&a<b.length;a++)gb(this,b[a],a);0===this.V&&q(this.F,this.f)}else r(this.F,Error("Array Methods must be provided an Array"))}
44 function gb(a,b,c){var d=a.Ka,e=d.resolve;e===Sa?(e=Wa(b),e===Ma&&void 0!==b.h?hb(a,b.h,c,b.f):"function"!==typeof e?(a.V--,a.f[c]=b):d===u?(d=new d(Na),$a(d,b,e),ib(a,d,c)):ib(a,new d(function(a){return a(b)}),c)):ib(a,e(b),c)}function hb(a,b,c,d){var e=a.F;void 0===e.h&&(a.V--,2===b?r(e,d):a.f[c]=d);0===a.V&&q(e,a.f)}function ib(a,b,c){Ra(b,void 0,function(b){return hb(a,1,c,b)},function(b){return hb(a,2,c,b)})};function jb(a){return(new fb(this,a)).F};function kb(a){var b=this;return qa(a)?new b(function(c,d){for(var e=a.length,f=0;f<e;f++)b.resolve(a[f]).then(c,d)}):new b(function(a,b){return b(new TypeError("You must pass an array to race."))})};function lb(a){var b=new this(Na);r(b,a);return b};function u(a){this[Oa]=eb++;this.f=this.h=void 0;this.M=[];if(Na!==a){if("function"!==typeof a)throw new TypeError("You must pass a resolver function as the first argument to the promise constructor");if(this instanceof u)db(this,a);else throw new TypeError("Failed to construct 'Promise': Please use the 'new' operator, this object constructor cannot be called as a function.");}}u.prototype={constructor:u,then:Ma,a:function(a){return this.then(null,a)}};/*
45
46 Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
47 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
48 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
49 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
50 Code distributed by Google as part of the polymer project is also
51 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
52 */
53 window.Promise||(window.Promise=u,u.prototype["catch"]=u.prototype.a,u.prototype.then=u.prototype.then,u.all=jb,u.race=kb,u.resolve=Sa,u.reject=lb);(function(a){function b(a,b){if("function"===typeof window.CustomEvent)return new CustomEvent(a,b);var c=document.createEvent("CustomEvent");c.initCustomEvent(a,!!b.bubbles,!!b.cancelable,b.detail);return c}function c(a){if(C)return a.ownerDocument!==document?a.ownerDocument:null;var b=a.__importDoc;if(!b&&a.parentNode){b=a.parentNode;if("function"===typeof b.closest)b=b.closest("link[rel=import]");else for(;!g(b)&&(b=b.parentNode););a.__importDoc=b}return b}function d(a){var b=m(document,"link[rel=import]:not([import-dependency])"),
54 c=b.length;c?n(b,function(b){return h(b,function(){0===--c&&a()})}):a()}function e(a){function b(){"loading"!==document.readyState&&document.body&&(document.removeEventListener("readystatechange",b),a())}document.addEventListener("readystatechange",b);b()}function f(a){e(function(){return d(function(){return a&&a()})})}function h(a,b){if(a.__loaded)b&&b();else if("script"===a.localName&&!a.src||"style"===a.localName&&!a.firstChild)a.__loaded=!0,b&&b();else{var c=function(d){a.removeEventListener(d.type,
55 c);a.__loaded=!0;b&&b()};a.addEventListener("load",c);oa&&"style"===a.localName||a.addEventListener("error",c)}}function g(a){return a.nodeType===Node.ELEMENT_NODE&&"link"===a.localName&&"import"===a.rel}function k(){var a=this;this.a={};this.b=0;this.c=new MutationObserver(function(b){return a.Va(b)});this.c.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function l(a){n(m(a,"template"),function(a){n(m(a.content,'script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]'),
56 function(a){var b=document.createElement("script");n(a.attributes,function(a){return b.setAttribute(a.name,a.value)});b.textContent=a.textContent;a.parentNode.replaceChild(b,a)});l(a.content)})}function m(a,b){return a.childNodes.length?a.querySelectorAll(b):ba}function n(a,b,c){var d=a?a.length:0,e=c?-1:1;for(c=c?d-1:0;c<d&&0<=c;c+=e)b(a[c],c)}var t=document.createElement("link"),C="import"in t,ba=t.querySelectorAll("*"),ya=null;!1==="currentScript"in document&&Object.defineProperty(document,"currentScript",
57 {get:function(){return ya||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var qb=/(url\()([^)]*)(\))/g,rb=/(@import[\s]+(?!url\())([^;]*)(;)/g,V=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,D={Pa:function(a,b){a.href&&a.setAttribute("href",D.ba(a.getAttribute("href"),b));a.src&&a.setAttribute("src",D.ba(a.getAttribute("src"),b));if("style"===a.localName){var c=D.za(a.textContent,b,qb);a.textContent=D.za(c,b,rb)}},za:function(a,b,c){return a.replace(c,
58 function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=D.ba(a,b));return c+"'"+a+"'"+e})},ba:function(a,b){if(void 0===D.ha){D.ha=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";D.ha="http://a/c%20d"===c.href}catch(Kc){}}if(D.ha)return(new URL(a,b)).href;c=D.Ha;c||(c=document.implementation.createHTMLDocument("temp"),D.Ha=c,c.ra=c.createElement("base"),c.head.appendChild(c.ra),c.qa=c.createElement("a"));c.ra.href=b;c.qa.href=a;return c.qa.href||a}},ca={async:!0,load:function(a,b,c){if(a)if(a.match(/^data:/)){a=
59 a.split(",");var d=a[1];d=-1<a[0].indexOf(";base64")?atob(d):decodeURIComponent(d);b(d)}else{var e=new XMLHttpRequest;e.open("GET",a,ca.async);e.onload=function(){var a=e.responseURL||e.getResponseHeader("Location");a&&0===a.indexOf("/")&&(a=(location.origin||location.protocol+"//"+location.host)+a);var d=e.response||e.responseText;304===e.status||0===e.status||200<=e.status&&300>e.status?b(d,a):c(d)};e.send()}else c("error: href must be specified")}},oa=/Trident/.test(navigator.userAgent)||/Edge\/\d./i.test(navigator.userAgent);
60 k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){return b.o(a)})};k.prototype.o=function(a){var b=this,c=a.href;if(void 0!==this.a[c]){var d=this.a[c];d&&d.__loaded&&(a.__import=d,this.i(a))}else this.b++,this.a[c]="pending",ca.load(c,function(a,d){a=b.Wa(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.J()},function(){b.a[c]=null;b.b--;b.J()})};k.prototype.Wa=function(a,b){if(!a)return document.createDocumentFragment();oa&&(a=a.replace(V,function(a,b,c){return-1===
61 a.indexOf("type=")?b+" type=import-disable "+c:a}));var c=document.createElement("template");c.innerHTML=a;if(c.content)a=c.content,l(a);else for(a=document.createDocumentFragment();c.firstChild;)a.appendChild(c.firstChild);if(c=a.querySelector("base"))b=D.ba(c.getAttribute("href"),b),c.removeAttribute("href");c=m(a,'link[rel=import],link[rel=stylesheet][href][type=import-disable],style:not([type]),link[rel=stylesheet][href]:not([type]),script:not([type]),script[type="application/javascript"],script[type="text/javascript"],script[type="module"]');
62 var d=0;n(c,function(a){h(a);D.Pa(a,b);a.setAttribute("import-dependency","");if("script"===a.localName&&!a.src&&a.textContent){if("module"===a.type)throw Error("Inline module scripts are not supported in HTML Imports.");a.setAttribute("src","data:text/javascript;charset=utf-8,"+encodeURIComponent(a.textContent+("\n//# sourceURL="+b+(d?"-"+d:"")+".js\n")));a.textContent="";d++}});return a};k.prototype.J=function(){var a=this;if(!this.b){this.c.disconnect();this.flatten(document);var b=!1,c=!1,d=function(){c&&
63 b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),a.Ta()))};this.Ya(function(){c=!0;d()});this.Xa(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");n(a,function(a){var c=b.a[a.href];(a.__import=c)&&c.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(b.a[a.href]=a,a.readyState="loading",a.__import=a,b.flatten(c),a.appendChild(c))})};k.prototype.Xa=function(a){function b(e){if(e<d){var f=c[e],g=document.createElement("script");f.removeAttribute("import-dependency");
64 n(f.attributes,function(a){return g.setAttribute(a.name,a.value)});ya=g;f.parentNode.replaceChild(g,f);h(g,function(){ya=null;b(e+1)})}else a()}var c=m(document,"script[import-dependency]"),d=c.length;b(0)};k.prototype.Ya=function(a){var b=m(document,"style[import-dependency],link[rel=stylesheet][import-dependency]"),d=b.length;if(d){var e=oa&&!!document.querySelector("link[rel=stylesheet][href][type=import-disable]");n(b,function(b){h(b,function(){b.removeAttribute("import-dependency");0===--d&&
65 a()});if(e&&b.parentNode!==document.head){var f=document.createElement(b.localName);f.__appliedElement=b;f.setAttribute("type","import-placeholder");b.parentNode.insertBefore(f,b.nextSibling);for(f=c(b);f&&c(f);)f=c(f);f.parentNode!==document.head&&(f=null);document.head.insertBefore(b,f);b.removeAttribute("type")}})}else a()};k.prototype.Ta=function(){var a=this,b=m(document,"link[rel=import]");n(b,function(b){return a.i(b)},!0)};k.prototype.i=function(a){a.__loaded||(a.__loaded=!0,a.import&&(a.import.readyState=
66 "complete"),a.dispatchEvent(b(a.import?"load":"error",{bubbles:!1,cancelable:!1,detail:void 0})))};k.prototype.Va=function(a){var b=this;n(a,function(a){return n(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(g(a)?b.o(a):b.loadImports(a))})})};var za=null;if(C)t=m(document,"link[rel=import]"),n(t,function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),t=function(a){a=a.target;g(a)&&(a.__loaded=!0)},document.addEventListener("load",t,!0),document.addEventListener("error",
67 t,!0);else{var fa=Object.getOwnPropertyDescriptor(Node.prototype,"baseURI");Object.defineProperty((!fa||fa.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=g(this)?this:c(this);return a?a.href:fa&&fa.get?fa.get.call(this):(document.querySelector("base")||window.location).href},configurable:!0,enumerable:!0});Object.defineProperty(HTMLLinkElement.prototype,"import",{get:function(){return this.__import||null},configurable:!0,enumerable:!0});e(function(){za=new k})}f(function(){return document.dispatchEvent(b("HTMLImportsLoaded",
68 {cancelable:!0,bubbles:!0,detail:void 0}))});a.useNative=C;a.whenReady=f;a.importForElement=c;a.loadImports=function(a){za&&za.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});/*
69
70 Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
71 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
72 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
73 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
74 Code distributed by Google as part of the polymer project is also
75 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
76 */
77 window.WebComponents=window.WebComponents||{flags:{}};var mb=document.querySelector('script[src*="webcomponents-lite.js"]'),nb=/wc-(.+)/,v={};if(!v.noOpts){location.search.slice(1).split("&").forEach(function(a){a=a.split("=");var b;a[0]&&(b=a[0].match(nb))&&(v[b[1]]=a[1]||!0)});if(mb)for(var ob=0,pb;pb=mb.attributes[ob];ob++)"src"!==pb.name&&(v[pb.name]=pb.value||!0);if(v.log&&v.log.split){var ub=v.log.split(",");v.log={};ub.forEach(function(a){v.log[a]=!0})}else v.log={}}
78 window.WebComponents.flags=v;var vb=v.shadydom;vb&&(window.ShadyDOM=window.ShadyDOM||{},window.ShadyDOM.force=vb);var wb=v.register||v.ce;wb&&window.customElements&&(window.customElements.forcePolyfill=wb);/*
79
80 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
81 This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
82 The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
83 The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
84 Code distributed by Google as part of the polymer project is also
85 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
86 */
87 function xb(){this.ya=this.root=null;this.Z=!1;this.D=this.U=this.la=this.assignedSlot=this.assignedNodes=this.K=null;this.childNodes=this.nextSibling=this.previousSibling=this.lastChild=this.firstChild=this.parentNode=this.N=void 0;this.Da=this.ta=!1;this.S={}}xb.prototype.toJSON=function(){return{}};function w(a){a.fa||(a.fa=new xb);return a.fa}function x(a){return a&&a.fa};var y=window.ShadyDOM||{};y.Ra=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var yb=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");y.w=!!(yb&&yb.configurable&&yb.get);y.na=y.force||!y.Ra;var zb=navigator.userAgent.match("Trident"),Ab=navigator.userAgent.match("Edge");void 0===y.Ba&&(y.Ba=y.w&&(zb||Ab));function Bb(a){return(a=x(a))&&void 0!==a.firstChild}function z(a){return"ShadyRoot"===a.La}function Cb(a){a=a.getRootNode();if(z(a))return a}
88 var Db=Element.prototype,Eb=Db.matches||Db.matchesSelector||Db.mozMatchesSelector||Db.msMatchesSelector||Db.oMatchesSelector||Db.webkitMatchesSelector;function Fb(a,b){if(a&&b)for(var c=Object.getOwnPropertyNames(b),d=0,e;d<c.length&&(e=c[d]);d++){var f=Object.getOwnPropertyDescriptor(b,e);f&&Object.defineProperty(a,e,f)}}function Gb(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(d=0;d<c.length;d++)Fb(a,c[d]);return a}function Hb(a,b){for(var c in b)a[c]=b[c]}
89 var Ib=document.createTextNode(""),Jb=0,Kb=[];(new MutationObserver(function(){for(;Kb.length;)try{Kb.shift()()}catch(a){throw Ib.textContent=Jb++,a;}})).observe(Ib,{characterData:!0});function Lb(a){Kb.push(a);Ib.textContent=Jb++}var Mb=!!document.contains;function Nb(a,b){for(;b;){if(b==a)return!0;b=b.parentNode}return!1}
90 function Ob(a){for(var b=a.length-1;0<=b;b--){var c=a[b],d=c.getAttribute("id")||c.getAttribute("name");d&&"length"!==d&&isNaN(d)&&(a[d]=c)}a.item=function(b){return a[b]};a.namedItem=function(b){if("length"!==b&&isNaN(b)&&a[b])return a[b];for(var c=ma(a),d=c.next();!d.done;d=c.next())if(d=d.value,(d.getAttribute("id")||d.getAttribute("name"))==b)return d;return null};return a};var Pb=[],Qb;function Rb(a){Qb||(Qb=!0,Lb(Sb));Pb.push(a)}function Sb(){Qb=!1;for(var a=!!Pb.length;Pb.length;)Pb.shift()();return a}Sb.list=Pb;function Tb(){this.a=!1;this.addedNodes=[];this.removedNodes=[];this.Y=new Set}function Ub(a){a.a||(a.a=!0,Lb(function(){Vb(a)}))}function Vb(a){if(a.a){a.a=!1;var b=a.takeRecords();b.length&&a.Y.forEach(function(a){a(b)})}}Tb.prototype.takeRecords=function(){if(this.addedNodes.length||this.removedNodes.length){var a=[{addedNodes:this.addedNodes,removedNodes:this.removedNodes}];this.addedNodes=[];this.removedNodes=[];return a}return[]};
91 function Wb(a,b){var c=w(a);c.K||(c.K=new Tb);c.K.Y.add(b);var d=c.K;return{Ia:b,H:d,Ma:a,takeRecords:function(){return d.takeRecords()}}}function Xb(a){var b=a&&a.H;b&&(b.Y.delete(a.Ia),b.Y.size||(w(a.Ma).K=null))}
92 function Yb(a,b){var c=b.getRootNode();return a.map(function(a){var b=c===a.target.getRootNode();if(b&&a.addedNodes){if(b=Array.from(a.addedNodes).filter(function(a){return c===a.getRootNode()}),b.length)return a=Object.create(a),Object.defineProperty(a,"addedNodes",{value:b,configurable:!0}),a}else if(b)return a}).filter(function(a){return a})};var A={},Zb=Element.prototype.insertBefore,$b=Element.prototype.replaceChild,ac=Element.prototype.removeChild,bc=Element.prototype.setAttribute,cc=Element.prototype.removeAttribute,dc=Element.prototype.cloneNode,ec=Document.prototype.importNode,fc=Element.prototype.addEventListener,gc=Element.prototype.removeEventListener,hc=Window.prototype.addEventListener,ic=Window.prototype.removeEventListener,jc=Element.prototype.dispatchEvent,kc=Node.prototype.contains||HTMLElement.prototype.contains,lc=Document.prototype.getElementById,
93 mc=Element.prototype.querySelector,nc=DocumentFragment.prototype.querySelector,oc=Document.prototype.querySelector,pc=Element.prototype.querySelectorAll,qc=DocumentFragment.prototype.querySelectorAll,rc=Document.prototype.querySelectorAll;A.appendChild=Element.prototype.appendChild;A.insertBefore=Zb;A.replaceChild=$b;A.removeChild=ac;A.setAttribute=bc;A.removeAttribute=cc;A.cloneNode=dc;A.importNode=ec;A.addEventListener=fc;A.removeEventListener=gc;A.fb=hc;A.gb=ic;A.dispatchEvent=jc;A.contains=kc;
94 A.getElementById=lc;A.pb=mc;A.sb=nc;A.nb=oc;A.querySelector=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return mc.call(this,a);case Node.DOCUMENT_NODE:return oc.call(this,a);default:return nc.call(this,a)}};A.qb=pc;A.tb=qc;A.ob=rc;A.querySelectorAll=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return pc.call(this,a);case Node.DOCUMENT_NODE:return rc.call(this,a);default:return qc.call(this,a)}};var sc=/[&\u00A0"]/g,tc=/[&\u00A0<>]/g;function uc(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function vc(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var wc=vc("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),xc=vc("style script xmp iframe noembed noframes plaintext noscript".split(" "));
95 function yc(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,h;e<f&&(h=d[e]);e++){a:{var g=h;var k=a;var l=b;switch(g.nodeType){case Node.ELEMENT_NODE:for(var m=g.localName,n="<"+m,t=g.attributes,C=0;k=t[C];C++)n+=" "+k.name+'="'+k.value.replace(sc,uc)+'"';n+=">";g=wc[m]?n:n+yc(g,l)+"</"+m+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&xc[k.localName]?g:g.replace(tc,uc);break a;case Node.COMMENT_NODE:g="\x3c!--"+g.data+"--\x3e";break a;default:throw window.console.error(g),
96 Error("not implemented");}}c+=g}return c};var B={},E=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),F=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function zc(a){var b=[];E.currentNode=a;for(a=E.firstChild();a;)b.push(a),a=E.nextSibling();return b}B.parentNode=function(a){E.currentNode=a;return E.parentNode()};B.firstChild=function(a){E.currentNode=a;return E.firstChild()};B.lastChild=function(a){E.currentNode=a;return E.lastChild()};B.previousSibling=function(a){E.currentNode=a;return E.previousSibling()};
97 B.nextSibling=function(a){E.currentNode=a;return E.nextSibling()};B.childNodes=zc;B.parentElement=function(a){F.currentNode=a;return F.parentNode()};B.firstElementChild=function(a){F.currentNode=a;return F.firstChild()};B.lastElementChild=function(a){F.currentNode=a;return F.lastChild()};B.previousElementSibling=function(a){F.currentNode=a;return F.previousSibling()};B.nextElementSibling=function(a){F.currentNode=a;return F.nextSibling()};
98 B.children=function(a){var b=[];F.currentNode=a;for(a=F.firstChild();a;)b.push(a),a=F.nextSibling();return Ob(b)};B.innerHTML=function(a){return yc(a,function(a){return zc(a)})};B.textContent=function(a){switch(a.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:a=document.createTreeWalker(a,NodeFilter.SHOW_TEXT,null,!1);for(var b="",c;c=a.nextNode();)b+=c.nodeValue;return b;default:return a.nodeValue}};var G={},Ac=y.w,Bc=[Node.prototype,Element.prototype,HTMLElement.prototype];function H(a){var b;a:{for(b=0;b<Bc.length;b++){var c=Bc[b];if(c.hasOwnProperty(a)){b=c;break a}}b=void 0}if(!b)throw Error("Could not find descriptor for "+a);return Object.getOwnPropertyDescriptor(b,a)}
99 var I=Ac?{parentNode:H("parentNode"),firstChild:H("firstChild"),lastChild:H("lastChild"),previousSibling:H("previousSibling"),nextSibling:H("nextSibling"),childNodes:H("childNodes"),parentElement:H("parentElement"),previousElementSibling:H("previousElementSibling"),nextElementSibling:H("nextElementSibling"),innerHTML:H("innerHTML"),textContent:H("textContent"),firstElementChild:H("firstElementChild"),lastElementChild:H("lastElementChild"),children:H("children")}:{},Cc=Ac?{firstElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,
100 "firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"children")}:{},Dc=Ac?{firstElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(Document.prototype,"children")}:{};G.xa=I;G.rb=Cc;G.mb=Dc;G.parentNode=function(a){return I.parentNode.get.call(a)};
101 G.firstChild=function(a){return I.firstChild.get.call(a)};G.lastChild=function(a){return I.lastChild.get.call(a)};G.previousSibling=function(a){return I.previousSibling.get.call(a)};G.nextSibling=function(a){return I.nextSibling.get.call(a)};G.childNodes=function(a){return Array.prototype.slice.call(I.childNodes.get.call(a))};G.parentElement=function(a){return I.parentElement.get.call(a)};G.previousElementSibling=function(a){return I.previousElementSibling.get.call(a)};G.nextElementSibling=function(a){return I.nextElementSibling.get.call(a)};
102 G.innerHTML=function(a){return I.innerHTML.get.call(a)};G.textContent=function(a){return I.textContent.get.call(a)};G.children=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Cc.children.get.call(a);case Node.DOCUMENT_NODE:return Dc.children.get.call(a);default:return I.children.get.call(a)}};
103 G.firstElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Cc.firstElementChild.get.call(a);case Node.DOCUMENT_NODE:return Dc.firstElementChild.get.call(a);default:return I.firstElementChild.get.call(a)}};G.lastElementChild=function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Cc.lastElementChild.get.call(a);case Node.DOCUMENT_NODE:return Dc.lastElementChild.get.call(a);default:return I.lastElementChild.get.call(a)}};var J=y.Ba?G:B;function Ec(a){for(;a.firstChild;)a.removeChild(a.firstChild)}
104 var Fc=y.w,Gc=document.implementation.createHTMLDocument("inert"),Hc=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),Ic=Hc&&Hc.get,Jc=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),Mc={parentElement:{get:function(){var a=x(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:J.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=x(this);a=a&&a.parentNode;return void 0!==a?a:J.parentNode(this)},configurable:!0},
105 nextSibling:{get:function(){var a=x(this);a=a&&a.nextSibling;return void 0!==a?a:J.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=x(this);a=a&&a.previousSibling;return void 0!==a?a:J.previousSibling(this)},configurable:!0},nextElementSibling:{get:function(){var a=x(this);if(a&&void 0!==a.nextSibling){for(a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return J.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){var a=
106 x(this);if(a&&void 0!==a.previousSibling){for(a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return J.previousElementSibling(this)},configurable:!0}},Nc={className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0}},Oc={childNodes:{get:function(){if(Bb(this)){var a=x(this);if(!a.childNodes){a.childNodes=[];for(var b=this.firstChild;b;b=b.nextSibling)a.childNodes.push(b)}var c=a.childNodes}else c=
107 J.childNodes(this);c.item=function(a){return c[a]};return c},configurable:!0},childElementCount:{get:function(){return this.children.length},configurable:!0},firstChild:{get:function(){var a=x(this);a=a&&a.firstChild;return void 0!==a?a:J.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=x(this);a=a&&a.lastChild;return void 0!==a?a:J.lastChild(this)},configurable:!0},textContent:{get:function(){if(Bb(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&
108 a.push(d.textContent);return a.join("")}return J.textContent(this)},set:function(a){if("undefined"===typeof a||null===a)a="";switch(this.nodeType){case Node.ELEMENT_NODE:case Node.DOCUMENT_FRAGMENT_NODE:if(!Bb(this)&&Fc){var b=this.firstChild;(b!=this.lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&Ec(this);G.xa.textContent.set.call(this,a)}else Ec(this),(0<a.length||this.nodeType===Node.ELEMENT_NODE)&&this.appendChild(document.createTextNode(a));break;default:this.nodeValue=a}},configurable:!0},firstElementChild:{get:function(){var a=
109 x(this);if(a&&void 0!==a.firstChild){for(a=this.firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return J.firstElementChild(this)},configurable:!0},lastElementChild:{get:function(){var a=x(this);if(a&&void 0!==a.lastChild){for(a=this.lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return J.lastElementChild(this)},configurable:!0},children:{get:function(){return Bb(this)?Ob(Array.prototype.filter.call(this.childNodes,function(a){return a.nodeType===Node.ELEMENT_NODE})):
110 J.children(this)},configurable:!0},innerHTML:{get:function(){return Bb(this)?yc("template"===this.localName?this.content:this):J.innerHTML(this)},set:function(a){var b="template"===this.localName?this.content:this;Ec(b);var c=this.localName||"div";c=this.namespaceURI&&this.namespaceURI!==Gc.namespaceURI?Gc.createElementNS(this.namespaceURI,c):Gc.createElement(c);Fc?G.xa.innerHTML.set.call(c,a):c.innerHTML=a;for(a="template"===this.localName?c.content:c;a.firstChild;)b.appendChild(a.firstChild)},configurable:!0}},
111 Pc={shadowRoot:{get:function(){var a=x(this);return a&&a.ya||null},configurable:!0}},Qc={activeElement:{get:function(){var a=Jc&&Jc.get?Jc.get.call(document):y.w?void 0:document.activeElement;if(a&&a.nodeType){var b=!!z(this);if(this===document||b&&this.host!==a&&A.contains.call(this.host,a)){for(b=Cb(a);b&&b!==this;)a=b.host,b=Cb(a);a=this===document?b?null:a:b===this?a:null}else a=null}else a=null;return a},set:function(){},configurable:!0}};
112 function K(a,b,c){for(var d in b){var e=Object.getOwnPropertyDescriptor(a,d);e&&e.configurable||!e&&c?Object.defineProperty(a,d,b[d]):c&&console.warn("Could not define",d,"on",a)}}function Rc(a){K(a,Mc);K(a,Nc);K(a,Oc);K(a,Qc)}
113 function Sc(){var a=Tc.prototype;a.__proto__=DocumentFragment.prototype;K(a,Mc,!0);K(a,Oc,!0);K(a,Qc,!0);Object.defineProperties(a,{nodeType:{value:Node.DOCUMENT_FRAGMENT_NODE,configurable:!0},nodeName:{value:"#document-fragment",configurable:!0},nodeValue:{value:null,configurable:!0}});["localName","namespaceURI","prefix"].forEach(function(b){Object.defineProperty(a,b,{value:void 0,configurable:!0})});["ownerDocument","baseURI","isConnected"].forEach(function(b){Object.defineProperty(a,b,{get:function(){return this.host[b]},
114 configurable:!0})})}var Uc=y.w?function(){}:function(a){var b=w(a);b.ta||(b.ta=!0,K(a,Mc,!0),K(a,Nc,!0))},Vc=y.w?function(){}:function(a){w(a).Da||(K(a,Oc,!0),K(a,Pc,!0))};var Wc=J.childNodes;function Xc(a,b,c){Uc(a);c=c||null;var d=w(a),e=w(b),f=c?w(c):null;d.previousSibling=c?f.previousSibling:b.lastChild;if(f=x(d.previousSibling))f.nextSibling=a;if(f=x(d.nextSibling=c))f.previousSibling=a;d.parentNode=b;c?c===e.firstChild&&(e.firstChild=a):(e.lastChild=a,e.firstChild||(e.firstChild=a));e.childNodes=null}
115 function Yc(a){var b=w(a);if(void 0===b.firstChild){b.childNodes=null;var c=Wc(a);b.firstChild=c[0]||null;b.lastChild=c[c.length-1]||null;Vc(a);for(b=0;b<c.length;b++){var d=c[b],e=w(d);e.parentNode=a;e.nextSibling=c[b+1]||null;e.previousSibling=c[b-1]||null;Uc(d)}}};var Zc=J.parentNode;
116 function $c(a,b,c){if(b===a)throw Error("Failed to execute 'appendChild' on 'Node': The new child element contains the parent.");if(c){var d=x(c);d=d&&d.parentNode;if(void 0!==d&&d!==a||void 0===d&&Zc(c)!==a)throw Error("Failed to execute 'insertBefore' on 'Node': The node before which the new node is to be inserted is not a child of this node.");}if(c===b)return b;b.parentNode&&ad(b.parentNode,b);var e,f;if(!b.__noInsertionPoint){if(f=e=Cb(a)){var h;"slot"===b.localName?h=[b]:b.querySelectorAll&&
117 (h=b.querySelectorAll("slot"));f=h&&h.length?h:void 0}f&&(h=e,d=f,h.a=h.a||[],h.g=h.g||[],h.j=h.j||{},h.a.push.apply(h.a,[].concat(d instanceof Array?d:na(ma(d)))))}("slot"===a.localName||f)&&(e=e||Cb(a))&&bd(e);if(Bb(a)){e=c;Vc(a);f=w(a);void 0!==f.firstChild&&(f.childNodes=null);if(b.nodeType===Node.DOCUMENT_FRAGMENT_NODE){f=b.childNodes;for(h=0;h<f.length;h++)Xc(f[h],a,e);e=w(b);f=void 0!==e.firstChild?null:void 0;e.firstChild=e.lastChild=f;e.childNodes=f}else Xc(b,a,e);e=x(a);if(cd(a)){bd(e.root);
118 var g=!0}else e.root&&(g=!0)}g||(g=z(a)?a.host:a,c?(c=dd(c),A.insertBefore.call(g,b,c)):A.appendChild.call(g,b));ed(a,b);return b}
119 function ad(a,b){if(b.parentNode!==a)throw Error("The node to be removed is not a child of this node: "+b);var c=Cb(b),d=x(a);if(Bb(a)){var e=w(b),f=w(a);b===f.firstChild&&(f.firstChild=e.nextSibling);b===f.lastChild&&(f.lastChild=e.previousSibling);var h=e.previousSibling,g=e.nextSibling;h&&(w(h).nextSibling=g);g&&(w(g).previousSibling=h);e.parentNode=e.previousSibling=e.nextSibling=void 0;void 0!==f.childNodes&&(f.childNodes=null);if(cd(a)){bd(d.root);var k=!0}}fd(b);if(c){(e=a&&"slot"===a.localName)&&
120 (k=!0);if(c.g){gd(c);f=c.j;for(ba in f)for(h=f[ba],g=0;g<h.length;g++){var l=h[g];if(Nb(b,l)){h.splice(g,1);var m=c.g.indexOf(l);0<=m&&c.g.splice(m,1);g--;m=x(l);if(l=m.D)for(var n=0;n<l.length;n++){var t=l[n],C=hd(t);C&&A.removeChild.call(C,t)}m.D=[];m.assignedNodes=[];m=!0}}var ba=m}else ba=void 0;(ba||e)&&bd(c)}k||(k=z(a)?a.host:a,(!d.root&&"slot"!==b.localName||k===Zc(b))&&A.removeChild.call(k,b));ed(a,null,b);return b}
121 function fd(a){var b=x(a);if(b&&void 0!==b.N){b=a.childNodes;for(var c=0,d=b.length,e;c<d&&(e=b[c]);c++)fd(e)}if(a=x(a))a.N=void 0}function dd(a){var b=a;a&&"slot"===a.localName&&(b=(b=(b=x(a))&&b.D)&&b.length?b[0]:dd(a.nextSibling));return b}function cd(a){return(a=(a=x(a))&&a.root)&&id(a)}
122 function jd(a,b){if("slot"===b)a=a.parentNode,cd(a)&&bd(x(a).root);else if("slot"===a.localName&&"name"===b&&(b=Cb(a))){if(b.g){gd(b);var c=a.Ga,d=kd(a);if(d!==c){c=b.j[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.j[d]||(b.j[d]=[]);c.push(a);1<c.length&&(b.j[d]=ld(c))}}bd(b)}}function ed(a,b,c){if(a=(a=x(a))&&a.K)b&&a.addedNodes.push(b),c&&a.removedNodes.push(c),Ub(a)}
123 function md(a){if(a&&a.nodeType){var b=w(a),c=b.N;void 0===c&&(z(a)?(c=a,b.N=c):(c=(c=a.parentNode)?md(c):a,A.contains.call(document.documentElement,a)&&(b.N=c)));return c}}function nd(a,b,c){var d=[];od(a.childNodes,b,c,d);return d}function od(a,b,c,d){for(var e=0,f=a.length,h;e<f&&(h=a[e]);e++){var g;if(g=h.nodeType===Node.ELEMENT_NODE){g=h;var k=b,l=c,m=d,n=k(g);n&&m.push(g);l&&l(n)?g=n:(od(g.childNodes,k,l,m),g=void 0)}if(g)break}}var pd=null;
124 function qd(a,b,c){pd||(pd=window.ShadyCSS&&window.ShadyCSS.ScopingShim);pd&&"class"===b?pd.setElementClass(a,c):(A.setAttribute.call(a,b,c),jd(a,b))}function rd(a,b){if(a.ownerDocument!==document||"template"===a.localName)return A.importNode.call(document,a,b);var c=A.importNode.call(document,a,!1);if(b){a=a.childNodes;b=0;for(var d;b<a.length;b++)d=rd(a[b],!0),c.appendChild(d)}return c};var sd="__eventWrappers"+Date.now(),td=function(){var a=Object.getOwnPropertyDescriptor(Event.prototype,"composed");return a?function(b){return a.get.call(b)}:null}(),ud={blur:!0,focus:!0,focusin:!0,focusout:!0,click:!0,dblclick:!0,mousedown:!0,mouseenter:!0,mouseleave:!0,mousemove:!0,mouseout:!0,mouseover:!0,mouseup:!0,wheel:!0,beforeinput:!0,input:!0,keydown:!0,keyup:!0,compositionstart:!0,compositionupdate:!0,compositionend:!0,touchstart:!0,touchend:!0,touchmove:!0,touchcancel:!0,pointerover:!0,
125 pointerenter:!0,pointerdown:!0,pointermove:!0,pointerup:!0,pointercancel:!0,pointerout:!0,pointerleave:!0,gotpointercapture:!0,lostpointercapture:!0,dragstart:!0,drag:!0,dragenter:!0,dragleave:!0,dragover:!0,drop:!0,dragend:!0,DOMActivate:!0,DOMFocusIn:!0,DOMFocusOut:!0,keypress:!0},vd={DOMAttrModified:!0,DOMAttributeNameChanged:!0,DOMCharacterDataModified:!0,DOMElementNameChanged:!0,DOMNodeInserted:!0,DOMNodeInsertedIntoDocument:!0,DOMNodeRemoved:!0,DOMNodeRemovedFromDocument:!0,DOMSubtreeModified:!0};
126 function wd(a,b){var c=[],d=a;for(a=a===window?window:a.getRootNode();d;)c.push(d),d=d.assignedSlot?d.assignedSlot:d.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&d.host&&(b||d!==a)?d.host:d.parentNode;c[c.length-1]===document&&c.push(window);return c}function xd(a,b){if(!z)return a;a=wd(a,!0);for(var c=0,d,e,f,h;c<b.length;c++)if(d=b[c],f=d===window?window:d.getRootNode(),f!==e&&(h=a.indexOf(f),e=f),!z(f)||-1<h)return d}
127 var yd={get composed(){void 0===this.R&&(td?this.R=td(this):!1!==this.isTrusted&&(this.R=ud[this.type]));return this.R||!1},composedPath:function(){this.sa||(this.sa=wd(this.__target,this.composed));return this.sa},get target(){return xd(this.currentTarget||this.__previousCurrentTarget,this.composedPath())},get relatedTarget(){if(!this.ea)return null;this.ua||(this.ua=wd(this.ea,!0));return xd(this.currentTarget,this.ua)},stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.da=
128 !0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);this.da=this.Ca=!0}};function zd(a){function b(b,d){b=new a(b,d);b.R=d&&!!d.composed;return b}Hb(b,a);b.prototype=a.prototype;return b}var Ad={focus:!0,blur:!0};function Bd(a){return a.__target!==a.target||a.ea!==a.relatedTarget}function Cd(a,b,c){if(c=b.__handlers&&b.__handlers[a.type]&&b.__handlers[a.type][c])for(var d=0,e;(e=c[d])&&(!Bd(a)||a.target!==a.relatedTarget)&&(e.call(b,a),!a.Ca);d++);}
129 function Dd(a){var b=a.composedPath();Object.defineProperty(a,"currentTarget",{get:function(){return d},configurable:!0});for(var c=b.length-1;0<=c;c--){var d=b[c];Cd(a,d,"capture");if(a.da)return}Object.defineProperty(a,"eventPhase",{get:function(){return Event.AT_TARGET}});var e;for(c=0;c<b.length;c++){d=b[c];var f=x(d);f=f&&f.root;if(0===c||f&&f===e)if(Cd(a,d,"bubble"),d!==window&&(e=d.getRootNode()),a.da)break}}
130 function Ed(a,b,c,d,e,f){for(var h=0;h<a.length;h++){var g=a[h],k=g.type,l=g.capture,m=g.once,n=g.passive;if(b===g.node&&c===k&&d===l&&e===m&&f===n)return h}return-1}
131 function Fd(a,b,c){if(b){var d=typeof b;if("function"===d||"object"===d)if("object"!==d||b.handleEvent&&"function"===typeof b.handleEvent){var e=this instanceof Window?A.fb:A.addEventListener;if(vd[a])return e.call(this,a,b,c);if(c&&"object"===typeof c){var f=!!c.capture;var h=!!c.once;var g=!!c.passive}else f=!!c,g=h=!1;var k=c&&c.ga||this,l=b[sd];if(l){if(-1<Ed(l,k,a,f,h,g))return}else b[sd]=[];l=function(e){h&&this.removeEventListener(a,b,c);e.__target||Gd(e);if(k!==this){var f=Object.getOwnPropertyDescriptor(e,
132 "currentTarget");Object.defineProperty(e,"currentTarget",{get:function(){return k},configurable:!0})}e.__previousCurrentTarget=e.currentTarget;if(!z(k)||-1!=e.composedPath().indexOf(k))if(e.composed||-1<e.composedPath().indexOf(k))if(Bd(e)&&e.target===e.relatedTarget)e.eventPhase===Event.BUBBLING_PHASE&&e.stopImmediatePropagation();else if(e.eventPhase===Event.CAPTURING_PHASE||e.bubbles||e.target===k||k instanceof Window){var g="function"===d?b.call(k,e):b.handleEvent&&b.handleEvent(e);k!==this&&
133 (f?(Object.defineProperty(e,"currentTarget",f),f=null):delete e.currentTarget);return g}};b[sd].push({node:k,type:a,capture:f,once:h,passive:g,hb:l});Ad[a]?(this.__handlers=this.__handlers||{},this.__handlers[a]=this.__handlers[a]||{capture:[],bubble:[]},this.__handlers[a][f?"capture":"bubble"].push(l)):e.call(this,a,l,c)}}}
134 function Hd(a,b,c){if(b){var d=this instanceof Window?A.gb:A.removeEventListener;if(vd[a])return d.call(this,a,b,c);if(c&&"object"===typeof c){var e=!!c.capture;var f=!!c.once;var h=!!c.passive}else e=!!c,h=f=!1;var g=c&&c.ga||this,k=void 0;var l=null;try{l=b[sd]}catch(m){}l&&(f=Ed(l,g,a,e,f,h),-1<f&&(k=l.splice(f,1)[0].hb,l.length||(b[sd]=void 0)));d.call(this,a,k||b,c);k&&Ad[a]&&this.__handlers&&this.__handlers[a]&&(a=this.__handlers[a][e?"capture":"bubble"],k=a.indexOf(k),-1<k&&a.splice(k,1))}}
135 function Id(){for(var a in Ad)window.addEventListener(a,function(a){a.__target||(Gd(a),Dd(a))},!0)}function Gd(a){a.__target=a.target;a.ea=a.relatedTarget;if(y.w){var b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__patchProto")){var c=Object.create(b);c.jb=b;Fb(c,yd);b.__patchProto=c}a.__proto__=b.__patchProto}else Fb(a,yd)}var Jd=zd(window.Event),Kd=zd(window.CustomEvent),Ld=zd(window.MouseEvent);
136 function Md(){window.Event=Jd;window.CustomEvent=Kd;window.MouseEvent=Ld;Id();if(!td&&Object.getOwnPropertyDescriptor(Event.prototype,"isTrusted")){var a=function(){var a=new MouseEvent("click",{bubbles:!0,cancelable:!0,composed:!0});this.dispatchEvent(a)};Element.prototype.click?Element.prototype.click=a:HTMLElement.prototype.click&&(HTMLElement.prototype.click=a)}};function Nd(a,b){return{index:a,O:[],X:b}}
137 function Od(a,b,c,d){var e=0,f=0,h=0,g=0,k=Math.min(b-e,d-f);if(0==e&&0==f)a:{for(h=0;h<k;h++)if(a[h]!==c[h])break a;h=k}if(b==a.length&&d==c.length){g=a.length;for(var l=c.length,m=0;m<k-h&&Pd(a[--g],c[--l]);)m++;g=m}e+=h;f+=h;b-=g;d-=g;if(0==b-e&&0==d-f)return[];if(e==b){for(b=Nd(e,0);f<d;)b.O.push(c[f++]);return[b]}if(f==d)return[Nd(e,b-e)];k=e;h=f;d=d-h+1;g=b-k+1;b=Array(d);for(l=0;l<d;l++)b[l]=Array(g),b[l][0]=l;for(l=0;l<g;l++)b[0][l]=l;for(l=1;l<d;l++)for(m=1;m<g;m++)if(a[k+m-1]===c[h+l-1])b[l][m]=
138 b[l-1][m-1];else{var n=b[l-1][m]+1,t=b[l][m-1]+1;b[l][m]=n<t?n:t}k=b.length-1;h=b[0].length-1;d=b[k][h];for(a=[];0<k||0<h;)0==k?(a.push(2),h--):0==h?(a.push(3),k--):(g=b[k-1][h-1],l=b[k-1][h],m=b[k][h-1],n=l<m?l<g?l:g:m<g?m:g,n==g?(g==d?a.push(0):(a.push(1),d=g),k--,h--):n==l?(a.push(3),k--,d=l):(a.push(2),h--,d=m));a.reverse();b=void 0;k=[];for(h=0;h<a.length;h++)switch(a[h]){case 0:b&&(k.push(b),b=void 0);e++;f++;break;case 1:b||(b=Nd(e,0));b.X++;e++;b.O.push(c[f]);f++;break;case 2:b||(b=Nd(e,0));
139 b.X++;e++;break;case 3:b||(b=Nd(e,0)),b.O.push(c[f]),f++}b&&k.push(b);return k}function Pd(a,b){return a===b};var hd=J.parentNode,Qd=J.childNodes,Rd={},Sd=y.deferConnectionCallbacks&&"loading"===document.readyState,Td;function Ud(a){var b=[];do b.unshift(a);while(a=a.parentNode);return b}
140 function Tc(a,b,c){if(a!==Rd)throw new TypeError("Illegal constructor");this.La="ShadyRoot";this.host=b;this.c=c&&c.mode;Yc(b);a=w(b);a.root=this;a.ya="closed"!==this.c?this:null;a=w(this);a.firstChild=a.lastChild=a.parentNode=a.nextSibling=a.previousSibling=null;a.childNodes=[];this.b=this.W=!1;this.a=this.j=this.g=null;bd(this)}function bd(a){a.W||(a.W=!0,Rb(function(){return Vd(a)}))}
141 function Vd(a){for(var b;a;){a.W&&(b=a);a:{var c=a;a=c.host.getRootNode();if(z(a))for(var d=c.host.childNodes,e=0;e<d.length;e++)if(c=d[e],"slot"==c.localName)break a;a=void 0}}b&&b._renderRoot()}
142 Tc.prototype._renderRoot=function(){var a=Sd;Sd=!0;this.W=!1;if(this.g){gd(this);for(var b=0,c;b<this.g.length;b++){c=this.g[b];var d=x(c),e=d.assignedNodes;d.assignedNodes=[];d.D=[];if(d.la=e)for(d=0;d<e.length;d++){var f=x(e[d]);f.U=f.assignedSlot;f.assignedSlot===c&&(f.assignedSlot=null)}}for(c=this.host.firstChild;c;c=c.nextSibling)Wd(this,c);for(b=0;b<this.g.length;b++){c=this.g[b];e=x(c);if(!e.assignedNodes.length)for(d=c.firstChild;d;d=d.nextSibling)Wd(this,d,c);(d=(d=x(c.parentNode))&&d.root)&&
143 id(d)&&d._renderRoot();Xd(this,e.D,e.assignedNodes);if(d=e.la){for(f=0;f<d.length;f++)x(d[f]).U=null;e.la=null;d.length>e.assignedNodes.length&&(e.Z=!0)}e.Z&&(e.Z=!1,Yd(this,c))}b=this.g;c=[];for(e=0;e<b.length;e++)d=b[e].parentNode,(f=x(d))&&f.root||!(0>c.indexOf(d))||c.push(d);for(b=0;b<c.length;b++){e=c[b];d=e===this?this.host:e;f=[];e=e.childNodes;for(var h=0;h<e.length;h++){var g=e[h];if("slot"==g.localName){g=x(g).D;for(var k=0;k<g.length;k++)f.push(g[k])}else f.push(g)}e=void 0;h=Qd(d);g=Od(f,
144 f.length,h,h.length);for(var l=k=0;k<g.length&&(e=g[k]);k++){for(var m=0,n;m<e.O.length&&(n=e.O[m]);m++)hd(n)===d&&A.removeChild.call(d,n),h.splice(e.index+l,1);l-=e.X}for(l=0;l<g.length&&(e=g[l]);l++)for(k=h[e.index],m=e.index;m<e.index+e.X;m++)n=f[m],A.insertBefore.call(d,n,k),h.splice(m,0,n)}}if(!this.b)for(n=this.host.childNodes,c=0,b=n.length;c<b;c++)e=n[c],d=x(e),hd(e)!==this.host||"slot"!==e.localName&&d.assignedSlot||A.removeChild.call(this.host,e);this.b=!0;Sd=a;Td&&Td()};
145 function Wd(a,b,c){var d=w(b),e=d.U;d.U=null;c||(c=(a=a.j[b.slot||"__catchall"])&&a[0]);c?(w(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(w(d.assignedSlot).Z=!0)}function Xd(a,b,c){for(var d=0,e;d<c.length&&(e=c[d]);d++)if("slot"==e.localName){var f=x(e).assignedNodes;f&&f.length&&Xd(a,b,f)}else b.push(c[d])}function Yd(a,b){A.dispatchEvent.call(b,new Event("slotchange"));b=x(b);b.assignedSlot&&Yd(a,b.assignedSlot)}
146 function gd(a){if(a.a&&a.a.length){for(var b=a.a,c,d=0;d<b.length;d++){var e=b[d];Yc(e);Yc(e.parentNode);var f=kd(e);a.j[f]?(c=c||{},c[f]=!0,a.j[f].push(e)):a.j[f]=[e];a.g.push(e)}if(c)for(var h in c)a.j[h]=ld(a.j[h]);a.a=[]}}function kd(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.Ga=b}function ld(a){return a.sort(function(a,c){a=Ud(a);for(var b=Ud(c),e=0;e<a.length;e++){c=a[e];var f=b[e];if(c!==f)return a=Array.from(c.parentNode.childNodes),a.indexOf(c)-a.indexOf(f)}})}
147 function id(a){gd(a);return!(!a.g||!a.g.length)}
148 if(window.customElements&&y.na){var Zd=new Map;Td=function(){var a=Array.from(Zd);Zd.clear();a=ma(a);for(var b=a.next();!b.done;b=a.next()){b=ma(b.value);var c=b.next().value;b.next().value?c.Ea():c.Fa()}};Sd&&document.addEventListener("readystatechange",function(){Sd=!1;Td()},{once:!0});var $d=function(a,b,c){var d=0,e="__isConnected"+d++;if(b||c)a.prototype.connectedCallback=a.prototype.Ea=function(){Sd?Zd.set(this,!0):this[e]||(this[e]=!0,b&&b.call(this))},a.prototype.disconnectedCallback=a.prototype.Fa=
149 function(){Sd?this.isConnected||Zd.set(this,!1):this[e]&&(this[e]=!1,c&&c.call(this))};return a},define=window.customElements.define;Object.defineProperty(window.CustomElementRegistry.prototype,"define",{value:function(a,b){var c=b.prototype.connectedCallback,d=b.prototype.disconnectedCallback;define.call(window.customElements,a,$d(b,c,d));b.prototype.connectedCallback=c;b.prototype.disconnectedCallback=d}})};function ae(a){var b=a.getRootNode();z(b)&&Vd(b);return(a=x(a))&&a.assignedSlot||null}
150 var be={addEventListener:Fd.bind(window),removeEventListener:Hd.bind(window)},ce={addEventListener:Fd,removeEventListener:Hd,appendChild:function(a){return $c(this,a)},insertBefore:function(a,b){return $c(this,a,b)},removeChild:function(a){return ad(this,a)},replaceChild:function(a,b){$c(this,a,b);ad(this,b);return a},cloneNode:function(a){if("template"==this.localName)var b=A.cloneNode.call(this,a);else if(b=A.cloneNode.call(this,!1),a&&b.nodeType!==Node.ATTRIBUTE_NODE){a=this.childNodes;for(var c=
151 0,d;c<a.length;c++)d=a[c].cloneNode(!0),b.appendChild(d)}return b},getRootNode:function(){return md(this)},contains:function(a){return Nb(this,a)},dispatchEvent:function(a){Sb();return A.dispatchEvent.call(this,a)}};
152 Object.defineProperties(ce,{isConnected:{get:function(){if(Ic&&Ic.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;var a=this.ownerDocument;if(Mb){if(A.contains.call(a,this))return!0}else if(a.documentElement&&A.contains.call(a.documentElement,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.parentNode||(z(a)?a.host:void 0);return!!(a&&a instanceof Document)},configurable:!0}});
153 var de={get assignedSlot(){return ae(this)}},ee={querySelector:function(a){return nd(this,function(b){return Eb.call(b,a)},function(a){return!!a})[0]||null},querySelectorAll:function(a,b){if(b){b=Array.prototype.slice.call(A.querySelectorAll.call(this,a));var c=this.getRootNode();return b.filter(function(a){return a.getRootNode()==c})}return nd(this,function(b){return Eb.call(b,a)})}},fe={assignedNodes:function(a){if("slot"===this.localName){var b=this.getRootNode();z(b)&&Vd(b);return(b=x(this))?
154 (a&&a.flatten?b.D:b.assignedNodes)||[]:[]}}},ge=Gb({setAttribute:function(a,b){qd(this,a,b)},removeAttribute:function(a){A.removeAttribute.call(this,a);jd(this,a)},attachShadow:function(a){if(!this)throw"Must provide a host.";if(!a)throw"Not enough arguments.";return new Tc(Rd,this,a)},get slot(){return this.getAttribute("slot")},set slot(a){qd(this,"slot",a)},get assignedSlot(){return ae(this)}},ee,fe);Object.defineProperties(ge,Pc);
155 var he=Gb({importNode:function(a,b){return rd(a,b)},getElementById:function(a){return nd(this,function(b){return b.id==a},function(a){return!!a})[0]||null}},ee);Object.defineProperties(he,{_activeElement:Qc.activeElement});
156 for(var ie=HTMLElement.prototype.blur,je={blur:function(){var a=x(this);(a=(a=a&&a.root)&&a.activeElement)?a.blur():ie.call(this)}},ke={},le=ma(Object.getOwnPropertyNames(Document.prototype)),me=le.next();!me.done;ke={u:ke.u},me=le.next())ke.u=me.value,"on"===ke.u.substring(0,2)&&Object.defineProperty(je,ke.u,{set:function(a){return function(b){var c=w(this),d=a.u.substring(2);c.S[a.u]&&this.removeEventListener(d,c.S[a.u]);this.addEventListener(d,b,{});c.S[a.u]=b}}(ke),get:function(a){return function(){var b=
157 x(this);return b&&b.S[a.u]}}(ke),configurable:!0});var ne={addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ga=this;this.host.addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ga=this;this.host.removeEventListener(a,b,c)},getElementById:function(a){return nd(this,function(b){return b.id==a},function(a){return!!a})[0]||null}};
158 function L(a,b){for(var c=Object.getOwnPropertyNames(b),d=0;d<c.length;d++){var e=c[d],f=Object.getOwnPropertyDescriptor(b,e);f.value?a[e]=f.value:Object.defineProperty(a,e,f)}};if(y.na){var ShadyDOM={inUse:y.na,patch:function(a){Vc(a);Uc(a);return a},isShadyRoot:z,enqueue:Rb,flush:Sb,settings:y,filterMutations:Yb,observeChildren:Wb,unobserveChildren:Xb,nativeMethods:A,nativeTree:J,deferConnectionCallbacks:y.deferConnectionCallbacks};window.ShadyDOM=ShadyDOM;Md();var oe=window.customElements&&window.customElements.nativeHTMLElement||HTMLElement;L(Tc.prototype,ne);L(window.Node.prototype,ce);L(window.Window.prototype,be);L(window.Text.prototype,de);L(window.DocumentFragment.prototype,
159 ee);L(window.Element.prototype,ge);L(window.Document.prototype,he);window.HTMLSlotElement&&L(window.HTMLSlotElement.prototype,fe);L(oe.prototype,je);y.w&&(Rc(window.Node.prototype),Rc(window.Text.prototype),Rc(window.DocumentFragment.prototype),Rc(window.Element.prototype),Rc(oe.prototype),Rc(window.Document.prototype),window.HTMLSlotElement&&Rc(window.HTMLSlotElement.prototype));Sc();window.ShadowRoot=Tc};var pe=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function qe(a){var b=pe.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function M(a){var b=a.isConnected;if(void 0!==b)return b;for(;a&&!(a.__CE_isImportDocument||a instanceof Document);)a=a.parentNode||(window.ShadowRoot&&a instanceof ShadowRoot?a.host:void 0);return!(!a||!(a.__CE_isImportDocument||a instanceof Document))}
160 function re(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
161 function se(a,b,c){c=void 0===c?new Set:c;for(var d=a;d;){if(d.nodeType===Node.ELEMENT_NODE){var e=d;b(e);var f=e.localName;if("link"===f&&"import"===e.getAttribute("rel")){d=e.import;if(d instanceof Node&&!c.has(d))for(c.add(d),d=d.firstChild;d;d=d.nextSibling)se(d,b,c);d=re(a,e);continue}else if("template"===f){d=re(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)se(e,b,c)}d=d.firstChild?d.firstChild:re(a,d)}}function N(a,b,c){a[b]=c};function te(){this.a=new Map;this.o=new Map;this.i=[];this.c=!1}function ue(a,b,c){a.a.set(b,c);a.o.set(c.constructor,c)}function ve(a,b){a.c=!0;a.i.push(b)}function we(a,b){a.c&&se(b,function(b){return a.b(b)})}te.prototype.b=function(a){if(this.c&&!a.__CE_patched){a.__CE_patched=!0;for(var b=0;b<this.i.length;b++)this.i[b](a)}};function O(a,b){var c=[];se(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state?a.connectedCallback(d):xe(a,d)}}
162 function P(a,b){var c=[];se(b,function(a){return c.push(a)});for(b=0;b<c.length;b++){var d=c[b];1===d.__CE_state&&a.disconnectedCallback(d)}}
163 function Q(a,b,c){c=void 0===c?{}:c;var d=c.eb||new Set,e=c.ca||function(b){return xe(a,b)},f=[];se(b,function(b){if("link"===b.localName&&"import"===b.getAttribute("rel")){var c=b.import;c instanceof Node&&(c.__CE_isImportDocument=!0,c.__CE_hasRegistry=!0);c&&"complete"===c.readyState?c.__CE_documentLoadHandled=!0:b.addEventListener("load",function(){var c=b.import;if(!c.__CE_documentLoadHandled){c.__CE_documentLoadHandled=!0;var f=new Set(d);f.delete(c);Q(a,c,{eb:f,ca:e})}})}else f.push(b)},d);
164 if(a.c)for(b=0;b<f.length;b++)a.b(f[b]);for(b=0;b<f.length;b++)e(f[b])}
165 function xe(a,b){if(void 0===b.__CE_state){var c=b.ownerDocument;if(c.defaultView||c.__CE_isImportDocument&&c.__CE_hasRegistry)if(c=a.a.get(b.localName)){c.constructionStack.push(b);var d=c.constructor;try{try{if(new d!==b)throw Error("The custom element constructor did not produce the element being upgraded.");}finally{c.constructionStack.pop()}}catch(h){throw b.__CE_state=2,h;}b.__CE_state=1;b.__CE_definition=c;if(c.attributeChangedCallback)for(c=c.observedAttributes,d=0;d<c.length;d++){var e=c[d],
166 f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}M(b)&&a.connectedCallback(b)}}}te.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};te.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
167 te.prototype.attributeChangedCallback=function(a,b,c,d,e){var f=a.__CE_definition;f.attributeChangedCallback&&-1<f.observedAttributes.indexOf(b)&&f.attributeChangedCallback.call(a,b,c,d,e)};function ye(a){var b=document;this.l=a;this.a=b;this.H=void 0;Q(this.l,this.a);"loading"===this.a.readyState&&(this.H=new MutationObserver(this.b.bind(this)),this.H.observe(this.a,{childList:!0,subtree:!0}))}function ze(a){a.H&&a.H.disconnect()}ye.prototype.b=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||ze(this);for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)Q(this.l,c[d])};function Ae(){var a=this;this.b=this.a=void 0;this.c=new Promise(function(b){a.b=b;a.a&&b(a.a)})}Ae.prototype.resolve=function(a){if(this.a)throw Error("Already resolved.");this.a=a;this.b&&this.b(a)};function R(a){this.ia=!1;this.l=a;this.ma=new Map;this.ja=function(a){return a()};this.T=!1;this.ka=[];this.Ja=new ye(a)}p=R.prototype;
168 p.define=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!qe(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.l.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.ia)throw Error("A custom element is already being defined.");this.ia=!0;try{var d=function(a){var b=e[a];if(void 0!==b&&!(b instanceof Function))throw Error("The '"+a+"' callback must be a function.");
169 return b},e=b.prototype;if(!(e instanceof Object))throw new TypeError("The custom element constructor's prototype is not an object.");var f=d("connectedCallback");var h=d("disconnectedCallback");var g=d("adoptedCallback");var k=d("attributeChangedCallback");var l=b.observedAttributes||[]}catch(m){return}finally{this.ia=!1}b={localName:a,constructor:b,connectedCallback:f,disconnectedCallback:h,adoptedCallback:g,attributeChangedCallback:k,observedAttributes:l,constructionStack:[]};ue(this.l,a,b);this.ka.push(b);
170 this.T||(this.T=!0,this.ja(function(){return Be(c)}))};p.ca=function(a){Q(this.l,a)};
171 function Be(a){if(!1!==a.T){a.T=!1;for(var b=a.ka,c=[],d=new Map,e=0;e<b.length;e++)d.set(b[e].localName,[]);Q(a.l,document,{ca:function(b){if(void 0===b.__CE_state){var e=b.localName,f=d.get(e);f?f.push(b):a.l.a.get(e)&&c.push(b)}}});for(e=0;e<c.length;e++)xe(a.l,c[e]);for(;0<b.length;){var f=b.shift();e=f.localName;f=d.get(f.localName);for(var h=0;h<f.length;h++)xe(a.l,f[h]);(e=a.ma.get(e))&&e.resolve(void 0)}}}p.get=function(a){if(a=this.l.a.get(a))return a.constructor};
172 p.whenDefined=function(a){if(!qe(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.ma.get(a);if(b)return b.c;b=new Ae;this.ma.set(a,b);this.l.a.get(a)&&!this.ka.some(function(b){return b.localName===a})&&b.resolve(void 0);return b.c};p.Za=function(a){ze(this.Ja);var b=this.ja;this.ja=function(c){return a(function(){return b(c)})}};window.CustomElementRegistry=R;R.prototype.define=R.prototype.define;R.prototype.upgrade=R.prototype.ca;
173 R.prototype.get=R.prototype.get;R.prototype.whenDefined=R.prototype.whenDefined;R.prototype.polyfillWrapFlushCallback=R.prototype.Za;var Ce=window.Document.prototype.createElement,De=window.Document.prototype.createElementNS,Ee=window.Document.prototype.importNode,Fe=window.Document.prototype.prepend,Ge=window.Document.prototype.append,He=window.DocumentFragment.prototype.prepend,Ie=window.DocumentFragment.prototype.append,Je=window.Node.prototype.cloneNode,Ke=window.Node.prototype.appendChild,Le=window.Node.prototype.insertBefore,Me=window.Node.prototype.removeChild,Ne=window.Node.prototype.replaceChild,Oe=Object.getOwnPropertyDescriptor(window.Node.prototype,
174 "textContent"),Pe=window.Element.prototype.attachShadow,Qe=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),Re=window.Element.prototype.getAttribute,Se=window.Element.prototype.setAttribute,Te=window.Element.prototype.removeAttribute,Ue=window.Element.prototype.getAttributeNS,Ve=window.Element.prototype.setAttributeNS,We=window.Element.prototype.removeAttributeNS,Xe=window.Element.prototype.insertAdjacentElement,Ye=window.Element.prototype.insertAdjacentHTML,Ze=window.Element.prototype.prepend,
175 $e=window.Element.prototype.append,af=window.Element.prototype.before,bf=window.Element.prototype.after,cf=window.Element.prototype.replaceWith,df=window.Element.prototype.remove,ef=window.HTMLElement,ff=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),gf=window.HTMLElement.prototype.insertAdjacentElement,hf=window.HTMLElement.prototype.insertAdjacentHTML;var jf=new function(){};function kf(){var a=lf;window.HTMLElement=function(){function b(){var b=this.constructor,d=a.o.get(b);if(!d)throw Error("The custom element being constructed was not registered with `customElements`.");var e=d.constructionStack;if(0===e.length)return e=Ce.call(document,d.localName),Object.setPrototypeOf(e,b.prototype),e.__CE_state=1,e.__CE_definition=d,a.b(e),e;d=e.length-1;var f=e[d];if(f===jf)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
176 e[d]=jf;Object.setPrototypeOf(f,b.prototype);a.b(f);return f}b.prototype=ef.prototype;Object.defineProperty(b.prototype,"constructor",{writable:!0,configurable:!0,enumerable:!1,value:b});return b}()};function mf(a,b,c){function d(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var f=[],l=0;l<d.length;l++){var m=d[l];m instanceof Element&&M(m)&&f.push(m);if(m instanceof DocumentFragment)for(m=m.firstChild;m;m=m.nextSibling)e.push(m);else e.push(m)}b.apply(this,d);for(d=0;d<f.length;d++)P(a,f[d]);if(M(this))for(d=0;d<e.length;d++)f=e[d],f instanceof Element&&O(a,f)}}void 0!==c.aa&&(b.prepend=d(c.aa));void 0!==c.append&&(b.append=d(c.append))};function nf(){var a=lf;N(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var c=a.a.get(b);if(c)return new c.constructor}b=Ce.call(this,b);a.b(b);return b});N(Document.prototype,"importNode",function(b,c){b=Ee.call(this,b,c);this.__CE_hasRegistry?Q(a,b):we(a,b);return b});N(Document.prototype,"createElementNS",function(b,c){if(this.__CE_hasRegistry&&(null===b||"http://www.w3.org/1999/xhtml"===b)){var d=a.a.get(c);if(d)return new d.constructor}b=De.call(this,b,c);a.b(b);return b});
177 mf(a,Document.prototype,{aa:Fe,append:Ge})};function of(){var a=lf;function b(b,d){Object.defineProperty(b,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(b){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,b);else{var c=void 0;if(this.firstChild){var e=this.childNodes,g=e.length;if(0<g&&M(this)){c=Array(g);for(var k=0;k<g;k++)c[k]=e[k]}}d.set.call(this,b);if(c)for(b=0;b<c.length;b++)P(a,c[b])}}})}N(Node.prototype,"insertBefore",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);
178 b=Le.call(this,b,d);if(M(this))for(d=0;d<c.length;d++)O(a,c[d]);return b}c=M(b);d=Le.call(this,b,d);c&&P(a,b);M(this)&&O(a,b);return d});N(Node.prototype,"appendChild",function(b){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=Ke.call(this,b);if(M(this))for(var e=0;e<c.length;e++)O(a,c[e]);return b}c=M(b);e=Ke.call(this,b);c&&P(a,b);M(this)&&O(a,b);return e});N(Node.prototype,"cloneNode",function(b){b=Je.call(this,b);this.ownerDocument.__CE_hasRegistry?Q(a,b):
179 we(a,b);return b});N(Node.prototype,"removeChild",function(b){var c=M(b),e=Me.call(this,b);c&&P(a,b);return e});N(Node.prototype,"replaceChild",function(b,d){if(b instanceof DocumentFragment){var c=Array.prototype.slice.apply(b.childNodes);b=Ne.call(this,b,d);if(M(this))for(P(a,d),d=0;d<c.length;d++)O(a,c[d]);return b}c=M(b);var f=Ne.call(this,b,d),h=M(this);h&&P(a,d);c&&P(a,b);h&&O(a,b);return f});Oe&&Oe.get?b(Node.prototype,Oe):ve(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){for(var a=
180 [],b=0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)Me.call(this,this.firstChild);Ke.call(this,document.createTextNode(a))}})})};function pf(a){var b=Element.prototype;function c(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e-0]=arguments[e];e=[];for(var g=[],k=0;k<d.length;k++){var l=d[k];l instanceof Element&&M(l)&&g.push(l);if(l instanceof DocumentFragment)for(l=l.firstChild;l;l=l.nextSibling)e.push(l);else e.push(l)}b.apply(this,d);for(d=0;d<g.length;d++)P(a,g[d]);if(M(this))for(d=0;d<e.length;d++)g=e[d],g instanceof Element&&O(a,g)}}void 0!==af&&(b.before=c(af));void 0!==af&&(b.after=c(bf));void 0!==
181 cf&&N(b,"replaceWith",function(b){for(var c=[],d=0;d<arguments.length;++d)c[d-0]=arguments[d];d=[];for(var h=[],g=0;g<c.length;g++){var k=c[g];k instanceof Element&&M(k)&&h.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)d.push(k);else d.push(k)}g=M(this);cf.apply(this,c);for(c=0;c<h.length;c++)P(a,h[c]);if(g)for(P(a,this),c=0;c<d.length;c++)h=d[c],h instanceof Element&&O(a,h)});void 0!==df&&N(b,"remove",function(){var b=M(this);df.call(this);b&&P(a,this)})};function qf(){var a=lf;function b(b,c){Object.defineProperty(b,"innerHTML",{enumerable:c.enumerable,configurable:!0,get:c.get,set:function(b){var d=this,e=void 0;M(this)&&(e=[],se(this,function(a){a!==d&&e.push(a)}));c.set.call(this,b);if(e)for(var f=0;f<e.length;f++){var h=e[f];1===h.__CE_state&&a.disconnectedCallback(h)}this.ownerDocument.__CE_hasRegistry?Q(a,this):we(a,this);return b}})}function c(b,c){N(b,"insertAdjacentElement",function(b,d){var e=M(d);b=c.call(this,b,d);e&&P(a,d);M(b)&&O(a,
182 d);return b})}function d(b,c){function d(b,c){for(var d=[];b!==c;b=b.nextSibling)d.push(b);for(c=0;c<d.length;c++)Q(a,d[c])}N(b,"insertAdjacentHTML",function(a,b){a=a.toLowerCase();if("beforebegin"===a){var e=this.previousSibling;c.call(this,a,b);d(e||this.parentNode.firstChild,this)}else if("afterbegin"===a)e=this.firstChild,c.call(this,a,b),d(this.firstChild,e);else if("beforeend"===a)e=this.lastChild,c.call(this,a,b),d(e||this.firstChild,null);else if("afterend"===a)e=this.nextSibling,c.call(this,
183 a,b),d(this.nextSibling,e);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}Pe&&N(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=Pe.call(this,a)});Qe&&Qe.get?b(Element.prototype,Qe):ff&&ff.get?b(HTMLElement.prototype,ff):ve(a,function(a){b(a,{enumerable:!0,configurable:!0,get:function(){return Je.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:
184 this,d=De.call(document,this.namespaceURI,this.localName);for(d.innerHTML=a;0<c.childNodes.length;)Me.call(c,c.childNodes[0]);for(a=b?d.content:d;0<a.childNodes.length;)Ke.call(c,a.childNodes[0])}})});N(Element.prototype,"setAttribute",function(b,c){if(1!==this.__CE_state)return Se.call(this,b,c);var d=Re.call(this,b);Se.call(this,b,c);c=Re.call(this,b);a.attributeChangedCallback(this,b,d,c,null)});N(Element.prototype,"setAttributeNS",function(b,c,d){if(1!==this.__CE_state)return Ve.call(this,b,c,
185 d);var e=Ue.call(this,b,c);Ve.call(this,b,c,d);d=Ue.call(this,b,c);a.attributeChangedCallback(this,c,e,d,b)});N(Element.prototype,"removeAttribute",function(b){if(1!==this.__CE_state)return Te.call(this,b);var c=Re.call(this,b);Te.call(this,b);null!==c&&a.attributeChangedCallback(this,b,c,null,null)});N(Element.prototype,"removeAttributeNS",function(b,c){if(1!==this.__CE_state)return We.call(this,b,c);var d=Ue.call(this,b,c);We.call(this,b,c);var e=Ue.call(this,b,c);d!==e&&a.attributeChangedCallback(this,
186 c,d,e,b)});gf?c(HTMLElement.prototype,gf):Xe?c(Element.prototype,Xe):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");hf?d(HTMLElement.prototype,hf):Ye?d(Element.prototype,Ye):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");mf(a,Element.prototype,{aa:Ze,append:$e});pf(a)};var rf=window.customElements;if(!rf||rf.forcePolyfill||"function"!=typeof rf.define||"function"!=typeof rf.get){var lf=new te;kf();nf();mf(lf,DocumentFragment.prototype,{aa:He,append:Ie});of();qf();document.__CE_hasRegistry=!0;var customElements=new R(lf);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};function xf(){this.end=this.start=0;this.rules=this.parent=this.previous=null;this.cssText=this.parsedCssText="";this.atRule=!1;this.type=0;this.parsedSelector=this.selector=this.keyframesName=""}
187 function yf(a){a=a.replace(zf,"").replace(Af,"");var b=Bf,c=a,d=new xf;d.start=0;d.end=c.length;for(var e=d,f=0,h=c.length;f<h;f++)if("{"===c[f]){e.rules||(e.rules=[]);var g=e,k=g.rules[g.rules.length-1]||null;e=new xf;e.start=f+1;e.parent=g;e.previous=k;g.rules.push(e)}else"}"===c[f]&&(e.end=f+1,e=e.parent||d);return b(d,a)}
188 function Bf(a,b){var c=b.substring(a.start,a.end-1);a.parsedCssText=a.cssText=c.trim();a.parent&&(c=b.substring(a.previous?a.previous.end:a.parent.start,a.start-1),c=Cf(c),c=c.replace(Df," "),c=c.substring(c.lastIndexOf(";")+1),c=a.parsedSelector=a.selector=c.trim(),a.atRule=0===c.indexOf("@"),a.atRule?0===c.indexOf("@media")?a.type=Ef:c.match(Ff)&&(a.type=Gf,a.keyframesName=a.selector.split(Df).pop()):a.type=0===c.indexOf("--")?Hf:If);if(c=a.rules)for(var d=0,e=c.length,f;d<e&&(f=c[d]);d++)Bf(f,
189 b);return a}function Cf(a){return a.replace(/\\([0-9a-f]{1,6})\s/gi,function(a,c){a=c;for(c=6-a.length;c--;)a="0"+a;return"\\"+a})}
190 function Jf(a,b,c){c=void 0===c?"":c;var d="";if(a.cssText||a.rules){var e=a.rules,f;if(f=e)f=e[0],f=!(f&&f.selector&&0===f.selector.indexOf("--"));if(f){f=0;for(var h=e.length,g;f<h&&(g=e[f]);f++)d=Jf(g,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(Kf,"").replace(Lf,""),b=b.replace(Mf,"").replace(Nf,"")),(d=b.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return c}
191 var If=1,Gf=7,Ef=4,Hf=1E3,zf=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,Af=/@import[^;]*;/gim,Kf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,Lf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,Mf=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,Nf=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,Ff=/^@[^\s]*keyframes/,Df=/\s+/g;var S=!(window.ShadyDOM&&window.ShadyDOM.inUse),Of;function Pf(a){Of=a&&a.shimcssproperties?!1:S||!(navigator.userAgent.match(/AppleWebKit\/601|Edge\/15/)||!window.CSS||!CSS.supports||!CSS.supports("box-shadow","0 0 0 var(--foo)"))}window.ShadyCSS&&void 0!==window.ShadyCSS.nativeCss?Of=window.ShadyCSS.nativeCss:window.ShadyCSS?(Pf(window.ShadyCSS),window.ShadyCSS=void 0):Pf(window.WebComponents&&window.WebComponents.flags);var U=Of;var Qf=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,Rf=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,Sf=/(--[\w-]+)\s*([:,;)]|$)/gi,Tf=/(animation\s*:)|(animation-name\s*:)/,Uf=/@media\s(.*)/,Vf=/\{[^}]*\}/g;var Wf=new Set;function Xf(a,b){if(!a)return"";"string"===typeof a&&(a=yf(a));b&&Yf(a,b);return Jf(a,U)}function Zf(a){!a.__cssRules&&a.textContent&&(a.__cssRules=yf(a.textContent));return a.__cssRules||null}function $f(a){return!!a.parent&&a.parent.type===Gf}function Yf(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===Ef){var h=a.selector.match(Uf);h&&(window.matchMedia(h[1]).matches||(e=!0))}f===If?b(a):c&&f===Gf?c(a):f===Hf&&(e=!0);if((a=a.rules)&&!e){e=0;f=a.length;for(var g;e<f&&(g=a[e]);e++)Yf(g,b,c,d)}}}
192 function ag(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;bg(e,c,d);return e}var cg=null;function bg(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);cg?a.compareDocumentPosition(cg)===Node.DOCUMENT_POSITION_PRECEDING&&(cg=a):cg=a}
193 function dg(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");a:{var d=0;var e=c+3;for(var f=a.length;e<f;e++)if("("===a[e])d++;else if(")"===a[e]&&0===--d)break a;e=-1}d=a.substring(c+4,e);c=a.substring(0,c);a=dg(a.substring(e+1),b);e=d.indexOf(",");return-1===e?b(c,d.trim(),"",a):b(c,d.substring(0,e).trim(),d.substring(e+1).trim(),a)}function eg(a,b){S?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
194 function fg(a){var b=a.localName,c="";b?-1<b.indexOf("-")||(c=b,b=a.getAttribute&&a.getAttribute("is")||""):(b=a.is,c=a.extends);return{is:b,P:c}};function gg(){}function hg(a,b){var c=W;a.__styleScoped?a.__styleScoped=null:ig(c,a,function(a){jg(a,b||"")})}function ig(a,b,c){b.nodeType===Node.ELEMENT_NODE&&c(b);if(b="template"===b.localName?(b.content||b.kb||b).childNodes:b.children||b.childNodes)for(var d=0;d<b.length;d++)ig(a,b[d],c)}
195 function jg(a,b,c){if(b)if(a.classList)c?(a.classList.remove("style-scope"),a.classList.remove(b)):(a.classList.add("style-scope"),a.classList.add(b));else if(a.getAttribute){var d=a.getAttribute(kg);c?d&&(b=d.replace("style-scope","").replace(b,""),eg(a,b)):eg(a,(d?d+" ":"")+"style-scope "+b)}}function lg(a,b,c){var d=W;a.__styleScoped?a.__styleScoped=null:ig(d,a,function(a){jg(a,b,!0);jg(a,c)})}function mg(a,b){var c=W;a.__styleScoped?a.__styleScoped=null:ig(c,a,function(a){jg(a,b||"",!0)})}
196 function ng(a,b,c){var d=W,e=a.__cssBuild;S||"shady"===e?b=Xf(b,c):(a=fg(a),b=og(d,b,a.is,a.P,c)+"\n\n");return b.trim()}function og(a,b,c,d,e){var f=pg(c,d);c=c?qg+c:"";return Xf(b,function(b){b.c||(b.selector=b.s=rg(a,b,a.b,c,f),b.c=!0);e&&e(b,c,f)})}function pg(a,b){return b?"[is="+a+"]":a}function rg(a,b,c,d,e){var f=b.selector.split(sg);if(!$f(b)){b=0;for(var h=f.length,g;b<h&&(g=f[b]);b++)f[b]=c.call(a,g,d,e)}return f.join(sg)}
197 function tg(a){return a.replace(ug,function(a,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})}gg.prototype.b=function(a,b,c){var d=!1;a=a.trim();var e=ug.test(a);e&&(a=a.replace(ug,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=tg(a));a=a.replace(vg,wg+" $1");a=a.replace(xg,function(a,e,g){d||(a=yg(g,e,b,c),d=d||a.stop,e=a.Oa,g=a.value);return e+g});e&&(a=tg(a));return a};
198 function yg(a,b,c,d){var e=a.indexOf(zg);0<=a.indexOf(wg)?a=Ag(a,d):0!==e&&(a=c?Bg(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(Cg,function(a,b){return" > "+b}))}a=a.replace(Dg,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Oa:b,stop:f}}function Bg(a,b){a=a.split(Eg);a[0]+=b;return a.join(Eg)}
199 function Ag(a,b){var c=a.match(Fg);return(c=c&&c[2].trim()||"")?c[0].match(Gg)?a.replace(Fg,function(a,c,f){return b+f}):c.split(Gg)[0]===b?c:Hg:a.replace(wg,b)}function Ig(a){a.selector===Jg&&(a.selector="html")}gg.prototype.c=function(a){return a.match(zg)?this.b(a,Kg):Bg(a.trim(),Kg)};ea.Object.defineProperties(gg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
200 var ug=/:(nth[-\w]+)\(([^)]+)\)/,Kg=":not(.style-scope)",sg=",",xg=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,Gg=/[[.:#*]/,wg=":host",Jg=":root",zg="::slotted",vg=new RegExp("^("+zg+")"),Fg=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Cg=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,Dg=/(.*):dir\((?:(ltr|rtl))\)/,qg=".",Eg=":",kg="class",Hg="should_not_match",W=new gg;function Lg(a,b,c,d){this.B=a||null;this.b=b||null;this.oa=c||[];this.L=null;this.P=d||"";this.a=this.v=this.G=null}function X(a){return a?a.__styleInfo:null}function Mg(a,b){return a.__styleInfo=b}Lg.prototype.c=function(){return this.B};Lg.prototype._getStyleRules=Lg.prototype.c;function Ng(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var Og=navigator.userAgent.match("Trident");function Pg(){}function Qg(a){var b={},c=[],d=0;Yf(a,function(a){Rg(a);a.index=d++;a=a.m.cssText;for(var c;c=Sf.exec(a);){var e=c[1];":"!==c[2]&&(b[e]=!0)}},function(a){c.push(a)});a.b=c;a=[];for(var e in b)a.push(e);return a}
201 function Rg(a){if(!a.m){var b={},c={};Sg(a,c)&&(b.A=c,a.rules=null);b.cssText=a.parsedCssText.replace(Vf,"").replace(Qf,"");a.m=b}}function Sg(a,b){var c=a.m;if(c){if(c.A)return Object.assign(b,c.A),!0}else{c=a.parsedCssText;for(var d;a=Qf.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
202 function Tg(a,b,c){b&&(b=0<=b.indexOf(";")?Ug(a,b,c):dg(b,function(b,e,f,h){if(!e)return b+h;(e=Tg(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Tg(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""}
203 function Ug(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){Rf.lastIndex=0;if(f=Rf.exec(e))e=Tg(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var h=e.substring(f);h=h.trim();h=Tg(a,h,c)||h;e=e.substring(0,f)+h}b[d]=e&&e.lastIndexOf(";")===e.length-1?e.slice(0,-1):e||""}return b.join(";")}
204 function Vg(a,b){var c={},d=[];Yf(a,function(a){a.m||Rg(a);var e=a.s||a.parsedSelector;b&&a.m.A&&e&&Ng.call(b,e)&&(Sg(a,c),a=a.index,e=parseInt(a/32,10),d[e]=(d[e]||0)|1<<a%32)},null,!0);return{A:c,key:d}}
205 function Wg(a,b,c,d){b.m||Rg(b);if(b.m.A){var e=fg(a);a=e.is;e=e.P;e=a?pg(a,e):"html";var f=b.parsedSelector,h=":host > *"===f||"html"===f,g=0===f.indexOf(":host")&&!h;"shady"===c&&(h=f===e+" > *."+e||-1!==f.indexOf("html"),g=!h&&0===f.indexOf(e));"shadow"===c&&(h=":host > *"===f||"html"===f,g=g&&!h);if(h||g)c=e,g&&(b.s||(b.s=rg(W,b,W.b,a?qg+a:"",e)),c=b.s||e),d({ab:c,Ua:g,ub:h})}}
206 function Xg(a,b){var c={},d={},e=b&&b.__cssBuild;Yf(b,function(b){Wg(a,b,e,function(e){Ng.call(a.lb||a,e.ab)&&(e.Ua?Sg(b,c):Sg(b,d))})},null,!0);return{$a:d,Sa:c}}
207 function Yg(a,b,c,d){var e=fg(b),f=pg(e.is,e.P),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])");e=X(b).B;var g=Zg(e,d);return ng(b,e,function(b){var e="";b.m||Rg(b);b.m.cssText&&(e=Ug(a,b.m.cssText,c));b.cssText=e;if(!S&&!$f(b)&&b.cssText){var k=e=b.cssText;null==b.wa&&(b.wa=Tf.test(e));if(b.wa)if(null==b.$){b.$=[];for(var n in g)k=g[n],k=k(e),e!==k&&(e=k,b.$.push(n))}else{for(n=0;n<b.$.length;++n)k=g[b.$[n]],e=k(e);k=e}b.cssText=k;b.s=b.s||b.selector;e="."+
208 d;n=b.s.split(",");k=0;for(var t=n.length,C;k<t&&(C=n[k]);k++)n[k]=C.match(h)?C.replace(f,e):e+" "+C;b.selector=n.join(",")}})}function Zg(a,b){a=a.b;var c={};if(!S&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,h=b;f.i=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+h;f.s=f.s||f.selector;f.selector=f.s.replace(f.keyframesName,f.a);c[e.keyframesName]=$g(e)}return c}function $g(a){return function(b){return b.replace(a.i,a.a)}}
209 function ah(a,b){var c=bh,d=Zf(a);a.textContent=Xf(d,function(a){var d=a.cssText=a.parsedCssText;a.m&&a.m.cssText&&(d=d.replace(Kf,"").replace(Lf,""),a.cssText=Ug(c,d,b))})}ea.Object.defineProperties(Pg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var bh=new Pg;var ch={},dh=window.customElements;if(dh&&!S){var eh=dh.define;dh.define=function(a,b,c){var d=document.createComment(" Shady DOM styles for "+a+" "),e=document.head;e.insertBefore(d,(cg?cg.nextSibling:null)||e.firstChild);cg=d;ch[a]=d;eh.call(dh,a,b,c)}};function fh(){this.cache={}}fh.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({A:b,styleElement:c,v:d});100<e.length&&e.shift();this.cache[a]=e};fh.prototype.fetch=function(a,b,c){if(a=this.cache[a])for(var d=a.length-1;0<=d;d--){var e=a[d],f;a:{for(f=0;f<c.length;f++){var h=c[f];if(e.A[h]!==b[h]){f=!1;break a}}f=!0}if(f)return e}};function gh(){}
210 function hh(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.target!==document.documentElement&&c.target!==document.head)for(var d=0;d<c.addedNodes.length;d++){var e=c.addedNodes[d];if(e.nodeType===Node.ELEMENT_NODE){var f=e.getRootNode();var h=e;var g=[];h.classList?g=Array.from(h.classList):h instanceof window.SVGElement&&h.hasAttribute("class")&&(g=h.getAttribute("class").split(/\s+/));h=g;g=h.indexOf(W.a);if((h=-1<g?h[g+1]:"")&&f===e.ownerDocument)mg(e,h);else if(f.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&(f=
211 f.host))for(f=fg(f).is,f!==h&&lg(e,h,f),e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+W.a+")"),f=0;f<e.length;f++)if(h=e[f],g=h.getRootNode().host)g=fg(g).is,jg(h,g)}}}}
212 if(!S){var ih=new MutationObserver(hh),jh=function(a){ih.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)jh(document);else{var kh=function(){jh(document.body)};window.HTMLImports?window.HTMLImports.whenReady(kh):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){kh();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",a)}else kh()})}gh=function(){hh(ih.takeRecords())}}
213 var lh=gh;var mh={};var nh=Promise.resolve();function oh(a){if(a=mh[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function ph(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function qh(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.b||(a.b=!0,nh.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.b=!1}))};var rh=new fh;function Y(){this.J={};this.c=document.documentElement;var a=new xf;a.rules=[];this.i=Mg(this.c,new Lg(a));this.o=!1;this.b=this.a=null}p=Y.prototype;p.pa=function(){lh()};p.Qa=function(a){return Zf(a)};p.cb=function(a){return Xf(a)};p.prepareTemplate=function(a,b,c){this.prepareTemplateDom(a,b);this.prepareTemplateStyles(a,b,c)};
214 p.prepareTemplateStyles=function(a,b,c){if(!a.o){a.o=!0;a.name=b;a.extends=c;mh[b]=a;var d=(d=a.content.querySelector("style"))?d.getAttribute("css-build")||"":"";var e=[];for(var f=a.content.querySelectorAll("style"),h=0;h<f.length;h++){var g=f[h];if(g.hasAttribute("shady-unscoped")){if(!S){var k=g.textContent;Wf.has(k)||(Wf.add(k),k=g.cloneNode(!0),document.head.appendChild(k));g.parentNode.removeChild(g)}}else e.push(g.textContent),g.parentNode.removeChild(g)}e=e.join("").trim();c={is:b,extends:c,
215 ib:d};sh(this);f=Rf.test(e)||Qf.test(e);Rf.lastIndex=0;Qf.lastIndex=0;e=yf(e);f&&U&&this.a&&this.a.transformRules(e,b);a._styleAst=e;a.J=d;d=[];U||(d=Qg(a._styleAst));if(!d.length||U)e=S?a.content:null,b=ch[b],f=ng(c,a._styleAst),b=f.length?ag(f,c.is,e,b):void 0,a.a=b;a.i=d}};p.prepareTemplateDom=function(a,b){S||a.c||(a.c=!0,hg(a.content,b))};
216 function th(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.Aa(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.o)&&a.flushCustomStyles()})})}function sh(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=oh);th(a)}
217 p.flushCustomStyles=function(){sh(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(U)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&U&&this.a){var d=Zf(c);sh(this);this.a.transformRules(d);c.textContent=Xf(d)}}else for(uh(this,this.c,this.i),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&ah(c,this.i.G);this.b.enqueued=!1;this.o&&!U&&this.styleDocument()}}};
218 p.styleElement=function(a,b){var c=fg(a).is,d=X(a);if(!d){var e=fg(a);d=e.is;e=e.P;var f=ch[d];d=mh[d];if(d){var h=d._styleAst;var g=d.i}d=Mg(a,new Lg(h,f,g,e))}a!==this.c&&(this.o=!0);b&&(d.L=d.L||{},Object.assign(d.L,b));if(U){if(d.L){b=d.L;for(var k in b)null===k?a.style.removeProperty(k):a.style.setProperty(k,b[k])}if(((k=mh[c])||a===this.c)&&k&&k.a&&!ph(k)){if(ph(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)sh(this),this.a&&this.a.transformRules(k._styleAst,c),k.a.textContent=
219 ng(a,d.B),qh(k);S&&(c=a.shadowRoot)&&(c.querySelector("style").textContent=ng(a,d.B));d.B=k._styleAst}}else if(this.pa(),uh(this,a,d),d.oa&&d.oa.length){c=d;k=fg(a).is;d=(b=rh.fetch(k,c.G,c.oa))?b.styleElement:null;h=c.v;(g=b&&b.v)||(g=this.J[k]=(this.J[k]||0)+1,g=k+"-"+g);c.v=g;g=c.v;e=bh;e=d?d.textContent||"":Yg(e,a,c.G,g);f=X(a);var l=f.a;l&&!S&&l!==d&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));S?f.a?(f.a.textContent=e,d=f.a):e&&(d=ag(e,g,a.shadowRoot,f.b)):d?d.parentNode||
220 (Og&&-1<e.indexOf("@media")&&(d.textContent=e),bg(d,null,f.b)):e&&(d=ag(e,g,null,f.b));d&&(d._useCount=d._useCount||0,f.a!=d&&d._useCount++,f.a=d);g=d;S||(d=c.v,f=e=a.getAttribute("class")||"",h&&(f=e.replace(new RegExp("\\s*x-scope\\s*"+h+"\\s*","g")," ")),f+=(f?" ":"")+"x-scope "+d,e!==f&&eg(a,f));b||rh.store(k,c.G,g,c.v)}};function vh(a,b){return(b=b.getRootNode().host)?X(b)?b:vh(a,b):a.c}
221 function uh(a,b,c){a=vh(a,b);var d=X(a);a=Object.create(d.G||null);var e=Xg(b,c.B);b=Vg(d.B,b).A;Object.assign(a,e.Sa,b,e.$a);b=c.L;for(var f in b)if((e=b[f])||0===e)a[f]=e;f=bh;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=Tg(f,a[d],a);c.G=a}p.styleDocument=function(a){this.styleSubtree(this.c,a)};
222 p.styleSubtree=function(a,b){var c=a.shadowRoot;(c||a===this.c)&&this.styleElement(a,b);if(b=c&&(c.children||c.childNodes))for(a=0;a<b.length;a++)this.styleSubtree(b[a]);else if(a=a.children||a.childNodes)for(b=0;b<a.length;b++)this.styleSubtree(a[b])};p.Aa=function(a){var b=this,c=Zf(a);Yf(c,function(a){if(S)Ig(a);else{var c=W;a.selector=a.parsedSelector;Ig(a);a.selector=a.s=rg(c,a,c.c,void 0,void 0)}U&&(sh(b),b.a&&b.a.transformRule(a))});U?a.textContent=Xf(c):this.i.B.rules.push(c)};
223 p.getComputedStyleValue=function(a,b){var c;U||(c=(X(a)||X(vh(this,a))).G[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};p.bb=function(a,b){var c=a.getRootNode();b=b?b.split(/\s/):[];c=c.host&&c.host.localName;if(!c){var d=a.getAttribute("class");if(d){d=d.split(/\s/);for(var e=0;e<d.length;e++)if(d[e]===W.a){c=d[e+1];break}}}c&&b.push(W.a,c);U||(c=X(a))&&c.v&&b.push(bh.a,c.v);eg(a,b.join(" "))};p.Na=function(a){return X(a)};Y.prototype.flush=Y.prototype.pa;
224 Y.prototype.prepareTemplate=Y.prototype.prepareTemplate;Y.prototype.styleElement=Y.prototype.styleElement;Y.prototype.styleDocument=Y.prototype.styleDocument;Y.prototype.styleSubtree=Y.prototype.styleSubtree;Y.prototype.getComputedStyleValue=Y.prototype.getComputedStyleValue;Y.prototype.setElementClass=Y.prototype.bb;Y.prototype._styleInfoForNode=Y.prototype.Na;Y.prototype.transformCustomStyleForDocument=Y.prototype.Aa;Y.prototype.getStyleAst=Y.prototype.Qa;Y.prototype.styleAstToString=Y.prototype.cb;
225 Y.prototype.flushCustomStyles=Y.prototype.flushCustomStyles;Object.defineProperties(Y.prototype,{nativeShadow:{get:function(){return S}},nativeCss:{get:function(){return U}}});var Z=new Y,wh,xh;window.ShadyCSS&&(wh=window.ShadyCSS.ApplyShim,xh=window.ShadyCSS.CustomStyleInterface);
226 window.ShadyCSS={ScopingShim:Z,prepareTemplate:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplate(a,b,c)},prepareTemplateDom:function(a,b){Z.prepareTemplateDom(a,b)},prepareTemplateStyles:function(a,b,c){Z.flushCustomStyles();Z.prepareTemplateStyles(a,b,c)},styleSubtree:function(a,b){Z.flushCustomStyles();Z.styleSubtree(a,b)},styleElement:function(a){Z.flushCustomStyles();Z.styleElement(a)},styleDocument:function(a){Z.flushCustomStyles();Z.styleDocument(a)},flushCustomStyles:function(){Z.flushCustomStyles()},
227 getComputedStyleValue:function(a,b){return Z.getComputedStyleValue(a,b)},nativeCss:U,nativeShadow:S};wh&&(window.ShadyCSS.ApplyShim=wh);xh&&(window.ShadyCSS.CustomStyleInterface=xh);var yh=window.customElements,zh=window.HTMLImports,Ah=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(yh&&yh.polyfillWrapFlushCallback){var Bh,Ch=function(){if(Bh){Ah.C&&Ah.C(window.document);var a=Bh;Bh=null;a();return!0}},Dh=zh.whenReady;yh.polyfillWrapFlushCallback(function(a){Bh=a;Dh(Ch)});zh.whenReady=function(a){Dh(function(){Ch()?zh.whenReady(a):a()})}}
228 zh.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var Eh=document.createElement("style");Eh.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var Fh=document.querySelector("head");Fh.insertBefore(Eh,Fh.firstChild);}).call(this);
229
230 //# sourceMappingURL=webcomponents-lite.js.map
@@ -1,12 +0,0 b''
1 /**
2 * @license
3 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4 * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5 * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6 * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7 * Code distributed by Google as part of the polymer project is also
8 * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9 */
10 // @version 0.7.22
11 !function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents-lite.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,o=e.split("=");o[0]&&(t=o[0].match(/wc-(.+)/))&&(n[t[1]]=o[1]||!0)}),t)for(var o,r=0;o=t.attributes[r];r++)"src"!==o.name&&(n[o.name]=o.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),function(e){"use strict";function t(e){return void 0!==h[e]}function n(){s.call(this),this._isInvalid=!0}function o(e){return""==e&&n.call(this),e.toLowerCase()}function r(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){g.push(e)}var d=a||"scheme start",l=0,u="",w=!1,_=!1,g=[];e:for(;(e[l-1]!=p||0==l)&&!this._isInvalid;){var b=e[l];switch(d){case"scheme start":if(!b||!m.test(b)){if(a){c("Invalid scheme.");break e}u="",d="no scheme";continue}u+=b.toLowerCase(),d="scheme";break;case"scheme":if(b&&v.test(b))u+=b.toLowerCase();else{if(":"!=b){if(a){if(p==b)break e;c("Code point not allowed in scheme: "+b);break e}u="",l=0,d="no scheme";continue}if(this._scheme=u,u="",a)break e;t(this._scheme)&&(this._isRelative=!0),d="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==b?(this._query="?",d="query"):"#"==b?(this._fragment="#",d="fragment"):p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._schemeData+=r(b));break;case"no scheme":if(s&&t(s._scheme)){d="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=b||"/"!=e[l+1]){c("Expected /, got: "+b),d="relative";continue}d="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),p==b){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==b||"\\"==b)"\\"==b&&c("\\ is an invalid code point."),d="relative slash";else if("?"==b)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,d="query";else{if("#"!=b){var y=e[l+1],E=e[l+2];("file"!=this._scheme||!m.test(b)||":"!=y&&"|"!=y||p!=E&&"/"!=E&&"\\"!=E&&"?"!=E&&"#"!=E)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),d="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,d="fragment"}break;case"relative slash":if("/"!=b&&"\\"!=b){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),d="relative path";continue}"\\"==b&&c("\\ is an invalid code point."),d="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=b){c("Expected '/', got: "+b),d="authority ignore slashes";continue}d="authority second slash";break;case"authority second slash":if(d="authority ignore slashes","/"!=b){c("Expected '/', got: "+b);continue}break;case"authority ignore slashes":if("/"!=b&&"\\"!=b){d="authority";continue}c("Expected authority, got: "+b);break;case"authority":if("@"==b){w&&(c("@ already seen."),u+="%40"),w=!0;for(var L=0;L<u.length;L++){var N=u[L];if(" "!=N&&"\n"!=N&&"\r"!=N)if(":"!=N||null!==this._password){var M=r(N);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}u=""}else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){l-=u.length,u="",d="host";continue}u+=b}break;case"file host":if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){2!=u.length||!m.test(u[0])||":"!=u[1]&&"|"!=u[1]?0==u.length?d="relative path start":(this._host=o.call(this,u),u="",d="relative path start"):d="relative path";continue}" "==b||"\n"==b||"\r"==b?c("Invalid whitespace in file host."):u+=b;break;case"host":case"hostname":if(":"!=b||_){if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b){if(this._host=o.call(this,u),u="",d="relative path start",a)break e;continue}" "!=b&&"\n"!=b&&"\r"!=b?("["==b?_=!0:"]"==b&&(_=!1),u+=b):c("Invalid code point in host/hostname: "+b)}else if(this._host=o.call(this,u),u="",d="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(b))u+=b;else{if(p==b||"/"==b||"\\"==b||"?"==b||"#"==b||a){if(""!=u){var T=parseInt(u,10);T!=h[this._scheme]&&(this._port=T+""),u=""}if(a)break e;d="relative path start";continue}" "==b||"\n"==b||"\r"==b?c("Invalid code point in port: "+b):n.call(this)}break;case"relative path start":if("\\"==b&&c("'\\' not allowed in path."),d="relative path","/"!=b&&"\\"!=b)continue;break;case"relative path":if(p!=b&&"/"!=b&&"\\"!=b&&(a||"?"!=b&&"#"!=b))" "!=b&&"\n"!=b&&"\r"!=b&&(u+=r(b));else{"\\"==b&&c("\\ not allowed in relative path.");var O;(O=f[u.toLowerCase()])&&(u=O),".."==u?(this._path.pop(),"/"!=b&&"\\"!=b&&this._path.push("")):"."==u&&"/"!=b&&"\\"!=b?this._path.push(""):"."!=u&&("file"==this._scheme&&0==this._path.length&&2==u.length&&m.test(u[0])&&"|"==u[1]&&(u=u[0]+":"),this._path.push(u)),u="","?"==b?(this._query="?",d="query"):"#"==b&&(this._fragment="#",d="fragment")}break;case"query":a||"#"!=b?p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._query+=i(b)):(this._fragment="#",d="fragment");break;case"fragment":p!=b&&" "!=b&&"\n"!=b&&"\r"!=b&&(this._fragment+=b)}l++}}function s(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var d=!1;if(!e.forceJURL)try{var l=new URL("b","http://a");l.pathname="c%20d",d="http://a/c%20d"===l.href}catch(u){}if(!d){var h=Object.create(null);h.ftp=21,h.file=0,h.gopher=70,h.http=80,h.https=443,h.ws=80,h.wss=443;var f=Object.create(null);f["%2e"]=".",f[".%2e"]="..",f["%2e."]="..",f["%2e%2e"]="..";var p=void 0,m=/[a-zA-Z]/,v=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var w=e.URL;w&&(c.createObjectURL=function(e){return w.createObjectURL.apply(w,arguments)},c.revokeObjectURL=function(e){w.revokeObjectURL(e)}),e.URL=c}}(self),"undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var o=t[this.name];return o&&o[0]===t?o[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),function(e){function t(e){b.push(e),g||(g=!0,m(o))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function o(){g=!1;var e=b;b=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();r(e),n.length&&(e.callback_(n,e),t=!0)}),t&&o()}function r(e){e.nodes_.forEach(function(t){var n=v.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var o=v.get(n);if(o)for(var r=0;r<o.length;r++){var i=o[r],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++y}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function d(e,t){return E=new s(e,t)}function l(e){return L?L:(L=c(E),L.oldValue=e,L)}function u(){E=L=void 0}function h(e){return e===L||e===E}function f(e,t){return e===t?e:L&&h(e)?L:null}function p(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,v=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var w=[],_=String(Math.random());window.addEventListener("message",function(e){if(e.data===_){var t=w;w=[],t.forEach(function(e){e()})}}),m=function(e){w.push(e),window.postMessage(_,"*")}}var g=!1,b=[],y=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var o=v.get(e);o||v.set(e,o=[]);for(var r,i=0;i<o.length;i++)if(o[i].observer===this){r=o[i],r.removeListeners(),r.options=t;break}r||(r=new p(this,e,t),o.push(r),this.nodes_.push(e)),r.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=v.get(e),n=0;n<t.length;n++){var o=t[n];if(o.observer===this){o.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var E,L;p.prototype={enqueue:function(e){var n=this.observer.records_,o=n.length;if(n.length>0){var r=n[o-1],i=f(r,e);if(i)return void(n[o-1]=i)}else t(this.observer);n[o]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=v.get(e);t||v.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=v.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,o=e.target,r=new d("attributes",o);r.attributeName=t,r.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(o,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?l(a):r});break;case"DOMCharacterDataModified":var o=e.target,r=d("characterData",o),a=e.prevValue;i(o,function(e){return e.characterData?e.characterDataOldValue?l(a):r:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,h=e.target;"DOMNodeInserted"===e.type?(s=[h],c=[]):(s=[],c=[h]);var f=h.previousSibling,p=h.nextSibling,r=d("childList",e.target.parentNode);r.addedNodes=s,r.removedNodes=c,r.previousSibling=f,r.nextSibling=p,i(e.relatedNode,function(e){return e.childList?r:void 0})}u()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(){function e(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case" ":return"&nbsp;"}}function t(t){return t.replace(u,e)}var n="undefined"==typeof HTMLTemplateElement;/Trident/.test(navigator.userAgent)&&!function(){var e=document.importNode;document.importNode=function(){var t=e.apply(document,arguments);if(t.nodeType===Node.DOCUMENT_FRAGMENT_NODE){var n=document.createDocumentFragment();return n.appendChild(t),n}return t}}();var o=function(){if(!n){var e=document.createElement("template"),t=document.createElement("template");t.content.appendChild(document.createElement("div")),e.content.appendChild(t);var o=e.cloneNode(!0);return 0===o.content.childNodes.length||0===o.content.firstChild.content.childNodes.length}}(),r="template",i=function(){};if(n){var a=document.implementation.createHTMLDocument("template"),s=!0,c=document.createElement("style");c.textContent=r+"{display:none;}";var d=document.head;d.insertBefore(c,d.firstElementChild),i.prototype=Object.create(HTMLElement.prototype),i.decorate=function(e){if(!e.content){e.content=a.createDocumentFragment();for(var n;n=e.firstChild;)e.content.appendChild(n);if(e.cloneNode=function(e){return i.cloneNode(this,e)},s)try{Object.defineProperty(e,"innerHTML",{get:function(){for(var e="",n=this.content.firstChild;n;n=n.nextSibling)e+=n.outerHTML||t(n.data);return e},set:function(e){for(a.body.innerHTML=e,i.bootstrap(a);this.content.firstChild;)this.content.removeChild(this.content.firstChild);for(;a.body.firstChild;)this.content.appendChild(a.body.firstChild)},configurable:!0})}catch(o){s=!1}i.bootstrap(e.content)}},i.bootstrap=function(e){for(var t,n=e.querySelectorAll(r),o=0,a=n.length;a>o&&(t=n[o]);o++)i.decorate(t)},document.addEventListener("DOMContentLoaded",function(){i.bootstrap(document)});var l=document.createElement;document.createElement=function(){"use strict";var e=l.apply(document,arguments);return"template"===e.localName&&i.decorate(e),e};var u=/[&\u00A0<>]/g}if(n||o){var h=Node.prototype.cloneNode;i.cloneNode=function(e,t){var n=h.call(e,!1);return this.decorate&&this.decorate(n),t&&(n.content.appendChild(h.call(e.content,!0)),this.fixClonedDom(n.content,e.content)),n},i.fixClonedDom=function(e,t){if(t.querySelectorAll)for(var n,o,i=t.querySelectorAll(r),a=e.querySelectorAll(r),s=0,c=a.length;c>s;s++)o=i[s],n=a[s],this.decorate&&this.decorate(o),n.parentNode.replaceChild(o.cloneNode(!0),n)};var f=document.importNode;Node.prototype.cloneNode=function(e){var t=h.call(this,e);return e&&i.fixClonedDom(t,this),t},document.importNode=function(e,t){if(e.localName===r)return i.cloneNode(e,t);var n=f.call(document,e,t);return t&&i.fixClonedDom(n,e),n},o&&(HTMLTemplateElement.prototype.cloneNode=function(e){return i.cloneNode(this,e)})}n&&(window.HTMLTemplateElement=i)}(),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var o=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(o.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var r=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||r&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||r&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||p,o(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===w}function o(e,t){if(n(t))e&&e();else{var r=function(){"complete"!==t.readyState&&t.readyState!==w||(t.removeEventListener(_,r),o(e,t))};t.addEventListener(_,r)}}function r(e){e.target.__loaded=!0}function i(e,t){function n(){c==d&&e&&e({allImports:s,loadedImports:l,errorImports:u})}function o(e){r(e),l.push(this),c++,n()}function i(e){u.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,d=s.length,l=[],u=[];if(d)for(var h,f=0;d>f&&(h=s[f]);f++)a(h)?(l.push(this),c++,n()):(h.addEventListener("load",o),h.addEventListener("error",i));else n()}function a(e){return u?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)c(t)&&d(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function d(e){var t=e["import"];t?r({target:e}):(e.addEventListener("load",r),e.addEventListener("error",r))}var l="import",u=Boolean(l in document.createElement("link")),h=Boolean(window.ShadowDOMPolyfill),f=function(e){return h?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},p=f(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return f(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(p,"_currentScript",m);var v=/Trident/.test(navigator.userAgent),w=v?"complete":"interactive",_="readystatechange";u&&(new MutationObserver(function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,o=t.length;o>n&&(e=t[n]);n++)d(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=p.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),p.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=l,e.useNative=u,e.rootDocument=p,e.whenReady=t,e.isIE=v}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},o=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=o}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,o={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,o=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,o),e},resolveUrlsInCssText:function(e,o,r){var i=this.replaceUrls(e,r,o,t);return i=this.replaceUrls(i,r,o,n)},replaceUrls:function(e,t,n,o){return e.replace(o,function(e,o,r,i){var a=r.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,o+"'"+a+"'"+i})}};e.path=o}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,o,r){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}o.call(r,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,o=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};o.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,o){if(n.load&&console.log("fetch",e,o),e)if(e.match(/^data:/)){var r=e.split(","),i=r[0],a=r[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,o,null,a)}.bind(this),0)}else{var s=function(t,n,r){this.receive(e,o,t,n,r)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,o,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,o,r){this.cache[e]=o;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,o,n,r),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=o}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,o=e.length;o>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===l}function n(e){var t=o(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function o(e){return e.textContent+r(e)}function r(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,o=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+o+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,d=e.isIE,l=e.IMPORT_LINK_TYPE,u="link[rel="+l+"]",h={documentSelectors:u,importsSelectors:[u,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,o=function(r){e.removeEventListener("load",o),e.removeEventListener("error",o),t&&t(r),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",o),e.addEventListener("error",o),d&&"style"===e.localName){var r=!1;if(-1==e.textContent.indexOf("@import"))r=!0;else if(e.sheet){r=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(r=r&&Boolean(i.styleSheet))}r&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var o=document.createElement("script");o.__importElement=t,o.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(o,function(t){o.parentNode&&o.parentNode.removeChild(o),e.currentScript=null}),this.addElementToDocument(o)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var o,r=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=r.length;a>i&&(o=r[i]);i++)if(!this.isParsed(o))return this.hasResource(o)?t(o)?this.nextToParseInDoc(o.__doc,o):o:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=h,e.IMPORT_SELECTOR=u}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function o(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function r(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var r=n.createElement("base");r.setAttribute("href",t),n.baseURI||o(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(r),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,d=e.Loader,l=e.Observer,u=e.parser,h={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){f.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);f.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,o,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=o,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:r(o,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}u.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),u.parseNext()},loadedAll:function(){u.parseNext()}},f=new d(h.loaded.bind(h),h.loadedAll.bind(h));if(h.observer=new l,!document.baseURI){var p={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",p),Object.defineProperty(c,"baseURI",p)}e.importer=h,e.importLoader=f}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,o={added:function(e){for(var o,r,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)o||(o=a.ownerDocument,r=t.isParsed(o)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&r&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&r.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&r.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=o.added.bind(o);var r=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(o)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var o=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],o=function(e){n.push(e)},r=function(){n.forEach(function(t){t(e)})};e.addModule=o,e.initializeModules=r,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void o(e,t)}),o(e,t)}function n(e,t,o){var r=e.firstElementChild;if(!r)for(r=e.firstChild;r&&r.nodeType!==Node.ELEMENT_NODE;)r=r.nextSibling;for(;r;)t(r,o)!==!0&&n(r,t,o),r=r.nextElementSibling;return null}function o(e,n){for(var o=e.shadowRoot;o;)t(o,n),o=o.olderShadowRoot}function r(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var o,r=e.querySelectorAll("link[rel="+a+"]"),s=0,c=r.length;c>s&&(o=r[s]);s++)o["import"]&&i(o["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=r,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||o(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function o(e,t){g(e,function(e){return n(e,t)?!0:void 0})}function r(e){L.push(e),E||(E=!0,setTimeout(i))}function i(){E=!1;for(var e,t=L,n=0,o=t.length;o>n&&(e=t[n]);n++)e();L=[]}function a(e){y?r(function(){s(e)}):s(e)}function s(e){
12 e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){d(e),g(e,function(e){d(e)})}function d(e){y?r(function(){l(e)}):l(e)}function l(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function u(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function h(e){if(e.shadowRoot&&!e.shadowRoot.__watched){_.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function f(e,n){if(_.dom){var o=n[0];if(o&&"childList"===o.type&&o.addedNodes&&o.addedNodes){for(var r=o.addedNodes[0];r&&r!==document&&!r.host;)r=r.parentNode;var i=r&&(r.URL||r._URL||r.host&&r.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=u(e);n.forEach(function(e){"childList"===e.type&&(N(e.addedNodes,function(e){e.localName&&t(e,a)}),N(e.removedNodes,function(e){e.localName&&c(e)}))}),_.dom&&console.groupEnd()}function p(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(f(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(f.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function v(e){e=window.wrap(e),_.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),_.dom&&console.groupEnd()}function w(e){b(e,v)}var _=e.flags,g=e.forSubtree,b=e.forDocumentTree,y=window.MutationObserver._isPolyfilled&&_["throttle-attached"];e.hasPolyfillMutations=y,e.hasThrottledAttached=y;var E=!1,L=[],N=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=h,e.upgradeDocumentTree=w,e.upgradeDocument=v,e.upgradeSubtree=o,e.upgradeAll=t,e.attached=a,e.takeRecords=p}),window.CustomElements.addModule(function(e){function t(t,o){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var r=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(r);if(i&&(r&&i.tag==t.localName||!r&&!i["extends"]))return n(t,i,o)}}function n(t,n,r){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),o(t,n),t.__upgraded__=!0,i(t),r&&e.attached(t),e.upgradeSubtree(t,r),a.upgrade&&console.groupEnd(),t}function o(e,t){Object.__proto__?e.__proto__=t.prototype:(r(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function r(e,t,n){for(var o={},r=t;r!==n&&r!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(r),s=0;i=a[s];s++)o[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(r,i)),o[i]=1);r=Object.getPrototypeOf(r)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=o}),window.CustomElements.addModule(function(e){function t(t,o){var c=o||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(r(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(d(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),l(c.__name,c),c.ctor=u(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&v(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){o.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){o.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function o(e,t,n){e=e.toLowerCase();var o=this.getAttribute(e);n.apply(this,arguments);var r=this.getAttribute(e);this.attributeChangedCallback&&r!==o&&this.attributeChangedCallback(e,o,r)}function r(e){for(var t=0;t<y.length;t++)if(e===y[t])return!0}function i(e){var t=d(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],o=0;t=e.ancestry[o];o++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var o,r=e.prototype,i=!1;r;)r==t&&(i=!0),o=Object.getPrototypeOf(r),o&&(r.__proto__=o),r=o;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return _(N(e.tag),e)}function d(e){return e?E[e.toLowerCase()]:void 0}function l(e,t){E[e]=t}function u(e){return function(){return c(e)}}function h(e,t,n){return e===L?f(t,n):M(e,t)}function f(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=d(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var o;return t?(o=f(e),o.setAttribute("is",t),o):(o=N(e),e.indexOf("-")>=0&&g(o,HTMLElement),o)}function p(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return w(e),e}}var m,v=(e.isIE,e.upgradeDocumentTree),w=e.upgradeAll,_=e.upgradeWithDefinition,g=e.implementPrototype,b=e.useNative,y=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],E={},L="http://www.w3.org/1999/xhtml",N=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||b?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},p(Node.prototype,"cloneNode"),p(document,"importNode"),document.registerElement=t,document.createElement=f,document.createElementNS=h,e.registry=E,e["instanceof"]=m,e.reservedTagList=y,e.getRegisteredDefinition=d,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,o=e.initializeModules;e.isIE;if(n){var r=function(){};e.watchShadow=r,e.upgrade=r,e.upgradeAll=r,e.upgradeDocumentTree=r,e.upgradeSubtree=r,e.takeRecords=r,e["instanceof"]=function(e,t){return e instanceof t}}else o();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents); No newline at end of file
@@ -1,14 +0,0 b''
1 /**
2 * @license
3 * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
4 * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt
5 * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt
6 * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt
7 * Code distributed by Google as part of the polymer project is also
8 * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9 */
10 // @version 0.7.22
11 !function(){window.WebComponents=window.WebComponents||{flags:{}};var e="webcomponents.js",t=document.querySelector('script[src*="'+e+'"]'),n={};if(!n.noOpts){if(location.search.slice(1).split("&").forEach(function(e){var t,r=e.split("=");r[0]&&(t=r[0].match(/wc-(.+)/))&&(n[t[1]]=r[1]||!0)}),t)for(var r,o=0;r=t.attributes[o];o++)"src"!==r.name&&(n[r.name]=r.value||!0);if(n.log&&n.log.split){var i=n.log.split(",");n.log={},i.forEach(function(e){n.log[e]=!0})}else n.log={}}n.shadow=n.shadow||n.shadowdom||n.polyfill,"native"===n.shadow?n.shadow=!1:n.shadow=n.shadow||!HTMLElement.prototype.createShadowRoot,n.register&&(window.CustomElements=window.CustomElements||{flags:{}},window.CustomElements.flags.register=n.register),WebComponents.flags=n}(),WebComponents.flags.shadow&&("undefined"==typeof WeakMap&&!function(){var e=Object.defineProperty,t=Date.now()%1e9,n=function(){this.name="__st"+(1e9*Math.random()>>>0)+(t++ +"__")};n.prototype={set:function(t,n){var r=t[this.name];return r&&r[0]===t?r[1]=n:e(t,this.name,{value:[t,n],writable:!0}),this},get:function(e){var t;return(t=e[this.name])&&t[0]===e?t[1]:void 0},"delete":function(e){var t=e[this.name];return t&&t[0]===e?(t[0]=t[1]=void 0,!0):!1},has:function(e){var t=e[this.name];return t?t[0]===e:!1}},window.WeakMap=n}(),window.ShadowDOMPolyfill={},function(e){"use strict";function t(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;if(navigator.getDeviceStorage)return!1;try{var e=new Function("return true;");return e()}catch(t){return!1}}function n(e){if(!e)throw new Error("Assertion failed")}function r(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];A(e,o,F(t,o))}return e}function o(e,t){for(var n=W(t),r=0;r<n.length;r++){var o=n[r];switch(o){case"arguments":case"caller":case"length":case"name":case"prototype":case"toString":continue}A(e,o,F(t,o))}return e}function i(e,t){for(var n=0;n<t.length;n++)if(t[n]in e)return t[n]}function a(e,t,n){U.value=n,A(e,t,U)}function s(e,t){var n=e.__proto__||Object.getPrototypeOf(e);if(q)try{W(n)}catch(r){n=n.__proto__}var o=R.get(n);if(o)return o;var i=s(n),a=E(i);return g(n,a,t),a}function c(e,t){w(e,t,!0)}function l(e,t){w(t,e,!1)}function u(e){return/^on[a-z]+$/.test(e)}function d(e){return/^[a-zA-Z_$][a-zA-Z_$0-9]*$/.test(e)}function p(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e):function(){return this.__impl4cf1e782hg__[e]}}function h(e){return k&&d(e)?new Function("v","this.__impl4cf1e782hg__."+e+" = v"):function(t){this.__impl4cf1e782hg__[e]=t}}function f(e){return k&&d(e)?new Function("return this.__impl4cf1e782hg__."+e+".apply(this.__impl4cf1e782hg__, arguments)"):function(){return this.__impl4cf1e782hg__[e].apply(this.__impl4cf1e782hg__,arguments)}}function m(e,t){try{return Object.getOwnPropertyDescriptor(e,t)}catch(n){return B}}function w(t,n,r,o){for(var i=W(t),a=0;a<i.length;a++){var s=i[a];if("polymerBlackList_"!==s&&!(s in n||t.polymerBlackList_&&t.polymerBlackList_[s])){q&&t.__lookupGetter__(s);var c,l,d=m(t,s);if("function"!=typeof d.value){var w=u(s);c=w?e.getEventHandlerGetter(s):p(s),(d.writable||d.set||V)&&(l=w?e.getEventHandlerSetter(s):h(s));var v=V||d.configurable;A(n,s,{get:c,set:l,configurable:v,enumerable:d.enumerable})}else r&&(n[s]=f(s))}}}function v(e,t,n){if(null!=e){var r=e.prototype;g(r,t,n),o(t,e)}}function g(e,t,r){var o=t.prototype;n(void 0===R.get(e)),R.set(e,t),I.set(o,e),c(e,o),r&&l(o,r),a(o,"constructor",t),t.prototype=o}function b(e,t){return R.get(t.prototype)===e}function y(e){var t=Object.getPrototypeOf(e),n=s(t),r=E(n);return g(t,r,e),r}function E(e){function t(t){e.call(this,t)}var n=Object.create(e.prototype);return n.constructor=t,t.prototype=n,t}function _(e){return e&&e.__impl4cf1e782hg__}function S(e){return!_(e)}function T(e){if(null===e)return null;n(S(e));var t=e.__wrapper8e3dd93a60__;return null!=t?t:e.__wrapper8e3dd93a60__=new(s(e,e))(e)}function M(e){return null===e?null:(n(_(e)),e.__impl4cf1e782hg__)}function O(e){return e.__impl4cf1e782hg__}function L(e,t){t.__impl4cf1e782hg__=e,e.__wrapper8e3dd93a60__=t}function N(e){return e&&_(e)?M(e):e}function C(e){return e&&!_(e)?T(e):e}function j(e,t){null!==t&&(n(S(e)),n(void 0===t||_(t)),e.__wrapper8e3dd93a60__=t)}function D(e,t,n){G.get=n,A(e.prototype,t,G)}function H(e,t){D(e,t,function(){return T(this.__impl4cf1e782hg__[t])})}function x(e,t){e.forEach(function(e){t.forEach(function(t){e.prototype[t]=function(){var e=C(this);return e[t].apply(e,arguments)}})})}var R=new WeakMap,I=new WeakMap,P=Object.create(null),k=t(),A=Object.defineProperty,W=Object.getOwnPropertyNames,F=Object.getOwnPropertyDescriptor,U={value:void 0,configurable:!0,enumerable:!1,writable:!0};W(window);var q=/Firefox/.test(navigator.userAgent),B={get:function(){},set:function(e){},configurable:!0,enumerable:!0},V=function(){var e=Object.getOwnPropertyDescriptor(Node.prototype,"nodeType");return e&&!e.get&&!e.set}(),G={get:void 0,configurable:!0,enumerable:!0};e.addForwardingProperties=c,e.assert=n,e.constructorTable=R,e.defineGetter=D,e.defineWrapGetter=H,e.forwardMethodsToWrapper=x,e.isIdentifierName=d,e.isWrapper=_,e.isWrapperFor=b,e.mixin=r,e.nativePrototypeTable=I,e.oneOf=i,e.registerObject=y,e.registerWrapper=v,e.rewrap=j,e.setWrapper=L,e.unsafeUnwrap=O,e.unwrap=M,e.unwrapIfNeeded=N,e.wrap=T,e.wrapIfNeeded=C,e.wrappers=P}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t,n){return{index:e,removed:t,addedCount:n}}function n(){}var r=0,o=1,i=2,a=3;n.prototype={calcEditDistances:function(e,t,n,r,o,i){for(var a=i-o+1,s=n-t+1,c=new Array(a),l=0;a>l;l++)c[l]=new Array(s),c[l][0]=l;for(var u=0;s>u;u++)c[0][u]=u;for(var l=1;a>l;l++)for(var u=1;s>u;u++)if(this.equals(e[t+u-1],r[o+l-1]))c[l][u]=c[l-1][u-1];else{var d=c[l-1][u]+1,p=c[l][u-1]+1;c[l][u]=p>d?d:p}return c},spliceOperationsFromEditDistances:function(e){for(var t=e.length-1,n=e[0].length-1,s=e[t][n],c=[];t>0||n>0;)if(0!=t)if(0!=n){var l,u=e[t-1][n-1],d=e[t-1][n],p=e[t][n-1];l=p>d?u>d?d:u:u>p?p:u,l==u?(u==s?c.push(r):(c.push(o),s=u),t--,n--):l==d?(c.push(a),t--,s=d):(c.push(i),n--,s=p)}else c.push(a),t--;else c.push(i),n--;return c.reverse(),c},calcSplices:function(e,n,s,c,l,u){var d=0,p=0,h=Math.min(s-n,u-l);if(0==n&&0==l&&(d=this.sharedPrefix(e,c,h)),s==e.length&&u==c.length&&(p=this.sharedSuffix(e,c,h-d)),n+=d,l+=d,s-=p,u-=p,s-n==0&&u-l==0)return[];if(n==s){for(var f=t(n,[],0);u>l;)f.removed.push(c[l++]);return[f]}if(l==u)return[t(n,[],s-n)];for(var m=this.spliceOperationsFromEditDistances(this.calcEditDistances(e,n,s,c,l,u)),f=void 0,w=[],v=n,g=l,b=0;b<m.length;b++)switch(m[b]){case r:f&&(w.push(f),f=void 0),v++,g++;break;case o:f||(f=t(v,[],0)),f.addedCount++,v++,f.removed.push(c[g]),g++;break;case i:f||(f=t(v,[],0)),f.addedCount++,v++;break;case a:f||(f=t(v,[],0)),f.removed.push(c[g]),g++}return f&&w.push(f),w},sharedPrefix:function(e,t,n){for(var r=0;n>r;r++)if(!this.equals(e[r],t[r]))return r;return n},sharedSuffix:function(e,t,n){for(var r=e.length,o=t.length,i=0;n>i&&this.equals(e[--r],t[--o]);)i++;return i},calculateSplices:function(e,t){return this.calcSplices(e,0,e.length,t,0,t.length)},equals:function(e,t){return e===t}},e.ArraySplice=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(){a=!1;var e=i.slice(0);i=[];for(var t=0;t<e.length;t++)(0,e[t])()}function n(e){i.push(e),a||(a=!0,r(t,0))}var r,o=window.MutationObserver,i=[],a=!1;if(o){var s=1,c=new o(t),l=document.createTextNode(s);c.observe(l,{characterData:!0}),r=function(){s=(s+1)%2,l.data=s}}else r=window.setTimeout;e.setEndOfMicrotask=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.scheduled_||(e.scheduled_=!0,f.push(e),m||(u(n),m=!0))}function n(){for(m=!1;f.length;){var e=f;f=[],e.sort(function(e,t){return e.uid_-t.uid_});for(var t=0;t<e.length;t++){var n=e[t];n.scheduled_=!1;var r=n.takeRecords();i(n),r.length&&n.callback_(r,n)}}}function r(e,t){this.type=e,this.target=t,this.addedNodes=new p.NodeList,this.removedNodes=new p.NodeList,this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function o(e,t){for(;e;e=e.parentNode){var n=h.get(e);if(n)for(var r=0;r<n.length;r++){var o=n[r];o.options.subtree&&o.addTransientObserver(t)}}}function i(e){for(var t=0;t<e.nodes_.length;t++){var n=e.nodes_[t],r=h.get(n);if(!r)return;for(var o=0;o<r.length;o++){var i=r[o];i.observer===e&&i.removeTransientObservers()}}}function a(e,n,o){for(var i=Object.create(null),a=Object.create(null),s=e;s;s=s.parentNode){var c=h.get(s);if(c)for(var l=0;l<c.length;l++){var u=c[l],d=u.options;if((s===e||d.subtree)&&("attributes"!==n||d.attributes)&&("attributes"!==n||!d.attributeFilter||null===o.namespace&&-1!==d.attributeFilter.indexOf(o.name))&&("characterData"!==n||d.characterData)&&("childList"!==n||d.childList)){var p=u.observer;i[p.uid_]=p,("attributes"===n&&d.attributeOldValue||"characterData"===n&&d.characterDataOldValue)&&(a[p.uid_]=o.oldValue)}}}for(var f in i){var p=i[f],m=new r(n,e);"name"in o&&"namespace"in o&&(m.attributeName=o.name,m.attributeNamespace=o.namespace),o.addedNodes&&(m.addedNodes=o.addedNodes),o.removedNodes&&(m.removedNodes=o.removedNodes),o.previousSibling&&(m.previousSibling=o.previousSibling),o.nextSibling&&(m.nextSibling=o.nextSibling),void 0!==a[f]&&(m.oldValue=a[f]),t(p),p.records_.push(m)}}function s(e){if(this.childList=!!e.childList,this.subtree=!!e.subtree,"attributes"in e||!("attributeOldValue"in e||"attributeFilter"in e)?this.attributes=!!e.attributes:this.attributes=!0,"characterDataOldValue"in e&&!("characterData"in e)?this.characterData=!0:this.characterData=!!e.characterData,!this.attributes&&(e.attributeOldValue||"attributeFilter"in e)||!this.characterData&&e.characterDataOldValue)throw new TypeError;if(this.characterData=!!e.characterData,this.attributeOldValue=!!e.attributeOldValue,this.characterDataOldValue=!!e.characterDataOldValue,"attributeFilter"in e){if(null==e.attributeFilter||"object"!=typeof e.attributeFilter)throw new TypeError;this.attributeFilter=w.call(e.attributeFilter)}else this.attributeFilter=null}function c(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++v,this.scheduled_=!1}function l(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}var u=e.setEndOfMicrotask,d=e.wrapIfNeeded,p=e.wrappers,h=new WeakMap,f=[],m=!1,w=Array.prototype.slice,v=0;c.prototype={constructor:c,observe:function(e,t){e=d(e);var n,r=new s(t),o=h.get(e);o||h.set(e,o=[]);for(var i=0;i<o.length;i++)o[i].observer===this&&(n=o[i],n.removeTransientObservers(),n.options=r);n||(n=new l(this,e,r),o.push(n),this.nodes_.push(e))},disconnect:function(){this.nodes_.forEach(function(e){for(var t=h.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}},l.prototype={addTransientObserver:function(e){if(e!==this.target){t(this.observer),this.transientObservedNodes.push(e);var n=h.get(e);n||h.set(e,n=[]),n.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[];for(var t=0;t<e.length;t++)for(var n=e[t],r=h.get(n),o=0;o<r.length;o++)if(r[o]===this){r.splice(o,1);break}}},e.enqueueMutation=a,e.registerTransientObservers=o,e.wrappers.MutationObserver=c,e.wrappers.MutationRecord=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){this.root=e,this.parent=t}function n(e,t){if(e.treeScope_!==t){e.treeScope_=t;for(var r=e.shadowRoot;r;r=r.olderShadowRoot)r.treeScope_.parent=t;for(var o=e.firstChild;o;o=o.nextSibling)n(o,t)}}function r(n){if(n instanceof e.wrappers.Window,n.treeScope_)return n.treeScope_;var o,i=n.parentNode;return o=i?r(i):new t(n,null),n.treeScope_=o}t.prototype={get renderer(){return this.root instanceof e.wrappers.ShadowRoot?e.getRendererForHost(this.root.host):null},contains:function(e){for(;e;e=e.parent)if(e===this)return!0;return!1}},e.TreeScope=t,e.getTreeScope=r,e.setTreeScope=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e instanceof G.ShadowRoot}function n(e){return A(e).root}function r(e,r){var s=[],c=e;for(s.push(c);c;){var l=a(c);if(l&&l.length>0){for(var u=0;u<l.length;u++){var p=l[u];if(i(p)){var h=n(p),f=h.olderShadowRoot;f&&s.push(f)}s.push(p)}c=l[l.length-1]}else if(t(c)){if(d(e,c)&&o(r))break;c=c.host,s.push(c)}else c=c.parentNode,c&&s.push(c)}return s}function o(e){if(!e)return!1;switch(e.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function i(e){return e instanceof HTMLShadowElement}function a(t){return e.getDestinationInsertionPoints(t)}function s(e,t){if(0===e.length)return t;t instanceof G.Window&&(t=t.document);for(var n=A(t),r=e[0],o=A(r),i=l(n,o),a=0;a<e.length;a++){var s=e[a];if(A(s)===i)return s}return e[e.length-1]}function c(e){for(var t=[];e;e=e.parent)t.push(e);return t}function l(e,t){for(var n=c(e),r=c(t),o=null;n.length>0&&r.length>0;){var i=n.pop(),a=r.pop();if(i!==a)break;o=i}return o}function u(e,t,n){t instanceof G.Window&&(t=t.document);var o,i=A(t),a=A(n),s=r(n,e),o=l(i,a);o||(o=a.root);for(var c=o;c;c=c.parent)for(var u=0;u<s.length;u++){var d=s[u];if(A(d)===c)return d}return null}function d(e,t){return A(e)===A(t)}function p(e){if(!K.get(e)&&(K.set(e,!0),f(V(e),V(e.target)),P)){var t=P;throw P=null,t}}function h(e){switch(e.type){case"load":case"beforeunload":case"unload":return!0}return!1}function f(t,n){if($.get(t))throw new Error("InvalidStateError");$.set(t,!0),e.renderAllPending();var o,i,a;if(h(t)&&!t.bubbles){var s=n;s instanceof G.Document&&(a=s.defaultView)&&(i=s,o=[])}if(!o)if(n instanceof G.Window)a=n,o=[];else if(o=r(n,t),!h(t)){var s=o[o.length-1];s instanceof G.Document&&(a=s.defaultView)}return ne.set(t,o),m(t,o,a,i)&&w(t,o,a,i)&&v(t,o,a,i),J.set(t,re),Y["delete"](t,null),$["delete"](t),t.defaultPrevented}function m(e,t,n,r){var o=oe;if(n&&!g(n,e,o,t,r))return!1;for(var i=t.length-1;i>0;i--)if(!g(t[i],e,o,t,r))return!1;return!0}function w(e,t,n,r){var o=ie,i=t[0]||n;return g(i,e,o,t,r)}function v(e,t,n,r){for(var o=ae,i=1;i<t.length;i++)if(!g(t[i],e,o,t,r))return;n&&t.length>0&&g(n,e,o,t,r)}function g(e,t,n,r,o){var i=z.get(e);if(!i)return!0;var a=o||s(r,e);if(a===e){if(n===oe)return!0;n===ae&&(n=ie)}else if(n===ae&&!t.bubbles)return!0;if("relatedTarget"in t){var c=B(t),l=c.relatedTarget;if(l){if(l instanceof Object&&l.addEventListener){var d=V(l),p=u(t,e,d);if(p===a)return!0}else p=null;Z.set(t,p)}}J.set(t,n);var h=t.type,f=!1;X.set(t,a),Y.set(t,e),i.depth++;for(var m=0,w=i.length;w>m;m++){var v=i[m];if(v.removed)f=!0;else if(!(v.type!==h||!v.capture&&n===oe||v.capture&&n===ae))try{if("function"==typeof v.handler?v.handler.call(e,t):v.handler.handleEvent(t),ee.get(t))return!1}catch(g){P||(P=g)}}if(i.depth--,f&&0===i.depth){var b=i.slice();i.length=0;for(var m=0;m<b.length;m++)b[m].removed||i.push(b[m])}return!Q.get(t)}function b(e,t,n){this.type=e,this.handler=t,this.capture=Boolean(n)}function y(e,t){if(!(e instanceof se))return V(T(se,"Event",e,t));var n=e;return be||"beforeunload"!==n.type||this instanceof M?void U(n,this):new M(n)}function E(e){return e&&e.relatedTarget?Object.create(e,{relatedTarget:{value:B(e.relatedTarget)}}):e}function _(e,t,n){var r=window[e],o=function(t,n){return t instanceof r?void U(t,this):V(T(r,e,t,n))};if(o.prototype=Object.create(t.prototype),n&&W(o.prototype,n),r)try{F(r,o,new r("temp"))}catch(i){F(r,o,document.createEvent(e))}return o}function S(e,t){return function(){arguments[t]=B(arguments[t]);var n=B(this);n[e].apply(n,arguments)}}function T(e,t,n,r){if(ve)return new e(n,E(r));var o=B(document.createEvent(t)),i=we[t],a=[n];return Object.keys(i).forEach(function(e){var t=null!=r&&e in r?r[e]:i[e];"relatedTarget"===e&&(t=B(t)),a.push(t)}),o["init"+t].apply(o,a),o}function M(e){y.call(this,e)}function O(e){return"function"==typeof e?!0:e&&e.handleEvent}function L(e){switch(e){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function N(e){U(e,this)}function C(e){return e instanceof G.ShadowRoot&&(e=e.host),B(e)}function j(e,t){var n=z.get(e);if(n)for(var r=0;r<n.length;r++)if(!n[r].removed&&n[r].type===t)return!0;return!1}function D(e,t){for(var n=B(e);n;n=n.parentNode)if(j(V(n),t))return!0;return!1}function H(e){k(e,Ee)}function x(t,n,o,i){e.renderAllPending();var a=V(_e.call(q(n),o,i));if(!a)return null;var c=r(a,null),l=c.lastIndexOf(t);return-1==l?null:(c=c.slice(0,l),s(c,t))}function R(e){return function(){var t=te.get(this);return t&&t[e]&&t[e].value||null}}function I(e){var t=e.slice(2);return function(n){var r=te.get(this);r||(r=Object.create(null),te.set(this,r));var o=r[e];if(o&&this.removeEventListener(t,o.wrapped,!1),"function"==typeof n){var i=function(t){var r=n.call(this,t);r===!1?t.preventDefault():"onbeforeunload"===e&&"string"==typeof r&&(t.returnValue=r)};this.addEventListener(t,i,!1),r[e]={value:n,wrapped:i}}}}var P,k=e.forwardMethodsToWrapper,A=e.getTreeScope,W=e.mixin,F=e.registerWrapper,U=e.setWrapper,q=e.unsafeUnwrap,B=e.unwrap,V=e.wrap,G=e.wrappers,z=(new WeakMap,new WeakMap),K=new WeakMap,$=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,J=new WeakMap,Q=new WeakMap,ee=new WeakMap,te=new WeakMap,ne=new WeakMap,re=0,oe=1,ie=2,ae=3;b.prototype={equals:function(e){return this.handler===e.handler&&this.type===e.type&&this.capture===e.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var se=window.Event;se.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},y.prototype={get target(){return X.get(this)},get currentTarget(){return Y.get(this)},get eventPhase(){return J.get(this)},get path(){var e=ne.get(this);return e?e.slice():[]},stopPropagation:function(){Q.set(this,!0)},stopImmediatePropagation:function(){Q.set(this,!0),ee.set(this,!0)}};var ce=function(){var e=document.createEvent("Event");return e.initEvent("test",!0,!0),e.preventDefault(),e.defaultPrevented}();ce||(y.prototype.preventDefault=function(){this.cancelable&&(q(this).preventDefault(),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}),F(se,y,document.createEvent("Event"));var le=_("UIEvent",y),ue=_("CustomEvent",y),de={get relatedTarget(){var e=Z.get(this);return void 0!==e?e:V(B(this).relatedTarget)}},pe=W({initMouseEvent:S("initMouseEvent",14)},de),he=W({initFocusEvent:S("initFocusEvent",5)},de),fe=_("MouseEvent",le,pe),me=_("FocusEvent",le,he),we=Object.create(null),ve=function(){try{new window.FocusEvent("focus")}catch(e){return!1}return!0}();if(!ve){var ge=function(e,t,n){if(n){var r=we[n];t=W(W({},r),t)}we[e]=t};ge("Event",{bubbles:!1,cancelable:!1}),ge("CustomEvent",{detail:null},"Event"),ge("UIEvent",{view:null,detail:0},"Event"),ge("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ge("FocusEvent",{relatedTarget:null},"UIEvent")}var be=window.BeforeUnloadEvent;M.prototype=Object.create(y.prototype),W(M.prototype,{get returnValue(){return q(this).returnValue},set returnValue(e){q(this).returnValue=e}}),be&&F(be,M);var ye=window.EventTarget,Ee=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(e){var t=e.prototype;Ee.forEach(function(e){Object.defineProperty(t,e+"_",{value:t[e]})})}),N.prototype={addEventListener:function(e,t,n){if(O(t)&&!L(e)){var r=new b(e,t,n),o=z.get(this);if(o){for(var i=0;i<o.length;i++)if(r.equals(o[i]))return}else o=[],o.depth=0,z.set(this,o);o.push(r);var a=C(this);a.addEventListener_(e,p,!0)}},removeEventListener:function(e,t,n){n=Boolean(n);var r=z.get(this);if(r){for(var o=0,i=!1,a=0;a<r.length;a++)r[a].type===e&&r[a].capture===n&&(o++,r[a].handler===t&&(i=!0,r[a].remove()));if(i&&1===o){var s=C(this);s.removeEventListener_(e,p,!0)}}},dispatchEvent:function(t){var n=B(t),r=n.type;K.set(n,!1),e.renderAllPending();var o;D(this,r)||(o=function(){},this.addEventListener(r,o,!0));try{return B(this).dispatchEvent_(n)}finally{o&&this.removeEventListener(r,o,!0)}}},ye&&F(ye,N);var _e=document.elementFromPoint;e.elementFromPoint=x,e.getEventHandlerGetter=R,e.getEventHandlerSetter=I,e.wrapEventTargetMethods=H,e.wrappers.BeforeUnloadEvent=M,e.wrappers.CustomEvent=ue,e.wrappers.Event=y,e.wrappers.EventTarget=N,e.wrappers.FocusEvent=me,e.wrappers.MouseEvent=fe,e.wrappers.UIEvent=le}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,m)}function n(e){l(e,this)}function r(){this.length=0,t(this,"length")}function o(e){for(var t=new r,o=0;o<e.length;o++)t[o]=new n(e[o]);return t.length=o,t}function i(e){a.call(this,e)}var a=e.wrappers.UIEvent,s=e.mixin,c=e.registerWrapper,l=e.setWrapper,u=e.unsafeUnwrap,d=e.wrap,p=window.TouchEvent;if(p){var h;try{h=document.createEvent("TouchEvent")}catch(f){return}var m={enumerable:!1};n.prototype={get target(){return d(u(this).target)}};var w={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(e){w.get=function(){return u(this)[e]},Object.defineProperty(n.prototype,e,w)}),r.prototype={item:function(e){return this[e]}},i.prototype=Object.create(a.prototype),s(i.prototype,{get touches(){return o(u(this).touches)},get targetTouches(){return o(u(this).targetTouches)},get changedTouches(){return o(u(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),c(p,i,h),e.wrappers.Touch=n,e.wrappers.TouchEvent=i,e.wrappers.TouchList=r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e,t){Object.defineProperty(e,t,s)}function n(){this.length=0,t(this,"length")}function r(e){if(null==e)return e;for(var t=new n,r=0,o=e.length;o>r;r++)t[r]=a(e[r]);return t.length=o,t}function o(e,t){e.prototype[t]=function(){return r(i(this)[t].apply(i(this),arguments))}}var i=e.unsafeUnwrap,a=e.wrap,s={enumerable:!1};n.prototype={item:function(e){return this[e]}},t(n.prototype,"item"),e.wrappers.NodeList=n,e.addWrapNodeListMethod=o,e.wrapNodeList=r}(window.ShadowDOMPolyfill),function(e){"use strict";e.wrapHTMLCollection=e.wrapNodeList,e.wrappers.HTMLCollection=e.wrappers.NodeList}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){O(e instanceof _)}function n(e){var t=new T;return t[0]=e,t.length=1,t}function r(e,t,n){N(t,"childList",{removedNodes:n,previousSibling:e.previousSibling,nextSibling:e.nextSibling})}function o(e,t){N(e,"childList",{removedNodes:t})}function i(e,t,r,o){if(e instanceof DocumentFragment){var i=s(e);U=!0;for(var a=i.length-1;a>=0;a--)e.removeChild(i[a]),i[a].parentNode_=t;U=!1;for(var a=0;a<i.length;a++)i[a].previousSibling_=i[a-1]||r,i[a].nextSibling_=i[a+1]||o;return r&&(r.nextSibling_=i[0]),o&&(o.previousSibling_=i[i.length-1]),i}var i=n(e),c=e.parentNode;return c&&c.removeChild(e),e.parentNode_=t,e.previousSibling_=r,e.nextSibling_=o,r&&(r.nextSibling_=e),o&&(o.previousSibling_=e),i}function a(e){if(e instanceof DocumentFragment)return s(e);var t=n(e),o=e.parentNode;return o&&r(e,o,t),t}function s(e){for(var t=new T,n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t.length=n,o(e,t),t}function c(e){return e}function l(e,t){R(e,t),e.nodeIsInserted_()}function u(e,t){for(var n=C(t),r=0;r<e.length;r++)l(e[r],n)}function d(e){R(e,new M(e,null))}function p(e){for(var t=0;t<e.length;t++)d(e[t])}function h(e,t){var n=e.nodeType===_.DOCUMENT_NODE?e:e.ownerDocument;n!==t.ownerDocument&&n.adoptNode(t)}function f(t,n){if(n.length){var r=t.ownerDocument;if(r!==n[0].ownerDocument)for(var o=0;o<n.length;o++)e.adoptNodeNoRemove(n[o],r)}}function m(e,t){f(e,t);var n=t.length;if(1===n)return P(t[0]);for(var r=P(e.ownerDocument.createDocumentFragment()),o=0;n>o;o++)r.appendChild(P(t[o]));return r}function w(e){if(void 0!==e.firstChild_)for(var t=e.firstChild_;t;){var n=t;t=t.nextSibling_,n.parentNode_=n.previousSibling_=n.nextSibling_=void 0}e.firstChild_=e.lastChild_=void 0}function v(e){if(e.invalidateShadowRenderer()){for(var t=e.firstChild;t;){O(t.parentNode===e);var n=t.nextSibling,r=P(t),o=r.parentNode;o&&X.call(o,r),t.previousSibling_=t.nextSibling_=t.parentNode_=null,t=n}e.firstChild_=e.lastChild_=null}else for(var n,i=P(e),a=i.firstChild;a;)n=a.nextSibling,X.call(i,a),a=n}function g(e){var t=e.parentNode;return t&&t.invalidateShadowRenderer()}function b(e){for(var t,n=0;n<e.length;n++)t=e[n],t.parentNode.removeChild(t)}function y(e,t,n){var r;if(r=A(n?q.call(n,I(e),!1):B.call(I(e),!1)),t){for(var o=e.firstChild;o;o=o.nextSibling)r.appendChild(y(o,!0,n));if(e instanceof F.HTMLTemplateElement)for(var i=r.content,o=e.content.firstChild;o;o=o.nextSibling)i.appendChild(y(o,!0,n))}return r}function E(e,t){if(!t||C(e)!==C(t))return!1;for(var n=t;n;n=n.parentNode)if(n===e)return!0;return!1}function _(e){O(e instanceof V),S.call(this,e),this.parentNode_=void 0,this.firstChild_=void 0,this.lastChild_=void 0,this.nextSibling_=void 0,this.previousSibling_=void 0,this.treeScope_=void 0}var S=e.wrappers.EventTarget,T=e.wrappers.NodeList,M=e.TreeScope,O=e.assert,L=e.defineWrapGetter,N=e.enqueueMutation,C=e.getTreeScope,j=e.isWrapper,D=e.mixin,H=e.registerTransientObservers,x=e.registerWrapper,R=e.setTreeScope,I=e.unsafeUnwrap,P=e.unwrap,k=e.unwrapIfNeeded,A=e.wrap,W=e.wrapIfNeeded,F=e.wrappers,U=!1,q=document.importNode,B=window.Node.prototype.cloneNode,V=window.Node,G=window.DocumentFragment,z=(V.prototype.appendChild,V.prototype.compareDocumentPosition),K=V.prototype.isEqualNode,$=V.prototype.insertBefore,X=V.prototype.removeChild,Y=V.prototype.replaceChild,Z=/Trident|Edge/.test(navigator.userAgent),J=Z?function(e,t){try{X.call(e,t)}catch(n){if(!(e instanceof G))throw n}}:function(e,t){X.call(e,t)};_.prototype=Object.create(S.prototype),D(_.prototype,{appendChild:function(e){return this.insertBefore(e,null)},insertBefore:function(e,n){t(e);var r;n?j(n)?r=P(n):(r=n,n=A(r)):(n=null,r=null),n&&O(n.parentNode===this);var o,s=n?n.previousSibling:this.lastChild,c=!this.invalidateShadowRenderer()&&!g(e);if(o=c?a(e):i(e,this,s,n),c)h(this,e),w(this),$.call(I(this),P(e),r);else{s||(this.firstChild_=o[0]),n||(this.lastChild_=o[o.length-1],void 0===this.firstChild_&&(this.firstChild_=this.firstChild));var l=r?r.parentNode:I(this);l?$.call(l,m(this,o),r):f(this,o)}return N(this,"childList",{addedNodes:o,nextSibling:n,previousSibling:s}),u(o,this),e},removeChild:function(e){if(t(e),e.parentNode!==this){for(var r=!1,o=(this.childNodes,this.firstChild);o;o=o.nextSibling)if(o===e){r=!0;break}if(!r)throw new Error("NotFoundError")}var i=P(e),a=e.nextSibling,s=e.previousSibling;if(this.invalidateShadowRenderer()){var c=this.firstChild,l=this.lastChild,u=i.parentNode;u&&J(u,i),c===e&&(this.firstChild_=a),l===e&&(this.lastChild_=s),s&&(s.nextSibling_=a),a&&(a.previousSibling_=s),e.previousSibling_=e.nextSibling_=e.parentNode_=void 0}else w(this),J(I(this),i);return U||N(this,"childList",{removedNodes:n(e),nextSibling:a,previousSibling:s}),H(this,e),e},replaceChild:function(e,r){t(e);var o;if(j(r)?o=P(r):(o=r,r=A(o)),r.parentNode!==this)throw new Error("NotFoundError");var s,c=r.nextSibling,l=r.previousSibling,p=!this.invalidateShadowRenderer()&&!g(e);return p?s=a(e):(c===e&&(c=e.nextSibling),s=i(e,this,l,c)),p?(h(this,e),w(this),Y.call(I(this),P(e),o)):(this.firstChild===r&&(this.firstChild_=s[0]),this.lastChild===r&&(this.lastChild_=s[s.length-1]),r.previousSibling_=r.nextSibling_=r.parentNode_=void 0,o.parentNode&&Y.call(o.parentNode,m(this,s),o)),N(this,"childList",{addedNodes:s,removedNodes:n(r),nextSibling:c,previousSibling:l}),d(r),u(s,this),r},nodeIsInserted_:function(){for(var e=this.firstChild;e;e=e.nextSibling)e.nodeIsInserted_()},hasChildNodes:function(){return null!==this.firstChild},get parentNode(){return void 0!==this.parentNode_?this.parentNode_:A(I(this).parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:A(I(this).firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:A(I(this).lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:A(I(this).nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:A(I(this).previousSibling)},get parentElement(){for(var e=this.parentNode;e&&e.nodeType!==_.ELEMENT_NODE;)e=e.parentNode;return e},get textContent(){for(var e="",t=this.firstChild;t;t=t.nextSibling)t.nodeType!=_.COMMENT_NODE&&(e+=t.textContent);return e},set textContent(e){null==e&&(e="");var t=c(this.childNodes);if(this.invalidateShadowRenderer()){if(v(this),""!==e){var n=I(this).ownerDocument.createTextNode(e);this.appendChild(n)}}else w(this),I(this).textContent=e;var r=c(this.childNodes);N(this,"childList",{addedNodes:r,removedNodes:t}),p(t),u(r,this)},get childNodes(){for(var e=new T,t=0,n=this.firstChild;n;n=n.nextSibling)e[t++]=n;return e.length=t,e},cloneNode:function(e){return y(this,e)},contains:function(e){return E(this,W(e))},compareDocumentPosition:function(e){return z.call(I(this),k(e))},isEqualNode:function(e){return K.call(I(this),k(e))},normalize:function(){for(var e,t,n=c(this.childNodes),r=[],o="",i=0;i<n.length;i++)t=n[i],t.nodeType===_.TEXT_NODE?e||t.data.length?e?(o+=t.data,r.push(t)):e=t:this.removeChild(t):(e&&r.length&&(e.data+=o,b(r)),r=[],o="",e=null,t.childNodes.length&&t.normalize());e&&r.length&&(e.data+=o,b(r))}}),L(_,"ownerDocument"),x(V,_,document.createDocumentFragment()),delete _.prototype.querySelector,delete _.prototype.querySelectorAll,_.prototype=D(Object.create(S.prototype),_.prototype),e.cloneNode=y,e.nodeWasAdded=l,e.nodeWasRemoved=d,e.nodesWereAdded=u,e.nodesWereRemoved=p,e.originalInsertBefore=$,e.originalRemoveChild=X,e.snapshotNodeList=c,e.wrappers.Node=_}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n,r,o){for(var i=null,a=null,s=0,c=t.length;c>s;s++)i=b(t[s]),!o&&(a=v(i).root)&&a instanceof e.wrappers.ShadowRoot||(r[n++]=i);return n}function n(e){return String(e).replace(/\/deep\/|::shadow|>>>/g," ")}function r(e){return String(e).replace(/:host\(([^\s]+)\)/g,"$1").replace(/([^\s]):host/g,"$1").replace(":host","*").replace(/\^|\/shadow\/|\/shadow-deep\/|::shadow|\/deep\/|::content|>>>/g," ")}function o(e,t){for(var n,r=e.firstElementChild;r;){if(r.matches(t))return r;if(n=o(r,t))return n;r=r.nextElementSibling}return null}function i(e,t){return e.matches(t)}function a(e,t,n){var r=e.localName;return r===t||r===n&&e.namespaceURI===j}function s(){return!0}function c(e,t,n){return e.localName===n}function l(e,t){return e.namespaceURI===t}function u(e,t,n){return e.namespaceURI===t&&e.localName===n}function d(e,t,n,r,o,i){for(var a=e.firstElementChild;a;)r(a,o,i)&&(n[t++]=a),t=d(a,t,n,r,o,i),a=a.nextElementSibling;return t}function p(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,null);if(c instanceof N)s=S.call(c,i);else{if(!(c instanceof C))return d(this,r,o,n,i,null);s=_.call(c,i)}return t(s,r,o,a)}function h(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=M.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=T.call(c,i,a)}return t(s,r,o,!1)}function f(n,r,o,i,a){var s,c=g(this),l=v(this).root;if(l instanceof e.wrappers.ShadowRoot)return d(this,r,o,n,i,a);if(c instanceof N)s=L.call(c,i,a);else{if(!(c instanceof C))return d(this,r,o,n,i,a);s=O.call(c,i,a)}return t(s,r,o,!1)}var m=e.wrappers.HTMLCollection,w=e.wrappers.NodeList,v=e.getTreeScope,g=e.unsafeUnwrap,b=e.wrap,y=document.querySelector,E=document.documentElement.querySelector,_=document.querySelectorAll,S=document.documentElement.querySelectorAll,T=document.getElementsByTagName,M=document.documentElement.getElementsByTagName,O=document.getElementsByTagNameNS,L=document.documentElement.getElementsByTagNameNS,N=window.Element,C=window.HTMLDocument||window.Document,j="http://www.w3.org/1999/xhtml",D={
12 querySelector:function(t){var r=n(t),i=r!==t;t=r;var a,s=g(this),c=v(this).root;if(c instanceof e.wrappers.ShadowRoot)return o(this,t);if(s instanceof N)a=b(E.call(s,t));else{if(!(s instanceof C))return o(this,t);a=b(y.call(s,t))}return a&&!i&&(c=v(a).root)&&c instanceof e.wrappers.ShadowRoot?o(this,t):a},querySelectorAll:function(e){var t=n(e),r=t!==e;e=t;var o=new w;return o.length=p.call(this,i,0,o,e,r),o}},H={matches:function(t){return t=r(t),e.originalMatches.call(g(this),t)}},x={getElementsByTagName:function(e){var t=new m,n="*"===e?s:a;return t.length=h.call(this,n,0,t,e,e.toLowerCase()),t},getElementsByClassName:function(e){return this.querySelectorAll("."+e)},getElementsByTagNameNS:function(e,t){var n=new m,r=null;return r="*"===e?"*"===t?s:c:"*"===t?l:u,n.length=f.call(this,r,0,n,e||null,t),n}};e.GetElementsByInterface=x,e.SelectorsInterface=D,e.MatchesInterface=H}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;return e}function n(e){for(;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.previousSibling;return e}var r=e.wrappers.NodeList,o={get firstElementChild(){return t(this.firstChild)},get lastElementChild(){return n(this.lastChild)},get childElementCount(){for(var e=0,t=this.firstElementChild;t;t=t.nextElementSibling)e++;return e},get children(){for(var e=new r,t=0,n=this.firstElementChild;n;n=n.nextElementSibling)e[t++]=n;return e.length=t,e},remove:function(){var e=this.parentNode;e&&e.removeChild(this)}},i={get nextElementSibling(){return t(this.nextSibling)},get previousElementSibling(){return n(this.previousSibling)}},a={getElementById:function(e){return/[ \t\n\r\f]/.test(e)?null:this.querySelector('[id="'+e+'"]')}};e.ChildNodeInterface=i,e.NonElementParentNodeInterface=a,e.ParentNodeInterface=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}var n=e.ChildNodeInterface,r=e.wrappers.Node,o=e.enqueueMutation,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=window.CharacterData;t.prototype=Object.create(r.prototype),i(t.prototype,{get nodeValue(){return this.data},set nodeValue(e){this.data=e},get textContent(){return this.data},set textContent(e){this.data=e},get data(){return s(this).data},set data(e){var t=s(this).data;o(this,"characterData",{oldValue:t}),s(this).data=e}}),i(t.prototype,n),a(c,t,document.createTextNode("")),e.wrappers.CharacterData=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e>>>0}function n(e){r.call(this,e)}var r=e.wrappers.CharacterData,o=(e.enqueueMutation,e.mixin),i=e.registerWrapper,a=window.Text;n.prototype=Object.create(r.prototype),o(n.prototype,{splitText:function(e){e=t(e);var n=this.data;if(e>n.length)throw new Error("IndexSizeError");var r=n.slice(0,e),o=n.slice(e);this.data=r;var i=this.ownerDocument.createTextNode(o);return this.parentNode&&this.parentNode.insertBefore(i,this.nextSibling),i}}),i(a,n,document.createTextNode("")),e.wrappers.Text=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return i(e).getAttribute("class")}function n(e,t){a(e,"attributes",{name:"class",namespace:null,oldValue:t})}function r(t){e.invalidateRendererBasedOnAttribute(t,"class")}function o(e,o,i){var a=e.ownerElement_;if(null==a)return o.apply(e,i);var s=t(a),c=o.apply(e,i);return t(a)!==s&&(n(a,s),r(a)),c}if(!window.DOMTokenList)return void console.warn("Missing DOMTokenList prototype, please include a compatible classList polyfill such as http://goo.gl/uTcepH.");var i=e.unsafeUnwrap,a=e.enqueueMutation,s=DOMTokenList.prototype.add;DOMTokenList.prototype.add=function(){o(this,s,arguments)};var c=DOMTokenList.prototype.remove;DOMTokenList.prototype.remove=function(){o(this,c,arguments)};var l=DOMTokenList.prototype.toggle;DOMTokenList.prototype.toggle=function(){return o(this,l,arguments)}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t,n){var r=t.parentNode;if(r&&r.shadowRoot){var o=e.getRendererForHost(r);o.dependsOnAttribute(n)&&o.invalidate()}}function n(e,t,n){u(e,"attributes",{name:t,namespace:null,oldValue:n})}function r(e){a.call(this,e)}var o=e.ChildNodeInterface,i=e.GetElementsByInterface,a=e.wrappers.Node,s=e.ParentNodeInterface,c=e.SelectorsInterface,l=e.MatchesInterface,u=(e.addWrapNodeListMethod,e.enqueueMutation),d=e.mixin,p=(e.oneOf,e.registerWrapper),h=e.unsafeUnwrap,f=e.wrappers,m=window.Element,w=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(e){return m.prototype[e]}),v=w[0],g=m.prototype[v],b=new WeakMap;r.prototype=Object.create(a.prototype),d(r.prototype,{createShadowRoot:function(){var t=new f.ShadowRoot(this);h(this).polymerShadowRoot_=t;var n=e.getRendererForHost(this);return n.invalidate(),t},get shadowRoot(){return h(this).polymerShadowRoot_||null},setAttribute:function(e,r){var o=h(this).getAttribute(e);h(this).setAttribute(e,r),n(this,e,o),t(this,e)},removeAttribute:function(e){var r=h(this).getAttribute(e);h(this).removeAttribute(e),n(this,e,r),t(this,e)},get classList(){var e=b.get(this);if(!e){if(e=h(this).classList,!e)return;e.ownerElement_=this,b.set(this,e)}return e},get className(){return h(this).className},set className(e){this.setAttribute("class",e)},get id(){return h(this).id},set id(e){this.setAttribute("id",e)}}),w.forEach(function(e){"matches"!==e&&(r.prototype[e]=function(e){return this.matches(e)})}),m.prototype.webkitCreateShadowRoot&&(r.prototype.webkitCreateShadowRoot=r.prototype.createShadowRoot),d(r.prototype,o),d(r.prototype,i),d(r.prototype,s),d(r.prototype,c),d(r.prototype,l),p(m,r,document.createElementNS(null,"x")),e.invalidateRendererBasedOnAttribute=t,e.matchesNames=w,e.originalMatches=g,e.wrappers.Element=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e){case"&":return"&amp;";case"<":return"&lt;";case">":return"&gt;";case'"':return"&quot;";case" ":return"&nbsp;"}}function n(e){return e.replace(L,t)}function r(e){return e.replace(N,t)}function o(e){for(var t={},n=0;n<e.length;n++)t[e[n]]=!0;return t}function i(e){if(e.namespaceURI!==D)return!0;var t=e.ownerDocument.doctype;return t&&t.publicId&&t.systemId}function a(e,t){switch(e.nodeType){case Node.ELEMENT_NODE:for(var o,a=e.tagName.toLowerCase(),c="<"+a,l=e.attributes,u=0;o=l[u];u++)c+=" "+o.name+'="'+n(o.value)+'"';return C[a]?(i(e)&&(c+="/"),c+">"):c+">"+s(e)+"</"+a+">";case Node.TEXT_NODE:var d=e.data;return t&&j[t.localName]?d:r(d);case Node.COMMENT_NODE:return"<!--"+e.data+"-->";default:throw console.error(e),new Error("not implemented")}}function s(e){e instanceof O.HTMLTemplateElement&&(e=e.content);for(var t="",n=e.firstChild;n;n=n.nextSibling)t+=a(n,e);return t}function c(e,t,n){var r=n||"div";e.textContent="";var o=T(e.ownerDocument.createElement(r));o.innerHTML=t;for(var i;i=o.firstChild;)e.appendChild(M(i))}function l(e){m.call(this,e)}function u(e,t){var n=T(e.cloneNode(!1));n.innerHTML=t;for(var r,o=T(document.createDocumentFragment());r=n.firstChild;)o.appendChild(r);return M(o)}function d(t){return function(){return e.renderAllPending(),S(this)[t]}}function p(e){w(l,e,d(e))}function h(t){Object.defineProperty(l.prototype,t,{get:d(t),set:function(n){e.renderAllPending(),S(this)[t]=n},configurable:!0,enumerable:!0})}function f(t){Object.defineProperty(l.prototype,t,{value:function(){return e.renderAllPending(),S(this)[t].apply(S(this),arguments)},configurable:!0,enumerable:!0})}var m=e.wrappers.Element,w=e.defineGetter,v=e.enqueueMutation,g=e.mixin,b=e.nodesWereAdded,y=e.nodesWereRemoved,E=e.registerWrapper,_=e.snapshotNodeList,S=e.unsafeUnwrap,T=e.unwrap,M=e.wrap,O=e.wrappers,L=/[&\u00A0"]/g,N=/[&\u00A0<>]/g,C=o(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),j=o(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D="http://www.w3.org/1999/xhtml",H=/MSIE/.test(navigator.userAgent),x=window.HTMLElement,R=window.HTMLTemplateElement;l.prototype=Object.create(m.prototype),g(l.prototype,{get innerHTML(){return s(this)},set innerHTML(e){if(H&&j[this.localName])return void(this.textContent=e);var t=_(this.childNodes);this.invalidateShadowRenderer()?this instanceof O.HTMLTemplateElement?c(this.content,e):c(this,e,this.tagName):!R&&this instanceof O.HTMLTemplateElement?c(this.content,e):S(this).innerHTML=e;var n=_(this.childNodes);v(this,"childList",{addedNodes:n,removedNodes:t}),y(t),b(n,this)},get outerHTML(){return a(this,this.parentNode)},set outerHTML(e){var t=this.parentNode;if(t){t.invalidateShadowRenderer();var n=u(t,e);t.replaceChild(n,this)}},insertAdjacentHTML:function(e,t){var n,r;switch(String(e).toLowerCase()){case"beforebegin":n=this.parentNode,r=this;break;case"afterend":n=this.parentNode,r=this.nextSibling;break;case"afterbegin":n=this,r=this.firstChild;break;case"beforeend":n=this,r=null;break;default:return}var o=u(n,t);n.insertBefore(o,r)},get hidden(){return this.hasAttribute("hidden")},set hidden(e){e?this.setAttribute("hidden",""):this.removeAttribute("hidden")}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(p),["scrollLeft","scrollTop"].forEach(h),["focus","getBoundingClientRect","getClientRects","scrollIntoView"].forEach(f),E(x,l,document.createElement("b")),e.wrappers.HTMLElement=l,e.getInnerHTML=s,e.setInnerHTML=c}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.HTMLCanvasElement;t.prototype=Object.create(n.prototype),r(t.prototype,{getContext:function(){var e=i(this).getContext.apply(i(this),arguments);return e&&a(e)}}),o(s,t,document.createElement("canvas")),e.wrappers.HTMLCanvasElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=window.HTMLContentElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get select(){return this.getAttribute("select")},set select(e){this.setAttribute("select",e)},setAttribute:function(e,t){n.prototype.setAttribute.call(this,e,t),"select"===String(e).toLowerCase()&&this.invalidateShadowRenderer(!0)}}),i&&o(i,t),e.wrappers.HTMLContentElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=window.HTMLFormElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get elements(){return i(a(this).elements)}}),o(s,t,document.createElement("form")),e.wrappers.HTMLFormElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e,t){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var o=i(document.createElement("img"));r.call(this,o),a(o,this),void 0!==e&&(o.width=e),void 0!==t&&(o.height=t)}var r=e.wrappers.HTMLElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLImageElement;t.prototype=Object.create(r.prototype),o(s,t,document.createElement("img")),n.prototype=t.prototype,e.wrappers.HTMLImageElement=t,e.wrappers.Image=n}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=(e.mixin,e.wrappers.NodeList,e.registerWrapper),o=window.HTMLShadowElement;t.prototype=Object.create(n.prototype),t.prototype.constructor=t,o&&r(o,t),e.wrappers.HTMLShadowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){if(!e.defaultView)return e;var t=d.get(e);if(!t){for(t=e.implementation.createHTMLDocument("");t.lastChild;)t.removeChild(t.lastChild);d.set(e,t)}return t}function n(e){for(var n,r=t(e.ownerDocument),o=c(r.createDocumentFragment());n=e.firstChild;)o.appendChild(n);return o}function r(e){if(o.call(this,e),!p){var t=n(e);u.set(this,l(t))}}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.wrap,u=new WeakMap,d=new WeakMap,p=window.HTMLTemplateElement;r.prototype=Object.create(o.prototype),i(r.prototype,{constructor:r,get content(){return p?l(s(this).content):u.get(this)}}),p&&a(p,r),e.wrappers.HTMLTemplateElement=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.registerWrapper,o=window.HTMLMediaElement;o&&(t.prototype=Object.create(n.prototype),r(o,t,document.createElement("audio")),e.wrappers.HTMLMediaElement=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r.call(this,e)}function n(e){if(!(this instanceof n))throw new TypeError("DOM object constructor cannot be called as a function.");var t=i(document.createElement("audio"));r.call(this,t),a(t,this),t.setAttribute("preload","auto"),void 0!==e&&t.setAttribute("src",e)}var r=e.wrappers.HTMLMediaElement,o=e.registerWrapper,i=e.unwrap,a=e.rewrap,s=window.HTMLAudioElement;s&&(t.prototype=Object.create(r.prototype),o(s,t,document.createElement("audio")),n.prototype=t.prototype,e.wrappers.HTMLAudioElement=t,e.wrappers.Audio=n)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){return e.replace(/\s+/g," ").trim()}function n(e){o.call(this,e)}function r(e,t,n,i){if(!(this instanceof r))throw new TypeError("DOM object constructor cannot be called as a function.");var a=c(document.createElement("option"));o.call(this,a),s(a,this),void 0!==e&&(a.text=e),void 0!==t&&a.setAttribute("value",t),n===!0&&a.setAttribute("selected",""),a.selected=i===!0}var o=e.wrappers.HTMLElement,i=e.mixin,a=e.registerWrapper,s=e.rewrap,c=e.unwrap,l=e.wrap,u=window.HTMLOptionElement;n.prototype=Object.create(o.prototype),i(n.prototype,{get text(){return t(this.textContent)},set text(e){this.textContent=t(String(e))},get form(){return l(c(this).form)}}),a(u,n,document.createElement("option")),r.prototype=n.prototype,e.wrappers.HTMLOptionElement=n,e.wrappers.Option=r}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=window.HTMLSelectElement;t.prototype=Object.create(n.prototype),r(t.prototype,{add:function(e,t){"object"==typeof t&&(t=i(t)),i(this).add(i(e),t)},remove:function(e){return void 0===e?void n.prototype.remove.call(this):("object"==typeof e&&(e=i(e)),void i(this).remove(e))},get form(){return a(i(this).form)}}),o(s,t,document.createElement("select")),e.wrappers.HTMLSelectElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.unwrap,a=e.wrap,s=e.wrapHTMLCollection,c=window.HTMLTableElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get caption(){return a(i(this).caption)},createCaption:function(){return a(i(this).createCaption())},get tHead(){return a(i(this).tHead)},createTHead:function(){return a(i(this).createTHead())},createTFoot:function(){return a(i(this).createTFoot())},get tFoot(){return a(i(this).tFoot)},get tBodies(){return s(i(this).tBodies)},createTBody:function(){return a(i(this).createTBody())},get rows(){return s(i(this).rows)},insertRow:function(e){return a(i(this).insertRow(e))}}),o(c,t,document.createElement("table")),e.wrappers.HTMLTableElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableSectionElement;t.prototype=Object.create(n.prototype),r(t.prototype,{constructor:t,get rows(){return i(a(this).rows)},insertRow:function(e){return s(a(this).insertRow(e))}}),o(c,t,document.createElement("thead")),e.wrappers.HTMLTableSectionElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.HTMLElement,r=e.mixin,o=e.registerWrapper,i=e.wrapHTMLCollection,a=e.unwrap,s=e.wrap,c=window.HTMLTableRowElement;t.prototype=Object.create(n.prototype),r(t.prototype,{get cells(){return i(a(this).cells)},insertCell:function(e){return s(a(this).insertCell(e))}}),o(c,t,document.createElement("tr")),e.wrappers.HTMLTableRowElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){switch(e.localName){case"content":return new n(e);case"shadow":return new o(e);case"template":return new i(e)}r.call(this,e)}var n=e.wrappers.HTMLContentElement,r=e.wrappers.HTMLElement,o=e.wrappers.HTMLShadowElement,i=e.wrappers.HTMLTemplateElement,a=(e.mixin,e.registerWrapper),s=window.HTMLUnknownElement;t.prototype=Object.create(r.prototype),a(s,t),e.wrappers.HTMLUnknownElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Element,r=e.wrappers.HTMLElement,o=e.registerWrapper,i=(e.defineWrapGetter,e.unsafeUnwrap),a=e.wrap,s=e.mixin,c="http://www.w3.org/2000/svg",l=window.SVGElement,u=document.createElementNS(c,"title");if(!("classList"in u)){var d=Object.getOwnPropertyDescriptor(n.prototype,"classList");Object.defineProperty(r.prototype,"classList",d),delete n.prototype.classList}t.prototype=Object.create(n.prototype),s(t.prototype,{get ownerSVGElement(){return a(i(this).ownerSVGElement)}}),o(l,t,document.createElementNS(c,"title")),e.wrappers.SVGElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){p.call(this,e)}var n=e.mixin,r=e.registerWrapper,o=e.unwrap,i=e.wrap,a=window.SVGUseElement,s="http://www.w3.org/2000/svg",c=i(document.createElementNS(s,"g")),l=document.createElementNS(s,"use"),u=c.constructor,d=Object.getPrototypeOf(u.prototype),p=d.constructor;t.prototype=Object.create(d),"instanceRoot"in l&&n(t.prototype,{get instanceRoot(){return i(o(this).instanceRoot)},get animatedInstanceRoot(){return i(o(this).animatedInstanceRoot)}}),r(a,t,l),e.wrappers.SVGUseElement=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.mixin,o=e.registerWrapper,i=e.unsafeUnwrap,a=e.wrap,s=window.SVGElementInstance;s&&(t.prototype=Object.create(n.prototype),r(t.prototype,{get correspondingElement(){return a(i(this).correspondingElement)},get correspondingUseElement(){return a(i(this).correspondingUseElement)},get parentNode(){return a(i(this).parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return a(i(this).firstChild)},get lastChild(){return a(i(this).lastChild)},get previousSibling(){return a(i(this).previousSibling)},get nextSibling(){return a(i(this).nextSibling)}}),o(s,t),e.wrappers.SVGElementInstance=t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){o(e,this)}var n=e.mixin,r=e.registerWrapper,o=e.setWrapper,i=e.unsafeUnwrap,a=e.unwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.CanvasRenderingContext2D;n(t.prototype,{get canvas(){return c(i(this).canvas)},drawImage:function(){arguments[0]=s(arguments[0]),i(this).drawImage.apply(i(this),arguments)},createPattern:function(){return arguments[0]=a(arguments[0]),i(this).createPattern.apply(i(this),arguments)}}),r(l,t,document.createElement("canvas").getContext("2d")),e.wrappers.CanvasRenderingContext2D=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){i(e,this)}var n=e.addForwardingProperties,r=e.mixin,o=e.registerWrapper,i=e.setWrapper,a=e.unsafeUnwrap,s=e.unwrapIfNeeded,c=e.wrap,l=window.WebGLRenderingContext;if(l){r(t.prototype,{get canvas(){return c(a(this).canvas)},texImage2D:function(){arguments[5]=s(arguments[5]),a(this).texImage2D.apply(a(this),arguments)},texSubImage2D:function(){arguments[6]=s(arguments[6]),a(this).texSubImage2D.apply(a(this),arguments)}});var u=Object.getPrototypeOf(l.prototype);u!==Object.prototype&&n(u,t.prototype);var d=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};o(l,t,d),e.wrappers.WebGLRenderingContext=t}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.Node,r=e.GetElementsByInterface,o=e.NonElementParentNodeInterface,i=e.ParentNodeInterface,a=e.SelectorsInterface,s=e.mixin,c=e.registerObject,l=e.registerWrapper,u=window.DocumentFragment;t.prototype=Object.create(n.prototype),s(t.prototype,i),s(t.prototype,a),s(t.prototype,r),s(t.prototype,o),l(u,t,document.createDocumentFragment()),e.wrappers.DocumentFragment=t;var d=c(document.createComment(""));e.wrappers.Comment=d}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(u(e).ownerDocument.createDocumentFragment());n.call(this,t),c(t,this);var o=e.shadowRoot;f.set(this,o),this.treeScope_=new r(this,a(o||e)),h.set(this,e)}var n=e.wrappers.DocumentFragment,r=e.TreeScope,o=e.elementFromPoint,i=e.getInnerHTML,a=e.getTreeScope,s=e.mixin,c=e.rewrap,l=e.setInnerHTML,u=e.unsafeUnwrap,d=e.unwrap,p=e.wrap,h=new WeakMap,f=new WeakMap;t.prototype=Object.create(n.prototype),s(t.prototype,{constructor:t,get innerHTML(){return i(this)},set innerHTML(e){l(this,e),this.invalidateShadowRenderer()},get olderShadowRoot(){return f.get(this)||null},get host(){return h.get(this)||null},invalidateShadowRenderer:function(){return h.get(this).invalidateShadowRenderer()},elementFromPoint:function(e,t){return o(this,this.ownerDocument,e,t)},getSelection:function(){return document.getSelection()},get activeElement(){var e=d(this).ownerDocument.activeElement;if(!e||!e.nodeType)return null;for(var t=p(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}}),e.wrappers.ShadowRoot=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=d(e).root;return t instanceof h?t.host:null}function n(t,n){if(t.shadowRoot){n=Math.min(t.childNodes.length-1,n);var r=t.childNodes[n];if(r){var o=e.getDestinationInsertionPoints(r);if(o.length>0){var i=o[0].parentNode;i.nodeType==Node.ELEMENT_NODE&&(t=i)}}}return t}function r(e){return e=u(e),t(e)||e}function o(e){a(e,this)}var i=e.registerWrapper,a=e.setWrapper,s=e.unsafeUnwrap,c=e.unwrap,l=e.unwrapIfNeeded,u=e.wrap,d=e.getTreeScope,p=window.Range,h=e.wrappers.ShadowRoot;o.prototype={get startContainer(){return r(s(this).startContainer)},get endContainer(){return r(s(this).endContainer)},get commonAncestorContainer(){return r(s(this).commonAncestorContainer)},setStart:function(e,t){e=n(e,t),s(this).setStart(l(e),t)},setEnd:function(e,t){e=n(e,t),s(this).setEnd(l(e),t)},setStartBefore:function(e){s(this).setStartBefore(l(e))},setStartAfter:function(e){s(this).setStartAfter(l(e))},setEndBefore:function(e){s(this).setEndBefore(l(e))},setEndAfter:function(e){s(this).setEndAfter(l(e))},selectNode:function(e){s(this).selectNode(l(e))},selectNodeContents:function(e){s(this).selectNodeContents(l(e))},compareBoundaryPoints:function(e,t){return s(this).compareBoundaryPoints(e,c(t))},extractContents:function(){return u(s(this).extractContents())},cloneContents:function(){return u(s(this).cloneContents())},insertNode:function(e){s(this).insertNode(l(e))},surroundContents:function(e){s(this).surroundContents(l(e))},cloneRange:function(){return u(s(this).cloneRange())},isPointInRange:function(e,t){return s(this).isPointInRange(l(e),t)},comparePoint:function(e,t){return s(this).comparePoint(l(e),t)},intersectsNode:function(e){return s(this).intersectsNode(l(e))},toString:function(){return s(this).toString()}},p.prototype.createContextualFragment&&(o.prototype.createContextualFragment=function(e){return u(s(this).createContextualFragment(e))}),i(window.Range,o,document.createRange()),e.wrappers.Range=o}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){e.previousSibling_=e.previousSibling,e.nextSibling_=e.nextSibling,e.parentNode_=e.parentNode}function n(n,o,i){var a=x(n),s=x(o),c=i?x(i):null;if(r(o),t(o),i)n.firstChild===i&&(n.firstChild_=i),i.previousSibling_=i.previousSibling;else{n.lastChild_=n.lastChild,n.lastChild===n.firstChild&&(n.firstChild_=n.firstChild);var l=R(a.lastChild);l&&(l.nextSibling_=l.nextSibling)}e.originalInsertBefore.call(a,s,c)}function r(n){var r=x(n),o=r.parentNode;if(o){var i=R(o);t(n),n.previousSibling&&(n.previousSibling.nextSibling_=n),n.nextSibling&&(n.nextSibling.previousSibling_=n),i.lastChild===n&&(i.lastChild_=n),i.firstChild===n&&(i.firstChild_=n),e.originalRemoveChild.call(o,r)}}function o(e){P.set(e,[])}function i(e){var t=P.get(e);return t||P.set(e,t=[]),t}function a(e){for(var t=[],n=0,r=e.firstChild;r;r=r.nextSibling)t[n++]=r;return t}function s(){for(var e=0;e<F.length;e++){var t=F[e],n=t.parentRenderer;n&&n.dirty||t.render()}F=[]}function c(){T=null,s()}function l(e){var t=A.get(e);return t||(t=new h(e),A.set(e,t)),t}function u(e){var t=j(e).root;return t instanceof C?t:null}function d(e){return l(e.host)}function p(e){this.skip=!1,this.node=e,this.childNodes=[]}function h(e){this.host=e,this.dirty=!1,this.invalidateAttributes(),this.associateNode(e)}function f(e){for(var t=[],n=e.firstChild;n;n=n.nextSibling)E(n)?t.push.apply(t,i(n)):t.push(n);return t}function m(e){if(e instanceof L)return e;if(e instanceof O)return null;for(var t=e.firstChild;t;t=t.nextSibling){var n=m(t);if(n)return n}return null}function w(e,t){i(t).push(e);var n=k.get(e);n?n.push(t):k.set(e,[t])}function v(e){return k.get(e)}function g(e){k.set(e,void 0)}function b(e,t){var n=t.getAttribute("select");if(!n)return!0;if(n=n.trim(),!n)return!0;if(!(e instanceof M))return!1;if(!q.test(n))return!1;try{return e.matches(n)}catch(r){return!1}}function y(e,t){var n=v(t);return n&&n[n.length-1]===e}function E(e){return e instanceof O||e instanceof L}function _(e){return e.shadowRoot}function S(e){for(var t=[],n=e.shadowRoot;n;n=n.olderShadowRoot)t.push(n);return t}var T,M=e.wrappers.Element,O=e.wrappers.HTMLContentElement,L=e.wrappers.HTMLShadowElement,N=e.wrappers.Node,C=e.wrappers.ShadowRoot,j=(e.assert,e.getTreeScope),D=(e.mixin,e.oneOf),H=e.unsafeUnwrap,x=e.unwrap,R=e.wrap,I=e.ArraySplice,P=new WeakMap,k=new WeakMap,A=new WeakMap,W=D(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),F=[],U=new I;U.equals=function(e,t){return x(e.node)===t},p.prototype={append:function(e){var t=new p(e);return this.childNodes.push(t),t},sync:function(e){if(!this.skip){for(var t=this.node,o=this.childNodes,i=a(x(t)),s=e||new WeakMap,c=U.calculateSplices(o,i),l=0,u=0,d=0,p=0;p<c.length;p++){for(var h=c[p];d<h.index;d++)u++,o[l++].sync(s);for(var f=h.removed.length,m=0;f>m;m++){var w=R(i[u++]);s.get(w)||r(w)}for(var v=h.addedCount,g=i[u]&&R(i[u]),m=0;v>m;m++){var b=o[l++],y=b.node;n(t,y,g),s.set(y,!0),b.sync(s)}d+=v}for(var p=d;p<o.length;p++)o[p].sync(s)}}},h.prototype={render:function(e){if(this.dirty){this.invalidateAttributes();var t=this.host;this.distribution(t);var n=e||new p(t);this.buildRenderTree(n,t);var r=!e;r&&n.sync(),this.dirty=!1}},get parentRenderer(){return j(this.host).renderer},invalidate:function(){if(!this.dirty){this.dirty=!0;var e=this.parentRenderer;if(e&&e.invalidate(),F.push(this),T)return;T=window[W](c,0)}},distribution:function(e){this.resetAllSubtrees(e),this.distributionResolution(e)},resetAll:function(e){E(e)?o(e):g(e),this.resetAllSubtrees(e)},resetAllSubtrees:function(e){for(var t=e.firstChild;t;t=t.nextSibling)this.resetAll(t);e.shadowRoot&&this.resetAll(e.shadowRoot),e.olderShadowRoot&&this.resetAll(e.olderShadowRoot)},distributionResolution:function(e){if(_(e)){for(var t=e,n=f(t),r=S(t),o=0;o<r.length;o++)this.poolDistribution(r[o],n);for(var o=r.length-1;o>=0;o--){var i=r[o],a=m(i);if(a){var s=i.olderShadowRoot;s&&(n=f(s));for(var c=0;c<n.length;c++)w(n[c],a)}this.distributionResolution(i)}}for(var l=e.firstChild;l;l=l.nextSibling)this.distributionResolution(l)},poolDistribution:function(e,t){if(!(e instanceof L))if(e instanceof O){var n=e;this.updateDependentAttributes(n.getAttribute("select"));for(var r=!1,o=0;o<t.length;o++){var e=t[o];e&&b(e,n)&&(w(e,n),t[o]=void 0,r=!0)}if(!r)for(var i=n.firstChild;i;i=i.nextSibling)w(i,n)}else for(var i=e.firstChild;i;i=i.nextSibling)this.poolDistribution(i,t)},buildRenderTree:function(e,t){for(var n=this.compose(t),r=0;r<n.length;r++){var o=n[r],i=e.append(o);this.buildRenderTree(i,o)}if(_(t)){var a=l(t);a.dirty=!1}},compose:function(e){for(var t=[],n=e.shadowRoot||e,r=n.firstChild;r;r=r.nextSibling)if(E(r)){this.associateNode(n);for(var o=i(r),a=0;a<o.length;a++){var s=o[a];y(r,s)&&t.push(s)}}else t.push(r);return t},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(e){if(e){var t=this.attributes;/\.\w+/.test(e)&&(t["class"]=!0),/#\w+/.test(e)&&(t.id=!0),e.replace(/\[\s*([^\s=\|~\]]+)/g,function(e,n){t[n]=!0})}},dependsOnAttribute:function(e){return this.attributes[e]},associateNode:function(e){H(e).polymerShadowRenderer_=this}};var q=/^(:not\()?[*.#[a-zA-Z_|]/;N.prototype.invalidateShadowRenderer=function(e){var t=H(this).polymerShadowRenderer_;return t?(t.invalidate(),!0):!1},O.prototype.getDistributedNodes=L.prototype.getDistributedNodes=function(){return s(),i(this)},M.prototype.getDestinationInsertionPoints=function(){return s(),v(this)||[]},O.prototype.nodeIsInserted_=L.prototype.nodeIsInserted_=function(){this.invalidateShadowRenderer();var e,t=u(this);t&&(e=d(t)),H(this).polymerShadowRenderer_=e,e&&e.invalidate()},e.getRendererForHost=l,e.getShadowTrees=S,e.renderAllPending=s,e.getDestinationInsertionPoints=v,e.visual={insertBefore:n,remove:r}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(t){if(window[t]){r(!e.wrappers[t]);var c=function(e){n.call(this,e)};c.prototype=Object.create(n.prototype),o(c.prototype,{get form(){return s(a(this).form)}}),i(window[t],c,document.createElement(t.slice(4,-7))),e.wrappers[t]=c}}var n=e.wrappers.HTMLElement,r=e.assert,o=e.mixin,i=e.registerWrapper,a=e.unwrap,s=e.wrap,c=["HTMLButtonElement","HTMLFieldSetElement","HTMLInputElement","HTMLKeygenElement","HTMLLabelElement","HTMLLegendElement","HTMLObjectElement","HTMLOutputElement","HTMLTextAreaElement"];c.forEach(t)}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrap,a=e.unwrapIfNeeded,s=e.wrap,c=window.Selection;t.prototype={get anchorNode(){return s(o(this).anchorNode)},get focusNode(){return s(o(this).focusNode)},addRange:function(e){o(this).addRange(a(e))},collapse:function(e,t){o(this).collapse(a(e),t)},containsNode:function(e,t){return o(this).containsNode(a(e),t)},getRangeAt:function(e){return s(o(this).getRangeAt(e))},removeRange:function(e){o(this).removeRange(i(e))},selectAllChildren:function(e){o(this).selectAllChildren(e instanceof ShadowRoot?o(e.host):a(e))},toString:function(){return o(this).toString()}},c.prototype.extend&&(t.prototype.extend=function(e,t){o(this).extend(a(e),t)}),n(window.Selection,t,window.getSelection()),e.wrappers.Selection=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){r(e,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unsafeUnwrap,i=e.unwrapIfNeeded,a=e.wrap,s=window.TreeWalker;t.prototype={get root(){return a(o(this).root)},get currentNode(){return a(o(this).currentNode)},set currentNode(e){o(this).currentNode=i(e)},get filter(){return o(this).filter},parentNode:function(){return a(o(this).parentNode())},firstChild:function(){return a(o(this).firstChild())},lastChild:function(){return a(o(this).lastChild())},previousSibling:function(){return a(o(this).previousSibling())},previousNode:function(){return a(o(this).previousNode())},nextNode:function(){return a(o(this).nextNode())}},n(s,t),e.wrappers.TreeWalker=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){u.call(this,e),this.treeScope_=new w(this,null)}function n(e){var n=document[e];t.prototype[e]=function(){return j(n.apply(N(this),arguments))}}function r(e,t){x.call(N(t),C(e)),o(e,t)}function o(e,t){e.shadowRoot&&t.adoptNode(e.shadowRoot),e instanceof m&&i(e,t);for(var n=e.firstChild;n;n=n.nextSibling)o(n,t)}function i(e,t){var n=e.olderShadowRoot;n&&t.adoptNode(n)}function a(e){L(e,this)}function s(e,t){var n=document.implementation[t];e.prototype[t]=function(){
13 return j(n.apply(N(this),arguments))}}function c(e,t){var n=document.implementation[t];e.prototype[t]=function(){return n.apply(N(this),arguments)}}var l=e.GetElementsByInterface,u=e.wrappers.Node,d=e.ParentNodeInterface,p=e.NonElementParentNodeInterface,h=e.wrappers.Selection,f=e.SelectorsInterface,m=e.wrappers.ShadowRoot,w=e.TreeScope,v=e.cloneNode,g=e.defineGetter,b=e.defineWrapGetter,y=e.elementFromPoint,E=e.forwardMethodsToWrapper,_=e.matchesNames,S=e.mixin,T=e.registerWrapper,M=e.renderAllPending,O=e.rewrap,L=e.setWrapper,N=e.unsafeUnwrap,C=e.unwrap,j=e.wrap,D=e.wrapEventTargetMethods,H=(e.wrapNodeList,new WeakMap);t.prototype=Object.create(u.prototype),b(t,"documentElement"),b(t,"body"),b(t,"head"),g(t,"activeElement",function(){var e=C(this).activeElement;if(!e||!e.nodeType)return null;for(var t=j(e);!this.contains(t);){for(;t.parentNode;)t=t.parentNode;if(!t.host)return null;t=t.host}return t}),["createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode"].forEach(n);var x=document.adoptNode,R=document.getSelection;S(t.prototype,{adoptNode:function(e){return e.parentNode&&e.parentNode.removeChild(e),r(e,this),e},elementFromPoint:function(e,t){return y(this,this,e,t)},importNode:function(e,t){return v(e,t,N(this))},getSelection:function(){return M(),new h(R.call(C(this)))},getElementsByName:function(e){return f.querySelectorAll.call(this,"[name="+JSON.stringify(String(e))+"]")}});var I=document.createTreeWalker,P=e.wrappers.TreeWalker;if(t.prototype.createTreeWalker=function(e,t,n,r){var o=null;return n&&(n.acceptNode&&"function"==typeof n.acceptNode?o={acceptNode:function(e){return n.acceptNode(j(e))}}:"function"==typeof n&&(o=function(e){return n(j(e))})),new P(I.call(C(this),C(e),t,o,r))},document.registerElement){var k=document.registerElement;t.prototype.registerElement=function(t,n){function r(e){return e?void L(e,this):i?document.createElement(i,t):document.createElement(t)}var o,i;if(void 0!==n&&(o=n.prototype,i=n["extends"]),o||(o=Object.create(HTMLElement.prototype)),e.nativePrototypeTable.get(o))throw new Error("NotSupportedError");for(var a,s=Object.getPrototypeOf(o),c=[];s&&!(a=e.nativePrototypeTable.get(s));)c.push(s),s=Object.getPrototypeOf(s);if(!a)throw new Error("NotSupportedError");for(var l=Object.create(a),u=c.length-1;u>=0;u--)l=Object.create(l);["createdCallback","attachedCallback","detachedCallback","attributeChangedCallback"].forEach(function(e){var t=o[e];t&&(l[e]=function(){j(this)instanceof r||O(this),t.apply(j(this),arguments)})});var d={prototype:l};i&&(d["extends"]=i),r.prototype=o,r.prototype.constructor=r,e.constructorTable.set(l,r),e.nativePrototypeTable.set(o,l);k.call(C(this),t,d);return r},E([window.HTMLDocument||window.Document],["registerElement"])}E([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement,window.HTMLHtmlElement],["appendChild","compareDocumentPosition","contains","getElementsByClassName","getElementsByTagName","getElementsByTagNameNS","insertBefore","querySelector","querySelectorAll","removeChild","replaceChild"]),E([window.HTMLBodyElement,window.HTMLHeadElement,window.HTMLHtmlElement],_),E([window.HTMLDocument||window.Document],["adoptNode","importNode","contains","createComment","createDocumentFragment","createElement","createElementNS","createEvent","createEventNS","createRange","createTextNode","createTreeWalker","elementFromPoint","getElementById","getElementsByName","getSelection"]),S(t.prototype,l),S(t.prototype,d),S(t.prototype,f),S(t.prototype,p),S(t.prototype,{get implementation(){var e=H.get(this);return e?e:(e=new a(C(this).implementation),H.set(this,e),e)},get defaultView(){return j(C(this).defaultView)}}),T(window.Document,t,document.implementation.createHTMLDocument("")),window.HTMLDocument&&T(window.HTMLDocument,t),D([window.HTMLBodyElement,window.HTMLDocument||window.Document,window.HTMLHeadElement]);var A=document.implementation.createDocument;a.prototype.createDocument=function(){return arguments[2]=C(arguments[2]),j(A.apply(N(this),arguments))},s(a,"createDocumentType"),s(a,"createHTMLDocument"),c(a,"hasFeature"),T(window.DOMImplementation,a),E([window.DOMImplementation],["createDocument","createDocumentType","createHTMLDocument","hasFeature"]),e.adoptNodeNoRemove=r,e.wrappers.DOMImplementation=a,e.wrappers.Document=t}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){n.call(this,e)}var n=e.wrappers.EventTarget,r=e.wrappers.Selection,o=e.mixin,i=e.registerWrapper,a=e.renderAllPending,s=e.unwrap,c=e.unwrapIfNeeded,l=e.wrap,u=window.Window,d=window.getComputedStyle,p=window.getDefaultComputedStyle,h=window.getSelection;t.prototype=Object.create(n.prototype),u.prototype.getComputedStyle=function(e,t){return l(this||window).getComputedStyle(c(e),t)},p&&(u.prototype.getDefaultComputedStyle=function(e,t){return l(this||window).getDefaultComputedStyle(c(e),t)}),u.prototype.getSelection=function(){return l(this||window).getSelection()},delete window.getComputedStyle,delete window.getDefaultComputedStyle,delete window.getSelection,["addEventListener","removeEventListener","dispatchEvent"].forEach(function(e){u.prototype[e]=function(){var t=l(this||window);return t[e].apply(t,arguments)},delete window[e]}),o(t.prototype,{getComputedStyle:function(e,t){return a(),d.call(s(this),c(e),t)},getSelection:function(){return a(),new r(h.call(s(this)))},get document(){return l(s(this).document)}}),p&&(t.prototype.getDefaultComputedStyle=function(e,t){return a(),p.call(s(this),c(e),t)}),i(u,t,window),e.wrappers.Window=t}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrap,n=window.DataTransfer||window.Clipboard,r=n.prototype.setDragImage;r&&(n.prototype.setDragImage=function(e,n,o){r.call(this,t(e),n,o)})}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t;t=e instanceof i?e:new i(e&&o(e)),r(t,this)}var n=e.registerWrapper,r=e.setWrapper,o=e.unwrap,i=window.FormData;i&&(n(i,t,new i),e.wrappers.FormData=t)}(window.ShadowDOMPolyfill),function(e){"use strict";var t=e.unwrapIfNeeded,n=XMLHttpRequest.prototype.send;XMLHttpRequest.prototype.send=function(e){return n.call(this,t(e))}}(window.ShadowDOMPolyfill),function(e){"use strict";function t(e){var t=n[e],r=window[t];if(r){var o=document.createElement(e),i=o.constructor;window[t]=i}}var n=(e.isWrapperFor,{a:"HTMLAnchorElement",area:"HTMLAreaElement",audio:"HTMLAudioElement",base:"HTMLBaseElement",body:"HTMLBodyElement",br:"HTMLBRElement",button:"HTMLButtonElement",canvas:"HTMLCanvasElement",caption:"HTMLTableCaptionElement",col:"HTMLTableColElement",content:"HTMLContentElement",data:"HTMLDataElement",datalist:"HTMLDataListElement",del:"HTMLModElement",dir:"HTMLDirectoryElement",div:"HTMLDivElement",dl:"HTMLDListElement",embed:"HTMLEmbedElement",fieldset:"HTMLFieldSetElement",font:"HTMLFontElement",form:"HTMLFormElement",frame:"HTMLFrameElement",frameset:"HTMLFrameSetElement",h1:"HTMLHeadingElement",head:"HTMLHeadElement",hr:"HTMLHRElement",html:"HTMLHtmlElement",iframe:"HTMLIFrameElement",img:"HTMLImageElement",input:"HTMLInputElement",keygen:"HTMLKeygenElement",label:"HTMLLabelElement",legend:"HTMLLegendElement",li:"HTMLLIElement",link:"HTMLLinkElement",map:"HTMLMapElement",marquee:"HTMLMarqueeElement",menu:"HTMLMenuElement",menuitem:"HTMLMenuItemElement",meta:"HTMLMetaElement",meter:"HTMLMeterElement",object:"HTMLObjectElement",ol:"HTMLOListElement",optgroup:"HTMLOptGroupElement",option:"HTMLOptionElement",output:"HTMLOutputElement",p:"HTMLParagraphElement",param:"HTMLParamElement",pre:"HTMLPreElement",progress:"HTMLProgressElement",q:"HTMLQuoteElement",script:"HTMLScriptElement",select:"HTMLSelectElement",shadow:"HTMLShadowElement",source:"HTMLSourceElement",span:"HTMLSpanElement",style:"HTMLStyleElement",table:"HTMLTableElement",tbody:"HTMLTableSectionElement",template:"HTMLTemplateElement",textarea:"HTMLTextAreaElement",thead:"HTMLTableSectionElement",time:"HTMLTimeElement",title:"HTMLTitleElement",tr:"HTMLTableRowElement",track:"HTMLTrackElement",ul:"HTMLUListElement",video:"HTMLVideoElement"});Object.keys(n).forEach(t),Object.getOwnPropertyNames(e.wrappers).forEach(function(t){window[t]=e.wrappers[t]})}(window.ShadowDOMPolyfill),function(e){function t(e,t){var n="";return Array.prototype.forEach.call(e,function(e){n+=e.textContent+"\n\n"}),t||(n=n.replace(d,"")),n}function n(e){var t=document.createElement("style");return t.textContent=e,t}function r(e){var t=n(e);document.head.appendChild(t);var r=[];if(t.sheet)try{r=t.sheet.cssRules}catch(o){}else console.warn("sheet not found",t);return t.parentNode.removeChild(t),r}function o(){C.initialized=!0,document.body.appendChild(C);var e=C.contentDocument,t=e.createElement("base");t.href=document.baseURI,e.head.appendChild(t)}function i(e){C.initialized||o(),document.body.appendChild(C),e(C.contentDocument),document.body.removeChild(C)}function a(e,t){if(t){var o;if(e.match("@import")&&D){var a=n(e);i(function(e){e.head.appendChild(a.impl),o=Array.prototype.slice.call(a.sheet.cssRules,0),t(o)})}else o=r(e),t(o)}}function s(e){e&&l().appendChild(document.createTextNode(e))}function c(e,t){var r=n(e);r.setAttribute(t,""),r.setAttribute(x,""),document.head.appendChild(r)}function l(){return j||(j=document.createElement("style"),j.setAttribute(x,""),j[x]=!0),j}var u={strictStyling:!1,registry:{},shimStyling:function(e,n,r){var o=this.prepareRoot(e,n,r),i=this.isTypeExtension(r),a=this.makeScopeSelector(n,i),s=t(o,!0);s=this.scopeCssText(s,a),e&&(e.shimmedStyle=s),this.addCssToDocument(s,n)},shimStyle:function(e,t){return this.shimCssText(e.textContent,t)},shimCssText:function(e,t){return e=this.insertDirectives(e),this.scopeCssText(e,t)},makeScopeSelector:function(e,t){return e?t?"[is="+e+"]":e:""},isTypeExtension:function(e){return e&&e.indexOf("-")<0},prepareRoot:function(e,t,n){var r=this.registerRoot(e,t,n);return this.replaceTextInStyles(r.rootStyles,this.insertDirectives),this.removeStyles(e,r.rootStyles),this.strictStyling&&this.applyScopeToContent(e,t),r.scopeStyles},removeStyles:function(e,t){for(var n,r=0,o=t.length;o>r&&(n=t[r]);r++)n.parentNode.removeChild(n)},registerRoot:function(e,t,n){var r=this.registry[t]={root:e,name:t,extendsName:n},o=this.findStyles(e);r.rootStyles=o,r.scopeStyles=r.rootStyles;var i=this.registry[r.extendsName];return i&&(r.scopeStyles=i.scopeStyles.concat(r.scopeStyles)),r},findStyles:function(e){if(!e)return[];var t=e.querySelectorAll("style");return Array.prototype.filter.call(t,function(e){return!e.hasAttribute(R)})},applyScopeToContent:function(e,t){e&&(Array.prototype.forEach.call(e.querySelectorAll("*"),function(e){e.setAttribute(t,"")}),Array.prototype.forEach.call(e.querySelectorAll("template"),function(e){this.applyScopeToContent(e.content,t)},this))},insertDirectives:function(e){return e=this.insertPolyfillDirectivesInCssText(e),this.insertPolyfillRulesInCssText(e)},insertPolyfillDirectivesInCssText:function(e){return e=e.replace(p,function(e,t){return t.slice(0,-2)+"{"}),e.replace(h,function(e,t){return t+" {"})},insertPolyfillRulesInCssText:function(e){return e=e.replace(f,function(e,t){return t.slice(0,-1)}),e.replace(m,function(e,t,n,r){var o=e.replace(t,"").replace(n,"");return r+o})},scopeCssText:function(e,t){var n=this.extractUnscopedRulesFromCssText(e);if(e=this.insertPolyfillHostInCssText(e),e=this.convertColonHost(e),e=this.convertColonHostContext(e),e=this.convertShadowDOMSelectors(e),t){var e,r=this;a(e,function(n){e=r.scopeRules(n,t)})}return e=e+"\n"+n,e.trim()},extractUnscopedRulesFromCssText:function(e){for(var t,n="";t=w.exec(e);)n+=t[1].slice(0,-1)+"\n\n";for(;t=v.exec(e);)n+=t[0].replace(t[2],"").replace(t[1],t[3])+"\n\n";return n},convertColonHost:function(e){return this.convertColonRule(e,E,this.colonHostPartReplacer)},convertColonHostContext:function(e){return this.convertColonRule(e,_,this.colonHostContextPartReplacer)},convertColonRule:function(e,t,n){return e.replace(t,function(e,t,r,o){if(t=O,r){for(var i,a=r.split(","),s=[],c=0,l=a.length;l>c&&(i=a[c]);c++)i=i.trim(),s.push(n(t,i,o));return s.join(",")}return t+o})},colonHostContextPartReplacer:function(e,t,n){return t.match(g)?this.colonHostPartReplacer(e,t,n):e+t+n+", "+t+" "+e+n},colonHostPartReplacer:function(e,t,n){return e+t.replace(g,"")+n},convertShadowDOMSelectors:function(e){for(var t=0;t<N.length;t++)e=e.replace(N[t]," ");return e},scopeRules:function(e,t){var n="";return e&&Array.prototype.forEach.call(e,function(e){if(e.selectorText&&e.style&&void 0!==e.style.cssText)n+=this.scopeSelector(e.selectorText,t,this.strictStyling)+" {\n ",n+=this.propertiesFromRule(e)+"\n}\n\n";else if(e.type===CSSRule.MEDIA_RULE)n+="@media "+e.media.mediaText+" {\n",n+=this.scopeRules(e.cssRules,t),n+="\n}\n\n";else try{e.cssText&&(n+=e.cssText+"\n\n")}catch(r){e.type===CSSRule.KEYFRAMES_RULE&&e.cssRules&&(n+=this.ieSafeCssTextFromKeyFrameRule(e))}},this),n},ieSafeCssTextFromKeyFrameRule:function(e){var t="@keyframes "+e.name+" {";return Array.prototype.forEach.call(e.cssRules,function(e){t+=" "+e.keyText+" {"+e.style.cssText+"}"}),t+=" }"},scopeSelector:function(e,t,n){var r=[],o=e.split(",");return o.forEach(function(e){e=e.trim(),this.selectorNeedsScoping(e,t)&&(e=n&&!e.match(O)?this.applyStrictSelectorScope(e,t):this.applySelectorScope(e,t)),r.push(e)},this),r.join(", ")},selectorNeedsScoping:function(e,t){if(Array.isArray(t))return!0;var n=this.makeScopeMatcher(t);return!e.match(n)},makeScopeMatcher:function(e){return e=e.replace(/\[/g,"\\[").replace(/\]/g,"\\]"),new RegExp("^("+e+")"+S,"m")},applySelectorScope:function(e,t){return Array.isArray(t)?this.applySelectorScopeList(e,t):this.applySimpleSelectorScope(e,t)},applySelectorScopeList:function(e,t){for(var n,r=[],o=0;n=t[o];o++)r.push(this.applySimpleSelectorScope(e,n));return r.join(", ")},applySimpleSelectorScope:function(e,t){return e.match(L)?(e=e.replace(O,t),e.replace(L,t+" ")):t+" "+e},applyStrictSelectorScope:function(e,t){t=t.replace(/\[is=([^\]]*)\]/g,"$1");var n=[" ",">","+","~"],r=e,o="["+t+"]";return n.forEach(function(e){var t=r.split(e);r=t.map(function(e){var t=e.trim().replace(L,"");return t&&n.indexOf(t)<0&&t.indexOf(o)<0&&(e=t.replace(/([^:]*)(:*)(.*)/,"$1"+o+"$2$3")),e}).join(e)}),r},insertPolyfillHostInCssText:function(e){return e.replace(M,b).replace(T,g)},propertiesFromRule:function(e){var t=e.style.cssText;e.style.content&&!e.style.content.match(/['"]+|attr/)&&(t=t.replace(/content:[^;]*;/g,"content: '"+e.style.content+"';"));var n=e.style;for(var r in n)"initial"===n[r]&&(t+=r+": initial; ");return t},replaceTextInStyles:function(e,t){e&&t&&(e instanceof Array||(e=[e]),Array.prototype.forEach.call(e,function(e){e.textContent=t.call(this,e.textContent)},this))},addCssToDocument:function(e,t){e.match("@import")?c(e,t):s(e)}},d=/\/\*[^*]*\*+([^\/*][^*]*\*+)*\//gim,p=/\/\*\s*@polyfill ([^*]*\*+([^\/*][^*]*\*+)*\/)([^{]*?){/gim,h=/polyfill-next-selector[^}]*content\:[\s]*?['"](.*?)['"][;\s]*}([^{]*?){/gim,f=/\/\*\s@polyfill-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,m=/(polyfill-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,w=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^\/*][^*]*\*+)*)\//gim,v=/(polyfill-unscoped-rule)[^}]*(content\:[\s]*['"](.*?)['"])[;\s]*[^}]*}/gim,g="-shadowcsshost",b="-shadowcsscontext",y=")(?:\\(((?:\\([^)(]*\\)|[^)(]*)+?)\\))?([^,{]*)",E=new RegExp("("+g+y,"gim"),_=new RegExp("("+b+y,"gim"),S="([>\\s~+[.,{:][\\s\\S]*)?$",T=/\:host/gim,M=/\:host-context/gim,O=g+"-no-combinator",L=new RegExp(g,"gim"),N=(new RegExp(b,"gim"),[/>>>/g,/::shadow/g,/::content/g,/\/deep\//g,/\/shadow\//g,/\/shadow-deep\//g,/\^\^/g,/\^/g]),C=document.createElement("iframe");C.style.display="none";var j,D=navigator.userAgent.match("Chrome"),H="shim-shadowdom",x="shim-shadowdom-css",R="no-shim";if(window.ShadowDOMPolyfill){s("style { display: none !important; }\n");var I=ShadowDOMPolyfill.wrap(document),P=I.querySelector("head");P.insertBefore(l(),P.childNodes[0]),document.addEventListener("DOMContentLoaded",function(){e.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var t="link[rel=stylesheet]["+H+"]",n="style["+H+"]";HTMLImports.importer.documentPreloadSelectors+=","+t,HTMLImports.importer.importsPreloadSelectors+=","+t,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,t,n].join(",");var r=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(e){if(!e[x]){var t=e.__importElement||e;if(!t.hasAttribute(H))return void r.call(this,e);e.__resource&&(t=e.ownerDocument.createElement("style"),t.textContent=e.__resource),HTMLImports.path.resolveUrlsInStyle(t,e.href),t.textContent=u.shimStyle(t),t.removeAttribute(H,""),t.setAttribute(x,""),t[x]=!0,t.parentNode!==P&&(e.parentNode===P?P.replaceChild(t,e):this.addElementToDocument(t)),t.__importParsed=!0,this.markParsingComplete(e),this.parseNext()}};var o=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(e){return"link"===e.localName&&"stylesheet"===e.rel&&e.hasAttribute(H)?e.__resource:o.call(this,e)}}})}e.ShadowCSS=u}(window.WebComponents)),function(e){window.ShadowDOMPolyfill?(window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}}(window.WebComponents),function(e){"use strict";function t(e){return void 0!==p[e]}function n(){s.call(this),this._isInvalid=!0}function r(e){return""==e&&n.call(this),e.toLowerCase()}function o(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,63,96].indexOf(t)?e:encodeURIComponent(e)}function i(e){var t=e.charCodeAt(0);return t>32&&127>t&&-1==[34,35,60,62,96].indexOf(t)?e:encodeURIComponent(e)}function a(e,a,s){function c(e){b.push(e)}var l=a||"scheme start",u=0,d="",v=!1,g=!1,b=[];e:for(;(e[u-1]!=f||0==u)&&!this._isInvalid;){var y=e[u];switch(l){case"scheme start":if(!y||!m.test(y)){if(a){c("Invalid scheme.");break e}d="",l="no scheme";continue}d+=y.toLowerCase(),l="scheme";break;case"scheme":if(y&&w.test(y))d+=y.toLowerCase();else{if(":"!=y){if(a){if(f==y)break e;c("Code point not allowed in scheme: "+y);break e}d="",u=0,l="no scheme";continue}if(this._scheme=d,d="",a)break e;t(this._scheme)&&(this._isRelative=!0),l="file"==this._scheme?"relative":this._isRelative&&s&&s._scheme==this._scheme?"relative or authority":this._isRelative?"authority first slash":"scheme data"}break;case"scheme data":"?"==y?(this._query="?",l="query"):"#"==y?(this._fragment="#",l="fragment"):f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._schemeData+=o(y));break;case"no scheme":if(s&&t(s._scheme)){l="relative";continue}c("Missing scheme."),n.call(this);break;case"relative or authority":if("/"!=y||"/"!=e[u+1]){c("Expected /, got: "+y),l="relative";continue}l="authority ignore slashes";break;case"relative":if(this._isRelative=!0,"file"!=this._scheme&&(this._scheme=s._scheme),f==y){this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._username=s._username,this._password=s._password;break e}if("/"==y||"\\"==y)"\\"==y&&c("\\ is an invalid code point."),l="relative slash";else if("?"==y)this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query="?",this._username=s._username,this._password=s._password,l="query";else{if("#"!=y){var E=e[u+1],_=e[u+2];("file"!=this._scheme||!m.test(y)||":"!=E&&"|"!=E||f!=_&&"/"!=_&&"\\"!=_&&"?"!=_&&"#"!=_)&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password,this._path=s._path.slice(),this._path.pop()),l="relative path";continue}this._host=s._host,this._port=s._port,this._path=s._path.slice(),this._query=s._query,this._fragment="#",this._username=s._username,this._password=s._password,l="fragment"}break;case"relative slash":if("/"!=y&&"\\"!=y){"file"!=this._scheme&&(this._host=s._host,this._port=s._port,this._username=s._username,this._password=s._password),l="relative path";continue}"\\"==y&&c("\\ is an invalid code point."),l="file"==this._scheme?"file host":"authority ignore slashes";break;case"authority first slash":if("/"!=y){c("Expected '/', got: "+y),l="authority ignore slashes";continue}l="authority second slash";break;case"authority second slash":if(l="authority ignore slashes","/"!=y){c("Expected '/', got: "+y);continue}break;case"authority ignore slashes":if("/"!=y&&"\\"!=y){l="authority";continue}c("Expected authority, got: "+y);break;case"authority":if("@"==y){v&&(c("@ already seen."),d+="%40"),v=!0;for(var S=0;S<d.length;S++){var T=d[S];if(" "!=T&&"\n"!=T&&"\r"!=T)if(":"!=T||null!==this._password){var M=o(T);null!==this._password?this._password+=M:this._username+=M}else this._password="";else c("Invalid whitespace in authority.")}d=""}else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){u-=d.length,d="",l="host";continue}d+=y}break;case"file host":if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){2!=d.length||!m.test(d[0])||":"!=d[1]&&"|"!=d[1]?0==d.length?l="relative path start":(this._host=r.call(this,d),d="",l="relative path start"):l="relative path";continue}" "==y||"\n"==y||"\r"==y?c("Invalid whitespace in file host."):d+=y;break;case"host":case"hostname":if(":"!=y||g){if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y){if(this._host=r.call(this,d),d="",l="relative path start",a)break e;continue}" "!=y&&"\n"!=y&&"\r"!=y?("["==y?g=!0:"]"==y&&(g=!1),d+=y):c("Invalid code point in host/hostname: "+y)}else if(this._host=r.call(this,d),d="",l="port","hostname"==a)break e;break;case"port":if(/[0-9]/.test(y))d+=y;else{if(f==y||"/"==y||"\\"==y||"?"==y||"#"==y||a){if(""!=d){var O=parseInt(d,10);O!=p[this._scheme]&&(this._port=O+""),d=""}if(a)break e;l="relative path start";continue}" "==y||"\n"==y||"\r"==y?c("Invalid code point in port: "+y):n.call(this)}break;case"relative path start":if("\\"==y&&c("'\\' not allowed in path."),l="relative path","/"!=y&&"\\"!=y)continue;break;case"relative path":if(f!=y&&"/"!=y&&"\\"!=y&&(a||"?"!=y&&"#"!=y))" "!=y&&"\n"!=y&&"\r"!=y&&(d+=o(y));else{"\\"==y&&c("\\ not allowed in relative path.");var L;(L=h[d.toLowerCase()])&&(d=L),".."==d?(this._path.pop(),"/"!=y&&"\\"!=y&&this._path.push("")):"."==d&&"/"!=y&&"\\"!=y?this._path.push(""):"."!=d&&("file"==this._scheme&&0==this._path.length&&2==d.length&&m.test(d[0])&&"|"==d[1]&&(d=d[0]+":"),this._path.push(d)),d="","?"==y?(this._query="?",l="query"):"#"==y&&(this._fragment="#",l="fragment")}break;case"query":a||"#"!=y?f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._query+=i(y)):(this._fragment="#",l="fragment");break;case"fragment":f!=y&&" "!=y&&"\n"!=y&&"\r"!=y&&(this._fragment+=y)}u++}}function s(){this._scheme="",this._schemeData="",this._username="",this._password=null,this._host="",this._port="",this._path=[],this._query="",this._fragment="",this._isInvalid=!1,this._isRelative=!1}function c(e,t){void 0===t||t instanceof c||(t=new c(String(t))),this._url=e,s.call(this);var n=e.replace(/^[ \t\r\n\f]+|[ \t\r\n\f]+$/g,"");a.call(this,n,null,t)}var l=!1;if(!e.forceJURL)try{var u=new URL("b","http://a");u.pathname="c%20d",l="http://a/c%20d"===u.href}catch(d){}if(!l){var p=Object.create(null);p.ftp=21,p.file=0,p.gopher=70,p.http=80,p.https=443,p.ws=80,p.wss=443;var h=Object.create(null);h["%2e"]=".",h[".%2e"]="..",h["%2e."]="..",h["%2e%2e"]="..";var f=void 0,m=/[a-zA-Z]/,w=/[a-zA-Z0-9\+\-\.]/;c.prototype={toString:function(){return this.href},get href(){if(this._isInvalid)return this._url;var e="";return""==this._username&&null==this._password||(e=this._username+(null!=this._password?":"+this._password:"")+"@"),this.protocol+(this._isRelative?"//"+e+this.host:"")+this.pathname+this._query+this._fragment},set href(e){s.call(this),a.call(this,e)},get protocol(){return this._scheme+":"},set protocol(e){this._isInvalid||a.call(this,e+":","scheme start")},get host(){return this._isInvalid?"":this._port?this._host+":"+this._port:this._host},set host(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"host")},get hostname(){return this._host},set hostname(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"hostname")},get port(){return this._port},set port(e){!this._isInvalid&&this._isRelative&&a.call(this,e,"port")},get pathname(){return this._isInvalid?"":this._isRelative?"/"+this._path.join("/"):this._schemeData},set pathname(e){!this._isInvalid&&this._isRelative&&(this._path=[],a.call(this,e,"relative path start"))},get search(){return this._isInvalid||!this._query||"?"==this._query?"":this._query},set search(e){!this._isInvalid&&this._isRelative&&(this._query="?","?"==e[0]&&(e=e.slice(1)),a.call(this,e,"query"))},get hash(){return this._isInvalid||!this._fragment||"#"==this._fragment?"":this._fragment},set hash(e){this._isInvalid||(this._fragment="#","#"==e[0]&&(e=e.slice(1)),a.call(this,e,"fragment"))},get origin(){var e;if(this._isInvalid||!this._scheme)return"";switch(this._scheme){case"data":case"file":case"javascript":case"mailto":return"null"}return e=this.host,e?this._scheme+"://"+e:""}};var v=e.URL;v&&(c.createObjectURL=function(e){return v.createObjectURL.apply(v,arguments)},c.revokeObjectURL=function(e){v.revokeObjectURL(e)}),e.URL=c}}(self),function(e){function t(e){y.push(e),b||(b=!0,m(r))}function n(e){return window.ShadowDOMPolyfill&&window.ShadowDOMPolyfill.wrapIfNeeded(e)||e}function r(){b=!1;var e=y;y=[],e.sort(function(e,t){return e.uid_-t.uid_});var t=!1;e.forEach(function(e){var n=e.takeRecords();o(e),n.length&&(e.callback_(n,e),t=!0)}),t&&r()}function o(e){e.nodes_.forEach(function(t){var n=w.get(t);n&&n.forEach(function(t){t.observer===e&&t.removeTransientObservers()})})}function i(e,t){for(var n=e;n;n=n.parentNode){var r=w.get(n);if(r)for(var o=0;o<r.length;o++){var i=r[o],a=i.options;if(n===e||a.subtree){var s=t(a);s&&i.enqueue(s)}}}}function a(e){this.callback_=e,this.nodes_=[],this.records_=[],this.uid_=++E}function s(e,t){this.type=e,this.target=t,this.addedNodes=[],this.removedNodes=[],this.previousSibling=null,this.nextSibling=null,this.attributeName=null,this.attributeNamespace=null,this.oldValue=null}function c(e){var t=new s(e.type,e.target);return t.addedNodes=e.addedNodes.slice(),t.removedNodes=e.removedNodes.slice(),t.previousSibling=e.previousSibling,t.nextSibling=e.nextSibling,t.attributeName=e.attributeName,t.attributeNamespace=e.attributeNamespace,t.oldValue=e.oldValue,t}function l(e,t){return _=new s(e,t)}function u(e){return S?S:(S=c(_),S.oldValue=e,S)}function d(){_=S=void 0}function p(e){return e===S||e===_}function h(e,t){return e===t?e:S&&p(e)?S:null}function f(e,t,n){this.observer=e,this.target=t,this.options=n,this.transientObservedNodes=[]}if(!e.JsMutationObserver){var m,w=new WeakMap;if(/Trident|Edge/.test(navigator.userAgent))m=setTimeout;else if(window.setImmediate)m=window.setImmediate;else{var v=[],g=String(Math.random());window.addEventListener("message",function(e){if(e.data===g){var t=v;v=[],t.forEach(function(e){e()})}}),m=function(e){v.push(e),window.postMessage(g,"*")}}var b=!1,y=[],E=0;a.prototype={observe:function(e,t){if(e=n(e),!t.childList&&!t.attributes&&!t.characterData||t.attributeOldValue&&!t.attributes||t.attributeFilter&&t.attributeFilter.length&&!t.attributes||t.characterDataOldValue&&!t.characterData)throw new SyntaxError;var r=w.get(e);r||w.set(e,r=[]);for(var o,i=0;i<r.length;i++)if(r[i].observer===this){o=r[i],o.removeListeners(),o.options=t;break}o||(o=new f(this,e,t),r.push(o),this.nodes_.push(e)),o.addListeners()},disconnect:function(){this.nodes_.forEach(function(e){for(var t=w.get(e),n=0;n<t.length;n++){var r=t[n];if(r.observer===this){r.removeListeners(),t.splice(n,1);break}}},this),this.records_=[]},takeRecords:function(){var e=this.records_;return this.records_=[],e}};var _,S;f.prototype={enqueue:function(e){var n=this.observer.records_,r=n.length;if(n.length>0){var o=n[r-1],i=h(o,e);if(i)return void(n[r-1]=i)}else t(this.observer);n[r]=e},addListeners:function(){this.addListeners_(this.target)},addListeners_:function(e){var t=this.options;t.attributes&&e.addEventListener("DOMAttrModified",this,!0),t.characterData&&e.addEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.addEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.addEventListener("DOMNodeRemoved",this,!0)},removeListeners:function(){this.removeListeners_(this.target)},removeListeners_:function(e){var t=this.options;t.attributes&&e.removeEventListener("DOMAttrModified",this,!0),t.characterData&&e.removeEventListener("DOMCharacterDataModified",this,!0),t.childList&&e.removeEventListener("DOMNodeInserted",this,!0),(t.childList||t.subtree)&&e.removeEventListener("DOMNodeRemoved",this,!0)},addTransientObserver:function(e){if(e!==this.target){this.addListeners_(e),this.transientObservedNodes.push(e);var t=w.get(e);t||w.set(e,t=[]),t.push(this)}},removeTransientObservers:function(){var e=this.transientObservedNodes;this.transientObservedNodes=[],e.forEach(function(e){this.removeListeners_(e);for(var t=w.get(e),n=0;n<t.length;n++)if(t[n]===this){t.splice(n,1);break}},this)},handleEvent:function(e){switch(e.stopImmediatePropagation(),e.type){case"DOMAttrModified":var t=e.attrName,n=e.relatedNode.namespaceURI,r=e.target,o=new l("attributes",r);o.attributeName=t,o.attributeNamespace=n;var a=e.attrChange===MutationEvent.ADDITION?null:e.prevValue;i(r,function(e){return!e.attributes||e.attributeFilter&&e.attributeFilter.length&&-1===e.attributeFilter.indexOf(t)&&-1===e.attributeFilter.indexOf(n)?void 0:e.attributeOldValue?u(a):o});break;case"DOMCharacterDataModified":var r=e.target,o=l("characterData",r),a=e.prevValue;i(r,function(e){return e.characterData?e.characterDataOldValue?u(a):o:void 0});break;case"DOMNodeRemoved":this.addTransientObserver(e.target);case"DOMNodeInserted":var s,c,p=e.target;"DOMNodeInserted"===e.type?(s=[p],c=[]):(s=[],c=[p]);var h=p.previousSibling,f=p.nextSibling,o=l("childList",e.target.parentNode);o.addedNodes=s,o.removedNodes=c,o.previousSibling=h,o.nextSibling=f,i(e.relatedNode,function(e){return e.childList?o:void 0})}d()}},e.JsMutationObserver=a,e.MutationObserver||(e.MutationObserver=a,a._isPolyfilled=!0)}}(self),function(e){"use strict";if(!window.performance){var t=Date.now();window.performance={now:function(){return Date.now()-t}}}window.requestAnimationFrame||(window.requestAnimationFrame=function(){var e=window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame;return e?function(t){return e(function(){t(performance.now())})}:function(e){return window.setTimeout(e,1e3/60)}}()),window.cancelAnimationFrame||(window.cancelAnimationFrame=function(){return window.webkitCancelAnimationFrame||window.mozCancelAnimationFrame||function(e){clearTimeout(e)}}());var n=function(){var e=document.createEvent("Event");return e.initEvent("foo",!0,!0),e.preventDefault(),e.defaultPrevented}();if(!n){var r=Event.prototype.preventDefault;Event.prototype.preventDefault=function(){this.cancelable&&(r.call(this),Object.defineProperty(this,"defaultPrevented",{get:function(){return!0},configurable:!0}))}}var o=/Trident/.test(navigator.userAgent);if((!window.CustomEvent||o&&"function"!=typeof window.CustomEvent)&&(window.CustomEvent=function(e,t){t=t||{};var n=document.createEvent("CustomEvent");return n.initCustomEvent(e,Boolean(t.bubbles),Boolean(t.cancelable),t.detail),n},window.CustomEvent.prototype=window.Event.prototype),!window.Event||o&&"function"!=typeof window.Event){var i=window.Event;window.Event=function(e,t){t=t||{};var n=document.createEvent("Event");return n.initEvent(e,Boolean(t.bubbles),Boolean(t.cancelable)),n},window.Event.prototype=i.prototype}}(window.WebComponents),window.HTMLImports=window.HTMLImports||{flags:{}},function(e){function t(e,t){t=t||f,r(function(){i(e,t)},t)}function n(e){return"complete"===e.readyState||e.readyState===v}function r(e,t){if(n(t))e&&e();else{var o=function(){"complete"!==t.readyState&&t.readyState!==v||(t.removeEventListener(g,o),r(e,t))};t.addEventListener(g,o)}}function o(e){e.target.__loaded=!0}function i(e,t){function n(){c==l&&e&&e({allImports:s,loadedImports:u,errorImports:d})}function r(e){o(e),u.push(this),c++,n()}function i(e){d.push(this),c++,n()}var s=t.querySelectorAll("link[rel=import]"),c=0,l=s.length,u=[],d=[];
14 if(l)for(var p,h=0;l>h&&(p=s[h]);h++)a(p)?(u.push(this),c++,n()):(p.addEventListener("load",r),p.addEventListener("error",i));else n()}function a(e){return d?e.__loaded||e["import"]&&"loading"!==e["import"].readyState:e.__importParsed}function s(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)c(t)&&l(t)}function c(e){return"link"===e.localName&&"import"===e.rel}function l(e){var t=e["import"];t?o({target:e}):(e.addEventListener("load",o),e.addEventListener("error",o))}var u="import",d=Boolean(u in document.createElement("link")),p=Boolean(window.ShadowDOMPolyfill),h=function(e){return p?window.ShadowDOMPolyfill.wrapIfNeeded(e):e},f=h(document),m={get:function(){var e=window.HTMLImports.currentScript||document.currentScript||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null);return h(e)},configurable:!0};Object.defineProperty(document,"_currentScript",m),Object.defineProperty(f,"_currentScript",m);var w=/Trident/.test(navigator.userAgent),v=w?"complete":"interactive",g="readystatechange";d&&(new MutationObserver(function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.addedNodes&&s(t.addedNodes)}).observe(document.head,{childList:!0}),function(){if("loading"===document.readyState)for(var e,t=document.querySelectorAll("link[rel=import]"),n=0,r=t.length;r>n&&(e=t[n]);n++)l(e)}()),t(function(e){window.HTMLImports.ready=!0,window.HTMLImports.readyTime=(new Date).getTime();var t=f.createEvent("CustomEvent");t.initCustomEvent("HTMLImportsLoaded",!0,!0,e),f.dispatchEvent(t)}),e.IMPORT_LINK_TYPE=u,e.useNative=d,e.rootDocument=f,e.whenReady=t,e.isIE=w}(window.HTMLImports),function(e){var t=[],n=function(e){t.push(e)},r=function(){t.forEach(function(t){t(e)})};e.addModule=n,e.initializeModules=r}(window.HTMLImports),window.HTMLImports.addModule(function(e){var t=/(url\()([^)]*)(\))/g,n=/(@import[\s]+(?!url\())([^;]*)(;)/g,r={resolveUrlsInStyle:function(e,t){var n=e.ownerDocument,r=n.createElement("a");return e.textContent=this.resolveUrlsInCssText(e.textContent,t,r),e},resolveUrlsInCssText:function(e,r,o){var i=this.replaceUrls(e,o,r,t);return i=this.replaceUrls(i,o,r,n)},replaceUrls:function(e,t,n,r){return e.replace(r,function(e,r,o,i){var a=o.replace(/["']/g,"");return n&&(a=new URL(a,n).href),t.href=a,a=t.href,r+"'"+a+"'"+i})}};e.path=r}),window.HTMLImports.addModule(function(e){var t={async:!0,ok:function(e){return e.status>=200&&e.status<300||304===e.status||0===e.status},load:function(n,r,o){var i=new XMLHttpRequest;return(e.flags.debug||e.flags.bust)&&(n+="?"+Math.random()),i.open("GET",n,t.async),i.addEventListener("readystatechange",function(e){if(4===i.readyState){var n=null;try{var a=i.getResponseHeader("Location");a&&(n="/"===a.substr(0,1)?location.origin+a:a)}catch(e){console.error(e.message)}r.call(o,!t.ok(i)&&i,i.response||i.responseText,n)}}),i.send(),i},loadDocument:function(e,t,n){this.load(e,t,n).responseType="document"}};e.xhr=t}),window.HTMLImports.addModule(function(e){var t=e.xhr,n=e.flags,r=function(e,t){this.cache={},this.onload=e,this.oncomplete=t,this.inflight=0,this.pending={}};r.prototype={addNodes:function(e){this.inflight+=e.length;for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)this.require(t);this.checkDone()},addNode:function(e){this.inflight++,this.require(e),this.checkDone()},require:function(e){var t=e.src||e.href;e.__nodeUrl=t,this.dedupe(t,e)||this.fetch(t,e)},dedupe:function(e,t){if(this.pending[e])return this.pending[e].push(t),!0;return this.cache[e]?(this.onload(e,t,this.cache[e]),this.tail(),!0):(this.pending[e]=[t],!1)},fetch:function(e,r){if(n.load&&console.log("fetch",e,r),e)if(e.match(/^data:/)){var o=e.split(","),i=o[0],a=o[1];a=i.indexOf(";base64")>-1?atob(a):decodeURIComponent(a),setTimeout(function(){this.receive(e,r,null,a)}.bind(this),0)}else{var s=function(t,n,o){this.receive(e,r,t,n,o)}.bind(this);t.load(e,s)}else setTimeout(function(){this.receive(e,r,{error:"href must be specified"},null)}.bind(this),0)},receive:function(e,t,n,r,o){this.cache[e]=r;for(var i,a=this.pending[e],s=0,c=a.length;c>s&&(i=a[s]);s++)this.onload(e,i,r,n,o),this.tail();this.pending[e]=null},tail:function(){--this.inflight,this.checkDone()},checkDone:function(){this.inflight||this.oncomplete()}},e.Loader=r}),window.HTMLImports.addModule(function(e){var t=function(e){this.addCallback=e,this.mo=new MutationObserver(this.handler.bind(this))};t.prototype={handler:function(e){for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)"childList"===t.type&&t.addedNodes.length&&this.addedNodes(t.addedNodes)},addedNodes:function(e){this.addCallback&&this.addCallback(e);for(var t,n=0,r=e.length;r>n&&(t=e[n]);n++)t.children&&t.children.length&&this.addedNodes(t.children)},observe:function(e){this.mo.observe(e,{childList:!0,subtree:!0})}},e.Observer=t}),window.HTMLImports.addModule(function(e){function t(e){return"link"===e.localName&&e.rel===u}function n(e){var t=r(e);return"data:text/javascript;charset=utf-8,"+encodeURIComponent(t)}function r(e){return e.textContent+o(e)}function o(e){var t=e.ownerDocument;t.__importedScripts=t.__importedScripts||0;var n=e.ownerDocument.baseURI,r=t.__importedScripts?"-"+t.__importedScripts:"";return t.__importedScripts++,"\n//# sourceURL="+n+r+".js\n"}function i(e){var t=e.ownerDocument.createElement("style");return t.textContent=e.textContent,a.resolveUrlsInStyle(t),t}var a=e.path,s=e.rootDocument,c=e.flags,l=e.isIE,u=e.IMPORT_LINK_TYPE,d="link[rel="+u+"]",p={documentSelectors:d,importsSelectors:[d,"link[rel=stylesheet]:not([type])","style:not([type])","script:not([type])",'script[type="application/javascript"]','script[type="text/javascript"]'].join(","),map:{link:"parseLink",script:"parseScript",style:"parseStyle"},dynamicElements:[],parseNext:function(){var e=this.nextToParse();e&&this.parse(e)},parse:function(e){if(this.isParsed(e))return void(c.parse&&console.log("[%s] is already parsed",e.localName));var t=this[this.map[e.localName]];t&&(this.markParsing(e),t.call(this,e))},parseDynamic:function(e,t){this.dynamicElements.push(e),t||this.parseNext()},markParsing:function(e){c.parse&&console.log("parsing",e),this.parsingElement=e},markParsingComplete:function(e){e.__importParsed=!0,this.markDynamicParsingComplete(e),e.__importElement&&(e.__importElement.__importParsed=!0,this.markDynamicParsingComplete(e.__importElement)),this.parsingElement=null,c.parse&&console.log("completed",e)},markDynamicParsingComplete:function(e){var t=this.dynamicElements.indexOf(e);t>=0&&this.dynamicElements.splice(t,1)},parseImport:function(e){if(e["import"]=e.__doc,window.HTMLImports.__importsParsingHook&&window.HTMLImports.__importsParsingHook(e),e["import"]&&(e["import"].__importParsed=!0),this.markParsingComplete(e),e.__resource&&!e.__error?e.dispatchEvent(new CustomEvent("load",{bubbles:!1})):e.dispatchEvent(new CustomEvent("error",{bubbles:!1})),e.__pending)for(var t;e.__pending.length;)t=e.__pending.shift(),t&&t({target:e});this.parseNext()},parseLink:function(e){t(e)?this.parseImport(e):(e.href=e.href,this.parseGeneric(e))},parseStyle:function(e){var t=e;e=i(e),t.__appliedElement=e,e.__importElement=t,this.parseGeneric(e)},parseGeneric:function(e){this.trackElement(e),this.addElementToDocument(e)},rootImportForElement:function(e){for(var t=e;t.ownerDocument.__importLink;)t=t.ownerDocument.__importLink;return t},addElementToDocument:function(e){var t=this.rootImportForElement(e.__importElement||e);t.parentNode.insertBefore(e,t)},trackElement:function(e,t){var n=this,r=function(o){e.removeEventListener("load",r),e.removeEventListener("error",r),t&&t(o),n.markParsingComplete(e),n.parseNext()};if(e.addEventListener("load",r),e.addEventListener("error",r),l&&"style"===e.localName){var o=!1;if(-1==e.textContent.indexOf("@import"))o=!0;else if(e.sheet){o=!0;for(var i,a=e.sheet.cssRules,s=a?a.length:0,c=0;s>c&&(i=a[c]);c++)i.type===CSSRule.IMPORT_RULE&&(o=o&&Boolean(i.styleSheet))}o&&setTimeout(function(){e.dispatchEvent(new CustomEvent("load",{bubbles:!1}))})}},parseScript:function(t){var r=document.createElement("script");r.__importElement=t,r.src=t.src?t.src:n(t),e.currentScript=t,this.trackElement(r,function(t){r.parentNode&&r.parentNode.removeChild(r),e.currentScript=null}),this.addElementToDocument(r)},nextToParse:function(){return this._mayParse=[],!this.parsingElement&&(this.nextToParseInDoc(s)||this.nextToParseDynamic())},nextToParseInDoc:function(e,n){if(e&&this._mayParse.indexOf(e)<0){this._mayParse.push(e);for(var r,o=e.querySelectorAll(this.parseSelectorsForNode(e)),i=0,a=o.length;a>i&&(r=o[i]);i++)if(!this.isParsed(r))return this.hasResource(r)?t(r)?this.nextToParseInDoc(r.__doc,r):r:void 0}return n},nextToParseDynamic:function(){return this.dynamicElements[0]},parseSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===s?this.documentSelectors:this.importsSelectors},isParsed:function(e){return e.__importParsed},needsDynamicParsing:function(e){return this.dynamicElements.indexOf(e)>=0},hasResource:function(e){return!t(e)||void 0!==e.__doc}};e.parser=p,e.IMPORT_SELECTOR=d}),window.HTMLImports.addModule(function(e){function t(e){return n(e,a)}function n(e,t){return"link"===e.localName&&e.getAttribute("rel")===t}function r(e){return!!Object.getOwnPropertyDescriptor(e,"baseURI")}function o(e,t){var n=document.implementation.createHTMLDocument(a);n._URL=t;var o=n.createElement("base");o.setAttribute("href",t),n.baseURI||r(n)||Object.defineProperty(n,"baseURI",{value:t});var i=n.createElement("meta");return i.setAttribute("charset","utf-8"),n.head.appendChild(i),n.head.appendChild(o),n.body.innerHTML=e,window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(n),n}var i=e.flags,a=e.IMPORT_LINK_TYPE,s=e.IMPORT_SELECTOR,c=e.rootDocument,l=e.Loader,u=e.Observer,d=e.parser,p={documents:{},documentPreloadSelectors:s,importsPreloadSelectors:[s].join(","),loadNode:function(e){h.addNode(e)},loadSubtree:function(e){var t=this.marshalNodes(e);h.addNodes(t)},marshalNodes:function(e){return e.querySelectorAll(this.loadSelectorsForNode(e))},loadSelectorsForNode:function(e){var t=e.ownerDocument||e;return t===c?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(e,n,r,a,s){if(i.load&&console.log("loaded",e,n),n.__resource=r,n.__error=a,t(n)){var c=this.documents[e];void 0===c&&(c=a?null:o(r,s||e),c&&(c.__importLink=n,this.bootDocument(c)),this.documents[e]=c),n.__doc=c}d.parseNext()},bootDocument:function(e){this.loadSubtree(e),this.observer.observe(e),d.parseNext()},loadedAll:function(){d.parseNext()}},h=new l(p.loaded.bind(p),p.loadedAll.bind(p));if(p.observer=new u,!document.baseURI){var f={get:function(){var e=document.querySelector("base");return e?e.href:window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",f),Object.defineProperty(c,"baseURI",f)}e.importer=p,e.importLoader=h}),window.HTMLImports.addModule(function(e){var t=e.parser,n=e.importer,r={added:function(e){for(var r,o,i,a,s=0,c=e.length;c>s&&(a=e[s]);s++)r||(r=a.ownerDocument,o=t.isParsed(r)),i=this.shouldLoadNode(a),i&&n.loadNode(a),this.shouldParseNode(a)&&o&&t.parseDynamic(a,i)},shouldLoadNode:function(e){return 1===e.nodeType&&o.call(e,n.loadSelectorsForNode(e))},shouldParseNode:function(e){return 1===e.nodeType&&o.call(e,t.parseSelectorsForNode(e))}};n.observer.addCallback=r.added.bind(r);var o=HTMLElement.prototype.matches||HTMLElement.prototype.matchesSelector||HTMLElement.prototype.webkitMatchesSelector||HTMLElement.prototype.mozMatchesSelector||HTMLElement.prototype.msMatchesSelector}),function(e){function t(){window.HTMLImports.importer.bootDocument(r)}var n=e.initializeModules;e.isIE;if(!e.useNative){n();var r=e.rootDocument;"complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?t():document.addEventListener("DOMContentLoaded",t)}}(window.HTMLImports),window.CustomElements=window.CustomElements||{flags:{}},function(e){var t=e.flags,n=[],r=function(e){n.push(e)},o=function(){n.forEach(function(t){t(e)})};e.addModule=r,e.initializeModules=o,e.hasNative=Boolean(document.registerElement),e.isIE=/Trident/.test(navigator.userAgent),e.useNative=!t.register&&e.hasNative&&!window.ShadowDOMPolyfill&&(!window.HTMLImports||window.HTMLImports.useNative)}(window.CustomElements),window.CustomElements.addModule(function(e){function t(e,t){n(e,function(e){return t(e)?!0:void r(e,t)}),r(e,t)}function n(e,t,r){var o=e.firstElementChild;if(!o)for(o=e.firstChild;o&&o.nodeType!==Node.ELEMENT_NODE;)o=o.nextSibling;for(;o;)t(o,r)!==!0&&n(o,t,r),o=o.nextElementSibling;return null}function r(e,n){for(var r=e.shadowRoot;r;)t(r,n),r=r.olderShadowRoot}function o(e,t){i(e,t,[])}function i(e,t,n){if(e=window.wrap(e),!(n.indexOf(e)>=0)){n.push(e);for(var r,o=e.querySelectorAll("link[rel="+a+"]"),s=0,c=o.length;c>s&&(r=o[s]);s++)r["import"]&&i(r["import"],t,n);t(e)}}var a=window.HTMLImports?window.HTMLImports.IMPORT_LINK_TYPE:"none";e.forDocumentTree=o,e.forSubtree=t}),window.CustomElements.addModule(function(e){function t(e,t){return n(e,t)||r(e,t)}function n(t,n){return e.upgrade(t,n)?!0:void(n&&a(t))}function r(e,t){b(e,function(e){return n(e,t)?!0:void 0})}function o(e){S.push(e),_||(_=!0,setTimeout(i))}function i(){_=!1;for(var e,t=S,n=0,r=t.length;r>n&&(e=t[n]);n++)e();S=[]}function a(e){E?o(function(){s(e)}):s(e)}function s(e){e.__upgraded__&&!e.__attached&&(e.__attached=!0,e.attachedCallback&&e.attachedCallback())}function c(e){l(e),b(e,function(e){l(e)})}function l(e){E?o(function(){u(e)}):u(e)}function u(e){e.__upgraded__&&e.__attached&&(e.__attached=!1,e.detachedCallback&&e.detachedCallback())}function d(e){for(var t=e,n=window.wrap(document);t;){if(t==n)return!0;t=t.parentNode||t.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&t.host}}function p(e){if(e.shadowRoot&&!e.shadowRoot.__watched){g.dom&&console.log("watching shadow-root for: ",e.localName);for(var t=e.shadowRoot;t;)m(t),t=t.olderShadowRoot}}function h(e,n){if(g.dom){var r=n[0];if(r&&"childList"===r.type&&r.addedNodes&&r.addedNodes){for(var o=r.addedNodes[0];o&&o!==document&&!o.host;)o=o.parentNode;var i=o&&(o.URL||o._URL||o.host&&o.host.localName)||"";i=i.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",n.length,i||"")}var a=d(e);n.forEach(function(e){"childList"===e.type&&(T(e.addedNodes,function(e){e.localName&&t(e,a)}),T(e.removedNodes,function(e){e.localName&&c(e)}))}),g.dom&&console.groupEnd()}function f(e){for(e=window.wrap(e),e||(e=window.wrap(document));e.parentNode;)e=e.parentNode;var t=e.__observer;t&&(h(e,t.takeRecords()),i())}function m(e){if(!e.__observer){var t=new MutationObserver(h.bind(this,e));t.observe(e,{childList:!0,subtree:!0}),e.__observer=t}}function w(e){e=window.wrap(e),g.dom&&console.group("upgradeDocument: ",e.baseURI.split("/").pop());var n=e===window.wrap(document);t(e,n),m(e),g.dom&&console.groupEnd()}function v(e){y(e,w)}var g=e.flags,b=e.forSubtree,y=e.forDocumentTree,E=window.MutationObserver._isPolyfilled&&g["throttle-attached"];e.hasPolyfillMutations=E,e.hasThrottledAttached=E;var _=!1,S=[],T=Array.prototype.forEach.call.bind(Array.prototype.forEach),M=Element.prototype.createShadowRoot;M&&(Element.prototype.createShadowRoot=function(){var e=M.call(this);return window.CustomElements.watchShadow(this),e}),e.watchShadow=p,e.upgradeDocumentTree=v,e.upgradeDocument=w,e.upgradeSubtree=r,e.upgradeAll=t,e.attached=a,e.takeRecords=f}),window.CustomElements.addModule(function(e){function t(t,r){if("template"===t.localName&&window.HTMLTemplateElement&&HTMLTemplateElement.decorate&&HTMLTemplateElement.decorate(t),!t.__upgraded__&&t.nodeType===Node.ELEMENT_NODE){var o=t.getAttribute("is"),i=e.getRegisteredDefinition(t.localName)||e.getRegisteredDefinition(o);if(i&&(o&&i.tag==t.localName||!o&&!i["extends"]))return n(t,i,r)}}function n(t,n,o){return a.upgrade&&console.group("upgrade:",t.localName),n.is&&t.setAttribute("is",n.is),r(t,n),t.__upgraded__=!0,i(t),o&&e.attached(t),e.upgradeSubtree(t,o),a.upgrade&&console.groupEnd(),t}function r(e,t){Object.__proto__?e.__proto__=t.prototype:(o(e,t.prototype,t["native"]),e.__proto__=t.prototype)}function o(e,t,n){for(var r={},o=t;o!==n&&o!==HTMLElement.prototype;){for(var i,a=Object.getOwnPropertyNames(o),s=0;i=a[s];s++)r[i]||(Object.defineProperty(e,i,Object.getOwnPropertyDescriptor(o,i)),r[i]=1);o=Object.getPrototypeOf(o)}}function i(e){e.createdCallback&&e.createdCallback()}var a=e.flags;e.upgrade=t,e.upgradeWithDefinition=n,e.implementPrototype=r}),window.CustomElements.addModule(function(e){function t(t,r){var c=r||{};if(!t)throw new Error("document.registerElement: first argument `name` must not be empty");if(t.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(t)+"'.");if(o(t))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(t)+"'. The type name is invalid.");if(l(t))throw new Error("DuplicateDefinitionError: a type with name '"+String(t)+"' is already registered");return c.prototype||(c.prototype=Object.create(HTMLElement.prototype)),c.__name=t.toLowerCase(),c["extends"]&&(c["extends"]=c["extends"].toLowerCase()),c.lifecycle=c.lifecycle||{},c.ancestry=i(c["extends"]),a(c),s(c),n(c.prototype),u(c.__name,c),c.ctor=d(c),c.ctor.prototype=c.prototype,c.prototype.constructor=c.ctor,e.ready&&w(document),c.ctor}function n(e){if(!e.setAttribute._polyfilled){var t=e.setAttribute;e.setAttribute=function(e,n){r.call(this,e,n,t)};var n=e.removeAttribute;e.removeAttribute=function(e){r.call(this,e,null,n)},e.setAttribute._polyfilled=!0}}function r(e,t,n){e=e.toLowerCase();var r=this.getAttribute(e);n.apply(this,arguments);var o=this.getAttribute(e);this.attributeChangedCallback&&o!==r&&this.attributeChangedCallback(e,r,o)}function o(e){for(var t=0;t<E.length;t++)if(e===E[t])return!0}function i(e){var t=l(e);return t?i(t["extends"]).concat([t]):[]}function a(e){for(var t,n=e["extends"],r=0;t=e.ancestry[r];r++)n=t.is&&t.tag;e.tag=n||e.__name,n&&(e.is=e.__name)}function s(e){if(!Object.__proto__){var t=HTMLElement.prototype;if(e.is){var n=document.createElement(e.tag);t=Object.getPrototypeOf(n)}for(var r,o=e.prototype,i=!1;o;)o==t&&(i=!0),r=Object.getPrototypeOf(o),r&&(o.__proto__=r),o=r;i||console.warn(e.tag+" prototype not found in prototype chain for "+e.is),e["native"]=t}}function c(e){return g(T(e.tag),e)}function l(e){return e?_[e.toLowerCase()]:void 0}function u(e,t){_[e]=t}function d(e){return function(){return c(e)}}function p(e,t,n){return e===S?h(t,n):M(e,t)}function h(e,t){e&&(e=e.toLowerCase()),t&&(t=t.toLowerCase());var n=l(t||e);if(n){if(e==n.tag&&t==n.is)return new n.ctor;if(!t&&!n.is)return new n.ctor}var r;return t?(r=h(e),r.setAttribute("is",t),r):(r=T(e),e.indexOf("-")>=0&&b(r,HTMLElement),r)}function f(e,t){var n=e[t];e[t]=function(){var e=n.apply(this,arguments);return v(e),e}}var m,w=(e.isIE,e.upgradeDocumentTree),v=e.upgradeAll,g=e.upgradeWithDefinition,b=e.implementPrototype,y=e.useNative,E=["annotation-xml","color-profile","font-face","font-face-src","font-face-uri","font-face-format","font-face-name","missing-glyph"],_={},S="http://www.w3.org/1999/xhtml",T=document.createElement.bind(document),M=document.createElementNS.bind(document);m=Object.__proto__||y?function(e,t){return e instanceof t}:function(e,t){if(e instanceof t)return!0;for(var n=e;n;){if(n===t.prototype)return!0;n=n.__proto__}return!1},f(Node.prototype,"cloneNode"),f(document,"importNode"),document.registerElement=t,document.createElement=h,document.createElementNS=p,e.registry=_,e["instanceof"]=m,e.reservedTagList=E,e.getRegisteredDefinition=l,document.register=document.registerElement}),function(e){function t(){i(window.wrap(document)),window.CustomElements.ready=!0;var e=window.requestAnimationFrame||function(e){setTimeout(e,16)};e(function(){setTimeout(function(){window.CustomElements.readyTime=Date.now(),window.HTMLImports&&(window.CustomElements.elapsed=window.CustomElements.readyTime-window.HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})})}var n=e.useNative,r=e.initializeModules;e.isIE;if(n){var o=function(){};e.watchShadow=o,e.upgrade=o,e.upgradeAll=o,e.upgradeDocumentTree=o,e.upgradeSubtree=o,e.takeRecords=o,e["instanceof"]=function(e,t){return e instanceof t}}else r();var i=e.upgradeDocumentTree,a=e.upgradeDocument;if(window.wrap||(window.ShadowDOMPolyfill?(window.wrap=window.ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=window.ShadowDOMPolyfill.unwrapIfNeeded):window.wrap=window.unwrap=function(e){return e}),window.HTMLImports&&(window.HTMLImports.__importsParsingHook=function(e){e["import"]&&a(wrap(e["import"]))}),"complete"===document.readyState||e.flags.eager)t();else if("interactive"!==document.readyState||window.attachEvent||window.HTMLImports&&!window.HTMLImports.ready){var s=window.HTMLImports&&!window.HTMLImports.ready?"HTMLImportsLoaded":"DOMContentLoaded";window.addEventListener(s,t)}else t()}(window.CustomElements),function(e){Function.prototype.bind||(Function.prototype.bind=function(e){var t=this,n=Array.prototype.slice.call(arguments,1);return function(){var r=n.slice();return r.push.apply(r,arguments),t.apply(e,r)}})}(window.WebComponents),function(e){var t=document.createElement("style");t.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var n=document.querySelector("head");n.insertBefore(t,n.firstChild)}(window.WebComponents),function(e){window.Platform=e}(window.WebComponents); No newline at end of file
This diff has been collapsed as it changes many lines, (521 lines changed) Show them Hide them
@@ -1,521 +0,0 b''
1 # -*- coding: utf-8 -*-
2
3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 #
5 # This program is free software: you can redistribute it and/or modify
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
8 #
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
13 #
14 # You should have received a copy of the GNU Affero General Public License
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
19 # and proprietary license terms, please see https://rhodecode.com/licenses/
20
21 """
22 Reference example of the rcextensions module.
23
24 This module is also used during integration tests to verify that all showed
25 examples are valid.
26 """
27
28 import collections
29 import os
30 import imp
31
32 here = os.path.dirname(os.path.abspath(__file__))
33
34
35 def load_extension(filename, async=False):
36 """
37 use to load extensions inside rcextension folder.
38 for example::
39
40 callback = load_extension('email.py', async=False)
41 if callback:
42 callback('foobar')
43
44 put file named email.py inside rcextensions folder to load it. Changing
45 async=True will make the call of the plugin async, it's useful for
46 blocking calls like sending an email or notification with APIs.
47 """
48 mod = ''.join(filename.split('.')[:-1])
49 loaded = imp.load_source(mod, os.path.join(here, filename))
50
51 callback = getattr(loaded, 'run', None)
52 if not callback:
53 raise Exception('Plugin missing `run` method')
54 if async:
55 # modify callback so it's actually an async call
56 def _async_callback(*args, **kwargs):
57 import threading
58 thr = threading.Thread(target=callback, args=args, kwargs=kwargs)
59 thr.start()
60 if kwargs.get('_async_block'):
61 del kwargs['_async_block']
62 thr.join()
63
64 return _async_callback
65 return callback
66
67
68 # Additional mappings that are not present in the pygments lexers
69 # used for building stats
70 # format is {'ext':['Names']} eg. {'py':['Python']} note: there can be
71 # more than one name for extension
72 # NOTE: that this will override any mappings in LANGUAGES_EXTENSIONS_MAP
73 # build by pygments
74 EXTRA_MAPPINGS = {}
75
76 # additional lexer definitions for custom files it's overrides pygments lexers,
77 # and uses defined name of lexer to colorize the files. Format is {'ext':
78 # 'lexer_name'} List of lexers can be printed running:
79 # >> python -c "import pprint;from pygments import lexers;
80 # pprint.pprint([(x[0], x[1]) for x in lexers.get_all_lexers()]);"
81
82 EXTRA_LEXERS = {}
83
84
85 calls = collections.defaultdict(list)
86
87
88 def log_call(name):
89 def wrap(f):
90 def wrapper(*args, **kwargs):
91 calls[name].append((args, kwargs))
92 return f(*args, **kwargs)
93 return wrapper
94 return wrap
95
96
97 # =============================================================================
98 # POST CREATE REPOSITORY HOOK
99 # =============================================================================
100 # this function will be executed after each repository is created
101
102
103 def _crrepohook(*args, **kwargs):
104 """
105 Post create repository HOOK
106 kwargs available:
107 :param repo_name:
108 :param repo_type:
109 :param description:
110 :param private:
111 :param created_on:
112 :param enable_downloads:
113 :param repo_id:
114 :param user_id:
115 :param enable_statistics:
116 :param clone_uri:
117 :param fork_id:
118 :param group_id:
119 :param created_by:
120 """
121
122 expected_parameters = (
123 'repo_name', 'repo_type', 'description', 'private', 'created_on',
124 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics',
125 'clone_uri', 'fork_id', 'group_id', 'created_by')
126 _verify_kwargs(expected_parameters, kwargs)
127
128 return 0
129
130 CREATE_REPO_HOOK = _crrepohook
131
132
133 # =============================================================================
134 # POST CREATE REPOSITORY GROUP HOOK
135 # =============================================================================
136 # this function will be executed after each repository group is created
137
138
139 def _crrepogrouphook(*args, **kwargs):
140 """
141 Post create repository group HOOK
142 kwargs available:
143
144 :param group_name:
145 :param group_parent_id:
146 :param group_description:
147 :param group_id:
148 :param user_id:
149 :param created_by:
150 :param created_on:
151 :param enable_locking:
152 """
153
154 expected_parameters = (
155 'group_name', 'group_parent_id', 'group_description',
156 'group_id', 'user_id', 'created_by', 'created_on',
157 'enable_locking')
158 _verify_kwargs(expected_parameters, kwargs)
159
160 return 0
161
162 CREATE_REPO_GROUP_HOOK = _crrepogrouphook
163
164 # =============================================================================
165 # PRE CREATE USER HOOK
166 # =============================================================================
167 # this function will be executed before each user is created
168
169
170 def _pre_cruserhook(*args, **kwargs):
171 """
172 Pre create user HOOK, it returns a tuple of bool, reason.
173 If bool is False the user creation will be stopped and reason
174 will be displayed to the user.
175 kwargs available:
176 :param username:
177 :param password:
178 :param email:
179 :param firstname:
180 :param lastname:
181 :param active:
182 :param admin:
183 :param created_by:
184 """
185
186 expected_parameters = (
187 'username', 'password', 'email', 'firstname', 'lastname', 'active',
188 'admin', 'created_by')
189 _verify_kwargs(expected_parameters, kwargs)
190
191 reason = 'allowed'
192 return True, reason
193 PRE_CREATE_USER_HOOK = _pre_cruserhook
194
195 # =============================================================================
196 # POST CREATE USER HOOK
197 # =============================================================================
198 # this function will be executed after each user is created
199
200
201 def _cruserhook(*args, **kwargs):
202 """
203 Post create user HOOK
204 kwargs available:
205 :param username:
206 :param full_name_or_username:
207 :param full_contact:
208 :param user_id:
209 :param name:
210 :param firstname:
211 :param short_contact:
212 :param admin:
213 :param lastname:
214 :param ip_addresses:
215 :param extern_type:
216 :param extern_name:
217 :param email:
218 :param api_key:
219 :parma api_keys:
220 :param last_login:
221 :param full_name:
222 :param active:
223 :param password:
224 :param emails:
225 :param inherit_default_permissions:
226 :param created_by:
227 :param created_on:
228 """
229
230 expected_parameters = (
231 'username', 'full_name_or_username', 'full_contact', 'user_id',
232 'name', 'firstname', 'short_contact', 'admin', 'lastname',
233 'ip_addresses', 'extern_type', 'extern_name',
234 'email', 'api_key', 'api_keys', 'last_login',
235 'full_name', 'active', 'password', 'emails',
236 'inherit_default_permissions', 'created_by', 'created_on')
237 _verify_kwargs(expected_parameters, kwargs)
238
239 return 0
240 CREATE_USER_HOOK = _cruserhook
241
242
243 # =============================================================================
244 # POST DELETE REPOSITORY HOOK
245 # =============================================================================
246 # this function will be executed after each repository deletion
247
248
249 def _dlrepohook(*args, **kwargs):
250 """
251 Post delete repository HOOK
252 kwargs available:
253 :param repo_name:
254 :param repo_type:
255 :param description:
256 :param private:
257 :param created_on:
258 :param enable_downloads:
259 :param repo_id:
260 :param user_id:
261 :param enable_statistics:
262 :param clone_uri:
263 :param fork_id:
264 :param group_id:
265 :param deleted_by:
266 :param deleted_on:
267 """
268
269 expected_parameters = (
270 'repo_name', 'repo_type', 'description', 'private', 'created_on',
271 'enable_downloads', 'repo_id', 'user_id', 'enable_statistics',
272 'clone_uri', 'fork_id', 'group_id', 'deleted_by', 'deleted_on')
273 _verify_kwargs(expected_parameters, kwargs)
274
275 return 0
276 DELETE_REPO_HOOK = _dlrepohook
277
278
279 # =============================================================================
280 # POST DELETE USER HOOK
281 # =============================================================================
282 # this function will be executed after each user is deleted
283
284
285 def _dluserhook(*args, **kwargs):
286 """
287 Post delete user HOOK
288 kwargs available:
289 :param username:
290 :param full_name_or_username:
291 :param full_contact:
292 :param user_id:
293 :param name:
294 :param firstname:
295 :param short_contact:
296 :param admin:
297 :param lastname:
298 :param ip_addresses:
299 :param ldap_dn:
300 :param email:
301 :param api_key:
302 :param last_login:
303 :param full_name:
304 :param active:
305 :param password:
306 :param emails:
307 :param inherit_default_permissions:
308 :param deleted_by:
309 """
310
311 expected_parameters = (
312 'username', 'full_name_or_username', 'full_contact', 'user_id',
313 'name', 'firstname', 'short_contact', 'admin', 'lastname',
314 'ip_addresses',
315 # TODO: johbo: Check what's the status with the ldap_dn parameter
316 # 'ldap_dn',
317 'email', 'api_key', 'last_login',
318 'full_name', 'active', 'password', 'emails',
319 'inherit_default_permissions', 'deleted_by')
320 _verify_kwargs(expected_parameters, kwargs)
321
322 return 0
323 DELETE_USER_HOOK = _dluserhook
324
325
326 # =============================================================================
327 # PRE PUSH HOOK
328 # =============================================================================
329
330
331 # this function will be executed after each push it's executed after the
332 # build-in hook that RhodeCode uses for logging pushes
333 @log_call('pre_push')
334 def _prepushhook(*args, **kwargs):
335 """
336 Pre push hook
337 kwargs available:
338
339 :param server_url: url of instance that triggered this hook
340 :param config: path to .ini config used
341 :param scm: type of VS 'git' or 'hg'
342 :param username: name of user who pushed
343 :param ip: ip of who pushed
344 :param action: push
345 :param repository: repository name
346 :param repo_store_path: full path to where repositories are stored
347 :param commit_ids: list of pushed commit ids
348 """
349
350 expected_parameters = (
351 'server_url', 'config', 'scm', 'username', 'ip', 'action',
352 'repository', 'repo_store_path', 'commit_ids')
353 _verify_kwargs(expected_parameters, kwargs)
354
355 return 0
356 PRE_PUSH_HOOK = _prepushhook
357
358
359 # =============================================================================
360 # POST PUSH HOOK
361 # =============================================================================
362
363
364 # this function will be executed after each push it's executed after the
365 # build-in hook that RhodeCode uses for logging pushes
366 @log_call('post_push')
367 def _pushhook(*args, **kwargs):
368 """
369 Post push hook
370 kwargs available:
371
372 :param server_url: url of instance that triggered this hook
373 :param config: path to .ini config used
374 :param scm: type of VS 'git' or 'hg'
375 :param username: name of user who pushed
376 :param ip: ip of who pushed
377 :param action: push
378 :param repository: repository name
379 :param repo_store_path: full path to where repositories are stored
380 :param pushed_revs: list of pushed revisions
381 """
382
383 expected_parameters = (
384 'server_url', 'config', 'scm', 'username', 'ip', 'action',
385 'repository', 'repo_store_path', 'pushed_revs')
386 _verify_kwargs(expected_parameters, kwargs)
387
388 return 0
389 PUSH_HOOK = _pushhook
390
391
392 # =============================================================================
393 # PRE PULL HOOK
394 # =============================================================================
395
396 # this function will be executed after each push it's executed after the
397 # build-in hook that RhodeCode uses for logging pulls
398 def _prepullhook(*args, **kwargs):
399 """
400 Post pull hook
401 kwargs available::
402
403 :param server_url: url of instance that triggered this hook
404 :param config: path to .ini config used
405 :param scm: type of VS 'git' or 'hg'
406 :param username: name of user who pulled
407 :param ip: ip of who pulled
408 :param action: pull
409 :param repository: repository name
410 """
411
412 expected_parameters = (
413 'server_url', 'config', 'scm', 'username', 'ip', 'action',
414 'repository')
415 _verify_kwargs(expected_parameters, kwargs)
416
417 return 0
418 PRE_PULL_HOOK = _prepullhook
419
420
421
422 # =============================================================================
423 # POST PULL HOOK
424 # =============================================================================
425
426 # this function will be executed after each push it's executed after the
427 # build-in hook that RhodeCode uses for logging pulls
428 def _pullhook(*args, **kwargs):
429 """
430 Post pull hook
431 kwargs available::
432
433 :param server_url: url of instance that triggered this hook
434 :param config: path to .ini config used
435 :param scm: type of VS 'git' or 'hg'
436 :param username: name of user who pulled
437 :param ip: ip of who pulled
438 :param action: pull
439 :param repository: repository name
440 """
441
442 expected_parameters = (
443 'server_url', 'config', 'scm', 'username', 'ip', 'action',
444 'repository')
445 _verify_kwargs(expected_parameters, kwargs)
446
447 return 0
448 PULL_HOOK = _pullhook
449
450
451 # =============================================================================
452 # PULL REQUEST RELATED HOOKS
453 # =============================================================================
454
455 def _create_pull_request_hook(*args, **kwargs):
456 expected_parameters = (
457 'server_url', 'config', 'scm', 'username', 'ip', 'action',
458 'repository', 'pull_request_id', 'url', 'title', 'description',
459 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
460 'mergeable', 'source', 'target', 'author', 'reviewers')
461 _verify_kwargs(expected_parameters, kwargs)
462 return 0
463 CREATE_PULL_REQUEST = _create_pull_request_hook
464
465
466 def _merge_pull_request_hook(*args, **kwargs):
467 expected_parameters = (
468 'server_url', 'config', 'scm', 'username', 'ip', 'action',
469 'repository', 'pull_request_id', 'url', 'title', 'description',
470 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
471 'mergeable', 'source', 'target', 'author', 'reviewers')
472 _verify_kwargs(expected_parameters, kwargs)
473 return 0
474 MERGE_PULL_REQUEST = _merge_pull_request_hook
475
476
477 def _close_pull_request_hook(*args, **kwargs):
478 expected_parameters = (
479 'server_url', 'config', 'scm', 'username', 'ip', 'action',
480 'repository', 'pull_request_id', 'url', 'title', 'description',
481 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
482 'mergeable', 'source', 'target', 'author', 'reviewers')
483 _verify_kwargs(expected_parameters, kwargs)
484 return 0
485 CLOSE_PULL_REQUEST = _close_pull_request_hook
486
487
488 def _review_pull_request_hook(*args, **kwargs):
489 expected_parameters = (
490 'server_url', 'config', 'scm', 'username', 'ip', 'action',
491 'repository', 'pull_request_id', 'url', 'title', 'description',
492 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
493 'mergeable', 'source', 'target', 'author', 'reviewers')
494 _verify_kwargs(expected_parameters, kwargs)
495 return 0
496 REVIEW_PULL_REQUEST = _review_pull_request_hook
497
498
499 def _update_pull_request_hook(*args, **kwargs):
500 expected_parameters = (
501 'server_url', 'config', 'scm', 'username', 'ip', 'action',
502 'repository', 'pull_request_id', 'url', 'title', 'description',
503 'status', 'created_on', 'updated_on', 'commit_ids', 'review_status',
504 'mergeable', 'source', 'target', 'author', 'reviewers')
505 _verify_kwargs(expected_parameters, kwargs)
506 return 0
507 UPDATE_PULL_REQUEST = _update_pull_request_hook
508
509
510 def _verify_kwargs(expected_parameters, kwargs):
511 """
512 Verify that exactly `expected_parameters` are passed in as `kwargs`.
513 """
514 expected_parameters = set(expected_parameters)
515 kwargs_keys = set(kwargs.keys())
516 if kwargs_keys != expected_parameters:
517 missing_kwargs = expected_parameters - kwargs_keys
518 unexpected_kwargs = kwargs_keys - expected_parameters
519 raise AssertionError(
520 "rcextensions: Missing parameters: %r, unexpected parameters: %s" %
521 (missing_kwargs, unexpected_kwargs))
General Comments 0
You need to be logged in to leave comments. Login now