blob: 0a6c3175d648a3d865186984ecbf78ad65c402a3 [file] [log] [blame]
Jingwen Chen8c1b97e2021-02-18 03:21:34 -05001// Copyright 2021 Google Inc. All rights reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15package bp2build
16
17import (
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020018 "testing"
19
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050020 "android/soong/android"
21 "android/soong/cc"
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050022)
23
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020024func registerCcObjectModuleTypes(ctx android.RegistrationContext) {
25 // Always register cc_defaults module factory
26 ctx.RegisterModuleType("cc_defaults", func() android.Module { return cc.DefaultsFactory() })
27}
28
29func runCcObjectTestCase(t *testing.T, tc bp2buildTestCase) {
Liz Kammere4982e82021-05-25 10:39:35 -040030 t.Helper()
Liz Kammer78cfdaa2021-11-08 12:56:31 -050031 (&tc).moduleTypeUnderTest = "cc_object"
32 (&tc).moduleTypeUnderTestFactory = cc.ObjectFactory
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020033 runBp2BuildTestCase(t, registerCcObjectModuleTypes, tc)
34}
35
36func TestCcObjectSimple(t *testing.T) {
37 runCcObjectTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -050038 description: "simple cc_object generates cc_object with include header dep",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020039 filesystem: map[string]string{
40 "a/b/foo.h": "",
41 "a/b/bar.h": "",
42 "a/b/exclude.c": "",
43 "a/b/c.c": "",
44 },
45 blueprint: `cc_object {
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050046 name: "foo",
47 local_include_dirs: ["include"],
Colin Cross6b8f4252021-07-22 11:39:44 -070048 system_shared_libs: [],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050049 cflags: [
50 "-Wno-gcc-compat",
51 "-Wall",
52 "-Werror",
53 ],
54 srcs: [
Jingwen Chendb120242021-02-23 00:46:47 -050055 "a/b/*.c"
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050056 ],
Jingwen Chendb120242021-02-23 00:46:47 -050057 exclude_srcs: ["a/b/exclude.c"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050058}
59`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -050060 expectedBazelTargets: []string{
61 makeBazelTarget("cc_object", "foo", attrNameToString{
62 "copts": `[
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050063 "-fno-addrsig",
64 "-Wno-gcc-compat",
65 "-Wall",
66 "-Werror",
Liz Kammer78cfdaa2021-11-08 12:56:31 -050067 ]`,
68 "local_includes": `[
Liz Kammer35687bc2021-09-10 10:07:07 -040069 "include",
70 ".",
Liz Kammer78cfdaa2021-11-08 12:56:31 -050071 ]`,
72 "srcs": `["a/b/c.c"]`,
73 "system_dynamic_deps": `[]`,
74 }),
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050075 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020076 })
77}
78
79func TestCcObjectDefaults(t *testing.T) {
80 runCcObjectTestCase(t, bp2buildTestCase{
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +020081 blueprint: `cc_object {
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050082 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -070083 system_shared_libs: [],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050084 srcs: [
85 "a/b/*.h",
86 "a/b/c.c"
87 ],
88
89 defaults: ["foo_defaults"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050090}
91
92cc_defaults {
93 name: "foo_defaults",
94 defaults: ["foo_bar_defaults"],
Jingwen Chen8c1b97e2021-02-18 03:21:34 -050095}
96
97cc_defaults {
98 name: "foo_bar_defaults",
99 cflags: [
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500100 "-Werror",
101 ],
102}
103`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500104 expectedBazelTargets: []string{
105 makeBazelTarget("cc_object", "foo", attrNameToString{
106 "copts": `[
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500107 "-Werror",
108 "-fno-addrsig",
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500109 ]`,
110 "local_includes": `["."]`,
111 "srcs": `["a/b/c.c"]`,
112 "system_dynamic_deps": `[]`,
113 }),
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200114 }})
115}
116
117func TestCcObjectCcObjetDepsInObjs(t *testing.T) {
118 runCcObjectTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500119 description: "cc_object with cc_object deps in objs props",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200120 filesystem: map[string]string{
121 "a/b/c.c": "",
122 "x/y/z.c": "",
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500123 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200124 blueprint: `cc_object {
Jingwen Chendb120242021-02-23 00:46:47 -0500125 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700126 system_shared_libs: [],
Jingwen Chendb120242021-02-23 00:46:47 -0500127 srcs: ["a/b/c.c"],
128 objs: ["bar"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400129 include_build_directory: false,
Jingwen Chendb120242021-02-23 00:46:47 -0500130}
131
132cc_object {
133 name: "bar",
Colin Cross6b8f4252021-07-22 11:39:44 -0700134 system_shared_libs: [],
Jingwen Chendb120242021-02-23 00:46:47 -0500135 srcs: ["x/y/z.c"],
Liz Kammer8337ea42021-09-10 10:06:32 -0400136 include_build_directory: false,
Jingwen Chendb120242021-02-23 00:46:47 -0500137}
138`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500139 expectedBazelTargets: []string{
140 makeBazelTarget("cc_object", "bar", attrNameToString{
141 "copts": `["-fno-addrsig"]`,
142 "srcs": `["x/y/z.c"]`,
143 "system_dynamic_deps": `[]`,
144 }), makeBazelTarget("cc_object", "foo", attrNameToString{
145 "copts": `["-fno-addrsig"]`,
146 "deps": `[":bar"]`,
147 "srcs": `["a/b/c.c"]`,
148 "system_dynamic_deps": `[]`,
149 }),
Liz Kammera4aa4302021-03-18 16:56:36 -0400150 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200151 })
152}
153
154func TestCcObjectIncludeBuildDirFalse(t *testing.T) {
155 runCcObjectTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500156 description: "cc_object with include_build_dir: false",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200157 filesystem: map[string]string{
158 "a/b/c.c": "",
159 "x/y/z.c": "",
160 },
161 blueprint: `cc_object {
Liz Kammera4aa4302021-03-18 16:56:36 -0400162 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700163 system_shared_libs: [],
Liz Kammera4aa4302021-03-18 16:56:36 -0400164 srcs: ["a/b/c.c"],
165 include_build_directory: false,
Liz Kammera4aa4302021-03-18 16:56:36 -0400166}
167`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500168 expectedBazelTargets: []string{
169 makeBazelTarget("cc_object", "foo", attrNameToString{
170 "copts": `["-fno-addrsig"]`,
171 "srcs": `["a/b/c.c"]`,
172 "system_dynamic_deps": `[]`,
173 }),
Jingwen Chendb120242021-02-23 00:46:47 -0500174 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200175 })
176}
177
178func TestCcObjectProductVariable(t *testing.T) {
179 runCcObjectTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500180 description: "cc_object with product variable",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200181 blueprint: `cc_object {
Liz Kammera060c452021-03-24 10:14:47 -0400182 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700183 system_shared_libs: [],
Liz Kammera060c452021-03-24 10:14:47 -0400184 include_build_directory: false,
185 product_variables: {
186 platform_sdk_version: {
187 asflags: ["-DPLATFORM_SDK_VERSION=%d"],
188 },
189 },
Chris Parsons69fa9f92021-07-13 11:47:44 -0400190 srcs: ["src.S"],
Liz Kammera060c452021-03-24 10:14:47 -0400191}
192`,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500193 expectedBazelTargets: []string{
194 makeBazelTarget("cc_object", "foo", attrNameToString{
195 "asflags": `select({
Liz Kammerba7a9c52021-05-26 08:45:30 -0400196 "//build/bazel/product_variables:platform_sdk_version": ["-DPLATFORM_SDK_VERSION=$(Platform_sdk_version)"],
Liz Kammer6fd7b3f2021-05-06 13:54:29 -0400197 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500198 })`,
199 "copts": `["-fno-addrsig"]`,
200 "srcs_as": `["src.S"]`,
201 "system_dynamic_deps": `[]`,
202 }),
Liz Kammera060c452021-03-24 10:14:47 -0400203 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200204 })
Jingwen Chen8c1b97e2021-02-18 03:21:34 -0500205}
Jingwen Chen5d864492021-02-24 07:20:12 -0500206
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200207func TestCcObjectCflagsOneArch(t *testing.T) {
208 runCcObjectTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500209 description: "cc_object setting cflags for one arch",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200210 blueprint: `cc_object {
Jingwen Chen5d864492021-02-24 07:20:12 -0500211 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700212 system_shared_libs: [],
Jingwen Chen07027912021-03-15 06:02:43 -0400213 srcs: ["a.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500214 arch: {
215 x86: {
Jingwen Chen07027912021-03-15 06:02:43 -0400216 cflags: ["-fPIC"], // string list
217 },
218 arm: {
Chris Parsons69fa9f92021-07-13 11:47:44 -0400219 srcs: ["arch/arm/file.cpp"], // label list
Jingwen Chen5d864492021-02-24 07:20:12 -0500220 },
221 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400222 include_build_directory: false,
Jingwen Chen5d864492021-02-24 07:20:12 -0500223}
224`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200225 expectedBazelTargets: []string{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500226 makeBazelTarget("cc_object", "foo", attrNameToString{
227 "copts": `["-fno-addrsig"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000228 "//build/bazel/platforms/arch:x86": ["-fPIC"],
Jingwen Chen07027912021-03-15 06:02:43 -0400229 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500230 })`,
231 "srcs": `["a.cpp"] + select({
Chris Parsons69fa9f92021-07-13 11:47:44 -0400232 "//build/bazel/platforms/arch:arm": ["arch/arm/file.cpp"],
Jingwen Chen07027912021-03-15 06:02:43 -0400233 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500234 })`,
235 "system_dynamic_deps": `[]`,
236 }),
Jingwen Chen5d864492021-02-24 07:20:12 -0500237 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200238 })
239}
240
241func TestCcObjectCflagsFourArch(t *testing.T) {
242 runCcObjectTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500243 description: "cc_object setting cflags for 4 architectures",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200244 blueprint: `cc_object {
Jingwen Chen5d864492021-02-24 07:20:12 -0500245 name: "foo",
Colin Cross6b8f4252021-07-22 11:39:44 -0700246 system_shared_libs: [],
Jingwen Chen07027912021-03-15 06:02:43 -0400247 srcs: ["base.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500248 arch: {
249 x86: {
Jingwen Chen07027912021-03-15 06:02:43 -0400250 srcs: ["x86.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500251 cflags: ["-fPIC"],
252 },
253 x86_64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400254 srcs: ["x86_64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500255 cflags: ["-fPIC"],
256 },
257 arm: {
Jingwen Chen07027912021-03-15 06:02:43 -0400258 srcs: ["arm.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500259 cflags: ["-Wall"],
260 },
261 arm64: {
Jingwen Chen07027912021-03-15 06:02:43 -0400262 srcs: ["arm64.cpp"],
Jingwen Chen5d864492021-02-24 07:20:12 -0500263 cflags: ["-Wall"],
264 },
265 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400266 include_build_directory: false,
Jingwen Chen5d864492021-02-24 07:20:12 -0500267}
268`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200269 expectedBazelTargets: []string{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500270 makeBazelTarget("cc_object", "foo", attrNameToString{
271 "copts": `["-fno-addrsig"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000272 "//build/bazel/platforms/arch:arm": ["-Wall"],
273 "//build/bazel/platforms/arch:arm64": ["-Wall"],
274 "//build/bazel/platforms/arch:x86": ["-fPIC"],
275 "//build/bazel/platforms/arch:x86_64": ["-fPIC"],
Jingwen Chen07027912021-03-15 06:02:43 -0400276 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500277 })`,
278 "srcs": `["base.cpp"] + select({
Jingwen Chenb4628eb2021-04-08 14:40:57 +0000279 "//build/bazel/platforms/arch:arm": ["arm.cpp"],
280 "//build/bazel/platforms/arch:arm64": ["arm64.cpp"],
281 "//build/bazel/platforms/arch:x86": ["x86.cpp"],
282 "//build/bazel/platforms/arch:x86_64": ["x86_64.cpp"],
Jingwen Chen07027912021-03-15 06:02:43 -0400283 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500284 })`,
285 "system_dynamic_deps": `[]`,
286 }),
Jingwen Chen5d864492021-02-24 07:20:12 -0500287 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200288 })
289}
290
Chris Parsonsa37e1952021-09-28 16:47:36 -0400291func TestCcObjectLinkerScript(t *testing.T) {
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200292 runCcObjectTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500293 description: "cc_object setting linker_script",
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200294 blueprint: `cc_object {
Jingwen Chenc1c26502021-04-05 10:35:13 +0000295 name: "foo",
Chris Parsonsa37e1952021-09-28 16:47:36 -0400296 srcs: ["base.cpp"],
297 linker_script: "bunny.lds",
298 include_build_directory: false,
299}
300`,
301 expectedBazelTargets: []string{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500302 makeBazelTarget("cc_object", "foo", attrNameToString{
303 "copts": `["-fno-addrsig"]`,
304 "linker_script": `"bunny.lds"`,
305 "srcs": `["base.cpp"]`,
306 }),
Chris Parsonsa37e1952021-09-28 16:47:36 -0400307 },
308 })
309}
310
311func TestCcObjectDepsAndLinkerScriptSelects(t *testing.T) {
312 runCcObjectTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500313 description: "cc_object setting deps and linker_script across archs",
Chris Parsonsa37e1952021-09-28 16:47:36 -0400314 blueprint: `cc_object {
315 name: "foo",
316 srcs: ["base.cpp"],
317 arch: {
318 x86: {
319 objs: ["x86_obj"],
320 linker_script: "x86.lds",
321 },
322 x86_64: {
323 objs: ["x86_64_obj"],
324 linker_script: "x86_64.lds",
325 },
326 arm: {
327 objs: ["arm_obj"],
328 linker_script: "arm.lds",
329 },
330 },
331 include_build_directory: false,
332}
333
334cc_object {
335 name: "x86_obj",
Colin Cross6b8f4252021-07-22 11:39:44 -0700336 system_shared_libs: [],
Chris Parsonsa37e1952021-09-28 16:47:36 -0400337 srcs: ["x86.cpp"],
338 include_build_directory: false,
339 bazel_module: { bp2build_available: false },
340}
341
342cc_object {
343 name: "x86_64_obj",
344 system_shared_libs: [],
345 srcs: ["x86_64.cpp"],
346 include_build_directory: false,
347 bazel_module: { bp2build_available: false },
348}
349
350cc_object {
351 name: "arm_obj",
352 system_shared_libs: [],
353 srcs: ["arm.cpp"],
354 include_build_directory: false,
355 bazel_module: { bp2build_available: false },
356}
357`,
358 expectedBazelTargets: []string{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500359 makeBazelTarget("cc_object", "foo", attrNameToString{
360 "copts": `["-fno-addrsig"]`,
361 "deps": `select({
Chris Parsonsa37e1952021-09-28 16:47:36 -0400362 "//build/bazel/platforms/arch:arm": [":arm_obj"],
363 "//build/bazel/platforms/arch:x86": [":x86_obj"],
364 "//build/bazel/platforms/arch:x86_64": [":x86_64_obj"],
365 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500366 })`,
367 "linker_script": `select({
Chris Parsonsa37e1952021-09-28 16:47:36 -0400368 "//build/bazel/platforms/arch:arm": "arm.lds",
369 "//build/bazel/platforms/arch:x86": "x86.lds",
370 "//build/bazel/platforms/arch:x86_64": "x86_64.lds",
371 "//conditions:default": None,
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500372 })`,
373 "srcs": `["base.cpp"]`,
374 }),
Chris Parsonsa37e1952021-09-28 16:47:36 -0400375 },
376 })
377}
378
379func TestCcObjectSelectOnLinuxAndBionicArchs(t *testing.T) {
380 runCcObjectTestCase(t, bp2buildTestCase{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500381 description: "cc_object setting srcs based on linux and bionic archs",
Chris Parsonsa37e1952021-09-28 16:47:36 -0400382 blueprint: `cc_object {
383 name: "foo",
Jingwen Chenc1c26502021-04-05 10:35:13 +0000384 srcs: ["base.cpp"],
385 target: {
Chris Parsonsa37e1952021-09-28 16:47:36 -0400386 linux_arm64: {
387 srcs: ["linux_arm64.cpp",]
Jingwen Chenc1c26502021-04-05 10:35:13 +0000388 },
Chris Parsonsa37e1952021-09-28 16:47:36 -0400389 linux_x86: {
390 srcs: ["linux_x86.cpp",]
Jingwen Chenc1c26502021-04-05 10:35:13 +0000391 },
Chris Parsonsa37e1952021-09-28 16:47:36 -0400392 bionic_arm64: {
393 srcs: ["bionic_arm64.cpp",]
Jingwen Chenc1c26502021-04-05 10:35:13 +0000394 },
395 },
Liz Kammer8337ea42021-09-10 10:06:32 -0400396 include_build_directory: false,
Jingwen Chenc1c26502021-04-05 10:35:13 +0000397}
398`,
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200399 expectedBazelTargets: []string{
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500400 makeBazelTarget("cc_object", "foo", attrNameToString{
401 "copts": `["-fno-addrsig"]`,
402 "srcs": `["base.cpp"] + select({
Chris Parsonsa37e1952021-09-28 16:47:36 -0400403 "//build/bazel/platforms/os_arch:android_arm64": [
Chris Parsonsa37e1952021-09-28 16:47:36 -0400404 "linux_arm64.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -0400405 "bionic_arm64.cpp",
Chris Parsonsa37e1952021-09-28 16:47:36 -0400406 ],
407 "//build/bazel/platforms/os_arch:android_x86": ["linux_x86.cpp"],
408 "//build/bazel/platforms/os_arch:linux_bionic_arm64": [
Chris Parsonsa37e1952021-09-28 16:47:36 -0400409 "linux_arm64.cpp",
Liz Kammer9bad9d62021-10-11 15:40:35 -0400410 "bionic_arm64.cpp",
Chris Parsonsa37e1952021-09-28 16:47:36 -0400411 ],
412 "//build/bazel/platforms/os_arch:linux_glibc_x86": ["linux_x86.cpp"],
413 "//build/bazel/platforms/os_arch:linux_musl_x86": ["linux_x86.cpp"],
Jingwen Chenc1c26502021-04-05 10:35:13 +0000414 "//conditions:default": [],
Liz Kammer78cfdaa2021-11-08 12:56:31 -0500415 })`,
416 }),
Jingwen Chenc1c26502021-04-05 10:35:13 +0000417 },
Lukacs T. Berkic1cc3b92021-05-21 09:37:00 +0200418 })
Jingwen Chen5d864492021-02-24 07:20:12 -0500419}