gitd-client 0.8.0 → 0.10.0

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.
@@ -0,0 +1,28 @@
1
+ /** A token of gitd's endpoint as gitd shows it, never its secret. */
2
+ export interface TokenInfo {
3
+ id: string;
4
+ /** The repository it reads. */
5
+ url: string;
6
+ /** The sandbox repository it pushes to, when writable. */
7
+ sandbox: string;
8
+ writable: boolean;
9
+ issuedAt: Date;
10
+ expiresAt: Date;
11
+ }
12
+ /** A token just issued: its secret, shown this once, and where the sandbox clones from. */
13
+ export interface IssuedToken {
14
+ secret: string;
15
+ cloneUrl: string;
16
+ /** The clone URL with the secret in it, for the sandbox's git: `git clone <this>`. */
17
+ authenticatedUrl: string;
18
+ info: TokenInfo;
19
+ }
20
+ export interface IssueTokenOptions {
21
+ /** The branch the sandbox starts from; default the repository's default branch. */
22
+ branch?: string;
23
+ /** How long the token lives, in seconds: an hour by default, a day at most. */
24
+ lifetimeSeconds?: number;
25
+ readOnly?: boolean;
26
+ /** A sandbox repository from an earlier token, to keep pushing to. */
27
+ sandbox?: string;
28
+ }
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,18 @@
1
+ import type { Client } from "@connectrpc/connect";
2
+ import type { EndpointService } from "./gen/gitd/v1/gitd_pb.js";
3
+ import type { IssuedToken, IssueTokenOptions, TokenInfo } from "./endpoint-types.js";
4
+ /**
5
+ * gitd's endpoint, as `gitd.endpoint`: tokens for sandboxes that clone over HTTP instead of
6
+ * mounting a workspace. What a sandbox pushes is published with `gitd.publish("", branch,
7
+ * { sandbox })`.
8
+ */
9
+ export declare class Endpoint {
10
+ private readonly endpoint;
11
+ constructor(endpoint: Client<typeof EndpointService>);
12
+ /** A token for a sandbox: it reads url and pushes to its own sandbox repository. */
13
+ issue(url: string, options?: IssueTokenOptions): Promise<IssuedToken>;
14
+ /** Ends a token now, and removes its sandbox repository when asked. */
15
+ revoke(id: string, removeSandbox?: boolean): Promise<void>;
16
+ /** The tokens alive, never their secrets. */
17
+ tokens(): Promise<TokenInfo[]>;
18
+ }
@@ -0,0 +1,49 @@
1
+ import { timestampDate } from "@bufbuild/protobuf/wkt";
2
+ import { call } from "./calls.js";
3
+ /**
4
+ * gitd's endpoint, as `gitd.endpoint`: tokens for sandboxes that clone over HTTP instead of
5
+ * mounting a workspace. What a sandbox pushes is published with `gitd.publish("", branch,
6
+ * { sandbox })`.
7
+ */
8
+ export class Endpoint {
9
+ endpoint;
10
+ constructor(endpoint) {
11
+ this.endpoint = endpoint;
12
+ }
13
+ /** A token for a sandbox: it reads url and pushes to its own sandbox repository. */
14
+ async issue(url, options = {}) {
15
+ const answer = await call(() => this.endpoint.issueToken({
16
+ url,
17
+ branch: options.branch ?? "",
18
+ lifetimeSeconds: BigInt(options.lifetimeSeconds ?? 0),
19
+ readOnly: options.readOnly ?? false,
20
+ sandbox: options.sandbox ?? "",
21
+ }));
22
+ const [scheme, rest] = answer.cloneUrl.split("://", 2);
23
+ return {
24
+ secret: answer.token,
25
+ cloneUrl: answer.cloneUrl,
26
+ authenticatedUrl: rest ? `${scheme}://x:${answer.token}@${rest}` : answer.cloneUrl,
27
+ info: toTokenInfo(answer.info),
28
+ };
29
+ }
30
+ /** Ends a token now, and removes its sandbox repository when asked. */
31
+ async revoke(id, removeSandbox = false) {
32
+ await call(() => this.endpoint.revokeToken({ id, removeSandbox }));
33
+ }
34
+ /** The tokens alive, never their secrets. */
35
+ async tokens() {
36
+ const answer = await call(() => this.endpoint.listTokens({}));
37
+ return answer.tokens.map(toTokenInfo);
38
+ }
39
+ }
40
+ function toTokenInfo(info) {
41
+ return {
42
+ id: info?.id ?? "",
43
+ url: info?.url ?? "",
44
+ sandbox: info?.sandbox ?? "",
45
+ writable: info?.writable ?? false,
46
+ issuedAt: info?.issuedAt ? timestampDate(info.issuedAt) : new Date(0),
47
+ expiresAt: info?.expiresAt ? timestampDate(info.expiresAt) : new Date(0),
48
+ };
49
+ }
@@ -268,7 +268,13 @@ export declare enum GitFailure_Reason {
268
268
  *
269
269
  * @generated from enum value: REASON_UNSUPPORTED = 14;
270
270
  */
271
- UNSUPPORTED = 14
271
+ UNSUPPORTED = 14,
272
+ /**
273
+ * A limit of the tenant is reached: its workspaces, its disk or its tokens.
274
+ *
275
+ * @generated from enum value: REASON_LIMIT_REACHED = 15;
276
+ */
277
+ LIMIT_REACHED = 15
272
278
  }
273
279
  /**
274
280
  * Describes the enum gitd.v1.GitFailure.Reason.
@@ -328,6 +334,15 @@ export type PrepareRequest = Message<"gitd.v1.PrepareRequest"> & {
328
334
  * @generated from field: string warm = 8;
329
335
  */
330
336
  warm: string;
337
+ /**
338
+ * The workspace names its pool by a path inside itself, `.git/gitd-pool`, where whoever
339
+ * mounts the workspace elsewhere — the CSI driver into a pod — mounts the pool's objects
340
+ * read-only (WorkspaceResult.pool_objects), so that it works wherever it is mounted. gitd
341
+ * accepts it only while that is truly the pool's objects directory, mounted there.
342
+ *
343
+ * @generated from field: bool pool_inside = 9;
344
+ */
345
+ poolInside: boolean;
331
346
  };
332
347
  /**
333
348
  * Describes the message gitd.v1.PrepareRequest.
@@ -428,6 +443,13 @@ export type WorkspaceResult = Message<"gitd.v1.WorkspaceResult"> & {
428
443
  * @generated from field: repeated string lfs_patterns = 6;
429
444
  */
430
445
  lfsPatterns: string[];
446
+ /**
447
+ * With pool_inside: the pool's objects directory, to mount read-only at the workspace's
448
+ * `.git/gitd-pool`.
449
+ *
450
+ * @generated from field: string pool_objects = 7;
451
+ */
452
+ poolObjects: string;
431
453
  };
432
454
  /**
433
455
  * Describes the message gitd.v1.WorkspaceResult.
@@ -917,6 +939,14 @@ export type PublishRequest = Message<"gitd.v1.PublishRequest"> & {
917
939
  * @generated from field: gitd.v1.Provenance provenance = 6;
918
940
  */
919
941
  provenance?: Provenance | undefined;
942
+ /**
943
+ * Publish what a sandbox pushed through the endpoint instead of a workspace: the ID of
944
+ * its sandbox repository, with path left empty. branch names the branch it pushed there,
945
+ * published under the same name.
946
+ *
947
+ * @generated from field: string sandbox = 7;
948
+ */
949
+ sandbox: string;
920
950
  };
921
951
  /**
922
952
  * Describes the message gitd.v1.PublishRequest.
@@ -1783,6 +1813,12 @@ export type AuditEntry = Message<"gitd.v1.AuditEntry"> & {
1783
1813
  * @generated from field: gitd.v1.Provenance provenance = 12;
1784
1814
  */
1785
1815
  provenance?: Provenance | undefined;
1816
+ /**
1817
+ * The sandbox repository published from, when it was not a workspace.
1818
+ *
1819
+ * @generated from field: string sandbox = 13;
1820
+ */
1821
+ sandbox: string;
1786
1822
  };
1787
1823
  /**
1788
1824
  * Describes the message gitd.v1.AuditEntry.
@@ -1800,7 +1836,7 @@ export type ConfigurationChange = Message<"gitd.v1.ConfigurationChange"> & {
1800
1836
  */
1801
1837
  action: ConfigurationChange_Action;
1802
1838
  /**
1803
- * The connection's ID, the settings' prefix, or the preset's name.
1839
+ * The connection's ID, the settings' prefix, the preset's name, or the token's ID.
1804
1840
  *
1805
1841
  * @generated from field: string subject = 2;
1806
1842
  */
@@ -1848,7 +1884,15 @@ export declare enum ConfigurationChange_Action {
1848
1884
  /**
1849
1885
  * @generated from enum value: ACTION_PRESET_REMOVED = 6;
1850
1886
  */
1851
- PRESET_REMOVED = 6
1887
+ PRESET_REMOVED = 6,
1888
+ /**
1889
+ * @generated from enum value: ACTION_TOKEN_ISSUED = 7;
1890
+ */
1891
+ TOKEN_ISSUED = 7,
1892
+ /**
1893
+ * @generated from enum value: ACTION_TOKEN_REVOKED = 8;
1894
+ */
1895
+ TOKEN_REVOKED = 8
1852
1896
  }
1853
1897
  /**
1854
1898
  * Describes the enum gitd.v1.ConfigurationChange.Action.
@@ -2600,6 +2644,159 @@ export type RemovePresetResponse = Message<"gitd.v1.RemovePresetResponse"> & {};
2600
2644
  * Use `create(RemovePresetResponseSchema)` to create a new message.
2601
2645
  */
2602
2646
  export declare const RemovePresetResponseSchema: GenMessage<RemovePresetResponse>;
2647
+ /**
2648
+ * @generated from message gitd.v1.IssueTokenRequest
2649
+ */
2650
+ export type IssueTokenRequest = Message<"gitd.v1.IssueTokenRequest"> & {
2651
+ /**
2652
+ * @generated from field: string url = 1;
2653
+ */
2654
+ url: string;
2655
+ /**
2656
+ * The branch the sandbox starts from; empty for the repository's default branch.
2657
+ *
2658
+ * @generated from field: string branch = 2;
2659
+ */
2660
+ branch: string;
2661
+ /**
2662
+ * How long the token lives: an hour when zero, a day at most.
2663
+ *
2664
+ * @generated from field: int64 lifetime_seconds = 3;
2665
+ */
2666
+ lifetimeSeconds: bigint;
2667
+ /**
2668
+ * A token that clones and fetches only.
2669
+ *
2670
+ * @generated from field: bool read_only = 4;
2671
+ */
2672
+ readOnly: boolean;
2673
+ /**
2674
+ * A sandbox repository the token writes to, from an earlier token; empty makes a new one.
2675
+ *
2676
+ * @generated from field: string sandbox = 5;
2677
+ */
2678
+ sandbox: string;
2679
+ };
2680
+ /**
2681
+ * Describes the message gitd.v1.IssueTokenRequest.
2682
+ * Use `create(IssueTokenRequestSchema)` to create a new message.
2683
+ */
2684
+ export declare const IssueTokenRequestSchema: GenMessage<IssueTokenRequest>;
2685
+ /**
2686
+ * @generated from message gitd.v1.IssueTokenResponse
2687
+ */
2688
+ export type IssueTokenResponse = Message<"gitd.v1.IssueTokenResponse"> & {
2689
+ /**
2690
+ * The token, shown this once: gitd keeps only its hash.
2691
+ *
2692
+ * @generated from field: string token = 1;
2693
+ */
2694
+ token: string;
2695
+ /**
2696
+ * @generated from field: gitd.v1.TokenInfo info = 2;
2697
+ */
2698
+ info?: TokenInfo | undefined;
2699
+ /**
2700
+ * Where the sandbox clones from, e.g. `https://gitd.internal:9420/git/github.com/acme/web.git`,
2701
+ * with the token as the password: `git clone https://x:<token>@…`.
2702
+ *
2703
+ * @generated from field: string clone_url = 3;
2704
+ */
2705
+ cloneUrl: string;
2706
+ };
2707
+ /**
2708
+ * Describes the message gitd.v1.IssueTokenResponse.
2709
+ * Use `create(IssueTokenResponseSchema)` to create a new message.
2710
+ */
2711
+ export declare const IssueTokenResponseSchema: GenMessage<IssueTokenResponse>;
2712
+ /**
2713
+ * A token as gitd shows it, never its secret.
2714
+ *
2715
+ * @generated from message gitd.v1.TokenInfo
2716
+ */
2717
+ export type TokenInfo = Message<"gitd.v1.TokenInfo"> & {
2718
+ /**
2719
+ * @generated from field: string id = 1;
2720
+ */
2721
+ id: string;
2722
+ /**
2723
+ * @generated from field: string url = 2;
2724
+ */
2725
+ url: string;
2726
+ /**
2727
+ * @generated from field: string sandbox = 3;
2728
+ */
2729
+ sandbox: string;
2730
+ /**
2731
+ * @generated from field: bool writable = 4;
2732
+ */
2733
+ writable: boolean;
2734
+ /**
2735
+ * @generated from field: google.protobuf.Timestamp issued_at = 5;
2736
+ */
2737
+ issuedAt?: Timestamp | undefined;
2738
+ /**
2739
+ * @generated from field: google.protobuf.Timestamp expires_at = 6;
2740
+ */
2741
+ expiresAt?: Timestamp | undefined;
2742
+ };
2743
+ /**
2744
+ * Describes the message gitd.v1.TokenInfo.
2745
+ * Use `create(TokenInfoSchema)` to create a new message.
2746
+ */
2747
+ export declare const TokenInfoSchema: GenMessage<TokenInfo>;
2748
+ /**
2749
+ * @generated from message gitd.v1.RevokeTokenRequest
2750
+ */
2751
+ export type RevokeTokenRequest = Message<"gitd.v1.RevokeTokenRequest"> & {
2752
+ /**
2753
+ * @generated from field: string id = 1;
2754
+ */
2755
+ id: string;
2756
+ /**
2757
+ * Remove its sandbox repository too, with whatever was pushed there and not published.
2758
+ *
2759
+ * @generated from field: bool remove_sandbox = 2;
2760
+ */
2761
+ removeSandbox: boolean;
2762
+ };
2763
+ /**
2764
+ * Describes the message gitd.v1.RevokeTokenRequest.
2765
+ * Use `create(RevokeTokenRequestSchema)` to create a new message.
2766
+ */
2767
+ export declare const RevokeTokenRequestSchema: GenMessage<RevokeTokenRequest>;
2768
+ /**
2769
+ * @generated from message gitd.v1.RevokeTokenResponse
2770
+ */
2771
+ export type RevokeTokenResponse = Message<"gitd.v1.RevokeTokenResponse"> & {};
2772
+ /**
2773
+ * Describes the message gitd.v1.RevokeTokenResponse.
2774
+ * Use `create(RevokeTokenResponseSchema)` to create a new message.
2775
+ */
2776
+ export declare const RevokeTokenResponseSchema: GenMessage<RevokeTokenResponse>;
2777
+ /**
2778
+ * @generated from message gitd.v1.ListTokensRequest
2779
+ */
2780
+ export type ListTokensRequest = Message<"gitd.v1.ListTokensRequest"> & {};
2781
+ /**
2782
+ * Describes the message gitd.v1.ListTokensRequest.
2783
+ * Use `create(ListTokensRequestSchema)` to create a new message.
2784
+ */
2785
+ export declare const ListTokensRequestSchema: GenMessage<ListTokensRequest>;
2786
+ /**
2787
+ * @generated from message gitd.v1.ListTokensResponse
2788
+ */
2789
+ export type ListTokensResponse = Message<"gitd.v1.ListTokensResponse"> & {
2790
+ /**
2791
+ * @generated from field: repeated gitd.v1.TokenInfo tokens = 1;
2792
+ */
2793
+ tokens: TokenInfo[];
2794
+ };
2795
+ /**
2796
+ * Describes the message gitd.v1.ListTokensResponse.
2797
+ * Use `create(ListTokensResponseSchema)` to create a new message.
2798
+ */
2799
+ export declare const ListTokensResponseSchema: GenMessage<ListTokensResponse>;
2603
2800
  /**
2604
2801
  * How a workspace was made.
2605
2802
  *
@@ -3021,3 +3218,44 @@ export declare const PublishingService: GenService<{
3021
3218
  output: typeof RemovePresetResponseSchema;
3022
3219
  };
3023
3220
  }>;
3221
+ /**
3222
+ * gitd's git endpoint, for sandboxes that cannot mount its directories — microVMs, remote
3223
+ * sandboxes, CI runners elsewhere — and clone over HTTP instead. A token of gitd's own opens
3224
+ * one repository for reading and one sandbox repository for writing; it is never the git
3225
+ * host's credential. What a sandbox pushed is published with Publish and `sandbox`.
3226
+ *
3227
+ * @generated from service gitd.v1.EndpointService
3228
+ */
3229
+ export declare const EndpointService: GenService<{
3230
+ /**
3231
+ * A token for a sandbox, with the address it clones from. The repository's pool is
3232
+ * synced first, with the credential gitd keeps.
3233
+ *
3234
+ * @generated from rpc gitd.v1.EndpointService.IssueToken
3235
+ */
3236
+ issueToken: {
3237
+ methodKind: "unary";
3238
+ input: typeof IssueTokenRequestSchema;
3239
+ output: typeof IssueTokenResponseSchema;
3240
+ };
3241
+ /**
3242
+ * End a token now, and remove its sandbox repository when asked.
3243
+ *
3244
+ * @generated from rpc gitd.v1.EndpointService.RevokeToken
3245
+ */
3246
+ revokeToken: {
3247
+ methodKind: "unary";
3248
+ input: typeof RevokeTokenRequestSchema;
3249
+ output: typeof RevokeTokenResponseSchema;
3250
+ };
3251
+ /**
3252
+ * The tokens alive, never their secrets.
3253
+ *
3254
+ * @generated from rpc gitd.v1.EndpointService.ListTokens
3255
+ */
3256
+ listTokens: {
3257
+ methodKind: "unary";
3258
+ input: typeof ListTokensRequestSchema;
3259
+ output: typeof ListTokensResponseSchema;
3260
+ };
3261
+ }>;
@@ -6,7 +6,7 @@ import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
6
6
  /**
7
7
  * Describes the file gitd/v1/gitd.proto.
8
8
  */
9
- export const file_gitd_v1_gitd = /*@__PURE__*/ fileDesc("ChJnaXRkL3YxL2dpdGQucHJvdG8SB2dpdGQudjEibQoKQ3JlZGVudGlhbBISCgp1cmxfcHJlZml4GAEgASgJEhUKC2h0dHBzX3Rva2VuGAIgASgJSAASFgoMc3NoX2tleV9wYXRoGAMgASgJSAASEgoKaHR0cHNfdXNlchgEIAEoCUIICgZzZWNyZXQiOAoIUmV2aXNpb24SEAoGYnJhbmNoGAEgASgJSAASEAoGY29tbWl0GAIgASgJSABCCAoGdGFyZ2V0Ij4KCFByb2dyZXNzEg0KBXBoYXNlGAEgASgJEg8KB3BlcmNlbnQYAiABKAUSEgoKcmVwb3NpdG9yeRgDIAEoCSJQCg5TdWJtb2R1bGVTdGF0ZRIMCgRwYXRoGAEgASgJEgsKA3VybBgCIAEoCRIOCgZjb21taXQYAyABKAkSEwoLY2hlY2tlZF9vdXQYBCABKAgiUwoQUGVuZGluZ1N1Ym1vZHVsZRILCgN1cmwYASABKAkSDAoEcGF0aBgCIAEoCRIkCgdmYWlsdXJlGAMgASgLMhMuZ2l0ZC52MS5HaXRGYWlsdXJlIswDCgpHaXRGYWlsdXJlEioKBnJlYXNvbhgBIAEoDjIaLmdpdGQudjEuR2l0RmFpbHVyZS5SZWFzb24SEAoIZ2l0X3NhaWQYAiABKAkSEgoKcmVwb3NpdG9yeRgDIAEoCSLrAgoGUmVhc29uEhYKElJFQVNPTl9VTlNQRUNJRklFRBAAEhgKFFJFQVNPTl9BVVRIX1JFUVVJUkVEEAESFwoTUkVBU09OX0FVVEhfUkVGVVNFRBACEhQKEFJFQVNPTl9OT1RfRk9VTkQQAxIWChJSRUFTT05fQkFEX0FERFJFU1MQBBIXChNSRUFTT05fUEFUSF9SRUZVU0VEEAUSDwoLUkVBU09OX0JVU1kQBhISCg5SRUFTT05fVElNRU9VVBAHEhIKDlJFQVNPTl9DT1JSVVBUEAgSFQoRUkVBU09OX0dJVF9GQUlMRUQQCRIWChJSRUFTT05fTk9USElOR19ORVcQChIZChVSRUFTT05fQlJBTkNIX1JFRlVTRUQQCxIZChVSRUFTT05fQ09ORklHX1JFRlVTRUQQDBIZChVSRUFTT05fUE9MSUNZX1JFRlVTRUQQDRIWChJSRUFTT05fVU5TVVBQT1JURUQQDiLcAQoOUHJlcGFyZVJlcXVlc3QSCwoDdXJsGAEgASgJEgwKBHBhdGgYAiABKAkSIwoIcmV2aXNpb24YAyABKAsyES5naXRkLnYxLlJldmlzaW9uEhcKD3dpdGhfc3VibW9kdWxlcxgEIAEoCBIoCgtjcmVkZW50aWFscxgFIAMoCzITLmdpdGQudjEuQ3JlZGVudGlhbBIUCgxmdWxsX2hpc3RvcnkYBiABKAgSIwoIc3RyYXRlZ3kYByABKA4yES5naXRkLnYxLlN0cmF0ZWd5EgwKBHdhcm0YCCABKAkiQgoGTGF5ZXJzEg0KBWxvd2VyGAEgASgJEg0KBXVwcGVyGAIgASgJEgwKBHdvcmsYAyABKAkSDAoEd2FybRgEIAEoCSJtCg9QcmVwYXJlUmVzcG9uc2USJQoIcHJvZ3Jlc3MYASABKAsyES5naXRkLnYxLlByb2dyZXNzSAASKgoGcmVzdWx0GAIgASgLMhguZ2l0ZC52MS5Xb3Jrc3BhY2VSZXN1bHRIAEIHCgVldmVudCLEAQoPV29ya3NwYWNlUmVzdWx0Eg4KBmNvbW1pdBgBIAEoCRIOCgZicmFuY2gYAiABKAkSNQoScGVuZGluZ19zdWJtb2R1bGVzGAMgAygLMhkuZ2l0ZC52MS5QZW5kaW5nU3VibW9kdWxlEiMKCHN0cmF0ZWd5GAQgASgOMhEuZ2l0ZC52MS5TdHJhdGVneRIfCgZsYXllcnMYBSABKAsyDy5naXRkLnYxLkxheWVycxIUCgxsZnNfcGF0dGVybnMYBiADKAkicAoNVXBkYXRlUmVxdWVzdBIMCgRwYXRoGAEgASgJEg4KBmJyYW5jaBgCIAEoCRIXCg93aXRoX3N1Ym1vZHVsZXMYAyABKAgSKAoLY3JlZGVudGlhbHMYBCADKAsyEy5naXRkLnYxLkNyZWRlbnRpYWwibAoOVXBkYXRlUmVzcG9uc2USJQoIcHJvZ3Jlc3MYASABKAsyES5naXRkLnYxLlByb2dyZXNzSAASKgoGcmVzdWx0GAIgASgLMhguZ2l0ZC52MS5Xb3Jrc3BhY2VSZXN1bHRIAEIHCgVldmVudCJyCg9DaGVja291dFJlcXVlc3QSDAoEcGF0aBgBIAEoCRIOCgZjb21taXQYAiABKAkSFwoPd2l0aF9zdWJtb2R1bGVzGAMgASgIEigKC2NyZWRlbnRpYWxzGAQgAygLMhMuZ2l0ZC52MS5DcmVkZW50aWFsIm4KEENoZWNrb3V0UmVzcG9uc2USJQoIcHJvZ3Jlc3MYASABKAsyES5naXRkLnYxLlByb2dyZXNzSAASKgoGcmVzdWx0GAIgASgLMhguZ2l0ZC52MS5Xb3Jrc3BhY2VSZXN1bHRIAEIHCgVldmVudCJhChVTeW5jU3VibW9kdWxlc1JlcXVlc3QSDAoEcGF0aBgBIAEoCRIQCghvbmx5X3VybBgCIAEoCRIoCgtjcmVkZW50aWFscxgDIAMoCzITLmdpdGQudjEuQ3JlZGVudGlhbCJ5ChZTeW5jU3VibW9kdWxlc1Jlc3BvbnNlEiUKCHByb2dyZXNzGAEgASgLMhEuZ2l0ZC52MS5Qcm9ncmVzc0gAEi8KBnJlc3VsdBgCIAEoCzIdLmdpdGQudjEuU3luY1N1Ym1vZHVsZXNSZXN1bHRIAEIHCgVldmVudCJ6ChRTeW5jU3VibW9kdWxlc1Jlc3VsdBIrCgpzdWJtb2R1bGVzGAEgAygLMhcuZ2l0ZC52MS5TdWJtb2R1bGVTdGF0ZRI1ChJwZW5kaW5nX3N1Ym1vZHVsZXMYAiADKAsyGS5naXRkLnYxLlBlbmRpbmdTdWJtb2R1bGUiHwoPRGVzY3JpYmVSZXF1ZXN0EgwKBHBhdGgYASABKAki2gEKEERlc2NyaWJlUmVzcG9uc2USCwoDdXJsGAEgASgJEg4KBmNvbW1pdBgCIAEoCRIOCgZicmFuY2gYAyABKAkSEAoIbW9kaWZpZWQYBCABKAgSKwoKc3VibW9kdWxlcxgFIAMoCzIXLmdpdGQudjEuU3VibW9kdWxlU3RhdGUSIwoIc3RyYXRlZ3kYBiABKA4yES5naXRkLnYxLlN0cmF0ZWd5Eh8KBmxheWVycxgHIAEoCzIPLmdpdGQudjEuTGF5ZXJzEhQKDGxmc19wYXR0ZXJucxgIIAMoCSIdCg1SZW1vdmVSZXF1ZXN0EgwKBHBhdGgYASABKAkiEAoOUmVtb3ZlUmVzcG9uc2UiKQoLU2VhbFJlcXVlc3QSDAoEcGF0aBgBIAEoCRIMCgRuYW1lGAIgASgJIjAKDFNlYWxSZXNwb25zZRIgCgR3YXJtGAEgASgLMhIuZ2l0ZC52MS5XYXJtTGF5ZXIihAEKCVdhcm1MYXllchILCgN1cmwYASABKAkSDAoEbmFtZRgCIAEoCRIOCgZjb21taXQYAyABKAkSEQoJc2VhbGVkX2F0GAQgASgDEhMKC3NlYWxlZF9mcm9tGAUgASgJEhUKDWNoYW5nZWRfZmlsZXMYBiABKAUSDQoFdXNlcnMYByABKAUiHgoPTGlzdFdhcm1SZXF1ZXN0EgsKA3VybBgBIAEoCSI0ChBMaXN0V2FybVJlc3BvbnNlEiAKBHdhcm0YASADKAsyEi5naXRkLnYxLldhcm1MYXllciIcCgxBZG9wdFJlcXVlc3QSDAoEcGF0aBgBIAEoCSJnCg1BZG9wdFJlc3BvbnNlEiUKCHByb2dyZXNzGAEgASgLMhEuZ2l0ZC52MS5Qcm9ncmVzc0gAEiYKBnJlc3VsdBgCIAEoCzIULmdpdGQudjEuQWRvcHRSZXN1bHRIAEIHCgVldmVudCIlCgtBZG9wdFJlc3VsdBIWCg5ieXRlc19yZWxlYXNlZBgBIAEoAyLKAQoOUHVibGlzaFJlcXVlc3QSDAoEcGF0aBgBIAEoCRIOCgZicmFuY2gYAiABKAkSKAoLY3JlZGVudGlhbHMYAyADKAsyEy5naXRkLnYxLkNyZWRlbnRpYWwSFAoMcmVxdWVzdGVkX2J5GAQgASgJEjEKDHB1bGxfcmVxdWVzdBgFIAEoCzIbLmdpdGQudjEuUHVsbFJlcXVlc3RPcHRpb25zEicKCnByb3ZlbmFuY2UYBiABKAsyEy5naXRkLnYxLlByb3ZlbmFuY2UiTQoKUHJvdmVuYW5jZRINCgVhZ2VudBgBIAEoCRINCgVtb2RlbBgCIAEoCRIPCgdzZXNzaW9uGAMgASgJEhAKCHRhc2tfdXJsGAQgASgJImsKElB1bGxSZXF1ZXN0T3B0aW9ucxIMCgRvcGVuGAEgASgIEg0KBXRpdGxlGAIgASgJEgwKBGJvZHkYAyABKAkSDAoEYmFzZRgEIAEoCRISCgVkcmFmdBgFIAEoCEgAiAEBQggKBl9kcmFmdCIwChFPcGVuZWRQdWxsUmVxdWVzdBILCgN1cmwYASABKAkSDgoGbnVtYmVyGAIgASgDIlIKE1B1Ymxpc2hlZFJlcG9zaXRvcnkSCwoDdXJsGAEgASgJEgwKBHBhdGgYAiABKAkSDgoGY29tbWl0GAMgASgJEhAKCHN1YmplY3RzGAQgAygJIuoBCg9QdWJsaXNoUmVzcG9uc2USDgoGYnJhbmNoGAEgASgJEjAKCnJlcG9zaXRvcnkYAiABKAsyHC5naXRkLnYxLlB1Ymxpc2hlZFJlcG9zaXRvcnkSMAoKc3VibW9kdWxlcxgDIAMoCzIcLmdpdGQudjEuUHVibGlzaGVkUmVwb3NpdG9yeRIwCgxwdWxsX3JlcXVlc3QYBCABKAsyGi5naXRkLnYxLk9wZW5lZFB1bGxSZXF1ZXN0EjEKFHB1bGxfcmVxdWVzdF9mYWlsdXJlGAUgASgLMhMuZ2l0ZC52MS5HaXRGYWlsdXJlIjcKDkNoYW5nZXNSZXF1ZXN0EgwKBHBhdGgYASABKAkSFwoPaW5jbHVkZV9pZ25vcmVkGAIgASgIItMBCgtDaGFuZ2VkRmlsZRIMCgRwYXRoGAEgASgJEicKBGtpbmQYAiABKA4yGS5naXRkLnYxLkNoYW5nZWRGaWxlLktpbmQSEwoLYWRkZWRfbGluZXMYAyABKAUSFQoNcmVtb3ZlZF9saW5lcxgEIAEoBRIOCgZiaW5hcnkYBSABKAgiUQoES2luZBIUChBLSU5EX1VOU1BFQ0lGSUVEEAASDgoKS0lORF9BRERFRBABEhEKDUtJTkRfTU9ESUZJRUQQAhIQCgxLSU5EX0RFTEVURUQQAyJYCg9DaGFuZ2VzUmVzcG9uc2USDAoEYmFzZRgBIAEoCRIjCgVmaWxlcxgCIAMoCzIULmdpdGQudjEuQ2hhbmdlZEZpbGUSEgoKZnJvbV9sYXllchgDIAEoCCJWCgtEaWZmUmVxdWVzdBIMCgRwYXRoGAEgASgJEg0KBWZpbGVzGAIgAygJEhEKCW1heF9ieXRlcxgDIAEoAxIXCg9pbmNsdWRlX2lnbm9yZWQYBCABKAgiPQoMRGlmZlJlc3BvbnNlEgwKBGJhc2UYASABKAkSDAoEZGlmZhgCIAEoCRIRCgl0cnVuY2F0ZWQYAyABKAgiMwoEU2lkZRITCgl3b3Jrc3BhY2UYASABKAlIABIQCgZicmFuY2gYAiABKAlIAEIECgJvZiKZAQoOQ29tcGFyZVJlcXVlc3QSHAoFZmlyc3QYASABKAsyDS5naXRkLnYxLlNpZGUSHQoGc2Vjb25kGAIgASgLMg0uZ2l0ZC52MS5TaWRlEgsKA3VybBgDIAEoCRIXCg9pbmNsdWRlX2lnbm9yZWQYBCABKAgSEQoJd2l0aF9kaWZmGAUgASgIEhEKCW1heF9ieXRlcxgGIAEoAyJXCg9Db21wYXJlUmVzcG9uc2USIwoFZmlsZXMYASADKAsyFC5naXRkLnYxLkNoYW5nZWRGaWxlEgwKBGRpZmYYAiABKAkSEQoJdHJ1bmNhdGVkGAMgASgIIj0KEENvbmZsaWN0c1JlcXVlc3QSHAoFc2lkZXMYASADKAsyDS5naXRkLnYxLlNpZGUSCwoDdXJsGAIgASgJIlYKCENvbmZsaWN0EhwKBWZpcnN0GAEgASgLMg0uZ2l0ZC52MS5TaWRlEh0KBnNlY29uZBgCIAEoCzINLmdpdGQudjEuU2lkZRINCgVwYXRocxgDIAMoCSI5ChFDb25mbGljdHNSZXNwb25zZRIkCgljb25mbGljdHMYASADKAsyES5naXRkLnYxLkNvbmZsaWN0Ih0KDFdhdGNoUmVxdWVzdBINCgVwYXRocxgBIAMoCSKJAgoNV2F0Y2hSZXNwb25zZRIpCgRraW5kGAEgASgOMhsuZ2l0ZC52MS5XYXRjaFJlc3BvbnNlLktpbmQSDAoEcGF0aBgCIAEoCRIoCgR0aW1lGAMgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIOCgZicmFuY2gYBCABKAkSDgoGZGV0YWlsGAUgASgJInUKBEtpbmQSFAoQS0lORF9VTlNQRUNJRklFRBAAEg0KCUtJTkRfTUFERRABEhAKDEtJTkRfQ0hBTkdFRBACEhIKDktJTkRfUFVCTElTSEVEEAMSEAoMS0lORF9SRUZVU0VEEAQSEAoMS0lORF9SRU1PVkVEEAUiRQoMUHJvYmVSZXF1ZXN0EgsKA3VybBgBIAEoCRIoCgtjcmVkZW50aWFscxgCIAMoCzITLmdpdGQudjEuQ3JlZGVudGlhbCLSAgoNUHJvYmVSZXNwb25zZRItCgZhY2Nlc3MYASABKA4yHS5naXRkLnYxLlByb2JlUmVzcG9uc2UuQWNjZXNzEhAKCGJyYW5jaGVzGAIgAygJEhYKDmRlZmF1bHRfYnJhbmNoGAMgASgJEiQKB2ZhaWx1cmUYBCABKAsyEy5naXRkLnYxLkdpdEZhaWx1cmUSNAoHY29tbWl0cxgFIAMoCzIjLmdpdGQudjEuUHJvYmVSZXNwb25zZS5Db21taXRzRW50cnkaLgoMQ29tbWl0c0VudHJ5EgsKA2tleRgBIAEoCRINCgV2YWx1ZRgCIAEoCToCOAEiXAoGQWNjZXNzEhYKEkFDQ0VTU19VTlNQRUNJRklFRBAAEhEKDUFDQ0VTU19QVUJMSUMQARIUChBBQ0NFU1NfUkVBQ0hBQkxFEAISEQoNQUNDRVNTX0RFTklFRBADIisKDVJldGlyZVJlcXVlc3QSGgoSdW51c2VkX2Zvcl9zZWNvbmRzGAEgASgDIjYKDlJldGlyZVJlc3BvbnNlEg8KB3JldGlyZWQYASABKAUSEwoLZnJlZWRfYnl0ZXMYAiABKAMiDQoLSW5mb1JlcXVlc3QiwgEKDEluZm9SZXNwb25zZRIPCgd2ZXJzaW9uGAEgASgJEhMKC2dpdF92ZXJzaW9uGAIgASgJEg0KBXBvb2xzGAMgASgFEhMKC3Bvb2xzX2J5dGVzGAQgASgDEiMKCHN0cmF0ZWd5GAUgASgOMhEuZ2l0ZC52MS5TdHJhdGVneRIXCg9zdHJhdGVneV9yZWFzb24YBiABKAkSEQoJdGVtcGxhdGVzGAcgASgFEhcKD3RlbXBsYXRlc19ieXRlcxgIIAEoAyJVCgxBdWRpdFJlcXVlc3QSKQoFc2luY2UYASABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEgsKA3VybBgCIAEoCRINCgVsaW1pdBgDIAEoBSI1Cg1BdWRpdFJlc3BvbnNlEiQKB2VudHJpZXMYASADKAsyEy5naXRkLnYxLkF1ZGl0RW50cnkiwgMKCkF1ZGl0RW50cnkSKAoEdGltZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEQoJd29ya3NwYWNlGAIgASgJEgsKA3VybBgDIAEoCRIOCgZicmFuY2gYBCABKAkSMAoKcmVwb3NpdG9yeRgFIAEoCzIcLmdpdGQudjEuUHVibGlzaGVkUmVwb3NpdG9yeRIwCgpzdWJtb2R1bGVzGAYgAygLMhwuZ2l0ZC52MS5QdWJsaXNoZWRSZXBvc2l0b3J5EiQKB3JlZnVzYWwYByABKAsyEy5naXRkLnYxLkdpdEZhaWx1cmUSFAoMcmVxdWVzdGVkX2J5GAggASgJEjAKDHB1bGxfcmVxdWVzdBgJIAEoCzIaLmdpdGQudjEuT3BlbmVkUHVsbFJlcXVlc3QSMQoUcHVsbF9yZXF1ZXN0X2ZhaWx1cmUYCiABKAsyEy5naXRkLnYxLkdpdEZhaWx1cmUSLAoGY2hhbmdlGAsgASgLMhwuZ2l0ZC52MS5Db25maWd1cmF0aW9uQ2hhbmdlEicKCnByb3ZlbmFuY2UYDCABKAsyEy5naXRkLnYxLlByb3ZlbmFuY2UitgIKE0NvbmZpZ3VyYXRpb25DaGFuZ2USMwoGYWN0aW9uGAEgASgOMiMuZ2l0ZC52MS5Db25maWd1cmF0aW9uQ2hhbmdlLkFjdGlvbhIPCgdzdWJqZWN0GAIgASgJEhIKCnVybF9wcmVmaXgYAyABKAkixAEKBkFjdGlvbhIWChJBQ1RJT05fVU5TUEVDSUZJRUQQABIbChdBQ1RJT05fQ09OTkVDVElPTl9BRERFRBABEh0KGUFDVElPTl9DT05ORUNUSU9OX1JFTU9WRUQQAhIXChNBQ1RJT05fU0VUVElOR1NfU0VUEAMSGwoXQUNUSU9OX1NFVFRJTkdTX1JFTU9WRUQQBBIVChFBQ1RJT05fUFJFU0VUX1NFVBAFEhkKFUFDVElPTl9QUkVTRVRfUkVNT1ZFRBAGIuICCgpDb25uZWN0aW9uEgoKAmlkGAEgASgJEiYKBGtpbmQYAiABKA4yGC5naXRkLnYxLkNvbm5lY3Rpb24uS2luZBISCgp1cmxfcHJlZml4GAMgASgJEg8KB2FjdHNfYXMYBCABKAkSDgoGYXBwX2lkGAUgASgDEhIKCm1hbmFnZV91cmwYBiABKAkSKwoHZXhwaXJlcxgHIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASEQoJZnJvbV9maWxlGAggASgIEisKB2NyZWF0ZWQYCSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wImoKBEtpbmQSFAoQS0lORF9VTlNQRUNJRklFRBAAEg4KCktJTkRfVE9LRU4QARIQCgxLSU5EX1NTSF9LRVkQAhITCg9LSU5EX0dJVEhVQl9BUFAQAxIVChFLSU5EX0dJVEhVQl9MT0dJThAEIl8KFUJlZ2luR2l0SHViQXBwUmVxdWVzdBIMCgRob3N0GAEgASgJEhQKDG9yZ2FuaXphdGlvbhgCIAEoCRIMCgRuYW1lGAMgASgJEhQKDHJlZGlyZWN0X3VybBgEIAEoCSJOChZCZWdpbkdpdEh1YkFwcFJlc3BvbnNlEhMKC2Zvcm1fYWN0aW9uGAEgASgJEhAKCG1hbmlmZXN0GAIgASgJEg0KBXN0YXRlGAMgASgJIjcKGENvbXBsZXRlR2l0SHViQXBwUmVxdWVzdBIMCgRjb2RlGAEgASgJEg0KBXN0YXRlGAIgASgJIlkKGUNvbXBsZXRlR2l0SHViQXBwUmVzcG9uc2USJwoKY29ubmVjdGlvbhgBIAEoCzITLmdpdGQudjEuQ29ubmVjdGlvbhITCgtpbnN0YWxsX3VybBgCIAEoCSInChdTdGFydEdpdEh1YkxvZ2luUmVxdWVzdBIMCgRob3N0GAEgASgJInUKGFN0YXJ0R2l0SHViTG9naW5SZXNwb25zZRIRCgl1c2VyX2NvZGUYASABKAkSGAoQdmVyaWZpY2F0aW9uX3VybBgCIAEoCRIQCghsb2dpbl9pZBgDIAEoCRIaChJleHBpcmVzX2luX3NlY29uZHMYBCABKAUiLAoYRmluaXNoR2l0SHViTG9naW5SZXF1ZXN0EhAKCGxvZ2luX2lkGAEgASgJIlkKGUZpbmlzaEdpdEh1YkxvZ2luUmVzcG9uc2USJwoKY29ubmVjdGlvbhgBIAEoCzITLmdpdGQudjEuQ29ubmVjdGlvbhITCgtpbnN0YWxsX3VybBgCIAEoCSJcChNBZGRHaXRIdWJBcHBSZXF1ZXN0EgwKBGhvc3QYASABKAkSDgoGYXBwX2lkGAIgASgDEhMKC3ByaXZhdGVfa2V5GAMgASgJEhIKCnVybF9wcmVmaXgYBCABKAkiPwoUQWRkR2l0SHViQXBwUmVzcG9uc2USJwoKY29ubmVjdGlvbhgBIAEoCzITLmdpdGQudjEuQ29ubmVjdGlvbiJCCg9BZGRUb2tlblJlcXVlc3QSEgoKdXJsX3ByZWZpeBgBIAEoCRINCgV0b2tlbhgCIAEoCRIMCgR1c2VyGAMgASgJIjsKEEFkZFRva2VuUmVzcG9uc2USJwoKY29ubmVjdGlvbhgBIAEoCzITLmdpdGQudjEuQ29ubmVjdGlvbiIYChZMaXN0Q29ubmVjdGlvbnNSZXF1ZXN0IkMKF0xpc3RDb25uZWN0aW9uc1Jlc3BvbnNlEigKC2Nvbm5lY3Rpb25zGAEgAygLMhMuZ2l0ZC52MS5Db25uZWN0aW9uIiUKF1JlbW92ZUNvbm5lY3Rpb25SZXF1ZXN0EgoKAmlkGAEgASgJIhoKGFJlbW92ZUNvbm5lY3Rpb25SZXNwb25zZSKOAgoPUHVibGlzaFNldHRpbmdzEhIKCnVybF9wcmVmaXgYASABKAkSDgoGcHJlc2V0GAIgASgJEhcKD3Byb3RlY3RlZF9wYXRocxgDIAMoCRISCgprZXB0X3BhdGhzGAQgAygJEh4KEW1heF9jaGFuZ2VkX2ZpbGVzGAUgASgFSACIAQESFQoNYnJhbmNoX3ByZWZpeBgGIAEoCRIzCg1wdWxsX3JlcXVlc3RzGAcgASgLMhwuZ2l0ZC52MS5QdWxsUmVxdWVzdFNldHRpbmdzEhEKCWZyb21fZmlsZRgIIAEoCBIVCg1hbGxvd2VkX3BhdGhzGAkgAygJQhQKEl9tYXhfY2hhbmdlZF9maWxlcyL5AQoGUHJlc2V0EgwKBG5hbWUYASABKAkSFwoPcHJvdGVjdGVkX3BhdGhzGAIgAygJEhIKCmtlcHRfcGF0aHMYAyADKAkSHgoRbWF4X2NoYW5nZWRfZmlsZXMYBCABKAVIAIgBARImCgZvcmlnaW4YBSABKA4yFi5naXRkLnYxLlByZXNldC5PcmlnaW4iVgoGT3JpZ2luEhYKEk9SSUdJTl9VTlNQRUNJRklFRBAAEhMKD09SSUdJTl9CVUlMVF9JThABEg8KC09SSUdJTl9GSUxFEAISDgoKT1JJR0lOX0FQSRADQhQKEl9tYXhfY2hhbmdlZF9maWxlcyLQAQoTUHVsbFJlcXVlc3RTZXR0aW5ncxIvCgRvcGVuGAEgASgOMiEuZ2l0ZC52MS5QdWxsUmVxdWVzdFNldHRpbmdzLk9wZW4SDQoFZHJhZnQYAiABKAgSDgoGbGFiZWxzGAMgAygJEiUKHXJlcXVlc3RfcmV2aWV3X2Zyb21fcmVxdWVzdGVyGAQgASgIIkIKBE9wZW4SFAoQT1BFTl9VTlNQRUNJRklFRBAAEhMKD09QRU5fV0hFTl9BU0tFRBABEg8KC09QRU5fQUxXQVlTEAIiFAoSR2V0U2V0dGluZ3NSZXF1ZXN0IkEKE0dldFNldHRpbmdzUmVzcG9uc2USKgoIc2V0dGluZ3MYASADKAsyGC5naXRkLnYxLlB1Ymxpc2hTZXR0aW5ncyJAChJTZXRTZXR0aW5nc1JlcXVlc3QSKgoIc2V0dGluZ3MYASABKAsyGC5naXRkLnYxLlB1Ymxpc2hTZXR0aW5ncyJBChNTZXRTZXR0aW5nc1Jlc3BvbnNlEioKCHNldHRpbmdzGAEgASgLMhguZ2l0ZC52MS5QdWJsaXNoU2V0dGluZ3MiKwoVUmVtb3ZlU2V0dGluZ3NSZXF1ZXN0EhIKCnVybF9wcmVmaXgYASABKAkiGAoWUmVtb3ZlU2V0dGluZ3NSZXNwb25zZSIUChJMaXN0UHJlc2V0c1JlcXVlc3QiNwoTTGlzdFByZXNldHNSZXNwb25zZRIgCgdwcmVzZXRzGAEgAygLMg8uZ2l0ZC52MS5QcmVzZXQiMwoQU2V0UHJlc2V0UmVxdWVzdBIfCgZwcmVzZXQYASABKAsyDy5naXRkLnYxLlByZXNldCI0ChFTZXRQcmVzZXRSZXNwb25zZRIfCgZwcmVzZXQYASABKAsyDy5naXRkLnYxLlByZXNldCIjChNSZW1vdmVQcmVzZXRSZXF1ZXN0EgwKBG5hbWUYASABKAkiFgoUUmVtb3ZlUHJlc2V0UmVzcG9uc2UqYwoIU3RyYXRlZ3kSGAoUU1RSQVRFR1lfVU5TUEVDSUZJRUQQABIRCg1TVFJBVEVHWV9DT1BZEAESFAoQU1RSQVRFR1lfT1ZFUkxBWRACEhQKEFNUUkFURUdZX1JFRkxJTksQAzLABwoQV29ya3NwYWNlU2VydmljZRI+CgdQcmVwYXJlEhcuZ2l0ZC52MS5QcmVwYXJlUmVxdWVzdBoYLmdpdGQudjEuUHJlcGFyZVJlc3BvbnNlMAESOwoGVXBkYXRlEhYuZ2l0ZC52MS5VcGRhdGVSZXF1ZXN0GhcuZ2l0ZC52MS5VcGRhdGVSZXNwb25zZTABEkEKCENoZWNrb3V0EhguZ2l0ZC52MS5DaGVja291dFJlcXVlc3QaGS5naXRkLnYxLkNoZWNrb3V0UmVzcG9uc2UwARJTCg5TeW5jU3VibW9kdWxlcxIeLmdpdGQudjEuU3luY1N1Ym1vZHVsZXNSZXF1ZXN0Gh8uZ2l0ZC52MS5TeW5jU3VibW9kdWxlc1Jlc3BvbnNlMAESPwoIRGVzY3JpYmUSGC5naXRkLnYxLkRlc2NyaWJlUmVxdWVzdBoZLmdpdGQudjEuRGVzY3JpYmVSZXNwb25zZRI5CgZSZW1vdmUSFi5naXRkLnYxLlJlbW92ZVJlcXVlc3QaFy5naXRkLnYxLlJlbW92ZVJlc3BvbnNlEjgKBUFkb3B0EhUuZ2l0ZC52MS5BZG9wdFJlcXVlc3QaFi5naXRkLnYxLkFkb3B0UmVzcG9uc2UwARI8CgdQdWJsaXNoEhcuZ2l0ZC52MS5QdWJsaXNoUmVxdWVzdBoYLmdpdGQudjEuUHVibGlzaFJlc3BvbnNlEjwKB0NoYW5nZXMSFy5naXRkLnYxLkNoYW5nZXNSZXF1ZXN0GhguZ2l0ZC52MS5DaGFuZ2VzUmVzcG9uc2USMwoERGlmZhIULmdpdGQudjEuRGlmZlJlcXVlc3QaFS5naXRkLnYxLkRpZmZSZXNwb25zZRI8CgdDb21wYXJlEhcuZ2l0ZC52MS5Db21wYXJlUmVxdWVzdBoYLmdpdGQudjEuQ29tcGFyZVJlc3BvbnNlEkIKCUNvbmZsaWN0cxIZLmdpdGQudjEuQ29uZmxpY3RzUmVxdWVzdBoaLmdpdGQudjEuQ29uZmxpY3RzUmVzcG9uc2USOAoFV2F0Y2gSFS5naXRkLnYxLldhdGNoUmVxdWVzdBoWLmdpdGQudjEuV2F0Y2hSZXNwb25zZTABEjMKBFNlYWwSFC5naXRkLnYxLlNlYWxSZXF1ZXN0GhUuZ2l0ZC52MS5TZWFsUmVzcG9uc2USPwoITGlzdFdhcm0SGC5naXRkLnYxLkxpc3RXYXJtUmVxdWVzdBoZLmdpdGQudjEuTGlzdFdhcm1SZXNwb25zZTJLChFSZXBvc2l0b3J5U2VydmljZRI2CgVQcm9iZRIVLmdpdGQudjEuUHJvYmVSZXF1ZXN0GhYuZ2l0ZC52MS5Qcm9iZVJlc3BvbnNlMrcBCg1TZXJ2ZXJTZXJ2aWNlEjMKBEluZm8SFC5naXRkLnYxLkluZm9SZXF1ZXN0GhUuZ2l0ZC52MS5JbmZvUmVzcG9uc2USOQoGUmV0aXJlEhYuZ2l0ZC52MS5SZXRpcmVSZXF1ZXN0GhcuZ2l0ZC52MS5SZXRpcmVSZXNwb25zZRI2CgVBdWRpdBIVLmdpdGQudjEuQXVkaXRSZXF1ZXN0GhYuZ2l0ZC52MS5BdWRpdFJlc3BvbnNlMrQFChFDb25uZWN0aW9uU2VydmljZRJRCg5CZWdpbkdpdEh1YkFwcBIeLmdpdGQudjEuQmVnaW5HaXRIdWJBcHBSZXF1ZXN0Gh8uZ2l0ZC52MS5CZWdpbkdpdEh1YkFwcFJlc3BvbnNlEloKEUNvbXBsZXRlR2l0SHViQXBwEiEuZ2l0ZC52MS5Db21wbGV0ZUdpdEh1YkFwcFJlcXVlc3QaIi5naXRkLnYxLkNvbXBsZXRlR2l0SHViQXBwUmVzcG9uc2USVwoQU3RhcnRHaXRIdWJMb2dpbhIgLmdpdGQudjEuU3RhcnRHaXRIdWJMb2dpblJlcXVlc3QaIS5naXRkLnYxLlN0YXJ0R2l0SHViTG9naW5SZXNwb25zZRJaChFGaW5pc2hHaXRIdWJMb2dpbhIhLmdpdGQudjEuRmluaXNoR2l0SHViTG9naW5SZXF1ZXN0GiIuZ2l0ZC52MS5GaW5pc2hHaXRIdWJMb2dpblJlc3BvbnNlEksKDEFkZEdpdEh1YkFwcBIcLmdpdGQudjEuQWRkR2l0SHViQXBwUmVxdWVzdBodLmdpdGQudjEuQWRkR2l0SHViQXBwUmVzcG9uc2USPwoIQWRkVG9rZW4SGC5naXRkLnYxLkFkZFRva2VuUmVxdWVzdBoZLmdpdGQudjEuQWRkVG9rZW5SZXNwb25zZRJUCg9MaXN0Q29ubmVjdGlvbnMSHy5naXRkLnYxLkxpc3RDb25uZWN0aW9uc1JlcXVlc3QaIC5naXRkLnYxLkxpc3RDb25uZWN0aW9uc1Jlc3BvbnNlElcKEFJlbW92ZUNvbm5lY3Rpb24SIC5naXRkLnYxLlJlbW92ZUNvbm5lY3Rpb25SZXF1ZXN0GiEuZ2l0ZC52MS5SZW1vdmVDb25uZWN0aW9uUmVzcG9uc2Uy1QMKEVB1Ymxpc2hpbmdTZXJ2aWNlEkgKC0dldFNldHRpbmdzEhsuZ2l0ZC52MS5HZXRTZXR0aW5nc1JlcXVlc3QaHC5naXRkLnYxLkdldFNldHRpbmdzUmVzcG9uc2USSAoLU2V0U2V0dGluZ3MSGy5naXRkLnYxLlNldFNldHRpbmdzUmVxdWVzdBocLmdpdGQudjEuU2V0U2V0dGluZ3NSZXNwb25zZRJRCg5SZW1vdmVTZXR0aW5ncxIeLmdpdGQudjEuUmVtb3ZlU2V0dGluZ3NSZXF1ZXN0Gh8uZ2l0ZC52MS5SZW1vdmVTZXR0aW5nc1Jlc3BvbnNlEkgKC0xpc3RQcmVzZXRzEhsuZ2l0ZC52MS5MaXN0UHJlc2V0c1JlcXVlc3QaHC5naXRkLnYxLkxpc3RQcmVzZXRzUmVzcG9uc2USQgoJU2V0UHJlc2V0EhkuZ2l0ZC52MS5TZXRQcmVzZXRSZXF1ZXN0GhouZ2l0ZC52MS5TZXRQcmVzZXRSZXNwb25zZRJLCgxSZW1vdmVQcmVzZXQSHC5naXRkLnYxLlJlbW92ZVByZXNldFJlcXVlc3QaHS5naXRkLnYxLlJlbW92ZVByZXNldFJlc3BvbnNlQjJaMGdpdGh1Yi5jb20vZG9vc2VydmljZS9naXRkL2dlbi9nby9naXRkL3YxO2dpdGR2MWIGcHJvdG8z", [file_google_protobuf_timestamp]);
9
+ export const file_gitd_v1_gitd = /*@__PURE__*/ fileDesc("ChJnaXRkL3YxL2dpdGQucHJvdG8SB2dpdGQudjEibQoKQ3JlZGVudGlhbBISCgp1cmxfcHJlZml4GAEgASgJEhUKC2h0dHBzX3Rva2VuGAIgASgJSAASFgoMc3NoX2tleV9wYXRoGAMgASgJSAASEgoKaHR0cHNfdXNlchgEIAEoCUIICgZzZWNyZXQiOAoIUmV2aXNpb24SEAoGYnJhbmNoGAEgASgJSAASEAoGY29tbWl0GAIgASgJSABCCAoGdGFyZ2V0Ij4KCFByb2dyZXNzEg0KBXBoYXNlGAEgASgJEg8KB3BlcmNlbnQYAiABKAUSEgoKcmVwb3NpdG9yeRgDIAEoCSJQCg5TdWJtb2R1bGVTdGF0ZRIMCgRwYXRoGAEgASgJEgsKA3VybBgCIAEoCRIOCgZjb21taXQYAyABKAkSEwoLY2hlY2tlZF9vdXQYBCABKAgiUwoQUGVuZGluZ1N1Ym1vZHVsZRILCgN1cmwYASABKAkSDAoEcGF0aBgCIAEoCRIkCgdmYWlsdXJlGAMgASgLMhMuZ2l0ZC52MS5HaXRGYWlsdXJlIuYDCgpHaXRGYWlsdXJlEioKBnJlYXNvbhgBIAEoDjIaLmdpdGQudjEuR2l0RmFpbHVyZS5SZWFzb24SEAoIZ2l0X3NhaWQYAiABKAkSEgoKcmVwb3NpdG9yeRgDIAEoCSKFAwoGUmVhc29uEhYKElJFQVNPTl9VTlNQRUNJRklFRBAAEhgKFFJFQVNPTl9BVVRIX1JFUVVJUkVEEAESFwoTUkVBU09OX0FVVEhfUkVGVVNFRBACEhQKEFJFQVNPTl9OT1RfRk9VTkQQAxIWChJSRUFTT05fQkFEX0FERFJFU1MQBBIXChNSRUFTT05fUEFUSF9SRUZVU0VEEAUSDwoLUkVBU09OX0JVU1kQBhISCg5SRUFTT05fVElNRU9VVBAHEhIKDlJFQVNPTl9DT1JSVVBUEAgSFQoRUkVBU09OX0dJVF9GQUlMRUQQCRIWChJSRUFTT05fTk9USElOR19ORVcQChIZChVSRUFTT05fQlJBTkNIX1JFRlVTRUQQCxIZChVSRUFTT05fQ09ORklHX1JFRlVTRUQQDBIZChVSRUFTT05fUE9MSUNZX1JFRlVTRUQQDRIWChJSRUFTT05fVU5TVVBQT1JURUQQDhIYChRSRUFTT05fTElNSVRfUkVBQ0hFRBAPIvEBCg5QcmVwYXJlUmVxdWVzdBILCgN1cmwYASABKAkSDAoEcGF0aBgCIAEoCRIjCghyZXZpc2lvbhgDIAEoCzIRLmdpdGQudjEuUmV2aXNpb24SFwoPd2l0aF9zdWJtb2R1bGVzGAQgASgIEigKC2NyZWRlbnRpYWxzGAUgAygLMhMuZ2l0ZC52MS5DcmVkZW50aWFsEhQKDGZ1bGxfaGlzdG9yeRgGIAEoCBIjCghzdHJhdGVneRgHIAEoDjIRLmdpdGQudjEuU3RyYXRlZ3kSDAoEd2FybRgIIAEoCRITCgtwb29sX2luc2lkZRgJIAEoCCJCCgZMYXllcnMSDQoFbG93ZXIYASABKAkSDQoFdXBwZXIYAiABKAkSDAoEd29yaxgDIAEoCRIMCgR3YXJtGAQgASgJIm0KD1ByZXBhcmVSZXNwb25zZRIlCghwcm9ncmVzcxgBIAEoCzIRLmdpdGQudjEuUHJvZ3Jlc3NIABIqCgZyZXN1bHQYAiABKAsyGC5naXRkLnYxLldvcmtzcGFjZVJlc3VsdEgAQgcKBWV2ZW50ItoBCg9Xb3Jrc3BhY2VSZXN1bHQSDgoGY29tbWl0GAEgASgJEg4KBmJyYW5jaBgCIAEoCRI1ChJwZW5kaW5nX3N1Ym1vZHVsZXMYAyADKAsyGS5naXRkLnYxLlBlbmRpbmdTdWJtb2R1bGUSIwoIc3RyYXRlZ3kYBCABKA4yES5naXRkLnYxLlN0cmF0ZWd5Eh8KBmxheWVycxgFIAEoCzIPLmdpdGQudjEuTGF5ZXJzEhQKDGxmc19wYXR0ZXJucxgGIAMoCRIUCgxwb29sX29iamVjdHMYByABKAkicAoNVXBkYXRlUmVxdWVzdBIMCgRwYXRoGAEgASgJEg4KBmJyYW5jaBgCIAEoCRIXCg93aXRoX3N1Ym1vZHVsZXMYAyABKAgSKAoLY3JlZGVudGlhbHMYBCADKAsyEy5naXRkLnYxLkNyZWRlbnRpYWwibAoOVXBkYXRlUmVzcG9uc2USJQoIcHJvZ3Jlc3MYASABKAsyES5naXRkLnYxLlByb2dyZXNzSAASKgoGcmVzdWx0GAIgASgLMhguZ2l0ZC52MS5Xb3Jrc3BhY2VSZXN1bHRIAEIHCgVldmVudCJyCg9DaGVja291dFJlcXVlc3QSDAoEcGF0aBgBIAEoCRIOCgZjb21taXQYAiABKAkSFwoPd2l0aF9zdWJtb2R1bGVzGAMgASgIEigKC2NyZWRlbnRpYWxzGAQgAygLMhMuZ2l0ZC52MS5DcmVkZW50aWFsIm4KEENoZWNrb3V0UmVzcG9uc2USJQoIcHJvZ3Jlc3MYASABKAsyES5naXRkLnYxLlByb2dyZXNzSAASKgoGcmVzdWx0GAIgASgLMhguZ2l0ZC52MS5Xb3Jrc3BhY2VSZXN1bHRIAEIHCgVldmVudCJhChVTeW5jU3VibW9kdWxlc1JlcXVlc3QSDAoEcGF0aBgBIAEoCRIQCghvbmx5X3VybBgCIAEoCRIoCgtjcmVkZW50aWFscxgDIAMoCzITLmdpdGQudjEuQ3JlZGVudGlhbCJ5ChZTeW5jU3VibW9kdWxlc1Jlc3BvbnNlEiUKCHByb2dyZXNzGAEgASgLMhEuZ2l0ZC52MS5Qcm9ncmVzc0gAEi8KBnJlc3VsdBgCIAEoCzIdLmdpdGQudjEuU3luY1N1Ym1vZHVsZXNSZXN1bHRIAEIHCgVldmVudCJ6ChRTeW5jU3VibW9kdWxlc1Jlc3VsdBIrCgpzdWJtb2R1bGVzGAEgAygLMhcuZ2l0ZC52MS5TdWJtb2R1bGVTdGF0ZRI1ChJwZW5kaW5nX3N1Ym1vZHVsZXMYAiADKAsyGS5naXRkLnYxLlBlbmRpbmdTdWJtb2R1bGUiHwoPRGVzY3JpYmVSZXF1ZXN0EgwKBHBhdGgYASABKAki2gEKEERlc2NyaWJlUmVzcG9uc2USCwoDdXJsGAEgASgJEg4KBmNvbW1pdBgCIAEoCRIOCgZicmFuY2gYAyABKAkSEAoIbW9kaWZpZWQYBCABKAgSKwoKc3VibW9kdWxlcxgFIAMoCzIXLmdpdGQudjEuU3VibW9kdWxlU3RhdGUSIwoIc3RyYXRlZ3kYBiABKA4yES5naXRkLnYxLlN0cmF0ZWd5Eh8KBmxheWVycxgHIAEoCzIPLmdpdGQudjEuTGF5ZXJzEhQKDGxmc19wYXR0ZXJucxgIIAMoCSIdCg1SZW1vdmVSZXF1ZXN0EgwKBHBhdGgYASABKAkiEAoOUmVtb3ZlUmVzcG9uc2UiKQoLU2VhbFJlcXVlc3QSDAoEcGF0aBgBIAEoCRIMCgRuYW1lGAIgASgJIjAKDFNlYWxSZXNwb25zZRIgCgR3YXJtGAEgASgLMhIuZ2l0ZC52MS5XYXJtTGF5ZXIihAEKCVdhcm1MYXllchILCgN1cmwYASABKAkSDAoEbmFtZRgCIAEoCRIOCgZjb21taXQYAyABKAkSEQoJc2VhbGVkX2F0GAQgASgDEhMKC3NlYWxlZF9mcm9tGAUgASgJEhUKDWNoYW5nZWRfZmlsZXMYBiABKAUSDQoFdXNlcnMYByABKAUiHgoPTGlzdFdhcm1SZXF1ZXN0EgsKA3VybBgBIAEoCSI0ChBMaXN0V2FybVJlc3BvbnNlEiAKBHdhcm0YASADKAsyEi5naXRkLnYxLldhcm1MYXllciIcCgxBZG9wdFJlcXVlc3QSDAoEcGF0aBgBIAEoCSJnCg1BZG9wdFJlc3BvbnNlEiUKCHByb2dyZXNzGAEgASgLMhEuZ2l0ZC52MS5Qcm9ncmVzc0gAEiYKBnJlc3VsdBgCIAEoCzIULmdpdGQudjEuQWRvcHRSZXN1bHRIAEIHCgVldmVudCIlCgtBZG9wdFJlc3VsdBIWCg5ieXRlc19yZWxlYXNlZBgBIAEoAyLbAQoOUHVibGlzaFJlcXVlc3QSDAoEcGF0aBgBIAEoCRIOCgZicmFuY2gYAiABKAkSKAoLY3JlZGVudGlhbHMYAyADKAsyEy5naXRkLnYxLkNyZWRlbnRpYWwSFAoMcmVxdWVzdGVkX2J5GAQgASgJEjEKDHB1bGxfcmVxdWVzdBgFIAEoCzIbLmdpdGQudjEuUHVsbFJlcXVlc3RPcHRpb25zEicKCnByb3ZlbmFuY2UYBiABKAsyEy5naXRkLnYxLlByb3ZlbmFuY2USDwoHc2FuZGJveBgHIAEoCSJNCgpQcm92ZW5hbmNlEg0KBWFnZW50GAEgASgJEg0KBW1vZGVsGAIgASgJEg8KB3Nlc3Npb24YAyABKAkSEAoIdGFza191cmwYBCABKAkiawoSUHVsbFJlcXVlc3RPcHRpb25zEgwKBG9wZW4YASABKAgSDQoFdGl0bGUYAiABKAkSDAoEYm9keRgDIAEoCRIMCgRiYXNlGAQgASgJEhIKBWRyYWZ0GAUgASgISACIAQFCCAoGX2RyYWZ0IjAKEU9wZW5lZFB1bGxSZXF1ZXN0EgsKA3VybBgBIAEoCRIOCgZudW1iZXIYAiABKAMiUgoTUHVibGlzaGVkUmVwb3NpdG9yeRILCgN1cmwYASABKAkSDAoEcGF0aBgCIAEoCRIOCgZjb21taXQYAyABKAkSEAoIc3ViamVjdHMYBCADKAki6gEKD1B1Ymxpc2hSZXNwb25zZRIOCgZicmFuY2gYASABKAkSMAoKcmVwb3NpdG9yeRgCIAEoCzIcLmdpdGQudjEuUHVibGlzaGVkUmVwb3NpdG9yeRIwCgpzdWJtb2R1bGVzGAMgAygLMhwuZ2l0ZC52MS5QdWJsaXNoZWRSZXBvc2l0b3J5EjAKDHB1bGxfcmVxdWVzdBgEIAEoCzIaLmdpdGQudjEuT3BlbmVkUHVsbFJlcXVlc3QSMQoUcHVsbF9yZXF1ZXN0X2ZhaWx1cmUYBSABKAsyEy5naXRkLnYxLkdpdEZhaWx1cmUiNwoOQ2hhbmdlc1JlcXVlc3QSDAoEcGF0aBgBIAEoCRIXCg9pbmNsdWRlX2lnbm9yZWQYAiABKAgi0wEKC0NoYW5nZWRGaWxlEgwKBHBhdGgYASABKAkSJwoEa2luZBgCIAEoDjIZLmdpdGQudjEuQ2hhbmdlZEZpbGUuS2luZBITCgthZGRlZF9saW5lcxgDIAEoBRIVCg1yZW1vdmVkX2xpbmVzGAQgASgFEg4KBmJpbmFyeRgFIAEoCCJRCgRLaW5kEhQKEEtJTkRfVU5TUEVDSUZJRUQQABIOCgpLSU5EX0FEREVEEAESEQoNS0lORF9NT0RJRklFRBACEhAKDEtJTkRfREVMRVRFRBADIlgKD0NoYW5nZXNSZXNwb25zZRIMCgRiYXNlGAEgASgJEiMKBWZpbGVzGAIgAygLMhQuZ2l0ZC52MS5DaGFuZ2VkRmlsZRISCgpmcm9tX2xheWVyGAMgASgIIlYKC0RpZmZSZXF1ZXN0EgwKBHBhdGgYASABKAkSDQoFZmlsZXMYAiADKAkSEQoJbWF4X2J5dGVzGAMgASgDEhcKD2luY2x1ZGVfaWdub3JlZBgEIAEoCCI9CgxEaWZmUmVzcG9uc2USDAoEYmFzZRgBIAEoCRIMCgRkaWZmGAIgASgJEhEKCXRydW5jYXRlZBgDIAEoCCIzCgRTaWRlEhMKCXdvcmtzcGFjZRgBIAEoCUgAEhAKBmJyYW5jaBgCIAEoCUgAQgQKAm9mIpkBCg5Db21wYXJlUmVxdWVzdBIcCgVmaXJzdBgBIAEoCzINLmdpdGQudjEuU2lkZRIdCgZzZWNvbmQYAiABKAsyDS5naXRkLnYxLlNpZGUSCwoDdXJsGAMgASgJEhcKD2luY2x1ZGVfaWdub3JlZBgEIAEoCBIRCgl3aXRoX2RpZmYYBSABKAgSEQoJbWF4X2J5dGVzGAYgASgDIlcKD0NvbXBhcmVSZXNwb25zZRIjCgVmaWxlcxgBIAMoCzIULmdpdGQudjEuQ2hhbmdlZEZpbGUSDAoEZGlmZhgCIAEoCRIRCgl0cnVuY2F0ZWQYAyABKAgiPQoQQ29uZmxpY3RzUmVxdWVzdBIcCgVzaWRlcxgBIAMoCzINLmdpdGQudjEuU2lkZRILCgN1cmwYAiABKAkiVgoIQ29uZmxpY3QSHAoFZmlyc3QYASABKAsyDS5naXRkLnYxLlNpZGUSHQoGc2Vjb25kGAIgASgLMg0uZ2l0ZC52MS5TaWRlEg0KBXBhdGhzGAMgAygJIjkKEUNvbmZsaWN0c1Jlc3BvbnNlEiQKCWNvbmZsaWN0cxgBIAMoCzIRLmdpdGQudjEuQ29uZmxpY3QiHQoMV2F0Y2hSZXF1ZXN0Eg0KBXBhdGhzGAEgAygJIokCCg1XYXRjaFJlc3BvbnNlEikKBGtpbmQYASABKA4yGy5naXRkLnYxLldhdGNoUmVzcG9uc2UuS2luZBIMCgRwYXRoGAIgASgJEigKBHRpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg4KBmJyYW5jaBgEIAEoCRIOCgZkZXRhaWwYBSABKAkidQoES2luZBIUChBLSU5EX1VOU1BFQ0lGSUVEEAASDQoJS0lORF9NQURFEAESEAoMS0lORF9DSEFOR0VEEAISEgoOS0lORF9QVUJMSVNIRUQQAxIQCgxLSU5EX1JFRlVTRUQQBBIQCgxLSU5EX1JFTU9WRUQQBSJFCgxQcm9iZVJlcXVlc3QSCwoDdXJsGAEgASgJEigKC2NyZWRlbnRpYWxzGAIgAygLMhMuZ2l0ZC52MS5DcmVkZW50aWFsItICCg1Qcm9iZVJlc3BvbnNlEi0KBmFjY2VzcxgBIAEoDjIdLmdpdGQudjEuUHJvYmVSZXNwb25zZS5BY2Nlc3MSEAoIYnJhbmNoZXMYAiADKAkSFgoOZGVmYXVsdF9icmFuY2gYAyABKAkSJAoHZmFpbHVyZRgEIAEoCzITLmdpdGQudjEuR2l0RmFpbHVyZRI0Cgdjb21taXRzGAUgAygLMiMuZ2l0ZC52MS5Qcm9iZVJlc3BvbnNlLkNvbW1pdHNFbnRyeRouCgxDb21taXRzRW50cnkSCwoDa2V5GAEgASgJEg0KBXZhbHVlGAIgASgJOgI4ASJcCgZBY2Nlc3MSFgoSQUNDRVNTX1VOU1BFQ0lGSUVEEAASEQoNQUNDRVNTX1BVQkxJQxABEhQKEEFDQ0VTU19SRUFDSEFCTEUQAhIRCg1BQ0NFU1NfREVOSUVEEAMiKwoNUmV0aXJlUmVxdWVzdBIaChJ1bnVzZWRfZm9yX3NlY29uZHMYASABKAMiNgoOUmV0aXJlUmVzcG9uc2USDwoHcmV0aXJlZBgBIAEoBRITCgtmcmVlZF9ieXRlcxgCIAEoAyINCgtJbmZvUmVxdWVzdCLCAQoMSW5mb1Jlc3BvbnNlEg8KB3ZlcnNpb24YASABKAkSEwoLZ2l0X3ZlcnNpb24YAiABKAkSDQoFcG9vbHMYAyABKAUSEwoLcG9vbHNfYnl0ZXMYBCABKAMSIwoIc3RyYXRlZ3kYBSABKA4yES5naXRkLnYxLlN0cmF0ZWd5EhcKD3N0cmF0ZWd5X3JlYXNvbhgGIAEoCRIRCgl0ZW1wbGF0ZXMYByABKAUSFwoPdGVtcGxhdGVzX2J5dGVzGAggASgDIlUKDEF1ZGl0UmVxdWVzdBIpCgVzaW5jZRgBIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASCwoDdXJsGAIgASgJEg0KBWxpbWl0GAMgASgFIjUKDUF1ZGl0UmVzcG9uc2USJAoHZW50cmllcxgBIAMoCzITLmdpdGQudjEuQXVkaXRFbnRyeSLTAwoKQXVkaXRFbnRyeRIoCgR0aW1lGAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIRCgl3b3Jrc3BhY2UYAiABKAkSCwoDdXJsGAMgASgJEg4KBmJyYW5jaBgEIAEoCRIwCgpyZXBvc2l0b3J5GAUgASgLMhwuZ2l0ZC52MS5QdWJsaXNoZWRSZXBvc2l0b3J5EjAKCnN1Ym1vZHVsZXMYBiADKAsyHC5naXRkLnYxLlB1Ymxpc2hlZFJlcG9zaXRvcnkSJAoHcmVmdXNhbBgHIAEoCzITLmdpdGQudjEuR2l0RmFpbHVyZRIUCgxyZXF1ZXN0ZWRfYnkYCCABKAkSMAoMcHVsbF9yZXF1ZXN0GAkgASgLMhouZ2l0ZC52MS5PcGVuZWRQdWxsUmVxdWVzdBIxChRwdWxsX3JlcXVlc3RfZmFpbHVyZRgKIAEoCzITLmdpdGQudjEuR2l0RmFpbHVyZRIsCgZjaGFuZ2UYCyABKAsyHC5naXRkLnYxLkNvbmZpZ3VyYXRpb25DaGFuZ2USJwoKcHJvdmVuYW5jZRgMIAEoCzITLmdpdGQudjEuUHJvdmVuYW5jZRIPCgdzYW5kYm94GA0gASgJIukCChNDb25maWd1cmF0aW9uQ2hhbmdlEjMKBmFjdGlvbhgBIAEoDjIjLmdpdGQudjEuQ29uZmlndXJhdGlvbkNoYW5nZS5BY3Rpb24SDwoHc3ViamVjdBgCIAEoCRISCgp1cmxfcHJlZml4GAMgASgJIvcBCgZBY3Rpb24SFgoSQUNUSU9OX1VOU1BFQ0lGSUVEEAASGwoXQUNUSU9OX0NPTk5FQ1RJT05fQURERUQQARIdChlBQ1RJT05fQ09OTkVDVElPTl9SRU1PVkVEEAISFwoTQUNUSU9OX1NFVFRJTkdTX1NFVBADEhsKF0FDVElPTl9TRVRUSU5HU19SRU1PVkVEEAQSFQoRQUNUSU9OX1BSRVNFVF9TRVQQBRIZChVBQ1RJT05fUFJFU0VUX1JFTU9WRUQQBhIXChNBQ1RJT05fVE9LRU5fSVNTVUVEEAcSGAoUQUNUSU9OX1RPS0VOX1JFVk9LRUQQCCLiAgoKQ29ubmVjdGlvbhIKCgJpZBgBIAEoCRImCgRraW5kGAIgASgOMhguZ2l0ZC52MS5Db25uZWN0aW9uLktpbmQSEgoKdXJsX3ByZWZpeBgDIAEoCRIPCgdhY3RzX2FzGAQgASgJEg4KBmFwcF9pZBgFIAEoAxISCgptYW5hZ2VfdXJsGAYgASgJEisKB2V4cGlyZXMYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhEKCWZyb21fZmlsZRgIIAEoCBIrCgdjcmVhdGVkGAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJqCgRLaW5kEhQKEEtJTkRfVU5TUEVDSUZJRUQQABIOCgpLSU5EX1RPS0VOEAESEAoMS0lORF9TU0hfS0VZEAISEwoPS0lORF9HSVRIVUJfQVBQEAMSFQoRS0lORF9HSVRIVUJfTE9HSU4QBCJfChVCZWdpbkdpdEh1YkFwcFJlcXVlc3QSDAoEaG9zdBgBIAEoCRIUCgxvcmdhbml6YXRpb24YAiABKAkSDAoEbmFtZRgDIAEoCRIUCgxyZWRpcmVjdF91cmwYBCABKAkiTgoWQmVnaW5HaXRIdWJBcHBSZXNwb25zZRITCgtmb3JtX2FjdGlvbhgBIAEoCRIQCghtYW5pZmVzdBgCIAEoCRINCgVzdGF0ZRgDIAEoCSI3ChhDb21wbGV0ZUdpdEh1YkFwcFJlcXVlc3QSDAoEY29kZRgBIAEoCRINCgVzdGF0ZRgCIAEoCSJZChlDb21wbGV0ZUdpdEh1YkFwcFJlc3BvbnNlEicKCmNvbm5lY3Rpb24YASABKAsyEy5naXRkLnYxLkNvbm5lY3Rpb24SEwoLaW5zdGFsbF91cmwYAiABKAkiJwoXU3RhcnRHaXRIdWJMb2dpblJlcXVlc3QSDAoEaG9zdBgBIAEoCSJ1ChhTdGFydEdpdEh1YkxvZ2luUmVzcG9uc2USEQoJdXNlcl9jb2RlGAEgASgJEhgKEHZlcmlmaWNhdGlvbl91cmwYAiABKAkSEAoIbG9naW5faWQYAyABKAkSGgoSZXhwaXJlc19pbl9zZWNvbmRzGAQgASgFIiwKGEZpbmlzaEdpdEh1YkxvZ2luUmVxdWVzdBIQCghsb2dpbl9pZBgBIAEoCSJZChlGaW5pc2hHaXRIdWJMb2dpblJlc3BvbnNlEicKCmNvbm5lY3Rpb24YASABKAsyEy5naXRkLnYxLkNvbm5lY3Rpb24SEwoLaW5zdGFsbF91cmwYAiABKAkiXAoTQWRkR2l0SHViQXBwUmVxdWVzdBIMCgRob3N0GAEgASgJEg4KBmFwcF9pZBgCIAEoAxITCgtwcml2YXRlX2tleRgDIAEoCRISCgp1cmxfcHJlZml4GAQgASgJIj8KFEFkZEdpdEh1YkFwcFJlc3BvbnNlEicKCmNvbm5lY3Rpb24YASABKAsyEy5naXRkLnYxLkNvbm5lY3Rpb24iQgoPQWRkVG9rZW5SZXF1ZXN0EhIKCnVybF9wcmVmaXgYASABKAkSDQoFdG9rZW4YAiABKAkSDAoEdXNlchgDIAEoCSI7ChBBZGRUb2tlblJlc3BvbnNlEicKCmNvbm5lY3Rpb24YASABKAsyEy5naXRkLnYxLkNvbm5lY3Rpb24iGAoWTGlzdENvbm5lY3Rpb25zUmVxdWVzdCJDChdMaXN0Q29ubmVjdGlvbnNSZXNwb25zZRIoCgtjb25uZWN0aW9ucxgBIAMoCzITLmdpdGQudjEuQ29ubmVjdGlvbiIlChdSZW1vdmVDb25uZWN0aW9uUmVxdWVzdBIKCgJpZBgBIAEoCSIaChhSZW1vdmVDb25uZWN0aW9uUmVzcG9uc2UijgIKD1B1Ymxpc2hTZXR0aW5ncxISCgp1cmxfcHJlZml4GAEgASgJEg4KBnByZXNldBgCIAEoCRIXCg9wcm90ZWN0ZWRfcGF0aHMYAyADKAkSEgoKa2VwdF9wYXRocxgEIAMoCRIeChFtYXhfY2hhbmdlZF9maWxlcxgFIAEoBUgAiAEBEhUKDWJyYW5jaF9wcmVmaXgYBiABKAkSMwoNcHVsbF9yZXF1ZXN0cxgHIAEoCzIcLmdpdGQudjEuUHVsbFJlcXVlc3RTZXR0aW5ncxIRCglmcm9tX2ZpbGUYCCABKAgSFQoNYWxsb3dlZF9wYXRocxgJIAMoCUIUChJfbWF4X2NoYW5nZWRfZmlsZXMi+QEKBlByZXNldBIMCgRuYW1lGAEgASgJEhcKD3Byb3RlY3RlZF9wYXRocxgCIAMoCRISCgprZXB0X3BhdGhzGAMgAygJEh4KEW1heF9jaGFuZ2VkX2ZpbGVzGAQgASgFSACIAQESJgoGb3JpZ2luGAUgASgOMhYuZ2l0ZC52MS5QcmVzZXQuT3JpZ2luIlYKBk9yaWdpbhIWChJPUklHSU5fVU5TUEVDSUZJRUQQABITCg9PUklHSU5fQlVJTFRfSU4QARIPCgtPUklHSU5fRklMRRACEg4KCk9SSUdJTl9BUEkQA0IUChJfbWF4X2NoYW5nZWRfZmlsZXMi0AEKE1B1bGxSZXF1ZXN0U2V0dGluZ3MSLwoEb3BlbhgBIAEoDjIhLmdpdGQudjEuUHVsbFJlcXVlc3RTZXR0aW5ncy5PcGVuEg0KBWRyYWZ0GAIgASgIEg4KBmxhYmVscxgDIAMoCRIlCh1yZXF1ZXN0X3Jldmlld19mcm9tX3JlcXVlc3RlchgEIAEoCCJCCgRPcGVuEhQKEE9QRU5fVU5TUEVDSUZJRUQQABITCg9PUEVOX1dIRU5fQVNLRUQQARIPCgtPUEVOX0FMV0FZUxACIhQKEkdldFNldHRpbmdzUmVxdWVzdCJBChNHZXRTZXR0aW5nc1Jlc3BvbnNlEioKCHNldHRpbmdzGAEgAygLMhguZ2l0ZC52MS5QdWJsaXNoU2V0dGluZ3MiQAoSU2V0U2V0dGluZ3NSZXF1ZXN0EioKCHNldHRpbmdzGAEgASgLMhguZ2l0ZC52MS5QdWJsaXNoU2V0dGluZ3MiQQoTU2V0U2V0dGluZ3NSZXNwb25zZRIqCghzZXR0aW5ncxgBIAEoCzIYLmdpdGQudjEuUHVibGlzaFNldHRpbmdzIisKFVJlbW92ZVNldHRpbmdzUmVxdWVzdBISCgp1cmxfcHJlZml4GAEgASgJIhgKFlJlbW92ZVNldHRpbmdzUmVzcG9uc2UiFAoSTGlzdFByZXNldHNSZXF1ZXN0IjcKE0xpc3RQcmVzZXRzUmVzcG9uc2USIAoHcHJlc2V0cxgBIAMoCzIPLmdpdGQudjEuUHJlc2V0IjMKEFNldFByZXNldFJlcXVlc3QSHwoGcHJlc2V0GAEgASgLMg8uZ2l0ZC52MS5QcmVzZXQiNAoRU2V0UHJlc2V0UmVzcG9uc2USHwoGcHJlc2V0GAEgASgLMg8uZ2l0ZC52MS5QcmVzZXQiIwoTUmVtb3ZlUHJlc2V0UmVxdWVzdBIMCgRuYW1lGAEgASgJIhYKFFJlbW92ZVByZXNldFJlc3BvbnNlIm4KEUlzc3VlVG9rZW5SZXF1ZXN0EgsKA3VybBgBIAEoCRIOCgZicmFuY2gYAiABKAkSGAoQbGlmZXRpbWVfc2Vjb25kcxgDIAEoAxIRCglyZWFkX29ubHkYBCABKAgSDwoHc2FuZGJveBgFIAEoCSJYChJJc3N1ZVRva2VuUmVzcG9uc2USDQoFdG9rZW4YASABKAkSIAoEaW5mbxgCIAEoCzISLmdpdGQudjEuVG9rZW5JbmZvEhEKCWNsb25lX3VybBgDIAEoCSKmAQoJVG9rZW5JbmZvEgoKAmlkGAEgASgJEgsKA3VybBgCIAEoCRIPCgdzYW5kYm94GAMgASgJEhAKCHdyaXRhYmxlGAQgASgIEi0KCWlzc3VlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASLgoKZXhwaXJlc19hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiOAoSUmV2b2tlVG9rZW5SZXF1ZXN0EgoKAmlkGAEgASgJEhYKDnJlbW92ZV9zYW5kYm94GAIgASgIIhUKE1Jldm9rZVRva2VuUmVzcG9uc2UiEwoRTGlzdFRva2Vuc1JlcXVlc3QiOAoSTGlzdFRva2Vuc1Jlc3BvbnNlEiIKBnRva2VucxgBIAMoCzISLmdpdGQudjEuVG9rZW5JbmZvKmMKCFN0cmF0ZWd5EhgKFFNUUkFURUdZX1VOU1BFQ0lGSUVEEAASEQoNU1RSQVRFR1lfQ09QWRABEhQKEFNUUkFURUdZX09WRVJMQVkQAhIUChBTVFJBVEVHWV9SRUZMSU5LEAMywAcKEFdvcmtzcGFjZVNlcnZpY2USPgoHUHJlcGFyZRIXLmdpdGQudjEuUHJlcGFyZVJlcXVlc3QaGC5naXRkLnYxLlByZXBhcmVSZXNwb25zZTABEjsKBlVwZGF0ZRIWLmdpdGQudjEuVXBkYXRlUmVxdWVzdBoXLmdpdGQudjEuVXBkYXRlUmVzcG9uc2UwARJBCghDaGVja291dBIYLmdpdGQudjEuQ2hlY2tvdXRSZXF1ZXN0GhkuZ2l0ZC52MS5DaGVja291dFJlc3BvbnNlMAESUwoOU3luY1N1Ym1vZHVsZXMSHi5naXRkLnYxLlN5bmNTdWJtb2R1bGVzUmVxdWVzdBofLmdpdGQudjEuU3luY1N1Ym1vZHVsZXNSZXNwb25zZTABEj8KCERlc2NyaWJlEhguZ2l0ZC52MS5EZXNjcmliZVJlcXVlc3QaGS5naXRkLnYxLkRlc2NyaWJlUmVzcG9uc2USOQoGUmVtb3ZlEhYuZ2l0ZC52MS5SZW1vdmVSZXF1ZXN0GhcuZ2l0ZC52MS5SZW1vdmVSZXNwb25zZRI4CgVBZG9wdBIVLmdpdGQudjEuQWRvcHRSZXF1ZXN0GhYuZ2l0ZC52MS5BZG9wdFJlc3BvbnNlMAESPAoHUHVibGlzaBIXLmdpdGQudjEuUHVibGlzaFJlcXVlc3QaGC5naXRkLnYxLlB1Ymxpc2hSZXNwb25zZRI8CgdDaGFuZ2VzEhcuZ2l0ZC52MS5DaGFuZ2VzUmVxdWVzdBoYLmdpdGQudjEuQ2hhbmdlc1Jlc3BvbnNlEjMKBERpZmYSFC5naXRkLnYxLkRpZmZSZXF1ZXN0GhUuZ2l0ZC52MS5EaWZmUmVzcG9uc2USPAoHQ29tcGFyZRIXLmdpdGQudjEuQ29tcGFyZVJlcXVlc3QaGC5naXRkLnYxLkNvbXBhcmVSZXNwb25zZRJCCglDb25mbGljdHMSGS5naXRkLnYxLkNvbmZsaWN0c1JlcXVlc3QaGi5naXRkLnYxLkNvbmZsaWN0c1Jlc3BvbnNlEjgKBVdhdGNoEhUuZ2l0ZC52MS5XYXRjaFJlcXVlc3QaFi5naXRkLnYxLldhdGNoUmVzcG9uc2UwARIzCgRTZWFsEhQuZ2l0ZC52MS5TZWFsUmVxdWVzdBoVLmdpdGQudjEuU2VhbFJlc3BvbnNlEj8KCExpc3RXYXJtEhguZ2l0ZC52MS5MaXN0V2FybVJlcXVlc3QaGS5naXRkLnYxLkxpc3RXYXJtUmVzcG9uc2UySwoRUmVwb3NpdG9yeVNlcnZpY2USNgoFUHJvYmUSFS5naXRkLnYxLlByb2JlUmVxdWVzdBoWLmdpdGQudjEuUHJvYmVSZXNwb25zZTK3AQoNU2VydmVyU2VydmljZRIzCgRJbmZvEhQuZ2l0ZC52MS5JbmZvUmVxdWVzdBoVLmdpdGQudjEuSW5mb1Jlc3BvbnNlEjkKBlJldGlyZRIWLmdpdGQudjEuUmV0aXJlUmVxdWVzdBoXLmdpdGQudjEuUmV0aXJlUmVzcG9uc2USNgoFQXVkaXQSFS5naXRkLnYxLkF1ZGl0UmVxdWVzdBoWLmdpdGQudjEuQXVkaXRSZXNwb25zZTK0BQoRQ29ubmVjdGlvblNlcnZpY2USUQoOQmVnaW5HaXRIdWJBcHASHi5naXRkLnYxLkJlZ2luR2l0SHViQXBwUmVxdWVzdBofLmdpdGQudjEuQmVnaW5HaXRIdWJBcHBSZXNwb25zZRJaChFDb21wbGV0ZUdpdEh1YkFwcBIhLmdpdGQudjEuQ29tcGxldGVHaXRIdWJBcHBSZXF1ZXN0GiIuZ2l0ZC52MS5Db21wbGV0ZUdpdEh1YkFwcFJlc3BvbnNlElcKEFN0YXJ0R2l0SHViTG9naW4SIC5naXRkLnYxLlN0YXJ0R2l0SHViTG9naW5SZXF1ZXN0GiEuZ2l0ZC52MS5TdGFydEdpdEh1YkxvZ2luUmVzcG9uc2USWgoRRmluaXNoR2l0SHViTG9naW4SIS5naXRkLnYxLkZpbmlzaEdpdEh1YkxvZ2luUmVxdWVzdBoiLmdpdGQudjEuRmluaXNoR2l0SHViTG9naW5SZXNwb25zZRJLCgxBZGRHaXRIdWJBcHASHC5naXRkLnYxLkFkZEdpdEh1YkFwcFJlcXVlc3QaHS5naXRkLnYxLkFkZEdpdEh1YkFwcFJlc3BvbnNlEj8KCEFkZFRva2VuEhguZ2l0ZC52MS5BZGRUb2tlblJlcXVlc3QaGS5naXRkLnYxLkFkZFRva2VuUmVzcG9uc2USVAoPTGlzdENvbm5lY3Rpb25zEh8uZ2l0ZC52MS5MaXN0Q29ubmVjdGlvbnNSZXF1ZXN0GiAuZ2l0ZC52MS5MaXN0Q29ubmVjdGlvbnNSZXNwb25zZRJXChBSZW1vdmVDb25uZWN0aW9uEiAuZ2l0ZC52MS5SZW1vdmVDb25uZWN0aW9uUmVxdWVzdBohLmdpdGQudjEuUmVtb3ZlQ29ubmVjdGlvblJlc3BvbnNlMtUDChFQdWJsaXNoaW5nU2VydmljZRJICgtHZXRTZXR0aW5ncxIbLmdpdGQudjEuR2V0U2V0dGluZ3NSZXF1ZXN0GhwuZ2l0ZC52MS5HZXRTZXR0aW5nc1Jlc3BvbnNlEkgKC1NldFNldHRpbmdzEhsuZ2l0ZC52MS5TZXRTZXR0aW5nc1JlcXVlc3QaHC5naXRkLnYxLlNldFNldHRpbmdzUmVzcG9uc2USUQoOUmVtb3ZlU2V0dGluZ3MSHi5naXRkLnYxLlJlbW92ZVNldHRpbmdzUmVxdWVzdBofLmdpdGQudjEuUmVtb3ZlU2V0dGluZ3NSZXNwb25zZRJICgtMaXN0UHJlc2V0cxIbLmdpdGQudjEuTGlzdFByZXNldHNSZXF1ZXN0GhwuZ2l0ZC52MS5MaXN0UHJlc2V0c1Jlc3BvbnNlEkIKCVNldFByZXNldBIZLmdpdGQudjEuU2V0UHJlc2V0UmVxdWVzdBoaLmdpdGQudjEuU2V0UHJlc2V0UmVzcG9uc2USSwoMUmVtb3ZlUHJlc2V0EhwuZ2l0ZC52MS5SZW1vdmVQcmVzZXRSZXF1ZXN0Gh0uZ2l0ZC52MS5SZW1vdmVQcmVzZXRSZXNwb25zZTLpAQoPRW5kcG9pbnRTZXJ2aWNlEkUKCklzc3VlVG9rZW4SGi5naXRkLnYxLklzc3VlVG9rZW5SZXF1ZXN0GhsuZ2l0ZC52MS5Jc3N1ZVRva2VuUmVzcG9uc2USSAoLUmV2b2tlVG9rZW4SGy5naXRkLnYxLlJldm9rZVRva2VuUmVxdWVzdBocLmdpdGQudjEuUmV2b2tlVG9rZW5SZXNwb25zZRJFCgpMaXN0VG9rZW5zEhouZ2l0ZC52MS5MaXN0VG9rZW5zUmVxdWVzdBobLmdpdGQudjEuTGlzdFRva2Vuc1Jlc3BvbnNlQjJaMGdpdGh1Yi5jb20vZG9vc2VydmljZS9naXRkL2dlbi9nby9naXRkL3YxO2dpdGR2MWIGcHJvdG8z", [file_google_protobuf_timestamp]);
10
10
  /**
11
11
  * Describes the message gitd.v1.Credential.
12
12
  * Use `create(CredentialSchema)` to create a new message.
@@ -114,6 +114,12 @@ export var GitFailure_Reason;
114
114
  * @generated from enum value: REASON_UNSUPPORTED = 14;
115
115
  */
116
116
  GitFailure_Reason[GitFailure_Reason["UNSUPPORTED"] = 14] = "UNSUPPORTED";
117
+ /**
118
+ * A limit of the tenant is reached: its workspaces, its disk or its tokens.
119
+ *
120
+ * @generated from enum value: REASON_LIMIT_REACHED = 15;
121
+ */
122
+ GitFailure_Reason[GitFailure_Reason["LIMIT_REACHED"] = 15] = "LIMIT_REACHED";
117
123
  })(GitFailure_Reason || (GitFailure_Reason = {}));
118
124
  /**
119
125
  * Describes the enum gitd.v1.GitFailure.Reason.
@@ -507,6 +513,14 @@ export var ConfigurationChange_Action;
507
513
  * @generated from enum value: ACTION_PRESET_REMOVED = 6;
508
514
  */
509
515
  ConfigurationChange_Action[ConfigurationChange_Action["PRESET_REMOVED"] = 6] = "PRESET_REMOVED";
516
+ /**
517
+ * @generated from enum value: ACTION_TOKEN_ISSUED = 7;
518
+ */
519
+ ConfigurationChange_Action[ConfigurationChange_Action["TOKEN_ISSUED"] = 7] = "TOKEN_ISSUED";
520
+ /**
521
+ * @generated from enum value: ACTION_TOKEN_REVOKED = 8;
522
+ */
523
+ ConfigurationChange_Action[ConfigurationChange_Action["TOKEN_REVOKED"] = 8] = "TOKEN_REVOKED";
510
524
  })(ConfigurationChange_Action || (ConfigurationChange_Action = {}));
511
525
  /**
512
526
  * Describes the enum gitd.v1.ConfigurationChange.Action.
@@ -758,6 +772,41 @@ export const RemovePresetRequestSchema = /*@__PURE__*/ messageDesc(file_gitd_v1_
758
772
  * Use `create(RemovePresetResponseSchema)` to create a new message.
759
773
  */
760
774
  export const RemovePresetResponseSchema = /*@__PURE__*/ messageDesc(file_gitd_v1_gitd, 89);
775
+ /**
776
+ * Describes the message gitd.v1.IssueTokenRequest.
777
+ * Use `create(IssueTokenRequestSchema)` to create a new message.
778
+ */
779
+ export const IssueTokenRequestSchema = /*@__PURE__*/ messageDesc(file_gitd_v1_gitd, 90);
780
+ /**
781
+ * Describes the message gitd.v1.IssueTokenResponse.
782
+ * Use `create(IssueTokenResponseSchema)` to create a new message.
783
+ */
784
+ export const IssueTokenResponseSchema = /*@__PURE__*/ messageDesc(file_gitd_v1_gitd, 91);
785
+ /**
786
+ * Describes the message gitd.v1.TokenInfo.
787
+ * Use `create(TokenInfoSchema)` to create a new message.
788
+ */
789
+ export const TokenInfoSchema = /*@__PURE__*/ messageDesc(file_gitd_v1_gitd, 92);
790
+ /**
791
+ * Describes the message gitd.v1.RevokeTokenRequest.
792
+ * Use `create(RevokeTokenRequestSchema)` to create a new message.
793
+ */
794
+ export const RevokeTokenRequestSchema = /*@__PURE__*/ messageDesc(file_gitd_v1_gitd, 93);
795
+ /**
796
+ * Describes the message gitd.v1.RevokeTokenResponse.
797
+ * Use `create(RevokeTokenResponseSchema)` to create a new message.
798
+ */
799
+ export const RevokeTokenResponseSchema = /*@__PURE__*/ messageDesc(file_gitd_v1_gitd, 94);
800
+ /**
801
+ * Describes the message gitd.v1.ListTokensRequest.
802
+ * Use `create(ListTokensRequestSchema)` to create a new message.
803
+ */
804
+ export const ListTokensRequestSchema = /*@__PURE__*/ messageDesc(file_gitd_v1_gitd, 95);
805
+ /**
806
+ * Describes the message gitd.v1.ListTokensResponse.
807
+ * Use `create(ListTokensResponseSchema)` to create a new message.
808
+ */
809
+ export const ListTokensResponseSchema = /*@__PURE__*/ messageDesc(file_gitd_v1_gitd, 96);
761
810
  /**
762
811
  * How a workspace was made.
763
812
  *
@@ -824,3 +873,12 @@ export const ConnectionService = /*@__PURE__*/ serviceDesc(file_gitd_v1_gitd, 3)
824
873
  * @generated from service gitd.v1.PublishingService
825
874
  */
826
875
  export const PublishingService = /*@__PURE__*/ serviceDesc(file_gitd_v1_gitd, 4);
876
+ /**
877
+ * gitd's git endpoint, for sandboxes that cannot mount its directories — microVMs, remote
878
+ * sandboxes, CI runners elsewhere — and clone over HTTP instead. A token of gitd's own opens
879
+ * one repository for reading and one sandbox repository for writing; it is never the git
880
+ * host's credential. What a sandbox pushed is published with Publish and `sandbox`.
881
+ *
882
+ * @generated from service gitd.v1.EndpointService
883
+ */
884
+ export const EndpointService = /*@__PURE__*/ serviceDesc(file_gitd_v1_gitd, 5);
package/dist/gitd.d.ts CHANGED
@@ -1,11 +1,21 @@
1
1
  import { type Transport } from "@connectrpc/connect";
2
2
  import { Credentials } from "./credentials.js";
3
+ import { Endpoint } from "./endpoint.js";
3
4
  import { Publishing } from "./publishing.js";
4
5
  import type { PublishOptions } from "./publishing-types.js";
5
6
  import type { AuditEntry, AuditOptions, Changes, CheckoutOptions, CompareOptions, Comparison, Conflict, Description, Diff, DiffOptions, Info, PrepareOptions, Probe, Published, Side, WorkspaceEvent, UpdateOptions, WarmLayer, Workspace } from "./types.js";
6
7
  export interface GitdOptions {
7
8
  /** gitd's Unix socket; default $GITD_SOCKET, then /run/gitd/gitd.sock. */
8
9
  socket?: string;
10
+ /**
11
+ * A gitd on the network instead, e.g. `https://gitd.internal:9420` (or http:// on a private
12
+ * network); default $GITD_URL.
13
+ */
14
+ url?: string;
15
+ /** The key naming your tenant; default the file $GITD_KEY_FILE names, then $GITD_KEY. */
16
+ key?: string;
17
+ /** The PEM of a certificate authority the system does not trust; default $GITD_CA_FILE's. */
18
+ ca?: string;
9
19
  /** A transport of your own instead, e.g. for tests. */
10
20
  transport?: Transport;
11
21
  }
@@ -19,6 +29,8 @@ export declare class Gitd {
19
29
  readonly credentials: Credentials;
20
30
  /** The rules publishing follows, per repository prefix. */
21
31
  readonly publishing: Publishing;
32
+ /** Tokens of gitd's endpoint, for sandboxes elsewhere. */
33
+ readonly endpoint: Endpoint;
22
34
  private readonly workspaces;
23
35
  private readonly repositories;
24
36
  private readonly server;
package/dist/gitd.js CHANGED
@@ -1,12 +1,14 @@
1
1
  import { timestampFromDate } from "@bufbuild/protobuf/wkt";
2
2
  import { createClient } from "@connectrpc/connect";
3
+ import { readFileSync } from "node:fs";
3
4
  import { createConnectTransport } from "@connectrpc/connect-node";
4
- import { ConnectionService, PublishingService, RepositoryService, ServerService, WorkspaceService, } from "./gen/gitd/v1/gitd_pb.js";
5
+ import { ConnectionService, EndpointService, PublishingService, RepositoryService, ServerService, WorkspaceService, } from "./gen/gitd/v1/gitd_pb.js";
5
6
  import { call, drain } from "./calls.js";
6
7
  import { sideProto, toEvent, toSide } from "./compare-convert.js";
7
8
  import { toWarmLayer } from "./warm-convert.js";
8
9
  import { refusal } from "./errors.js";
9
10
  import { Credentials } from "./credentials.js";
11
+ import { Endpoint } from "./endpoint.js";
10
12
  import { pullRequestOptionsProto } from "./publishing-convert.js";
11
13
  import { Publishing } from "./publishing.js";
12
14
  import { accessName, publishedOf, revisionOf, strategyName, strategyProto, toAuditEntry, toChangedFiles, toChanges, toWorkspace, } from "./convert.js";
@@ -21,16 +23,19 @@ export class Gitd {
21
23
  credentials;
22
24
  /** The rules publishing follows, per repository prefix. */
23
25
  publishing;
26
+ /** Tokens of gitd's endpoint, for sandboxes elsewhere. */
27
+ endpoint;
24
28
  workspaces;
25
29
  repositories;
26
30
  server;
27
31
  constructor(options = {}) {
28
- const transport = options.transport ?? socketTransport(options.socket);
32
+ const transport = options.transport ?? transportFor(options);
29
33
  this.workspaces = createClient(WorkspaceService, transport);
30
34
  this.repositories = createClient(RepositoryService, transport);
31
35
  this.server = createClient(ServerService, transport);
32
36
  this.credentials = new Credentials(createClient(ConnectionService, transport));
33
37
  this.publishing = new Publishing(createClient(PublishingService, transport));
38
+ this.endpoint = new Endpoint(createClient(EndpointService, transport));
34
39
  }
35
40
  /** Which gitd answers, and how it makes workspaces here and why. */
36
41
  async info() {
@@ -109,6 +114,7 @@ export class Gitd {
109
114
  path,
110
115
  branch,
111
116
  requestedBy: options.requestedBy ?? "",
117
+ sandbox: options.sandbox ?? "",
112
118
  pullRequest: pullRequestOptionsProto(options.pullRequest),
113
119
  provenance: options.provenance && {
114
120
  agent: options.provenance.agent ?? "",
@@ -197,10 +203,39 @@ export class Gitd {
197
203
  await call(() => this.workspaces.remove({ path }));
198
204
  }
199
205
  }
200
- function socketTransport(socket) {
206
+ /** The way to the gitd options name: its network address, else its socket, with the key. */
207
+ function transportFor(options) {
208
+ const key = options.key ?? keyFromEnvironment();
209
+ const interceptors = key
210
+ ? [
211
+ (next) => async (request) => {
212
+ request.header.set("Authorization", `Bearer ${key}`);
213
+ return next(request);
214
+ },
215
+ ]
216
+ : [];
217
+ const url = options.url ?? process.env.GITD_URL;
218
+ if (url) {
219
+ const caFile = process.env.GITD_CA_FILE;
220
+ const ca = options.ca ?? (caFile ? readFileSync(caFile, "utf8") : undefined);
221
+ return createConnectTransport({
222
+ baseUrl: url.replace(/\/$/, ""),
223
+ httpVersion: "1.1",
224
+ interceptors,
225
+ nodeOptions: ca ? { ca } : {},
226
+ });
227
+ }
201
228
  return createConnectTransport({
202
229
  baseUrl: "http://gitd",
203
230
  httpVersion: "1.1",
204
- nodeOptions: { socketPath: socket ?? process.env.GITD_SOCKET ?? defaultSocket },
231
+ interceptors,
232
+ nodeOptions: { socketPath: options.socket ?? process.env.GITD_SOCKET ?? defaultSocket },
205
233
  });
206
234
  }
235
+ function keyFromEnvironment() {
236
+ const file = process.env.GITD_KEY_FILE;
237
+ if (file) {
238
+ return readFileSync(file, "utf8").trim();
239
+ }
240
+ return process.env.GITD_KEY?.trim() || undefined;
241
+ }
package/dist/index.d.ts CHANGED
@@ -2,6 +2,8 @@ export { Gitd, type GitdOptions } from "./gitd.js";
2
2
  export { GitdError } from "./errors.js";
3
3
  export { Credentials } from "./credentials.js";
4
4
  export { Publishing } from "./publishing.js";
5
+ export { Endpoint } from "./endpoint.js";
6
+ export type * from "./endpoint-types.js";
5
7
  export type * from "./types.js";
6
8
  export type * from "./credential-types.js";
7
9
  export type * from "./publishing-types.js";
package/dist/index.js CHANGED
@@ -2,4 +2,5 @@ export { Gitd } from "./gitd.js";
2
2
  export { GitdError } from "./errors.js";
3
3
  export { Credentials } from "./credentials.js";
4
4
  export { Publishing } from "./publishing.js";
5
+ export { Endpoint } from "./endpoint.js";
5
6
  export * as proto from "./gen/gitd/v1/gitd_pb.js";
@@ -62,6 +62,8 @@ export interface PublishOptions {
62
62
  requestedBy?: string;
63
63
  pullRequest?: PullRequestOptions;
64
64
  provenance?: Provenance;
65
+ /** Publish what a sandbox pushed through the endpoint instead of a workspace; path is then "". */
66
+ sandbox?: string;
65
67
  }
66
68
  /** A pull request gitd opened. */
67
69
  export interface OpenedPullRequest {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gitd-client",
3
- "version": "0.8.0",
3
+ "version": "0.10.0",
4
4
  "description": "Client for gitd: instant, secretless git checkouts for agent sandboxes",
5
5
  "license": "Apache-2.0",
6
6
  "repository": {