diff --git a/components/dashboard/src/components/OrgMemberPermissionsOptions.tsx b/components/dashboard/src/components/OrgMemberPermissionsOptions.tsx index e1cf7a1d0f9e25..d47668f8c0288b 100644 --- a/components/dashboard/src/components/OrgMemberPermissionsOptions.tsx +++ b/components/dashboard/src/components/OrgMemberPermissionsOptions.tsx @@ -47,7 +47,7 @@ export const OrgMemberPermissionRestrictionsOptions = ({ return (
{rolesAllowedToOpenArbitraryRepositories.map((entry) => ( -
+
{entry} @@ -116,6 +116,7 @@ export const OrganizationRoleRestrictionModal = ({ { console.log(role, { checked }); if (!checked) { diff --git a/components/dashboard/src/components/WorkspaceClassesOptions.tsx b/components/dashboard/src/components/WorkspaceClassesOptions.tsx index 8a85ce8ccda209..6f9d7c5164a23d 100644 --- a/components/dashboard/src/components/WorkspaceClassesOptions.tsx +++ b/components/dashboard/src/components/WorkspaceClassesOptions.tsx @@ -35,7 +35,7 @@ export const WorkspaceClassesOptions = (props: WorkspaceClassesOptionsProps) => return (
{props.classes.map((cls) => ( -
+
{cls.displayName} diff --git a/components/dashboard/src/components/forms/TextInputField.tsx b/components/dashboard/src/components/forms/TextInputField.tsx index b6a81302b4e71c..d8735dbe8877ed 100644 --- a/components/dashboard/src/components/forms/TextInputField.tsx +++ b/components/dashboard/src/components/forms/TextInputField.tsx @@ -18,7 +18,6 @@ type Props = TextInputProps & { topMargin?: boolean; containerClassName?: string; }; - export const TextInputField: FunctionComponent = memo( ({ label, id, hint, error, topMargin, containerClassName, ...props }) => { const maybeId = useId(); @@ -44,7 +43,6 @@ interface TextInputProps extends Omit void; onBlur?: () => void; } - export const TextInput: FunctionComponent = memo(({ className, onChange, onBlur, ...props }) => { const handleChange = useCallback( (e) => { @@ -72,3 +70,36 @@ export const TextInput: FunctionComponent = memo(({ className, o /> ); }); + +type NumberInputProps = Omit, "onChange" | "type"> & { + onChange?: (newValue: number) => void; + onBlur?: () => void; +}; +export const NumberInput: FunctionComponent = memo(({ className, onChange, onBlur, ...props }) => { + const handleChange = useCallback( + (e) => { + onChange && onChange(e.target.valueAsNumber); + }, + [onChange], + ); + + const handleBlur = useCallback(() => onBlur && onBlur(), [onBlur]); + + return ( + + ); +}); diff --git a/components/dashboard/src/data/organizations/update-org-settings-mutation.ts b/components/dashboard/src/data/organizations/update-org-settings-mutation.ts index ddd9d339bc503a..a5a91e24042574 100644 --- a/components/dashboard/src/data/organizations/update-org-settings-mutation.ts +++ b/components/dashboard/src/data/organizations/update-org-settings-mutation.ts @@ -24,6 +24,7 @@ type UpdateOrganizationSettingsArgs = Partial< | "defaultRole" | "timeoutSettings" | "roleRestrictions" + | "maxParallelRunningWorkspaces" > >; @@ -43,10 +44,11 @@ export const useUpdateOrgSettingsMutation = () => { defaultRole, timeoutSettings, roleRestrictions, + maxParallelRunningWorkspaces, }) => { const settings = await organizationClient.updateOrganizationSettings({ organizationId: teamId, - workspaceSharingDisabled: workspaceSharingDisabled || false, + workspaceSharingDisabled: workspaceSharingDisabled ?? false, defaultWorkspaceImage, allowedWorkspaceClasses, updatePinnedEditorVersions: !!pinnedEditorVersions, @@ -57,6 +59,7 @@ export const useUpdateOrgSettingsMutation = () => { timeoutSettings, roleRestrictions, updateRoleRestrictions: !!roleRestrictions, + maxParallelRunningWorkspaces, }); return settings.settings!; }, diff --git a/components/dashboard/src/start/StartWorkspace.tsx b/components/dashboard/src/start/StartWorkspace.tsx index 633f5bd694ce13..bb0263710cac51 100644 --- a/components/dashboard/src/start/StartWorkspace.tsx +++ b/components/dashboard/src/start/StartWorkspace.tsx @@ -366,6 +366,9 @@ export default class StartWorkspace extends React.Component Workspace timeouts - {!billingModeAllowsWorkspaceTimeouts && ( + {!isPaidOrDedicated && ( Setting Workspace timeouts is only available for organizations on a paid plan. Visit{" "} @@ -180,9 +181,7 @@ export default function TeamPoliciesPage() { value={workspaceTimeout ?? ""} placeholder="e.g. 30m" onChange={setWorkspaceTimeout} - disabled={ - updateTeamSettings.isLoading || !isOwner || !billingModeAllowsWorkspaceTimeouts - } + disabled={updateTeamSettings.isLoading || !isOwner || !isPaidOrDedicated} /> @@ -212,6 +208,14 @@ export default function TeamPoliciesPage() { + + >, + options?: { + throwMutateError?: boolean; + }, + ) => Promise; +}; + +export const MaxParallelWorkspaces = ({ + isOwner, + isLoading, + settings, + isPaidOrDedicated, + handleUpdateTeamSettings, +}: Props) => { + const [error, setError] = useState(undefined); + const [maxParallelWorkspaces, setMaxParallelWorkspaces] = useState( + settings?.maxParallelRunningWorkspaces ?? 0, + ); + + const organizationDefault = isPaidOrDedicated ? MAX_PARALLEL_WORKSPACES_PAID : MAX_PARALLEL_WORKSPACES_FREE; + const { data: installationConfig } = useInstallationConfiguration(); + const isDedicatedInstallation = !!installationConfig?.isDedicatedInstallation; + + const handleSubmit = async (e: FormEvent) => { + e.preventDefault(); + if (maxParallelWorkspaces < 0) { + setError("The maximum parallel running workspaces must be a positive number."); + return; + } + await handleUpdateTeamSettings({ + maxParallelRunningWorkspaces: maxParallelWorkspaces, + }); + }; + + useEffect(() => { + setMaxParallelWorkspaces(settings?.maxParallelRunningWorkspaces ?? 0); + }, [settings?.maxParallelRunningWorkspaces]); + + return ( + + Maximum parallel running workspaces + + By default, every user in your organization can have {organizationDefault} workspaces + running at the same time. You can change this limit below or revert to this default by specifying{" "} + 0 as the limit. + +
+ + { + setMaxParallelWorkspaces(newValue); + setError(undefined); + }} + disabled={isLoading || !isOwner} + min={0} + max={isDedicatedInstallation ? undefined : organizationDefault} + /> + + + Save + +
+
+ ); +}; diff --git a/components/dashboard/src/workspaces/CreateWorkspacePage.tsx b/components/dashboard/src/workspaces/CreateWorkspacePage.tsx index ffb902b991baf5..e2aaa8252d489d 100644 --- a/components/dashboard/src/workspaces/CreateWorkspacePage.tsx +++ b/components/dashboard/src/workspaces/CreateWorkspacePage.tsx @@ -59,6 +59,7 @@ import { flattenPagedConfigurations } from "../data/git-providers/unified-reposi import { Configuration } from "@gitpod/public-api/lib/gitpod/v1/configuration_pb"; import { useMemberRole } from "../data/organizations/members-query"; import { OrganizationPermission } from "@gitpod/public-api/lib/gitpod/v1/organization_pb"; +import { useInstallationConfiguration } from "../data/installation/default-workspace-image-query"; type NextLoadOption = "searchParams" | "autoStart" | "allDone"; @@ -847,11 +848,16 @@ export const RepositoryNotFound: FC<{ error: StartWorkspaceError }> = ({ error } }; export function LimitReachedParallelWorkspacesModal() { + const { data: installationConfig } = useInstallationConfiguration(); + const isDedicated = !!installationConfig?.isDedicatedInstallation; + return (

- You have reached the limit of parallel running workspaces for your account. Please, upgrade or stop one - of the running workspaces. + You have reached the limit of parallel running workspaces for your account.{" "} + {!isDedicated + ? "Please, upgrade or stop one of your running workspaces." + : "Please, stop one of your running workspaces or contact your organization owner to change the limit."}

); diff --git a/components/gitpod-db/src/typeorm/entity/db-team-settings.ts b/components/gitpod-db/src/typeorm/entity/db-team-settings.ts index a8ef134f3c206d..cb525046a3bad8 100644 --- a/components/gitpod-db/src/typeorm/entity/db-team-settings.ts +++ b/components/gitpod-db/src/typeorm/entity/db-team-settings.ts @@ -39,6 +39,9 @@ export class DBOrgSettings implements OrganizationSettings { @Column("json", { nullable: true }) roleRestrictions?: RoleRestrictions | undefined; + @Column({ type: "int", default: 0 }) + maxParallelRunningWorkspaces: number; + @Column() deleted: boolean; } diff --git a/components/gitpod-db/src/typeorm/migration/1734079239772-AddOrgSettingsMaxParallelWorkspaces.ts b/components/gitpod-db/src/typeorm/migration/1734079239772-AddOrgSettingsMaxParallelWorkspaces.ts new file mode 100644 index 00000000000000..5bca702c0f4aa5 --- /dev/null +++ b/components/gitpod-db/src/typeorm/migration/1734079239772-AddOrgSettingsMaxParallelWorkspaces.ts @@ -0,0 +1,25 @@ +/** + * Copyright (c) 2024 Gitpod GmbH. All rights reserved. + * Licensed under the GNU Affero General Public License (AGPL). + * See License.AGPL.txt in the project root for license information. + */ + +import { MigrationInterface, QueryRunner } from "typeorm"; +import { columnExists } from "./helper/helper"; + +const table = "d_b_org_settings"; +const newColumn = "maxParallelRunningWorkspaces"; + +export class AddOrgSettingsMaxParallelWorkspaces1734079239772 implements MigrationInterface { + public async up(queryRunner: QueryRunner): Promise { + if (!(await columnExists(queryRunner, table, newColumn))) { + await queryRunner.query(`ALTER TABLE ${table} ADD COLUMN ${newColumn} INTEGER NOT NULL DEFAULT 0`); + } + } + + public async down(queryRunner: QueryRunner): Promise { + if (await columnExists(queryRunner, table, newColumn)) { + await queryRunner.query(`ALTER TABLE ${table} DROP COLUMN ${newColumn}`); + } + } +} diff --git a/components/gitpod-db/src/typeorm/team-db-impl.ts b/components/gitpod-db/src/typeorm/team-db-impl.ts index 40b2464446d2fc..b5a562a193e9b4 100644 --- a/components/gitpod-db/src/typeorm/team-db-impl.ts +++ b/components/gitpod-db/src/typeorm/team-db-impl.ts @@ -374,6 +374,7 @@ export class TeamDBImpl extends TransactionalDBImpl implements TeamDB { "defaultRole", "timeoutSettings", "roleRestrictions", + "maxParallelRunningWorkspaces", ], }); } diff --git a/components/gitpod-protocol/src/gitpod-service.ts b/components/gitpod-protocol/src/gitpod-service.ts index f08313b90a5055..e28848b62a8124 100644 --- a/components/gitpod-protocol/src/gitpod-service.ts +++ b/components/gitpod-protocol/src/gitpod-service.ts @@ -377,6 +377,9 @@ export const WORKSPACE_TIMEOUT_EXTENDED: WorkspaceTimeoutDuration = "180m"; export const WORKSPACE_LIFETIME_SHORT: WorkspaceTimeoutDuration = "8h"; export const WORKSPACE_LIFETIME_LONG: WorkspaceTimeoutDuration = "36h"; +export const MAX_PARALLEL_WORKSPACES_FREE = 4; +export const MAX_PARALLEL_WORKSPACES_PAID = 16; + export const createServiceMock = function ( methods: Partial>, ): GitpodServiceImpl { diff --git a/components/gitpod-protocol/src/teams-projects-protocol.ts b/components/gitpod-protocol/src/teams-projects-protocol.ts index 8778a14c73797f..965ab24379f415 100644 --- a/components/gitpod-protocol/src/teams-projects-protocol.ts +++ b/components/gitpod-protocol/src/teams-projects-protocol.ts @@ -233,6 +233,9 @@ export interface OrganizationSettings { timeoutSettings?: TimeoutSettings; roleRestrictions?: RoleRestrictions; + + // max number of parallel running workspaces per user + maxParallelRunningWorkspaces?: number; } export type TimeoutSettings = { diff --git a/components/public-api/gitpod/v1/organization.proto b/components/public-api/gitpod/v1/organization.proto index 30c632ddfaa3c2..9bc1dd61f4fafb 100644 --- a/components/public-api/gitpod/v1/organization.proto +++ b/components/public-api/gitpod/v1/organization.proto @@ -57,6 +57,8 @@ message OrganizationSettings { string default_role = 6; TimeoutSettings timeout_settings = 7; repeated RoleRestrictionEntry role_restrictions = 8; + // max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan + int32 max_parallel_running_workspaces = 9; } service OrganizationService { @@ -140,7 +142,7 @@ message TimeoutSettings { } message UpdateOrganizationSettingsRequest { - // organization_id is the ID of the organization to update the settings for. + // organization_id is the ID of the organization to update the settings for string organization_id = 1; optional bool workspace_sharing_disabled = 3; @@ -159,17 +161,17 @@ message UpdateOrganizationSettingsRequest { // true. repeated string restricted_editor_names = 6; - // Specifies whether restricted_workspace_classes should be updated. + // Specifies whether restricted_workspace_classes should be updated optional bool update_restricted_editor_names = 7; // pinned_editor_versions updates the pinned version for the corresponding - // editor. + // editor map pinned_editor_versions = 8; - // Specifies whether pinned_editor_versions should be updated. + // Specifies whether pinned_editor_versions should be updated optional bool update_pinned_editor_versions = 9; - // default_role is the default role for new members in the organization. + // default_role is the default role for new members in the organization optional string default_role = 10; // timeout_settings are the settings for workspace timeouts @@ -177,8 +179,11 @@ message UpdateOrganizationSettingsRequest { repeated RoleRestrictionEntry role_restrictions = 12; - // Specifies whether role_restrictions should be updated. + // update_role_restrictions specifies whether role_restrictions should be updated optional bool update_role_restrictions = 13; + + // max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan + optional int32 max_parallel_running_workspaces = 15; } message UpdateOrganizationSettingsResponse { @@ -207,7 +212,7 @@ message CreateOrganizationResponse { } message GetOrganizationRequest { - // organization_id is the unique identifier of the Organization to retreive. + // organization_id is the unique identifier of the Organization to retrieve. string organization_id = 1; } diff --git a/components/public-api/go/v1/organization.pb.go b/components/public-api/go/v1/organization.pb.go index 56292b97a3d523..ad213c72e57e30 100644 --- a/components/public-api/go/v1/organization.pb.go +++ b/components/public-api/go/v1/organization.pb.go @@ -410,6 +410,8 @@ type OrganizationSettings struct { DefaultRole string `protobuf:"bytes,6,opt,name=default_role,json=defaultRole,proto3" json:"default_role,omitempty"` TimeoutSettings *TimeoutSettings `protobuf:"bytes,7,opt,name=timeout_settings,json=timeoutSettings,proto3" json:"timeout_settings,omitempty"` RoleRestrictions []*RoleRestrictionEntry `protobuf:"bytes,8,rep,name=role_restrictions,json=roleRestrictions,proto3" json:"role_restrictions,omitempty"` + // max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan + MaxParallelRunningWorkspaces int32 `protobuf:"varint,9,opt,name=max_parallel_running_workspaces,json=maxParallelRunningWorkspaces,proto3" json:"max_parallel_running_workspaces,omitempty"` } func (x *OrganizationSettings) Reset() { @@ -500,6 +502,13 @@ func (x *OrganizationSettings) GetRoleRestrictions() []*RoleRestrictionEntry { return nil } +func (x *OrganizationSettings) GetMaxParallelRunningWorkspaces() int32 { + if x != nil { + return x.MaxParallelRunningWorkspaces + } + return 0 +} + type ListOrganizationWorkspaceClassesRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -778,7 +787,7 @@ type UpdateOrganizationSettingsRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // organization_id is the ID of the organization to update the settings for. + // organization_id is the ID of the organization to update the settings for OrganizationId string `protobuf:"bytes,1,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` WorkspaceSharingDisabled *bool `protobuf:"varint,3,opt,name=workspace_sharing_disabled,json=workspaceSharingDisabled,proto3,oneof" json:"workspace_sharing_disabled,omitempty"` // pass empty string to reset to the installation default workspace image @@ -792,20 +801,22 @@ type UpdateOrganizationSettingsRequest struct { // editors are allowed. Only updates if update_restricted_editor_names is // true. RestrictedEditorNames []string `protobuf:"bytes,6,rep,name=restricted_editor_names,json=restrictedEditorNames,proto3" json:"restricted_editor_names,omitempty"` - // Specifies whether restricted_workspace_classes should be updated. + // Specifies whether restricted_workspace_classes should be updated UpdateRestrictedEditorNames *bool `protobuf:"varint,7,opt,name=update_restricted_editor_names,json=updateRestrictedEditorNames,proto3,oneof" json:"update_restricted_editor_names,omitempty"` // pinned_editor_versions updates the pinned version for the corresponding - // editor. + // editor PinnedEditorVersions map[string]string `protobuf:"bytes,8,rep,name=pinned_editor_versions,json=pinnedEditorVersions,proto3" json:"pinned_editor_versions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` - // Specifies whether pinned_editor_versions should be updated. + // Specifies whether pinned_editor_versions should be updated UpdatePinnedEditorVersions *bool `protobuf:"varint,9,opt,name=update_pinned_editor_versions,json=updatePinnedEditorVersions,proto3,oneof" json:"update_pinned_editor_versions,omitempty"` - // default_role is the default role for new members in the organization. + // default_role is the default role for new members in the organization DefaultRole *string `protobuf:"bytes,10,opt,name=default_role,json=defaultRole,proto3,oneof" json:"default_role,omitempty"` // timeout_settings are the settings for workspace timeouts TimeoutSettings *TimeoutSettings `protobuf:"bytes,11,opt,name=timeout_settings,json=timeoutSettings,proto3,oneof" json:"timeout_settings,omitempty"` RoleRestrictions []*RoleRestrictionEntry `protobuf:"bytes,12,rep,name=role_restrictions,json=roleRestrictions,proto3" json:"role_restrictions,omitempty"` - // Specifies whether role_restrictions should be updated. + // update_role_restrictions specifies whether role_restrictions should be updated UpdateRoleRestrictions *bool `protobuf:"varint,13,opt,name=update_role_restrictions,json=updateRoleRestrictions,proto3,oneof" json:"update_role_restrictions,omitempty"` + // max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan + MaxParallelRunningWorkspaces *int32 `protobuf:"varint,15,opt,name=max_parallel_running_workspaces,json=maxParallelRunningWorkspaces,proto3,oneof" json:"max_parallel_running_workspaces,omitempty"` } func (x *UpdateOrganizationSettingsRequest) Reset() { @@ -924,6 +935,13 @@ func (x *UpdateOrganizationSettingsRequest) GetUpdateRoleRestrictions() bool { return false } +func (x *UpdateOrganizationSettingsRequest) GetMaxParallelRunningWorkspaces() int32 { + if x != nil && x.MaxParallelRunningWorkspaces != nil { + return *x.MaxParallelRunningWorkspaces + } + return 0 +} + type UpdateOrganizationSettingsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1169,7 +1187,7 @@ type GetOrganizationRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - // organization_id is the unique identifier of the Organization to retreive. + // organization_id is the unique identifier of the Organization to retrieve. OrganizationId string `protobuf:"bytes,1,opt,name=organization_id,json=organizationId,proto3" json:"organization_id,omitempty"` } @@ -2121,7 +2139,7 @@ var file_gitpod_v1_organization_proto_rawDesc = []byte{ 0x32, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x0b, 0x70, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x22, 0xf2, 0x04, 0x0a, 0x14, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x22, 0xb9, 0x05, 0x0a, 0x14, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x77, @@ -2155,383 +2173,395 @@ var file_gitpod_v1_organization_proto_rawDesc = []byte{ 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x72, 0x6f, 0x6c, 0x65, - 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x47, 0x0a, 0x19, - 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x90, 0x01, 0x0a, 0x27, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0xb1, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, - 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, - 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, - 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x22, 0x66, 0x0a, 0x19, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x49, 0x64, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, - 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x59, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xaa, 0x01, 0x0a, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, - 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, - 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x01, 0x52, 0x10, 0x64, 0x65, 0x6e, 0x79, 0x55, 0x73, 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, 0x0b, 0x5f, 0x69, 0x6e, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x69, 0x74, 0x79, 0x42, 0x15, 0x0a, 0x13, 0x5f, 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x75, - 0x73, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x22, 0xdd, 0x08, 0x0a, - 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x41, 0x0a, 0x1a, 0x77, - 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, - 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, - 0x00, 0x52, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, - 0x69, 0x6e, 0x67, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, - 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, - 0x01, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, - 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x88, 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x19, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x36, 0x0a, 0x17, 0x72, 0x65, 0x73, 0x74, 0x72, - 0x69, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, - 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, 0x15, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x65, 0x64, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, - 0x48, 0x0a, 0x1e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, - 0x63, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, - 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, 0x52, 0x1b, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x45, 0x64, 0x69, 0x74, 0x6f, - 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x88, 0x01, 0x01, 0x12, 0x7c, 0x0a, 0x16, 0x70, 0x69, 0x6e, - 0x6e, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x46, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x45, 0x64, - 0x69, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, - 0x79, 0x52, 0x14, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, 0x0a, 0x1d, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x5f, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, - 0x52, 0x1a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x45, 0x64, - 0x69, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, - 0x26, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, - 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0b, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, - 0x52, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x48, 0x05, 0x52, - 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x11, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x74, - 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, - 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, - 0x10, 0x72, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x12, 0x3d, 0x0a, 0x18, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, - 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, - 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x16, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, - 0x65, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, - 0x1a, 0x47, 0x0a, 0x19, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, - 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, - 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x1d, 0x0a, 0x1b, 0x5f, 0x77, 0x6f, - 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x5f, - 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, - 0x6d, 0x61, 0x67, 0x65, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, - 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, - 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x5f, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, - 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0f, 0x0a, 0x0d, 0x5f, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x42, 0x13, 0x0a, 0x11, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x42, - 0x1b, 0x0a, 0x19, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, - 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x61, 0x0a, 0x22, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, - 0x49, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x5e, 0x0a, 0x1f, 0x47, 0x65, - 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, - 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, - 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x2f, 0x0a, 0x19, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x59, 0x0a, 0x1a, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x45, 0x0a, 0x1f, + 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x5f, 0x72, 0x75, 0x6e, + 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x1c, 0x6d, 0x61, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x6c, + 0x65, 0x6c, 0x52, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x1a, 0x47, 0x0a, 0x19, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x45, 0x64, 0x69, + 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x90, 0x01, 0x0a, + 0x27, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, + 0xb1, 0x01, 0x0a, 0x28, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, + 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x46, 0x0a, 0x11, 0x77, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x52, 0x10, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, + 0x73, 0x65, 0x73, 0x22, 0x66, 0x0a, 0x19, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x88, + 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0x59, 0x0a, 0x1a, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x41, 0x0a, 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x56, 0x0a, 0x17, 0x47, 0x65, 0x74, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x69, 0x74, - 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0xda, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x05, - 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x22, 0x3f, 0x0a, - 0x05, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, - 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, - 0x0c, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x01, 0x12, - 0x0d, 0x0a, 0x09, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x22, 0x99, - 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0d, - 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x44, 0x0a, 0x19, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xaa, 0x01, 0x0a, 0x0f, 0x54, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3e, 0x0a, 0x0a, 0x69, 0x6e, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0a, 0x69, 0x6e, 0x61, + 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x88, 0x01, 0x01, 0x12, 0x31, 0x0a, 0x12, 0x64, 0x65, + 0x6e, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x48, 0x01, 0x52, 0x10, 0x64, 0x65, 0x6e, 0x79, 0x55, 0x73, + 0x65, 0x72, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x73, 0x88, 0x01, 0x01, 0x42, 0x0d, 0x0a, + 0x0b, 0x5f, 0x69, 0x6e, 0x61, 0x63, 0x74, 0x69, 0x76, 0x69, 0x74, 0x79, 0x42, 0x15, 0x0a, 0x13, + 0x5f, 0x64, 0x65, 0x6e, 0x79, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, + 0x75, 0x74, 0x73, 0x22, 0xcd, 0x09, 0x0a, 0x21, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x12, 0x41, 0x0a, 0x1a, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, + 0x73, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x48, 0x00, 0x52, 0x18, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, + 0x61, 0x63, 0x65, 0x53, 0x68, 0x61, 0x72, 0x69, 0x6e, 0x67, 0x44, 0x69, 0x73, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x88, 0x01, 0x01, 0x12, 0x3b, 0x0a, 0x17, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x15, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x49, 0x6d, 0x61, 0x67, 0x65, 0x88, + 0x01, 0x01, 0x12, 0x3a, 0x0a, 0x19, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x77, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x63, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x18, + 0x05, 0x20, 0x03, 0x28, 0x09, 0x52, 0x17, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x36, + 0x0a, 0x17, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, + 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x15, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x45, 0x64, 0x69, 0x74, 0x6f, + 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x12, 0x48, 0x0a, 0x1e, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, 0x74, + 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x48, 0x02, + 0x52, 0x1b, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x65, 0x64, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x4e, 0x61, 0x6d, 0x65, 0x73, 0x88, 0x01, 0x01, + 0x12, 0x7c, 0x0a, 0x16, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, 0x74, 0x6f, + 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x46, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x50, + 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x14, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, + 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x46, + 0x0a, 0x1d, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, + 0x65, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x48, 0x03, 0x52, 0x1a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, + 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x26, 0x0a, 0x0c, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x09, 0x48, 0x04, 0x52, 0x0b, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x52, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x12, 0x4a, + 0x0a, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, 0x65, 0x74, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x48, 0x05, 0x52, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4c, 0x0a, 0x11, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x0c, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x72, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x74, + 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x18, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x48, 0x06, 0x52, 0x16, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x6c, 0x65, 0x52, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x88, 0x01, 0x01, 0x12, 0x4a, 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x5f, 0x70, + 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, + 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x05, + 0x48, 0x07, 0x52, 0x1c, 0x6d, 0x61, 0x78, 0x50, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, 0x52, + 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x73, + 0x88, 0x01, 0x01, 0x1a, 0x47, 0x0a, 0x19, 0x50, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x45, 0x64, 0x69, + 0x74, 0x6f, 0x72, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x42, 0x1d, 0x0a, 0x1b, + 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x5f, 0x73, 0x68, 0x61, 0x72, 0x69, + 0x6e, 0x67, 0x5f, 0x64, 0x69, 0x73, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x42, 0x1a, 0x0a, 0x18, 0x5f, + 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, + 0x65, 0x5f, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x42, 0x21, 0x0a, 0x1f, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x65, 0x64, 0x5f, 0x65, 0x64, + 0x69, 0x74, 0x6f, 0x72, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x73, 0x42, 0x20, 0x0a, 0x1e, 0x5f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x70, 0x69, 0x6e, 0x6e, 0x65, 0x64, 0x5f, 0x65, 0x64, 0x69, + 0x74, 0x6f, 0x72, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x0f, 0x0a, 0x0d, + 0x5f, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x42, 0x13, 0x0a, + 0x11, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x42, 0x1b, 0x0a, 0x19, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x6f, + 0x6c, 0x65, 0x5f, 0x72, 0x65, 0x73, 0x74, 0x72, 0x69, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, + 0x22, 0x0a, 0x20, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6c, 0x6c, 0x65, 0x6c, + 0x5f, 0x72, 0x75, 0x6e, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x77, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, + 0x63, 0x65, 0x73, 0x22, 0x61, 0x0a, 0x22, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x74, + 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, + 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x49, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x64, 0x22, 0x5e, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x08, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x22, 0x2f, 0x0a, 0x19, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x22, 0x59, 0x0a, 0x1a, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3b, 0x0a, 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x0c, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x41, 0x0a, + 0x16, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, - 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, - 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x48, 0x0a, 0x21, 0x47, - 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x17, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x43, 0x0a, 0x18, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4d, 0x0a, 0x22, 0x52, 0x65, - 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x4a, 0x0a, 0x23, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x87, 0x01, 0x0a, 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, - 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, + 0x22, 0x56, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x0c, 0x6f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0c, 0x6f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xda, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x63, 0x6f, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x52, 0x05, 0x73, + 0x63, 0x6f, 0x70, 0x65, 0x22, 0x3f, 0x0a, 0x05, 0x53, 0x63, 0x6f, 0x70, 0x65, 0x12, 0x15, 0x0a, + 0x11, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, + 0x45, 0x44, 0x10, 0x00, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, 0x4d, 0x45, + 0x4d, 0x42, 0x45, 0x52, 0x10, 0x01, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x43, 0x4f, 0x50, 0x45, 0x5f, + 0x41, 0x4c, 0x4c, 0x10, 0x02, 0x22, 0x99, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3d, 0x0a, 0x0d, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x0d, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x44, 0x0a, 0x19, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x1c, 0x0a, 0x1a, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x64, 0x22, 0x48, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x3e, 0x0a, 0x17, + 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x43, 0x0a, 0x18, + 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x99, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa2, 0x01, 0x0a, 0x1f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x64, 0x22, 0x4d, 0x0a, 0x22, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, + 0x22, 0x4a, 0x0a, 0x23, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x69, 0x6e, 0x76, 0x69, 0x74, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, + 0x69, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x22, 0x87, 0x01, 0x0a, + 0x1e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, - 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, - 0x64, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, - 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x04, - 0x72, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, 0x0a, 0x05, 0x5f, 0x72, 0x6f, 0x6c, 0x65, - 0x22, 0x59, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x63, 0x0a, 0x1f, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, - 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, - 0x22, 0x22, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x94, 0x01, 0x0a, 0x10, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, 0x12, 0x21, 0x0a, 0x1d, 0x4f, 0x52, 0x47, - 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x55, - 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, - 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, - 0x45, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x47, - 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4d, - 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x22, 0x0a, 0x1e, 0x4f, 0x52, 0x47, 0x41, 0x4e, - 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x4c, - 0x4c, 0x41, 0x42, 0x4f, 0x52, 0x41, 0x54, 0x4f, 0x52, 0x10, 0x03, 0x2a, 0x74, 0x0a, 0x16, 0x4f, - 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x23, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x99, 0x01, 0x0a, 0x1f, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, + 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x07, 0x6d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x07, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xa2, 0x01, 0x0a, 0x1f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x12, 0x34, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x6f, 0x6c, 0x65, 0x48, 0x00, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x88, 0x01, 0x01, 0x42, 0x07, + 0x0a, 0x05, 0x5f, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x59, 0x0a, 0x20, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x06, 0x6d, + 0x65, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x06, 0x6d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x22, 0x63, 0x0a, 0x1f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x6f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x64, 0x12, 0x17, + 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x75, 0x73, 0x65, 0x72, 0x49, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, + 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x94, 0x01, 0x0a, 0x10, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x6c, 0x65, + 0x12, 0x21, 0x0a, 0x1d, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4f, 0x57, 0x4e, 0x45, 0x52, 0x10, 0x01, + 0x12, 0x1c, 0x0a, 0x18, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, + 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x4d, 0x45, 0x4d, 0x42, 0x45, 0x52, 0x10, 0x02, 0x12, 0x22, + 0x0a, 0x1e, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x5f, 0x43, 0x4f, 0x4c, 0x4c, 0x41, 0x42, 0x4f, 0x52, 0x41, 0x54, 0x4f, 0x52, + 0x10, 0x03, 0x2a, 0x74, 0x0a, 0x16, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x65, 0x72, 0x6d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x23, + 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x52, + 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, + 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x31, 0x0a, 0x2d, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, - 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x31, - 0x0a, 0x2d, 0x4f, 0x52, 0x47, 0x41, 0x4e, 0x49, 0x5a, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x50, - 0x45, 0x52, 0x4d, 0x49, 0x53, 0x53, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, - 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x41, 0x52, 0x59, 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x53, 0x10, - 0x01, 0x32, 0xbe, 0x0c, 0x0a, 0x13, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x63, 0x0a, 0x12, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, - 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, - 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x60, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, - 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x63, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x5f, 0x41, 0x52, 0x42, 0x49, 0x54, 0x52, 0x41, 0x52, 0x59, + 0x5f, 0x52, 0x45, 0x50, 0x4f, 0x53, 0x10, 0x01, 0x32, 0xbe, 0x0c, 0x0a, 0x13, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0x63, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5a, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x00, 0x12, 0x63, 0x0a, 0x12, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, - 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x60, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x23, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x24, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x63, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x24, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, + 0x19, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5d, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x67, 0x69, + 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x23, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x78, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, - 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, - 0x12, 0x5d, 0x0a, 0x10, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x22, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, - 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, - 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4a, 0x6f, 0x69, 0x6e, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x7e, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, - 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, - 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, - 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7e, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, - 0x72, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, - 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, - 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, - 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, - 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, + 0x31, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, + 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, + 0x6d, 0x62, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, + 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x75, 0x0a, 0x18, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, + 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x00, 0x12, 0x72, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x29, 0x2e, 0x67, - 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, + 0x00, 0x12, 0x75, 0x0a, 0x18, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x2a, 0x2e, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, + 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x67, 0x69, 0x74, 0x70, + 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, + 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x72, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x12, 0x2c, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x6e, 0x67, 0x73, 0x12, 0x29, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, + 0x47, 0x65, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x4f, 0x72, + 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x7b, 0x0a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, - 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x32, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, - 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, - 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x69, - 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, - 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, - 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x00, 0x42, 0x51, 0x0a, 0x16, 0x69, 0x6f, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, - 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x70, 0x69, 0x2e, 0x76, 0x31, 0x5a, 0x37, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, - 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, - 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x2d, 0x61, 0x70, 0x69, 0x2f, - 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x2c, 0x2e, 0x67, 0x69, 0x74, + 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, + 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, + 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4f, 0x72, 0x67, 0x61, 0x6e, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x8d, 0x01, 0x0a, 0x20, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, + 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x12, 0x32, + 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x6f, 0x72, 0x6b, 0x73, + 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x76, 0x31, 0x2e, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x72, 0x67, 0x61, 0x6e, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x6f, 0x72, 0x6b, 0x73, 0x70, 0x61, 0x63, 0x65, 0x43, 0x6c, 0x61, 0x73, 0x73, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0x51, 0x0a, 0x16, 0x69, 0x6f, 0x2e, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2e, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x70, 0x69, + 0x2e, 0x76, 0x31, 0x5a, 0x37, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, + 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, 0x2d, 0x69, 0x6f, 0x2f, 0x67, 0x69, 0x74, 0x70, 0x6f, 0x64, + 0x2f, 0x63, 0x6f, 0x6d, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x70, 0x75, 0x62, 0x6c, + 0x69, 0x63, 0x2d, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x6f, 0x2f, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationOuterClass.java b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationOuterClass.java index 5b1629defafac4..ffdaa03831f23f 100644 --- a/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationOuterClass.java +++ b/components/public-api/java/src/main/java/io/gitpod/publicapi/v1/OrganizationOuterClass.java @@ -3677,6 +3677,16 @@ java.lang.String getPinnedEditorVersionsOrThrow( */ io.gitpod.publicapi.v1.OrganizationOuterClass.RoleRestrictionEntryOrBuilder getRoleRestrictionsOrBuilder( int index); + + /** + *
+     * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+     * 
+ * + * int32 max_parallel_running_workspaces = 9 [json_name = "maxParallelRunningWorkspaces"]; + * @return The maxParallelRunningWorkspaces. + */ + int getMaxParallelRunningWorkspaces(); } /** * Protobuf type {@code gitpod.v1.OrganizationSettings} @@ -4044,6 +4054,21 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.RoleRestrictionEntryOrBuild return roleRestrictions_.get(index); } + public static final int MAX_PARALLEL_RUNNING_WORKSPACES_FIELD_NUMBER = 9; + private int maxParallelRunningWorkspaces_ = 0; + /** + *
+     * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+     * 
+ * + * int32 max_parallel_running_workspaces = 9 [json_name = "maxParallelRunningWorkspaces"]; + * @return The maxParallelRunningWorkspaces. + */ + @java.lang.Override + public int getMaxParallelRunningWorkspaces() { + return maxParallelRunningWorkspaces_; + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -4085,6 +4110,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) for (int i = 0; i < roleRestrictions_.size(); i++) { output.writeMessage(8, roleRestrictions_.get(i)); } + if (maxParallelRunningWorkspaces_ != 0) { + output.writeInt32(9, maxParallelRunningWorkspaces_); + } getUnknownFields().writeTo(output); } @@ -4138,6 +4166,10 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeMessageSize(8, roleRestrictions_.get(i)); } + if (maxParallelRunningWorkspaces_ != 0) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(9, maxParallelRunningWorkspaces_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -4172,6 +4204,8 @@ public boolean equals(final java.lang.Object obj) { } if (!getRoleRestrictionsList() .equals(other.getRoleRestrictionsList())) return false; + if (getMaxParallelRunningWorkspaces() + != other.getMaxParallelRunningWorkspaces()) return false; if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -4210,6 +4244,8 @@ public int hashCode() { hash = (37 * hash) + ROLE_RESTRICTIONS_FIELD_NUMBER; hash = (53 * hash) + getRoleRestrictionsList().hashCode(); } + hash = (37 * hash) + MAX_PARALLEL_RUNNING_WORKSPACES_FIELD_NUMBER; + hash = (53 * hash) + getMaxParallelRunningWorkspaces(); hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -4390,6 +4426,7 @@ public Builder clear() { roleRestrictionsBuilder_.clear(); } bitField0_ = (bitField0_ & ~0x00000080); + maxParallelRunningWorkspaces_ = 0; return this; } @@ -4464,6 +4501,9 @@ private void buildPartial0(io.gitpod.publicapi.v1.OrganizationOuterClass.Organiz : timeoutSettingsBuilder_.build(); to_bitField0_ |= 0x00000001; } + if (((from_bitField0_ & 0x00000100) != 0)) { + result.maxParallelRunningWorkspaces_ = maxParallelRunningWorkspaces_; + } result.bitField0_ |= to_bitField0_; } @@ -4544,6 +4584,9 @@ public Builder mergeFrom(io.gitpod.publicapi.v1.OrganizationOuterClass.Organizat } } } + if (other.getMaxParallelRunningWorkspaces() != 0) { + setMaxParallelRunningWorkspaces(other.getMaxParallelRunningWorkspaces()); + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -4626,6 +4669,11 @@ public Builder mergeFrom( } break; } // case 66 + case 72: { + maxParallelRunningWorkspaces_ = input.readInt32(); + bitField0_ |= 0x00000100; + break; + } // case 72 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { done = true; // was an endgroup tag @@ -5529,6 +5577,50 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.RoleRestrictionEntry.Builde return roleRestrictionsBuilder_; } + private int maxParallelRunningWorkspaces_ ; + /** + *
+       * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+       * 
+ * + * int32 max_parallel_running_workspaces = 9 [json_name = "maxParallelRunningWorkspaces"]; + * @return The maxParallelRunningWorkspaces. + */ + @java.lang.Override + public int getMaxParallelRunningWorkspaces() { + return maxParallelRunningWorkspaces_; + } + /** + *
+       * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+       * 
+ * + * int32 max_parallel_running_workspaces = 9 [json_name = "maxParallelRunningWorkspaces"]; + * @param value The maxParallelRunningWorkspaces to set. + * @return This builder for chaining. + */ + public Builder setMaxParallelRunningWorkspaces(int value) { + + maxParallelRunningWorkspaces_ = value; + bitField0_ |= 0x00000100; + onChanged(); + return this; + } + /** + *
+       * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+       * 
+ * + * int32 max_parallel_running_workspaces = 9 [json_name = "maxParallelRunningWorkspaces"]; + * @return This builder for chaining. + */ + public Builder clearMaxParallelRunningWorkspaces() { + bitField0_ = (bitField0_ & ~0x00000100); + maxParallelRunningWorkspaces_ = 0; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:gitpod.v1.OrganizationSettings) } @@ -9452,7 +9544,7 @@ public interface UpdateOrganizationSettingsRequestOrBuilder extends /** *
-     * organization_id is the ID of the organization to update the settings for.
+     * organization_id is the ID of the organization to update the settings for
      * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -9461,7 +9553,7 @@ public interface UpdateOrganizationSettingsRequestOrBuilder extends java.lang.String getOrganizationId(); /** *
-     * organization_id is the ID of the organization to update the settings for.
+     * organization_id is the ID of the organization to update the settings for
      * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -9614,7 +9706,7 @@ public interface UpdateOrganizationSettingsRequestOrBuilder extends /** *
-     * Specifies whether restricted_workspace_classes should be updated.
+     * Specifies whether restricted_workspace_classes should be updated
      * 
* * optional bool update_restricted_editor_names = 7 [json_name = "updateRestrictedEditorNames"]; @@ -9623,7 +9715,7 @@ public interface UpdateOrganizationSettingsRequestOrBuilder extends boolean hasUpdateRestrictedEditorNames(); /** *
-     * Specifies whether restricted_workspace_classes should be updated.
+     * Specifies whether restricted_workspace_classes should be updated
      * 
* * optional bool update_restricted_editor_names = 7 [json_name = "updateRestrictedEditorNames"]; @@ -9634,7 +9726,7 @@ public interface UpdateOrganizationSettingsRequestOrBuilder extends /** *
      * pinned_editor_versions updates the pinned version for the corresponding
-     * editor.
+     * editor
      * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -9643,7 +9735,7 @@ public interface UpdateOrganizationSettingsRequestOrBuilder extends /** *
      * pinned_editor_versions updates the pinned version for the corresponding
-     * editor.
+     * editor
      * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -9659,7 +9751,7 @@ boolean containsPinnedEditorVersions( /** *
      * pinned_editor_versions updates the pinned version for the corresponding
-     * editor.
+     * editor
      * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -9669,7 +9761,7 @@ boolean containsPinnedEditorVersions( /** *
      * pinned_editor_versions updates the pinned version for the corresponding
-     * editor.
+     * editor
      * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -9682,7 +9774,7 @@ java.lang.String getPinnedEditorVersionsOrDefault( /** *
      * pinned_editor_versions updates the pinned version for the corresponding
-     * editor.
+     * editor
      * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -9692,7 +9784,7 @@ java.lang.String getPinnedEditorVersionsOrThrow( /** *
-     * Specifies whether pinned_editor_versions should be updated.
+     * Specifies whether pinned_editor_versions should be updated
      * 
* * optional bool update_pinned_editor_versions = 9 [json_name = "updatePinnedEditorVersions"]; @@ -9701,7 +9793,7 @@ java.lang.String getPinnedEditorVersionsOrThrow( boolean hasUpdatePinnedEditorVersions(); /** *
-     * Specifies whether pinned_editor_versions should be updated.
+     * Specifies whether pinned_editor_versions should be updated
      * 
* * optional bool update_pinned_editor_versions = 9 [json_name = "updatePinnedEditorVersions"]; @@ -9711,7 +9803,7 @@ java.lang.String getPinnedEditorVersionsOrThrow( /** *
-     * default_role is the default role for new members in the organization.
+     * default_role is the default role for new members in the organization
      * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -9720,7 +9812,7 @@ java.lang.String getPinnedEditorVersionsOrThrow( boolean hasDefaultRole(); /** *
-     * default_role is the default role for new members in the organization.
+     * default_role is the default role for new members in the organization
      * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -9729,7 +9821,7 @@ java.lang.String getPinnedEditorVersionsOrThrow( java.lang.String getDefaultRole(); /** *
-     * default_role is the default role for new members in the organization.
+     * default_role is the default role for new members in the organization
      * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -9791,7 +9883,7 @@ io.gitpod.publicapi.v1.OrganizationOuterClass.RoleRestrictionEntryOrBuilder getR /** *
-     * Specifies whether role_restrictions should be updated.
+     * update_role_restrictions specifies whether role_restrictions should be updated
      * 
* * optional bool update_role_restrictions = 13 [json_name = "updateRoleRestrictions"]; @@ -9800,13 +9892,32 @@ io.gitpod.publicapi.v1.OrganizationOuterClass.RoleRestrictionEntryOrBuilder getR boolean hasUpdateRoleRestrictions(); /** *
-     * Specifies whether role_restrictions should be updated.
+     * update_role_restrictions specifies whether role_restrictions should be updated
      * 
* * optional bool update_role_restrictions = 13 [json_name = "updateRoleRestrictions"]; * @return The updateRoleRestrictions. */ boolean getUpdateRoleRestrictions(); + + /** + *
+     * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+     * 
+ * + * optional int32 max_parallel_running_workspaces = 15 [json_name = "maxParallelRunningWorkspaces"]; + * @return Whether the maxParallelRunningWorkspaces field is set. + */ + boolean hasMaxParallelRunningWorkspaces(); + /** + *
+     * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+     * 
+ * + * optional int32 max_parallel_running_workspaces = 15 [json_name = "maxParallelRunningWorkspaces"]; + * @return The maxParallelRunningWorkspaces. + */ + int getMaxParallelRunningWorkspaces(); } /** * Protobuf type {@code gitpod.v1.UpdateOrganizationSettingsRequest} @@ -9871,7 +9982,7 @@ protected com.google.protobuf.MapFieldReflectionAccessor internalGetMapFieldRefl private volatile java.lang.Object organizationId_ = ""; /** *
-     * organization_id is the ID of the organization to update the settings for.
+     * organization_id is the ID of the organization to update the settings for
      * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -9892,7 +10003,7 @@ public java.lang.String getOrganizationId() { } /** *
-     * organization_id is the ID of the organization to update the settings for.
+     * organization_id is the ID of the organization to update the settings for
      * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -10121,7 +10232,7 @@ public java.lang.String getRestrictedEditorNames(int index) { private boolean updateRestrictedEditorNames_ = false; /** *
-     * Specifies whether restricted_workspace_classes should be updated.
+     * Specifies whether restricted_workspace_classes should be updated
      * 
* * optional bool update_restricted_editor_names = 7 [json_name = "updateRestrictedEditorNames"]; @@ -10133,7 +10244,7 @@ public boolean hasUpdateRestrictedEditorNames() { } /** *
-     * Specifies whether restricted_workspace_classes should be updated.
+     * Specifies whether restricted_workspace_classes should be updated
      * 
* * optional bool update_restricted_editor_names = 7 [json_name = "updateRestrictedEditorNames"]; @@ -10173,7 +10284,7 @@ public int getPinnedEditorVersionsCount() { /** *
      * pinned_editor_versions updates the pinned version for the corresponding
-     * editor.
+     * editor
      * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -10195,7 +10306,7 @@ public java.util.Map getPinnedEditorVersions /** *
      * pinned_editor_versions updates the pinned version for the corresponding
-     * editor.
+     * editor
      * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -10207,7 +10318,7 @@ public java.util.Map getPinnedEditorVersions /** *
      * pinned_editor_versions updates the pinned version for the corresponding
-     * editor.
+     * editor
      * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -10226,7 +10337,7 @@ java.lang.String getPinnedEditorVersionsOrDefault( /** *
      * pinned_editor_versions updates the pinned version for the corresponding
-     * editor.
+     * editor
      * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -10247,7 +10358,7 @@ public java.lang.String getPinnedEditorVersionsOrThrow( private boolean updatePinnedEditorVersions_ = false; /** *
-     * Specifies whether pinned_editor_versions should be updated.
+     * Specifies whether pinned_editor_versions should be updated
      * 
* * optional bool update_pinned_editor_versions = 9 [json_name = "updatePinnedEditorVersions"]; @@ -10259,7 +10370,7 @@ public boolean hasUpdatePinnedEditorVersions() { } /** *
-     * Specifies whether pinned_editor_versions should be updated.
+     * Specifies whether pinned_editor_versions should be updated
      * 
* * optional bool update_pinned_editor_versions = 9 [json_name = "updatePinnedEditorVersions"]; @@ -10275,7 +10386,7 @@ public boolean getUpdatePinnedEditorVersions() { private volatile java.lang.Object defaultRole_ = ""; /** *
-     * default_role is the default role for new members in the organization.
+     * default_role is the default role for new members in the organization
      * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -10287,7 +10398,7 @@ public boolean hasDefaultRole() { } /** *
-     * default_role is the default role for new members in the organization.
+     * default_role is the default role for new members in the organization
      * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -10308,7 +10419,7 @@ public java.lang.String getDefaultRole() { } /** *
-     * default_role is the default role for new members in the organization.
+     * default_role is the default role for new members in the organization
      * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -10412,7 +10523,7 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.RoleRestrictionEntryOrBuild private boolean updateRoleRestrictions_ = false; /** *
-     * Specifies whether role_restrictions should be updated.
+     * update_role_restrictions specifies whether role_restrictions should be updated
      * 
* * optional bool update_role_restrictions = 13 [json_name = "updateRoleRestrictions"]; @@ -10424,7 +10535,7 @@ public boolean hasUpdateRoleRestrictions() { } /** *
-     * Specifies whether role_restrictions should be updated.
+     * update_role_restrictions specifies whether role_restrictions should be updated
      * 
* * optional bool update_role_restrictions = 13 [json_name = "updateRoleRestrictions"]; @@ -10435,6 +10546,33 @@ public boolean getUpdateRoleRestrictions() { return updateRoleRestrictions_; } + public static final int MAX_PARALLEL_RUNNING_WORKSPACES_FIELD_NUMBER = 15; + private int maxParallelRunningWorkspaces_ = 0; + /** + *
+     * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+     * 
+ * + * optional int32 max_parallel_running_workspaces = 15 [json_name = "maxParallelRunningWorkspaces"]; + * @return Whether the maxParallelRunningWorkspaces field is set. + */ + @java.lang.Override + public boolean hasMaxParallelRunningWorkspaces() { + return ((bitField0_ & 0x00000080) != 0); + } + /** + *
+     * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+     * 
+ * + * optional int32 max_parallel_running_workspaces = 15 [json_name = "maxParallelRunningWorkspaces"]; + * @return The maxParallelRunningWorkspaces. + */ + @java.lang.Override + public int getMaxParallelRunningWorkspaces() { + return maxParallelRunningWorkspaces_; + } + private byte memoizedIsInitialized = -1; @java.lang.Override public final boolean isInitialized() { @@ -10488,6 +10626,9 @@ public void writeTo(com.google.protobuf.CodedOutputStream output) if (((bitField0_ & 0x00000040) != 0)) { output.writeBool(13, updateRoleRestrictions_); } + if (((bitField0_ & 0x00000080) != 0)) { + output.writeInt32(15, maxParallelRunningWorkspaces_); + } getUnknownFields().writeTo(output); } @@ -10556,6 +10697,10 @@ public int getSerializedSize() { size += com.google.protobuf.CodedOutputStream .computeBoolSize(13, updateRoleRestrictions_); } + if (((bitField0_ & 0x00000080) != 0)) { + size += com.google.protobuf.CodedOutputStream + .computeInt32Size(15, maxParallelRunningWorkspaces_); + } size += getUnknownFields().getSerializedSize(); memoizedSize = size; return size; @@ -10616,6 +10761,11 @@ public boolean equals(final java.lang.Object obj) { if (getUpdateRoleRestrictions() != other.getUpdateRoleRestrictions()) return false; } + if (hasMaxParallelRunningWorkspaces() != other.hasMaxParallelRunningWorkspaces()) return false; + if (hasMaxParallelRunningWorkspaces()) { + if (getMaxParallelRunningWorkspaces() + != other.getMaxParallelRunningWorkspaces()) return false; + } if (!getUnknownFields().equals(other.getUnknownFields())) return false; return true; } @@ -10677,6 +10827,10 @@ public int hashCode() { hash = (53 * hash) + com.google.protobuf.Internal.hashBoolean( getUpdateRoleRestrictions()); } + if (hasMaxParallelRunningWorkspaces()) { + hash = (37 * hash) + MAX_PARALLEL_RUNNING_WORKSPACES_FIELD_NUMBER; + hash = (53 * hash) + getMaxParallelRunningWorkspaces(); + } hash = (29 * hash) + getUnknownFields().hashCode(); memoizedHashCode = hash; return hash; @@ -10861,6 +11015,7 @@ public Builder clear() { } bitField0_ = (bitField0_ & ~0x00000400); updateRoleRestrictions_ = false; + maxParallelRunningWorkspaces_ = 0; return this; } @@ -10953,6 +11108,10 @@ private void buildPartial0(io.gitpod.publicapi.v1.OrganizationOuterClass.UpdateO result.updateRoleRestrictions_ = updateRoleRestrictions_; to_bitField0_ |= 0x00000040; } + if (((from_bitField0_ & 0x00001000) != 0)) { + result.maxParallelRunningWorkspaces_ = maxParallelRunningWorkspaces_; + to_bitField0_ |= 0x00000080; + } result.bitField0_ |= to_bitField0_; } @@ -11047,6 +11206,9 @@ public Builder mergeFrom(io.gitpod.publicapi.v1.OrganizationOuterClass.UpdateOrg if (other.hasUpdateRoleRestrictions()) { setUpdateRoleRestrictions(other.getUpdateRoleRestrictions()); } + if (other.hasMaxParallelRunningWorkspaces()) { + setMaxParallelRunningWorkspaces(other.getMaxParallelRunningWorkspaces()); + } this.mergeUnknownFields(other.getUnknownFields()); onChanged(); return this; @@ -11149,6 +11311,11 @@ public Builder mergeFrom( bitField0_ |= 0x00000800; break; } // case 104 + case 120: { + maxParallelRunningWorkspaces_ = input.readInt32(); + bitField0_ |= 0x00001000; + break; + } // case 120 default: { if (!super.parseUnknownField(input, extensionRegistry, tag)) { done = true; // was an endgroup tag @@ -11169,7 +11336,7 @@ public Builder mergeFrom( private java.lang.Object organizationId_ = ""; /** *
-       * organization_id is the ID of the organization to update the settings for.
+       * organization_id is the ID of the organization to update the settings for
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -11189,7 +11356,7 @@ public java.lang.String getOrganizationId() { } /** *
-       * organization_id is the ID of the organization to update the settings for.
+       * organization_id is the ID of the organization to update the settings for
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -11210,7 +11377,7 @@ public java.lang.String getOrganizationId() { } /** *
-       * organization_id is the ID of the organization to update the settings for.
+       * organization_id is the ID of the organization to update the settings for
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -11227,7 +11394,7 @@ public Builder setOrganizationId( } /** *
-       * organization_id is the ID of the organization to update the settings for.
+       * organization_id is the ID of the organization to update the settings for
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -11241,7 +11408,7 @@ public Builder clearOrganizationId() { } /** *
-       * organization_id is the ID of the organization to update the settings for.
+       * organization_id is the ID of the organization to update the settings for
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -11743,7 +11910,7 @@ public Builder addRestrictedEditorNamesBytes( private boolean updateRestrictedEditorNames_ ; /** *
-       * Specifies whether restricted_workspace_classes should be updated.
+       * Specifies whether restricted_workspace_classes should be updated
        * 
* * optional bool update_restricted_editor_names = 7 [json_name = "updateRestrictedEditorNames"]; @@ -11755,7 +11922,7 @@ public boolean hasUpdateRestrictedEditorNames() { } /** *
-       * Specifies whether restricted_workspace_classes should be updated.
+       * Specifies whether restricted_workspace_classes should be updated
        * 
* * optional bool update_restricted_editor_names = 7 [json_name = "updateRestrictedEditorNames"]; @@ -11767,7 +11934,7 @@ public boolean getUpdateRestrictedEditorNames() { } /** *
-       * Specifies whether restricted_workspace_classes should be updated.
+       * Specifies whether restricted_workspace_classes should be updated
        * 
* * optional bool update_restricted_editor_names = 7 [json_name = "updateRestrictedEditorNames"]; @@ -11783,7 +11950,7 @@ public Builder setUpdateRestrictedEditorNames(boolean value) { } /** *
-       * Specifies whether restricted_workspace_classes should be updated.
+       * Specifies whether restricted_workspace_classes should be updated
        * 
* * optional bool update_restricted_editor_names = 7 [json_name = "updateRestrictedEditorNames"]; @@ -11825,7 +11992,7 @@ public int getPinnedEditorVersionsCount() { /** *
        * pinned_editor_versions updates the pinned version for the corresponding
-       * editor.
+       * editor
        * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -11847,7 +12014,7 @@ public java.util.Map getPinnedEditorVersions /** *
        * pinned_editor_versions updates the pinned version for the corresponding
-       * editor.
+       * editor
        * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -11859,7 +12026,7 @@ public java.util.Map getPinnedEditorVersions /** *
        * pinned_editor_versions updates the pinned version for the corresponding
-       * editor.
+       * editor
        * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -11878,7 +12045,7 @@ java.lang.String getPinnedEditorVersionsOrDefault( /** *
        * pinned_editor_versions updates the pinned version for the corresponding
-       * editor.
+       * editor
        * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -11903,7 +12070,7 @@ public Builder clearPinnedEditorVersions() { /** *
        * pinned_editor_versions updates the pinned version for the corresponding
-       * editor.
+       * editor
        * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -11927,7 +12094,7 @@ public Builder removePinnedEditorVersions( /** *
        * pinned_editor_versions updates the pinned version for the corresponding
-       * editor.
+       * editor
        * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -11945,7 +12112,7 @@ public Builder putPinnedEditorVersions( /** *
        * pinned_editor_versions updates the pinned version for the corresponding
-       * editor.
+       * editor
        * 
* * map<string, string> pinned_editor_versions = 8 [json_name = "pinnedEditorVersions"]; @@ -11961,7 +12128,7 @@ public Builder putAllPinnedEditorVersions( private boolean updatePinnedEditorVersions_ ; /** *
-       * Specifies whether pinned_editor_versions should be updated.
+       * Specifies whether pinned_editor_versions should be updated
        * 
* * optional bool update_pinned_editor_versions = 9 [json_name = "updatePinnedEditorVersions"]; @@ -11973,7 +12140,7 @@ public boolean hasUpdatePinnedEditorVersions() { } /** *
-       * Specifies whether pinned_editor_versions should be updated.
+       * Specifies whether pinned_editor_versions should be updated
        * 
* * optional bool update_pinned_editor_versions = 9 [json_name = "updatePinnedEditorVersions"]; @@ -11985,7 +12152,7 @@ public boolean getUpdatePinnedEditorVersions() { } /** *
-       * Specifies whether pinned_editor_versions should be updated.
+       * Specifies whether pinned_editor_versions should be updated
        * 
* * optional bool update_pinned_editor_versions = 9 [json_name = "updatePinnedEditorVersions"]; @@ -12001,7 +12168,7 @@ public Builder setUpdatePinnedEditorVersions(boolean value) { } /** *
-       * Specifies whether pinned_editor_versions should be updated.
+       * Specifies whether pinned_editor_versions should be updated
        * 
* * optional bool update_pinned_editor_versions = 9 [json_name = "updatePinnedEditorVersions"]; @@ -12017,7 +12184,7 @@ public Builder clearUpdatePinnedEditorVersions() { private java.lang.Object defaultRole_ = ""; /** *
-       * default_role is the default role for new members in the organization.
+       * default_role is the default role for new members in the organization
        * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -12028,7 +12195,7 @@ public boolean hasDefaultRole() { } /** *
-       * default_role is the default role for new members in the organization.
+       * default_role is the default role for new members in the organization
        * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -12048,7 +12215,7 @@ public java.lang.String getDefaultRole() { } /** *
-       * default_role is the default role for new members in the organization.
+       * default_role is the default role for new members in the organization
        * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -12069,7 +12236,7 @@ public java.lang.String getDefaultRole() { } /** *
-       * default_role is the default role for new members in the organization.
+       * default_role is the default role for new members in the organization
        * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -12086,7 +12253,7 @@ public Builder setDefaultRole( } /** *
-       * default_role is the default role for new members in the organization.
+       * default_role is the default role for new members in the organization
        * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -12100,7 +12267,7 @@ public Builder clearDefaultRole() { } /** *
-       * default_role is the default role for new members in the organization.
+       * default_role is the default role for new members in the organization
        * 
* * optional string default_role = 10 [json_name = "defaultRole"]; @@ -12517,7 +12684,7 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.RoleRestrictionEntry.Builde private boolean updateRoleRestrictions_ ; /** *
-       * Specifies whether role_restrictions should be updated.
+       * update_role_restrictions specifies whether role_restrictions should be updated
        * 
* * optional bool update_role_restrictions = 13 [json_name = "updateRoleRestrictions"]; @@ -12529,7 +12696,7 @@ public boolean hasUpdateRoleRestrictions() { } /** *
-       * Specifies whether role_restrictions should be updated.
+       * update_role_restrictions specifies whether role_restrictions should be updated
        * 
* * optional bool update_role_restrictions = 13 [json_name = "updateRoleRestrictions"]; @@ -12541,7 +12708,7 @@ public boolean getUpdateRoleRestrictions() { } /** *
-       * Specifies whether role_restrictions should be updated.
+       * update_role_restrictions specifies whether role_restrictions should be updated
        * 
* * optional bool update_role_restrictions = 13 [json_name = "updateRoleRestrictions"]; @@ -12557,7 +12724,7 @@ public Builder setUpdateRoleRestrictions(boolean value) { } /** *
-       * Specifies whether role_restrictions should be updated.
+       * update_role_restrictions specifies whether role_restrictions should be updated
        * 
* * optional bool update_role_restrictions = 13 [json_name = "updateRoleRestrictions"]; @@ -12570,6 +12737,62 @@ public Builder clearUpdateRoleRestrictions() { return this; } + private int maxParallelRunningWorkspaces_ ; + /** + *
+       * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+       * 
+ * + * optional int32 max_parallel_running_workspaces = 15 [json_name = "maxParallelRunningWorkspaces"]; + * @return Whether the maxParallelRunningWorkspaces field is set. + */ + @java.lang.Override + public boolean hasMaxParallelRunningWorkspaces() { + return ((bitField0_ & 0x00001000) != 0); + } + /** + *
+       * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+       * 
+ * + * optional int32 max_parallel_running_workspaces = 15 [json_name = "maxParallelRunningWorkspaces"]; + * @return The maxParallelRunningWorkspaces. + */ + @java.lang.Override + public int getMaxParallelRunningWorkspaces() { + return maxParallelRunningWorkspaces_; + } + /** + *
+       * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+       * 
+ * + * optional int32 max_parallel_running_workspaces = 15 [json_name = "maxParallelRunningWorkspaces"]; + * @param value The maxParallelRunningWorkspaces to set. + * @return This builder for chaining. + */ + public Builder setMaxParallelRunningWorkspaces(int value) { + + maxParallelRunningWorkspaces_ = value; + bitField0_ |= 0x00001000; + onChanged(); + return this; + } + /** + *
+       * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan
+       * 
+ * + * optional int32 max_parallel_running_workspaces = 15 [json_name = "maxParallelRunningWorkspaces"]; + * @return This builder for chaining. + */ + public Builder clearMaxParallelRunningWorkspaces() { + bitField0_ = (bitField0_ & ~0x00001000); + maxParallelRunningWorkspaces_ = 0; + onChanged(); + return this; + } + // @@protoc_insertion_point(builder_scope:gitpod.v1.UpdateOrganizationSettingsRequest) } @@ -15609,7 +15832,7 @@ public interface GetOrganizationRequestOrBuilder extends /** *
-     * organization_id is the unique identifier of the Organization to retreive.
+     * organization_id is the unique identifier of the Organization to retrieve.
      * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -15618,7 +15841,7 @@ public interface GetOrganizationRequestOrBuilder extends java.lang.String getOrganizationId(); /** *
-     * organization_id is the unique identifier of the Organization to retreive.
+     * organization_id is the unique identifier of the Organization to retrieve.
      * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -15670,7 +15893,7 @@ private GetOrganizationRequest() { private volatile java.lang.Object organizationId_ = ""; /** *
-     * organization_id is the unique identifier of the Organization to retreive.
+     * organization_id is the unique identifier of the Organization to retrieve.
      * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -15691,7 +15914,7 @@ public java.lang.String getOrganizationId() { } /** *
-     * organization_id is the unique identifier of the Organization to retreive.
+     * organization_id is the unique identifier of the Organization to retrieve.
      * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -16009,7 +16232,7 @@ public Builder mergeFrom( private java.lang.Object organizationId_ = ""; /** *
-       * organization_id is the unique identifier of the Organization to retreive.
+       * organization_id is the unique identifier of the Organization to retrieve.
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -16029,7 +16252,7 @@ public java.lang.String getOrganizationId() { } /** *
-       * organization_id is the unique identifier of the Organization to retreive.
+       * organization_id is the unique identifier of the Organization to retrieve.
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -16050,7 +16273,7 @@ public java.lang.String getOrganizationId() { } /** *
-       * organization_id is the unique identifier of the Organization to retreive.
+       * organization_id is the unique identifier of the Organization to retrieve.
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -16067,7 +16290,7 @@ public Builder setOrganizationId( } /** *
-       * organization_id is the unique identifier of the Organization to retreive.
+       * organization_id is the unique identifier of the Organization to retrieve.
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -16081,7 +16304,7 @@ public Builder clearOrganizationId() { } /** *
-       * organization_id is the unique identifier of the Organization to retreive.
+       * organization_id is the unique identifier of the Organization to retrieve.
        * 
* * string organization_id = 1 [json_name = "organizationId"]; @@ -27644,7 +27867,7 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.DeleteOrganizationMemberRes "leRestrictionEntry\022/\n\004role\030\001 \001(\0162\033.gitpo" + "d.v1.OrganizationRoleR\004role\022C\n\013permissio" + "ns\030\002 \003(\0162!.gitpod.v1.OrganizationPermiss" + - "ionR\013permissions\"\362\004\n\024OrganizationSetting" + + "ionR\013permissions\"\271\005\n\024OrganizationSetting" + "s\022<\n\032workspace_sharing_disabled\030\001 \001(\010R\030w" + "orkspaceSharingDisabled\0226\n\027default_works" + "pace_image\030\002 \001(\tR\025defaultWorkspaceImage\022" + @@ -27658,157 +27881,162 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.DeleteOrganizationMemberRes "ngs\030\007 \001(\0132\032.gitpod.v1.TimeoutSettingsR\017t" + "imeoutSettings\022L\n\021role_restrictions\030\010 \003(" + "\0132\037.gitpod.v1.RoleRestrictionEntryR\020role" + - "Restrictions\032G\n\031PinnedEditorVersionsEntr" + - "y\022\020\n\003key\030\001 \001(\tR\003key\022\024\n\005value\030\002 \001(\tR\005valu" + - "e:\0028\001\"\220\001\n\'ListOrganizationWorkspaceClass" + - "esRequest\022<\n\npagination\030\001 \001(\0132\034.gitpod.v" + - "1.PaginationRequestR\npagination\022\'\n\017organ" + - "ization_id\030\002 \001(\tR\016organizationId\"\261\001\n(Lis" + - "tOrganizationWorkspaceClassesResponse\022=\n" + - "\npagination\030\001 \001(\0132\035.gitpod.v1.Pagination" + - "ResponseR\npagination\022F\n\021workspace_classe" + - "s\030\002 \003(\0132\031.gitpod.v1.WorkspaceClassR\020work" + - "spaceClasses\"f\n\031UpdateOrganizationReques" + + "Restrictions\022E\n\037max_parallel_running_wor" + + "kspaces\030\t \001(\005R\034maxParallelRunningWorkspa" + + "ces\032G\n\031PinnedEditorVersionsEntry\022\020\n\003key\030" + + "\001 \001(\tR\003key\022\024\n\005value\030\002 \001(\tR\005value:\0028\001\"\220\001\n" + + "\'ListOrganizationWorkspaceClassesRequest" + + "\022<\n\npagination\030\001 \001(\0132\034.gitpod.v1.Paginat" + + "ionRequestR\npagination\022\'\n\017organization_i" + + "d\030\002 \001(\tR\016organizationId\"\261\001\n(ListOrganiza" + + "tionWorkspaceClassesResponse\022=\n\npaginati" + + "on\030\001 \001(\0132\035.gitpod.v1.PaginationResponseR" + + "\npagination\022F\n\021workspace_classes\030\002 \003(\0132\031" + + ".gitpod.v1.WorkspaceClassR\020workspaceClas" + + "ses\"f\n\031UpdateOrganizationRequest\022\'\n\017orga" + + "nization_id\030\001 \001(\tR\016organizationId\022\027\n\004nam" + + "e\030\002 \001(\tH\000R\004name\210\001\001B\007\n\005_name\"Y\n\032UpdateOrg" + + "anizationResponse\022;\n\014organization\030\001 \001(\0132" + + "\027.gitpod.v1.OrganizationR\014organization\"\252" + + "\001\n\017TimeoutSettings\022>\n\ninactivity\030\001 \001(\0132\031" + + ".google.protobuf.DurationH\000R\ninactivity\210" + + "\001\001\0221\n\022deny_user_timeouts\030\002 \001(\010H\001R\020denyUs" + + "erTimeouts\210\001\001B\r\n\013_inactivityB\025\n\023_deny_us" + + "er_timeouts\"\315\t\n!UpdateOrganizationSettin" + + "gsRequest\022\'\n\017organization_id\030\001 \001(\tR\016orga" + + "nizationId\022A\n\032workspace_sharing_disabled" + + "\030\003 \001(\010H\000R\030workspaceSharingDisabled\210\001\001\022;\n" + + "\027default_workspace_image\030\004 \001(\tH\001R\025defaul" + + "tWorkspaceImage\210\001\001\022:\n\031allowed_workspace_" + + "classes\030\005 \003(\tR\027allowedWorkspaceClasses\0226" + + "\n\027restricted_editor_names\030\006 \003(\tR\025restric" + + "tedEditorNames\022H\n\036update_restricted_edit" + + "or_names\030\007 \001(\010H\002R\033updateRestrictedEditor" + + "Names\210\001\001\022|\n\026pinned_editor_versions\030\010 \003(\013" + + "2F.gitpod.v1.UpdateOrganizationSettingsR" + + "equest.PinnedEditorVersionsEntryR\024pinned" + + "EditorVersions\022F\n\035update_pinned_editor_v" + + "ersions\030\t \001(\010H\003R\032updatePinnedEditorVersi" + + "ons\210\001\001\022&\n\014default_role\030\n \001(\tH\004R\013defaultR" + + "ole\210\001\001\022J\n\020timeout_settings\030\013 \001(\0132\032.gitpo" + + "d.v1.TimeoutSettingsH\005R\017timeoutSettings\210" + + "\001\001\022L\n\021role_restrictions\030\014 \003(\0132\037.gitpod.v" + + "1.RoleRestrictionEntryR\020roleRestrictions" + + "\022=\n\030update_role_restrictions\030\r \001(\010H\006R\026up" + + "dateRoleRestrictions\210\001\001\022J\n\037max_parallel_" + + "running_workspaces\030\017 \001(\005H\007R\034maxParallelR" + + "unningWorkspaces\210\001\001\032G\n\031PinnedEditorVersi" + + "onsEntry\022\020\n\003key\030\001 \001(\tR\003key\022\024\n\005value\030\002 \001(" + + "\tR\005value:\0028\001B\035\n\033_workspace_sharing_disab" + + "ledB\032\n\030_default_workspace_imageB!\n\037_upda" + + "te_restricted_editor_namesB \n\036_update_pi" + + "nned_editor_versionsB\017\n\r_default_roleB\023\n" + + "\021_timeout_settingsB\033\n\031_update_role_restr" + + "ictionsB\"\n _max_parallel_running_workspa" + + "ces\"a\n\"UpdateOrganizationSettingsRespons" + + "e\022;\n\010settings\030\001 \001(\0132\037.gitpod.v1.Organiza" + + "tionSettingsR\010settings\"I\n\036GetOrganizatio" + + "nSettingsRequest\022\'\n\017organization_id\030\001 \001(" + + "\tR\016organizationId\"^\n\037GetOrganizationSett" + + "ingsResponse\022;\n\010settings\030\001 \001(\0132\037.gitpod." + + "v1.OrganizationSettingsR\010settings\"/\n\031Cre" + + "ateOrganizationRequest\022\022\n\004name\030\001 \001(\tR\004na" + + "me\"Y\n\032CreateOrganizationResponse\022;\n\014orga" + + "nization\030\001 \001(\0132\027.gitpod.v1.OrganizationR" + + "\014organization\"A\n\026GetOrganizationRequest\022" + + "\'\n\017organization_id\030\001 \001(\tR\016organizationId" + + "\"V\n\027GetOrganizationResponse\022;\n\014organizat" + + "ion\030\001 \001(\0132\027.gitpod.v1.OrganizationR\014orga" + + "nization\"\332\001\n\030ListOrganizationsRequest\022<\n" + + "\npagination\030\001 \001(\0132\034.gitpod.v1.Pagination" + + "RequestR\npagination\022?\n\005scope\030\002 \001(\0162).git" + + "pod.v1.ListOrganizationsRequest.ScopeR\005s" + + "cope\"?\n\005Scope\022\025\n\021SCOPE_UNSPECIFIED\020\000\022\020\n\014" + + "SCOPE_MEMBER\020\001\022\r\n\tSCOPE_ALL\020\002\"\231\001\n\031ListOr" + + "ganizationsResponse\022=\n\rorganizations\030\001 \003" + + "(\0132\027.gitpod.v1.OrganizationR\rorganizatio" + + "ns\022=\n\npagination\030\002 \001(\0132\035.gitpod.v1.Pagin" + + "ationResponseR\npagination\"D\n\031DeleteOrgan" + + "izationRequest\022\'\n\017organization_id\030\001 \001(\tR" + + "\016organizationId\"\034\n\032DeleteOrganizationRes" + + "ponse\"K\n GetOrganizationInvitationReques" + "t\022\'\n\017organization_id\030\001 \001(\tR\016organization" + - "Id\022\027\n\004name\030\002 \001(\tH\000R\004name\210\001\001B\007\n\005_name\"Y\n\032" + - "UpdateOrganizationResponse\022;\n\014organizati" + - "on\030\001 \001(\0132\027.gitpod.v1.OrganizationR\014organ" + - "ization\"\252\001\n\017TimeoutSettings\022>\n\ninactivit" + - "y\030\001 \001(\0132\031.google.protobuf.DurationH\000R\nin" + - "activity\210\001\001\0221\n\022deny_user_timeouts\030\002 \001(\010H" + - "\001R\020denyUserTimeouts\210\001\001B\r\n\013_inactivityB\025\n" + - "\023_deny_user_timeouts\"\335\010\n!UpdateOrganizat" + - "ionSettingsRequest\022\'\n\017organization_id\030\001 " + - "\001(\tR\016organizationId\022A\n\032workspace_sharing" + - "_disabled\030\003 \001(\010H\000R\030workspaceSharingDisab" + - "led\210\001\001\022;\n\027default_workspace_image\030\004 \001(\tH" + - "\001R\025defaultWorkspaceImage\210\001\001\022:\n\031allowed_w" + - "orkspace_classes\030\005 \003(\tR\027allowedWorkspace" + - "Classes\0226\n\027restricted_editor_names\030\006 \003(\t" + - "R\025restrictedEditorNames\022H\n\036update_restri" + - "cted_editor_names\030\007 \001(\010H\002R\033updateRestric" + - "tedEditorNames\210\001\001\022|\n\026pinned_editor_versi" + - "ons\030\010 \003(\0132F.gitpod.v1.UpdateOrganization" + - "SettingsRequest.PinnedEditorVersionsEntr" + - "yR\024pinnedEditorVersions\022F\n\035update_pinned" + - "_editor_versions\030\t \001(\010H\003R\032updatePinnedEd" + - "itorVersions\210\001\001\022&\n\014default_role\030\n \001(\tH\004R" + - "\013defaultRole\210\001\001\022J\n\020timeout_settings\030\013 \001(" + - "\0132\032.gitpod.v1.TimeoutSettingsH\005R\017timeout" + - "Settings\210\001\001\022L\n\021role_restrictions\030\014 \003(\0132\037" + - ".gitpod.v1.RoleRestrictionEntryR\020roleRes" + - "trictions\022=\n\030update_role_restrictions\030\r " + - "\001(\010H\006R\026updateRoleRestrictions\210\001\001\032G\n\031Pinn" + - "edEditorVersionsEntry\022\020\n\003key\030\001 \001(\tR\003key\022" + - "\024\n\005value\030\002 \001(\tR\005value:\0028\001B\035\n\033_workspace_" + - "sharing_disabledB\032\n\030_default_workspace_i" + - "mageB!\n\037_update_restricted_editor_namesB" + - " \n\036_update_pinned_editor_versionsB\017\n\r_de" + - "fault_roleB\023\n\021_timeout_settingsB\033\n\031_upda" + - "te_role_restrictions\"a\n\"UpdateOrganizati" + - "onSettingsResponse\022;\n\010settings\030\001 \001(\0132\037.g" + - "itpod.v1.OrganizationSettingsR\010settings\"" + - "I\n\036GetOrganizationSettingsRequest\022\'\n\017org" + - "anization_id\030\001 \001(\tR\016organizationId\"^\n\037Ge" + - "tOrganizationSettingsResponse\022;\n\010setting" + - "s\030\001 \001(\0132\037.gitpod.v1.OrganizationSettings" + - "R\010settings\"/\n\031CreateOrganizationRequest\022" + - "\022\n\004name\030\001 \001(\tR\004name\"Y\n\032CreateOrganizatio" + - "nResponse\022;\n\014organization\030\001 \001(\0132\027.gitpod" + - ".v1.OrganizationR\014organization\"A\n\026GetOrg" + - "anizationRequest\022\'\n\017organization_id\030\001 \001(" + - "\tR\016organizationId\"V\n\027GetOrganizationResp" + - "onse\022;\n\014organization\030\001 \001(\0132\027.gitpod.v1.O" + - "rganizationR\014organization\"\332\001\n\030ListOrgani" + - "zationsRequest\022<\n\npagination\030\001 \001(\0132\034.git" + - "pod.v1.PaginationRequestR\npagination\022?\n\005" + - "scope\030\002 \001(\0162).gitpod.v1.ListOrganization" + - "sRequest.ScopeR\005scope\"?\n\005Scope\022\025\n\021SCOPE_" + - "UNSPECIFIED\020\000\022\020\n\014SCOPE_MEMBER\020\001\022\r\n\tSCOPE" + - "_ALL\020\002\"\231\001\n\031ListOrganizationsResponse\022=\n\r" + - "organizations\030\001 \003(\0132\027.gitpod.v1.Organiza" + - "tionR\rorganizations\022=\n\npagination\030\002 \001(\0132" + - "\035.gitpod.v1.PaginationResponseR\npaginati" + - "on\"D\n\031DeleteOrganizationRequest\022\'\n\017organ" + - "ization_id\030\001 \001(\tR\016organizationId\"\034\n\032Dele" + - "teOrganizationResponse\"K\n GetOrganizatio" + - "nInvitationRequest\022\'\n\017organization_id\030\001 " + - "\001(\tR\016organizationId\"H\n!GetOrganizationIn" + - "vitationResponse\022#\n\rinvitation_id\030\001 \001(\tR" + - "\014invitationId\">\n\027JoinOrganizationRequest" + - "\022#\n\rinvitation_id\030\001 \001(\tR\014invitationId\"C\n" + - "\030JoinOrganizationResponse\022\'\n\017organizatio" + - "n_id\030\001 \001(\tR\016organizationId\"M\n\"ResetOrgan" + - "izationInvitationRequest\022\'\n\017organization" + - "_id\030\001 \001(\tR\016organizationId\"J\n#ResetOrgani" + - "zationInvitationResponse\022#\n\rinvitation_i" + - "d\030\001 \001(\tR\014invitationId\"\207\001\n\036ListOrganizati" + - "onMembersRequest\022\'\n\017organization_id\030\001 \001(" + - "\tR\016organizationId\022<\n\npagination\030\002 \001(\0132\034." + - "gitpod.v1.PaginationRequestR\npagination\"" + - "\231\001\n\037ListOrganizationMembersResponse\0227\n\007m" + - "embers\030\001 \003(\0132\035.gitpod.v1.OrganizationMem" + - "berR\007members\022=\n\npagination\030\002 \001(\0132\035.gitpo" + - "d.v1.PaginationResponseR\npagination\"\242\001\n\037" + - "UpdateOrganizationMemberRequest\022\'\n\017organ" + - "ization_id\030\001 \001(\tR\016organizationId\022\027\n\007user" + - "_id\030\002 \001(\tR\006userId\0224\n\004role\030\003 \001(\0162\033.gitpod" + - ".v1.OrganizationRoleH\000R\004role\210\001\001B\007\n\005_role" + - "\"Y\n UpdateOrganizationMemberResponse\0225\n\006" + - "member\030\001 \001(\0132\035.gitpod.v1.OrganizationMem" + - "berR\006member\"c\n\037DeleteOrganizationMemberR" + - "equest\022\'\n\017organization_id\030\001 \001(\tR\016organiz" + - "ationId\022\027\n\007user_id\030\002 \001(\tR\006userId\"\"\n Dele" + - "teOrganizationMemberResponse*\224\001\n\020Organiz" + - "ationRole\022!\n\035ORGANIZATION_ROLE_UNSPECIFI" + - "ED\020\000\022\033\n\027ORGANIZATION_ROLE_OWNER\020\001\022\034\n\030ORG" + - "ANIZATION_ROLE_MEMBER\020\002\022\"\n\036ORGANIZATION_" + - "ROLE_COLLABORATOR\020\003*t\n\026OrganizationPermi" + - "ssion\022\'\n#ORGANIZATION_PERMISSION_UNSPECI" + - "FIED\020\000\0221\n-ORGANIZATION_PERMISSION_START_" + - "ARBITRARY_REPOS\020\0012\276\014\n\023OrganizationServic" + - "e\022c\n\022CreateOrganization\022$.gitpod.v1.Crea" + - "teOrganizationRequest\032%.gitpod.v1.Create" + - "OrganizationResponse\"\000\022Z\n\017GetOrganizatio" + - "n\022!.gitpod.v1.GetOrganizationRequest\032\".g" + - "itpod.v1.GetOrganizationResponse\"\000\022c\n\022Up" + - "dateOrganization\022$.gitpod.v1.UpdateOrgan" + - "izationRequest\032%.gitpod.v1.UpdateOrganiz" + - "ationResponse\"\000\022`\n\021ListOrganizations\022#.g" + - "itpod.v1.ListOrganizationsRequest\032$.gitp" + - "od.v1.ListOrganizationsResponse\"\000\022c\n\022Del" + - "eteOrganization\022$.gitpod.v1.DeleteOrgani" + - "zationRequest\032%.gitpod.v1.DeleteOrganiza" + - "tionResponse\"\000\022x\n\031GetOrganizationInvitat" + - "ion\022+.gitpod.v1.GetOrganizationInvitatio" + - "nRequest\032,.gitpod.v1.GetOrganizationInvi" + - "tationResponse\"\000\022]\n\020JoinOrganization\022\".g" + - "itpod.v1.JoinOrganizationRequest\032#.gitpo" + - "d.v1.JoinOrganizationResponse\"\000\022~\n\033Reset" + - "OrganizationInvitation\022-.gitpod.v1.Reset" + - "OrganizationInvitationRequest\032..gitpod.v" + - "1.ResetOrganizationInvitationResponse\"\000\022" + - "r\n\027ListOrganizationMembers\022).gitpod.v1.L" + - "istOrganizationMembersRequest\032*.gitpod.v" + - "1.ListOrganizationMembersResponse\"\000\022u\n\030U" + - "pdateOrganizationMember\022*.gitpod.v1.Upda" + - "teOrganizationMemberRequest\032+.gitpod.v1." + - "UpdateOrganizationMemberResponse\"\000\022u\n\030De" + - "leteOrganizationMember\022*.gitpod.v1.Delet" + - "eOrganizationMemberRequest\032+.gitpod.v1.D" + - "eleteOrganizationMemberResponse\"\000\022r\n\027Get" + - "OrganizationSettings\022).gitpod.v1.GetOrga" + - "nizationSettingsRequest\032*.gitpod.v1.GetO" + - "rganizationSettingsResponse\"\000\022{\n\032UpdateO" + - "rganizationSettings\022,.gitpod.v1.UpdateOr" + - "ganizationSettingsRequest\032-.gitpod.v1.Up" + - "dateOrganizationSettingsResponse\"\000\022\215\001\n L" + - "istOrganizationWorkspaceClasses\0222.gitpod" + - ".v1.ListOrganizationWorkspaceClassesRequ" + - "est\0323.gitpod.v1.ListOrganizationWorkspac" + - "eClassesResponse\"\000BQ\n\026io.gitpod.publicap" + - "i.v1Z7github.com/gitpod-io/gitpod/compon" + - "ents/public-api/go/v1b\006proto3" + "Id\"H\n!GetOrganizationInvitationResponse\022" + + "#\n\rinvitation_id\030\001 \001(\tR\014invitationId\">\n\027" + + "JoinOrganizationRequest\022#\n\rinvitation_id" + + "\030\001 \001(\tR\014invitationId\"C\n\030JoinOrganization" + + "Response\022\'\n\017organization_id\030\001 \001(\tR\016organ" + + "izationId\"M\n\"ResetOrganizationInvitation" + + "Request\022\'\n\017organization_id\030\001 \001(\tR\016organi" + + "zationId\"J\n#ResetOrganizationInvitationR" + + "esponse\022#\n\rinvitation_id\030\001 \001(\tR\014invitati" + + "onId\"\207\001\n\036ListOrganizationMembersRequest\022" + + "\'\n\017organization_id\030\001 \001(\tR\016organizationId" + + "\022<\n\npagination\030\002 \001(\0132\034.gitpod.v1.Paginat" + + "ionRequestR\npagination\"\231\001\n\037ListOrganizat" + + "ionMembersResponse\0227\n\007members\030\001 \003(\0132\035.gi" + + "tpod.v1.OrganizationMemberR\007members\022=\n\np" + + "agination\030\002 \001(\0132\035.gitpod.v1.PaginationRe" + + "sponseR\npagination\"\242\001\n\037UpdateOrganizatio" + + "nMemberRequest\022\'\n\017organization_id\030\001 \001(\tR" + + "\016organizationId\022\027\n\007user_id\030\002 \001(\tR\006userId" + + "\0224\n\004role\030\003 \001(\0162\033.gitpod.v1.OrganizationR" + + "oleH\000R\004role\210\001\001B\007\n\005_role\"Y\n UpdateOrganiz" + + "ationMemberResponse\0225\n\006member\030\001 \001(\0132\035.gi" + + "tpod.v1.OrganizationMemberR\006member\"c\n\037De" + + "leteOrganizationMemberRequest\022\'\n\017organiz" + + "ation_id\030\001 \001(\tR\016organizationId\022\027\n\007user_i" + + "d\030\002 \001(\tR\006userId\"\"\n DeleteOrganizationMem" + + "berResponse*\224\001\n\020OrganizationRole\022!\n\035ORGA" + + "NIZATION_ROLE_UNSPECIFIED\020\000\022\033\n\027ORGANIZAT" + + "ION_ROLE_OWNER\020\001\022\034\n\030ORGANIZATION_ROLE_ME" + + "MBER\020\002\022\"\n\036ORGANIZATION_ROLE_COLLABORATOR" + + "\020\003*t\n\026OrganizationPermission\022\'\n#ORGANIZA" + + "TION_PERMISSION_UNSPECIFIED\020\000\0221\n-ORGANIZ" + + "ATION_PERMISSION_START_ARBITRARY_REPOS\020\001" + + "2\276\014\n\023OrganizationService\022c\n\022CreateOrgani" + + "zation\022$.gitpod.v1.CreateOrganizationReq" + + "uest\032%.gitpod.v1.CreateOrganizationRespo" + + "nse\"\000\022Z\n\017GetOrganization\022!.gitpod.v1.Get" + + "OrganizationRequest\032\".gitpod.v1.GetOrgan" + + "izationResponse\"\000\022c\n\022UpdateOrganization\022" + + "$.gitpod.v1.UpdateOrganizationRequest\032%." + + "gitpod.v1.UpdateOrganizationResponse\"\000\022`" + + "\n\021ListOrganizations\022#.gitpod.v1.ListOrga" + + "nizationsRequest\032$.gitpod.v1.ListOrganiz" + + "ationsResponse\"\000\022c\n\022DeleteOrganization\022$" + + ".gitpod.v1.DeleteOrganizationRequest\032%.g" + + "itpod.v1.DeleteOrganizationResponse\"\000\022x\n" + + "\031GetOrganizationInvitation\022+.gitpod.v1.G" + + "etOrganizationInvitationRequest\032,.gitpod" + + ".v1.GetOrganizationInvitationResponse\"\000\022" + + "]\n\020JoinOrganization\022\".gitpod.v1.JoinOrga" + + "nizationRequest\032#.gitpod.v1.JoinOrganiza" + + "tionResponse\"\000\022~\n\033ResetOrganizationInvit" + + "ation\022-.gitpod.v1.ResetOrganizationInvit" + + "ationRequest\032..gitpod.v1.ResetOrganizati" + + "onInvitationResponse\"\000\022r\n\027ListOrganizati" + + "onMembers\022).gitpod.v1.ListOrganizationMe" + + "mbersRequest\032*.gitpod.v1.ListOrganizatio" + + "nMembersResponse\"\000\022u\n\030UpdateOrganization" + + "Member\022*.gitpod.v1.UpdateOrganizationMem" + + "berRequest\032+.gitpod.v1.UpdateOrganizatio" + + "nMemberResponse\"\000\022u\n\030DeleteOrganizationM" + + "ember\022*.gitpod.v1.DeleteOrganizationMemb" + + "erRequest\032+.gitpod.v1.DeleteOrganization" + + "MemberResponse\"\000\022r\n\027GetOrganizationSetti" + + "ngs\022).gitpod.v1.GetOrganizationSettingsR" + + "equest\032*.gitpod.v1.GetOrganizationSettin" + + "gsResponse\"\000\022{\n\032UpdateOrganizationSettin" + + "gs\022,.gitpod.v1.UpdateOrganizationSetting" + + "sRequest\032-.gitpod.v1.UpdateOrganizationS" + + "ettingsResponse\"\000\022\215\001\n ListOrganizationWo" + + "rkspaceClasses\0222.gitpod.v1.ListOrganizat" + + "ionWorkspaceClassesRequest\0323.gitpod.v1.L" + + "istOrganizationWorkspaceClassesResponse\"" + + "\000BQ\n\026io.gitpod.publicapi.v1Z7github.com/" + + "gitpod-io/gitpod/components/public-api/g" + + "o/v1b\006proto3" }; descriptor = com.google.protobuf.Descriptors.FileDescriptor .internalBuildGeneratedFileFrom(descriptorData, @@ -27841,7 +28069,7 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.DeleteOrganizationMemberRes internal_static_gitpod_v1_OrganizationSettings_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_gitpod_v1_OrganizationSettings_descriptor, - new java.lang.String[] { "WorkspaceSharingDisabled", "DefaultWorkspaceImage", "AllowedWorkspaceClasses", "RestrictedEditorNames", "PinnedEditorVersions", "DefaultRole", "TimeoutSettings", "RoleRestrictions", }); + new java.lang.String[] { "WorkspaceSharingDisabled", "DefaultWorkspaceImage", "AllowedWorkspaceClasses", "RestrictedEditorNames", "PinnedEditorVersions", "DefaultRole", "TimeoutSettings", "RoleRestrictions", "MaxParallelRunningWorkspaces", }); internal_static_gitpod_v1_OrganizationSettings_PinnedEditorVersionsEntry_descriptor = internal_static_gitpod_v1_OrganizationSettings_descriptor.getNestedTypes().get(0); internal_static_gitpod_v1_OrganizationSettings_PinnedEditorVersionsEntry_fieldAccessorTable = new @@ -27883,7 +28111,7 @@ public io.gitpod.publicapi.v1.OrganizationOuterClass.DeleteOrganizationMemberRes internal_static_gitpod_v1_UpdateOrganizationSettingsRequest_fieldAccessorTable = new com.google.protobuf.GeneratedMessage.FieldAccessorTable( internal_static_gitpod_v1_UpdateOrganizationSettingsRequest_descriptor, - new java.lang.String[] { "OrganizationId", "WorkspaceSharingDisabled", "DefaultWorkspaceImage", "AllowedWorkspaceClasses", "RestrictedEditorNames", "UpdateRestrictedEditorNames", "PinnedEditorVersions", "UpdatePinnedEditorVersions", "DefaultRole", "TimeoutSettings", "RoleRestrictions", "UpdateRoleRestrictions", }); + new java.lang.String[] { "OrganizationId", "WorkspaceSharingDisabled", "DefaultWorkspaceImage", "AllowedWorkspaceClasses", "RestrictedEditorNames", "UpdateRestrictedEditorNames", "PinnedEditorVersions", "UpdatePinnedEditorVersions", "DefaultRole", "TimeoutSettings", "RoleRestrictions", "UpdateRoleRestrictions", "MaxParallelRunningWorkspaces", }); internal_static_gitpod_v1_UpdateOrganizationSettingsRequest_PinnedEditorVersionsEntry_descriptor = internal_static_gitpod_v1_UpdateOrganizationSettingsRequest_descriptor.getNestedTypes().get(0); internal_static_gitpod_v1_UpdateOrganizationSettingsRequest_PinnedEditorVersionsEntry_fieldAccessorTable = new diff --git a/components/public-api/typescript-common/src/public-api-converter.ts b/components/public-api/typescript-common/src/public-api-converter.ts index 94ffb10c2177fc..9bc84e95a3c1d3 100644 --- a/components/public-api/typescript-common/src/public-api-converter.ts +++ b/components/public-api/typescript-common/src/public-api-converter.ts @@ -1130,6 +1130,7 @@ export class PublicAPIConverter { role: this.toOrgMemberRole(role as OrgMemberRole), permissions: permissions.map((permission) => this.toOrganizationPermission(permission)), })), + maxParallelRunningWorkspaces: settings.maxParallelRunningWorkspaces ?? 0, }); } diff --git a/components/public-api/typescript/src/gitpod/v1/organization_pb.ts b/components/public-api/typescript/src/gitpod/v1/organization_pb.ts index 6805d50644bcf5..ee113ca6d05ec0 100644 --- a/components/public-api/typescript/src/gitpod/v1/organization_pb.ts +++ b/components/public-api/typescript/src/gitpod/v1/organization_pb.ts @@ -287,6 +287,13 @@ export class OrganizationSettings extends Message { */ roleRestrictions: RoleRestrictionEntry[] = []; + /** + * max_parallel_running_workspaces is the maximum number of workspaces that a single user can run in parallel. 0 resets to the default, which depends on the org plan + * + * @generated from field: int32 max_parallel_running_workspaces = 9; + */ + maxParallelRunningWorkspaces = 0; + constructor(data?: PartialMessage) { super(); proto3.util.initPartial(data, this); @@ -303,6 +310,7 @@ export class OrganizationSettings extends Message { { no: 6, name: "default_role", kind: "scalar", T: 9 /* ScalarType.STRING */ }, { no: 7, name: "timeout_settings", kind: "message", T: TimeoutSettings }, { no: 8, name: "role_restrictions", kind: "message", T: RoleRestrictionEntry, repeated: true }, + { no: 9, name: "max_parallel_running_workspaces", kind: "scalar", T: 5 /* ScalarType.INT32 */ }, ]); static fromBinary(bytes: Uint8Array, options?: Partial): OrganizationSettings { @@ -548,7 +556,7 @@ export class TimeoutSettings extends Message { */ export class UpdateOrganizationSettingsRequest extends Message { /** - * organization_id is the ID of the organization to update the settings for. + * organization_id is the ID of the organization to update the settings for * * @generated from field: string organization_id = 1; */ @@ -586,7 +594,7 @@ export class UpdateOrganizationSettingsRequest extends Message pinned_editor_versions = 8; */ pinnedEditorVersions: { [key: string]: string } = {}; /** - * Specifies whether pinned_editor_versions should be updated. + * Specifies whether pinned_editor_versions should be updated * * @generated from field: optional bool update_pinned_editor_versions = 9; */ updatePinnedEditorVersions?: boolean; /** - * default_role is the default role for new members in the organization. + * default_role is the default role for new members in the organization * * @generated from field: optional string default_role = 10; */ @@ -627,12 +635,19 @@ export class UpdateOrganizationSettingsRequest extends Message) { super(); proto3.util.initPartial(data, this); @@ -653,6 +668,7 @@ export class UpdateOrganizationSettingsRequest extends Message): UpdateOrganizationSettingsRequest { @@ -872,7 +888,7 @@ export class CreateOrganizationResponse extends Message { /** - * organization_id is the unique identifier of the Organization to retreive. + * organization_id is the unique identifier of the Organization to retrieve. * * @generated from field: string organization_id = 1; */ diff --git a/components/server/leeway.Dockerfile b/components/server/leeway.Dockerfile index e8465acd5feed2..93042f961df651 100644 --- a/components/server/leeway.Dockerfile +++ b/components/server/leeway.Dockerfile @@ -2,7 +2,7 @@ # Licensed under the GNU Affero General Public License (AGPL). # See License.AGPL.txt in the project root for license information. -FROM node:18.17.1-slim as builder +FROM node:18.17.1-slim AS builder # Install Python, make, gcc and g++ for node-gyp RUN apt-get update && \ diff --git a/components/server/src/api/organization-service-api.ts b/components/server/src/api/organization-service-api.ts index a946c4c30bbe7b..f366e2e4e58f21 100644 --- a/components/server/src/api/organization-service-api.ts +++ b/components/server/src/api/organization-service-api.ts @@ -45,6 +45,7 @@ import { PaginationResponse } from "@gitpod/public-api/lib/gitpod/v1/pagination_ import { validate as uuidValidate } from "uuid"; import { ctxUserId } from "../util/request-context"; import { ApplicationError, ErrorCodes } from "@gitpod/gitpod-protocol/lib/messaging/error"; +import { EntitlementService } from "../billing/entitlement-service"; @injectable() export class OrganizationServiceAPI implements ServiceImpl { @@ -53,6 +54,8 @@ export class OrganizationServiceAPI implements ServiceImpl= 0"); + } + const maxAllowance = await this.entitlementService.getMaxParallelWorkspaces( + ctxUserId(), + req.organizationId, + ); + if (maxAllowance && req.maxParallelRunningWorkspaces > maxAllowance) { + throw new ApplicationError( + ErrorCodes.BAD_REQUEST, + `maxParallelRunningWorkspaces must be <= ${maxAllowance}`, + ); + } + if (!Number.isInteger(req.maxParallelRunningWorkspaces)) { + throw new ApplicationError(ErrorCodes.BAD_REQUEST, "maxParallelRunningWorkspaces must be an integer"); + } + + update.maxParallelRunningWorkspaces = req.maxParallelRunningWorkspaces; + } + if (Object.keys(update).length === 0) { throw new ApplicationError(ErrorCodes.BAD_REQUEST, "nothing to update"); } diff --git a/components/server/src/api/teams.spec.db.ts b/components/server/src/api/teams.spec.db.ts index fa2eff3e2084b9..a17566d69932c4 100644 --- a/components/server/src/api/teams.spec.db.ts +++ b/components/server/src/api/teams.spec.db.ts @@ -39,6 +39,7 @@ import { InstallationService } from "../auth/installation-service"; import { RateLimitter } from "../rate-limitter"; import { Authorizer } from "../authorization/authorizer"; import { AuditLogService } from "../audit/AuditLogService"; +import { EntitlementService, EntitlementServiceImpl } from "../billing/entitlement-service"; const expect = chai.expect; @@ -75,6 +76,7 @@ export class APITeamsServiceSpec { this.container.bind(RateLimitter).toConstantValue({} as RateLimitter); this.container.bind(Authorizer).toConstantValue({} as Authorizer); this.container.bind(AuditLogService).toConstantValue({} as AuditLogService); + this.container.bind(EntitlementService).toConstantValue({} as EntitlementServiceImpl); // Clean-up database const typeorm = testContainer.get(TypeORM); diff --git a/components/server/src/billing/entitlement-service-ubp.ts b/components/server/src/billing/entitlement-service-ubp.ts index 9fa77e68f0ec41..eb674f8b553c51 100644 --- a/components/server/src/billing/entitlement-service-ubp.ts +++ b/components/server/src/billing/entitlement-service-ubp.ts @@ -13,6 +13,8 @@ import { WORKSPACE_LIFETIME_SHORT, User, BillingTier, + MAX_PARALLEL_WORKSPACES_PAID, + MAX_PARALLEL_WORKSPACES_FREE, } from "@gitpod/gitpod-protocol"; import { AttributionId } from "@gitpod/gitpod-protocol/lib/attribution"; import { inject, injectable } from "inversify"; @@ -21,9 +23,10 @@ import { CostCenter_BillingStrategy } from "@gitpod/usage-api/lib/usage/v1/usage import { UsageService } from "../orgs/usage-service"; import { log } from "@gitpod/gitpod-protocol/lib/util/logging"; import { VerificationService } from "../auth/verification-service"; +import type { OrganizationService } from "../orgs/organization-service"; -const MAX_PARALLEL_WORKSPACES_FREE = 4; -const MAX_PARALLEL_WORKSPACES_PAID = 16; +export const LazyOrganizationService = Symbol("LazyOrganizationService"); +export type LazyOrganizationService = () => OrganizationService; /** * EntitlementService implementation for Usage-Based Pricing (UBP) @@ -33,6 +36,7 @@ export class EntitlementServiceUBP implements EntitlementService { constructor( @inject(UsageService) private readonly usageService: UsageService, @inject(VerificationService) private readonly verificationService: VerificationService, + @inject(LazyOrganizationService) private readonly organizationService: LazyOrganizationService, ) {} async mayStartWorkspace( @@ -48,8 +52,16 @@ export class EntitlementServiceUBP implements EntitlementService { } const hasHitParallelWorkspaceLimit = async (): Promise => { - const max = await this.getMaxParallelWorkspaces(user.id, organizationId); - const current = (await runningInstances).filter((i) => i.status.phase !== "preparing").length; + const { maxParallelRunningWorkspaces } = await this.organizationService().getSettings( + user.id, + organizationId, + ); + const planAllowance = await this.getMaxParallelWorkspaces(user.id, organizationId); + const max = maxParallelRunningWorkspaces + ? Math.min(planAllowance, maxParallelRunningWorkspaces) + : planAllowance; + + const current = await getRunningInstancesCount(runningInstances); if (current >= max) { return { current, @@ -77,7 +89,7 @@ export class EntitlementServiceUBP implements EntitlementService { return undefined; } - private async getMaxParallelWorkspaces(userId: string, organizationId: string): Promise { + async getMaxParallelWorkspaces(userId: string, organizationId: string): Promise { if (await this.hasPaidSubscription(userId, organizationId)) { return MAX_PARALLEL_WORKSPACES_PAID; } else { @@ -131,3 +143,8 @@ export class EntitlementServiceUBP implements EntitlementService { return hasPaidPlan ? "paid" : "free"; } } + +export const getRunningInstancesCount = async (instancesPromise: Promise): Promise => { + const instances = await instancesPromise; + return instances.filter((i) => i.status.phase !== "preparing").length; +}; diff --git a/components/server/src/billing/entitlement-service.ts b/components/server/src/billing/entitlement-service.ts index a19bbf79ccc165..e7866330dc3397 100644 --- a/components/server/src/billing/entitlement-service.ts +++ b/components/server/src/billing/entitlement-service.ts @@ -10,12 +10,14 @@ import { WorkspaceTimeoutDuration, WORKSPACE_TIMEOUT_DEFAULT_LONG, WORKSPACE_LIFETIME_LONG, + MAX_PARALLEL_WORKSPACES_FREE, + MAX_PARALLEL_WORKSPACES_PAID, } from "@gitpod/gitpod-protocol"; import { AttributionId } from "@gitpod/gitpod-protocol/lib/attribution"; import { BillingTier } from "@gitpod/gitpod-protocol/lib/protocol"; import { inject, injectable } from "inversify"; import { BillingModes } from "./billing-mode"; -import { EntitlementServiceUBP } from "./entitlement-service-ubp"; +import { EntitlementServiceUBP, getRunningInstancesCount, LazyOrganizationService } from "./entitlement-service-ubp"; import { log } from "@gitpod/gitpod-protocol/lib/util/logging"; export interface MayStartWorkspaceResult { @@ -48,6 +50,14 @@ export interface EntitlementService { runningInstances: Promise, ): Promise; + /** + * What amount of parallel workspaces a user may start based on their subscription + * @param userId + * @param organizationId + * @returns the maximum number of parallel workspaces the user may start, or undefined if there is no limit + */ + getMaxParallelWorkspaces(userId: string, organizationId: string): Promise; + /** * A user may set the workspace timeout if they have a professional subscription * @param userId @@ -95,6 +105,7 @@ export class EntitlementServiceImpl implements EntitlementService { constructor( @inject(BillingModes) private readonly billingModes: BillingModes, @inject(EntitlementServiceUBP) private readonly ubp: EntitlementServiceUBP, + @inject(LazyOrganizationService) private readonly organizationService: LazyOrganizationService, ) {} async mayStartWorkspace( @@ -104,9 +115,24 @@ export class EntitlementServiceImpl implements EntitlementService { ): Promise { try { const billingMode = await this.billingModes.getBillingMode(user.id, organizationId); + const organizationSettings = await this.organizationService().getSettings(user.id, organizationId); + switch (billingMode.mode) { case "none": - // if payment is not enabled users can start as many parallel workspaces as they want + // the default limit is MAX_PARALLEL_WORKSPACES_PAID, but organizations can set their own different limit + // we use || here because the default value is 0 and we want to use the default limit if the organization limit is not set + const maxParallelRunningWorkspaces = + organizationSettings.maxParallelRunningWorkspaces || MAX_PARALLEL_WORKSPACES_PAID; + const current = await getRunningInstancesCount(runningInstances); + if (current >= maxParallelRunningWorkspaces) { + return { + hitParallelWorkspaceLimit: { + current, + max: maxParallelRunningWorkspaces, + }, + }; + } + return {}; case "usage-based": return this.ubp.mayStartWorkspace(user, organizationId, runningInstances); @@ -119,6 +145,21 @@ export class EntitlementServiceImpl implements EntitlementService { } } + async getMaxParallelWorkspaces(userId: string, organizationId: string): Promise { + try { + const billingMode = await this.billingModes.getBillingMode(userId, organizationId); + switch (billingMode.mode) { + case "none": + return undefined; + case "usage-based": + return this.ubp.getMaxParallelWorkspaces(userId, organizationId); + } + } catch (err) { + log.warn({ userId }, "EntitlementService error: getMaxParallelWorkspaces", err); + return MAX_PARALLEL_WORKSPACES_FREE; + } + } + async maySetTimeout(userId: string, organizationId: string): Promise { try { const billingMode = await this.billingModes.getBillingMode(userId, organizationId); diff --git a/components/server/src/container-module.ts b/components/server/src/container-module.ts index 965efa325cf44c..0c49448d2f90a2 100644 --- a/components/server/src/container-module.ts +++ b/components/server/src/container-module.ts @@ -55,7 +55,7 @@ import { SpiceDBClientProvider, spiceDBConfigFromEnv } from "./authorization/spi import { createSpiceDBAuthorizer } from "./authorization/spicedb-authorizer"; import { BillingModes } from "./billing/billing-mode"; import { EntitlementService, EntitlementServiceImpl } from "./billing/entitlement-service"; -import { EntitlementServiceUBP } from "./billing/entitlement-service-ubp"; +import { EntitlementServiceUBP, LazyOrganizationService } from "./billing/entitlement-service-ubp"; import { StripeService } from "./billing/stripe-service"; import { CodeSyncService } from "./code-sync/code-sync-service"; import { Config, ConfigFile } from "./config"; @@ -277,6 +277,11 @@ export const productionContainerModule = new ContainerModule( bind(HeadlessLogController).toSelf().inSingletonScope(); bind(OrganizationService).toSelf().inSingletonScope(); + bind(LazyOrganizationService).toFactory((ctx) => { + return () => { + return ctx.container.get(OrganizationService); + }; + }); bind(ProjectsService).toSelf().inSingletonScope(); bind(ScmService).toSelf().inSingletonScope(); diff --git a/components/server/src/orgs/organization-service.ts b/components/server/src/orgs/organization-service.ts index c4f8a9b15caeaf..80966c1012fdeb 100644 --- a/components/server/src/orgs/organization-service.ts +++ b/components/server/src/orgs/organization-service.ts @@ -581,6 +581,9 @@ export class OrganizationService { if (settings.roleRestrictions) { result.roleRestrictions = settings.roleRestrictions; } + if (settings.maxParallelRunningWorkspaces) { + result.maxParallelRunningWorkspaces = settings.maxParallelRunningWorkspaces; + } return result; } diff --git a/components/server/src/workspace/workspace-service.ts b/components/server/src/workspace/workspace-service.ts index be785092be7ec1..4e040722d3b4da 100644 --- a/components/server/src/workspace/workspace-service.ts +++ b/components/server/src/workspace/workspace-service.ts @@ -893,10 +893,13 @@ export class WorkspaceService { }, ); } - if (!!result.hitParallelWorkspaceLimit) { + if (result.hitParallelWorkspaceLimit) { + const { max } = result.hitParallelWorkspaceLimit; throw new ApplicationError( ErrorCodes.TOO_MANY_RUNNING_WORKSPACES, - `You cannot run more than ${result.hitParallelWorkspaceLimit.max} workspaces at the same time. Please stop a workspace before starting another one.`, + `You cannot run more than ${max} workspace${ + max === 1 ? "" : "s" + } at the same time as per your organization settings. Please stop a workspace before starting another one.`, ); } } diff --git a/gitpod-ws.code-workspace b/gitpod-ws.code-workspace index b0adfc0e0c5849..4c5d17a66dec77 100644 --- a/gitpod-ws.code-workspace +++ b/gitpod-ws.code-workspace @@ -21,6 +21,9 @@ { "path": "components/gitpod-cli" }, + { + "path": "components/dashboard" + }, { "path": "components/gitpod-protocol" },