skir-cc-gen 0.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/README.md ADDED
@@ -0,0 +1,335 @@
1
+ [![npm](https://img.shields.io/npm/v/skir-cc-gen)](https://www.npmjs.com/package/skir-cc-gen)
2
+ [![build](https://github.com/gepheum/skir-cc-gen/workflows/Build/badge.svg)](https://github.com/gepheum/skir-cc-gen/actions)
3
+
4
+ # Skir's C++ Code Generator
5
+
6
+ Official plugin for generating C++ code from [.skir](https://github.com/gepheum/skir) files.
7
+
8
+ Targets C++17 and higher.
9
+
10
+ ## Installation
11
+
12
+ From your project's root directory, run `npm i --save-dev skir-cc-gen`.
13
+
14
+ In your `skir.yml` file, add the following snippet under `generators`:
15
+ ```yaml
16
+ - mod: skir-cc-gen
17
+ config:
18
+ writeGoogleTestHeaders: true
19
+ ```
20
+
21
+ The `npm run skir` command will now generate C++ code within the `skirout` directory.
22
+
23
+ For more information, see this C++ project [example](https://github.com/gepheum/skir-cc-example).
24
+
25
+ ## C++ generated code guide
26
+
27
+ The examples below are for the code generated from [this](https://github.com/gepheum/skir-cc-example/blob/main/skir_src/user.skir) .skir file.
28
+
29
+ ### Referring to generated symbols
30
+
31
+ Every generated symbol lives in a namespace called `skirout_${path}`,
32
+ where `${path}` is the path to the .skir file relative from the root of the
33
+ skir source directory, with the ".skir" extension removed, and slashes
34
+ replaced with underscores.
35
+
36
+ ```c++
37
+ #include "skirout/user.h"
38
+
39
+ using ::skirout_user::User;
40
+ using ::skirout_user::UserRegistry;
41
+ ```
42
+
43
+ ### Constructing structs
44
+
45
+ ```c++
46
+ // You can construct a struct like this:
47
+ User john;
48
+ john.user_id = 42;
49
+ john.name = "John Doe";
50
+
51
+ // Or you can use the designated initialized syntax:
52
+ User jane = {
53
+ // Keep fields in alphabetical order
54
+ .name = "Jane Doe",
55
+ .pets = {{
56
+ .name = "Fluffy",
57
+ .picture = "cat",
58
+ },
59
+ {
60
+ .name = "Rex",
61
+ .picture = "dog",
62
+ }},
63
+ .subscription_status = skirout::kPremium,
64
+ .user_id = 43,
65
+ };
66
+
67
+ // ${StructName}::whole forces you to initialize all the fields of the struct.
68
+ // You will get a compile-time error if you miss one.
69
+ User lyla = User::whole{
70
+ .name = "Lyla Doe",
71
+ .pets =
72
+ {
73
+ User::Pet::whole{
74
+ .height_in_meters = 0.05f,
75
+ .name = "Tiny",
76
+ .picture = "🐁",
77
+ },
78
+ },
79
+ .quote = "This is Lyla's world, you just live in it",
80
+ .subscription_status = skirout::kFree,
81
+ .user_id = 44,
82
+ };
83
+ ```
84
+
85
+ ### Constructing enums
86
+
87
+ ```c++
88
+
89
+ // Use skirout::${kFieldName} for constant variants.
90
+ User::SubscriptionStatus john_status = skirout::kFree;
91
+ User::SubscriptionStatus jane_status = skirout::kPremium;
92
+
93
+ // Compilation error: MONDAY is not a field of the SubscriptionStatus enum.
94
+ // User::SubscriptionStatus sara_status = skirout::kMonday;
95
+
96
+ // Use skirout::wrap_${field_name} for data variants.
97
+ User::SubscriptionStatus jade_status =
98
+ skirout::wrap_trial_start_time(absl::FromUnixMillis(1743682787000));
99
+
100
+ // The ${kFieldName} and wrap_${field_name} symbols are also defined in the
101
+ // generated class.
102
+ User::SubscriptionStatus lara_status = User::SubscriptionStatus::kFree;
103
+ ```
104
+
105
+ ### Conditions on enums
106
+
107
+ ```c++
108
+ if (john_status == skirout::kFree) {
109
+ std::cout << "John, would you like to upgrade to premium?\n";
110
+ }
111
+
112
+ // Call is_${field_name}() to check if the enum holds a data variant.
113
+ if (jade_status.is_trial_start_time()) {
114
+ // as_${field_name}() returns the value held by the enum
115
+ const absl::Time trial_start_time = jade_status.as_trial_start_time();
116
+ std::cout << "Jade's trial started on " << trial_start_time << "\n";
117
+ }
118
+
119
+ // One way to do an exhaustive switch on an enum.
120
+ switch (lara_status.kind()) {
121
+ case User::SubscriptionStatus::kind_type::kUnknown:
122
+ // UNKNOWN is the default value for an uninitialized SubscriptionStatus.
123
+ // ...
124
+ break;
125
+ case User::SubscriptionStatus::kind_type::kFreeConst:
126
+ // ...
127
+ break;
128
+ case User::SubscriptionStatus::kind_type::kPremiumConst:
129
+ // ...
130
+ break;
131
+ case User::SubscriptionStatus::kind_type::kTrialStartTimeWrapper: {
132
+ const absl::Time& trial_start_time = lara_status.as_trial_start_time();
133
+ std::cout << "Lara's trial started on " << trial_start_time << "\n";
134
+ }
135
+ }
136
+
137
+ // Another way to do an exhaustive switch using the visitor pattern.
138
+ struct Visitor {
139
+ void operator()(skirout::k_unknown) const {
140
+ std::cout << "Lara's subscription status is UNKNOWN\n";
141
+ }
142
+ void operator()(skirout::k_free) const {
143
+ std::cout << "Lara's subscription status is FREE\n";
144
+ }
145
+ void operator()(skirout::k_premium) const {
146
+ std::cout << "Lara's subscription status is PREMIUM\n";
147
+ }
148
+ void operator()(
149
+ User::SubscriptionStatus::wrap_trial_start_time_type& w) const {
150
+ const absl::Time& trial_start_time = w.value;
151
+ std::cout << "Lara's trial started on " << trial_start_time << "\n";
152
+ }
153
+ };
154
+ lara_status.visit(Visitor());
155
+ ```
156
+
157
+ ### Serialization
158
+
159
+ Use `ToDenseJson`, `ToReadableJson` or `ToBytes` to serialize a skir value.
160
+
161
+ ```c++
162
+ // Serialize a skir value to JSON with ToDenseJson or ToReadableJson.
163
+ std::cout << skir::ToDenseJson(john) << "\n";
164
+ // [42,"John Doe"]
165
+
166
+ std::cout << skir::ToReadableJson(john) << "\n";
167
+ // {
168
+ // "user_id": 42,
169
+ // "name": "John Doe"
170
+ // }
171
+
172
+ // The dense flavor is the flavor you should pick if you intend to
173
+ // deserialize the value in the future. Skir allows fields to be renamed, and
174
+ // because fields names are not part of the dense JSON, renaming a field does
175
+ // not prevent you from deserializing the value.
176
+ // You should pick the readable flavor mostly for debugging purposes.
177
+
178
+ // The binary format is not human readable, but it is a bit more compact than
179
+ // JSON, and serialization/deserialization can be a bit faster.
180
+ // Only use it when this small performance gain is likely to matter, which
181
+ // should be rare.
182
+ std::cout << skir::ToBytes(john).as_string() << "\n";
183
+ // skir�+Jane Doe����Fluffy�cat��Rex�dog
184
+ ```
185
+
186
+ ### Deserialization
187
+
188
+ Use `Parse` to deserialize a skir value from JSON or binary format.
189
+
190
+ ```c++
191
+ absl::StatusOr<User> maybe_john = skir::Parse<User>(skir::ToDenseJson(john));
192
+ assert(maybe_john.ok() && *maybe_john == john);
193
+ ```
194
+
195
+ ### Keyed arrays
196
+
197
+ A `keyed_items<T, get_key>` is a container that stores items of type T
198
+ and allows for fast lookups by key using a hash table.
199
+
200
+ ```c++
201
+ UserRegistry user_registry;
202
+ skir::keyed_items<User, skirout::get_user_id<>>& users = user_registry.users;
203
+ users.push_back(john);
204
+ users.push_back(jane);
205
+ users.push_back(lyla);
206
+
207
+ assert(users.size() == 3);
208
+ assert(users[0] == john);
209
+
210
+ const User* maybe_jane = users.find_or_null(43);
211
+ assert(maybe_jane != nullptr && *maybe_jane == jane);
212
+
213
+ assert(users.find_or_default(44).name == "Lyla Doe");
214
+ assert(users.find_or_default(45).name == "");
215
+ ```
216
+
217
+ ### Equality and hashing
218
+
219
+ Skir structs and enums are equality comparable and hashable.
220
+
221
+ ```c++
222
+ absl::flat_hash_set<User> user_set;
223
+ user_set.insert(john);
224
+ user_set.insert(jane);
225
+ user_set.insert(jane);
226
+ user_set.insert(lyla);
227
+
228
+ assert(user_set.size() == 3);
229
+ ```
230
+
231
+ ### Constants
232
+
233
+ ```c++
234
+ const User& tarzan = skirout_user::k_tarzan();
235
+ assert(tarzan.name == "Tarzan");
236
+ ```
237
+
238
+ ### Skir services
239
+
240
+ #### Starting a skir service on an HTTP server
241
+
242
+ Full example [here](https://github.com/gepheum/skir-cc-example/blob/main/service_start.cc).
243
+
244
+ #### Sending RPCs to a skir service
245
+
246
+ Full example [here](https://github.com/gepheum/skir-cc-example/blob/main/service_client.cc).
247
+
248
+ ### Dynamic reflection
249
+
250
+ ```c++
251
+ using ::skir::reflection::GetTypeDescriptor;
252
+ using ::skir::reflection::TypeDescriptor;
253
+
254
+ // A TypeDescriptor describes a skir type. It contains the definition of all
255
+ // the structs and enums referenced from the type.
256
+ const TypeDescriptor& user_descriptor = GetTypeDescriptor<User>();
257
+
258
+ // TypeDescriptor can be serialized/deserialized to/from JSON.
259
+
260
+ absl::StatusOr<TypeDescriptor> reserialized_type_descriptor =
261
+ TypeDescriptor::FromJson(user_descriptor.AsJson());
262
+ assert(reserialized_type_descriptor.ok());
263
+ ```
264
+
265
+ ### Static reflection
266
+
267
+ Static reflection allows you to inspect and modify values of generated
268
+ skir types in a typesafe maneer.
269
+
270
+ See [string_capitalizer.h](https://github.com/gepheum/skir-cc-example/blob/main/string_capitalizer.h).
271
+
272
+ ```c++
273
+ User tarzan_copy = skirout_user::k_tarzan();
274
+ // CapitalizeStrings recursively capitalizes all the strings found within a
275
+ // skir value.
276
+ CapitalizeStrings(tarzan_copy);
277
+
278
+ std::cout << tarzan_copy << "\n";
279
+ // {
280
+ // .user_id: 123,
281
+ // .name: "TARZAN",
282
+ // .quote: "AAAAAAAAAAYAAAAAAAAAAYAAAAAAAAAA",
283
+ // .pets: {
284
+ // {
285
+ // .name: "CHEETA",
286
+ // .height_in_meters: 1.67,
287
+ // .picture: "🐒",
288
+ // },
289
+ // },
290
+ // .subscription_status: ::skirout::wrap_trial_start_time(absl::FromUnixMillis(1743592409000 /* 2025-04-02T11:13:29+00:00 */)),
291
+ // }
292
+
293
+ // ...
294
+ ```
295
+
296
+ ### Writing unit tests with GoogleTest
297
+
298
+ Full example [here](https://github.com/gepheum/skir-cc-example/blob/main/example.test.cc).
299
+
300
+ #### Struct matchers
301
+
302
+ ```c++
303
+ const User john = {
304
+ .name = "John Doe",
305
+ .pets =
306
+ {
307
+ {.height_in_meters = 1.67, .name = "Cheeta", .picture = "🐒"},
308
+ },
309
+ .quote = "Life is like a box of chocolates.",
310
+ .user_id = 42,
311
+ };
312
+
313
+ EXPECT_THAT(john, (StructIs<User>{
314
+ // Only the specified fields are tested
315
+ .pets = testing::ElementsAre(StructIs<User::Pet>{
316
+ .height_in_meters = testing::FloatNear(1.7, 0.1),
317
+ }),
318
+ .quote = testing::StartsWith("Life is"),
319
+ .user_id = 42,
320
+ }));
321
+ ```
322
+
323
+ #### Enum matchers
324
+
325
+ ```c++
326
+ User::SubscriptionStatus john_status = skirout::kFree;
327
+
328
+ EXPECT_THAT(john_status, testing::Eq(skirout::kFree));
329
+
330
+ User::SubscriptionStatus jade_status =
331
+ skirout::wrap_trial_start_time(absl::FromUnixMillis(1743682787000));
332
+
333
+ EXPECT_THAT(jade_status, IsTrialStartTime());
334
+ EXPECT_THAT(jade_status, IsTrialStartTime(testing::Gt(absl::UnixEpoch())));
335
+ ```
@@ -0,0 +1,33 @@
1
+ cc_library(
2
+ name = "skir",
3
+ srcs = ["skir.cc"],
4
+ hdrs = ["skir.h"],
5
+ deps = [
6
+ "@abseil-cpp//absl/base",
7
+ "@abseil-cpp//absl/container:flat_hash_map",
8
+ "@abseil-cpp//absl/hash",
9
+ "@abseil-cpp//absl/log:absl_check",
10
+ "@abseil-cpp//absl/log:die_if_null",
11
+ "@abseil-cpp//absl/status",
12
+ "@abseil-cpp//absl/status:statusor",
13
+ "@abseil-cpp//absl/strings",
14
+ "@abseil-cpp//absl/time",
15
+ "@abseil-cpp//absl/types:optional",
16
+ "@abseil-cpp//absl/types:variant",
17
+ ],
18
+ visibility = ["//visibility:public"],
19
+ )
20
+
21
+ cc_library(
22
+ name = "skir.testing",
23
+ testonly = True,
24
+ srcs = [],
25
+ hdrs = ["skir.testing.h"],
26
+ deps = [
27
+ ":skir",
28
+ "@abseil-cpp//absl/base",
29
+ "@abseil-cpp//absl/log:die_if_null",
30
+ "@googletest//:gtest",
31
+ ],
32
+ visibility = ["//visibility:public"],
33
+ )
@@ -0,0 +1,11 @@
1
+ """MODULE.bazel"""
2
+
3
+ module(name = "skir-client")
4
+
5
+ # Choose the most recent version available at
6
+ # https://registry.bazel.build/modules/abseil-cpp
7
+ bazel_dep(name = "abseil-cpp", version = "20250814.0")
8
+
9
+ # Choose the most recent version available at
10
+ # https://registry.bazel.build/modules/googletest
11
+ bazel_dep(name = "googletest", version = "1.17.0")
@@ -0,0 +1,225 @@
1
+ {
2
+ "lockFileVersion": 24,
3
+ "registryFileHashes": {
4
+ "https://bcr.bazel.build/bazel_registry.json": "8a28e4aff06ee60aed2a8c281907fb8bcbf3b753c91fb5a5c57da3215d5b3497",
5
+ "https://bcr.bazel.build/modules/abseil-cpp/20210324.2/MODULE.bazel": "7cd0312e064fde87c8d1cd79ba06c876bd23630c83466e9500321be55c96ace2",
6
+ "https://bcr.bazel.build/modules/abseil-cpp/20211102.0/MODULE.bazel": "70390338f7a5106231d20620712f7cccb659cd0e9d073d1991c038eb9fc57589",
7
+ "https://bcr.bazel.build/modules/abseil-cpp/20230125.1/MODULE.bazel": "89047429cb0207707b2dface14ba7f8df85273d484c2572755be4bab7ce9c3a0",
8
+ "https://bcr.bazel.build/modules/abseil-cpp/20230802.0.bcr.1/MODULE.bazel": "1c8cec495288dccd14fdae6e3f95f772c1c91857047a098fad772034264cc8cb",
9
+ "https://bcr.bazel.build/modules/abseil-cpp/20230802.0/MODULE.bazel": "d253ae36a8bd9ee3c5955384096ccb6baf16a1b1e93e858370da0a3b94f77c16",
10
+ "https://bcr.bazel.build/modules/abseil-cpp/20230802.1/MODULE.bazel": "fa92e2eb41a04df73cdabeec37107316f7e5272650f81d6cc096418fe647b915",
11
+ "https://bcr.bazel.build/modules/abseil-cpp/20240116.1/MODULE.bazel": "37bcdb4440fbb61df6a1c296ae01b327f19e9bb521f9b8e26ec854b6f97309ed",
12
+ "https://bcr.bazel.build/modules/abseil-cpp/20240116.2/MODULE.bazel": "73939767a4686cd9a520d16af5ab440071ed75cec1a876bf2fcfaf1f71987a16",
13
+ "https://bcr.bazel.build/modules/abseil-cpp/20250127.1/MODULE.bazel": "c4a89e7ceb9bf1e25cf84a9f830ff6b817b72874088bf5141b314726e46a57c1",
14
+ "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/MODULE.bazel": "c43c16ca2c432566cdb78913964497259903ebe8fb7d9b57b38e9f1425b427b8",
15
+ "https://bcr.bazel.build/modules/abseil-cpp/20250814.0/source.json": "b88bff599ceaf0f56c264c749b1606f8485cec3b8c38ba30f88a4df9af142861",
16
+ "https://bcr.bazel.build/modules/apple_support/1.15.1/MODULE.bazel": "a0556fefca0b1bb2de8567b8827518f94db6a6e7e7d632b4c48dc5f865bc7c85",
17
+ "https://bcr.bazel.build/modules/apple_support/1.23.1/MODULE.bazel": "53763fed456a968cf919b3240427cf3a9d5481ec5466abc9d5dc51bc70087442",
18
+ "https://bcr.bazel.build/modules/apple_support/1.23.1/source.json": "d888b44312eb0ad2c21a91d026753f330caa48a25c9b2102fae75eb2b0dcfdd2",
19
+ "https://bcr.bazel.build/modules/bazel_features/1.1.1/MODULE.bazel": "27b8c79ef57efe08efccbd9dd6ef70d61b4798320b8d3c134fd571f78963dbcd",
20
+ "https://bcr.bazel.build/modules/bazel_features/1.11.0/MODULE.bazel": "f9382337dd5a474c3b7d334c2f83e50b6eaedc284253334cf823044a26de03e8",
21
+ "https://bcr.bazel.build/modules/bazel_features/1.15.0/MODULE.bazel": "d38ff6e517149dc509406aca0db3ad1efdd890a85e049585b7234d04238e2a4d",
22
+ "https://bcr.bazel.build/modules/bazel_features/1.17.0/MODULE.bazel": "039de32d21b816b47bd42c778e0454217e9c9caac4a3cf8e15c7231ee3ddee4d",
23
+ "https://bcr.bazel.build/modules/bazel_features/1.18.0/MODULE.bazel": "1be0ae2557ab3a72a57aeb31b29be347bcdc5d2b1eb1e70f39e3851a7e97041a",
24
+ "https://bcr.bazel.build/modules/bazel_features/1.19.0/MODULE.bazel": "59adcdf28230d220f0067b1f435b8537dd033bfff8db21335ef9217919c7fb58",
25
+ "https://bcr.bazel.build/modules/bazel_features/1.27.0/MODULE.bazel": "621eeee06c4458a9121d1f104efb80f39d34deff4984e778359c60eaf1a8cb65",
26
+ "https://bcr.bazel.build/modules/bazel_features/1.28.0/MODULE.bazel": "4b4200e6cbf8fa335b2c3f43e1d6ef3e240319c33d43d60cc0fbd4b87ece299d",
27
+ "https://bcr.bazel.build/modules/bazel_features/1.30.0/MODULE.bazel": "a14b62d05969a293b80257e72e597c2da7f717e1e69fa8b339703ed6731bec87",
28
+ "https://bcr.bazel.build/modules/bazel_features/1.30.0/source.json": "b07e17f067fe4f69f90b03b36ef1e08fe0d1f3cac254c1241a1818773e3423bc",
29
+ "https://bcr.bazel.build/modules/bazel_features/1.4.1/MODULE.bazel": "e45b6bb2350aff3e442ae1111c555e27eac1d915e77775f6fdc4b351b758b5d7",
30
+ "https://bcr.bazel.build/modules/bazel_features/1.9.1/MODULE.bazel": "8f679097876a9b609ad1f60249c49d68bfab783dd9be012faf9d82547b14815a",
31
+ "https://bcr.bazel.build/modules/bazel_skylib/1.0.3/MODULE.bazel": "bcb0fd896384802d1ad283b4e4eb4d718eebd8cb820b0a2c3a347fb971afd9d8",
32
+ "https://bcr.bazel.build/modules/bazel_skylib/1.1.1/MODULE.bazel": "1add3e7d93ff2e6998f9e118022c84d163917d912f5afafb3058e3d2f1545b5e",
33
+ "https://bcr.bazel.build/modules/bazel_skylib/1.2.0/MODULE.bazel": "44fe84260e454ed94ad326352a698422dbe372b21a1ac9f3eab76eb531223686",
34
+ "https://bcr.bazel.build/modules/bazel_skylib/1.2.1/MODULE.bazel": "f35baf9da0efe45fa3da1696ae906eea3d615ad41e2e3def4aeb4e8bc0ef9a7a",
35
+ "https://bcr.bazel.build/modules/bazel_skylib/1.3.0/MODULE.bazel": "20228b92868bf5cfc41bda7afc8a8ba2a543201851de39d990ec957b513579c5",
36
+ "https://bcr.bazel.build/modules/bazel_skylib/1.4.1/MODULE.bazel": "a0dcb779424be33100dcae821e9e27e4f2901d9dfd5333efe5ac6a8d7ab75e1d",
37
+ "https://bcr.bazel.build/modules/bazel_skylib/1.4.2/MODULE.bazel": "3bd40978e7a1fac911d5989e6b09d8f64921865a45822d8b09e815eaa726a651",
38
+ "https://bcr.bazel.build/modules/bazel_skylib/1.5.0/MODULE.bazel": "32880f5e2945ce6a03d1fbd588e9198c0a959bb42297b2cfaf1685b7bc32e138",
39
+ "https://bcr.bazel.build/modules/bazel_skylib/1.6.1/MODULE.bazel": "8fdee2dbaace6c252131c00e1de4b165dc65af02ea278476187765e1a617b917",
40
+ "https://bcr.bazel.build/modules/bazel_skylib/1.7.0/MODULE.bazel": "0db596f4563de7938de764cc8deeabec291f55e8ec15299718b93c4423e9796d",
41
+ "https://bcr.bazel.build/modules/bazel_skylib/1.7.1/MODULE.bazel": "3120d80c5861aa616222ec015332e5f8d3171e062e3e804a2a0253e1be26e59b",
42
+ "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/MODULE.bazel": "88ade7293becda963e0e3ea33e7d54d3425127e0a326e0d17da085a5f1f03ff6",
43
+ "https://bcr.bazel.build/modules/bazel_skylib/1.8.1/source.json": "7ebaefba0b03efe59cac88ed5bbc67bcf59a3eff33af937345ede2a38b2d368a",
44
+ "https://bcr.bazel.build/modules/buildozer/7.1.2/MODULE.bazel": "2e8dd40ede9c454042645fd8d8d0cd1527966aa5c919de86661e62953cd73d84",
45
+ "https://bcr.bazel.build/modules/buildozer/7.1.2/source.json": "c9028a501d2db85793a6996205c8de120944f50a0d570438fcae0457a5f9d1f8",
46
+ "https://bcr.bazel.build/modules/google_benchmark/1.8.2/MODULE.bazel": "a70cf1bba851000ba93b58ae2f6d76490a9feb74192e57ab8e8ff13c34ec50cb",
47
+ "https://bcr.bazel.build/modules/googletest/1.11.0/MODULE.bazel": "3a83f095183f66345ca86aa13c58b59f9f94a2f81999c093d4eeaa2d262d12f4",
48
+ "https://bcr.bazel.build/modules/googletest/1.14.0.bcr.1/MODULE.bazel": "22c31a561553727960057361aa33bf20fb2e98584bc4fec007906e27053f80c6",
49
+ "https://bcr.bazel.build/modules/googletest/1.14.0/MODULE.bazel": "cfbcbf3e6eac06ef9d85900f64424708cc08687d1b527f0ef65aa7517af8118f",
50
+ "https://bcr.bazel.build/modules/googletest/1.15.2/MODULE.bazel": "6de1edc1d26cafb0ea1a6ab3f4d4192d91a312fd2d360b63adaa213cd00b2108",
51
+ "https://bcr.bazel.build/modules/googletest/1.17.0/MODULE.bazel": "dbec758171594a705933a29fcf69293d2468c49ec1f2ebca65c36f504d72df46",
52
+ "https://bcr.bazel.build/modules/googletest/1.17.0/source.json": "38e4454b25fc30f15439c0378e57909ab1fd0a443158aa35aec685da727cd713",
53
+ "https://bcr.bazel.build/modules/jsoncpp/1.9.5/MODULE.bazel": "31271aedc59e815656f5736f282bb7509a97c7ecb43e927ac1a37966e0578075",
54
+ "https://bcr.bazel.build/modules/jsoncpp/1.9.5/source.json": "4108ee5085dd2885a341c7fab149429db457b3169b86eb081fa245eadf69169d",
55
+ "https://bcr.bazel.build/modules/libpfm/4.11.0/MODULE.bazel": "45061ff025b301940f1e30d2c16bea596c25b176c8b6b3087e92615adbd52902",
56
+ "https://bcr.bazel.build/modules/platforms/0.0.10/MODULE.bazel": "8cb8efaf200bdeb2150d93e162c40f388529a25852b332cec879373771e48ed5",
57
+ "https://bcr.bazel.build/modules/platforms/0.0.11/MODULE.bazel": "0daefc49732e227caa8bfa834d65dc52e8cc18a2faf80df25e8caea151a9413f",
58
+ "https://bcr.bazel.build/modules/platforms/0.0.4/MODULE.bazel": "9b328e31ee156f53f3c416a64f8491f7eb731742655a47c9eec4703a71644aee",
59
+ "https://bcr.bazel.build/modules/platforms/0.0.5/MODULE.bazel": "5733b54ea419d5eaf7997054bb55f6a1d0b5ff8aedf0176fef9eea44f3acda37",
60
+ "https://bcr.bazel.build/modules/platforms/0.0.6/MODULE.bazel": "ad6eeef431dc52aefd2d77ed20a4b353f8ebf0f4ecdd26a807d2da5aa8cd0615",
61
+ "https://bcr.bazel.build/modules/platforms/0.0.7/MODULE.bazel": "72fd4a0ede9ee5c021f6a8dd92b503e089f46c227ba2813ff183b71616034814",
62
+ "https://bcr.bazel.build/modules/platforms/0.0.8/MODULE.bazel": "9f142c03e348f6d263719f5074b21ef3adf0b139ee4c5133e2aa35664da9eb2d",
63
+ "https://bcr.bazel.build/modules/platforms/0.0.9/MODULE.bazel": "4a87a60c927b56ddd67db50c89acaa62f4ce2a1d2149ccb63ffd871d5ce29ebc",
64
+ "https://bcr.bazel.build/modules/platforms/1.0.0/MODULE.bazel": "f05feb42b48f1b3c225e4ccf351f367be0371411a803198ec34a389fb22aa580",
65
+ "https://bcr.bazel.build/modules/platforms/1.0.0/source.json": "f4ff1fd412e0246fd38c82328eb209130ead81d62dcd5a9e40910f867f733d96",
66
+ "https://bcr.bazel.build/modules/protobuf/21.7/MODULE.bazel": "a5a29bb89544f9b97edce05642fac225a808b5b7be74038ea3640fae2f8e66a7",
67
+ "https://bcr.bazel.build/modules/protobuf/27.0/MODULE.bazel": "7873b60be88844a0a1d8f80b9d5d20cfbd8495a689b8763e76c6372998d3f64c",
68
+ "https://bcr.bazel.build/modules/protobuf/27.1/MODULE.bazel": "703a7b614728bb06647f965264967a8ef1c39e09e8f167b3ca0bb1fd80449c0d",
69
+ "https://bcr.bazel.build/modules/protobuf/29.0-rc2/MODULE.bazel": "6241d35983510143049943fc0d57937937122baf1b287862f9dc8590fc4c37df",
70
+ "https://bcr.bazel.build/modules/protobuf/29.0/MODULE.bazel": "319dc8bf4c679ff87e71b1ccfb5a6e90a6dbc4693501d471f48662ac46d04e4e",
71
+ "https://bcr.bazel.build/modules/protobuf/29.0/source.json": "b857f93c796750eef95f0d61ee378f3420d00ee1dd38627b27193aa482f4f981",
72
+ "https://bcr.bazel.build/modules/protobuf/3.19.0/MODULE.bazel": "6b5fbb433f760a99a22b18b6850ed5784ef0e9928a72668b66e4d7ccd47db9b0",
73
+ "https://bcr.bazel.build/modules/pybind11_bazel/2.11.1/MODULE.bazel": "88af1c246226d87e65be78ed49ecd1e6f5e98648558c14ce99176da041dc378e",
74
+ "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/MODULE.bazel": "e6f4c20442eaa7c90d7190d8dc539d0ab422f95c65a57cc59562170c58ae3d34",
75
+ "https://bcr.bazel.build/modules/pybind11_bazel/2.12.0/source.json": "6900fdc8a9e95866b8c0d4ad4aba4d4236317b5c1cd04c502df3f0d33afed680",
76
+ "https://bcr.bazel.build/modules/re2/2023-09-01/MODULE.bazel": "cb3d511531b16cfc78a225a9e2136007a48cf8a677e4264baeab57fe78a80206",
77
+ "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/MODULE.bazel": "b4963dda9b31080be1905ef085ecd7dd6cd47c05c79b9cdf83ade83ab2ab271a",
78
+ "https://bcr.bazel.build/modules/re2/2024-07-02.bcr.1/source.json": "2ff292be6ef3340325ce8a045ecc326e92cbfab47c7cbab4bd85d28971b97ac4",
79
+ "https://bcr.bazel.build/modules/re2/2024-07-02/MODULE.bazel": "0eadc4395959969297cbcf31a249ff457f2f1d456228c67719480205aa306daa",
80
+ "https://bcr.bazel.build/modules/rules_android/0.1.1/MODULE.bazel": "48809ab0091b07ad0182defb787c4c5328bd3a278938415c00a7b69b50c4d3a8",
81
+ "https://bcr.bazel.build/modules/rules_android/0.1.1/source.json": "e6986b41626ee10bdc864937ffb6d6bf275bb5b9c65120e6137d56e6331f089e",
82
+ "https://bcr.bazel.build/modules/rules_cc/0.0.1/MODULE.bazel": "cb2aa0747f84c6c3a78dad4e2049c154f08ab9d166b1273835a8174940365647",
83
+ "https://bcr.bazel.build/modules/rules_cc/0.0.10/MODULE.bazel": "ec1705118f7eaedd6e118508d3d26deba2a4e76476ada7e0e3965211be012002",
84
+ "https://bcr.bazel.build/modules/rules_cc/0.0.13/MODULE.bazel": "0e8529ed7b323dad0775ff924d2ae5af7640b23553dfcd4d34344c7e7a867191",
85
+ "https://bcr.bazel.build/modules/rules_cc/0.0.14/MODULE.bazel": "5e343a3aac88b8d7af3b1b6d2093b55c347b8eefc2e7d1442f7a02dc8fea48ac",
86
+ "https://bcr.bazel.build/modules/rules_cc/0.0.15/MODULE.bazel": "6704c35f7b4a72502ee81f61bf88706b54f06b3cbe5558ac17e2e14666cd5dcc",
87
+ "https://bcr.bazel.build/modules/rules_cc/0.0.16/MODULE.bazel": "7661303b8fc1b4d7f532e54e9d6565771fea666fbdf839e0a86affcd02defe87",
88
+ "https://bcr.bazel.build/modules/rules_cc/0.0.17/MODULE.bazel": "2ae1d8f4238ec67d7185d8861cb0a2cdf4bc608697c331b95bf990e69b62e64a",
89
+ "https://bcr.bazel.build/modules/rules_cc/0.0.2/MODULE.bazel": "6915987c90970493ab97393024c156ea8fb9f3bea953b2f3ec05c34f19b5695c",
90
+ "https://bcr.bazel.build/modules/rules_cc/0.0.6/MODULE.bazel": "abf360251023dfe3efcef65ab9d56beefa8394d4176dd29529750e1c57eaa33f",
91
+ "https://bcr.bazel.build/modules/rules_cc/0.0.8/MODULE.bazel": "964c85c82cfeb6f3855e6a07054fdb159aced38e99a5eecf7bce9d53990afa3e",
92
+ "https://bcr.bazel.build/modules/rules_cc/0.0.9/MODULE.bazel": "836e76439f354b89afe6a911a7adf59a6b2518fafb174483ad78a2a2fde7b1c5",
93
+ "https://bcr.bazel.build/modules/rules_cc/0.1.1/MODULE.bazel": "2f0222a6f229f0bf44cd711dc13c858dad98c62d52bd51d8fc3a764a83125513",
94
+ "https://bcr.bazel.build/modules/rules_cc/0.2.0/MODULE.bazel": "b5c17f90458caae90d2ccd114c81970062946f49f355610ed89bebf954f5783c",
95
+ "https://bcr.bazel.build/modules/rules_cc/0.2.0/source.json": "5f7f4e578e950adbf194217d4b607237a8197fc53ba46c367b3d61a86ecf35c2",
96
+ "https://bcr.bazel.build/modules/rules_foreign_cc/0.9.0/MODULE.bazel": "c9e8c682bf75b0e7c704166d79b599f93b72cfca5ad7477df596947891feeef6",
97
+ "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/MODULE.bazel": "40c97d1144356f52905566c55811f13b299453a14ac7769dfba2ac38192337a8",
98
+ "https://bcr.bazel.build/modules/rules_fuzzing/0.5.2/source.json": "c8b1e2c717646f1702290959a3302a178fb639d987ab61d548105019f11e527e",
99
+ "https://bcr.bazel.build/modules/rules_java/4.0.0/MODULE.bazel": "5a78a7ae82cd1a33cef56dc578c7d2a46ed0dca12643ee45edbb8417899e6f74",
100
+ "https://bcr.bazel.build/modules/rules_java/5.3.5/MODULE.bazel": "a4ec4f2db570171e3e5eb753276ee4b389bae16b96207e9d3230895c99644b86",
101
+ "https://bcr.bazel.build/modules/rules_java/6.0.0/MODULE.bazel": "8a43b7df601a7ec1af61d79345c17b31ea1fedc6711fd4abfd013ea612978e39",
102
+ "https://bcr.bazel.build/modules/rules_java/6.4.0/MODULE.bazel": "e986a9fe25aeaa84ac17ca093ef13a4637f6107375f64667a15999f77db6c8f6",
103
+ "https://bcr.bazel.build/modules/rules_java/6.5.2/MODULE.bazel": "1d440d262d0e08453fa0c4d8f699ba81609ed0e9a9a0f02cd10b3e7942e61e31",
104
+ "https://bcr.bazel.build/modules/rules_java/7.10.0/MODULE.bazel": "530c3beb3067e870561739f1144329a21c851ff771cd752a49e06e3dc9c2e71a",
105
+ "https://bcr.bazel.build/modules/rules_java/7.12.2/MODULE.bazel": "579c505165ee757a4280ef83cda0150eea193eed3bef50b1004ba88b99da6de6",
106
+ "https://bcr.bazel.build/modules/rules_java/7.2.0/MODULE.bazel": "06c0334c9be61e6cef2c8c84a7800cef502063269a5af25ceb100b192453d4ab",
107
+ "https://bcr.bazel.build/modules/rules_java/7.3.2/MODULE.bazel": "50dece891cfdf1741ea230d001aa9c14398062f2b7c066470accace78e412bc2",
108
+ "https://bcr.bazel.build/modules/rules_java/7.6.1/MODULE.bazel": "2f14b7e8a1aa2f67ae92bc69d1ec0fa8d9f827c4e17ff5e5f02e91caa3b2d0fe",
109
+ "https://bcr.bazel.build/modules/rules_java/8.14.0/MODULE.bazel": "717717ed40cc69994596a45aec6ea78135ea434b8402fb91b009b9151dd65615",
110
+ "https://bcr.bazel.build/modules/rules_java/8.14.0/source.json": "8a88c4ca9e8759da53cddc88123880565c520503321e2566b4e33d0287a3d4bc",
111
+ "https://bcr.bazel.build/modules/rules_jvm_external/4.4.2/MODULE.bazel": "a56b85e418c83eb1839819f0b515c431010160383306d13ec21959ac412d2fe7",
112
+ "https://bcr.bazel.build/modules/rules_jvm_external/5.1/MODULE.bazel": "33f6f999e03183f7d088c9be518a63467dfd0be94a11d0055fe2d210f89aa909",
113
+ "https://bcr.bazel.build/modules/rules_jvm_external/5.2/MODULE.bazel": "d9351ba35217ad0de03816ef3ed63f89d411349353077348a45348b096615036",
114
+ "https://bcr.bazel.build/modules/rules_jvm_external/5.3/MODULE.bazel": "bf93870767689637164657731849fb887ad086739bd5d360d90007a581d5527d",
115
+ "https://bcr.bazel.build/modules/rules_jvm_external/6.1/MODULE.bazel": "75b5fec090dbd46cf9b7d8ea08cf84a0472d92ba3585b476f44c326eda8059c4",
116
+ "https://bcr.bazel.build/modules/rules_jvm_external/6.3/MODULE.bazel": "c998e060b85f71e00de5ec552019347c8bca255062c990ac02d051bb80a38df0",
117
+ "https://bcr.bazel.build/modules/rules_jvm_external/6.3/source.json": "6f5f5a5a4419ae4e37c35a5bb0a6ae657ed40b7abc5a5189111b47fcebe43197",
118
+ "https://bcr.bazel.build/modules/rules_kotlin/1.9.0/MODULE.bazel": "ef85697305025e5a61f395d4eaede272a5393cee479ace6686dba707de804d59",
119
+ "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/MODULE.bazel": "d269a01a18ee74d0335450b10f62c9ed81f2321d7958a2934e44272fe82dcef3",
120
+ "https://bcr.bazel.build/modules/rules_kotlin/1.9.6/source.json": "2faa4794364282db7c06600b7e5e34867a564ae91bda7cae7c29c64e9466b7d5",
121
+ "https://bcr.bazel.build/modules/rules_license/0.0.3/MODULE.bazel": "627e9ab0247f7d1e05736b59dbb1b6871373de5ad31c3011880b4133cafd4bd0",
122
+ "https://bcr.bazel.build/modules/rules_license/0.0.7/MODULE.bazel": "088fbeb0b6a419005b89cf93fe62d9517c0a2b8bb56af3244af65ecfe37e7d5d",
123
+ "https://bcr.bazel.build/modules/rules_license/1.0.0/MODULE.bazel": "a7fda60eefdf3d8c827262ba499957e4df06f659330bbe6cdbdb975b768bb65c",
124
+ "https://bcr.bazel.build/modules/rules_license/1.0.0/source.json": "a52c89e54cc311196e478f8382df91c15f7a2bfdf4c6cd0e2675cc2ff0b56efb",
125
+ "https://bcr.bazel.build/modules/rules_pkg/0.7.0/MODULE.bazel": "df99f03fc7934a4737122518bb87e667e62d780b610910f0447665a7e2be62dc",
126
+ "https://bcr.bazel.build/modules/rules_pkg/1.0.1/MODULE.bazel": "5b1df97dbc29623bccdf2b0dcd0f5cb08e2f2c9050aab1092fd39a41e82686ff",
127
+ "https://bcr.bazel.build/modules/rules_pkg/1.0.1/source.json": "bd82e5d7b9ce2d31e380dd9f50c111d678c3bdaca190cb76b0e1c71b05e1ba8a",
128
+ "https://bcr.bazel.build/modules/rules_proto/4.0.0/MODULE.bazel": "a7a7b6ce9bee418c1a760b3d84f83a299ad6952f9903c67f19e4edd964894e06",
129
+ "https://bcr.bazel.build/modules/rules_proto/5.3.0-21.7/MODULE.bazel": "e8dff86b0971688790ae75528fe1813f71809b5afd57facb44dad9e8eca631b7",
130
+ "https://bcr.bazel.build/modules/rules_proto/6.0.0-rc1/MODULE.bazel": "1e5b502e2e1a9e825eef74476a5a1ee524a92297085015a052510b09a1a09483",
131
+ "https://bcr.bazel.build/modules/rules_proto/6.0.2/MODULE.bazel": "ce916b775a62b90b61888052a416ccdda405212b6aaeb39522f7dc53431a5e73",
132
+ "https://bcr.bazel.build/modules/rules_proto/7.0.2/MODULE.bazel": "bf81793bd6d2ad89a37a40693e56c61b0ee30f7a7fdbaf3eabbf5f39de47dea2",
133
+ "https://bcr.bazel.build/modules/rules_proto/7.0.2/source.json": "1e5e7260ae32ef4f2b52fd1d0de8d03b606a44c91b694d2f1afb1d3b28a48ce1",
134
+ "https://bcr.bazel.build/modules/rules_python/0.10.2/MODULE.bazel": "cc82bc96f2997baa545ab3ce73f196d040ffb8756fd2d66125a530031cd90e5f",
135
+ "https://bcr.bazel.build/modules/rules_python/0.23.1/MODULE.bazel": "49ffccf0511cb8414de28321f5fcf2a31312b47c40cc21577144b7447f2bf300",
136
+ "https://bcr.bazel.build/modules/rules_python/0.25.0/MODULE.bazel": "72f1506841c920a1afec76975b35312410eea3aa7b63267436bfb1dd91d2d382",
137
+ "https://bcr.bazel.build/modules/rules_python/0.28.0/MODULE.bazel": "cba2573d870babc976664a912539b320cbaa7114cd3e8f053c720171cde331ed",
138
+ "https://bcr.bazel.build/modules/rules_python/0.31.0/MODULE.bazel": "93a43dc47ee570e6ec9f5779b2e64c1476a6ce921c48cc9a1678a91dd5f8fd58",
139
+ "https://bcr.bazel.build/modules/rules_python/0.33.2/MODULE.bazel": "3e036c4ad8d804a4dad897d333d8dce200d943df4827cb849840055be8d2e937",
140
+ "https://bcr.bazel.build/modules/rules_python/0.4.0/MODULE.bazel": "9208ee05fd48bf09ac60ed269791cf17fb343db56c8226a720fbb1cdf467166c",
141
+ "https://bcr.bazel.build/modules/rules_python/0.40.0/MODULE.bazel": "9d1a3cd88ed7d8e39583d9ffe56ae8a244f67783ae89b60caafc9f5cf318ada7",
142
+ "https://bcr.bazel.build/modules/rules_python/0.40.0/source.json": "939d4bd2e3110f27bfb360292986bb79fd8dcefb874358ccd6cdaa7bda029320",
143
+ "https://bcr.bazel.build/modules/rules_shell/0.2.0/MODULE.bazel": "fda8a652ab3c7d8fee214de05e7a9916d8b28082234e8d2c0094505c5268ed3c",
144
+ "https://bcr.bazel.build/modules/rules_shell/0.2.0/source.json": "7f27af3c28037d9701487c4744b5448d26537cc66cdef0d8df7ae85411f8de95",
145
+ "https://bcr.bazel.build/modules/stardoc/0.5.1/MODULE.bazel": "1a05d92974d0c122f5ccf09291442580317cdd859f07a8655f1db9a60374f9f8",
146
+ "https://bcr.bazel.build/modules/stardoc/0.5.3/MODULE.bazel": "c7f6948dae6999bf0db32c1858ae345f112cacf98f174c7a8bb707e41b974f1c",
147
+ "https://bcr.bazel.build/modules/stardoc/0.5.6/MODULE.bazel": "c43dabc564990eeab55e25ed61c07a1aadafe9ece96a4efabb3f8bf9063b71ef",
148
+ "https://bcr.bazel.build/modules/stardoc/0.7.0/MODULE.bazel": "05e3d6d30c099b6770e97da986c53bd31844d7f13d41412480ea265ac9e8079c",
149
+ "https://bcr.bazel.build/modules/stardoc/0.7.1/MODULE.bazel": "3548faea4ee5dda5580f9af150e79d0f6aea934fc60c1cc50f4efdd9420759e7",
150
+ "https://bcr.bazel.build/modules/stardoc/0.7.1/source.json": "b6500ffcd7b48cd72c29bb67bcac781e12701cc0d6d55d266a652583cfcdab01",
151
+ "https://bcr.bazel.build/modules/upb/0.0.0-20220923-a547704/MODULE.bazel": "7298990c00040a0e2f121f6c32544bab27d4452f80d9ce51349b1a28f3005c43",
152
+ "https://bcr.bazel.build/modules/zlib/1.2.11/MODULE.bazel": "07b389abc85fdbca459b69e2ec656ae5622873af3f845e1c9d80fe179f3effa0",
153
+ "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/MODULE.bazel": "eec517b5bbe5492629466e11dae908d043364302283de25581e3eb944326c4ca",
154
+ "https://bcr.bazel.build/modules/zlib/1.3.1.bcr.5/source.json": "22bc55c47af97246cfc093d0acf683a7869377de362b5d1c552c2c2e16b7a806",
155
+ "https://bcr.bazel.build/modules/zlib/1.3.1/MODULE.bazel": "751c9940dcfe869f5f7274e1295422a34623555916eb98c174c1e945594bf198"
156
+ },
157
+ "selectedYankedVersions": {},
158
+ "moduleExtensions": {
159
+ "@@rules_kotlin+//src/main/starlark/core/repositories:bzlmod_setup.bzl%rules_kotlin_extensions": {
160
+ "general": {
161
+ "bzlTransitiveDigest": "rL/34P1aFDq2GqVC2zCFgQ8nTuOC6ziogocpvG50Qz8=",
162
+ "usagesDigest": "QI2z8ZUR+mqtbwsf2fLqYdJAkPOHdOV+tF2yVAUgRzw=",
163
+ "recordedFileInputs": {},
164
+ "recordedDirentsInputs": {},
165
+ "envVariables": {},
166
+ "generatedRepoSpecs": {
167
+ "com_github_jetbrains_kotlin_git": {
168
+ "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_compiler_git_repository",
169
+ "attributes": {
170
+ "urls": [
171
+ "https://github.com/JetBrains/kotlin/releases/download/v1.9.23/kotlin-compiler-1.9.23.zip"
172
+ ],
173
+ "sha256": "93137d3aab9afa9b27cb06a824c2324195c6b6f6179d8a8653f440f5bd58be88"
174
+ }
175
+ },
176
+ "com_github_jetbrains_kotlin": {
177
+ "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:compiler.bzl%kotlin_capabilities_repository",
178
+ "attributes": {
179
+ "git_repository_name": "com_github_jetbrains_kotlin_git",
180
+ "compiler_version": "1.9.23"
181
+ }
182
+ },
183
+ "com_github_google_ksp": {
184
+ "repoRuleId": "@@rules_kotlin+//src/main/starlark/core/repositories:ksp.bzl%ksp_compiler_plugin_repository",
185
+ "attributes": {
186
+ "urls": [
187
+ "https://github.com/google/ksp/releases/download/1.9.23-1.0.20/artifacts.zip"
188
+ ],
189
+ "sha256": "ee0618755913ef7fd6511288a232e8fad24838b9af6ea73972a76e81053c8c2d",
190
+ "strip_version": "1.9.23-1.0.20"
191
+ }
192
+ },
193
+ "com_github_pinterest_ktlint": {
194
+ "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_file",
195
+ "attributes": {
196
+ "sha256": "01b2e0ef893383a50dbeb13970fe7fa3be36ca3e83259e01649945b09d736985",
197
+ "urls": [
198
+ "https://github.com/pinterest/ktlint/releases/download/1.3.0/ktlint"
199
+ ],
200
+ "executable": true
201
+ }
202
+ },
203
+ "rules_android": {
204
+ "repoRuleId": "@@bazel_tools//tools/build_defs/repo:http.bzl%http_archive",
205
+ "attributes": {
206
+ "sha256": "cd06d15dd8bb59926e4d65f9003bfc20f9da4b2519985c27e190cddc8b7a7806",
207
+ "strip_prefix": "rules_android-0.1.1",
208
+ "urls": [
209
+ "https://github.com/bazelbuild/rules_android/archive/v0.1.1.zip"
210
+ ]
211
+ }
212
+ }
213
+ },
214
+ "recordedRepoMappingEntries": [
215
+ [
216
+ "rules_kotlin+",
217
+ "bazel_tools",
218
+ "bazel_tools"
219
+ ]
220
+ ]
221
+ }
222
+ }
223
+ },
224
+ "facts": {}
225
+ }