Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(3)

Side by Side Diff: scripts/slave/recipes/client.dynamorio.recipe_autogen.py

Issue 1919193002: build: roll infra_paths changes (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/tools/build
Patch Set: Created 4 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 # Copyright 2016 The Chromium Authors. All rights reserved. 1 # Copyright 2016 The Chromium Authors. All rights reserved.
2 # Use of this source code is governed by a BSD-style license that can be 2 # Use of this source code is governed by a BSD-style license that can be
3 # found in the LICENSE file. 3 # found in the LICENSE file.
4 4
5 DEPS = [ 5 DEPS = [
6 'depot_tools/bot_update', 6 'depot_tools/bot_update',
7 'depot_tools/gclient', 7 'depot_tools/gclient',
8 'depot_tools/infra_paths',
8 'gsutil', 9 'gsutil',
9 'recipe_engine/path', 10 'recipe_engine/path',
10 'recipe_engine/properties', 11 'recipe_engine/properties',
11 'recipe_engine/step', 12 'recipe_engine/step',
12 ] 13 ]
13 14
14 def win_xp_dr_nightly_steps(api): 15 def win_xp_dr_nightly_steps(api):
15 build_properties = api.properties.legacy() 16 build_properties = api.properties.legacy()
16 # checkout DynamiRIO step 17 # checkout DynamiRIO step
17 src_cfg = api.gclient.make_config(GIT_MODE=True) 18 src_cfg = api.gclient.make_config(GIT_MODE=True)
18 soln = src_cfg.solutions.add() 19 soln = src_cfg.solutions.add()
19 soln.name = "dynamorio" 20 soln.name = "dynamorio"
20 soln.url = "https://github.com/DynamoRIO/dynamorio.git" 21 soln.url = "https://github.com/DynamoRIO/dynamorio.git"
21 soln.custom_deps = {'dynamorio/tools/buildbot': 22 soln.custom_deps = {'dynamorio/tools/buildbot':
22 'https://github.com/DynamoRIO/buildbot.git'} 23 'https://github.com/DynamoRIO/buildbot.git'}
23 api.gclient.c = src_cfg 24 api.gclient.c = src_cfg
24 result = api.bot_update.ensure_checkout(force=True) 25 result = api.bot_update.ensure_checkout(force=True)
25 build_properties.update(result.json.output.get("properties", {})) 26 build_properties.update(result.json.output.get("properties", {}))
26 # unpack tools step; generic ShellCommand converted 27 # unpack tools step; generic ShellCommand converted
27 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot', 28 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot',
28 'bot_tools', 'unpack.bat')], env={}, 29 'bot_tools', 'unpack.bat')], env={},
29 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools')) 30 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools'))
30 # dynamorio win nightly suite step 31 # dynamorio win nightly suite step
31 api.step("nightly suite", 32 api.step("nightly suite",
32 [api.path["build"].join("scripts", "slave", "drmemory", "build_env.bat"), 33 [api.infra_paths['build'].join("scripts", "slave", "drmemory", "build_env. bat"),
33 'ctest', '--timeout', '120', '-VV', '-S', 34 'ctest', '--timeout', '120', '-VV', '-S',
34 'dynamorio/suite/runsuite.cmake,nightly;long;'+\ 35 'dynamorio/suite/runsuite.cmake,nightly;long;'+\
35 'site=X64.WindowsXp.VS2010.BuildBot'], 36 'site=X64.WindowsXp.VS2010.BuildBot'],
36 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot", 37 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot",
37 "bot_tools")}, cwd=api.path["slave_build"]) 38 "bot_tools")}, cwd=api.infra_paths['slave_build'])
38 39
39 40
40 def linux_dr_steps(api): 41 def linux_dr_steps(api):
41 build_properties = api.properties.legacy() 42 build_properties = api.properties.legacy()
42 # checkout DynamiRIO step 43 # checkout DynamiRIO step
43 src_cfg = api.gclient.make_config(GIT_MODE=True) 44 src_cfg = api.gclient.make_config(GIT_MODE=True)
44 soln = src_cfg.solutions.add() 45 soln = src_cfg.solutions.add()
45 soln.name = "dynamorio" 46 soln.name = "dynamorio"
46 soln.url = "https://github.com/DynamoRIO/dynamorio.git" 47 soln.url = "https://github.com/DynamoRIO/dynamorio.git"
47 api.gclient.c = src_cfg 48 api.gclient.c = src_cfg
48 result = api.bot_update.ensure_checkout(force=True) 49 result = api.bot_update.ensure_checkout(force=True)
49 build_properties.update(result.json.output.get("properties", {})) 50 build_properties.update(result.json.output.get("properties", {}))
50 # pre-commit suite step 51 # pre-commit suite step
51 api.step("pre-commit suite", ['ctest', '--timeout', '120', '-VV', '-S', 52 api.step("pre-commit suite", ['ctest', '--timeout', '120', '-VV', '-S',
52 api.path["checkout"].join("suite", "runsuite.cmake")], 53 api.path["checkout"].join("suite", "runsuite.cmake")],
53 cwd=api.path["slave_build"], ok_ret="all") 54 cwd=api.infra_paths['slave_build'], ok_ret="all")
54 # upload dynamorio docs step 55 # upload dynamorio docs step
55 api.gsutil.upload(api.path["slave_build"].join("install", "docs", "html"), 56 api.gsutil.upload(api.infra_paths['slave_build'].join("install", "docs", "html "),
Sergiy Byelozyorov 2016/04/26 14:41:05 nit: long line
56 "chromium-dynamorio", "dr_docs/", ["-r"], multithreaded=True) 57 "chromium-dynamorio", "dr_docs/", ["-r"], multithreaded=True)
57 58
58 59
59 def win_7_dr_steps(api): 60 def win_7_dr_steps(api):
60 build_properties = api.properties.legacy() 61 build_properties = api.properties.legacy()
61 # checkout DynamiRIO step 62 # checkout DynamiRIO step
62 src_cfg = api.gclient.make_config(GIT_MODE=True) 63 src_cfg = api.gclient.make_config(GIT_MODE=True)
63 soln = src_cfg.solutions.add() 64 soln = src_cfg.solutions.add()
64 soln.name = "dynamorio" 65 soln.name = "dynamorio"
65 soln.url = "https://github.com/DynamoRIO/dynamorio.git" 66 soln.url = "https://github.com/DynamoRIO/dynamorio.git"
66 soln.custom_deps = {'dynamorio/tools/buildbot': 67 soln.custom_deps = {'dynamorio/tools/buildbot':
67 'https://github.com/DynamoRIO/buildbot.git'} 68 'https://github.com/DynamoRIO/buildbot.git'}
68 api.gclient.c = src_cfg 69 api.gclient.c = src_cfg
69 result = api.bot_update.ensure_checkout(force=True) 70 result = api.bot_update.ensure_checkout(force=True)
70 build_properties.update(result.json.output.get("properties", {})) 71 build_properties.update(result.json.output.get("properties", {}))
71 # unpack tools step; generic ShellCommand converted 72 # unpack tools step; generic ShellCommand converted
72 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot', 73 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot',
73 'bot_tools', 'unpack.bat')], env={}, 74 'bot_tools', 'unpack.bat')], env={},
74 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools')) 75 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools'))
75 # build_env step 76 # build_env step
76 api.step("pre-commit suite", [api.path["build"].join("scripts", "slave", 77 api.step("pre-commit suite", [api.infra_paths['build'].join("scripts", "slave" ,
Sergiy Byelozyorov 2016/04/26 14:41:05 nit: long line
77 "drmemory", "build_env.bat"), 'ctest', '--timeout', '120', '-VV', '-S', 78 "drmemory", "build_env.bat"), 'ctest', '--timeout', '120', '-VV', '-S',
78 api.path["checkout"].join("suite", "runsuite.cmake")], 79 api.path["checkout"].join("suite", "runsuite.cmake")],
79 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot", 80 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot",
80 "bot_tools")}, cwd=api.path["slave_build"]) 81 "bot_tools")}, cwd=api.infra_paths['slave_build'])
81 82
82 83
83 def linux_dr_package_steps(api): 84 def linux_dr_package_steps(api):
84 build_properties = api.properties.legacy() 85 build_properties = api.properties.legacy()
85 # checkout DynamiRIO step 86 # checkout DynamiRIO step
86 src_cfg = api.gclient.make_config(GIT_MODE=True) 87 src_cfg = api.gclient.make_config(GIT_MODE=True)
87 soln = src_cfg.solutions.add() 88 soln = src_cfg.solutions.add()
88 soln.name = "dynamorio" 89 soln.name = "dynamorio"
89 soln.url = "https://github.com/DynamoRIO/dynamorio.git" 90 soln.url = "https://github.com/DynamoRIO/dynamorio.git"
90 api.gclient.c = src_cfg 91 api.gclient.c = src_cfg
(...skipping 22 matching lines...) Expand all
113 'https://github.com/DynamoRIO/buildbot.git'} 114 'https://github.com/DynamoRIO/buildbot.git'}
114 api.gclient.c = src_cfg 115 api.gclient.c = src_cfg
115 result = api.bot_update.ensure_checkout(force=True) 116 result = api.bot_update.ensure_checkout(force=True)
116 build_properties.update(result.json.output.get("properties", {})) 117 build_properties.update(result.json.output.get("properties", {}))
117 # unpack tools step; generic ShellCommand converted 118 # unpack tools step; generic ShellCommand converted
118 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot', 119 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot',
119 'bot_tools', 'unpack.bat')], env={}, 120 'bot_tools', 'unpack.bat')], env={},
120 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools')) 121 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools'))
121 # build_env step 122 # build_env step
122 api.step("pre-commit suite", 123 api.step("pre-commit suite",
123 [api.path["build"].join("scripts", "slave", "drmemory", "build_env.bat"), 124 [api.infra_paths['build'].join("scripts", "slave", "drmemory", "build_env. bat"),
Sergiy Byelozyorov 2016/04/26 14:41:05 nit: long line
124 'ctest', '--timeout', '120', '-VV', '-S', 125 'ctest', '--timeout', '120', '-VV', '-S',
125 api.path["checkout"].join("suite", "runsuite.cmake")], 126 api.path["checkout"].join("suite", "runsuite.cmake")],
126 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot", 127 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot",
127 "bot_tools")}, cwd=api.path["slave_build"]) 128 "bot_tools")}, cwd=api.infra_paths['slave_build'])
128 129
129 130
130 def win_xp_dr_steps(api): 131 def win_xp_dr_steps(api):
131 build_properties = api.properties.legacy() 132 build_properties = api.properties.legacy()
132 # checkout DynamiRIO step 133 # checkout DynamiRIO step
133 src_cfg = api.gclient.make_config(GIT_MODE=True) 134 src_cfg = api.gclient.make_config(GIT_MODE=True)
134 soln = src_cfg.solutions.add() 135 soln = src_cfg.solutions.add()
135 soln.name = "dynamorio" 136 soln.name = "dynamorio"
136 soln.url = "https://github.com/DynamoRIO/dynamorio.git" 137 soln.url = "https://github.com/DynamoRIO/dynamorio.git"
137 soln.custom_deps = {'dynamorio/tools/buildbot': 138 soln.custom_deps = {'dynamorio/tools/buildbot':
138 'https://github.com/DynamoRIO/buildbot.git'} 139 'https://github.com/DynamoRIO/buildbot.git'}
139 api.gclient.c = src_cfg 140 api.gclient.c = src_cfg
140 result = api.bot_update.ensure_checkout(force=True) 141 result = api.bot_update.ensure_checkout(force=True)
141 build_properties.update(result.json.output.get("properties", {})) 142 build_properties.update(result.json.output.get("properties", {}))
142 # unpack tools step; generic ShellCommand converted 143 # unpack tools step; generic ShellCommand converted
143 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot', 144 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot',
144 'bot_tools', 'unpack.bat')], env={}, 145 'bot_tools', 'unpack.bat')], env={},
145 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools')) 146 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools'))
146 # build_env step 147 # build_env step
147 api.step("pre-commit suite", [api.path["build"].join("scripts", "slave", 148 api.step("pre-commit suite", [api.infra_paths['build'].join("scripts", "slave" ,
Sergiy Byelozyorov 2016/04/26 14:41:05 nit: long line
148 "drmemory", "build_env.bat"), 'ctest', '--timeout', '120', '-VV', '-S', 149 "drmemory", "build_env.bat"), 'ctest', '--timeout', '120', '-VV', '-S',
149 api.path["checkout"].join("suite", "runsuite.cmake")], 150 api.path["checkout"].join("suite", "runsuite.cmake")],
150 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot", 151 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot",
151 "bot_tools")}, cwd=api.path["slave_build"]) 152 "bot_tools")}, cwd=api.infra_paths['slave_build'])
152 153
153 154
154 def win_7_dr_nightly_steps(api): 155 def win_7_dr_nightly_steps(api):
155 build_properties = api.properties.legacy() 156 build_properties = api.properties.legacy()
156 # checkout DynamiRIO step 157 # checkout DynamiRIO step
157 src_cfg = api.gclient.make_config(GIT_MODE=True) 158 src_cfg = api.gclient.make_config(GIT_MODE=True)
158 soln = src_cfg.solutions.add() 159 soln = src_cfg.solutions.add()
159 soln.name = "dynamorio" 160 soln.name = "dynamorio"
160 soln.url = "https://github.com/DynamoRIO/dynamorio.git" 161 soln.url = "https://github.com/DynamoRIO/dynamorio.git"
161 soln.custom_deps = {'dynamorio/tools/buildbot': 162 soln.custom_deps = {'dynamorio/tools/buildbot':
162 'https://github.com/DynamoRIO/buildbot.git'} 163 'https://github.com/DynamoRIO/buildbot.git'}
163 api.gclient.c = src_cfg 164 api.gclient.c = src_cfg
164 result = api.bot_update.ensure_checkout(force=True) 165 result = api.bot_update.ensure_checkout(force=True)
165 build_properties.update(result.json.output.get("properties", {})) 166 build_properties.update(result.json.output.get("properties", {}))
166 # unpack tools step; generic ShellCommand converted 167 # unpack tools step; generic ShellCommand converted
167 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot', 168 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot',
168 'bot_tools', 'unpack.bat')], env={}, 169 'bot_tools', 'unpack.bat')], env={},
169 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools')) 170 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools'))
170 # dynamorio win nightly suite step 171 # dynamorio win nightly suite step
171 api.step("nightly suite", [api.path["build"].join("scripts", "slave", 172 api.step("nightly suite", [api.infra_paths['build'].join("scripts", "slave",
172 "drmemory", "build_env.bat"), 'ctest', '--timeout', '120', '-VV', '-S', 173 "drmemory", "build_env.bat"), 'ctest', '--timeout', '120', '-VV', '-S',
173 'dynamorio/suite/runsuite.cmake,nightly;long;'+\ 174 'dynamorio/suite/runsuite.cmake,nightly;long;'+\
174 'site=X64.Windows7.VS2010.BuildBot'], 175 'site=X64.Windows7.VS2010.BuildBot'],
175 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot", 176 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot",
176 "bot_tools")}, cwd=api.path["slave_build"]) 177 "bot_tools")}, cwd=api.infra_paths['slave_build'])
177 178
178 179
179 def win_8_dr_nightly_steps(api): 180 def win_8_dr_nightly_steps(api):
180 build_properties = api.properties.legacy() 181 build_properties = api.properties.legacy()
181 # checkout DynamiRIO step 182 # checkout DynamiRIO step
182 src_cfg = api.gclient.make_config(GIT_MODE=True) 183 src_cfg = api.gclient.make_config(GIT_MODE=True)
183 soln = src_cfg.solutions.add() 184 soln = src_cfg.solutions.add()
184 soln.name = "dynamorio" 185 soln.name = "dynamorio"
185 soln.url = "https://github.com/DynamoRIO/dynamorio.git" 186 soln.url = "https://github.com/DynamoRIO/dynamorio.git"
186 soln.custom_deps = {'dynamorio/tools/buildbot': 187 soln.custom_deps = {'dynamorio/tools/buildbot':
187 'https://github.com/DynamoRIO/buildbot.git'} 188 'https://github.com/DynamoRIO/buildbot.git'}
188 api.gclient.c = src_cfg 189 api.gclient.c = src_cfg
189 result = api.bot_update.ensure_checkout(force=True) 190 result = api.bot_update.ensure_checkout(force=True)
190 build_properties.update(result.json.output.get("properties", {})) 191 build_properties.update(result.json.output.get("properties", {}))
191 # unpack tools step; generic ShellCommand converted 192 # unpack tools step; generic ShellCommand converted
192 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot', 193 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot',
193 'bot_tools', 'unpack.bat')], env={}, 194 'bot_tools', 'unpack.bat')], env={},
194 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools')) 195 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools'))
195 # dynamorio win nightly suite step 196 # dynamorio win nightly suite step
196 api.step("nightly suite", [api.path["build"].join("scripts", "slave", 197 api.step("nightly suite", [api.infra_paths['build'].join("scripts", "slave",
197 "drmemory", "build_env.bat"), 'ctest', '--timeout', '120', '-VV', '-S', 198 "drmemory", "build_env.bat"), 'ctest', '--timeout', '120', '-VV', '-S',
198 'dynamorio/suite/runsuite.cmake,nightly;long;'+\ 199 'dynamorio/suite/runsuite.cmake,nightly;long;'+\
199 'site=X64.Windows8.VS2010.BuildBot'], 200 'site=X64.Windows8.VS2010.BuildBot'],
200 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot", 201 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot",
201 "bot_tools")}, cwd=api.path["slave_build"]) 202 "bot_tools")}, cwd=api.infra_paths['slave_build'])
202 203
203 204
204 def win_dr_package_steps(api): 205 def win_dr_package_steps(api):
205 build_properties = api.properties.legacy() 206 build_properties = api.properties.legacy()
206 # checkout DynamiRIO step 207 # checkout DynamiRIO step
207 src_cfg = api.gclient.make_config(GIT_MODE=True) 208 src_cfg = api.gclient.make_config(GIT_MODE=True)
208 soln = src_cfg.solutions.add() 209 soln = src_cfg.solutions.add()
209 soln.name = "dynamorio" 210 soln.name = "dynamorio"
210 soln.url = "https://github.com/DynamoRIO/dynamorio.git" 211 soln.url = "https://github.com/DynamoRIO/dynamorio.git"
211 soln.custom_deps = {'dynamorio/tools/buildbot': 212 soln.custom_deps = {'dynamorio/tools/buildbot':
212 'https://github.com/DynamoRIO/buildbot.git'} 213 'https://github.com/DynamoRIO/buildbot.git'}
213 api.gclient.c = src_cfg 214 api.gclient.c = src_cfg
214 result = api.bot_update.ensure_checkout(force=True) 215 result = api.bot_update.ensure_checkout(force=True)
215 build_properties.update(result.json.output.get("properties", {})) 216 build_properties.update(result.json.output.get("properties", {}))
216 # unpack tools step; generic ShellCommand converted 217 # unpack tools step; generic ShellCommand converted
217 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot', 218 api.step("unpack tools", [api.path["checkout"].join('tools', 'buildbot',
218 'bot_tools', 'unpack.bat')], env={}, 219 'bot_tools', 'unpack.bat')], env={},
219 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools')) 220 cwd=api.path["checkout"].join('tools', 'buildbot', 'bot_tools'))
220 # get buildnumber step; no longer needed 221 # get buildnumber step; no longer needed
221 # Package DynamoRIO step 222 # Package DynamoRIO step
222 api.step("Package DynamoRIO", [api.path["build"].join("scripts", "slave", 223 api.step("Package DynamoRIO", [api.infra_paths['build'].join("scripts", "slave ",
Sergiy Byelozyorov 2016/04/26 14:41:05 nit: long line
223 "drmemory", "build_env.bat"), "ctest", "-VV", "-S", 224 "drmemory", "build_env.bat"), "ctest", "-VV", "-S",
224 str(api.path["checkout"].join("make", "package.cmake")) + ",build=0x" + 225 str(api.path["checkout"].join("make", "package.cmake")) + ",build=0x" +
225 build_properties["got_revision"][:7]], 226 build_properties["got_revision"][:7]],
226 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot", 227 env={"BOTTOOLS": api.path["checkout"].join("tools", "buildbot",
227 "bot_tools")}) 228 "bot_tools")})
228 # find package file step; no longer necessary 229 # find package file step; no longer necessary
229 # upload dynamorio package 230 # upload dynamorio package
230 api.gsutil.upload("DynamoRIO-Windows-*" + 231 api.gsutil.upload("DynamoRIO-Windows-*" +
231 build_properties["got_revision"][:7] 232 build_properties["got_revision"][:7]
232 + ".zip", "chromium-dynamorio", "builds/") 233 + ".zip", "chromium-dynamorio", "builds/")
(...skipping 97 matching lines...) Expand 10 before | Expand all | Expand 10 after
330 api.properties(mastername='client.dynamorio') + 331 api.properties(mastername='client.dynamorio') +
331 api.properties(buildername='linux-dr-nightly') + 332 api.properties(buildername='linux-dr-nightly') +
332 api.properties(revision='123456789abcdef') + 333 api.properties(revision='123456789abcdef') +
333 api.properties(slavename='TestSlave') 334 api.properties(slavename='TestSlave')
334 ) 335 )
335 yield (api.test('builder_not_in_dispatch_directory') + 336 yield (api.test('builder_not_in_dispatch_directory') +
336 api.properties(mastername='client.dynamorio') + 337 api.properties(mastername='client.dynamorio') +
337 api.properties(buildername='nonexistent_builder') + 338 api.properties(buildername='nonexistent_builder') +
338 api.properties(slavename='TestSlave') 339 api.properties(slavename='TestSlave')
339 ) 340 )
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698