##// END OF EJS Templates
diffs: sticky top-file bar + context aware file labels....
marcink -
r3126:4c30a2d8 default
parent child Browse files
Show More
@@ -1,196 +1,200 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",
11 "bower": "bower_components",
12 "node_modules": "node_modules"
12 "node_modules": "node_modules"
13 }
13 }
14 },
14 },
15 "copy": {
15 "copy": {
16 "main": {
16 "main": {
17 "expand": true,
17 "expand": true,
18 "cwd": "bower_components",
18 "cwd": "bower_components",
19 "src": "webcomponentsjs/webcomponents-lite.js",
19 "src": "webcomponentsjs/webcomponents-lite.js",
20 "dest": "<%= dirs.js.dest %>/vendors"
20 "dest": "<%= dirs.js.dest %>/vendors"
21 }
21 }
22 },
22 },
23 "concat": {
23 "concat": {
24 "polymercss": {
24 "polymercss": {
25 "src": [
25 "src": [
26 "<%= dirs.js.src %>/components/root-styles-prefix.html",
26 "<%= dirs.js.src %>/components/root-styles-prefix.html",
27 "<%= dirs.css.src %>/style-polymer.css",
27 "<%= dirs.css.src %>/style-polymer.css",
28 "<%= dirs.js.src %>/components/root-styles-suffix.html"
28 "<%= dirs.js.src %>/components/root-styles-suffix.html"
29 ],
29 ],
30 "dest": "<%= dirs.js.dest %>/src/components/root-styles.gen.html",
30 "dest": "<%= dirs.js.dest %>/src/components/root-styles.gen.html",
31 "nonull": true
31 "nonull": true
32 },
32 },
33 "dist": {
33 "dist": {
34 "src": [
34 "src": [
35 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
35 "<%= dirs.js.node_modules %>/jquery/dist/jquery.min.js",
36 "<%= dirs.js.node_modules %>/mousetrap/mousetrap.min.js",
36 "<%= dirs.js.node_modules %>/mousetrap/mousetrap.min.js",
37 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
37 "<%= dirs.js.node_modules %>/moment/min/moment.min.js",
38 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
38 "<%= dirs.js.node_modules %>/clipboard/dist/clipboard.min.js",
39 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
39 "<%= dirs.js.node_modules %>/favico.js/favico-0.3.10.min.js",
40 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/sticky-sidebar.min.js",
41 "<%= dirs.js.node_modules %>/sticky-sidebar/dist/jquery.sticky-sidebar.min.js",
42 "<%= dirs.js.node_modules %>/waypoints/lib/noframework.waypoints.min.js",
43 "<%= dirs.js.node_modules %>/waypoints/lib/jquery.waypoints.min.js",
40 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
44 "<%= dirs.js.node_modules %>/appenlight-client/appenlight-client.min.js",
41 "<%= dirs.js.src %>/logging.js",
45 "<%= dirs.js.src %>/logging.js",
42 "<%= dirs.js.src %>/bootstrap.js",
46 "<%= dirs.js.src %>/bootstrap.js",
43 "<%= dirs.js.src %>/i18n_utils.js",
47 "<%= dirs.js.src %>/i18n_utils.js",
44 "<%= dirs.js.src %>/deform.js",
48 "<%= dirs.js.src %>/deform.js",
45 "<%= dirs.js.src %>/ejs.js",
49 "<%= dirs.js.src %>/ejs.js",
46 "<%= dirs.js.src %>/ejs_templates/utils.js",
50 "<%= dirs.js.src %>/ejs_templates/utils.js",
47 "<%= dirs.js.src %>/plugins/jquery.pjax.js",
51 "<%= dirs.js.src %>/plugins/jquery.pjax.js",
48 "<%= dirs.js.src %>/plugins/jquery.dataTables.js",
52 "<%= dirs.js.src %>/plugins/jquery.dataTables.js",
49 "<%= dirs.js.src %>/plugins/flavoured_checkbox.js",
53 "<%= dirs.js.src %>/plugins/flavoured_checkbox.js",
50 "<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js",
54 "<%= dirs.js.src %>/plugins/jquery.auto-grow-input.js",
51 "<%= dirs.js.src %>/plugins/jquery.autocomplete.js",
55 "<%= dirs.js.src %>/plugins/jquery.autocomplete.js",
52 "<%= dirs.js.src %>/plugins/jquery.debounce.js",
56 "<%= dirs.js.src %>/plugins/jquery.debounce.js",
53 "<%= dirs.js.src %>/plugins/jquery.mark.js",
57 "<%= dirs.js.src %>/plugins/jquery.mark.js",
54 "<%= dirs.js.src %>/plugins/jquery.timeago.js",
58 "<%= dirs.js.src %>/plugins/jquery.timeago.js",
55 "<%= dirs.js.src %>/plugins/jquery.timeago-extension.js",
59 "<%= dirs.js.src %>/plugins/jquery.timeago-extension.js",
56 "<%= dirs.js.src %>/select2/select2.js",
60 "<%= dirs.js.src %>/select2/select2.js",
57 "<%= dirs.js.src %>/codemirror/codemirror.js",
61 "<%= dirs.js.src %>/codemirror/codemirror.js",
58 "<%= dirs.js.src %>/codemirror/codemirror_loadmode.js",
62 "<%= dirs.js.src %>/codemirror/codemirror_loadmode.js",
59 "<%= dirs.js.src %>/codemirror/codemirror_hint.js",
63 "<%= dirs.js.src %>/codemirror/codemirror_hint.js",
60 "<%= dirs.js.src %>/codemirror/codemirror_overlay.js",
64 "<%= dirs.js.src %>/codemirror/codemirror_overlay.js",
61 "<%= dirs.js.src %>/codemirror/codemirror_placeholder.js",
65 "<%= dirs.js.src %>/codemirror/codemirror_placeholder.js",
62 "<%= dirs.js.src %>/codemirror/codemirror_simplemode.js",
66 "<%= dirs.js.src %>/codemirror/codemirror_simplemode.js",
63 "<%= dirs.js.dest %>/mode/meta.js",
67 "<%= dirs.js.dest %>/mode/meta.js",
64 "<%= dirs.js.dest %>/mode/meta_ext.js",
68 "<%= dirs.js.dest %>/mode/meta_ext.js",
65 "<%= dirs.js.src_rc %>/i18n/select2/translations.js",
69 "<%= dirs.js.src_rc %>/i18n/select2/translations.js",
66 "<%= dirs.js.src %>/rhodecode/utils/array.js",
70 "<%= dirs.js.src %>/rhodecode/utils/array.js",
67 "<%= dirs.js.src %>/rhodecode/utils/string.js",
71 "<%= dirs.js.src %>/rhodecode/utils/string.js",
68 "<%= dirs.js.src %>/rhodecode/utils/pyroutes.js",
72 "<%= dirs.js.src %>/rhodecode/utils/pyroutes.js",
69 "<%= dirs.js.src %>/rhodecode/utils/ajax.js",
73 "<%= dirs.js.src %>/rhodecode/utils/ajax.js",
70 "<%= dirs.js.src %>/rhodecode/utils/autocomplete.js",
74 "<%= dirs.js.src %>/rhodecode/utils/autocomplete.js",
71 "<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js",
75 "<%= dirs.js.src %>/rhodecode/utils/colorgenerator.js",
72 "<%= dirs.js.src %>/rhodecode/utils/ie.js",
76 "<%= dirs.js.src %>/rhodecode/utils/ie.js",
73 "<%= dirs.js.src %>/rhodecode/utils/os.js",
77 "<%= dirs.js.src %>/rhodecode/utils/os.js",
74 "<%= dirs.js.src %>/rhodecode/utils/topics.js",
78 "<%= dirs.js.src %>/rhodecode/utils/topics.js",
75 "<%= dirs.js.src %>/rhodecode/init.js",
79 "<%= dirs.js.src %>/rhodecode/init.js",
76 "<%= dirs.js.src %>/rhodecode/changelog.js",
80 "<%= dirs.js.src %>/rhodecode/changelog.js",
77 "<%= dirs.js.src %>/rhodecode/codemirror.js",
81 "<%= dirs.js.src %>/rhodecode/codemirror.js",
78 "<%= dirs.js.src %>/rhodecode/comments.js",
82 "<%= dirs.js.src %>/rhodecode/comments.js",
79 "<%= dirs.js.src %>/rhodecode/constants.js",
83 "<%= dirs.js.src %>/rhodecode/constants.js",
80 "<%= dirs.js.src %>/rhodecode/files.js",
84 "<%= dirs.js.src %>/rhodecode/files.js",
81 "<%= dirs.js.src %>/rhodecode/followers.js",
85 "<%= dirs.js.src %>/rhodecode/followers.js",
82 "<%= dirs.js.src %>/rhodecode/menus.js",
86 "<%= dirs.js.src %>/rhodecode/menus.js",
83 "<%= dirs.js.src %>/rhodecode/notifications.js",
87 "<%= dirs.js.src %>/rhodecode/notifications.js",
84 "<%= dirs.js.src %>/rhodecode/permissions.js",
88 "<%= dirs.js.src %>/rhodecode/permissions.js",
85 "<%= dirs.js.src %>/rhodecode/pjax.js",
89 "<%= dirs.js.src %>/rhodecode/pjax.js",
86 "<%= dirs.js.src %>/rhodecode/pullrequests.js",
90 "<%= dirs.js.src %>/rhodecode/pullrequests.js",
87 "<%= dirs.js.src %>/rhodecode/settings.js",
91 "<%= dirs.js.src %>/rhodecode/settings.js",
88 "<%= dirs.js.src %>/rhodecode/select2_widgets.js",
92 "<%= dirs.js.src %>/rhodecode/select2_widgets.js",
89 "<%= dirs.js.src %>/rhodecode/tooltips.js",
93 "<%= dirs.js.src %>/rhodecode/tooltips.js",
90 "<%= dirs.js.src %>/rhodecode/users.js",
94 "<%= dirs.js.src %>/rhodecode/users.js",
91 "<%= dirs.js.src %>/rhodecode/appenlight.js",
95 "<%= dirs.js.src %>/rhodecode/appenlight.js",
92 "<%= dirs.js.src %>/rhodecode.js"
96 "<%= dirs.js.src %>/rhodecode.js"
93 ],
97 ],
94 "dest": "<%= dirs.js.dest %>/scripts.js",
98 "dest": "<%= dirs.js.dest %>/scripts.js",
95 "nonull": true
99 "nonull": true
96 }
100 }
97 },
101 },
98 "crisper": {
102 "crisper": {
99 "dist": {
103 "dist": {
100 "options": {
104 "options": {
101 "cleanup": false,
105 "cleanup": false,
102 "onlySplit": true
106 "onlySplit": true
103 },
107 },
104 "src": "<%= dirs.js.dest %>/rhodecode-components.html",
108 "src": "<%= dirs.js.dest %>/rhodecode-components.html",
105 "dest": "<%= dirs.js.dest %>/rhodecode-components.js"
109 "dest": "<%= dirs.js.dest %>/rhodecode-components.js"
106 }
110 }
107 },
111 },
108 "less": {
112 "less": {
109 "development": {
113 "development": {
110 "options": {
114 "options": {
111 "compress": false,
115 "compress": false,
112 "yuicompress": false,
116 "yuicompress": false,
113 "optimization": 0
117 "optimization": 0
114 },
118 },
115 "files": {
119 "files": {
116 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
120 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
117 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
121 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
118 }
122 }
119 },
123 },
120 "production": {
124 "production": {
121 "options": {
125 "options": {
122 "compress": true,
126 "compress": true,
123 "yuicompress": true,
127 "yuicompress": true,
124 "optimization": 2
128 "optimization": 2
125 },
129 },
126 "files": {
130 "files": {
127 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
131 "<%= dirs.css.dest %>/style.css": "<%= dirs.css.src %>/main.less",
128 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
132 "<%= dirs.css.dest %>/style-polymer.css": "<%= dirs.css.src %>/polymer.less"
129 }
133 }
130 },
134 },
131 "components": {
135 "components": {
132 "files": [
136 "files": [
133 {
137 {
134 "cwd": "<%= dirs.js.src %>/components/",
138 "cwd": "<%= dirs.js.src %>/components/",
135 "dest": "<%= dirs.js.src %>/components/",
139 "dest": "<%= dirs.js.src %>/components/",
136 "src": [
140 "src": [
137 "**/*.less"
141 "**/*.less"
138 ],
142 ],
139 "expand": true,
143 "expand": true,
140 "ext": ".css"
144 "ext": ".css"
141 }
145 }
142 ]
146 ]
143 }
147 }
144 },
148 },
145 "watch": {
149 "watch": {
146 "less": {
150 "less": {
147 "files": [
151 "files": [
148 "<%= dirs.css.src %>/**/*.less",
152 "<%= dirs.css.src %>/**/*.less",
149 "<%= dirs.js.src %>/components/**/*.less"
153 "<%= dirs.js.src %>/components/**/*.less"
150 ],
154 ],
151 "tasks": [
155 "tasks": [
152 "less:development",
156 "less:development",
153 "less:components",
157 "less:components",
154 "concat:polymercss",
158 "concat:polymercss",
155 "vulcanize",
159 "vulcanize",
156 "crisper",
160 "crisper",
157 "concat:dist"
161 "concat:dist"
158 ]
162 ]
159 },
163 },
160 "js": {
164 "js": {
161 "files": [
165 "files": [
162 "!<%= dirs.js.src %>/components/root-styles.gen.html",
166 "!<%= dirs.js.src %>/components/root-styles.gen.html",
163 "<%= dirs.js.src %>/**/*.js",
167 "<%= dirs.js.src %>/**/*.js",
164 "<%= dirs.js.src %>/components/**/*.html"
168 "<%= dirs.js.src %>/components/**/*.html"
165 ],
169 ],
166 "tasks": [
170 "tasks": [
167 "less:components",
171 "less:components",
168 "concat:polymercss",
172 "concat:polymercss",
169 "vulcanize",
173 "vulcanize",
170 "crisper",
174 "crisper",
171 "concat:dist"
175 "concat:dist"
172 ]
176 ]
173 }
177 }
174 },
178 },
175 "jshint": {
179 "jshint": {
176 "rhodecode": {
180 "rhodecode": {
177 "src": "<%= dirs.js.src %>/rhodecode/**/*.js",
181 "src": "<%= dirs.js.src %>/rhodecode/**/*.js",
178 "options": {
182 "options": {
179 "jshintrc": ".jshintrc"
183 "jshintrc": ".jshintrc"
180 }
184 }
181 }
185 }
182 },
186 },
183 "vulcanize": {
187 "vulcanize": {
184 "default": {
188 "default": {
185 "options": {
189 "options": {
186 "abspath": "",
190 "abspath": "",
187 "inlineScripts": true,
191 "inlineScripts": true,
188 "inlineCss": true,
192 "inlineCss": true,
189 "stripComments": true
193 "stripComments": true
190 },
194 },
191 "files": {
195 "files": {
192 "<%= dirs.js.dest %>/rhodecode-components.html": "<%= dirs.js.src %>/components/shared-components.html"
196 "<%= dirs.js.dest %>/rhodecode-components.html": "<%= dirs.js.src %>/components/shared-components.html"
193 }
197 }
194 }
198 }
195 }
199 }
196 }
200 }
@@ -1,33 +1,35 b''
1 {
1 {
2 "name": "rhodecode-enterprise",
2 "name": "rhodecode-enterprise",
3 "version": "1.0.0",
3 "version": "1.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",
7 "repository" : {
7 "repository" : {
8 "type" : "hg",
8 "type" : "hg",
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 "grunt": "^0.4.5",
12 "grunt": "^0.4.5",
13 "grunt-contrib-copy": "^1.0.0",
13 "grunt-contrib-copy": "^1.0.0",
14 "grunt-contrib-concat": "^0.5.1",
14 "grunt-contrib-concat": "^0.5.1",
15 "grunt-contrib-jshint": "^0.12.0",
15 "grunt-contrib-jshint": "^0.12.0",
16 "grunt-contrib-less": "^1.1.0",
16 "grunt-contrib-less": "^1.1.0",
17 "grunt-contrib-watch": "^0.6.1",
17 "grunt-contrib-watch": "^0.6.1",
18 "crisper": "^2.1.1",
18 "crisper": "^2.1.1",
19 "vulcanize": "^1.16.0",
19 "vulcanize": "^1.16.0",
20 "grunt-crisper": "^1.0.1",
20 "grunt-crisper": "^1.0.1",
21 "grunt-vulcanize": "^1.0.0",
21 "grunt-vulcanize": "^1.0.0",
22 "node2nix": "^1.0.0",
22 "node2nix": "^1.0.0",
23 "jshint": "^2.9.1-rc3",
23 "jshint": "^2.9.1-rc3",
24 "bower": "^1.8.4",
24 "bower": "^1.8.4",
25 "jquery": "1.11.3",
25 "jquery": "1.11.3",
26 "favico.js": "^0.3.10",
26 "favico.js": "^0.3.10",
27 "clipboard": "^2.0.1",
27 "clipboard": "^2.0.1",
28 "qrious": "^4.0.2",
28 "qrious": "^4.0.2",
29 "moment": "^2.18.1",
29 "moment": "^2.18.1",
30 "mousetrap": "^1.6.1",
30 "mousetrap": "^1.6.1",
31 "sticky-sidebar": "3.3.1",
32 "waypoints": "4.0.1",
31 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
33 "appenlight-client": "git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
32 }
34 }
33 }
35 }
@@ -1,30 +1,30 b''
1 # Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
1 # Generated by bower2nix v3.2.0 (https://github.com/rvl/bower2nix)
2 { fetchbower, buildEnv }:
2 { fetchbower, buildEnv }:
3 buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
3 buildEnv { name = "bower-env"; ignoreCollisions = true; paths = [
4 (fetchbower "webcomponentsjs" "1.2.3" "^1.2.3" "0db2fjk779rhl9d4ifpk1j9a83vngx6j3hk7si1752dqxj857267")
4 (fetchbower "webcomponentsjs" "1.2.7" "^1.2.3" "0wbybia53zjfcyh4yvjc4ds8vvfizmmsyd35qgja4v0hlyvf4zms")
5 (fetchbower "polymer" "Polymer/polymer#2.6.0" "Polymer/polymer#^2.6.0" "1jw5syjn0naa7dlxzxvsgwb20zbkbpx0pcg0wzjq4wr49c20nw0k")
5 (fetchbower "polymer" "Polymer/polymer#2.6.1" "Polymer/polymer#^2.6.0" "0zr44hh50851hfqwgw5r4pa330p1jp60rrffcqrw3wwggfl38s4n")
6 (fetchbower "paper-button" "PolymerElements/paper-button#2.1.2" "PolymerElements/paper-button#^2.1.2" "1lwmjwhvimh02gss39yjp5h7yg9mxl1ig59yrk085v86y5f5ilz1")
6 (fetchbower "paper-button" "PolymerElements/paper-button#2.1.3" "PolymerElements/paper-button#^2.1.2" "1w016daj1l8hyklaqskcz4c3zxcm77cd5k3lj0324xn45n3vvphc")
7 (fetchbower "paper-spinner" "PolymerElements/paper-spinner#2.1.0" "PolymerElements/paper-spinner#^2.1.0" "07jamgxzvy4r9pgf5ikj1fm8nkrw6sywgcxvmm7ax58hjvmd4i45")
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")
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")
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")
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")
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")
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")
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")
14 (fetchbower "shadycss" "webcomponents/shadycss#1.5.2" "webcomponents/shadycss#^v1.1.0" "03fgbgvb80zjrgnq43gk0hr4cbvjs8rkqpfv1c2qsn7b6q71izlx")
15 (fetchbower "iron-flex-layout" "PolymerElements/iron-flex-layout#2.0.3" "PolymerElements/iron-flex-layout#1 - 2" "1ir9ili3rkcgbfj6is5s70vyb7m6avz0av0lpjjlhhsplrrl90bk")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
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")
29 (fetchbower "iron-meta" "PolymerElements/iron-meta#2.1.1" "PolymerElements/iron-meta#1 - 2" "12w1pcl3w97xpxihqddbf2d9dx8xz5i1jd9bz1xrmfsh25isni40")
30 ]; }
30 ]; }
@@ -1,3386 +1,3406 b''
1 # This file has been generated by node2nix 1.6.0. Do not edit!
1 # This file has been generated by node2nix 1.6.0. Do not edit!
2
2
3 {nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
3 {nodeEnv, fetchurl, fetchgit, globalBuildInputs ? []}:
4
4
5 let
5 let
6 sources = {
6 sources = {
7 "@types/clone-0.1.30" = {
7 "@types/clone-0.1.30" = {
8 name = "_at_types_slash_clone";
8 name = "_at_types_slash_clone";
9 packageName = "@types/clone";
9 packageName = "@types/clone";
10 version = "0.1.30";
10 version = "0.1.30";
11 src = fetchurl {
11 src = fetchurl {
12 url = "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz";
12 url = "https://registry.npmjs.org/@types/clone/-/clone-0.1.30.tgz";
13 sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614";
13 sha1 = "e7365648c1b42136a59c7d5040637b3b5c83b614";
14 };
14 };
15 };
15 };
16 "@types/node-4.2.23" = {
16 "@types/node-4.9.0" = {
17 name = "_at_types_slash_node";
17 name = "_at_types_slash_node";
18 packageName = "@types/node";
18 packageName = "@types/node";
19 version = "4.2.23";
19 version = "4.9.0";
20 src = fetchurl {
20 src = fetchurl {
21 url = "https://registry.npmjs.org/@types/node/-/node-4.2.23.tgz";
21 url = "https://registry.npmjs.org/@types/node/-/node-4.9.0.tgz";
22 sha512 = "U6IchCNLRyswc9p6G6lxWlbE+KwAhZp6mGo6MD2yWpmFomhYmetK+c98OpKyvphNn04CU3aXeJrXdOqbXVTS/w==";
22 sha512 = "xUFkZ+er9gUGw0x9qyfmr/Th0LuX6IB0m7HrRMB6sO6vcBVRFZ/3YV1EeiOC2fG50RX09avDfKwGBHOnPVxFeg==";
23 };
23 };
24 };
24 };
25 "@types/node-6.0.114" = {
25 "@types/node-6.0.118" = {
26 name = "_at_types_slash_node";
26 name = "_at_types_slash_node";
27 packageName = "@types/node";
27 packageName = "@types/node";
28 version = "6.0.114";
28 version = "6.0.118";
29 src = fetchurl {
29 src = fetchurl {
30 url = "https://registry.npmjs.org/@types/node/-/node-6.0.114.tgz";
30 url = "https://registry.npmjs.org/@types/node/-/node-6.0.118.tgz";
31 sha512 = "5ViC9dwf1VIAtrOFTvOuN04lJgw28eKjuy0Vg2Bd/fSlxKP2feCSkIw04ZgOENL2ywdWrtbkthp1XVLEjJmouw==";
31 sha512 = "N33cKXGSqhOYaPiT4xUGsYlPPDwFtQM/6QxJxuMXA/7BcySW+lkn2yigWP7vfs4daiL/7NJNU6DMCqg5N4B+xQ==";
32 };
32 };
33 };
33 };
34 "@types/parse5-0.0.31" = {
34 "@types/parse5-0.0.31" = {
35 name = "_at_types_slash_parse5";
35 name = "_at_types_slash_parse5";
36 packageName = "@types/parse5";
36 packageName = "@types/parse5";
37 version = "0.0.31";
37 version = "0.0.31";
38 src = fetchurl {
38 src = fetchurl {
39 url = "https://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz";
39 url = "http://registry.npmjs.org/@types/parse5/-/parse5-0.0.31.tgz";
40 sha1 = "e827a493a443b156e1b582a2e4c3bdc0040f2ee7";
40 sha1 = "e827a493a443b156e1b582a2e4c3bdc0040f2ee7";
41 };
41 };
42 };
42 };
43 "abbrev-1.1.1" = {
43 "abbrev-1.1.1" = {
44 name = "abbrev";
44 name = "abbrev";
45 packageName = "abbrev";
45 packageName = "abbrev";
46 version = "1.1.1";
46 version = "1.1.1";
47 src = fetchurl {
47 src = fetchurl {
48 url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
48 url = "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz";
49 sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
49 sha512 = "nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==";
50 };
50 };
51 };
51 };
52 "acorn-3.3.0" = {
52 "acorn-3.3.0" = {
53 name = "acorn";
53 name = "acorn";
54 packageName = "acorn";
54 packageName = "acorn";
55 version = "3.3.0";
55 version = "3.3.0";
56 src = fetchurl {
56 src = fetchurl {
57 url = "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz";
57 url = "https://registry.npmjs.org/acorn/-/acorn-3.3.0.tgz";
58 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
58 sha1 = "45e37fb39e8da3f25baee3ff5369e2bb5f22017a";
59 };
59 };
60 };
60 };
61 "acorn-5.7.1" = {
61 "acorn-5.7.3" = {
62 name = "acorn";
62 name = "acorn";
63 packageName = "acorn";
63 packageName = "acorn";
64 version = "5.7.1";
64 version = "5.7.3";
65 src = fetchurl {
65 src = fetchurl {
66 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.1.tgz";
66 url = "https://registry.npmjs.org/acorn/-/acorn-5.7.3.tgz";
67 sha512 = "d+nbxBUGKg7Arpsvbnlq61mc12ek3EY8EQldM3GPAhWJ1UVxC6TDGbIvUMNU6obBX3i1+ptCIzV4vq0gFPEGVQ==";
67 sha512 = "T/zvzYRfbVojPWahDsE5evJdHb3oJoQfFbsrKM7w5Zcs++Tr257tia3BmMP8XYVjp1S9RZXQMh7gao96BlqZOw==";
68 };
68 };
69 };
69 };
70 "acorn-jsx-3.0.1" = {
70 "acorn-jsx-3.0.1" = {
71 name = "acorn-jsx";
71 name = "acorn-jsx";
72 packageName = "acorn-jsx";
72 packageName = "acorn-jsx";
73 version = "3.0.1";
73 version = "3.0.1";
74 src = fetchurl {
74 src = fetchurl {
75 url = "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz";
75 url = "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-3.0.1.tgz";
76 sha1 = "afdf9488fb1ecefc8348f6fb22f464e32a58b36b";
76 sha1 = "afdf9488fb1ecefc8348f6fb22f464e32a58b36b";
77 };
77 };
78 };
78 };
79 "ajv-4.11.8" = {
79 "ajv-4.11.8" = {
80 name = "ajv";
80 name = "ajv";
81 packageName = "ajv";
81 packageName = "ajv";
82 version = "4.11.8";
82 version = "4.11.8";
83 src = fetchurl {
83 src = fetchurl {
84 url = "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz";
84 url = "https://registry.npmjs.org/ajv/-/ajv-4.11.8.tgz";
85 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
85 sha1 = "82ffb02b29e662ae53bdc20af15947706739c536";
86 };
86 };
87 };
87 };
88 "amdefine-1.0.1" = {
88 "amdefine-1.0.1" = {
89 name = "amdefine";
89 name = "amdefine";
90 packageName = "amdefine";
90 packageName = "amdefine";
91 version = "1.0.1";
91 version = "1.0.1";
92 src = fetchurl {
92 src = fetchurl {
93 url = "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz";
93 url = "https://registry.npmjs.org/amdefine/-/amdefine-1.0.1.tgz";
94 sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
94 sha1 = "4a5282ac164729e93619bcfd3ad151f817ce91f5";
95 };
95 };
96 };
96 };
97 "ansi-escape-sequences-3.0.0" = {
97 "ansi-escape-sequences-3.0.0" = {
98 name = "ansi-escape-sequences";
98 name = "ansi-escape-sequences";
99 packageName = "ansi-escape-sequences";
99 packageName = "ansi-escape-sequences";
100 version = "3.0.0";
100 version = "3.0.0";
101 src = fetchurl {
101 src = fetchurl {
102 url = "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz";
102 url = "https://registry.npmjs.org/ansi-escape-sequences/-/ansi-escape-sequences-3.0.0.tgz";
103 sha1 = "1c18394b6af9b76ff9a63509fa497669fd2ce53e";
103 sha1 = "1c18394b6af9b76ff9a63509fa497669fd2ce53e";
104 };
104 };
105 };
105 };
106 "ansi-regex-0.2.1" = {
106 "ansi-regex-0.2.1" = {
107 name = "ansi-regex";
107 name = "ansi-regex";
108 packageName = "ansi-regex";
108 packageName = "ansi-regex";
109 version = "0.2.1";
109 version = "0.2.1";
110 src = fetchurl {
110 src = fetchurl {
111 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz";
111 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-0.2.1.tgz";
112 sha1 = "0d8e946967a3d8143f93e24e298525fc1b2235f9";
112 sha1 = "0d8e946967a3d8143f93e24e298525fc1b2235f9";
113 };
113 };
114 };
114 };
115 "ansi-regex-2.1.1" = {
115 "ansi-regex-2.1.1" = {
116 name = "ansi-regex";
116 name = "ansi-regex";
117 packageName = "ansi-regex";
117 packageName = "ansi-regex";
118 version = "2.1.1";
118 version = "2.1.1";
119 src = fetchurl {
119 src = fetchurl {
120 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
120 url = "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz";
121 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
121 sha1 = "c3b33ab5ee360d86e0e628f0468ae7ef27d654df";
122 };
122 };
123 };
123 };
124 "ansi-styles-1.1.0" = {
124 "ansi-styles-1.1.0" = {
125 name = "ansi-styles";
125 name = "ansi-styles";
126 packageName = "ansi-styles";
126 packageName = "ansi-styles";
127 version = "1.1.0";
127 version = "1.1.0";
128 src = fetchurl {
128 src = fetchurl {
129 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz";
129 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-1.1.0.tgz";
130 sha1 = "eaecbf66cd706882760b2f4691582b8f55d7a7de";
130 sha1 = "eaecbf66cd706882760b2f4691582b8f55d7a7de";
131 };
131 };
132 };
132 };
133 "ansi-styles-2.2.1" = {
133 "ansi-styles-2.2.1" = {
134 name = "ansi-styles";
134 name = "ansi-styles";
135 packageName = "ansi-styles";
135 packageName = "ansi-styles";
136 version = "2.2.1";
136 version = "2.2.1";
137 src = fetchurl {
137 src = fetchurl {
138 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
138 url = "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz";
139 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
139 sha1 = "b432dd3358b634cf75e1e4664368240533c1ddbe";
140 };
140 };
141 };
141 };
142 "appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" = {
142 "appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1" = {
143 name = "appenlight-client";
143 name = "appenlight-client";
144 packageName = "appenlight-client";
144 packageName = "appenlight-client";
145 version = "0.5.1";
145 version = "0.5.1";
146 src = fetchgit {
146 src = fetchgit {
147 url = "https://git@github.com/AppEnlight/appenlight-client-js.git";
147 url = "https://git@github.com/AppEnlight/appenlight-client-js.git";
148 rev = "14712c64c230fbbe94fcbc8094aef5eb3b90b307";
148 rev = "14712c64c230fbbe94fcbc8094aef5eb3b90b307";
149 sha256 = "05146f5b932f166c9a4db601bc9c13ae686899653d1dd03121652631f9bc83d6";
149 sha256 = "05146f5b932f166c9a4db601bc9c13ae686899653d1dd03121652631f9bc83d6";
150 };
150 };
151 };
151 };
152 "aproba-1.2.0" = {
152 "aproba-1.2.0" = {
153 name = "aproba";
153 name = "aproba";
154 packageName = "aproba";
154 packageName = "aproba";
155 version = "1.2.0";
155 version = "1.2.0";
156 src = fetchurl {
156 src = fetchurl {
157 url = "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz";
157 url = "https://registry.npmjs.org/aproba/-/aproba-1.2.0.tgz";
158 sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
158 sha512 = "Y9J6ZjXtoYh8RnXVCMOU/ttDmk1aBjunq9vO0ta5x85WDQiQfUF9sIPBITdbiiIVcBo03Hi3jMxigBtsddlXRw==";
159 };
159 };
160 };
160 };
161 "are-we-there-yet-1.1.5" = {
161 "are-we-there-yet-1.1.5" = {
162 name = "are-we-there-yet";
162 name = "are-we-there-yet";
163 packageName = "are-we-there-yet";
163 packageName = "are-we-there-yet";
164 version = "1.1.5";
164 version = "1.1.5";
165 src = fetchurl {
165 src = fetchurl {
166 url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
166 url = "https://registry.npmjs.org/are-we-there-yet/-/are-we-there-yet-1.1.5.tgz";
167 sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==";
167 sha512 = "5hYdAkZlcG8tOLujVDTgCT+uPX0VnpAH28gWsLfzpXYm7wP6mp5Q/gYyR7YQ0cKVJcXJnl3j2kpBan13PtQf6w==";
168 };
168 };
169 };
169 };
170 "argparse-0.1.16" = {
170 "argparse-0.1.16" = {
171 name = "argparse";
171 name = "argparse";
172 packageName = "argparse";
172 packageName = "argparse";
173 version = "0.1.16";
173 version = "0.1.16";
174 src = fetchurl {
174 src = fetchurl {
175 url = "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz";
175 url = "https://registry.npmjs.org/argparse/-/argparse-0.1.16.tgz";
176 sha1 = "cfd01e0fbba3d6caed049fbd758d40f65196f57c";
176 sha1 = "cfd01e0fbba3d6caed049fbd758d40f65196f57c";
177 };
177 };
178 };
178 };
179 "array-back-1.0.4" = {
179 "array-back-1.0.4" = {
180 name = "array-back";
180 name = "array-back";
181 packageName = "array-back";
181 packageName = "array-back";
182 version = "1.0.4";
182 version = "1.0.4";
183 src = fetchurl {
183 src = fetchurl {
184 url = "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz";
184 url = "https://registry.npmjs.org/array-back/-/array-back-1.0.4.tgz";
185 sha1 = "644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b";
185 sha1 = "644ba7f095f7ffcf7c43b5f0dc39d3c1f03c063b";
186 };
186 };
187 };
187 };
188 "asap-2.0.6" = {
188 "asap-2.0.6" = {
189 name = "asap";
189 name = "asap";
190 packageName = "asap";
190 packageName = "asap";
191 version = "2.0.6";
191 version = "2.0.6";
192 src = fetchurl {
192 src = fetchurl {
193 url = "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz";
193 url = "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz";
194 sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
194 sha1 = "e50347611d7e690943208bbdafebcbc2fb866d46";
195 };
195 };
196 };
196 };
197 "asn1-0.2.3" = {
197 "asn1-0.2.4" = {
198 name = "asn1";
198 name = "asn1";
199 packageName = "asn1";
199 packageName = "asn1";
200 version = "0.2.3";
200 version = "0.2.4";
201 src = fetchurl {
201 src = fetchurl {
202 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.3.tgz";
202 url = "https://registry.npmjs.org/asn1/-/asn1-0.2.4.tgz";
203 sha1 = "dac8787713c9966849fc8180777ebe9c1ddf3b86";
203 sha512 = "jxwzQpLQjSmWXgwaCZE9Nz+glAG01yF1QnWgbhGwHI5A6FRIEY6IVqtHhIepHqI7/kyEyQEagBC5mBEFlIYvdg==";
204 };
204 };
205 };
205 };
206 "assert-plus-0.2.0" = {
206 "assert-plus-0.2.0" = {
207 name = "assert-plus";
207 name = "assert-plus";
208 packageName = "assert-plus";
208 packageName = "assert-plus";
209 version = "0.2.0";
209 version = "0.2.0";
210 src = fetchurl {
210 src = fetchurl {
211 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz";
211 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-0.2.0.tgz";
212 sha1 = "d74e1b87e7affc0db8aadb7021f3fe48101ab234";
212 sha1 = "d74e1b87e7affc0db8aadb7021f3fe48101ab234";
213 };
213 };
214 };
214 };
215 "assert-plus-1.0.0" = {
215 "assert-plus-1.0.0" = {
216 name = "assert-plus";
216 name = "assert-plus";
217 packageName = "assert-plus";
217 packageName = "assert-plus";
218 version = "1.0.0";
218 version = "1.0.0";
219 src = fetchurl {
219 src = fetchurl {
220 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
220 url = "https://registry.npmjs.org/assert-plus/-/assert-plus-1.0.0.tgz";
221 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
221 sha1 = "f12e0f3c5d77b0b1cdd9146942e4e96c1e4dd525";
222 };
222 };
223 };
223 };
224 "async-0.1.22" = {
224 "async-0.1.22" = {
225 name = "async";
225 name = "async";
226 packageName = "async";
226 packageName = "async";
227 version = "0.1.22";
227 version = "0.1.22";
228 src = fetchurl {
228 src = fetchurl {
229 url = "https://registry.npmjs.org/async/-/async-0.1.22.tgz";
229 url = "https://registry.npmjs.org/async/-/async-0.1.22.tgz";
230 sha1 = "0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061";
230 sha1 = "0fc1aaa088a0e3ef0ebe2d8831bab0dcf8845061";
231 };
231 };
232 };
232 };
233 "async-0.2.10" = {
233 "async-0.2.10" = {
234 name = "async";
234 name = "async";
235 packageName = "async";
235 packageName = "async";
236 version = "0.2.10";
236 version = "0.2.10";
237 src = fetchurl {
237 src = fetchurl {
238 url = "https://registry.npmjs.org/async/-/async-0.2.10.tgz";
238 url = "https://registry.npmjs.org/async/-/async-0.2.10.tgz";
239 sha1 = "b6bbe0b0674b9d719708ca38de8c237cb526c3d1";
239 sha1 = "b6bbe0b0674b9d719708ca38de8c237cb526c3d1";
240 };
240 };
241 };
241 };
242 "async-1.0.0" = {
242 "async-1.0.0" = {
243 name = "async";
243 name = "async";
244 packageName = "async";
244 packageName = "async";
245 version = "1.0.0";
245 version = "1.0.0";
246 src = fetchurl {
246 src = fetchurl {
247 url = "https://registry.npmjs.org/async/-/async-1.0.0.tgz";
247 url = "https://registry.npmjs.org/async/-/async-1.0.0.tgz";
248 sha1 = "f8fc04ca3a13784ade9e1641af98578cfbd647a9";
248 sha1 = "f8fc04ca3a13784ade9e1641af98578cfbd647a9";
249 };
249 };
250 };
250 };
251 "async-2.6.1" = {
251 "async-2.6.1" = {
252 name = "async";
252 name = "async";
253 packageName = "async";
253 packageName = "async";
254 version = "2.6.1";
254 version = "2.6.1";
255 src = fetchurl {
255 src = fetchurl {
256 url = "https://registry.npmjs.org/async/-/async-2.6.1.tgz";
256 url = "https://registry.npmjs.org/async/-/async-2.6.1.tgz";
257 sha512 = "fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==";
257 sha512 = "fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==";
258 };
258 };
259 };
259 };
260 "asynckit-0.4.0" = {
260 "asynckit-0.4.0" = {
261 name = "asynckit";
261 name = "asynckit";
262 packageName = "asynckit";
262 packageName = "asynckit";
263 version = "0.4.0";
263 version = "0.4.0";
264 src = fetchurl {
264 src = fetchurl {
265 url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";
265 url = "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz";
266 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
266 sha1 = "c79ed97f7f34cb8f2ba1bc9790bcc366474b4b79";
267 };
267 };
268 };
268 };
269 "aws-sign2-0.6.0" = {
269 "aws-sign2-0.6.0" = {
270 name = "aws-sign2";
270 name = "aws-sign2";
271 packageName = "aws-sign2";
271 packageName = "aws-sign2";
272 version = "0.6.0";
272 version = "0.6.0";
273 src = fetchurl {
273 src = fetchurl {
274 url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz";
274 url = "https://registry.npmjs.org/aws-sign2/-/aws-sign2-0.6.0.tgz";
275 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
275 sha1 = "14342dd38dbcc94d0e5b87d763cd63612c0e794f";
276 };
276 };
277 };
277 };
278 "aws4-1.7.0" = {
278 "aws4-1.8.0" = {
279 name = "aws4";
279 name = "aws4";
280 packageName = "aws4";
280 packageName = "aws4";
281 version = "1.7.0";
281 version = "1.8.0";
282 src = fetchurl {
282 src = fetchurl {
283 url = "https://registry.npmjs.org/aws4/-/aws4-1.7.0.tgz";
283 url = "https://registry.npmjs.org/aws4/-/aws4-1.8.0.tgz";
284 sha512 = "32NDda82rhwD9/JBCCkB+MRYDp0oSvlo2IL6rQWA10PQi7tDUM3eqMSltXmY+Oyl/7N3P3qNtAlv7X0d9bI28w==";
284 sha512 = "ReZxvNHIOv88FlT7rxcXIIC0fPt4KZqZbOlivyWtXLt8ESx84zd3kMC6iK5jVeS2qt+g7ftS7ye4fi06X5rtRQ==";
285 };
285 };
286 };
286 };
287 "babel-polyfill-6.26.0" = {
287 "babel-polyfill-6.26.0" = {
288 name = "babel-polyfill";
288 name = "babel-polyfill";
289 packageName = "babel-polyfill";
289 packageName = "babel-polyfill";
290 version = "6.26.0";
290 version = "6.26.0";
291 src = fetchurl {
291 src = fetchurl {
292 url = "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz";
292 url = "https://registry.npmjs.org/babel-polyfill/-/babel-polyfill-6.26.0.tgz";
293 sha1 = "379937abc67d7895970adc621f284cd966cf2153";
293 sha1 = "379937abc67d7895970adc621f284cd966cf2153";
294 };
294 };
295 };
295 };
296 "babel-runtime-6.26.0" = {
296 "babel-runtime-6.26.0" = {
297 name = "babel-runtime";
297 name = "babel-runtime";
298 packageName = "babel-runtime";
298 packageName = "babel-runtime";
299 version = "6.26.0";
299 version = "6.26.0";
300 src = fetchurl {
300 src = fetchurl {
301 url = "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz";
301 url = "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz";
302 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
302 sha1 = "965c7058668e82b55d7bfe04ff2337bc8b5647fe";
303 };
303 };
304 };
304 };
305 "balanced-match-1.0.0" = {
305 "balanced-match-1.0.0" = {
306 name = "balanced-match";
306 name = "balanced-match";
307 packageName = "balanced-match";
307 packageName = "balanced-match";
308 version = "1.0.0";
308 version = "1.0.0";
309 src = fetchurl {
309 src = fetchurl {
310 url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
310 url = "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.0.tgz";
311 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
311 sha1 = "89b4d199ab2bee49de164ea02b89ce462d71b767";
312 };
312 };
313 };
313 };
314 "base64-js-1.2.3" = {
314 "base64-js-1.2.3" = {
315 name = "base64-js";
315 name = "base64-js";
316 packageName = "base64-js";
316 packageName = "base64-js";
317 version = "1.2.3";
317 version = "1.2.3";
318 src = fetchurl {
318 src = fetchurl {
319 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz";
319 url = "https://registry.npmjs.org/base64-js/-/base64-js-1.2.3.tgz";
320 sha512 = "MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==";
320 sha512 = "MsAhsUW1GxCdgYSO6tAfZrNapmUKk7mWx/k5mFY/A1gBtkaCaNapTg+FExCw1r9yeaZhqx/xPg43xgTFH6KL5w==";
321 };
321 };
322 };
322 };
323 "bcrypt-pbkdf-1.0.2" = {
323 "bcrypt-pbkdf-1.0.2" = {
324 name = "bcrypt-pbkdf";
324 name = "bcrypt-pbkdf";
325 packageName = "bcrypt-pbkdf";
325 packageName = "bcrypt-pbkdf";
326 version = "1.0.2";
326 version = "1.0.2";
327 src = fetchurl {
327 src = fetchurl {
328 url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
328 url = "https://registry.npmjs.org/bcrypt-pbkdf/-/bcrypt-pbkdf-1.0.2.tgz";
329 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
329 sha1 = "a4301d389b6a43f9b67ff3ca11a3f6637e360e9e";
330 };
330 };
331 };
331 };
332 "boom-2.10.1" = {
332 "boom-2.10.1" = {
333 name = "boom";
333 name = "boom";
334 packageName = "boom";
334 packageName = "boom";
335 version = "2.10.1";
335 version = "2.10.1";
336 src = fetchurl {
336 src = fetchurl {
337 url = "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz";
337 url = "https://registry.npmjs.org/boom/-/boom-2.10.1.tgz";
338 sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
338 sha1 = "39c8918ceff5799f83f9492a848f625add0c766f";
339 };
339 };
340 };
340 };
341 "bower-1.8.4" = {
341 "bower-1.8.4" = {
342 name = "bower";
342 name = "bower";
343 packageName = "bower";
343 packageName = "bower";
344 version = "1.8.4";
344 version = "1.8.4";
345 src = fetchurl {
345 src = fetchurl {
346 url = "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz";
346 url = "https://registry.npmjs.org/bower/-/bower-1.8.4.tgz";
347 sha1 = "e7876a076deb8137f7d06525dc5e8c66db82f28a";
347 sha1 = "e7876a076deb8137f7d06525dc5e8c66db82f28a";
348 };
348 };
349 };
349 };
350 "brace-expansion-1.1.11" = {
350 "brace-expansion-1.1.11" = {
351 name = "brace-expansion";
351 name = "brace-expansion";
352 packageName = "brace-expansion";
352 packageName = "brace-expansion";
353 version = "1.1.11";
353 version = "1.1.11";
354 src = fetchurl {
354 src = fetchurl {
355 url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
355 url = "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz";
356 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
356 sha512 = "iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==";
357 };
357 };
358 };
358 };
359 "buffer-from-1.1.1" = {
359 "buffer-from-1.1.1" = {
360 name = "buffer-from";
360 name = "buffer-from";
361 packageName = "buffer-from";
361 packageName = "buffer-from";
362 version = "1.1.1";
362 version = "1.1.1";
363 src = fetchurl {
363 src = fetchurl {
364 url = "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz";
364 url = "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz";
365 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
365 sha512 = "MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==";
366 };
366 };
367 };
367 };
368 "builtin-modules-1.1.1" = {
368 "builtin-modules-1.1.1" = {
369 name = "builtin-modules";
369 name = "builtin-modules";
370 packageName = "builtin-modules";
370 packageName = "builtin-modules";
371 version = "1.1.1";
371 version = "1.1.1";
372 src = fetchurl {
372 src = fetchurl {
373 url = "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz";
373 url = "https://registry.npmjs.org/builtin-modules/-/builtin-modules-1.1.1.tgz";
374 sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
374 sha1 = "270f076c5a72c02f5b65a47df94c5fe3a278892f";
375 };
375 };
376 };
376 };
377 "builtins-1.0.3" = {
377 "builtins-1.0.3" = {
378 name = "builtins";
378 name = "builtins";
379 packageName = "builtins";
379 packageName = "builtins";
380 version = "1.0.3";
380 version = "1.0.3";
381 src = fetchurl {
381 src = fetchurl {
382 url = "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz";
382 url = "https://registry.npmjs.org/builtins/-/builtins-1.0.3.tgz";
383 sha1 = "cb94faeb61c8696451db36534e1422f94f0aee88";
383 sha1 = "cb94faeb61c8696451db36534e1422f94f0aee88";
384 };
384 };
385 };
385 };
386 "caseless-0.12.0" = {
386 "caseless-0.12.0" = {
387 name = "caseless";
387 name = "caseless";
388 packageName = "caseless";
388 packageName = "caseless";
389 version = "0.12.0";
389 version = "0.12.0";
390 src = fetchurl {
390 src = fetchurl {
391 url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
391 url = "https://registry.npmjs.org/caseless/-/caseless-0.12.0.tgz";
392 sha1 = "1b681c21ff84033c826543090689420d187151dc";
392 sha1 = "1b681c21ff84033c826543090689420d187151dc";
393 };
393 };
394 };
394 };
395 "chalk-0.5.1" = {
395 "chalk-0.5.1" = {
396 name = "chalk";
396 name = "chalk";
397 packageName = "chalk";
397 packageName = "chalk";
398 version = "0.5.1";
398 version = "0.5.1";
399 src = fetchurl {
399 src = fetchurl {
400 url = "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz";
400 url = "https://registry.npmjs.org/chalk/-/chalk-0.5.1.tgz";
401 sha1 = "663b3a648b68b55d04690d49167aa837858f2174";
401 sha1 = "663b3a648b68b55d04690d49167aa837858f2174";
402 };
402 };
403 };
403 };
404 "chalk-1.1.3" = {
404 "chalk-1.1.3" = {
405 name = "chalk";
405 name = "chalk";
406 packageName = "chalk";
406 packageName = "chalk";
407 version = "1.1.3";
407 version = "1.1.3";
408 src = fetchurl {
408 src = fetchurl {
409 url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
409 url = "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz";
410 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
410 sha1 = "a8115c55e4a702fe4d150abd3872822a7e09fc98";
411 };
411 };
412 };
412 };
413 "cli-1.0.1" = {
413 "cli-1.0.1" = {
414 name = "cli";
414 name = "cli";
415 packageName = "cli";
415 packageName = "cli";
416 version = "1.0.1";
416 version = "1.0.1";
417 src = fetchurl {
417 src = fetchurl {
418 url = "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz";
418 url = "https://registry.npmjs.org/cli/-/cli-1.0.1.tgz";
419 sha1 = "22817534f24bfa4950c34d532d48ecbc621b8c14";
419 sha1 = "22817534f24bfa4950c34d532d48ecbc621b8c14";
420 };
420 };
421 };
421 };
422 "clipboard-2.0.1" = {
422 "clipboard-2.0.1" = {
423 name = "clipboard";
423 name = "clipboard";
424 packageName = "clipboard";
424 packageName = "clipboard";
425 version = "2.0.1";
425 version = "2.0.1";
426 src = fetchurl {
426 src = fetchurl {
427 url = "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz";
427 url = "https://registry.npmjs.org/clipboard/-/clipboard-2.0.1.tgz";
428 sha512 = "7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==";
428 sha512 = "7yhQBmtN+uYZmfRjjVjKa0dZdWuabzpSKGtyQZN+9C8xlC788SSJjOHWh7tzurfwTqTD5UDYAhIv5fRJg3sHjQ==";
429 };
429 };
430 };
430 };
431 "clone-1.0.4" = {
431 "clone-1.0.4" = {
432 name = "clone";
432 name = "clone";
433 packageName = "clone";
433 packageName = "clone";
434 version = "1.0.4";
434 version = "1.0.4";
435 src = fetchurl {
435 src = fetchurl {
436 url = "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz";
436 url = "https://registry.npmjs.org/clone/-/clone-1.0.4.tgz";
437 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
437 sha1 = "da309cc263df15994c688ca902179ca3c7cd7c7e";
438 };
438 };
439 };
439 };
440 "co-4.6.0" = {
440 "co-4.6.0" = {
441 name = "co";
441 name = "co";
442 packageName = "co";
442 packageName = "co";
443 version = "4.6.0";
443 version = "4.6.0";
444 src = fetchurl {
444 src = fetchurl {
445 url = "https://registry.npmjs.org/co/-/co-4.6.0.tgz";
445 url = "https://registry.npmjs.org/co/-/co-4.6.0.tgz";
446 sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
446 sha1 = "6ea6bdf3d853ae54ccb8e47bfa0bf3f9031fb184";
447 };
447 };
448 };
448 };
449 "code-point-at-1.1.0" = {
449 "code-point-at-1.1.0" = {
450 name = "code-point-at";
450 name = "code-point-at";
451 packageName = "code-point-at";
451 packageName = "code-point-at";
452 version = "1.1.0";
452 version = "1.1.0";
453 src = fetchurl {
453 src = fetchurl {
454 url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";
454 url = "https://registry.npmjs.org/code-point-at/-/code-point-at-1.1.0.tgz";
455 sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
455 sha1 = "0d070b4d043a5bea33a2f1a40e2edb3d9a4ccf77";
456 };
456 };
457 };
457 };
458 "coffee-script-1.3.3" = {
458 "coffee-script-1.3.3" = {
459 name = "coffee-script";
459 name = "coffee-script";
460 packageName = "coffee-script";
460 packageName = "coffee-script";
461 version = "1.3.3";
461 version = "1.3.3";
462 src = fetchurl {
462 src = fetchurl {
463 url = "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz";
463 url = "https://registry.npmjs.org/coffee-script/-/coffee-script-1.3.3.tgz";
464 sha1 = "150d6b4cb522894369efed6a2101c20bc7f4a4f4";
464 sha1 = "150d6b4cb522894369efed6a2101c20bc7f4a4f4";
465 };
465 };
466 };
466 };
467 "colors-0.6.2" = {
467 "colors-0.6.2" = {
468 name = "colors";
468 name = "colors";
469 packageName = "colors";
469 packageName = "colors";
470 version = "0.6.2";
470 version = "0.6.2";
471 src = fetchurl {
471 src = fetchurl {
472 url = "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz";
472 url = "https://registry.npmjs.org/colors/-/colors-0.6.2.tgz";
473 sha1 = "2423fe6678ac0c5dae8852e5d0e5be08c997abcc";
473 sha1 = "2423fe6678ac0c5dae8852e5d0e5be08c997abcc";
474 };
474 };
475 };
475 };
476 "colors-1.0.3" = {
476 "colors-1.0.3" = {
477 name = "colors";
477 name = "colors";
478 packageName = "colors";
478 packageName = "colors";
479 version = "1.0.3";
479 version = "1.0.3";
480 src = fetchurl {
480 src = fetchurl {
481 url = "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz";
481 url = "https://registry.npmjs.org/colors/-/colors-1.0.3.tgz";
482 sha1 = "0433f44d809680fdeb60ed260f1b0c262e82a40b";
482 sha1 = "0433f44d809680fdeb60ed260f1b0c262e82a40b";
483 };
483 };
484 };
484 };
485 "combined-stream-1.0.6" = {
485 "combined-stream-1.0.7" = {
486 name = "combined-stream";
486 name = "combined-stream";
487 packageName = "combined-stream";
487 packageName = "combined-stream";
488 version = "1.0.6";
488 version = "1.0.7";
489 src = fetchurl {
489 src = fetchurl {
490 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.6.tgz";
490 url = "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.7.tgz";
491 sha1 = "723e7df6e801ac5613113a7e445a9b69cb632818";
491 sha512 = "brWl9y6vOB1xYPZcpZde3N9zDByXTosAeMDo4p1wzo6UMOX4vumB+TP1RZ76sfE6Md68Q0NJSrE/gbezd4Ul+w==";
492 };
492 };
493 };
493 };
494 "command-line-args-3.0.5" = {
494 "command-line-args-3.0.5" = {
495 name = "command-line-args";
495 name = "command-line-args";
496 packageName = "command-line-args";
496 packageName = "command-line-args";
497 version = "3.0.5";
497 version = "3.0.5";
498 src = fetchurl {
498 src = fetchurl {
499 url = "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz";
499 url = "https://registry.npmjs.org/command-line-args/-/command-line-args-3.0.5.tgz";
500 sha1 = "5bd4ad45e7983e5c1344918e40280ee2693c5ac0";
500 sha1 = "5bd4ad45e7983e5c1344918e40280ee2693c5ac0";
501 };
501 };
502 };
502 };
503 "command-line-usage-3.0.8" = {
503 "command-line-usage-3.0.8" = {
504 name = "command-line-usage";
504 name = "command-line-usage";
505 packageName = "command-line-usage";
505 packageName = "command-line-usage";
506 version = "3.0.8";
506 version = "3.0.8";
507 src = fetchurl {
507 src = fetchurl {
508 url = "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz";
508 url = "https://registry.npmjs.org/command-line-usage/-/command-line-usage-3.0.8.tgz";
509 sha1 = "b6a20978c1b383477f5c11a529428b880bfe0f4d";
509 sha1 = "b6a20978c1b383477f5c11a529428b880bfe0f4d";
510 };
510 };
511 };
511 };
512 "concat-map-0.0.1" = {
512 "concat-map-0.0.1" = {
513 name = "concat-map";
513 name = "concat-map";
514 packageName = "concat-map";
514 packageName = "concat-map";
515 version = "0.0.1";
515 version = "0.0.1";
516 src = fetchurl {
516 src = fetchurl {
517 url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
517 url = "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz";
518 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
518 sha1 = "d8a96bd77fd68df7793a73036a3ba0d5405d477b";
519 };
519 };
520 };
520 };
521 "concat-stream-1.6.2" = {
521 "concat-stream-1.6.2" = {
522 name = "concat-stream";
522 name = "concat-stream";
523 packageName = "concat-stream";
523 packageName = "concat-stream";
524 version = "1.6.2";
524 version = "1.6.2";
525 src = fetchurl {
525 src = fetchurl {
526 url = "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz";
526 url = "https://registry.npmjs.org/concat-stream/-/concat-stream-1.6.2.tgz";
527 sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==";
527 sha512 = "27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==";
528 };
528 };
529 };
529 };
530 "config-chain-1.1.11" = {
530 "config-chain-1.1.12" = {
531 name = "config-chain";
531 name = "config-chain";
532 packageName = "config-chain";
532 packageName = "config-chain";
533 version = "1.1.11";
533 version = "1.1.12";
534 src = fetchurl {
534 src = fetchurl {
535 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.11.tgz";
535 url = "https://registry.npmjs.org/config-chain/-/config-chain-1.1.12.tgz";
536 sha1 = "aba09747dfbe4c3e70e766a6e41586e1859fc6f2";
536 sha512 = "a1eOIcu8+7lUInge4Rpf/n4Krkf3Dd9lqhljRzII1/Zno/kRtUWnznPO3jOKBmTEktkt3fkxisUcivoj0ebzoA==";
537 };
537 };
538 };
538 };
539 "console-browserify-1.1.0" = {
539 "console-browserify-1.1.0" = {
540 name = "console-browserify";
540 name = "console-browserify";
541 packageName = "console-browserify";
541 packageName = "console-browserify";
542 version = "1.1.0";
542 version = "1.1.0";
543 src = fetchurl {
543 src = fetchurl {
544 url = "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz";
544 url = "https://registry.npmjs.org/console-browserify/-/console-browserify-1.1.0.tgz";
545 sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
545 sha1 = "f0241c45730a9fc6323b206dbf38edc741d0bb10";
546 };
546 };
547 };
547 };
548 "console-control-strings-1.1.0" = {
548 "console-control-strings-1.1.0" = {
549 name = "console-control-strings";
549 name = "console-control-strings";
550 packageName = "console-control-strings";
550 packageName = "console-control-strings";
551 version = "1.1.0";
551 version = "1.1.0";
552 src = fetchurl {
552 src = fetchurl {
553 url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";
553 url = "https://registry.npmjs.org/console-control-strings/-/console-control-strings-1.1.0.tgz";
554 sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
554 sha1 = "3d7cf4464db6446ea644bf4b39507f9851008e8e";
555 };
555 };
556 };
556 };
557 "core-js-2.5.7" = {
557 "core-js-2.5.7" = {
558 name = "core-js";
558 name = "core-js";
559 packageName = "core-js";
559 packageName = "core-js";
560 version = "2.5.7";
560 version = "2.5.7";
561 src = fetchurl {
561 src = fetchurl {
562 url = "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz";
562 url = "https://registry.npmjs.org/core-js/-/core-js-2.5.7.tgz";
563 sha512 = "RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==";
563 sha512 = "RszJCAxg/PP6uzXVXL6BsxSXx/B05oJAQ2vkJRjyjrEcNVycaqOmNb5OTxZPE3xa5gwZduqza6L9JOCenh/Ecw==";
564 };
564 };
565 };
565 };
566 "core-util-is-1.0.2" = {
566 "core-util-is-1.0.2" = {
567 name = "core-util-is";
567 name = "core-util-is";
568 packageName = "core-util-is";
568 packageName = "core-util-is";
569 version = "1.0.2";
569 version = "1.0.2";
570 src = fetchurl {
570 src = fetchurl {
571 url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
571 url = "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz";
572 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
572 sha1 = "b5fd54220aa2bc5ab57aab7140c940754503c1a7";
573 };
573 };
574 };
574 };
575 "crisper-1.2.0" = {
575 "crisper-1.2.0" = {
576 name = "crisper";
576 name = "crisper";
577 packageName = "crisper";
577 packageName = "crisper";
578 version = "1.2.0";
578 version = "1.2.0";
579 src = fetchurl {
579 src = fetchurl {
580 url = "https://registry.npmjs.org/crisper/-/crisper-1.2.0.tgz";
580 url = "https://registry.npmjs.org/crisper/-/crisper-1.2.0.tgz";
581 sha1 = "9a91f597d71f6110294e076ad44dbb3408568e46";
581 sha1 = "9a91f597d71f6110294e076ad44dbb3408568e46";
582 };
582 };
583 };
583 };
584 "crisper-2.1.1" = {
584 "crisper-2.1.1" = {
585 name = "crisper";
585 name = "crisper";
586 packageName = "crisper";
586 packageName = "crisper";
587 version = "2.1.1";
587 version = "2.1.1";
588 src = fetchurl {
588 src = fetchurl {
589 url = "https://registry.npmjs.org/crisper/-/crisper-2.1.1.tgz";
589 url = "https://registry.npmjs.org/crisper/-/crisper-2.1.1.tgz";
590 sha512 = "yxfj9nTbFunDASztAxVF8hCPwaZBvTjayNzG3YL/VVQfQaKBXX2+TM3p1xB1Pxd8RYeDQJkJIQRwM3FQSIa+pw==";
590 sha512 = "yxfj9nTbFunDASztAxVF8hCPwaZBvTjayNzG3YL/VVQfQaKBXX2+TM3p1xB1Pxd8RYeDQJkJIQRwM3FQSIa+pw==";
591 };
591 };
592 };
592 };
593 "cryptiles-2.0.5" = {
593 "cryptiles-2.0.5" = {
594 name = "cryptiles";
594 name = "cryptiles";
595 packageName = "cryptiles";
595 packageName = "cryptiles";
596 version = "2.0.5";
596 version = "2.0.5";
597 src = fetchurl {
597 src = fetchurl {
598 url = "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz";
598 url = "https://registry.npmjs.org/cryptiles/-/cryptiles-2.0.5.tgz";
599 sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
599 sha1 = "3bdfecdc608147c1c67202fa291e7dca59eaa3b8";
600 };
600 };
601 };
601 };
602 "cycle-1.0.3" = {
602 "cycle-1.0.3" = {
603 name = "cycle";
603 name = "cycle";
604 packageName = "cycle";
604 packageName = "cycle";
605 version = "1.0.3";
605 version = "1.0.3";
606 src = fetchurl {
606 src = fetchurl {
607 url = "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz";
607 url = "https://registry.npmjs.org/cycle/-/cycle-1.0.3.tgz";
608 sha1 = "21e80b2be8580f98b468f379430662b046c34ad2";
608 sha1 = "21e80b2be8580f98b468f379430662b046c34ad2";
609 };
609 };
610 };
610 };
611 "dashdash-1.14.1" = {
611 "dashdash-1.14.1" = {
612 name = "dashdash";
612 name = "dashdash";
613 packageName = "dashdash";
613 packageName = "dashdash";
614 version = "1.14.1";
614 version = "1.14.1";
615 src = fetchurl {
615 src = fetchurl {
616 url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
616 url = "https://registry.npmjs.org/dashdash/-/dashdash-1.14.1.tgz";
617 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
617 sha1 = "853cfa0f7cbe2fed5de20326b8dd581035f6e2f0";
618 };
618 };
619 };
619 };
620 "date-now-0.1.4" = {
620 "date-now-0.1.4" = {
621 name = "date-now";
621 name = "date-now";
622 packageName = "date-now";
622 packageName = "date-now";
623 version = "0.1.4";
623 version = "0.1.4";
624 src = fetchurl {
624 src = fetchurl {
625 url = "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz";
625 url = "https://registry.npmjs.org/date-now/-/date-now-0.1.4.tgz";
626 sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b";
626 sha1 = "eaf439fd4d4848ad74e5cc7dbef200672b9e345b";
627 };
627 };
628 };
628 };
629 "dateformat-1.0.2-1.2.3" = {
629 "dateformat-1.0.2-1.2.3" = {
630 name = "dateformat";
630 name = "dateformat";
631 packageName = "dateformat";
631 packageName = "dateformat";
632 version = "1.0.2-1.2.3";
632 version = "1.0.2-1.2.3";
633 src = fetchurl {
633 src = fetchurl {
634 url = "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz";
634 url = "https://registry.npmjs.org/dateformat/-/dateformat-1.0.2-1.2.3.tgz";
635 sha1 = "b0220c02de98617433b72851cf47de3df2cdbee9";
635 sha1 = "b0220c02de98617433b72851cf47de3df2cdbee9";
636 };
636 };
637 };
637 };
638 "debug-0.7.4" = {
638 "debug-0.7.4" = {
639 name = "debug";
639 name = "debug";
640 packageName = "debug";
640 packageName = "debug";
641 version = "0.7.4";
641 version = "0.7.4";
642 src = fetchurl {
642 src = fetchurl {
643 url = "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz";
643 url = "https://registry.npmjs.org/debug/-/debug-0.7.4.tgz";
644 sha1 = "06e1ea8082c2cb14e39806e22e2f6f757f92af39";
644 sha1 = "06e1ea8082c2cb14e39806e22e2f6f757f92af39";
645 };
645 };
646 };
646 };
647 "debug-2.6.9" = {
647 "debug-2.6.9" = {
648 name = "debug";
648 name = "debug";
649 packageName = "debug";
649 packageName = "debug";
650 version = "2.6.9";
650 version = "2.6.9";
651 src = fetchurl {
651 src = fetchurl {
652 url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";
652 url = "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz";
653 sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
653 sha512 = "bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==";
654 };
654 };
655 };
655 };
656 "deep-extend-0.4.2" = {
656 "deep-extend-0.4.2" = {
657 name = "deep-extend";
657 name = "deep-extend";
658 packageName = "deep-extend";
658 packageName = "deep-extend";
659 version = "0.4.2";
659 version = "0.4.2";
660 src = fetchurl {
660 src = fetchurl {
661 url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz";
661 url = "https://registry.npmjs.org/deep-extend/-/deep-extend-0.4.2.tgz";
662 sha1 = "48b699c27e334bf89f10892be432f6e4c7d34a7f";
662 sha1 = "48b699c27e334bf89f10892be432f6e4c7d34a7f";
663 };
663 };
664 };
664 };
665 "deep-is-0.1.3" = {
665 "deep-is-0.1.3" = {
666 name = "deep-is";
666 name = "deep-is";
667 packageName = "deep-is";
667 packageName = "deep-is";
668 version = "0.1.3";
668 version = "0.1.3";
669 src = fetchurl {
669 src = fetchurl {
670 url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
670 url = "https://registry.npmjs.org/deep-is/-/deep-is-0.1.3.tgz";
671 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
671 sha1 = "b369d6fb5dbc13eecf524f91b070feedc357cf34";
672 };
672 };
673 };
673 };
674 "delayed-stream-1.0.0" = {
674 "delayed-stream-1.0.0" = {
675 name = "delayed-stream";
675 name = "delayed-stream";
676 packageName = "delayed-stream";
676 packageName = "delayed-stream";
677 version = "1.0.0";
677 version = "1.0.0";
678 src = fetchurl {
678 src = fetchurl {
679 url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
679 url = "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz";
680 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
680 sha1 = "df3ae199acadfb7d440aaae0b29e2272b24ec619";
681 };
681 };
682 };
682 };
683 "delegate-3.2.0" = {
683 "delegate-3.2.0" = {
684 name = "delegate";
684 name = "delegate";
685 packageName = "delegate";
685 packageName = "delegate";
686 version = "3.2.0";
686 version = "3.2.0";
687 src = fetchurl {
687 src = fetchurl {
688 url = "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz";
688 url = "https://registry.npmjs.org/delegate/-/delegate-3.2.0.tgz";
689 sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==";
689 sha512 = "IofjkYBZaZivn0V8nnsMJGBr4jVLxHDheKSW88PyxS5QC4Vo9ZbZVvhzlSxY87fVq3STR6r+4cGepyHkcWOQSw==";
690 };
690 };
691 };
691 };
692 "delegates-1.0.0" = {
692 "delegates-1.0.0" = {
693 name = "delegates";
693 name = "delegates";
694 packageName = "delegates";
694 packageName = "delegates";
695 version = "1.0.0";
695 version = "1.0.0";
696 src = fetchurl {
696 src = fetchurl {
697 url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";
697 url = "https://registry.npmjs.org/delegates/-/delegates-1.0.0.tgz";
698 sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
698 sha1 = "84c6e159b81904fdca59a0ef44cd870d31250f9a";
699 };
699 };
700 };
700 };
701 "doctrine-0.7.2" = {
701 "doctrine-0.7.2" = {
702 name = "doctrine";
702 name = "doctrine";
703 packageName = "doctrine";
703 packageName = "doctrine";
704 version = "0.7.2";
704 version = "0.7.2";
705 src = fetchurl {
705 src = fetchurl {
706 url = "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz";
706 url = "https://registry.npmjs.org/doctrine/-/doctrine-0.7.2.tgz";
707 sha1 = "7cb860359ba3be90e040b26b729ce4bfa654c523";
707 sha1 = "7cb860359ba3be90e040b26b729ce4bfa654c523";
708 };
708 };
709 };
709 };
710 "dom-serializer-0.1.0" = {
710 "dom-serializer-0.1.0" = {
711 name = "dom-serializer";
711 name = "dom-serializer";
712 packageName = "dom-serializer";
712 packageName = "dom-serializer";
713 version = "0.1.0";
713 version = "0.1.0";
714 src = fetchurl {
714 src = fetchurl {
715 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz";
715 url = "https://registry.npmjs.org/dom-serializer/-/dom-serializer-0.1.0.tgz";
716 sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
716 sha1 = "073c697546ce0780ce23be4a28e293e40bc30c82";
717 };
717 };
718 };
718 };
719 "dom5-1.1.0" = {
719 "dom5-1.1.0" = {
720 name = "dom5";
720 name = "dom5";
721 packageName = "dom5";
721 packageName = "dom5";
722 version = "1.1.0";
722 version = "1.1.0";
723 src = fetchurl {
723 src = fetchurl {
724 url = "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz";
724 url = "https://registry.npmjs.org/dom5/-/dom5-1.1.0.tgz";
725 sha1 = "3a0c7700c083ab4c4d26938a78b0f0c6dcc37794";
725 sha1 = "3a0c7700c083ab4c4d26938a78b0f0c6dcc37794";
726 };
726 };
727 };
727 };
728 "dom5-1.3.6" = {
728 "dom5-1.3.6" = {
729 name = "dom5";
729 name = "dom5";
730 packageName = "dom5";
730 packageName = "dom5";
731 version = "1.3.6";
731 version = "1.3.6";
732 src = fetchurl {
732 src = fetchurl {
733 url = "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz";
733 url = "https://registry.npmjs.org/dom5/-/dom5-1.3.6.tgz";
734 sha1 = "a7088a9fc5f3b08dc9f6eda4c7abaeb241945e0d";
734 sha1 = "a7088a9fc5f3b08dc9f6eda4c7abaeb241945e0d";
735 };
735 };
736 };
736 };
737 "domelementtype-1.1.3" = {
737 "domelementtype-1.1.3" = {
738 name = "domelementtype";
738 name = "domelementtype";
739 packageName = "domelementtype";
739 packageName = "domelementtype";
740 version = "1.1.3";
740 version = "1.1.3";
741 src = fetchurl {
741 src = fetchurl {
742 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz";
742 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.1.3.tgz";
743 sha1 = "bd28773e2642881aec51544924299c5cd822185b";
743 sha1 = "bd28773e2642881aec51544924299c5cd822185b";
744 };
744 };
745 };
745 };
746 "domelementtype-1.3.0" = {
746 "domelementtype-1.3.0" = {
747 name = "domelementtype";
747 name = "domelementtype";
748 packageName = "domelementtype";
748 packageName = "domelementtype";
749 version = "1.3.0";
749 version = "1.3.0";
750 src = fetchurl {
750 src = fetchurl {
751 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz";
751 url = "https://registry.npmjs.org/domelementtype/-/domelementtype-1.3.0.tgz";
752 sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2";
752 sha1 = "b17aed82e8ab59e52dd9c19b1756e0fc187204c2";
753 };
753 };
754 };
754 };
755 "domhandler-2.3.0" = {
755 "domhandler-2.3.0" = {
756 name = "domhandler";
756 name = "domhandler";
757 packageName = "domhandler";
757 packageName = "domhandler";
758 version = "2.3.0";
758 version = "2.3.0";
759 src = fetchurl {
759 src = fetchurl {
760 url = "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz";
760 url = "https://registry.npmjs.org/domhandler/-/domhandler-2.3.0.tgz";
761 sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738";
761 sha1 = "2de59a0822d5027fabff6f032c2b25a2a8abe738";
762 };
762 };
763 };
763 };
764 "domutils-1.5.1" = {
764 "domutils-1.5.1" = {
765 name = "domutils";
765 name = "domutils";
766 packageName = "domutils";
766 packageName = "domutils";
767 version = "1.5.1";
767 version = "1.5.1";
768 src = fetchurl {
768 src = fetchurl {
769 url = "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz";
769 url = "https://registry.npmjs.org/domutils/-/domutils-1.5.1.tgz";
770 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
770 sha1 = "dcd8488a26f563d61079e48c9f7b7e32373682cf";
771 };
771 };
772 };
772 };
773 "ecc-jsbn-0.1.2" = {
773 "ecc-jsbn-0.1.2" = {
774 name = "ecc-jsbn";
774 name = "ecc-jsbn";
775 packageName = "ecc-jsbn";
775 packageName = "ecc-jsbn";
776 version = "0.1.2";
776 version = "0.1.2";
777 src = fetchurl {
777 src = fetchurl {
778 url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
778 url = "https://registry.npmjs.org/ecc-jsbn/-/ecc-jsbn-0.1.2.tgz";
779 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
779 sha1 = "3a83a904e54353287874c564b7549386849a98c9";
780 };
780 };
781 };
781 };
782 "entities-1.0.0" = {
782 "entities-1.0.0" = {
783 name = "entities";
783 name = "entities";
784 packageName = "entities";
784 packageName = "entities";
785 version = "1.0.0";
785 version = "1.0.0";
786 src = fetchurl {
786 src = fetchurl {
787 url = "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz";
787 url = "https://registry.npmjs.org/entities/-/entities-1.0.0.tgz";
788 sha1 = "b2987aa3821347fcde642b24fdfc9e4fb712bf26";
788 sha1 = "b2987aa3821347fcde642b24fdfc9e4fb712bf26";
789 };
789 };
790 };
790 };
791 "entities-1.1.1" = {
791 "entities-1.1.1" = {
792 name = "entities";
792 name = "entities";
793 packageName = "entities";
793 packageName = "entities";
794 version = "1.1.1";
794 version = "1.1.1";
795 src = fetchurl {
795 src = fetchurl {
796 url = "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz";
796 url = "https://registry.npmjs.org/entities/-/entities-1.1.1.tgz";
797 sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0";
797 sha1 = "6e5c2d0a5621b5dadaecef80b90edfb5cd7772f0";
798 };
798 };
799 };
799 };
800 "errno-0.1.7" = {
800 "errno-0.1.7" = {
801 name = "errno";
801 name = "errno";
802 packageName = "errno";
802 packageName = "errno";
803 version = "0.1.7";
803 version = "0.1.7";
804 src = fetchurl {
804 src = fetchurl {
805 url = "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz";
805 url = "https://registry.npmjs.org/errno/-/errno-0.1.7.tgz";
806 sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==";
806 sha512 = "MfrRBDWzIWifgq6tJj60gkAwtLNb6sQPlcFrSOflcP1aFmmruKQ2wRnze/8V6kgyz7H3FF8Npzv78mZ7XLLflg==";
807 };
807 };
808 };
808 };
809 "es6-promise-2.3.0" = {
809 "es6-promise-2.3.0" = {
810 name = "es6-promise";
810 name = "es6-promise";
811 packageName = "es6-promise";
811 packageName = "es6-promise";
812 version = "2.3.0";
812 version = "2.3.0";
813 src = fetchurl {
813 src = fetchurl {
814 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz";
814 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-2.3.0.tgz";
815 sha1 = "96edb9f2fdb01995822b263dd8aadab6748181bc";
815 sha1 = "96edb9f2fdb01995822b263dd8aadab6748181bc";
816 };
816 };
817 };
817 };
818 "es6-promise-4.2.4" = {
818 "es6-promise-4.2.5" = {
819 name = "es6-promise";
819 name = "es6-promise";
820 packageName = "es6-promise";
820 packageName = "es6-promise";
821 version = "4.2.4";
821 version = "4.2.5";
822 src = fetchurl {
822 src = fetchurl {
823 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.4.tgz";
823 url = "https://registry.npmjs.org/es6-promise/-/es6-promise-4.2.5.tgz";
824 sha512 = "/NdNZVJg+uZgtm9eS3O6lrOLYmQag2DjdEXuPaHlZ6RuVqgqaVZfgYCepEIKsLqwdQArOPtC3XzRLqGGfT8KQQ==";
824 sha512 = "n6wvpdE43VFtJq+lUDYDBFUwV8TZbuGXLV4D6wKafg13ldznKsyEvatubnmUe31zcvelSzOHF+XbaT+Bl9ObDg==";
825 };
825 };
826 };
826 };
827 "escape-string-regexp-1.0.5" = {
827 "escape-string-regexp-1.0.5" = {
828 name = "escape-string-regexp";
828 name = "escape-string-regexp";
829 packageName = "escape-string-regexp";
829 packageName = "escape-string-regexp";
830 version = "1.0.5";
830 version = "1.0.5";
831 src = fetchurl {
831 src = fetchurl {
832 url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
832 url = "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz";
833 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
833 sha1 = "1b61c0562190a8dff6ae3bb2cf0200ca130b86d4";
834 };
834 };
835 };
835 };
836 "escodegen-1.11.0" = {
836 "escodegen-1.11.0" = {
837 name = "escodegen";
837 name = "escodegen";
838 packageName = "escodegen";
838 packageName = "escodegen";
839 version = "1.11.0";
839 version = "1.11.0";
840 src = fetchurl {
840 src = fetchurl {
841 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz";
841 url = "https://registry.npmjs.org/escodegen/-/escodegen-1.11.0.tgz";
842 sha512 = "IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==";
842 sha512 = "IeMV45ReixHS53K/OmfKAIztN/igDHzTJUhZM3k1jMhIZWjk45SMwAtBsEXiJp3vSPmTcu6CXn7mDvFHRN66fw==";
843 };
843 };
844 };
844 };
845 "espree-3.5.4" = {
845 "espree-3.5.4" = {
846 name = "espree";
846 name = "espree";
847 packageName = "espree";
847 packageName = "espree";
848 version = "3.5.4";
848 version = "3.5.4";
849 src = fetchurl {
849 src = fetchurl {
850 url = "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz";
850 url = "https://registry.npmjs.org/espree/-/espree-3.5.4.tgz";
851 sha512 = "yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==";
851 sha512 = "yAcIQxtmMiB/jL32dzEp2enBeidsB7xWPLNiw3IIkpVds1P+h7qF9YwJq1yUNzp2OKXgAprs4F61ih66UsoD1A==";
852 };
852 };
853 };
853 };
854 "esprima-1.0.4" = {
854 "esprima-1.0.4" = {
855 name = "esprima";
855 name = "esprima";
856 packageName = "esprima";
856 packageName = "esprima";
857 version = "1.0.4";
857 version = "1.0.4";
858 src = fetchurl {
858 src = fetchurl {
859 url = "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz";
859 url = "https://registry.npmjs.org/esprima/-/esprima-1.0.4.tgz";
860 sha1 = "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad";
860 sha1 = "9f557e08fc3b4d26ece9dd34f8fbf476b62585ad";
861 };
861 };
862 };
862 };
863 "esprima-3.1.3" = {
863 "esprima-3.1.3" = {
864 name = "esprima";
864 name = "esprima";
865 packageName = "esprima";
865 packageName = "esprima";
866 version = "3.1.3";
866 version = "3.1.3";
867 src = fetchurl {
867 src = fetchurl {
868 url = "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz";
868 url = "https://registry.npmjs.org/esprima/-/esprima-3.1.3.tgz";
869 sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
869 sha1 = "fdca51cee6133895e3c88d535ce49dbff62a4633";
870 };
870 };
871 };
871 };
872 "estraverse-3.1.0" = {
872 "estraverse-3.1.0" = {
873 name = "estraverse";
873 name = "estraverse";
874 packageName = "estraverse";
874 packageName = "estraverse";
875 version = "3.1.0";
875 version = "3.1.0";
876 src = fetchurl {
876 src = fetchurl {
877 url = "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz";
877 url = "https://registry.npmjs.org/estraverse/-/estraverse-3.1.0.tgz";
878 sha1 = "15e28a446b8b82bc700ccc8b96c78af4da0d6cba";
878 sha1 = "15e28a446b8b82bc700ccc8b96c78af4da0d6cba";
879 };
879 };
880 };
880 };
881 "estraverse-4.2.0" = {
881 "estraverse-4.2.0" = {
882 name = "estraverse";
882 name = "estraverse";
883 packageName = "estraverse";
883 packageName = "estraverse";
884 version = "4.2.0";
884 version = "4.2.0";
885 src = fetchurl {
885 src = fetchurl {
886 url = "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz";
886 url = "https://registry.npmjs.org/estraverse/-/estraverse-4.2.0.tgz";
887 sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
887 sha1 = "0dee3fed31fcd469618ce7342099fc1afa0bdb13";
888 };
888 };
889 };
889 };
890 "esutils-1.1.6" = {
890 "esutils-1.1.6" = {
891 name = "esutils";
891 name = "esutils";
892 packageName = "esutils";
892 packageName = "esutils";
893 version = "1.1.6";
893 version = "1.1.6";
894 src = fetchurl {
894 src = fetchurl {
895 url = "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz";
895 url = "https://registry.npmjs.org/esutils/-/esutils-1.1.6.tgz";
896 sha1 = "c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375";
896 sha1 = "c01ccaa9ae4b897c6d0c3e210ae52f3c7a844375";
897 };
897 };
898 };
898 };
899 "esutils-2.0.2" = {
899 "esutils-2.0.2" = {
900 name = "esutils";
900 name = "esutils";
901 packageName = "esutils";
901 packageName = "esutils";
902 version = "2.0.2";
902 version = "2.0.2";
903 src = fetchurl {
903 src = fetchurl {
904 url = "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz";
904 url = "https://registry.npmjs.org/esutils/-/esutils-2.0.2.tgz";
905 sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
905 sha1 = "0abf4f1caa5bcb1f7a9d8acc6dea4faaa04bac9b";
906 };
906 };
907 };
907 };
908 "eventemitter2-0.4.14" = {
908 "eventemitter2-0.4.14" = {
909 name = "eventemitter2";
909 name = "eventemitter2";
910 packageName = "eventemitter2";
910 packageName = "eventemitter2";
911 version = "0.4.14";
911 version = "0.4.14";
912 src = fetchurl {
912 src = fetchurl {
913 url = "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz";
913 url = "https://registry.npmjs.org/eventemitter2/-/eventemitter2-0.4.14.tgz";
914 sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab";
914 sha1 = "8f61b75cde012b2e9eb284d4545583b5643b61ab";
915 };
915 };
916 };
916 };
917 "exit-0.1.2" = {
917 "exit-0.1.2" = {
918 name = "exit";
918 name = "exit";
919 packageName = "exit";
919 packageName = "exit";
920 version = "0.1.2";
920 version = "0.1.2";
921 src = fetchurl {
921 src = fetchurl {
922 url = "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz";
922 url = "https://registry.npmjs.org/exit/-/exit-0.1.2.tgz";
923 sha1 = "0632638f8d877cc82107d30a0fff1a17cba1cd0c";
923 sha1 = "0632638f8d877cc82107d30a0fff1a17cba1cd0c";
924 };
924 };
925 };
925 };
926 "extend-3.0.2" = {
926 "extend-3.0.2" = {
927 name = "extend";
927 name = "extend";
928 packageName = "extend";
928 packageName = "extend";
929 version = "3.0.2";
929 version = "3.0.2";
930 src = fetchurl {
930 src = fetchurl {
931 url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
931 url = "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz";
932 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
932 sha512 = "fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==";
933 };
933 };
934 };
934 };
935 "extract-zip-1.6.7" = {
935 "extract-zip-1.6.7" = {
936 name = "extract-zip";
936 name = "extract-zip";
937 packageName = "extract-zip";
937 packageName = "extract-zip";
938 version = "1.6.7";
938 version = "1.6.7";
939 src = fetchurl {
939 src = fetchurl {
940 url = "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz";
940 url = "https://registry.npmjs.org/extract-zip/-/extract-zip-1.6.7.tgz";
941 sha1 = "a840b4b8af6403264c8db57f4f1a74333ef81fe9";
941 sha1 = "a840b4b8af6403264c8db57f4f1a74333ef81fe9";
942 };
942 };
943 };
943 };
944 "extsprintf-1.3.0" = {
944 "extsprintf-1.3.0" = {
945 name = "extsprintf";
945 name = "extsprintf";
946 packageName = "extsprintf";
946 packageName = "extsprintf";
947 version = "1.3.0";
947 version = "1.3.0";
948 src = fetchurl {
948 src = fetchurl {
949 url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
949 url = "https://registry.npmjs.org/extsprintf/-/extsprintf-1.3.0.tgz";
950 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
950 sha1 = "96918440e3041a7a414f8c52e3c574eb3c3e1e05";
951 };
951 };
952 };
952 };
953 "eyes-0.1.8" = {
953 "eyes-0.1.8" = {
954 name = "eyes";
954 name = "eyes";
955 packageName = "eyes";
955 packageName = "eyes";
956 version = "0.1.8";
956 version = "0.1.8";
957 src = fetchurl {
957 src = fetchurl {
958 url = "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz";
958 url = "https://registry.npmjs.org/eyes/-/eyes-0.1.8.tgz";
959 sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0";
959 sha1 = "62cf120234c683785d902348a800ef3e0cc20bc0";
960 };
960 };
961 };
961 };
962 "fast-levenshtein-2.0.6" = {
962 "fast-levenshtein-2.0.6" = {
963 name = "fast-levenshtein";
963 name = "fast-levenshtein";
964 packageName = "fast-levenshtein";
964 packageName = "fast-levenshtein";
965 version = "2.0.6";
965 version = "2.0.6";
966 src = fetchurl {
966 src = fetchurl {
967 url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
967 url = "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz";
968 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
968 sha1 = "3d8a5c66883a16a30ca8643e851f19baa7797917";
969 };
969 };
970 };
970 };
971 "favico.js-0.3.10" = {
971 "favico.js-0.3.10" = {
972 name = "favico.js";
972 name = "favico.js";
973 packageName = "favico.js";
973 packageName = "favico.js";
974 version = "0.3.10";
974 version = "0.3.10";
975 src = fetchurl {
975 src = fetchurl {
976 url = "https://registry.npmjs.org/favico.js/-/favico.js-0.3.10.tgz";
976 url = "https://registry.npmjs.org/favico.js/-/favico.js-0.3.10.tgz";
977 sha1 = "80586e27a117f24a8d51c18a99bdc714d4339301";
977 sha1 = "80586e27a117f24a8d51c18a99bdc714d4339301";
978 };
978 };
979 };
979 };
980 "faye-websocket-0.4.4" = {
980 "faye-websocket-0.4.4" = {
981 name = "faye-websocket";
981 name = "faye-websocket";
982 packageName = "faye-websocket";
982 packageName = "faye-websocket";
983 version = "0.4.4";
983 version = "0.4.4";
984 src = fetchurl {
984 src = fetchurl {
985 url = "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz";
985 url = "https://registry.npmjs.org/faye-websocket/-/faye-websocket-0.4.4.tgz";
986 sha1 = "c14c5b3bf14d7417ffbfd990c0a7495cd9f337bc";
986 sha1 = "c14c5b3bf14d7417ffbfd990c0a7495cd9f337bc";
987 };
987 };
988 };
988 };
989 "fd-slicer-1.0.1" = {
989 "fd-slicer-1.0.1" = {
990 name = "fd-slicer";
990 name = "fd-slicer";
991 packageName = "fd-slicer";
991 packageName = "fd-slicer";
992 version = "1.0.1";
992 version = "1.0.1";
993 src = fetchurl {
993 src = fetchurl {
994 url = "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz";
994 url = "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.0.1.tgz";
995 sha1 = "8b5bcbd9ec327c5041bf9ab023fd6750f1177e65";
995 sha1 = "8b5bcbd9ec327c5041bf9ab023fd6750f1177e65";
996 };
996 };
997 };
997 };
998 "feature-detect-es6-1.5.0" = {
998 "feature-detect-es6-1.5.0" = {
999 name = "feature-detect-es6";
999 name = "feature-detect-es6";
1000 packageName = "feature-detect-es6";
1000 packageName = "feature-detect-es6";
1001 version = "1.5.0";
1001 version = "1.5.0";
1002 src = fetchurl {
1002 src = fetchurl {
1003 url = "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.5.0.tgz";
1003 url = "https://registry.npmjs.org/feature-detect-es6/-/feature-detect-es6-1.5.0.tgz";
1004 sha512 = "DzWPIGzTnfp3/KK1d/YPfmgLqeDju9F2DQYBL35VusgSApcA7XGqVtXfR4ETOOFEzdFJ3J7zh0Gkk011TiA4uQ==";
1004 sha512 = "DzWPIGzTnfp3/KK1d/YPfmgLqeDju9F2DQYBL35VusgSApcA7XGqVtXfR4ETOOFEzdFJ3J7zh0Gkk011TiA4uQ==";
1005 };
1005 };
1006 };
1006 };
1007 "file-sync-cmp-0.1.1" = {
1007 "file-sync-cmp-0.1.1" = {
1008 name = "file-sync-cmp";
1008 name = "file-sync-cmp";
1009 packageName = "file-sync-cmp";
1009 packageName = "file-sync-cmp";
1010 version = "0.1.1";
1010 version = "0.1.1";
1011 src = fetchurl {
1011 src = fetchurl {
1012 url = "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz";
1012 url = "https://registry.npmjs.org/file-sync-cmp/-/file-sync-cmp-0.1.1.tgz";
1013 sha1 = "a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b";
1013 sha1 = "a5e7a8ffbfa493b43b923bbd4ca89a53b63b612b";
1014 };
1014 };
1015 };
1015 };
1016 "find-replace-1.0.3" = {
1016 "find-replace-1.0.3" = {
1017 name = "find-replace";
1017 name = "find-replace";
1018 packageName = "find-replace";
1018 packageName = "find-replace";
1019 version = "1.0.3";
1019 version = "1.0.3";
1020 src = fetchurl {
1020 src = fetchurl {
1021 url = "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz";
1021 url = "https://registry.npmjs.org/find-replace/-/find-replace-1.0.3.tgz";
1022 sha1 = "b88e7364d2d9c959559f388c66670d6130441fa0";
1022 sha1 = "b88e7364d2d9c959559f388c66670d6130441fa0";
1023 };
1023 };
1024 };
1024 };
1025 "findit-2.0.0" = {
1025 "findit-2.0.0" = {
1026 name = "findit";
1026 name = "findit";
1027 packageName = "findit";
1027 packageName = "findit";
1028 version = "2.0.0";
1028 version = "2.0.0";
1029 src = fetchurl {
1029 src = fetchurl {
1030 url = "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz";
1030 url = "https://registry.npmjs.org/findit/-/findit-2.0.0.tgz";
1031 sha1 = "6509f0126af4c178551cfa99394e032e13a4d56e";
1031 sha1 = "6509f0126af4c178551cfa99394e032e13a4d56e";
1032 };
1032 };
1033 };
1033 };
1034 "findup-sync-0.1.3" = {
1034 "findup-sync-0.1.3" = {
1035 name = "findup-sync";
1035 name = "findup-sync";
1036 packageName = "findup-sync";
1036 packageName = "findup-sync";
1037 version = "0.1.3";
1037 version = "0.1.3";
1038 src = fetchurl {
1038 src = fetchurl {
1039 url = "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz";
1039 url = "https://registry.npmjs.org/findup-sync/-/findup-sync-0.1.3.tgz";
1040 sha1 = "7f3e7a97b82392c653bf06589bd85190e93c3683";
1040 sha1 = "7f3e7a97b82392c653bf06589bd85190e93c3683";
1041 };
1041 };
1042 };
1042 };
1043 "foreachasync-3.0.0" = {
1043 "foreachasync-3.0.0" = {
1044 name = "foreachasync";
1044 name = "foreachasync";
1045 packageName = "foreachasync";
1045 packageName = "foreachasync";
1046 version = "3.0.0";
1046 version = "3.0.0";
1047 src = fetchurl {
1047 src = fetchurl {
1048 url = "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz";
1048 url = "https://registry.npmjs.org/foreachasync/-/foreachasync-3.0.0.tgz";
1049 sha1 = "5502987dc8714be3392097f32e0071c9dee07cf6";
1049 sha1 = "5502987dc8714be3392097f32e0071c9dee07cf6";
1050 };
1050 };
1051 };
1051 };
1052 "forever-agent-0.6.1" = {
1052 "forever-agent-0.6.1" = {
1053 name = "forever-agent";
1053 name = "forever-agent";
1054 packageName = "forever-agent";
1054 packageName = "forever-agent";
1055 version = "0.6.1";
1055 version = "0.6.1";
1056 src = fetchurl {
1056 src = fetchurl {
1057 url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
1057 url = "https://registry.npmjs.org/forever-agent/-/forever-agent-0.6.1.tgz";
1058 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
1058 sha1 = "fbc71f0c41adeb37f96c577ad1ed42d8fdacca91";
1059 };
1059 };
1060 };
1060 };
1061 "form-data-2.1.4" = {
1061 "form-data-2.1.4" = {
1062 name = "form-data";
1062 name = "form-data";
1063 packageName = "form-data";
1063 packageName = "form-data";
1064 version = "2.1.4";
1064 version = "2.1.4";
1065 src = fetchurl {
1065 src = fetchurl {
1066 url = "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz";
1066 url = "https://registry.npmjs.org/form-data/-/form-data-2.1.4.tgz";
1067 sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1";
1067 sha1 = "33c183acf193276ecaa98143a69e94bfee1750d1";
1068 };
1068 };
1069 };
1069 };
1070 "fs-extra-0.6.4" = {
1070 "fs-extra-0.6.4" = {
1071 name = "fs-extra";
1071 name = "fs-extra";
1072 packageName = "fs-extra";
1072 packageName = "fs-extra";
1073 version = "0.6.4";
1073 version = "0.6.4";
1074 src = fetchurl {
1074 src = fetchurl {
1075 url = "https://registry.npmjs.org/fs-extra/-/fs-extra-0.6.4.tgz";
1075 url = "https://registry.npmjs.org/fs-extra/-/fs-extra-0.6.4.tgz";
1076 sha1 = "f46f0c75b7841f8d200b3348cd4d691d5a099d15";
1076 sha1 = "f46f0c75b7841f8d200b3348cd4d691d5a099d15";
1077 };
1077 };
1078 };
1078 };
1079 "fs-extra-1.0.0" = {
1079 "fs-extra-1.0.0" = {
1080 name = "fs-extra";
1080 name = "fs-extra";
1081 packageName = "fs-extra";
1081 packageName = "fs-extra";
1082 version = "1.0.0";
1082 version = "1.0.0";
1083 src = fetchurl {
1083 src = fetchurl {
1084 url = "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz";
1084 url = "https://registry.npmjs.org/fs-extra/-/fs-extra-1.0.0.tgz";
1085 sha1 = "cd3ce5f7e7cb6145883fcae3191e9877f8587950";
1085 sha1 = "cd3ce5f7e7cb6145883fcae3191e9877f8587950";
1086 };
1086 };
1087 };
1087 };
1088 "fs.extra-1.3.2" = {
1088 "fs.extra-1.3.2" = {
1089 name = "fs.extra";
1089 name = "fs.extra";
1090 packageName = "fs.extra";
1090 packageName = "fs.extra";
1091 version = "1.3.2";
1091 version = "1.3.2";
1092 src = fetchurl {
1092 src = fetchurl {
1093 url = "https://registry.npmjs.org/fs.extra/-/fs.extra-1.3.2.tgz";
1093 url = "https://registry.npmjs.org/fs.extra/-/fs.extra-1.3.2.tgz";
1094 sha1 = "dd023f93013bee24531f1b33514c37b20fd93349";
1094 sha1 = "dd023f93013bee24531f1b33514c37b20fd93349";
1095 };
1095 };
1096 };
1096 };
1097 "fs.realpath-1.0.0" = {
1097 "fs.realpath-1.0.0" = {
1098 name = "fs.realpath";
1098 name = "fs.realpath";
1099 packageName = "fs.realpath";
1099 packageName = "fs.realpath";
1100 version = "1.0.0";
1100 version = "1.0.0";
1101 src = fetchurl {
1101 src = fetchurl {
1102 url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
1102 url = "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz";
1103 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
1103 sha1 = "1504ad2523158caa40db4a2787cb01411994ea4f";
1104 };
1104 };
1105 };
1105 };
1106 "gauge-2.7.4" = {
1106 "gauge-2.7.4" = {
1107 name = "gauge";
1107 name = "gauge";
1108 packageName = "gauge";
1108 packageName = "gauge";
1109 version = "2.7.4";
1109 version = "2.7.4";
1110 src = fetchurl {
1110 src = fetchurl {
1111 url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";
1111 url = "https://registry.npmjs.org/gauge/-/gauge-2.7.4.tgz";
1112 sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
1112 sha1 = "2c03405c7538c39d7eb37b317022e325fb018bf7";
1113 };
1113 };
1114 };
1114 };
1115 "gaze-0.5.2" = {
1115 "gaze-0.5.2" = {
1116 name = "gaze";
1116 name = "gaze";
1117 packageName = "gaze";
1117 packageName = "gaze";
1118 version = "0.5.2";
1118 version = "0.5.2";
1119 src = fetchurl {
1119 src = fetchurl {
1120 url = "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz";
1120 url = "https://registry.npmjs.org/gaze/-/gaze-0.5.2.tgz";
1121 sha1 = "40b709537d24d1d45767db5a908689dfe69ac44f";
1121 sha1 = "40b709537d24d1d45767db5a908689dfe69ac44f";
1122 };
1122 };
1123 };
1123 };
1124 "getobject-0.1.0" = {
1124 "getobject-0.1.0" = {
1125 name = "getobject";
1125 name = "getobject";
1126 packageName = "getobject";
1126 packageName = "getobject";
1127 version = "0.1.0";
1127 version = "0.1.0";
1128 src = fetchurl {
1128 src = fetchurl {
1129 url = "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz";
1129 url = "https://registry.npmjs.org/getobject/-/getobject-0.1.0.tgz";
1130 sha1 = "047a449789fa160d018f5486ed91320b6ec7885c";
1130 sha1 = "047a449789fa160d018f5486ed91320b6ec7885c";
1131 };
1131 };
1132 };
1132 };
1133 "getpass-0.1.7" = {
1133 "getpass-0.1.7" = {
1134 name = "getpass";
1134 name = "getpass";
1135 packageName = "getpass";
1135 packageName = "getpass";
1136 version = "0.1.7";
1136 version = "0.1.7";
1137 src = fetchurl {
1137 src = fetchurl {
1138 url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
1138 url = "https://registry.npmjs.org/getpass/-/getpass-0.1.7.tgz";
1139 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
1139 sha1 = "5eff8e3e684d569ae4cb2b1282604e8ba62149fa";
1140 };
1140 };
1141 };
1141 };
1142 "glob-3.1.21" = {
1142 "glob-3.1.21" = {
1143 name = "glob";
1143 name = "glob";
1144 packageName = "glob";
1144 packageName = "glob";
1145 version = "3.1.21";
1145 version = "3.1.21";
1146 src = fetchurl {
1146 src = fetchurl {
1147 url = "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz";
1147 url = "https://registry.npmjs.org/glob/-/glob-3.1.21.tgz";
1148 sha1 = "d29e0a055dea5138f4d07ed40e8982e83c2066cd";
1148 sha1 = "d29e0a055dea5138f4d07ed40e8982e83c2066cd";
1149 };
1149 };
1150 };
1150 };
1151 "glob-3.2.11" = {
1151 "glob-3.2.11" = {
1152 name = "glob";
1152 name = "glob";
1153 packageName = "glob";
1153 packageName = "glob";
1154 version = "3.2.11";
1154 version = "3.2.11";
1155 src = fetchurl {
1155 src = fetchurl {
1156 url = "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz";
1156 url = "https://registry.npmjs.org/glob/-/glob-3.2.11.tgz";
1157 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
1157 sha1 = "4a973f635b9190f715d10987d5c00fd2815ebe3d";
1158 };
1158 };
1159 };
1159 };
1160 "glob-7.1.2" = {
1160 "glob-7.1.3" = {
1161 name = "glob";
1161 name = "glob";
1162 packageName = "glob";
1162 packageName = "glob";
1163 version = "7.1.2";
1163 version = "7.1.3";
1164 src = fetchurl {
1164 src = fetchurl {
1165 url = "https://registry.npmjs.org/glob/-/glob-7.1.2.tgz";
1165 url = "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz";
1166 sha512 = "MJTUg1kjuLeQCJ+ccE4Vpa6kKVXkPYJ2mOCQyUuKLcLQsdrMCpBPUi8qVE6+YuaJkozeA9NusTAw3hLr8Xe5EQ==";
1166 sha512 = "vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==";
1167 };
1167 };
1168 };
1168 };
1169 "globule-0.1.0" = {
1169 "globule-0.1.0" = {
1170 name = "globule";
1170 name = "globule";
1171 packageName = "globule";
1171 packageName = "globule";
1172 version = "0.1.0";
1172 version = "0.1.0";
1173 src = fetchurl {
1173 src = fetchurl {
1174 url = "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz";
1174 url = "https://registry.npmjs.org/globule/-/globule-0.1.0.tgz";
1175 sha1 = "d9c8edde1da79d125a151b79533b978676346ae5";
1175 sha1 = "d9c8edde1da79d125a151b79533b978676346ae5";
1176 };
1176 };
1177 };
1177 };
1178 "good-listener-1.2.2" = {
1178 "good-listener-1.2.2" = {
1179 name = "good-listener";
1179 name = "good-listener";
1180 packageName = "good-listener";
1180 packageName = "good-listener";
1181 version = "1.2.2";
1181 version = "1.2.2";
1182 src = fetchurl {
1182 src = fetchurl {
1183 url = "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz";
1183 url = "https://registry.npmjs.org/good-listener/-/good-listener-1.2.2.tgz";
1184 sha1 = "d53b30cdf9313dffb7dc9a0d477096aa6d145c50";
1184 sha1 = "d53b30cdf9313dffb7dc9a0d477096aa6d145c50";
1185 };
1185 };
1186 };
1186 };
1187 "graceful-fs-1.2.3" = {
1187 "graceful-fs-1.2.3" = {
1188 name = "graceful-fs";
1188 name = "graceful-fs";
1189 packageName = "graceful-fs";
1189 packageName = "graceful-fs";
1190 version = "1.2.3";
1190 version = "1.2.3";
1191 src = fetchurl {
1191 src = fetchurl {
1192 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz";
1192 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-1.2.3.tgz";
1193 sha1 = "15a4806a57547cb2d2dbf27f42e89a8c3451b364";
1193 sha1 = "15a4806a57547cb2d2dbf27f42e89a8c3451b364";
1194 };
1194 };
1195 };
1195 };
1196 "graceful-fs-4.1.11" = {
1196 "graceful-fs-4.1.11" = {
1197 name = "graceful-fs";
1197 name = "graceful-fs";
1198 packageName = "graceful-fs";
1198 packageName = "graceful-fs";
1199 version = "4.1.11";
1199 version = "4.1.11";
1200 src = fetchurl {
1200 src = fetchurl {
1201 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz";
1201 url = "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.1.11.tgz";
1202 sha1 = "0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658";
1202 sha1 = "0e8bdfe4d1ddb8854d64e04ea7c00e2a026e5658";
1203 };
1203 };
1204 };
1204 };
1205 "grunt-0.4.5" = {
1205 "grunt-0.4.5" = {
1206 name = "grunt";
1206 name = "grunt";
1207 packageName = "grunt";
1207 packageName = "grunt";
1208 version = "0.4.5";
1208 version = "0.4.5";
1209 src = fetchurl {
1209 src = fetchurl {
1210 url = "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz";
1210 url = "https://registry.npmjs.org/grunt/-/grunt-0.4.5.tgz";
1211 sha1 = "56937cd5194324adff6d207631832a9d6ba4e7f0";
1211 sha1 = "56937cd5194324adff6d207631832a9d6ba4e7f0";
1212 };
1212 };
1213 };
1213 };
1214 "grunt-contrib-concat-0.5.1" = {
1214 "grunt-contrib-concat-0.5.1" = {
1215 name = "grunt-contrib-concat";
1215 name = "grunt-contrib-concat";
1216 packageName = "grunt-contrib-concat";
1216 packageName = "grunt-contrib-concat";
1217 version = "0.5.1";
1217 version = "0.5.1";
1218 src = fetchurl {
1218 src = fetchurl {
1219 url = "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.5.1.tgz";
1219 url = "https://registry.npmjs.org/grunt-contrib-concat/-/grunt-contrib-concat-0.5.1.tgz";
1220 sha1 = "953c6efdfdfd2c107ab9c85077f2d4b24d31cd49";
1220 sha1 = "953c6efdfdfd2c107ab9c85077f2d4b24d31cd49";
1221 };
1221 };
1222 };
1222 };
1223 "grunt-contrib-copy-1.0.0" = {
1223 "grunt-contrib-copy-1.0.0" = {
1224 name = "grunt-contrib-copy";
1224 name = "grunt-contrib-copy";
1225 packageName = "grunt-contrib-copy";
1225 packageName = "grunt-contrib-copy";
1226 version = "1.0.0";
1226 version = "1.0.0";
1227 src = fetchurl {
1227 src = fetchurl {
1228 url = "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz";
1228 url = "https://registry.npmjs.org/grunt-contrib-copy/-/grunt-contrib-copy-1.0.0.tgz";
1229 sha1 = "7060c6581e904b8ab0d00f076e0a8f6e3e7c3573";
1229 sha1 = "7060c6581e904b8ab0d00f076e0a8f6e3e7c3573";
1230 };
1230 };
1231 };
1231 };
1232 "grunt-contrib-jshint-0.12.0" = {
1232 "grunt-contrib-jshint-0.12.0" = {
1233 name = "grunt-contrib-jshint";
1233 name = "grunt-contrib-jshint";
1234 packageName = "grunt-contrib-jshint";
1234 packageName = "grunt-contrib-jshint";
1235 version = "0.12.0";
1235 version = "0.12.0";
1236 src = fetchurl {
1236 src = fetchurl {
1237 url = "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.12.0.tgz";
1237 url = "https://registry.npmjs.org/grunt-contrib-jshint/-/grunt-contrib-jshint-0.12.0.tgz";
1238 sha1 = "f6b2f06fc715264837a7ab6c69a1ce1a689c2c29";
1238 sha1 = "f6b2f06fc715264837a7ab6c69a1ce1a689c2c29";
1239 };
1239 };
1240 };
1240 };
1241 "grunt-contrib-less-1.4.1" = {
1241 "grunt-contrib-less-1.4.1" = {
1242 name = "grunt-contrib-less";
1242 name = "grunt-contrib-less";
1243 packageName = "grunt-contrib-less";
1243 packageName = "grunt-contrib-less";
1244 version = "1.4.1";
1244 version = "1.4.1";
1245 src = fetchurl {
1245 src = fetchurl {
1246 url = "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.1.tgz";
1246 url = "https://registry.npmjs.org/grunt-contrib-less/-/grunt-contrib-less-1.4.1.tgz";
1247 sha1 = "3bbdec0b75d12ceaa55d62943625c0b0861cdf6f";
1247 sha1 = "3bbdec0b75d12ceaa55d62943625c0b0861cdf6f";
1248 };
1248 };
1249 };
1249 };
1250 "grunt-contrib-watch-0.6.1" = {
1250 "grunt-contrib-watch-0.6.1" = {
1251 name = "grunt-contrib-watch";
1251 name = "grunt-contrib-watch";
1252 packageName = "grunt-contrib-watch";
1252 packageName = "grunt-contrib-watch";
1253 version = "0.6.1";
1253 version = "0.6.1";
1254 src = fetchurl {
1254 src = fetchurl {
1255 url = "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz";
1255 url = "https://registry.npmjs.org/grunt-contrib-watch/-/grunt-contrib-watch-0.6.1.tgz";
1256 sha1 = "64fdcba25a635f5b4da1b6ce6f90da0aeb6e3f15";
1256 sha1 = "64fdcba25a635f5b4da1b6ce6f90da0aeb6e3f15";
1257 };
1257 };
1258 };
1258 };
1259 "grunt-crisper-1.0.1" = {
1259 "grunt-crisper-1.0.1" = {
1260 name = "grunt-crisper";
1260 name = "grunt-crisper";
1261 packageName = "grunt-crisper";
1261 packageName = "grunt-crisper";
1262 version = "1.0.1";
1262 version = "1.0.1";
1263 src = fetchurl {
1263 src = fetchurl {
1264 url = "https://registry.npmjs.org/grunt-crisper/-/grunt-crisper-1.0.1.tgz";
1264 url = "https://registry.npmjs.org/grunt-crisper/-/grunt-crisper-1.0.1.tgz";
1265 sha1 = "e7c091dcaff10deb0091e3035ca7e54008991fe7";
1265 sha1 = "e7c091dcaff10deb0091e3035ca7e54008991fe7";
1266 };
1266 };
1267 };
1267 };
1268 "grunt-legacy-log-0.1.3" = {
1268 "grunt-legacy-log-0.1.3" = {
1269 name = "grunt-legacy-log";
1269 name = "grunt-legacy-log";
1270 packageName = "grunt-legacy-log";
1270 packageName = "grunt-legacy-log";
1271 version = "0.1.3";
1271 version = "0.1.3";
1272 src = fetchurl {
1272 src = fetchurl {
1273 url = "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz";
1273 url = "https://registry.npmjs.org/grunt-legacy-log/-/grunt-legacy-log-0.1.3.tgz";
1274 sha1 = "ec29426e803021af59029f87d2f9cd7335a05531";
1274 sha1 = "ec29426e803021af59029f87d2f9cd7335a05531";
1275 };
1275 };
1276 };
1276 };
1277 "grunt-legacy-log-utils-0.1.1" = {
1277 "grunt-legacy-log-utils-0.1.1" = {
1278 name = "grunt-legacy-log-utils";
1278 name = "grunt-legacy-log-utils";
1279 packageName = "grunt-legacy-log-utils";
1279 packageName = "grunt-legacy-log-utils";
1280 version = "0.1.1";
1280 version = "0.1.1";
1281 src = fetchurl {
1281 src = fetchurl {
1282 url = "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz";
1282 url = "https://registry.npmjs.org/grunt-legacy-log-utils/-/grunt-legacy-log-utils-0.1.1.tgz";
1283 sha1 = "c0706b9dd9064e116f36f23fe4e6b048672c0f7e";
1283 sha1 = "c0706b9dd9064e116f36f23fe4e6b048672c0f7e";
1284 };
1284 };
1285 };
1285 };
1286 "grunt-legacy-util-0.2.0" = {
1286 "grunt-legacy-util-0.2.0" = {
1287 name = "grunt-legacy-util";
1287 name = "grunt-legacy-util";
1288 packageName = "grunt-legacy-util";
1288 packageName = "grunt-legacy-util";
1289 version = "0.2.0";
1289 version = "0.2.0";
1290 src = fetchurl {
1290 src = fetchurl {
1291 url = "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz";
1291 url = "https://registry.npmjs.org/grunt-legacy-util/-/grunt-legacy-util-0.2.0.tgz";
1292 sha1 = "93324884dbf7e37a9ff7c026dff451d94a9e554b";
1292 sha1 = "93324884dbf7e37a9ff7c026dff451d94a9e554b";
1293 };
1293 };
1294 };
1294 };
1295 "grunt-vulcanize-1.0.0" = {
1295 "grunt-vulcanize-1.0.0" = {
1296 name = "grunt-vulcanize";
1296 name = "grunt-vulcanize";
1297 packageName = "grunt-vulcanize";
1297 packageName = "grunt-vulcanize";
1298 version = "1.0.0";
1298 version = "1.0.0";
1299 src = fetchurl {
1299 src = fetchurl {
1300 url = "https://registry.npmjs.org/grunt-vulcanize/-/grunt-vulcanize-1.0.0.tgz";
1300 url = "https://registry.npmjs.org/grunt-vulcanize/-/grunt-vulcanize-1.0.0.tgz";
1301 sha1 = "f4d6cfef274f8216c06f6c290e7dbb3b9e9e3b0f";
1301 sha1 = "f4d6cfef274f8216c06f6c290e7dbb3b9e9e3b0f";
1302 };
1302 };
1303 };
1303 };
1304 "har-schema-1.0.5" = {
1304 "har-schema-1.0.5" = {
1305 name = "har-schema";
1305 name = "har-schema";
1306 packageName = "har-schema";
1306 packageName = "har-schema";
1307 version = "1.0.5";
1307 version = "1.0.5";
1308 src = fetchurl {
1308 src = fetchurl {
1309 url = "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz";
1309 url = "https://registry.npmjs.org/har-schema/-/har-schema-1.0.5.tgz";
1310 sha1 = "d263135f43307c02c602afc8fe95970c0151369e";
1310 sha1 = "d263135f43307c02c602afc8fe95970c0151369e";
1311 };
1311 };
1312 };
1312 };
1313 "har-validator-4.2.1" = {
1313 "har-validator-4.2.1" = {
1314 name = "har-validator";
1314 name = "har-validator";
1315 packageName = "har-validator";
1315 packageName = "har-validator";
1316 version = "4.2.1";
1316 version = "4.2.1";
1317 src = fetchurl {
1317 src = fetchurl {
1318 url = "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz";
1318 url = "https://registry.npmjs.org/har-validator/-/har-validator-4.2.1.tgz";
1319 sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a";
1319 sha1 = "33481d0f1bbff600dd203d75812a6a5fba002e2a";
1320 };
1320 };
1321 };
1321 };
1322 "has-ansi-0.1.0" = {
1322 "has-ansi-0.1.0" = {
1323 name = "has-ansi";
1323 name = "has-ansi";
1324 packageName = "has-ansi";
1324 packageName = "has-ansi";
1325 version = "0.1.0";
1325 version = "0.1.0";
1326 src = fetchurl {
1326 src = fetchurl {
1327 url = "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz";
1327 url = "https://registry.npmjs.org/has-ansi/-/has-ansi-0.1.0.tgz";
1328 sha1 = "84f265aae8c0e6a88a12d7022894b7568894c62e";
1328 sha1 = "84f265aae8c0e6a88a12d7022894b7568894c62e";
1329 };
1329 };
1330 };
1330 };
1331 "has-ansi-2.0.0" = {
1331 "has-ansi-2.0.0" = {
1332 name = "has-ansi";
1332 name = "has-ansi";
1333 packageName = "has-ansi";
1333 packageName = "has-ansi";
1334 version = "2.0.0";
1334 version = "2.0.0";
1335 src = fetchurl {
1335 src = fetchurl {
1336 url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
1336 url = "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz";
1337 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
1337 sha1 = "34f5049ce1ecdf2b0649af3ef24e45ed35416d91";
1338 };
1338 };
1339 };
1339 };
1340 "has-unicode-2.0.1" = {
1340 "has-unicode-2.0.1" = {
1341 name = "has-unicode";
1341 name = "has-unicode";
1342 packageName = "has-unicode";
1342 packageName = "has-unicode";
1343 version = "2.0.1";
1343 version = "2.0.1";
1344 src = fetchurl {
1344 src = fetchurl {
1345 url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";
1345 url = "https://registry.npmjs.org/has-unicode/-/has-unicode-2.0.1.tgz";
1346 sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
1346 sha1 = "e0e6fe6a28cf51138855e086d1691e771de2a8b9";
1347 };
1347 };
1348 };
1348 };
1349 "hasha-2.2.0" = {
1349 "hasha-2.2.0" = {
1350 name = "hasha";
1350 name = "hasha";
1351 packageName = "hasha";
1351 packageName = "hasha";
1352 version = "2.2.0";
1352 version = "2.2.0";
1353 src = fetchurl {
1353 src = fetchurl {
1354 url = "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz";
1354 url = "https://registry.npmjs.org/hasha/-/hasha-2.2.0.tgz";
1355 sha1 = "78d7cbfc1e6d66303fe79837365984517b2f6ee1";
1355 sha1 = "78d7cbfc1e6d66303fe79837365984517b2f6ee1";
1356 };
1356 };
1357 };
1357 };
1358 "hawk-3.1.3" = {
1358 "hawk-3.1.3" = {
1359 name = "hawk";
1359 name = "hawk";
1360 packageName = "hawk";
1360 packageName = "hawk";
1361 version = "3.1.3";
1361 version = "3.1.3";
1362 src = fetchurl {
1362 src = fetchurl {
1363 url = "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz";
1363 url = "https://registry.npmjs.org/hawk/-/hawk-3.1.3.tgz";
1364 sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
1364 sha1 = "078444bd7c1640b0fe540d2c9b73d59678e8e1c4";
1365 };
1365 };
1366 };
1366 };
1367 "hoek-2.16.3" = {
1367 "hoek-2.16.3" = {
1368 name = "hoek";
1368 name = "hoek";
1369 packageName = "hoek";
1369 packageName = "hoek";
1370 version = "2.16.3";
1370 version = "2.16.3";
1371 src = fetchurl {
1371 src = fetchurl {
1372 url = "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz";
1372 url = "https://registry.npmjs.org/hoek/-/hoek-2.16.3.tgz";
1373 sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
1373 sha1 = "20bb7403d3cea398e91dc4710a8ff1b8274a25ed";
1374 };
1374 };
1375 };
1375 };
1376 "hooker-0.2.3" = {
1376 "hooker-0.2.3" = {
1377 name = "hooker";
1377 name = "hooker";
1378 packageName = "hooker";
1378 packageName = "hooker";
1379 version = "0.2.3";
1379 version = "0.2.3";
1380 src = fetchurl {
1380 src = fetchurl {
1381 url = "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz";
1381 url = "https://registry.npmjs.org/hooker/-/hooker-0.2.3.tgz";
1382 sha1 = "b834f723cc4a242aa65963459df6d984c5d3d959";
1382 sha1 = "b834f723cc4a242aa65963459df6d984c5d3d959";
1383 };
1383 };
1384 };
1384 };
1385 "hosted-git-info-2.7.1" = {
1385 "hosted-git-info-2.7.1" = {
1386 name = "hosted-git-info";
1386 name = "hosted-git-info";
1387 packageName = "hosted-git-info";
1387 packageName = "hosted-git-info";
1388 version = "2.7.1";
1388 version = "2.7.1";
1389 src = fetchurl {
1389 src = fetchurl {
1390 url = "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
1390 url = "https://registry.npmjs.org/hosted-git-info/-/hosted-git-info-2.7.1.tgz";
1391 sha512 = "7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==";
1391 sha512 = "7T/BxH19zbcCTa8XkMlbK5lTo1WtgkFi3GvdWEyNuc4Vex7/9Dqbnpsf4JMydcfj9HCg4zUWFTL3Za6lapg5/w==";
1392 };
1392 };
1393 };
1393 };
1394 "htmlparser2-3.8.3" = {
1394 "htmlparser2-3.8.3" = {
1395 name = "htmlparser2";
1395 name = "htmlparser2";
1396 packageName = "htmlparser2";
1396 packageName = "htmlparser2";
1397 version = "3.8.3";
1397 version = "3.8.3";
1398 src = fetchurl {
1398 src = fetchurl {
1399 url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz";
1399 url = "https://registry.npmjs.org/htmlparser2/-/htmlparser2-3.8.3.tgz";
1400 sha1 = "996c28b191516a8be86501a7d79757e5c70c1068";
1400 sha1 = "996c28b191516a8be86501a7d79757e5c70c1068";
1401 };
1401 };
1402 };
1402 };
1403 "http-signature-1.1.1" = {
1403 "http-signature-1.1.1" = {
1404 name = "http-signature";
1404 name = "http-signature";
1405 packageName = "http-signature";
1405 packageName = "http-signature";
1406 version = "1.1.1";
1406 version = "1.1.1";
1407 src = fetchurl {
1407 src = fetchurl {
1408 url = "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz";
1408 url = "https://registry.npmjs.org/http-signature/-/http-signature-1.1.1.tgz";
1409 sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf";
1409 sha1 = "df72e267066cd0ac67fb76adf8e134a8fbcf91bf";
1410 };
1410 };
1411 };
1411 };
1412 "hydrolysis-1.25.0" = {
1412 "hydrolysis-1.25.0" = {
1413 name = "hydrolysis";
1413 name = "hydrolysis";
1414 packageName = "hydrolysis";
1414 packageName = "hydrolysis";
1415 version = "1.25.0";
1415 version = "1.25.0";
1416 src = fetchurl {
1416 src = fetchurl {
1417 url = "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz";
1417 url = "https://registry.npmjs.org/hydrolysis/-/hydrolysis-1.25.0.tgz";
1418 sha1 = "a4fb14a37a1e03b0db52d8aaa57c682272a14d84";
1418 sha1 = "a4fb14a37a1e03b0db52d8aaa57c682272a14d84";
1419 };
1419 };
1420 };
1420 };
1421 "iconv-lite-0.2.11" = {
1421 "iconv-lite-0.2.11" = {
1422 name = "iconv-lite";
1422 name = "iconv-lite";
1423 packageName = "iconv-lite";
1423 packageName = "iconv-lite";
1424 version = "0.2.11";
1424 version = "0.2.11";
1425 src = fetchurl {
1425 src = fetchurl {
1426 url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz";
1426 url = "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.2.11.tgz";
1427 sha1 = "1ce60a3a57864a292d1321ff4609ca4bb965adc8";
1427 sha1 = "1ce60a3a57864a292d1321ff4609ca4bb965adc8";
1428 };
1428 };
1429 };
1429 };
1430 "image-size-0.5.5" = {
1430 "image-size-0.5.5" = {
1431 name = "image-size";
1431 name = "image-size";
1432 packageName = "image-size";
1432 packageName = "image-size";
1433 version = "0.5.5";
1433 version = "0.5.5";
1434 src = fetchurl {
1434 src = fetchurl {
1435 url = "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz";
1435 url = "https://registry.npmjs.org/image-size/-/image-size-0.5.5.tgz";
1436 sha1 = "09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c";
1436 sha1 = "09dfd4ab9d20e29eb1c3e80b8990378df9e3cb9c";
1437 };
1437 };
1438 };
1438 };
1439 "inflight-1.0.6" = {
1439 "inflight-1.0.6" = {
1440 name = "inflight";
1440 name = "inflight";
1441 packageName = "inflight";
1441 packageName = "inflight";
1442 version = "1.0.6";
1442 version = "1.0.6";
1443 src = fetchurl {
1443 src = fetchurl {
1444 url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
1444 url = "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz";
1445 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
1445 sha1 = "49bd6331d7d02d0c09bc910a1075ba8165b56df9";
1446 };
1446 };
1447 };
1447 };
1448 "inherits-1.0.2" = {
1448 "inherits-1.0.2" = {
1449 name = "inherits";
1449 name = "inherits";
1450 packageName = "inherits";
1450 packageName = "inherits";
1451 version = "1.0.2";
1451 version = "1.0.2";
1452 src = fetchurl {
1452 src = fetchurl {
1453 url = "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz";
1453 url = "https://registry.npmjs.org/inherits/-/inherits-1.0.2.tgz";
1454 sha1 = "ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b";
1454 sha1 = "ca4309dadee6b54cc0b8d247e8d7c7a0975bdc9b";
1455 };
1455 };
1456 };
1456 };
1457 "inherits-2.0.3" = {
1457 "inherits-2.0.3" = {
1458 name = "inherits";
1458 name = "inherits";
1459 packageName = "inherits";
1459 packageName = "inherits";
1460 version = "2.0.3";
1460 version = "2.0.3";
1461 src = fetchurl {
1461 src = fetchurl {
1462 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
1462 url = "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz";
1463 sha1 = "633c2c83e3da42a502f52466022480f4208261de";
1463 sha1 = "633c2c83e3da42a502f52466022480f4208261de";
1464 };
1464 };
1465 };
1465 };
1466 "ini-1.3.5" = {
1466 "ini-1.3.5" = {
1467 name = "ini";
1467 name = "ini";
1468 packageName = "ini";
1468 packageName = "ini";
1469 version = "1.3.5";
1469 version = "1.3.5";
1470 src = fetchurl {
1470 src = fetchurl {
1471 url = "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz";
1471 url = "https://registry.npmjs.org/ini/-/ini-1.3.5.tgz";
1472 sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==";
1472 sha512 = "RZY5huIKCMRWDUqZlEi72f/lmXKMvuszcMBduliQ3nnWbx9X/ZBQO7DijMEYS9EhHBb2qacRUMtC7svLwe0lcw==";
1473 };
1473 };
1474 };
1474 };
1475 "is-builtin-module-1.0.0" = {
1475 "is-builtin-module-1.0.0" = {
1476 name = "is-builtin-module";
1476 name = "is-builtin-module";
1477 packageName = "is-builtin-module";
1477 packageName = "is-builtin-module";
1478 version = "1.0.0";
1478 version = "1.0.0";
1479 src = fetchurl {
1479 src = fetchurl {
1480 url = "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
1480 url = "https://registry.npmjs.org/is-builtin-module/-/is-builtin-module-1.0.0.tgz";
1481 sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
1481 sha1 = "540572d34f7ac3119f8f76c30cbc1b1e037affbe";
1482 };
1482 };
1483 };
1483 };
1484 "is-fullwidth-code-point-1.0.0" = {
1484 "is-fullwidth-code-point-1.0.0" = {
1485 name = "is-fullwidth-code-point";
1485 name = "is-fullwidth-code-point";
1486 packageName = "is-fullwidth-code-point";
1486 packageName = "is-fullwidth-code-point";
1487 version = "1.0.0";
1487 version = "1.0.0";
1488 src = fetchurl {
1488 src = fetchurl {
1489 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
1489 url = "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-1.0.0.tgz";
1490 sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
1490 sha1 = "ef9e31386f031a7f0d643af82fde50c457ef00cb";
1491 };
1491 };
1492 };
1492 };
1493 "is-stream-1.1.0" = {
1493 "is-stream-1.1.0" = {
1494 name = "is-stream";
1494 name = "is-stream";
1495 packageName = "is-stream";
1495 packageName = "is-stream";
1496 version = "1.1.0";
1496 version = "1.1.0";
1497 src = fetchurl {
1497 src = fetchurl {
1498 url = "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz";
1498 url = "https://registry.npmjs.org/is-stream/-/is-stream-1.1.0.tgz";
1499 sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
1499 sha1 = "12d4a3dd4e68e0b79ceb8dbc84173ae80d91ca44";
1500 };
1500 };
1501 };
1501 };
1502 "is-typedarray-1.0.0" = {
1502 "is-typedarray-1.0.0" = {
1503 name = "is-typedarray";
1503 name = "is-typedarray";
1504 packageName = "is-typedarray";
1504 packageName = "is-typedarray";
1505 version = "1.0.0";
1505 version = "1.0.0";
1506 src = fetchurl {
1506 src = fetchurl {
1507 url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
1507 url = "https://registry.npmjs.org/is-typedarray/-/is-typedarray-1.0.0.tgz";
1508 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
1508 sha1 = "e479c80858df0c1b11ddda6940f96011fcda4a9a";
1509 };
1509 };
1510 };
1510 };
1511 "isarray-0.0.1" = {
1511 "isarray-0.0.1" = {
1512 name = "isarray";
1512 name = "isarray";
1513 packageName = "isarray";
1513 packageName = "isarray";
1514 version = "0.0.1";
1514 version = "0.0.1";
1515 src = fetchurl {
1515 src = fetchurl {
1516 url = "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz";
1516 url = "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz";
1517 sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
1517 sha1 = "8a18acfca9a8f4177e09abfc6038939b05d1eedf";
1518 };
1518 };
1519 };
1519 };
1520 "isarray-1.0.0" = {
1520 "isarray-1.0.0" = {
1521 name = "isarray";
1521 name = "isarray";
1522 packageName = "isarray";
1522 packageName = "isarray";
1523 version = "1.0.0";
1523 version = "1.0.0";
1524 src = fetchurl {
1524 src = fetchurl {
1525 url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
1525 url = "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz";
1526 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
1526 sha1 = "bb935d48582cba168c06834957a54a3e07124f11";
1527 };
1527 };
1528 };
1528 };
1529 "isexe-2.0.0" = {
1529 "isexe-2.0.0" = {
1530 name = "isexe";
1530 name = "isexe";
1531 packageName = "isexe";
1531 packageName = "isexe";
1532 version = "2.0.0";
1532 version = "2.0.0";
1533 src = fetchurl {
1533 src = fetchurl {
1534 url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";
1534 url = "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz";
1535 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
1535 sha1 = "e8fbf374dc556ff8947a10dcb0572d633f2cfa10";
1536 };
1536 };
1537 };
1537 };
1538 "isstream-0.1.2" = {
1538 "isstream-0.1.2" = {
1539 name = "isstream";
1539 name = "isstream";
1540 packageName = "isstream";
1540 packageName = "isstream";
1541 version = "0.1.2";
1541 version = "0.1.2";
1542 src = fetchurl {
1542 src = fetchurl {
1543 url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
1543 url = "https://registry.npmjs.org/isstream/-/isstream-0.1.2.tgz";
1544 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
1544 sha1 = "47e63f7af55afa6f92e1500e690eb8b8529c099a";
1545 };
1545 };
1546 };
1546 };
1547 "jquery-1.11.3" = {
1547 "jquery-1.11.3" = {
1548 name = "jquery";
1548 name = "jquery";
1549 packageName = "jquery";
1549 packageName = "jquery";
1550 version = "1.11.3";
1550 version = "1.11.3";
1551 src = fetchurl {
1551 src = fetchurl {
1552 url = "https://registry.npmjs.org/jquery/-/jquery-1.11.3.tgz";
1552 url = "https://registry.npmjs.org/jquery/-/jquery-1.11.3.tgz";
1553 sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583";
1553 sha1 = "dd8b74278b27102d29df63eae28308a8cfa1b583";
1554 };
1554 };
1555 };
1555 };
1556 "js-yaml-2.0.5" = {
1556 "js-yaml-2.0.5" = {
1557 name = "js-yaml";
1557 name = "js-yaml";
1558 packageName = "js-yaml";
1558 packageName = "js-yaml";
1559 version = "2.0.5";
1559 version = "2.0.5";
1560 src = fetchurl {
1560 src = fetchurl {
1561 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz";
1561 url = "https://registry.npmjs.org/js-yaml/-/js-yaml-2.0.5.tgz";
1562 sha1 = "a25ae6509999e97df278c6719da11bd0687743a8";
1562 sha1 = "a25ae6509999e97df278c6719da11bd0687743a8";
1563 };
1563 };
1564 };
1564 };
1565 "jsbn-0.1.1" = {
1565 "jsbn-0.1.1" = {
1566 name = "jsbn";
1566 name = "jsbn";
1567 packageName = "jsbn";
1567 packageName = "jsbn";
1568 version = "0.1.1";
1568 version = "0.1.1";
1569 src = fetchurl {
1569 src = fetchurl {
1570 url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
1570 url = "https://registry.npmjs.org/jsbn/-/jsbn-0.1.1.tgz";
1571 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
1571 sha1 = "a5e654c2e5a2deb5f201d96cefbca80c0ef2f513";
1572 };
1572 };
1573 };
1573 };
1574 "jshint-2.9.6" = {
1574 "jshint-2.9.6" = {
1575 name = "jshint";
1575 name = "jshint";
1576 packageName = "jshint";
1576 packageName = "jshint";
1577 version = "2.9.6";
1577 version = "2.9.6";
1578 src = fetchurl {
1578 src = fetchurl {
1579 url = "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz";
1579 url = "https://registry.npmjs.org/jshint/-/jshint-2.9.6.tgz";
1580 sha512 = "KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==";
1580 sha512 = "KO9SIAKTlJQOM4lE64GQUtGBRpTOuvbrRrSZw3AhUxMNG266nX9hK2cKA4SBhXOj0irJGyNyGSLT62HGOVDEOA==";
1581 };
1581 };
1582 };
1582 };
1583 "json-schema-0.2.3" = {
1583 "json-schema-0.2.3" = {
1584 name = "json-schema";
1584 name = "json-schema";
1585 packageName = "json-schema";
1585 packageName = "json-schema";
1586 version = "0.2.3";
1586 version = "0.2.3";
1587 src = fetchurl {
1587 src = fetchurl {
1588 url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
1588 url = "https://registry.npmjs.org/json-schema/-/json-schema-0.2.3.tgz";
1589 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
1589 sha1 = "b480c892e59a2f05954ce727bd3f2a4e882f9e13";
1590 };
1590 };
1591 };
1591 };
1592 "json-stable-stringify-1.0.1" = {
1592 "json-stable-stringify-1.0.1" = {
1593 name = "json-stable-stringify";
1593 name = "json-stable-stringify";
1594 packageName = "json-stable-stringify";
1594 packageName = "json-stable-stringify";
1595 version = "1.0.1";
1595 version = "1.0.1";
1596 src = fetchurl {
1596 src = fetchurl {
1597 url = "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
1597 url = "https://registry.npmjs.org/json-stable-stringify/-/json-stable-stringify-1.0.1.tgz";
1598 sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
1598 sha1 = "9a759d39c5f2ff503fd5300646ed445f88c4f9af";
1599 };
1599 };
1600 };
1600 };
1601 "json-stringify-safe-5.0.1" = {
1601 "json-stringify-safe-5.0.1" = {
1602 name = "json-stringify-safe";
1602 name = "json-stringify-safe";
1603 packageName = "json-stringify-safe";
1603 packageName = "json-stringify-safe";
1604 version = "5.0.1";
1604 version = "5.0.1";
1605 src = fetchurl {
1605 src = fetchurl {
1606 url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
1606 url = "https://registry.npmjs.org/json-stringify-safe/-/json-stringify-safe-5.0.1.tgz";
1607 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
1607 sha1 = "1296a2d58fd45f19a0f6ce01d65701e2c735b6eb";
1608 };
1608 };
1609 };
1609 };
1610 "jsonfile-1.0.1" = {
1610 "jsonfile-1.0.1" = {
1611 name = "jsonfile";
1611 name = "jsonfile";
1612 packageName = "jsonfile";
1612 packageName = "jsonfile";
1613 version = "1.0.1";
1613 version = "1.0.1";
1614 src = fetchurl {
1614 src = fetchurl {
1615 url = "https://registry.npmjs.org/jsonfile/-/jsonfile-1.0.1.tgz";
1615 url = "https://registry.npmjs.org/jsonfile/-/jsonfile-1.0.1.tgz";
1616 sha1 = "ea5efe40b83690b98667614a7392fc60e842c0dd";
1616 sha1 = "ea5efe40b83690b98667614a7392fc60e842c0dd";
1617 };
1617 };
1618 };
1618 };
1619 "jsonfile-2.4.0" = {
1619 "jsonfile-2.4.0" = {
1620 name = "jsonfile";
1620 name = "jsonfile";
1621 packageName = "jsonfile";
1621 packageName = "jsonfile";
1622 version = "2.4.0";
1622 version = "2.4.0";
1623 src = fetchurl {
1623 src = fetchurl {
1624 url = "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz";
1624 url = "https://registry.npmjs.org/jsonfile/-/jsonfile-2.4.0.tgz";
1625 sha1 = "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8";
1625 sha1 = "3736a2b428b87bbda0cc83b53fa3d633a35c2ae8";
1626 };
1626 };
1627 };
1627 };
1628 "jsonify-0.0.0" = {
1628 "jsonify-0.0.0" = {
1629 name = "jsonify";
1629 name = "jsonify";
1630 packageName = "jsonify";
1630 packageName = "jsonify";
1631 version = "0.0.0";
1631 version = "0.0.0";
1632 src = fetchurl {
1632 src = fetchurl {
1633 url = "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz";
1633 url = "https://registry.npmjs.org/jsonify/-/jsonify-0.0.0.tgz";
1634 sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
1634 sha1 = "2c74b6ee41d93ca51b7b5aaee8f503631d252a73";
1635 };
1635 };
1636 };
1636 };
1637 "jsprim-1.4.1" = {
1637 "jsprim-1.4.1" = {
1638 name = "jsprim";
1638 name = "jsprim";
1639 packageName = "jsprim";
1639 packageName = "jsprim";
1640 version = "1.4.1";
1640 version = "1.4.1";
1641 src = fetchurl {
1641 src = fetchurl {
1642 url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
1642 url = "https://registry.npmjs.org/jsprim/-/jsprim-1.4.1.tgz";
1643 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
1643 sha1 = "313e66bc1e5cc06e438bc1b7499c2e5c56acb6a2";
1644 };
1644 };
1645 };
1645 };
1646 "kew-0.7.0" = {
1646 "kew-0.7.0" = {
1647 name = "kew";
1647 name = "kew";
1648 packageName = "kew";
1648 packageName = "kew";
1649 version = "0.7.0";
1649 version = "0.7.0";
1650 src = fetchurl {
1650 src = fetchurl {
1651 url = "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz";
1651 url = "https://registry.npmjs.org/kew/-/kew-0.7.0.tgz";
1652 sha1 = "79d93d2d33363d6fdd2970b335d9141ad591d79b";
1652 sha1 = "79d93d2d33363d6fdd2970b335d9141ad591d79b";
1653 };
1653 };
1654 };
1654 };
1655 "klaw-1.3.1" = {
1655 "klaw-1.3.1" = {
1656 name = "klaw";
1656 name = "klaw";
1657 packageName = "klaw";
1657 packageName = "klaw";
1658 version = "1.3.1";
1658 version = "1.3.1";
1659 src = fetchurl {
1659 src = fetchurl {
1660 url = "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz";
1660 url = "https://registry.npmjs.org/klaw/-/klaw-1.3.1.tgz";
1661 sha1 = "4088433b46b3b1ba259d78785d8e96f73ba02439";
1661 sha1 = "4088433b46b3b1ba259d78785d8e96f73ba02439";
1662 };
1662 };
1663 };
1663 };
1664 "less-2.7.3" = {
1664 "less-2.7.3" = {
1665 name = "less";
1665 name = "less";
1666 packageName = "less";
1666 packageName = "less";
1667 version = "2.7.3";
1667 version = "2.7.3";
1668 src = fetchurl {
1668 src = fetchurl {
1669 url = "https://registry.npmjs.org/less/-/less-2.7.3.tgz";
1669 url = "https://registry.npmjs.org/less/-/less-2.7.3.tgz";
1670 sha512 = "KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==";
1670 sha512 = "KPdIJKWcEAb02TuJtaLrhue0krtRLoRoo7x6BNJIBelO00t/CCdJQUnHW5V34OnHMWzIktSalJxRO+FvytQlCQ==";
1671 };
1671 };
1672 };
1672 };
1673 "levn-0.3.0" = {
1673 "levn-0.3.0" = {
1674 name = "levn";
1674 name = "levn";
1675 packageName = "levn";
1675 packageName = "levn";
1676 version = "0.3.0";
1676 version = "0.3.0";
1677 src = fetchurl {
1677 src = fetchurl {
1678 url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
1678 url = "https://registry.npmjs.org/levn/-/levn-0.3.0.tgz";
1679 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
1679 sha1 = "3b09924edf9f083c0490fdd4c0bc4421e04764ee";
1680 };
1680 };
1681 };
1681 };
1682 "lodash-0.9.2" = {
1682 "lodash-0.9.2" = {
1683 name = "lodash";
1683 name = "lodash";
1684 packageName = "lodash";
1684 packageName = "lodash";
1685 version = "0.9.2";
1685 version = "0.9.2";
1686 src = fetchurl {
1686 src = fetchurl {
1687 url = "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz";
1687 url = "https://registry.npmjs.org/lodash/-/lodash-0.9.2.tgz";
1688 sha1 = "8f3499c5245d346d682e5b0d3b40767e09f1a92c";
1688 sha1 = "8f3499c5245d346d682e5b0d3b40767e09f1a92c";
1689 };
1689 };
1690 };
1690 };
1691 "lodash-1.0.2" = {
1691 "lodash-1.0.2" = {
1692 name = "lodash";
1692 name = "lodash";
1693 packageName = "lodash";
1693 packageName = "lodash";
1694 version = "1.0.2";
1694 version = "1.0.2";
1695 src = fetchurl {
1695 src = fetchurl {
1696 url = "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz";
1696 url = "https://registry.npmjs.org/lodash/-/lodash-1.0.2.tgz";
1697 sha1 = "8f57560c83b59fc270bd3d561b690043430e2551";
1697 sha1 = "8f57560c83b59fc270bd3d561b690043430e2551";
1698 };
1698 };
1699 };
1699 };
1700 "lodash-2.4.2" = {
1700 "lodash-2.4.2" = {
1701 name = "lodash";
1701 name = "lodash";
1702 packageName = "lodash";
1702 packageName = "lodash";
1703 version = "2.4.2";
1703 version = "2.4.2";
1704 src = fetchurl {
1704 src = fetchurl {
1705 url = "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz";
1705 url = "https://registry.npmjs.org/lodash/-/lodash-2.4.2.tgz";
1706 sha1 = "fadd834b9683073da179b3eae6d9c0d15053f73e";
1706 sha1 = "fadd834b9683073da179b3eae6d9c0d15053f73e";
1707 };
1707 };
1708 };
1708 };
1709 "lodash-4.17.10" = {
1709 "lodash-4.17.11" = {
1710 name = "lodash";
1710 name = "lodash";
1711 packageName = "lodash";
1711 packageName = "lodash";
1712 version = "4.17.10";
1712 version = "4.17.11";
1713 src = fetchurl {
1713 src = fetchurl {
1714 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.10.tgz";
1714 url = "https://registry.npmjs.org/lodash/-/lodash-4.17.11.tgz";
1715 sha512 = "UejweD1pDoXu+AD825lWwp4ZGtSwgnpZxb3JDViD7StjQz+Nb/6l093lx4OQ0foGWNRoc19mWy7BzL+UAK2iVg==";
1715 sha512 = "cQKh8igo5QUhZ7lg38DYWAxMvjSAKG0A8wGSVimP07SIUEK2UO+arSRKbRZWtelMtN5V0Hkwh5ryOto/SshYIg==";
1716 };
1716 };
1717 };
1717 };
1718 "lru-cache-2.7.3" = {
1718 "lru-cache-2.7.3" = {
1719 name = "lru-cache";
1719 name = "lru-cache";
1720 packageName = "lru-cache";
1720 packageName = "lru-cache";
1721 version = "2.7.3";
1721 version = "2.7.3";
1722 src = fetchurl {
1722 src = fetchurl {
1723 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz";
1723 url = "https://registry.npmjs.org/lru-cache/-/lru-cache-2.7.3.tgz";
1724 sha1 = "6d4524e8b955f95d4f5b58851ce21dd72fb4e952";
1724 sha1 = "6d4524e8b955f95d4f5b58851ce21dd72fb4e952";
1725 };
1725 };
1726 };
1726 };
1727 "mime-1.6.0" = {
1727 "mime-1.6.0" = {
1728 name = "mime";
1728 name = "mime";
1729 packageName = "mime";
1729 packageName = "mime";
1730 version = "1.6.0";
1730 version = "1.6.0";
1731 src = fetchurl {
1731 src = fetchurl {
1732 url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz";
1732 url = "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz";
1733 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
1733 sha512 = "x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==";
1734 };
1734 };
1735 };
1735 };
1736 "mime-db-1.35.0" = {
1736 "mime-db-1.36.0" = {
1737 name = "mime-db";
1737 name = "mime-db";
1738 packageName = "mime-db";
1738 packageName = "mime-db";
1739 version = "1.35.0";
1739 version = "1.36.0";
1740 src = fetchurl {
1740 src = fetchurl {
1741 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.35.0.tgz";
1741 url = "https://registry.npmjs.org/mime-db/-/mime-db-1.36.0.tgz";
1742 sha512 = "JWT/IcCTsB0Io3AhWUMjRqucrHSPsSf2xKLaRldJVULioggvkJvggZ3VXNNSRkCddE6D+BUI4HEIZIA2OjwIvg==";
1742 sha512 = "L+xvyD9MkoYMXb1jAmzI/lWYAxAMCPvIBSWur0PZ5nOf5euahRLVqH//FKW9mWp2lkqUgYiXPgkzfMUFi4zVDw==";
1743 };
1743 };
1744 };
1744 };
1745 "mime-types-2.1.19" = {
1745 "mime-types-2.1.20" = {
1746 name = "mime-types";
1746 name = "mime-types";
1747 packageName = "mime-types";
1747 packageName = "mime-types";
1748 version = "2.1.19";
1748 version = "2.1.20";
1749 src = fetchurl {
1749 src = fetchurl {
1750 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.19.tgz";
1750 url = "https://registry.npmjs.org/mime-types/-/mime-types-2.1.20.tgz";
1751 sha512 = "P1tKYHVSZ6uFo26mtnve4HQFE3koh1UWVkp8YUC+ESBHe945xWSoXuHHiGarDqcEZ+whpCDnlNw5LON0kLo+sw==";
1751 sha512 = "HrkrPaP9vGuWbLK1B1FfgAkbqNjIuy4eHlIYnFi7kamZyLLrGlo2mpcx0bBmNpKqBtYtAfGbodDddIgddSJC2A==";
1752 };
1752 };
1753 };
1753 };
1754 "minimatch-0.2.14" = {
1754 "minimatch-0.2.14" = {
1755 name = "minimatch";
1755 name = "minimatch";
1756 packageName = "minimatch";
1756 packageName = "minimatch";
1757 version = "0.2.14";
1757 version = "0.2.14";
1758 src = fetchurl {
1758 src = fetchurl {
1759 url = "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz";
1759 url = "https://registry.npmjs.org/minimatch/-/minimatch-0.2.14.tgz";
1760 sha1 = "c74e780574f63c6f9a090e90efbe6ef53a6a756a";
1760 sha1 = "c74e780574f63c6f9a090e90efbe6ef53a6a756a";
1761 };
1761 };
1762 };
1762 };
1763 "minimatch-0.3.0" = {
1763 "minimatch-0.3.0" = {
1764 name = "minimatch";
1764 name = "minimatch";
1765 packageName = "minimatch";
1765 packageName = "minimatch";
1766 version = "0.3.0";
1766 version = "0.3.0";
1767 src = fetchurl {
1767 src = fetchurl {
1768 url = "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz";
1768 url = "https://registry.npmjs.org/minimatch/-/minimatch-0.3.0.tgz";
1769 sha1 = "275d8edaac4f1bb3326472089e7949c8394699dd";
1769 sha1 = "275d8edaac4f1bb3326472089e7949c8394699dd";
1770 };
1770 };
1771 };
1771 };
1772 "minimatch-3.0.4" = {
1772 "minimatch-3.0.4" = {
1773 name = "minimatch";
1773 name = "minimatch";
1774 packageName = "minimatch";
1774 packageName = "minimatch";
1775 version = "3.0.4";
1775 version = "3.0.4";
1776 src = fetchurl {
1776 src = fetchurl {
1777 url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
1777 url = "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz";
1778 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
1778 sha512 = "yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==";
1779 };
1779 };
1780 };
1780 };
1781 "minimist-0.0.8" = {
1781 "minimist-0.0.8" = {
1782 name = "minimist";
1782 name = "minimist";
1783 packageName = "minimist";
1783 packageName = "minimist";
1784 version = "0.0.8";
1784 version = "0.0.8";
1785 src = fetchurl {
1785 src = fetchurl {
1786 url = "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
1786 url = "https://registry.npmjs.org/minimist/-/minimist-0.0.8.tgz";
1787 sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
1787 sha1 = "857fcabfc3397d2625b8228262e86aa7a011b05d";
1788 };
1788 };
1789 };
1789 };
1790 "minipass-2.3.3" = {
1790 "minipass-2.3.4" = {
1791 name = "minipass";
1791 name = "minipass";
1792 packageName = "minipass";
1792 packageName = "minipass";
1793 version = "2.3.3";
1793 version = "2.3.4";
1794 src = fetchurl {
1794 src = fetchurl {
1795 url = "https://registry.npmjs.org/minipass/-/minipass-2.3.3.tgz";
1795 url = "https://registry.npmjs.org/minipass/-/minipass-2.3.4.tgz";
1796 sha512 = "/jAn9/tEX4gnpyRATxgHEOV6xbcyxgT7iUnxo9Y3+OB0zX00TgKIv/2FZCf5brBbICcwbLqVv2ImjvWWrQMSYw==";
1796 sha512 = "mlouk1OHlaUE8Odt1drMtG1bAJA4ZA6B/ehysgV0LUIrDHdKgo1KorZq3pK0b/7Z7LJIQ12MNM6aC+Tn6lUZ5w==";
1797 };
1797 };
1798 };
1798 };
1799 "minizlib-1.1.0" = {
1799 "minizlib-1.1.1" = {
1800 name = "minizlib";
1800 name = "minizlib";
1801 packageName = "minizlib";
1801 packageName = "minizlib";
1802 version = "1.1.0";
1802 version = "1.1.1";
1803 src = fetchurl {
1803 src = fetchurl {
1804 url = "https://registry.npmjs.org/minizlib/-/minizlib-1.1.0.tgz";
1804 url = "https://registry.npmjs.org/minizlib/-/minizlib-1.1.1.tgz";
1805 sha512 = "4T6Ur/GctZ27nHfpt9THOdRZNgyJ9FZchYO1ceg5S8Q3DNLCKYy44nCZzgCJgcvx2UM8czmqak5BCxJMrq37lA==";
1805 sha512 = "TrfjCjk4jLhcJyGMYymBH6oTXcWjYbUAXTHDbtnWHjZC25h0cdajHuPE1zxb4DVmu8crfh+HwH/WMuyLG0nHBg==";
1806 };
1806 };
1807 };
1807 };
1808 "mkdirp-0.3.5" = {
1808 "mkdirp-0.3.5" = {
1809 name = "mkdirp";
1809 name = "mkdirp";
1810 packageName = "mkdirp";
1810 packageName = "mkdirp";
1811 version = "0.3.5";
1811 version = "0.3.5";
1812 src = fetchurl {
1812 src = fetchurl {
1813 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz";
1813 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.3.5.tgz";
1814 sha1 = "de3e5f8961c88c787ee1368df849ac4413eca8d7";
1814 sha1 = "de3e5f8961c88c787ee1368df849ac4413eca8d7";
1815 };
1815 };
1816 };
1816 };
1817 "mkdirp-0.5.1" = {
1817 "mkdirp-0.5.1" = {
1818 name = "mkdirp";
1818 name = "mkdirp";
1819 packageName = "mkdirp";
1819 packageName = "mkdirp";
1820 version = "0.5.1";
1820 version = "0.5.1";
1821 src = fetchurl {
1821 src = fetchurl {
1822 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";
1822 url = "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.1.tgz";
1823 sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
1823 sha1 = "30057438eac6cf7f8c4767f38648d6697d75c903";
1824 };
1824 };
1825 };
1825 };
1826 "moment-2.22.2" = {
1826 "moment-2.22.2" = {
1827 name = "moment";
1827 name = "moment";
1828 packageName = "moment";
1828 packageName = "moment";
1829 version = "2.22.2";
1829 version = "2.22.2";
1830 src = fetchurl {
1830 src = fetchurl {
1831 url = "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz";
1831 url = "https://registry.npmjs.org/moment/-/moment-2.22.2.tgz";
1832 sha1 = "3c257f9839fc0e93ff53149632239eb90783ff66";
1832 sha1 = "3c257f9839fc0e93ff53149632239eb90783ff66";
1833 };
1833 };
1834 };
1834 };
1835 "mousetrap-1.6.2" = {
1835 "mousetrap-1.6.2" = {
1836 name = "mousetrap";
1836 name = "mousetrap";
1837 packageName = "mousetrap";
1837 packageName = "mousetrap";
1838 version = "1.6.2";
1838 version = "1.6.2";
1839 src = fetchurl {
1839 src = fetchurl {
1840 url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.2.tgz";
1840 url = "https://registry.npmjs.org/mousetrap/-/mousetrap-1.6.2.tgz";
1841 sha512 = "jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==";
1841 sha512 = "jDjhi7wlHwdO6q6DS7YRmSHcuI+RVxadBkLt3KHrhd3C2b+w5pKefg3oj5beTcHZyVFA9Aksf+yEE1y5jxUjVA==";
1842 };
1842 };
1843 };
1843 };
1844 "ms-2.0.0" = {
1844 "ms-2.0.0" = {
1845 name = "ms";
1845 name = "ms";
1846 packageName = "ms";
1846 packageName = "ms";
1847 version = "2.0.0";
1847 version = "2.0.0";
1848 src = fetchurl {
1848 src = fetchurl {
1849 url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
1849 url = "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz";
1850 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
1850 sha1 = "5608aeadfc00be6c2901df5f9861788de0d597c8";
1851 };
1851 };
1852 };
1852 };
1853 "ncp-0.4.2" = {
1853 "ncp-0.4.2" = {
1854 name = "ncp";
1854 name = "ncp";
1855 packageName = "ncp";
1855 packageName = "ncp";
1856 version = "0.4.2";
1856 version = "0.4.2";
1857 src = fetchurl {
1857 src = fetchurl {
1858 url = "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz";
1858 url = "https://registry.npmjs.org/ncp/-/ncp-0.4.2.tgz";
1859 sha1 = "abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574";
1859 sha1 = "abcc6cbd3ec2ed2a729ff6e7c1fa8f01784a8574";
1860 };
1860 };
1861 };
1861 };
1862 "nijs-0.0.25" = {
1862 "nijs-0.0.25" = {
1863 name = "nijs";
1863 name = "nijs";
1864 packageName = "nijs";
1864 packageName = "nijs";
1865 version = "0.0.25";
1865 version = "0.0.25";
1866 src = fetchurl {
1866 src = fetchurl {
1867 url = "https://registry.npmjs.org/nijs/-/nijs-0.0.25.tgz";
1867 url = "https://registry.npmjs.org/nijs/-/nijs-0.0.25.tgz";
1868 sha1 = "04b035cb530d46859d1018839a518c029133f676";
1868 sha1 = "04b035cb530d46859d1018839a518c029133f676";
1869 };
1869 };
1870 };
1870 };
1871 "node2nix-1.6.0" = {
1871 "node2nix-1.6.0" = {
1872 name = "node2nix";
1872 name = "node2nix";
1873 packageName = "node2nix";
1873 packageName = "node2nix";
1874 version = "1.6.0";
1874 version = "1.6.0";
1875 src = fetchurl {
1875 src = fetchurl {
1876 url = "https://registry.npmjs.org/node2nix/-/node2nix-1.6.0.tgz";
1876 url = "https://registry.npmjs.org/node2nix/-/node2nix-1.6.0.tgz";
1877 sha512 = "MJY6SsQH3pN59R9N3nMz/L8BsbQ0DlvSF38mgg1fwfwgnaJ+y600s3Nd0vZ+cnETUH+4OPETc4QohflccjPUYw==";
1877 sha512 = "MJY6SsQH3pN59R9N3nMz/L8BsbQ0DlvSF38mgg1fwfwgnaJ+y600s3Nd0vZ+cnETUH+4OPETc4QohflccjPUYw==";
1878 };
1878 };
1879 };
1879 };
1880 "nopt-1.0.10" = {
1880 "nopt-1.0.10" = {
1881 name = "nopt";
1881 name = "nopt";
1882 packageName = "nopt";
1882 packageName = "nopt";
1883 version = "1.0.10";
1883 version = "1.0.10";
1884 src = fetchurl {
1884 src = fetchurl {
1885 url = "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz";
1885 url = "https://registry.npmjs.org/nopt/-/nopt-1.0.10.tgz";
1886 sha1 = "6ddd21bd2a31417b92727dd585f8a6f37608ebee";
1886 sha1 = "6ddd21bd2a31417b92727dd585f8a6f37608ebee";
1887 };
1887 };
1888 };
1888 };
1889 "nopt-2.0.0" = {
1889 "nopt-2.0.0" = {
1890 name = "nopt";
1890 name = "nopt";
1891 packageName = "nopt";
1891 packageName = "nopt";
1892 version = "2.0.0";
1892 version = "2.0.0";
1893 src = fetchurl {
1893 src = fetchurl {
1894 url = "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz";
1894 url = "https://registry.npmjs.org/nopt/-/nopt-2.0.0.tgz";
1895 sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d";
1895 sha1 = "ca7416f20a5e3f9c3b86180f96295fa3d0b52e0d";
1896 };
1896 };
1897 };
1897 };
1898 "nopt-3.0.6" = {
1898 "nopt-3.0.6" = {
1899 name = "nopt";
1899 name = "nopt";
1900 packageName = "nopt";
1900 packageName = "nopt";
1901 version = "3.0.6";
1901 version = "3.0.6";
1902 src = fetchurl {
1902 src = fetchurl {
1903 url = "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz";
1903 url = "https://registry.npmjs.org/nopt/-/nopt-3.0.6.tgz";
1904 sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
1904 sha1 = "c6465dbf08abcd4db359317f79ac68a646b28ff9";
1905 };
1905 };
1906 };
1906 };
1907 "noptify-0.0.3" = {
1907 "noptify-0.0.3" = {
1908 name = "noptify";
1908 name = "noptify";
1909 packageName = "noptify";
1909 packageName = "noptify";
1910 version = "0.0.3";
1910 version = "0.0.3";
1911 src = fetchurl {
1911 src = fetchurl {
1912 url = "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz";
1912 url = "https://registry.npmjs.org/noptify/-/noptify-0.0.3.tgz";
1913 sha1 = "58f654a73d9753df0c51d9686dc92104a67f4bbb";
1913 sha1 = "58f654a73d9753df0c51d9686dc92104a67f4bbb";
1914 };
1914 };
1915 };
1915 };
1916 "normalize-package-data-2.4.0" = {
1916 "normalize-package-data-2.4.0" = {
1917 name = "normalize-package-data";
1917 name = "normalize-package-data";
1918 packageName = "normalize-package-data";
1918 packageName = "normalize-package-data";
1919 version = "2.4.0";
1919 version = "2.4.0";
1920 src = fetchurl {
1920 src = fetchurl {
1921 url = "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
1921 url = "https://registry.npmjs.org/normalize-package-data/-/normalize-package-data-2.4.0.tgz";
1922 sha512 = "9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==";
1922 sha512 = "9jjUFbTPfEy3R/ad/2oNbKtW9Hgovl5O1FvFWKkKblNXoN/Oou6+9+KKohPK13Yc3/TyunyWhJp6gvRNR/PPAw==";
1923 };
1923 };
1924 };
1924 };
1925 "npm-package-arg-6.1.0" = {
1925 "npm-package-arg-6.1.0" = {
1926 name = "npm-package-arg";
1926 name = "npm-package-arg";
1927 packageName = "npm-package-arg";
1927 packageName = "npm-package-arg";
1928 version = "6.1.0";
1928 version = "6.1.0";
1929 src = fetchurl {
1929 src = fetchurl {
1930 url = "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz";
1930 url = "https://registry.npmjs.org/npm-package-arg/-/npm-package-arg-6.1.0.tgz";
1931 sha512 = "zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==";
1931 sha512 = "zYbhP2k9DbJhA0Z3HKUePUgdB1x7MfIfKssC+WLPFMKTBZKpZh5m13PgexJjCq6KW7j17r0jHWcCpxEqnnncSA==";
1932 };
1932 };
1933 };
1933 };
1934 "npm-registry-client-8.5.1" = {
1934 "npm-registry-client-8.5.1" = {
1935 name = "npm-registry-client";
1935 name = "npm-registry-client";
1936 packageName = "npm-registry-client";
1936 packageName = "npm-registry-client";
1937 version = "8.5.1";
1937 version = "8.5.1";
1938 src = fetchurl {
1938 src = fetchurl {
1939 url = "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.1.tgz";
1939 url = "https://registry.npmjs.org/npm-registry-client/-/npm-registry-client-8.5.1.tgz";
1940 sha512 = "7rjGF2eA7hKDidGyEWmHTiKfXkbrcQAsGL/Rh4Rt3x3YNRNHhwaTzVJfW3aNvvlhg4G62VCluif0sLCb/i51Hg==";
1940 sha512 = "7rjGF2eA7hKDidGyEWmHTiKfXkbrcQAsGL/Rh4Rt3x3YNRNHhwaTzVJfW3aNvvlhg4G62VCluif0sLCb/i51Hg==";
1941 };
1941 };
1942 };
1942 };
1943 "npmconf-2.1.3" = {
1943 "npmconf-2.1.3" = {
1944 name = "npmconf";
1944 name = "npmconf";
1945 packageName = "npmconf";
1945 packageName = "npmconf";
1946 version = "2.1.3";
1946 version = "2.1.3";
1947 src = fetchurl {
1947 src = fetchurl {
1948 url = "https://registry.npmjs.org/npmconf/-/npmconf-2.1.3.tgz";
1948 url = "https://registry.npmjs.org/npmconf/-/npmconf-2.1.3.tgz";
1949 sha512 = "iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA==";
1949 sha512 = "iTK+HI68GceCoGOHAQiJ/ik1iDfI7S+cgyG8A+PP18IU3X83kRhQIRhAUNj4Bp2JMx6Zrt5kCiozYa9uGWTjhA==";
1950 };
1950 };
1951 };
1951 };
1952 "npmlog-4.1.2" = {
1952 "npmlog-4.1.2" = {
1953 name = "npmlog";
1953 name = "npmlog";
1954 packageName = "npmlog";
1954 packageName = "npmlog";
1955 version = "4.1.2";
1955 version = "4.1.2";
1956 src = fetchurl {
1956 src = fetchurl {
1957 url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";
1957 url = "https://registry.npmjs.org/npmlog/-/npmlog-4.1.2.tgz";
1958 sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==";
1958 sha512 = "2uUqazuKlTaSI/dC8AzicUck7+IrEaOnN/e0jd3Xtt1KcGpwx30v50mL7oPyr/h9bL3E4aZccVwpwP+5W9Vjkg==";
1959 };
1959 };
1960 };
1960 };
1961 "number-is-nan-1.0.1" = {
1961 "number-is-nan-1.0.1" = {
1962 name = "number-is-nan";
1962 name = "number-is-nan";
1963 packageName = "number-is-nan";
1963 packageName = "number-is-nan";
1964 version = "1.0.1";
1964 version = "1.0.1";
1965 src = fetchurl {
1965 src = fetchurl {
1966 url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";
1966 url = "https://registry.npmjs.org/number-is-nan/-/number-is-nan-1.0.1.tgz";
1967 sha1 = "097b602b53422a522c1afb8790318336941a011d";
1967 sha1 = "097b602b53422a522c1afb8790318336941a011d";
1968 };
1968 };
1969 };
1969 };
1970 "oauth-sign-0.8.2" = {
1970 "oauth-sign-0.8.2" = {
1971 name = "oauth-sign";
1971 name = "oauth-sign";
1972 packageName = "oauth-sign";
1972 packageName = "oauth-sign";
1973 version = "0.8.2";
1973 version = "0.8.2";
1974 src = fetchurl {
1974 src = fetchurl {
1975 url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz";
1975 url = "https://registry.npmjs.org/oauth-sign/-/oauth-sign-0.8.2.tgz";
1976 sha1 = "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43";
1976 sha1 = "46a6ab7f0aead8deae9ec0565780b7d4efeb9d43";
1977 };
1977 };
1978 };
1978 };
1979 "object-assign-4.1.1" = {
1979 "object-assign-4.1.1" = {
1980 name = "object-assign";
1980 name = "object-assign";
1981 packageName = "object-assign";
1981 packageName = "object-assign";
1982 version = "4.1.1";
1982 version = "4.1.1";
1983 src = fetchurl {
1983 src = fetchurl {
1984 url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
1984 url = "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz";
1985 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
1985 sha1 = "2109adc7965887cfc05cbbd442cac8bfbb360863";
1986 };
1986 };
1987 };
1987 };
1988 "once-1.3.3" = {
1988 "once-1.3.3" = {
1989 name = "once";
1989 name = "once";
1990 packageName = "once";
1990 packageName = "once";
1991 version = "1.3.3";
1991 version = "1.3.3";
1992 src = fetchurl {
1992 src = fetchurl {
1993 url = "https://registry.npmjs.org/once/-/once-1.3.3.tgz";
1993 url = "https://registry.npmjs.org/once/-/once-1.3.3.tgz";
1994 sha1 = "b2e261557ce4c314ec8304f3fa82663e4297ca20";
1994 sha1 = "b2e261557ce4c314ec8304f3fa82663e4297ca20";
1995 };
1995 };
1996 };
1996 };
1997 "once-1.4.0" = {
1997 "once-1.4.0" = {
1998 name = "once";
1998 name = "once";
1999 packageName = "once";
1999 packageName = "once";
2000 version = "1.4.0";
2000 version = "1.4.0";
2001 src = fetchurl {
2001 src = fetchurl {
2002 url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
2002 url = "https://registry.npmjs.org/once/-/once-1.4.0.tgz";
2003 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
2003 sha1 = "583b1aa775961d4b113ac17d9c50baef9dd76bd1";
2004 };
2004 };
2005 };
2005 };
2006 "optionator-0.8.2" = {
2006 "optionator-0.8.2" = {
2007 name = "optionator";
2007 name = "optionator";
2008 packageName = "optionator";
2008 packageName = "optionator";
2009 version = "0.8.2";
2009 version = "0.8.2";
2010 src = fetchurl {
2010 src = fetchurl {
2011 url = "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz";
2011 url = "https://registry.npmjs.org/optionator/-/optionator-0.8.2.tgz";
2012 sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
2012 sha1 = "364c5e409d3f4d6301d6c0b4c05bba50180aeb64";
2013 };
2013 };
2014 };
2014 };
2015 "optparse-1.0.5" = {
2015 "optparse-1.0.5" = {
2016 name = "optparse";
2016 name = "optparse";
2017 packageName = "optparse";
2017 packageName = "optparse";
2018 version = "1.0.5";
2018 version = "1.0.5";
2019 src = fetchurl {
2019 src = fetchurl {
2020 url = "https://registry.npmjs.org/optparse/-/optparse-1.0.5.tgz";
2020 url = "https://registry.npmjs.org/optparse/-/optparse-1.0.5.tgz";
2021 sha1 = "75e75a96506611eb1c65ba89018ff08a981e2c16";
2021 sha1 = "75e75a96506611eb1c65ba89018ff08a981e2c16";
2022 };
2022 };
2023 };
2023 };
2024 "os-homedir-1.0.2" = {
2024 "os-homedir-1.0.2" = {
2025 name = "os-homedir";
2025 name = "os-homedir";
2026 packageName = "os-homedir";
2026 packageName = "os-homedir";
2027 version = "1.0.2";
2027 version = "1.0.2";
2028 src = fetchurl {
2028 src = fetchurl {
2029 url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
2029 url = "https://registry.npmjs.org/os-homedir/-/os-homedir-1.0.2.tgz";
2030 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
2030 sha1 = "ffbc4988336e0e833de0c168c7ef152121aa7fb3";
2031 };
2031 };
2032 };
2032 };
2033 "os-tmpdir-1.0.2" = {
2033 "os-tmpdir-1.0.2" = {
2034 name = "os-tmpdir";
2034 name = "os-tmpdir";
2035 packageName = "os-tmpdir";
2035 packageName = "os-tmpdir";
2036 version = "1.0.2";
2036 version = "1.0.2";
2037 src = fetchurl {
2037 src = fetchurl {
2038 url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
2038 url = "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz";
2039 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
2039 sha1 = "bbe67406c79aa85c5cfec766fe5734555dfa1274";
2040 };
2040 };
2041 };
2041 };
2042 "osenv-0.1.5" = {
2042 "osenv-0.1.5" = {
2043 name = "osenv";
2043 name = "osenv";
2044 packageName = "osenv";
2044 packageName = "osenv";
2045 version = "0.1.5";
2045 version = "0.1.5";
2046 src = fetchurl {
2046 src = fetchurl {
2047 url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
2047 url = "https://registry.npmjs.org/osenv/-/osenv-0.1.5.tgz";
2048 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
2048 sha512 = "0CWcCECdMVc2Rw3U5w9ZjqX6ga6ubk1xDVKxtBQPK7wis/0F2r9T6k4ydGYhecl7YUBxBVxhL5oisPsNxAPe2g==";
2049 };
2049 };
2050 };
2050 };
2051 "parse5-1.5.1" = {
2051 "parse5-1.5.1" = {
2052 name = "parse5";
2052 name = "parse5";
2053 packageName = "parse5";
2053 packageName = "parse5";
2054 version = "1.5.1";
2054 version = "1.5.1";
2055 src = fetchurl {
2055 src = fetchurl {
2056 url = "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz";
2056 url = "https://registry.npmjs.org/parse5/-/parse5-1.5.1.tgz";
2057 sha1 = "9b7f3b0de32be78dc2401b17573ccaf0f6f59d94";
2057 sha1 = "9b7f3b0de32be78dc2401b17573ccaf0f6f59d94";
2058 };
2058 };
2059 };
2059 };
2060 "path-is-absolute-1.0.1" = {
2060 "path-is-absolute-1.0.1" = {
2061 name = "path-is-absolute";
2061 name = "path-is-absolute";
2062 packageName = "path-is-absolute";
2062 packageName = "path-is-absolute";
2063 version = "1.0.1";
2063 version = "1.0.1";
2064 src = fetchurl {
2064 src = fetchurl {
2065 url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
2065 url = "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz";
2066 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
2066 sha1 = "174b9268735534ffbc7ace6bf53a5a9e1b5c5f5f";
2067 };
2067 };
2068 };
2068 };
2069 "path-posix-1.0.0" = {
2069 "path-posix-1.0.0" = {
2070 name = "path-posix";
2070 name = "path-posix";
2071 packageName = "path-posix";
2071 packageName = "path-posix";
2072 version = "1.0.0";
2072 version = "1.0.0";
2073 src = fetchurl {
2073 src = fetchurl {
2074 url = "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz";
2074 url = "https://registry.npmjs.org/path-posix/-/path-posix-1.0.0.tgz";
2075 sha1 = "06b26113f56beab042545a23bfa88003ccac260f";
2075 sha1 = "06b26113f56beab042545a23bfa88003ccac260f";
2076 };
2076 };
2077 };
2077 };
2078 "pend-1.2.0" = {
2078 "pend-1.2.0" = {
2079 name = "pend";
2079 name = "pend";
2080 packageName = "pend";
2080 packageName = "pend";
2081 version = "1.2.0";
2081 version = "1.2.0";
2082 src = fetchurl {
2082 src = fetchurl {
2083 url = "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz";
2083 url = "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz";
2084 sha1 = "7a57eb550a6783f9115331fcf4663d5c8e007a50";
2084 sha1 = "7a57eb550a6783f9115331fcf4663d5c8e007a50";
2085 };
2085 };
2086 };
2086 };
2087 "performance-now-0.2.0" = {
2087 "performance-now-0.2.0" = {
2088 name = "performance-now";
2088 name = "performance-now";
2089 packageName = "performance-now";
2089 packageName = "performance-now";
2090 version = "0.2.0";
2090 version = "0.2.0";
2091 src = fetchurl {
2091 src = fetchurl {
2092 url = "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz";
2092 url = "https://registry.npmjs.org/performance-now/-/performance-now-0.2.0.tgz";
2093 sha1 = "33ef30c5c77d4ea21c5a53869d91b56d8f2555e5";
2093 sha1 = "33ef30c5c77d4ea21c5a53869d91b56d8f2555e5";
2094 };
2094 };
2095 };
2095 };
2096 "phantom-4.0.12" = {
2096 "phantom-4.0.12" = {
2097 name = "phantom";
2097 name = "phantom";
2098 packageName = "phantom";
2098 packageName = "phantom";
2099 version = "4.0.12";
2099 version = "4.0.12";
2100 src = fetchurl {
2100 src = fetchurl {
2101 url = "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz";
2101 url = "https://registry.npmjs.org/phantom/-/phantom-4.0.12.tgz";
2102 sha512 = "Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==";
2102 sha512 = "Tz82XhtPmwCk1FFPmecy7yRGZG2btpzY2KI9fcoPT7zT9det0CcMyfBFPp1S8DqzsnQnm8ZYEfdy528mwVtksA==";
2103 };
2103 };
2104 };
2104 };
2105 "phantomjs-prebuilt-2.1.16" = {
2105 "phantomjs-prebuilt-2.1.16" = {
2106 name = "phantomjs-prebuilt";
2106 name = "phantomjs-prebuilt";
2107 packageName = "phantomjs-prebuilt";
2107 packageName = "phantomjs-prebuilt";
2108 version = "2.1.16";
2108 version = "2.1.16";
2109 src = fetchurl {
2109 src = fetchurl {
2110 url = "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz";
2110 url = "https://registry.npmjs.org/phantomjs-prebuilt/-/phantomjs-prebuilt-2.1.16.tgz";
2111 sha1 = "efd212a4a3966d3647684ea8ba788549be2aefef";
2111 sha1 = "efd212a4a3966d3647684ea8ba788549be2aefef";
2112 };
2112 };
2113 };
2113 };
2114 "pinkie-2.0.4" = {
2114 "pinkie-2.0.4" = {
2115 name = "pinkie";
2115 name = "pinkie";
2116 packageName = "pinkie";
2116 packageName = "pinkie";
2117 version = "2.0.4";
2117 version = "2.0.4";
2118 src = fetchurl {
2118 src = fetchurl {
2119 url = "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz";
2119 url = "https://registry.npmjs.org/pinkie/-/pinkie-2.0.4.tgz";
2120 sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
2120 sha1 = "72556b80cfa0d48a974e80e77248e80ed4f7f870";
2121 };
2121 };
2122 };
2122 };
2123 "pinkie-promise-2.0.1" = {
2123 "pinkie-promise-2.0.1" = {
2124 name = "pinkie-promise";
2124 name = "pinkie-promise";
2125 packageName = "pinkie-promise";
2125 packageName = "pinkie-promise";
2126 version = "2.0.1";
2126 version = "2.0.1";
2127 src = fetchurl {
2127 src = fetchurl {
2128 url = "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
2128 url = "https://registry.npmjs.org/pinkie-promise/-/pinkie-promise-2.0.1.tgz";
2129 sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
2129 sha1 = "2135d6dfa7a358c069ac9b178776288228450ffa";
2130 };
2130 };
2131 };
2131 };
2132 "prelude-ls-1.1.2" = {
2132 "prelude-ls-1.1.2" = {
2133 name = "prelude-ls";
2133 name = "prelude-ls";
2134 packageName = "prelude-ls";
2134 packageName = "prelude-ls";
2135 version = "1.1.2";
2135 version = "1.1.2";
2136 src = fetchurl {
2136 src = fetchurl {
2137 url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
2137 url = "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.1.2.tgz";
2138 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
2138 sha1 = "21932a549f5e52ffd9a827f570e04be62a97da54";
2139 };
2139 };
2140 };
2140 };
2141 "process-nextick-args-2.0.0" = {
2141 "process-nextick-args-2.0.0" = {
2142 name = "process-nextick-args";
2142 name = "process-nextick-args";
2143 packageName = "process-nextick-args";
2143 packageName = "process-nextick-args";
2144 version = "2.0.0";
2144 version = "2.0.0";
2145 src = fetchurl {
2145 src = fetchurl {
2146 url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz";
2146 url = "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.0.tgz";
2147 sha512 = "MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==";
2147 sha512 = "MtEC1TqN0EU5nephaJ4rAtThHtC86dNN9qCuEhtshvpVBkAW5ZO7BASN9REnF9eoXGcRub+pFuKEpOHE+HbEMw==";
2148 };
2148 };
2149 };
2149 };
2150 "progress-1.1.8" = {
2150 "progress-1.1.8" = {
2151 name = "progress";
2151 name = "progress";
2152 packageName = "progress";
2152 packageName = "progress";
2153 version = "1.1.8";
2153 version = "1.1.8";
2154 src = fetchurl {
2154 src = fetchurl {
2155 url = "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz";
2155 url = "https://registry.npmjs.org/progress/-/progress-1.1.8.tgz";
2156 sha1 = "e260c78f6161cdd9b0e56cc3e0a85de17c7a57be";
2156 sha1 = "e260c78f6161cdd9b0e56cc3e0a85de17c7a57be";
2157 };
2157 };
2158 };
2158 };
2159 "promise-7.3.1" = {
2159 "promise-7.3.1" = {
2160 name = "promise";
2160 name = "promise";
2161 packageName = "promise";
2161 packageName = "promise";
2162 version = "7.3.1";
2162 version = "7.3.1";
2163 src = fetchurl {
2163 src = fetchurl {
2164 url = "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz";
2164 url = "https://registry.npmjs.org/promise/-/promise-7.3.1.tgz";
2165 sha512 = "nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==";
2165 sha512 = "nolQXZ/4L+bP/UGlkfaIujX9BKxGwmQ9OT4mOt5yvy8iK1h3wqTEJCijzGANTCCl9nWjY41juyAn2K3Q1hLLTg==";
2166 };
2166 };
2167 };
2167 };
2168 "proto-list-1.2.4" = {
2168 "proto-list-1.2.4" = {
2169 name = "proto-list";
2169 name = "proto-list";
2170 packageName = "proto-list";
2170 packageName = "proto-list";
2171 version = "1.2.4";
2171 version = "1.2.4";
2172 src = fetchurl {
2172 src = fetchurl {
2173 url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz";
2173 url = "https://registry.npmjs.org/proto-list/-/proto-list-1.2.4.tgz";
2174 sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
2174 sha1 = "212d5bfe1318306a420f6402b8e26ff39647a849";
2175 };
2175 };
2176 };
2176 };
2177 "prr-1.0.1" = {
2177 "prr-1.0.1" = {
2178 name = "prr";
2178 name = "prr";
2179 packageName = "prr";
2179 packageName = "prr";
2180 version = "1.0.1";
2180 version = "1.0.1";
2181 src = fetchurl {
2181 src = fetchurl {
2182 url = "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz";
2182 url = "https://registry.npmjs.org/prr/-/prr-1.0.1.tgz";
2183 sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
2183 sha1 = "d3fc114ba06995a45ec6893f484ceb1d78f5f476";
2184 };
2184 };
2185 };
2185 };
2186 "punycode-1.4.1" = {
2186 "punycode-1.4.1" = {
2187 name = "punycode";
2187 name = "punycode";
2188 packageName = "punycode";
2188 packageName = "punycode";
2189 version = "1.4.1";
2189 version = "1.4.1";
2190 src = fetchurl {
2190 src = fetchurl {
2191 url = "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz";
2191 url = "https://registry.npmjs.org/punycode/-/punycode-1.4.1.tgz";
2192 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
2192 sha1 = "c0d5a63b2718800ad8e1eb0fa5269c84dd41845e";
2193 };
2193 };
2194 };
2194 };
2195 "qrious-4.0.2" = {
2195 "qrious-4.0.2" = {
2196 name = "qrious";
2196 name = "qrious";
2197 packageName = "qrious";
2197 packageName = "qrious";
2198 version = "4.0.2";
2198 version = "4.0.2";
2199 src = fetchurl {
2199 src = fetchurl {
2200 url = "https://registry.npmjs.org/qrious/-/qrious-4.0.2.tgz";
2200 url = "https://registry.npmjs.org/qrious/-/qrious-4.0.2.tgz";
2201 sha512 = "xWPJIrK1zu5Ypn898fBp8RHkT/9ibquV2Kv24S/JY9VYEhMBMKur1gHVsOiNUh7PHP9uCgejjpZUHUIXXKoU/g==";
2201 sha512 = "xWPJIrK1zu5Ypn898fBp8RHkT/9ibquV2Kv24S/JY9VYEhMBMKur1gHVsOiNUh7PHP9uCgejjpZUHUIXXKoU/g==";
2202 };
2202 };
2203 };
2203 };
2204 "qs-0.5.6" = {
2204 "qs-0.5.6" = {
2205 name = "qs";
2205 name = "qs";
2206 packageName = "qs";
2206 packageName = "qs";
2207 version = "0.5.6";
2207 version = "0.5.6";
2208 src = fetchurl {
2208 src = fetchurl {
2209 url = "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz";
2209 url = "https://registry.npmjs.org/qs/-/qs-0.5.6.tgz";
2210 sha1 = "31b1ad058567651c526921506b9a8793911a0384";
2210 sha1 = "31b1ad058567651c526921506b9a8793911a0384";
2211 };
2211 };
2212 };
2212 };
2213 "qs-6.4.0" = {
2213 "qs-6.4.0" = {
2214 name = "qs";
2214 name = "qs";
2215 packageName = "qs";
2215 packageName = "qs";
2216 version = "6.4.0";
2216 version = "6.4.0";
2217 src = fetchurl {
2217 src = fetchurl {
2218 url = "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz";
2218 url = "https://registry.npmjs.org/qs/-/qs-6.4.0.tgz";
2219 sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
2219 sha1 = "13e26d28ad6b0ffaa91312cd3bf708ed351e7233";
2220 };
2220 };
2221 };
2221 };
2222 "readable-stream-1.1.14" = {
2222 "readable-stream-1.1.14" = {
2223 name = "readable-stream";
2223 name = "readable-stream";
2224 packageName = "readable-stream";
2224 packageName = "readable-stream";
2225 version = "1.1.14";
2225 version = "1.1.14";
2226 src = fetchurl {
2226 src = fetchurl {
2227 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz";
2227 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-1.1.14.tgz";
2228 sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
2228 sha1 = "7cf4c54ef648e3813084c636dd2079e166c081d9";
2229 };
2229 };
2230 };
2230 };
2231 "readable-stream-2.3.6" = {
2231 "readable-stream-2.3.6" = {
2232 name = "readable-stream";
2232 name = "readable-stream";
2233 packageName = "readable-stream";
2233 packageName = "readable-stream";
2234 version = "2.3.6";
2234 version = "2.3.6";
2235 src = fetchurl {
2235 src = fetchurl {
2236 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz";
2236 url = "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.6.tgz";
2237 sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==";
2237 sha512 = "tQtKA9WIAhBF3+VLAseyMqZeBjW0AHJoxOtYqSUZNJxauErmLbVm2FW1y+J/YA9dUrAC39ITejlZWhVIwawkKw==";
2238 };
2238 };
2239 };
2239 };
2240 "reduce-flatten-1.0.1" = {
2240 "reduce-flatten-1.0.1" = {
2241 name = "reduce-flatten";
2241 name = "reduce-flatten";
2242 packageName = "reduce-flatten";
2242 packageName = "reduce-flatten";
2243 version = "1.0.1";
2243 version = "1.0.1";
2244 src = fetchurl {
2244 src = fetchurl {
2245 url = "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz";
2245 url = "https://registry.npmjs.org/reduce-flatten/-/reduce-flatten-1.0.1.tgz";
2246 sha1 = "258c78efd153ddf93cb561237f61184f3696e327";
2246 sha1 = "258c78efd153ddf93cb561237f61184f3696e327";
2247 };
2247 };
2248 };
2248 };
2249 "regenerator-runtime-0.10.5" = {
2249 "regenerator-runtime-0.10.5" = {
2250 name = "regenerator-runtime";
2250 name = "regenerator-runtime";
2251 packageName = "regenerator-runtime";
2251 packageName = "regenerator-runtime";
2252 version = "0.10.5";
2252 version = "0.10.5";
2253 src = fetchurl {
2253 src = fetchurl {
2254 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz";
2254 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz";
2255 sha1 = "336c3efc1220adcedda2c9fab67b5a7955a33658";
2255 sha1 = "336c3efc1220adcedda2c9fab67b5a7955a33658";
2256 };
2256 };
2257 };
2257 };
2258 "regenerator-runtime-0.11.1" = {
2258 "regenerator-runtime-0.11.1" = {
2259 name = "regenerator-runtime";
2259 name = "regenerator-runtime";
2260 packageName = "regenerator-runtime";
2260 packageName = "regenerator-runtime";
2261 version = "0.11.1";
2261 version = "0.11.1";
2262 src = fetchurl {
2262 src = fetchurl {
2263 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
2263 url = "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.11.1.tgz";
2264 sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
2264 sha512 = "MguG95oij0fC3QV3URf4V2SDYGJhJnJGqvIIgdECeODCT98wSWDAJ94SSuVpYQUoTcGUIL6L4yNB7j1DFFHSBg==";
2265 };
2265 };
2266 };
2266 };
2267 "request-2.81.0" = {
2267 "request-2.81.0" = {
2268 name = "request";
2268 name = "request";
2269 packageName = "request";
2269 packageName = "request";
2270 version = "2.81.0";
2270 version = "2.81.0";
2271 src = fetchurl {
2271 src = fetchurl {
2272 url = "https://registry.npmjs.org/request/-/request-2.81.0.tgz";
2272 url = "https://registry.npmjs.org/request/-/request-2.81.0.tgz";
2273 sha1 = "c6928946a0e06c5f8d6f8a9333469ffda46298a0";
2273 sha1 = "c6928946a0e06c5f8d6f8a9333469ffda46298a0";
2274 };
2274 };
2275 };
2275 };
2276 "request-progress-2.0.1" = {
2276 "request-progress-2.0.1" = {
2277 name = "request-progress";
2277 name = "request-progress";
2278 packageName = "request-progress";
2278 packageName = "request-progress";
2279 version = "2.0.1";
2279 version = "2.0.1";
2280 src = fetchurl {
2280 src = fetchurl {
2281 url = "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz";
2281 url = "https://registry.npmjs.org/request-progress/-/request-progress-2.0.1.tgz";
2282 sha1 = "5d36bb57961c673aa5b788dbc8141fdf23b44e08";
2282 sha1 = "5d36bb57961c673aa5b788dbc8141fdf23b44e08";
2283 };
2283 };
2284 };
2284 };
2285 "retry-0.10.1" = {
2285 "retry-0.10.1" = {
2286 name = "retry";
2286 name = "retry";
2287 packageName = "retry";
2287 packageName = "retry";
2288 version = "0.10.1";
2288 version = "0.10.1";
2289 src = fetchurl {
2289 src = fetchurl {
2290 url = "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz";
2290 url = "https://registry.npmjs.org/retry/-/retry-0.10.1.tgz";
2291 sha1 = "e76388d217992c252750241d3d3956fed98d8ff4";
2291 sha1 = "e76388d217992c252750241d3d3956fed98d8ff4";
2292 };
2292 };
2293 };
2293 };
2294 "rimraf-2.2.8" = {
2294 "rimraf-2.2.8" = {
2295 name = "rimraf";
2295 name = "rimraf";
2296 packageName = "rimraf";
2296 packageName = "rimraf";
2297 version = "2.2.8";
2297 version = "2.2.8";
2298 src = fetchurl {
2298 src = fetchurl {
2299 url = "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz";
2299 url = "https://registry.npmjs.org/rimraf/-/rimraf-2.2.8.tgz";
2300 sha1 = "e439be2aaee327321952730f99a8929e4fc50582";
2300 sha1 = "e439be2aaee327321952730f99a8929e4fc50582";
2301 };
2301 };
2302 };
2302 };
2303 "safe-buffer-5.1.2" = {
2303 "safe-buffer-5.1.2" = {
2304 name = "safe-buffer";
2304 name = "safe-buffer";
2305 packageName = "safe-buffer";
2305 packageName = "safe-buffer";
2306 version = "5.1.2";
2306 version = "5.1.2";
2307 src = fetchurl {
2307 src = fetchurl {
2308 url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
2308 url = "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz";
2309 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
2309 sha512 = "Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==";
2310 };
2310 };
2311 };
2311 };
2312 "safer-buffer-2.1.2" = {
2312 "safer-buffer-2.1.2" = {
2313 name = "safer-buffer";
2313 name = "safer-buffer";
2314 packageName = "safer-buffer";
2314 packageName = "safer-buffer";
2315 version = "2.1.2";
2315 version = "2.1.2";
2316 src = fetchurl {
2316 src = fetchurl {
2317 url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
2317 url = "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz";
2318 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
2318 sha512 = "YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==";
2319 };
2319 };
2320 };
2320 };
2321 "select-1.1.2" = {
2321 "select-1.1.2" = {
2322 name = "select";
2322 name = "select";
2323 packageName = "select";
2323 packageName = "select";
2324 version = "1.1.2";
2324 version = "1.1.2";
2325 src = fetchurl {
2325 src = fetchurl {
2326 url = "https://registry.npmjs.org/select/-/select-1.1.2.tgz";
2326 url = "https://registry.npmjs.org/select/-/select-1.1.2.tgz";
2327 sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d";
2327 sha1 = "0e7350acdec80b1108528786ec1d4418d11b396d";
2328 };
2328 };
2329 };
2329 };
2330 "semver-4.3.6" = {
2330 "semver-4.3.6" = {
2331 name = "semver";
2331 name = "semver";
2332 packageName = "semver";
2332 packageName = "semver";
2333 version = "4.3.6";
2333 version = "4.3.6";
2334 src = fetchurl {
2334 src = fetchurl {
2335 url = "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz";
2335 url = "https://registry.npmjs.org/semver/-/semver-4.3.6.tgz";
2336 sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
2336 sha1 = "300bc6e0e86374f7ba61068b5b1ecd57fc6532da";
2337 };
2337 };
2338 };
2338 };
2339 "semver-5.5.0" = {
2339 "semver-5.5.1" = {
2340 name = "semver";
2340 name = "semver";
2341 packageName = "semver";
2341 packageName = "semver";
2342 version = "5.5.0";
2342 version = "5.5.1";
2343 src = fetchurl {
2343 src = fetchurl {
2344 url = "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz";
2344 url = "https://registry.npmjs.org/semver/-/semver-5.5.1.tgz";
2345 sha512 = "4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA==";
2345 sha512 = "PqpAxfrEhlSUWge8dwIp4tZnQ25DIOthpiaHNIthsjEFQD6EvqUKUDM7L8O2rShkFccYo1VjJR0coWfNkCubRw==";
2346 };
2346 };
2347 };
2347 };
2348 "set-blocking-2.0.0" = {
2348 "set-blocking-2.0.0" = {
2349 name = "set-blocking";
2349 name = "set-blocking";
2350 packageName = "set-blocking";
2350 packageName = "set-blocking";
2351 version = "2.0.0";
2351 version = "2.0.0";
2352 src = fetchurl {
2352 src = fetchurl {
2353 url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
2353 url = "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz";
2354 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
2354 sha1 = "045f9782d011ae9a6803ddd382b24392b3d890f7";
2355 };
2355 };
2356 };
2356 };
2357 "shelljs-0.3.0" = {
2357 "shelljs-0.3.0" = {
2358 name = "shelljs";
2358 name = "shelljs";
2359 packageName = "shelljs";
2359 packageName = "shelljs";
2360 version = "0.3.0";
2360 version = "0.3.0";
2361 src = fetchurl {
2361 src = fetchurl {
2362 url = "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz";
2362 url = "https://registry.npmjs.org/shelljs/-/shelljs-0.3.0.tgz";
2363 sha1 = "3596e6307a781544f591f37da618360f31db57b1";
2363 sha1 = "3596e6307a781544f591f37da618360f31db57b1";
2364 };
2364 };
2365 };
2365 };
2366 "sigmund-1.0.1" = {
2366 "sigmund-1.0.1" = {
2367 name = "sigmund";
2367 name = "sigmund";
2368 packageName = "sigmund";
2368 packageName = "sigmund";
2369 version = "1.0.1";
2369 version = "1.0.1";
2370 src = fetchurl {
2370 src = fetchurl {
2371 url = "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz";
2371 url = "https://registry.npmjs.org/sigmund/-/sigmund-1.0.1.tgz";
2372 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
2372 sha1 = "3ff21f198cad2175f9f3b781853fd94d0d19b590";
2373 };
2373 };
2374 };
2374 };
2375 "signal-exit-3.0.2" = {
2375 "signal-exit-3.0.2" = {
2376 name = "signal-exit";
2376 name = "signal-exit";
2377 packageName = "signal-exit";
2377 packageName = "signal-exit";
2378 version = "3.0.2";
2378 version = "3.0.2";
2379 src = fetchurl {
2379 src = fetchurl {
2380 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz";
2380 url = "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.2.tgz";
2381 sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
2381 sha1 = "b5fdc08f1287ea1178628e415e25132b73646c6d";
2382 };
2382 };
2383 };
2383 };
2384 "slasp-0.0.4" = {
2384 "slasp-0.0.4" = {
2385 name = "slasp";
2385 name = "slasp";
2386 packageName = "slasp";
2386 packageName = "slasp";
2387 version = "0.0.4";
2387 version = "0.0.4";
2388 src = fetchurl {
2388 src = fetchurl {
2389 url = "https://registry.npmjs.org/slasp/-/slasp-0.0.4.tgz";
2389 url = "https://registry.npmjs.org/slasp/-/slasp-0.0.4.tgz";
2390 sha1 = "9adc26ee729a0f95095851a5489f87a5258d57a9";
2390 sha1 = "9adc26ee729a0f95095851a5489f87a5258d57a9";
2391 };
2391 };
2392 };
2392 };
2393 "slide-1.1.6" = {
2393 "slide-1.1.6" = {
2394 name = "slide";
2394 name = "slide";
2395 packageName = "slide";
2395 packageName = "slide";
2396 version = "1.1.6";
2396 version = "1.1.6";
2397 src = fetchurl {
2397 src = fetchurl {
2398 url = "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz";
2398 url = "https://registry.npmjs.org/slide/-/slide-1.1.6.tgz";
2399 sha1 = "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707";
2399 sha1 = "56eb027d65b4d2dce6cb2e2d32c4d4afc9e1d707";
2400 };
2400 };
2401 };
2401 };
2402 "sntp-1.0.9" = {
2402 "sntp-1.0.9" = {
2403 name = "sntp";
2403 name = "sntp";
2404 packageName = "sntp";
2404 packageName = "sntp";
2405 version = "1.0.9";
2405 version = "1.0.9";
2406 src = fetchurl {
2406 src = fetchurl {
2407 url = "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz";
2407 url = "https://registry.npmjs.org/sntp/-/sntp-1.0.9.tgz";
2408 sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
2408 sha1 = "6541184cc90aeea6c6e7b35e2659082443c66198";
2409 };
2409 };
2410 };
2410 };
2411 "source-map-0.3.0" = {
2411 "source-map-0.3.0" = {
2412 name = "source-map";
2412 name = "source-map";
2413 packageName = "source-map";
2413 packageName = "source-map";
2414 version = "0.3.0";
2414 version = "0.3.0";
2415 src = fetchurl {
2415 src = fetchurl {
2416 url = "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz";
2416 url = "https://registry.npmjs.org/source-map/-/source-map-0.3.0.tgz";
2417 sha1 = "8586fb9a5a005e5b501e21cd18b6f21b457ad1f9";
2417 sha1 = "8586fb9a5a005e5b501e21cd18b6f21b457ad1f9";
2418 };
2418 };
2419 };
2419 };
2420 "source-map-0.5.7" = {
2420 "source-map-0.5.7" = {
2421 name = "source-map";
2421 name = "source-map";
2422 packageName = "source-map";
2422 packageName = "source-map";
2423 version = "0.5.7";
2423 version = "0.5.7";
2424 src = fetchurl {
2424 src = fetchurl {
2425 url = "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz";
2425 url = "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz";
2426 sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
2426 sha1 = "8a039d2d1021d22d1ea14c80d8ea468ba2ef3fcc";
2427 };
2427 };
2428 };
2428 };
2429 "source-map-0.6.1" = {
2429 "source-map-0.6.1" = {
2430 name = "source-map";
2430 name = "source-map";
2431 packageName = "source-map";
2431 packageName = "source-map";
2432 version = "0.6.1";
2432 version = "0.6.1";
2433 src = fetchurl {
2433 src = fetchurl {
2434 url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";
2434 url = "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz";
2435 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
2435 sha512 = "UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==";
2436 };
2436 };
2437 };
2437 };
2438 "spdx-correct-3.0.0" = {
2438 "spdx-correct-3.0.2" = {
2439 name = "spdx-correct";
2439 name = "spdx-correct";
2440 packageName = "spdx-correct";
2440 packageName = "spdx-correct";
2441 version = "3.0.0";
2441 version = "3.0.2";
2442 src = fetchurl {
2442 src = fetchurl {
2443 url = "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.0.tgz";
2443 url = "https://registry.npmjs.org/spdx-correct/-/spdx-correct-3.0.2.tgz";
2444 sha512 = "N19o9z5cEyc8yQQPukRCZ9EUmb4HUpnrmaL/fxS2pBo2jbfcFRVuFZ/oFC+vZz0MNNk0h80iMn5/S6qGZOL5+g==";
2444 sha512 = "q9hedtzyXHr5S0A1vEPoK/7l8NpfkFYTq6iCY+Pno2ZbdZR6WexZFtqeVGkGxW3TEJMN914Z55EnAGMmenlIQQ==";
2445 };
2445 };
2446 };
2446 };
2447 "spdx-exceptions-2.1.0" = {
2447 "spdx-exceptions-2.2.0" = {
2448 name = "spdx-exceptions";
2448 name = "spdx-exceptions";
2449 packageName = "spdx-exceptions";
2449 packageName = "spdx-exceptions";
2450 version = "2.1.0";
2450 version = "2.2.0";
2451 src = fetchurl {
2451 src = fetchurl {
2452 url = "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.1.0.tgz";
2452 url = "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.2.0.tgz";
2453 sha512 = "4K1NsmrlCU1JJgUrtgEeTVyfx8VaYea9J9LvARxhbHtVtohPs/gFGG5yy49beySjlIMhhXZ4QqujIZEfS4l6Cg==";
2453 sha512 = "2XQACfElKi9SlVb1CYadKDXvoajPgBVPn/gOQLrTvHdElaVhr7ZEbqJaRnJLVNeaI4cMEAgVCeBMKF6MWRDCRA==";
2454 };
2454 };
2455 };
2455 };
2456 "spdx-expression-parse-3.0.0" = {
2456 "spdx-expression-parse-3.0.0" = {
2457 name = "spdx-expression-parse";
2457 name = "spdx-expression-parse";
2458 packageName = "spdx-expression-parse";
2458 packageName = "spdx-expression-parse";
2459 version = "3.0.0";
2459 version = "3.0.0";
2460 src = fetchurl {
2460 src = fetchurl {
2461 url = "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
2461 url = "https://registry.npmjs.org/spdx-expression-parse/-/spdx-expression-parse-3.0.0.tgz";
2462 sha512 = "Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==";
2462 sha512 = "Yg6D3XpRD4kkOmTpdgbUiEJFKghJH03fiC1OPll5h/0sO6neh2jqRDVHOQ4o/LMea0tgCkbMgea5ip/e+MkWyg==";
2463 };
2463 };
2464 };
2464 };
2465 "spdx-license-ids-3.0.0" = {
2465 "spdx-license-ids-3.0.1" = {
2466 name = "spdx-license-ids";
2466 name = "spdx-license-ids";
2467 packageName = "spdx-license-ids";
2467 packageName = "spdx-license-ids";
2468 version = "3.0.0";
2468 version = "3.0.1";
2469 src = fetchurl {
2469 src = fetchurl {
2470 url = "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.0.tgz";
2470 url = "https://registry.npmjs.org/spdx-license-ids/-/spdx-license-ids-3.0.1.tgz";
2471 sha512 = "2+EPwgbnmOIl8HjGBXXMd9NAu02vLjOO1nWw4kmeRDFyHn+M/ETfHxQUK0oXg8ctgVnl9t3rosNVsZ1jG61nDA==";
2471 sha512 = "TfOfPcYGBB5sDuPn3deByxPhmfegAhpDYKSOXZQN81Oyrrif8ZCodOLzK3AesELnCx03kikhyDwh0pfvvQvF8w==";
2472 };
2472 };
2473 };
2473 };
2474 "split-1.0.1" = {
2474 "split-1.0.1" = {
2475 name = "split";
2475 name = "split";
2476 packageName = "split";
2476 packageName = "split";
2477 version = "1.0.1";
2477 version = "1.0.1";
2478 src = fetchurl {
2478 src = fetchurl {
2479 url = "https://registry.npmjs.org/split/-/split-1.0.1.tgz";
2479 url = "https://registry.npmjs.org/split/-/split-1.0.1.tgz";
2480 sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==";
2480 sha512 = "mTyOoPbrivtXnwnIxZRFYRrPNtEFKlpB2fvjSnCQUiAA6qAZzqwna5envK4uk6OIeP17CsdF3rSBGYVBsU0Tkg==";
2481 };
2481 };
2482 };
2482 };
2483 "sshpk-1.14.2" = {
2483 "sshpk-1.15.1" = {
2484 name = "sshpk";
2484 name = "sshpk";
2485 packageName = "sshpk";
2485 packageName = "sshpk";
2486 version = "1.14.2";
2486 version = "1.15.1";
2487 src = fetchurl {
2487 src = fetchurl {
2488 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.14.2.tgz";
2488 url = "https://registry.npmjs.org/sshpk/-/sshpk-1.15.1.tgz";
2489 sha1 = "c6fc61648a3d9c4e764fd3fcdf4ea105e492ba98";
2489 sha512 = "mSdgNUaidk+dRU5MhYtN9zebdzF2iG0cNPWy8HG+W8y+fT1JnSkh0fzzpjOa0L7P8i1Rscz38t0h4gPcKz43xA==";
2490 };
2490 };
2491 };
2491 };
2492 "ssri-5.3.0" = {
2492 "ssri-5.3.0" = {
2493 name = "ssri";
2493 name = "ssri";
2494 packageName = "ssri";
2494 packageName = "ssri";
2495 version = "5.3.0";
2495 version = "5.3.0";
2496 src = fetchurl {
2496 src = fetchurl {
2497 url = "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz";
2497 url = "https://registry.npmjs.org/ssri/-/ssri-5.3.0.tgz";
2498 sha512 = "XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==";
2498 sha512 = "XRSIPqLij52MtgoQavH/x/dU1qVKtWUAAZeOHsR9c2Ddi4XerFy3mc1alf+dLJKl9EUIm/Ht+EowFkTUOA6GAQ==";
2499 };
2499 };
2500 };
2500 };
2501 "stack-trace-0.0.10" = {
2501 "stack-trace-0.0.10" = {
2502 name = "stack-trace";
2502 name = "stack-trace";
2503 packageName = "stack-trace";
2503 packageName = "stack-trace";
2504 version = "0.0.10";
2504 version = "0.0.10";
2505 src = fetchurl {
2505 src = fetchurl {
2506 url = "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz";
2506 url = "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz";
2507 sha1 = "547c70b347e8d32b4e108ea1a2a159e5fdde19c0";
2507 sha1 = "547c70b347e8d32b4e108ea1a2a159e5fdde19c0";
2508 };
2508 };
2509 };
2509 };
2510 "sticky-sidebar-3.3.1" = {
2511 name = "sticky-sidebar";
2512 packageName = "sticky-sidebar";
2513 version = "3.3.1";
2514 src = fetchurl {
2515 url = "https://registry.npmjs.org/sticky-sidebar/-/sticky-sidebar-3.3.1.tgz";
2516 sha1 = "142bf6b64c2b416e4b707ebf8f09b8b5a5043877";
2517 };
2518 };
2510 "string-width-1.0.2" = {
2519 "string-width-1.0.2" = {
2511 name = "string-width";
2520 name = "string-width";
2512 packageName = "string-width";
2521 packageName = "string-width";
2513 version = "1.0.2";
2522 version = "1.0.2";
2514 src = fetchurl {
2523 src = fetchurl {
2515 url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";
2524 url = "https://registry.npmjs.org/string-width/-/string-width-1.0.2.tgz";
2516 sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
2525 sha1 = "118bdf5b8cdc51a2a7e70d211e07e2b0b9b107d3";
2517 };
2526 };
2518 };
2527 };
2519 "string_decoder-0.10.31" = {
2528 "string_decoder-0.10.31" = {
2520 name = "string_decoder";
2529 name = "string_decoder";
2521 packageName = "string_decoder";
2530 packageName = "string_decoder";
2522 version = "0.10.31";
2531 version = "0.10.31";
2523 src = fetchurl {
2532 src = fetchurl {
2524 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
2533 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz";
2525 sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
2534 sha1 = "62e203bc41766c6c28c9fc84301dab1c5310fa94";
2526 };
2535 };
2527 };
2536 };
2528 "string_decoder-1.1.1" = {
2537 "string_decoder-1.1.1" = {
2529 name = "string_decoder";
2538 name = "string_decoder";
2530 packageName = "string_decoder";
2539 packageName = "string_decoder";
2531 version = "1.1.1";
2540 version = "1.1.1";
2532 src = fetchurl {
2541 src = fetchurl {
2533 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
2542 url = "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz";
2534 sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
2543 sha512 = "n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==";
2535 };
2544 };
2536 };
2545 };
2537 "stringstream-0.0.6" = {
2546 "stringstream-0.0.6" = {
2538 name = "stringstream";
2547 name = "stringstream";
2539 packageName = "stringstream";
2548 packageName = "stringstream";
2540 version = "0.0.6";
2549 version = "0.0.6";
2541 src = fetchurl {
2550 src = fetchurl {
2542 url = "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz";
2551 url = "https://registry.npmjs.org/stringstream/-/stringstream-0.0.6.tgz";
2543 sha512 = "87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==";
2552 sha512 = "87GEBAkegbBcweToUrdzf3eLhWNg06FJTebl4BVJz/JgWy8CvEr9dRtX5qWphiynMSQlxxi+QqN0z5T32SLlhA==";
2544 };
2553 };
2545 };
2554 };
2546 "strip-ansi-0.3.0" = {
2555 "strip-ansi-0.3.0" = {
2547 name = "strip-ansi";
2556 name = "strip-ansi";
2548 packageName = "strip-ansi";
2557 packageName = "strip-ansi";
2549 version = "0.3.0";
2558 version = "0.3.0";
2550 src = fetchurl {
2559 src = fetchurl {
2551 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz";
2560 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-0.3.0.tgz";
2552 sha1 = "25f48ea22ca79187f3174a4db8759347bb126220";
2561 sha1 = "25f48ea22ca79187f3174a4db8759347bb126220";
2553 };
2562 };
2554 };
2563 };
2555 "strip-ansi-3.0.1" = {
2564 "strip-ansi-3.0.1" = {
2556 name = "strip-ansi";
2565 name = "strip-ansi";
2557 packageName = "strip-ansi";
2566 packageName = "strip-ansi";
2558 version = "3.0.1";
2567 version = "3.0.1";
2559 src = fetchurl {
2568 src = fetchurl {
2560 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
2569 url = "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz";
2561 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
2570 sha1 = "6a385fb8853d952d5ff05d0e8aaf94278dc63dcf";
2562 };
2571 };
2563 };
2572 };
2564 "strip-json-comments-1.0.4" = {
2573 "strip-json-comments-1.0.4" = {
2565 name = "strip-json-comments";
2574 name = "strip-json-comments";
2566 packageName = "strip-json-comments";
2575 packageName = "strip-json-comments";
2567 version = "1.0.4";
2576 version = "1.0.4";
2568 src = fetchurl {
2577 src = fetchurl {
2569 url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz";
2578 url = "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-1.0.4.tgz";
2570 sha1 = "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91";
2579 sha1 = "1e15fbcac97d3ee99bf2d73b4c656b082bbafb91";
2571 };
2580 };
2572 };
2581 };
2573 "supports-color-0.2.0" = {
2582 "supports-color-0.2.0" = {
2574 name = "supports-color";
2583 name = "supports-color";
2575 packageName = "supports-color";
2584 packageName = "supports-color";
2576 version = "0.2.0";
2585 version = "0.2.0";
2577 src = fetchurl {
2586 src = fetchurl {
2578 url = "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz";
2587 url = "https://registry.npmjs.org/supports-color/-/supports-color-0.2.0.tgz";
2579 sha1 = "d92de2694eb3f67323973d7ae3d8b55b4c22190a";
2588 sha1 = "d92de2694eb3f67323973d7ae3d8b55b4c22190a";
2580 };
2589 };
2581 };
2590 };
2582 "supports-color-2.0.0" = {
2591 "supports-color-2.0.0" = {
2583 name = "supports-color";
2592 name = "supports-color";
2584 packageName = "supports-color";
2593 packageName = "supports-color";
2585 version = "2.0.0";
2594 version = "2.0.0";
2586 src = fetchurl {
2595 src = fetchurl {
2587 url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
2596 url = "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz";
2588 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
2597 sha1 = "535d045ce6b6363fa40117084629995e9df324c7";
2589 };
2598 };
2590 };
2599 };
2591 "table-layout-0.3.0" = {
2600 "table-layout-0.3.0" = {
2592 name = "table-layout";
2601 name = "table-layout";
2593 packageName = "table-layout";
2602 packageName = "table-layout";
2594 version = "0.3.0";
2603 version = "0.3.0";
2595 src = fetchurl {
2604 src = fetchurl {
2596 url = "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz";
2605 url = "https://registry.npmjs.org/table-layout/-/table-layout-0.3.0.tgz";
2597 sha1 = "6ee20dc483db371b3e5c87f704ed2f7c799d2c9a";
2606 sha1 = "6ee20dc483db371b3e5c87f704ed2f7c799d2c9a";
2598 };
2607 };
2599 };
2608 };
2600 "tar-3.1.15" = {
2609 "tar-3.1.15" = {
2601 name = "tar";
2610 name = "tar";
2602 packageName = "tar";
2611 packageName = "tar";
2603 version = "3.1.15";
2612 version = "3.1.15";
2604 src = fetchurl {
2613 src = fetchurl {
2605 url = "https://registry.npmjs.org/tar/-/tar-3.1.15.tgz";
2614 url = "https://registry.npmjs.org/tar/-/tar-3.1.15.tgz";
2606 sha512 = "pQNFsg+Wb6VXsrIPUnuQwrHR4wD5ASBR0jRyiT4/AALFA2Nl+CjhkDX5fTmIwCuULRtyQR3Dae2BBnP2EFHscw==";
2615 sha512 = "pQNFsg+Wb6VXsrIPUnuQwrHR4wD5ASBR0jRyiT4/AALFA2Nl+CjhkDX5fTmIwCuULRtyQR3Dae2BBnP2EFHscw==";
2607 };
2616 };
2608 };
2617 };
2609 "temp-0.8.3" = {
2618 "temp-0.8.3" = {
2610 name = "temp";
2619 name = "temp";
2611 packageName = "temp";
2620 packageName = "temp";
2612 version = "0.8.3";
2621 version = "0.8.3";
2613 src = fetchurl {
2622 src = fetchurl {
2614 url = "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz";
2623 url = "https://registry.npmjs.org/temp/-/temp-0.8.3.tgz";
2615 sha1 = "e0c6bc4d26b903124410e4fed81103014dfc1f59";
2624 sha1 = "e0c6bc4d26b903124410e4fed81103014dfc1f59";
2616 };
2625 };
2617 };
2626 };
2618 "test-value-2.1.0" = {
2627 "test-value-2.1.0" = {
2619 name = "test-value";
2628 name = "test-value";
2620 packageName = "test-value";
2629 packageName = "test-value";
2621 version = "2.1.0";
2630 version = "2.1.0";
2622 src = fetchurl {
2631 src = fetchurl {
2623 url = "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz";
2632 url = "https://registry.npmjs.org/test-value/-/test-value-2.1.0.tgz";
2624 sha1 = "11da6ff670f3471a73b625ca4f3fdcf7bb748291";
2633 sha1 = "11da6ff670f3471a73b625ca4f3fdcf7bb748291";
2625 };
2634 };
2626 };
2635 };
2627 "throttleit-1.0.0" = {
2636 "throttleit-1.0.0" = {
2628 name = "throttleit";
2637 name = "throttleit";
2629 packageName = "throttleit";
2638 packageName = "throttleit";
2630 version = "1.0.0";
2639 version = "1.0.0";
2631 src = fetchurl {
2640 src = fetchurl {
2632 url = "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz";
2641 url = "https://registry.npmjs.org/throttleit/-/throttleit-1.0.0.tgz";
2633 sha1 = "9e785836daf46743145a5984b6268d828528ac6c";
2642 sha1 = "9e785836daf46743145a5984b6268d828528ac6c";
2634 };
2643 };
2635 };
2644 };
2636 "through-2.3.8" = {
2645 "through-2.3.8" = {
2637 name = "through";
2646 name = "through";
2638 packageName = "through";
2647 packageName = "through";
2639 version = "2.3.8";
2648 version = "2.3.8";
2640 src = fetchurl {
2649 src = fetchurl {
2641 url = "https://registry.npmjs.org/through/-/through-2.3.8.tgz";
2650 url = "https://registry.npmjs.org/through/-/through-2.3.8.tgz";
2642 sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
2651 sha1 = "0dd4c9ffaabc357960b1b724115d7e0e86a2e1f5";
2643 };
2652 };
2644 };
2653 };
2645 "tiny-emitter-2.0.2" = {
2654 "tiny-emitter-2.0.2" = {
2646 name = "tiny-emitter";
2655 name = "tiny-emitter";
2647 packageName = "tiny-emitter";
2656 packageName = "tiny-emitter";
2648 version = "2.0.2";
2657 version = "2.0.2";
2649 src = fetchurl {
2658 src = fetchurl {
2650 url = "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz";
2659 url = "https://registry.npmjs.org/tiny-emitter/-/tiny-emitter-2.0.2.tgz";
2651 sha512 = "2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==";
2660 sha512 = "2NM0auVBGft5tee/OxP4PI3d8WItkDM+fPnaRAVo6xTDI2knbz9eC5ArWGqtGlYqiH3RU5yMpdyTTO7MguC4ow==";
2652 };
2661 };
2653 };
2662 };
2654 "tiny-lr-fork-0.0.5" = {
2663 "tiny-lr-fork-0.0.5" = {
2655 name = "tiny-lr-fork";
2664 name = "tiny-lr-fork";
2656 packageName = "tiny-lr-fork";
2665 packageName = "tiny-lr-fork";
2657 version = "0.0.5";
2666 version = "0.0.5";
2658 src = fetchurl {
2667 src = fetchurl {
2659 url = "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz";
2668 url = "https://registry.npmjs.org/tiny-lr-fork/-/tiny-lr-fork-0.0.5.tgz";
2660 sha1 = "1e99e1e2a8469b736ab97d97eefa98c71f76ed0a";
2669 sha1 = "1e99e1e2a8469b736ab97d97eefa98c71f76ed0a";
2661 };
2670 };
2662 };
2671 };
2663 "tough-cookie-2.3.4" = {
2672 "tough-cookie-2.3.4" = {
2664 name = "tough-cookie";
2673 name = "tough-cookie";
2665 packageName = "tough-cookie";
2674 packageName = "tough-cookie";
2666 version = "2.3.4";
2675 version = "2.3.4";
2667 src = fetchurl {
2676 src = fetchurl {
2668 url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz";
2677 url = "https://registry.npmjs.org/tough-cookie/-/tough-cookie-2.3.4.tgz";
2669 sha512 = "TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==";
2678 sha512 = "TZ6TTfI5NtZnuyy/Kecv+CnoROnyXn2DN97LontgQpCwsX2XyLYCC0ENhYkehSOwAp8rTQKc/NUIF7BkQ5rKLA==";
2670 };
2679 };
2671 };
2680 };
2672 "tunnel-agent-0.6.0" = {
2681 "tunnel-agent-0.6.0" = {
2673 name = "tunnel-agent";
2682 name = "tunnel-agent";
2674 packageName = "tunnel-agent";
2683 packageName = "tunnel-agent";
2675 version = "0.6.0";
2684 version = "0.6.0";
2676 src = fetchurl {
2685 src = fetchurl {
2677 url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
2686 url = "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz";
2678 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
2687 sha1 = "27a5dea06b36b04a0a9966774b290868f0fc40fd";
2679 };
2688 };
2680 };
2689 };
2681 "tweetnacl-0.14.5" = {
2690 "tweetnacl-0.14.5" = {
2682 name = "tweetnacl";
2691 name = "tweetnacl";
2683 packageName = "tweetnacl";
2692 packageName = "tweetnacl";
2684 version = "0.14.5";
2693 version = "0.14.5";
2685 src = fetchurl {
2694 src = fetchurl {
2686 url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
2695 url = "https://registry.npmjs.org/tweetnacl/-/tweetnacl-0.14.5.tgz";
2687 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
2696 sha1 = "5ae68177f192d4456269d108afa93ff8743f4f64";
2688 };
2697 };
2689 };
2698 };
2690 "type-check-0.3.2" = {
2699 "type-check-0.3.2" = {
2691 name = "type-check";
2700 name = "type-check";
2692 packageName = "type-check";
2701 packageName = "type-check";
2693 version = "0.3.2";
2702 version = "0.3.2";
2694 src = fetchurl {
2703 src = fetchurl {
2695 url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
2704 url = "https://registry.npmjs.org/type-check/-/type-check-0.3.2.tgz";
2696 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
2705 sha1 = "5884cab512cf1d355e3fb784f30804b2b520db72";
2697 };
2706 };
2698 };
2707 };
2699 "typedarray-0.0.6" = {
2708 "typedarray-0.0.6" = {
2700 name = "typedarray";
2709 name = "typedarray";
2701 packageName = "typedarray";
2710 packageName = "typedarray";
2702 version = "0.0.6";
2711 version = "0.0.6";
2703 src = fetchurl {
2712 src = fetchurl {
2704 url = "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz";
2713 url = "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz";
2705 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
2714 sha1 = "867ac74e3864187b1d3d47d996a78ec5c8830777";
2706 };
2715 };
2707 };
2716 };
2708 "typical-2.6.1" = {
2717 "typical-2.6.1" = {
2709 name = "typical";
2718 name = "typical";
2710 packageName = "typical";
2719 packageName = "typical";
2711 version = "2.6.1";
2720 version = "2.6.1";
2712 src = fetchurl {
2721 src = fetchurl {
2713 url = "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz";
2722 url = "https://registry.npmjs.org/typical/-/typical-2.6.1.tgz";
2714 sha1 = "5c080e5d661cbbe38259d2e70a3c7253e873881d";
2723 sha1 = "5c080e5d661cbbe38259d2e70a3c7253e873881d";
2715 };
2724 };
2716 };
2725 };
2717 "uid-number-0.0.5" = {
2726 "uid-number-0.0.5" = {
2718 name = "uid-number";
2727 name = "uid-number";
2719 packageName = "uid-number";
2728 packageName = "uid-number";
2720 version = "0.0.5";
2729 version = "0.0.5";
2721 src = fetchurl {
2730 src = fetchurl {
2722 url = "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz";
2731 url = "https://registry.npmjs.org/uid-number/-/uid-number-0.0.5.tgz";
2723 sha1 = "5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e";
2732 sha1 = "5a3db23ef5dbd55b81fce0ec9a2ac6fccdebb81e";
2724 };
2733 };
2725 };
2734 };
2726 "underscore-1.7.0" = {
2735 "underscore-1.7.0" = {
2727 name = "underscore";
2736 name = "underscore";
2728 packageName = "underscore";
2737 packageName = "underscore";
2729 version = "1.7.0";
2738 version = "1.7.0";
2730 src = fetchurl {
2739 src = fetchurl {
2731 url = "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz";
2740 url = "https://registry.npmjs.org/underscore/-/underscore-1.7.0.tgz";
2732 sha1 = "6bbaf0877500d36be34ecaa584e0db9fef035209";
2741 sha1 = "6bbaf0877500d36be34ecaa584e0db9fef035209";
2733 };
2742 };
2734 };
2743 };
2735 "underscore.string-2.2.1" = {
2744 "underscore.string-2.2.1" = {
2736 name = "underscore.string";
2745 name = "underscore.string";
2737 packageName = "underscore.string";
2746 packageName = "underscore.string";
2738 version = "2.2.1";
2747 version = "2.2.1";
2739 src = fetchurl {
2748 src = fetchurl {
2740 url = "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz";
2749 url = "https://registry.npmjs.org/underscore.string/-/underscore.string-2.2.1.tgz";
2741 sha1 = "d7c0fa2af5d5a1a67f4253daee98132e733f0f19";
2750 sha1 = "d7c0fa2af5d5a1a67f4253daee98132e733f0f19";
2742 };
2751 };
2743 };
2752 };
2744 "underscore.string-2.3.3" = {
2753 "underscore.string-2.3.3" = {
2745 name = "underscore.string";
2754 name = "underscore.string";
2746 packageName = "underscore.string";
2755 packageName = "underscore.string";
2747 version = "2.3.3";
2756 version = "2.3.3";
2748 src = fetchurl {
2757 src = fetchurl {
2749 url = "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz";
2758 url = "https://registry.npmjs.org/underscore.string/-/underscore.string-2.3.3.tgz";
2750 sha1 = "71c08bf6b428b1133f37e78fa3a21c82f7329b0d";
2759 sha1 = "71c08bf6b428b1133f37e78fa3a21c82f7329b0d";
2751 };
2760 };
2752 };
2761 };
2753 "underscore.string-2.4.0" = {
2762 "underscore.string-2.4.0" = {
2754 name = "underscore.string";
2763 name = "underscore.string";
2755 packageName = "underscore.string";
2764 packageName = "underscore.string";
2756 version = "2.4.0";
2765 version = "2.4.0";
2757 src = fetchurl {
2766 src = fetchurl {
2758 url = "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz";
2767 url = "https://registry.npmjs.org/underscore.string/-/underscore.string-2.4.0.tgz";
2759 sha1 = "8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b";
2768 sha1 = "8cdd8fbac4e2d2ea1e7e2e8097c42f442280f85b";
2760 };
2769 };
2761 };
2770 };
2762 "unicode-5.2.0-0.7.5" = {
2771 "unicode-5.2.0-0.7.5" = {
2763 name = "unicode-5.2.0";
2772 name = "unicode-5.2.0";
2764 packageName = "unicode-5.2.0";
2773 packageName = "unicode-5.2.0";
2765 version = "0.7.5";
2774 version = "0.7.5";
2766 src = fetchurl {
2775 src = fetchurl {
2767 url = "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz";
2776 url = "https://registry.npmjs.org/unicode-5.2.0/-/unicode-5.2.0-0.7.5.tgz";
2768 sha512 = "KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==";
2777 sha512 = "KVGLW1Bri30x00yv4HNM8kBxoqFXr0Sbo55735nvrlsx4PYBZol3UtoWgO492fSwmsetzPEZzy73rbU8OGXJcA==";
2769 };
2778 };
2770 };
2779 };
2771 "util-deprecate-1.0.2" = {
2780 "util-deprecate-1.0.2" = {
2772 name = "util-deprecate";
2781 name = "util-deprecate";
2773 packageName = "util-deprecate";
2782 packageName = "util-deprecate";
2774 version = "1.0.2";
2783 version = "1.0.2";
2775 src = fetchurl {
2784 src = fetchurl {
2776 url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
2785 url = "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz";
2777 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
2786 sha1 = "450d4dc9fa70de732762fbd2d4a28981419a0ccf";
2778 };
2787 };
2779 };
2788 };
2780 "uuid-3.3.2" = {
2789 "uuid-3.3.2" = {
2781 name = "uuid";
2790 name = "uuid";
2782 packageName = "uuid";
2791 packageName = "uuid";
2783 version = "3.3.2";
2792 version = "3.3.2";
2784 src = fetchurl {
2793 src = fetchurl {
2785 url = "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz";
2794 url = "https://registry.npmjs.org/uuid/-/uuid-3.3.2.tgz";
2786 sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==";
2795 sha512 = "yXJmeNaw3DnnKAOKJE51sL/ZaYfWJRl1pK9dr19YFCu0ObS231AB1/LbqTKRAQ5kw8A90rA6fr4riOUpTZvQZA==";
2787 };
2796 };
2788 };
2797 };
2789 "validate-npm-package-license-3.0.3" = {
2798 "validate-npm-package-license-3.0.4" = {
2790 name = "validate-npm-package-license";
2799 name = "validate-npm-package-license";
2791 packageName = "validate-npm-package-license";
2800 packageName = "validate-npm-package-license";
2792 version = "3.0.3";
2801 version = "3.0.4";
2793 src = fetchurl {
2802 src = fetchurl {
2794 url = "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.3.tgz";
2803 url = "https://registry.npmjs.org/validate-npm-package-license/-/validate-npm-package-license-3.0.4.tgz";
2795 sha512 = "63ZOUnL4SIXj4L0NixR3L1lcjO38crAbgrTpl28t8jjrfuiOBL5Iygm+60qPs/KsZGzPNg6Smnc/oY16QTjF0g==";
2804 sha512 = "DpKm2Ui/xN7/HQKCtpZxoRWBhZ9Z0kqtygG8XCgNQ8ZlDnxuQmWhj566j8fN4Cu3/JmbhsDo7fcAJq4s9h27Ew==";
2796 };
2805 };
2797 };
2806 };
2798 "validate-npm-package-name-3.0.0" = {
2807 "validate-npm-package-name-3.0.0" = {
2799 name = "validate-npm-package-name";
2808 name = "validate-npm-package-name";
2800 packageName = "validate-npm-package-name";
2809 packageName = "validate-npm-package-name";
2801 version = "3.0.0";
2810 version = "3.0.0";
2802 src = fetchurl {
2811 src = fetchurl {
2803 url = "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz";
2812 url = "https://registry.npmjs.org/validate-npm-package-name/-/validate-npm-package-name-3.0.0.tgz";
2804 sha1 = "5fa912d81eb7d0c74afc140de7317f0ca7df437e";
2813 sha1 = "5fa912d81eb7d0c74afc140de7317f0ca7df437e";
2805 };
2814 };
2806 };
2815 };
2807 "verror-1.10.0" = {
2816 "verror-1.10.0" = {
2808 name = "verror";
2817 name = "verror";
2809 packageName = "verror";
2818 packageName = "verror";
2810 version = "1.10.0";
2819 version = "1.10.0";
2811 src = fetchurl {
2820 src = fetchurl {
2812 url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
2821 url = "https://registry.npmjs.org/verror/-/verror-1.10.0.tgz";
2813 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
2822 sha1 = "3a105ca17053af55d6e270c1f8288682e18da400";
2814 };
2823 };
2815 };
2824 };
2816 "vulcanize-1.16.0" = {
2825 "vulcanize-1.16.0" = {
2817 name = "vulcanize";
2826 name = "vulcanize";
2818 packageName = "vulcanize";
2827 packageName = "vulcanize";
2819 version = "1.16.0";
2828 version = "1.16.0";
2820 src = fetchurl {
2829 src = fetchurl {
2821 url = "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz";
2830 url = "https://registry.npmjs.org/vulcanize/-/vulcanize-1.16.0.tgz";
2822 sha512 = "TYlFljSc896b5+0FmMiw0JAMrHNBiHx0IAFC/dQR3Dxdb9Nx43ohm6wMWTlPXQn4sk/0WkqfgoAA6SLxyvPCLQ==";
2831 sha512 = "TYlFljSc896b5+0FmMiw0JAMrHNBiHx0IAFC/dQR3Dxdb9Nx43ohm6wMWTlPXQn4sk/0WkqfgoAA6SLxyvPCLQ==";
2823 };
2832 };
2824 };
2833 };
2825 "walk-2.3.14" = {
2834 "walk-2.3.14" = {
2826 name = "walk";
2835 name = "walk";
2827 packageName = "walk";
2836 packageName = "walk";
2828 version = "2.3.14";
2837 version = "2.3.14";
2829 src = fetchurl {
2838 src = fetchurl {
2830 url = "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz";
2839 url = "https://registry.npmjs.org/walk/-/walk-2.3.14.tgz";
2831 sha512 = "5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==";
2840 sha512 = "5skcWAUmySj6hkBdH6B6+3ddMjVQYH5Qy9QGbPmN8kVmLteXk+yVXg+yfk1nbX30EYakahLrr8iPcCxJQSCBeg==";
2832 };
2841 };
2833 };
2842 };
2843 "waypoints-4.0.1" = {
2844 name = "waypoints";
2845 packageName = "waypoints";
2846 version = "4.0.1";
2847 src = fetchurl {
2848 url = "https://registry.npmjs.org/waypoints/-/waypoints-4.0.1.tgz";
2849 sha1 = "09979a0573810b29627cba4366a284a062ec69c8";
2850 };
2851 };
2834 "which-1.0.9" = {
2852 "which-1.0.9" = {
2835 name = "which";
2853 name = "which";
2836 packageName = "which";
2854 packageName = "which";
2837 version = "1.0.9";
2855 version = "1.0.9";
2838 src = fetchurl {
2856 src = fetchurl {
2839 url = "https://registry.npmjs.org/which/-/which-1.0.9.tgz";
2857 url = "https://registry.npmjs.org/which/-/which-1.0.9.tgz";
2840 sha1 = "460c1da0f810103d0321a9b633af9e575e64486f";
2858 sha1 = "460c1da0f810103d0321a9b633af9e575e64486f";
2841 };
2859 };
2842 };
2860 };
2843 "which-1.3.1" = {
2861 "which-1.3.1" = {
2844 name = "which";
2862 name = "which";
2845 packageName = "which";
2863 packageName = "which";
2846 version = "1.3.1";
2864 version = "1.3.1";
2847 src = fetchurl {
2865 src = fetchurl {
2848 url = "https://registry.npmjs.org/which/-/which-1.3.1.tgz";
2866 url = "https://registry.npmjs.org/which/-/which-1.3.1.tgz";
2849 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
2867 sha512 = "HxJdYWq1MTIQbJ3nw0cqssHoTNU267KlrDuGZ1WYlxDStUtKUhOaJmh112/TZmHxxUfuJqPXSOm7tDyas0OSIQ==";
2850 };
2868 };
2851 };
2869 };
2852 "wide-align-1.1.3" = {
2870 "wide-align-1.1.3" = {
2853 name = "wide-align";
2871 name = "wide-align";
2854 packageName = "wide-align";
2872 packageName = "wide-align";
2855 version = "1.1.3";
2873 version = "1.1.3";
2856 src = fetchurl {
2874 src = fetchurl {
2857 url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";
2875 url = "https://registry.npmjs.org/wide-align/-/wide-align-1.1.3.tgz";
2858 sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==";
2876 sha512 = "QGkOQc8XL6Bt5PwnsExKBPuMKBxnGxWWW3fU55Xt4feHozMUhdUMaBCk290qpm/wG5u/RSKzwdAC4i51YigihA==";
2859 };
2877 };
2860 };
2878 };
2861 "winston-2.4.3" = {
2879 "winston-2.4.4" = {
2862 name = "winston";
2880 name = "winston";
2863 packageName = "winston";
2881 packageName = "winston";
2864 version = "2.4.3";
2882 version = "2.4.4";
2865 src = fetchurl {
2883 src = fetchurl {
2866 url = "https://registry.npmjs.org/winston/-/winston-2.4.3.tgz";
2884 url = "https://registry.npmjs.org/winston/-/winston-2.4.4.tgz";
2867 sha512 = "GYKuysPz2pxYAVJD2NPsDLP5Z79SDEzPm9/j4tCjkF/n89iBNGBMJcR+dMUqxgPNgoSs6fVygPi+Vl2oxIpBuw==";
2885 sha512 = "NBo2Pepn4hK4V01UfcWcDlmiVTs7VTB1h7bgnB0rgP146bYhMxX0ypCz3lBOfNxCO4Zuek7yeT+y/zM1OfMw4Q==";
2868 };
2886 };
2869 };
2887 };
2870 "wordwrap-1.0.0" = {
2888 "wordwrap-1.0.0" = {
2871 name = "wordwrap";
2889 name = "wordwrap";
2872 packageName = "wordwrap";
2890 packageName = "wordwrap";
2873 version = "1.0.0";
2891 version = "1.0.0";
2874 src = fetchurl {
2892 src = fetchurl {
2875 url = "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz";
2893 url = "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz";
2876 sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
2894 sha1 = "27584810891456a4171c8d0226441ade90cbcaeb";
2877 };
2895 };
2878 };
2896 };
2879 "wordwrapjs-2.0.0" = {
2897 "wordwrapjs-2.0.0" = {
2880 name = "wordwrapjs";
2898 name = "wordwrapjs";
2881 packageName = "wordwrapjs";
2899 packageName = "wordwrapjs";
2882 version = "2.0.0";
2900 version = "2.0.0";
2883 src = fetchurl {
2901 src = fetchurl {
2884 url = "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz";
2902 url = "https://registry.npmjs.org/wordwrapjs/-/wordwrapjs-2.0.0.tgz";
2885 sha1 = "ab55f695e6118da93858fdd70c053d1c5e01ac20";
2903 sha1 = "ab55f695e6118da93858fdd70c053d1c5e01ac20";
2886 };
2904 };
2887 };
2905 };
2888 "wrappy-1.0.2" = {
2906 "wrappy-1.0.2" = {
2889 name = "wrappy";
2907 name = "wrappy";
2890 packageName = "wrappy";
2908 packageName = "wrappy";
2891 version = "1.0.2";
2909 version = "1.0.2";
2892 src = fetchurl {
2910 src = fetchurl {
2893 url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
2911 url = "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz";
2894 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
2912 sha1 = "b5243d8f3ec1aa35f1364605bc0d1036e30ab69f";
2895 };
2913 };
2896 };
2914 };
2897 "yallist-3.0.2" = {
2915 "yallist-3.0.2" = {
2898 name = "yallist";
2916 name = "yallist";
2899 packageName = "yallist";
2917 packageName = "yallist";
2900 version = "3.0.2";
2918 version = "3.0.2";
2901 src = fetchurl {
2919 src = fetchurl {
2902 url = "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz";
2920 url = "https://registry.npmjs.org/yallist/-/yallist-3.0.2.tgz";
2903 sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9";
2921 sha1 = "8452b4bb7e83c7c188d8041c1a837c773d6d8bb9";
2904 };
2922 };
2905 };
2923 };
2906 "yauzl-2.4.1" = {
2924 "yauzl-2.4.1" = {
2907 name = "yauzl";
2925 name = "yauzl";
2908 packageName = "yauzl";
2926 packageName = "yauzl";
2909 version = "2.4.1";
2927 version = "2.4.1";
2910 src = fetchurl {
2928 src = fetchurl {
2911 url = "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz";
2929 url = "https://registry.npmjs.org/yauzl/-/yauzl-2.4.1.tgz";
2912 sha1 = "9528f442dab1b2284e58b4379bb194e22e0c4005";
2930 sha1 = "9528f442dab1b2284e58b4379bb194e22e0c4005";
2913 };
2931 };
2914 };
2932 };
2915 };
2933 };
2916 args = {
2934 args = {
2917 name = "rhodecode-enterprise";
2935 name = "rhodecode-enterprise";
2918 packageName = "rhodecode-enterprise";
2936 packageName = "rhodecode-enterprise";
2919 version = "1.0.0";
2937 version = "1.0.0";
2920 src = ./..;
2938 src = ./..;
2921 dependencies = [
2939 dependencies = [
2922 sources."@types/clone-0.1.30"
2940 sources."@types/clone-0.1.30"
2923 sources."@types/node-4.2.23"
2941 sources."@types/node-4.9.0"
2924 (sources."@types/parse5-0.0.31" // {
2942 (sources."@types/parse5-0.0.31" // {
2925 dependencies = [
2943 dependencies = [
2926 sources."@types/node-6.0.114"
2944 sources."@types/node-6.0.118"
2927 ];
2945 ];
2928 })
2946 })
2929 sources."abbrev-1.1.1"
2947 sources."abbrev-1.1.1"
2930 sources."acorn-3.3.0"
2948 sources."acorn-3.3.0"
2931 sources."acorn-jsx-3.0.1"
2949 sources."acorn-jsx-3.0.1"
2932 sources."ajv-4.11.8"
2950 sources."ajv-4.11.8"
2933 sources."amdefine-1.0.1"
2951 sources."amdefine-1.0.1"
2934 sources."ansi-escape-sequences-3.0.0"
2952 sources."ansi-escape-sequences-3.0.0"
2935 sources."ansi-regex-2.1.1"
2953 sources."ansi-regex-2.1.1"
2936 sources."ansi-styles-2.2.1"
2954 sources."ansi-styles-2.2.1"
2937 sources."appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
2955 sources."appenlight-client-git+https://git@github.com/AppEnlight/appenlight-client-js.git#0.5.1"
2938 sources."aproba-1.2.0"
2956 sources."aproba-1.2.0"
2939 sources."are-we-there-yet-1.1.5"
2957 sources."are-we-there-yet-1.1.5"
2940 (sources."argparse-0.1.16" // {
2958 (sources."argparse-0.1.16" // {
2941 dependencies = [
2959 dependencies = [
2942 sources."underscore.string-2.4.0"
2960 sources."underscore.string-2.4.0"
2943 ];
2961 ];
2944 })
2962 })
2945 sources."array-back-1.0.4"
2963 sources."array-back-1.0.4"
2946 sources."asap-2.0.6"
2964 sources."asap-2.0.6"
2947 sources."asn1-0.2.3"
2965 sources."asn1-0.2.4"
2948 sources."assert-plus-0.2.0"
2966 sources."assert-plus-0.2.0"
2949 sources."async-0.1.22"
2967 sources."async-0.1.22"
2950 sources."asynckit-0.4.0"
2968 sources."asynckit-0.4.0"
2951 sources."aws-sign2-0.6.0"
2969 sources."aws-sign2-0.6.0"
2952 sources."aws4-1.7.0"
2970 sources."aws4-1.8.0"
2953 sources."babel-polyfill-6.26.0"
2971 sources."babel-polyfill-6.26.0"
2954 (sources."babel-runtime-6.26.0" // {
2972 (sources."babel-runtime-6.26.0" // {
2955 dependencies = [
2973 dependencies = [
2956 sources."regenerator-runtime-0.11.1"
2974 sources."regenerator-runtime-0.11.1"
2957 ];
2975 ];
2958 })
2976 })
2959 sources."balanced-match-1.0.0"
2977 sources."balanced-match-1.0.0"
2960 sources."base64-js-1.2.3"
2978 sources."base64-js-1.2.3"
2961 sources."bcrypt-pbkdf-1.0.2"
2979 sources."bcrypt-pbkdf-1.0.2"
2962 sources."boom-2.10.1"
2980 sources."boom-2.10.1"
2963 sources."bower-1.8.4"
2981 sources."bower-1.8.4"
2964 sources."brace-expansion-1.1.11"
2982 sources."brace-expansion-1.1.11"
2965 sources."buffer-from-1.1.1"
2983 sources."buffer-from-1.1.1"
2966 sources."builtin-modules-1.1.1"
2984 sources."builtin-modules-1.1.1"
2967 sources."builtins-1.0.3"
2985 sources."builtins-1.0.3"
2968 sources."caseless-0.12.0"
2986 sources."caseless-0.12.0"
2969 sources."chalk-1.1.3"
2987 sources."chalk-1.1.3"
2970 (sources."cli-1.0.1" // {
2988 (sources."cli-1.0.1" // {
2971 dependencies = [
2989 dependencies = [
2972 sources."glob-7.1.2"
2990 sources."glob-7.1.3"
2973 sources."minimatch-3.0.4"
2991 sources."minimatch-3.0.4"
2974 ];
2992 ];
2975 })
2993 })
2976 sources."clipboard-2.0.1"
2994 sources."clipboard-2.0.1"
2977 sources."clone-1.0.4"
2995 sources."clone-1.0.4"
2978 sources."co-4.6.0"
2996 sources."co-4.6.0"
2979 sources."code-point-at-1.1.0"
2997 sources."code-point-at-1.1.0"
2980 sources."coffee-script-1.3.3"
2998 sources."coffee-script-1.3.3"
2981 sources."colors-0.6.2"
2999 sources."colors-0.6.2"
2982 sources."combined-stream-1.0.6"
3000 sources."combined-stream-1.0.7"
2983 sources."command-line-args-3.0.5"
3001 sources."command-line-args-3.0.5"
2984 sources."command-line-usage-3.0.8"
3002 sources."command-line-usage-3.0.8"
2985 sources."concat-map-0.0.1"
3003 sources."concat-map-0.0.1"
2986 sources."concat-stream-1.6.2"
3004 sources."concat-stream-1.6.2"
2987 sources."config-chain-1.1.11"
3005 sources."config-chain-1.1.12"
2988 sources."console-browserify-1.1.0"
3006 sources."console-browserify-1.1.0"
2989 sources."console-control-strings-1.1.0"
3007 sources."console-control-strings-1.1.0"
2990 sources."core-js-2.5.7"
3008 sources."core-js-2.5.7"
2991 sources."core-util-is-1.0.2"
3009 sources."core-util-is-1.0.2"
2992 sources."crisper-2.1.1"
3010 sources."crisper-2.1.1"
2993 sources."cryptiles-2.0.5"
3011 sources."cryptiles-2.0.5"
2994 sources."cycle-1.0.3"
3012 sources."cycle-1.0.3"
2995 (sources."dashdash-1.14.1" // {
3013 (sources."dashdash-1.14.1" // {
2996 dependencies = [
3014 dependencies = [
2997 sources."assert-plus-1.0.0"
3015 sources."assert-plus-1.0.0"
2998 ];
3016 ];
2999 })
3017 })
3000 sources."date-now-0.1.4"
3018 sources."date-now-0.1.4"
3001 sources."dateformat-1.0.2-1.2.3"
3019 sources."dateformat-1.0.2-1.2.3"
3002 sources."debug-0.7.4"
3020 sources."debug-0.7.4"
3003 sources."deep-extend-0.4.2"
3021 sources."deep-extend-0.4.2"
3004 sources."deep-is-0.1.3"
3022 sources."deep-is-0.1.3"
3005 sources."delayed-stream-1.0.0"
3023 sources."delayed-stream-1.0.0"
3006 sources."delegate-3.2.0"
3024 sources."delegate-3.2.0"
3007 sources."delegates-1.0.0"
3025 sources."delegates-1.0.0"
3008 sources."doctrine-0.7.2"
3026 sources."doctrine-0.7.2"
3009 (sources."dom-serializer-0.1.0" // {
3027 (sources."dom-serializer-0.1.0" // {
3010 dependencies = [
3028 dependencies = [
3011 sources."domelementtype-1.1.3"
3029 sources."domelementtype-1.1.3"
3012 sources."entities-1.1.1"
3030 sources."entities-1.1.1"
3013 ];
3031 ];
3014 })
3032 })
3015 sources."dom5-1.3.6"
3033 sources."dom5-1.3.6"
3016 sources."domelementtype-1.3.0"
3034 sources."domelementtype-1.3.0"
3017 sources."domhandler-2.3.0"
3035 sources."domhandler-2.3.0"
3018 sources."domutils-1.5.1"
3036 sources."domutils-1.5.1"
3019 sources."ecc-jsbn-0.1.2"
3037 sources."ecc-jsbn-0.1.2"
3020 sources."entities-1.0.0"
3038 sources."entities-1.0.0"
3021 sources."errno-0.1.7"
3039 sources."errno-0.1.7"
3022 sources."es6-promise-2.3.0"
3040 sources."es6-promise-2.3.0"
3023 sources."escape-string-regexp-1.0.5"
3041 sources."escape-string-regexp-1.0.5"
3024 (sources."escodegen-1.11.0" // {
3042 (sources."escodegen-1.11.0" // {
3025 dependencies = [
3043 dependencies = [
3026 sources."esprima-3.1.3"
3044 sources."esprima-3.1.3"
3027 sources."estraverse-4.2.0"
3045 sources."estraverse-4.2.0"
3028 sources."esutils-2.0.2"
3046 sources."esutils-2.0.2"
3029 sources."source-map-0.6.1"
3047 sources."source-map-0.6.1"
3030 ];
3048 ];
3031 })
3049 })
3032 (sources."espree-3.5.4" // {
3050 (sources."espree-3.5.4" // {
3033 dependencies = [
3051 dependencies = [
3034 sources."acorn-5.7.1"
3052 sources."acorn-5.7.3"
3035 ];
3053 ];
3036 })
3054 })
3037 sources."esprima-1.0.4"
3055 sources."esprima-1.0.4"
3038 sources."estraverse-3.1.0"
3056 sources."estraverse-3.1.0"
3039 sources."esutils-1.1.6"
3057 sources."esutils-1.1.6"
3040 sources."eventemitter2-0.4.14"
3058 sources."eventemitter2-0.4.14"
3041 sources."exit-0.1.2"
3059 sources."exit-0.1.2"
3042 sources."extend-3.0.2"
3060 sources."extend-3.0.2"
3043 (sources."extract-zip-1.6.7" // {
3061 (sources."extract-zip-1.6.7" // {
3044 dependencies = [
3062 dependencies = [
3045 sources."debug-2.6.9"
3063 sources."debug-2.6.9"
3046 ];
3064 ];
3047 })
3065 })
3048 sources."extsprintf-1.3.0"
3066 sources."extsprintf-1.3.0"
3049 sources."eyes-0.1.8"
3067 sources."eyes-0.1.8"
3050 sources."fast-levenshtein-2.0.6"
3068 sources."fast-levenshtein-2.0.6"
3051 sources."favico.js-0.3.10"
3069 sources."favico.js-0.3.10"
3052 sources."faye-websocket-0.4.4"
3070 sources."faye-websocket-0.4.4"
3053 sources."fd-slicer-1.0.1"
3071 sources."fd-slicer-1.0.1"
3054 sources."feature-detect-es6-1.5.0"
3072 sources."feature-detect-es6-1.5.0"
3055 sources."file-sync-cmp-0.1.1"
3073 sources."file-sync-cmp-0.1.1"
3056 sources."find-replace-1.0.3"
3074 sources."find-replace-1.0.3"
3057 sources."findit-2.0.0"
3075 sources."findit-2.0.0"
3058 (sources."findup-sync-0.1.3" // {
3076 (sources."findup-sync-0.1.3" // {
3059 dependencies = [
3077 dependencies = [
3060 sources."glob-3.2.11"
3078 sources."glob-3.2.11"
3061 sources."lodash-2.4.2"
3079 sources."lodash-2.4.2"
3062 sources."minimatch-0.3.0"
3080 sources."minimatch-0.3.0"
3063 ];
3081 ];
3064 })
3082 })
3065 sources."foreachasync-3.0.0"
3083 sources."foreachasync-3.0.0"
3066 sources."forever-agent-0.6.1"
3084 sources."forever-agent-0.6.1"
3067 sources."form-data-2.1.4"
3085 sources."form-data-2.1.4"
3068 (sources."fs-extra-0.6.4" // {
3086 (sources."fs-extra-0.6.4" // {
3069 dependencies = [
3087 dependencies = [
3070 sources."mkdirp-0.3.5"
3088 sources."mkdirp-0.3.5"
3071 ];
3089 ];
3072 })
3090 })
3073 (sources."fs.extra-1.3.2" // {
3091 (sources."fs.extra-1.3.2" // {
3074 dependencies = [
3092 dependencies = [
3075 sources."mkdirp-0.3.5"
3093 sources."mkdirp-0.3.5"
3076 ];
3094 ];
3077 })
3095 })
3078 sources."fs.realpath-1.0.0"
3096 sources."fs.realpath-1.0.0"
3079 sources."gauge-2.7.4"
3097 sources."gauge-2.7.4"
3080 sources."gaze-0.5.2"
3098 sources."gaze-0.5.2"
3081 sources."getobject-0.1.0"
3099 sources."getobject-0.1.0"
3082 (sources."getpass-0.1.7" // {
3100 (sources."getpass-0.1.7" // {
3083 dependencies = [
3101 dependencies = [
3084 sources."assert-plus-1.0.0"
3102 sources."assert-plus-1.0.0"
3085 ];
3103 ];
3086 })
3104 })
3087 (sources."glob-3.1.21" // {
3105 (sources."glob-3.1.21" // {
3088 dependencies = [
3106 dependencies = [
3089 sources."inherits-1.0.2"
3107 sources."inherits-1.0.2"
3090 ];
3108 ];
3091 })
3109 })
3092 (sources."globule-0.1.0" // {
3110 (sources."globule-0.1.0" // {
3093 dependencies = [
3111 dependencies = [
3094 sources."lodash-1.0.2"
3112 sources."lodash-1.0.2"
3095 ];
3113 ];
3096 })
3114 })
3097 sources."good-listener-1.2.2"
3115 sources."good-listener-1.2.2"
3098 sources."graceful-fs-1.2.3"
3116 sources."graceful-fs-1.2.3"
3099 sources."grunt-0.4.5"
3117 sources."grunt-0.4.5"
3100 (sources."grunt-contrib-concat-0.5.1" // {
3118 (sources."grunt-contrib-concat-0.5.1" // {
3101 dependencies = [
3119 dependencies = [
3102 sources."ansi-regex-0.2.1"
3120 sources."ansi-regex-0.2.1"
3103 sources."ansi-styles-1.1.0"
3121 sources."ansi-styles-1.1.0"
3104 sources."chalk-0.5.1"
3122 sources."chalk-0.5.1"
3105 sources."has-ansi-0.1.0"
3123 sources."has-ansi-0.1.0"
3106 sources."strip-ansi-0.3.0"
3124 sources."strip-ansi-0.3.0"
3107 sources."supports-color-0.2.0"
3125 sources."supports-color-0.2.0"
3108 ];
3126 ];
3109 })
3127 })
3110 sources."grunt-contrib-copy-1.0.0"
3128 sources."grunt-contrib-copy-1.0.0"
3111 sources."grunt-contrib-jshint-0.12.0"
3129 sources."grunt-contrib-jshint-0.12.0"
3112 (sources."grunt-contrib-less-1.4.1" // {
3130 (sources."grunt-contrib-less-1.4.1" // {
3113 dependencies = [
3131 dependencies = [
3114 sources."async-2.6.1"
3132 sources."async-2.6.1"
3115 sources."lodash-4.17.10"
3133 sources."lodash-4.17.11"
3116 ];
3134 ];
3117 })
3135 })
3118 (sources."grunt-contrib-watch-0.6.1" // {
3136 (sources."grunt-contrib-watch-0.6.1" // {
3119 dependencies = [
3137 dependencies = [
3120 sources."async-0.2.10"
3138 sources."async-0.2.10"
3121 sources."lodash-2.4.2"
3139 sources."lodash-2.4.2"
3122 ];
3140 ];
3123 })
3141 })
3124 sources."grunt-crisper-1.0.1"
3142 sources."grunt-crisper-1.0.1"
3125 (sources."grunt-legacy-log-0.1.3" // {
3143 (sources."grunt-legacy-log-0.1.3" // {
3126 dependencies = [
3144 dependencies = [
3127 sources."lodash-2.4.2"
3145 sources."lodash-2.4.2"
3128 sources."underscore.string-2.3.3"
3146 sources."underscore.string-2.3.3"
3129 ];
3147 ];
3130 })
3148 })
3131 (sources."grunt-legacy-log-utils-0.1.1" // {
3149 (sources."grunt-legacy-log-utils-0.1.1" // {
3132 dependencies = [
3150 dependencies = [
3133 sources."lodash-2.4.2"
3151 sources."lodash-2.4.2"
3134 sources."underscore.string-2.3.3"
3152 sources."underscore.string-2.3.3"
3135 ];
3153 ];
3136 })
3154 })
3137 sources."grunt-legacy-util-0.2.0"
3155 sources."grunt-legacy-util-0.2.0"
3138 (sources."grunt-vulcanize-1.0.0" // {
3156 (sources."grunt-vulcanize-1.0.0" // {
3139 dependencies = [
3157 dependencies = [
3140 sources."crisper-1.2.0"
3158 sources."crisper-1.2.0"
3141 sources."nopt-3.0.6"
3159 sources."nopt-3.0.6"
3142 ];
3160 ];
3143 })
3161 })
3144 sources."har-schema-1.0.5"
3162 sources."har-schema-1.0.5"
3145 sources."har-validator-4.2.1"
3163 sources."har-validator-4.2.1"
3146 sources."has-ansi-2.0.0"
3164 sources."has-ansi-2.0.0"
3147 sources."has-unicode-2.0.1"
3165 sources."has-unicode-2.0.1"
3148 sources."hasha-2.2.0"
3166 sources."hasha-2.2.0"
3149 sources."hawk-3.1.3"
3167 sources."hawk-3.1.3"
3150 sources."hoek-2.16.3"
3168 sources."hoek-2.16.3"
3151 sources."hooker-0.2.3"
3169 sources."hooker-0.2.3"
3152 sources."hosted-git-info-2.7.1"
3170 sources."hosted-git-info-2.7.1"
3153 (sources."htmlparser2-3.8.3" // {
3171 (sources."htmlparser2-3.8.3" // {
3154 dependencies = [
3172 dependencies = [
3155 sources."readable-stream-1.1.14"
3173 sources."readable-stream-1.1.14"
3156 sources."string_decoder-0.10.31"
3174 sources."string_decoder-0.10.31"
3157 ];
3175 ];
3158 })
3176 })
3159 sources."http-signature-1.1.1"
3177 sources."http-signature-1.1.1"
3160 (sources."hydrolysis-1.25.0" // {
3178 (sources."hydrolysis-1.25.0" // {
3161 dependencies = [
3179 dependencies = [
3162 sources."dom5-1.1.0"
3180 sources."dom5-1.1.0"
3163 ];
3181 ];
3164 })
3182 })
3165 sources."iconv-lite-0.2.11"
3183 sources."iconv-lite-0.2.11"
3166 sources."image-size-0.5.5"
3184 sources."image-size-0.5.5"
3167 sources."inflight-1.0.6"
3185 sources."inflight-1.0.6"
3168 sources."inherits-2.0.3"
3186 sources."inherits-2.0.3"
3169 sources."ini-1.3.5"
3187 sources."ini-1.3.5"
3170 sources."is-builtin-module-1.0.0"
3188 sources."is-builtin-module-1.0.0"
3171 sources."is-fullwidth-code-point-1.0.0"
3189 sources."is-fullwidth-code-point-1.0.0"
3172 sources."is-stream-1.1.0"
3190 sources."is-stream-1.1.0"
3173 sources."is-typedarray-1.0.0"
3191 sources."is-typedarray-1.0.0"
3174 sources."isarray-0.0.1"
3192 sources."isarray-0.0.1"
3175 sources."isexe-2.0.0"
3193 sources."isexe-2.0.0"
3176 sources."isstream-0.1.2"
3194 sources."isstream-0.1.2"
3177 sources."jquery-1.11.3"
3195 sources."jquery-1.11.3"
3178 sources."js-yaml-2.0.5"
3196 sources."js-yaml-2.0.5"
3179 sources."jsbn-0.1.1"
3197 sources."jsbn-0.1.1"
3180 (sources."jshint-2.9.6" // {
3198 (sources."jshint-2.9.6" // {
3181 dependencies = [
3199 dependencies = [
3182 sources."lodash-4.17.10"
3200 sources."lodash-4.17.11"
3183 sources."minimatch-3.0.4"
3201 sources."minimatch-3.0.4"
3184 ];
3202 ];
3185 })
3203 })
3186 sources."json-schema-0.2.3"
3204 sources."json-schema-0.2.3"
3187 sources."json-stable-stringify-1.0.1"
3205 sources."json-stable-stringify-1.0.1"
3188 sources."json-stringify-safe-5.0.1"
3206 sources."json-stringify-safe-5.0.1"
3189 sources."jsonfile-1.0.1"
3207 sources."jsonfile-1.0.1"
3190 sources."jsonify-0.0.0"
3208 sources."jsonify-0.0.0"
3191 (sources."jsprim-1.4.1" // {
3209 (sources."jsprim-1.4.1" // {
3192 dependencies = [
3210 dependencies = [
3193 sources."assert-plus-1.0.0"
3211 sources."assert-plus-1.0.0"
3194 ];
3212 ];
3195 })
3213 })
3196 sources."kew-0.7.0"
3214 sources."kew-0.7.0"
3197 (sources."klaw-1.3.1" // {
3215 (sources."klaw-1.3.1" // {
3198 dependencies = [
3216 dependencies = [
3199 sources."graceful-fs-4.1.11"
3217 sources."graceful-fs-4.1.11"
3200 ];
3218 ];
3201 })
3219 })
3202 (sources."less-2.7.3" // {
3220 (sources."less-2.7.3" // {
3203 dependencies = [
3221 dependencies = [
3204 sources."graceful-fs-4.1.11"
3222 sources."graceful-fs-4.1.11"
3205 sources."source-map-0.5.7"
3223 sources."source-map-0.5.7"
3206 ];
3224 ];
3207 })
3225 })
3208 sources."levn-0.3.0"
3226 sources."levn-0.3.0"
3209 sources."lodash-0.9.2"
3227 sources."lodash-0.9.2"
3210 sources."lru-cache-2.7.3"
3228 sources."lru-cache-2.7.3"
3211 sources."mime-1.6.0"
3229 sources."mime-1.6.0"
3212 sources."mime-db-1.35.0"
3230 sources."mime-db-1.36.0"
3213 sources."mime-types-2.1.19"
3231 sources."mime-types-2.1.20"
3214 sources."minimatch-0.2.14"
3232 sources."minimatch-0.2.14"
3215 sources."minimist-0.0.8"
3233 sources."minimist-0.0.8"
3216 sources."minipass-2.3.3"
3234 sources."minipass-2.3.4"
3217 sources."minizlib-1.1.0"
3235 sources."minizlib-1.1.1"
3218 sources."mkdirp-0.5.1"
3236 sources."mkdirp-0.5.1"
3219 sources."moment-2.22.2"
3237 sources."moment-2.22.2"
3220 sources."mousetrap-1.6.2"
3238 sources."mousetrap-1.6.2"
3221 sources."ms-2.0.0"
3239 sources."ms-2.0.0"
3222 sources."ncp-0.4.2"
3240 sources."ncp-0.4.2"
3223 sources."nijs-0.0.25"
3241 sources."nijs-0.0.25"
3224 sources."node2nix-1.6.0"
3242 sources."node2nix-1.6.0"
3225 sources."nopt-1.0.10"
3243 sources."nopt-1.0.10"
3226 (sources."noptify-0.0.3" // {
3244 (sources."noptify-0.0.3" // {
3227 dependencies = [
3245 dependencies = [
3228 sources."nopt-2.0.0"
3246 sources."nopt-2.0.0"
3229 ];
3247 ];
3230 })
3248 })
3231 sources."normalize-package-data-2.4.0"
3249 sources."normalize-package-data-2.4.0"
3232 sources."npm-package-arg-6.1.0"
3250 sources."npm-package-arg-6.1.0"
3233 (sources."npm-registry-client-8.5.1" // {
3251 (sources."npm-registry-client-8.5.1" // {
3234 dependencies = [
3252 dependencies = [
3235 sources."graceful-fs-4.1.11"
3253 sources."graceful-fs-4.1.11"
3236 ];
3254 ];
3237 })
3255 })
3238 (sources."npmconf-2.1.3" // {
3256 (sources."npmconf-2.1.3" // {
3239 dependencies = [
3257 dependencies = [
3240 sources."nopt-3.0.6"
3258 sources."nopt-3.0.6"
3241 sources."once-1.3.3"
3259 sources."once-1.3.3"
3242 sources."semver-4.3.6"
3260 sources."semver-4.3.6"
3243 ];
3261 ];
3244 })
3262 })
3245 sources."npmlog-4.1.2"
3263 sources."npmlog-4.1.2"
3246 sources."number-is-nan-1.0.1"
3264 sources."number-is-nan-1.0.1"
3247 sources."oauth-sign-0.8.2"
3265 sources."oauth-sign-0.8.2"
3248 sources."object-assign-4.1.1"
3266 sources."object-assign-4.1.1"
3249 sources."once-1.4.0"
3267 sources."once-1.4.0"
3250 sources."optionator-0.8.2"
3268 sources."optionator-0.8.2"
3251 sources."optparse-1.0.5"
3269 sources."optparse-1.0.5"
3252 sources."os-homedir-1.0.2"
3270 sources."os-homedir-1.0.2"
3253 sources."os-tmpdir-1.0.2"
3271 sources."os-tmpdir-1.0.2"
3254 sources."osenv-0.1.5"
3272 sources."osenv-0.1.5"
3255 sources."parse5-1.5.1"
3273 sources."parse5-1.5.1"
3256 sources."path-is-absolute-1.0.1"
3274 sources."path-is-absolute-1.0.1"
3257 sources."path-posix-1.0.0"
3275 sources."path-posix-1.0.0"
3258 sources."pend-1.2.0"
3276 sources."pend-1.2.0"
3259 sources."performance-now-0.2.0"
3277 sources."performance-now-0.2.0"
3260 sources."phantom-4.0.12"
3278 sources."phantom-4.0.12"
3261 (sources."phantomjs-prebuilt-2.1.16" // {
3279 (sources."phantomjs-prebuilt-2.1.16" // {
3262 dependencies = [
3280 dependencies = [
3263 sources."es6-promise-4.2.4"
3281 sources."es6-promise-4.2.5"
3264 sources."fs-extra-1.0.0"
3282 sources."fs-extra-1.0.0"
3265 sources."graceful-fs-4.1.11"
3283 sources."graceful-fs-4.1.11"
3266 sources."jsonfile-2.4.0"
3284 sources."jsonfile-2.4.0"
3267 sources."which-1.3.1"
3285 sources."which-1.3.1"
3268 ];
3286 ];
3269 })
3287 })
3270 sources."pinkie-2.0.4"
3288 sources."pinkie-2.0.4"
3271 sources."pinkie-promise-2.0.1"
3289 sources."pinkie-promise-2.0.1"
3272 sources."prelude-ls-1.1.2"
3290 sources."prelude-ls-1.1.2"
3273 sources."process-nextick-args-2.0.0"
3291 sources."process-nextick-args-2.0.0"
3274 sources."progress-1.1.8"
3292 sources."progress-1.1.8"
3275 sources."promise-7.3.1"
3293 sources."promise-7.3.1"
3276 sources."proto-list-1.2.4"
3294 sources."proto-list-1.2.4"
3277 sources."prr-1.0.1"
3295 sources."prr-1.0.1"
3278 sources."punycode-1.4.1"
3296 sources."punycode-1.4.1"
3279 sources."qrious-4.0.2"
3297 sources."qrious-4.0.2"
3280 sources."qs-6.4.0"
3298 sources."qs-6.4.0"
3281 (sources."readable-stream-2.3.6" // {
3299 (sources."readable-stream-2.3.6" // {
3282 dependencies = [
3300 dependencies = [
3283 sources."isarray-1.0.0"
3301 sources."isarray-1.0.0"
3284 ];
3302 ];
3285 })
3303 })
3286 sources."reduce-flatten-1.0.1"
3304 sources."reduce-flatten-1.0.1"
3287 sources."regenerator-runtime-0.10.5"
3305 sources."regenerator-runtime-0.10.5"
3288 sources."request-2.81.0"
3306 sources."request-2.81.0"
3289 sources."request-progress-2.0.1"
3307 sources."request-progress-2.0.1"
3290 sources."retry-0.10.1"
3308 sources."retry-0.10.1"
3291 sources."rimraf-2.2.8"
3309 sources."rimraf-2.2.8"
3292 sources."safe-buffer-5.1.2"
3310 sources."safe-buffer-5.1.2"
3293 sources."safer-buffer-2.1.2"
3311 sources."safer-buffer-2.1.2"
3294 sources."select-1.1.2"
3312 sources."select-1.1.2"
3295 sources."semver-5.5.0"
3313 sources."semver-5.5.1"
3296 sources."set-blocking-2.0.0"
3314 sources."set-blocking-2.0.0"
3297 sources."shelljs-0.3.0"
3315 sources."shelljs-0.3.0"
3298 sources."sigmund-1.0.1"
3316 sources."sigmund-1.0.1"
3299 sources."signal-exit-3.0.2"
3317 sources."signal-exit-3.0.2"
3300 sources."slasp-0.0.4"
3318 sources."slasp-0.0.4"
3301 sources."slide-1.1.6"
3319 sources."slide-1.1.6"
3302 sources."sntp-1.0.9"
3320 sources."sntp-1.0.9"
3303 sources."source-map-0.3.0"
3321 sources."source-map-0.3.0"
3304 sources."spdx-correct-3.0.0"
3322 sources."spdx-correct-3.0.2"
3305 sources."spdx-exceptions-2.1.0"
3323 sources."spdx-exceptions-2.2.0"
3306 sources."spdx-expression-parse-3.0.0"
3324 sources."spdx-expression-parse-3.0.0"
3307 sources."spdx-license-ids-3.0.0"
3325 sources."spdx-license-ids-3.0.1"
3308 sources."split-1.0.1"
3326 sources."split-1.0.1"
3309 (sources."sshpk-1.14.2" // {
3327 (sources."sshpk-1.15.1" // {
3310 dependencies = [
3328 dependencies = [
3311 sources."assert-plus-1.0.0"
3329 sources."assert-plus-1.0.0"
3312 ];
3330 ];
3313 })
3331 })
3314 sources."ssri-5.3.0"
3332 sources."ssri-5.3.0"
3315 sources."stack-trace-0.0.10"
3333 sources."stack-trace-0.0.10"
3334 sources."sticky-sidebar-3.3.1"
3316 sources."string-width-1.0.2"
3335 sources."string-width-1.0.2"
3317 sources."string_decoder-1.1.1"
3336 sources."string_decoder-1.1.1"
3318 sources."stringstream-0.0.6"
3337 sources."stringstream-0.0.6"
3319 sources."strip-ansi-3.0.1"
3338 sources."strip-ansi-3.0.1"
3320 sources."strip-json-comments-1.0.4"
3339 sources."strip-json-comments-1.0.4"
3321 sources."supports-color-2.0.0"
3340 sources."supports-color-2.0.0"
3322 sources."table-layout-0.3.0"
3341 sources."table-layout-0.3.0"
3323 sources."tar-3.1.15"
3342 sources."tar-3.1.15"
3324 sources."temp-0.8.3"
3343 sources."temp-0.8.3"
3325 sources."test-value-2.1.0"
3344 sources."test-value-2.1.0"
3326 sources."throttleit-1.0.0"
3345 sources."throttleit-1.0.0"
3327 sources."through-2.3.8"
3346 sources."through-2.3.8"
3328 sources."tiny-emitter-2.0.2"
3347 sources."tiny-emitter-2.0.2"
3329 (sources."tiny-lr-fork-0.0.5" // {
3348 (sources."tiny-lr-fork-0.0.5" // {
3330 dependencies = [
3349 dependencies = [
3331 sources."qs-0.5.6"
3350 sources."qs-0.5.6"
3332 ];
3351 ];
3333 })
3352 })
3334 sources."tough-cookie-2.3.4"
3353 sources."tough-cookie-2.3.4"
3335 sources."tunnel-agent-0.6.0"
3354 sources."tunnel-agent-0.6.0"
3336 sources."tweetnacl-0.14.5"
3355 sources."tweetnacl-0.14.5"
3337 sources."type-check-0.3.2"
3356 sources."type-check-0.3.2"
3338 sources."typedarray-0.0.6"
3357 sources."typedarray-0.0.6"
3339 sources."typical-2.6.1"
3358 sources."typical-2.6.1"
3340 sources."uid-number-0.0.5"
3359 sources."uid-number-0.0.5"
3341 sources."underscore-1.7.0"
3360 sources."underscore-1.7.0"
3342 sources."underscore.string-2.2.1"
3361 sources."underscore.string-2.2.1"
3343 sources."unicode-5.2.0-0.7.5"
3362 sources."unicode-5.2.0-0.7.5"
3344 sources."util-deprecate-1.0.2"
3363 sources."util-deprecate-1.0.2"
3345 sources."uuid-3.3.2"
3364 sources."uuid-3.3.2"
3346 sources."validate-npm-package-license-3.0.3"
3365 sources."validate-npm-package-license-3.0.4"
3347 sources."validate-npm-package-name-3.0.0"
3366 sources."validate-npm-package-name-3.0.0"
3348 (sources."verror-1.10.0" // {
3367 (sources."verror-1.10.0" // {
3349 dependencies = [
3368 dependencies = [
3350 sources."assert-plus-1.0.0"
3369 sources."assert-plus-1.0.0"
3351 ];
3370 ];
3352 })
3371 })
3353 (sources."vulcanize-1.16.0" // {
3372 (sources."vulcanize-1.16.0" // {
3354 dependencies = [
3373 dependencies = [
3355 sources."nopt-3.0.6"
3374 sources."nopt-3.0.6"
3356 ];
3375 ];
3357 })
3376 })
3358 sources."walk-2.3.14"
3377 sources."walk-2.3.14"
3378 sources."waypoints-4.0.1"
3359 sources."which-1.0.9"
3379 sources."which-1.0.9"
3360 sources."wide-align-1.1.3"
3380 sources."wide-align-1.1.3"
3361 (sources."winston-2.4.3" // {
3381 (sources."winston-2.4.4" // {
3362 dependencies = [
3382 dependencies = [
3363 sources."async-1.0.0"
3383 sources."async-1.0.0"
3364 sources."colors-1.0.3"
3384 sources."colors-1.0.3"
3365 ];
3385 ];
3366 })
3386 })
3367 sources."wordwrap-1.0.0"
3387 sources."wordwrap-1.0.0"
3368 sources."wordwrapjs-2.0.0"
3388 sources."wordwrapjs-2.0.0"
3369 sources."wrappy-1.0.2"
3389 sources."wrappy-1.0.2"
3370 sources."yallist-3.0.2"
3390 sources."yallist-3.0.2"
3371 sources."yauzl-2.4.1"
3391 sources."yauzl-2.4.1"
3372 ];
3392 ];
3373 buildInputs = globalBuildInputs;
3393 buildInputs = globalBuildInputs;
3374 meta = {
3394 meta = {
3375 description = "RhodeCode JS packaged";
3395 description = "RhodeCode JS packaged";
3376 license = "SEE LICENSE IN LICENSE.txt";
3396 license = "SEE LICENSE IN LICENSE.txt";
3377 };
3397 };
3378 production = false;
3398 production = false;
3379 bypassCache = false;
3399 bypassCache = false;
3380 };
3400 };
3381 in
3401 in
3382 {
3402 {
3383 tarball = nodeEnv.buildNodeSourceDist args;
3403 tarball = nodeEnv.buildNodeSourceDist args;
3384 package = nodeEnv.buildNodePackage args;
3404 package = nodeEnv.buildNodePackage args;
3385 shell = nodeEnv.buildNodeShell args;
3405 shell = nodeEnv.buildNodeShell args;
3386 } No newline at end of file
3406 }
@@ -1,320 +1,320 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2018 RhodeCode GmbH
3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
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/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
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 pytest
21 import pytest
22
22
23 from rhodecode.tests import TestController
23 from rhodecode.tests import TestController
24
24
25 from rhodecode.model.db import (
25 from rhodecode.model.db import (
26 ChangesetComment, Notification, UserNotification)
26 ChangesetComment, Notification, UserNotification)
27 from rhodecode.model.meta import Session
27 from rhodecode.model.meta import Session
28 from rhodecode.lib import helpers as h
28 from rhodecode.lib import helpers as h
29
29
30
30
31 def route_path(name, params=None, **kwargs):
31 def route_path(name, params=None, **kwargs):
32 import urllib
32 import urllib
33
33
34 base_url = {
34 base_url = {
35 'repo_commit': '/{repo_name}/changeset/{commit_id}',
35 'repo_commit': '/{repo_name}/changeset/{commit_id}',
36 'repo_commit_comment_create': '/{repo_name}/changeset/{commit_id}/comment/create',
36 'repo_commit_comment_create': '/{repo_name}/changeset/{commit_id}/comment/create',
37 'repo_commit_comment_preview': '/{repo_name}/changeset/{commit_id}/comment/preview',
37 'repo_commit_comment_preview': '/{repo_name}/changeset/{commit_id}/comment/preview',
38 'repo_commit_comment_delete': '/{repo_name}/changeset/{commit_id}/comment/{comment_id}/delete',
38 'repo_commit_comment_delete': '/{repo_name}/changeset/{commit_id}/comment/{comment_id}/delete',
39 }[name].format(**kwargs)
39 }[name].format(**kwargs)
40
40
41 if params:
41 if params:
42 base_url = '{}?{}'.format(base_url, urllib.urlencode(params))
42 base_url = '{}?{}'.format(base_url, urllib.urlencode(params))
43 return base_url
43 return base_url
44
44
45
45
46 @pytest.mark.backends("git", "hg", "svn")
46 @pytest.mark.backends("git", "hg", "svn")
47 class TestRepoCommitCommentsView(TestController):
47 class TestRepoCommitCommentsView(TestController):
48
48
49 @pytest.fixture(autouse=True)
49 @pytest.fixture(autouse=True)
50 def prepare(self, request, baseapp):
50 def prepare(self, request, baseapp):
51 for x in ChangesetComment.query().all():
51 for x in ChangesetComment.query().all():
52 Session().delete(x)
52 Session().delete(x)
53 Session().commit()
53 Session().commit()
54
54
55 for x in Notification.query().all():
55 for x in Notification.query().all():
56 Session().delete(x)
56 Session().delete(x)
57 Session().commit()
57 Session().commit()
58
58
59 request.addfinalizer(self.cleanup)
59 request.addfinalizer(self.cleanup)
60
60
61 def cleanup(self):
61 def cleanup(self):
62 for x in ChangesetComment.query().all():
62 for x in ChangesetComment.query().all():
63 Session().delete(x)
63 Session().delete(x)
64 Session().commit()
64 Session().commit()
65
65
66 for x in Notification.query().all():
66 for x in Notification.query().all():
67 Session().delete(x)
67 Session().delete(x)
68 Session().commit()
68 Session().commit()
69
69
70 @pytest.mark.parametrize('comment_type', ChangesetComment.COMMENT_TYPES)
70 @pytest.mark.parametrize('comment_type', ChangesetComment.COMMENT_TYPES)
71 def test_create(self, comment_type, backend):
71 def test_create(self, comment_type, backend):
72 self.log_user()
72 self.log_user()
73 commit = backend.repo.get_commit('300')
73 commit = backend.repo.get_commit('300')
74 commit_id = commit.raw_id
74 commit_id = commit.raw_id
75 text = u'CommentOnCommit'
75 text = u'CommentOnCommit'
76
76
77 params = {'text': text, 'csrf_token': self.csrf_token,
77 params = {'text': text, 'csrf_token': self.csrf_token,
78 'comment_type': comment_type}
78 'comment_type': comment_type}
79 self.app.post(
79 self.app.post(
80 route_path('repo_commit_comment_create',
80 route_path('repo_commit_comment_create',
81 repo_name=backend.repo_name, commit_id=commit_id),
81 repo_name=backend.repo_name, commit_id=commit_id),
82 params=params)
82 params=params)
83
83
84 response = self.app.get(
84 response = self.app.get(
85 route_path('repo_commit',
85 route_path('repo_commit',
86 repo_name=backend.repo_name, commit_id=commit_id))
86 repo_name=backend.repo_name, commit_id=commit_id))
87
87
88 # test DB
88 # test DB
89 assert ChangesetComment.query().count() == 1
89 assert ChangesetComment.query().count() == 1
90 assert_comment_links(response, ChangesetComment.query().count(), 0)
90 assert_comment_links(response, ChangesetComment.query().count(), 0)
91
91
92 assert Notification.query().count() == 1
92 assert Notification.query().count() == 1
93 assert ChangesetComment.query().count() == 1
93 assert ChangesetComment.query().count() == 1
94
94
95 notification = Notification.query().all()[0]
95 notification = Notification.query().all()[0]
96
96
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 author = notification.created_by_user.username_and_name
100 author = notification.created_by_user.username_and_name
101 sbj = '{0} left a {1} on commit `{2}` in the {3} repository'.format(
101 sbj = '{0} left a {1} on commit `{2}` in the {3} repository'.format(
102 author, comment_type, h.show_id(commit), backend.repo_name)
102 author, comment_type, h.show_id(commit), backend.repo_name)
103 assert sbj == notification.subject
103 assert sbj == notification.subject
104
104
105 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
105 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
106 backend.repo_name, commit_id, comment_id))
106 backend.repo_name, commit_id, comment_id))
107 assert lnk in notification.body
107 assert lnk in notification.body
108
108
109 @pytest.mark.parametrize('comment_type', ChangesetComment.COMMENT_TYPES)
109 @pytest.mark.parametrize('comment_type', ChangesetComment.COMMENT_TYPES)
110 def test_create_inline(self, comment_type, backend):
110 def test_create_inline(self, comment_type, backend):
111 self.log_user()
111 self.log_user()
112 commit = backend.repo.get_commit('300')
112 commit = backend.repo.get_commit('300')
113 commit_id = commit.raw_id
113 commit_id = commit.raw_id
114 text = u'CommentOnCommit'
114 text = u'CommentOnCommit'
115 f_path = 'vcs/web/simplevcs/views/repository.py'
115 f_path = 'vcs/web/simplevcs/views/repository.py'
116 line = 'n1'
116 line = 'n1'
117
117
118 params = {'text': text, 'f_path': f_path, 'line': line,
118 params = {'text': text, 'f_path': f_path, 'line': line,
119 'comment_type': comment_type,
119 'comment_type': comment_type,
120 'csrf_token': self.csrf_token}
120 'csrf_token': self.csrf_token}
121
121
122 self.app.post(
122 self.app.post(
123 route_path('repo_commit_comment_create',
123 route_path('repo_commit_comment_create',
124 repo_name=backend.repo_name, commit_id=commit_id),
124 repo_name=backend.repo_name, commit_id=commit_id),
125 params=params)
125 params=params)
126
126
127 response = self.app.get(
127 response = self.app.get(
128 route_path('repo_commit',
128 route_path('repo_commit',
129 repo_name=backend.repo_name, commit_id=commit_id))
129 repo_name=backend.repo_name, commit_id=commit_id))
130
130
131 # test DB
131 # test DB
132 assert ChangesetComment.query().count() == 1
132 assert ChangesetComment.query().count() == 1
133 assert_comment_links(response, 0, ChangesetComment.query().count())
133 assert_comment_links(response, 0, ChangesetComment.query().count())
134
134
135 if backend.alias == 'svn':
135 if backend.alias == 'svn':
136 response.mustcontain(
136 response.mustcontain(
137 '''data-f-path="vcs/commands/summary.py" '''
137 '''data-f-path="vcs/commands/summary.py" '''
138 '''id="a_c-300-ad05457a43f8"'''
138 '''data-anchor-id="c-300-ad05457a43f8"'''
139 )
139 )
140 if backend.alias == 'git':
140 if backend.alias == 'git':
141 response.mustcontain(
141 response.mustcontain(
142 '''data-f-path="vcs/backends/hg.py" '''
142 '''data-f-path="vcs/backends/hg.py" '''
143 '''id="a_c-883e775e89ea-9c390eb52cd6"'''
143 '''data-anchor-id="c-883e775e89ea-9c390eb52cd6"'''
144 )
144 )
145
145
146 if backend.alias == 'hg':
146 if backend.alias == 'hg':
147 response.mustcontain(
147 response.mustcontain(
148 '''data-f-path="vcs/backends/hg.py" '''
148 '''data-f-path="vcs/backends/hg.py" '''
149 '''id="a_c-e58d85a3973b-9c390eb52cd6"'''
149 '''data-anchor-id="c-e58d85a3973b-9c390eb52cd6"'''
150 )
150 )
151
151
152 assert Notification.query().count() == 1
152 assert Notification.query().count() == 1
153 assert ChangesetComment.query().count() == 1
153 assert ChangesetComment.query().count() == 1
154
154
155 notification = Notification.query().all()[0]
155 notification = Notification.query().all()[0]
156 comment = ChangesetComment.query().first()
156 comment = ChangesetComment.query().first()
157 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
157 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
158
158
159 assert comment.revision == commit_id
159 assert comment.revision == commit_id
160
160
161 author = notification.created_by_user.username_and_name
161 author = notification.created_by_user.username_and_name
162 sbj = '{0} left a {1} on file `{2}` in commit `{3}` in the {4} repository'.format(
162 sbj = '{0} left a {1} on file `{2}` in commit `{3}` in the {4} repository'.format(
163 author, comment_type, f_path, h.show_id(commit), backend.repo_name)
163 author, comment_type, f_path, h.show_id(commit), backend.repo_name)
164
164
165 assert sbj == notification.subject
165 assert sbj == notification.subject
166
166
167 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
167 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
168 backend.repo_name, commit_id, comment.comment_id))
168 backend.repo_name, commit_id, comment.comment_id))
169 assert lnk in notification.body
169 assert lnk in notification.body
170 assert 'on line n1' in notification.body
170 assert 'on line n1' in notification.body
171
171
172 def test_create_with_mention(self, backend):
172 def test_create_with_mention(self, backend):
173 self.log_user()
173 self.log_user()
174
174
175 commit_id = backend.repo.get_commit('300').raw_id
175 commit_id = backend.repo.get_commit('300').raw_id
176 text = u'@test_regular check CommentOnCommit'
176 text = u'@test_regular check CommentOnCommit'
177
177
178 params = {'text': text, 'csrf_token': self.csrf_token}
178 params = {'text': text, 'csrf_token': self.csrf_token}
179 self.app.post(
179 self.app.post(
180 route_path('repo_commit_comment_create',
180 route_path('repo_commit_comment_create',
181 repo_name=backend.repo_name, commit_id=commit_id),
181 repo_name=backend.repo_name, commit_id=commit_id),
182 params=params)
182 params=params)
183
183
184 response = self.app.get(
184 response = self.app.get(
185 route_path('repo_commit',
185 route_path('repo_commit',
186 repo_name=backend.repo_name, commit_id=commit_id))
186 repo_name=backend.repo_name, commit_id=commit_id))
187 # test DB
187 # test DB
188 assert ChangesetComment.query().count() == 1
188 assert ChangesetComment.query().count() == 1
189 assert_comment_links(response, ChangesetComment.query().count(), 0)
189 assert_comment_links(response, ChangesetComment.query().count(), 0)
190
190
191 notification = Notification.query().one()
191 notification = Notification.query().one()
192
192
193 assert len(notification.recipients) == 2
193 assert len(notification.recipients) == 2
194 users = [x.username for x in notification.recipients]
194 users = [x.username for x in notification.recipients]
195
195
196 # test_regular gets notification by @mention
196 # test_regular gets notification by @mention
197 assert sorted(users) == [u'test_admin', u'test_regular']
197 assert sorted(users) == [u'test_admin', u'test_regular']
198
198
199 def test_create_with_status_change(self, backend):
199 def test_create_with_status_change(self, backend):
200 self.log_user()
200 self.log_user()
201 commit = backend.repo.get_commit('300')
201 commit = backend.repo.get_commit('300')
202 commit_id = commit.raw_id
202 commit_id = commit.raw_id
203 text = u'CommentOnCommit'
203 text = u'CommentOnCommit'
204 f_path = 'vcs/web/simplevcs/views/repository.py'
204 f_path = 'vcs/web/simplevcs/views/repository.py'
205 line = 'n1'
205 line = 'n1'
206
206
207 params = {'text': text, 'changeset_status': 'approved',
207 params = {'text': text, 'changeset_status': 'approved',
208 'csrf_token': self.csrf_token}
208 'csrf_token': self.csrf_token}
209
209
210 self.app.post(
210 self.app.post(
211 route_path(
211 route_path(
212 'repo_commit_comment_create',
212 'repo_commit_comment_create',
213 repo_name=backend.repo_name, commit_id=commit_id),
213 repo_name=backend.repo_name, commit_id=commit_id),
214 params=params)
214 params=params)
215
215
216 response = self.app.get(
216 response = self.app.get(
217 route_path('repo_commit',
217 route_path('repo_commit',
218 repo_name=backend.repo_name, commit_id=commit_id))
218 repo_name=backend.repo_name, commit_id=commit_id))
219
219
220 # test DB
220 # test DB
221 assert ChangesetComment.query().count() == 1
221 assert ChangesetComment.query().count() == 1
222 assert_comment_links(response, ChangesetComment.query().count(), 0)
222 assert_comment_links(response, ChangesetComment.query().count(), 0)
223
223
224 assert Notification.query().count() == 1
224 assert Notification.query().count() == 1
225 assert ChangesetComment.query().count() == 1
225 assert ChangesetComment.query().count() == 1
226
226
227 notification = Notification.query().all()[0]
227 notification = Notification.query().all()[0]
228
228
229 comment_id = ChangesetComment.query().first().comment_id
229 comment_id = ChangesetComment.query().first().comment_id
230 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
230 assert notification.type_ == Notification.TYPE_CHANGESET_COMMENT
231
231
232 author = notification.created_by_user.username_and_name
232 author = notification.created_by_user.username_and_name
233 sbj = '[status: Approved] {0} left a note on commit `{1}` in the {2} repository'.format(
233 sbj = '[status: Approved] {0} left a note on commit `{1}` in the {2} repository'.format(
234 author, h.show_id(commit), backend.repo_name)
234 author, h.show_id(commit), backend.repo_name)
235 assert sbj == notification.subject
235 assert sbj == notification.subject
236
236
237 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
237 lnk = (u'/{0}/changeset/{1}#comment-{2}'.format(
238 backend.repo_name, commit_id, comment_id))
238 backend.repo_name, commit_id, comment_id))
239 assert lnk in notification.body
239 assert lnk in notification.body
240
240
241 def test_delete(self, backend):
241 def test_delete(self, backend):
242 self.log_user()
242 self.log_user()
243 commit_id = backend.repo.get_commit('300').raw_id
243 commit_id = backend.repo.get_commit('300').raw_id
244 text = u'CommentOnCommit'
244 text = u'CommentOnCommit'
245
245
246 params = {'text': text, 'csrf_token': self.csrf_token}
246 params = {'text': text, 'csrf_token': self.csrf_token}
247 self.app.post(
247 self.app.post(
248 route_path(
248 route_path(
249 'repo_commit_comment_create',
249 'repo_commit_comment_create',
250 repo_name=backend.repo_name, commit_id=commit_id),
250 repo_name=backend.repo_name, commit_id=commit_id),
251 params=params)
251 params=params)
252
252
253 comments = ChangesetComment.query().all()
253 comments = ChangesetComment.query().all()
254 assert len(comments) == 1
254 assert len(comments) == 1
255 comment_id = comments[0].comment_id
255 comment_id = comments[0].comment_id
256
256
257 self.app.post(
257 self.app.post(
258 route_path('repo_commit_comment_delete',
258 route_path('repo_commit_comment_delete',
259 repo_name=backend.repo_name,
259 repo_name=backend.repo_name,
260 commit_id=commit_id,
260 commit_id=commit_id,
261 comment_id=comment_id),
261 comment_id=comment_id),
262 params={'csrf_token': self.csrf_token})
262 params={'csrf_token': self.csrf_token})
263
263
264 comments = ChangesetComment.query().all()
264 comments = ChangesetComment.query().all()
265 assert len(comments) == 0
265 assert len(comments) == 0
266
266
267 response = self.app.get(
267 response = self.app.get(
268 route_path('repo_commit',
268 route_path('repo_commit',
269 repo_name=backend.repo_name, commit_id=commit_id))
269 repo_name=backend.repo_name, commit_id=commit_id))
270 assert_comment_links(response, 0, 0)
270 assert_comment_links(response, 0, 0)
271
271
272 @pytest.mark.parametrize('renderer, input, output', [
272 @pytest.mark.parametrize('renderer, input, output', [
273 ('rst', 'plain text', '<p>plain text</p>'),
273 ('rst', 'plain text', '<p>plain text</p>'),
274 ('rst', 'header\n======', '<h1 class="title">header</h1>'),
274 ('rst', 'header\n======', '<h1 class="title">header</h1>'),
275 ('rst', '*italics*', '<em>italics</em>'),
275 ('rst', '*italics*', '<em>italics</em>'),
276 ('rst', '**bold**', '<strong>bold</strong>'),
276 ('rst', '**bold**', '<strong>bold</strong>'),
277 ('markdown', 'plain text', '<p>plain text</p>'),
277 ('markdown', 'plain text', '<p>plain text</p>'),
278 ('markdown', '# header', '<h1>header</h1>'),
278 ('markdown', '# header', '<h1>header</h1>'),
279 ('markdown', '*italics*', '<em>italics</em>'),
279 ('markdown', '*italics*', '<em>italics</em>'),
280 ('markdown', '**bold**', '<strong>bold</strong>'),
280 ('markdown', '**bold**', '<strong>bold</strong>'),
281 ], ids=['rst-plain', 'rst-header', 'rst-italics', 'rst-bold', 'md-plain',
281 ], ids=['rst-plain', 'rst-header', 'rst-italics', 'rst-bold', 'md-plain',
282 'md-header', 'md-italics', 'md-bold', ])
282 'md-header', 'md-italics', 'md-bold', ])
283 def test_preview(self, renderer, input, output, backend, xhr_header):
283 def test_preview(self, renderer, input, output, backend, xhr_header):
284 self.log_user()
284 self.log_user()
285 params = {
285 params = {
286 'renderer': renderer,
286 'renderer': renderer,
287 'text': input,
287 'text': input,
288 'csrf_token': self.csrf_token
288 'csrf_token': self.csrf_token
289 }
289 }
290 commit_id = '0' * 16 # fake this for tests
290 commit_id = '0' * 16 # fake this for tests
291 response = self.app.post(
291 response = self.app.post(
292 route_path('repo_commit_comment_preview',
292 route_path('repo_commit_comment_preview',
293 repo_name=backend.repo_name, commit_id=commit_id,),
293 repo_name=backend.repo_name, commit_id=commit_id,),
294 params=params,
294 params=params,
295 extra_environ=xhr_header)
295 extra_environ=xhr_header)
296
296
297 response.mustcontain(output)
297 response.mustcontain(output)
298
298
299
299
300 def assert_comment_links(response, comments, inline_comments):
300 def assert_comment_links(response, comments, inline_comments):
301 if comments == 1:
301 if comments == 1:
302 comments_text = "%d Commit comment" % comments
302 comments_text = "%d Commit comment" % comments
303 else:
303 else:
304 comments_text = "%d Commit comments" % comments
304 comments_text = "%d Commit comments" % comments
305
305
306 if inline_comments == 1:
306 if inline_comments == 1:
307 inline_comments_text = "%d Inline Comment" % inline_comments
307 inline_comments_text = "%d Inline Comment" % inline_comments
308 else:
308 else:
309 inline_comments_text = "%d Inline Comments" % inline_comments
309 inline_comments_text = "%d Inline Comments" % inline_comments
310
310
311 if comments:
311 if comments:
312 response.mustcontain('<a href="#comments">%s</a>,' % comments_text)
312 response.mustcontain('<a href="#comments">%s</a>,' % comments_text)
313 else:
313 else:
314 response.mustcontain(comments_text)
314 response.mustcontain(comments_text)
315
315
316 if inline_comments:
316 if inline_comments:
317 response.mustcontain(
317 response.mustcontain(
318 'id="inline-comments-counter">%s</' % inline_comments_text)
318 'id="inline-comments-counter">%s</' % inline_comments_text)
319 else:
319 else:
320 response.mustcontain(inline_comments_text)
320 response.mustcontain(inline_comments_text)
@@ -1,666 +1,666 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2010-2018 RhodeCode GmbH
3 # Copyright (C) 2010-2018 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
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/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
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 mock
21 import mock
22 import pytest
22 import pytest
23 import lxml.html
23 import lxml.html
24
24
25 from rhodecode.lib.vcs.exceptions import RepositoryRequirementError
25 from rhodecode.lib.vcs.exceptions import RepositoryRequirementError
26 from rhodecode.tests import assert_session_flash
26 from rhodecode.tests import assert_session_flash
27 from rhodecode.tests.utils import AssertResponse, commit_change
27 from rhodecode.tests.utils import AssertResponse, commit_change
28
28
29
29
30 def route_path(name, params=None, **kwargs):
30 def route_path(name, params=None, **kwargs):
31 import urllib
31 import urllib
32
32
33 base_url = {
33 base_url = {
34 'repo_compare_select': '/{repo_name}/compare',
34 'repo_compare_select': '/{repo_name}/compare',
35 'repo_compare': '/{repo_name}/compare/{source_ref_type}@{source_ref}...{target_ref_type}@{target_ref}',
35 'repo_compare': '/{repo_name}/compare/{source_ref_type}@{source_ref}...{target_ref_type}@{target_ref}',
36 }[name].format(**kwargs)
36 }[name].format(**kwargs)
37
37
38 if params:
38 if params:
39 base_url = '{}?{}'.format(base_url, urllib.urlencode(params))
39 base_url = '{}?{}'.format(base_url, urllib.urlencode(params))
40 return base_url
40 return base_url
41
41
42
42
43 @pytest.mark.usefixtures("autologin_user", "app")
43 @pytest.mark.usefixtures("autologin_user", "app")
44 class TestCompareView(object):
44 class TestCompareView(object):
45
45
46 def test_compare_index_is_reached_at_least_once(self, backend):
46 def test_compare_index_is_reached_at_least_once(self, backend):
47 repo = backend.repo
47 repo = backend.repo
48 self.app.get(
48 self.app.get(
49 route_path('repo_compare_select', repo_name=repo.repo_name))
49 route_path('repo_compare_select', repo_name=repo.repo_name))
50
50
51 @pytest.mark.xfail_backends("svn", reason="Requires pull")
51 @pytest.mark.xfail_backends("svn", reason="Requires pull")
52 def test_compare_remote_with_different_commit_indexes(self, backend):
52 def test_compare_remote_with_different_commit_indexes(self, backend):
53 # Preparing the following repository structure:
53 # Preparing the following repository structure:
54 #
54 #
55 # Origin repository has two commits:
55 # Origin repository has two commits:
56 #
56 #
57 # 0 1
57 # 0 1
58 # A -- D
58 # A -- D
59 #
59 #
60 # The fork of it has a few more commits and "D" has a commit index
60 # The fork of it has a few more commits and "D" has a commit index
61 # which does not exist in origin.
61 # which does not exist in origin.
62 #
62 #
63 # 0 1 2 3 4
63 # 0 1 2 3 4
64 # A -- -- -- D -- E
64 # A -- -- -- D -- E
65 # \- B -- C
65 # \- B -- C
66 #
66 #
67
67
68 fork = backend.create_repo()
68 fork = backend.create_repo()
69
69
70 # prepare fork
70 # prepare fork
71 commit0 = commit_change(
71 commit0 = commit_change(
72 fork.repo_name, filename='file1', content='A',
72 fork.repo_name, filename='file1', content='A',
73 message='A', vcs_type=backend.alias, parent=None, newfile=True)
73 message='A', vcs_type=backend.alias, parent=None, newfile=True)
74
74
75 commit1 = commit_change(
75 commit1 = commit_change(
76 fork.repo_name, filename='file1', content='B',
76 fork.repo_name, filename='file1', content='B',
77 message='B, child of A', vcs_type=backend.alias, parent=commit0)
77 message='B, child of A', vcs_type=backend.alias, parent=commit0)
78
78
79 commit_change( # commit 2
79 commit_change( # commit 2
80 fork.repo_name, filename='file1', content='C',
80 fork.repo_name, filename='file1', content='C',
81 message='C, child of B', vcs_type=backend.alias, parent=commit1)
81 message='C, child of B', vcs_type=backend.alias, parent=commit1)
82
82
83 commit3 = commit_change(
83 commit3 = commit_change(
84 fork.repo_name, filename='file1', content='D',
84 fork.repo_name, filename='file1', content='D',
85 message='D, child of A', vcs_type=backend.alias, parent=commit0)
85 message='D, child of A', vcs_type=backend.alias, parent=commit0)
86
86
87 commit4 = commit_change(
87 commit4 = commit_change(
88 fork.repo_name, filename='file1', content='E',
88 fork.repo_name, filename='file1', content='E',
89 message='E, child of D', vcs_type=backend.alias, parent=commit3)
89 message='E, child of D', vcs_type=backend.alias, parent=commit3)
90
90
91 # prepare origin repository, taking just the history up to D
91 # prepare origin repository, taking just the history up to D
92 origin = backend.create_repo()
92 origin = backend.create_repo()
93
93
94 origin_repo = origin.scm_instance(cache=False)
94 origin_repo = origin.scm_instance(cache=False)
95 origin_repo.config.clear_section('hooks')
95 origin_repo.config.clear_section('hooks')
96 origin_repo.pull(fork.repo_full_path, commit_ids=[commit3.raw_id])
96 origin_repo.pull(fork.repo_full_path, commit_ids=[commit3.raw_id])
97
97
98 # Verify test fixture setup
98 # Verify test fixture setup
99 # This does not work for git
99 # This does not work for git
100 if backend.alias != 'git':
100 if backend.alias != 'git':
101 assert 5 == len(fork.scm_instance().commit_ids)
101 assert 5 == len(fork.scm_instance().commit_ids)
102 assert 2 == len(origin_repo.commit_ids)
102 assert 2 == len(origin_repo.commit_ids)
103
103
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", source_ref=commit3.raw_id,
108 source_ref_type="rev", source_ref=commit3.raw_id,
109 target_ref_type="rev", target_ref=commit4.raw_id,
109 target_ref_type="rev", target_ref=commit4.raw_id,
110 params=dict(merge='1', target_repo=fork.repo_name)
110 params=dict(merge='1', target_repo=fork.repo_name)
111 ))
111 ))
112
112
113 compare_page = ComparePage(response)
113 compare_page = ComparePage(response)
114 compare_page.contains_commits([commit4])
114 compare_page.contains_commits([commit4])
115
115
116 @pytest.mark.xfail_backends("svn", reason="Depends on branch support")
116 @pytest.mark.xfail_backends("svn", reason="Depends on branch support")
117 def test_compare_forks_on_branch_extra_commits(self, backend):
117 def test_compare_forks_on_branch_extra_commits(self, backend):
118 repo1 = backend.create_repo()
118 repo1 = backend.create_repo()
119
119
120 # commit something !
120 # commit something !
121 commit0 = commit_change(
121 commit0 = commit_change(
122 repo1.repo_name, filename='file1', content='line1\n',
122 repo1.repo_name, filename='file1', content='line1\n',
123 message='commit1', vcs_type=backend.alias, parent=None,
123 message='commit1', vcs_type=backend.alias, parent=None,
124 newfile=True)
124 newfile=True)
125
125
126 # fork this repo
126 # fork this repo
127 repo2 = backend.create_fork()
127 repo2 = backend.create_fork()
128
128
129 # add two extra commit into fork
129 # add two extra commit into fork
130 commit1 = commit_change(
130 commit1 = commit_change(
131 repo2.repo_name, filename='file1', content='line1\nline2\n',
131 repo2.repo_name, filename='file1', content='line1\nline2\n',
132 message='commit2', vcs_type=backend.alias, parent=commit0)
132 message='commit2', vcs_type=backend.alias, parent=commit0)
133
133
134 commit2 = commit_change(
134 commit2 = commit_change(
135 repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
135 repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
136 message='commit3', vcs_type=backend.alias, parent=commit1)
136 message='commit3', vcs_type=backend.alias, parent=commit1)
137
137
138 commit_id1 = repo1.scm_instance().DEFAULT_BRANCH_NAME
138 commit_id1 = repo1.scm_instance().DEFAULT_BRANCH_NAME
139 commit_id2 = repo2.scm_instance().DEFAULT_BRANCH_NAME
139 commit_id2 = repo2.scm_instance().DEFAULT_BRANCH_NAME
140
140
141 response = self.app.get(
141 response = self.app.get(
142 route_path('repo_compare',
142 route_path('repo_compare',
143 repo_name=repo1.repo_name,
143 repo_name=repo1.repo_name,
144 source_ref_type="branch", source_ref=commit_id2,
144 source_ref_type="branch", source_ref=commit_id2,
145 target_ref_type="branch", target_ref=commit_id1,
145 target_ref_type="branch", target_ref=commit_id1,
146 params=dict(merge='1', target_repo=repo2.repo_name)
146 params=dict(merge='1', target_repo=repo2.repo_name)
147 ))
147 ))
148
148
149 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
149 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
150 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
150 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
151
151
152 compare_page = ComparePage(response)
152 compare_page = ComparePage(response)
153 compare_page.contains_change_summary(1, 2, 0)
153 compare_page.contains_change_summary(1, 2, 0)
154 compare_page.contains_commits([commit1, commit2])
154 compare_page.contains_commits([commit1, commit2])
155
155
156 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
156 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
157 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
157 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
158
158
159 # 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
160 # it is then a preview mode
160 # it is then a preview mode
161 compare_page.swap_is_hidden()
161 compare_page.swap_is_hidden()
162 compare_page.target_source_are_disabled()
162 compare_page.target_source_are_disabled()
163
163
164 @pytest.mark.xfail_backends("svn", reason="Depends on branch support")
164 @pytest.mark.xfail_backends("svn", reason="Depends on branch support")
165 def test_compare_forks_on_branch_extra_commits_origin_has_incomming(
165 def test_compare_forks_on_branch_extra_commits_origin_has_incomming(
166 self, backend):
166 self, backend):
167 repo1 = backend.create_repo()
167 repo1 = backend.create_repo()
168
168
169 # commit something !
169 # commit something !
170 commit0 = commit_change(
170 commit0 = commit_change(
171 repo1.repo_name, filename='file1', content='line1\n',
171 repo1.repo_name, filename='file1', content='line1\n',
172 message='commit1', vcs_type=backend.alias, parent=None,
172 message='commit1', vcs_type=backend.alias, parent=None,
173 newfile=True)
173 newfile=True)
174
174
175 # fork this repo
175 # fork this repo
176 repo2 = backend.create_fork()
176 repo2 = backend.create_fork()
177
177
178 # now commit something to origin repo
178 # now commit something to origin repo
179 commit_change(
179 commit_change(
180 repo1.repo_name, filename='file2', content='line1file2\n',
180 repo1.repo_name, filename='file2', content='line1file2\n',
181 message='commit2', vcs_type=backend.alias, parent=commit0,
181 message='commit2', vcs_type=backend.alias, parent=commit0,
182 newfile=True)
182 newfile=True)
183
183
184 # add two extra commit into fork
184 # add two extra commit into fork
185 commit1 = commit_change(
185 commit1 = commit_change(
186 repo2.repo_name, filename='file1', content='line1\nline2\n',
186 repo2.repo_name, filename='file1', content='line1\nline2\n',
187 message='commit2', vcs_type=backend.alias, parent=commit0)
187 message='commit2', vcs_type=backend.alias, parent=commit0)
188
188
189 commit2 = commit_change(
189 commit2 = commit_change(
190 repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
190 repo2.repo_name, filename='file1', content='line1\nline2\nline3\n',
191 message='commit3', vcs_type=backend.alias, parent=commit1)
191 message='commit3', vcs_type=backend.alias, parent=commit1)
192
192
193 commit_id1 = repo1.scm_instance().DEFAULT_BRANCH_NAME
193 commit_id1 = repo1.scm_instance().DEFAULT_BRANCH_NAME
194 commit_id2 = repo2.scm_instance().DEFAULT_BRANCH_NAME
194 commit_id2 = repo2.scm_instance().DEFAULT_BRANCH_NAME
195
195
196 response = self.app.get(
196 response = self.app.get(
197 route_path('repo_compare',
197 route_path('repo_compare',
198 repo_name=repo1.repo_name,
198 repo_name=repo1.repo_name,
199 source_ref_type="branch", source_ref=commit_id2,
199 source_ref_type="branch", source_ref=commit_id2,
200 target_ref_type="branch", target_ref=commit_id1,
200 target_ref_type="branch", target_ref=commit_id1,
201 params=dict(merge='1', target_repo=repo2.repo_name),
201 params=dict(merge='1', target_repo=repo2.repo_name),
202 ))
202 ))
203
203
204 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
204 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id2))
205 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
205 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id1))
206
206
207 compare_page = ComparePage(response)
207 compare_page = ComparePage(response)
208 compare_page.contains_change_summary(1, 2, 0)
208 compare_page.contains_change_summary(1, 2, 0)
209 compare_page.contains_commits([commit1, commit2])
209 compare_page.contains_commits([commit1, commit2])
210 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
210 anchor = 'a_c-{}-826e8142e6ba'.format(commit0.short_id)
211 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
211 compare_page.contains_file_links_and_anchors([('file1', anchor), ])
212
212
213 # 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
214 # it is then a preview mode
214 # it is then a preview mode
215 compare_page.swap_is_hidden()
215 compare_page.swap_is_hidden()
216 compare_page.target_source_are_disabled()
216 compare_page.target_source_are_disabled()
217
217
218 @pytest.mark.xfail_backends("svn")
218 @pytest.mark.xfail_backends("svn")
219 # TODO(marcink): no svn support for compare two seperate repos
219 # TODO(marcink): no svn support for compare two seperate repos
220 def test_compare_of_unrelated_forks(self, backend):
220 def test_compare_of_unrelated_forks(self, backend):
221 orig = backend.create_repo(number_of_commits=1)
221 orig = backend.create_repo(number_of_commits=1)
222 fork = backend.create_repo(number_of_commits=1)
222 fork = backend.create_repo(number_of_commits=1)
223
223
224 response = self.app.get(
224 response = self.app.get(
225 route_path('repo_compare',
225 route_path('repo_compare',
226 repo_name=orig.repo_name,
226 repo_name=orig.repo_name,
227 source_ref_type="rev", source_ref="tip",
227 source_ref_type="rev", source_ref="tip",
228 target_ref_type="rev", target_ref="tip",
228 target_ref_type="rev", target_ref="tip",
229 params=dict(merge='1', target_repo=fork.repo_name),
229 params=dict(merge='1', target_repo=fork.repo_name),
230 ),
230 ),
231 status=302)
231 status=302)
232 response = response.follow()
232 response = response.follow()
233 response.mustcontain("Repositories unrelated.")
233 response.mustcontain("Repositories unrelated.")
234
234
235 @pytest.mark.xfail_backends("svn")
235 @pytest.mark.xfail_backends("svn")
236 def test_compare_cherry_pick_commits_from_bottom(self, backend):
236 def test_compare_cherry_pick_commits_from_bottom(self, backend):
237
237
238 # repo1:
238 # repo1:
239 # commit0:
239 # commit0:
240 # commit1:
240 # commit1:
241 # repo1-fork- in which we will cherry pick bottom commits
241 # repo1-fork- in which we will cherry pick bottom commits
242 # commit0:
242 # commit0:
243 # commit1:
243 # commit1:
244 # commit2: x
244 # commit2: x
245 # commit3: x
245 # commit3: x
246 # commit4: x
246 # commit4: x
247 # commit5:
247 # commit5:
248 # make repo1, and commit1+commit2
248 # make repo1, and commit1+commit2
249
249
250 repo1 = backend.create_repo()
250 repo1 = backend.create_repo()
251
251
252 # commit something !
252 # commit something !
253 commit0 = commit_change(
253 commit0 = commit_change(
254 repo1.repo_name, filename='file1', content='line1\n',
254 repo1.repo_name, filename='file1', content='line1\n',
255 message='commit1', vcs_type=backend.alias, parent=None,
255 message='commit1', vcs_type=backend.alias, parent=None,
256 newfile=True)
256 newfile=True)
257 commit1 = commit_change(
257 commit1 = commit_change(
258 repo1.repo_name, filename='file1', content='line1\nline2\n',
258 repo1.repo_name, filename='file1', content='line1\nline2\n',
259 message='commit2', vcs_type=backend.alias, parent=commit0)
259 message='commit2', vcs_type=backend.alias, parent=commit0)
260
260
261 # fork this repo
261 # fork this repo
262 repo2 = backend.create_fork()
262 repo2 = backend.create_fork()
263
263
264 # now make commit3-6
264 # now make commit3-6
265 commit2 = commit_change(
265 commit2 = commit_change(
266 repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
266 repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
267 message='commit3', vcs_type=backend.alias, parent=commit1)
267 message='commit3', vcs_type=backend.alias, parent=commit1)
268 commit3 = commit_change(
268 commit3 = commit_change(
269 repo1.repo_name, filename='file1',
269 repo1.repo_name, filename='file1',
270 content='line1\nline2\nline3\nline4\n', message='commit4',
270 content='line1\nline2\nline3\nline4\n', message='commit4',
271 vcs_type=backend.alias, parent=commit2)
271 vcs_type=backend.alias, parent=commit2)
272 commit4 = commit_change(
272 commit4 = commit_change(
273 repo1.repo_name, filename='file1',
273 repo1.repo_name, filename='file1',
274 content='line1\nline2\nline3\nline4\nline5\n', message='commit5',
274 content='line1\nline2\nline3\nline4\nline5\n', message='commit5',
275 vcs_type=backend.alias, parent=commit3)
275 vcs_type=backend.alias, parent=commit3)
276 commit_change( # commit 5
276 commit_change( # commit 5
277 repo1.repo_name, filename='file1',
277 repo1.repo_name, filename='file1',
278 content='line1\nline2\nline3\nline4\nline5\nline6\n',
278 content='line1\nline2\nline3\nline4\nline5\nline6\n',
279 message='commit6', vcs_type=backend.alias, parent=commit4)
279 message='commit6', vcs_type=backend.alias, parent=commit4)
280
280
281 response = self.app.get(
281 response = self.app.get(
282 route_path('repo_compare',
282 route_path('repo_compare',
283 repo_name=repo2.repo_name,
283 repo_name=repo2.repo_name,
284 # parent of commit2, in target repo2
284 # parent of commit2, in target repo2
285 source_ref_type="rev", source_ref=commit1.raw_id,
285 source_ref_type="rev", source_ref=commit1.raw_id,
286 target_ref_type="rev", target_ref=commit4.raw_id,
286 target_ref_type="rev", target_ref=commit4.raw_id,
287 params=dict(merge='1', target_repo=repo1.repo_name),
287 params=dict(merge='1', target_repo=repo1.repo_name),
288 ))
288 ))
289 response.mustcontain('%s@%s' % (repo2.repo_name, commit1.short_id))
289 response.mustcontain('%s@%s' % (repo2.repo_name, commit1.short_id))
290 response.mustcontain('%s@%s' % (repo1.repo_name, commit4.short_id))
290 response.mustcontain('%s@%s' % (repo1.repo_name, commit4.short_id))
291
291
292 # files
292 # files
293 compare_page = ComparePage(response)
293 compare_page = ComparePage(response)
294 compare_page.contains_change_summary(1, 3, 0)
294 compare_page.contains_change_summary(1, 3, 0)
295 compare_page.contains_commits([commit2, commit3, commit4])
295 compare_page.contains_commits([commit2, commit3, commit4])
296 anchor = 'a_c-{}-826e8142e6ba'.format(commit1.short_id)
296 anchor = 'a_c-{}-826e8142e6ba'.format(commit1.short_id)
297 compare_page.contains_file_links_and_anchors([('file1', anchor),])
297 compare_page.contains_file_links_and_anchors([('file1', anchor),])
298
298
299 @pytest.mark.xfail_backends("svn")
299 @pytest.mark.xfail_backends("svn")
300 def test_compare_cherry_pick_commits_from_top(self, backend):
300 def test_compare_cherry_pick_commits_from_top(self, backend):
301 # repo1:
301 # repo1:
302 # commit0:
302 # commit0:
303 # commit1:
303 # commit1:
304 # repo1-fork- in which we will cherry pick bottom commits
304 # repo1-fork- in which we will cherry pick bottom commits
305 # commit0:
305 # commit0:
306 # commit1:
306 # commit1:
307 # commit2:
307 # commit2:
308 # commit3: x
308 # commit3: x
309 # commit4: x
309 # commit4: x
310 # commit5: x
310 # commit5: x
311
311
312 # make repo1, and commit1+commit2
312 # make repo1, and commit1+commit2
313 repo1 = backend.create_repo()
313 repo1 = backend.create_repo()
314
314
315 # commit something !
315 # commit something !
316 commit0 = commit_change(
316 commit0 = commit_change(
317 repo1.repo_name, filename='file1', content='line1\n',
317 repo1.repo_name, filename='file1', content='line1\n',
318 message='commit1', vcs_type=backend.alias, parent=None,
318 message='commit1', vcs_type=backend.alias, parent=None,
319 newfile=True)
319 newfile=True)
320 commit1 = commit_change(
320 commit1 = commit_change(
321 repo1.repo_name, filename='file1', content='line1\nline2\n',
321 repo1.repo_name, filename='file1', content='line1\nline2\n',
322 message='commit2', vcs_type=backend.alias, parent=commit0)
322 message='commit2', vcs_type=backend.alias, parent=commit0)
323
323
324 # fork this repo
324 # fork this repo
325 backend.create_fork()
325 backend.create_fork()
326
326
327 # now make commit3-6
327 # now make commit3-6
328 commit2 = commit_change(
328 commit2 = commit_change(
329 repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
329 repo1.repo_name, filename='file1', content='line1\nline2\nline3\n',
330 message='commit3', vcs_type=backend.alias, parent=commit1)
330 message='commit3', vcs_type=backend.alias, parent=commit1)
331 commit3 = commit_change(
331 commit3 = commit_change(
332 repo1.repo_name, filename='file1',
332 repo1.repo_name, filename='file1',
333 content='line1\nline2\nline3\nline4\n', message='commit4',
333 content='line1\nline2\nline3\nline4\n', message='commit4',
334 vcs_type=backend.alias, parent=commit2)
334 vcs_type=backend.alias, parent=commit2)
335 commit4 = commit_change(
335 commit4 = commit_change(
336 repo1.repo_name, filename='file1',
336 repo1.repo_name, filename='file1',
337 content='line1\nline2\nline3\nline4\nline5\n', message='commit5',
337 content='line1\nline2\nline3\nline4\nline5\n', message='commit5',
338 vcs_type=backend.alias, parent=commit3)
338 vcs_type=backend.alias, parent=commit3)
339 commit5 = commit_change(
339 commit5 = commit_change(
340 repo1.repo_name, filename='file1',
340 repo1.repo_name, filename='file1',
341 content='line1\nline2\nline3\nline4\nline5\nline6\n',
341 content='line1\nline2\nline3\nline4\nline5\nline6\n',
342 message='commit6', vcs_type=backend.alias, parent=commit4)
342 message='commit6', vcs_type=backend.alias, parent=commit4)
343
343
344 response = self.app.get(
344 response = self.app.get(
345 route_path('repo_compare',
345 route_path('repo_compare',
346 repo_name=repo1.repo_name,
346 repo_name=repo1.repo_name,
347 # parent of commit3, not in source repo2
347 # parent of commit3, not in source repo2
348 source_ref_type="rev", source_ref=commit2.raw_id,
348 source_ref_type="rev", source_ref=commit2.raw_id,
349 target_ref_type="rev", target_ref=commit5.raw_id,
349 target_ref_type="rev", target_ref=commit5.raw_id,
350 params=dict(merge='1'),))
350 params=dict(merge='1'),))
351
351
352 response.mustcontain('%s@%s' % (repo1.repo_name, commit2.short_id))
352 response.mustcontain('%s@%s' % (repo1.repo_name, commit2.short_id))
353 response.mustcontain('%s@%s' % (repo1.repo_name, commit5.short_id))
353 response.mustcontain('%s@%s' % (repo1.repo_name, commit5.short_id))
354
354
355 compare_page = ComparePage(response)
355 compare_page = ComparePage(response)
356 compare_page.contains_change_summary(1, 3, 0)
356 compare_page.contains_change_summary(1, 3, 0)
357 compare_page.contains_commits([commit3, commit4, commit5])
357 compare_page.contains_commits([commit3, commit4, commit5])
358
358
359 # files
359 # files
360 anchor = 'a_c-{}-826e8142e6ba'.format(commit2.short_id)
360 anchor = 'a_c-{}-826e8142e6ba'.format(commit2.short_id)
361 compare_page.contains_file_links_and_anchors([('file1', anchor),])
361 compare_page.contains_file_links_and_anchors([('file1', anchor),])
362
362
363 @pytest.mark.xfail_backends("svn")
363 @pytest.mark.xfail_backends("svn")
364 def test_compare_remote_branches(self, backend):
364 def test_compare_remote_branches(self, backend):
365 repo1 = backend.repo
365 repo1 = backend.repo
366 repo2 = backend.create_fork()
366 repo2 = backend.create_fork()
367
367
368 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
369 commit_id1_short = repo1.get_commit(commit_idx=3).short_id
370 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
371 commit_id2_short = repo1.get_commit(commit_idx=6).short_id
372
372
373 response = self.app.get(
373 response = self.app.get(
374 route_path('repo_compare',
374 route_path('repo_compare',
375 repo_name=repo1.repo_name,
375 repo_name=repo1.repo_name,
376 source_ref_type="rev", source_ref=commit_id1,
376 source_ref_type="rev", source_ref=commit_id1,
377 target_ref_type="rev", target_ref=commit_id2,
377 target_ref_type="rev", target_ref=commit_id2,
378 params=dict(merge='1', target_repo=repo2.repo_name),
378 params=dict(merge='1', target_repo=repo2.repo_name),
379 ))
379 ))
380
380
381 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id1))
381 response.mustcontain('%s@%s' % (repo1.repo_name, commit_id1))
382 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id2))
382 response.mustcontain('%s@%s' % (repo2.repo_name, commit_id2))
383
383
384 compare_page = ComparePage(response)
384 compare_page = ComparePage(response)
385
385
386 # outgoing commits between those commits
386 # outgoing commits between those commits
387 compare_page.contains_commits(
387 compare_page.contains_commits(
388 [repo2.get_commit(commit_idx=x) for x in [4, 5, 6]])
388 [repo2.get_commit(commit_idx=x) for x in [4, 5, 6]])
389
389
390 # files
390 # files
391 compare_page.contains_file_links_and_anchors([
391 compare_page.contains_file_links_and_anchors([
392 ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(commit_id2_short)),
392 ('vcs/backends/hg.py', 'a_c-{}-9c390eb52cd6'.format(commit_id2_short)),
393 ('vcs/backends/__init__.py', 'a_c-{}-41b41c1f2796'.format(commit_id1_short)),
393 ('vcs/backends/__init__.py', 'a_c-{}-41b41c1f2796'.format(commit_id1_short)),
394 ('vcs/backends/base.py', 'a_c-{}-2f574d260608'.format(commit_id1_short)),
394 ('vcs/backends/base.py', 'a_c-{}-2f574d260608'.format(commit_id1_short)),
395 ])
395 ])
396
396
397 @pytest.mark.xfail_backends("svn")
397 @pytest.mark.xfail_backends("svn")
398 def test_source_repo_new_commits_after_forking_simple_diff(self, backend):
398 def test_source_repo_new_commits_after_forking_simple_diff(self, backend):
399 repo1 = backend.create_repo()
399 repo1 = backend.create_repo()
400 r1_name = repo1.repo_name
400 r1_name = repo1.repo_name
401
401
402 commit0 = commit_change(
402 commit0 = commit_change(
403 repo=r1_name, filename='file1',
403 repo=r1_name, filename='file1',
404 content='line1', message='commit1', vcs_type=backend.alias,
404 content='line1', message='commit1', vcs_type=backend.alias,
405 newfile=True)
405 newfile=True)
406 assert repo1.scm_instance().commit_ids == [commit0.raw_id]
406 assert repo1.scm_instance().commit_ids == [commit0.raw_id]
407
407
408 # fork the repo1
408 # fork the repo1
409 repo2 = backend.create_fork()
409 repo2 = backend.create_fork()
410 assert repo2.scm_instance().commit_ids == [commit0.raw_id]
410 assert repo2.scm_instance().commit_ids == [commit0.raw_id]
411
411
412 self.r2_id = repo2.repo_id
412 self.r2_id = repo2.repo_id
413 r2_name = repo2.repo_name
413 r2_name = repo2.repo_name
414
414
415 commit1 = commit_change(
415 commit1 = commit_change(
416 repo=r2_name, filename='file1-fork',
416 repo=r2_name, filename='file1-fork',
417 content='file1-line1-from-fork', message='commit1-fork',
417 content='file1-line1-from-fork', message='commit1-fork',
418 vcs_type=backend.alias, parent=repo2.scm_instance()[-1],
418 vcs_type=backend.alias, parent=repo2.scm_instance()[-1],
419 newfile=True)
419 newfile=True)
420
420
421 commit2 = commit_change(
421 commit2 = commit_change(
422 repo=r2_name, filename='file2-fork',
422 repo=r2_name, filename='file2-fork',
423 content='file2-line1-from-fork', message='commit2-fork',
423 content='file2-line1-from-fork', message='commit2-fork',
424 vcs_type=backend.alias, parent=commit1,
424 vcs_type=backend.alias, parent=commit1,
425 newfile=True)
425 newfile=True)
426
426
427 commit_change( # commit 3
427 commit_change( # commit 3
428 repo=r2_name, filename='file3-fork',
428 repo=r2_name, filename='file3-fork',
429 content='file3-line1-from-fork', message='commit3-fork',
429 content='file3-line1-from-fork', message='commit3-fork',
430 vcs_type=backend.alias, parent=commit2, newfile=True)
430 vcs_type=backend.alias, parent=commit2, newfile=True)
431
431
432 # compare !
432 # compare !
433 commit_id1 = repo1.scm_instance().DEFAULT_BRANCH_NAME
433 commit_id1 = repo1.scm_instance().DEFAULT_BRANCH_NAME
434 commit_id2 = repo2.scm_instance().DEFAULT_BRANCH_NAME
434 commit_id2 = repo2.scm_instance().DEFAULT_BRANCH_NAME
435
435
436 response = self.app.get(
436 response = self.app.get(
437 route_path('repo_compare',
437 route_path('repo_compare',
438 repo_name=r2_name,
438 repo_name=r2_name,
439 source_ref_type="branch", source_ref=commit_id1,
439 source_ref_type="branch", source_ref=commit_id1,
440 target_ref_type="branch", target_ref=commit_id2,
440 target_ref_type="branch", target_ref=commit_id2,
441 params=dict(merge='1', target_repo=r1_name),
441 params=dict(merge='1', target_repo=r1_name),
442 ))
442 ))
443
443
444 response.mustcontain('%s@%s' % (r2_name, commit_id1))
444 response.mustcontain('%s@%s' % (r2_name, commit_id1))
445 response.mustcontain('%s@%s' % (r1_name, commit_id2))
445 response.mustcontain('%s@%s' % (r1_name, commit_id2))
446 response.mustcontain('No files')
446 response.mustcontain('No files')
447 response.mustcontain('No commits in this compare')
447 response.mustcontain('No commits in this compare')
448
448
449 commit0 = commit_change(
449 commit0 = commit_change(
450 repo=r1_name, filename='file2',
450 repo=r1_name, filename='file2',
451 content='line1-added-after-fork', message='commit2-parent',
451 content='line1-added-after-fork', message='commit2-parent',
452 vcs_type=backend.alias, parent=None, newfile=True)
452 vcs_type=backend.alias, parent=None, newfile=True)
453
453
454 # compare !
454 # compare !
455 response = self.app.get(
455 response = self.app.get(
456 route_path('repo_compare',
456 route_path('repo_compare',
457 repo_name=r2_name,
457 repo_name=r2_name,
458 source_ref_type="branch", source_ref=commit_id1,
458 source_ref_type="branch", source_ref=commit_id1,
459 target_ref_type="branch", target_ref=commit_id2,
459 target_ref_type="branch", target_ref=commit_id2,
460 params=dict(merge='1', target_repo=r1_name),
460 params=dict(merge='1', target_repo=r1_name),
461 ))
461 ))
462
462
463 response.mustcontain('%s@%s' % (r2_name, commit_id1))
463 response.mustcontain('%s@%s' % (r2_name, commit_id1))
464 response.mustcontain('%s@%s' % (r1_name, commit_id2))
464 response.mustcontain('%s@%s' % (r1_name, commit_id2))
465
465
466 response.mustcontain("""commit2-parent""")
466 response.mustcontain("""commit2-parent""")
467 response.mustcontain("""line1-added-after-fork""")
467 response.mustcontain("""line1-added-after-fork""")
468 compare_page = ComparePage(response)
468 compare_page = ComparePage(response)
469 compare_page.contains_change_summary(1, 1, 0)
469 compare_page.contains_change_summary(1, 1, 0)
470
470
471 @pytest.mark.xfail_backends("svn")
471 @pytest.mark.xfail_backends("svn")
472 def test_compare_commits(self, backend, xhr_header):
472 def test_compare_commits(self, backend, xhr_header):
473 commit0 = backend.repo.get_commit(commit_idx=0)
473 commit0 = backend.repo.get_commit(commit_idx=0)
474 commit1 = backend.repo.get_commit(commit_idx=1)
474 commit1 = backend.repo.get_commit(commit_idx=1)
475
475
476 response = self.app.get(
476 response = self.app.get(
477 route_path('repo_compare',
477 route_path('repo_compare',
478 repo_name=backend.repo_name,
478 repo_name=backend.repo_name,
479 source_ref_type="rev", source_ref=commit0.raw_id,
479 source_ref_type="rev", source_ref=commit0.raw_id,
480 target_ref_type="rev", target_ref=commit1.raw_id,
480 target_ref_type="rev", target_ref=commit1.raw_id,
481 params=dict(merge='1')
481 params=dict(merge='1')
482 ),
482 ),
483 extra_environ=xhr_header, )
483 extra_environ=xhr_header, )
484
484
485 # outgoing commits between those commits
485 # outgoing commits between those commits
486 compare_page = ComparePage(response)
486 compare_page = ComparePage(response)
487 compare_page.contains_commits(commits=[commit1], ancestors=[commit0])
487 compare_page.contains_commits(commits=[commit1], ancestors=[commit0])
488
488
489 def test_errors_when_comparing_unknown_source_repo(self, backend):
489 def test_errors_when_comparing_unknown_source_repo(self, backend):
490 repo = backend.repo
490 repo = backend.repo
491 badrepo = 'badrepo'
491 badrepo = 'badrepo'
492
492
493 response = self.app.get(
493 response = self.app.get(
494 route_path('repo_compare',
494 route_path('repo_compare',
495 repo_name=badrepo,
495 repo_name=badrepo,
496 source_ref_type="rev", source_ref='tip',
496 source_ref_type="rev", source_ref='tip',
497 target_ref_type="rev", target_ref='tip',
497 target_ref_type="rev", target_ref='tip',
498 params=dict(merge='1', target_repo=repo.repo_name)
498 params=dict(merge='1', target_repo=repo.repo_name)
499 ),
499 ),
500 status=404)
500 status=404)
501
501
502 def test_errors_when_comparing_unknown_target_repo(self, backend):
502 def test_errors_when_comparing_unknown_target_repo(self, backend):
503 repo = backend.repo
503 repo = backend.repo
504 badrepo = 'badrepo'
504 badrepo = 'badrepo'
505
505
506 response = self.app.get(
506 response = self.app.get(
507 route_path('repo_compare',
507 route_path('repo_compare',
508 repo_name=repo.repo_name,
508 repo_name=repo.repo_name,
509 source_ref_type="rev", source_ref='tip',
509 source_ref_type="rev", source_ref='tip',
510 target_ref_type="rev", target_ref='tip',
510 target_ref_type="rev", target_ref='tip',
511 params=dict(merge='1', target_repo=badrepo),
511 params=dict(merge='1', target_repo=badrepo),
512 ),
512 ),
513 status=302)
513 status=302)
514 redirected = response.follow()
514 redirected = response.follow()
515 redirected.mustcontain(
515 redirected.mustcontain(
516 'Could not find the target repo: `{}`'.format(badrepo))
516 'Could not find the target repo: `{}`'.format(badrepo))
517
517
518 def test_compare_not_in_preview_mode(self, backend_stub):
518 def test_compare_not_in_preview_mode(self, backend_stub):
519 commit0 = backend_stub.repo.get_commit(commit_idx=0)
519 commit0 = backend_stub.repo.get_commit(commit_idx=0)
520 commit1 = backend_stub.repo.get_commit(commit_idx=1)
520 commit1 = backend_stub.repo.get_commit(commit_idx=1)
521
521
522 response = self.app.get(
522 response = self.app.get(
523 route_path('repo_compare',
523 route_path('repo_compare',
524 repo_name=backend_stub.repo_name,
524 repo_name=backend_stub.repo_name,
525 source_ref_type="rev", source_ref=commit0.raw_id,
525 source_ref_type="rev", source_ref=commit0.raw_id,
526 target_ref_type="rev", target_ref=commit1.raw_id,
526 target_ref_type="rev", target_ref=commit1.raw_id,
527 ))
527 ))
528
528
529 # outgoing commits between those commits
529 # outgoing commits between those commits
530 compare_page = ComparePage(response)
530 compare_page = ComparePage(response)
531 compare_page.swap_is_visible()
531 compare_page.swap_is_visible()
532 compare_page.target_source_are_enabled()
532 compare_page.target_source_are_enabled()
533
533
534 def test_compare_of_fork_with_largefiles(self, backend_hg, settings_util):
534 def test_compare_of_fork_with_largefiles(self, backend_hg, settings_util):
535 orig = backend_hg.create_repo(number_of_commits=1)
535 orig = backend_hg.create_repo(number_of_commits=1)
536 fork = backend_hg.create_fork()
536 fork = backend_hg.create_fork()
537
537
538 settings_util.create_repo_rhodecode_ui(
538 settings_util.create_repo_rhodecode_ui(
539 orig, 'extensions', value='', key='largefiles', active=False)
539 orig, 'extensions', value='', key='largefiles', active=False)
540 settings_util.create_repo_rhodecode_ui(
540 settings_util.create_repo_rhodecode_ui(
541 fork, 'extensions', value='', key='largefiles', active=True)
541 fork, 'extensions', value='', key='largefiles', active=True)
542
542
543 compare_module = ('rhodecode.lib.vcs.backends.hg.repository.'
543 compare_module = ('rhodecode.lib.vcs.backends.hg.repository.'
544 'MercurialRepository.compare')
544 'MercurialRepository.compare')
545 with mock.patch(compare_module) as compare_mock:
545 with mock.patch(compare_module) as compare_mock:
546 compare_mock.side_effect = RepositoryRequirementError()
546 compare_mock.side_effect = RepositoryRequirementError()
547
547
548 response = self.app.get(
548 response = self.app.get(
549 route_path('repo_compare',
549 route_path('repo_compare',
550 repo_name=orig.repo_name,
550 repo_name=orig.repo_name,
551 source_ref_type="rev", source_ref="tip",
551 source_ref_type="rev", source_ref="tip",
552 target_ref_type="rev", target_ref="tip",
552 target_ref_type="rev", target_ref="tip",
553 params=dict(merge='1', target_repo=fork.repo_name),
553 params=dict(merge='1', target_repo=fork.repo_name),
554 ),
554 ),
555 status=302)
555 status=302)
556
556
557 assert_session_flash(
557 assert_session_flash(
558 response,
558 response,
559 'Could not compare repos with different large file settings')
559 'Could not compare repos with different large file settings')
560
560
561
561
562 @pytest.mark.usefixtures("autologin_user")
562 @pytest.mark.usefixtures("autologin_user")
563 class TestCompareControllerSvn(object):
563 class TestCompareControllerSvn(object):
564
564
565 def test_supports_references_with_path(self, app, backend_svn):
565 def test_supports_references_with_path(self, app, backend_svn):
566 repo = backend_svn['svn-simple-layout']
566 repo = backend_svn['svn-simple-layout']
567 commit_id = repo.get_commit(commit_idx=-1).raw_id
567 commit_id = repo.get_commit(commit_idx=-1).raw_id
568 response = app.get(
568 response = app.get(
569 route_path('repo_compare',
569 route_path('repo_compare',
570 repo_name=repo.repo_name,
570 repo_name=repo.repo_name,
571 source_ref_type="tag",
571 source_ref_type="tag",
572 source_ref="%s@%s" % ('tags/v0.1', commit_id),
572 source_ref="%s@%s" % ('tags/v0.1', commit_id),
573 target_ref_type="tag",
573 target_ref_type="tag",
574 target_ref="%s@%s" % ('tags/v0.2', commit_id),
574 target_ref="%s@%s" % ('tags/v0.2', commit_id),
575 params=dict(merge='1'),
575 params=dict(merge='1'),
576 ),
576 ),
577 status=200)
577 status=200)
578
578
579 # Expecting no commits, since both paths are at the same revision
579 # Expecting no commits, since both paths are at the same revision
580 response.mustcontain('No commits in this compare')
580 response.mustcontain('No commits in this compare')
581
581
582 # Should find only one file changed when comparing those two tags
582 # Should find only one file changed when comparing those two tags
583 response.mustcontain('example.py')
583 response.mustcontain('example.py')
584 compare_page = ComparePage(response)
584 compare_page = ComparePage(response)
585 compare_page.contains_change_summary(1, 5, 1)
585 compare_page.contains_change_summary(1, 5, 1)
586
586
587 def test_shows_commits_if_different_ids(self, app, backend_svn):
587 def test_shows_commits_if_different_ids(self, app, backend_svn):
588 repo = backend_svn['svn-simple-layout']
588 repo = backend_svn['svn-simple-layout']
589 source_id = repo.get_commit(commit_idx=-6).raw_id
589 source_id = repo.get_commit(commit_idx=-6).raw_id
590 target_id = repo.get_commit(commit_idx=-1).raw_id
590 target_id = repo.get_commit(commit_idx=-1).raw_id
591 response = app.get(
591 response = app.get(
592 route_path('repo_compare',
592 route_path('repo_compare',
593 repo_name=repo.repo_name,
593 repo_name=repo.repo_name,
594 source_ref_type="tag",
594 source_ref_type="tag",
595 source_ref="%s@%s" % ('tags/v0.1', source_id),
595 source_ref="%s@%s" % ('tags/v0.1', source_id),
596 target_ref_type="tag",
596 target_ref_type="tag",
597 target_ref="%s@%s" % ('tags/v0.2', target_id),
597 target_ref="%s@%s" % ('tags/v0.2', target_id),
598 params=dict(merge='1')
598 params=dict(merge='1')
599 ),
599 ),
600 status=200)
600 status=200)
601
601
602 # It should show commits
602 # It should show commits
603 assert 'No commits in this compare' not in response.body
603 assert 'No commits in this compare' not in response.body
604
604
605 # Should find only one file changed when comparing those two tags
605 # Should find only one file changed when comparing those two tags
606 response.mustcontain('example.py')
606 response.mustcontain('example.py')
607 compare_page = ComparePage(response)
607 compare_page = ComparePage(response)
608 compare_page.contains_change_summary(1, 5, 1)
608 compare_page.contains_change_summary(1, 5, 1)
609
609
610
610
611 class ComparePage(AssertResponse):
611 class ComparePage(AssertResponse):
612 """
612 """
613 Abstracts the page template from the tests
613 Abstracts the page template from the tests
614 """
614 """
615
615
616 def contains_file_links_and_anchors(self, files):
616 def contains_file_links_and_anchors(self, files):
617 doc = lxml.html.fromstring(self.response.body)
617 doc = lxml.html.fromstring(self.response.body)
618 for filename, file_id in files:
618 for filename, file_id in files:
619 self.contains_one_anchor(file_id)
619 self.contains_one_anchor(file_id)
620 diffblock = doc.cssselect('[data-f-path="%s"]' % filename)
620 diffblock = doc.cssselect('[data-f-path="%s"]' % filename)
621 assert len(diffblock) == 1
621 assert len(diffblock) == 2
622 assert len(diffblock[0].cssselect('a[href="#%s"]' % file_id)) == 1
622 assert len(diffblock[0].cssselect('a[href="#%s"]' % file_id)) == 1
623
623
624 def contains_change_summary(self, files_changed, inserted, deleted):
624 def contains_change_summary(self, files_changed, inserted, deleted):
625 template = (
625 template = (
626 "{files_changed} file{plural} changed: "
626 "{files_changed} file{plural} changed: "
627 "{inserted} inserted, {deleted} deleted")
627 "{inserted} inserted, {deleted} deleted")
628 self.response.mustcontain(template.format(
628 self.response.mustcontain(template.format(
629 files_changed=files_changed,
629 files_changed=files_changed,
630 plural="s" if files_changed > 1 else "",
630 plural="s" if files_changed > 1 else "",
631 inserted=inserted,
631 inserted=inserted,
632 deleted=deleted))
632 deleted=deleted))
633
633
634 def contains_commits(self, commits, ancestors=None):
634 def contains_commits(self, commits, ancestors=None):
635 response = self.response
635 response = self.response
636
636
637 for commit in commits:
637 for commit in commits:
638 # Expecting to see the commit message in an element which
638 # Expecting to see the commit message in an element which
639 # has the ID "c-{commit.raw_id}"
639 # has the ID "c-{commit.raw_id}"
640 self.element_contains('#c-' + commit.raw_id, commit.message)
640 self.element_contains('#c-' + commit.raw_id, commit.message)
641 self.contains_one_link(
641 self.contains_one_link(
642 'r%s:%s' % (commit.idx, commit.short_id),
642 'r%s:%s' % (commit.idx, commit.short_id),
643 self._commit_url(commit))
643 self._commit_url(commit))
644 if ancestors:
644 if ancestors:
645 response.mustcontain('Ancestor')
645 response.mustcontain('Ancestor')
646 for ancestor in ancestors:
646 for ancestor in ancestors:
647 self.contains_one_link(
647 self.contains_one_link(
648 ancestor.short_id, self._commit_url(ancestor))
648 ancestor.short_id, self._commit_url(ancestor))
649
649
650 def _commit_url(self, commit):
650 def _commit_url(self, commit):
651 return '/%s/changeset/%s' % (commit.repository.name, commit.raw_id)
651 return '/%s/changeset/%s' % (commit.repository.name, commit.raw_id)
652
652
653 def swap_is_hidden(self):
653 def swap_is_hidden(self):
654 assert '<a id="btn-swap"' not in self.response.text
654 assert '<a id="btn-swap"' not in self.response.text
655
655
656 def swap_is_visible(self):
656 def swap_is_visible(self):
657 assert '<a id="btn-swap"' in self.response.text
657 assert '<a id="btn-swap"' in self.response.text
658
658
659 def target_source_are_disabled(self):
659 def target_source_are_disabled(self):
660 response = self.response
660 response = self.response
661 response.mustcontain("var enable_fields = false;")
661 response.mustcontain("var enable_fields = false;")
662 response.mustcontain('.select2("enable", enable_fields)')
662 response.mustcontain('.select2("enable", enable_fields)')
663
663
664 def target_source_are_enabled(self):
664 def target_source_are_enabled(self):
665 response = self.response
665 response = self.response
666 response.mustcontain("var enable_fields = true;")
666 response.mustcontain("var enable_fields = true;")
@@ -1,1228 +1,1228 b''
1 # -*- coding: utf-8 -*-
1 # -*- coding: utf-8 -*-
2
2
3 # Copyright (C) 2011-2018 RhodeCode GmbH
3 # Copyright (C) 2011-2018 RhodeCode GmbH
4 #
4 #
5 # This program is free software: you can redistribute it and/or modify
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
6 # it under the terms of the GNU Affero General Public License, version 3
7 # (only), as published by the Free Software Foundation.
7 # (only), as published by the Free Software Foundation.
8 #
8 #
9 # This program is distributed in the hope that it will be useful,
9 # This program is distributed in the hope that it will be useful,
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
10 # but WITHOUT ANY WARRANTY; without even the implied warranty of
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
11 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 # GNU General Public License for more details.
12 # GNU General Public License for more details.
13 #
13 #
14 # You should have received a copy of the GNU Affero General Public License
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/>.
15 # along with this program. If not, see <http://www.gnu.org/licenses/>.
16 #
16 #
17 # This program is dual-licensed. If you wish to learn more about the
17 # This program is dual-licensed. If you wish to learn more about the
18 # RhodeCode Enterprise Edition, including its added features, Support services,
18 # RhodeCode Enterprise Edition, including its added features, Support services,
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
21
22 """
22 """
23 Set of diffing helpers, previously part of vcs
23 Set of diffing helpers, previously part of vcs
24 """
24 """
25
25
26 import os
26 import os
27 import re
27 import re
28 import bz2
28 import bz2
29
29
30 import collections
30 import collections
31 import difflib
31 import difflib
32 import logging
32 import logging
33 import cPickle as pickle
33 import cPickle as pickle
34 from itertools import tee, imap
34 from itertools import tee, imap
35
35
36 from rhodecode.lib.vcs.exceptions import VCSError
36 from rhodecode.lib.vcs.exceptions import VCSError
37 from rhodecode.lib.vcs.nodes import FileNode, SubModuleNode
37 from rhodecode.lib.vcs.nodes import FileNode, SubModuleNode
38 from rhodecode.lib.utils2 import safe_unicode, safe_str
38 from rhodecode.lib.utils2 import safe_unicode, safe_str
39
39
40 log = logging.getLogger(__name__)
40 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 = 1024 * 1014
45
45
46
46
47 class OPS(object):
47 class OPS(object):
48 ADD = 'A'
48 ADD = 'A'
49 MOD = 'M'
49 MOD = 'M'
50 DEL = 'D'
50 DEL = 'D'
51
51
52
52
53 def get_gitdiff(filenode_old, filenode_new, ignore_whitespace=True, context=3):
53 def get_gitdiff(filenode_old, filenode_new, ignore_whitespace=True, context=3):
54 """
54 """
55 Returns git style diff between given ``filenode_old`` and ``filenode_new``.
55 Returns git style diff between given ``filenode_old`` and ``filenode_new``.
56
56
57 :param ignore_whitespace: ignore whitespaces in diff
57 :param ignore_whitespace: ignore whitespaces in diff
58 """
58 """
59 # make sure we pass in default context
59 # make sure we pass in default context
60 context = context or 3
60 context = context or 3
61 # protect against IntOverflow when passing HUGE context
61 # protect against IntOverflow when passing HUGE context
62 if context > MAX_CONTEXT:
62 if context > MAX_CONTEXT:
63 context = MAX_CONTEXT
63 context = MAX_CONTEXT
64
64
65 submodules = filter(lambda o: isinstance(o, SubModuleNode),
65 submodules = filter(lambda o: isinstance(o, SubModuleNode),
66 [filenode_new, filenode_old])
66 [filenode_new, filenode_old])
67 if submodules:
67 if submodules:
68 return ''
68 return ''
69
69
70 for filenode in (filenode_old, filenode_new):
70 for filenode in (filenode_old, filenode_new):
71 if not isinstance(filenode, FileNode):
71 if not isinstance(filenode, FileNode):
72 raise VCSError(
72 raise VCSError(
73 "Given object should be FileNode object, not %s"
73 "Given object should be FileNode object, not %s"
74 % filenode.__class__)
74 % filenode.__class__)
75
75
76 repo = filenode_new.commit.repository
76 repo = filenode_new.commit.repository
77 old_commit = filenode_old.commit or repo.EMPTY_COMMIT
77 old_commit = filenode_old.commit or repo.EMPTY_COMMIT
78 new_commit = filenode_new.commit
78 new_commit = filenode_new.commit
79
79
80 vcs_gitdiff = repo.get_diff(
80 vcs_gitdiff = repo.get_diff(
81 old_commit, new_commit, filenode_new.path,
81 old_commit, new_commit, filenode_new.path,
82 ignore_whitespace, context, path1=filenode_old.path)
82 ignore_whitespace, context, path1=filenode_old.path)
83 return vcs_gitdiff
83 return vcs_gitdiff
84
84
85 NEW_FILENODE = 1
85 NEW_FILENODE = 1
86 DEL_FILENODE = 2
86 DEL_FILENODE = 2
87 MOD_FILENODE = 3
87 MOD_FILENODE = 3
88 RENAMED_FILENODE = 4
88 RENAMED_FILENODE = 4
89 COPIED_FILENODE = 5
89 COPIED_FILENODE = 5
90 CHMOD_FILENODE = 6
90 CHMOD_FILENODE = 6
91 BIN_FILENODE = 7
91 BIN_FILENODE = 7
92
92
93
93
94 class LimitedDiffContainer(object):
94 class LimitedDiffContainer(object):
95
95
96 def __init__(self, diff_limit, cur_diff_size, diff):
96 def __init__(self, diff_limit, cur_diff_size, diff):
97 self.diff = diff
97 self.diff = diff
98 self.diff_limit = diff_limit
98 self.diff_limit = diff_limit
99 self.cur_diff_size = cur_diff_size
99 self.cur_diff_size = cur_diff_size
100
100
101 def __getitem__(self, key):
101 def __getitem__(self, key):
102 return self.diff.__getitem__(key)
102 return self.diff.__getitem__(key)
103
103
104 def __iter__(self):
104 def __iter__(self):
105 for l in self.diff:
105 for l in self.diff:
106 yield l
106 yield l
107
107
108
108
109 class Action(object):
109 class Action(object):
110 """
110 """
111 Contains constants for the action value of the lines in a parsed diff.
111 Contains constants for the action value of the lines in a parsed diff.
112 """
112 """
113
113
114 ADD = 'add'
114 ADD = 'add'
115 DELETE = 'del'
115 DELETE = 'del'
116 UNMODIFIED = 'unmod'
116 UNMODIFIED = 'unmod'
117
117
118 CONTEXT = 'context'
118 CONTEXT = 'context'
119 OLD_NO_NL = 'old-no-nl'
119 OLD_NO_NL = 'old-no-nl'
120 NEW_NO_NL = 'new-no-nl'
120 NEW_NO_NL = 'new-no-nl'
121
121
122
122
123 class DiffProcessor(object):
123 class DiffProcessor(object):
124 """
124 """
125 Give it a unified or git diff and it returns a list of the files that were
125 Give it a unified or git diff and it returns a list of the files that were
126 mentioned in the diff together with a dict of meta information that
126 mentioned in the diff together with a dict of meta information that
127 can be used to render it in a HTML template.
127 can be used to render it in a HTML template.
128
128
129 .. note:: Unicode handling
129 .. note:: Unicode handling
130
130
131 The original diffs are a byte sequence and can contain filenames
131 The original diffs are a byte sequence and can contain filenames
132 in mixed encodings. This class generally returns `unicode` objects
132 in mixed encodings. This class generally returns `unicode` objects
133 since the result is intended for presentation to the user.
133 since the result is intended for presentation to the user.
134
134
135 """
135 """
136 _chunk_re = re.compile(r'^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)')
136 _chunk_re = re.compile(r'^@@ -(\d+)(?:,(\d+))? \+(\d+)(?:,(\d+))? @@(.*)')
137 _newline_marker = re.compile(r'^\\ No newline at end of file')
137 _newline_marker = re.compile(r'^\\ No newline at end of file')
138
138
139 # used for inline highlighter word split
139 # used for inline highlighter word split
140 _token_re = re.compile(r'()(&gt;|&lt;|&amp;|\W+?)')
140 _token_re = re.compile(r'()(&gt;|&lt;|&amp;|\W+?)')
141
141
142 # collapse ranges of commits over given number
142 # collapse ranges of commits over given number
143 _collapse_commits_over = 5
143 _collapse_commits_over = 5
144
144
145 def __init__(self, diff, format='gitdiff', diff_limit=None,
145 def __init__(self, diff, format='gitdiff', diff_limit=None,
146 file_limit=None, show_full_diff=True):
146 file_limit=None, show_full_diff=True):
147 """
147 """
148 :param diff: A `Diff` object representing a diff from a vcs backend
148 :param diff: A `Diff` object representing a diff from a vcs backend
149 :param format: format of diff passed, `udiff` or `gitdiff`
149 :param format: format of diff passed, `udiff` or `gitdiff`
150 :param diff_limit: define the size of diff that is considered "big"
150 :param diff_limit: define the size of diff that is considered "big"
151 based on that parameter cut off will be triggered, set to None
151 based on that parameter cut off will be triggered, set to None
152 to show full diff
152 to show full diff
153 """
153 """
154 self._diff = diff
154 self._diff = diff
155 self._format = format
155 self._format = format
156 self.adds = 0
156 self.adds = 0
157 self.removes = 0
157 self.removes = 0
158 # calculate diff size
158 # calculate diff size
159 self.diff_limit = diff_limit
159 self.diff_limit = diff_limit
160 self.file_limit = file_limit
160 self.file_limit = file_limit
161 self.show_full_diff = show_full_diff
161 self.show_full_diff = show_full_diff
162 self.cur_diff_size = 0
162 self.cur_diff_size = 0
163 self.parsed = False
163 self.parsed = False
164 self.parsed_diff = []
164 self.parsed_diff = []
165
165
166 log.debug('Initialized DiffProcessor with %s mode', format)
166 log.debug('Initialized DiffProcessor with %s mode', format)
167 if format == 'gitdiff':
167 if format == 'gitdiff':
168 self.differ = self._highlight_line_difflib
168 self.differ = self._highlight_line_difflib
169 self._parser = self._parse_gitdiff
169 self._parser = self._parse_gitdiff
170 else:
170 else:
171 self.differ = self._highlight_line_udiff
171 self.differ = self._highlight_line_udiff
172 self._parser = self._new_parse_gitdiff
172 self._parser = self._new_parse_gitdiff
173
173
174 def _copy_iterator(self):
174 def _copy_iterator(self):
175 """
175 """
176 make a fresh copy of generator, we should not iterate thru
176 make a fresh copy of generator, we should not iterate thru
177 an original as it's needed for repeating operations on
177 an original as it's needed for repeating operations on
178 this instance of DiffProcessor
178 this instance of DiffProcessor
179 """
179 """
180 self.__udiff, iterator_copy = tee(self.__udiff)
180 self.__udiff, iterator_copy = tee(self.__udiff)
181 return iterator_copy
181 return iterator_copy
182
182
183 def _escaper(self, string):
183 def _escaper(self, string):
184 """
184 """
185 Escaper for diff escapes special chars and checks the diff limit
185 Escaper for diff escapes special chars and checks the diff limit
186
186
187 :param string:
187 :param string:
188 """
188 """
189 self.cur_diff_size += len(string)
189 self.cur_diff_size += len(string)
190
190
191 if not self.show_full_diff and (self.cur_diff_size > self.diff_limit):
191 if not self.show_full_diff and (self.cur_diff_size > self.diff_limit):
192 raise DiffLimitExceeded('Diff Limit Exceeded')
192 raise DiffLimitExceeded('Diff Limit Exceeded')
193
193
194 return string \
194 return string \
195 .replace('&', '&amp;')\
195 .replace('&', '&amp;')\
196 .replace('<', '&lt;')\
196 .replace('<', '&lt;')\
197 .replace('>', '&gt;')
197 .replace('>', '&gt;')
198
198
199 def _line_counter(self, l):
199 def _line_counter(self, l):
200 """
200 """
201 Checks each line and bumps total adds/removes for this diff
201 Checks each line and bumps total adds/removes for this diff
202
202
203 :param l:
203 :param l:
204 """
204 """
205 if l.startswith('+') and not l.startswith('+++'):
205 if l.startswith('+') and not l.startswith('+++'):
206 self.adds += 1
206 self.adds += 1
207 elif l.startswith('-') and not l.startswith('---'):
207 elif l.startswith('-') and not l.startswith('---'):
208 self.removes += 1
208 self.removes += 1
209 return safe_unicode(l)
209 return safe_unicode(l)
210
210
211 def _highlight_line_difflib(self, line, next_):
211 def _highlight_line_difflib(self, line, next_):
212 """
212 """
213 Highlight inline changes in both lines.
213 Highlight inline changes in both lines.
214 """
214 """
215
215
216 if line['action'] == Action.DELETE:
216 if line['action'] == Action.DELETE:
217 old, new = line, next_
217 old, new = line, next_
218 else:
218 else:
219 old, new = next_, line
219 old, new = next_, line
220
220
221 oldwords = self._token_re.split(old['line'])
221 oldwords = self._token_re.split(old['line'])
222 newwords = self._token_re.split(new['line'])
222 newwords = self._token_re.split(new['line'])
223 sequence = difflib.SequenceMatcher(None, oldwords, newwords)
223 sequence = difflib.SequenceMatcher(None, oldwords, newwords)
224
224
225 oldfragments, newfragments = [], []
225 oldfragments, newfragments = [], []
226 for tag, i1, i2, j1, j2 in sequence.get_opcodes():
226 for tag, i1, i2, j1, j2 in sequence.get_opcodes():
227 oldfrag = ''.join(oldwords[i1:i2])
227 oldfrag = ''.join(oldwords[i1:i2])
228 newfrag = ''.join(newwords[j1:j2])
228 newfrag = ''.join(newwords[j1:j2])
229 if tag != 'equal':
229 if tag != 'equal':
230 if oldfrag:
230 if oldfrag:
231 oldfrag = '<del>%s</del>' % oldfrag
231 oldfrag = '<del>%s</del>' % oldfrag
232 if newfrag:
232 if newfrag:
233 newfrag = '<ins>%s</ins>' % newfrag
233 newfrag = '<ins>%s</ins>' % newfrag
234 oldfragments.append(oldfrag)
234 oldfragments.append(oldfrag)
235 newfragments.append(newfrag)
235 newfragments.append(newfrag)
236
236
237 old['line'] = "".join(oldfragments)
237 old['line'] = "".join(oldfragments)
238 new['line'] = "".join(newfragments)
238 new['line'] = "".join(newfragments)
239
239
240 def _highlight_line_udiff(self, line, next_):
240 def _highlight_line_udiff(self, line, next_):
241 """
241 """
242 Highlight inline changes in both lines.
242 Highlight inline changes in both lines.
243 """
243 """
244 start = 0
244 start = 0
245 limit = min(len(line['line']), len(next_['line']))
245 limit = min(len(line['line']), len(next_['line']))
246 while start < limit and line['line'][start] == next_['line'][start]:
246 while start < limit and line['line'][start] == next_['line'][start]:
247 start += 1
247 start += 1
248 end = -1
248 end = -1
249 limit -= start
249 limit -= start
250 while -end <= limit and line['line'][end] == next_['line'][end]:
250 while -end <= limit and line['line'][end] == next_['line'][end]:
251 end -= 1
251 end -= 1
252 end += 1
252 end += 1
253 if start or end:
253 if start or end:
254 def do(l):
254 def do(l):
255 last = end + len(l['line'])
255 last = end + len(l['line'])
256 if l['action'] == Action.ADD:
256 if l['action'] == Action.ADD:
257 tag = 'ins'
257 tag = 'ins'
258 else:
258 else:
259 tag = 'del'
259 tag = 'del'
260 l['line'] = '%s<%s>%s</%s>%s' % (
260 l['line'] = '%s<%s>%s</%s>%s' % (
261 l['line'][:start],
261 l['line'][:start],
262 tag,
262 tag,
263 l['line'][start:last],
263 l['line'][start:last],
264 tag,
264 tag,
265 l['line'][last:]
265 l['line'][last:]
266 )
266 )
267 do(line)
267 do(line)
268 do(next_)
268 do(next_)
269
269
270 def _clean_line(self, line, command):
270 def _clean_line(self, line, command):
271 if command in ['+', '-', ' ']:
271 if command in ['+', '-', ' ']:
272 # only modify the line if it's actually a diff thing
272 # only modify the line if it's actually a diff thing
273 line = line[1:]
273 line = line[1:]
274 return line
274 return line
275
275
276 def _parse_gitdiff(self, inline_diff=True):
276 def _parse_gitdiff(self, inline_diff=True):
277 _files = []
277 _files = []
278 diff_container = lambda arg: arg
278 diff_container = lambda arg: arg
279
279
280 for chunk in self._diff.chunks():
280 for chunk in self._diff.chunks():
281 head = chunk.header
281 head = chunk.header
282
282
283 diff = imap(self._escaper, self.diff_splitter(chunk.diff))
283 diff = imap(self._escaper, self.diff_splitter(chunk.diff))
284 raw_diff = chunk.raw
284 raw_diff = chunk.raw
285 limited_diff = False
285 limited_diff = False
286 exceeds_limit = False
286 exceeds_limit = False
287
287
288 op = None
288 op = None
289 stats = {
289 stats = {
290 'added': 0,
290 'added': 0,
291 'deleted': 0,
291 'deleted': 0,
292 'binary': False,
292 'binary': False,
293 'ops': {},
293 'ops': {},
294 }
294 }
295
295
296 if head['deleted_file_mode']:
296 if head['deleted_file_mode']:
297 op = OPS.DEL
297 op = OPS.DEL
298 stats['binary'] = True
298 stats['binary'] = True
299 stats['ops'][DEL_FILENODE] = 'deleted file'
299 stats['ops'][DEL_FILENODE] = 'deleted file'
300
300
301 elif head['new_file_mode']:
301 elif head['new_file_mode']:
302 op = OPS.ADD
302 op = OPS.ADD
303 stats['binary'] = True
303 stats['binary'] = True
304 stats['ops'][NEW_FILENODE] = 'new file %s' % head['new_file_mode']
304 stats['ops'][NEW_FILENODE] = 'new file %s' % head['new_file_mode']
305 else: # modify operation, can be copy, rename or chmod
305 else: # modify operation, can be copy, rename or chmod
306
306
307 # CHMOD
307 # CHMOD
308 if head['new_mode'] and head['old_mode']:
308 if head['new_mode'] and head['old_mode']:
309 op = OPS.MOD
309 op = OPS.MOD
310 stats['binary'] = True
310 stats['binary'] = True
311 stats['ops'][CHMOD_FILENODE] = (
311 stats['ops'][CHMOD_FILENODE] = (
312 'modified file chmod %s => %s' % (
312 'modified file chmod %s => %s' % (
313 head['old_mode'], head['new_mode']))
313 head['old_mode'], head['new_mode']))
314 # RENAME
314 # RENAME
315 if head['rename_from'] != head['rename_to']:
315 if head['rename_from'] != head['rename_to']:
316 op = OPS.MOD
316 op = OPS.MOD
317 stats['binary'] = True
317 stats['binary'] = True
318 stats['ops'][RENAMED_FILENODE] = (
318 stats['ops'][RENAMED_FILENODE] = (
319 'file renamed from %s to %s' % (
319 'file renamed from %s to %s' % (
320 head['rename_from'], head['rename_to']))
320 head['rename_from'], head['rename_to']))
321 # COPY
321 # COPY
322 if head.get('copy_from') and head.get('copy_to'):
322 if head.get('copy_from') and head.get('copy_to'):
323 op = OPS.MOD
323 op = OPS.MOD
324 stats['binary'] = True
324 stats['binary'] = True
325 stats['ops'][COPIED_FILENODE] = (
325 stats['ops'][COPIED_FILENODE] = (
326 'file copied from %s to %s' % (
326 'file copied from %s to %s' % (
327 head['copy_from'], head['copy_to']))
327 head['copy_from'], head['copy_to']))
328
328
329 # If our new parsed headers didn't match anything fallback to
329 # If our new parsed headers didn't match anything fallback to
330 # old style detection
330 # old style detection
331 if op is None:
331 if op is None:
332 if not head['a_file'] and head['b_file']:
332 if not head['a_file'] and head['b_file']:
333 op = OPS.ADD
333 op = OPS.ADD
334 stats['binary'] = True
334 stats['binary'] = True
335 stats['ops'][NEW_FILENODE] = 'new file'
335 stats['ops'][NEW_FILENODE] = 'new file'
336
336
337 elif head['a_file'] and not head['b_file']:
337 elif head['a_file'] and not head['b_file']:
338 op = OPS.DEL
338 op = OPS.DEL
339 stats['binary'] = True
339 stats['binary'] = True
340 stats['ops'][DEL_FILENODE] = 'deleted file'
340 stats['ops'][DEL_FILENODE] = 'deleted file'
341
341
342 # it's not ADD not DELETE
342 # it's not ADD not DELETE
343 if op is None:
343 if op is None:
344 op = OPS.MOD
344 op = OPS.MOD
345 stats['binary'] = True
345 stats['binary'] = True
346 stats['ops'][MOD_FILENODE] = 'modified file'
346 stats['ops'][MOD_FILENODE] = 'modified file'
347
347
348 # a real non-binary diff
348 # a real non-binary diff
349 if head['a_file'] or head['b_file']:
349 if head['a_file'] or head['b_file']:
350 try:
350 try:
351 raw_diff, chunks, _stats = self._parse_lines(diff)
351 raw_diff, chunks, _stats = self._parse_lines(diff)
352 stats['binary'] = False
352 stats['binary'] = False
353 stats['added'] = _stats[0]
353 stats['added'] = _stats[0]
354 stats['deleted'] = _stats[1]
354 stats['deleted'] = _stats[1]
355 # explicit mark that it's a modified file
355 # explicit mark that it's a modified file
356 if op == OPS.MOD:
356 if op == OPS.MOD:
357 stats['ops'][MOD_FILENODE] = 'modified file'
357 stats['ops'][MOD_FILENODE] = 'modified file'
358 exceeds_limit = len(raw_diff) > self.file_limit
358 exceeds_limit = len(raw_diff) > self.file_limit
359
359
360 # changed from _escaper function so we validate size of
360 # changed from _escaper function so we validate size of
361 # each file instead of the whole diff
361 # each file instead of the whole diff
362 # diff will hide big files but still show small ones
362 # diff will hide big files but still show small ones
363 # from my tests, big files are fairly safe to be parsed
363 # from my tests, big files are fairly safe to be parsed
364 # but the browser is the bottleneck
364 # but the browser is the bottleneck
365 if not self.show_full_diff and exceeds_limit:
365 if not self.show_full_diff and exceeds_limit:
366 raise DiffLimitExceeded('File Limit Exceeded')
366 raise DiffLimitExceeded('File Limit Exceeded')
367
367
368 except DiffLimitExceeded:
368 except DiffLimitExceeded:
369 diff_container = lambda _diff: \
369 diff_container = lambda _diff: \
370 LimitedDiffContainer(
370 LimitedDiffContainer(
371 self.diff_limit, self.cur_diff_size, _diff)
371 self.diff_limit, self.cur_diff_size, _diff)
372
372
373 exceeds_limit = len(raw_diff) > self.file_limit
373 exceeds_limit = len(raw_diff) > self.file_limit
374 limited_diff = True
374 limited_diff = True
375 chunks = []
375 chunks = []
376
376
377 else: # GIT format binary patch, or possibly empty diff
377 else: # GIT format binary patch, or possibly empty diff
378 if head['bin_patch']:
378 if head['bin_patch']:
379 # we have operation already extracted, but we mark simply
379 # we have operation already extracted, but we mark simply
380 # it's a diff we wont show for binary files
380 # it's a diff we wont show for binary files
381 stats['ops'][BIN_FILENODE] = 'binary diff hidden'
381 stats['ops'][BIN_FILENODE] = 'binary diff hidden'
382 chunks = []
382 chunks = []
383
383
384 if chunks and not self.show_full_diff and op == OPS.DEL:
384 if chunks and not self.show_full_diff and op == OPS.DEL:
385 # if not full diff mode show deleted file contents
385 # if not full diff mode show deleted file contents
386 # TODO: anderson: if the view is not too big, there is no way
386 # TODO: anderson: if the view is not too big, there is no way
387 # to see the content of the file
387 # to see the content of the file
388 chunks = []
388 chunks = []
389
389
390 chunks.insert(0, [{
390 chunks.insert(0, [{
391 'old_lineno': '',
391 'old_lineno': '',
392 'new_lineno': '',
392 'new_lineno': '',
393 'action': Action.CONTEXT,
393 'action': Action.CONTEXT,
394 'line': msg,
394 'line': msg,
395 } for _op, msg in stats['ops'].iteritems()
395 } for _op, msg in stats['ops'].iteritems()
396 if _op not in [MOD_FILENODE]])
396 if _op not in [MOD_FILENODE]])
397
397
398 _files.append({
398 _files.append({
399 'filename': safe_unicode(head['b_path']),
399 'filename': safe_unicode(head['b_path']),
400 'old_revision': head['a_blob_id'],
400 'old_revision': head['a_blob_id'],
401 'new_revision': head['b_blob_id'],
401 'new_revision': head['b_blob_id'],
402 'chunks': chunks,
402 'chunks': chunks,
403 'raw_diff': safe_unicode(raw_diff),
403 'raw_diff': safe_unicode(raw_diff),
404 'operation': op,
404 'operation': op,
405 'stats': stats,
405 'stats': stats,
406 'exceeds_limit': exceeds_limit,
406 'exceeds_limit': exceeds_limit,
407 'is_limited_diff': limited_diff,
407 'is_limited_diff': limited_diff,
408 })
408 })
409
409
410 sorter = lambda info: {OPS.ADD: 0, OPS.MOD: 1,
410 sorter = lambda info: {OPS.ADD: 0, OPS.MOD: 1,
411 OPS.DEL: 2}.get(info['operation'])
411 OPS.DEL: 2}.get(info['operation'])
412
412
413 if not inline_diff:
413 if not inline_diff:
414 return diff_container(sorted(_files, key=sorter))
414 return diff_container(sorted(_files, key=sorter))
415
415
416 # highlight inline changes
416 # highlight inline changes
417 for diff_data in _files:
417 for diff_data in _files:
418 for chunk in diff_data['chunks']:
418 for chunk in diff_data['chunks']:
419 lineiter = iter(chunk)
419 lineiter = iter(chunk)
420 try:
420 try:
421 while 1:
421 while 1:
422 line = lineiter.next()
422 line = lineiter.next()
423 if line['action'] not in (
423 if line['action'] not in (
424 Action.UNMODIFIED, Action.CONTEXT):
424 Action.UNMODIFIED, Action.CONTEXT):
425 nextline = lineiter.next()
425 nextline = lineiter.next()
426 if nextline['action'] in ['unmod', 'context'] or \
426 if nextline['action'] in ['unmod', 'context'] or \
427 nextline['action'] == line['action']:
427 nextline['action'] == line['action']:
428 continue
428 continue
429 self.differ(line, nextline)
429 self.differ(line, nextline)
430 except StopIteration:
430 except StopIteration:
431 pass
431 pass
432
432
433 return diff_container(sorted(_files, key=sorter))
433 return diff_container(sorted(_files, key=sorter))
434
434
435 def _check_large_diff(self):
435 def _check_large_diff(self):
436 log.debug('Diff exceeds current diff_limit of %s', self.diff_limit)
436 log.debug('Diff exceeds current diff_limit of %s', self.diff_limit)
437 if not self.show_full_diff and (self.cur_diff_size > self.diff_limit):
437 if not self.show_full_diff and (self.cur_diff_size > self.diff_limit):
438 raise DiffLimitExceeded('Diff Limit `%s` Exceeded', self.diff_limit)
438 raise DiffLimitExceeded('Diff Limit `%s` Exceeded', self.diff_limit)
439
439
440 # FIXME: NEWDIFFS: dan: this replaces _parse_gitdiff
440 # FIXME: NEWDIFFS: dan: this replaces _parse_gitdiff
441 def _new_parse_gitdiff(self, inline_diff=True):
441 def _new_parse_gitdiff(self, inline_diff=True):
442 _files = []
442 _files = []
443
443
444 # this can be overriden later to a LimitedDiffContainer type
444 # this can be overriden later to a LimitedDiffContainer type
445 diff_container = lambda arg: arg
445 diff_container = lambda arg: arg
446
446
447 for chunk in self._diff.chunks():
447 for chunk in self._diff.chunks():
448 head = chunk.header
448 head = chunk.header
449 log.debug('parsing diff %r', head)
449 log.debug('parsing diff %r', head)
450
450
451 raw_diff = chunk.raw
451 raw_diff = chunk.raw
452 limited_diff = False
452 limited_diff = False
453 exceeds_limit = False
453 exceeds_limit = False
454
454
455 op = None
455 op = None
456 stats = {
456 stats = {
457 'added': 0,
457 'added': 0,
458 'deleted': 0,
458 'deleted': 0,
459 'binary': False,
459 'binary': False,
460 'old_mode': None,
460 'old_mode': None,
461 'new_mode': None,
461 'new_mode': None,
462 'ops': {},
462 'ops': {},
463 }
463 }
464 if head['old_mode']:
464 if head['old_mode']:
465 stats['old_mode'] = head['old_mode']
465 stats['old_mode'] = head['old_mode']
466 if head['new_mode']:
466 if head['new_mode']:
467 stats['new_mode'] = head['new_mode']
467 stats['new_mode'] = head['new_mode']
468 if head['b_mode']:
468 if head['b_mode']:
469 stats['new_mode'] = head['b_mode']
469 stats['new_mode'] = head['b_mode']
470
470
471 # delete file
471 # delete file
472 if head['deleted_file_mode']:
472 if head['deleted_file_mode']:
473 op = OPS.DEL
473 op = OPS.DEL
474 stats['binary'] = True
474 stats['binary'] = True
475 stats['ops'][DEL_FILENODE] = 'deleted file'
475 stats['ops'][DEL_FILENODE] = 'deleted file'
476
476
477 # new file
477 # new file
478 elif head['new_file_mode']:
478 elif head['new_file_mode']:
479 op = OPS.ADD
479 op = OPS.ADD
480 stats['binary'] = True
480 stats['binary'] = True
481 stats['old_mode'] = None
481 stats['old_mode'] = None
482 stats['new_mode'] = head['new_file_mode']
482 stats['new_mode'] = head['new_file_mode']
483 stats['ops'][NEW_FILENODE] = 'new file %s' % head['new_file_mode']
483 stats['ops'][NEW_FILENODE] = 'new file %s' % head['new_file_mode']
484
484
485 # modify operation, can be copy, rename or chmod
485 # modify operation, can be copy, rename or chmod
486 else:
486 else:
487 # CHMOD
487 # CHMOD
488 if head['new_mode'] and head['old_mode']:
488 if head['new_mode'] and head['old_mode']:
489 op = OPS.MOD
489 op = OPS.MOD
490 stats['binary'] = True
490 stats['binary'] = True
491 stats['ops'][CHMOD_FILENODE] = (
491 stats['ops'][CHMOD_FILENODE] = (
492 'modified file chmod %s => %s' % (
492 'modified file chmod %s => %s' % (
493 head['old_mode'], head['new_mode']))
493 head['old_mode'], head['new_mode']))
494
494
495 # RENAME
495 # RENAME
496 if head['rename_from'] != head['rename_to']:
496 if head['rename_from'] != head['rename_to']:
497 op = OPS.MOD
497 op = OPS.MOD
498 stats['binary'] = True
498 stats['binary'] = True
499 stats['renamed'] = (head['rename_from'], head['rename_to'])
499 stats['renamed'] = (head['rename_from'], head['rename_to'])
500 stats['ops'][RENAMED_FILENODE] = (
500 stats['ops'][RENAMED_FILENODE] = (
501 'file renamed from %s to %s' % (
501 'file renamed from %s to %s' % (
502 head['rename_from'], head['rename_to']))
502 head['rename_from'], head['rename_to']))
503 # COPY
503 # COPY
504 if head.get('copy_from') and head.get('copy_to'):
504 if head.get('copy_from') and head.get('copy_to'):
505 op = OPS.MOD
505 op = OPS.MOD
506 stats['binary'] = True
506 stats['binary'] = True
507 stats['copied'] = (head['copy_from'], head['copy_to'])
507 stats['copied'] = (head['copy_from'], head['copy_to'])
508 stats['ops'][COPIED_FILENODE] = (
508 stats['ops'][COPIED_FILENODE] = (
509 'file copied from %s to %s' % (
509 'file copied from %s to %s' % (
510 head['copy_from'], head['copy_to']))
510 head['copy_from'], head['copy_to']))
511
511
512 # If our new parsed headers didn't match anything fallback to
512 # If our new parsed headers didn't match anything fallback to
513 # old style detection
513 # old style detection
514 if op is None:
514 if op is None:
515 if not head['a_file'] and head['b_file']:
515 if not head['a_file'] and head['b_file']:
516 op = OPS.ADD
516 op = OPS.ADD
517 stats['binary'] = True
517 stats['binary'] = True
518 stats['new_file'] = True
518 stats['new_file'] = True
519 stats['ops'][NEW_FILENODE] = 'new file'
519 stats['ops'][NEW_FILENODE] = 'new file'
520
520
521 elif head['a_file'] and not head['b_file']:
521 elif head['a_file'] and not head['b_file']:
522 op = OPS.DEL
522 op = OPS.DEL
523 stats['binary'] = True
523 stats['binary'] = True
524 stats['ops'][DEL_FILENODE] = 'deleted file'
524 stats['ops'][DEL_FILENODE] = 'deleted file'
525
525
526 # it's not ADD not DELETE
526 # it's not ADD not DELETE
527 if op is None:
527 if op is None:
528 op = OPS.MOD
528 op = OPS.MOD
529 stats['binary'] = True
529 stats['binary'] = True
530 stats['ops'][MOD_FILENODE] = 'modified file'
530 stats['ops'][MOD_FILENODE] = 'modified file'
531
531
532 # a real non-binary diff
532 # a real non-binary diff
533 if head['a_file'] or head['b_file']:
533 if head['a_file'] or head['b_file']:
534 # simulate splitlines, so we keep the line end part
534 # simulate splitlines, so we keep the line end part
535 diff = self.diff_splitter(chunk.diff)
535 diff = self.diff_splitter(chunk.diff)
536
536
537 # append each file to the diff size
537 # append each file to the diff size
538 raw_chunk_size = len(raw_diff)
538 raw_chunk_size = len(raw_diff)
539
539
540 exceeds_limit = raw_chunk_size > self.file_limit
540 exceeds_limit = raw_chunk_size > self.file_limit
541 self.cur_diff_size += raw_chunk_size
541 self.cur_diff_size += raw_chunk_size
542
542
543 try:
543 try:
544 # Check each file instead of the whole diff.
544 # Check each file instead of the whole diff.
545 # Diff will hide big files but still show small ones.
545 # Diff will hide big files but still show small ones.
546 # From the tests big files are fairly safe to be parsed
546 # From the tests big files are fairly safe to be parsed
547 # but the browser is the bottleneck.
547 # but the browser is the bottleneck.
548 if not self.show_full_diff and exceeds_limit:
548 if not self.show_full_diff and exceeds_limit:
549 log.debug('File `%s` exceeds current file_limit of %s',
549 log.debug('File `%s` exceeds current file_limit of %s',
550 safe_unicode(head['b_path']), self.file_limit)
550 safe_unicode(head['b_path']), self.file_limit)
551 raise DiffLimitExceeded(
551 raise DiffLimitExceeded(
552 'File Limit %s Exceeded', self.file_limit)
552 'File Limit %s Exceeded', self.file_limit)
553
553
554 self._check_large_diff()
554 self._check_large_diff()
555
555
556 raw_diff, chunks, _stats = self._new_parse_lines(diff)
556 raw_diff, chunks, _stats = self._new_parse_lines(diff)
557 stats['binary'] = False
557 stats['binary'] = False
558 stats['added'] = _stats[0]
558 stats['added'] = _stats[0]
559 stats['deleted'] = _stats[1]
559 stats['deleted'] = _stats[1]
560 # explicit mark that it's a modified file
560 # explicit mark that it's a modified file
561 if op == OPS.MOD:
561 if op == OPS.MOD:
562 stats['ops'][MOD_FILENODE] = 'modified file'
562 stats['ops'][MOD_FILENODE] = 'modified file'
563
563
564 except DiffLimitExceeded:
564 except DiffLimitExceeded:
565 diff_container = lambda _diff: \
565 diff_container = lambda _diff: \
566 LimitedDiffContainer(
566 LimitedDiffContainer(
567 self.diff_limit, self.cur_diff_size, _diff)
567 self.diff_limit, self.cur_diff_size, _diff)
568
568
569 limited_diff = True
569 limited_diff = True
570 chunks = []
570 chunks = []
571
571
572 else: # GIT format binary patch, or possibly empty diff
572 else: # GIT format binary patch, or possibly empty diff
573 if head['bin_patch']:
573 if head['bin_patch']:
574 # we have operation already extracted, but we mark simply
574 # we have operation already extracted, but we mark simply
575 # it's a diff we wont show for binary files
575 # it's a diff we wont show for binary files
576 stats['ops'][BIN_FILENODE] = 'binary diff hidden'
576 stats['ops'][BIN_FILENODE] = 'binary diff hidden'
577 chunks = []
577 chunks = []
578
578
579 # Hide content of deleted node by setting empty chunks
579 # Hide content of deleted node by setting empty chunks
580 if chunks and not self.show_full_diff and op == OPS.DEL:
580 if chunks and not self.show_full_diff and op == OPS.DEL:
581 # if not full diff mode show deleted file contents
581 # if not full diff mode show deleted file contents
582 # TODO: anderson: if the view is not too big, there is no way
582 # TODO: anderson: if the view is not too big, there is no way
583 # to see the content of the file
583 # to see the content of the file
584 chunks = []
584 chunks = []
585
585
586 chunks.insert(
586 chunks.insert(
587 0, [{'old_lineno': '',
587 0, [{'old_lineno': '',
588 'new_lineno': '',
588 'new_lineno': '',
589 'action': Action.CONTEXT,
589 'action': Action.CONTEXT,
590 'line': msg,
590 'line': msg,
591 } for _op, msg in stats['ops'].iteritems()
591 } for _op, msg in stats['ops'].iteritems()
592 if _op not in [MOD_FILENODE]])
592 if _op not in [MOD_FILENODE]])
593
593
594 original_filename = safe_unicode(head['a_path'])
594 original_filename = safe_unicode(head['a_path'])
595 _files.append({
595 _files.append({
596 'original_filename': original_filename,
596 'original_filename': original_filename,
597 'filename': safe_unicode(head['b_path']),
597 'filename': safe_unicode(head['b_path']),
598 'old_revision': head['a_blob_id'],
598 'old_revision': head['a_blob_id'],
599 'new_revision': head['b_blob_id'],
599 'new_revision': head['b_blob_id'],
600 'chunks': chunks,
600 'chunks': chunks,
601 'raw_diff': safe_unicode(raw_diff),
601 'raw_diff': safe_unicode(raw_diff),
602 'operation': op,
602 'operation': op,
603 'stats': stats,
603 'stats': stats,
604 'exceeds_limit': exceeds_limit,
604 'exceeds_limit': exceeds_limit,
605 'is_limited_diff': limited_diff,
605 'is_limited_diff': limited_diff,
606 })
606 })
607
607
608 sorter = lambda info: {OPS.ADD: 0, OPS.MOD: 1,
608 sorter = lambda info: {OPS.ADD: 0, OPS.MOD: 1,
609 OPS.DEL: 2}.get(info['operation'])
609 OPS.DEL: 2}.get(info['operation'])
610
610
611 return diff_container(sorted(_files, key=sorter))
611 return diff_container(sorted(_files, key=sorter))
612
612
613 # FIXME: NEWDIFFS: dan: this gets replaced by _new_parse_lines
613 # FIXME: NEWDIFFS: dan: this gets replaced by _new_parse_lines
614 def _parse_lines(self, diff_iter):
614 def _parse_lines(self, diff_iter):
615 """
615 """
616 Parse the diff an return data for the template.
616 Parse the diff an return data for the template.
617 """
617 """
618
618
619 stats = [0, 0]
619 stats = [0, 0]
620 chunks = []
620 chunks = []
621 raw_diff = []
621 raw_diff = []
622
622
623 try:
623 try:
624 line = diff_iter.next()
624 line = diff_iter.next()
625
625
626 while line:
626 while line:
627 raw_diff.append(line)
627 raw_diff.append(line)
628 lines = []
628 lines = []
629 chunks.append(lines)
629 chunks.append(lines)
630
630
631 match = self._chunk_re.match(line)
631 match = self._chunk_re.match(line)
632
632
633 if not match:
633 if not match:
634 break
634 break
635
635
636 gr = match.groups()
636 gr = match.groups()
637 (old_line, old_end,
637 (old_line, old_end,
638 new_line, new_end) = [int(x or 1) for x in gr[:-1]]
638 new_line, new_end) = [int(x or 1) for x in gr[:-1]]
639 old_line -= 1
639 old_line -= 1
640 new_line -= 1
640 new_line -= 1
641
641
642 context = len(gr) == 5
642 context = len(gr) == 5
643 old_end += old_line
643 old_end += old_line
644 new_end += new_line
644 new_end += new_line
645
645
646 if context:
646 if context:
647 # skip context only if it's first line
647 # skip context only if it's first line
648 if int(gr[0]) > 1:
648 if int(gr[0]) > 1:
649 lines.append({
649 lines.append({
650 'old_lineno': '...',
650 'old_lineno': '...',
651 'new_lineno': '...',
651 'new_lineno': '...',
652 'action': Action.CONTEXT,
652 'action': Action.CONTEXT,
653 'line': line,
653 'line': line,
654 })
654 })
655
655
656 line = diff_iter.next()
656 line = diff_iter.next()
657
657
658 while old_line < old_end or new_line < new_end:
658 while old_line < old_end or new_line < new_end:
659 command = ' '
659 command = ' '
660 if line:
660 if line:
661 command = line[0]
661 command = line[0]
662
662
663 affects_old = affects_new = False
663 affects_old = affects_new = False
664
664
665 # ignore those if we don't expect them
665 # ignore those if we don't expect them
666 if command in '#@':
666 if command in '#@':
667 continue
667 continue
668 elif command == '+':
668 elif command == '+':
669 affects_new = True
669 affects_new = True
670 action = Action.ADD
670 action = Action.ADD
671 stats[0] += 1
671 stats[0] += 1
672 elif command == '-':
672 elif command == '-':
673 affects_old = True
673 affects_old = True
674 action = Action.DELETE
674 action = Action.DELETE
675 stats[1] += 1
675 stats[1] += 1
676 else:
676 else:
677 affects_old = affects_new = True
677 affects_old = affects_new = True
678 action = Action.UNMODIFIED
678 action = Action.UNMODIFIED
679
679
680 if not self._newline_marker.match(line):
680 if not self._newline_marker.match(line):
681 old_line += affects_old
681 old_line += affects_old
682 new_line += affects_new
682 new_line += affects_new
683 lines.append({
683 lines.append({
684 'old_lineno': affects_old and old_line or '',
684 'old_lineno': affects_old and old_line or '',
685 'new_lineno': affects_new and new_line or '',
685 'new_lineno': affects_new and new_line or '',
686 'action': action,
686 'action': action,
687 'line': self._clean_line(line, command)
687 'line': self._clean_line(line, command)
688 })
688 })
689 raw_diff.append(line)
689 raw_diff.append(line)
690
690
691 line = diff_iter.next()
691 line = diff_iter.next()
692
692
693 if self._newline_marker.match(line):
693 if self._newline_marker.match(line):
694 # we need to append to lines, since this is not
694 # we need to append to lines, since this is not
695 # counted in the line specs of diff
695 # counted in the line specs of diff
696 lines.append({
696 lines.append({
697 'old_lineno': '...',
697 'old_lineno': '...',
698 'new_lineno': '...',
698 'new_lineno': '...',
699 'action': Action.CONTEXT,
699 'action': Action.CONTEXT,
700 'line': self._clean_line(line, command)
700 'line': self._clean_line(line, command)
701 })
701 })
702
702
703 except StopIteration:
703 except StopIteration:
704 pass
704 pass
705 return ''.join(raw_diff), chunks, stats
705 return ''.join(raw_diff), chunks, stats
706
706
707 # FIXME: NEWDIFFS: dan: this replaces _parse_lines
707 # FIXME: NEWDIFFS: dan: this replaces _parse_lines
708 def _new_parse_lines(self, diff_iter):
708 def _new_parse_lines(self, diff_iter):
709 """
709 """
710 Parse the diff an return data for the template.
710 Parse the diff an return data for the template.
711 """
711 """
712
712
713 stats = [0, 0]
713 stats = [0, 0]
714 chunks = []
714 chunks = []
715 raw_diff = []
715 raw_diff = []
716
716
717 try:
717 try:
718 line = diff_iter.next()
718 line = diff_iter.next()
719
719
720 while line:
720 while line:
721 raw_diff.append(line)
721 raw_diff.append(line)
722 # match header e.g @@ -0,0 +1 @@\n'
722 # match header e.g @@ -0,0 +1 @@\n'
723 match = self._chunk_re.match(line)
723 match = self._chunk_re.match(line)
724
724
725 if not match:
725 if not match:
726 break
726 break
727
727
728 gr = match.groups()
728 gr = match.groups()
729 (old_line, old_end,
729 (old_line, old_end,
730 new_line, new_end) = [int(x or 1) for x in gr[:-1]]
730 new_line, new_end) = [int(x or 1) for x in gr[:-1]]
731
731
732 lines = []
732 lines = []
733 hunk = {
733 hunk = {
734 'section_header': gr[-1],
734 'section_header': gr[-1],
735 'source_start': old_line,
735 'source_start': old_line,
736 'source_length': old_end,
736 'source_length': old_end,
737 'target_start': new_line,
737 'target_start': new_line,
738 'target_length': new_end,
738 'target_length': new_end,
739 'lines': lines,
739 'lines': lines,
740 }
740 }
741 chunks.append(hunk)
741 chunks.append(hunk)
742
742
743 old_line -= 1
743 old_line -= 1
744 new_line -= 1
744 new_line -= 1
745
745
746 context = len(gr) == 5
746 context = len(gr) == 5
747 old_end += old_line
747 old_end += old_line
748 new_end += new_line
748 new_end += new_line
749
749
750 line = diff_iter.next()
750 line = diff_iter.next()
751
751
752 while old_line < old_end or new_line < new_end:
752 while old_line < old_end or new_line < new_end:
753 command = ' '
753 command = ' '
754 if line:
754 if line:
755 command = line[0]
755 command = line[0]
756
756
757 affects_old = affects_new = False
757 affects_old = affects_new = False
758
758
759 # ignore those if we don't expect them
759 # ignore those if we don't expect them
760 if command in '#@':
760 if command in '#@':
761 continue
761 continue
762 elif command == '+':
762 elif command == '+':
763 affects_new = True
763 affects_new = True
764 action = Action.ADD
764 action = Action.ADD
765 stats[0] += 1
765 stats[0] += 1
766 elif command == '-':
766 elif command == '-':
767 affects_old = True
767 affects_old = True
768 action = Action.DELETE
768 action = Action.DELETE
769 stats[1] += 1
769 stats[1] += 1
770 else:
770 else:
771 affects_old = affects_new = True
771 affects_old = affects_new = True
772 action = Action.UNMODIFIED
772 action = Action.UNMODIFIED
773
773
774 if not self._newline_marker.match(line):
774 if not self._newline_marker.match(line):
775 old_line += affects_old
775 old_line += affects_old
776 new_line += affects_new
776 new_line += affects_new
777 lines.append({
777 lines.append({
778 'old_lineno': affects_old and old_line or '',
778 'old_lineno': affects_old and old_line or '',
779 'new_lineno': affects_new and new_line or '',
779 'new_lineno': affects_new and new_line or '',
780 'action': action,
780 'action': action,
781 'line': self._clean_line(line, command)
781 'line': self._clean_line(line, command)
782 })
782 })
783 raw_diff.append(line)
783 raw_diff.append(line)
784
784
785 line = diff_iter.next()
785 line = diff_iter.next()
786
786
787 if self._newline_marker.match(line):
787 if self._newline_marker.match(line):
788 # we need to append to lines, since this is not
788 # we need to append to lines, since this is not
789 # counted in the line specs of diff
789 # counted in the line specs of diff
790 if affects_old:
790 if affects_old:
791 action = Action.OLD_NO_NL
791 action = Action.OLD_NO_NL
792 elif affects_new:
792 elif affects_new:
793 action = Action.NEW_NO_NL
793 action = Action.NEW_NO_NL
794 else:
794 else:
795 raise Exception('invalid context for no newline')
795 raise Exception('invalid context for no newline')
796
796
797 lines.append({
797 lines.append({
798 'old_lineno': None,
798 'old_lineno': None,
799 'new_lineno': None,
799 'new_lineno': None,
800 'action': action,
800 'action': action,
801 'line': self._clean_line(line, command)
801 'line': self._clean_line(line, command)
802 })
802 })
803
803
804 except StopIteration:
804 except StopIteration:
805 pass
805 pass
806
806
807 return ''.join(raw_diff), chunks, stats
807 return ''.join(raw_diff), chunks, stats
808
808
809 def _safe_id(self, idstring):
809 def _safe_id(self, idstring):
810 """Make a string safe for including in an id attribute.
810 """Make a string safe for including in an id attribute.
811
811
812 The HTML spec says that id attributes 'must begin with
812 The HTML spec says that id attributes 'must begin with
813 a letter ([A-Za-z]) and may be followed by any number
813 a letter ([A-Za-z]) and may be followed by any number
814 of letters, digits ([0-9]), hyphens ("-"), underscores
814 of letters, digits ([0-9]), hyphens ("-"), underscores
815 ("_"), colons (":"), and periods (".")'. These regexps
815 ("_"), colons (":"), and periods (".")'. These regexps
816 are slightly over-zealous, in that they remove colons
816 are slightly over-zealous, in that they remove colons
817 and periods unnecessarily.
817 and periods unnecessarily.
818
818
819 Whitespace is transformed into underscores, and then
819 Whitespace is transformed into underscores, and then
820 anything which is not a hyphen or a character that
820 anything which is not a hyphen or a character that
821 matches \w (alphanumerics and underscore) is removed.
821 matches \w (alphanumerics and underscore) is removed.
822
822
823 """
823 """
824 # Transform all whitespace to underscore
824 # Transform all whitespace to underscore
825 idstring = re.sub(r'\s', "_", '%s' % idstring)
825 idstring = re.sub(r'\s', "_", '%s' % idstring)
826 # Remove everything that is not a hyphen or a member of \w
826 # Remove everything that is not a hyphen or a member of \w
827 idstring = re.sub(r'(?!-)\W', "", idstring).lower()
827 idstring = re.sub(r'(?!-)\W', "", idstring).lower()
828 return idstring
828 return idstring
829
829
830 @classmethod
830 @classmethod
831 def diff_splitter(cls, string):
831 def diff_splitter(cls, string):
832 """
832 """
833 Diff split that emulates .splitlines() but works only on \n
833 Diff split that emulates .splitlines() but works only on \n
834 """
834 """
835 if not string:
835 if not string:
836 return
836 return
837 elif string == '\n':
837 elif string == '\n':
838 yield u'\n'
838 yield u'\n'
839 else:
839 else:
840
840
841 has_newline = string.endswith('\n')
841 has_newline = string.endswith('\n')
842 elements = string.split('\n')
842 elements = string.split('\n')
843 if has_newline:
843 if has_newline:
844 # skip last element as it's empty string from newlines
844 # skip last element as it's empty string from newlines
845 elements = elements[:-1]
845 elements = elements[:-1]
846
846
847 len_elements = len(elements)
847 len_elements = len(elements)
848
848
849 for cnt, line in enumerate(elements, start=1):
849 for cnt, line in enumerate(elements, start=1):
850 last_line = cnt == len_elements
850 last_line = cnt == len_elements
851 if last_line and not has_newline:
851 if last_line and not has_newline:
852 yield safe_unicode(line)
852 yield safe_unicode(line)
853 else:
853 else:
854 yield safe_unicode(line) + '\n'
854 yield safe_unicode(line) + '\n'
855
855
856 def prepare(self, inline_diff=True):
856 def prepare(self, inline_diff=True):
857 """
857 """
858 Prepare the passed udiff for HTML rendering.
858 Prepare the passed udiff for HTML rendering.
859
859
860 :return: A list of dicts with diff information.
860 :return: A list of dicts with diff information.
861 """
861 """
862 parsed = self._parser(inline_diff=inline_diff)
862 parsed = self._parser(inline_diff=inline_diff)
863 self.parsed = True
863 self.parsed = True
864 self.parsed_diff = parsed
864 self.parsed_diff = parsed
865 return parsed
865 return parsed
866
866
867 def as_raw(self, diff_lines=None):
867 def as_raw(self, diff_lines=None):
868 """
868 """
869 Returns raw diff as a byte string
869 Returns raw diff as a byte string
870 """
870 """
871 return self._diff.raw
871 return self._diff.raw
872
872
873 def as_html(self, table_class='code-difftable', line_class='line',
873 def as_html(self, table_class='code-difftable', line_class='line',
874 old_lineno_class='lineno old', new_lineno_class='lineno new',
874 old_lineno_class='lineno old', new_lineno_class='lineno new',
875 code_class='code', enable_comments=False, parsed_lines=None):
875 code_class='code', enable_comments=False, parsed_lines=None):
876 """
876 """
877 Return given diff as html table with customized css classes
877 Return given diff as html table with customized css classes
878 """
878 """
879 # TODO(marcink): not sure how to pass in translator
879 # TODO(marcink): not sure how to pass in translator
880 # here in an efficient way, leave the _ for proper gettext extraction
880 # here in an efficient way, leave the _ for proper gettext extraction
881 _ = lambda s: s
881 _ = lambda s: s
882
882
883 def _link_to_if(condition, label, url):
883 def _link_to_if(condition, label, url):
884 """
884 """
885 Generates a link if condition is meet or just the label if not.
885 Generates a link if condition is meet or just the label if not.
886 """
886 """
887
887
888 if condition:
888 if condition:
889 return '''<a href="%(url)s" class="tooltip"
889 return '''<a href="%(url)s" class="tooltip"
890 title="%(title)s">%(label)s</a>''' % {
890 title="%(title)s">%(label)s</a>''' % {
891 'title': _('Click to select line'),
891 'title': _('Click to select line'),
892 'url': url,
892 'url': url,
893 'label': label
893 'label': label
894 }
894 }
895 else:
895 else:
896 return label
896 return label
897 if not self.parsed:
897 if not self.parsed:
898 self.prepare()
898 self.prepare()
899
899
900 diff_lines = self.parsed_diff
900 diff_lines = self.parsed_diff
901 if parsed_lines:
901 if parsed_lines:
902 diff_lines = parsed_lines
902 diff_lines = parsed_lines
903
903
904 _html_empty = True
904 _html_empty = True
905 _html = []
905 _html = []
906 _html.append('''<table class="%(table_class)s">\n''' % {
906 _html.append('''<table class="%(table_class)s">\n''' % {
907 'table_class': table_class
907 'table_class': table_class
908 })
908 })
909
909
910 for diff in diff_lines:
910 for diff in diff_lines:
911 for line in diff['chunks']:
911 for line in diff['chunks']:
912 _html_empty = False
912 _html_empty = False
913 for change in line:
913 for change in line:
914 _html.append('''<tr class="%(lc)s %(action)s">\n''' % {
914 _html.append('''<tr class="%(lc)s %(action)s">\n''' % {
915 'lc': line_class,
915 'lc': line_class,
916 'action': change['action']
916 'action': change['action']
917 })
917 })
918 anchor_old_id = ''
918 anchor_old_id = ''
919 anchor_new_id = ''
919 anchor_new_id = ''
920 anchor_old = "%(filename)s_o%(oldline_no)s" % {
920 anchor_old = "%(filename)s_o%(oldline_no)s" % {
921 'filename': self._safe_id(diff['filename']),
921 'filename': self._safe_id(diff['filename']),
922 'oldline_no': change['old_lineno']
922 'oldline_no': change['old_lineno']
923 }
923 }
924 anchor_new = "%(filename)s_n%(oldline_no)s" % {
924 anchor_new = "%(filename)s_n%(oldline_no)s" % {
925 'filename': self._safe_id(diff['filename']),
925 'filename': self._safe_id(diff['filename']),
926 'oldline_no': change['new_lineno']
926 'oldline_no': change['new_lineno']
927 }
927 }
928 cond_old = (change['old_lineno'] != '...' and
928 cond_old = (change['old_lineno'] != '...' and
929 change['old_lineno'])
929 change['old_lineno'])
930 cond_new = (change['new_lineno'] != '...' and
930 cond_new = (change['new_lineno'] != '...' and
931 change['new_lineno'])
931 change['new_lineno'])
932 if cond_old:
932 if cond_old:
933 anchor_old_id = 'id="%s"' % anchor_old
933 anchor_old_id = 'id="%s"' % anchor_old
934 if cond_new:
934 if cond_new:
935 anchor_new_id = 'id="%s"' % anchor_new
935 anchor_new_id = 'id="%s"' % anchor_new
936
936
937 if change['action'] != Action.CONTEXT:
937 if change['action'] != Action.CONTEXT:
938 anchor_link = True
938 anchor_link = True
939 else:
939 else:
940 anchor_link = False
940 anchor_link = False
941
941
942 ###########################################################
942 ###########################################################
943 # COMMENT ICONS
943 # COMMENT ICONS
944 ###########################################################
944 ###########################################################
945 _html.append('''\t<td class="add-comment-line"><span class="add-comment-content">''')
945 _html.append('''\t<td class="add-comment-line"><span class="add-comment-content">''')
946
946
947 if enable_comments and change['action'] != Action.CONTEXT:
947 if enable_comments and change['action'] != Action.CONTEXT:
948 _html.append('''<a href="#"><span class="icon-comment-add"></span></a>''')
948 _html.append('''<a href="#"><span class="icon-comment-add"></span></a>''')
949
949
950 _html.append('''</span></td><td class="comment-toggle tooltip" title="Toggle Comment Thread"><i class="icon-comment"></i></td>\n''')
950 _html.append('''</span></td><td class="comment-toggle tooltip" title="Toggle Comment Thread"><i class="icon-comment"></i></td>\n''')
951
951
952 ###########################################################
952 ###########################################################
953 # OLD LINE NUMBER
953 # OLD LINE NUMBER
954 ###########################################################
954 ###########################################################
955 _html.append('''\t<td %(a_id)s class="%(olc)s">''' % {
955 _html.append('''\t<td %(a_id)s class="%(olc)s">''' % {
956 'a_id': anchor_old_id,
956 'a_id': anchor_old_id,
957 'olc': old_lineno_class
957 'olc': old_lineno_class
958 })
958 })
959
959
960 _html.append('''%(link)s''' % {
960 _html.append('''%(link)s''' % {
961 'link': _link_to_if(anchor_link, change['old_lineno'],
961 'link': _link_to_if(anchor_link, change['old_lineno'],
962 '#%s' % anchor_old)
962 '#%s' % anchor_old)
963 })
963 })
964 _html.append('''</td>\n''')
964 _html.append('''</td>\n''')
965 ###########################################################
965 ###########################################################
966 # NEW LINE NUMBER
966 # NEW LINE NUMBER
967 ###########################################################
967 ###########################################################
968
968
969 _html.append('''\t<td %(a_id)s class="%(nlc)s">''' % {
969 _html.append('''\t<td %(a_id)s class="%(nlc)s">''' % {
970 'a_id': anchor_new_id,
970 'a_id': anchor_new_id,
971 'nlc': new_lineno_class
971 'nlc': new_lineno_class
972 })
972 })
973
973
974 _html.append('''%(link)s''' % {
974 _html.append('''%(link)s''' % {
975 'link': _link_to_if(anchor_link, change['new_lineno'],
975 'link': _link_to_if(anchor_link, change['new_lineno'],
976 '#%s' % anchor_new)
976 '#%s' % anchor_new)
977 })
977 })
978 _html.append('''</td>\n''')
978 _html.append('''</td>\n''')
979 ###########################################################
979 ###########################################################
980 # CODE
980 # CODE
981 ###########################################################
981 ###########################################################
982 code_classes = [code_class]
982 code_classes = [code_class]
983 if (not enable_comments or
983 if (not enable_comments or
984 change['action'] == Action.CONTEXT):
984 change['action'] == Action.CONTEXT):
985 code_classes.append('no-comment')
985 code_classes.append('no-comment')
986 _html.append('\t<td class="%s">' % ' '.join(code_classes))
986 _html.append('\t<td class="%s">' % ' '.join(code_classes))
987 _html.append('''\n\t\t<pre>%(code)s</pre>\n''' % {
987 _html.append('''\n\t\t<pre>%(code)s</pre>\n''' % {
988 'code': change['line']
988 'code': change['line']
989 })
989 })
990
990
991 _html.append('''\t</td>''')
991 _html.append('''\t</td>''')
992 _html.append('''\n</tr>\n''')
992 _html.append('''\n</tr>\n''')
993 _html.append('''</table>''')
993 _html.append('''</table>''')
994 if _html_empty:
994 if _html_empty:
995 return None
995 return None
996 return ''.join(_html)
996 return ''.join(_html)
997
997
998 def stat(self):
998 def stat(self):
999 """
999 """
1000 Returns tuple of added, and removed lines for this instance
1000 Returns tuple of added, and removed lines for this instance
1001 """
1001 """
1002 return self.adds, self.removes
1002 return self.adds, self.removes
1003
1003
1004 def get_context_of_line(
1004 def get_context_of_line(
1005 self, path, diff_line=None, context_before=3, context_after=3):
1005 self, path, diff_line=None, context_before=3, context_after=3):
1006 """
1006 """
1007 Returns the context lines for the specified diff line.
1007 Returns the context lines for the specified diff line.
1008
1008
1009 :type diff_line: :class:`DiffLineNumber`
1009 :type diff_line: :class:`DiffLineNumber`
1010 """
1010 """
1011 assert self.parsed, "DiffProcessor is not initialized."
1011 assert self.parsed, "DiffProcessor is not initialized."
1012
1012
1013 if None not in diff_line:
1013 if None not in diff_line:
1014 raise ValueError(
1014 raise ValueError(
1015 "Cannot specify both line numbers: {}".format(diff_line))
1015 "Cannot specify both line numbers: {}".format(diff_line))
1016
1016
1017 file_diff = self._get_file_diff(path)
1017 file_diff = self._get_file_diff(path)
1018 chunk, idx = self._find_chunk_line_index(file_diff, diff_line)
1018 chunk, idx = self._find_chunk_line_index(file_diff, diff_line)
1019
1019
1020 first_line_to_include = max(idx - context_before, 0)
1020 first_line_to_include = max(idx - context_before, 0)
1021 first_line_after_context = idx + context_after + 1
1021 first_line_after_context = idx + context_after + 1
1022 context_lines = chunk[first_line_to_include:first_line_after_context]
1022 context_lines = chunk[first_line_to_include:first_line_after_context]
1023
1023
1024 line_contents = [
1024 line_contents = [
1025 _context_line(line) for line in context_lines
1025 _context_line(line) for line in context_lines
1026 if _is_diff_content(line)]
1026 if _is_diff_content(line)]
1027 # TODO: johbo: Interim fixup, the diff chunks drop the final newline.
1027 # TODO: johbo: Interim fixup, the diff chunks drop the final newline.
1028 # Once they are fixed, we can drop this line here.
1028 # Once they are fixed, we can drop this line here.
1029 if line_contents:
1029 if line_contents:
1030 line_contents[-1] = (
1030 line_contents[-1] = (
1031 line_contents[-1][0], line_contents[-1][1].rstrip('\n') + '\n')
1031 line_contents[-1][0], line_contents[-1][1].rstrip('\n') + '\n')
1032 return line_contents
1032 return line_contents
1033
1033
1034 def find_context(self, path, context, offset=0):
1034 def find_context(self, path, context, offset=0):
1035 """
1035 """
1036 Finds the given `context` inside of the diff.
1036 Finds the given `context` inside of the diff.
1037
1037
1038 Use the parameter `offset` to specify which offset the target line has
1038 Use the parameter `offset` to specify which offset the target line has
1039 inside of the given `context`. This way the correct diff line will be
1039 inside of the given `context`. This way the correct diff line will be
1040 returned.
1040 returned.
1041
1041
1042 :param offset: Shall be used to specify the offset of the main line
1042 :param offset: Shall be used to specify the offset of the main line
1043 within the given `context`.
1043 within the given `context`.
1044 """
1044 """
1045 if offset < 0 or offset >= len(context):
1045 if offset < 0 or offset >= len(context):
1046 raise ValueError(
1046 raise ValueError(
1047 "Only positive values up to the length of the context "
1047 "Only positive values up to the length of the context "
1048 "minus one are allowed.")
1048 "minus one are allowed.")
1049
1049
1050 matches = []
1050 matches = []
1051 file_diff = self._get_file_diff(path)
1051 file_diff = self._get_file_diff(path)
1052
1052
1053 for chunk in file_diff['chunks']:
1053 for chunk in file_diff['chunks']:
1054 context_iter = iter(context)
1054 context_iter = iter(context)
1055 for line_idx, line in enumerate(chunk):
1055 for line_idx, line in enumerate(chunk):
1056 try:
1056 try:
1057 if _context_line(line) == context_iter.next():
1057 if _context_line(line) == context_iter.next():
1058 continue
1058 continue
1059 except StopIteration:
1059 except StopIteration:
1060 matches.append((line_idx, chunk))
1060 matches.append((line_idx, chunk))
1061 context_iter = iter(context)
1061 context_iter = iter(context)
1062
1062
1063 # Increment position and triger StopIteration
1063 # Increment position and triger StopIteration
1064 # if we had a match at the end
1064 # if we had a match at the end
1065 line_idx += 1
1065 line_idx += 1
1066 try:
1066 try:
1067 context_iter.next()
1067 context_iter.next()
1068 except StopIteration:
1068 except StopIteration:
1069 matches.append((line_idx, chunk))
1069 matches.append((line_idx, chunk))
1070
1070
1071 effective_offset = len(context) - offset
1071 effective_offset = len(context) - offset
1072 found_at_diff_lines = [
1072 found_at_diff_lines = [
1073 _line_to_diff_line_number(chunk[idx - effective_offset])
1073 _line_to_diff_line_number(chunk[idx - effective_offset])
1074 for idx, chunk in matches]
1074 for idx, chunk in matches]
1075
1075
1076 return found_at_diff_lines
1076 return found_at_diff_lines
1077
1077
1078 def _get_file_diff(self, path):
1078 def _get_file_diff(self, path):
1079 for file_diff in self.parsed_diff:
1079 for file_diff in self.parsed_diff:
1080 if file_diff['filename'] == path:
1080 if file_diff['filename'] == path:
1081 break
1081 break
1082 else:
1082 else:
1083 raise FileNotInDiffException("File {} not in diff".format(path))
1083 raise FileNotInDiffException("File {} not in diff".format(path))
1084 return file_diff
1084 return file_diff
1085
1085
1086 def _find_chunk_line_index(self, file_diff, diff_line):
1086 def _find_chunk_line_index(self, file_diff, diff_line):
1087 for chunk in file_diff['chunks']:
1087 for chunk in file_diff['chunks']:
1088 for idx, line in enumerate(chunk):
1088 for idx, line in enumerate(chunk):
1089 if line['old_lineno'] == diff_line.old:
1089 if line['old_lineno'] == diff_line.old:
1090 return chunk, idx
1090 return chunk, idx
1091 if line['new_lineno'] == diff_line.new:
1091 if line['new_lineno'] == diff_line.new:
1092 return chunk, idx
1092 return chunk, idx
1093 raise LineNotInDiffException(
1093 raise LineNotInDiffException(
1094 "The line {} is not part of the diff.".format(diff_line))
1094 "The line {} is not part of the diff.".format(diff_line))
1095
1095
1096
1096
1097 def _is_diff_content(line):
1097 def _is_diff_content(line):
1098 return line['action'] in (
1098 return line['action'] in (
1099 Action.UNMODIFIED, Action.ADD, Action.DELETE)
1099 Action.UNMODIFIED, Action.ADD, Action.DELETE)
1100
1100
1101
1101
1102 def _context_line(line):
1102 def _context_line(line):
1103 return (line['action'], line['line'])
1103 return (line['action'], line['line'])
1104
1104
1105
1105
1106 DiffLineNumber = collections.namedtuple('DiffLineNumber', ['old', 'new'])
1106 DiffLineNumber = collections.namedtuple('DiffLineNumber', ['old', 'new'])
1107
1107
1108
1108
1109 def _line_to_diff_line_number(line):
1109 def _line_to_diff_line_number(line):
1110 new_line_no = line['new_lineno'] or None
1110 new_line_no = line['new_lineno'] or None
1111 old_line_no = line['old_lineno'] or None
1111 old_line_no = line['old_lineno'] or None
1112 return DiffLineNumber(old=old_line_no, new=new_line_no)
1112 return DiffLineNumber(old=old_line_no, new=new_line_no)
1113
1113
1114
1114
1115 class FileNotInDiffException(Exception):
1115 class FileNotInDiffException(Exception):
1116 """
1116 """
1117 Raised when the context for a missing file is requested.
1117 Raised when the context for a missing file is requested.
1118
1118
1119 If you request the context for a line in a file which is not part of the
1119 If you request the context for a line in a file which is not part of the
1120 given diff, then this exception is raised.
1120 given diff, then this exception is raised.
1121 """
1121 """
1122
1122
1123
1123
1124 class LineNotInDiffException(Exception):
1124 class LineNotInDiffException(Exception):
1125 """
1125 """
1126 Raised when the context for a missing line is requested.
1126 Raised when the context for a missing line is requested.
1127
1127
1128 If you request the context for a line in a file and this line is not
1128 If you request the context for a line in a file and this line is not
1129 part of the given diff, then this exception is raised.
1129 part of the given diff, then this exception is raised.
1130 """
1130 """
1131
1131
1132
1132
1133 class DiffLimitExceeded(Exception):
1133 class DiffLimitExceeded(Exception):
1134 pass
1134 pass
1135
1135
1136
1136
1137 # NOTE(marcink): if diffs.mako change, probably this
1137 # NOTE(marcink): if diffs.mako change, probably this
1138 # needs a bump to next version
1138 # needs a bump to next version
1139 CURRENT_DIFF_VERSION = 'v2'
1139 CURRENT_DIFF_VERSION = 'v3'
1140
1140
1141
1141
1142 def _cleanup_cache_file(cached_diff_file):
1142 def _cleanup_cache_file(cached_diff_file):
1143 # cleanup file to not store it "damaged"
1143 # cleanup file to not store it "damaged"
1144 try:
1144 try:
1145 os.remove(cached_diff_file)
1145 os.remove(cached_diff_file)
1146 except Exception:
1146 except Exception:
1147 log.exception('Failed to cleanup path %s', cached_diff_file)
1147 log.exception('Failed to cleanup path %s', cached_diff_file)
1148
1148
1149
1149
1150 def cache_diff(cached_diff_file, diff, commits):
1150 def cache_diff(cached_diff_file, diff, commits):
1151
1151
1152 struct = {
1152 struct = {
1153 'version': CURRENT_DIFF_VERSION,
1153 'version': CURRENT_DIFF_VERSION,
1154 'diff': diff,
1154 'diff': diff,
1155 'commits': commits
1155 'commits': commits
1156 }
1156 }
1157
1157
1158 try:
1158 try:
1159 with bz2.BZ2File(cached_diff_file, 'wb') as f:
1159 with bz2.BZ2File(cached_diff_file, 'wb') as f:
1160 pickle.dump(struct, f)
1160 pickle.dump(struct, f)
1161 log.debug('Saved diff cache under %s', cached_diff_file)
1161 log.debug('Saved diff cache under %s', cached_diff_file)
1162 except Exception:
1162 except Exception:
1163 log.warn('Failed to save cache', exc_info=True)
1163 log.warn('Failed to save cache', exc_info=True)
1164 _cleanup_cache_file(cached_diff_file)
1164 _cleanup_cache_file(cached_diff_file)
1165
1165
1166
1166
1167 def load_cached_diff(cached_diff_file):
1167 def load_cached_diff(cached_diff_file):
1168
1168
1169 default_struct = {
1169 default_struct = {
1170 'version': CURRENT_DIFF_VERSION,
1170 'version': CURRENT_DIFF_VERSION,
1171 'diff': None,
1171 'diff': None,
1172 'commits': None
1172 'commits': None
1173 }
1173 }
1174
1174
1175 has_cache = os.path.isfile(cached_diff_file)
1175 has_cache = os.path.isfile(cached_diff_file)
1176 if not has_cache:
1176 if not has_cache:
1177 return default_struct
1177 return default_struct
1178
1178
1179 data = None
1179 data = None
1180 try:
1180 try:
1181 with bz2.BZ2File(cached_diff_file, 'rb') as f:
1181 with bz2.BZ2File(cached_diff_file, 'rb') as f:
1182 data = pickle.load(f)
1182 data = pickle.load(f)
1183 log.debug('Loaded diff cache from %s', cached_diff_file)
1183 log.debug('Loaded diff cache from %s', cached_diff_file)
1184 except Exception:
1184 except Exception:
1185 log.warn('Failed to read diff cache file', exc_info=True)
1185 log.warn('Failed to read diff cache file', exc_info=True)
1186
1186
1187 if not data:
1187 if not data:
1188 data = default_struct
1188 data = default_struct
1189
1189
1190 if not isinstance(data, dict):
1190 if not isinstance(data, dict):
1191 # old version of data ?
1191 # old version of data ?
1192 data = default_struct
1192 data = default_struct
1193
1193
1194 # check version
1194 # check version
1195 if data.get('version') != CURRENT_DIFF_VERSION:
1195 if data.get('version') != CURRENT_DIFF_VERSION:
1196 # purge cache
1196 # purge cache
1197 _cleanup_cache_file(cached_diff_file)
1197 _cleanup_cache_file(cached_diff_file)
1198 return default_struct
1198 return default_struct
1199
1199
1200 return data
1200 return data
1201
1201
1202
1202
1203 def generate_diff_cache_key(*args):
1203 def generate_diff_cache_key(*args):
1204 """
1204 """
1205 Helper to generate a cache key using arguments
1205 Helper to generate a cache key using arguments
1206 """
1206 """
1207 def arg_mapper(input_param):
1207 def arg_mapper(input_param):
1208 input_param = safe_str(input_param)
1208 input_param = safe_str(input_param)
1209 # we cannot allow '/' in arguments since it would allow
1209 # we cannot allow '/' in arguments since it would allow
1210 # subdirectory usage
1210 # subdirectory usage
1211 input_param.replace('/', '_')
1211 input_param.replace('/', '_')
1212 return input_param or None # prevent empty string arguments
1212 return input_param or None # prevent empty string arguments
1213
1213
1214 return '_'.join([
1214 return '_'.join([
1215 '{}' for i in range(len(args))]).format(*map(arg_mapper, args))
1215 '{}' for i in range(len(args))]).format(*map(arg_mapper, args))
1216
1216
1217
1217
1218 def diff_cache_exist(cache_storage, *args):
1218 def diff_cache_exist(cache_storage, *args):
1219 """
1219 """
1220 Based on all generated arguments check and return a cache path
1220 Based on all generated arguments check and return a cache path
1221 """
1221 """
1222 cache_key = generate_diff_cache_key(*args)
1222 cache_key = generate_diff_cache_key(*args)
1223 cache_file_path = os.path.join(cache_storage, cache_key)
1223 cache_file_path = os.path.join(cache_storage, cache_key)
1224 # prevent path traversal attacks using some param that have e.g '../../'
1224 # prevent path traversal attacks using some param that have e.g '../../'
1225 if not os.path.abspath(cache_file_path).startswith(cache_storage):
1225 if not os.path.abspath(cache_file_path).startswith(cache_storage):
1226 raise ValueError('Final path must be within {}'.format(cache_storage))
1226 raise ValueError('Final path must be within {}'.format(cache_storage))
1227
1227
1228 return cache_file_path
1228 return cache_file_path
@@ -1,1172 +1,1221 b''
1 // Default styles
1 // Default styles
2
2
3 .diff-collapse {
3 .diff-collapse {
4 margin: @padding 0;
4 margin: @padding 0;
5 text-align: right;
5 text-align: right;
6 }
6 }
7
7
8 .diff-container {
8 .diff-container {
9 margin-bottom: @space;
9 margin-bottom: @space;
10
10
11 .diffblock {
11 .diffblock {
12 margin-bottom: @space;
12 margin-bottom: @space;
13 }
13 }
14
14
15 &.hidden {
15 &.hidden {
16 display: none;
16 display: none;
17 overflow: hidden;
17 overflow: hidden;
18 }
18 }
19 }
19 }
20
20
21
21
22 div.diffblock .sidebyside {
22 div.diffblock .sidebyside {
23 background: #ffffff;
23 background: #ffffff;
24 }
24 }
25
25
26 div.diffblock {
26 div.diffblock {
27 overflow-x: auto;
27 overflow-x: auto;
28 overflow-y: hidden;
28 overflow-y: hidden;
29 clear: both;
29 clear: both;
30 padding: 0px;
30 padding: 0px;
31 background: @grey6;
31 background: @grey6;
32 border: @border-thickness solid @grey5;
32 border: @border-thickness solid @grey5;
33 -webkit-border-radius: @border-radius @border-radius 0px 0px;
33 -webkit-border-radius: @border-radius @border-radius 0px 0px;
34 border-radius: @border-radius @border-radius 0px 0px;
34 border-radius: @border-radius @border-radius 0px 0px;
35
35
36
36
37 .comments-number {
37 .comments-number {
38 float: right;
38 float: right;
39 }
39 }
40
40
41 // BEGIN CODE-HEADER STYLES
41 // BEGIN CODE-HEADER STYLES
42
42
43 .code-header {
43 .code-header {
44 background: @grey6;
44 background: @grey6;
45 padding: 10px 0 10px 0;
45 padding: 10px 0 10px 0;
46 height: auto;
46 height: auto;
47 width: 100%;
47 width: 100%;
48
48
49 .hash {
49 .hash {
50 float: left;
50 float: left;
51 padding: 2px 0 0 2px;
51 padding: 2px 0 0 2px;
52 }
52 }
53
53
54 .date {
54 .date {
55 float: left;
55 float: left;
56 text-transform: uppercase;
56 text-transform: uppercase;
57 padding: 4px 0px 0px 2px;
57 padding: 4px 0px 0px 2px;
58 }
58 }
59
59
60 div {
60 div {
61 margin-left: 4px;
61 margin-left: 4px;
62 }
62 }
63
63
64 div.compare_header {
64 div.compare_header {
65 min-height: 40px;
65 min-height: 40px;
66 margin: 0;
66 margin: 0;
67 padding: 0 @padding;
67 padding: 0 @padding;
68
68
69 .drop-menu {
69 .drop-menu {
70 float:left;
70 float:left;
71 display: block;
71 display: block;
72 margin:0 0 @padding 0;
72 margin:0 0 @padding 0;
73 }
73 }
74
74
75 .compare-label {
75 .compare-label {
76 float: left;
76 float: left;
77 clear: both;
77 clear: both;
78 display: inline-block;
78 display: inline-block;
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-family: @text-semibold;
82 font-family: @text-semibold;
83 }
83 }
84
84
85 .compare-buttons {
85 .compare-buttons {
86 float: left;
86 float: left;
87 margin: 0;
87 margin: 0;
88 padding: 0 0 @padding;
88 padding: 0 0 @padding;
89
89
90 .btn {
90 .btn {
91 margin: 0 @padding 0 0;
91 margin: 0 @padding 0 0;
92 }
92 }
93 }
93 }
94 }
94 }
95
95
96 }
96 }
97
97
98 .parents {
98 .parents {
99 float: left;
99 float: left;
100 width: 100px;
100 width: 100px;
101 font-weight: 400;
101 font-weight: 400;
102 vertical-align: middle;
102 vertical-align: middle;
103 padding: 0px 2px 0px 2px;
103 padding: 0px 2px 0px 2px;
104 background-color: @grey6;
104 background-color: @grey6;
105
105
106 #parent_link {
106 #parent_link {
107 margin: 00px 2px;
107 margin: 00px 2px;
108
108
109 &.double {
109 &.double {
110 margin: 0px 2px;
110 margin: 0px 2px;
111 }
111 }
112
112
113 &.disabled{
113 &.disabled{
114 margin-right: @padding;
114 margin-right: @padding;
115 }
115 }
116 }
116 }
117 }
117 }
118
118
119 .children {
119 .children {
120 float: right;
120 float: right;
121 width: 100px;
121 width: 100px;
122 font-weight: 400;
122 font-weight: 400;
123 vertical-align: middle;
123 vertical-align: middle;
124 text-align: right;
124 text-align: right;
125 padding: 0px 2px 0px 2px;
125 padding: 0px 2px 0px 2px;
126 background-color: @grey6;
126 background-color: @grey6;
127
127
128 #child_link {
128 #child_link {
129 margin: 0px 2px;
129 margin: 0px 2px;
130
130
131 &.double {
131 &.double {
132 margin: 0px 2px;
132 margin: 0px 2px;
133 }
133 }
134
134
135 &.disabled{
135 &.disabled{
136 margin-right: @padding;
136 margin-right: @padding;
137 }
137 }
138 }
138 }
139 }
139 }
140
140
141 .changeset_header {
141 .changeset_header {
142 height: 16px;
142 height: 16px;
143
143
144 & > div{
144 & > div{
145 margin-right: @padding;
145 margin-right: @padding;
146 }
146 }
147 }
147 }
148
148
149 .changeset_file {
149 .changeset_file {
150 text-align: left;
150 text-align: left;
151 float: left;
151 float: left;
152 padding: 0;
152 padding: 0;
153
153
154 a{
154 a{
155 display: inline-block;
155 display: inline-block;
156 margin-right: 0.5em;
156 margin-right: 0.5em;
157 }
157 }
158
158
159 #selected_mode{
159 #selected_mode{
160 margin-left: 0;
160 margin-left: 0;
161 }
161 }
162 }
162 }
163
163
164 .diff-menu-wrapper {
164 .diff-menu-wrapper {
165 float: left;
165 float: left;
166 }
166 }
167
167
168 .diff-menu {
168 .diff-menu {
169 position: absolute;
169 position: absolute;
170 background: none repeat scroll 0 0 #FFFFFF;
170 background: none repeat scroll 0 0 #FFFFFF;
171 border-color: #003367 @grey3 @grey3;
171 border-color: #003367 @grey3 @grey3;
172 border-right: 1px solid @grey3;
172 border-right: 1px solid @grey3;
173 border-style: solid solid solid;
173 border-style: solid solid solid;
174 border-width: @border-thickness;
174 border-width: @border-thickness;
175 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
175 box-shadow: 2px 8px 4px rgba(0, 0, 0, 0.2);
176 margin-top: 5px;
176 margin-top: 5px;
177 margin-left: 1px;
177 margin-left: 1px;
178 }
178 }
179
179
180 .diff-actions, .editor-actions {
180 .diff-actions, .editor-actions {
181 float: left;
181 float: left;
182
182
183 input{
183 input{
184 margin: 0 0.5em 0 0;
184 margin: 0 0.5em 0 0;
185 }
185 }
186 }
186 }
187
187
188 // END CODE-HEADER STYLES
188 // END CODE-HEADER STYLES
189
189
190 // BEGIN CODE-BODY STYLES
190 // BEGIN CODE-BODY STYLES
191
191
192 .code-body {
192 .code-body {
193 padding: 0;
193 padding: 0;
194 background-color: #ffffff;
194 background-color: #ffffff;
195 position: relative;
195 position: relative;
196 max-width: none;
196 max-width: none;
197 box-sizing: border-box;
197 box-sizing: border-box;
198 // TODO: johbo: Parent has overflow: auto, this forces the child here
198 // TODO: johbo: Parent has overflow: auto, this forces the child here
199 // to have the intended size and to scroll. Should be simplified.
199 // to have the intended size and to scroll. Should be simplified.
200 width: 100%;
200 width: 100%;
201 overflow-x: auto;
201 overflow-x: auto;
202 }
202 }
203
203
204 pre.raw {
204 pre.raw {
205 background: white;
205 background: white;
206 color: @grey1;
206 color: @grey1;
207 }
207 }
208 // END CODE-BODY STYLES
208 // END CODE-BODY STYLES
209
209
210 }
210 }
211
211
212
212
213 table.code-difftable {
213 table.code-difftable {
214 border-collapse: collapse;
214 border-collapse: collapse;
215 width: 99%;
215 width: 99%;
216 border-radius: 0px !important;
216 border-radius: 0px !important;
217
217
218 td {
218 td {
219 padding: 0 !important;
219 padding: 0 !important;
220 background: none !important;
220 background: none !important;
221 border: 0 !important;
221 border: 0 !important;
222 }
222 }
223
223
224 .context {
224 .context {
225 background: none repeat scroll 0 0 #DDE7EF;
225 background: none repeat scroll 0 0 #DDE7EF;
226 }
226 }
227
227
228 .add {
228 .add {
229 background: none repeat scroll 0 0 #DDFFDD;
229 background: none repeat scroll 0 0 #DDFFDD;
230
230
231 ins {
231 ins {
232 background: none repeat scroll 0 0 #AAFFAA;
232 background: none repeat scroll 0 0 #AAFFAA;
233 text-decoration: none;
233 text-decoration: none;
234 }
234 }
235 }
235 }
236
236
237 .del {
237 .del {
238 background: none repeat scroll 0 0 #FFDDDD;
238 background: none repeat scroll 0 0 #FFDDDD;
239
239
240 del {
240 del {
241 background: none repeat scroll 0 0 #FFAAAA;
241 background: none repeat scroll 0 0 #FFAAAA;
242 text-decoration: none;
242 text-decoration: none;
243 }
243 }
244 }
244 }
245
245
246 /** LINE NUMBERS **/
246 /** LINE NUMBERS **/
247 .lineno {
247 .lineno {
248 padding-left: 2px !important;
248 padding-left: 2px !important;
249 padding-right: 2px;
249 padding-right: 2px;
250 text-align: right;
250 text-align: right;
251 width: 32px;
251 width: 32px;
252 -moz-user-select: none;
252 -moz-user-select: none;
253 -webkit-user-select: none;
253 -webkit-user-select: none;
254 border-right: @border-thickness solid @grey5 !important;
254 border-right: @border-thickness solid @grey5 !important;
255 border-left: 0px solid #CCC !important;
255 border-left: 0px solid #CCC !important;
256 border-top: 0px solid #CCC !important;
256 border-top: 0px solid #CCC !important;
257 border-bottom: none !important;
257 border-bottom: none !important;
258
258
259 a {
259 a {
260 &:extend(pre);
260 &:extend(pre);
261 text-align: right;
261 text-align: right;
262 padding-right: 2px;
262 padding-right: 2px;
263 cursor: pointer;
263 cursor: pointer;
264 display: block;
264 display: block;
265 width: 32px;
265 width: 32px;
266 }
266 }
267 }
267 }
268
268
269 .context {
269 .context {
270 cursor: auto;
270 cursor: auto;
271 &:extend(pre);
271 &:extend(pre);
272 }
272 }
273
273
274 .lineno-inline {
274 .lineno-inline {
275 background: none repeat scroll 0 0 #FFF !important;
275 background: none repeat scroll 0 0 #FFF !important;
276 padding-left: 2px;
276 padding-left: 2px;
277 padding-right: 2px;
277 padding-right: 2px;
278 text-align: right;
278 text-align: right;
279 width: 30px;
279 width: 30px;
280 -moz-user-select: none;
280 -moz-user-select: none;
281 -webkit-user-select: none;
281 -webkit-user-select: none;
282 }
282 }
283
283
284 /** CODE **/
284 /** CODE **/
285 .code {
285 .code {
286 display: block;
286 display: block;
287 width: 100%;
287 width: 100%;
288
288
289 td {
289 td {
290 margin: 0;
290 margin: 0;
291 padding: 0;
291 padding: 0;
292 }
292 }
293
293
294 pre {
294 pre {
295 margin: 0;
295 margin: 0;
296 padding: 0;
296 padding: 0;
297 margin-left: .5em;
297 margin-left: .5em;
298 }
298 }
299 }
299 }
300 }
300 }
301
301
302
302
303 // Comments
303 // Comments
304
304
305 div.comment:target {
305 div.comment:target {
306 border-left: 6px solid @comment-highlight-color !important;
306 border-left: 6px solid @comment-highlight-color !important;
307 padding-left: 3px;
307 padding-left: 3px;
308 margin-left: -9px;
308 margin-left: -9px;
309 }
309 }
310
310
311 //TODO: anderson: can't get an absolute number out of anything, so had to put the
311 //TODO: anderson: can't get an absolute number out of anything, so had to put the
312 //current values that might change. But to make it clear I put as a calculation
312 //current values that might change. But to make it clear I put as a calculation
313 @comment-max-width: 1065px;
313 @comment-max-width: 1065px;
314 @pr-extra-margin: 34px;
314 @pr-extra-margin: 34px;
315 @pr-border-spacing: 4px;
315 @pr-border-spacing: 4px;
316 @pr-comment-width: @comment-max-width - @pr-extra-margin - @pr-border-spacing;
316 @pr-comment-width: @comment-max-width - @pr-extra-margin - @pr-border-spacing;
317
317
318 // Pull Request
318 // Pull Request
319 .cs_files .code-difftable {
319 .cs_files .code-difftable {
320 border: @border-thickness solid @grey5; //borders only on PRs
320 border: @border-thickness solid @grey5; //borders only on PRs
321
321
322 .comment-inline-form,
322 .comment-inline-form,
323 div.comment {
323 div.comment {
324 width: @pr-comment-width;
324 width: @pr-comment-width;
325 }
325 }
326 }
326 }
327
327
328 // Changeset
328 // Changeset
329 .code-difftable {
329 .code-difftable {
330 .comment-inline-form,
330 .comment-inline-form,
331 div.comment {
331 div.comment {
332 width: @comment-max-width;
332 width: @comment-max-width;
333 }
333 }
334 }
334 }
335
335
336 //Style page
336 //Style page
337 @style-extra-margin: @sidebar-width + (@sidebarpadding * 3) + @padding;
337 @style-extra-margin: @sidebar-width + (@sidebarpadding * 3) + @padding;
338 #style-page .code-difftable{
338 #style-page .code-difftable{
339 .comment-inline-form,
339 .comment-inline-form,
340 div.comment {
340 div.comment {
341 width: @comment-max-width - @style-extra-margin;
341 width: @comment-max-width - @style-extra-margin;
342 }
342 }
343 }
343 }
344
344
345 #context-bar > h2 {
345 #context-bar > h2 {
346 font-size: 20px;
346 font-size: 20px;
347 }
347 }
348
348
349 #context-bar > h2> a {
349 #context-bar > h2> a {
350 font-size: 20px;
350 font-size: 20px;
351 }
351 }
352 // end of defaults
352 // end of defaults
353
353
354 .file_diff_buttons {
354 .file_diff_buttons {
355 padding: 0 0 @padding;
355 padding: 0 0 @padding;
356
356
357 .drop-menu {
357 .drop-menu {
358 float: left;
358 float: left;
359 margin: 0 @padding 0 0;
359 margin: 0 @padding 0 0;
360 }
360 }
361 .btn {
361 .btn {
362 margin: 0 @padding 0 0;
362 margin: 0 @padding 0 0;
363 }
363 }
364 }
364 }
365
365
366 .code-body.textarea.editor {
366 .code-body.textarea.editor {
367 max-width: none;
367 max-width: none;
368 padding: 15px;
368 padding: 15px;
369 }
369 }
370
370
371 td.injected_diff{
371 td.injected_diff{
372 max-width: 1178px;
372 max-width: 1178px;
373 overflow-x: auto;
373 overflow-x: auto;
374 overflow-y: hidden;
374 overflow-y: hidden;
375
375
376 div.diff-container,
376 div.diff-container,
377 div.diffblock{
377 div.diffblock{
378 max-width: 100%;
378 max-width: 100%;
379 }
379 }
380
380
381 div.code-body {
381 div.code-body {
382 max-width: 1124px;
382 max-width: 1124px;
383 overflow-x: auto;
383 overflow-x: auto;
384 overflow-y: hidden;
384 overflow-y: hidden;
385 padding: 0;
385 padding: 0;
386 }
386 }
387 div.diffblock {
387 div.diffblock {
388 border: none;
388 border: none;
389 }
389 }
390
390
391 &.inline-form {
391 &.inline-form {
392 width: 99%
392 width: 99%
393 }
393 }
394 }
394 }
395
395
396
396
397 table.code-difftable {
397 table.code-difftable {
398 width: 100%;
398 width: 100%;
399 }
399 }
400
400
401 /** PYGMENTS COLORING **/
401 /** PYGMENTS COLORING **/
402 div.codeblock {
402 div.codeblock {
403
403
404 // TODO: johbo: Added interim to get rid of the margin around
404 // TODO: johbo: Added interim to get rid of the margin around
405 // Select2 widgets. This needs further cleanup.
405 // Select2 widgets. This needs further cleanup.
406 margin-top: @padding;
406 margin-top: @padding;
407
407
408 overflow: auto;
408 overflow: auto;
409 padding: 0px;
409 padding: 0px;
410 border: @border-thickness solid @grey5;
410 border: @border-thickness solid @grey5;
411 background: @grey6;
411 background: @grey6;
412 .border-radius(@border-radius);
412 .border-radius(@border-radius);
413
413
414 #remove_gist {
414 #remove_gist {
415 float: right;
415 float: right;
416 }
416 }
417
417
418 .gist_url {
418 .gist_url {
419 padding: 0px 0px 10px 0px;
419 padding: 0px 0px 10px 0px;
420 }
420 }
421
421
422 .author {
422 .author {
423 clear: both;
423 clear: both;
424 vertical-align: middle;
424 vertical-align: middle;
425 font-family: @text-bold;
425 font-family: @text-bold;
426 }
426 }
427
427
428 .btn-mini {
428 .btn-mini {
429 float: left;
429 float: left;
430 margin: 0 5px 0 0;
430 margin: 0 5px 0 0;
431 }
431 }
432
432
433 .code-header {
433 .code-header {
434 padding: @padding;
434 padding: @padding;
435 border-bottom: @border-thickness solid @grey5;
435 border-bottom: @border-thickness solid @grey5;
436
436
437 .rc-user {
437 .rc-user {
438 min-width: 0;
438 min-width: 0;
439 margin-right: .5em;
439 margin-right: .5em;
440 }
440 }
441
441
442 .stats {
442 .stats {
443 clear: both;
443 clear: both;
444 margin: 0 0 @padding 0;
444 margin: 0 0 @padding 0;
445 padding: 0;
445 padding: 0;
446 .left {
446 .left {
447 float: left;
447 float: left;
448 clear: left;
448 clear: left;
449 max-width: 75%;
449 max-width: 75%;
450 margin: 0 0 @padding 0;
450 margin: 0 0 @padding 0;
451
451
452 &.item {
452 &.item {
453 margin-right: @padding;
453 margin-right: @padding;
454 &.last { border-right: none; }
454 &.last { border-right: none; }
455 }
455 }
456 }
456 }
457 .buttons { float: right; }
457 .buttons { float: right; }
458 .author {
458 .author {
459 height: 25px; margin-left: 15px; font-weight: bold;
459 height: 25px; margin-left: 15px; font-weight: bold;
460 }
460 }
461 }
461 }
462
462
463 .commit {
463 .commit {
464 margin: 5px 0 0 26px;
464 margin: 5px 0 0 26px;
465 font-weight: normal;
465 font-weight: normal;
466 white-space: pre-wrap;
466 white-space: pre-wrap;
467 }
467 }
468 }
468 }
469
469
470 .message {
470 .message {
471 position: relative;
471 position: relative;
472 margin: @padding;
472 margin: @padding;
473
473
474 .codeblock-label {
474 .codeblock-label {
475 margin: 0 0 1em 0;
475 margin: 0 0 1em 0;
476 }
476 }
477 }
477 }
478
478
479 .code-body {
479 .code-body {
480 padding: @padding;
480 padding: @padding;
481 background-color: #ffffff;
481 background-color: #ffffff;
482 min-width: 100%;
482 min-width: 100%;
483 box-sizing: border-box;
483 box-sizing: border-box;
484 // TODO: johbo: Parent has overflow: auto, this forces the child here
484 // TODO: johbo: Parent has overflow: auto, this forces the child here
485 // to have the intended size and to scroll. Should be simplified.
485 // to have the intended size and to scroll. Should be simplified.
486 width: 100%;
486 width: 100%;
487 overflow-x: auto;
487 overflow-x: auto;
488
488
489 img.rendered-binary {
489 img.rendered-binary {
490 height: auto;
490 height: auto;
491 width: 100%;
491 width: 100%;
492 }
492 }
493 }
493 }
494 }
494 }
495
495
496 .code-highlighttable,
496 .code-highlighttable,
497 div.codeblock {
497 div.codeblock {
498
498
499 &.readme {
499 &.readme {
500 background-color: white;
500 background-color: white;
501 }
501 }
502
502
503 .markdown-block table {
503 .markdown-block table {
504 border-collapse: collapse;
504 border-collapse: collapse;
505
505
506 th,
506 th,
507 td {
507 td {
508 padding: .5em;
508 padding: .5em;
509 border: @border-thickness solid @border-default-color;
509 border: @border-thickness solid @border-default-color;
510 }
510 }
511 }
511 }
512
512
513 table {
513 table {
514 border: 0px;
514 border: 0px;
515 margin: 0;
515 margin: 0;
516 letter-spacing: normal;
516 letter-spacing: normal;
517
517
518
518
519 td {
519 td {
520 border: 0px;
520 border: 0px;
521 vertical-align: top;
521 vertical-align: top;
522 }
522 }
523 }
523 }
524 }
524 }
525
525
526 div.codeblock .code-header .search-path { padding: 0 0 0 10px; }
526 div.codeblock .code-header .search-path { padding: 0 0 0 10px; }
527 div.search-code-body {
527 div.search-code-body {
528 background-color: #ffffff; padding: 5px 0 5px 10px;
528 background-color: #ffffff; padding: 5px 0 5px 10px;
529 pre {
529 pre {
530 .match { background-color: #faffa6;}
530 .match { background-color: #faffa6;}
531 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
531 .break { display: block; width: 100%; background-color: #DDE7EF; color: #747474; }
532 }
532 }
533 .code-highlighttable {
533 .code-highlighttable {
534 border-collapse: collapse;
534 border-collapse: collapse;
535
535
536 tr:hover {
536 tr:hover {
537 background: #fafafa;
537 background: #fafafa;
538 }
538 }
539 td.code {
539 td.code {
540 padding-left: 10px;
540 padding-left: 10px;
541 }
541 }
542 td.line {
542 td.line {
543 border-right: 1px solid #ccc !important;
543 border-right: 1px solid #ccc !important;
544 padding-right: 10px;
544 padding-right: 10px;
545 text-align: right;
545 text-align: right;
546 font-family: "Lucida Console",Monaco,monospace;
546 font-family: "Lucida Console",Monaco,monospace;
547 span {
547 span {
548 white-space: pre-wrap;
548 white-space: pre-wrap;
549 color: #666666;
549 color: #666666;
550 }
550 }
551 }
551 }
552 }
552 }
553 }
553 }
554
554
555 div.annotatediv { margin-left: 2px; margin-right: 4px; }
555 div.annotatediv { margin-left: 2px; margin-right: 4px; }
556 .code-highlight {
556 .code-highlight {
557 margin: 0; padding: 0; border-left: @border-thickness solid @grey5;
557 margin: 0; padding: 0; border-left: @border-thickness solid @grey5;
558 pre, .linenodiv pre { padding: 0 5px; margin: 0; }
558 pre, .linenodiv pre { padding: 0 5px; margin: 0; }
559 pre div:target {background-color: @comment-highlight-color !important;}
559 pre div:target {background-color: @comment-highlight-color !important;}
560 }
560 }
561
561
562 .linenos a { text-decoration: none; }
562 .linenos a { text-decoration: none; }
563
563
564 .CodeMirror-selected { background: @rchighlightblue; }
564 .CodeMirror-selected { background: @rchighlightblue; }
565 .CodeMirror-focused .CodeMirror-selected { background: @rchighlightblue; }
565 .CodeMirror-focused .CodeMirror-selected { background: @rchighlightblue; }
566 .CodeMirror ::selection { background: @rchighlightblue; }
566 .CodeMirror ::selection { background: @rchighlightblue; }
567 .CodeMirror ::-moz-selection { background: @rchighlightblue; }
567 .CodeMirror ::-moz-selection { background: @rchighlightblue; }
568
568
569 .code { display: block; border:0px !important; }
569 .code { display: block; border:0px !important; }
570 .code-highlight, /* TODO: dan: merge codehilite into code-highlight */
570 .code-highlight, /* TODO: dan: merge codehilite into code-highlight */
571 .codehilite {
571 .codehilite {
572 .hll { background-color: #ffffcc }
572 .hll { background-color: #ffffcc }
573 .c { color: #408080; font-style: italic } /* Comment */
573 .c { color: #408080; font-style: italic } /* Comment */
574 .err, .codehilite .err { border: none } /* Error */
574 .err, .codehilite .err { border: none } /* Error */
575 .k { color: #008000; font-weight: bold } /* Keyword */
575 .k { color: #008000; font-weight: bold } /* Keyword */
576 .o { color: #666666 } /* Operator */
576 .o { color: #666666 } /* Operator */
577 .cm { color: #408080; font-style: italic } /* Comment.Multiline */
577 .cm { color: #408080; font-style: italic } /* Comment.Multiline */
578 .cp { color: #BC7A00 } /* Comment.Preproc */
578 .cp { color: #BC7A00 } /* Comment.Preproc */
579 .c1 { color: #408080; font-style: italic } /* Comment.Single */
579 .c1 { color: #408080; font-style: italic } /* Comment.Single */
580 .cs { color: #408080; font-style: italic } /* Comment.Special */
580 .cs { color: #408080; font-style: italic } /* Comment.Special */
581 .gd { color: #A00000 } /* Generic.Deleted */
581 .gd { color: #A00000 } /* Generic.Deleted */
582 .ge { font-style: italic } /* Generic.Emph */
582 .ge { font-style: italic } /* Generic.Emph */
583 .gr { color: #FF0000 } /* Generic.Error */
583 .gr { color: #FF0000 } /* Generic.Error */
584 .gh { color: #000080; font-weight: bold } /* Generic.Heading */
584 .gh { color: #000080; font-weight: bold } /* Generic.Heading */
585 .gi { color: #00A000 } /* Generic.Inserted */
585 .gi { color: #00A000 } /* Generic.Inserted */
586 .go { color: #808080 } /* Generic.Output */
586 .go { color: #808080 } /* Generic.Output */
587 .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
587 .gp { color: #000080; font-weight: bold } /* Generic.Prompt */
588 .gs { font-weight: bold } /* Generic.Strong */
588 .gs { font-weight: bold } /* Generic.Strong */
589 .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
589 .gu { color: #800080; font-weight: bold } /* Generic.Subheading */
590 .gt { color: #0040D0 } /* Generic.Traceback */
590 .gt { color: #0040D0 } /* Generic.Traceback */
591 .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
591 .kc { color: #008000; font-weight: bold } /* Keyword.Constant */
592 .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
592 .kd { color: #008000; font-weight: bold } /* Keyword.Declaration */
593 .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
593 .kn { color: #008000; font-weight: bold } /* Keyword.Namespace */
594 .kp { color: #008000 } /* Keyword.Pseudo */
594 .kp { color: #008000 } /* Keyword.Pseudo */
595 .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
595 .kr { color: #008000; font-weight: bold } /* Keyword.Reserved */
596 .kt { color: #B00040 } /* Keyword.Type */
596 .kt { color: #B00040 } /* Keyword.Type */
597 .m { color: #666666 } /* Literal.Number */
597 .m { color: #666666 } /* Literal.Number */
598 .s { color: #BA2121 } /* Literal.String */
598 .s { color: #BA2121 } /* Literal.String */
599 .na { color: #7D9029 } /* Name.Attribute */
599 .na { color: #7D9029 } /* Name.Attribute */
600 .nb { color: #008000 } /* Name.Builtin */
600 .nb { color: #008000 } /* Name.Builtin */
601 .nc { color: #0000FF; font-weight: bold } /* Name.Class */
601 .nc { color: #0000FF; font-weight: bold } /* Name.Class */
602 .no { color: #880000 } /* Name.Constant */
602 .no { color: #880000 } /* Name.Constant */
603 .nd { color: #AA22FF } /* Name.Decorator */
603 .nd { color: #AA22FF } /* Name.Decorator */
604 .ni { color: #999999; font-weight: bold } /* Name.Entity */
604 .ni { color: #999999; font-weight: bold } /* Name.Entity */
605 .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
605 .ne { color: #D2413A; font-weight: bold } /* Name.Exception */
606 .nf { color: #0000FF } /* Name.Function */
606 .nf { color: #0000FF } /* Name.Function */
607 .nl { color: #A0A000 } /* Name.Label */
607 .nl { color: #A0A000 } /* Name.Label */
608 .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
608 .nn { color: #0000FF; font-weight: bold } /* Name.Namespace */
609 .nt { color: #008000; font-weight: bold } /* Name.Tag */
609 .nt { color: #008000; font-weight: bold } /* Name.Tag */
610 .nv { color: #19177C } /* Name.Variable */
610 .nv { color: #19177C } /* Name.Variable */
611 .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
611 .ow { color: #AA22FF; font-weight: bold } /* Operator.Word */
612 .w { color: #bbbbbb } /* Text.Whitespace */
612 .w { color: #bbbbbb } /* Text.Whitespace */
613 .mf { color: #666666 } /* Literal.Number.Float */
613 .mf { color: #666666 } /* Literal.Number.Float */
614 .mh { color: #666666 } /* Literal.Number.Hex */
614 .mh { color: #666666 } /* Literal.Number.Hex */
615 .mi { color: #666666 } /* Literal.Number.Integer */
615 .mi { color: #666666 } /* Literal.Number.Integer */
616 .mo { color: #666666 } /* Literal.Number.Oct */
616 .mo { color: #666666 } /* Literal.Number.Oct */
617 .sb { color: #BA2121 } /* Literal.String.Backtick */
617 .sb { color: #BA2121 } /* Literal.String.Backtick */
618 .sc { color: #BA2121 } /* Literal.String.Char */
618 .sc { color: #BA2121 } /* Literal.String.Char */
619 .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
619 .sd { color: #BA2121; font-style: italic } /* Literal.String.Doc */
620 .s2 { color: #BA2121 } /* Literal.String.Double */
620 .s2 { color: #BA2121 } /* Literal.String.Double */
621 .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
621 .se { color: #BB6622; font-weight: bold } /* Literal.String.Escape */
622 .sh { color: #BA2121 } /* Literal.String.Heredoc */
622 .sh { color: #BA2121 } /* Literal.String.Heredoc */
623 .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
623 .si { color: #BB6688; font-weight: bold } /* Literal.String.Interpol */
624 .sx { color: #008000 } /* Literal.String.Other */
624 .sx { color: #008000 } /* Literal.String.Other */
625 .sr { color: #BB6688 } /* Literal.String.Regex */
625 .sr { color: #BB6688 } /* Literal.String.Regex */
626 .s1 { color: #BA2121 } /* Literal.String.Single */
626 .s1 { color: #BA2121 } /* Literal.String.Single */
627 .ss { color: #19177C } /* Literal.String.Symbol */
627 .ss { color: #19177C } /* Literal.String.Symbol */
628 .bp { color: #008000 } /* Name.Builtin.Pseudo */
628 .bp { color: #008000 } /* Name.Builtin.Pseudo */
629 .vc { color: #19177C } /* Name.Variable.Class */
629 .vc { color: #19177C } /* Name.Variable.Class */
630 .vg { color: #19177C } /* Name.Variable.Global */
630 .vg { color: #19177C } /* Name.Variable.Global */
631 .vi { color: #19177C } /* Name.Variable.Instance */
631 .vi { color: #19177C } /* Name.Variable.Instance */
632 .il { color: #666666 } /* Literal.Number.Integer.Long */
632 .il { color: #666666 } /* Literal.Number.Integer.Long */
633 }
633 }
634
634
635 /* customized pre blocks for markdown/rst */
635 /* customized pre blocks for markdown/rst */
636 pre.literal-block, .codehilite pre{
636 pre.literal-block, .codehilite pre{
637 padding: @padding;
637 padding: @padding;
638 border: 1px solid @grey6;
638 border: 1px solid @grey6;
639 .border-radius(@border-radius);
639 .border-radius(@border-radius);
640 background-color: @grey7;
640 background-color: @grey7;
641 }
641 }
642
642
643
643
644 /* START NEW CODE BLOCK CSS */
644 /* START NEW CODE BLOCK CSS */
645
645
646 @cb-line-height: 18px;
646 @cb-line-height: 18px;
647 @cb-line-code-padding: 10px;
647 @cb-line-code-padding: 10px;
648 @cb-text-padding: 5px;
648 @cb-text-padding: 5px;
649
649
650 @pill-padding: 2px 7px;
650 @pill-padding: 2px 7px;
651 @pill-padding-small: 2px 2px 1px 2px;
651 @pill-padding-small: 2px 2px 1px 2px;
652
652
653 input.filediff-collapse-state {
653 input.filediff-collapse-state {
654 display: none;
654 display: none;
655
655
656 &:checked + .filediff { /* file diff is collapsed */
656 &:checked + .filediff { /* file diff is collapsed */
657 .cb {
657 .cb {
658 display: none
658 display: none
659 }
659 }
660 .filediff-collapse-indicator {
660 .filediff-collapse-indicator {
661 width: 0;
661 width: 0;
662 height: 0;
662 height: 0;
663 border-style: solid;
663 border-style: solid;
664 border-width: 4.5px 0 4.5px 9.3px;
664 border-width: 4.5px 0 4.5px 9.3px;
665 border-color: transparent transparent transparent #aaa;
665 border-color: transparent transparent transparent #aaa;
666 margin: 6px 0px;
666 margin: 6px 0px;
667 }
667 }
668 .filediff-menu {
668 .filediff-menu {
669 display: none;
669 display: none;
670 }
670 }
671 margin: 10px 0 0 0;
671
672 }
672 }
673
673
674 &+ .filediff { /* file diff is expanded */
674 &+ .filediff { /* file diff is expanded */
675 .filediff-collapse-indicator {
675 .filediff-collapse-indicator {
676 width: 0;
676 width: 0;
677 height: 0;
677 height: 0;
678 border-style: solid;
678 border-style: solid;
679 border-width: 9.3px 4.5px 0 4.5px;
679 border-width: 9.3px 4.5px 0 4.5px;
680 border-color: #aaa transparent transparent transparent;
680 border-color: #aaa transparent transparent transparent;
681 margin: 6px 0px;
681 margin: 6px 0px;
682
682
683 }
683 }
684 .filediff-menu {
684 .filediff-menu {
685 display: block;
685 display: block;
686 }
686 }
687 margin: 10px 0;
687 margin: 10px 0;
688 &:nth-child(2) {
688 &:nth-child(2) {
689 margin: 0;
689 margin: 0;
690 }
690 }
691 }
691 }
692 }
692 }
693
694 .filediffs .anchor {
695 display: block;
696 height: 40px;
697 margin-top: -40px;
698 visibility: hidden;
699 }
700
701 .filediffs .anchor:nth-of-type(1) {
702 display: block;
703 height: 80px;
704 margin-top: -80px;
705 visibility: hidden;
706 }
707
693 .cs_files {
708 .cs_files {
694 clear: both;
709 clear: both;
695 }
710 }
696
711
712 #diff-file-sticky{
713 will-change: min-height;
714 }
715
716 .sidebar__inner{
717 transform: translate(0, 0); /* For browsers don't support translate3d. */
718 transform: translate3d(0, 0, 0);
719 will-change: position, transform;
720 height: 60px;
721 }
722
723 .fpath-placeholder {
724 clear: both;
725 visibility: hidden
726 }
727
728 .is-affixed {
729 .sidebar_inner_shadow {
730 position: fixed;
731 top: 43px;
732 right: 0;
733 left: 0;
734 z-index: 28;
735 display: block;
736 height: 5px;
737 content: "";
738 background: linear-gradient(rgba(0, 0, 0, 0.075), rgba(0, 0, 0, 0.001)) repeat-x 0 0;
739 border-top: 1px solid rgba(0, 0, 0, 0.15);
740 }
741 .fpath-placeholder {
742 visibility: visible !important;
743 }
744 }
745
697 .diffset-menu {
746 .diffset-menu {
698 margin-bottom: 20px;
747 margin-bottom: 20px;
699 }
748 }
700 .diffset {
749 .diffset {
701 margin: 20px auto;
750 margin: 20px auto;
702 .diffset-heading {
751 .diffset-heading {
703 border: 1px solid @grey5;
752 border: 1px solid @grey5;
704 margin-bottom: -1px;
753 margin-bottom: -1px;
705 // margin-top: 20px;
754 // margin-top: 20px;
706 h2 {
755 h2 {
707 margin: 0;
756 margin: 0;
708 line-height: 38px;
757 line-height: 38px;
709 padding-left: 10px;
758 padding-left: 10px;
710 }
759 }
711 .btn {
760 .btn {
712 margin: 0;
761 margin: 0;
713 }
762 }
714 background: @grey6;
763 background: @grey6;
715 display: block;
764 display: block;
716 padding: 5px;
765 padding: 5px;
717 }
766 }
718 .diffset-heading-warning {
767 .diffset-heading-warning {
719 background: @alert3-inner;
768 background: @alert3-inner;
720 border: 1px solid @alert3;
769 border: 1px solid @alert3;
721 }
770 }
722 &.diffset-comments-disabled {
771 &.diffset-comments-disabled {
723 .cb-comment-box-opener, .comment-inline-form, .cb-comment-add-button {
772 .cb-comment-box-opener, .comment-inline-form, .cb-comment-add-button {
724 display: none !important;
773 display: none !important;
725 }
774 }
726 }
775 }
727 }
776 }
728
777
729 .filelist {
778 .filelist {
730 .pill {
779 .pill {
731 display: block;
780 display: block;
732 float: left;
781 float: left;
733 padding: @pill-padding-small;
782 padding: @pill-padding-small;
734 }
783 }
735 }
784 }
736
785
737 .pill {
786 .pill {
738 display: block;
787 display: block;
739 float: left;
788 float: left;
740 padding: @pill-padding;
789 padding: @pill-padding;
741 }
790 }
742
791
743 .pill-group {
792 .pill-group {
744 .pill {
793 .pill {
745 opacity: .8;
794 opacity: .8;
746 margin-right: 3px;
795 margin-right: 3px;
747
796
748 &:first-child {
797 &:first-child {
749 border-radius: @border-radius 0 0 @border-radius;
798 border-radius: @border-radius 0 0 @border-radius;
750 }
799 }
751 &:last-child {
800 &:last-child {
752 border-radius: 0 @border-radius @border-radius 0;
801 border-radius: 0 @border-radius @border-radius 0;
753 }
802 }
754 &:only-child {
803 &:only-child {
755 border-radius: @border-radius;
804 border-radius: @border-radius;
756 margin-right: 0;
805 margin-right: 0;
757 }
806 }
758 }
807 }
759 }
808 }
760
809
761 /* Main comments*/
810 /* Main comments*/
762 #comments {
811 #comments {
763 .comment-selected {
812 .comment-selected {
764 border-left: 6px solid @comment-highlight-color;
813 border-left: 6px solid @comment-highlight-color;
765 padding-left: 3px;
814 padding-left: 3px;
766 margin-left: -9px;
815 margin-left: -9px;
767 }
816 }
768 }
817 }
769
818
770 .filediff {
819 .filediff {
771 border: 1px solid @grey5;
820 border: 1px solid @grey5;
772
821
773 /* START OVERRIDES */
822 /* START OVERRIDES */
774 .code-highlight {
823 .code-highlight {
775 border: none; // TODO: remove this border from the global
824 border: none; // TODO: remove this border from the global
776 // .code-highlight, it doesn't belong there
825 // .code-highlight, it doesn't belong there
777 }
826 }
778 label {
827 label {
779 margin: 0; // TODO: remove this margin definition from global label
828 margin: 0; // TODO: remove this margin definition from global label
780 // it doesn't belong there - if margin on labels
829 // it doesn't belong there - if margin on labels
781 // are needed for a form they should be defined
830 // are needed for a form they should be defined
782 // in the form's class
831 // in the form's class
783 }
832 }
784 /* END OVERRIDES */
833 /* END OVERRIDES */
785
834
786 * {
835 * {
787 box-sizing: border-box;
836 box-sizing: border-box;
788 }
837 }
789 .filediff-anchor {
838 .filediff-anchor {
790 visibility: hidden;
839 visibility: hidden;
791 }
840 }
792 &:hover {
841 &:hover {
793 .filediff-anchor {
842 .filediff-anchor {
794 visibility: visible;
843 visibility: visible;
795 }
844 }
796 }
845 }
797
846
798 .filediff-collapse-indicator {
847 .filediff-collapse-indicator {
799 border-style: solid;
848 border-style: solid;
800 float: left;
849 float: left;
801 margin: 4px 0px 0 0;
850 margin: 4px 0px 0 0;
802 cursor: pointer;
851 cursor: pointer;
803 }
852 }
804
853
805 .filediff-heading {
854 .filediff-heading {
806 background: @grey7;
855 background: @grey7;
807 cursor: pointer;
856 cursor: pointer;
808 display: block;
857 display: block;
809 padding: 5px 10px;
858 padding: 5px 10px;
810 }
859 }
811 .filediff-heading:after {
860 .filediff-heading:after {
812 content: "";
861 content: "";
813 display: table;
862 display: table;
814 clear: both;
863 clear: both;
815 }
864 }
816 .filediff-heading:hover {
865 .filediff-heading:hover {
817 background: #e1e9f4 !important;
866 background: #e1e9f4 !important;
818 }
867 }
819
868
820 .filediff-menu {
869 .filediff-menu {
821 float: right;
870 float: right;
822 text-align: right;
871 text-align: right;
823 padding: 5px 5px 5px 0px;
872 padding: 5px 5px 5px 0px;
824
873
825 &> a,
874 &> a,
826 &> span {
875 &> span {
827 padding: 1px;
876 padding: 1px;
828 }
877 }
829 }
878 }
830
879
831 .filediff-collapse-button, .filediff-expand-button {
880 .filediff-collapse-button, .filediff-expand-button {
832 cursor: pointer;
881 cursor: pointer;
833 }
882 }
834 .filediff-collapse-button {
883 .filediff-collapse-button {
835 display: inline;
884 display: inline;
836 }
885 }
837 .filediff-expand-button {
886 .filediff-expand-button {
838 display: none;
887 display: none;
839 }
888 }
840 .filediff-collapsed .filediff-collapse-button {
889 .filediff-collapsed .filediff-collapse-button {
841 display: none;
890 display: none;
842 }
891 }
843 .filediff-collapsed .filediff-expand-button {
892 .filediff-collapsed .filediff-expand-button {
844 display: inline;
893 display: inline;
845 }
894 }
846
895
847 /**** COMMENTS ****/
896 /**** COMMENTS ****/
848
897
849 .filediff-menu {
898 .filediff-menu {
850 .show-comment-button {
899 .show-comment-button {
851 display: none;
900 display: none;
852 }
901 }
853 }
902 }
854 &.hide-comments {
903 &.hide-comments {
855 .inline-comments {
904 .inline-comments {
856 display: none;
905 display: none;
857 }
906 }
858 .filediff-menu {
907 .filediff-menu {
859 .show-comment-button {
908 .show-comment-button {
860 display: inline;
909 display: inline;
861 }
910 }
862 .hide-comment-button {
911 .hide-comment-button {
863 display: none;
912 display: none;
864 }
913 }
865 }
914 }
866 }
915 }
867
916
868 .hide-line-comments {
917 .hide-line-comments {
869 .inline-comments {
918 .inline-comments {
870 display: none;
919 display: none;
871 }
920 }
872 }
921 }
873
922
874 /**** END COMMENTS ****/
923 /**** END COMMENTS ****/
875
924
876 }
925 }
877
926
878
927
879
928
880 .filediff, .filelist {
929 .filediff, .filelist {
881 .pill {
930 .pill {
882 &[op="name"] {
931 &[op="name"] {
883 background: none;
932 background: none;
884 opacity: 1;
933 opacity: 1;
885 color: white;
934 color: white;
886 }
935 }
887 &[op="limited"] {
936 &[op="limited"] {
888 background: @grey2;
937 background: @grey2;
889 color: white;
938 color: white;
890 }
939 }
891 &[op="binary"] {
940 &[op="binary"] {
892 background: @color7;
941 background: @color7;
893 color: white;
942 color: white;
894 }
943 }
895 &[op="modified"] {
944 &[op="modified"] {
896 background: @alert1;
945 background: @alert1;
897 color: white;
946 color: white;
898 }
947 }
899 &[op="renamed"] {
948 &[op="renamed"] {
900 background: @color4;
949 background: @color4;
901 color: white;
950 color: white;
902 }
951 }
903 &[op="copied"] {
952 &[op="copied"] {
904 background: @color4;
953 background: @color4;
905 color: white;
954 color: white;
906 }
955 }
907 &[op="mode"] {
956 &[op="mode"] {
908 background: @grey3;
957 background: @grey3;
909 color: white;
958 color: white;
910 }
959 }
911 &[op="symlink"] {
960 &[op="symlink"] {
912 background: @color8;
961 background: @color8;
913 color: white;
962 color: white;
914 }
963 }
915
964
916 &[op="added"] { /* added lines */
965 &[op="added"] { /* added lines */
917 background: @alert1;
966 background: @alert1;
918 color: white;
967 color: white;
919 }
968 }
920 &[op="deleted"] { /* deleted lines */
969 &[op="deleted"] { /* deleted lines */
921 background: @alert2;
970 background: @alert2;
922 color: white;
971 color: white;
923 }
972 }
924
973
925 &[op="created"] { /* created file */
974 &[op="created"] { /* created file */
926 background: @alert1;
975 background: @alert1;
927 color: white;
976 color: white;
928 }
977 }
929 &[op="removed"] { /* deleted file */
978 &[op="removed"] { /* deleted file */
930 background: @color5;
979 background: @color5;
931 color: white;
980 color: white;
932 }
981 }
933 }
982 }
934 }
983 }
935
984
936
985
937 .filediff-outdated {
986 .filediff-outdated {
938 padding: 8px 0;
987 padding: 8px 0;
939
988
940 .filediff-heading {
989 .filediff-heading {
941 opacity: .5;
990 opacity: .5;
942 }
991 }
943 }
992 }
944
993
945 table.cb {
994 table.cb {
946 width: 100%;
995 width: 100%;
947 border-collapse: collapse;
996 border-collapse: collapse;
948
997
949 .cb-text {
998 .cb-text {
950 padding: @cb-text-padding;
999 padding: @cb-text-padding;
951 }
1000 }
952 .cb-hunk {
1001 .cb-hunk {
953 padding: @cb-text-padding;
1002 padding: @cb-text-padding;
954 }
1003 }
955 .cb-expand {
1004 .cb-expand {
956 display: none;
1005 display: none;
957 }
1006 }
958 .cb-collapse {
1007 .cb-collapse {
959 display: inline;
1008 display: inline;
960 }
1009 }
961 &.cb-collapsed {
1010 &.cb-collapsed {
962 .cb-line {
1011 .cb-line {
963 display: none;
1012 display: none;
964 }
1013 }
965 .cb-expand {
1014 .cb-expand {
966 display: inline;
1015 display: inline;
967 }
1016 }
968 .cb-collapse {
1017 .cb-collapse {
969 display: none;
1018 display: none;
970 }
1019 }
971 }
1020 }
972
1021
973 /* intentionally general selector since .cb-line-selected must override it
1022 /* intentionally general selector since .cb-line-selected must override it
974 and they both use !important since the td itself may have a random color
1023 and they both use !important since the td itself may have a random color
975 generated by annotation blocks. TLDR: if you change it, make sure
1024 generated by annotation blocks. TLDR: if you change it, make sure
976 annotated block selection and line selection in file view still work */
1025 annotated block selection and line selection in file view still work */
977 .cb-line-fresh .cb-content {
1026 .cb-line-fresh .cb-content {
978 background: white !important;
1027 background: white !important;
979 }
1028 }
980 .cb-warning {
1029 .cb-warning {
981 background: #fff4dd;
1030 background: #fff4dd;
982 }
1031 }
983
1032
984 &.cb-diff-sideside {
1033 &.cb-diff-sideside {
985 td {
1034 td {
986 &.cb-content {
1035 &.cb-content {
987 width: 50%;
1036 width: 50%;
988 }
1037 }
989 }
1038 }
990 }
1039 }
991
1040
992 tr {
1041 tr {
993 &.cb-annotate {
1042 &.cb-annotate {
994 border-top: 1px solid #eee;
1043 border-top: 1px solid #eee;
995 }
1044 }
996
1045
997 &.cb-comment-info {
1046 &.cb-comment-info {
998 border-top: 1px solid #eee;
1047 border-top: 1px solid #eee;
999 color: rgba(0, 0, 0, 0.3);
1048 color: rgba(0, 0, 0, 0.3);
1000 background: #edf2f9;
1049 background: #edf2f9;
1001
1050
1002 td {
1051 td {
1003
1052
1004 }
1053 }
1005 }
1054 }
1006
1055
1007 &.cb-hunk {
1056 &.cb-hunk {
1008 font-family: @font-family-monospace;
1057 font-family: @font-family-monospace;
1009 color: rgba(0, 0, 0, 0.3);
1058 color: rgba(0, 0, 0, 0.3);
1010
1059
1011 td {
1060 td {
1012 &:first-child {
1061 &:first-child {
1013 background: #edf2f9;
1062 background: #edf2f9;
1014 }
1063 }
1015 &:last-child {
1064 &:last-child {
1016 background: #f4f7fb;
1065 background: #f4f7fb;
1017 }
1066 }
1018 }
1067 }
1019 }
1068 }
1020 }
1069 }
1021
1070
1022
1071
1023 td {
1072 td {
1024 vertical-align: top;
1073 vertical-align: top;
1025 padding: 0;
1074 padding: 0;
1026
1075
1027 &.cb-content {
1076 &.cb-content {
1028 font-size: 12.35px;
1077 font-size: 12.35px;
1029
1078
1030 &.cb-line-selected .cb-code {
1079 &.cb-line-selected .cb-code {
1031 background: @comment-highlight-color !important;
1080 background: @comment-highlight-color !important;
1032 }
1081 }
1033
1082
1034 span.cb-code {
1083 span.cb-code {
1035 line-height: @cb-line-height;
1084 line-height: @cb-line-height;
1036 padding-left: @cb-line-code-padding;
1085 padding-left: @cb-line-code-padding;
1037 padding-right: @cb-line-code-padding;
1086 padding-right: @cb-line-code-padding;
1038 display: block;
1087 display: block;
1039 white-space: pre-wrap;
1088 white-space: pre-wrap;
1040 font-family: @font-family-monospace;
1089 font-family: @font-family-monospace;
1041 word-break: break-all;
1090 word-break: break-all;
1042 .nonl {
1091 .nonl {
1043 color: @color5;
1092 color: @color5;
1044 }
1093 }
1045 }
1094 }
1046
1095
1047 &> button.cb-comment-box-opener {
1096 &> button.cb-comment-box-opener {
1048
1097
1049 padding: 2px 2px 1px 3px;
1098 padding: 2px 2px 1px 3px;
1050 margin-left: -6px;
1099 margin-left: -6px;
1051 margin-top: -1px;
1100 margin-top: -1px;
1052
1101
1053 border-radius: @border-radius;
1102 border-radius: @border-radius;
1054 position: absolute;
1103 position: absolute;
1055 display: none;
1104 display: none;
1056 }
1105 }
1057 .cb-comment {
1106 .cb-comment {
1058 margin-top: 10px;
1107 margin-top: 10px;
1059 white-space: normal;
1108 white-space: normal;
1060 }
1109 }
1061 }
1110 }
1062 &:hover {
1111 &:hover {
1063 button.cb-comment-box-opener {
1112 button.cb-comment-box-opener {
1064 display: block;
1113 display: block;
1065 }
1114 }
1066 &+ td button.cb-comment-box-opener {
1115 &+ td button.cb-comment-box-opener {
1067 display: block
1116 display: block
1068 }
1117 }
1069 }
1118 }
1070
1119
1071 &.cb-data {
1120 &.cb-data {
1072 text-align: right;
1121 text-align: right;
1073 width: 30px;
1122 width: 30px;
1074 font-family: @font-family-monospace;
1123 font-family: @font-family-monospace;
1075
1124
1076 .icon-comment {
1125 .icon-comment {
1077 cursor: pointer;
1126 cursor: pointer;
1078 }
1127 }
1079 &.cb-line-selected > div {
1128 &.cb-line-selected > div {
1080 display: block;
1129 display: block;
1081 background: @comment-highlight-color !important;
1130 background: @comment-highlight-color !important;
1082 line-height: @cb-line-height;
1131 line-height: @cb-line-height;
1083 color: rgba(0, 0, 0, 0.3);
1132 color: rgba(0, 0, 0, 0.3);
1084 }
1133 }
1085 }
1134 }
1086
1135
1087 &.cb-lineno {
1136 &.cb-lineno {
1088 padding: 0;
1137 padding: 0;
1089 width: 50px;
1138 width: 50px;
1090 color: rgba(0, 0, 0, 0.3);
1139 color: rgba(0, 0, 0, 0.3);
1091 text-align: right;
1140 text-align: right;
1092 border-right: 1px solid #eee;
1141 border-right: 1px solid #eee;
1093 font-family: @font-family-monospace;
1142 font-family: @font-family-monospace;
1094 -webkit-user-select: none;
1143 -webkit-user-select: none;
1095 -moz-user-select: none;
1144 -moz-user-select: none;
1096 user-select: none;
1145 user-select: none;
1097
1146
1098 a::before {
1147 a::before {
1099 content: attr(data-line-no);
1148 content: attr(data-line-no);
1100 }
1149 }
1101 &.cb-line-selected a {
1150 &.cb-line-selected a {
1102 background: @comment-highlight-color !important;
1151 background: @comment-highlight-color !important;
1103 }
1152 }
1104
1153
1105 a {
1154 a {
1106 display: block;
1155 display: block;
1107 padding-right: @cb-line-code-padding;
1156 padding-right: @cb-line-code-padding;
1108 padding-left: @cb-line-code-padding;
1157 padding-left: @cb-line-code-padding;
1109 line-height: @cb-line-height;
1158 line-height: @cb-line-height;
1110 color: rgba(0, 0, 0, 0.3);
1159 color: rgba(0, 0, 0, 0.3);
1111 }
1160 }
1112 }
1161 }
1113
1162
1114 &.cb-empty {
1163 &.cb-empty {
1115 background: @grey7;
1164 background: @grey7;
1116 }
1165 }
1117
1166
1118 ins {
1167 ins {
1119 color: black;
1168 color: black;
1120 background: #a6f3a6;
1169 background: #a6f3a6;
1121 text-decoration: none;
1170 text-decoration: none;
1122 }
1171 }
1123 del {
1172 del {
1124 color: black;
1173 color: black;
1125 background: #f8cbcb;
1174 background: #f8cbcb;
1126 text-decoration: none;
1175 text-decoration: none;
1127 }
1176 }
1128 &.cb-addition {
1177 &.cb-addition {
1129 background: #ecffec;
1178 background: #ecffec;
1130
1179
1131 &.blob-lineno {
1180 &.blob-lineno {
1132 background: #ddffdd;
1181 background: #ddffdd;
1133 }
1182 }
1134 }
1183 }
1135 &.cb-deletion {
1184 &.cb-deletion {
1136 background: #ffecec;
1185 background: #ffecec;
1137
1186
1138 &.blob-lineno {
1187 &.blob-lineno {
1139 background: #ffdddd;
1188 background: #ffdddd;
1140 }
1189 }
1141 }
1190 }
1142 &.cb-annotate-message-spacer {
1191 &.cb-annotate-message-spacer {
1143 width:8px;
1192 width:8px;
1144 padding: 1px 0px 0px 3px;
1193 padding: 1px 0px 0px 3px;
1145 }
1194 }
1146 &.cb-annotate-info {
1195 &.cb-annotate-info {
1147 width: 320px;
1196 width: 320px;
1148 min-width: 320px;
1197 min-width: 320px;
1149 max-width: 320px;
1198 max-width: 320px;
1150 padding: 5px 2px;
1199 padding: 5px 2px;
1151 font-size: 13px;
1200 font-size: 13px;
1152
1201
1153 .cb-annotate-message {
1202 .cb-annotate-message {
1154 padding: 2px 0px 0px 0px;
1203 padding: 2px 0px 0px 0px;
1155 white-space: pre-line;
1204 white-space: pre-line;
1156 overflow: hidden;
1205 overflow: hidden;
1157 }
1206 }
1158 .rc-user {
1207 .rc-user {
1159 float: none;
1208 float: none;
1160 padding: 0 6px 0 17px;
1209 padding: 0 6px 0 17px;
1161 min-width: unset;
1210 min-width: unset;
1162 min-height: unset;
1211 min-height: unset;
1163 }
1212 }
1164 }
1213 }
1165
1214
1166 &.cb-annotate-revision {
1215 &.cb-annotate-revision {
1167 cursor: pointer;
1216 cursor: pointer;
1168 text-align: right;
1217 text-align: right;
1169 padding: 1px 3px 0px 3px;
1218 padding: 1px 3px 0px 3px;
1170 }
1219 }
1171 }
1220 }
1172 }
1221 }
@@ -1,829 +1,836 b''
1 // # Copyright (C) 2010-2018 RhodeCode GmbH
1 // # Copyright (C) 2010-2018 RhodeCode GmbH
2 // #
2 // #
3 // # This program is free software: you can redistribute it and/or modify
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
4 // # it under the terms of the GNU Affero General Public License, version 3
5 // # (only), as published by the Free Software Foundation.
5 // # (only), as published by the Free Software Foundation.
6 // #
6 // #
7 // # This program is distributed in the hope that it will be useful,
7 // # This program is distributed in the hope that it will be useful,
8 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
8 // # but WITHOUT ANY WARRANTY; without even the implied warranty of
9 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
9 // # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 // # GNU General Public License for more details.
10 // # GNU General Public License for more details.
11 // #
11 // #
12 // # You should have received a copy of the GNU Affero General Public License
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/>.
13 // # along with this program. If not, see <http://www.gnu.org/licenses/>.
14 // #
14 // #
15 // # This program is dual-licensed. If you wish to learn more about the
15 // # This program is dual-licensed. If you wish to learn more about the
16 // # RhodeCode Enterprise Edition, including its added features, Support services,
16 // # RhodeCode Enterprise Edition, including its added features, Support services,
17 // # and proprietary license terms, please see https://rhodecode.com/licenses/
17 // # and proprietary license terms, please see https://rhodecode.com/licenses/
18
18
19 var firefoxAnchorFix = function() {
19 var firefoxAnchorFix = function() {
20 // hack to make anchor links behave properly on firefox, in our inline
20 // hack to make anchor links behave properly on firefox, in our inline
21 // comments generation when comments are injected firefox is misbehaving
21 // comments generation when comments are injected firefox is misbehaving
22 // when jumping to anchor links
22 // when jumping to anchor links
23 if (location.href.indexOf('#') > -1) {
23 if (location.href.indexOf('#') > -1) {
24 location.href += '';
24 location.href += '';
25 }
25 }
26 };
26 };
27
27
28 var linkifyComments = function(comments) {
28 var linkifyComments = function(comments) {
29 var firstCommentId = null;
29 var firstCommentId = null;
30 if (comments) {
30 if (comments) {
31 firstCommentId = $(comments[0]).data('comment-id');
31 firstCommentId = $(comments[0]).data('comment-id');
32 }
32 }
33
33
34 if (firstCommentId){
34 if (firstCommentId){
35 $('#inline-comments-counter').attr('href', '#comment-' + firstCommentId);
35 $('#inline-comments-counter').attr('href', '#comment-' + firstCommentId);
36 }
36 }
37 };
37 };
38
38
39 var bindToggleButtons = function() {
39 var bindToggleButtons = function() {
40 $('.comment-toggle').on('click', function() {
40 $('.comment-toggle').on('click', function() {
41 $(this).parent().nextUntil('tr.line').toggle('inline-comments');
41 $(this).parent().nextUntil('tr.line').toggle('inline-comments');
42 });
42 });
43 };
43 };
44
44
45
45
46
46
47 var _submitAjaxPOST = function(url, postData, successHandler, failHandler) {
47 var _submitAjaxPOST = function(url, postData, successHandler, failHandler) {
48 failHandler = failHandler || function() {};
48 failHandler = failHandler || function() {};
49 postData = toQueryString(postData);
49 postData = toQueryString(postData);
50 var request = $.ajax({
50 var request = $.ajax({
51 url: url,
51 url: url,
52 type: 'POST',
52 type: 'POST',
53 data: postData,
53 data: postData,
54 headers: {'X-PARTIAL-XHR': true}
54 headers: {'X-PARTIAL-XHR': true}
55 })
55 })
56 .done(function (data) {
56 .done(function (data) {
57 successHandler(data);
57 successHandler(data);
58 })
58 })
59 .fail(function (data, textStatus, errorThrown) {
59 .fail(function (data, textStatus, errorThrown) {
60 failHandler(data, textStatus, errorThrown)
60 failHandler(data, textStatus, errorThrown)
61 });
61 });
62 return request;
62 return request;
63 };
63 };
64
64
65
65
66
66
67
67
68 /* Comment form for main and inline comments */
68 /* Comment form for main and inline comments */
69 (function(mod) {
69 (function(mod) {
70
70
71 if (typeof exports == "object" && typeof module == "object") {
71 if (typeof exports == "object" && typeof module == "object") {
72 // CommonJS
72 // CommonJS
73 module.exports = mod();
73 module.exports = mod();
74 }
74 }
75 else {
75 else {
76 // Plain browser env
76 // Plain browser env
77 (this || window).CommentForm = mod();
77 (this || window).CommentForm = mod();
78 }
78 }
79
79
80 })(function() {
80 })(function() {
81 "use strict";
81 "use strict";
82
82
83 function CommentForm(formElement, commitId, pullRequestId, lineNo, initAutocompleteActions, resolvesCommentId) {
83 function CommentForm(formElement, commitId, pullRequestId, lineNo, initAutocompleteActions, resolvesCommentId) {
84 if (!(this instanceof CommentForm)) {
84 if (!(this instanceof CommentForm)) {
85 return new CommentForm(formElement, commitId, pullRequestId, lineNo, initAutocompleteActions, resolvesCommentId);
85 return new CommentForm(formElement, commitId, pullRequestId, lineNo, initAutocompleteActions, resolvesCommentId);
86 }
86 }
87
87
88 // bind the element instance to our Form
88 // bind the element instance to our Form
89 $(formElement).get(0).CommentForm = this;
89 $(formElement).get(0).CommentForm = this;
90
90
91 this.withLineNo = function(selector) {
91 this.withLineNo = function(selector) {
92 var lineNo = this.lineNo;
92 var lineNo = this.lineNo;
93 if (lineNo === undefined) {
93 if (lineNo === undefined) {
94 return selector
94 return selector
95 } else {
95 } else {
96 return selector + '_' + lineNo;
96 return selector + '_' + lineNo;
97 }
97 }
98 };
98 };
99
99
100 this.commitId = commitId;
100 this.commitId = commitId;
101 this.pullRequestId = pullRequestId;
101 this.pullRequestId = pullRequestId;
102 this.lineNo = lineNo;
102 this.lineNo = lineNo;
103 this.initAutocompleteActions = initAutocompleteActions;
103 this.initAutocompleteActions = initAutocompleteActions;
104
104
105 this.previewButton = this.withLineNo('#preview-btn');
105 this.previewButton = this.withLineNo('#preview-btn');
106 this.previewContainer = this.withLineNo('#preview-container');
106 this.previewContainer = this.withLineNo('#preview-container');
107
107
108 this.previewBoxSelector = this.withLineNo('#preview-box');
108 this.previewBoxSelector = this.withLineNo('#preview-box');
109
109
110 this.editButton = this.withLineNo('#edit-btn');
110 this.editButton = this.withLineNo('#edit-btn');
111 this.editContainer = this.withLineNo('#edit-container');
111 this.editContainer = this.withLineNo('#edit-container');
112 this.cancelButton = this.withLineNo('#cancel-btn');
112 this.cancelButton = this.withLineNo('#cancel-btn');
113 this.commentType = this.withLineNo('#comment_type');
113 this.commentType = this.withLineNo('#comment_type');
114
114
115 this.resolvesId = null;
115 this.resolvesId = null;
116 this.resolvesActionId = null;
116 this.resolvesActionId = null;
117
117
118 this.closesPr = '#close_pull_request';
118 this.closesPr = '#close_pull_request';
119
119
120 this.cmBox = this.withLineNo('#text');
120 this.cmBox = this.withLineNo('#text');
121 this.cm = initCommentBoxCodeMirror(this, this.cmBox, this.initAutocompleteActions);
121 this.cm = initCommentBoxCodeMirror(this, this.cmBox, this.initAutocompleteActions);
122
122
123 this.statusChange = this.withLineNo('#change_status');
123 this.statusChange = this.withLineNo('#change_status');
124
124
125 this.submitForm = formElement;
125 this.submitForm = formElement;
126 this.submitButton = $(this.submitForm).find('input[type="submit"]');
126 this.submitButton = $(this.submitForm).find('input[type="submit"]');
127 this.submitButtonText = this.submitButton.val();
127 this.submitButtonText = this.submitButton.val();
128
128
129 this.previewUrl = pyroutes.url('repo_commit_comment_preview',
129 this.previewUrl = pyroutes.url('repo_commit_comment_preview',
130 {'repo_name': templateContext.repo_name,
130 {'repo_name': templateContext.repo_name,
131 'commit_id': templateContext.commit_data.commit_id});
131 'commit_id': templateContext.commit_data.commit_id});
132
132
133 if (resolvesCommentId){
133 if (resolvesCommentId){
134 this.resolvesId = '#resolve_comment_{0}'.format(resolvesCommentId);
134 this.resolvesId = '#resolve_comment_{0}'.format(resolvesCommentId);
135 this.resolvesActionId = '#resolve_comment_action_{0}'.format(resolvesCommentId);
135 this.resolvesActionId = '#resolve_comment_action_{0}'.format(resolvesCommentId);
136 $(this.commentType).prop('disabled', true);
136 $(this.commentType).prop('disabled', true);
137 $(this.commentType).addClass('disabled');
137 $(this.commentType).addClass('disabled');
138
138
139 // disable select
139 // disable select
140 setTimeout(function() {
140 setTimeout(function() {
141 $(self.statusChange).select2('readonly', true);
141 $(self.statusChange).select2('readonly', true);
142 }, 10);
142 }, 10);
143
143
144 var resolvedInfo = (
144 var resolvedInfo = (
145 '<li class="resolve-action">' +
145 '<li class="resolve-action">' +
146 '<input type="hidden" id="resolve_comment_{0}" name="resolve_comment_{0}" value="{0}">' +
146 '<input type="hidden" id="resolve_comment_{0}" name="resolve_comment_{0}" value="{0}">' +
147 '<button id="resolve_comment_action_{0}" class="resolve-text btn btn-sm" onclick="return Rhodecode.comments.submitResolution({0})">{1} #{0}</button>' +
147 '<button id="resolve_comment_action_{0}" class="resolve-text btn btn-sm" onclick="return Rhodecode.comments.submitResolution({0})">{1} #{0}</button>' +
148 '</li>'
148 '</li>'
149 ).format(resolvesCommentId, _gettext('resolve comment'));
149 ).format(resolvesCommentId, _gettext('resolve comment'));
150 $(resolvedInfo).insertAfter($(this.commentType).parent());
150 $(resolvedInfo).insertAfter($(this.commentType).parent());
151 }
151 }
152
152
153 // based on commitId, or pullRequestId decide where do we submit
153 // based on commitId, or pullRequestId decide where do we submit
154 // out data
154 // out data
155 if (this.commitId){
155 if (this.commitId){
156 this.submitUrl = pyroutes.url('repo_commit_comment_create',
156 this.submitUrl = pyroutes.url('repo_commit_comment_create',
157 {'repo_name': templateContext.repo_name,
157 {'repo_name': templateContext.repo_name,
158 'commit_id': this.commitId});
158 'commit_id': this.commitId});
159 this.selfUrl = pyroutes.url('repo_commit',
159 this.selfUrl = pyroutes.url('repo_commit',
160 {'repo_name': templateContext.repo_name,
160 {'repo_name': templateContext.repo_name,
161 'commit_id': this.commitId});
161 'commit_id': this.commitId});
162
162
163 } else if (this.pullRequestId) {
163 } else if (this.pullRequestId) {
164 this.submitUrl = pyroutes.url('pullrequest_comment_create',
164 this.submitUrl = pyroutes.url('pullrequest_comment_create',
165 {'repo_name': templateContext.repo_name,
165 {'repo_name': templateContext.repo_name,
166 'pull_request_id': this.pullRequestId});
166 'pull_request_id': this.pullRequestId});
167 this.selfUrl = pyroutes.url('pullrequest_show',
167 this.selfUrl = pyroutes.url('pullrequest_show',
168 {'repo_name': templateContext.repo_name,
168 {'repo_name': templateContext.repo_name,
169 'pull_request_id': this.pullRequestId});
169 'pull_request_id': this.pullRequestId});
170
170
171 } else {
171 } else {
172 throw new Error(
172 throw new Error(
173 'CommentForm requires pullRequestId, or commitId to be specified.')
173 'CommentForm requires pullRequestId, or commitId to be specified.')
174 }
174 }
175
175
176 // FUNCTIONS and helpers
176 // FUNCTIONS and helpers
177 var self = this;
177 var self = this;
178
178
179 this.isInline = function(){
179 this.isInline = function(){
180 return this.lineNo && this.lineNo != 'general';
180 return this.lineNo && this.lineNo != 'general';
181 };
181 };
182
182
183 this.getCmInstance = function(){
183 this.getCmInstance = function(){
184 return this.cm
184 return this.cm
185 };
185 };
186
186
187 this.setPlaceholder = function(placeholder) {
187 this.setPlaceholder = function(placeholder) {
188 var cm = this.getCmInstance();
188 var cm = this.getCmInstance();
189 if (cm){
189 if (cm){
190 cm.setOption('placeholder', placeholder);
190 cm.setOption('placeholder', placeholder);
191 }
191 }
192 };
192 };
193
193
194 this.getCommentStatus = function() {
194 this.getCommentStatus = function() {
195 return $(this.submitForm).find(this.statusChange).val();
195 return $(this.submitForm).find(this.statusChange).val();
196 };
196 };
197 this.getCommentType = function() {
197 this.getCommentType = function() {
198 return $(this.submitForm).find(this.commentType).val();
198 return $(this.submitForm).find(this.commentType).val();
199 };
199 };
200
200
201 this.getResolvesId = function() {
201 this.getResolvesId = function() {
202 return $(this.submitForm).find(this.resolvesId).val() || null;
202 return $(this.submitForm).find(this.resolvesId).val() || null;
203 };
203 };
204
204
205 this.getClosePr = function() {
205 this.getClosePr = function() {
206 return $(this.submitForm).find(this.closesPr).val() || null;
206 return $(this.submitForm).find(this.closesPr).val() || null;
207 };
207 };
208
208
209 this.markCommentResolved = function(resolvedCommentId){
209 this.markCommentResolved = function(resolvedCommentId){
210 $('#comment-label-{0}'.format(resolvedCommentId)).find('.resolved').show();
210 $('#comment-label-{0}'.format(resolvedCommentId)).find('.resolved').show();
211 $('#comment-label-{0}'.format(resolvedCommentId)).find('.resolve').hide();
211 $('#comment-label-{0}'.format(resolvedCommentId)).find('.resolve').hide();
212 };
212 };
213
213
214 this.isAllowedToSubmit = function() {
214 this.isAllowedToSubmit = function() {
215 return !$(this.submitButton).prop('disabled');
215 return !$(this.submitButton).prop('disabled');
216 };
216 };
217
217
218 this.initStatusChangeSelector = function(){
218 this.initStatusChangeSelector = function(){
219 var formatChangeStatus = function(state, escapeMarkup) {
219 var formatChangeStatus = function(state, escapeMarkup) {
220 var originalOption = state.element;
220 var originalOption = state.element;
221 return '<div class="flag_status ' + $(originalOption).data('status') + ' pull-left"></div>' +
221 return '<div class="flag_status ' + $(originalOption).data('status') + ' pull-left"></div>' +
222 '<span>' + escapeMarkup(state.text) + '</span>';
222 '<span>' + escapeMarkup(state.text) + '</span>';
223 };
223 };
224 var formatResult = function(result, container, query, escapeMarkup) {
224 var formatResult = function(result, container, query, escapeMarkup) {
225 return formatChangeStatus(result, escapeMarkup);
225 return formatChangeStatus(result, escapeMarkup);
226 };
226 };
227
227
228 var formatSelection = function(data, container, escapeMarkup) {
228 var formatSelection = function(data, container, escapeMarkup) {
229 return formatChangeStatus(data, escapeMarkup);
229 return formatChangeStatus(data, escapeMarkup);
230 };
230 };
231
231
232 $(this.submitForm).find(this.statusChange).select2({
232 $(this.submitForm).find(this.statusChange).select2({
233 placeholder: _gettext('Status Review'),
233 placeholder: _gettext('Status Review'),
234 formatResult: formatResult,
234 formatResult: formatResult,
235 formatSelection: formatSelection,
235 formatSelection: formatSelection,
236 containerCssClass: "drop-menu status_box_menu",
236 containerCssClass: "drop-menu status_box_menu",
237 dropdownCssClass: "drop-menu-dropdown",
237 dropdownCssClass: "drop-menu-dropdown",
238 dropdownAutoWidth: true,
238 dropdownAutoWidth: true,
239 minimumResultsForSearch: -1
239 minimumResultsForSearch: -1
240 });
240 });
241 $(this.submitForm).find(this.statusChange).on('change', function() {
241 $(this.submitForm).find(this.statusChange).on('change', function() {
242 var status = self.getCommentStatus();
242 var status = self.getCommentStatus();
243
243
244 if (status && !self.isInline()) {
244 if (status && !self.isInline()) {
245 $(self.submitButton).prop('disabled', false);
245 $(self.submitButton).prop('disabled', false);
246 }
246 }
247
247
248 var placeholderText = _gettext('Comment text will be set automatically based on currently selected status ({0}) ...').format(status);
248 var placeholderText = _gettext('Comment text will be set automatically based on currently selected status ({0}) ...').format(status);
249 self.setPlaceholder(placeholderText)
249 self.setPlaceholder(placeholderText)
250 })
250 })
251 };
251 };
252
252
253 // reset the comment form into it's original state
253 // reset the comment form into it's original state
254 this.resetCommentFormState = function(content) {
254 this.resetCommentFormState = function(content) {
255 content = content || '';
255 content = content || '';
256
256
257 $(this.editContainer).show();
257 $(this.editContainer).show();
258 $(this.editButton).parent().addClass('active');
258 $(this.editButton).parent().addClass('active');
259
259
260 $(this.previewContainer).hide();
260 $(this.previewContainer).hide();
261 $(this.previewButton).parent().removeClass('active');
261 $(this.previewButton).parent().removeClass('active');
262
262
263 this.setActionButtonsDisabled(true);
263 this.setActionButtonsDisabled(true);
264 self.cm.setValue(content);
264 self.cm.setValue(content);
265 self.cm.setOption("readOnly", false);
265 self.cm.setOption("readOnly", false);
266
266
267 if (this.resolvesId) {
267 if (this.resolvesId) {
268 // destroy the resolve action
268 // destroy the resolve action
269 $(this.resolvesId).parent().remove();
269 $(this.resolvesId).parent().remove();
270 }
270 }
271 // reset closingPR flag
271 // reset closingPR flag
272 $('.close-pr-input').remove();
272 $('.close-pr-input').remove();
273
273
274 $(this.statusChange).select2('readonly', false);
274 $(this.statusChange).select2('readonly', false);
275 };
275 };
276
276
277 this.globalSubmitSuccessCallback = function(){
277 this.globalSubmitSuccessCallback = function(){
278 // default behaviour is to call GLOBAL hook, if it's registered.
278 // default behaviour is to call GLOBAL hook, if it's registered.
279 if (window.commentFormGlobalSubmitSuccessCallback !== undefined){
279 if (window.commentFormGlobalSubmitSuccessCallback !== undefined){
280 commentFormGlobalSubmitSuccessCallback()
280 commentFormGlobalSubmitSuccessCallback()
281 }
281 }
282 };
282 };
283
283
284 this.submitAjaxPOST = function(url, postData, successHandler, failHandler) {
284 this.submitAjaxPOST = function(url, postData, successHandler, failHandler) {
285 return _submitAjaxPOST(url, postData, successHandler, failHandler);
285 return _submitAjaxPOST(url, postData, successHandler, failHandler);
286 };
286 };
287
287
288 // overwrite a submitHandler, we need to do it for inline comments
288 // overwrite a submitHandler, we need to do it for inline comments
289 this.setHandleFormSubmit = function(callback) {
289 this.setHandleFormSubmit = function(callback) {
290 this.handleFormSubmit = callback;
290 this.handleFormSubmit = callback;
291 };
291 };
292
292
293 // overwrite a submitSuccessHandler
293 // overwrite a submitSuccessHandler
294 this.setGlobalSubmitSuccessCallback = function(callback) {
294 this.setGlobalSubmitSuccessCallback = function(callback) {
295 this.globalSubmitSuccessCallback = callback;
295 this.globalSubmitSuccessCallback = callback;
296 };
296 };
297
297
298 // default handler for for submit for main comments
298 // default handler for for submit for main comments
299 this.handleFormSubmit = function() {
299 this.handleFormSubmit = function() {
300 var text = self.cm.getValue();
300 var text = self.cm.getValue();
301 var status = self.getCommentStatus();
301 var status = self.getCommentStatus();
302 var commentType = self.getCommentType();
302 var commentType = self.getCommentType();
303 var resolvesCommentId = self.getResolvesId();
303 var resolvesCommentId = self.getResolvesId();
304 var closePullRequest = self.getClosePr();
304 var closePullRequest = self.getClosePr();
305
305
306 if (text === "" && !status) {
306 if (text === "" && !status) {
307 return;
307 return;
308 }
308 }
309
309
310 var excludeCancelBtn = false;
310 var excludeCancelBtn = false;
311 var submitEvent = true;
311 var submitEvent = true;
312 self.setActionButtonsDisabled(true, excludeCancelBtn, submitEvent);
312 self.setActionButtonsDisabled(true, excludeCancelBtn, submitEvent);
313 self.cm.setOption("readOnly", true);
313 self.cm.setOption("readOnly", true);
314
314
315 var postData = {
315 var postData = {
316 'text': text,
316 'text': text,
317 'changeset_status': status,
317 'changeset_status': status,
318 'comment_type': commentType,
318 'comment_type': commentType,
319 'csrf_token': CSRF_TOKEN
319 'csrf_token': CSRF_TOKEN
320 };
320 };
321
321
322 if (resolvesCommentId) {
322 if (resolvesCommentId) {
323 postData['resolves_comment_id'] = resolvesCommentId;
323 postData['resolves_comment_id'] = resolvesCommentId;
324 }
324 }
325
325
326 if (closePullRequest) {
326 if (closePullRequest) {
327 postData['close_pull_request'] = true;
327 postData['close_pull_request'] = true;
328 }
328 }
329
329
330 var submitSuccessCallback = function(o) {
330 var submitSuccessCallback = function(o) {
331 // reload page if we change status for single commit.
331 // reload page if we change status for single commit.
332 if (status && self.commitId) {
332 if (status && self.commitId) {
333 location.reload(true);
333 location.reload(true);
334 } else {
334 } else {
335 $('#injected_page_comments').append(o.rendered_text);
335 $('#injected_page_comments').append(o.rendered_text);
336 self.resetCommentFormState();
336 self.resetCommentFormState();
337 timeagoActivate();
337 timeagoActivate();
338
338
339 // mark visually which comment was resolved
339 // mark visually which comment was resolved
340 if (resolvesCommentId) {
340 if (resolvesCommentId) {
341 self.markCommentResolved(resolvesCommentId);
341 self.markCommentResolved(resolvesCommentId);
342 }
342 }
343 }
343 }
344
344
345 // run global callback on submit
345 // run global callback on submit
346 self.globalSubmitSuccessCallback();
346 self.globalSubmitSuccessCallback();
347
347
348 };
348 };
349 var submitFailCallback = function(data) {
349 var submitFailCallback = function(data) {
350 alert(
350 alert(
351 "Error while submitting comment.\n" +
351 "Error while submitting comment.\n" +
352 "Error code {0} ({1}).".format(data.status, data.statusText)
352 "Error code {0} ({1}).".format(data.status, data.statusText)
353 );
353 );
354 self.resetCommentFormState(text);
354 self.resetCommentFormState(text);
355 };
355 };
356 self.submitAjaxPOST(
356 self.submitAjaxPOST(
357 self.submitUrl, postData, submitSuccessCallback, submitFailCallback);
357 self.submitUrl, postData, submitSuccessCallback, submitFailCallback);
358 };
358 };
359
359
360 this.previewSuccessCallback = function(o) {
360 this.previewSuccessCallback = function(o) {
361 $(self.previewBoxSelector).html(o);
361 $(self.previewBoxSelector).html(o);
362 $(self.previewBoxSelector).removeClass('unloaded');
362 $(self.previewBoxSelector).removeClass('unloaded');
363
363
364 // swap buttons, making preview active
364 // swap buttons, making preview active
365 $(self.previewButton).parent().addClass('active');
365 $(self.previewButton).parent().addClass('active');
366 $(self.editButton).parent().removeClass('active');
366 $(self.editButton).parent().removeClass('active');
367
367
368 // unlock buttons
368 // unlock buttons
369 self.setActionButtonsDisabled(false);
369 self.setActionButtonsDisabled(false);
370 };
370 };
371
371
372 this.setActionButtonsDisabled = function(state, excludeCancelBtn, submitEvent) {
372 this.setActionButtonsDisabled = function(state, excludeCancelBtn, submitEvent) {
373 excludeCancelBtn = excludeCancelBtn || false;
373 excludeCancelBtn = excludeCancelBtn || false;
374 submitEvent = submitEvent || false;
374 submitEvent = submitEvent || false;
375
375
376 $(this.editButton).prop('disabled', state);
376 $(this.editButton).prop('disabled', state);
377 $(this.previewButton).prop('disabled', state);
377 $(this.previewButton).prop('disabled', state);
378
378
379 if (!excludeCancelBtn) {
379 if (!excludeCancelBtn) {
380 $(this.cancelButton).prop('disabled', state);
380 $(this.cancelButton).prop('disabled', state);
381 }
381 }
382
382
383 var submitState = state;
383 var submitState = state;
384 if (!submitEvent && this.getCommentStatus() && !self.isInline()) {
384 if (!submitEvent && this.getCommentStatus() && !self.isInline()) {
385 // if the value of commit review status is set, we allow
385 // if the value of commit review status is set, we allow
386 // submit button, but only on Main form, isInline means inline
386 // submit button, but only on Main form, isInline means inline
387 submitState = false
387 submitState = false
388 }
388 }
389
389
390 $(this.submitButton).prop('disabled', submitState);
390 $(this.submitButton).prop('disabled', submitState);
391 if (submitEvent) {
391 if (submitEvent) {
392 $(this.submitButton).val(_gettext('Submitting...'));
392 $(this.submitButton).val(_gettext('Submitting...'));
393 } else {
393 } else {
394 $(this.submitButton).val(this.submitButtonText);
394 $(this.submitButton).val(this.submitButtonText);
395 }
395 }
396
396
397 };
397 };
398
398
399 // lock preview/edit/submit buttons on load, but exclude cancel button
399 // lock preview/edit/submit buttons on load, but exclude cancel button
400 var excludeCancelBtn = true;
400 var excludeCancelBtn = true;
401 this.setActionButtonsDisabled(true, excludeCancelBtn);
401 this.setActionButtonsDisabled(true, excludeCancelBtn);
402
402
403 // anonymous users don't have access to initialized CM instance
403 // anonymous users don't have access to initialized CM instance
404 if (this.cm !== undefined){
404 if (this.cm !== undefined){
405 this.cm.on('change', function(cMirror) {
405 this.cm.on('change', function(cMirror) {
406 if (cMirror.getValue() === "") {
406 if (cMirror.getValue() === "") {
407 self.setActionButtonsDisabled(true, excludeCancelBtn)
407 self.setActionButtonsDisabled(true, excludeCancelBtn)
408 } else {
408 } else {
409 self.setActionButtonsDisabled(false, excludeCancelBtn)
409 self.setActionButtonsDisabled(false, excludeCancelBtn)
410 }
410 }
411 });
411 });
412 }
412 }
413
413
414 $(this.editButton).on('click', function(e) {
414 $(this.editButton).on('click', function(e) {
415 e.preventDefault();
415 e.preventDefault();
416
416
417 $(self.previewButton).parent().removeClass('active');
417 $(self.previewButton).parent().removeClass('active');
418 $(self.previewContainer).hide();
418 $(self.previewContainer).hide();
419
419
420 $(self.editButton).parent().addClass('active');
420 $(self.editButton).parent().addClass('active');
421 $(self.editContainer).show();
421 $(self.editContainer).show();
422
422
423 });
423 });
424
424
425 $(this.previewButton).on('click', function(e) {
425 $(this.previewButton).on('click', function(e) {
426 e.preventDefault();
426 e.preventDefault();
427 var text = self.cm.getValue();
427 var text = self.cm.getValue();
428
428
429 if (text === "") {
429 if (text === "") {
430 return;
430 return;
431 }
431 }
432
432
433 var postData = {
433 var postData = {
434 'text': text,
434 'text': text,
435 'renderer': templateContext.visual.default_renderer,
435 'renderer': templateContext.visual.default_renderer,
436 'csrf_token': CSRF_TOKEN
436 'csrf_token': CSRF_TOKEN
437 };
437 };
438
438
439 // lock ALL buttons on preview
439 // lock ALL buttons on preview
440 self.setActionButtonsDisabled(true);
440 self.setActionButtonsDisabled(true);
441
441
442 $(self.previewBoxSelector).addClass('unloaded');
442 $(self.previewBoxSelector).addClass('unloaded');
443 $(self.previewBoxSelector).html(_gettext('Loading ...'));
443 $(self.previewBoxSelector).html(_gettext('Loading ...'));
444
444
445 $(self.editContainer).hide();
445 $(self.editContainer).hide();
446 $(self.previewContainer).show();
446 $(self.previewContainer).show();
447
447
448 // by default we reset state of comment preserving the text
448 // by default we reset state of comment preserving the text
449 var previewFailCallback = function(data){
449 var previewFailCallback = function(data){
450 alert(
450 alert(
451 "Error while preview of comment.\n" +
451 "Error while preview of comment.\n" +
452 "Error code {0} ({1}).".format(data.status, data.statusText)
452 "Error code {0} ({1}).".format(data.status, data.statusText)
453 );
453 );
454 self.resetCommentFormState(text)
454 self.resetCommentFormState(text)
455 };
455 };
456 self.submitAjaxPOST(
456 self.submitAjaxPOST(
457 self.previewUrl, postData, self.previewSuccessCallback,
457 self.previewUrl, postData, self.previewSuccessCallback,
458 previewFailCallback);
458 previewFailCallback);
459
459
460 $(self.previewButton).parent().addClass('active');
460 $(self.previewButton).parent().addClass('active');
461 $(self.editButton).parent().removeClass('active');
461 $(self.editButton).parent().removeClass('active');
462 });
462 });
463
463
464 $(this.submitForm).submit(function(e) {
464 $(this.submitForm).submit(function(e) {
465 e.preventDefault();
465 e.preventDefault();
466 var allowedToSubmit = self.isAllowedToSubmit();
466 var allowedToSubmit = self.isAllowedToSubmit();
467 if (!allowedToSubmit){
467 if (!allowedToSubmit){
468 return false;
468 return false;
469 }
469 }
470 self.handleFormSubmit();
470 self.handleFormSubmit();
471 });
471 });
472
472
473 }
473 }
474
474
475 return CommentForm;
475 return CommentForm;
476 });
476 });
477
477
478 /* comments controller */
478 /* comments controller */
479 var CommentsController = function() {
479 var CommentsController = function() {
480 var mainComment = '#text';
480 var mainComment = '#text';
481 var self = this;
481 var self = this;
482
482
483 this.cancelComment = function(node) {
483 this.cancelComment = function(node) {
484 var $node = $(node);
484 var $node = $(node);
485 var $td = $node.closest('td');
485 var $td = $node.closest('td');
486 $node.closest('.comment-inline-form').remove();
486 $node.closest('.comment-inline-form').remove();
487 return false;
487 return false;
488 };
488 };
489
489
490 this.getLineNumber = function(node) {
490 this.getLineNumber = function(node) {
491 var $node = $(node);
491 var $node = $(node);
492 var lineNo = $node.closest('td').attr('data-line-no');
492 var lineNo = $node.closest('td').attr('data-line-no');
493 if (lineNo === undefined && $node.data('commentInline')){
493 if (lineNo === undefined && $node.data('commentInline')){
494 lineNo = $node.data('commentLineNo')
494 lineNo = $node.data('commentLineNo')
495 }
495 }
496
496
497 return lineNo
497 return lineNo
498 };
498 };
499
499
500 this.scrollToComment = function(node, offset, outdated) {
500 this.scrollToComment = function(node, offset, outdated) {
501 if (offset === undefined) {
501 if (offset === undefined) {
502 offset = 0;
502 offset = 0;
503 }
503 }
504 var outdated = outdated || false;
504 var outdated = outdated || false;
505 var klass = outdated ? 'div.comment-outdated' : 'div.comment-current';
505 var klass = outdated ? 'div.comment-outdated' : 'div.comment-current';
506
506
507 if (!node) {
507 if (!node) {
508 node = $('.comment-selected');
508 node = $('.comment-selected');
509 if (!node.length) {
509 if (!node.length) {
510 node = $('comment-current')
510 node = $('comment-current')
511 }
511 }
512 }
512 }
513 $wrapper = $(node).closest('div.comment');
513 $wrapper = $(node).closest('div.comment');
514 $comment = $(node).closest(klass);
514 $comment = $(node).closest(klass);
515 $comments = $(klass);
515 $comments = $(klass);
516
516
517 // show hidden comment when referenced.
517 // show hidden comment when referenced.
518 if (!$wrapper.is(':visible')){
518 if (!$wrapper.is(':visible')){
519 $wrapper.show();
519 $wrapper.show();
520 }
520 }
521
521
522 $('.comment-selected').removeClass('comment-selected');
522 $('.comment-selected').removeClass('comment-selected');
523
523
524 var nextIdx = $(klass).index($comment) + offset;
524 var nextIdx = $(klass).index($comment) + offset;
525 if (nextIdx >= $comments.length) {
525 if (nextIdx >= $comments.length) {
526 nextIdx = 0;
526 nextIdx = 0;
527 }
527 }
528 var $next = $(klass).eq(nextIdx);
528 var $next = $(klass).eq(nextIdx);
529
529
530 var $cb = $next.closest('.cb');
530 var $cb = $next.closest('.cb');
531 $cb.removeClass('cb-collapsed');
531 $cb.removeClass('cb-collapsed');
532
532
533 var $filediffCollapseState = $cb.closest('.filediff').prev();
533 var $filediffCollapseState = $cb.closest('.filediff').prev();
534 $filediffCollapseState.prop('checked', false);
534 $filediffCollapseState.prop('checked', false);
535 $next.addClass('comment-selected');
535 $next.addClass('comment-selected');
536 scrollToElement($next);
536 scrollToElement($next);
537 return false;
537 return false;
538 };
538 };
539
539
540 this.nextComment = function(node) {
540 this.nextComment = function(node) {
541 return self.scrollToComment(node, 1);
541 return self.scrollToComment(node, 1);
542 };
542 };
543
543
544 this.prevComment = function(node) {
544 this.prevComment = function(node) {
545 return self.scrollToComment(node, -1);
545 return self.scrollToComment(node, -1);
546 };
546 };
547
547
548 this.nextOutdatedComment = function(node) {
548 this.nextOutdatedComment = function(node) {
549 return self.scrollToComment(node, 1, true);
549 return self.scrollToComment(node, 1, true);
550 };
550 };
551
551
552 this.prevOutdatedComment = function(node) {
552 this.prevOutdatedComment = function(node) {
553 return self.scrollToComment(node, -1, true);
553 return self.scrollToComment(node, -1, true);
554 };
554 };
555
555
556 this.deleteComment = function(node) {
556 this.deleteComment = function(node) {
557 if (!confirm(_gettext('Delete this comment?'))) {
557 if (!confirm(_gettext('Delete this comment?'))) {
558 return false;
558 return false;
559 }
559 }
560 var $node = $(node);
560 var $node = $(node);
561 var $td = $node.closest('td');
561 var $td = $node.closest('td');
562 var $comment = $node.closest('.comment');
562 var $comment = $node.closest('.comment');
563 var comment_id = $comment.attr('data-comment-id');
563 var comment_id = $comment.attr('data-comment-id');
564 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__', comment_id);
564 var url = AJAX_COMMENT_DELETE_URL.replace('__COMMENT_ID__', comment_id);
565 var postData = {
565 var postData = {
566 'csrf_token': CSRF_TOKEN
566 'csrf_token': CSRF_TOKEN
567 };
567 };
568
568
569 $comment.addClass('comment-deleting');
569 $comment.addClass('comment-deleting');
570 $comment.hide('fast');
570 $comment.hide('fast');
571
571
572 var success = function(response) {
572 var success = function(response) {
573 $comment.remove();
573 $comment.remove();
574 return false;
574 return false;
575 };
575 };
576 var failure = function(data, textStatus, xhr) {
576 var failure = function(data, textStatus, xhr) {
577 alert("error processing request: " + textStatus);
577 alert("error processing request: " + textStatus);
578 $comment.show('fast');
578 $comment.show('fast');
579 $comment.removeClass('comment-deleting');
579 $comment.removeClass('comment-deleting');
580 return false;
580 return false;
581 };
581 };
582 ajaxPOST(url, postData, success, failure);
582 ajaxPOST(url, postData, success, failure);
583 };
583 };
584
584
585 this.toggleWideMode = function (node) {
585 this.toggleWideMode = function (node) {
586 if ($('#content').hasClass('wrapper')) {
586 if ($('#content').hasClass('wrapper')) {
587 $('#content').removeClass("wrapper");
587 $('#content').removeClass("wrapper");
588 $('#content').addClass("wide-mode-wrapper");
588 $('#content').addClass("wide-mode-wrapper");
589 $(node).addClass('btn-success');
589 $(node).addClass('btn-success');
590 } else {
590 } else {
591 $('#content').removeClass("wide-mode-wrapper");
591 $('#content').removeClass("wide-mode-wrapper");
592 $('#content').addClass("wrapper");
592 $('#content').addClass("wrapper");
593 $(node).removeClass('btn-success');
593 $(node).removeClass('btn-success');
594 }
594 }
595 return false;
595 return false;
596 };
596 };
597
597
598 this.toggleComments = function(node, show) {
598 this.toggleComments = function(node, show) {
599 var $filediff = $(node).closest('.filediff');
599 var $filediff = $(node).closest('.filediff');
600 if (show === true) {
600 if (show === true) {
601 $filediff.removeClass('hide-comments');
601 $filediff.removeClass('hide-comments');
602 } else if (show === false) {
602 } else if (show === false) {
603 $filediff.find('.hide-line-comments').removeClass('hide-line-comments');
603 $filediff.find('.hide-line-comments').removeClass('hide-line-comments');
604 $filediff.addClass('hide-comments');
604 $filediff.addClass('hide-comments');
605 } else {
605 } else {
606 $filediff.find('.hide-line-comments').removeClass('hide-line-comments');
606 $filediff.find('.hide-line-comments').removeClass('hide-line-comments');
607 $filediff.toggleClass('hide-comments');
607 $filediff.toggleClass('hide-comments');
608 }
608 }
609 return false;
609 return false;
610 };
610 };
611
611
612 this.toggleLineComments = function(node) {
612 this.toggleLineComments = function(node) {
613 self.toggleComments(node, true);
613 self.toggleComments(node, true);
614 var $node = $(node);
614 var $node = $(node);
615 // mark outdated comments as visible before the toggle;
615 // mark outdated comments as visible before the toggle;
616 $(node.closest('tr')).find('.comment-outdated').show();
616 $(node.closest('tr')).find('.comment-outdated').show();
617 $node.closest('tr').toggleClass('hide-line-comments');
617 $node.closest('tr').toggleClass('hide-line-comments');
618 };
618 };
619
619
620 this.createCommentForm = function(formElement, lineno, placeholderText, initAutocompleteActions, resolvesCommentId){
620 this.createCommentForm = function(formElement, lineno, placeholderText, initAutocompleteActions, resolvesCommentId){
621 var pullRequestId = templateContext.pull_request_data.pull_request_id;
621 var pullRequestId = templateContext.pull_request_data.pull_request_id;
622 var commitId = templateContext.commit_data.commit_id;
622 var commitId = templateContext.commit_data.commit_id;
623
623
624 var commentForm = new CommentForm(
624 var commentForm = new CommentForm(
625 formElement, commitId, pullRequestId, lineno, initAutocompleteActions, resolvesCommentId);
625 formElement, commitId, pullRequestId, lineno, initAutocompleteActions, resolvesCommentId);
626 var cm = commentForm.getCmInstance();
626 var cm = commentForm.getCmInstance();
627
627
628 if (resolvesCommentId){
628 if (resolvesCommentId){
629 var placeholderText = _gettext('Leave a comment, or click resolve button to resolve TODO comment #{0}').format(resolvesCommentId);
629 var placeholderText = _gettext('Leave a comment, or click resolve button to resolve TODO comment #{0}').format(resolvesCommentId);
630 }
630 }
631
631
632 setTimeout(function() {
632 setTimeout(function() {
633 // callbacks
633 // callbacks
634 if (cm !== undefined) {
634 if (cm !== undefined) {
635 commentForm.setPlaceholder(placeholderText);
635 commentForm.setPlaceholder(placeholderText);
636 if (commentForm.isInline()) {
636 if (commentForm.isInline()) {
637 cm.focus();
637 cm.focus();
638 cm.refresh();
638 cm.refresh();
639 }
639 }
640 }
640 }
641 }, 10);
641 }, 10);
642
642
643 // trigger scrolldown to the resolve comment, since it might be away
643 // trigger scrolldown to the resolve comment, since it might be away
644 // from the clicked
644 // from the clicked
645 if (resolvesCommentId){
645 if (resolvesCommentId){
646 var actionNode = $(commentForm.resolvesActionId).offset();
646 var actionNode = $(commentForm.resolvesActionId).offset();
647
647
648 setTimeout(function() {
648 setTimeout(function() {
649 if (actionNode) {
649 if (actionNode) {
650 $('body, html').animate({scrollTop: actionNode.top}, 10);
650 $('body, html').animate({scrollTop: actionNode.top}, 10);
651 }
651 }
652 }, 100);
652 }, 100);
653 }
653 }
654
654
655 return commentForm;
655 return commentForm;
656 };
656 };
657
657
658 this.createGeneralComment = function (lineNo, placeholderText, resolvesCommentId) {
658 this.createGeneralComment = function (lineNo, placeholderText, resolvesCommentId) {
659
659
660 var tmpl = $('#cb-comment-general-form-template').html();
660 var tmpl = $('#cb-comment-general-form-template').html();
661 tmpl = tmpl.format(null, 'general');
661 tmpl = tmpl.format(null, 'general');
662 var $form = $(tmpl);
662 var $form = $(tmpl);
663
663
664 var $formPlaceholder = $('#cb-comment-general-form-placeholder');
664 var $formPlaceholder = $('#cb-comment-general-form-placeholder');
665 var curForm = $formPlaceholder.find('form');
665 var curForm = $formPlaceholder.find('form');
666 if (curForm){
666 if (curForm){
667 curForm.remove();
667 curForm.remove();
668 }
668 }
669 $formPlaceholder.append($form);
669 $formPlaceholder.append($form);
670
670
671 var _form = $($form[0]);
671 var _form = $($form[0]);
672 var autocompleteActions = ['approve', 'reject', 'as_note', 'as_todo'];
672 var autocompleteActions = ['approve', 'reject', 'as_note', 'as_todo'];
673 var commentForm = this.createCommentForm(
673 var commentForm = this.createCommentForm(
674 _form, lineNo, placeholderText, autocompleteActions, resolvesCommentId);
674 _form, lineNo, placeholderText, autocompleteActions, resolvesCommentId);
675 commentForm.initStatusChangeSelector();
675 commentForm.initStatusChangeSelector();
676
676
677 return commentForm;
677 return commentForm;
678 };
678 };
679
679
680 this.createComment = function(node, resolutionComment) {
680 this.createComment = function(node, resolutionComment) {
681 var resolvesCommentId = resolutionComment || null;
681 var resolvesCommentId = resolutionComment || null;
682 var $node = $(node);
682 var $node = $(node);
683 var $td = $node.closest('td');
683 var $td = $node.closest('td');
684 var $form = $td.find('.comment-inline-form');
684 var $form = $td.find('.comment-inline-form');
685
685
686 if (!$form.length) {
686 if (!$form.length) {
687
687
688 var $filediff = $node.closest('.filediff');
688 var $filediff = $node.closest('.filediff');
689 $filediff.removeClass('hide-comments');
689 $filediff.removeClass('hide-comments');
690 var f_path = $filediff.attr('data-f-path');
690 var f_path = $filediff.attr('data-f-path');
691 var lineno = self.getLineNumber(node);
691 var lineno = self.getLineNumber(node);
692 // create a new HTML from template
692 // create a new HTML from template
693 var tmpl = $('#cb-comment-inline-form-template').html();
693 var tmpl = $('#cb-comment-inline-form-template').html();
694 tmpl = tmpl.format(escapeHtml(f_path), lineno);
694 tmpl = tmpl.format(escapeHtml(f_path), lineno);
695 $form = $(tmpl);
695 $form = $(tmpl);
696
696
697 var $comments = $td.find('.inline-comments');
697 var $comments = $td.find('.inline-comments');
698 if (!$comments.length) {
698 if (!$comments.length) {
699 $comments = $(
699 $comments = $(
700 $('#cb-comments-inline-container-template').html());
700 $('#cb-comments-inline-container-template').html());
701 $td.append($comments);
701 $td.append($comments);
702 }
702 }
703
703
704 $td.find('.cb-comment-add-button').before($form);
704 $td.find('.cb-comment-add-button').before($form);
705
705
706 var placeholderText = _gettext('Leave a comment on line {0}.').format(lineno);
706 var placeholderText = _gettext('Leave a comment on line {0}.').format(lineno);
707 var _form = $($form[0]).find('form');
707 var _form = $($form[0]).find('form');
708 var autocompleteActions = ['as_note', 'as_todo'];
708 var autocompleteActions = ['as_note', 'as_todo'];
709 var commentForm = this.createCommentForm(
709 var commentForm = this.createCommentForm(
710 _form, lineno, placeholderText, autocompleteActions, resolvesCommentId);
710 _form, lineno, placeholderText, autocompleteActions, resolvesCommentId);
711
711
712 $.Topic('/ui/plugins/code/comment_form_built').prepareOrPublish({
712 $.Topic('/ui/plugins/code/comment_form_built').prepareOrPublish({
713 form: _form,
713 form: _form,
714 parent: $td[0],
714 parent: $td[0],
715 lineno: lineno,
715 lineno: lineno,
716 f_path: f_path}
716 f_path: f_path}
717 );
717 );
718
718
719 // set a CUSTOM submit handler for inline comments.
719 // set a CUSTOM submit handler for inline comments.
720 commentForm.setHandleFormSubmit(function(o) {
720 commentForm.setHandleFormSubmit(function(o) {
721 var text = commentForm.cm.getValue();
721 var text = commentForm.cm.getValue();
722 var commentType = commentForm.getCommentType();
722 var commentType = commentForm.getCommentType();
723 var resolvesCommentId = commentForm.getResolvesId();
723 var resolvesCommentId = commentForm.getResolvesId();
724
724
725 if (text === "") {
725 if (text === "") {
726 return;
726 return;
727 }
727 }
728
728
729 if (lineno === undefined) {
729 if (lineno === undefined) {
730 alert('missing line !');
730 alert('missing line !');
731 return;
731 return;
732 }
732 }
733 if (f_path === undefined) {
733 if (f_path === undefined) {
734 alert('missing file path !');
734 alert('missing file path !');
735 return;
735 return;
736 }
736 }
737
737
738 var excludeCancelBtn = false;
738 var excludeCancelBtn = false;
739 var submitEvent = true;
739 var submitEvent = true;
740 commentForm.setActionButtonsDisabled(true, excludeCancelBtn, submitEvent);
740 commentForm.setActionButtonsDisabled(true, excludeCancelBtn, submitEvent);
741 commentForm.cm.setOption("readOnly", true);
741 commentForm.cm.setOption("readOnly", true);
742 var postData = {
742 var postData = {
743 'text': text,
743 'text': text,
744 'f_path': f_path,
744 'f_path': f_path,
745 'line': lineno,
745 'line': lineno,
746 'comment_type': commentType,
746 'comment_type': commentType,
747 'csrf_token': CSRF_TOKEN
747 'csrf_token': CSRF_TOKEN
748 };
748 };
749 if (resolvesCommentId){
749 if (resolvesCommentId){
750 postData['resolves_comment_id'] = resolvesCommentId;
750 postData['resolves_comment_id'] = resolvesCommentId;
751 }
751 }
752
752
753 var submitSuccessCallback = function(json_data) {
753 var submitSuccessCallback = function(json_data) {
754 $form.remove();
754 $form.remove();
755 try {
755 try {
756 var html = json_data.rendered_text;
756 var html = json_data.rendered_text;
757 var lineno = json_data.line_no;
757 var lineno = json_data.line_no;
758 var target_id = json_data.target_id;
758 var target_id = json_data.target_id;
759
759
760 $comments.find('.cb-comment-add-button').before(html);
760 $comments.find('.cb-comment-add-button').before(html);
761
761
762 //mark visually which comment was resolved
762 //mark visually which comment was resolved
763 if (resolvesCommentId) {
763 if (resolvesCommentId) {
764 commentForm.markCommentResolved(resolvesCommentId);
764 commentForm.markCommentResolved(resolvesCommentId);
765 }
765 }
766
766
767 // run global callback on submit
767 // run global callback on submit
768 commentForm.globalSubmitSuccessCallback();
768 commentForm.globalSubmitSuccessCallback();
769
769
770 } catch (e) {
770 } catch (e) {
771 console.error(e);
771 console.error(e);
772 }
772 }
773
773
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.Waypoint !== undefined) {
779 // potentially our comments change the active window size, so we
780 // notify waypint to re-paint
781 Waypoint.refreshAll()
782 }
783
777 commentForm.setActionButtonsDisabled(false);
784 commentForm.setActionButtonsDisabled(false);
778
785
779 };
786 };
780 var submitFailCallback = function(data){
787 var submitFailCallback = function(data){
781 alert(
788 alert(
782 "Error while submitting comment.\n" +
789 "Error while submitting comment.\n" +
783 "Error code {0} ({1}).".format(data.status, data.statusText)
790 "Error code {0} ({1}).".format(data.status, data.statusText)
784 );
791 );
785 commentForm.resetCommentFormState(text)
792 commentForm.resetCommentFormState(text)
786 };
793 };
787 commentForm.submitAjaxPOST(
794 commentForm.submitAjaxPOST(
788 commentForm.submitUrl, postData, submitSuccessCallback, submitFailCallback);
795 commentForm.submitUrl, postData, submitSuccessCallback, submitFailCallback);
789 });
796 });
790 }
797 }
791
798
792 $form.addClass('comment-inline-form-open');
799 $form.addClass('comment-inline-form-open');
793 };
800 };
794
801
795 this.createResolutionComment = function(commentId){
802 this.createResolutionComment = function(commentId){
796 // hide the trigger text
803 // hide the trigger text
797 $('#resolve-comment-{0}'.format(commentId)).hide();
804 $('#resolve-comment-{0}'.format(commentId)).hide();
798
805
799 var comment = $('#comment-'+commentId);
806 var comment = $('#comment-'+commentId);
800 var commentData = comment.data();
807 var commentData = comment.data();
801 if (commentData.commentInline) {
808 if (commentData.commentInline) {
802 this.createComment(comment, commentId)
809 this.createComment(comment, commentId)
803 } else {
810 } else {
804 Rhodecode.comments.createGeneralComment('general', "$placeholder", commentId)
811 Rhodecode.comments.createGeneralComment('general', "$placeholder", commentId)
805 }
812 }
806
813
807 return false;
814 return false;
808 };
815 };
809
816
810 this.submitResolution = function(commentId){
817 this.submitResolution = function(commentId){
811 var form = $('#resolve_comment_{0}'.format(commentId)).closest('form');
818 var form = $('#resolve_comment_{0}'.format(commentId)).closest('form');
812 var commentForm = form.get(0).CommentForm;
819 var commentForm = form.get(0).CommentForm;
813
820
814 var cm = commentForm.getCmInstance();
821 var cm = commentForm.getCmInstance();
815 var renderer = templateContext.visual.default_renderer;
822 var renderer = templateContext.visual.default_renderer;
816 if (renderer == 'rst'){
823 if (renderer == 'rst'){
817 var commentUrl = '`#{0} <{1}#comment-{0}>`_'.format(commentId, commentForm.selfUrl);
824 var commentUrl = '`#{0} <{1}#comment-{0}>`_'.format(commentId, commentForm.selfUrl);
818 } else if (renderer == 'markdown') {
825 } else if (renderer == 'markdown') {
819 var commentUrl = '[#{0}]({1}#comment-{0})'.format(commentId, commentForm.selfUrl);
826 var commentUrl = '[#{0}]({1}#comment-{0})'.format(commentId, commentForm.selfUrl);
820 } else {
827 } else {
821 var commentUrl = '{1}#comment-{0}'.format(commentId, commentForm.selfUrl);
828 var commentUrl = '{1}#comment-{0}'.format(commentId, commentForm.selfUrl);
822 }
829 }
823
830
824 cm.setValue(_gettext('TODO from comment {0} was fixed.').format(commentUrl));
831 cm.setValue(_gettext('TODO from comment {0} was fixed.').format(commentUrl));
825 form.submit();
832 form.submit();
826 return false;
833 return false;
827 };
834 };
828
835
829 };
836 };
@@ -1,230 +1,235 b''
1 /**
1 /**
2 @license @nocompile
2 @license @nocompile
3 Copyright (c) 2018 The Polymer Project Authors. All rights reserved.
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
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
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
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
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
8 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
9 */
9 */
10 (function(){/*
10 (function(){/*
11
11
12 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
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
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
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
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
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
17 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
18 */
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++}}();
19 'use strict';var n,ca="function"==typeof Object.defineProperties?Object.defineProperty:function(a,b,c){a!=Array.prototype&&a!=Object.prototype&&(a[b]=c.value)},q="undefined"!=typeof window&&window===this?this:"undefined"!=typeof global&&null!=global?global:this;function da(){da=function(){};q.Symbol||(q.Symbol=ea)}var ea=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)}
20 function fa(){da();var a=q.Symbol.iterator;a||(a=q.Symbol.iterator=q.Symbol("iterator"));"function"!=typeof Array.prototype[a]&&ca(Array.prototype,a,{configurable:!0,writable:!0,value:function(){return ha(this)}});fa=function(){}}function ha(a){var b=0;return ia(function(){return b<a.length?{done:!1,value:a[b++]}:{done:!0}})}function ia(a){fa();a={next:a};a[q.Symbol.iterator]=function(){return this};return a}function ja(a){fa();var b=a[Symbol.iterator];return b?b.call(a):ha(a)}
21 function na(a){for(var b,c=[];!(b=a.next()).done;)c.push(b.value);return c}
21 function ka(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");
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,
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=
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,
25 a,m=e,p=Object.getOwnPropertyNames(m),x=0;x<p.length;x++)e=p[x],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 va.call(a,b);case Node.DOCUMENT_FRAGMENT_NODE:return jb.call(a,b);default:return Y.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(){},
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=
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,
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,p=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||
29 x=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML")||{get:function(){return this.innerHTML},set:function(a){this.innerHTML=a}},N=Object.getOwnPropertyDescriptor(window.Node.prototype,"childNodes")||{get:function(){return this.childNodes}},Y=Element.prototype.querySelectorAll,va=Document.prototype.querySelectorAll,jb=DocumentFragment.prototype.querySelectorAll,kb=function(){if(!c){var a=document.createElement("template"),b=document.createElement("template");b.content.appendChild(document.createElement("div"));
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();
30 a.content.appendChild(b);a=a.cloneNode(!0);return 0===a.content.childNodes.length||0===a.content.firstChild.content.childNodes.length||d}}();if(c){var T=document.implementation.createHTMLDocument("template"),C=!0,Z=document.createElement("style");Z.textContent="template{display:none;}";var oa=document.head;oa.insertBefore(Z,oa.firstElementChild);a.prototype=Object.create(HTMLElement.prototype);var wa=!document.createElement("div").hasOwnProperty("innerHTML");a.H=function(b){if(!b.content&&b.namespaceURI===
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=
31 document.documentElement.namespaceURI){b.content=T.createDocumentFragment();for(var c;c=b.firstChild;)l.call(b.content,c);if(wa)b.__proto__=a.prototype;else if(b.cloneNode=function(b){return a.a(this,b)},C)try{Q(b),aa(b)}catch(rh){C=!1}a.C(b.content)}};var ba={option:["select"],thead:["table"],col:["colgroup","table"],tr:["tbody","table"],th:["tr","tbody","table"],td:["tr","tbody","table"]},Q=function(b){Object.defineProperty(b,"innerHTML",{get:function(){return lb(this)},set:function(b){var c=ba[(/<([a-z][^/\0>\x20\t\r\n\f]+)/i.exec(b)||
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,
32 ["",""])[1].toLowerCase()];if(c)for(var d=0;d<c.length;d++)b="<"+c[d]+">"+b+"</"+c[d]+">";T.body.innerHTML=b;for(a.C(T);this.content.firstChild;)k.call(this.content,this.content.firstChild);b=T.body;if(c)for(d=0;d<c.length;d++)b=b.lastChild;for(;b.firstChild;)l.call(this.content,b.firstChild)},configurable:!0})},aa=function(a){Object.defineProperty(a,"outerHTML",{get:function(){return"<template>"+this.innerHTML+"</template>"},set:function(a){if(this.parentNode){T.body.innerHTML=a;for(a=this.ownerDocument.createDocumentFragment();T.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=
33 T.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})};Q(a.prototype);aa(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.H(f)};document.addEventListener("DOMContentLoaded",function(){a.C(document)});Document.prototype.createElement=function(){var b=h.apply(this,arguments);"template"===b.localName&&a.H(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(" ")),
34 function(){var b=p.apply(this,arguments);a.C(b);return b};Object.defineProperty(HTMLElement.prototype,"innerHTML",{get:function(){return lb(this)},set:function(b){x.set.call(this,b);a.C(this)},configurable:!0,enumerable:!0});var bf=/[&\u00A0"]/g,yc=/[&\u00A0<>]/g,zc=function(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}};Z=function(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b};var cf=Z("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);
35 df=Z("style script xmp iframe noembed noframes plaintext noscript".split(" ")),lb=function(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):N.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 Q=g.localName,m="<"+Q,aa=g.attributes,p=0;k=aa[p];p++)m+=" "+k.name+'="'+k.value.replace(bf,zc)+'"';m+=">";g=cf[Q]?m:m+lb(g,l)+"</"+Q+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&df[k.localName]?g:g.replace(yc,zc);break a;
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=
36 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||kb){a.a=function(a,b){var c=f.call(a,!1);this.H&&this.H(c);b&&(l.call(c.content,f.call(a.content,!0)),mb(c.content,a.content));return c};var mb=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.H&&a.H(g),m.call(h.parentNode,ef.call(g,!0),h)}},ef=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"]');
37 function(b){if(!e&&d&&this instanceof DocumentFragment)if(b)var c=ff.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&&mb(c,this);return c},ff=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){mb(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}}
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,Q=0,aa;Q<l.length;Q++)aa=l[Q],d.setAttribute(aa.name,aa.value);m.call(f.parentNode,d,f)}}return e}}c&&(window.HTMLTemplateElement=a)})();var la=setTimeout;function ma(){}function na(a,b){return function(){a.apply(b,arguments)}}function r(a){if(!(this instanceof r))throw new TypeError("Promises must be constructed via new");if("function"!==typeof a)throw new TypeError("not a function");this.v=0;this.qa=!1;this.j=void 0;this.K=[];pa(a,this)}
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;
39 function qa(a,b){for(;3===a.v;)a=a.j;0===a.v?a.K.push(b):(a.qa=!0,ra(function(){var c=1===a.v?b.Ua:b.Va;if(null===c)(1===a.v?sa:ta)(b.ja,a.j);else{try{var d=c(a.j)}catch(e){ta(b.ja,e);return}sa(b.ja,d)}}))}function sa(a,b){try{if(b===a)throw new TypeError("A promise cannot be resolved with itself.");if(b&&("object"===typeof b||"function"===typeof b)){var c=b.then;if(b instanceof r){a.v=3;a.j=b;ua(a);return}if("function"===typeof c){pa(na(c,b),a);return}}a.v=1;a.j=b;ua(a)}catch(d){ta(a,d)}}
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)})}
40 function ta(a,b){a.v=2;a.j=b;ua(a)}function ua(a){2===a.v&&0===a.K.length&&ra(function(){a.qa||"undefined"!==typeof console&&console&&console.warn("Possible Unhandled Promise Rejection:",a.j)});for(var b=0,c=a.K.length;b<c;b++)qa(a,a.K[b]);a.K=null}function xa(a,b,c){this.Ua="function"===typeof a?a:null;this.Va="function"===typeof b?b:null;this.ja=c}function pa(a,b){var c=!1;try{a(function(a){c||(c=!0,sa(b,a))},function(a){c||(c=!0,ta(b,a))})}catch(d){c||(c=!0,ta(b,d))}}
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))}
41 r.prototype["catch"]=function(a){return this.then(null,a)};r.prototype.then=function(a,b){var c=new this.constructor(ma);qa(this,new xa(a,b,c));return c};r.prototype["finally"]=function(a){var b=this.constructor;return this.then(function(c){return b.resolve(a()).then(function(){return c})},function(c){return b.resolve(a()).then(function(){return b.reject(c)})})};
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;
42 function ya(a){return new r(function(b,c){function d(a,h){try{if(h&&("object"===typeof h||"function"===typeof h)){var g=h.then;if("function"===typeof g){g.call(h,function(b){d(a,b)},c);return}}e[a]=h;0===--f&&b(e)}catch(m){c(m)}}if(!a||"undefined"===typeof a.length)throw new TypeError("Promise.all accepts an array");var e=Array.prototype.slice.call(a);if(0===e.length)return b([]);for(var f=e.length,h=0;h<e.length;h++)d(h,e[h])})}
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"))}
43 function za(a){return a&&"object"===typeof a&&a.constructor===r?a:new r(function(b){b(a)})}function Aa(a){return new r(function(b,c){c(a)})}function Ba(a){return new r(function(b,c){for(var d=0,e=a.length;d<e;d++)a[d].then(b,c)})}var ra="function"===typeof setImmediate&&function(a){setImmediate(a)}||function(a){la(a,0)};/*
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
44
46 Copyright (c) 2017 The Polymer Project Authors. All rights reserved.
45 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
46 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
47 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
48 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
49 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
50 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
52 */
51 */
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])"),
52 if(!window.Promise){window.Promise=r;r.prototype.then=r.prototype.then;r.all=ya;r.race=Ba;r.resolve=za;r.reject=Aa;var Ca=document.createTextNode(""),Da=[];(new MutationObserver(function(){for(var a=Da.length,b=0;b<a;b++)Da[b]();Da.splice(0,a)})).observe(Ca,{characterData:!0});ra=function(a){Da.push(a);Ca.textContent=0<Ca.textContent.length?"":"a"}};(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(N)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,
53 c=b.length;c?p(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"]'),
54 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.Qa(b)});this.c.observe(document.head,{childList:!0,subtree:!0});this.loadImports(document)}function l(a){p(m(a,"template"),function(a){p(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",
55 function(a){var b=document.createElement("script");p(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):Y}function p(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 x=document.createElement("link"),N="import"in x,Y=x.querySelectorAll("*"),va=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,
56 {get:function(){return va||("complete"!==document.readyState?document.scripts[document.scripts.length-1]:null)},configurable:!0});var jb=/(url\()([^)]*)(\))/g,kb=/(@import[\s]+(?!url\())([^;]*)(;)/g,T=/(<link[^>]*)(rel=['|"]?stylesheet['|"]?[^>]*>)/g,C={La:function(a,b){a.href&&a.setAttribute("href",C.Z(a.getAttribute("href"),b));a.src&&a.setAttribute("src",C.Z(a.getAttribute("src"),b));if("style"===a.localName){var c=C.ua(a.textContent,b,jb);a.textContent=C.ua(c,b,kb)}},ua: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=
57 function(a,c,d,e){a=d.replace(/["']/g,"");b&&(a=C.Z(a,b));return c+"'"+a+"'"+e})},Z:function(a,b){if(void 0===C.fa){C.fa=!1;try{var c=new URL("b","http://a");c.pathname="c%20d";C.fa="http://a/c%20d"===c.href}catch(yc){}}if(C.fa)return(new URL(a,b)).href;c=C.Ea;c||(c=document.implementation.createHTMLDocument("temp"),C.Ea=c,c.ma=c.createElement("base"),c.head.appendChild(c.ma),c.la=c.createElement("a"));c.ma.href=b;c.la.href=a;return c.la.href||a}},Z={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);
58 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,Z.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===
59 k.prototype.loadImports=function(a){var b=this;a=m(a,"link[rel=import]");p(a,function(a){return b.h(a)})};k.prototype.h=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.f(a))}else this.b++,this.a[c]="pending",Z.load(c,function(a,d){a=b.Ra(a,d||c);b.a[c]=a;b.b--;b.loadImports(a);b.o()},function(){b.a[c]=null;b.b--;b.o()})};k.prototype.Ra=function(a,b){if(!a)return document.createDocumentFragment();oa&&(a=a.replace(T,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"]');
60 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=C.Z(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&&
61 var d=0;p(c,function(a){h(a);C.La(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.o=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");
62 b&&(a.loadImports(document),a.b||(a.c.observe(document.head,{childList:!0,subtree:!0}),a.ha()))};this.Ta(function(){c=!0;d()});this.Sa(function(){b=!0;d()})}};k.prototype.flatten=function(a){var b=this;a=m(a,"link[rel=import]");p(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.Sa=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&&
63 p(f.attributes,function(a){return g.setAttribute(a.name,a.value)});va=g;f.parentNode.replaceChild(g,f);h(g,function(){va=null;b(e+1)})}else a()}var c=m(document,"script[import-dependency]"),d=c.length;b(0)};k.prototype.Ta=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]");p(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=
64 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.ha=function(){var a=this,b=m(document,"link[rel=import]");p(b,function(b){return a.f(b)},!0)};k.prototype.f=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",
65 "complete"),a.dispatchEvent(b(a.import?"load":"error",{bubbles:!1,cancelable:!1,detail:void 0})))};k.prototype.Qa=function(a){var b=this;p(a,function(a){return p(a.addedNodes,function(a){a&&a.nodeType===Node.ELEMENT_NODE&&(g(a)?b.h(a):b.loadImports(a))})})};var wa=null;if(N)x=m(document,"link[rel=import]"),p(x,function(a){a.import&&"loading"===a.import.readyState||(a.__loaded=!0)}),x=function(a){a=a.target;g(a)&&(a.__loaded=!0)},document.addEventListener("load",x,!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",
66 x,!0);else{var ba=Object.getOwnPropertyDescriptor(Node.prototype,"baseURI");Object.defineProperty((!ba||ba.configurable?Node:Element).prototype,"baseURI",{get:function(){var a=g(this)?this:c(this);return a?a.href:ba&&ba.get?ba.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(){wa=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||{});/*
67 {cancelable:!0,bubbles:!0,detail:void 0}))});a.useNative=N;a.whenReady=f;a.importForElement=c;a.loadImports=function(a){wa&&wa.loadImports(a)}})(window.HTMLImports=window.HTMLImports||{});/*
69
68
70 Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
69 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
70 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
71 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
72 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
73 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
74 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
76 */
75 */
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={}}
76 window.WebComponents=window.WebComponents||{flags:{}};var Ea=document.querySelector('script[src*="webcomponents-lite.js"]'),Fa=/wc-(.+)/,t={};if(!t.noOpts){location.search.slice(1).split("&").forEach(function(a){a=a.split("=");var b;a[0]&&(b=a[0].match(Fa))&&(t[b[1]]=a[1]||!0)});if(Ea)for(var Ga=0,Ha=void 0;Ha=Ea.attributes[Ga];Ga++)"src"!==Ha.name&&(t[Ha.name]=Ha.value||!0);if(t.log&&t.log.split){var Ia=t.log.split(",");t.log={};Ia.forEach(function(a){t.log[a]=!0})}else t.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);/*
77 window.WebComponents.flags=t;var Ja=t.shadydom;Ja&&(window.ShadyDOM=window.ShadyDOM||{},window.ShadyDOM.force=Ja);var Ka=t.register||t.ce;Ka&&window.customElements&&(window.customElements.forcePolyfill=Ka);/*
79
78
80 Copyright (c) 2016 The Polymer Project Authors. All rights reserved.
79 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
80 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
81 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
82 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
83 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
84 subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
86 */
85 */
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}
86 function La(){this.ta=this.root=null;this.W=!1;this.D=this.R=this.ga=this.assignedSlot=this.assignedNodes=this.I=null;this.childNodes=this.nextSibling=this.previousSibling=this.lastChild=this.firstChild=this.parentNode=this.L=void 0;this.Aa=this.oa=!1;this.P={}}La.prototype.toJSON=function(){return{}};function u(a){a.da||(a.da=new La);return a.da}function v(a){return a&&a.da};var w=window.ShadyDOM||{};w.Na=!(!Element.prototype.attachShadow||!Node.prototype.getRootNode);var Ma=Object.getOwnPropertyDescriptor(Node.prototype,"firstChild");w.w=!!(Ma&&Ma.configurable&&Ma.get);w.ia=w.force||!w.Na;var Na=navigator.userAgent.match("Trident"),Oa=navigator.userAgent.match("Edge");void 0===w.wa&&(w.wa=w.w&&(Na||Oa));function Pa(a){return(a=v(a))&&void 0!==a.firstChild}function y(a){return"ShadyRoot"===a.Ga}function Qa(a){a=a.getRootNode();if(y(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]}
87 var Ra=Element.prototype,Sa=Ra.matches||Ra.matchesSelector||Ra.mozMatchesSelector||Ra.msMatchesSelector||Ra.oMatchesSelector||Ra.webkitMatchesSelector;function Ta(a,b){if(a&&b)for(var c=Object.getOwnPropertyNames(b),d=0,e=void 0;d<c.length&&(e=c[d]);d++){var f=e,h=a,g=Object.getOwnPropertyDescriptor(b,f);g&&Object.defineProperty(h,f,g)}}function Ua(a,b){for(var c=[],d=1;d<arguments.length;++d)c[d-1]=arguments[d];for(d=0;d<c.length;d++)Ta(a,c[d]);return a}
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}
88 function Va(a,b){for(var c in b)a[c]=b[c]}var Wa=document.createTextNode(""),Xa=0,Ya=[];(new MutationObserver(function(){for(;Ya.length;)try{Ya.shift()()}catch(a){throw Wa.textContent=Xa++,a;}})).observe(Wa,{characterData:!0});function Za(a){Ya.push(a);Wa.textContent=Xa++}var $a=!!document.contains;function ab(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[]};
89 function bb(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=ja(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 cb=[],db;function eb(a){db||(db=!0,Za(fb));cb.push(a)}function fb(){db=!1;for(var a=!!cb.length;cb.length;)cb.shift()();return a}fb.list=cb;function gb(){this.a=!1;this.addedNodes=[];this.removedNodes=[];this.U=new Set}function hb(a){a.a||(a.a=!0,Za(function(){a.flush()}))}gb.prototype.flush=function(){if(this.a){this.a=!1;var a=this.takeRecords();a.length&&this.U.forEach(function(b){b(a)})}};gb.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))}
90 function ib(a,b){var c=u(a);c.I||(c.I=new gb);c.I.U.add(b);var d=c.I;return{Fa:b,G:d,Ha:a,takeRecords:function(){return d.takeRecords()}}}function nb(a){var b=a&&a.G;b&&(b.U.delete(a.Fa),b.U.size||(u(a.Ha).I=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,
91 function ob(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 pb=Element.prototype.insertBefore,qb=Element.prototype.replaceChild,rb=Element.prototype.removeChild,sb=Element.prototype.setAttribute,tb=Element.prototype.removeAttribute,ub=Element.prototype.cloneNode,vb=Document.prototype.importNode,wb=Element.prototype.addEventListener,xb=Element.prototype.removeEventListener,yb=Window.prototype.addEventListener,zb=Window.prototype.removeEventListener,Ab=Element.prototype.dispatchEvent,Bb=Node.prototype.contains||HTMLElement.prototype.contains,Cb=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;
92 Db=Element.prototype.querySelector,Eb=DocumentFragment.prototype.querySelector,Fb=Document.prototype.querySelector,Gb=Element.prototype.querySelectorAll,Hb=DocumentFragment.prototype.querySelectorAll,Ib=Document.prototype.querySelectorAll,z={};z.appendChild=Element.prototype.appendChild;z.insertBefore=pb;z.replaceChild=qb;z.removeChild=rb;z.setAttribute=sb;z.removeAttribute=tb;z.cloneNode=ub;z.importNode=vb;z.addEventListener=wb;z.removeEventListener=xb;z.eb=yb;z.fb=zb;z.dispatchEvent=Ab;
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(" "));
93 z.contains=Bb;z.getElementById=Cb;z.nb=Db;z.qb=Eb;z.lb=Fb;z.querySelector=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return Db.call(this,a);case Node.DOCUMENT_NODE:return Fb.call(this,a);default:return Eb.call(this,a)}};z.ob=Gb;z.rb=Hb;z.mb=Ib;z.querySelectorAll=function(a){switch(this.nodeType){case Node.ELEMENT_NODE:return Gb.call(this,a);case Node.DOCUMENT_NODE:return Ib.call(this,a);default:return Hb.call(this,a)}};var Jb=/[&\u00A0"]/g,Kb=/[&\u00A0<>]/g;function Lb(a){switch(a){case "&":return"&amp;";case "<":return"&lt;";case ">":return"&gt;";case '"':return"&quot;";case "\u00a0":return"&nbsp;"}}function Mb(a){for(var b={},c=0;c<a.length;c++)b[a[c]]=!0;return b}var Nb=Mb("area base br col command embed hr img input keygen link meta param source track wbr".split(" ")),Ob=Mb("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),
94 function Pb(a,b){"template"===a.localName&&(a=a.content);for(var c="",d=b?b(a):a.childNodes,e=0,f=d.length,h=void 0;e<f&&(h=d[e]);e++){a:{var g=h;var k=a,l=b;switch(g.nodeType){case Node.ELEMENT_NODE:k=g.localName;for(var m="<"+k,p=g.attributes,x=0,N;N=p[x];x++)m+=" "+N.name+'="'+N.value.replace(Jb,Lb)+'"';m+=">";g=Nb[k]?m:m+Pb(g,l)+"</"+k+">";break a;case Node.TEXT_NODE:g=g.data;g=k&&Ob[k.localName]?g:g.replace(Kb,Lb);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()};
95 Error("not implemented");}}c+=g}return c};var A=document.createTreeWalker(document,NodeFilter.SHOW_ALL,null,!1),B=document.createTreeWalker(document,NodeFilter.SHOW_ELEMENT,null,!1);function Qb(a){var b=[];A.currentNode=a;for(a=A.firstChild();a;)b.push(a),a=A.nextSibling();return b}
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()};
96 var D={parentNode:function(a){A.currentNode=a;return A.parentNode()},firstChild:function(a){A.currentNode=a;return A.firstChild()},lastChild:function(a){A.currentNode=a;return A.lastChild()},previousSibling:function(a){A.currentNode=a;return A.previousSibling()},nextSibling:function(a){A.currentNode=a;return A.nextSibling()}};D.childNodes=Qb;D.parentElement=function(a){B.currentNode=a;return B.parentNode()};D.firstElementChild=function(a){B.currentNode=a;return B.firstChild()};
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)}
97 D.lastElementChild=function(a){B.currentNode=a;return B.lastChild()};D.previousElementSibling=function(a){B.currentNode=a;return B.previousSibling()};D.nextElementSibling=function(a){B.currentNode=a;return B.nextSibling()};D.children=function(a){var b=[];B.currentNode=a;for(a=B.firstChild();a;)b.push(a),a=B.nextSibling();return bb(b)};D.innerHTML=function(a){return Pb(a,function(a){return Qb(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,
98 D.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 Rb=w.w,Sb=[Node.prototype,Element.prototype,HTMLElement.prototype];function E(a){var b;a:{for(b=0;b<Sb.length;b++){var c=Sb[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)}
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)};
99 var F=Rb?{parentNode:E("parentNode"),firstChild:E("firstChild"),lastChild:E("lastChild"),previousSibling:E("previousSibling"),nextSibling:E("nextSibling"),childNodes:E("childNodes"),parentElement:E("parentElement"),previousElementSibling:E("previousElementSibling"),nextElementSibling:E("nextElementSibling"),innerHTML:E("innerHTML"),textContent:E("textContent"),firstElementChild:E("firstElementChild"),lastElementChild:E("lastElementChild"),children:E("children")}:{},Tb=Rb?{firstElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,
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)};
100 "firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(DocumentFragment.prototype,"children")}:{},Ub=Rb?{firstElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"firstElementChild"),lastElementChild:Object.getOwnPropertyDescriptor(Document.prototype,"lastElementChild"),children:Object.getOwnPropertyDescriptor(Document.prototype,"children")}:{},Vb={sa:F,pb:Tb,kb:Ub,parentNode:function(a){return F.parentNode.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)}};
101 firstChild:function(a){return F.firstChild.get.call(a)},lastChild:function(a){return F.lastChild.get.call(a)},previousSibling:function(a){return F.previousSibling.get.call(a)},nextSibling:function(a){return F.nextSibling.get.call(a)},childNodes:function(a){return Array.prototype.slice.call(F.childNodes.get.call(a))},parentElement:function(a){return F.parentElement.get.call(a)},previousElementSibling:function(a){return F.previousElementSibling.get.call(a)},nextElementSibling:function(a){return F.nextElementSibling.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)}
102 innerHTML:function(a){return F.innerHTML.get.call(a)},textContent:function(a){return F.textContent.get.call(a)},children:function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Tb.children.get.call(a);case Node.DOCUMENT_NODE:return Ub.children.get.call(a);default:return F.children.get.call(a)}},firstElementChild:function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Tb.firstElementChild.get.call(a);case Node.DOCUMENT_NODE:return Ub.firstElementChild.get.call(a);default:return F.firstElementChild.get.call(a)}},
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},
103 lastElementChild:function(a){switch(a.nodeType){case Node.DOCUMENT_FRAGMENT_NODE:return Tb.lastElementChild.get.call(a);case Node.DOCUMENT_NODE:return Ub.lastElementChild.get.call(a);default:return F.lastElementChild.get.call(a)}}};var G=w.wa?Vb:D;function Wb(a){for(;a.firstChild;)a.removeChild(a.firstChild)}
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=
104 var Xb=w.w,Yb=document.implementation.createHTMLDocument("inert"),Zb=Object.getOwnPropertyDescriptor(Node.prototype,"isConnected"),$b=Zb&&Zb.get,ac=Object.getOwnPropertyDescriptor(Document.prototype,"activeElement"),bc={parentElement:{get:function(){var a=v(this);(a=a&&a.parentNode)&&a.nodeType!==Node.ELEMENT_NODE&&(a=null);return void 0!==a?a:G.parentElement(this)},configurable:!0},parentNode:{get:function(){var a=v(this);a=a&&a.parentNode;return void 0!==a?a:G.parentNode(this)},configurable:!0},
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=
105 nextSibling:{get:function(){var a=v(this);a=a&&a.nextSibling;return void 0!==a?a:G.nextSibling(this)},configurable:!0},previousSibling:{get:function(){var a=v(this);a=a&&a.previousSibling;return void 0!==a?a:G.previousSibling(this)},configurable:!0},nextElementSibling:{get:function(){var a=v(this);if(a&&void 0!==a.nextSibling){for(a=this.nextSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return G.nextElementSibling(this)},configurable:!0},previousElementSibling:{get:function(){var a=
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&&
106 v(this);if(a&&void 0!==a.previousSibling){for(a=this.previousSibling;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return G.previousElementSibling(this)},configurable:!0}},cc={className:{get:function(){return this.getAttribute("class")||""},set:function(a){this.setAttribute("class",a)},configurable:!0}},dc={childNodes:{get:function(){if(Pa(this)){var a=v(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=
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=
107 G.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=v(this);a=a&&a.firstChild;return void 0!==a?a:G.firstChild(this)},configurable:!0},lastChild:{get:function(){var a=v(this);a=a&&a.lastChild;return void 0!==a?a:G.lastChild(this)},configurable:!0},textContent:{get:function(){if(Pa(this)){for(var a=[],b=0,c=this.childNodes,d;d=c[b];b++)d.nodeType!==Node.COMMENT_NODE&&
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})):
108 a.push(d.textContent);return a.join("")}return G.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(!Pa(this)&&Xb){var b=this.firstChild;(b!=this.lastChild||b&&b.nodeType!=Node.TEXT_NODE)&&Wb(this);Vb.sa.textContent.set.call(this,a)}else Wb(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=
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}},
109 v(this);if(a&&void 0!==a.firstChild){for(a=this.firstChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.nextSibling;return a}return G.firstElementChild(this)},configurable:!0},lastElementChild:{get:function(){var a=v(this);if(a&&void 0!==a.lastChild){for(a=this.lastChild;a&&a.nodeType!==Node.ELEMENT_NODE;)a=a.previousSibling;return a}return G.lastElementChild(this)},configurable:!0},children:{get:function(){return Pa(this)?bb(Array.prototype.filter.call(this.childNodes,function(a){return a.nodeType===Node.ELEMENT_NODE})):
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}};
110 G.children(this)},configurable:!0},innerHTML:{get:function(){return Pa(this)?Pb("template"===this.localName?this.content:this):G.innerHTML(this)},set:function(a){var b="template"===this.localName?this.content:this;Wb(b);var c=this.localName||"div";c=this.namespaceURI&&this.namespaceURI!==Yb.namespaceURI?Yb.createElementNS(this.namespaceURI,c):Yb.createElement(c);Xb?Vb.sa.innerHTML.set.call(c,a):c.innerHTML=a;for(a="template"===this.localName?c.content:c;a.firstChild;)b.appendChild(a.firstChild)},
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)}
111 configurable:!0}},ec={shadowRoot:{get:function(){var a=v(this);return a&&a.ta||null},configurable:!0}},fc={activeElement:{get:function(){var a=ac&&ac.get?ac.get.call(document):w.w?void 0:document.activeElement;if(a&&a.nodeType){var b=!!y(this);if(this===document||b&&this.host!==a&&z.contains.call(this.host,a)){for(b=Qa(a);b&&b!==this;)a=b.host,b=Qa(a);a=this===document?b?null:a:b===this?a:null}else a=null}else a=null;return a},set:function(){},configurable:!0}};
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]},
112 function H(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 gc(a){H(a,bc);H(a,cc);H(a,dc);H(a,fc)}
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}
113 function hc(){var a=ic.prototype;a.__proto__=DocumentFragment.prototype;H(a,bc,!0);H(a,dc,!0);H(a,fc,!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]},
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;
114 configurable:!0})})}var jc=w.w?function(){}:function(a){var b=u(a);b.oa||(b.oa=!0,H(a,bc,!0),H(a,cc,!0))},kc=w.w?function(){}:function(a){u(a).Aa||(H(a,dc,!0),H(a,ec,!0))};var lc=G.childNodes;function mc(a,b,c){kc(b);var d=u(b);void 0!==d.firstChild&&(d.childNodes=null);if(a.nodeType===Node.DOCUMENT_FRAGMENT_NODE){d=a.childNodes;for(var e=0;e<d.length;e++)nc(d[e],b,c);a=u(a);b=void 0!==a.firstChild?null:void 0;a.firstChild=a.lastChild=b;a.childNodes=b}else nc(a,b,c)}
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&&
115 function nc(a,b,c){jc(a);c=c||null;var d=u(a),e=u(b),f=c?u(c):null;d.previousSibling=c?f.previousSibling:b.lastChild;if(f=v(d.previousSibling))f.nextSibling=a;if(f=v(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}
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);
116 function oc(a,b){var c=u(a);b=u(b);a===b.firstChild&&(b.firstChild=c.nextSibling);a===b.lastChild&&(b.lastChild=c.previousSibling);a=c.previousSibling;var d=c.nextSibling;a&&(u(a).nextSibling=d);d&&(u(d).previousSibling=a);c.parentNode=c.previousSibling=c.nextSibling=void 0;void 0!==b.childNodes&&(b.childNodes=null)}
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}
117 function pc(a){var b=u(a);if(void 0===b.firstChild){b.childNodes=null;var c=lc(a);b.firstChild=c[0]||null;b.lastChild=c[c.length-1]||null;kc(a);for(b=0;b<c.length;b++){var d=c[b],e=u(d);e.parentNode=a;e.nextSibling=c[b+1]||null;e.previousSibling=c[b-1]||null;jc(d)}}};var qc=G.parentNode;
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)&&
118 function rc(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=v(c);d=d&&d.parentNode;if(void 0!==d&&d!==a||void 0===d&&qc(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;var e=[],f=sc,h=Qa(a),g=h?h.host.localName:"";if(b.parentNode){var k=tc(b);uc(b.parentNode,b,!!h||!(b.getRootNode()instanceof ShadowRoot));
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}
119 f=function(a,b){vc()&&(wc(a,k),sc(a,b))}}d=!0;var l=!xc(b,g);!h||b.__noInsertionPoint&&!l||Ac(b,function(a){"slot"===a.localName&&e.push(a);l&&f(a,g)});e.length&&Bc(h,e);("slot"===a.localName||e.length)&&h&&Cc(h);Pa(a)&&(mc(b,a,c),h=v(a),Dc(a)?(Cc(h.root),d=!1):h.root&&(d=!1));d?(d=y(a)?a.host:a,c?(c=Ec(c),z.insertBefore.call(d,b,c)):z.appendChild.call(d,b)):b.ownerDocument!==a.ownerDocument&&a.ownerDocument.adoptNode(b);Fc(a,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)}
120 function uc(a,b,c){c=void 0===c?!1:c;if(b.parentNode!==a)throw Error("The node to be removed is not a child of this node: "+b);var d=Qa(b),e=v(a);if(Pa(a)&&(oc(b,a),Dc(a))){Cc(e.root);var f=!0}if(vc()&&!c&&d){var h=tc(b);Ac(b,function(a){wc(a,h)})}Gc(b);if(d){var g=a&&"slot"===a.localName;g&&(f=!0);((c=Hc(d,b))||g)&&Cc(d)}f||(f=y(a)?a.host:a,(!e.root&&"slot"!==b.localName||f===qc(b))&&z.removeChild.call(f,b));Fc(a,null,b);return b}
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)}
121 function Gc(a){var b=v(a);if(b&&void 0!==b.L){b=a.childNodes;for(var c=0,d=b.length,e=void 0;c<d&&(e=b[c]);c++)Gc(e)}if(a=v(a))a.L=void 0}function Ec(a){var b=a;a&&"slot"===a.localName&&(b=(b=(b=v(a))&&b.D)&&b.length?b[0]:Ec(a.nextSibling));return b}function Dc(a){return(a=(a=v(a))&&a.root)&&Ic(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;
122 function Jc(a,b){if("slot"===b)a=a.parentNode,Dc(a)&&Cc(v(a).root);else if("slot"===a.localName&&"name"===b&&(b=Qa(a))){if(b.g){Kc(b);var c=a.Da,d=Lc(a);if(d!==c){c=b.i[c];var e=c.indexOf(a);0<=e&&c.splice(e,1);c=b.i[d]||(b.i[d]=[]);c.push(a);1<c.length&&(b.i[d]=Mc(c))}}Cc(b)}}function Fc(a,b,c){if(a=(a=v(a))&&a.I)b&&a.addedNodes.push(b),c&&a.removedNodes.push(c),hb(a)}
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,
123 function Nc(a){if(a&&a.nodeType){var b=u(a),c=b.L;void 0===c&&(y(a)?(c=a,b.L=c):(c=(c=a.parentNode)?Nc(c):a,z.contains.call(document.documentElement,a)&&(b.L=c)));return c}}function Oc(a,b,c){var d=[];Pc(a.childNodes,b,c,d);return d}function Pc(a,b,c,d){for(var e=0,f=a.length,h=void 0;e<f&&(h=a[e]);e++){var g;if(g=h.nodeType===Node.ELEMENT_NODE){g=h;var k=b,l=c,m=d,p=k(g);p&&m.push(g);l&&l(p)?g=p:(Pc(g.childNodes,k,l,m),g=void 0)}if(g)break}}var Qc=null;
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};
124 function vc(){Qc||(Qc=window.ShadyCSS&&window.ShadyCSS.ScopingShim);return Qc||null}function Rc(a,b,c){var d=vc();d&&"class"===b?d.setElementClass(a,c):(z.setAttribute.call(a,b,c),Jc(a,b))}function Sc(a,b){if(a.ownerDocument!==document||"template"===a.localName)return z.importNode.call(document,a,b);var c=z.importNode.call(document,a,!1);if(b){a=a.childNodes;b=0;for(var d;b<a.length;b++)d=Sc(a[b],!0),c.appendChild(d)}return c}function sc(a,b){var c=vc();c&&c.scopeNode(a,b)}
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}
125 function wc(a,b){var c=vc();c&&c.unscopeNode(a,b)}function xc(a,b){var c=vc();if(!c)return!0;if(a.nodeType===Node.DOCUMENT_FRAGMENT_NODE){c=!0;for(var d=0;c&&d<a.childNodes.length;d++)c=c&&xc(a.childNodes[d],b);return c}return a.nodeType!==Node.ELEMENT_NODE?!0:c.currentScopeForNode(a)===b}function tc(a){if(a.nodeType!==Node.ELEMENT_NODE)return"";var b=vc();return b?b.currentScopeForNode(a):""}
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=
126 function Ac(a,b){if(a){a.nodeType===Node.ELEMENT_NODE&&b(a);for(var c=0,d;c<a.childNodes.length;c++)d=a.childNodes[c],d.nodeType===Node.ELEMENT_NODE&&Ac(d,b)}};var Tc="__eventWrappers"+Date.now(),Uc=function(){var a=Object.getOwnPropertyDescriptor(Event.prototype,"composed");return a?function(b){return a.get.call(b)}:null}(),Vc={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,
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++);}
127 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},Wc={DOMAttrModified:!0,DOMAttributeNameChanged:!0,DOMCharacterDataModified:!0,DOMElementNameChanged:!0,DOMNodeInserted:!0,DOMNodeInsertedIntoDocument:!0,DOMNodeRemoved:!0,DOMNodeRemovedFromDocument:!0,DOMSubtreeModified:!0};
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}}
128 function Xc(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 Yc(a,b){if(!y)return a;a=Xc(a,!0);for(var c=0,d,e=void 0,f,h=void 0;c<b.length;c++)if(d=b[c],f=d===window?window:d.getRootNode(),f!==e&&(h=a.indexOf(f),e=f),!y(f)||-1<h)return d}
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}
129 var Zc={get composed(){void 0===this.O&&(Uc?this.O="focusin"===this.type||"focusout"===this.type||Uc(this):!1!==this.isTrusted&&(this.O=Vc[this.type]));return this.O||!1},composedPath:function(){this.na||(this.na=Xc(this.__target,this.composed));return this.na},get target(){return Yc(this.currentTarget||this.__previousCurrentTarget,this.composedPath())},get relatedTarget(){if(!this.ca)return null;this.pa||(this.pa=Xc(this.ca,!0));return Yc(this.currentTarget||this.__previousCurrentTarget,this.pa)},
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,
130 stopPropagation:function(){Event.prototype.stopPropagation.call(this);this.ba=!0},stopImmediatePropagation:function(){Event.prototype.stopImmediatePropagation.call(this);this.ba=this.za=!0}};function $c(a){function b(b,d){b=new a(b,d);b.O=d&&!!d.composed;return b}Va(b,a);b.prototype=a.prototype;return b}var ad={focus:!0,blur:!0};function bd(a){return a.__target!==a.target||a.ca!==a.relatedTarget}
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&&
131 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.za);d++);}
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)}}}
132 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.ba)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=v(d);f=f&&f.root;if(0===c||f&&f===e)if(cd(a,d,"bubble"),d!==window&&(e=d.getRootNode()),a.ba)break}}
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))}}
133 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,p=g.passive;if(b===g.node&&c===k&&d===l&&e===m&&f===p)return h}return-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);
134 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?z.eb:z.addEventListener;if(Wc[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.ea||this,l=b[Tc];if(l){if(-1<ed(l,k,a,f,h,g))return}else b[Tc]=[];l=function(e){h&&this.removeEventListener(a,b,c);e.__target||gd(e);if(k!==this){var f=Object.getOwnPropertyDescriptor(e,
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}}
135 "currentTarget");Object.defineProperty(e,"currentTarget",{get:function(){return k},configurable:!0})}e.__previousCurrentTarget=e.currentTarget;if(!y(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&&
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]=
136 (f?(Object.defineProperty(e,"currentTarget",f),f=null):delete e.currentTarget);return g}};b[Tc].push({node:k,type:a,capture:f,once:h,passive:g,gb: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)}}}
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));
137 function hd(a,b,c){if(b){var d=this instanceof Window?z.fb:z.removeEventListener;if(Wc[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.ea||this,k=void 0;var l=null;try{l=b[Tc]}catch(m){}l&&(f=ed(l,g,a,e,f,h),-1<f&&(k=l.splice(f,1)[0].gb,l.length||(b[Tc]=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))}}
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}
138 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.ca=a.relatedTarget;if(w.w){var b=Object.getPrototypeOf(a);if(!b.hasOwnProperty("__patchProto")){var c=Object.create(b);c.hb=b;Ta(c,Zc);b.__patchProto=c}a.__proto__=b.__patchProto}else Ta(a,Zc)}var jd=$c(window.Event),kd=$c(window.CustomEvent),ld=$c(window.MouseEvent);
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)}))}
139 function md(){window.Event=jd;window.CustomEvent=kd;window.MouseEvent=ld;id();if(!Uc&&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,M:[],T:b}}
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()}
140 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.M.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]=
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)&&
141 b[l-1][m-1];else{var p=b[l-1][m]+1,x=b[l][m-1]+1;b[l][m]=p<x?p:x}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],p=l<m?l<g?l:g:m<g?m:g,p==g?(g==d?a.push(0):(a.push(1),d=g),k--,h--):p==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.T++;e++;b.M.push(c[f]);f++;break;case 2:b||(b=nd(e,0));
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,
142 b.T++;e++;break;case 3:b||(b=nd(e,0)),b.M.push(c[f]),f++}b&&k.push(b);return k}function pd(a,b){return a===b};var qd=G.parentNode,rd=G.childNodes,sd={},td=w.deferConnectionCallbacks&&"loading"===document.readyState,ud;function vd(a){var b=[];do b.unshift(a);while(a=a.parentNode);return b}
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()};
143 function ic(a,b,c){if(a!==sd)throw new TypeError("Illegal constructor");this.Ga="ShadyRoot";this.host=b;this.c=c&&c.mode;pc(b);a=u(b);a.root=this;a.ta="closed"!==this.c?this:null;a=u(this);a.firstChild=a.lastChild=a.parentNode=a.nextSibling=a.previousSibling=null;a.childNodes=[];this.b=this.S=!1;this.a=this.i=this.g=null;Cc(this)}function Cc(a){a.S||(a.S=!0,eb(function(){return wd(a)}))}
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)}
144 function wd(a){for(var b;a;){a.S&&(b=a);a:{var c=a;a=c.host.getRootNode();if(y(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()}
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)}})}
145 ic.prototype._renderRoot=function(){var a=td;td=!0;this.S=!1;if(this.g){Kc(this);for(var b=0,c;b<this.g.length;b++){c=this.g[b];var d=v(c),e=d.assignedNodes;d.assignedNodes=[];d.D=[];if(d.ga=e)for(d=0;d<e.length;d++){var f=v(e[d]);f.R=f.assignedSlot;f.assignedSlot===c&&(f.assignedSlot=null)}}for(b=this.host.firstChild;b;b=b.nextSibling)xd(this,b);for(b=0;b<this.g.length;b++){c=this.g[b];e=v(c);if(!e.assignedNodes.length)for(d=c.firstChild;d;d=d.nextSibling)xd(this,d,c);(d=(d=v(c.parentNode))&&d.root)&&
147 function id(a){gd(a);return!(!a.g||!a.g.length)}
146 Ic(d)&&d._renderRoot();yd(this,e.D,e.assignedNodes);if(d=e.ga){for(f=0;f<d.length;f++)v(d[f]).R=null;e.ga=null;d.length>e.assignedNodes.length&&(e.W=!0)}e.W&&(e.W=!1,zd(this,c))}c=this.g;b=[];for(e=0;e<c.length;e++)d=c[e].parentNode,(f=v(d))&&f.root||!(0>b.indexOf(d))||b.push(d);for(c=0;c<b.length;c++){f=b[c];e=f===this?this.host:f;d=[];f=f.childNodes;for(var h=0;h<f.length;h++){var g=f[h];if("slot"==g.localName){g=v(g).D;for(var k=0;k<g.length;k++)d.push(g[k])}else d.push(g)}f=rd(e);h=od(d,d.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=
147 f,f.length);k=g=0;for(var l=void 0;g<h.length&&(l=h[g]);g++){for(var m=0,p=void 0;m<l.M.length&&(p=l.M[m]);m++)qd(p)===e&&z.removeChild.call(e,p),f.splice(l.index+k,1);k-=l.T}k=0;for(l=void 0;k<h.length&&(l=h[k]);k++)for(g=f[l.index],m=l.index;m<l.index+l.T;m++)p=d[m],z.insertBefore.call(e,p,g),f.splice(m,0,p)}}if(!this.b)for(b=this.host.childNodes,c=0,e=b.length;c<e;c++)d=b[c],f=v(d),qd(d)!==this.host||"slot"!==d.localName&&f.assignedSlot||z.removeChild.call(this.host,d);this.b=!0;td=a;ud&&ud()};
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}
148 function xd(a,b,c){var d=u(b),e=d.R;d.R=null;c||(c=(a=a.i[b.slot||"__catchall"])&&a[0]);c?(u(c).assignedNodes.push(b),d.assignedSlot=c):d.assignedSlot=void 0;e!==d.assignedSlot&&d.assignedSlot&&(u(d.assignedSlot).W=!0)}function yd(a,b,c){for(var d=0,e=void 0;d<c.length&&(e=c[d]);d++)if("slot"==e.localName){var f=v(e).assignedNodes;f&&f.length&&yd(a,b,f)}else b.push(c[d])}function zd(a,b){z.dispatchEvent.call(b,new Event("slotchange"));b=v(b);b.assignedSlot&&zd(a,b.assignedSlot)}
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=
149 function Bc(a,b){a.a=a.a||[];a.g=a.g||[];a.i=a.i||{};a.a.push.apply(a.a,b instanceof Array?b:ka(ja(b)))}function Kc(a){if(a.a&&a.a.length){for(var b=a.a,c,d=0;d<b.length;d++){var e=b[d];pc(e);pc(e.parentNode);var f=Lc(e);a.i[f]?(c=c||{},c[f]=!0,a.i[f].push(e)):a.i[f]=[e];a.g.push(e)}if(c)for(var h in c)a.i[h]=Mc(a.i[h]);a.a=[]}}function Lc(a){var b=a.name||a.getAttribute("name")||"__catchall";return a.Da=b}
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)}};
150 function Mc(a){return a.sort(function(a,c){a=vd(a);for(var b=vd(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)}})}function Hc(a,b){if(a.g){Kc(a);var c=a.i,d;for(d in c)for(var e=c[d],f=0;f<e.length;f++){var h=e[f];if(ab(b,h)){e.splice(f,1);var g=a.g.indexOf(h);0<=g&&a.g.splice(g,1);f--;h=v(h);if(g=h.D)for(var k=0;k<g.length;k++){var l=g[k],m=qd(l);m&&z.removeChild.call(m,l)}h.D=[];h.assignedNodes=[];g=!0}}return g}}
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}});
151 function Ic(a){Kc(a);return!(!a.g||!a.g.length)}
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))?
152 if(window.customElements&&w.ia){var Ad=new Map;ud=function(){var a=Array.from(Ad);Ad.clear();a=ja(a);for(var b=a.next();!b.done;b=a.next()){b=ja(b.value);var c=b.next().value;b.next().value?c.Ba():c.Ca()}};td&&document.addEventListener("readystatechange",function(){td=!1;ud()},{once:!0});var Bd=function(a,b,c){var d=0,e="__isConnected"+d++;if(b||c)a.prototype.connectedCallback=a.prototype.Ba=function(){td?Ad.set(this,!0):this[e]||(this[e]=!0,b&&b.call(this))},a.prototype.disconnectedCallback=a.prototype.Ca=
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);
153 function(){td?this.isConnected||Ad.set(this,!1):this[e]&&(this[e]=!1,c&&c.call(this))};return a},Cd=window.customElements.define;Object.defineProperty(window.CustomElementRegistry.prototype,"define",{value:function(a,b){var c=b.prototype.connectedCallback,d=b.prototype.disconnectedCallback;Cd.call(window.customElements,a,Bd(b,c,d));b.prototype.connectedCallback=c;b.prototype.disconnectedCallback=d}})};function Dd(a){var b=a.getRootNode();y(b)&&wd(b);return(a=v(a))&&a.assignedSlot||null}
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});
154 var Ed={addEventListener:fd.bind(window),removeEventListener:hd.bind(window)},Fd={addEventListener:fd,removeEventListener:hd,appendChild:function(a){return rc(this,a)},insertBefore:function(a,b){return rc(this,a,b)},removeChild:function(a){return uc(this,a)},replaceChild:function(a,b){rc(this,a,b);uc(this,b);return a},cloneNode:function(a){if("template"==this.localName)var b=z.cloneNode.call(this,a);else if(b=z.cloneNode.call(this,!1),a&&b.nodeType!==Node.ATTRIBUTE_NODE){a=this.childNodes;for(var c=
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=
155 0,d;c<a.length;c++)d=a[c].cloneNode(!0),b.appendChild(d)}return b},getRootNode:function(){return Nc(this)},contains:function(a){return ab(this,a)},dispatchEvent:function(a){fb();return z.dispatchEvent.call(this,a)}};
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}};
156 Object.defineProperties(Fd,{isConnected:{get:function(){if($b&&$b.call(this))return!0;if(this.nodeType==Node.DOCUMENT_FRAGMENT_NODE)return!1;var a=this.ownerDocument;if($a){if(z.contains.call(a,this))return!0}else if(a.documentElement&&z.contains.call(a.documentElement,this))return!0;for(a=this;a&&!(a instanceof Document);)a=a.parentNode||(y(a)?a.host:void 0);return!!(a&&a instanceof Document)},configurable:!0}});
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,
157 var Gd={get assignedSlot(){return Dd(this)}},Hd={querySelector:function(a){return Oc(this,function(b){return Sa.call(b,a)},function(a){return!!a})[0]||null},querySelectorAll:function(a,b){if(b){b=Array.prototype.slice.call(z.querySelectorAll.call(this,a));var c=this.getRootNode();return b.filter(function(a){return a.getRootNode()==c})}return Oc(this,function(b){return Sa.call(b,a)})}},Id={assignedNodes:function(a){if("slot"===this.localName){var b=this.getRootNode();y(b)&&wd(b);return(b=v(this))?
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))}
158 (a&&a.flatten?b.D:b.assignedNodes)||[]:[]}}},Jd=Ua({setAttribute:function(a,b){Rc(this,a,b)},removeAttribute:function(a){z.removeAttribute.call(this,a);Jc(this,a)},attachShadow:function(a){if(!this)throw"Must provide a host.";if(!a)throw"Not enough arguments.";return new ic(sd,this,a)},get slot(){return this.getAttribute("slot")},set slot(a){Rc(this,"slot",a)},get assignedSlot(){return Dd(this)}},Hd,Id);Object.defineProperties(Jd,ec);
160 function re(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
159 var Kd=Ua({importNode:function(a,b){return Sc(a,b)},getElementById:function(a){return Oc(this,function(b){return b.id==a},function(a){return!!a})[0]||null}},Hd);Object.defineProperties(Kd,{_activeElement:fc.activeElement});
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)}}
160 for(var Ld=HTMLElement.prototype.blur,Md={blur:function(){var a=v(this);(a=(a=a&&a.root)&&a.activeElement)?a.blur():Ld.call(this)}},Nd={},Od=ja(Object.getOwnPropertyNames(Document.prototype)),Pd=Od.next();!Pd.done;Nd={s:Nd.s},Pd=Od.next())Nd.s=Pd.value,"on"===Nd.s.substring(0,2)&&Object.defineProperty(Md,Nd.s,{set:function(a){return function(b){var c=u(this),d=a.s.substring(2);c.P[a.s]&&this.removeEventListener(d,c.P[a.s]);this.addEventListener(d,b,{});c.P[a.s]=b}}(Nd),get:function(a){return function(){var b=
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)}}
161 v(this);return b&&b.P[a.s]}}(Nd),configurable:!0});var Qd={addEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ea=this;this.host.addEventListener(a,b,c)},removeEventListener:function(a,b,c){"object"!==typeof c&&(c={capture:!!c});c.ea=this;this.host.removeEventListener(a,b,c)},getElementById:function(a){return Oc(this,function(b){return b.id==a},function(a){return!!a})[0]||null}};
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);
162 function I(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(w.ia){var ShadyDOM={inUse:w.ia,patch:function(a){kc(a);jc(a);return a},isShadyRoot:y,enqueue:eb,flush:fb,settings:w,filterMutations:ob,observeChildren:ib,unobserveChildren:nb,nativeMethods:z,nativeTree:G,deferConnectionCallbacks:w.deferConnectionCallbacks,handlesDynamicScoping:!0};window.ShadyDOM=ShadyDOM;md();var Rd=window.customElements&&window.customElements.nativeHTMLElement||HTMLElement;I(ic.prototype,Qd);I(window.Node.prototype,Fd);I(window.Window.prototype,Ed);I(window.Text.prototype,Gd);
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])}
163 I(window.DocumentFragment.prototype,Hd);I(window.Element.prototype,Jd);I(window.Document.prototype,Kd);window.HTMLSlotElement&&I(window.HTMLSlotElement.prototype,Id);I(Rd.prototype,Md);w.w&&(gc(window.Node.prototype),gc(window.Text.prototype),gc(window.DocumentFragment.prototype),gc(window.Element.prototype),gc(Rd.prototype),gc(window.Document.prototype),window.HTMLSlotElement&&gc(window.HTMLSlotElement.prototype));hc();window.ShadowRoot=ic};var Sd=new Set("annotation-xml color-profile font-face font-face-src font-face-uri font-face-format font-face-name missing-glyph".split(" "));function Td(a){var b=Sd.has(a);a=/^[a-z][.0-9_a-z]*-[\-.0-9_a-z]*$/.test(a);return!b&&a}function J(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))}
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],
164 function Ud(a,b){for(;b&&b!==a&&!b.nextSibling;)b=b.parentNode;return b&&b!==a?b.nextSibling:null}
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)};
165 function Vd(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)Vd(d,b,c);d=Ud(a,e);continue}else if("template"===f){d=Ud(a,e);continue}if(e=e.__CE_shadowRoot)for(e=e.firstChild;e;e=e.nextSibling)Vd(e,b,c)}d=d.firstChild?d.firstChild:Ud(a,d)}}function K(a,b,c){a[b]=c};function Wd(){this.a=new Map;this.h=new Map;this.f=[];this.c=!1}function Xd(a,b,c){a.a.set(b,c);a.h.set(c.constructor,c)}function Yd(a,b){a.c=!0;a.f.push(b)}function Zd(a,b){a.c&&Vd(b,function(b){return a.b(b)})}Wd.prototype.b=function(a){if(this.c&&!a.__CE_patched){a.__CE_patched=!0;for(var b=0;b<this.f.length;b++)this.f[b](a)}};function L(a,b){var c=[];Vd(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):$d(a,d)}}
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;
166 function M(a,b){var c=[];Vd(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)}}
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.");
167 function O(a,b,c){c=void 0===c?{}:c;var d=c.cb||new Set,e=c.$||function(b){return $d(a,b)},f=[];Vd(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);O(a,c,{cb:f,$:e})}})}else f.push(b)},d);if(a.c)for(b=
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);
168 0;b<f.length;b++)a.b(f[b]);for(b=0;b<f.length;b++)e(f[b])}
170 this.T||(this.T=!0,this.ja(function(){return Be(c)}))};p.ca=function(a){Q(this.l,a)};
169 function $d(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],
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};
170 f=b.getAttribute(e);null!==f&&a.attributeChangedCallback(b,e,null,f,null)}J(b)&&a.connectedCallback(b)}}}Wd.prototype.connectedCallback=function(a){var b=a.__CE_definition;b.connectedCallback&&b.connectedCallback.call(a)};Wd.prototype.disconnectedCallback=function(a){var b=a.__CE_definition;b.disconnectedCallback&&b.disconnectedCallback.call(a)};
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;
171 Wd.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 ae(a){var b=document;this.b=a;this.a=b;this.G=void 0;O(this.b,this.a);"loading"===this.a.readyState&&(this.G=new MutationObserver(this.c.bind(this)),this.G.observe(this.a,{childList:!0,subtree:!0}))}function be(a){a.G&&a.G.disconnect()}ae.prototype.c=function(a){var b=this.a.readyState;"interactive"!==b&&"complete"!==b||be(this);for(b=0;b<a.length;b++)for(var c=a[b].addedNodes,d=0;d<c.length;d++)O(this.b,c[d])};function ce(){var a=this;this.a=this.j=void 0;this.b=new Promise(function(b){a.a=b;a.j&&b(a.j)})}ce.prototype.resolve=function(a){if(this.j)throw Error("Already resolved.");this.j=a;this.a&&this.a(a)};function P(a){this.c=!1;this.a=a;this.o=new Map;this.f=function(a){return a()};this.b=!1;this.h=[];this.ha=new ae(a)}n=P.prototype;
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,
172 n.xa=function(a,b){var c=this;if(!(b instanceof Function))throw new TypeError("Custom element constructors must be functions.");if(!Td(a))throw new SyntaxError("The element name '"+a+"' is not valid.");if(this.a.a.get(a))throw Error("A custom element with name '"+a+"' has already been defined.");if(this.c)throw Error("A custom element is already being defined.");this.c=!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.");
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,
173 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.c=!1}b={localName:a,constructor:b,connectedCallback:f,disconnectedCallback:h,adoptedCallback:g,attributeChangedCallback:k,observedAttributes:l,constructionStack:[]};Xd(this.a,a,b);this.h.push(b);
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.");
174 this.b||(this.b=!0,this.f(function(){return de(c)}))};n.$=function(a){O(this.a,a)};function de(a){if(!1!==a.b){a.b=!1;for(var b=a.h,c=[],d=new Map,e=0;e<b.length;e++)d.set(b[e].localName,[]);O(a.a,document,{$:function(b){if(void 0===b.__CE_state){var e=b.localName,f=d.get(e);f?f.push(b):a.a.a.get(e)&&c.push(b)}}});for(e=0;e<c.length;e++)$d(a.a,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++)$d(a.a,f[h]);(e=a.o.get(e))&&e.resolve(void 0)}}}
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});
175 n.get=function(a){if(a=this.a.a.get(a))return a.constructor};n.ya=function(a){if(!Td(a))return Promise.reject(new SyntaxError("'"+a+"' is not a valid custom element name."));var b=this.o.get(a);if(b)return b.b;b=new ce;this.o.set(a,b);this.a.a.get(a)&&!this.h.some(function(b){return b.localName===a})&&b.resolve(void 0);return b.b};n.Wa=function(a){be(this.ha);var b=this.f;this.f=function(c){return a(function(){return b(c)})}};window.CustomElementRegistry=P;P.prototype.define=P.prototype.xa;
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);
176 P.prototype.upgrade=P.prototype.$;P.prototype.get=P.prototype.get;P.prototype.whenDefined=P.prototype.ya;P.prototype.polyfillWrapFlushCallback=P.prototype.Wa;var ee=window.Document.prototype.createElement,fe=window.Document.prototype.createElementNS,ge=window.Document.prototype.importNode,he=window.Document.prototype.prepend,ie=window.Document.prototype.append,je=window.DocumentFragment.prototype.prepend,ke=window.DocumentFragment.prototype.append,le=window.Node.prototype.cloneNode,me=window.Node.prototype.appendChild,ne=window.Node.prototype.insertBefore,oe=window.Node.prototype.removeChild,pe=window.Node.prototype.replaceChild,qe=Object.getOwnPropertyDescriptor(window.Node.prototype,
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):
177 "textContent"),re=window.Element.prototype.attachShadow,se=Object.getOwnPropertyDescriptor(window.Element.prototype,"innerHTML"),te=window.Element.prototype.getAttribute,ue=window.Element.prototype.setAttribute,ve=window.Element.prototype.removeAttribute,we=window.Element.prototype.getAttributeNS,xe=window.Element.prototype.setAttributeNS,ye=window.Element.prototype.removeAttributeNS,ze=window.Element.prototype.insertAdjacentElement,Ae=window.Element.prototype.insertAdjacentHTML,Be=window.Element.prototype.prepend,
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=
178 Ce=window.Element.prototype.append,De=window.Element.prototype.before,Ee=window.Element.prototype.after,Fe=window.Element.prototype.replaceWith,Ge=window.Element.prototype.remove,He=window.HTMLElement,Ie=Object.getOwnPropertyDescriptor(window.HTMLElement.prototype,"innerHTML"),Je=window.HTMLElement.prototype.insertAdjacentElement,Ke=window.HTMLElement.prototype.insertAdjacentHTML;var Le=new function(){};function Me(){var a=Ne;window.HTMLElement=function(){function b(){var b=this.constructor,d=a.h.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=ee.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===Le)throw Error("The HTMLElement constructor was either called reentrantly for this constructor or called multiple times.");
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!==
179 e[d]=Le;Object.setPrototypeOf(f,b.prototype);a.b(f);return f}b.prototype=He.prototype;Object.defineProperty(b.prototype,"constructor",{writable:!0,configurable:!0,enumerable:!1,value:b});return b}()};function Oe(a,b,c){function d(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e]=arguments[e];e=[];for(var f=[],l=0;l<d.length;l++){var m=d[l];m instanceof Element&&J(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++)M(a,f[d]);if(J(this))for(d=0;d<e.length;d++)f=e[d],f instanceof Element&&L(a,f)}}void 0!==c.Y&&(b.prepend=d(c.Y));void 0!==c.append&&(b.append=d(c.append))};function Pe(){var a=Ne;K(Document.prototype,"createElement",function(b){if(this.__CE_hasRegistry){var c=a.a.get(b);if(c)return new c.constructor}b=ee.call(this,b);a.b(b);return b});K(Document.prototype,"importNode",function(b,c){b=ge.call(this,b,c);this.__CE_hasRegistry?O(a,b):Zd(a,b);return b});K(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=fe.call(this,b,c);a.b(b);return b});
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,
180 Oe(a,Document.prototype,{Y:he,append:ie})};function Qe(){function a(a,d){Object.defineProperty(a,"textContent",{enumerable:d.enumerable,configurable:!0,get:d.get,set:function(a){if(this.nodeType===Node.TEXT_NODE)d.set.call(this,a);else{var c=void 0;if(this.firstChild){var e=this.childNodes,g=e.length;if(0<g&&J(this)){c=Array(g);for(var k=0;k<g;k++)c[k]=e[k]}}d.set.call(this,a);if(c)for(a=0;a<c.length;a++)M(b,c[a])}}})}var b=Ne;K(Node.prototype,"insertBefore",function(a,d){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);
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,
181 a=ne.call(this,a,d);if(J(this))for(d=0;d<c.length;d++)L(b,c[d]);return a}c=J(a);d=ne.call(this,a,d);c&&M(b,a);J(this)&&L(b,a);return d});K(Node.prototype,"appendChild",function(a){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);a=me.call(this,a);if(J(this))for(var e=0;e<c.length;e++)L(b,c[e]);return a}c=J(a);e=me.call(this,a);c&&M(b,a);J(this)&&L(b,a);return e});K(Node.prototype,"cloneNode",function(a){a=le.call(this,a);this.ownerDocument.__CE_hasRegistry?O(b,a):
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:
182 Zd(b,a);return a});K(Node.prototype,"removeChild",function(a){var c=J(a),e=oe.call(this,a);c&&M(b,a);return e});K(Node.prototype,"replaceChild",function(a,d){if(a instanceof DocumentFragment){var c=Array.prototype.slice.apply(a.childNodes);a=pe.call(this,a,d);if(J(this))for(M(b,d),d=0;d<c.length;d++)L(b,c[d]);return a}c=J(a);var f=pe.call(this,a,d),h=J(this);h&&M(b,d);c&&M(b,a);h&&L(b,a);return f});qe&&qe.get?a(Node.prototype,qe):Yd(b,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){for(var a=
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,
183 [],b=0;b<this.childNodes.length;b++)a.push(this.childNodes[b].textContent);return a.join("")},set:function(a){for(;this.firstChild;)oe.call(this,this.firstChild);me.call(this,document.createTextNode(a))}})})};function Re(a){function b(b){return function(c){for(var d=[],e=0;e<arguments.length;++e)d[e]=arguments[e];e=[];for(var g=[],k=0;k<d.length;k++){var l=d[k];l instanceof Element&&J(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++)M(a,g[d]);if(J(this))for(d=0;d<e.length;d++)g=e[d],g instanceof Element&&L(a,g)}}var c=Element.prototype;void 0!==De&&(c.before=b(De));void 0!==De&&(c.after=b(Ee));void 0!==Fe&&
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,
184 K(c,"replaceWith",function(b){for(var c=[],d=0;d<arguments.length;++d)c[d]=arguments[d];d=[];for(var h=[],g=0;g<c.length;g++){var k=c[g];k instanceof Element&&J(k)&&h.push(k);if(k instanceof DocumentFragment)for(k=k.firstChild;k;k=k.nextSibling)d.push(k);else d.push(k)}g=J(this);Fe.apply(this,c);for(c=0;c<h.length;c++)M(a,h[c]);if(g)for(M(a,this),c=0;c<d.length;c++)h=d[c],h instanceof Element&&L(a,h)});void 0!==Ge&&K(c,"remove",function(){var b=J(this);Ge.call(this);b&&M(a,this)})};function Se(){function a(a,b){Object.defineProperty(a,"innerHTML",{enumerable:b.enumerable,configurable:!0,get:b.get,set:function(a){var c=this,e=void 0;J(this)&&(e=[],Vd(this,function(a){a!==c&&e.push(a)}));b.set.call(this,a);if(e)for(var f=0;f<e.length;f++){var h=e[f];1===h.__CE_state&&d.disconnectedCallback(h)}this.ownerDocument.__CE_hasRegistry?O(d,this):Zd(d,this);return a}})}function b(a,b){K(a,"insertAdjacentElement",function(a,c){var e=J(c);a=b.call(this,a,c);e&&M(d,c);J(a)&&L(d,c);return a})}
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=""}
185 function c(a,b){function c(a,b){for(var c=[];a!==b;a=a.nextSibling)c.push(a);for(b=0;b<c.length;b++)O(d,c[b])}K(a,"insertAdjacentHTML",function(a,d){a=a.toLowerCase();if("beforebegin"===a){var e=this.previousSibling;b.call(this,a,d);c(e||this.parentNode.firstChild,this)}else if("afterbegin"===a)e=this.firstChild,b.call(this,a,d),c(this.firstChild,e);else if("beforeend"===a)e=this.lastChild,b.call(this,a,d),c(e||this.firstChild,null);else if("afterend"===a)e=this.nextSibling,b.call(this,a,d),c(this.nextSibling,
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)}
186 e);else throw new SyntaxError("The value provided ("+String(a)+") is not one of 'beforebegin', 'afterbegin', 'beforeend', or 'afterend'.");})}var d=Ne;re&&K(Element.prototype,"attachShadow",function(a){return this.__CE_shadowRoot=a=re.call(this,a)});se&&se.get?a(Element.prototype,se):Ie&&Ie.get?a(HTMLElement.prototype,Ie):Yd(d,function(b){a(b,{enumerable:!0,configurable:!0,get:function(){return le.call(this,!0).innerHTML},set:function(a){var b="template"===this.localName,c=b?this.content:this,d=fe.call(document,
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,
187 this.namespaceURI,this.localName);for(d.innerHTML=a;0<c.childNodes.length;)oe.call(c,c.childNodes[0]);for(a=b?d.content:d;0<a.childNodes.length;)me.call(c,a.childNodes[0])}})});K(Element.prototype,"setAttribute",function(a,b){if(1!==this.__CE_state)return ue.call(this,a,b);var c=te.call(this,a);ue.call(this,a,b);b=te.call(this,a);d.attributeChangedCallback(this,a,c,b,null)});K(Element.prototype,"setAttributeNS",function(a,b,c){if(1!==this.__CE_state)return xe.call(this,a,b,c);var e=we.call(this,a,
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})}
188 b);xe.call(this,a,b,c);c=we.call(this,a,b);d.attributeChangedCallback(this,b,e,c,a)});K(Element.prototype,"removeAttribute",function(a){if(1!==this.__CE_state)return ve.call(this,a);var b=te.call(this,a);ve.call(this,a);null!==b&&d.attributeChangedCallback(this,a,b,null,null)});K(Element.prototype,"removeAttributeNS",function(a,b){if(1!==this.__CE_state)return ye.call(this,a,b);var c=we.call(this,a,b);ye.call(this,a,b);var e=we.call(this,a,b);c!==e&&d.attributeChangedCallback(this,b,c,e,a)});Je?b(HTMLElement.prototype,
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}
189 Je):ze?b(Element.prototype,ze):console.warn("Custom Elements: `Element#insertAdjacentElement` was not patched.");Ke?c(HTMLElement.prototype,Ke):Ae?c(Element.prototype,Ae):console.warn("Custom Elements: `Element#insertAdjacentHTML` was not patched.");Oe(d,Element.prototype,{Y:Be,append:Ce});Re(d)};var Te=window.customElements;if(!Te||Te.forcePolyfill||"function"!=typeof Te.define||"function"!=typeof Te.get){var Ne=new Wd;Me();Pe();Oe(Ne,DocumentFragment.prototype,{Y:je,append:ke});Qe();Se();document.__CE_hasRegistry=!0;var customElements=new P(Ne);Object.defineProperty(window,"customElements",{configurable:!0,enumerable:!0,value:customElements})};function Ue(){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=""}
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)}}}
190 function Ve(a){a=a.replace(We,"").replace(Xe,"");var b=Ye,c=a,d=new Ue;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 Ue;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)}
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}
191 function Ye(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=Ze(c),c=c.replace($e," "),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=af:c.match(gf)&&(a.type=hf,a.keyframesName=a.selector.split($e).pop()):a.type=0===c.indexOf("--")?jf:kf);if(c=a.rules)for(var d=0,e=c.length,f=void 0;d<e&&(f=c[d]);d++)Ye(f,
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)}
192 b);return a}function Ze(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})}
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)}
193 function lf(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=void 0;f<h&&(g=e[f]);f++)d=lf(g,b,d)}else b?b=a.cssText:(b=a.cssText,b=b.replace(mf,"").replace(nf,""),b=b.replace(of,"").replace(pf,"")),(d=b.trim())&&(d=" "+d+"\n")}d&&(a.selector&&(c+=a.selector+" {\n"),c+=d,a.selector&&(c+="}\n\n"));return 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)})}
194 var kf=1,hf=7,af=4,jf=1E3,We=/\/\*[^*]*\*+([^/*][^*]*\*+)*\//gim,Xe=/@import[^;]*;/gim,mf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?(?:[;\n]|$)/gim,nf=/(?:^[^;\-\s}]+)?--[^;{}]*?:[^{};]*?{[^}]*?}(?:[;\n]|$)?/gim,of=/@apply\s*\(?[^);]*\)?\s*(?:[;\n]|$)?/gim,pf=/[^;:]*?:[^;]*?var\([^;]*\)(?:[;\n]|$)?/gim,gf=/^@[^\s]*keyframes/,$e=/\s+/g;var R=!(window.ShadyDOM&&window.ShadyDOM.inUse),qf;function rf(a){qf=a&&a.shimcssproperties?!1:R||!(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?qf=window.ShadyCSS.nativeCss:window.ShadyCSS?(rf(window.ShadyCSS),window.ShadyCSS=void 0):rf(window.WebComponents&&window.WebComponents.flags);var S=qf;var sf=/(?:^|[;\s{]\s*)(--[\w-]*?)\s*:\s*(?:((?:'(?:\\'|.)*?'|"(?:\\"|.)*?"|\([^)]*?\)|[^};{])+)|\{([^}]*)\}(?:(?=[;\s}])|$))/gi,tf=/(?:^|\W+)@apply\s*\(?([^);\n]*)\)?/gi,uf=/(--[\w-]+)\s*([:,;)]|$)/gi,vf=/(animation\s*:)|(animation-name\s*:)/,wf=/@media\s(.*)/,xf=/\{[^}]*\}/g;var yf=new Set;function zf(a,b){if(!a)return"";"string"===typeof a&&(a=Ve(a));b&&Af(a,b);return lf(a,S)}function Bf(a){!a.__cssRules&&a.textContent&&(a.__cssRules=Ve(a.textContent));return a.__cssRules||null}function Cf(a){return!!a.parent&&a.parent.type===hf}function Af(a,b,c,d){if(a){var e=!1,f=a.type;if(d&&f===af){var h=a.selector.match(wf);h&&(window.matchMedia(h[1]).matches||(e=!0))}f===kf?b(a):c&&f===hf?c(a):f===jf&&(e=!0);if((a=a.rules)&&!e)for(e=0,f=a.length,h=void 0;e<f&&(h=a[e]);e++)Af(h,b,c,d)}}
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)}
195 function Df(a,b,c,d){var e=document.createElement("style");b&&e.setAttribute("scope",b);e.textContent=a;Ef(e,c,d);return e}var Ff=null;function Gf(a){a=document.createComment(" Shady DOM styles for "+a+" ");var b=document.head;b.insertBefore(a,(Ff?Ff.nextSibling:null)||b.firstChild);return Ff=a}function Ef(a,b,c){b=b||document.head;b.insertBefore(a,c&&c.nextSibling||b.firstChild);Ff?a.compareDocumentPosition(Ff)===Node.DOCUMENT_POSITION_PRECEDING&&(Ff=a):Ff=a}
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};
196 function Hf(a,b){for(var c=0,d=a.length;b<d;b++)if("("===a[b])c++;else if(")"===a[b]&&0===--c)return b;return-1}function If(a,b){var c=a.indexOf("var(");if(-1===c)return b(a,"","","");var d=Hf(a,c+3),e=a.substring(c+4,d);c=a.substring(0,c);a=If(a.substring(d+1),b);d=e.indexOf(",");return-1===d?b(c,e.trim(),"",a):b(c,e.substring(0,d).trim(),e.substring(d+1).trim(),a)}function Jf(a,b){R?a.setAttribute("class",b):window.ShadyDOM.nativeMethods.setAttribute.call(a,"class",b)}
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)}
197 function Kf(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,N:c}}function Lf(a){for(var b=[],c="",d=0;0<=d&&d<a.length;d++)if("("===a[d]){var e=Hf(a,d);c+=a.slice(d,e+1);d=e}else","===a[d]?(b.push(c),c=""):c+=a[d];c&&b.push(c);return b}
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"}}});
198 function Mf(a){if(void 0===a.aa){var b=a.getAttribute("css-build");if(b)a.aa=b;else{a:{b="template"===a.localName?a.content.firstChild:a.firstChild;if(b instanceof Comment&&(b=b.textContent.trim().split(":"),"css-build"===b[0])){b=b[1];break a}b=""}if(""!==b){var c="template"===a.localName?a.content.firstChild:a.firstChild;c.parentNode.removeChild(c)}a.aa=b}}return a.aa||""};function Nf(){}function Of(a,b){Pf(U,a,function(a){Qf(a,b||"")})}function Pf(a,b,c){b.nodeType===Node.ELEMENT_NODE&&c(b);if(b="template"===b.localName?(b.content||b.ib||b).childNodes:b.children||b.childNodes)for(var d=0;d<b.length;d++)Pf(a,b[d],c)}
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}
199 function Qf(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(Rf);c?d&&(b=d.replace("style-scope","").replace(b,""),Jf(a,b)):Jf(a,(d?d+" ":"")+"style-scope "+b)}}function Sf(a,b,c){Pf(U,a,function(a){Qf(a,b,!0);Qf(a,c)})}function Tf(a,b){Pf(U,a,function(a){Qf(a,b||"",!0)})}
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}}
200 function Uf(a,b,c,d){var e=U;R||"shady"===(void 0===d?"":d)?b=zf(b,c):(a=Kf(a),b=Vf(e,b,a.is,a.N,c)+"\n\n");return b.trim()}function Vf(a,b,c,d,e){var f=Wf(c,d);c=c?Xf+c:"";return zf(b,function(b){b.c||(b.selector=b.m=Yf(a,b,a.b,c,f),b.c=!0);e&&e(b,c,f)})}function Wf(a,b){return b?"[is="+a+"]":a}function Yf(a,b,c,d,e){var f=Lf(b.selector);if(!Cf(b)){b=0;for(var h=f.length,g=void 0;b<h&&(g=f[b]);b++)f[b]=c.call(a,g,d,e)}return f.filter(function(a){return!!a}).join(Zf)}
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()||""}
201 function $f(a){return a.replace(ag,function(a,c,d){-1<d.indexOf("+")?d=d.replace(/\+/g,"___"):-1<d.indexOf("___")&&(d=d.replace(/___/g,"+"));return":"+c+"("+d+")"})}function bg(a){for(var b=[],c;c=a.match(cg);){var d=c.index,e=Hf(a,d);if(-1===e)throw Error(c.input+" selector missing ')'");c=a.slice(d,e+1);a=a.replace(c,"\ue000");b.push(c)}return{ka:a,matches:b}}function dg(a,b){var c=a.split("\ue000");return b.reduce(function(a,b,f){return a+b+c[f+1]},c[0])}
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(";")}
202 Nf.prototype.b=function(a,b,c){var d=!1;a=a.trim();var e=ag.test(a);e&&(a=a.replace(ag,function(a,b,c){return":"+b+"("+c.replace(/\s/g,"")+")"}),a=$f(a));var f=cg.test(a);if(f){var h=bg(a);a=h.ka;h=h.matches}a=a.replace(eg,fg+" $1");a=a.replace(gg,function(a,e,f){d||(a=hg(f,e,b,c),d=d||a.stop,e=a.Ja,f=a.value);return e+f});f&&(a=dg(a,h));e&&(a=$f(a));return a};
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}}
203 function hg(a,b,c,d){var e=a.indexOf(ig);0<=a.indexOf(fg)?a=jg(a,d):0!==e&&(a=c?kg(a,c):a);c=!1;0<=e&&(b="",c=!0);if(c){var f=!0;c&&(a=a.replace(lg,function(a,b){return" > "+b}))}a=a.replace(mg,function(a,b,c){return'[dir="'+c+'"] '+b+", "+b+'[dir="'+c+'"]'});return{value:a,Ja:b,stop:f}}function kg(a,b){a=a.split(ng);a[0]+=b;return a.join(ng)}
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})}}
204 function jg(a,b){var c=a.match(og);return(c=c&&c[2].trim()||"")?c[0].match(pg)?a.replace(og,function(a,c,f){return b+f}):c.split(pg)[0]===b?c:qg:a.replace(fg,b)}function rg(a){a.selector===sg&&(a.selector="html")}Nf.prototype.c=function(a){return a.match(fg)?"":a.match(ig)?this.b(a,tg):kg(a.trim(),tg)};q.Object.defineProperties(Nf.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"style-scope"}}});
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}}
205 var ag=/:(nth[-\w]+)\(([^)]+)\)/,tg=":not(.style-scope)",Zf=",",gg=/(^|[\s>+~]+)((?:\[.+?\]|[^\s>+~=[])+)/g,pg=/[[.:#*]/,fg=":host",sg=":root",ig="::slotted",eg=new RegExp("^("+ig+")"),og=/(:host)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,lg=/(?:::slotted)(?:\(((?:\([^)(]*\)|[^)(]*)+?)\))/,mg=/(.*):dir\((?:(ltr|rtl))\)/,Xf=".",ng=":",Rf="class",qg="should_not_match",cg=/:(?:matches|any|-(?:webkit|moz)-any)/,U=new Nf;function ug(a,b,c,d,e){this.B=a||null;this.b=b||null;this.c=c||[];this.J=null;this.V=e||"";this.N=d||"";this.a=this.u=this.F=null}function V(a){return a?a.__styleInfo:null}function vg(a,b){return a.__styleInfo=b}ug.prototype.f=function(){return this.B};ug.prototype._getStyleRules=ug.prototype.f;function wg(a){var b=this.matches||this.matchesSelector||this.mozMatchesSelector||this.msMatchesSelector||this.oMatchesSelector||this.webkitMatchesSelector;return b&&b.call(this,a)}var xg=navigator.userAgent.match("Trident");function yg(){}function zg(a){var b={},c=[],d=0;Af(a,function(a){Ag(a);a.index=d++;a=a.l.cssText;for(var c;c=uf.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}
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="."+
206 function Ag(a){if(!a.l){var b={},c={};Bg(a,c)&&(b.A=c,a.rules=null);b.cssText=a.parsedCssText.replace(xf,"").replace(sf,"");a.l=b}}function Bg(a,b){var c=a.l;if(c){if(c.A)return Object.assign(b,c.A),!0}else{c=a.parsedCssText;for(var d;a=sf.exec(c);){d=(a[2]||a[3]).trim();if("inherit"!==d||"unset"!==d)b[a[1].trim()]=d;d=!0}return d}}
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)}}
207 function Cg(a,b,c){b&&(b=0<=b.indexOf(";")?Dg(a,b,c):If(b,function(b,e,f,h){if(!e)return b+h;(e=Cg(a,c[e],c))&&"initial"!==e?"apply-shim-inherit"===e&&(e="inherit"):e=Cg(a,c[f]||f,c)||f;return b+(e||"")+h}));return b&&b.trim()||""}
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(){}
208 function Dg(a,b,c){b=b.split(";");for(var d=0,e,f;d<b.length;d++)if(e=b[d]){tf.lastIndex=0;if(f=tf.exec(e))e=Cg(a,c[f[1]],c);else if(f=e.indexOf(":"),-1!==f){var h=e.substring(f);h=h.trim();h=Cg(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(";")}
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=
209 function Eg(a,b){var c={},d=[];Af(a,function(a){a.l||Ag(a);var e=a.m||a.parsedSelector;b&&a.l.A&&e&&wg.call(b,e)&&(Bg(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}}
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)}}}}
210 function Fg(a,b,c,d){b.l||Ag(b);if(b.l.A){var e=Kf(a);a=e.is;e=e.N;e=a?Wf(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));if(h||g)c=e,g&&(b.m||(b.m=Yf(U,b,U.b,a?Xf+a:"",e)),c=b.m||e),d({ka:c,Pa:g,sb:h})}}function Gg(a,b,c){var d={},e={};Af(b,function(b){Fg(a,b,c,function(c){wg.call(a.jb||a,c.ka)&&(c.Pa?Bg(b,d):Bg(b,e))})},null,!0);return{Xa:e,Oa:d}}
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())}}
211 function Hg(a,b,c,d){var e=Kf(b),f=Wf(e.is,e.N),h=new RegExp("(?:^|[^.#[:])"+(b.extends?"\\"+f.slice(0,-1)+"\\]":f)+"($|[.:[\\s>+~])"),g=V(b);e=g.B;g=g.V;var k=Ig(e,d);return Uf(b,e,function(b){var e="";b.l||Ag(b);b.l.cssText&&(e=Dg(a,b.l.cssText,c));b.cssText=e;if(!R&&!Cf(b)&&b.cssText){var g=e=b.cssText;null==b.ra&&(b.ra=vf.test(e));if(b.ra)if(null==b.X){b.X=[];for(var l in k)g=k[l],g=g(e),e!==g&&(e=g,b.X.push(l))}else{for(l=0;l<b.X.length;++l)g=k[b.X[l]],e=g(e);g=e}b.cssText=g;b.m=b.m||b.selector;
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)};
212 e="."+d;l=Lf(b.m);g=0;for(var N=l.length,Y=void 0;g<N&&(Y=l[g]);g++)l[g]=Y.match(h)?Y.replace(f,e):e+" "+Y;b.selector=l.join(",")}},g)}function Ig(a,b){a=a.b;var c={};if(!R&&a)for(var d=0,e=a[d];d<a.length;e=a[++d]){var f=e,h=b;f.f=new RegExp("\\b"+f.keyframesName+"(?!\\B|-)","g");f.a=f.keyframesName+"-"+h;f.m=f.m||f.selector;f.selector=f.m.replace(f.keyframesName,f.a);c[e.keyframesName]=Jg(e)}return c}function Jg(a){return function(b){return b.replace(a.f,a.a)}}
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,
213 function Kg(a,b){var c=Lg,d=Bf(a);a.textContent=zf(d,function(a){var d=a.cssText=a.parsedCssText;a.l&&a.l.cssText&&(d=d.replace(mf,"").replace(nf,""),a.cssText=Dg(c,d,b))})}q.Object.defineProperties(yg.prototype,{a:{configurable:!0,enumerable:!0,get:function(){return"x-scope"}}});var Lg=new yg;var Mg={},Ng=window.customElements;if(Ng&&!R){var Og=Ng.define;Ng.define=function(a,b,c){Mg[a]||(Mg[a]=Gf(a));Og.call(Ng,a,b,c)}};function Pg(){this.cache={}}Pg.prototype.store=function(a,b,c,d){var e=this.cache[a]||[];e.push({A:b,styleElement:c,u:d});100<e.length&&e.shift();this.cache[a]=e};Pg.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 Qg(){}function Rg(a){var b=[];a.classList?b=Array.from(a.classList):a instanceof window.SVGElement&&a.hasAttribute("class")&&(b=a.getAttribute("class").split(/\s+/));a=b;b=a.indexOf(U.a);return-1<b?a[b+1]:""}function Sg(a){var b=a.getRootNode();return b===a||b===a.ownerDocument?"":(a=b.host)?Kf(a).is:""}
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))};
214 function Tg(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(),h=Rg(e);if(h&&f===e.ownerDocument&&("style"!==e.localName&&"template"!==e.localName||""===Mf(e)))Tf(e,h);else if(f instanceof ShadowRoot)for(f=Sg(e),f!==h&&Sf(e,h,f),e=window.ShadyDOM.nativeMethods.querySelectorAll.call(e,":not(."+U.a+")"),h=0;h<e.length;h++){f=e[h];
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)}
215 var g=Sg(f);g&&Qf(f,g)}}}}}
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()}}};
216 if(!(R||window.ShadyDOM&&window.ShadyDOM.handlesDynamicScoping)){var Ug=new MutationObserver(Tg),Vg=function(a){Ug.observe(a,{childList:!0,subtree:!0})};if(window.customElements&&!window.customElements.polyfillWrapFlushCallback)Vg(document);else{var Wg=function(){Vg(document.body)};window.HTMLImports?window.HTMLImports.whenReady(Wg):requestAnimationFrame(function(){if("loading"===document.readyState){var a=function(){Wg();document.removeEventListener("readystatechange",a)};document.addEventListener("readystatechange",
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=
217 a)}else Wg()})}Qg=function(){Tg(Ug.takeRecords())}}var Xg=Qg;var Yg={};var Zg=Promise.resolve();function $g(a){if(a=Yg[a])a._applyShimCurrentVersion=a._applyShimCurrentVersion||0,a._applyShimValidatingVersion=a._applyShimValidatingVersion||0,a._applyShimNextVersion=(a._applyShimNextVersion||0)+1}function ah(a){return a._applyShimCurrentVersion===a._applyShimNextVersion}function bh(a){a._applyShimValidatingVersion=a._applyShimNextVersion;a.b||(a.b=!0,Zg.then(function(){a._applyShimCurrentVersion=a._applyShimNextVersion;a.b=!1}))};var ch=new Pg;function W(){this.o={};this.c=document.documentElement;var a=new Ue;a.rules=[];this.f=vg(this.c,new ug(a));this.h=!1;this.b=this.a=null}n=W.prototype;n.flush=function(){Xg()};n.Ma=function(a){return Bf(a)};n.ab=function(a){return zf(a)};n.prepareTemplate=function(a,b,c){this.prepareTemplateDom(a,b);this.prepareTemplateStyles(a,b,c)};
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||
218 n.prepareTemplateStyles=function(a,b,c){if(!a.h){R||Mg[b]||(Mg[b]=Gf(b));a.h=!0;a.name=b;a.extends=c;Yg[b]=a;var d=Mf(a);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(!R){var k=g.textContent;yf.has(k)||(yf.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};dh(this);if(f=""===Mf(a))f=tf.test(e)||
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}
219 sf.test(e),tf.lastIndex=0,sf.lastIndex=0;e=Ve(e);f&&S&&this.a&&this.a.transformRules(e,b);a._styleAst=e;e=[];S||(e=zg(a._styleAst));if(!e.length||S)f=R?a.content:null,b=Mg[b]||null,d=Uf(c,a._styleAst,null,d),d=d.length?Df(d,c.is,f,b):void 0,a.a=d;a.f=e}};n.prepareTemplateDom=function(a,b){var c=Mf(a);R||"shady"===c||a.c||(a.c=!0,Of(a.content,b))};
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)};
220 function eh(a){!a.b&&window.ShadyCSS&&window.ShadyCSS.CustomStyleInterface&&(a.b=window.ShadyCSS.CustomStyleInterface,a.b.transformCallback=function(b){a.va(b)},a.b.validateCallback=function(){requestAnimationFrame(function(){(a.b.enqueued||a.h)&&a.flushCustomStyles()})})}function dh(a){!a.a&&window.ShadyCSS&&window.ShadyCSS.ApplyShim&&(a.a=window.ShadyCSS.ApplyShim,a.a.invalidCallback=$g);eh(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)};
221 n.flushCustomStyles=function(){dh(this);if(this.b){var a=this.b.processStyles();if(this.b.enqueued){if(S)for(var b=0;b<a.length;b++){var c=this.b.getStyleForCustomStyle(a[b]);if(c&&S&&this.a){var d=Bf(c);dh(this);this.a.transformRules(d);c.textContent=zf(d)}}else for(fh(this,this.c,this.f),b=0;b<a.length;b++)(c=this.b.getStyleForCustomStyle(a[b]))&&Kg(c,this.f.F);this.b.enqueued=!1;this.h&&!S&&this.styleDocument()}}};
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;
222 n.styleElement=function(a,b){var c=V(a);if(!c){var d=Kf(a);c=d.is;d=d.N;var e=Mg[c]||null;c=Yg[c];if(c){var f=c._styleAst;var h=c.f;var g=Mf(c)}f=new ug(f,e,h,d,g);c&&vg(a,f);c=f}a!==this.c&&(this.h=!0);b&&(c.J=c.J||{},Object.assign(c.J,b));if(S){b=c;f=Kf(a).is;if(b.J){h=b.J;for(var k in h)null===k?a.style.removeProperty(k):a.style.setProperty(k,h[k])}if(!(!(k=Yg[f])&&a!==this.c||k&&""!==Mf(k))&&k&&k.a&&!ah(k)){if(ah(k)||k._applyShimValidatingVersion!==k._applyShimNextVersion)dh(this),this.a&&this.a.transformRules(k._styleAst,
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;
223 f),k.a.textContent=Uf(a,b.B),bh(k);R&&(f=a.shadowRoot)&&(f=f.querySelector("style"))&&(f.textContent=Uf(a,b.B));b.B=k._styleAst}}else if(k=c,this.flush(),fh(this,a,k),k.c&&k.c.length){b=Kf(a).is;c=(f=ch.fetch(b,k.F,k.c))?f.styleElement:null;h=k.u;(g=f&&f.u)||(g=this.o[b]=(this.o[b]||0)+1,g=b+"-"+g);k.u=g;g=k.u;d=Lg;d=c?c.textContent||"":Hg(d,a,k.F,g);e=V(a);var l=e.a;l&&!R&&l!==c&&(l._useCount--,0>=l._useCount&&l.parentNode&&l.parentNode.removeChild(l));R?e.a?(e.a.textContent=d,c=e.a):d&&(c=Df(d,
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);
224 g,a.shadowRoot,e.b)):c?c.parentNode||(xg&&-1<d.indexOf("@media")&&(c.textContent=d),Ef(c,null,e.b)):d&&(c=Df(d,g,null,e.b));c&&(c._useCount=c._useCount||0,e.a!=c&&c._useCount++,e.a=c);g=c;R||(c=k.u,e=d=a.getAttribute("class")||"",h&&(e=d.replace(new RegExp("\\s*x-scope\\s*"+h+"\\s*","g")," ")),e+=(e?" ":"")+"x-scope "+c,d!==e&&Jf(a,e));f||ch.store(b,k.F,g,k.u)}};function gh(a,b){return(b=b.getRootNode().host)?V(b)?b:gh(a,b):a.c}
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()},
225 function fh(a,b,c){a=gh(a,b);var d=V(a);a=Object.create(d.F||null);var e=Gg(b,c.B,c.V);b=Eg(d.B,b).A;Object.assign(a,e.Oa,b,e.Xa);b=c.J;for(var f in b)if((e=b[f])||0===e)a[f]=e;f=Lg;b=Object.getOwnPropertyNames(a);for(e=0;e<b.length;e++)d=b[e],a[d]=Cg(f,a[d],a);c.F=a}n.styleDocument=function(a){this.styleSubtree(this.c,a)};
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()})}}
226 n.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])};
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);
227 n.va=function(a){var b=this,c=Bf(a),d=Mf(a);d!==this.f.V&&(this.f.V=d);Af(c,function(a){if(R)rg(a);else{var c=U;a.selector=a.parsedSelector;rg(a);a.selector=a.m=Yf(c,a,c.c,void 0,void 0)}S&&""===d&&(dh(b),b.a&&b.a.transformRule(a))});S?a.textContent=zf(c):this.f.B.rules.push(c)};n.getComputedStyleValue=function(a,b){var c;S||(c=(V(a)||V(gh(this,a))).F[b]);return(c=c||window.getComputedStyle(a).getPropertyValue(b))?c.trim():""};
228 n.$a=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]===U.a){c=d[e+1];break}}}c&&b.push(U.a,c);S||(c=V(a))&&c.u&&b.push(Lg.a,c.u);Jf(a,b.join(" "))};n.Ia=function(a){return V(a)};n.Za=function(a,b){Qf(a,b)};n.bb=function(a,b){Qf(a,b,!0)};n.Ya=function(a){return Sg(a)};n.Ka=function(a){return Rg(a)};W.prototype.flush=W.prototype.flush;W.prototype.prepareTemplate=W.prototype.prepareTemplate;
229 W.prototype.styleElement=W.prototype.styleElement;W.prototype.styleDocument=W.prototype.styleDocument;W.prototype.styleSubtree=W.prototype.styleSubtree;W.prototype.getComputedStyleValue=W.prototype.getComputedStyleValue;W.prototype.setElementClass=W.prototype.$a;W.prototype._styleInfoForNode=W.prototype.Ia;W.prototype.transformCustomStyleForDocument=W.prototype.va;W.prototype.getStyleAst=W.prototype.Ma;W.prototype.styleAstToString=W.prototype.ab;W.prototype.flushCustomStyles=W.prototype.flushCustomStyles;
230 W.prototype.scopeNode=W.prototype.Za;W.prototype.unscopeNode=W.prototype.bb;W.prototype.scopeForNode=W.prototype.Ya;W.prototype.currentScopeForNode=W.prototype.Ka;Object.defineProperties(W.prototype,{nativeShadow:{get:function(){return R}},nativeCss:{get:function(){return S}}});var X=new W,hh,ih;window.ShadyCSS&&(hh=window.ShadyCSS.ApplyShim,ih=window.ShadyCSS.CustomStyleInterface);
231 window.ShadyCSS={ScopingShim:X,prepareTemplate:function(a,b,c){X.flushCustomStyles();X.prepareTemplate(a,b,c)},prepareTemplateDom:function(a,b){X.prepareTemplateDom(a,b)},prepareTemplateStyles:function(a,b,c){X.flushCustomStyles();X.prepareTemplateStyles(a,b,c)},styleSubtree:function(a,b){X.flushCustomStyles();X.styleSubtree(a,b)},styleElement:function(a){X.flushCustomStyles();X.styleElement(a)},styleDocument:function(a){X.flushCustomStyles();X.styleDocument(a)},flushCustomStyles:function(){X.flushCustomStyles()},
232 getComputedStyleValue:function(a,b){return X.getComputedStyleValue(a,b)},nativeCss:S,nativeShadow:R};hh&&(window.ShadyCSS.ApplyShim=hh);ih&&(window.ShadyCSS.CustomStyleInterface=ih);var jh=window.customElements,kh=window.HTMLImports,lh=window.HTMLTemplateElement;window.WebComponents=window.WebComponents||{};if(jh&&jh.polyfillWrapFlushCallback){var mh,nh=function(){if(mh){lh.C&&lh.C(window.document);var a=mh;mh=null;a();return!0}},oh=kh.whenReady;jh.polyfillWrapFlushCallback(function(a){mh=a;oh(nh)});kh.whenReady=function(a){oh(function(){nh()?kh.whenReady(a):a()})}}
233 kh.whenReady(function(){requestAnimationFrame(function(){window.WebComponents.ready=!0;document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0}))})});var ph=document.createElement("style");ph.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; position: relative; } \n";var qh=document.querySelector("head");qh.insertBefore(ph,qh.firstChild);}).call(this);
229
234
230 //# sourceMappingURL=webcomponents-lite.js.map
235 //# sourceMappingURL=webcomponents-lite.js.map
@@ -1,884 +1,967 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(filename, line, type)"><%
4 return '%s_%s_%i' % (h.safeid(filename), type, line)
4 return '%s_%s_%i' % (h.safeid(filename), type, line)
5 %></%def>
5 %></%def>
6
6
7 <%def name="action_class(action)">
7 <%def name="action_class(action)">
8 <%
8 <%
9 return {
9 return {
10 '-': 'cb-deletion',
10 '-': 'cb-deletion',
11 '+': 'cb-addition',
11 '+': 'cb-addition',
12 ' ': 'cb-context',
12 ' ': 'cb-context',
13 }.get(action, 'cb-empty')
13 }.get(action, 'cb-empty')
14 %>
14 %>
15 </%def>
15 </%def>
16
16
17 <%def name="op_class(op_id)">
17 <%def name="op_class(op_id)">
18 <%
18 <%
19 return {
19 return {
20 DEL_FILENODE: 'deletion', # file deleted
20 DEL_FILENODE: 'deletion', # file deleted
21 BIN_FILENODE: 'warning' # binary diff hidden
21 BIN_FILENODE: 'warning' # binary diff hidden
22 }.get(op_id, 'addition')
22 }.get(op_id, 'addition')
23 %>
23 %>
24 </%def>
24 </%def>
25
25
26
26
27
27
28 <%def name="render_diffset(diffset, commit=None,
28 <%def name="render_diffset(diffset, commit=None,
29
29
30 # collapse all file diff entries when there are more than this amount of files in the diff
30 # collapse all file diff entries when there are more than this amount of files in the diff
31 collapse_when_files_over=20,
31 collapse_when_files_over=20,
32
32
33 # collapse lines in the diff when more than this amount of lines changed in the file diff
33 # collapse lines in the diff when more than this amount of lines changed in the file diff
34 lines_changed_limit=500,
34 lines_changed_limit=500,
35
35
36 # add a ruler at to the output
36 # add a ruler at to the output
37 ruler_at_chars=0,
37 ruler_at_chars=0,
38
38
39 # show inline comments
39 # show inline comments
40 use_comments=False,
40 use_comments=False,
41
41
42 # disable new comments
42 # disable new comments
43 disable_new_comments=False,
43 disable_new_comments=False,
44
44
45 # special file-comments that were deleted in previous versions
45 # special file-comments that were deleted in previous versions
46 # it's used for showing outdated comments for deleted files in a PR
46 # it's used for showing outdated comments for deleted files in a PR
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:
54 <div id="cb-comments-inline-container-template" class="js-template">
54 <div id="cb-comments-inline-container-template" class="js-template">
55 ${inline_comments_container([], inline_comments)}
55 ${inline_comments_container([], inline_comments)}
56 </div>
56 </div>
57 <div class="js-template" id="cb-comment-inline-form-template">
57 <div class="js-template" id="cb-comment-inline-form-template">
58 <div class="comment-inline-form ac">
58 <div class="comment-inline-form ac">
59
59
60 %if c.rhodecode_user.username != h.DEFAULT_USER:
60 %if c.rhodecode_user.username != h.DEFAULT_USER:
61 ## render template for inline comments
61 ## render template for inline comments
62 ${commentblock.comment_form(form_type='inline')}
62 ${commentblock.comment_form(form_type='inline')}
63 %else:
63 %else:
64 ${h.form('', class_='inline-form comment-form-login', method='get')}
64 ${h.form('', class_='inline-form comment-form-login', method='get')}
65 <div class="pull-left">
65 <div class="pull-left">
66 <div class="comment-help pull-right">
66 <div class="comment-help pull-right">
67 ${_('You need to be logged in to leave comments.')} <a href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">${_('Login now')}</a>
67 ${_('You need to be logged in to leave comments.')} <a href="${h.route_path('login', _query={'came_from': h.current_route_path(request)})}">${_('Login now')}</a>
68 </div>
68 </div>
69 </div>
69 </div>
70 <div class="comment-button pull-right">
70 <div class="comment-button pull-right">
71 <button type="button" class="cb-comment-cancel" onclick="return Rhodecode.comments.cancelComment(this);">
71 <button type="button" class="cb-comment-cancel" onclick="return Rhodecode.comments.cancelComment(this);">
72 ${_('Cancel')}
72 ${_('Cancel')}
73 </button>
73 </button>
74 </div>
74 </div>
75 <div class="clearfix"></div>
75 <div class="clearfix"></div>
76 ${h.end_form()}
76 ${h.end_form()}
77 %endif
77 %endif
78 </div>
78 </div>
79 </div>
79 </div>
80
80
81 %endif
81 %endif
82 <%
82 <%
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.user_session_attrs["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;
90 }
90 }
91 </style>
91 </style>
92 %endif
92 %endif
93
93
94 %if ruler_at_chars:
94 %if ruler_at_chars:
95 <style>
95 <style>
96 .diff table.cb .cb-content:after {
96 .diff table.cb .cb-content:after {
97 content: "";
97 content: "";
98 border-left: 1px solid blue;
98 border-left: 1px solid blue;
99 position: absolute;
99 position: absolute;
100 top: 0;
100 top: 0;
101 height: 18px;
101 height: 18px;
102 opacity: .2;
102 opacity: .2;
103 z-index: 10;
103 z-index: 10;
104 //## +5 to account for diff action (+/-)
104 //## +5 to account for diff action (+/-)
105 left: ${ruler_at_chars + 5}ch;
105 left: ${ruler_at_chars + 5}ch;
106 </style>
106 </style>
107 %endif
107 %endif
108
108
109 <div class="diffset ${disable_new_comments and 'diffset-comments-disabled'}">
109 <div class="diffset ${disable_new_comments and 'diffset-comments-disabled'}">
110 <div class="diffset-heading ${diffset.limited_diff and 'diffset-heading-warning' or ''}">
110 <div class="diffset-heading ${diffset.limited_diff and 'diffset-heading-warning' or ''}">
111 %if commit:
111 %if commit:
112 <div class="pull-right">
112 <div class="pull-right">
113 <a class="btn tooltip" title="${h.tooltip(_('Browse Files at revision {}').format(commit.raw_id))}" href="${h.route_path('repo_files',repo_name=diffset.repo_name, commit_id=commit.raw_id, f_path='')}">
113 <a class="btn tooltip" title="${h.tooltip(_('Browse Files at revision {}').format(commit.raw_id))}" href="${h.route_path('repo_files',repo_name=diffset.repo_name, commit_id=commit.raw_id, f_path='')}">
114 ${_('Browse Files')}
114 ${_('Browse Files')}
115 </a>
115 </a>
116 </div>
116 </div>
117 %endif
117 %endif
118 <h2 class="clearinner">
118 <h2 class="clearinner">
119 ## invidual commit
119 ## invidual commit
120 % if commit:
120 % if commit:
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> -
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 ${h.age_component(commit.date)}
122 ${h.age_component(commit.date)}
123 % if diffset.limited_diff:
123 % if diffset.limited_diff:
124 - ${_('The requested commit is too big and content was truncated.')}
124 - ${_('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}}
125 ${_ungettext('%(num)s file changed.', '%(num)s files changed.', diffset.changed_files) % {'num': diffset.changed_files}}
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>
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 % elif hasattr(c, 'commit_ranges') and len(c.commit_ranges) > 1:
127 % elif hasattr(c, 'commit_ranges') and len(c.commit_ranges) > 1:
128 ## compare diff, has no file-selector and we want to show stats anyway
128 ## compare diff, has no file-selector and we want to show stats anyway
129 ${_ungettext('{num} file changed: {linesadd} inserted, ''{linesdel} deleted',
129 ${_ungettext('{num} file changed: {linesadd} inserted, ''{linesdel} deleted',
130 '{num} files changed: {linesadd} inserted, {linesdel} deleted', diffset.changed_files) \
130 '{num} files changed: {linesadd} inserted, {linesdel} deleted', diffset.changed_files) \
131 .format(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:
133 % else:
134 ## pull requests/compare
134 ## pull requests/compare
135 ${_('File Changes')}
135 ${_('File Changes')}
136 % endif
136 % endif
137
137
138 </h2>
138 </h2>
139 </div>
139 </div>
140
140
141 %if diffset.has_hidden_changes:
141 %if diffset.has_hidden_changes:
142 <p class="empty_data">${_('Some changes may be hidden')}</p>
142 <p class="empty_data">${_('Some changes may be hidden')}</p>
143 %elif not diffset.files:
143 %elif not diffset.files:
144 <p class="empty_data">${_('No files')}</p>
144 <p class="empty_data">${_('No files')}</p>
145 %endif
145 %endif
146
146
147 <div class="filediffs">
147 <div class="filediffs">
148
148 ## initial value could be marked as False later on
149 ## initial value could be marked as False later on
149 <% over_lines_changed_limit = False %>
150 <% over_lines_changed_limit = False %>
150 %for i, filediff in enumerate(diffset.files):
151 %for i, filediff in enumerate(diffset.files):
151
152
152 <%
153 <%
153 lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
154 lines_changed = filediff.patch['stats']['added'] + filediff.patch['stats']['deleted']
154 over_lines_changed_limit = lines_changed > lines_changed_limit
155 over_lines_changed_limit = lines_changed > lines_changed_limit
155 %>
156 %>
157 ## anchor with support of sticky header
158 <div class="anchor" id="a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"></div>
156
159
157 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox">
160 <input ${(collapse_all and 'checked' or '')} class="filediff-collapse-state" id="filediff-collapse-${id(filediff)}" type="checkbox" onchange="Waypoint.refreshAll();">
158 <div
161 <div
159 class="filediff"
162 class="filediff"
160 data-f-path="${filediff.patch['filename']}"
163 data-f-path="${filediff.patch['filename']}"
161 id="a_${h.FID(filediff.raw_id, filediff.patch['filename'])}"
164 data-anchor-id="${h.FID(filediff.raw_id, filediff.patch['filename'])}"
162 >
165 >
163
164 <label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
166 <label for="filediff-collapse-${id(filediff)}" class="filediff-heading">
165 <div class="filediff-collapse-indicator"></div>
167 <div class="filediff-collapse-indicator"></div>
166 ${diff_ops(filediff)}
168 ${diff_ops(filediff)}
167 </label>
169 </label>
170
168 ${diff_menu(filediff, use_comments=use_comments)}
171 ${diff_menu(filediff, use_comments=use_comments)}
169 <table class="cb cb-diff-${c.user_session_attrs["diffmode"]} code-highlight ${(over_lines_changed_limit and 'cb-collapsed' or '')}">
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 '')}">
170
173
171 ## new/deleted/empty content case
174 ## new/deleted/empty content case
172 % if not filediff.hunks:
175 % if not filediff.hunks:
173 ## Comment container, on "fakes" hunk that contains all data to render comments
176 ## Comment container, on "fakes" hunk that contains all data to render comments
174 ${render_hunk_lines(c.user_session_attrs["diffmode"], filediff.hunk_ops, use_comments=use_comments, inline_comments=inline_comments)}
177 ${render_hunk_lines(c.user_session_attrs["diffmode"], filediff.hunk_ops, use_comments=use_comments, inline_comments=inline_comments)}
175 % endif
178 % endif
176
179
177 %if filediff.limited_diff:
180 %if filediff.limited_diff:
178 <tr class="cb-warning cb-collapser">
181 <tr class="cb-warning cb-collapser">
179 <td class="cb-text" ${(c.user_session_attrs["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')}>
180 ${_('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>
181 </td>
184 </td>
182 </tr>
185 </tr>
183 %else:
186 %else:
184 %if over_lines_changed_limit:
187 %if over_lines_changed_limit:
185 <tr class="cb-warning cb-collapser">
188 <tr class="cb-warning cb-collapser">
186 <td class="cb-text" ${(c.user_session_attrs["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')}>
187 ${_('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)}
188 <a href="#" class="cb-expand"
191 <a href="#" class="cb-expand"
189 onclick="$(this).closest('table').removeClass('cb-collapsed'); return false;">${_('Show them')}
192 onclick="$(this).closest('table').removeClass('cb-collapsed'); return false;">${_('Show them')}
190 </a>
193 </a>
191 <a href="#" class="cb-collapse"
194 <a href="#" class="cb-collapse"
192 onclick="$(this).closest('table').addClass('cb-collapsed'); return false;">${_('Hide them')}
195 onclick="$(this).closest('table').addClass('cb-collapsed'); return false;">${_('Hide them')}
193 </a>
196 </a>
194 </td>
197 </td>
195 </tr>
198 </tr>
196 %endif
199 %endif
197 %endif
200 %endif
198
201
199 % for hunk in filediff.hunks:
202 % for hunk in filediff.hunks:
200 <tr class="cb-hunk">
203 <tr class="cb-hunk">
201 <td ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=3' or '')}>
204 <td ${(c.user_session_attrs["diffmode"] == 'unified' and 'colspan=3' or '')}>
202 ## TODO: dan: add ajax loading of more context here
205 ## TODO: dan: add ajax loading of more context here
203 ## <a href="#">
206 ## <a href="#">
204 <i class="icon-more"></i>
207 <i class="icon-more"></i>
205 ## </a>
208 ## </a>
206 </td>
209 </td>
207 <td ${(c.user_session_attrs["diffmode"] == 'sideside' and 'colspan=5' or '')}>
210 <td ${(c.user_session_attrs["diffmode"] == 'sideside' and 'colspan=5' or '')}>
208 @@
211 @@
209 -${hunk.source_start},${hunk.source_length}
212 -${hunk.source_start},${hunk.source_length}
210 +${hunk.target_start},${hunk.target_length}
213 +${hunk.target_start},${hunk.target_length}
211 ${hunk.section_header}
214 ${hunk.section_header}
212 </td>
215 </td>
213 </tr>
216 </tr>
214 ${render_hunk_lines(c.user_session_attrs["diffmode"], hunk, use_comments=use_comments, inline_comments=inline_comments)}
217 ${render_hunk_lines(c.user_session_attrs["diffmode"], hunk, use_comments=use_comments, inline_comments=inline_comments)}
215 % endfor
218 % endfor
216
219
217 <% unmatched_comments = (inline_comments or {}).get(filediff.patch['filename'], {}) %>
220 <% unmatched_comments = (inline_comments or {}).get(filediff.patch['filename'], {}) %>
218
221
219 ## outdated comments that do not fit into currently displayed lines
222 ## outdated comments that do not fit into currently displayed lines
220 % for lineno, comments in unmatched_comments.items():
223 % for lineno, comments in unmatched_comments.items():
221
224
222 %if c.user_session_attrs["diffmode"] == 'unified':
225 %if c.user_session_attrs["diffmode"] == 'unified':
223 % if loop.index == 0:
226 % if loop.index == 0:
224 <tr class="cb-hunk">
227 <tr class="cb-hunk">
225 <td colspan="3"></td>
228 <td colspan="3"></td>
226 <td>
229 <td>
227 <div>
230 <div>
228 ${_('Unmatched inline comments below')}
231 ${_('Unmatched inline comments below')}
229 </div>
232 </div>
230 </td>
233 </td>
231 </tr>
234 </tr>
232 % endif
235 % endif
233 <tr class="cb-line">
236 <tr class="cb-line">
234 <td class="cb-data cb-context"></td>
237 <td class="cb-data cb-context"></td>
235 <td class="cb-lineno cb-context"></td>
238 <td class="cb-lineno cb-context"></td>
236 <td class="cb-lineno cb-context"></td>
239 <td class="cb-lineno cb-context"></td>
237 <td class="cb-content cb-context">
240 <td class="cb-content cb-context">
238 ${inline_comments_container(comments, inline_comments)}
241 ${inline_comments_container(comments, inline_comments)}
239 </td>
242 </td>
240 </tr>
243 </tr>
241 %elif c.user_session_attrs["diffmode"] == 'sideside':
244 %elif c.user_session_attrs["diffmode"] == 'sideside':
242 % if loop.index == 0:
245 % if loop.index == 0:
243 <tr class="cb-comment-info">
246 <tr class="cb-comment-info">
244 <td colspan="2"></td>
247 <td colspan="2"></td>
245 <td class="cb-line">
248 <td class="cb-line">
246 <div>
249 <div>
247 ${_('Unmatched inline comments below')}
250 ${_('Unmatched inline comments below')}
248 </div>
251 </div>
249 </td>
252 </td>
250 <td colspan="2"></td>
253 <td colspan="2"></td>
251 <td class="cb-line">
254 <td class="cb-line">
252 <div>
255 <div>
253 ${_('Unmatched comments below')}
256 ${_('Unmatched comments below')}
254 </div>
257 </div>
255 </td>
258 </td>
256 </tr>
259 </tr>
257 % endif
260 % endif
258 <tr class="cb-line">
261 <tr class="cb-line">
259 <td class="cb-data cb-context"></td>
262 <td class="cb-data cb-context"></td>
260 <td class="cb-lineno cb-context"></td>
263 <td class="cb-lineno cb-context"></td>
261 <td class="cb-content cb-context">
264 <td class="cb-content cb-context">
262 % if lineno.startswith('o'):
265 % if lineno.startswith('o'):
263 ${inline_comments_container(comments, inline_comments)}
266 ${inline_comments_container(comments, inline_comments)}
264 % endif
267 % endif
265 </td>
268 </td>
266
269
267 <td class="cb-data cb-context"></td>
270 <td class="cb-data cb-context"></td>
268 <td class="cb-lineno cb-context"></td>
271 <td class="cb-lineno cb-context"></td>
269 <td class="cb-content cb-context">
272 <td class="cb-content cb-context">
270 % if lineno.startswith('n'):
273 % if lineno.startswith('n'):
271 ${inline_comments_container(comments, inline_comments)}
274 ${inline_comments_container(comments, inline_comments)}
272 % endif
275 % endif
273 </td>
276 </td>
274 </tr>
277 </tr>
275 %endif
278 %endif
276
279
277 % endfor
280 % endfor
278
281
279 </table>
282 </table>
280 </div>
283 </div>
281 %endfor
284 %endfor
282
285
283 ## outdated comments that are made for a file that has been deleted
286 ## outdated comments that are made for a file that has been deleted
284 % for filename, comments_dict in (deleted_files_comments or {}).items():
287 % for filename, comments_dict in (deleted_files_comments or {}).items():
285 <%
288 <%
286 display_state = 'display: none'
289 display_state = 'display: none'
287 open_comments_in_file = [x for x in comments_dict['comments'] if x.outdated is False]
290 open_comments_in_file = [x for x in comments_dict['comments'] if x.outdated is False]
288 if open_comments_in_file:
291 if open_comments_in_file:
289 display_state = ''
292 display_state = ''
290 %>
293 %>
291 <div class="filediffs filediff-outdated" style="${display_state}">
294 <div class="filediffs filediff-outdated" style="${display_state}">
292 <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="Waypoint.refreshAll();">
293 <div class="filediff" data-f-path="${filename}" id="a_${h.FID(filediff.raw_id, filename)}">
296 <div class="filediff" data-f-path="${filename}" id="a_${h.FID(filediff.raw_id, filename)}">
294 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
297 <label for="filediff-collapse-${id(filename)}" class="filediff-heading">
295 <div class="filediff-collapse-indicator"></div>
298 <div class="filediff-collapse-indicator"></div>
296 <span class="pill">
299 <span class="pill">
297 ## file was deleted
300 ## file was deleted
298 <strong>${filename}</strong>
301 <strong>${filename}</strong>
299 </span>
302 </span>
300 <span class="pill-group" style="float: left">
303 <span class="pill-group" style="float: left">
301 ## file op, doesn't need translation
304 ## file op, doesn't need translation
302 <span class="pill" op="removed">removed in this version</span>
305 <span class="pill" op="removed">removed in this version</span>
303 </span>
306 </span>
304 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filename)}">ΒΆ</a>
307 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filename)}">ΒΆ</a>
305 <span class="pill-group" style="float: right">
308 <span class="pill-group" style="float: right">
306 <span class="pill" op="deleted">-${comments_dict['stats']}</span>
309 <span class="pill" op="deleted">-${comments_dict['stats']}</span>
307 </span>
310 </span>
308 </label>
311 </label>
309
312
310 <table class="cb cb-diff-${c.user_session_attrs["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 ''}">
311 <tr>
314 <tr>
312 % if c.user_session_attrs["diffmode"] == 'unified':
315 % if c.user_session_attrs["diffmode"] == 'unified':
313 <td></td>
316 <td></td>
314 %endif
317 %endif
315
318
316 <td></td>
319 <td></td>
317 <td class="cb-text cb-${op_class(BIN_FILENODE)}" ${(c.user_session_attrs["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')}>
318 ${_('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.')}
319 </td>
322 </td>
320 </tr>
323 </tr>
321 %if c.user_session_attrs["diffmode"] == 'unified':
324 %if c.user_session_attrs["diffmode"] == 'unified':
322 <tr class="cb-line">
325 <tr class="cb-line">
323 <td class="cb-data cb-context"></td>
326 <td class="cb-data cb-context"></td>
324 <td class="cb-lineno cb-context"></td>
327 <td class="cb-lineno cb-context"></td>
325 <td class="cb-lineno cb-context"></td>
328 <td class="cb-lineno cb-context"></td>
326 <td class="cb-content cb-context">
329 <td class="cb-content cb-context">
327 ${inline_comments_container(comments_dict['comments'], inline_comments)}
330 ${inline_comments_container(comments_dict['comments'], inline_comments)}
328 </td>
331 </td>
329 </tr>
332 </tr>
330 %elif c.user_session_attrs["diffmode"] == 'sideside':
333 %elif c.user_session_attrs["diffmode"] == 'sideside':
331 <tr class="cb-line">
334 <tr class="cb-line">
332 <td class="cb-data cb-context"></td>
335 <td class="cb-data cb-context"></td>
333 <td class="cb-lineno cb-context"></td>
336 <td class="cb-lineno cb-context"></td>
334 <td class="cb-content cb-context"></td>
337 <td class="cb-content cb-context"></td>
335
338
336 <td class="cb-data cb-context"></td>
339 <td class="cb-data cb-context"></td>
337 <td class="cb-lineno cb-context"></td>
340 <td class="cb-lineno cb-context"></td>
338 <td class="cb-content cb-context">
341 <td class="cb-content cb-context">
339 ${inline_comments_container(comments_dict['comments'], inline_comments)}
342 ${inline_comments_container(comments_dict['comments'], inline_comments)}
340 </td>
343 </td>
341 </tr>
344 </tr>
342 %endif
345 %endif
343 </table>
346 </table>
344 </div>
347 </div>
345 </div>
348 </div>
346 % endfor
349 % endfor
347
350
348 </div>
351 </div>
349 </div>
352 </div>
350 </%def>
353 </%def>
351
354
352 <%def name="diff_ops(filediff)">
355 <%def name="diff_ops(filediff)">
353 <%
356 <%
354 from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
357 from rhodecode.lib.diffs import NEW_FILENODE, DEL_FILENODE, \
355 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
358 MOD_FILENODE, RENAMED_FILENODE, CHMOD_FILENODE, BIN_FILENODE, COPIED_FILENODE
356 %>
359 %>
357 <span class="pill">
360 <span class="pill">
358 %if filediff.source_file_path and filediff.target_file_path:
361 %if filediff.source_file_path and filediff.target_file_path:
359 %if filediff.source_file_path != filediff.target_file_path:
362 %if filediff.source_file_path != filediff.target_file_path:
360 ## file was renamed, or copied
363 ## file was renamed, or copied
361 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
364 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
362 <strong>${filediff.target_file_path}</strong> β¬… <del>${filediff.source_file_path}</del>
365 <strong>${filediff.target_file_path}</strong> β¬… <del>${filediff.source_file_path}</del>
363 <% final_path = filediff.target_file_path %>
366 <% final_path = filediff.target_file_path %>
364 %elif COPIED_FILENODE in filediff.patch['stats']['ops']:
367 %elif COPIED_FILENODE in filediff.patch['stats']['ops']:
365 <strong>${filediff.target_file_path}</strong> β¬… ${filediff.source_file_path}
368 <strong>${filediff.target_file_path}</strong> β¬… ${filediff.source_file_path}
366 <% final_path = filediff.target_file_path %>
369 <% final_path = filediff.target_file_path %>
367 %endif
370 %endif
368 %else:
371 %else:
369 ## file was modified
372 ## file was modified
370 <strong>${filediff.source_file_path}</strong>
373 <strong>${filediff.source_file_path}</strong>
371 <% final_path = filediff.source_file_path %>
374 <% final_path = filediff.source_file_path %>
372 %endif
375 %endif
373 %else:
376 %else:
374 %if filediff.source_file_path:
377 %if filediff.source_file_path:
375 ## file was deleted
378 ## file was deleted
376 <strong>${filediff.source_file_path}</strong>
379 <strong>${filediff.source_file_path}</strong>
377 <% final_path = filediff.source_file_path %>
380 <% final_path = filediff.source_file_path %>
378 %else:
381 %else:
379 ## file was added
382 ## file was added
380 <strong>${filediff.target_file_path}</strong>
383 <strong>${filediff.target_file_path}</strong>
381 <% final_path = filediff.target_file_path %>
384 <% final_path = filediff.target_file_path %>
382 %endif
385 %endif
383 %endif
386 %endif
384 <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>
385 </span>
388 </span>
386 ## anchor link
389 ## anchor link
387 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filediff.patch['filename'])}">ΒΆ</a>
390 <a class="pill filediff-anchor" href="#a_${h.FID(filediff.raw_id, filediff.patch['filename'])}">ΒΆ</a>
388
391
389 <span class="pill-group" style="float: right">
392 <span class="pill-group" style="float: right">
390
393
391 ## ops pills
394 ## ops pills
392 %if filediff.limited_diff:
395 %if filediff.limited_diff:
393 <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>
394 %endif
397 %endif
395
398
396 %if NEW_FILENODE in filediff.patch['stats']['ops']:
399 %if NEW_FILENODE in filediff.patch['stats']['ops']:
397 <span class="pill" op="created">created</span>
400 <span class="pill" op="created">created</span>
398 %if filediff['target_mode'].startswith('120'):
401 %if filediff['target_mode'].startswith('120'):
399 <span class="pill" op="symlink">symlink</span>
402 <span class="pill" op="symlink">symlink</span>
400 %else:
403 %else:
401 <span class="pill" op="mode">${nice_mode(filediff['target_mode'])}</span>
404 <span class="pill" op="mode">${nice_mode(filediff['target_mode'])}</span>
402 %endif
405 %endif
403 %endif
406 %endif
404
407
405 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
408 %if RENAMED_FILENODE in filediff.patch['stats']['ops']:
406 <span class="pill" op="renamed">renamed</span>
409 <span class="pill" op="renamed">renamed</span>
407 %endif
410 %endif
408
411
409 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
412 %if COPIED_FILENODE in filediff.patch['stats']['ops']:
410 <span class="pill" op="copied">copied</span>
413 <span class="pill" op="copied">copied</span>
411 %endif
414 %endif
412
415
413 %if DEL_FILENODE in filediff.patch['stats']['ops']:
416 %if DEL_FILENODE in filediff.patch['stats']['ops']:
414 <span class="pill" op="removed">removed</span>
417 <span class="pill" op="removed">removed</span>
415 %endif
418 %endif
416
419
417 %if CHMOD_FILENODE in filediff.patch['stats']['ops']:
420 %if CHMOD_FILENODE in filediff.patch['stats']['ops']:
418 <span class="pill" op="mode">
421 <span class="pill" op="mode">
419 ${nice_mode(filediff['source_mode'])} ➑ ${nice_mode(filediff['target_mode'])}
422 ${nice_mode(filediff['source_mode'])} ➑ ${nice_mode(filediff['target_mode'])}
420 </span>
423 </span>
421 %endif
424 %endif
422
425
423 %if BIN_FILENODE in filediff.patch['stats']['ops']:
426 %if BIN_FILENODE in filediff.patch['stats']['ops']:
424 <span class="pill" op="binary">binary</span>
427 <span class="pill" op="binary">binary</span>
425 %if MOD_FILENODE in filediff.patch['stats']['ops']:
428 %if MOD_FILENODE in filediff.patch['stats']['ops']:
426 <span class="pill" op="modified">modified</span>
429 <span class="pill" op="modified">modified</span>
427 %endif
430 %endif
428 %endif
431 %endif
429
432
430 <span class="pill" op="added">${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}</span>
433 <span class="pill" op="added">${('+' if filediff.patch['stats']['added'] else '')}${filediff.patch['stats']['added']}</span>
431 <span class="pill" op="deleted">${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}</span>
434 <span class="pill" op="deleted">${((h.safe_int(filediff.patch['stats']['deleted']) or 0) * -1)}</span>
432
435
433 </span>
436 </span>
434
437
435 </%def>
438 </%def>
436
439
437 <%def name="nice_mode(filemode)">
440 <%def name="nice_mode(filemode)">
438 ${(filemode.startswith('100') and filemode[3:] or filemode)}
441 ${(filemode.startswith('100') and filemode[3:] or filemode)}
439 </%def>
442 </%def>
440
443
441 <%def name="diff_menu(filediff, use_comments=False)">
444 <%def name="diff_menu(filediff, use_comments=False)">
442 <div class="filediff-menu">
445 <div class="filediff-menu">
443 %if filediff.diffset.source_ref:
446 %if filediff.diffset.source_ref:
444 %if filediff.operation in ['D', 'M']:
447 %if filediff.operation in ['D', 'M']:
445 <a
448 <a
446 class="tooltip"
449 class="tooltip"
447 href="${h.route_path('repo_files',repo_name=filediff.diffset.repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
450 href="${h.route_path('repo_files',repo_name=filediff.diffset.repo_name,commit_id=filediff.diffset.source_ref,f_path=filediff.source_file_path)}"
448 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
451 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
449 >
452 >
450 ${_('Show file before')}
453 ${_('Show file before')}
451 </a> |
454 </a> |
452 %else:
455 %else:
453 <span
456 <span
454 class="tooltip"
457 class="tooltip"
455 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
458 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.source_ref[:12]})}"
456 >
459 >
457 ${_('Show file before')}
460 ${_('Show file before')}
458 </span> |
461 </span> |
459 %endif
462 %endif
460 %if filediff.operation in ['A', 'M']:
463 %if filediff.operation in ['A', 'M']:
461 <a
464 <a
462 class="tooltip"
465 class="tooltip"
463 href="${h.route_path('repo_files',repo_name=filediff.diffset.source_repo_name,commit_id=filediff.diffset.target_ref,f_path=filediff.target_file_path)}"
466 href="${h.route_path('repo_files',repo_name=filediff.diffset.source_repo_name,commit_id=filediff.diffset.target_ref,f_path=filediff.target_file_path)}"
464 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
467 title="${h.tooltip(_('Show file at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
465 >
468 >
466 ${_('Show file after')}
469 ${_('Show file after')}
467 </a> |
470 </a> |
468 %else:
471 %else:
469 <span
472 <span
470 class="tooltip"
473 class="tooltip"
471 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
474 title="${h.tooltip(_('File no longer present at commit: %(commit_id)s') % {'commit_id': filediff.diffset.target_ref[:12]})}"
472 >
475 >
473 ${_('Show file after')}
476 ${_('Show file after')}
474 </span> |
477 </span> |
475 %endif
478 %endif
476 <a
479 <a
477 class="tooltip"
480 class="tooltip"
478 title="${h.tooltip(_('Raw diff'))}"
481 title="${h.tooltip(_('Raw diff'))}"
479 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'))}"
482 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'))}"
480 >
483 >
481 ${_('Raw diff')}
484 ${_('Raw diff')}
482 </a> |
485 </a> |
483 <a
486 <a
484 class="tooltip"
487 class="tooltip"
485 title="${h.tooltip(_('Download diff'))}"
488 title="${h.tooltip(_('Download diff'))}"
486 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'))}"
489 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'))}"
487 >
490 >
488 ${_('Download diff')}
491 ${_('Download diff')}
489 </a>
492 </a>
490 % if use_comments:
493 % if use_comments:
491 |
494 |
492 % endif
495 % endif
493
496
494 ## 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)
497 ## 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)
495 %if hasattr(c, 'ignorews_url'):
498 %if hasattr(c, 'ignorews_url'):
496 ${c.ignorews_url(request, h.FID(filediff.raw_id, filediff.patch['filename']))}
499 ${c.ignorews_url(request, h.FID(filediff.raw_id, filediff.patch['filename']))}
497 %endif
500 %endif
498 %if hasattr(c, 'context_url'):
501 %if hasattr(c, 'context_url'):
499 ${c.context_url(request, h.FID(filediff.raw_id, filediff.patch['filename']))}
502 ${c.context_url(request, h.FID(filediff.raw_id, filediff.patch['filename']))}
500 %endif
503 %endif
501
504
502 %if use_comments:
505 %if use_comments:
503 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
506 <a href="#" onclick="return Rhodecode.comments.toggleComments(this);">
504 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
507 <span class="show-comment-button">${_('Show comments')}</span><span class="hide-comment-button">${_('Hide comments')}</span>
505 </a>
508 </a>
506 %endif
509 %endif
507 %endif
510 %endif
508 </div>
511 </div>
509 </%def>
512 </%def>
510
513
511
514
512 <%def name="inline_comments_container(comments, inline_comments)">
515 <%def name="inline_comments_container(comments, inline_comments)">
513 <div class="inline-comments">
516 <div class="inline-comments">
514 %for comment in comments:
517 %for comment in comments:
515 ${commentblock.comment_block(comment, inline=True)}
518 ${commentblock.comment_block(comment, inline=True)}
516 %endfor
519 %endfor
517 % if comments and comments[-1].outdated:
520 % if comments and comments[-1].outdated:
518 <span class="btn btn-secondary cb-comment-add-button comment-outdated}"
521 <span class="btn btn-secondary cb-comment-add-button comment-outdated}"
519 style="display: none;}">
522 style="display: none;}">
520 ${_('Add another comment')}
523 ${_('Add another comment')}
521 </span>
524 </span>
522 % else:
525 % else:
523 <span onclick="return Rhodecode.comments.createComment(this)"
526 <span onclick="return Rhodecode.comments.createComment(this)"
524 class="btn btn-secondary cb-comment-add-button">
527 class="btn btn-secondary cb-comment-add-button">
525 ${_('Add another comment')}
528 ${_('Add another comment')}
526 </span>
529 </span>
527 % endif
530 % endif
528
531
529 </div>
532 </div>
530 </%def>
533 </%def>
531
534
532 <%!
535 <%!
533 def get_comments_for(diff_type, comments, filename, line_version, line_number):
536 def get_comments_for(diff_type, comments, filename, line_version, line_number):
534 if hasattr(filename, 'unicode_path'):
537 if hasattr(filename, 'unicode_path'):
535 filename = filename.unicode_path
538 filename = filename.unicode_path
536
539
537 if not isinstance(filename, basestring):
540 if not isinstance(filename, basestring):
538 return None
541 return None
539
542
540 line_key = '{}{}'.format(line_version, line_number) ## e.g o37, n12
543 line_key = '{}{}'.format(line_version, line_number) ## e.g o37, n12
541
544
542 if comments and filename in comments:
545 if comments and filename in comments:
543 file_comments = comments[filename]
546 file_comments = comments[filename]
544 if line_key in file_comments:
547 if line_key in file_comments:
545 data = file_comments.pop(line_key)
548 data = file_comments.pop(line_key)
546 return data
549 return data
547 %>
550 %>
548
551
549 <%def name="render_hunk_lines_sideside(hunk, use_comments=False, inline_comments=None)">
552 <%def name="render_hunk_lines_sideside(hunk, use_comments=False, inline_comments=None)">
550
553
551 %for i, line in enumerate(hunk.sideside):
554 %for i, line in enumerate(hunk.sideside):
552 <%
555 <%
553 old_line_anchor, new_line_anchor = None, None
556 old_line_anchor, new_line_anchor = None, None
554 if line.original.lineno:
557 if line.original.lineno:
555 old_line_anchor = diff_line_anchor(hunk.source_file_path, line.original.lineno, 'o')
558 old_line_anchor = diff_line_anchor(hunk.source_file_path, line.original.lineno, 'o')
556 if line.modified.lineno:
559 if line.modified.lineno:
557 new_line_anchor = diff_line_anchor(hunk.target_file_path, line.modified.lineno, 'n')
560 new_line_anchor = diff_line_anchor(hunk.target_file_path, line.modified.lineno, 'n')
558 %>
561 %>
559
562
560 <tr class="cb-line">
563 <tr class="cb-line">
561 <td class="cb-data ${action_class(line.original.action)}"
564 <td class="cb-data ${action_class(line.original.action)}"
562 data-line-no="${line.original.lineno}"
565 data-line-no="${line.original.lineno}"
563 >
566 >
564 <div>
567 <div>
565
568
566 <% line_old_comments = None %>
569 <% line_old_comments = None %>
567 %if line.original.get_comment_args:
570 %if line.original.get_comment_args:
568 <% line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args) %>
571 <% line_old_comments = get_comments_for('side-by-side', inline_comments, *line.original.get_comment_args) %>
569 %endif
572 %endif
570 %if line_old_comments:
573 %if line_old_comments:
571 <% has_outdated = any([x.outdated for x in line_old_comments]) %>
574 <% has_outdated = any([x.outdated for x in line_old_comments]) %>
572 % if has_outdated:
575 % if has_outdated:
573 <i title="${_('comments including outdated')}:${len(line_old_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
576 <i title="${_('comments including outdated')}:${len(line_old_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
574 % else:
577 % else:
575 <i title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
578 <i title="${_('comments')}: ${len(line_old_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
576 % endif
579 % endif
577 %endif
580 %endif
578 </div>
581 </div>
579 </td>
582 </td>
580 <td class="cb-lineno ${action_class(line.original.action)}"
583 <td class="cb-lineno ${action_class(line.original.action)}"
581 data-line-no="${line.original.lineno}"
584 data-line-no="${line.original.lineno}"
582 %if old_line_anchor:
585 %if old_line_anchor:
583 id="${old_line_anchor}"
586 id="${old_line_anchor}"
584 %endif
587 %endif
585 >
588 >
586 %if line.original.lineno:
589 %if line.original.lineno:
587 <a name="${old_line_anchor}" href="#${old_line_anchor}">${line.original.lineno}</a>
590 <a name="${old_line_anchor}" href="#${old_line_anchor}">${line.original.lineno}</a>
588 %endif
591 %endif
589 </td>
592 </td>
590 <td class="cb-content ${action_class(line.original.action)}"
593 <td class="cb-content ${action_class(line.original.action)}"
591 data-line-no="o${line.original.lineno}"
594 data-line-no="o${line.original.lineno}"
592 >
595 >
593 %if use_comments and line.original.lineno:
596 %if use_comments and line.original.lineno:
594 ${render_add_comment_button()}
597 ${render_add_comment_button()}
595 %endif
598 %endif
596 <span class="cb-code">${line.original.action} ${line.original.content or '' | n}</span>
599 <span class="cb-code">${line.original.action} ${line.original.content or '' | n}</span>
597
600
598 %if use_comments and line.original.lineno and line_old_comments:
601 %if use_comments and line.original.lineno and line_old_comments:
599 ${inline_comments_container(line_old_comments, inline_comments)}
602 ${inline_comments_container(line_old_comments, inline_comments)}
600 %endif
603 %endif
601
604
602 </td>
605 </td>
603 <td class="cb-data ${action_class(line.modified.action)}"
606 <td class="cb-data ${action_class(line.modified.action)}"
604 data-line-no="${line.modified.lineno}"
607 data-line-no="${line.modified.lineno}"
605 >
608 >
606 <div>
609 <div>
607
610
608 %if line.modified.get_comment_args:
611 %if line.modified.get_comment_args:
609 <% line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args) %>
612 <% line_new_comments = get_comments_for('side-by-side', inline_comments, *line.modified.get_comment_args) %>
610 %else:
613 %else:
611 <% line_new_comments = None%>
614 <% line_new_comments = None%>
612 %endif
615 %endif
613 %if line_new_comments:
616 %if line_new_comments:
614 <% has_outdated = any([x.outdated for x in line_new_comments]) %>
617 <% has_outdated = any([x.outdated for x in line_new_comments]) %>
615 % if has_outdated:
618 % if has_outdated:
616 <i title="${_('comments including outdated')}:${len(line_new_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
619 <i title="${_('comments including outdated')}:${len(line_new_comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
617 % else:
620 % else:
618 <i title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
621 <i title="${_('comments')}: ${len(line_new_comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
619 % endif
622 % endif
620 %endif
623 %endif
621 </div>
624 </div>
622 </td>
625 </td>
623 <td class="cb-lineno ${action_class(line.modified.action)}"
626 <td class="cb-lineno ${action_class(line.modified.action)}"
624 data-line-no="${line.modified.lineno}"
627 data-line-no="${line.modified.lineno}"
625 %if new_line_anchor:
628 %if new_line_anchor:
626 id="${new_line_anchor}"
629 id="${new_line_anchor}"
627 %endif
630 %endif
628 >
631 >
629 %if line.modified.lineno:
632 %if line.modified.lineno:
630 <a name="${new_line_anchor}" href="#${new_line_anchor}">${line.modified.lineno}</a>
633 <a name="${new_line_anchor}" href="#${new_line_anchor}">${line.modified.lineno}</a>
631 %endif
634 %endif
632 </td>
635 </td>
633 <td class="cb-content ${action_class(line.modified.action)}"
636 <td class="cb-content ${action_class(line.modified.action)}"
634 data-line-no="n${line.modified.lineno}"
637 data-line-no="n${line.modified.lineno}"
635 >
638 >
636 %if use_comments and line.modified.lineno:
639 %if use_comments and line.modified.lineno:
637 ${render_add_comment_button()}
640 ${render_add_comment_button()}
638 %endif
641 %endif
639 <span class="cb-code">${line.modified.action} ${line.modified.content or '' | n}</span>
642 <span class="cb-code">${line.modified.action} ${line.modified.content or '' | n}</span>
640 %if use_comments and line.modified.lineno and line_new_comments:
643 %if use_comments and line.modified.lineno and line_new_comments:
641 ${inline_comments_container(line_new_comments, inline_comments)}
644 ${inline_comments_container(line_new_comments, inline_comments)}
642 %endif
645 %endif
643 </td>
646 </td>
644 </tr>
647 </tr>
645 %endfor
648 %endfor
646 </%def>
649 </%def>
647
650
648
651
649 <%def name="render_hunk_lines_unified(hunk, use_comments=False, inline_comments=None)">
652 <%def name="render_hunk_lines_unified(hunk, use_comments=False, inline_comments=None)">
650 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
653 %for old_line_no, new_line_no, action, content, comments_args in hunk.unified:
651 <%
654 <%
652 old_line_anchor, new_line_anchor = None, None
655 old_line_anchor, new_line_anchor = None, None
653 if old_line_no:
656 if old_line_no:
654 old_line_anchor = diff_line_anchor(hunk.source_file_path, old_line_no, 'o')
657 old_line_anchor = diff_line_anchor(hunk.source_file_path, old_line_no, 'o')
655 if new_line_no:
658 if new_line_no:
656 new_line_anchor = diff_line_anchor(hunk.target_file_path, new_line_no, 'n')
659 new_line_anchor = diff_line_anchor(hunk.target_file_path, new_line_no, 'n')
657 %>
660 %>
658 <tr class="cb-line">
661 <tr class="cb-line">
659 <td class="cb-data ${action_class(action)}">
662 <td class="cb-data ${action_class(action)}">
660 <div>
663 <div>
661
664
662 %if comments_args:
665 %if comments_args:
663 <% comments = get_comments_for('unified', inline_comments, *comments_args) %>
666 <% comments = get_comments_for('unified', inline_comments, *comments_args) %>
664 %else:
667 %else:
665 <% comments = None %>
668 <% comments = None %>
666 %endif
669 %endif
667
670
668 % if comments:
671 % if comments:
669 <% has_outdated = any([x.outdated for x in comments]) %>
672 <% has_outdated = any([x.outdated for x in comments]) %>
670 % if has_outdated:
673 % if has_outdated:
671 <i title="${_('comments including outdated')}:${len(comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
674 <i title="${_('comments including outdated')}:${len(comments)}" class="icon-comment_toggle" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
672 % else:
675 % else:
673 <i title="${_('comments')}: ${len(comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
676 <i title="${_('comments')}: ${len(comments)}" class="icon-comment" onclick="return Rhodecode.comments.toggleLineComments(this)"></i>
674 % endif
677 % endif
675 % endif
678 % endif
676 </div>
679 </div>
677 </td>
680 </td>
678 <td class="cb-lineno ${action_class(action)}"
681 <td class="cb-lineno ${action_class(action)}"
679 data-line-no="${old_line_no}"
682 data-line-no="${old_line_no}"
680 %if old_line_anchor:
683 %if old_line_anchor:
681 id="${old_line_anchor}"
684 id="${old_line_anchor}"
682 %endif
685 %endif
683 >
686 >
684 %if old_line_anchor:
687 %if old_line_anchor:
685 <a name="${old_line_anchor}" href="#${old_line_anchor}">${old_line_no}</a>
688 <a name="${old_line_anchor}" href="#${old_line_anchor}">${old_line_no}</a>
686 %endif
689 %endif
687 </td>
690 </td>
688 <td class="cb-lineno ${action_class(action)}"
691 <td class="cb-lineno ${action_class(action)}"
689 data-line-no="${new_line_no}"
692 data-line-no="${new_line_no}"
690 %if new_line_anchor:
693 %if new_line_anchor:
691 id="${new_line_anchor}"
694 id="${new_line_anchor}"
692 %endif
695 %endif
693 >
696 >
694 %if new_line_anchor:
697 %if new_line_anchor:
695 <a name="${new_line_anchor}" href="#${new_line_anchor}">${new_line_no}</a>
698 <a name="${new_line_anchor}" href="#${new_line_anchor}">${new_line_no}</a>
696 %endif
699 %endif
697 </td>
700 </td>
698 <td class="cb-content ${action_class(action)}"
701 <td class="cb-content ${action_class(action)}"
699 data-line-no="${(new_line_no and 'n' or 'o')}${(new_line_no or old_line_no)}"
702 data-line-no="${(new_line_no and 'n' or 'o')}${(new_line_no or old_line_no)}"
700 >
703 >
701 %if use_comments:
704 %if use_comments:
702 ${render_add_comment_button()}
705 ${render_add_comment_button()}
703 %endif
706 %endif
704 <span class="cb-code">${action} ${content or '' | n}</span>
707 <span class="cb-code">${action} ${content or '' | n}</span>
705 %if use_comments and comments:
708 %if use_comments and comments:
706 ${inline_comments_container(comments, inline_comments)}
709 ${inline_comments_container(comments, inline_comments)}
707 %endif
710 %endif
708 </td>
711 </td>
709 </tr>
712 </tr>
710 %endfor
713 %endfor
711 </%def>
714 </%def>
712
715
713
716
714 <%def name="render_hunk_lines(diff_mode, hunk, use_comments, inline_comments)">
717 <%def name="render_hunk_lines(diff_mode, hunk, use_comments, inline_comments)">
715 % if diff_mode == 'unified':
718 % if diff_mode == 'unified':
716 ${render_hunk_lines_unified(hunk, use_comments=use_comments, inline_comments=inline_comments)}
719 ${render_hunk_lines_unified(hunk, use_comments=use_comments, inline_comments=inline_comments)}
717 % elif diff_mode == 'sideside':
720 % elif diff_mode == 'sideside':
718 ${render_hunk_lines_sideside(hunk, use_comments=use_comments, inline_comments=inline_comments)}
721 ${render_hunk_lines_sideside(hunk, use_comments=use_comments, inline_comments=inline_comments)}
719 % else:
722 % else:
720 <tr class="cb-line">
723 <tr class="cb-line">
721 <td>unknown diff mode</td>
724 <td>unknown diff mode</td>
722 </tr>
725 </tr>
723 % endif
726 % endif
724 </%def>file changes
727 </%def>file changes
725
728
726
729
727 <%def name="render_add_comment_button()">
730 <%def name="render_add_comment_button()">
728 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
731 <button class="btn btn-small btn-primary cb-comment-box-opener" onclick="return Rhodecode.comments.createComment(this)">
729 <span><i class="icon-comment"></i></span>
732 <span><i class="icon-comment"></i></span>
730 </button>
733 </button>
731 </%def>
734 </%def>
732
735
733 <%def name="render_diffset_menu(diffset=None, range_diff_on=None)">
736 <%def name="render_diffset_menu(diffset=None, range_diff_on=None)">
734
737
735 <div class="diffset-menu clearinner">
738 <div id="diff-file-sticky" class="diffset-menu clearinner">
739 ## auto adjustable
740 <div class="sidebar__inner" style="z-index: 30;background-color: #fff; padding: 5px 0px;">
736 <div class="pull-right">
741 <div class="pull-right">
737 <div class="btn-group">
742 <div class="btn-group">
738
743
739 <a
744 <a
740 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-primary')} tooltip"
745 class="btn ${(c.user_session_attrs["diffmode"] == 'sideside' and 'btn-primary')} tooltip"
741 title="${h.tooltip(_('View side by side'))}"
746 title="${h.tooltip(_('View side by side'))}"
742 href="${h.current_route_path(request, diffmode='sideside')}">
747 href="${h.current_route_path(request, diffmode='sideside')}">
743 <span>${_('Side by Side')}</span>
748 <span>${_('Side by Side')}</span>
744 </a>
749 </a>
745 <a
750 <a
746 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-primary')} tooltip"
751 class="btn ${(c.user_session_attrs["diffmode"] == 'unified' and 'btn-primary')} tooltip"
747 title="${h.tooltip(_('View unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
752 title="${h.tooltip(_('View unified'))}" href="${h.current_route_path(request, diffmode='unified')}">
748 <span>${_('Unified')}</span>
753 <span>${_('Unified')}</span>
749 </a>
754 </a>
750 % if range_diff_on is True:
755 % if range_diff_on is True:
751 <a
756 <a
752 title="${_('Turn off: Show the diff as commit range')}"
757 title="${_('Turn off: Show the diff as commit range')}"
753 class="btn btn-primary"
758 class="btn btn-primary"
754 href="${h.current_route_path(request, **{"range-diff":"0"})}">
759 href="${h.current_route_path(request, **{"range-diff":"0"})}">
755 <span>${_('Range Diff')}</span>
760 <span>${_('Range Diff')}</span>
756 </a>
761 </a>
757 % elif range_diff_on is False:
762 % elif range_diff_on is False:
758 <a
763 <a
759 title="${_('Show the diff as commit range')}"
764 title="${_('Show the diff as commit range')}"
760 class="btn"
765 class="btn"
761 href="${h.current_route_path(request, **{"range-diff":"1"})}">
766 href="${h.current_route_path(request, **{"range-diff":"1"})}">
762 <span>${_('Range Diff')}</span>
767 <span>${_('Range Diff')}</span>
763 </a>
768 </a>
764 % endif
769 % endif
765 </div>
770 </div>
766 </div>
771 </div>
767
768 <div class="pull-left">
772 <div class="pull-left">
769 <div class="btn-group">
773 <div class="btn-group">
770 <div class="pull-left">
774 <div class="pull-left">
771 ${h.hidden('file_filter')}
775 ${h.hidden('file_filter')}
772 </div>
776 </div>
773 <a
777 <a
774 class="btn"
778 class="btn"
775 href="#"
779 href="#"
776 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); return false">${_('Expand All Files')}</a>
780 onclick="$('input[class=filediff-collapse-state]').prop('checked', false); Waypoint.refreshAll(); return false">${_('Expand All Files')}</a>
781 <a
782 class="btn"
783 href="#"
784 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); Waypoint.refreshAll(); return false">${_('Collapse All Files')}</a>
777 <a
785 <a
778 class="btn"
786 class="btn"
779 href="#"
787 href="#"
780 onclick="$('input[class=filediff-collapse-state]').prop('checked', true); return false">${_('Collapse All Files')}</a>
788 onclick="updateSticky();return Rhodecode.comments.toggleWideMode(this)">${_('Wide Mode Diff')}</a>
781 <a
782 class="btn"
783 href="#"
784 onclick="return Rhodecode.comments.toggleWideMode(this)">${_('Wide Mode Diff')}</a>
785
789
786 </div>
790 </div>
787 </div>
791 </div>
792 <div class="fpath-placeholder">
793 <i class="icon-file-text"></i>
794 <strong class="fpath-placeholder-text">
795
796 </strong>
797 </div>
798 <div class="sidebar_inner_shadow"></div>
799 </div>
788 </div>
800 </div>
789
801
790 % if diffset:
802 % if diffset:
791
803
792 %if diffset.limited_diff:
804 %if diffset.limited_diff:
793 <% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files}%>
805 <% file_placeholder = _ungettext('%(num)s file changed', '%(num)s files changed', diffset.changed_files) % {'num': diffset.changed_files} %>
794 %else:
806 %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}%>
807 <% 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
808 %endif
809 ## case on range-diff placeholder needs to be updated
810 % if range_diff_on is True:
811 <% file_placeholder = _('Disabled on range diff') %>
812 % endif
797
813
798 <script>
814 <script>
799
815
800 var feedFilesOptions = function (query, initialData) {
816 var feedFilesOptions = function (query, initialData) {
801 var data = {results: []};
817 var data = {results: []};
802 var isQuery = typeof query.term !== 'undefined';
818 var isQuery = typeof query.term !== 'undefined';
803
819
804 var section = _gettext('Changed files');
820 var section = _gettext('Changed files');
805 var filteredData = [];
821 var filteredData = [];
806
822
807 //filter results
823 //filter results
808 $.each(initialData.results, function (idx, value) {
824 $.each(initialData.results, function (idx, value) {
809
825
810 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
826 if (!isQuery || query.term.length === 0 || value.text.toUpperCase().indexOf(query.term.toUpperCase()) >= 0) {
811 filteredData.push({
827 filteredData.push({
812 'id': this.id,
828 'id': this.id,
813 'text': this.text,
829 'text': this.text,
814 "ops": this.ops,
830 "ops": this.ops,
815 })
831 })
816 }
832 }
817
833
818 });
834 });
819
835
820 data.results = filteredData;
836 data.results = filteredData;
821
837
822 query.callback(data);
838 query.callback(data);
823 };
839 };
824
840
825 var formatFileResult = function(result, container, query, escapeMarkup) {
841 var formatFileResult = function(result, container, query, escapeMarkup) {
826 return function(data, escapeMarkup) {
842 return function(data, escapeMarkup) {
827 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
843 var container = '<div class="filelist" style="padding-right:100px">{0}</div>';
828 var tmpl = '<span style="margin-right:-50px"><strong>{0}</strong></span>'.format(escapeMarkup(data['text']));
844 var tmpl = '<span style="margin-right:-50px"><strong>{0}</strong></span>'.format(escapeMarkup(data['text']));
829 var pill = '<span class="pill-group" style="float: right;margin-right: -100px">' +
845 var pill = '<span class="pill-group" style="float: right;margin-right: -100px">' +
830 '<span class="pill" op="added">{0}</span>' +
846 '<span class="pill" op="added">{0}</span>' +
831 '<span class="pill" op="deleted">{1}</span>' +
847 '<span class="pill" op="deleted">{1}</span>' +
832 '</span>'
848 '</span>'
833 ;
849 ;
834 var added = data['ops']['added'];
850 var added = data['ops']['added'];
835 if (added === 0) {
851 if (added === 0) {
836 // don't show +0
852 // don't show +0
837 added = 0;
853 added = 0;
838 } else {
854 } else {
839 added = '+' + added;
855 added = '+' + added;
840 }
856 }
841
857
842 var deleted = -1*data['ops']['deleted'];
858 var deleted = -1*data['ops']['deleted'];
843
859
844 tmpl += pill.format(added, deleted);
860 tmpl += pill.format(added, deleted);
845 return container.format(tmpl);
861 return container.format(tmpl);
846
862
847 }(result, escapeMarkup);
863 }(result, escapeMarkup);
848 };
864 };
849 var preloadData = {
865 var preloadData = {
850 results: [
866 results: [
851 % for filediff in diffset.files:
867 % for filediff in diffset.files:
852 {id:"a_${h.FID(filediff.raw_id, filediff.patch['filename'])}",
868 {id:"a_${h.FID(filediff.raw_id, filediff.patch['filename'])}",
853 text:"${filediff.patch['filename']}",
869 text:"${filediff.patch['filename']}",
854 ops:${h.json.dumps(filediff.patch['stats'])|n}}${('' if loop.last else ',')}
870 ops:${h.json.dumps(filediff.patch['stats'])|n}}${('' if loop.last else ',')}
855 % endfor
871 % endfor
856 ]
872 ]
857 };
873 };
858
874
859 $("#file_filter").select2({
875 $(document).ready(function () {
876
877 var fileFilter = $("#file_filter").select2({
860 'dropdownAutoWidth': true,
878 'dropdownAutoWidth': true,
861 'width': 'auto',
879 'width': 'auto',
862 'placeholder': "${file_placeholder}",
880 'placeholder': "${file_placeholder}",
863 containerCssClass: "drop-menu",
881 containerCssClass: "drop-menu",
864 dropdownCssClass: "drop-menu-dropdown",
882 dropdownCssClass: "drop-menu-dropdown",
865 data: preloadData,
883 data: preloadData,
866 query: function(query) {
884 query: function(query) {
867 feedFilesOptions(query, preloadData);
885 feedFilesOptions(query, preloadData);
868 },
886 },
869 formatResult: formatFileResult
887 formatResult: formatFileResult
870 });
888 });
889 % if range_diff_on is True:
890 fileFilter.select2("enable", false);
891
892 % endif
871
893
872 $("#file_filter").on('click', function (e) {
894 $("#file_filter").on('click', function (e) {
873 e.preventDefault();
895 e.preventDefault();
874 var selected = $('#file_filter').select2('data');
896 var selected = $('#file_filter').select2('data');
875 var idSelector = "#"+selected.id;
897 var idSelector = "#"+selected.id;
876 window.location.hash = idSelector;
898 window.location.hash = idSelector;
877 // expand the container if we quick-select the field
899 // expand the container if we quick-select the field
878 $(idSelector).prev().prop('checked', false);
900 $(idSelector).next().prop('checked', false);
879 })
901 Waypoint.refreshAll()
902 });
903
904 var contextPrefix = _gettext('Context file: ');
905 ## sticky sidebar
906 var sidebarElement = document.getElementById('diff-file-sticky');
907 sidebar = new StickySidebar(sidebarElement, {
908 topSpacing: 0,
909 bottomSpacing: 0,
910 innerWrapperSelector: '.sidebar__inner'
911 });
912 sidebarElement.addEventListener('affixed.static.stickySidebar', function () {
913 // reset our file so it's not holding new value
914 $('.fpath-placeholder-text').html(contextPrefix)
915 });
916
917 updateSticky = function () {
918 sidebar.updateSticky()
919 };
920
921 var animateText = $.debounce(100, function(fPath, anchorId) {
922 // animate setting the text
923 var callback = function () {
924 $('.fpath-placeholder-text').animate({'opacity': 1.00}, 200)
925 $('.fpath-placeholder-text').html(contextPrefix + '<a href="#a_' + anchorId + '">' + fPath + '</a>')
926 };
927 $('.fpath-placeholder-text').animate({'opacity': 0.15}, 200, callback);
928 });
929
930 ## dynamic file waypoints
931 var setFPathInfo = function(fPath, anchorId){
932 animateText(fPath, anchorId)
933 };
934
935 var codeBlock = $('.filediff');
936 // forward waypoint
937 codeBlock.waypoint(
938 function(direction) {
939 if (direction === "down"){
940 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
941 }
942 }, {
943 offset: 60,
944 context: '.fpath-placeholder'
945 }
946 );
947
948 // backward waypoint
949 codeBlock.waypoint(
950 function(direction) {
951 if (direction === "up"){
952 setFPathInfo($(this.element).data('fPath'), $(this.element).data('anchorId'))
953 }
954 }, {
955 offset: function () {
956 return -this.element.clientHeight + 80
957 },
958 context: '.fpath-placeholder'
959 }
960 );
961
962 });
880
963
881 </script>
964 </script>
882 % endif
965 % endif
883
966
884 </%def>
967 </%def> No newline at end of file
General Comments 0
You need to be logged in to leave comments. Login now