diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 00000000..5fb64c41 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,5 @@ +/docs/openapiv2/apidocs.swagger.json linguist-generated=true +*.pb.go linguist-generated=true +*.pb.*.go linguist-generated=true +go.sum linguist-generated=true +buf.lock linguist-generated=true diff --git a/.github/workflows/review.yaml b/.github/workflows/review.yaml index 805ec02f..75c87fb1 100644 --- a/.github/workflows/review.yaml +++ b/.github/workflows/review.yaml @@ -3,6 +3,7 @@ on: pull_request: branches: - main + - feat/abac permissions: contents: read diff --git a/docs/openapiv2/apidocs.swagger.json b/docs/openapiv2/apidocs.swagger.json index a4b8304b..e8767d02 100644 --- a/docs/openapiv2/apidocs.swagger.json +++ b/docs/openapiv2/apidocs.swagger.json @@ -431,6 +431,12 @@ }, "schema_version": { "type": "string" + }, + "conditions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Condition" + } } }, "required": [ @@ -603,7 +609,7 @@ "type": "object", "properties": { "tuple_key": { - "$ref": "#/definitions/TupleKey" + "$ref": "#/definitions/CheckRequestTupleKey" }, "contextual_tuples": { "$ref": "#/definitions/ContextualTupleKeys" @@ -617,6 +623,10 @@ "example": false, "description": "Defaults to false. Making it true has performance implications.", "readOnly": true + }, + "context": { + "type": "object", + "description": "Additional request context that will be used to evaluate any ABAC conditions encountered\nin the query evaluation." } }, "required": [ @@ -676,7 +686,7 @@ "type": "object", "properties": { "tuple_key": { - "$ref": "#/definitions/TupleKey" + "$ref": "#/definitions/ExpandRequestTupleKey" }, "authorization_model_id": { "type": "string", @@ -759,6 +769,10 @@ }, "contextual_tuples": { "$ref": "#/definitions/ContextualTupleKeys" + }, + "context": { + "type": "object", + "description": "Additional request context that will be used to evaluate any ABAC conditions encountered\nin the query evaluation." } }, "required": [ @@ -820,7 +834,7 @@ "type": "object", "properties": { "tuple_key": { - "$ref": "#/definitions/TupleKey" + "$ref": "#/definitions/ReadRequestTupleKey" }, "page_size": { "type": "integer", @@ -914,6 +928,10 @@ }, "contextual_tuples": { "$ref": "#/definitions/ContextualTupleKeys" + }, + "context": { + "type": "object", + "description": "Additional request context that will be used to evaluate any ABAC conditions encountered\nin the query evaluation." } }, "required": [ @@ -1008,7 +1026,7 @@ "type": "object", "properties": { "tuple_key": { - "$ref": "#/definitions/TupleKey" + "$ref": "#/definitions/CheckRequestTupleKey" }, "expectation": { "type": "boolean" @@ -1080,12 +1098,38 @@ "items": { "$ref": "#/definitions/TypeDefinition" } + }, + "conditions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/Condition" + } } }, "required": [ "schema_version" ] }, + "CheckRequestTupleKey": { + "type": "object", + "properties": { + "user": { + "type": "string", + "example": "user:anne", + "maxLength": 512 + }, + "relation": { + "type": "string", + "example": "reader", + "maxLength": 50 + }, + "object": { + "type": "string", + "example": "document:2021-budget", + "maxLength": 256 + } + } + }, "CheckResponse": { "type": "object", "properties": { @@ -1107,6 +1151,47 @@ } } }, + "Condition": { + "type": "object", + "properties": { + "name": { + "type": "string", + "title": "A unique name for the condition" + }, + "expression": { + "type": "string", + "description": "A Google CEL expression, expressed as a string." + }, + "parameters": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/ConditionParamTypeRef" + }, + "description": "A map of parameter names to the parameter's defined type reference." + } + }, + "required": [ + "name", + "expression" + ] + }, + "ConditionParamTypeRef": { + "type": "object", + "properties": { + "typeName": { + "$ref": "#/definitions/TypeName" + }, + "genericTypes": { + "type": "array", + "items": { + "$ref": "#/definitions/ConditionParamTypeRef" + } + } + }, + "required": [ + "typeName" + ] + }, "ContextualTupleKeys": { "type": "object", "properties": { @@ -1215,6 +1300,21 @@ ], "default": "no_error" }, + "ExpandRequestTupleKey": { + "type": "object", + "properties": { + "object": { + "type": "string", + "example": "document:2021-budget", + "maxLength": 256 + }, + "relation": { + "type": "string", + "example": "reader", + "maxLength": 50 + } + } + }, "ExpandResponse": { "type": "object", "properties": { @@ -1373,6 +1473,14 @@ ], "default": "no_not_found_error" }, + "NullValue": { + "type": "string", + "enum": [ + "NULL_VALUE" + ], + "default": "NULL_VALUE", + "description": "`NullValue` is a singleton enumeration to represent the null value for the\n`Value` type union.\n\n The JSON representation for `NullValue` is JSON `null`.\n\n - NULL_VALUE: Null value." + }, "ObjectRelation": { "type": "object", "properties": { @@ -1454,6 +1562,26 @@ } } }, + "ReadRequestTupleKey": { + "type": "object", + "properties": { + "user": { + "type": "string", + "example": "user:anne", + "maxLength": 512 + }, + "relation": { + "type": "string", + "example": "reader", + "maxLength": 50 + }, + "object": { + "type": "string", + "example": "document:2021-budget", + "maxLength": 256 + } + } + }, "ReadResponse": { "type": "object", "properties": { @@ -1494,6 +1622,10 @@ }, "wildcard": { "$ref": "#/definitions/Wildcard" + }, + "condition": { + "type": "string", + "description": "The name of a condition that is enforced over the allowed relation." } }, "description": "RelationReference represents a relation of a particular object type (e.g. 'document#viewer').", @@ -1501,6 +1633,24 @@ "type" ] }, + "RelationshipCondition": { + "type": "object", + "properties": { + "conditionName": { + "type": "string", + "example": "condition1", + "description": "A reference (by name) of the relationship condition defined in the authorization model.", + "maxLength": 256 + }, + "context": { + "type": "object", + "description": "Additional context/data to persist along with the condition.\nThe keys must match the parameters defined by the condition, and the value types must\nmatch the parameter type definitions." + } + }, + "required": [ + "conditionName" + ] + }, "Status": { "type": "object", "properties": { @@ -1596,6 +1746,9 @@ "type": "string", "example": "user:anne", "maxLength": 512 + }, + "condition": { + "$ref": "#/definitions/RelationshipCondition" } } }, @@ -1665,6 +1818,24 @@ "type" ] }, + "TypeName": { + "type": "string", + "enum": [ + "TYPE_NAME_UNSPECIFIED", + "TYPE_NAME_ANY", + "TYPE_NAME_BOOL", + "TYPE_NAME_STRING", + "TYPE_NAME_INT", + "TYPE_NAME_UINT", + "TYPE_NAME_DOUBLE", + "TYPE_NAME_DURATION", + "TYPE_NAME_TIMESTAMP", + "TYPE_NAME_MAP", + "TYPE_NAME_LIST", + "TYPE_NAME_IPADDRESS" + ], + "default": "TYPE_NAME_UNSPECIFIED" + }, "Users": { "type": "object", "properties": { diff --git a/openfga/v1/authzmodel.proto b/openfga/v1/authzmodel.proto index da99b0b8..87b28307 100644 --- a/openfga/v1/authzmodel.proto +++ b/openfga/v1/authzmodel.proto @@ -21,6 +21,12 @@ message AuthorizationModel { json_name = "type_definitions", (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {example: "[{\"type\": \"user\"}, {\"type\":\"document\",\"relations\":{\"reader\":{\"union\":{\"child\":[{\"this\":{}},{\"computedUserset\":{\"object\":\"\",\"relation\":\"writer\"}}]}},\"writer\":{\"this\":{}}},\"metadata\":{\"relations\":{\"reader\":{\"directly_related_user_types\":[{\"type\":\"user\"}]},\"writer\":{\"directly_related_user_types\":[{\"type\":\"user\"}]}}}}]"} ]; + + map conditions = 4 [ + json_name = "conditions", + (validate.rules).map.max_pairs = 25, + (validate.rules).map.keys.string = {pattern: "^[^:#@\\s]{1,50}$"} + ]; } message TypeDefinition { @@ -81,6 +87,9 @@ message RelationReference { Wildcard wildcard = 3; } + + // The name of a condition that is enforced over the allowed relation. + string condition = 4; } message Wildcard {} @@ -126,3 +135,47 @@ message TupleToUserset { ObjectRelation tupleset = 1; ObjectRelation computed_userset = 2; } + +message Condition { + // A unique name for the condition + string name = 1 [ + (google.api.field_behavior) = REQUIRED, + (validate.rules).string = {pattern: "^[^:#@\\s]{1,50}$"} + ]; + + // A Google CEL expression, expressed as a string. + string expression = 2 [ + (google.api.field_behavior) = REQUIRED, + (validate.rules).string = {max_bytes: 512} + ]; + + // A map of parameter names to the parameter's defined type reference. + map parameters = 3 [ + (validate.rules).map.max_pairs = 25, + (validate.rules).map.keys.string = {pattern: "^[^:#@\\s]{1,50}$"} + ]; +} + +message ConditionParamTypeRef { + enum TypeName { + TYPE_NAME_UNSPECIFIED = 0; + TYPE_NAME_ANY = 1; + TYPE_NAME_BOOL = 2; + TYPE_NAME_STRING = 3; + TYPE_NAME_INT = 4; + TYPE_NAME_UINT = 5; + TYPE_NAME_DOUBLE = 6; + TYPE_NAME_DURATION = 7; + TYPE_NAME_TIMESTAMP = 8; + TYPE_NAME_MAP = 9; + TYPE_NAME_LIST = 10; + TYPE_NAME_IPADDRESS = 11; + } + + TypeName type_name = 1 [ + (google.api.field_behavior) = REQUIRED, + (validate.rules).enum.defined_only = true + ]; + + repeated ConditionParamTypeRef generic_types = 2 [(validate.rules).repeated.max_items = 5]; +} diff --git a/openfga/v1/openfga.proto b/openfga/v1/openfga.proto index 70d0de0f..f8595f17 100644 --- a/openfga/v1/openfga.proto +++ b/openfga/v1/openfga.proto @@ -3,6 +3,7 @@ syntax = "proto3"; package openfga.v1; import "google/api/field_behavior.proto"; +import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; import "protoc-gen-openapiv2/options/annotations.proto"; import "validate/validate.proto"; @@ -25,6 +26,23 @@ message Object { ]; } +message RelationshipCondition { + // A reference (by name) of the relationship condition defined in the authorization model. + string condition_name = 1 [ + (validate.rules).string = {pattern: "^[^\\s]{2,256}$"}, + (google.api.field_behavior) = REQUIRED, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 256, + example: "\"condition1\"" + } + ]; + + // Additional context/data to persist along with the condition. + // The keys must match the parameters defined by the condition, and the value types must + // match the parameter type definitions. + google.protobuf.Struct context = 2; +} + message TupleKey { string object = 1 [ (validate.rules).string = { @@ -36,6 +54,7 @@ message TupleKey { example: "\"document:2021-budget\"" } ]; + string relation = 2 [ (validate.rules).string = { pattern: "^[^:#@\\s]{1,50}$", @@ -46,6 +65,7 @@ message TupleKey { example: "\"reader\"" } ]; + string user = 3 [ (validate.rules).string = {max_bytes: 512}, (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { @@ -53,6 +73,8 @@ message TupleKey { example: "\"user:anne\"" } ]; + + RelationshipCondition condition = 4; } message Tuple { @@ -130,23 +152,6 @@ message UsersetTree { Node root = 1; } -message Assertion { - TupleKey tuple_key = 1 [ - (validate.rules).message.required = true, - json_name = "tuple_key", - (google.api.field_behavior) = REQUIRED - ]; - - bool expectation = 2 [ - json_name = "expectation", - (google.api.field_behavior) = REQUIRED - ]; -} - -message Assertions { - repeated Assertion assertions = 1; -} - // buf:lint:ignore ENUM_ZERO_VALUE_SUFFIX enum TupleOperation { TUPLE_OPERATION_WRITE = 0; diff --git a/openfga/v1/openfga_service.proto b/openfga/v1/openfga_service.proto index c3ee025e..40db3dd0 100644 --- a/openfga/v1/openfga_service.proto +++ b/openfga/v1/openfga_service.proto @@ -5,6 +5,7 @@ package openfga.v1; import "google/api/annotations.proto"; import "google/api/field_behavior.proto"; import "google/api/visibility.proto"; +import "google/protobuf/struct.proto"; import "google/protobuf/timestamp.proto"; import "google/protobuf/wrappers.proto"; import "openfga/v1/authzmodel.proto"; @@ -711,6 +712,10 @@ message ListObjectsRequest { ]; openfga.v1.ContextualTupleKeys contextual_tuples = 6 [json_name = "contextual_tuples"]; + + // Additional request context that will be used to evaluate any ABAC conditions encountered + // in the query evaluation. + google.protobuf.Struct context = 7; } message ListObjectsResponse { @@ -763,6 +768,10 @@ message StreamedListObjectsRequest { ]; openfga.v1.ContextualTupleKeys contextual_tuples = 6 [json_name = "contextual_tuples"]; + + // Additional request context that will be used to evaluate any ABAC conditions encountered + // in the query evaluation. + google.protobuf.Struct context = 7; } // The response for a StreamedListObjects RPC. @@ -785,7 +794,7 @@ message ReadRequest { (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {example: "\"01YCP46JKYM8FJCQ37NMBYHE5X\""} ]; - openfga.v1.TupleKey tuple_key = 2 [json_name = "tuple_key"]; + ReadRequestTupleKey tuple_key = 2 [json_name = "tuple_key"]; google.protobuf.Int32Value page_size = 3 [ json_name = "page_size", @@ -803,6 +812,38 @@ message ReadRequest { ]; } +message ReadRequestTupleKey { + string user = 1 [ + (validate.rules).string = {max_bytes: 512}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 512, + example: "\"user:anne\"" + } + ]; + + string relation = 2 [ + (validate.rules).string = { + pattern: "^[^:#@\\s]{1,50}$", + ignore_empty: true + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 50, + example: "\"reader\"" + } + ]; + + string object = 3 [ + (validate.rules).string = { + pattern: "^[^\\s]{2,256}$", + ignore_empty: true + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 256, + example: "\"document:2021-budget\"" + } + ]; +} + message ReadResponse { repeated openfga.v1.Tuple tuples = 1; @@ -848,7 +889,7 @@ message CheckRequest { (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {example: "\"01YCP46JKYM8FJCQ37NMBYHE5X\""} ]; - openfga.v1.TupleKey tuple_key = 2 [ + CheckRequestTupleKey tuple_key = 2 [ json_name = "tuple_key", (validate.rules).message.required = true, (google.api.field_behavior) = REQUIRED @@ -870,6 +911,42 @@ message CheckRequest { read_only: true, example: "false" }]; + + // Additional request context that will be used to evaluate any ABAC conditions encountered + // in the query evaluation. + google.protobuf.Struct context = 6; +} + +message CheckRequestTupleKey { + string user = 1 [ + (validate.rules).string = {max_bytes: 512}, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 512, + example: "\"user:anne\"" + } + ]; + + string relation = 2 [ + (validate.rules).string = { + pattern: "^[^:#@\\s]{1,50}$", + ignore_empty: true + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 50, + example: "\"reader\"" + } + ]; + + string object = 3 [ + (validate.rules).string = { + pattern: "^[^\\s]{2,256}$", + ignore_empty: true + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 256, + example: "\"document:2021-budget\"" + } + ]; } message CheckResponse { @@ -887,7 +964,7 @@ message ExpandRequest { (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = {example: "\"01YCP46JKYM8FJCQ37NMBYHE5X\""} ]; - openfga.v1.TupleKey tuple_key = 2 [ + ExpandRequestTupleKey tuple_key = 2 [ json_name = "tuple_key", (validate.rules).message.required = true, (google.api.field_behavior) = REQUIRED @@ -903,6 +980,30 @@ message ExpandRequest { ]; } +message ExpandRequestTupleKey { + string object = 1 [ + (validate.rules).string = { + pattern: "^[^\\s]{2,256}$", + ignore_empty: true + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 256, + example: "\"document:2021-budget\"" + } + ]; + + string relation = 2 [ + (validate.rules).string = { + pattern: "^[^:#@\\s]{1,50}$", + ignore_empty: true + }, + (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_field) = { + max_length: 50, + example: "\"reader\"" + } + ]; +} + message ExpandResponse { openfga.v1.UsersetTree tree = 1; } @@ -947,6 +1048,12 @@ message WriteAuthorizationModelRequest { ignore_empty: false } ]; + + map conditions = 4 [ + json_name = "conditions", + (validate.rules).map.max_pairs = 25, + (validate.rules).map.keys.string = {pattern: "^[^:#@\\s]{1,50}$"} + ]; } message WriteAuthorizationModelResponse { @@ -1181,3 +1288,20 @@ message ListStoresResponse { } ]; } + +message Assertion { + CheckRequestTupleKey tuple_key = 1 [ + (validate.rules).message.required = true, + json_name = "tuple_key", + (google.api.field_behavior) = REQUIRED + ]; + + bool expectation = 2 [ + json_name = "expectation", + (google.api.field_behavior) = REQUIRED + ]; +} + +message Assertions { + repeated Assertion assertions = 1; +} diff --git a/proto/openfga/v1/authzmodel.pb.go b/proto/openfga/v1/authzmodel.pb.go index 776a86fb..507d866d 100644 --- a/proto/openfga/v1/authzmodel.pb.go +++ b/proto/openfga/v1/authzmodel.pb.go @@ -23,14 +23,91 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +type ConditionParamTypeRef_TypeName int32 + +const ( + ConditionParamTypeRef_TYPE_NAME_UNSPECIFIED ConditionParamTypeRef_TypeName = 0 + ConditionParamTypeRef_TYPE_NAME_ANY ConditionParamTypeRef_TypeName = 1 + ConditionParamTypeRef_TYPE_NAME_BOOL ConditionParamTypeRef_TypeName = 2 + ConditionParamTypeRef_TYPE_NAME_STRING ConditionParamTypeRef_TypeName = 3 + ConditionParamTypeRef_TYPE_NAME_INT ConditionParamTypeRef_TypeName = 4 + ConditionParamTypeRef_TYPE_NAME_UINT ConditionParamTypeRef_TypeName = 5 + ConditionParamTypeRef_TYPE_NAME_DOUBLE ConditionParamTypeRef_TypeName = 6 + ConditionParamTypeRef_TYPE_NAME_DURATION ConditionParamTypeRef_TypeName = 7 + ConditionParamTypeRef_TYPE_NAME_TIMESTAMP ConditionParamTypeRef_TypeName = 8 + ConditionParamTypeRef_TYPE_NAME_MAP ConditionParamTypeRef_TypeName = 9 + ConditionParamTypeRef_TYPE_NAME_LIST ConditionParamTypeRef_TypeName = 10 + ConditionParamTypeRef_TYPE_NAME_IPADDRESS ConditionParamTypeRef_TypeName = 11 +) + +// Enum value maps for ConditionParamTypeRef_TypeName. +var ( + ConditionParamTypeRef_TypeName_name = map[int32]string{ + 0: "TYPE_NAME_UNSPECIFIED", + 1: "TYPE_NAME_ANY", + 2: "TYPE_NAME_BOOL", + 3: "TYPE_NAME_STRING", + 4: "TYPE_NAME_INT", + 5: "TYPE_NAME_UINT", + 6: "TYPE_NAME_DOUBLE", + 7: "TYPE_NAME_DURATION", + 8: "TYPE_NAME_TIMESTAMP", + 9: "TYPE_NAME_MAP", + 10: "TYPE_NAME_LIST", + 11: "TYPE_NAME_IPADDRESS", + } + ConditionParamTypeRef_TypeName_value = map[string]int32{ + "TYPE_NAME_UNSPECIFIED": 0, + "TYPE_NAME_ANY": 1, + "TYPE_NAME_BOOL": 2, + "TYPE_NAME_STRING": 3, + "TYPE_NAME_INT": 4, + "TYPE_NAME_UINT": 5, + "TYPE_NAME_DOUBLE": 6, + "TYPE_NAME_DURATION": 7, + "TYPE_NAME_TIMESTAMP": 8, + "TYPE_NAME_MAP": 9, + "TYPE_NAME_LIST": 10, + "TYPE_NAME_IPADDRESS": 11, + } +) + +func (x ConditionParamTypeRef_TypeName) Enum() *ConditionParamTypeRef_TypeName { + p := new(ConditionParamTypeRef_TypeName) + *p = x + return p +} + +func (x ConditionParamTypeRef_TypeName) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (ConditionParamTypeRef_TypeName) Descriptor() protoreflect.EnumDescriptor { + return file_openfga_v1_authzmodel_proto_enumTypes[0].Descriptor() +} + +func (ConditionParamTypeRef_TypeName) Type() protoreflect.EnumType { + return &file_openfga_v1_authzmodel_proto_enumTypes[0] +} + +func (x ConditionParamTypeRef_TypeName) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use ConditionParamTypeRef_TypeName.Descriptor instead. +func (ConditionParamTypeRef_TypeName) EnumDescriptor() ([]byte, []int) { + return file_openfga_v1_authzmodel_proto_rawDescGZIP(), []int{15, 0} +} + type AuthorizationModel struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` - SchemaVersion string `protobuf:"bytes,2,opt,name=schema_version,proto3" json:"schema_version,omitempty"` - TypeDefinitions []*TypeDefinition `protobuf:"bytes,3,rep,name=type_definitions,proto3" json:"type_definitions,omitempty"` + Id string `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + SchemaVersion string `protobuf:"bytes,2,opt,name=schema_version,proto3" json:"schema_version,omitempty"` + TypeDefinitions []*TypeDefinition `protobuf:"bytes,3,rep,name=type_definitions,proto3" json:"type_definitions,omitempty"` + Conditions map[string]*Condition `protobuf:"bytes,4,rep,name=conditions,proto3" json:"conditions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *AuthorizationModel) Reset() { @@ -86,6 +163,13 @@ func (x *AuthorizationModel) GetTypeDefinitions() []*TypeDefinition { return nil } +func (x *AuthorizationModel) GetConditions() map[string]*Condition { + if x != nil { + return x.Conditions + } + return nil +} + type TypeDefinition struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -366,6 +450,8 @@ type RelationReference struct { // *RelationReference_Relation // *RelationReference_Wildcard RelationOrWildcard isRelationReference_RelationOrWildcard `protobuf_oneof:"relation_or_wildcard"` + // The name of a condition that is enforced over the allowed relation. + Condition string `protobuf:"bytes,4,opt,name=condition,proto3" json:"condition,omitempty"` } func (x *RelationReference) Reset() { @@ -428,6 +514,13 @@ func (x *RelationReference) GetWildcard() *Wildcard { return nil } +func (x *RelationReference) GetCondition() string { + if x != nil { + return x.Condition + } + return "" +} + type isRelationReference_RelationOrWildcard interface { isRelationReference_RelationOrWildcard() } @@ -872,6 +965,127 @@ func (x *TupleToUserset) GetComputedUserset() *ObjectRelation { return nil } +type Condition struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A unique name for the condition + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // A Google CEL expression, expressed as a string. + Expression string `protobuf:"bytes,2,opt,name=expression,proto3" json:"expression,omitempty"` + // A map of parameter names to the parameter's defined type reference. + Parameters map[string]*ConditionParamTypeRef `protobuf:"bytes,3,rep,name=parameters,proto3" json:"parameters,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` +} + +func (x *Condition) Reset() { + *x = Condition{} + if protoimpl.UnsafeEnabled { + mi := &file_openfga_v1_authzmodel_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Condition) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Condition) ProtoMessage() {} + +func (x *Condition) ProtoReflect() protoreflect.Message { + mi := &file_openfga_v1_authzmodel_proto_msgTypes[14] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Condition.ProtoReflect.Descriptor instead. +func (*Condition) Descriptor() ([]byte, []int) { + return file_openfga_v1_authzmodel_proto_rawDescGZIP(), []int{14} +} + +func (x *Condition) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *Condition) GetExpression() string { + if x != nil { + return x.Expression + } + return "" +} + +func (x *Condition) GetParameters() map[string]*ConditionParamTypeRef { + if x != nil { + return x.Parameters + } + return nil +} + +type ConditionParamTypeRef struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TypeName ConditionParamTypeRef_TypeName `protobuf:"varint,1,opt,name=type_name,json=typeName,proto3,enum=openfga.v1.ConditionParamTypeRef_TypeName" json:"type_name,omitempty"` + GenericTypes []*ConditionParamTypeRef `protobuf:"bytes,2,rep,name=generic_types,json=genericTypes,proto3" json:"generic_types,omitempty"` +} + +func (x *ConditionParamTypeRef) Reset() { + *x = ConditionParamTypeRef{} + if protoimpl.UnsafeEnabled { + mi := &file_openfga_v1_authzmodel_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ConditionParamTypeRef) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConditionParamTypeRef) ProtoMessage() {} + +func (x *ConditionParamTypeRef) ProtoReflect() protoreflect.Message { + mi := &file_openfga_v1_authzmodel_proto_msgTypes[15] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConditionParamTypeRef.ProtoReflect.Descriptor instead. +func (*ConditionParamTypeRef) Descriptor() ([]byte, []int) { + return file_openfga_v1_authzmodel_proto_rawDescGZIP(), []int{15} +} + +func (x *ConditionParamTypeRef) GetTypeName() ConditionParamTypeRef_TypeName { + if x != nil { + return x.TypeName + } + return ConditionParamTypeRef_TYPE_NAME_UNSPECIFIED +} + +func (x *ConditionParamTypeRef) GetGenericTypes() []*ConditionParamTypeRef { + if x != nil { + return x.GenericTypes + } + return nil +} + var File_openfga_v1_authzmodel_proto protoreflect.FileDescriptor var file_openfga_v1_authzmodel_proto_rawDesc = []byte{ @@ -884,7 +1098,7 @@ var file_openfga_v1_authzmodel_proto_rawDesc = []byte{ 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x22, 0xab, 0x04, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x6f, 0x74, 0x6f, 0x22, 0xf1, 0x05, 0x0a, 0x12, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x59, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, @@ -919,148 +1133,210 @@ var file_openfga_v1_authzmodel_proto_rawDesc = []byte{ 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x7d, 0x5d, 0x7d, 0x7d, 0x7d, 0x7d, 0x5d, 0x52, 0x10, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0xba, 0x03, 0x0a, 0x0e, 0x54, 0x79, 0x70, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x2a, 0x92, 0x41, 0x0c, 0x4a, 0x0a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5e, - 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x35, 0x34, 0x7d, 0x24, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0xe2, 0x01, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, - 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, - 0x74, 0x72, 0x79, 0x42, 0x98, 0x01, 0x92, 0x41, 0x79, 0x4a, 0x77, 0x7b, 0x22, 0x72, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x7b, 0x22, - 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3a, 0x5b, 0x7b, 0x22, 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, - 0x7b, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x65, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, - 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, - 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x7d, 0x7d, 0x5d, 0x7d, 0x7d, 0x2c, 0x22, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, - 0x7d, 0x7d, 0xfa, 0x42, 0x19, 0x9a, 0x01, 0x16, 0x22, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, - 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0x52, 0x09, - 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x30, 0x0a, 0x08, 0x6d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, - 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x1a, 0x51, 0x0a, 0x0e, 0x52, - 0x65, 0x6c, 0x61, 0x74, 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, - 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, - 0x01, 0x0a, 0x08, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, - 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x30, - 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x07, 0x72, 0x65, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x73, 0x12, 0x6e, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x1e, 0xfa, 0x42, 0x1b, 0x9a, 0x01, 0x18, 0x10, 0x19, 0x22, + 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, + 0x2c, 0x35, 0x30, 0x7d, 0x24, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x1a, 0x54, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 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, 0x2b, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xba, 0x03, 0x0a, 0x0e, 0x54, 0x79, 0x70, 0x65, + 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0x92, 0x41, 0x0c, 0x4a, 0x0a, 0x22, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x15, 0x72, + 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x32, + 0x35, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0xe2, 0x01, 0x0a, 0x09, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, + 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x98, 0x01, 0x92, 0x41, 0x79, 0x4a, + 0x77, 0x7b, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x75, 0x6e, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x7b, 0x22, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3a, 0x5b, 0x7b, 0x22, + 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x7d, 0x2c, 0x7b, 0x22, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x22, 0x3a, 0x7b, 0x22, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x7d, 0x7d, 0x5d, + 0x7d, 0x7d, 0x2c, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x3a, 0x7b, 0x22, 0x74, 0x68, + 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x7d, 0x7d, 0xfa, 0x42, 0x19, 0x9a, 0x01, 0x16, 0x22, 0x14, + 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, + 0x35, 0x30, 0x7d, 0x24, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x30, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x1a, 0x51, 0x0a, 0x0e, 0x52, 0x65, 0x6c, 0x61, 0x74, 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, 0x29, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x3a, 0x02, 0x38, 0x01, 0x22, 0xae, 0x01, 0x0a, 0x08, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x2b, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x17, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, + 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, + 0x0a, 0x07, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x65, 0x74, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, + 0x01, 0x52, 0x07, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x74, 0x79, + 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x74, 0x79, 0x70, + 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, 0x73, 0x0a, 0x10, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x54, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x5f, 0x0a, 0x1b, 0x64, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x73, + 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x1b, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, + 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x5a, 0x0a, 0x0e, 0x52, 0x65, + 0x6c, 0x61, 0x74, 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, 0x32, + 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x73, 0x0a, 0x10, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x1b, 0x64, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x1b, + 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0x81, 0x02, 0x0a, 0x11, + 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x27, 0x92, 0x41, 0x09, 0x4a, 0x07, 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xe0, 0x41, 0x02, + 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, + 0x7b, 0x31, 0x2c, 0x32, 0x35, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x45, + 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x27, 0x92, 0x41, 0x0a, 0x4a, 0x08, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xfa, + 0x42, 0x17, 0x72, 0x15, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, + 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x08, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, + 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x48, 0x00, 0x52, + 0x08, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x63, 0x6f, + 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x16, 0x0a, 0x14, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6f, 0x72, 0x5f, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x22, + 0x0a, 0x0a, 0x08, 0x57, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x22, 0x35, 0x0a, 0x08, 0x55, + 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x63, 0x68, 0x69, 0x6c, 0x64, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x52, 0x05, 0x63, 0x68, 0x69, + 0x6c, 0x64, 0x22, 0x80, 0x01, 0x0a, 0x0a, 0x44, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x34, 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x65, 0x74, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, + 0x01, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x42, 0x0b, - 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x07, 0x72, 0x65, 0x77, - 0x72, 0x69, 0x74, 0x65, 0x12, 0x39, 0x0a, 0x09, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, - 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, - 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x49, 0x6e, 0x66, 0x6f, 0x22, - 0x73, 0x0a, 0x10, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x79, 0x70, 0x65, 0x49, - 0x6e, 0x66, 0x6f, 0x12, 0x5f, 0x0a, 0x1b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, 0x5f, - 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, - 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x1b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, - 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x73, 0x22, 0xa9, 0x01, 0x0a, 0x08, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x41, 0x0a, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, - 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x09, 0x72, 0x65, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x5a, 0x0a, 0x0e, 0x52, 0x65, 0x6c, 0x61, 0x74, 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, 0x32, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, - 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x73, 0x0a, 0x10, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x65, 0x74, 0x61, - 0x64, 0x61, 0x74, 0x61, 0x12, 0x5f, 0x0a, 0x1b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6c, 0x79, - 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x79, - 0x70, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, - 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x1b, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, - 0x6c, 0x79, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x73, 0x22, 0xe3, 0x01, 0x0a, 0x11, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0x92, 0x41, 0x09, 0x4a, 0x07, - 0x22, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, - 0x11, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x35, 0x34, - 0x7d, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x45, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0x92, 0x41, 0x0a, 0x4a, - 0x08, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0xfa, 0x42, 0x17, 0x72, 0x15, 0x32, 0x10, - 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, - 0xd0, 0x01, 0x01, 0x48, 0x00, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x32, 0x0a, 0x08, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x48, 0x00, 0x52, 0x08, 0x77, 0x69, 0x6c, 0x64, 0x63, - 0x61, 0x72, 0x64, 0x42, 0x16, 0x0a, 0x14, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6f, 0x72, 0x5f, 0x77, 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x22, 0x0a, 0x0a, 0x08, 0x57, - 0x69, 0x6c, 0x64, 0x63, 0x61, 0x72, 0x64, 0x22, 0x35, 0x0a, 0x08, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x65, 0x74, 0x73, 0x12, 0x29, 0x0a, 0x05, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x52, 0x05, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x80, - 0x01, 0x0a, 0x0a, 0x44, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x34, 0x0a, - 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, - 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, - 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x04, 0x62, - 0x61, 0x73, 0x65, 0x12, 0x3c, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xfa, - 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x22, 0xfa, 0x02, 0x0a, 0x07, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x12, 0x2f, 0x0a, - 0x04, 0x74, 0x68, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x6f, 0x70, - 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x04, 0x74, 0x68, 0x69, 0x73, 0x12, 0x47, - 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, - 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, - 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x10, 0x74, 0x75, 0x70, 0x6c, 0x65, - 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x75, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, - 0x0e, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x12, - 0x2c, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, - 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x65, 0x74, 0x73, 0x48, 0x00, 0x52, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, - 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x73, 0x48, 0x00, 0x52, 0x0c, 0x69, 0x6e, 0x74, - 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x0a, 0x64, 0x69, 0x66, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x22, 0x0f, - 0x0a, 0x0d, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x22, - 0x57, 0x0a, 0x0e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x12, 0x20, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x02, 0x52, 0x06, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x28, 0x32, 0x52, 0x08, - 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x0e, 0x54, 0x75, 0x70, - 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x12, 0x36, 0x0a, 0x08, 0x74, - 0x75, 0x70, 0x6c, 0x65, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x74, 0x75, 0x70, 0x6c, 0x65, - 0x73, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, - 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, 0x75, - 0x74, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x42, 0x9d, 0x01, 0x0a, 0x0e, 0x63, - 0x6f, 0x6d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x42, 0x0f, 0x41, - 0x75, 0x74, 0x68, 0x7a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, - 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, - 0x6e, 0x66, 0x67, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, - 0x61, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4f, 0x70, 0x65, 0x6e, - 0x66, 0x67, 0x61, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, - 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x5c, 0x56, 0x31, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x4f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x73, 0x75, 0x62, + 0x74, 0x72, 0x61, 0x63, 0x74, 0x22, 0xfa, 0x02, 0x0a, 0x07, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, + 0x74, 0x12, 0x2f, 0x0a, 0x04, 0x74, 0x68, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x69, 0x72, + 0x65, 0x63, 0x74, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x04, 0x74, 0x68, + 0x69, 0x73, 0x12, 0x47, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x5f, 0x75, + 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x00, 0x52, 0x0f, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x12, 0x46, 0x0a, 0x10, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, + 0x74, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x65, 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x73, 0x48, 0x00, 0x52, 0x05, 0x75, 0x6e, 0x69, 0x6f, + 0x6e, 0x12, 0x3a, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x73, 0x48, 0x00, 0x52, + 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, + 0x0a, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x16, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, + 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x66, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x09, 0x0a, 0x07, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x65, 0x74, 0x22, 0x0f, 0x0a, 0x0d, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x65, 0x74, 0x22, 0x57, 0x0a, 0x0e, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x20, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x02, 0x52, + 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x23, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, + 0x28, 0x32, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x01, 0x0a, + 0x0e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x12, + 0x36, 0x0a, 0x08, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x08, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x73, 0x65, 0x74, 0x12, 0x45, 0x0a, 0x10, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x64, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0f, 0x63, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x22, 0xb1, + 0x02, 0x0a, 0x09, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x04, + 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1a, 0xe0, 0x41, 0x02, 0xfa, + 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, + 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x2b, 0x0a, 0x0a, + 0x65, 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x04, 0x52, 0x0a, 0x65, + 0x78, 0x70, 0x72, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x65, 0x0a, 0x0a, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x45, + 0x6e, 0x74, 0x72, 0x79, 0x42, 0x1e, 0xfa, 0x42, 0x1b, 0x9a, 0x01, 0x18, 0x10, 0x19, 0x22, 0x14, + 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, + 0x35, 0x30, 0x7d, 0x24, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, + 0x1a, 0x60, 0x0a, 0x0f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 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, 0x37, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x66, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, + 0x38, 0x01, 0x22, 0xd2, 0x03, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x66, 0x12, 0x54, 0x0a, 0x09, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, + 0x2a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x65, 0x66, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x42, 0x0b, 0xe0, 0x41, 0x02, + 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x08, 0x74, 0x79, 0x70, 0x65, 0x4e, 0x61, + 0x6d, 0x65, 0x12, 0x50, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x5f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x66, 0x42, 0x08, 0xfa, 0x42, + 0x05, 0x92, 0x01, 0x02, 0x10, 0x05, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x69, 0x63, 0x54, + 0x79, 0x70, 0x65, 0x73, 0x22, 0x90, 0x02, 0x0a, 0x08, 0x54, 0x79, 0x70, 0x65, 0x4e, 0x61, 0x6d, + 0x65, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x11, 0x0a, 0x0d, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x41, 0x4e, 0x59, 0x10, 0x01, 0x12, + 0x12, 0x0a, 0x0e, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x42, 0x4f, 0x4f, + 0x4c, 0x10, 0x02, 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, + 0x5f, 0x53, 0x54, 0x52, 0x49, 0x4e, 0x47, 0x10, 0x03, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, + 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x49, 0x4e, 0x54, 0x10, 0x04, 0x12, 0x12, 0x0a, 0x0e, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x55, 0x49, 0x4e, 0x54, 0x10, 0x05, + 0x12, 0x14, 0x0a, 0x10, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x44, 0x4f, + 0x55, 0x42, 0x4c, 0x45, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, + 0x41, 0x4d, 0x45, 0x5f, 0x44, 0x55, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x10, 0x07, 0x12, 0x17, + 0x0a, 0x13, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, + 0x53, 0x54, 0x41, 0x4d, 0x50, 0x10, 0x08, 0x12, 0x11, 0x0a, 0x0d, 0x54, 0x59, 0x50, 0x45, 0x5f, + 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x4d, 0x41, 0x50, 0x10, 0x09, 0x12, 0x12, 0x0a, 0x0e, 0x54, 0x59, + 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x0a, 0x12, 0x17, + 0x0a, 0x13, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x5f, 0x49, 0x50, 0x41, 0x44, + 0x44, 0x52, 0x45, 0x53, 0x53, 0x10, 0x0b, 0x42, 0x9d, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x42, 0x0f, 0x41, 0x75, 0x74, 0x68, + 0x7a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, + 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, + 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x76, 0x31, + 0xa2, 0x02, 0x03, 0x4f, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, + 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x5c, 0x56, 0x31, + 0xe2, 0x02, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, + 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x4f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1075,53 +1351,65 @@ func file_openfga_v1_authzmodel_proto_rawDescGZIP() []byte { return file_openfga_v1_authzmodel_proto_rawDescData } -var file_openfga_v1_authzmodel_proto_msgTypes = make([]protoimpl.MessageInfo, 16) +var file_openfga_v1_authzmodel_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_openfga_v1_authzmodel_proto_msgTypes = make([]protoimpl.MessageInfo, 20) var file_openfga_v1_authzmodel_proto_goTypes = []interface{}{ - (*AuthorizationModel)(nil), // 0: openfga.v1.AuthorizationModel - (*TypeDefinition)(nil), // 1: openfga.v1.TypeDefinition - (*Relation)(nil), // 2: openfga.v1.Relation - (*RelationTypeInfo)(nil), // 3: openfga.v1.RelationTypeInfo - (*Metadata)(nil), // 4: openfga.v1.Metadata - (*RelationMetadata)(nil), // 5: openfga.v1.RelationMetadata - (*RelationReference)(nil), // 6: openfga.v1.RelationReference - (*Wildcard)(nil), // 7: openfga.v1.Wildcard - (*Usersets)(nil), // 8: openfga.v1.Usersets - (*Difference)(nil), // 9: openfga.v1.Difference - (*Userset)(nil), // 10: openfga.v1.Userset - (*DirectUserset)(nil), // 11: openfga.v1.DirectUserset - (*ObjectRelation)(nil), // 12: openfga.v1.ObjectRelation - (*TupleToUserset)(nil), // 13: openfga.v1.TupleToUserset - nil, // 14: openfga.v1.TypeDefinition.RelationsEntry - nil, // 15: openfga.v1.Metadata.RelationsEntry + (ConditionParamTypeRef_TypeName)(0), // 0: openfga.v1.ConditionParamTypeRef.TypeName + (*AuthorizationModel)(nil), // 1: openfga.v1.AuthorizationModel + (*TypeDefinition)(nil), // 2: openfga.v1.TypeDefinition + (*Relation)(nil), // 3: openfga.v1.Relation + (*RelationTypeInfo)(nil), // 4: openfga.v1.RelationTypeInfo + (*Metadata)(nil), // 5: openfga.v1.Metadata + (*RelationMetadata)(nil), // 6: openfga.v1.RelationMetadata + (*RelationReference)(nil), // 7: openfga.v1.RelationReference + (*Wildcard)(nil), // 8: openfga.v1.Wildcard + (*Usersets)(nil), // 9: openfga.v1.Usersets + (*Difference)(nil), // 10: openfga.v1.Difference + (*Userset)(nil), // 11: openfga.v1.Userset + (*DirectUserset)(nil), // 12: openfga.v1.DirectUserset + (*ObjectRelation)(nil), // 13: openfga.v1.ObjectRelation + (*TupleToUserset)(nil), // 14: openfga.v1.TupleToUserset + (*Condition)(nil), // 15: openfga.v1.Condition + (*ConditionParamTypeRef)(nil), // 16: openfga.v1.ConditionParamTypeRef + nil, // 17: openfga.v1.AuthorizationModel.ConditionsEntry + nil, // 18: openfga.v1.TypeDefinition.RelationsEntry + nil, // 19: openfga.v1.Metadata.RelationsEntry + nil, // 20: openfga.v1.Condition.ParametersEntry } var file_openfga_v1_authzmodel_proto_depIdxs = []int32{ - 1, // 0: openfga.v1.AuthorizationModel.type_definitions:type_name -> openfga.v1.TypeDefinition - 14, // 1: openfga.v1.TypeDefinition.relations:type_name -> openfga.v1.TypeDefinition.RelationsEntry - 4, // 2: openfga.v1.TypeDefinition.metadata:type_name -> openfga.v1.Metadata - 10, // 3: openfga.v1.Relation.rewrite:type_name -> openfga.v1.Userset - 3, // 4: openfga.v1.Relation.type_info:type_name -> openfga.v1.RelationTypeInfo - 6, // 5: openfga.v1.RelationTypeInfo.directly_related_user_types:type_name -> openfga.v1.RelationReference - 15, // 6: openfga.v1.Metadata.relations:type_name -> openfga.v1.Metadata.RelationsEntry - 6, // 7: openfga.v1.RelationMetadata.directly_related_user_types:type_name -> openfga.v1.RelationReference - 7, // 8: openfga.v1.RelationReference.wildcard:type_name -> openfga.v1.Wildcard - 10, // 9: openfga.v1.Usersets.child:type_name -> openfga.v1.Userset - 10, // 10: openfga.v1.Difference.base:type_name -> openfga.v1.Userset - 10, // 11: openfga.v1.Difference.subtract:type_name -> openfga.v1.Userset - 11, // 12: openfga.v1.Userset.this:type_name -> openfga.v1.DirectUserset - 12, // 13: openfga.v1.Userset.computed_userset:type_name -> openfga.v1.ObjectRelation - 13, // 14: openfga.v1.Userset.tuple_to_userset:type_name -> openfga.v1.TupleToUserset - 8, // 15: openfga.v1.Userset.union:type_name -> openfga.v1.Usersets - 8, // 16: openfga.v1.Userset.intersection:type_name -> openfga.v1.Usersets - 9, // 17: openfga.v1.Userset.difference:type_name -> openfga.v1.Difference - 12, // 18: openfga.v1.TupleToUserset.tupleset:type_name -> openfga.v1.ObjectRelation - 12, // 19: openfga.v1.TupleToUserset.computed_userset:type_name -> openfga.v1.ObjectRelation - 10, // 20: openfga.v1.TypeDefinition.RelationsEntry.value:type_name -> openfga.v1.Userset - 5, // 21: openfga.v1.Metadata.RelationsEntry.value:type_name -> openfga.v1.RelationMetadata - 22, // [22:22] is the sub-list for method output_type - 22, // [22:22] is the sub-list for method input_type - 22, // [22:22] is the sub-list for extension type_name - 22, // [22:22] is the sub-list for extension extendee - 0, // [0:22] is the sub-list for field type_name + 2, // 0: openfga.v1.AuthorizationModel.type_definitions:type_name -> openfga.v1.TypeDefinition + 17, // 1: openfga.v1.AuthorizationModel.conditions:type_name -> openfga.v1.AuthorizationModel.ConditionsEntry + 18, // 2: openfga.v1.TypeDefinition.relations:type_name -> openfga.v1.TypeDefinition.RelationsEntry + 5, // 3: openfga.v1.TypeDefinition.metadata:type_name -> openfga.v1.Metadata + 11, // 4: openfga.v1.Relation.rewrite:type_name -> openfga.v1.Userset + 4, // 5: openfga.v1.Relation.type_info:type_name -> openfga.v1.RelationTypeInfo + 7, // 6: openfga.v1.RelationTypeInfo.directly_related_user_types:type_name -> openfga.v1.RelationReference + 19, // 7: openfga.v1.Metadata.relations:type_name -> openfga.v1.Metadata.RelationsEntry + 7, // 8: openfga.v1.RelationMetadata.directly_related_user_types:type_name -> openfga.v1.RelationReference + 8, // 9: openfga.v1.RelationReference.wildcard:type_name -> openfga.v1.Wildcard + 11, // 10: openfga.v1.Usersets.child:type_name -> openfga.v1.Userset + 11, // 11: openfga.v1.Difference.base:type_name -> openfga.v1.Userset + 11, // 12: openfga.v1.Difference.subtract:type_name -> openfga.v1.Userset + 12, // 13: openfga.v1.Userset.this:type_name -> openfga.v1.DirectUserset + 13, // 14: openfga.v1.Userset.computed_userset:type_name -> openfga.v1.ObjectRelation + 14, // 15: openfga.v1.Userset.tuple_to_userset:type_name -> openfga.v1.TupleToUserset + 9, // 16: openfga.v1.Userset.union:type_name -> openfga.v1.Usersets + 9, // 17: openfga.v1.Userset.intersection:type_name -> openfga.v1.Usersets + 10, // 18: openfga.v1.Userset.difference:type_name -> openfga.v1.Difference + 13, // 19: openfga.v1.TupleToUserset.tupleset:type_name -> openfga.v1.ObjectRelation + 13, // 20: openfga.v1.TupleToUserset.computed_userset:type_name -> openfga.v1.ObjectRelation + 20, // 21: openfga.v1.Condition.parameters:type_name -> openfga.v1.Condition.ParametersEntry + 0, // 22: openfga.v1.ConditionParamTypeRef.type_name:type_name -> openfga.v1.ConditionParamTypeRef.TypeName + 16, // 23: openfga.v1.ConditionParamTypeRef.generic_types:type_name -> openfga.v1.ConditionParamTypeRef + 15, // 24: openfga.v1.AuthorizationModel.ConditionsEntry.value:type_name -> openfga.v1.Condition + 11, // 25: openfga.v1.TypeDefinition.RelationsEntry.value:type_name -> openfga.v1.Userset + 6, // 26: openfga.v1.Metadata.RelationsEntry.value:type_name -> openfga.v1.RelationMetadata + 16, // 27: openfga.v1.Condition.ParametersEntry.value:type_name -> openfga.v1.ConditionParamTypeRef + 28, // [28:28] is the sub-list for method output_type + 28, // [28:28] is the sub-list for method input_type + 28, // [28:28] is the sub-list for extension type_name + 28, // [28:28] is the sub-list for extension extendee + 0, // [0:28] is the sub-list for field type_name } func init() { file_openfga_v1_authzmodel_proto_init() } @@ -1298,6 +1586,30 @@ func file_openfga_v1_authzmodel_proto_init() { return nil } } + file_openfga_v1_authzmodel_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Condition); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openfga_v1_authzmodel_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ConditionParamTypeRef); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } file_openfga_v1_authzmodel_proto_msgTypes[6].OneofWrappers = []interface{}{ (*RelationReference_Relation)(nil), @@ -1316,13 +1628,14 @@ func file_openfga_v1_authzmodel_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_openfga_v1_authzmodel_proto_rawDesc, - NumEnums: 0, - NumMessages: 16, + NumEnums: 1, + NumMessages: 20, NumExtensions: 0, NumServices: 0, }, GoTypes: file_openfga_v1_authzmodel_proto_goTypes, DependencyIndexes: file_openfga_v1_authzmodel_proto_depIdxs, + EnumInfos: file_openfga_v1_authzmodel_proto_enumTypes, MessageInfos: file_openfga_v1_authzmodel_proto_msgTypes, }.Build() File_openfga_v1_authzmodel_proto = out.File diff --git a/proto/openfga/v1/authzmodel.pb.validate.go b/proto/openfga/v1/authzmodel.pb.validate.go index 98bd2d06..be1f01ac 100644 --- a/proto/openfga/v1/authzmodel.pb.validate.go +++ b/proto/openfga/v1/authzmodel.pb.validate.go @@ -104,6 +104,72 @@ func (m *AuthorizationModel) validate(all bool) error { } + if len(m.GetConditions()) > 25 { + err := AuthorizationModelValidationError{ + field: "Conditions", + reason: "value must contain no more than 25 pair(s)", + } + if !all { + return err + } + errors = append(errors, err) + } + + { + sorted_keys := make([]string, len(m.GetConditions())) + i := 0 + for key := range m.GetConditions() { + sorted_keys[i] = key + i++ + } + sort.Slice(sorted_keys, func(i, j int) bool { return sorted_keys[i] < sorted_keys[j] }) + for _, key := range sorted_keys { + val := m.GetConditions()[key] + _ = val + + if !_AuthorizationModel_Conditions_Pattern.MatchString(key) { + err := AuthorizationModelValidationError{ + field: fmt.Sprintf("Conditions[%v]", key), + reason: "value does not match regex pattern \"^[^:#@\\\\s]{1,50}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(val).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AuthorizationModelValidationError{ + field: fmt.Sprintf("Conditions[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AuthorizationModelValidationError{ + field: fmt.Sprintf("Conditions[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(val).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AuthorizationModelValidationError{ + field: fmt.Sprintf("Conditions[%v]", key), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + } + if len(errors) > 0 { return AuthorizationModelMultiError(errors) } @@ -186,6 +252,8 @@ var _ interface { var _AuthorizationModel_Id_Pattern = regexp.MustCompile("^[ABCDEFGHJKMNPQRSTVWXYZ0-9]{26}$") +var _AuthorizationModel_Conditions_Pattern = regexp.MustCompile("^[^:#@\\s]{1,50}$") + // Validate checks the field values on TypeDefinition with the rules defined in // the proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. @@ -1012,6 +1080,8 @@ func (m *RelationReference) validate(all bool) error { errors = append(errors, err) } + // no validation rules for Condition + switch v := m.RelationOrWildcard.(type) { case *RelationReference_Relation: if v == nil { @@ -2308,3 +2378,352 @@ var _ interface { Cause() error ErrorName() string } = TupleToUsersetValidationError{} + +// Validate checks the field values on Condition with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Condition) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Condition with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in ConditionMultiError, or nil +// if none found. +func (m *Condition) ValidateAll() error { + return m.validate(true) +} + +func (m *Condition) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if !_Condition_Name_Pattern.MatchString(m.GetName()) { + err := ConditionValidationError{ + field: "Name", + reason: "value does not match regex pattern \"^[^:#@\\\\s]{1,50}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(m.GetExpression()) > 512 { + err := ConditionValidationError{ + field: "Expression", + reason: "value length must be at most 512 bytes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(m.GetParameters()) > 25 { + err := ConditionValidationError{ + field: "Parameters", + reason: "value must contain no more than 25 pair(s)", + } + if !all { + return err + } + errors = append(errors, err) + } + + { + sorted_keys := make([]string, len(m.GetParameters())) + i := 0 + for key := range m.GetParameters() { + sorted_keys[i] = key + i++ + } + sort.Slice(sorted_keys, func(i, j int) bool { return sorted_keys[i] < sorted_keys[j] }) + for _, key := range sorted_keys { + val := m.GetParameters()[key] + _ = val + + if !_Condition_Parameters_Pattern.MatchString(key) { + err := ConditionValidationError{ + field: fmt.Sprintf("Parameters[%v]", key), + reason: "value does not match regex pattern \"^[^:#@\\\\s]{1,50}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(val).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ConditionValidationError{ + field: fmt.Sprintf("Parameters[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ConditionValidationError{ + field: fmt.Sprintf("Parameters[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(val).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ConditionValidationError{ + field: fmt.Sprintf("Parameters[%v]", key), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + } + + if len(errors) > 0 { + return ConditionMultiError(errors) + } + + return nil +} + +// ConditionMultiError is an error wrapping multiple validation errors returned +// by Condition.ValidateAll() if the designated constraints aren't met. +type ConditionMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ConditionMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ConditionMultiError) AllErrors() []error { return m } + +// ConditionValidationError is the validation error returned by +// Condition.Validate if the designated constraints aren't met. +type ConditionValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ConditionValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ConditionValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ConditionValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ConditionValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ConditionValidationError) ErrorName() string { return "ConditionValidationError" } + +// Error satisfies the builtin error interface +func (e ConditionValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sCondition.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ConditionValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ConditionValidationError{} + +var _Condition_Name_Pattern = regexp.MustCompile("^[^:#@\\s]{1,50}$") + +var _Condition_Parameters_Pattern = regexp.MustCompile("^[^:#@\\s]{1,50}$") + +// Validate checks the field values on ConditionParamTypeRef with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *ConditionParamTypeRef) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ConditionParamTypeRef with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ConditionParamTypeRefMultiError, or nil if none found. +func (m *ConditionParamTypeRef) ValidateAll() error { + return m.validate(true) +} + +func (m *ConditionParamTypeRef) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if _, ok := ConditionParamTypeRef_TypeName_name[int32(m.GetTypeName())]; !ok { + err := ConditionParamTypeRefValidationError{ + field: "TypeName", + reason: "value must be one of the defined enum values", + } + if !all { + return err + } + errors = append(errors, err) + } + + if len(m.GetGenericTypes()) > 5 { + err := ConditionParamTypeRefValidationError{ + field: "GenericTypes", + reason: "value must contain no more than 5 item(s)", + } + if !all { + return err + } + errors = append(errors, err) + } + + for idx, item := range m.GetGenericTypes() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ConditionParamTypeRefValidationError{ + field: fmt.Sprintf("GenericTypes[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ConditionParamTypeRefValidationError{ + field: fmt.Sprintf("GenericTypes[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ConditionParamTypeRefValidationError{ + field: fmt.Sprintf("GenericTypes[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return ConditionParamTypeRefMultiError(errors) + } + + return nil +} + +// ConditionParamTypeRefMultiError is an error wrapping multiple validation +// errors returned by ConditionParamTypeRef.ValidateAll() if the designated +// constraints aren't met. +type ConditionParamTypeRefMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ConditionParamTypeRefMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ConditionParamTypeRefMultiError) AllErrors() []error { return m } + +// ConditionParamTypeRefValidationError is the validation error returned by +// ConditionParamTypeRef.Validate if the designated constraints aren't met. +type ConditionParamTypeRefValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ConditionParamTypeRefValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ConditionParamTypeRefValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ConditionParamTypeRefValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ConditionParamTypeRefValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ConditionParamTypeRefValidationError) ErrorName() string { + return "ConditionParamTypeRefValidationError" +} + +// Error satisfies the builtin error interface +func (e ConditionParamTypeRefValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sConditionParamTypeRef.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ConditionParamTypeRefValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ConditionParamTypeRefValidationError{} diff --git a/proto/openfga/v1/openfga.pb.go b/proto/openfga/v1/openfga.pb.go index 3baf2a3e..ac135a6a 100644 --- a/proto/openfga/v1/openfga.pb.go +++ b/proto/openfga/v1/openfga.pb.go @@ -12,6 +12,7 @@ import ( _ "google.golang.org/genproto/googleapis/api/annotations" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" @@ -131,20 +132,80 @@ func (x *Object) GetId() string { return "" } +type RelationshipCondition struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // A reference (by name) of the relationship condition defined in the authorization model. + ConditionName string `protobuf:"bytes,1,opt,name=condition_name,json=conditionName,proto3" json:"condition_name,omitempty"` + // Additional context/data to persist along with the condition. + // The keys must match the parameters defined by the condition, and the value types must + // match the parameter type definitions. + Context *structpb.Struct `protobuf:"bytes,2,opt,name=context,proto3" json:"context,omitempty"` +} + +func (x *RelationshipCondition) Reset() { + *x = RelationshipCondition{} + if protoimpl.UnsafeEnabled { + mi := &file_openfga_v1_openfga_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *RelationshipCondition) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*RelationshipCondition) ProtoMessage() {} + +func (x *RelationshipCondition) ProtoReflect() protoreflect.Message { + mi := &file_openfga_v1_openfga_proto_msgTypes[1] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use RelationshipCondition.ProtoReflect.Descriptor instead. +func (*RelationshipCondition) Descriptor() ([]byte, []int) { + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{1} +} + +func (x *RelationshipCondition) GetConditionName() string { + if x != nil { + return x.ConditionName + } + return "" +} + +func (x *RelationshipCondition) GetContext() *structpb.Struct { + if x != nil { + return x.Context + } + return nil +} + type TupleKey struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Object string `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` - Relation string `protobuf:"bytes,2,opt,name=relation,proto3" json:"relation,omitempty"` - User string `protobuf:"bytes,3,opt,name=user,proto3" json:"user,omitempty"` + Object string `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + Relation string `protobuf:"bytes,2,opt,name=relation,proto3" json:"relation,omitempty"` + User string `protobuf:"bytes,3,opt,name=user,proto3" json:"user,omitempty"` + Condition *RelationshipCondition `protobuf:"bytes,4,opt,name=condition,proto3" json:"condition,omitempty"` } func (x *TupleKey) Reset() { *x = TupleKey{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[1] + mi := &file_openfga_v1_openfga_proto_msgTypes[2] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -157,7 +218,7 @@ func (x *TupleKey) String() string { func (*TupleKey) ProtoMessage() {} func (x *TupleKey) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[1] + mi := &file_openfga_v1_openfga_proto_msgTypes[2] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -170,7 +231,7 @@ func (x *TupleKey) ProtoReflect() protoreflect.Message { // Deprecated: Use TupleKey.ProtoReflect.Descriptor instead. func (*TupleKey) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{1} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{2} } func (x *TupleKey) GetObject() string { @@ -194,6 +255,13 @@ func (x *TupleKey) GetUser() string { return "" } +func (x *TupleKey) GetCondition() *RelationshipCondition { + if x != nil { + return x.Condition + } + return nil +} + type Tuple struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -206,7 +274,7 @@ type Tuple struct { func (x *Tuple) Reset() { *x = Tuple{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[2] + mi := &file_openfga_v1_openfga_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -219,7 +287,7 @@ func (x *Tuple) String() string { func (*Tuple) ProtoMessage() {} func (x *Tuple) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[2] + mi := &file_openfga_v1_openfga_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -232,7 +300,7 @@ func (x *Tuple) ProtoReflect() protoreflect.Message { // Deprecated: Use Tuple.ProtoReflect.Descriptor instead. func (*Tuple) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{2} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{3} } func (x *Tuple) GetKey() *TupleKey { @@ -260,7 +328,7 @@ type TupleKeys struct { func (x *TupleKeys) Reset() { *x = TupleKeys{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[3] + mi := &file_openfga_v1_openfga_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -273,7 +341,7 @@ func (x *TupleKeys) String() string { func (*TupleKeys) ProtoMessage() {} func (x *TupleKeys) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[3] + mi := &file_openfga_v1_openfga_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -286,7 +354,7 @@ func (x *TupleKeys) ProtoReflect() protoreflect.Message { // Deprecated: Use TupleKeys.ProtoReflect.Descriptor instead. func (*TupleKeys) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{3} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{4} } func (x *TupleKeys) GetTupleKeys() []*TupleKey { @@ -307,7 +375,7 @@ type ContextualTupleKeys struct { func (x *ContextualTupleKeys) Reset() { *x = ContextualTupleKeys{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[4] + mi := &file_openfga_v1_openfga_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -320,7 +388,7 @@ func (x *ContextualTupleKeys) String() string { func (*ContextualTupleKeys) ProtoMessage() {} func (x *ContextualTupleKeys) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[4] + mi := &file_openfga_v1_openfga_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -333,7 +401,7 @@ func (x *ContextualTupleKeys) ProtoReflect() protoreflect.Message { // Deprecated: Use ContextualTupleKeys.ProtoReflect.Descriptor instead. func (*ContextualTupleKeys) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{4} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{5} } func (x *ContextualTupleKeys) GetTupleKeys() []*TupleKey { @@ -355,7 +423,7 @@ type UsersetTree struct { func (x *UsersetTree) Reset() { *x = UsersetTree{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[5] + mi := &file_openfga_v1_openfga_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -368,7 +436,7 @@ func (x *UsersetTree) String() string { func (*UsersetTree) ProtoMessage() {} func (x *UsersetTree) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[5] + mi := &file_openfga_v1_openfga_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -381,7 +449,7 @@ func (x *UsersetTree) ProtoReflect() protoreflect.Message { // Deprecated: Use UsersetTree.ProtoReflect.Descriptor instead. func (*UsersetTree) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{5} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{6} } func (x *UsersetTree) GetRoot() *UsersetTree_Node { @@ -391,108 +459,6 @@ func (x *UsersetTree) GetRoot() *UsersetTree_Node { return nil } -type Assertion struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - TupleKey *TupleKey `protobuf:"bytes,1,opt,name=tuple_key,proto3" json:"tuple_key,omitempty"` - Expectation bool `protobuf:"varint,2,opt,name=expectation,proto3" json:"expectation,omitempty"` -} - -func (x *Assertion) Reset() { - *x = Assertion{} - if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[6] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Assertion) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Assertion) ProtoMessage() {} - -func (x *Assertion) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[6] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Assertion.ProtoReflect.Descriptor instead. -func (*Assertion) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{6} -} - -func (x *Assertion) GetTupleKey() *TupleKey { - if x != nil { - return x.TupleKey - } - return nil -} - -func (x *Assertion) GetExpectation() bool { - if x != nil { - return x.Expectation - } - return false -} - -type Assertions struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Assertions []*Assertion `protobuf:"bytes,1,rep,name=assertions,proto3" json:"assertions,omitempty"` -} - -func (x *Assertions) Reset() { - *x = Assertions{} - if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *Assertions) String() string { - return protoimpl.X.MessageStringOf(x) -} - -func (*Assertions) ProtoMessage() {} - -func (x *Assertions) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[7] - if protoimpl.UnsafeEnabled && x != nil { - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - if ms.LoadMessageInfo() == nil { - ms.StoreMessageInfo(mi) - } - return ms - } - return mi.MessageOf(x) -} - -// Deprecated: Use Assertions.ProtoReflect.Descriptor instead. -func (*Assertions) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{7} -} - -func (x *Assertions) GetAssertions() []*Assertion { - if x != nil { - return x.Assertions - } - return nil -} - type TupleChange struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -506,7 +472,7 @@ type TupleChange struct { func (x *TupleChange) Reset() { *x = TupleChange{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[8] + mi := &file_openfga_v1_openfga_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -519,7 +485,7 @@ func (x *TupleChange) String() string { func (*TupleChange) ProtoMessage() {} func (x *TupleChange) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[8] + mi := &file_openfga_v1_openfga_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -532,7 +498,7 @@ func (x *TupleChange) ProtoReflect() protoreflect.Message { // Deprecated: Use TupleChange.ProtoReflect.Descriptor instead. func (*TupleChange) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{8} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{7} } func (x *TupleChange) GetTupleKey() *TupleKey { @@ -571,7 +537,7 @@ type Store struct { func (x *Store) Reset() { *x = Store{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[9] + mi := &file_openfga_v1_openfga_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -584,7 +550,7 @@ func (x *Store) String() string { func (*Store) ProtoMessage() {} func (x *Store) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[9] + mi := &file_openfga_v1_openfga_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -597,7 +563,7 @@ func (x *Store) ProtoReflect() protoreflect.Message { // Deprecated: Use Store.ProtoReflect.Descriptor instead. func (*Store) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{9} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{8} } func (x *Store) GetId() string { @@ -658,7 +624,7 @@ type UsersetTree_Leaf struct { func (x *UsersetTree_Leaf) Reset() { *x = UsersetTree_Leaf{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[10] + mi := &file_openfga_v1_openfga_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -671,7 +637,7 @@ func (x *UsersetTree_Leaf) String() string { func (*UsersetTree_Leaf) ProtoMessage() {} func (x *UsersetTree_Leaf) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[10] + mi := &file_openfga_v1_openfga_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -684,7 +650,7 @@ func (x *UsersetTree_Leaf) ProtoReflect() protoreflect.Message { // Deprecated: Use UsersetTree_Leaf.ProtoReflect.Descriptor instead. func (*UsersetTree_Leaf) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{5, 0} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{6, 0} } func (m *UsersetTree_Leaf) GetValue() isUsersetTree_Leaf_Value { @@ -748,7 +714,7 @@ type UsersetTree_Nodes struct { func (x *UsersetTree_Nodes) Reset() { *x = UsersetTree_Nodes{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[11] + mi := &file_openfga_v1_openfga_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -761,7 +727,7 @@ func (x *UsersetTree_Nodes) String() string { func (*UsersetTree_Nodes) ProtoMessage() {} func (x *UsersetTree_Nodes) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[11] + mi := &file_openfga_v1_openfga_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -774,7 +740,7 @@ func (x *UsersetTree_Nodes) ProtoReflect() protoreflect.Message { // Deprecated: Use UsersetTree_Nodes.ProtoReflect.Descriptor instead. func (*UsersetTree_Nodes) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{5, 1} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{6, 1} } func (x *UsersetTree_Nodes) GetNodes() []*UsersetTree_Node { @@ -795,7 +761,7 @@ type UsersetTree_Users struct { func (x *UsersetTree_Users) Reset() { *x = UsersetTree_Users{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[12] + mi := &file_openfga_v1_openfga_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -808,7 +774,7 @@ func (x *UsersetTree_Users) String() string { func (*UsersetTree_Users) ProtoMessage() {} func (x *UsersetTree_Users) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[12] + mi := &file_openfga_v1_openfga_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -821,7 +787,7 @@ func (x *UsersetTree_Users) ProtoReflect() protoreflect.Message { // Deprecated: Use UsersetTree_Users.ProtoReflect.Descriptor instead. func (*UsersetTree_Users) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{5, 2} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{6, 2} } func (x *UsersetTree_Users) GetUsers() []string { @@ -842,7 +808,7 @@ type UsersetTree_Computed struct { func (x *UsersetTree_Computed) Reset() { *x = UsersetTree_Computed{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[13] + mi := &file_openfga_v1_openfga_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -855,7 +821,7 @@ func (x *UsersetTree_Computed) String() string { func (*UsersetTree_Computed) ProtoMessage() {} func (x *UsersetTree_Computed) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[13] + mi := &file_openfga_v1_openfga_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -868,7 +834,7 @@ func (x *UsersetTree_Computed) ProtoReflect() protoreflect.Message { // Deprecated: Use UsersetTree_Computed.ProtoReflect.Descriptor instead. func (*UsersetTree_Computed) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{5, 3} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{6, 3} } func (x *UsersetTree_Computed) GetUserset() string { @@ -890,7 +856,7 @@ type UsersetTree_TupleToUserset struct { func (x *UsersetTree_TupleToUserset) Reset() { *x = UsersetTree_TupleToUserset{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[14] + mi := &file_openfga_v1_openfga_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -903,7 +869,7 @@ func (x *UsersetTree_TupleToUserset) String() string { func (*UsersetTree_TupleToUserset) ProtoMessage() {} func (x *UsersetTree_TupleToUserset) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[14] + mi := &file_openfga_v1_openfga_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -916,7 +882,7 @@ func (x *UsersetTree_TupleToUserset) ProtoReflect() protoreflect.Message { // Deprecated: Use UsersetTree_TupleToUserset.ProtoReflect.Descriptor instead. func (*UsersetTree_TupleToUserset) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{5, 4} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{6, 4} } func (x *UsersetTree_TupleToUserset) GetTupleset() string { @@ -945,7 +911,7 @@ type UsersetTree_Difference struct { func (x *UsersetTree_Difference) Reset() { *x = UsersetTree_Difference{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[15] + mi := &file_openfga_v1_openfga_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -958,7 +924,7 @@ func (x *UsersetTree_Difference) String() string { func (*UsersetTree_Difference) ProtoMessage() {} func (x *UsersetTree_Difference) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[15] + mi := &file_openfga_v1_openfga_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -971,7 +937,7 @@ func (x *UsersetTree_Difference) ProtoReflect() protoreflect.Message { // Deprecated: Use UsersetTree_Difference.ProtoReflect.Descriptor instead. func (*UsersetTree_Difference) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{5, 5} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{6, 5} } func (x *UsersetTree_Difference) GetBase() *UsersetTree_Node { @@ -1006,7 +972,7 @@ type UsersetTree_Node struct { func (x *UsersetTree_Node) Reset() { *x = UsersetTree_Node{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_proto_msgTypes[16] + mi := &file_openfga_v1_openfga_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1019,7 +985,7 @@ func (x *UsersetTree_Node) String() string { func (*UsersetTree_Node) ProtoMessage() {} func (x *UsersetTree_Node) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_proto_msgTypes[16] + mi := &file_openfga_v1_openfga_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1032,7 +998,7 @@ func (x *UsersetTree_Node) ProtoReflect() protoreflect.Message { // Deprecated: Use UsersetTree_Node.ProtoReflect.Descriptor instead. func (*UsersetTree_Node) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{5, 6} + return file_openfga_v1_openfga_proto_rawDescGZIP(), []int{6, 6} } func (x *UsersetTree_Node) GetName() string { @@ -1112,21 +1078,33 @@ var file_openfga_v1_openfga_proto_rawDesc = []byte{ 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0a, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, - 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, - 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, - 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, - 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x22, 0x6d, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0x92, 0x41, 0x0c, 0x4a, 0x0a, - 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x15, - 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, - 0x32, 0x35, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x13, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x0d, 0x72, - 0x0b, 0x32, 0x09, 0x5b, 0x5e, 0x23, 0x3a, 0x5c, 0x73, 0x5d, 0x2b, 0x24, 0x52, 0x02, 0x69, 0x64, - 0x22, 0xd2, 0x01, 0x0a, 0x08, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x4e, 0x0a, + 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, 0x63, 0x74, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, + 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, + 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, + 0x6d, 0x0a, 0x06, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0x92, 0x41, 0x0c, 0x4a, 0x0a, 0x22, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x15, 0x72, 0x13, + 0x32, 0x11, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x35, + 0x34, 0x7d, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x23, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x13, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x0d, 0x72, 0x0b, 0x32, + 0x09, 0x5b, 0x5e, 0x23, 0x3a, 0x5c, 0x73, 0x5d, 0x2b, 0x24, 0x52, 0x02, 0x69, 0x64, 0x22, 0x9f, + 0x01, 0x0a, 0x15, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x43, + 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x53, 0x0a, 0x0e, 0x63, 0x6f, 0x6e, 0x64, + 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x2c, 0x92, 0x41, 0x11, 0x4a, 0x0c, 0x22, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x31, 0x22, 0x78, 0x80, 0x02, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x12, 0x72, 0x10, 0x32, 0x0e, + 0x5e, 0x5b, 0x5e, 0x5c, 0x73, 0x5d, 0x7b, 0x32, 0x2c, 0x32, 0x35, 0x36, 0x7d, 0x24, 0x52, 0x0d, + 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x31, 0x0a, + 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, + 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, + 0x2e, 0x53, 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, + 0x22, 0x93, 0x02, 0x0a, 0x08, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x4e, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x36, 0x92, 0x41, 0x1b, 0x4a, 0x16, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x78, 0x80, 0x02, 0xfa, 0x42, 0x15, @@ -1139,137 +1117,129 @@ var file_openfga_v1_openfga_proto_rawDesc = []byte{ 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2f, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1b, 0x92, 0x41, 0x10, 0x4a, 0x0b, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x78, 0x80, 0x04, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x04, 0x52, - 0x04, 0x75, 0x73, 0x65, 0x72, 0x22, 0x69, 0x0a, 0x05, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x12, 0x26, - 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, - 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, - 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x22, 0x5a, 0x0a, 0x09, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x4d, 0x0a, - 0x0a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, - 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x17, 0x92, 0x41, 0x09, 0x69, 0x00, 0x00, 0x00, - 0x00, 0x00, 0x00, 0xf0, 0x3f, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, - 0x52, 0x0a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x64, 0x0a, 0x13, - 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, - 0x65, 0x79, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, - 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x17, 0x92, - 0x41, 0x09, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0xe0, 0x41, 0x02, 0xfa, 0x42, - 0x05, 0x92, 0x01, 0x02, 0x10, 0x0a, 0x52, 0x0a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x73, 0x22, 0xa0, 0x07, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, - 0x65, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, - 0x72, 0x6f, 0x6f, 0x74, 0x1a, 0xda, 0x01, 0x0a, 0x04, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x35, 0x0a, - 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, - 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x05, 0x75, - 0x73, 0x65, 0x72, 0x73, 0x12, 0x3e, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, - 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, - 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, - 0x75, 0x74, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x10, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x74, 0x6f, - 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x55, - 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x54, - 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x1a, 0x3b, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, - 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, - 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x1a, 0x1d, - 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x1a, 0x24, 0x0a, - 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, 0x65, - 0x72, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x65, 0x74, 0x1a, 0x6a, 0x0a, 0x0e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x55, 0x73, - 0x65, 0x72, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x65, - 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x43, 0x6f, 0x6d, - 0x70, 0x75, 0x74, 0x65, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x1a, - 0x78, 0x0a, 0x0a, 0x44, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x30, 0x0a, - 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, - 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, - 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, 0x12, - 0x38, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, + 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, + 0x69, 0x70, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x05, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x12, + 0x26, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, + 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x22, 0x5a, 0x0a, 0x09, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x4d, + 0x0a, 0x0a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x17, 0x92, 0x41, 0x09, 0x69, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, + 0x01, 0x52, 0x0a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x64, 0x0a, + 0x13, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x75, 0x70, 0x6c, 0x65, + 0x4b, 0x65, 0x79, 0x73, 0x12, 0x4d, 0x0a, 0x0a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, + 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x17, + 0x92, 0x41, 0x09, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x24, 0x40, 0xe0, 0x41, 0x02, 0xfa, + 0x42, 0x05, 0x92, 0x01, 0x02, 0x10, 0x0a, 0x52, 0x0a, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x22, 0xa0, 0x07, 0x0a, 0x0b, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, + 0x72, 0x65, 0x65, 0x12, 0x30, 0x0a, 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, - 0x08, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x1a, 0x99, 0x02, 0x0a, 0x04, 0x4e, 0x6f, - 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4c, 0x65, - 0x61, 0x66, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x44, 0x0a, 0x0a, 0x64, 0x69, - 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, - 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, - 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x12, 0x35, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, - 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x48, 0x00, - 0x52, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, - 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, + 0x04, 0x72, 0x6f, 0x6f, 0x74, 0x1a, 0xda, 0x01, 0x0a, 0x04, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x35, + 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x48, 0x00, 0x52, 0x0c, - 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, 0x05, - 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0x73, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, - 0x6f, 0x6e, 0x12, 0x3f, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x0b, 0xe0, 0x41, 0x02, - 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x12, 0x25, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x41, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0xbf, 0x01, 0x0a, 0x0b, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, - 0x32, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x12, 0x42, 0x0a, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, - 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x48, 0x00, 0x52, 0x05, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x12, 0x3e, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, + 0x2e, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x48, 0x00, 0x52, 0x08, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x64, 0x12, 0x52, 0x0a, 0x10, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x74, + 0x6f, 0x5f, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x54, 0x6f, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x48, 0x00, 0x52, 0x0e, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x54, 0x6f, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x42, 0x07, 0x0a, 0x05, 0x76, 0x61, 0x6c, + 0x75, 0x65, 0x1a, 0x3b, 0x0a, 0x05, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x32, 0x0a, 0x05, 0x6e, + 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, + 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x1a, + 0x1d, 0x0a, 0x05, 0x55, 0x73, 0x65, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x05, 0x75, 0x73, 0x65, 0x72, 0x73, 0x1a, 0x24, + 0x0a, 0x08, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x65, 0x74, 0x1a, 0x6a, 0x0a, 0x0e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x54, 0x6f, 0x55, + 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, + 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, + 0x65, 0x74, 0x12, 0x3c, 0x0a, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x18, 0x02, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x43, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x52, 0x08, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, + 0x1a, 0x78, 0x0a, 0x0a, 0x44, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x30, + 0x0a, 0x04, 0x62, 0x61, 0x73, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, + 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x04, 0x62, 0x61, 0x73, 0x65, + 0x12, 0x38, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, + 0x52, 0x08, 0x73, 0x75, 0x62, 0x74, 0x72, 0x61, 0x63, 0x74, 0x1a, 0x99, 0x02, 0x0a, 0x04, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x32, 0x0a, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4c, + 0x65, 0x61, 0x66, 0x48, 0x00, 0x52, 0x04, 0x6c, 0x65, 0x61, 0x66, 0x12, 0x44, 0x0a, 0x0a, 0x64, + 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, + 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x44, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x48, 0x00, 0x52, 0x0a, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x12, 0x35, 0x0a, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x48, + 0x00, 0x52, 0x05, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x12, 0x43, 0x0a, 0x0c, 0x69, 0x6e, 0x74, 0x65, + 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, + 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, 0x2e, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x48, 0x00, 0x52, + 0x0c, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x07, 0x0a, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x22, 0xbf, 0x01, 0x0a, 0x0b, 0x54, 0x75, 0x70, 0x6c, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x32, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x52, + 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x12, 0x42, 0x0a, 0x09, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, + 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x08, 0xfa, 0x42, 0x05, 0x82, 0x01, + 0x02, 0x10, 0x01, 0x52, 0x09, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x38, + 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0xdf, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, - 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x22, 0xdf, 0x01, 0x0a, 0x05, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, - 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, - 0x3a, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, - 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, - 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, - 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, - 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, - 0x5f, 0x61, 0x74, 0x2a, 0x47, 0x0a, 0x0e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4f, 0x70, 0x65, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, 0x54, 0x55, 0x50, 0x4c, 0x45, 0x5f, 0x4f, - 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, - 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x55, 0x50, 0x4c, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x01, 0x42, 0x9a, 0x01, 0x0a, - 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x42, - 0x0c, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, - 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, - 0x66, 0x67, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x70, - 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, - 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x66, - 0x67, 0x61, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x5c, - 0x56, 0x31, 0xe2, 0x02, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x5c, 0x56, 0x31, 0x5c, - 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x4f, 0x70, - 0x65, 0x6e, 0x66, 0x67, 0x61, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, + 0x61, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x12, 0x3a, + 0x0a, 0x0a, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, + 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x2a, 0x47, 0x0a, 0x0e, 0x54, 0x75, + 0x70, 0x6c, 0x65, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x19, 0x0a, 0x15, + 0x54, 0x55, 0x50, 0x4c, 0x45, 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, + 0x57, 0x52, 0x49, 0x54, 0x45, 0x10, 0x00, 0x12, 0x1a, 0x0a, 0x16, 0x54, 0x55, 0x50, 0x4c, 0x45, + 0x5f, 0x4f, 0x50, 0x45, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, + 0x45, 0x10, 0x01, 0x42, 0x9a, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x42, 0x0c, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x50, + 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2f, 0x76, 0x31, 0x3b, + 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x58, 0x58, 0xaa, + 0x02, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0a, 0x4f, + 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x16, 0x4f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x3a, 0x3a, 0x56, 0x31, + 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1285,53 +1255,53 @@ func file_openfga_v1_openfga_proto_rawDescGZIP() []byte { } var file_openfga_v1_openfga_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_openfga_v1_openfga_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_openfga_v1_openfga_proto_msgTypes = make([]protoimpl.MessageInfo, 16) var file_openfga_v1_openfga_proto_goTypes = []interface{}{ (TupleOperation)(0), // 0: openfga.v1.TupleOperation (*Object)(nil), // 1: openfga.v1.Object - (*TupleKey)(nil), // 2: openfga.v1.TupleKey - (*Tuple)(nil), // 3: openfga.v1.Tuple - (*TupleKeys)(nil), // 4: openfga.v1.TupleKeys - (*ContextualTupleKeys)(nil), // 5: openfga.v1.ContextualTupleKeys - (*UsersetTree)(nil), // 6: openfga.v1.UsersetTree - (*Assertion)(nil), // 7: openfga.v1.Assertion - (*Assertions)(nil), // 8: openfga.v1.Assertions - (*TupleChange)(nil), // 9: openfga.v1.TupleChange - (*Store)(nil), // 10: openfga.v1.Store - (*UsersetTree_Leaf)(nil), // 11: openfga.v1.UsersetTree.Leaf - (*UsersetTree_Nodes)(nil), // 12: openfga.v1.UsersetTree.Nodes - (*UsersetTree_Users)(nil), // 13: openfga.v1.UsersetTree.Users - (*UsersetTree_Computed)(nil), // 14: openfga.v1.UsersetTree.Computed - (*UsersetTree_TupleToUserset)(nil), // 15: openfga.v1.UsersetTree.TupleToUserset - (*UsersetTree_Difference)(nil), // 16: openfga.v1.UsersetTree.Difference - (*UsersetTree_Node)(nil), // 17: openfga.v1.UsersetTree.Node + (*RelationshipCondition)(nil), // 2: openfga.v1.RelationshipCondition + (*TupleKey)(nil), // 3: openfga.v1.TupleKey + (*Tuple)(nil), // 4: openfga.v1.Tuple + (*TupleKeys)(nil), // 5: openfga.v1.TupleKeys + (*ContextualTupleKeys)(nil), // 6: openfga.v1.ContextualTupleKeys + (*UsersetTree)(nil), // 7: openfga.v1.UsersetTree + (*TupleChange)(nil), // 8: openfga.v1.TupleChange + (*Store)(nil), // 9: openfga.v1.Store + (*UsersetTree_Leaf)(nil), // 10: openfga.v1.UsersetTree.Leaf + (*UsersetTree_Nodes)(nil), // 11: openfga.v1.UsersetTree.Nodes + (*UsersetTree_Users)(nil), // 12: openfga.v1.UsersetTree.Users + (*UsersetTree_Computed)(nil), // 13: openfga.v1.UsersetTree.Computed + (*UsersetTree_TupleToUserset)(nil), // 14: openfga.v1.UsersetTree.TupleToUserset + (*UsersetTree_Difference)(nil), // 15: openfga.v1.UsersetTree.Difference + (*UsersetTree_Node)(nil), // 16: openfga.v1.UsersetTree.Node + (*structpb.Struct)(nil), // 17: google.protobuf.Struct (*timestamppb.Timestamp)(nil), // 18: google.protobuf.Timestamp } var file_openfga_v1_openfga_proto_depIdxs = []int32{ - 2, // 0: openfga.v1.Tuple.key:type_name -> openfga.v1.TupleKey - 18, // 1: openfga.v1.Tuple.timestamp:type_name -> google.protobuf.Timestamp - 2, // 2: openfga.v1.TupleKeys.tuple_keys:type_name -> openfga.v1.TupleKey - 2, // 3: openfga.v1.ContextualTupleKeys.tuple_keys:type_name -> openfga.v1.TupleKey - 17, // 4: openfga.v1.UsersetTree.root:type_name -> openfga.v1.UsersetTree.Node - 2, // 5: openfga.v1.Assertion.tuple_key:type_name -> openfga.v1.TupleKey - 7, // 6: openfga.v1.Assertions.assertions:type_name -> openfga.v1.Assertion - 2, // 7: openfga.v1.TupleChange.tuple_key:type_name -> openfga.v1.TupleKey + 17, // 0: openfga.v1.RelationshipCondition.context:type_name -> google.protobuf.Struct + 2, // 1: openfga.v1.TupleKey.condition:type_name -> openfga.v1.RelationshipCondition + 3, // 2: openfga.v1.Tuple.key:type_name -> openfga.v1.TupleKey + 18, // 3: openfga.v1.Tuple.timestamp:type_name -> google.protobuf.Timestamp + 3, // 4: openfga.v1.TupleKeys.tuple_keys:type_name -> openfga.v1.TupleKey + 3, // 5: openfga.v1.ContextualTupleKeys.tuple_keys:type_name -> openfga.v1.TupleKey + 16, // 6: openfga.v1.UsersetTree.root:type_name -> openfga.v1.UsersetTree.Node + 3, // 7: openfga.v1.TupleChange.tuple_key:type_name -> openfga.v1.TupleKey 0, // 8: openfga.v1.TupleChange.operation:type_name -> openfga.v1.TupleOperation 18, // 9: openfga.v1.TupleChange.timestamp:type_name -> google.protobuf.Timestamp 18, // 10: openfga.v1.Store.created_at:type_name -> google.protobuf.Timestamp 18, // 11: openfga.v1.Store.updated_at:type_name -> google.protobuf.Timestamp 18, // 12: openfga.v1.Store.deleted_at:type_name -> google.protobuf.Timestamp - 13, // 13: openfga.v1.UsersetTree.Leaf.users:type_name -> openfga.v1.UsersetTree.Users - 14, // 14: openfga.v1.UsersetTree.Leaf.computed:type_name -> openfga.v1.UsersetTree.Computed - 15, // 15: openfga.v1.UsersetTree.Leaf.tuple_to_userset:type_name -> openfga.v1.UsersetTree.TupleToUserset - 17, // 16: openfga.v1.UsersetTree.Nodes.nodes:type_name -> openfga.v1.UsersetTree.Node - 14, // 17: openfga.v1.UsersetTree.TupleToUserset.computed:type_name -> openfga.v1.UsersetTree.Computed - 17, // 18: openfga.v1.UsersetTree.Difference.base:type_name -> openfga.v1.UsersetTree.Node - 17, // 19: openfga.v1.UsersetTree.Difference.subtract:type_name -> openfga.v1.UsersetTree.Node - 11, // 20: openfga.v1.UsersetTree.Node.leaf:type_name -> openfga.v1.UsersetTree.Leaf - 16, // 21: openfga.v1.UsersetTree.Node.difference:type_name -> openfga.v1.UsersetTree.Difference - 12, // 22: openfga.v1.UsersetTree.Node.union:type_name -> openfga.v1.UsersetTree.Nodes - 12, // 23: openfga.v1.UsersetTree.Node.intersection:type_name -> openfga.v1.UsersetTree.Nodes + 12, // 13: openfga.v1.UsersetTree.Leaf.users:type_name -> openfga.v1.UsersetTree.Users + 13, // 14: openfga.v1.UsersetTree.Leaf.computed:type_name -> openfga.v1.UsersetTree.Computed + 14, // 15: openfga.v1.UsersetTree.Leaf.tuple_to_userset:type_name -> openfga.v1.UsersetTree.TupleToUserset + 16, // 16: openfga.v1.UsersetTree.Nodes.nodes:type_name -> openfga.v1.UsersetTree.Node + 13, // 17: openfga.v1.UsersetTree.TupleToUserset.computed:type_name -> openfga.v1.UsersetTree.Computed + 16, // 18: openfga.v1.UsersetTree.Difference.base:type_name -> openfga.v1.UsersetTree.Node + 16, // 19: openfga.v1.UsersetTree.Difference.subtract:type_name -> openfga.v1.UsersetTree.Node + 10, // 20: openfga.v1.UsersetTree.Node.leaf:type_name -> openfga.v1.UsersetTree.Leaf + 15, // 21: openfga.v1.UsersetTree.Node.difference:type_name -> openfga.v1.UsersetTree.Difference + 11, // 22: openfga.v1.UsersetTree.Node.union:type_name -> openfga.v1.UsersetTree.Nodes + 11, // 23: openfga.v1.UsersetTree.Node.intersection:type_name -> openfga.v1.UsersetTree.Nodes 24, // [24:24] is the sub-list for method output_type 24, // [24:24] is the sub-list for method input_type 24, // [24:24] is the sub-list for extension type_name @@ -1358,7 +1328,7 @@ func file_openfga_v1_openfga_proto_init() { } } file_openfga_v1_openfga_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TupleKey); i { + switch v := v.(*RelationshipCondition); i { case 0: return &v.state case 1: @@ -1370,7 +1340,7 @@ func file_openfga_v1_openfga_proto_init() { } } file_openfga_v1_openfga_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Tuple); i { + switch v := v.(*TupleKey); i { case 0: return &v.state case 1: @@ -1382,7 +1352,7 @@ func file_openfga_v1_openfga_proto_init() { } } file_openfga_v1_openfga_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*TupleKeys); i { + switch v := v.(*Tuple); i { case 0: return &v.state case 1: @@ -1394,7 +1364,7 @@ func file_openfga_v1_openfga_proto_init() { } } file_openfga_v1_openfga_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ContextualTupleKeys); i { + switch v := v.(*TupleKeys); i { case 0: return &v.state case 1: @@ -1406,7 +1376,7 @@ func file_openfga_v1_openfga_proto_init() { } } file_openfga_v1_openfga_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UsersetTree); i { + switch v := v.(*ContextualTupleKeys); i { case 0: return &v.state case 1: @@ -1418,7 +1388,7 @@ func file_openfga_v1_openfga_proto_init() { } } file_openfga_v1_openfga_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Assertion); i { + switch v := v.(*UsersetTree); i { case 0: return &v.state case 1: @@ -1430,18 +1400,6 @@ func file_openfga_v1_openfga_proto_init() { } } file_openfga_v1_openfga_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*Assertions); i { - case 0: - return &v.state - case 1: - return &v.sizeCache - case 2: - return &v.unknownFields - default: - return nil - } - } - file_openfga_v1_openfga_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*TupleChange); i { case 0: return &v.state @@ -1453,7 +1411,7 @@ func file_openfga_v1_openfga_proto_init() { return nil } } - file_openfga_v1_openfga_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { + file_openfga_v1_openfga_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*Store); i { case 0: return &v.state @@ -1465,7 +1423,7 @@ func file_openfga_v1_openfga_proto_init() { return nil } } - file_openfga_v1_openfga_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { + file_openfga_v1_openfga_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UsersetTree_Leaf); i { case 0: return &v.state @@ -1477,7 +1435,7 @@ func file_openfga_v1_openfga_proto_init() { return nil } } - file_openfga_v1_openfga_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { + file_openfga_v1_openfga_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UsersetTree_Nodes); i { case 0: return &v.state @@ -1489,7 +1447,7 @@ func file_openfga_v1_openfga_proto_init() { return nil } } - file_openfga_v1_openfga_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { + file_openfga_v1_openfga_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UsersetTree_Users); i { case 0: return &v.state @@ -1501,7 +1459,7 @@ func file_openfga_v1_openfga_proto_init() { return nil } } - file_openfga_v1_openfga_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { + file_openfga_v1_openfga_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UsersetTree_Computed); i { case 0: return &v.state @@ -1513,7 +1471,7 @@ func file_openfga_v1_openfga_proto_init() { return nil } } - file_openfga_v1_openfga_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { + file_openfga_v1_openfga_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UsersetTree_TupleToUserset); i { case 0: return &v.state @@ -1525,7 +1483,7 @@ func file_openfga_v1_openfga_proto_init() { return nil } } - file_openfga_v1_openfga_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { + file_openfga_v1_openfga_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UsersetTree_Difference); i { case 0: return &v.state @@ -1537,7 +1495,7 @@ func file_openfga_v1_openfga_proto_init() { return nil } } - file_openfga_v1_openfga_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { + file_openfga_v1_openfga_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UsersetTree_Node); i { case 0: return &v.state @@ -1550,12 +1508,12 @@ func file_openfga_v1_openfga_proto_init() { } } } - file_openfga_v1_openfga_proto_msgTypes[10].OneofWrappers = []interface{}{ + file_openfga_v1_openfga_proto_msgTypes[9].OneofWrappers = []interface{}{ (*UsersetTree_Leaf_Users)(nil), (*UsersetTree_Leaf_Computed)(nil), (*UsersetTree_Leaf_TupleToUserset)(nil), } - file_openfga_v1_openfga_proto_msgTypes[16].OneofWrappers = []interface{}{ + file_openfga_v1_openfga_proto_msgTypes[15].OneofWrappers = []interface{}{ (*UsersetTree_Node_Leaf)(nil), (*UsersetTree_Node_Difference)(nil), (*UsersetTree_Node_Union)(nil), @@ -1567,7 +1525,7 @@ func file_openfga_v1_openfga_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_openfga_v1_openfga_proto_rawDesc, NumEnums: 1, - NumMessages: 17, + NumMessages: 16, NumExtensions: 0, NumServices: 0, }, diff --git a/proto/openfga/v1/openfga.pb.validate.go b/proto/openfga/v1/openfga.pb.validate.go index 412a5736..a070c2aa 100644 --- a/proto/openfga/v1/openfga.pb.validate.go +++ b/proto/openfga/v1/openfga.pb.validate.go @@ -159,6 +159,150 @@ var _Object_Type_Pattern = regexp.MustCompile("^[^:#@\\s]{1,254}$") var _Object_Id_Pattern = regexp.MustCompile("[^#:\\s]+$") +// Validate checks the field values on RelationshipCondition with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *RelationshipCondition) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on RelationshipCondition with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// RelationshipConditionMultiError, or nil if none found. +func (m *RelationshipCondition) ValidateAll() error { + return m.validate(true) +} + +func (m *RelationshipCondition) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if !_RelationshipCondition_ConditionName_Pattern.MatchString(m.GetConditionName()) { + err := RelationshipConditionValidationError{ + field: "ConditionName", + reason: "value does not match regex pattern \"^[^\\\\s]{2,256}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetContext()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, RelationshipConditionValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, RelationshipConditionValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetContext()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return RelationshipConditionValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + } + } + } + + if len(errors) > 0 { + return RelationshipConditionMultiError(errors) + } + + return nil +} + +// RelationshipConditionMultiError is an error wrapping multiple validation +// errors returned by RelationshipCondition.ValidateAll() if the designated +// constraints aren't met. +type RelationshipConditionMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m RelationshipConditionMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m RelationshipConditionMultiError) AllErrors() []error { return m } + +// RelationshipConditionValidationError is the validation error returned by +// RelationshipCondition.Validate if the designated constraints aren't met. +type RelationshipConditionValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e RelationshipConditionValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e RelationshipConditionValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e RelationshipConditionValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e RelationshipConditionValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e RelationshipConditionValidationError) ErrorName() string { + return "RelationshipConditionValidationError" +} + +// Error satisfies the builtin error interface +func (e RelationshipConditionValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sRelationshipCondition.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = RelationshipConditionValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = RelationshipConditionValidationError{} + +var _RelationshipCondition_ConditionName_Pattern = regexp.MustCompile("^[^\\s]{2,256}$") + // Validate checks the field values on TupleKey with the rules defined in the // proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. @@ -222,6 +366,35 @@ func (m *TupleKey) validate(all bool) error { errors = append(errors, err) } + if all { + switch v := interface{}(m.GetCondition()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, TupleKeyValidationError{ + field: "Condition", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, TupleKeyValidationError{ + field: "Condition", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetCondition()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return TupleKeyValidationError{ + field: "Condition", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return TupleKeyMultiError(errors) } @@ -878,280 +1051,6 @@ var _ interface { ErrorName() string } = UsersetTreeValidationError{} -// Validate checks the field values on Assertion with the rules defined in the -// proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *Assertion) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on Assertion with the rules defined in -// the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in AssertionMultiError, or nil -// if none found. -func (m *Assertion) ValidateAll() error { - return m.validate(true) -} - -func (m *Assertion) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - if m.GetTupleKey() == nil { - err := AssertionValidationError{ - field: "TupleKey", - reason: "value is required", - } - if !all { - return err - } - errors = append(errors, err) - } - - if all { - switch v := interface{}(m.GetTupleKey()).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, AssertionValidationError{ - field: "TupleKey", - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, AssertionValidationError{ - field: "TupleKey", - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(m.GetTupleKey()).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return AssertionValidationError{ - field: "TupleKey", - reason: "embedded message failed validation", - cause: err, - } - } - } - - // no validation rules for Expectation - - if len(errors) > 0 { - return AssertionMultiError(errors) - } - - return nil -} - -// AssertionMultiError is an error wrapping multiple validation errors returned -// by Assertion.ValidateAll() if the designated constraints aren't met. -type AssertionMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m AssertionMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m AssertionMultiError) AllErrors() []error { return m } - -// AssertionValidationError is the validation error returned by -// Assertion.Validate if the designated constraints aren't met. -type AssertionValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e AssertionValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e AssertionValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e AssertionValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e AssertionValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e AssertionValidationError) ErrorName() string { return "AssertionValidationError" } - -// Error satisfies the builtin error interface -func (e AssertionValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sAssertion.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = AssertionValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = AssertionValidationError{} - -// Validate checks the field values on Assertions with the rules defined in the -// proto definition for this message. If any rules are violated, the first -// error encountered is returned, or nil if there are no violations. -func (m *Assertions) Validate() error { - return m.validate(false) -} - -// ValidateAll checks the field values on Assertions with the rules defined in -// the proto definition for this message. If any rules are violated, the -// result is a list of violation errors wrapped in AssertionsMultiError, or -// nil if none found. -func (m *Assertions) ValidateAll() error { - return m.validate(true) -} - -func (m *Assertions) validate(all bool) error { - if m == nil { - return nil - } - - var errors []error - - for idx, item := range m.GetAssertions() { - _, _ = idx, item - - if all { - switch v := interface{}(item).(type) { - case interface{ ValidateAll() error }: - if err := v.ValidateAll(); err != nil { - errors = append(errors, AssertionsValidationError{ - field: fmt.Sprintf("Assertions[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - case interface{ Validate() error }: - if err := v.Validate(); err != nil { - errors = append(errors, AssertionsValidationError{ - field: fmt.Sprintf("Assertions[%v]", idx), - reason: "embedded message failed validation", - cause: err, - }) - } - } - } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { - if err := v.Validate(); err != nil { - return AssertionsValidationError{ - field: fmt.Sprintf("Assertions[%v]", idx), - reason: "embedded message failed validation", - cause: err, - } - } - } - - } - - if len(errors) > 0 { - return AssertionsMultiError(errors) - } - - return nil -} - -// AssertionsMultiError is an error wrapping multiple validation errors -// returned by Assertions.ValidateAll() if the designated constraints aren't met. -type AssertionsMultiError []error - -// Error returns a concatenation of all the error messages it wraps. -func (m AssertionsMultiError) Error() string { - var msgs []string - for _, err := range m { - msgs = append(msgs, err.Error()) - } - return strings.Join(msgs, "; ") -} - -// AllErrors returns a list of validation violation errors. -func (m AssertionsMultiError) AllErrors() []error { return m } - -// AssertionsValidationError is the validation error returned by -// Assertions.Validate if the designated constraints aren't met. -type AssertionsValidationError struct { - field string - reason string - cause error - key bool -} - -// Field function returns field value. -func (e AssertionsValidationError) Field() string { return e.field } - -// Reason function returns reason value. -func (e AssertionsValidationError) Reason() string { return e.reason } - -// Cause function returns cause value. -func (e AssertionsValidationError) Cause() error { return e.cause } - -// Key function returns key value. -func (e AssertionsValidationError) Key() bool { return e.key } - -// ErrorName returns error name. -func (e AssertionsValidationError) ErrorName() string { return "AssertionsValidationError" } - -// Error satisfies the builtin error interface -func (e AssertionsValidationError) Error() string { - cause := "" - if e.cause != nil { - cause = fmt.Sprintf(" | caused by: %v", e.cause) - } - - key := "" - if e.key { - key = "key for " - } - - return fmt.Sprintf( - "invalid %sAssertions.%s: %s%s", - key, - e.field, - e.reason, - cause) -} - -var _ error = AssertionsValidationError{} - -var _ interface { - Field() string - Reason() string - Key() bool - Cause() error - ErrorName() string -} = AssertionsValidationError{} - // Validate checks the field values on TupleChange with the rules defined in // the proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. diff --git a/proto/openfga/v1/openfga_service.pb.go b/proto/openfga/v1/openfga_service.pb.go index 41743f90..3c2d1e5c 100644 --- a/proto/openfga/v1/openfga_service.pb.go +++ b/proto/openfga/v1/openfga_service.pb.go @@ -13,6 +13,7 @@ import ( _ "google.golang.org/genproto/googleapis/api/visibility" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + structpb "google.golang.org/protobuf/types/known/structpb" timestamppb "google.golang.org/protobuf/types/known/timestamppb" wrapperspb "google.golang.org/protobuf/types/known/wrapperspb" reflect "reflect" @@ -37,6 +38,9 @@ type ListObjectsRequest struct { Relation string `protobuf:"bytes,4,opt,name=relation,proto3" json:"relation,omitempty"` User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` ContextualTuples *ContextualTupleKeys `protobuf:"bytes,6,opt,name=contextual_tuples,proto3" json:"contextual_tuples,omitempty"` + // Additional request context that will be used to evaluate any ABAC conditions encountered + // in the query evaluation. + Context *structpb.Struct `protobuf:"bytes,7,opt,name=context,proto3" json:"context,omitempty"` } func (x *ListObjectsRequest) Reset() { @@ -113,6 +117,13 @@ func (x *ListObjectsRequest) GetContextualTuples() *ContextualTupleKeys { return nil } +func (x *ListObjectsRequest) GetContext() *structpb.Struct { + if x != nil { + return x.Context + } + return nil +} + type ListObjectsResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -171,6 +182,9 @@ type StreamedListObjectsRequest struct { Relation string `protobuf:"bytes,4,opt,name=relation,proto3" json:"relation,omitempty"` User string `protobuf:"bytes,5,opt,name=user,proto3" json:"user,omitempty"` ContextualTuples *ContextualTupleKeys `protobuf:"bytes,6,opt,name=contextual_tuples,proto3" json:"contextual_tuples,omitempty"` + // Additional request context that will be used to evaluate any ABAC conditions encountered + // in the query evaluation. + Context *structpb.Struct `protobuf:"bytes,7,opt,name=context,proto3" json:"context,omitempty"` } func (x *StreamedListObjectsRequest) Reset() { @@ -247,6 +261,13 @@ func (x *StreamedListObjectsRequest) GetContextualTuples() *ContextualTupleKeys return nil } +func (x *StreamedListObjectsRequest) GetContext() *structpb.Struct { + if x != nil { + return x.Context + } + return nil +} + // The response for a StreamedListObjects RPC. type StreamedListObjectsResponse struct { state protoimpl.MessageState @@ -301,7 +322,7 @@ type ReadRequest struct { unknownFields protoimpl.UnknownFields StoreId string `protobuf:"bytes,1,opt,name=store_id,proto3" json:"store_id,omitempty"` - TupleKey *TupleKey `protobuf:"bytes,2,opt,name=tuple_key,proto3" json:"tuple_key,omitempty"` + TupleKey *ReadRequestTupleKey `protobuf:"bytes,2,opt,name=tuple_key,proto3" json:"tuple_key,omitempty"` PageSize *wrapperspb.Int32Value `protobuf:"bytes,3,opt,name=page_size,proto3" json:"page_size,omitempty"` ContinuationToken string `protobuf:"bytes,4,opt,name=continuation_token,proto3" json:"continuation_token,omitempty"` } @@ -345,7 +366,7 @@ func (x *ReadRequest) GetStoreId() string { return "" } -func (x *ReadRequest) GetTupleKey() *TupleKey { +func (x *ReadRequest) GetTupleKey() *ReadRequestTupleKey { if x != nil { return x.TupleKey } @@ -366,6 +387,69 @@ func (x *ReadRequest) GetContinuationToken() string { return "" } +type ReadRequestTupleKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Relation string `protobuf:"bytes,2,opt,name=relation,proto3" json:"relation,omitempty"` + Object string `protobuf:"bytes,3,opt,name=object,proto3" json:"object,omitempty"` +} + +func (x *ReadRequestTupleKey) Reset() { + *x = ReadRequestTupleKey{} + if protoimpl.UnsafeEnabled { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ReadRequestTupleKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ReadRequestTupleKey) ProtoMessage() {} + +func (x *ReadRequestTupleKey) ProtoReflect() protoreflect.Message { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[5] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ReadRequestTupleKey.ProtoReflect.Descriptor instead. +func (*ReadRequestTupleKey) Descriptor() ([]byte, []int) { + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{5} +} + +func (x *ReadRequestTupleKey) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *ReadRequestTupleKey) GetRelation() string { + if x != nil { + return x.Relation + } + return "" +} + +func (x *ReadRequestTupleKey) GetObject() string { + if x != nil { + return x.Object + } + return "" +} + type ReadResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -378,7 +462,7 @@ type ReadResponse struct { func (x *ReadResponse) Reset() { *x = ReadResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[5] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -391,7 +475,7 @@ func (x *ReadResponse) String() string { func (*ReadResponse) ProtoMessage() {} func (x *ReadResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[5] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -404,7 +488,7 @@ func (x *ReadResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadResponse.ProtoReflect.Descriptor instead. func (*ReadResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{5} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{6} } func (x *ReadResponse) GetTuples() []*Tuple { @@ -435,7 +519,7 @@ type WriteRequest struct { func (x *WriteRequest) Reset() { *x = WriteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[6] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -448,7 +532,7 @@ func (x *WriteRequest) String() string { func (*WriteRequest) ProtoMessage() {} func (x *WriteRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[6] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -461,7 +545,7 @@ func (x *WriteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteRequest.ProtoReflect.Descriptor instead. func (*WriteRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{6} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{7} } func (x *WriteRequest) GetStoreId() string { @@ -501,7 +585,7 @@ type WriteResponse struct { func (x *WriteResponse) Reset() { *x = WriteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[7] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -514,7 +598,7 @@ func (x *WriteResponse) String() string { func (*WriteResponse) ProtoMessage() {} func (x *WriteResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[7] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -527,7 +611,7 @@ func (x *WriteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteResponse.ProtoReflect.Descriptor instead. func (*WriteResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{7} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{8} } type CheckRequest struct { @@ -535,18 +619,21 @@ type CheckRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreId string `protobuf:"bytes,1,opt,name=store_id,proto3" json:"store_id,omitempty"` - TupleKey *TupleKey `protobuf:"bytes,2,opt,name=tuple_key,proto3" json:"tuple_key,omitempty"` - ContextualTuples *ContextualTupleKeys `protobuf:"bytes,3,opt,name=contextual_tuples,proto3" json:"contextual_tuples,omitempty"` - AuthorizationModelId string `protobuf:"bytes,4,opt,name=authorization_model_id,proto3" json:"authorization_model_id,omitempty"` + StoreId string `protobuf:"bytes,1,opt,name=store_id,proto3" json:"store_id,omitempty"` + TupleKey *CheckRequestTupleKey `protobuf:"bytes,2,opt,name=tuple_key,proto3" json:"tuple_key,omitempty"` + ContextualTuples *ContextualTupleKeys `protobuf:"bytes,3,opt,name=contextual_tuples,proto3" json:"contextual_tuples,omitempty"` + AuthorizationModelId string `protobuf:"bytes,4,opt,name=authorization_model_id,proto3" json:"authorization_model_id,omitempty"` // Defaults to false. Making it true has performance implications. Trace bool `protobuf:"varint,5,opt,name=trace,proto3" json:"trace,omitempty"` + // Additional request context that will be used to evaluate any ABAC conditions encountered + // in the query evaluation. + Context *structpb.Struct `protobuf:"bytes,6,opt,name=context,proto3" json:"context,omitempty"` } func (x *CheckRequest) Reset() { *x = CheckRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[8] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -559,7 +646,7 @@ func (x *CheckRequest) String() string { func (*CheckRequest) ProtoMessage() {} func (x *CheckRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[8] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -572,7 +659,7 @@ func (x *CheckRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckRequest.ProtoReflect.Descriptor instead. func (*CheckRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{8} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{9} } func (x *CheckRequest) GetStoreId() string { @@ -582,7 +669,7 @@ func (x *CheckRequest) GetStoreId() string { return "" } -func (x *CheckRequest) GetTupleKey() *TupleKey { +func (x *CheckRequest) GetTupleKey() *CheckRequestTupleKey { if x != nil { return x.TupleKey } @@ -610,6 +697,76 @@ func (x *CheckRequest) GetTrace() bool { return false } +func (x *CheckRequest) GetContext() *structpb.Struct { + if x != nil { + return x.Context + } + return nil +} + +type CheckRequestTupleKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + User string `protobuf:"bytes,1,opt,name=user,proto3" json:"user,omitempty"` + Relation string `protobuf:"bytes,2,opt,name=relation,proto3" json:"relation,omitempty"` + Object string `protobuf:"bytes,3,opt,name=object,proto3" json:"object,omitempty"` +} + +func (x *CheckRequestTupleKey) Reset() { + *x = CheckRequestTupleKey{} + if protoimpl.UnsafeEnabled { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *CheckRequestTupleKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CheckRequestTupleKey) ProtoMessage() {} + +func (x *CheckRequestTupleKey) ProtoReflect() protoreflect.Message { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[10] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CheckRequestTupleKey.ProtoReflect.Descriptor instead. +func (*CheckRequestTupleKey) Descriptor() ([]byte, []int) { + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{10} +} + +func (x *CheckRequestTupleKey) GetUser() string { + if x != nil { + return x.User + } + return "" +} + +func (x *CheckRequestTupleKey) GetRelation() string { + if x != nil { + return x.Relation + } + return "" +} + +func (x *CheckRequestTupleKey) GetObject() string { + if x != nil { + return x.Object + } + return "" +} + type CheckResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -623,7 +780,7 @@ type CheckResponse struct { func (x *CheckResponse) Reset() { *x = CheckResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[9] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -636,7 +793,7 @@ func (x *CheckResponse) String() string { func (*CheckResponse) ProtoMessage() {} func (x *CheckResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[9] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -649,7 +806,7 @@ func (x *CheckResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CheckResponse.ProtoReflect.Descriptor instead. func (*CheckResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{9} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{11} } func (x *CheckResponse) GetAllowed() bool { @@ -671,15 +828,15 @@ type ExpandRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreId string `protobuf:"bytes,1,opt,name=store_id,proto3" json:"store_id,omitempty"` - TupleKey *TupleKey `protobuf:"bytes,2,opt,name=tuple_key,proto3" json:"tuple_key,omitempty"` - AuthorizationModelId string `protobuf:"bytes,3,opt,name=authorization_model_id,proto3" json:"authorization_model_id,omitempty"` + StoreId string `protobuf:"bytes,1,opt,name=store_id,proto3" json:"store_id,omitempty"` + TupleKey *ExpandRequestTupleKey `protobuf:"bytes,2,opt,name=tuple_key,proto3" json:"tuple_key,omitempty"` + AuthorizationModelId string `protobuf:"bytes,3,opt,name=authorization_model_id,proto3" json:"authorization_model_id,omitempty"` } func (x *ExpandRequest) Reset() { *x = ExpandRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[10] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -692,7 +849,7 @@ func (x *ExpandRequest) String() string { func (*ExpandRequest) ProtoMessage() {} func (x *ExpandRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[10] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -705,7 +862,7 @@ func (x *ExpandRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpandRequest.ProtoReflect.Descriptor instead. func (*ExpandRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{10} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{12} } func (x *ExpandRequest) GetStoreId() string { @@ -715,7 +872,7 @@ func (x *ExpandRequest) GetStoreId() string { return "" } -func (x *ExpandRequest) GetTupleKey() *TupleKey { +func (x *ExpandRequest) GetTupleKey() *ExpandRequestTupleKey { if x != nil { return x.TupleKey } @@ -729,6 +886,61 @@ func (x *ExpandRequest) GetAuthorizationModelId() string { return "" } +type ExpandRequestTupleKey struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Object string `protobuf:"bytes,1,opt,name=object,proto3" json:"object,omitempty"` + Relation string `protobuf:"bytes,2,opt,name=relation,proto3" json:"relation,omitempty"` +} + +func (x *ExpandRequestTupleKey) Reset() { + *x = ExpandRequestTupleKey{} + if protoimpl.UnsafeEnabled { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ExpandRequestTupleKey) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ExpandRequestTupleKey) ProtoMessage() {} + +func (x *ExpandRequestTupleKey) ProtoReflect() protoreflect.Message { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[13] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ExpandRequestTupleKey.ProtoReflect.Descriptor instead. +func (*ExpandRequestTupleKey) Descriptor() ([]byte, []int) { + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{13} +} + +func (x *ExpandRequestTupleKey) GetObject() string { + if x != nil { + return x.Object + } + return "" +} + +func (x *ExpandRequestTupleKey) GetRelation() string { + if x != nil { + return x.Relation + } + return "" +} + type ExpandResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -740,7 +952,7 @@ type ExpandResponse struct { func (x *ExpandResponse) Reset() { *x = ExpandResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[11] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -753,7 +965,7 @@ func (x *ExpandResponse) String() string { func (*ExpandResponse) ProtoMessage() {} func (x *ExpandResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[11] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -766,7 +978,7 @@ func (x *ExpandResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ExpandResponse.ProtoReflect.Descriptor instead. func (*ExpandResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{11} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{14} } func (x *ExpandResponse) GetTree() *UsersetTree { @@ -788,7 +1000,7 @@ type ReadAuthorizationModelRequest struct { func (x *ReadAuthorizationModelRequest) Reset() { *x = ReadAuthorizationModelRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[12] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -801,7 +1013,7 @@ func (x *ReadAuthorizationModelRequest) String() string { func (*ReadAuthorizationModelRequest) ProtoMessage() {} func (x *ReadAuthorizationModelRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[12] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -814,7 +1026,7 @@ func (x *ReadAuthorizationModelRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadAuthorizationModelRequest.ProtoReflect.Descriptor instead. func (*ReadAuthorizationModelRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{12} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{15} } func (x *ReadAuthorizationModelRequest) GetStoreId() string { @@ -842,7 +1054,7 @@ type ReadAuthorizationModelResponse struct { func (x *ReadAuthorizationModelResponse) Reset() { *x = ReadAuthorizationModelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[13] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -855,7 +1067,7 @@ func (x *ReadAuthorizationModelResponse) String() string { func (*ReadAuthorizationModelResponse) ProtoMessage() {} func (x *ReadAuthorizationModelResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[13] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -868,7 +1080,7 @@ func (x *ReadAuthorizationModelResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadAuthorizationModelResponse.ProtoReflect.Descriptor instead. func (*ReadAuthorizationModelResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{13} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{16} } func (x *ReadAuthorizationModelResponse) GetAuthorizationModel() *AuthorizationModel { @@ -883,15 +1095,16 @@ type WriteAuthorizationModelRequest struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - StoreId string `protobuf:"bytes,1,opt,name=store_id,proto3" json:"store_id,omitempty"` - TypeDefinitions []*TypeDefinition `protobuf:"bytes,2,rep,name=type_definitions,proto3" json:"type_definitions,omitempty"` - SchemaVersion string `protobuf:"bytes,3,opt,name=schema_version,proto3" json:"schema_version,omitempty"` + StoreId string `protobuf:"bytes,1,opt,name=store_id,proto3" json:"store_id,omitempty"` + TypeDefinitions []*TypeDefinition `protobuf:"bytes,2,rep,name=type_definitions,proto3" json:"type_definitions,omitempty"` + SchemaVersion string `protobuf:"bytes,3,opt,name=schema_version,proto3" json:"schema_version,omitempty"` + Conditions map[string]*Condition `protobuf:"bytes,4,rep,name=conditions,proto3" json:"conditions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } func (x *WriteAuthorizationModelRequest) Reset() { *x = WriteAuthorizationModelRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[14] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -904,7 +1117,7 @@ func (x *WriteAuthorizationModelRequest) String() string { func (*WriteAuthorizationModelRequest) ProtoMessage() {} func (x *WriteAuthorizationModelRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[14] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -917,7 +1130,7 @@ func (x *WriteAuthorizationModelRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteAuthorizationModelRequest.ProtoReflect.Descriptor instead. func (*WriteAuthorizationModelRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{14} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{17} } func (x *WriteAuthorizationModelRequest) GetStoreId() string { @@ -941,6 +1154,13 @@ func (x *WriteAuthorizationModelRequest) GetSchemaVersion() string { return "" } +func (x *WriteAuthorizationModelRequest) GetConditions() map[string]*Condition { + if x != nil { + return x.Conditions + } + return nil +} + type WriteAuthorizationModelResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -952,7 +1172,7 @@ type WriteAuthorizationModelResponse struct { func (x *WriteAuthorizationModelResponse) Reset() { *x = WriteAuthorizationModelResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[15] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -965,7 +1185,7 @@ func (x *WriteAuthorizationModelResponse) String() string { func (*WriteAuthorizationModelResponse) ProtoMessage() {} func (x *WriteAuthorizationModelResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[15] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -978,7 +1198,7 @@ func (x *WriteAuthorizationModelResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteAuthorizationModelResponse.ProtoReflect.Descriptor instead. func (*WriteAuthorizationModelResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{15} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{18} } func (x *WriteAuthorizationModelResponse) GetAuthorizationModelId() string { @@ -1001,7 +1221,7 @@ type ReadAuthorizationModelsRequest struct { func (x *ReadAuthorizationModelsRequest) Reset() { *x = ReadAuthorizationModelsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[16] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1014,7 +1234,7 @@ func (x *ReadAuthorizationModelsRequest) String() string { func (*ReadAuthorizationModelsRequest) ProtoMessage() {} func (x *ReadAuthorizationModelsRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[16] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1027,7 +1247,7 @@ func (x *ReadAuthorizationModelsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadAuthorizationModelsRequest.ProtoReflect.Descriptor instead. func (*ReadAuthorizationModelsRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{16} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{19} } func (x *ReadAuthorizationModelsRequest) GetStoreId() string { @@ -1063,7 +1283,7 @@ type ReadAuthorizationModelsResponse struct { func (x *ReadAuthorizationModelsResponse) Reset() { *x = ReadAuthorizationModelsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[17] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1076,7 +1296,7 @@ func (x *ReadAuthorizationModelsResponse) String() string { func (*ReadAuthorizationModelsResponse) ProtoMessage() {} func (x *ReadAuthorizationModelsResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[17] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1089,7 +1309,7 @@ func (x *ReadAuthorizationModelsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadAuthorizationModelsResponse.ProtoReflect.Descriptor instead. func (*ReadAuthorizationModelsResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{17} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{20} } func (x *ReadAuthorizationModelsResponse) GetAuthorizationModels() []*AuthorizationModel { @@ -1119,7 +1339,7 @@ type WriteAssertionsRequest struct { func (x *WriteAssertionsRequest) Reset() { *x = WriteAssertionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[18] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1132,7 +1352,7 @@ func (x *WriteAssertionsRequest) String() string { func (*WriteAssertionsRequest) ProtoMessage() {} func (x *WriteAssertionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[18] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1145,7 +1365,7 @@ func (x *WriteAssertionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteAssertionsRequest.ProtoReflect.Descriptor instead. func (*WriteAssertionsRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{18} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{21} } func (x *WriteAssertionsRequest) GetStoreId() string { @@ -1178,7 +1398,7 @@ type WriteAssertionsResponse struct { func (x *WriteAssertionsResponse) Reset() { *x = WriteAssertionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[19] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1191,7 +1411,7 @@ func (x *WriteAssertionsResponse) String() string { func (*WriteAssertionsResponse) ProtoMessage() {} func (x *WriteAssertionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[19] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1204,7 +1424,7 @@ func (x *WriteAssertionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use WriteAssertionsResponse.ProtoReflect.Descriptor instead. func (*WriteAssertionsResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{19} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{22} } type ReadAssertionsRequest struct { @@ -1219,7 +1439,7 @@ type ReadAssertionsRequest struct { func (x *ReadAssertionsRequest) Reset() { *x = ReadAssertionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[20] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1232,7 +1452,7 @@ func (x *ReadAssertionsRequest) String() string { func (*ReadAssertionsRequest) ProtoMessage() {} func (x *ReadAssertionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[20] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1245,7 +1465,7 @@ func (x *ReadAssertionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadAssertionsRequest.ProtoReflect.Descriptor instead. func (*ReadAssertionsRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{20} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{23} } func (x *ReadAssertionsRequest) GetStoreId() string { @@ -1274,7 +1494,7 @@ type ReadAssertionsResponse struct { func (x *ReadAssertionsResponse) Reset() { *x = ReadAssertionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[21] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1287,7 +1507,7 @@ func (x *ReadAssertionsResponse) String() string { func (*ReadAssertionsResponse) ProtoMessage() {} func (x *ReadAssertionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[21] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1300,7 +1520,7 @@ func (x *ReadAssertionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadAssertionsResponse.ProtoReflect.Descriptor instead. func (*ReadAssertionsResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{21} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{24} } func (x *ReadAssertionsResponse) GetAuthorizationModelId() string { @@ -1331,7 +1551,7 @@ type ReadChangesRequest struct { func (x *ReadChangesRequest) Reset() { *x = ReadChangesRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[22] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1344,7 +1564,7 @@ func (x *ReadChangesRequest) String() string { func (*ReadChangesRequest) ProtoMessage() {} func (x *ReadChangesRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[22] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1357,7 +1577,7 @@ func (x *ReadChangesRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadChangesRequest.ProtoReflect.Descriptor instead. func (*ReadChangesRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{22} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{25} } func (x *ReadChangesRequest) GetStoreId() string { @@ -1400,7 +1620,7 @@ type ReadChangesResponse struct { func (x *ReadChangesResponse) Reset() { *x = ReadChangesResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[23] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1413,7 +1633,7 @@ func (x *ReadChangesResponse) String() string { func (*ReadChangesResponse) ProtoMessage() {} func (x *ReadChangesResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[23] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1426,7 +1646,7 @@ func (x *ReadChangesResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ReadChangesResponse.ProtoReflect.Descriptor instead. func (*ReadChangesResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{23} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{26} } func (x *ReadChangesResponse) GetChanges() []*TupleChange { @@ -1454,7 +1674,7 @@ type CreateStoreRequest struct { func (x *CreateStoreRequest) Reset() { *x = CreateStoreRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[24] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1467,7 +1687,7 @@ func (x *CreateStoreRequest) String() string { func (*CreateStoreRequest) ProtoMessage() {} func (x *CreateStoreRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[24] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1480,7 +1700,7 @@ func (x *CreateStoreRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateStoreRequest.ProtoReflect.Descriptor instead. func (*CreateStoreRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{24} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{27} } func (x *CreateStoreRequest) GetName() string { @@ -1504,7 +1724,7 @@ type CreateStoreResponse struct { func (x *CreateStoreResponse) Reset() { *x = CreateStoreResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[25] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1517,7 +1737,7 @@ func (x *CreateStoreResponse) String() string { func (*CreateStoreResponse) ProtoMessage() {} func (x *CreateStoreResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[25] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1530,7 +1750,7 @@ func (x *CreateStoreResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use CreateStoreResponse.ProtoReflect.Descriptor instead. func (*CreateStoreResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{25} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{28} } func (x *CreateStoreResponse) GetId() string { @@ -1573,7 +1793,7 @@ type UpdateStoreRequest struct { func (x *UpdateStoreRequest) Reset() { *x = UpdateStoreRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[26] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1586,7 +1806,7 @@ func (x *UpdateStoreRequest) String() string { func (*UpdateStoreRequest) ProtoMessage() {} func (x *UpdateStoreRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[26] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1599,7 +1819,7 @@ func (x *UpdateStoreRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateStoreRequest.ProtoReflect.Descriptor instead. func (*UpdateStoreRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{26} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{29} } func (x *UpdateStoreRequest) GetStoreId() string { @@ -1630,7 +1850,7 @@ type UpdateStoreResponse struct { func (x *UpdateStoreResponse) Reset() { *x = UpdateStoreResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[27] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1643,7 +1863,7 @@ func (x *UpdateStoreResponse) String() string { func (*UpdateStoreResponse) ProtoMessage() {} func (x *UpdateStoreResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[27] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1656,7 +1876,7 @@ func (x *UpdateStoreResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateStoreResponse.ProtoReflect.Descriptor instead. func (*UpdateStoreResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{27} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{30} } func (x *UpdateStoreResponse) GetId() string { @@ -1698,7 +1918,7 @@ type DeleteStoreRequest struct { func (x *DeleteStoreRequest) Reset() { *x = DeleteStoreRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[28] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1711,7 +1931,7 @@ func (x *DeleteStoreRequest) String() string { func (*DeleteStoreRequest) ProtoMessage() {} func (x *DeleteStoreRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[28] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1724,7 +1944,7 @@ func (x *DeleteStoreRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteStoreRequest.ProtoReflect.Descriptor instead. func (*DeleteStoreRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{28} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{31} } func (x *DeleteStoreRequest) GetStoreId() string { @@ -1743,7 +1963,7 @@ type DeleteStoreResponse struct { func (x *DeleteStoreResponse) Reset() { *x = DeleteStoreResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[29] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1756,7 +1976,7 @@ func (x *DeleteStoreResponse) String() string { func (*DeleteStoreResponse) ProtoMessage() {} func (x *DeleteStoreResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[29] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1769,7 +1989,7 @@ func (x *DeleteStoreResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteStoreResponse.ProtoReflect.Descriptor instead. func (*DeleteStoreResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{29} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{32} } type GetStoreRequest struct { @@ -1783,7 +2003,7 @@ type GetStoreRequest struct { func (x *GetStoreRequest) Reset() { *x = GetStoreRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[30] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1796,7 +2016,7 @@ func (x *GetStoreRequest) String() string { func (*GetStoreRequest) ProtoMessage() {} func (x *GetStoreRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[30] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1809,7 +2029,7 @@ func (x *GetStoreRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStoreRequest.ProtoReflect.Descriptor instead. func (*GetStoreRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{30} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{33} } func (x *GetStoreRequest) GetStoreId() string { @@ -1833,7 +2053,7 @@ type GetStoreResponse struct { func (x *GetStoreResponse) Reset() { *x = GetStoreResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[31] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1846,7 +2066,7 @@ func (x *GetStoreResponse) String() string { func (*GetStoreResponse) ProtoMessage() {} func (x *GetStoreResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[31] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1859,7 +2079,7 @@ func (x *GetStoreResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetStoreResponse.ProtoReflect.Descriptor instead. func (*GetStoreResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{31} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{34} } func (x *GetStoreResponse) GetId() string { @@ -1902,7 +2122,7 @@ type ListStoresRequest struct { func (x *ListStoresRequest) Reset() { *x = ListStoresRequest{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[32] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1915,7 +2135,7 @@ func (x *ListStoresRequest) String() string { func (*ListStoresRequest) ProtoMessage() {} func (x *ListStoresRequest) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[32] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1928,7 +2148,7 @@ func (x *ListStoresRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListStoresRequest.ProtoReflect.Descriptor instead. func (*ListStoresRequest) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{32} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{35} } func (x *ListStoresRequest) GetPageSize() *wrapperspb.Int32Value { @@ -1957,7 +2177,7 @@ type ListStoresResponse struct { func (x *ListStoresResponse) Reset() { *x = ListStoresResponse{} if protoimpl.UnsafeEnabled { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[33] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1970,7 +2190,7 @@ func (x *ListStoresResponse) String() string { func (*ListStoresResponse) ProtoMessage() {} func (x *ListStoresResponse) ProtoReflect() protoreflect.Message { - mi := &file_openfga_v1_openfga_service_proto_msgTypes[33] + mi := &file_openfga_v1_openfga_service_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1983,7 +2203,7 @@ func (x *ListStoresResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListStoresResponse.ProtoReflect.Descriptor instead. func (*ListStoresResponse) Descriptor() ([]byte, []int) { - return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{33} + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{36} } func (x *ListStoresResponse) GetStores() []*Store { @@ -2000,6 +2220,108 @@ func (x *ListStoresResponse) GetContinuationToken() string { return "" } +type Assertion struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TupleKey *CheckRequestTupleKey `protobuf:"bytes,1,opt,name=tuple_key,proto3" json:"tuple_key,omitempty"` + Expectation bool `protobuf:"varint,2,opt,name=expectation,proto3" json:"expectation,omitempty"` +} + +func (x *Assertion) Reset() { + *x = Assertion{} + if protoimpl.UnsafeEnabled { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[37] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Assertion) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Assertion) ProtoMessage() {} + +func (x *Assertion) ProtoReflect() protoreflect.Message { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[37] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Assertion.ProtoReflect.Descriptor instead. +func (*Assertion) Descriptor() ([]byte, []int) { + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{37} +} + +func (x *Assertion) GetTupleKey() *CheckRequestTupleKey { + if x != nil { + return x.TupleKey + } + return nil +} + +func (x *Assertion) GetExpectation() bool { + if x != nil { + return x.Expectation + } + return false +} + +type Assertions struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Assertions []*Assertion `protobuf:"bytes,1,rep,name=assertions,proto3" json:"assertions,omitempty"` +} + +func (x *Assertions) Reset() { + *x = Assertions{} + if protoimpl.UnsafeEnabled { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[38] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Assertions) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Assertions) ProtoMessage() {} + +func (x *Assertions) ProtoReflect() protoreflect.Message { + mi := &file_openfga_v1_openfga_service_proto_msgTypes[38] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use Assertions.ProtoReflect.Descriptor instead. +func (*Assertions) Descriptor() ([]byte, []int) { + return file_openfga_v1_openfga_service_proto_rawDescGZIP(), []int{38} +} + +func (x *Assertions) GetAssertions() []*Assertion { + if x != nil { + return x.Assertions + } + return nil +} + var File_openfga_v1_openfga_service_proto protoreflect.FileDescriptor var file_openfga_v1_openfga_service_proto_rawDesc = []byte{ @@ -2011,97 +2333,164 @@ var file_openfga_v1_openfga_service_proto_rawDesc = []byte{ 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x5f, 0x62, 0x65, 0x68, 0x61, 0x76, 0x69, 0x6f, 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x76, 0x69, 0x73, 0x69, 0x62, 0x69, - 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, - 0x70, 0x70, 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x6f, 0x70, 0x65, - 0x6e, 0x66, 0x67, 0x61, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, - 0x61, 0x2f, 0x76, 0x31, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, - 0x70, 0x65, 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2f, 0x61, 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x8f, 0x04, 0x0a, 0x12, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x65, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, - 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, - 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, - 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, - 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, - 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, - 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, - 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, - 0x72, 0x26, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, - 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, - 0x7b, 0x32, 0x36, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, - 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, - 0x92, 0x41, 0x0c, 0x4a, 0x0a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe0, - 0x41, 0x02, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, - 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x35, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, - 0x12, 0x43, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x27, 0x92, 0x41, 0x0a, 0x4a, 0x08, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, - 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0x52, 0x08, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x23, 0x92, 0x41, 0x13, 0x4a, 0x0b, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, - 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x78, 0x80, 0x04, 0x80, 0x01, 0x01, 0xe0, 0x41, 0x02, 0xfa, 0x42, - 0x07, 0x72, 0x05, 0x20, 0x01, 0x28, 0x80, 0x04, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x4d, - 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, - 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, - 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, - 0x6c, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x5e, 0x0a, - 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x2d, 0x92, 0x41, 0x2a, 0x4a, 0x28, 0x5b, 0x22, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x72, 0x6f, 0x61, 0x64, 0x6d, 0x61, 0x70, 0x22, 0x2c, - 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x70, 0x6c, 0x61, 0x6e, 0x6e, 0x69, - 0x6e, 0x67, 0x22, 0x5d, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x97, 0x04, - 0x0a, 0x1a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, 0x08, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x49, - 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, - 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, - 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, - 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, - 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x69, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, - 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, - 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, 0x72, 0x26, 0x32, 0x21, 0x5e, 0x5b, - 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, - 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0xd0, - 0x01, 0x01, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x04, 0x74, 0x79, - 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0x92, 0x41, 0x0c, 0x4a, 0x0a, 0x22, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x15, 0x72, - 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x32, - 0x35, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0x92, 0x41, - 0x0a, 0x4a, 0x08, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, - 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, - 0x2c, 0x35, 0x30, 0x7d, 0x24, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x37, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, 0x92, - 0x41, 0x13, 0x4a, 0x0b, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x78, - 0x80, 0x04, 0x80, 0x01, 0x01, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x20, 0x01, 0x28, - 0x80, 0x04, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x75, 0x70, 0x6c, 0x65, - 0x4b, 0x65, 0x79, 0x73, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, - 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x4e, 0x0a, 0x1b, 0x53, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0x92, 0x41, 0x14, 0x4a, 0x12, 0x22, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x72, 0x6f, 0x61, 0x64, 0x6d, 0x61, 0x70, 0x22, 0x52, - 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x9a, 0x03, 0x0a, 0x0b, 0x52, 0x65, 0x61, 0x64, + 0x6c, 0x69, 0x74, 0x79, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1c, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x73, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x72, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1b, 0x6f, 0x70, 0x65, 0x6e, 0x66, + 0x67, 0x61, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x7a, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x18, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2f, + 0x76, 0x31, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x63, 0x2d, 0x67, 0x65, 0x6e, 0x2d, 0x6f, 0x70, 0x65, + 0x6e, 0x61, 0x70, 0x69, 0x76, 0x32, 0x2f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x61, + 0x6e, 0x6e, 0x6f, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x1a, 0x17, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xc2, 0x04, 0x0a, 0x12, 0x4c, 0x69, + 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x65, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, + 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, + 0x48, 0x45, 0x35, 0x58, 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, + 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, + 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, + 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, 0x72, 0x26, + 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, + 0x36, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x12, 0x3e, + 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0x92, 0x41, + 0x0c, 0x4a, 0x0a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe0, 0x41, 0x02, + 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, + 0x7b, 0x31, 0x2c, 0x32, 0x35, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x43, + 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x27, 0x92, 0x41, 0x0a, 0x4a, 0x08, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xe0, + 0x41, 0x02, 0xfa, 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, + 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x23, 0x92, 0x41, 0x13, 0x4a, 0x0b, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, + 0x6e, 0x65, 0x22, 0x78, 0x80, 0x04, 0x80, 0x01, 0x01, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x07, 0x72, + 0x05, 0x20, 0x01, 0x28, 0x80, 0x04, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, + 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x54, + 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x5e, + 0x0a, 0x13, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x42, 0x2d, 0x92, 0x41, 0x2a, 0x4a, 0x28, 0x5b, 0x22, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x72, 0x6f, 0x61, 0x64, 0x6d, 0x61, 0x70, 0x22, + 0x2c, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x70, 0x6c, 0x61, 0x6e, 0x6e, + 0x69, 0x6e, 0x67, 0x22, 0x5d, 0x52, 0x07, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0xca, + 0x04, 0x0a, 0x1a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x65, 0x0a, + 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, + 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, + 0x58, 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x5f, 0x69, 0x64, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, + 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, + 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, 0x72, 0x26, 0x32, 0x21, 0x5e, + 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, + 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, + 0xd0, 0x01, 0x01, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x12, 0x3e, 0x0a, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x2a, 0x92, 0x41, 0x0c, 0x4a, 0x0a, + 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x15, + 0x72, 0x13, 0x32, 0x11, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, + 0x32, 0x35, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x27, 0x92, + 0x41, 0x0a, 0x4a, 0x08, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0xe0, 0x41, 0x02, 0xfa, + 0x42, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, + 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x37, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x42, 0x23, + 0x92, 0x41, 0x13, 0x4a, 0x0b, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, + 0x78, 0x80, 0x04, 0x80, 0x01, 0x01, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x07, 0x72, 0x05, 0x20, 0x01, + 0x28, 0x80, 0x04, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x4d, 0x0a, 0x11, 0x63, 0x6f, 0x6e, + 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x75, 0x70, 0x6c, + 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, + 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x6f, 0x6e, 0x74, + 0x65, 0x78, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, 0x6f, 0x6f, 0x67, + 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, 0x74, 0x72, 0x75, + 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0x4e, 0x0a, 0x1b, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2f, 0x0a, 0x06, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x17, 0x92, 0x41, 0x14, 0x4a, + 0x12, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x72, 0x6f, 0x61, 0x64, 0x6d, + 0x61, 0x70, 0x22, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0xa5, 0x03, 0x0a, 0x0b, + 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, + 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, + 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, + 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x3d, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, + 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x5f, 0x6b, 0x65, 0x79, 0x12, 0x4b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, + 0x61, 0x6c, 0x75, 0x65, 0x42, 0x10, 0x92, 0x41, 0x04, 0x4a, 0x02, 0x35, 0x30, 0xfa, 0x42, 0x06, + 0x1a, 0x04, 0x18, 0x64, 0x28, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, + 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6f, + 0x92, 0x41, 0x64, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, + 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, + 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, + 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, + 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, + 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, + 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x28, 0x52, + 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x22, 0xdd, 0x01, 0x0a, 0x13, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x04, 0x75, + 0x73, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1b, 0x92, 0x41, 0x10, 0x4a, 0x0b, + 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x78, 0x80, 0x04, 0xfa, 0x42, + 0x05, 0x72, 0x03, 0x28, 0x80, 0x04, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x08, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, + 0x92, 0x41, 0x0c, 0x4a, 0x08, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x78, 0x32, 0xfa, + 0x42, 0x17, 0x72, 0x15, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, + 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x4e, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x36, 0x92, 0x41, 0x1b, 0x4a, 0x16, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, + 0x78, 0x80, 0x02, 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x0e, 0x5e, 0x5b, 0x5e, 0x5c, 0x73, 0x5d, + 0x7b, 0x32, 0x2c, 0x32, 0x35, 0x36, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x06, 0x6f, 0x62, 0x6a, + 0x65, 0x63, 0x74, 0x22, 0xa0, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x06, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x12, + 0xe4, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb3, 0x01, 0x92, + 0x41, 0xa7, 0x01, 0x32, 0x41, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, + 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, + 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, + 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, + 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, + 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, + 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, + 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xdf, 0x02, 0x0a, 0x0c, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, @@ -2109,171 +2498,73 @@ var file_openfga_v1_openfga_service_proto_rawDesc = []byte{ 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, - 0x64, 0x12, 0x32, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, - 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x74, 0x75, 0x70, 0x6c, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x12, 0x4b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x10, 0x92, 0x41, 0x04, 0x4a, 0x02, 0x35, 0x30, 0xfa, 0x42, - 0x06, 0x1a, 0x04, 0x18, 0x64, 0x28, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, - 0x6f, 0x92, 0x41, 0x64, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, - 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, - 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, - 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, - 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, - 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, - 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x28, - 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa0, 0x02, 0x0a, 0x0c, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x52, 0x06, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, - 0x12, 0xe4, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb3, 0x01, - 0x92, 0x41, 0xa7, 0x01, 0x32, 0x41, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, - 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, - 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, - 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, - 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, - 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, - 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, - 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, - 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, - 0x28, 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xdf, 0x02, 0x0a, 0x0c, 0x57, 0x72, 0x69, 0x74, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, - 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, - 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, - 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, - 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x69, 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x73, 0x12, 0x2f, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, - 0x65, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, - 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, - 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, 0x72, 0x26, 0x32, 0x21, 0x5e, 0x5b, 0x41, - 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, - 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0xd0, 0x01, - 0x01, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x0f, 0x0a, 0x0d, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb3, 0x03, 0x0a, 0x0c, 0x43, - 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, - 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, - 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, - 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, - 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, - 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, - 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x0b, - 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x75, 0x70, - 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, - 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, - 0x79, 0x73, 0x52, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, - 0x75, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, - 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, - 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, 0x72, 0x26, 0x32, 0x21, - 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, - 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, - 0x24, 0xd0, 0x01, 0x01, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x05, - 0x74, 0x72, 0x61, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x0c, 0x92, 0x41, 0x09, - 0x40, 0x01, 0x4a, 0x05, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, - 0x22, 0x54, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x23, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x42, 0x09, 0x92, 0x41, 0x06, 0x4a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, - 0x6c, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc1, 0x02, 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x61, 0x6e, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, - 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, - 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, - 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, - 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, - 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x69, 0x64, 0x12, 0x3f, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x14, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x0b, 0xe0, 0x41, 0x02, - 0xfa, 0x42, 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, - 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, - 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, 0x72, 0x26, 0x32, 0x21, 0x5e, 0x5b, - 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, - 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0xd0, - 0x01, 0x01, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x3d, 0x0a, 0x0e, 0x45, 0x78, - 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, - 0x74, 0x72, 0x65, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x70, 0x65, - 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, - 0x72, 0x65, 0x65, 0x52, 0x04, 0x74, 0x72, 0x65, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x1d, 0x52, 0x65, - 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, - 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, - 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, - 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, - 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, - 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x07, 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x1a, 0x52, 0x02, 0x69, 0x64, 0x22, 0x72, - 0x0a, 0x1e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x50, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x13, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x22, 0xa7, 0x02, 0x0a, 0x1e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, - 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, - 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, - 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, - 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, - 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, - 0x5f, 0x0a, 0x10, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, - 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, - 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x17, 0x92, 0x41, 0x09, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, - 0x00, 0xf0, 0x3f, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x10, - 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x3a, 0x0a, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0xfa, 0x42, 0x0f, 0x72, 0x0d, 0x52, - 0x03, 0x31, 0x2e, 0x30, 0x52, 0x03, 0x31, 0x2e, 0x31, 0xd0, 0x01, 0x00, 0x52, 0x0e, 0x73, 0x63, - 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0xa5, 0x01, 0x0a, - 0x1f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x81, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, + 0x64, 0x12, 0x2d, 0x0a, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x06, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, + 0x12, 0x2f, 0x0a, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, + 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x07, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x73, 0x12, 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, + 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, + 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, 0x72, 0x26, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, + 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0xd0, 0x01, 0x01, + 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x0f, 0x0a, 0x0d, 0x57, 0x72, 0x69, 0x74, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf2, 0x03, 0x0a, 0x0c, 0x43, 0x68, + 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, + 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, + 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, + 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, + 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, + 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x5f, 0x69, 0x64, 0x12, 0x4b, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xfa, 0x42, + 0x05, 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x12, 0x4d, 0x0a, 0x11, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x74, 0x65, 0x78, + 0x74, 0x75, 0x61, 0x6c, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x11, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, + 0x12, 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, - 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, + 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, 0x72, 0x26, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, - 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x16, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x22, 0xf9, 0x02, 0x0a, 0x1e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, + 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, + 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x12, 0x22, 0x0a, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x08, 0x42, 0x0c, 0x92, 0x41, 0x09, 0x40, 0x01, 0x4a, 0x05, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x52, 0x05, 0x74, 0x72, 0x61, 0x63, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x63, + 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x53, + 0x74, 0x72, 0x75, 0x63, 0x74, 0x52, 0x07, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x22, 0xde, + 0x01, 0x0a, 0x14, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x04, 0x75, 0x73, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x1b, 0x92, 0x41, 0x10, 0x4a, 0x0b, 0x22, 0x75, 0x73, 0x65, + 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x78, 0x80, 0x04, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, + 0x80, 0x04, 0x52, 0x04, 0x75, 0x73, 0x65, 0x72, 0x12, 0x45, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x29, 0x92, 0x41, 0x0c, 0x4a, + 0x08, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x78, 0x32, 0xfa, 0x42, 0x17, 0x72, 0x15, + 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x30, + 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x4e, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x36, 0x92, 0x41, 0x1b, 0x4a, 0x16, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, + 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x78, 0x80, 0x02, 0xfa, + 0x42, 0x15, 0x72, 0x13, 0x32, 0x0e, 0x5e, 0x5b, 0x5e, 0x5c, 0x73, 0x5d, 0x7b, 0x32, 0x2c, 0x32, + 0x35, 0x36, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, + 0x54, 0x0a, 0x0d, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x23, 0x0a, 0x07, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x08, 0x42, 0x09, 0x92, 0x41, 0x06, 0x4a, 0x04, 0x74, 0x72, 0x75, 0x65, 0x52, 0x07, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x6c, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0a, 0x72, 0x65, 0x73, 0x6f, 0x6c, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xce, 0x02, 0x0a, 0x0d, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, @@ -2281,35 +2572,110 @@ var file_openfga_v1_openfga_service_proto_rawDesc = []byte{ 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, - 0x64, 0x12, 0x4b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x42, 0x10, 0x92, 0x41, 0x04, 0x4a, 0x02, 0x35, 0x30, 0xfa, 0x42, 0x06, 0x1a, 0x04, 0x18, - 0x64, 0x28, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x9f, - 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6f, 0x92, 0x41, 0x64, - 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, - 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, - 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, - 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, - 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, - 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, - 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, - 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x22, 0xdc, 0x02, 0x0a, 0x1f, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x64, 0x12, 0x4c, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, + 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x8a, + 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x12, + 0x84, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, + 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, + 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x28, 0x72, 0x26, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x16, + 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0xae, 0x01, 0x0a, 0x15, 0x45, 0x78, 0x70, 0x61, 0x6e, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, + 0x12, 0x4e, 0x0a, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x36, 0x92, 0x41, 0x1b, 0x4a, 0x16, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x78, 0x80, 0x02, + 0xfa, 0x42, 0x15, 0x72, 0x13, 0x32, 0x0e, 0x5e, 0x5b, 0x5e, 0x5c, 0x73, 0x5d, 0x7b, 0x32, 0x2c, + 0x32, 0x35, 0x36, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x06, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x12, 0x45, 0x0a, 0x08, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x42, 0x29, 0x92, 0x41, 0x0c, 0x4a, 0x08, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, + 0x22, 0x78, 0x32, 0xfa, 0x42, 0x17, 0x72, 0x15, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, + 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x08, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3d, 0x0a, 0x0e, 0x45, 0x78, 0x70, 0x61, 0x6e, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2b, 0x0a, 0x04, 0x74, 0x72, 0x65, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x54, 0x72, 0x65, 0x65, + 0x52, 0x04, 0x74, 0x72, 0x65, 0x65, 0x22, 0xa2, 0x01, 0x0a, 0x1d, 0x52, 0x65, 0x61, 0x64, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, + 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, + 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, + 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, + 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, + 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x69, 0x64, 0x12, 0x17, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x07, + 0xfa, 0x42, 0x04, 0x72, 0x02, 0x18, 0x1a, 0x52, 0x02, 0x69, 0x64, 0x22, 0x72, 0x0a, 0x1e, 0x52, + 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, + 0x13, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x13, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, + 0xf9, 0x03, 0x0a, 0x1e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, + 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, + 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, + 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, + 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, + 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x5f, 0x0a, 0x10, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x79, 0x70, 0x65, 0x44, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x17, 0x92, 0x41, 0x09, 0x69, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xf0, 0x3f, + 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, 0x92, 0x01, 0x02, 0x08, 0x01, 0x52, 0x10, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x3a, 0x0a, + 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x12, 0xfa, 0x42, 0x0f, 0x72, 0x0d, 0x52, 0x03, 0x31, 0x2e, + 0x30, 0x52, 0x03, 0x31, 0x2e, 0x31, 0xd0, 0x01, 0x00, 0x52, 0x0e, 0x73, 0x63, 0x68, 0x65, 0x6d, + 0x61, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7a, 0x0a, 0x0a, 0x63, 0x6f, 0x6e, + 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3a, 0x2e, + 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x52, 0x14, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0xe4, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, - 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb3, 0x01, 0x92, 0x41, 0xa7, 0x01, 0x32, 0x41, 0x54, 0x68, - 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, - 0x74, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, - 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x4a, + 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x42, 0x1e, 0xfa, 0x42, 0x1b, 0x9a, 0x01, + 0x18, 0x10, 0x19, 0x22, 0x14, 0x72, 0x12, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x40, 0x5c, + 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x35, 0x30, 0x7d, 0x24, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x64, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x1a, 0x54, 0x0a, 0x0f, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 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, 0x2b, 0x0a, 0x05, 0x76, 0x61, + 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa5, 0x01, 0x0a, 0x1f, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x81, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, + 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, + 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, + 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, + 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x16, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x5f, 0x69, 0x64, 0x22, 0xf9, 0x02, 0x0a, 0x1e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, + 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, + 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, + 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, + 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, + 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, + 0x12, 0x4b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, + 0x42, 0x10, 0x92, 0x41, 0x04, 0x4a, 0x02, 0x35, 0x30, 0xfa, 0x42, 0x06, 0x1a, 0x04, 0x18, 0x64, + 0x28, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x9f, 0x01, + 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6f, 0x92, 0x41, 0x64, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, @@ -2318,139 +2684,134 @@ var file_openfga_v1_openfga_service_proto_rawDesc = []byte{ 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, - 0xd8, 0x02, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, - 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, - 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, - 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, - 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, - 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x5f, 0x69, 0x64, 0x12, 0x81, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, - 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, - 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, - 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, - 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, - 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x12, 0x50, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x19, 0x92, 0x41, 0x09, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, - 0x40, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x07, 0x92, 0x01, 0x04, 0x08, 0x00, 0x10, 0x64, 0x52, 0x0a, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x85, 0x02, 0x0a, 0x15, 0x52, 0x65, 0x61, 0x64, 0x41, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, - 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, - 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, + 0xdc, 0x02, 0x0a, 0x1f, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x14, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x52, 0x14, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0xe4, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0xb3, 0x01, 0x92, 0x41, 0xa7, 0x01, 0x32, 0x41, 0x54, 0x68, 0x65, + 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, + 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, + 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x4a, 0x62, + 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, + 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, + 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, + 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, + 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, + 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, + 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xd8, + 0x02, 0x0a, 0x16, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, + 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, + 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, + 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, + 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x5f, 0x69, 0x64, 0x12, 0x81, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, + 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, + 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, - 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x81, 0x01, 0x0a, 0x16, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, - 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, - 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x25, - 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, - 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, - 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0xd3, 0x01, - 0x0a, 0x16, 0x52, 0x65, 0x61, 0x64, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, + 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x12, 0x50, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, + 0x6f, 0x6e, 0x42, 0x19, 0x92, 0x41, 0x09, 0x59, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x59, 0x40, + 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x07, 0x92, 0x01, 0x04, 0x08, 0x00, 0x10, 0x64, 0x52, 0x0a, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x19, 0x0a, 0x17, 0x57, 0x72, 0x69, + 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x85, 0x02, 0x0a, 0x15, 0x52, 0x65, 0x61, 0x64, 0x41, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, + 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, + 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, + 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, + 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, + 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x81, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, + 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x0a, - 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, - 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x22, 0x9d, 0x03, 0x0a, 0x12, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, - 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, - 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, - 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, - 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, - 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x5f, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x1a, 0xfa, 0x42, 0x17, 0x72, 0x15, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, - 0x5c, 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x35, 0x34, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, - 0x61, 0x6c, 0x75, 0x65, 0x42, 0x10, 0x92, 0x41, 0x04, 0x4a, 0x02, 0x35, 0x30, 0xfa, 0x42, 0x06, - 0x1a, 0x04, 0x18, 0x64, 0x28, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, - 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6f, - 0x92, 0x41, 0x64, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, - 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, - 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, - 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, - 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, - 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, - 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x28, 0x52, - 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0xb3, 0x02, 0x0a, 0x13, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, - 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x63, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x43, - 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0xe8, - 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb7, 0x01, 0x92, 0x41, - 0xab, 0x01, 0x32, 0x45, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, - 0x62, 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6e, 0x65, 0x77, - 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, - 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, - 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, - 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, - 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, - 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, - 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, - 0x72, 0x03, 0x28, 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x67, 0x0a, 0x12, 0x43, 0x72, 0x65, - 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x51, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, - 0x41, 0x11, 0x4a, 0x0f, 0x22, 0x6d, 0x79, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2d, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x23, 0x72, 0x21, 0x32, 0x1f, 0x5e, 0x5b, 0x61, - 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5c, 0x73, 0x5c, 0x2e, 0x5c, 0x2d, 0x5c, 0x2f, - 0x5e, 0x5f, 0x26, 0x40, 0x5d, 0x7b, 0x33, 0x2c, 0x36, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x02, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, - 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, - 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, - 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x12, 0x3a, 0x0a, - 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0xd5, 0x01, 0x0a, 0x12, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, - 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, - 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, - 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, - 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, - 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x55, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x41, 0x92, 0x41, 0x15, 0x4a, 0x13, 0x22, - 0x6d, 0x79, 0x2d, 0x6e, 0x65, 0x77, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2d, 0x6e, 0x61, 0x6d, + 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0xd3, 0x01, 0x0a, + 0x16, 0x52, 0x65, 0x61, 0x64, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x81, 0x01, 0x0a, 0x16, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x49, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, + 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, + 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0xfa, 0x42, 0x25, 0x72, 0x23, + 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, + 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, + 0x36, 0x7d, 0x24, 0x52, 0x16, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x12, 0x35, 0x0a, 0x0a, 0x61, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x22, 0x9d, 0x03, 0x0a, 0x12, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, + 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, + 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, + 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, + 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, + 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x5f, 0x69, 0x64, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x1a, 0xfa, 0x42, 0x17, 0x72, 0x15, 0x32, 0x10, 0x5e, 0x5b, 0x5e, 0x3a, 0x23, 0x5c, + 0x73, 0x5d, 0x7b, 0x31, 0x2c, 0x32, 0x35, 0x34, 0x7d, 0x24, 0xd0, 0x01, 0x01, 0x52, 0x04, 0x74, + 0x79, 0x70, 0x65, 0x12, 0x4b, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, 0x56, 0x61, + 0x6c, 0x75, 0x65, 0x42, 0x10, 0x92, 0x41, 0x04, 0x4a, 0x02, 0x35, 0x30, 0xfa, 0x42, 0x06, 0x1a, + 0x04, 0x18, 0x64, 0x28, 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, + 0x12, 0x9f, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6f, 0x92, + 0x41, 0x64, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, + 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, + 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, + 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, + 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, + 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, + 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x28, 0x52, 0x12, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x22, 0xb3, 0x02, 0x0a, 0x13, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x07, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6f, 0x70, + 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x52, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0xe8, 0x01, + 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb7, 0x01, 0x92, 0x41, 0xab, + 0x01, 0x32, 0x45, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, + 0x65, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x6c, 0x20, 0x69, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6e, 0x65, 0x77, 0x20, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, + 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, + 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, + 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, + 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, + 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, + 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, + 0x03, 0x28, 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x67, 0x0a, 0x12, 0x43, 0x72, 0x65, 0x61, + 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x51, + 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x3d, 0x92, 0x41, + 0x11, 0x4a, 0x0f, 0x22, 0x6d, 0x79, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x23, 0x72, 0x21, 0x32, 0x1f, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5c, 0x73, 0x5c, 0x2e, 0x5c, 0x2d, 0x5c, 0x2f, 0x5e, 0x5f, 0x26, 0x40, 0x5d, 0x7b, 0x33, 0x2c, 0x36, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, - 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x22, 0xd4, 0x01, 0x0a, 0x13, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, @@ -2463,147 +2824,245 @@ var file_openfga_v1_openfga_service_proto_rawDesc = []byte{ 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x7e, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, - 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, - 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, - 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, - 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, - 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x7b, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, + 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0xd5, 0x01, 0x0a, 0x12, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, + 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, + 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, + 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, + 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, + 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x12, 0x55, 0x0a, 0x04, 0x6e, 0x61, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x41, 0x92, 0x41, 0x15, 0x4a, 0x13, 0x22, 0x6d, + 0x79, 0x2d, 0x6e, 0x65, 0x77, 0x2d, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2d, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x23, 0x72, 0x21, 0x32, 0x1f, 0x5e, 0x5b, 0x61, 0x2d, 0x7a, + 0x41, 0x2d, 0x5a, 0x30, 0x2d, 0x39, 0x5c, 0x73, 0x5c, 0x2e, 0x5c, 0x2d, 0x5c, 0x2f, 0x5e, 0x5f, + 0x26, 0x40, 0x5d, 0x7b, 0x33, 0x2c, 0x36, 0x34, 0x7d, 0x24, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, + 0x22, 0xd4, 0x01, 0x0a, 0x13, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x31, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, - 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, - 0x21, 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, - 0x51, 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, - 0x7d, 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x22, 0xd1, 0x01, 0x0a, - 0x10, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x31, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0x92, - 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, - 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, - 0x64, 0x5f, 0x61, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, - 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, - 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, - 0x22, 0xfb, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, - 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, - 0x32, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x1a, 0x04, 0x18, 0x64, 0x28, - 0x01, 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x9f, 0x01, 0x0a, - 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6f, 0x92, 0x41, 0x64, 0x4a, 0x62, - 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, - 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, - 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, - 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, - 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, - 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, - 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, - 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa6, - 0x02, 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0xe4, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb3, 0x01, - 0x92, 0x41, 0xa7, 0x01, 0x32, 0x41, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, - 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, - 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, - 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2e, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, - 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, - 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, - 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, - 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, - 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, - 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, - 0x28, 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x32, 0x9f, 0x8c, 0x01, 0x0a, 0x0e, 0x4f, 0x70, 0x65, - 0x6e, 0x46, 0x47, 0x41, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0xca, 0x1c, 0x0a, 0x04, - 0x52, 0x65, 0x61, 0x64, 0x12, 0x17, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8e, 0x1c, 0x92, 0x41, 0xe8, 0x1b, 0x0a, 0x13, - 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x54, 0x75, 0x70, - 0x6c, 0x65, 0x73, 0x12, 0x57, 0x47, 0x65, 0x74, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, - 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x20, 0x61, 0x20, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, 0x74, 0x20, 0x66, 0x6f, 0x6c, - 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x20, 0x72, - 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x1a, 0xf1, 0x1a, 0x54, - 0x68, 0x65, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, - 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, - 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x20, 0x61, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x66, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x60, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x68, 0x69, 0x70, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x73, 0x61, - 0x74, 0x69, 0x73, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x20, 0x0a, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x0a, 0x31, - 0x2e, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x60, 0x20, 0x69, 0x73, - 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x69, 0x74, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, - 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x0a, 0x32, 0x2e, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, - 0x65, 0x79, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x60, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x61, - 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x69, 0x66, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, - 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x60, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, - 0x69, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x61, - 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x28, 0x65, 0x2e, - 0x67, 0x2e, 0x2c, 0x20, 0x60, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x5f, 0x69, 0x64, 0x60, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x6e, - 0x6c, 0x79, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x2c, 0x20, 0x60, 0x74, 0x79, 0x70, 0x65, 0x3a, - 0x60, 0x29, 0x2e, 0x0a, 0x33, 0x2e, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x60, 0x20, 0x69, 0x73, 0x20, 0x6d, 0x61, 0x6e, 0x64, 0x61, - 0x74, 0x6f, 0x72, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, - 0x79, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, - 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x60, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, - 0x2e, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x73, 0x0a, 0x23, 0x23, - 0x23, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, - 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x0a, 0x54, 0x6f, 0x20, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, - 0x3a, 0x62, 0x6f, 0x62, 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x60, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, - 0x60, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x0a, 0x60, 0x60, - 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, - 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x22, 0x2c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x3a, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, + 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0x52, 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, + 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, + 0x3a, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, + 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, + 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, 0x7e, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x68, 0x0a, + 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, + 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, + 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, + 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, 0x5e, 0x5b, 0x41, 0x42, + 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, 0x52, 0x53, 0x54, 0x56, + 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, 0x24, 0x52, 0x08, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x22, 0x15, 0x0a, 0x13, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7b, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x68, 0x0a, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x4c, 0x92, 0x41, 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, + 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, + 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x25, 0x72, 0x23, 0x32, 0x21, + 0x5e, 0x5b, 0x41, 0x42, 0x43, 0x44, 0x45, 0x46, 0x47, 0x48, 0x4a, 0x4b, 0x4d, 0x4e, 0x50, 0x51, + 0x52, 0x53, 0x54, 0x56, 0x57, 0x58, 0x59, 0x5a, 0x30, 0x2d, 0x39, 0x5d, 0x7b, 0x32, 0x36, 0x7d, + 0x24, 0x52, 0x08, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x22, 0xd1, 0x01, 0x0a, 0x10, + 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x31, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x21, 0x92, 0x41, + 0x1e, 0x4a, 0x1c, 0x22, 0x30, 0x31, 0x59, 0x43, 0x50, 0x34, 0x36, 0x4a, 0x4b, 0x59, 0x4d, 0x38, + 0x46, 0x4a, 0x43, 0x51, 0x33, 0x37, 0x4e, 0x4d, 0x42, 0x59, 0x48, 0x45, 0x35, 0x58, 0x22, 0x52, + 0x02, 0x69, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x3a, 0x0a, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, + 0x5f, 0x61, 0x74, 0x12, 0x3a, 0x0a, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, + 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, + 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x52, 0x0a, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x61, 0x74, 0x22, + 0xfb, 0x01, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x44, 0x0a, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, + 0x7a, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x49, 0x6e, 0x74, 0x33, 0x32, + 0x56, 0x61, 0x6c, 0x75, 0x65, 0x42, 0x09, 0xfa, 0x42, 0x06, 0x1a, 0x04, 0x18, 0x64, 0x28, 0x01, + 0x52, 0x09, 0x70, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x12, 0x9f, 0x01, 0x0a, 0x12, + 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x6f, 0x92, 0x41, 0x64, 0x4a, 0x62, 0x22, + 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, + 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, + 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, + 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, + 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, + 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, + 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, + 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0xa6, 0x02, + 0x0a, 0x12, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x06, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x11, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x06, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, + 0xe4, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0xb3, 0x01, 0x92, + 0x41, 0xa7, 0x01, 0x32, 0x41, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2e, 0x4a, 0x62, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, + 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, + 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, + 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, + 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, + 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, + 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0xfa, 0x42, 0x05, 0x72, 0x03, 0x28, + 0x80, 0x28, 0x52, 0x12, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x7f, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x4b, 0x0a, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x54, 0x75, 0x70, 0x6c, 0x65, 0x4b, 0x65, 0x79, 0x42, 0x0b, 0xe0, 0x41, 0x02, 0xfa, 0x42, 0x05, + 0x8a, 0x01, 0x02, 0x10, 0x01, 0x52, 0x09, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x12, 0x25, 0x0a, 0x0b, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x42, 0x03, 0xe0, 0x41, 0x02, 0x52, 0x0b, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x35, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x32, 0x9f, 0x8c, 0x01, + 0x0a, 0x0e, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x12, 0xca, 0x1c, 0x0a, 0x04, 0x52, 0x65, 0x61, 0x64, 0x12, 0x17, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x61, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8e, 0x1c, 0x92, + 0x41, 0xe8, 0x1b, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, + 0x70, 0x20, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x57, 0x47, 0x65, 0x74, 0x20, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x20, 0x61, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x6f, 0x75, + 0x74, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x73, 0x65, 0x74, 0x20, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, + 0x73, 0x1a, 0xf1, 0x1a, 0x54, 0x68, 0x65, 0x20, 0x52, 0x65, 0x61, 0x64, 0x20, 0x41, 0x50, 0x49, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x65, + 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, + 0x20, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x20, 0x61, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, + 0x73, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x60, + 0x20, 0x41, 0x50, 0x49, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x74, 0x20, + 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x72, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, + 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x79, 0x73, 0x74, 0x65, 0x6d, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x73, 0x61, 0x74, 0x69, 0x73, 0x66, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x20, 0x0a, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, + 0x64, 0x79, 0x3a, 0x0a, 0x31, 0x2e, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, + 0x79, 0x60, 0x20, 0x69, 0x73, 0x20, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2e, 0x20, + 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x0a, 0x32, 0x2e, 0x20, 0x60, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x60, 0x20, + 0x69, 0x73, 0x20, 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x69, 0x66, 0x20, + 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x60, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x63, 0x61, 0x6e, + 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x66, 0x75, 0x6c, 0x6c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x2c, 0x20, 0x60, 0x74, 0x79, 0x70, 0x65, 0x3a, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x5f, 0x69, 0x64, 0x60, 0x29, 0x20, 0x6f, 0x72, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x2c, 0x20, 0x60, + 0x74, 0x79, 0x70, 0x65, 0x3a, 0x60, 0x29, 0x2e, 0x0a, 0x33, 0x2e, 0x20, 0x60, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x75, 0x73, 0x65, 0x72, 0x60, 0x20, 0x69, 0x73, 0x20, + 0x6d, 0x61, 0x6e, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x20, 0x69, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x61, 0x73, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x60, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x2e, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x73, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, + 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, + 0x6e, 0x0a, 0x54, 0x6f, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x60, + 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x68, 0x69, 0x70, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x64, 0x6f, 0x63, + 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x60, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, + 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, + 0x6f, 0x66, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x22, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, + 0x62, 0x6f, 0x62, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, + 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x0a, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, + 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, + 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, + 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, + 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x31, 0x30, 0x2d, 0x30, + 0x36, 0x54, 0x31, 0x35, 0x3a, 0x33, 0x32, 0x3a, 0x31, 0x31, 0x2e, 0x31, 0x32, 0x38, 0x5a, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x63, + 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, + 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, + 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, + 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, + 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, + 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, + 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x54, 0x68, 0x69, + 0x73, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x60, 0x75, 0x73, + 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x60, 0x72, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, + 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x65, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, + 0x75, 0x6e, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x20, + 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x64, 0x6f, 0x65, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, + 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x23, 0x23, 0x23, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, + 0x6e, 0x64, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x0a, 0x54, 0x6f, 0x20, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x60, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, + 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2c, 0x20, 0x63, 0x61, + 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, + 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, + 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, + 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, + 0x61, 0x64, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, - 0x6c, 0x69, 0x6b, 0x65, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, + 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, + 0x69, 0x6b, 0x65, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, @@ -2625,1043 +3084,984 @@ var file_openfga_v1_openfga_service_proto_rawDesc = []byte{ 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x61, - 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, - 0x62, 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x60, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, - 0x69, 0x74, 0x68, 0x20, 0x31, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x20, 0x60, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x60, 0x2e, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x75, 0x6e, 0x6c, 0x69, 0x6b, - 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x4f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, - 0x70, 0x6c, 0x65, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, - 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x75, 0x70, - 0x6c, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x23, 0x23, 0x23, - 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, - 0x69, 0x70, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, - 0x61, 0x76, 0x65, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, - 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x0a, 0x54, 0x6f, 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x72, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, - 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, - 0x61, 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x62, 0x6f, 0x64, 0x79, - 0x20, 0x6f, 0x66, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, - 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x54, 0x68, 0x65, 0x20, - 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, - 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x0a, - 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, - 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, - 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, - 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x32, - 0x31, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x36, 0x54, 0x31, 0x35, 0x3a, 0x33, 0x32, 0x3a, 0x31, 0x31, - 0x2e, 0x31, 0x32, 0x38, 0x5a, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x5d, - 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, - 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, - 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, - 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, - 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, - 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, - 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0x0a, 0x7d, 0x0a, 0x60, - 0x60, 0x60, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, - 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x31, 0x20, - 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x28, 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, - 0x62, 0x6f, 0x62, 0x60, 0x29, 0x2e, 0x20, 0x20, 0x4e, 0x6f, 0x74, 0x65, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x2c, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x73, 0x61, 0x69, 0x64, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x60, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x73, 0x60, 0x20, 0x61, 0x72, 0x65, - 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x73, 0x60, 0x2c, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6e, 0x6f, - 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x73, - 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, - 0x6e, 0x6e, 0x65, 0x60, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, 0x65, 0x20, 0x69, 0x74, 0x20, - 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x74, 0x75, 0x70, - 0x6c, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, - 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x2e, 0x0a, - 0x23, 0x23, 0x23, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6c, 0x6c, - 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x73, 0x20, 0x66, - 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x54, 0x6f, 0x20, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, - 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, - 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x61, - 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, - 0x6f, 0x66, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, - 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, - 0x0a, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, 0x69, 0x6e, 0x67, 0x20, 0x6c, - 0x69, 0x6b, 0x65, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, - 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, - 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x3a, 0x20, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, - 0x3a, 0x20, 0x22, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x35, 0x54, 0x31, 0x33, - 0x3a, 0x34, 0x32, 0x3a, 0x31, 0x32, 0x2e, 0x33, 0x35, 0x36, 0x5a, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x20, 0x68, + 0x61, 0x73, 0x20, 0x31, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x28, 0x60, + 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x60, 0x29, 0x2e, 0x20, 0x20, 0x4e, 0x6f, 0x74, + 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x2c, 0x20, 0x65, 0x76, 0x65, 0x6e, 0x20, 0x69, 0x66, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x73, 0x61, 0x69, 0x64, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x60, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x73, + 0x60, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x73, 0x60, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x72, 0x73, 0x20, 0x73, 0x75, 0x63, 0x68, 0x20, 0x61, 0x73, 0x20, 0x60, 0x75, + 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x60, 0x20, 0x62, 0x65, 0x63, 0x61, 0x75, 0x73, + 0x65, 0x20, 0x69, 0x74, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x73, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x6f, 0x65, + 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x65, 0x76, 0x61, 0x6c, 0x75, 0x61, 0x74, 0x65, 0x20, 0x74, + 0x68, 0x65, 0x6d, 0x2e, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x77, 0x69, 0x74, + 0x68, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, + 0x69, 0x70, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x75, 0x6c, 0x61, 0x72, 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x0a, 0x54, 0x6f, + 0x20, 0x71, 0x75, 0x65, 0x72, 0x79, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x75, + 0x73, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x61, + 0x6e, 0x79, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, + 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2c, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x22, + 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, + 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x73, 0x6f, 0x6d, 0x65, 0x74, 0x68, + 0x69, 0x6e, 0x67, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, + 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, + 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, + 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, + 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x73, + 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x31, 0x30, 0x2d, + 0x30, 0x35, 0x54, 0x31, 0x33, 0x3a, 0x34, 0x32, 0x3a, 0x31, 0x32, 0x2e, 0x33, 0x35, 0x36, 0x5a, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, + 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x22, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, + 0x32, 0x31, 0x2d, 0x31, 0x30, 0x2d, 0x30, 0x36, 0x54, 0x31, 0x35, 0x3a, 0x33, 0x32, 0x3a, 0x31, + 0x31, 0x2e, 0x31, 0x32, 0x38, 0x5a, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x65, 0x79, 0x4a, 0x77, + 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, + 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, + 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, + 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, + 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, + 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0x0a, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, + 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x31, + 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x28, 0x60, 0x75, 0x73, 0x65, 0x72, + 0x3a, 0x62, 0x6f, 0x62, 0x60, 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x20, 0x60, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x72, 0x60, 0x20, 0x28, 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, + 0x65, 0x60, 0x29, 0x2e, 0x0a, 0x2a, 0x04, 0x52, 0x65, 0x61, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1c, 0x3a, 0x01, 0x2a, 0x22, 0x17, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x12, 0xbe, 0x0b, + 0x0a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65, 0x12, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xff, 0x0a, 0x92, + 0x41, 0xd8, 0x0a, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, + 0x70, 0x20, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x23, 0x41, 0x64, 0x64, 0x20, 0x6f, 0x72, + 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x66, + 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x94, 0x0a, + 0x54, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, + 0x69, 0x6e, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x20, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x4f, 0x70, 0x65, 0x6e, + 0x46, 0x47, 0x41, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, + 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x62, + 0x65, 0x74, 0x77, 0x65, 0x65, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x0a, 0x49, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x60, 0x77, 0x72, 0x69, 0x74, + 0x65, 0x73, 0x60, 0x20, 0x61, 0x64, 0x64, 0x73, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x73, 0x20, 0x77, 0x68, 0x69, 0x6c, 0x65, 0x20, 0x60, 0x64, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x73, 0x60, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x65, 0x78, 0x69, 0x73, + 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x41, 0x50, 0x49, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x64, 0x65, 0x6d, + 0x70, 0x6f, 0x74, 0x65, 0x6e, 0x74, 0x3a, 0x20, 0x69, 0x66, 0x2c, 0x20, 0x6c, 0x61, 0x74, 0x65, + 0x72, 0x20, 0x6f, 0x6e, 0x2c, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, + 0x20, 0x61, 0x64, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x74, + 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, + 0x6f, 0x6e, 0x2d, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x75, 0x70, 0x6c, + 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, + 0x20, 0x61, 0x6e, 0x20, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x0a, 0x41, 0x6e, 0x20, 0x60, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x60, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, + 0x6f, 0x64, 0x79, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x2c, 0x20, 0x69, + 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x61, + 0x63, 0x68, 0x20, 0x77, 0x72, 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x20, 0x28, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x29, 0x20, 0x69, + 0x73, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, + 0x20, 0x49, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x49, 0x44, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x41, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x73, 0x0a, 0x54, 0x6f, 0x20, + 0x61, 0x64, 0x64, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x60, 0x20, + 0x61, 0x73, 0x20, 0x61, 0x20, 0x60, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x60, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, + 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x77, + 0x72, 0x69, 0x74, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x0a, 0x60, 0x60, 0x60, + 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, + 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, + 0x6b, 0x65, 0x79, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, + 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x3a, 0x20, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, + 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, + 0x67, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, + 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, 0x50, + 0x45, 0x43, 0x4e, 0x56, 0x41, 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, 0x22, + 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, + 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, + 0x73, 0x0a, 0x54, 0x6f, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x60, 0x75, 0x73, 0x65, + 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x60, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x60, 0x72, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x60, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2c, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, + 0x6e, 0x67, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, + 0x22, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x3a, 0x20, 0x5b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x69, 0x6d, 0x65, - 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x3a, 0x20, 0x22, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x31, 0x30, - 0x2d, 0x30, 0x36, 0x54, 0x31, 0x35, 0x3a, 0x33, 0x32, 0x3a, 0x31, 0x31, 0x2e, 0x31, 0x32, 0x38, - 0x5a, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x5d, 0x2c, 0x0a, 0x20, 0x20, - 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, - 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, - 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, - 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, - 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, - 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, - 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x54, - 0x68, 0x69, 0x73, 0x20, 0x6d, 0x65, 0x61, 0x6e, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x60, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x31, 0x20, 0x60, 0x72, 0x65, 0x61, - 0x64, 0x65, 0x72, 0x60, 0x20, 0x28, 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x60, - 0x29, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x31, 0x20, 0x60, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x60, - 0x20, 0x28, 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x60, 0x29, 0x2e, 0x0a, - 0x2a, 0x04, 0x52, 0x65, 0x61, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x3a, 0x01, 0x2a, 0x22, - 0x17, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x12, 0xbe, 0x0b, 0x0a, 0x05, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x12, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xff, 0x0a, 0x92, 0x41, 0xd8, 0x0a, 0x0a, 0x13, - 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x54, 0x75, 0x70, - 0x6c, 0x65, 0x73, 0x12, 0x23, 0x41, 0x64, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x94, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x2e, 0x20, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x20, 0x74, - 0x6f, 0x20, 0x64, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x69, 0x6e, 0x65, 0x20, 0x77, 0x68, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, - 0x69, 0x70, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x62, 0x65, 0x74, 0x77, 0x65, 0x65, - 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x61, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x2e, 0x0a, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x62, 0x6f, 0x64, 0x79, 0x2c, 0x20, 0x60, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x60, 0x20, 0x61, - 0x64, 0x64, 0x73, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x77, - 0x68, 0x69, 0x6c, 0x65, 0x20, 0x60, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x73, 0x60, 0x20, 0x72, - 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x73, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, - 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, - 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x69, 0x64, 0x65, 0x6d, 0x70, 0x6f, 0x74, 0x65, 0x6e, - 0x74, 0x3a, 0x20, 0x69, 0x66, 0x2c, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x20, 0x6f, 0x6e, 0x2c, - 0x20, 0x79, 0x6f, 0x75, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x2c, 0x20, - 0x6f, 0x72, 0x20, 0x69, 0x66, 0x20, 0x79, 0x6f, 0x75, 0x20, 0x74, 0x72, 0x79, 0x20, 0x74, 0x6f, - 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x6f, 0x6e, 0x2d, 0x65, 0x78, - 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x69, 0x74, - 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x72, 0x6f, 0x77, 0x20, 0x61, 0x6e, 0x20, 0x65, - 0x72, 0x72, 0x6f, 0x72, 0x2e, 0x0a, 0x41, 0x6e, 0x20, 0x60, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, - 0x60, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x20, - 0x49, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x77, 0x69, 0x6c, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x2a, 0x05, 0x57, 0x72, 0x69, 0x74, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xfc, + 0x0c, 0x0a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x12, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, + 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbd, 0x0c, + 0x92, 0x41, 0x96, 0x0c, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, + 0x69, 0x70, 0x20, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x36, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x20, 0x69, 0x73, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x1a, 0xbe, 0x0b, 0x54, 0x68, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x71, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, + 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, + 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x0a, 0x41, 0x20, + 0x60, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, + 0x65, 0x73, 0x60, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, + 0x6c, 0x73, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, + 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, + 0x20, 0x6f, 0x6e, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x60, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, + 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x73, 0x2e, 0x0a, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, + 0x79, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x61, + 0x6e, 0x20, 0x60, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x60, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, - 0x65, 0x72, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x65, 0x61, 0x63, 0x68, 0x20, 0x77, 0x72, - 0x69, 0x74, 0x74, 0x65, 0x6e, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x28, 0x6e, 0x6f, 0x74, - 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x29, 0x20, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x69, - 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, - 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x61, + 0x65, 0x72, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, + 0x75, 0x74, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x60, 0x20, 0x69, + 0x73, 0x20, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, + 0x20, 0x49, 0x66, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, + 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x61, 0x67, + 0x61, 0x69, 0x6e, 0x73, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x49, 0x44, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, + 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, + 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x20, 0x49, 0x44, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x2e, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x23, - 0x23, 0x23, 0x20, 0x41, 0x64, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x73, 0x0a, 0x54, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x60, - 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x60, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, - 0x60, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x60, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x60, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, - 0x65, 0x74, 0x60, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, - 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, - 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, - 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x22, - 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, - 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, - 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, - 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, - 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, 0x50, 0x45, 0x43, 0x4e, 0x56, 0x41, - 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, - 0x60, 0x0a, 0x23, 0x23, 0x23, 0x20, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x69, 0x6e, 0x67, 0x20, 0x72, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x73, 0x0a, 0x54, 0x6f, 0x20, - 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, - 0x60, 0x20, 0x61, 0x73, 0x20, 0x61, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, - 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, - 0x20, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x0a, 0x60, - 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x64, 0x65, 0x6c, 0x65, - 0x74, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, - 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, - 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x22, 0x2c, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, - 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, - 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x2a, - 0x05, 0x57, 0x72, 0x69, 0x74, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, - 0x18, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0xfc, 0x0c, 0x0a, 0x05, 0x43, 0x68, - 0x65, 0x63, 0x6b, 0x12, 0x18, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbd, 0x0c, 0x92, 0x41, 0x96, 0x0c, 0x0a, - 0x14, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x51, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x36, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x77, 0x68, 0x65, - 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x63, 0x63, - 0x65, 0x73, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x1a, 0xbe, 0x0b, - 0x54, 0x68, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x41, 0x50, 0x49, 0x20, 0x71, 0x75, - 0x65, 0x72, 0x69, 0x65, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, - 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, - 0x6e, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x0a, 0x41, 0x20, 0x60, 0x63, 0x6f, 0x6e, 0x74, - 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x60, 0x20, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x62, - 0x65, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x6f, 0x6e, 0x65, 0x20, - 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x73, 0x60, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, - 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x6b, - 0x65, 0x79, 0x73, 0x2e, 0x0a, 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x6c, 0x73, - 0x6f, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x60, 0x61, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x5f, 0x69, 0x64, 0x60, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, - 0x79, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, - 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x20, 0x60, 0x74, - 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x60, 0x20, 0x69, 0x73, 0x20, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x6e, - 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, - 0x20, 0x62, 0x65, 0x20, 0x6d, 0x61, 0x64, 0x65, 0x20, 0x61, 0x67, 0x61, 0x69, 0x6e, 0x73, 0x74, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, - 0x49, 0x44, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, - 0x6c, 0x79, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, - 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x69, 0x64, - 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x70, 0x65, 0x72, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, - 0x6e, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, - 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x60, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x60, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, - 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x49, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x74, - 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, - 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x60, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, 0x60, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, - 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, - 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x0a, 0x60, - 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, - 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x2c, 0x0a, - 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x6d, - 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 0x6f, - 0x66, 0x66, 0x69, 0x63, 0x65, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x22, 0x0a, 0x7d, 0x0a, 0x60, - 0x60, 0x60, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x0a, 0x60, 0x60, - 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, - 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, - 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x3a, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, - 0x0a, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, - 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x3a, - 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, - 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x6d, 0x65, 0x6d, - 0x62, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, 0x6c, - 0x6f, 0x74, 0x3a, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, 0x22, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, - 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, - 0x22, 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, 0x50, 0x45, 0x43, 0x4e, 0x56, - 0x41, 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, 0x22, 0x0a, 0x7d, 0x0a, 0x60, - 0x60, 0x60, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x27, 0x73, 0x20, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x64, 0x65, 0x20, 0x60, 0x7b, 0x20, 0x22, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x22, 0x3a, - 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7d, 0x60, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, - 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x68, 0x69, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x7b, 0x20, 0x22, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x20, 0x7d, 0x60, 0x20, 0x69, - 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x6e, 0x27, 0x74, 0x2e, 0x2a, 0x05, - 0x43, 0x68, 0x65, 0x63, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, 0x3a, 0x01, 0x2a, 0x22, 0x18, - 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, - 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0xb9, 0x0e, 0x0a, 0x06, 0x45, 0x78, 0x70, - 0x61, 0x6e, 0x64, 0x12, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, - 0x2e, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, - 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x61, - 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xf7, 0x0d, 0x92, 0x41, 0xcf, - 0x0d, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, - 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x8e, 0x01, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, - 0x70, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x20, 0x74, 0x72, - 0x65, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x66, - 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, - 0x20, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x2e, 0x20, - 0x20, 0x55, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x72, 0x65, 0x61, 0x73, 0x6f, - 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x62, 0x75, - 0x67, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x1a, 0x9d, 0x0c, 0x54, 0x68, 0x65, 0x20, 0x45, - 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, - 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, - 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x72, + 0x65, 0x6c, 0x20, 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, + 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x0a, 0x54, 0x68, + 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x20, 0x60, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x60, 0x2e, 0x0a, 0x0a, + 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x49, 0x6e, 0x20, 0x6f, 0x72, + 0x64, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x69, 0x66, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x60, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, 0x60, 0x20, + 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, - 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, - 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x0a, 0x54, - 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x74, - 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x2f, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x72, 0x65, - 0x61, 0x64, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x62, 0x6f, 0x74, 0x68, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x63, - 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x73, - 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x2e, 0x0a, 0x42, - 0x6f, 0x64, 0x79, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x20, 0x60, - 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, - 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, 0x61, 0x72, 0x65, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, 0x2e, 0x0a, 0x54, 0x68, 0x65, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, - 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x77, 0x68, 0x6f, - 0x73, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x73, 0x2e, 0x20, 0x55, - 0x6e, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x73, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x69, 0x6e, - 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x54, 0x6f, - 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, - 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2c, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, - 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, - 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x0a, 0x60, 0x60, 0x60, - 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, - 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, - 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, - 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, - 0x56, 0x31, 0x37, 0x50, 0x45, 0x43, 0x4e, 0x56, 0x41, 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, - 0x35, 0x4e, 0x43, 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x46, - 0x47, 0x41, 0x27, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, - 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x20, - 0x74, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x73, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, 0x61, 0x64, 0x20, 0x61, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, - 0x20, 0x20, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, - 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x23, 0x72, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x6e, 0x69, 0x6f, 0x6e, - 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6e, 0x6f, 0x64, - 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, - 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x23, 0x72, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x6c, 0x65, 0x61, 0x66, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, - 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, + 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x20, 0x67, + 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, + 0x6e, 0x67, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x20, 0x74, 0x75, + 0x70, 0x6c, 0x65, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, + 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, + 0x6e, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x22, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x73, + 0x6c, 0x6f, 0x74, 0x3a, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x73, + 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x74, 0x68, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, + 0x6b, 0x20, 0x41, 0x50, 0x49, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, + 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x3a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, + 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, + 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, + 0x64, 0x67, 0x65, 0x74, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x63, 0x6f, + 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x22, + 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, + 0x65, 0x79, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x3a, 0x20, + 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x61, 0x6e, 0x6e, 0x65, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x6d, 0x65, 0x6d, 0x62, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x3a, 0x6f, 0x66, 0x66, 0x69, 0x63, 0x65, 0x5f, 0x68, + 0x6f, 0x75, 0x72, 0x73, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, + 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, + 0x50, 0x45, 0x43, 0x4e, 0x56, 0x41, 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, + 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x27, + 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x60, 0x7b, 0x20, 0x22, 0x61, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x7d, 0x60, 0x20, 0x69, 0x66, + 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x7b, 0x20, + 0x22, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x22, 0x3a, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, + 0x20, 0x7d, 0x60, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x69, 0x73, 0x6e, + 0x27, 0x74, 0x2e, 0x2a, 0x05, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1d, + 0x3a, 0x01, 0x2a, 0x22, 0x18, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x65, 0x63, 0x6b, 0x12, 0xb9, 0x0e, + 0x0a, 0x06, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x12, 0x19, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, + 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, + 0x2e, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0xf7, 0x0d, 0x92, 0x41, 0xcf, 0x0d, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x68, 0x69, 0x70, 0x20, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x8e, 0x01, 0x45, + 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x65, 0x74, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x2c, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, 0x77, 0x69, 0x6e, 0x67, 0x20, 0x75, 0x73, + 0x65, 0x72, 0x73, 0x65, 0x74, 0x20, 0x72, 0x65, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x72, 0x75, + 0x6c, 0x65, 0x73, 0x2e, 0x20, 0x20, 0x55, 0x73, 0x65, 0x66, 0x75, 0x6c, 0x20, 0x74, 0x6f, 0x20, + 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x20, 0x61, 0x62, 0x6f, 0x75, 0x74, 0x20, 0x61, 0x6e, 0x64, + 0x20, 0x64, 0x65, 0x62, 0x75, 0x67, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, + 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x1a, 0x9d, 0x0c, + 0x54, 0x68, 0x65, 0x20, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x75, + 0x73, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, + 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x63, 0x65, 0x72, 0x74, + 0x61, 0x69, 0x6e, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, + 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, + 0x69, 0x6e, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x2e, 0x0a, 0x54, 0x68, 0x69, 0x73, 0x20, 0x69, 0x73, 0x20, 0x64, 0x69, 0x66, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x74, 0x20, 0x66, 0x72, 0x6f, 0x6d, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, + 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x72, 0x65, 0x61, 0x64, 0x60, 0x20, 0x41, 0x50, 0x49, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, + 0x61, 0x6e, 0x64, 0x20, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x65, 0x74, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x65, 0x64, 0x2e, 0x0a, 0x42, 0x6f, 0x64, 0x79, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, + 0x65, 0x72, 0x73, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x74, 0x75, 0x70, 0x6c, + 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x2e, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x71, 0x75, 0x69, 0x72, 0x65, 0x64, + 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, + 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x74, 0x72, 0x65, + 0x65, 0x20, 0x77, 0x68, 0x6f, 0x73, 0x65, 0x20, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x63, 0x20, + 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, + 0x74, 0x73, 0x2e, 0x20, 0x55, 0x6e, 0x69, 0x6f, 0x6e, 0x2c, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, + 0x73, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x69, 0x66, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x20, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x20, + 0x61, 0x72, 0x65, 0x20, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x6d, 0x65, 0x64, 0x69, 0x61, 0x74, 0x65, 0x20, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, + 0x6c, 0x65, 0x0a, 0x54, 0x6f, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x6c, 0x6c, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x20, 0x72, 0x65, + 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, + 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2c, 0x20, 0x75, + 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x50, + 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6f, 0x6c, 0x6c, 0x6f, + 0x77, 0x69, 0x6e, 0x67, 0x20, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x3a, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, + 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x3a, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x7d, 0x2c, + 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, + 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, 0x50, 0x45, 0x43, 0x4e, 0x56, 0x41, 0x48, 0x58, + 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, + 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x27, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x61, 0x20, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x65, 0x74, 0x20, 0x74, 0x72, 0x65, 0x65, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x75, 0x73, 0x65, 0x72, 0x73, + 0x65, 0x74, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, 0x72, 0x65, + 0x61, 0x64, 0x20, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x2e, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, + 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x72, 0x65, 0x65, 0x22, 0x3a, 0x7b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x6f, 0x6f, 0x74, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x23, + 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x23, + 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, + 0x72, 0x73, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x73, 0x22, 0x3a, 0x5b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x3a, 0x62, 0x6f, 0x62, 0x22, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, + 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x23, 0x72, + 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x6c, 0x65, 0x61, 0x66, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x64, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, + 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, + 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x23, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, - 0x70, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, - 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x23, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, - 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x6c, 0x65, 0x61, 0x66, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x22, - 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x75, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x22, 0x3a, 0x22, 0x64, 0x6f, - 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, - 0x65, 0x74, 0x23, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x7d, - 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x65, - 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, - 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x60, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x60, 0x20, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x32, 0x30, 0x32, 0x31, 0x2d, - 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2e, 0x2a, 0x06, 0x45, 0x78, 0x70, 0x61, 0x6e, 0x64, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, 0x2f, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x65, 0x78, - 0x70, 0x61, 0x6e, 0x64, 0x12, 0x82, 0x0b, 0x0a, 0x17, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, - 0x12, 0x2a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x54, 0x68, 0x65, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x65, 0x72, 0x20, 0x63, 0x61, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x6e, 0x20, + 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x20, 0x41, 0x50, 0x49, 0x20, + 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x60, + 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, + 0x32, 0x30, 0x32, 0x31, 0x2d, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x60, 0x2e, 0x2a, 0x06, 0x45, + 0x78, 0x70, 0x61, 0x6e, 0x64, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1e, 0x3a, 0x01, 0x2a, 0x22, 0x19, + 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x65, 0x78, 0x70, 0x61, 0x6e, 0x64, 0x12, 0x82, 0x0b, 0x0a, 0x17, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8d, 0x0a, 0x92, 0x41, 0xda, 0x09, - 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x3a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, - 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x1a, 0xec, 0x08, 0x54, 0x68, 0x65, 0x20, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, - 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x66, 0x6f, - 0x72, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x2e, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x27, 0x73, 0x20, 0x72, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, - 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x6f, 0x66, 0x20, 0x61, - 0x6c, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x72, - 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, - 0x0a, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x41, 0x73, 0x73, - 0x75, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x27, 0x73, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, - 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, 0x74, 0x77, 0x69, 0x63, 0x65, - 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x68, 0x61, 0x76, 0x65, 0x20, - 0x62, 0x65, 0x65, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, - 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, - 0x20, 0x47, 0x45, 0x54, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, - 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x6c, - 0x6f, 0x6f, 0x6b, 0x73, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x3a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, - 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, - 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, 0x50, 0x45, - 0x43, 0x4e, 0x56, 0x41, 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, 0x22, 0x2c, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x34, 0x5a, - 0x57, 0x38, 0x46, 0x34, 0x41, 0x30, 0x37, 0x41, 0x4b, 0x51, 0x38, 0x52, 0x48, 0x53, 0x56, 0x47, - 0x39, 0x52, 0x57, 0x30, 0x34, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, - 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x3a, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, - 0x20, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x65, 0x79, 0x4a, - 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, 0x56, 0x54, 0x56, 0x46, 0x39, - 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, 0x39, 0x68, 0x64, 0x58, 0x52, - 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, 0x77, 0x69, 0x63, 0x32, 0x73, - 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, 0x46, 0x33, 0x4d, 0x57, 0x5a, - 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, 0x31, 0x4d, 0x64, 0x54, 0x64, - 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, 0x3d, 0x3d, 0x22, 0x0a, 0x7d, - 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, - 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x61, - 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x63, - 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x60, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, - 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, - 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, + 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x2a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, + 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8d, + 0x0a, 0x92, 0x41, 0xda, 0x09, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x3a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, + 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, + 0x72, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0xec, 0x08, 0x54, 0x68, 0x65, 0x20, 0x52, 0x65, + 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, + 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, 0x63, 0x65, 0x72, 0x74, 0x61, 0x69, 0x6e, + 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x27, + 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, + 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2c, 0x20, 0x73, 0x6f, + 0x72, 0x74, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x64, 0x65, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x72, 0x65, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x0a, 0x41, 0x73, 0x73, 0x75, 0x6d, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x27, 0x73, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x68, 0x61, 0x73, 0x20, + 0x62, 0x65, 0x65, 0x6e, 0x20, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x75, 0x72, 0x65, 0x64, 0x20, + 0x74, 0x77, 0x69, 0x63, 0x65, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x6c, + 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x68, 0x61, 0x76, 0x65, 0x20, 0x62, 0x65, 0x65, 0x6e, 0x20, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2c, + 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x47, 0x45, 0x54, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x20, + 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x73, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x3a, 0x0a, + 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, + 0x56, 0x31, 0x37, 0x50, 0x45, 0x43, 0x4e, 0x56, 0x41, 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, + 0x35, 0x4e, 0x43, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, - 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, 0x50, 0x45, 0x43, 0x4e, 0x56, 0x41, - 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, + 0x30, 0x31, 0x47, 0x34, 0x5a, 0x57, 0x38, 0x46, 0x34, 0x41, 0x30, 0x37, 0x41, 0x4b, 0x51, 0x38, + 0x52, 0x48, 0x53, 0x56, 0x47, 0x39, 0x52, 0x57, 0x30, 0x34, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x34, 0x5a, 0x57, 0x38, 0x46, 0x34, - 0x41, 0x30, 0x37, 0x41, 0x4b, 0x51, 0x38, 0x52, 0x48, 0x53, 0x56, 0x47, 0x39, 0x52, 0x57, 0x30, - 0x34, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x5f, - 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x2e, - 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x5d, 0x2c, 0x0a, - 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, - 0x0a, 0x2a, 0x17, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x29, - 0x12, 0x27, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x84, 0x0b, 0x0a, 0x16, 0x52, 0x65, - 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x29, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, + 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, + 0x20, 0x22, 0x65, 0x79, 0x4a, 0x77, 0x61, 0x79, 0x49, 0x36, 0x49, 0x6b, 0x78, 0x42, 0x56, 0x45, + 0x56, 0x54, 0x56, 0x46, 0x39, 0x4f, 0x55, 0x30, 0x4e, 0x50, 0x54, 0x6b, 0x5a, 0x4a, 0x52, 0x31, + 0x39, 0x68, 0x64, 0x58, 0x52, 0x6f, 0x4d, 0x48, 0x4e, 0x30, 0x62, 0x33, 0x4a, 0x6c, 0x49, 0x69, + 0x77, 0x69, 0x63, 0x32, 0x73, 0x69, 0x4f, 0x69, 0x49, 0x78, 0x65, 0x6d, 0x31, 0x71, 0x62, 0x58, + 0x46, 0x33, 0x4d, 0x57, 0x5a, 0x4c, 0x5a, 0x45, 0x78, 0x54, 0x63, 0x55, 0x6f, 0x79, 0x4e, 0x30, + 0x31, 0x4d, 0x64, 0x54, 0x64, 0x71, 0x54, 0x6a, 0x68, 0x30, 0x63, 0x57, 0x67, 0x69, 0x66, 0x51, + 0x3d, 0x3d, 0x22, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, + 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x73, 0x20, 0x61, 0x76, 0x61, 0x69, 0x6c, 0x61, 0x62, 0x6c, 0x65, 0x2c, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x60, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x60, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x0a, 0x60, 0x60, 0x60, 0x6a, + 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x22, 0x3a, 0x20, + 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, + 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, 0x50, + 0x45, 0x43, 0x4e, 0x56, 0x41, 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, 0x22, + 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, + 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x34, + 0x5a, 0x57, 0x38, 0x46, 0x34, 0x41, 0x30, 0x37, 0x41, 0x4b, 0x51, 0x38, 0x52, 0x48, 0x53, 0x56, + 0x47, 0x39, 0x52, 0x57, 0x30, 0x34, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x22, 0x3a, 0x20, 0x5b, 0x2e, 0x2e, 0x2e, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, + 0x20, 0x20, 0x5d, 0x2c, 0x0a, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x22, 0x3a, 0x20, 0x22, 0x22, 0x0a, + 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x2a, 0x17, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x29, 0x12, 0x27, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, + 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x84, + 0x0b, 0x0a, 0x16, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x29, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, - 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x92, 0x0a, 0x92, 0x41, - 0xda, 0x09, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x35, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, - 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, - 0xf2, 0x08, 0x54, 0x68, 0x65, 0x20, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x41, 0x50, 0x49, - 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, - 0x62, 0x79, 0x20, 0x69, 0x74, 0x73, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, - 0x72, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x2e, 0x0a, - 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x54, 0x6f, 0x20, 0x72, - 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x49, 0x44, 0x20, 0x60, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, - 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, - 0x58, 0x31, 0x4a, 0x60, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x47, 0x45, 0x54, - 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, 0x20, 0x41, 0x50, 0x49, 0x20, - 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, - 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, - 0x60, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x69, 0x64, 0x60, 0x20, 0x70, 0x61, - 0x74, 0x68, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x2e, 0x20, 0x20, 0x54, - 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, - 0x72, 0x6e, 0x3a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, - 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x69, 0x64, 0x22, - 0x3a, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, - 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x22, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, - 0x75, 0x73, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x22, - 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x22, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, - 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, - 0x3a, 0x22, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, - 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x7d, - 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x49, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x62, - 0x6f, 0x76, 0x65, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x2c, 0x20, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x32, 0x20, 0x74, 0x79, 0x70, 0x65, 0x73, 0x20, 0x28, - 0x60, 0x75, 0x73, 0x65, 0x72, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, - 0x6d, 0x65, 0x6e, 0x74, 0x60, 0x29, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x60, 0x64, 0x6f, 0x63, - 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x60, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x68, 0x61, 0x73, 0x20, - 0x32, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x28, 0x60, 0x77, 0x72, - 0x69, 0x74, 0x65, 0x72, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x72, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x60, 0x29, 0x2e, 0x2a, 0x16, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x7d, - 0x12, 0xf9, 0x0a, 0x0a, 0x17, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x2a, 0x2e, 0x6f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, + 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x92, 0x0a, 0x92, 0x41, 0xda, 0x09, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x35, 0x52, + 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, + 0x61, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6e, + 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0xf2, 0x08, 0x54, 0x68, 0x65, 0x20, 0x52, 0x65, 0x61, 0x64, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, - 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, - 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, 0x0a, 0x92, 0x41, 0xce, 0x09, 0x0a, 0x14, 0x41, 0x75, - 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x73, 0x12, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, + 0x6c, 0x20, 0x41, 0x50, 0x49, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0xa8, 0x08, 0x54, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, - 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x61, 0x64, 0x64, 0x20, - 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x61, 0x20, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x0a, 0x45, 0x61, 0x63, 0x68, 0x20, 0x69, 0x74, 0x65, 0x6d, 0x20, - 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, - 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x60, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, - 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, - 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x60, - 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x60, - 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, - 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, - 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x27, 0x73, 0x20, 0x49, 0x44, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, - 0x69, 0x64, 0x60, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x20, 0x45, - 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x54, 0x6f, 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x6e, + 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x62, 0x79, 0x20, 0x69, 0x74, 0x73, 0x20, 0x69, 0x64, 0x65, 0x6e, + 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x2e, 0x0a, 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x0a, 0x54, 0x6f, 0x20, 0x72, 0x65, 0x74, 0x72, 0x69, 0x65, 0x76, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x75, 0x73, 0x65, 0x72, 0x60, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x60, 0x20, - 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x50, 0x4f, 0x53, 0x54, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, - 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, - 0x64, 0x79, 0x3a, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, 0x0a, 0x7b, 0x0a, 0x20, - 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x0a, - 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, - 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x6e, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x7b, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, - 0x69, 0x6c, 0x64, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, - 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x49, 0x44, 0x20, 0x60, 0x30, 0x31, + 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, + 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, 0x4a, 0x60, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x47, 0x45, 0x54, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x62, 0x79, 0x20, 0x49, 0x44, + 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, 0x30, 0x31, 0x47, 0x35, 0x4a, + 0x41, 0x56, 0x4a, 0x34, 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, + 0x53, 0x37, 0x58, 0x31, 0x4a, 0x60, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x69, + 0x64, 0x60, 0x20, 0x70, 0x61, 0x74, 0x68, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x2e, 0x20, 0x20, 0x54, 0x68, 0x65, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x3a, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, 0x6e, + 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x69, 0x64, 0x22, 0x3a, 0x22, 0x30, 0x31, 0x47, 0x35, 0x4a, 0x41, 0x56, 0x4a, 0x34, + 0x31, 0x54, 0x34, 0x39, 0x45, 0x39, 0x54, 0x54, 0x33, 0x53, 0x4b, 0x56, 0x53, 0x37, 0x58, 0x31, + 0x4a, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, + 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, + 0x70, 0x65, 0x22, 0x3a, 0x22, 0x75, 0x73, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x64, 0x6f, 0x63, 0x75, + 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3a, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, + 0x6e, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3a, 0x5b, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x55, 0x73, 0x65, 0x72, 0x73, - 0x65, 0x74, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x22, - 0x3a, 0x22, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x3a, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, - 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, - 0x72, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, - 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, - 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, - 0x0a, 0x20, 0x20, 0x5d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x46, - 0x47, 0x41, 0x27, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, - 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x69, - 0x6c, 0x6c, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x0a, 0x60, 0x60, - 0x60, 0x0a, 0x7b, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, 0x3a, 0x20, 0x22, 0x30, 0x31, - 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, 0x50, 0x45, 0x43, 0x4e, 0x56, 0x41, 0x48, 0x58, - 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, 0x22, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x2a, - 0x17, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4a, 0x50, 0x0a, 0x03, 0x32, 0x30, 0x31, 0x12, - 0x49, 0x0a, 0x16, 0x41, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x20, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x12, 0x2f, 0x0a, 0x2d, 0x1a, 0x2b, 0x2e, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, 0x55, 0x73, + 0x65, 0x72, 0x73, 0x65, 0x74, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, + 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x72, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x5d, 0x0a, 0x20, 0x20, 0x7d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x49, 0x6e, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x61, 0x62, 0x6f, 0x76, 0x65, 0x20, 0x65, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x2c, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x32, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x20, 0x28, 0x60, 0x75, 0x73, 0x65, 0x72, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x60, 0x29, 0x2e, 0x20, 0x54, 0x68, 0x65, + 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x60, 0x20, 0x74, 0x79, 0x70, 0x65, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x32, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x28, 0x60, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, + 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x60, 0x29, 0x2e, 0x2a, 0x16, 0x52, 0x65, 0x61, 0x64, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2e, 0x12, 0x2c, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, + 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, + 0x2f, 0x7b, 0x69, 0x64, 0x7d, 0x12, 0xf9, 0x0a, 0x0a, 0x17, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x12, 0x2a, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, + 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, - 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0xc8, 0x04, 0x0a, - 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x12, 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, - 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, - 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, 0x03, 0x92, 0x41, 0xa6, 0x03, - 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2f, 0x55, 0x70, - 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, - 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x49, 0x44, 0x1a, 0x8b, 0x02, - 0x54, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x75, 0x70, 0x73, - 0x65, 0x72, 0x74, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x69, 0x64, - 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x6f, 0x6e, 0x65, 0x73, - 0x2e, 0x20, 0x41, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, - 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, - 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x74, 0x75, 0x70, 0x6c, - 0x65, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, - 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x41, 0x50, 0x49, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, - 0x20, 0x6f, 0x72, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2e, 0x20, 0x2a, 0x0f, 0x57, 0x72, 0x69, - 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4a, 0x48, 0x0a, 0x03, - 0x32, 0x30, 0x34, 0x12, 0x41, 0x0a, 0x16, 0x41, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, - 0x66, 0x75, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x12, 0x27, 0x0a, - 0x25, 0x1a, 0x23, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, - 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x3a, 0x01, 0x2a, 0x1a, - 0x36, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xed, 0x03, 0x0a, 0x0e, 0x52, 0x65, 0x61, 0x64, - 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x21, 0x2e, 0x6f, 0x70, 0x65, - 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x73, 0x73, 0x65, - 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x22, 0x2e, - 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x41, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x93, 0x03, 0x92, 0x41, 0xd1, 0x02, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x52, 0x65, 0x61, 0x64, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x75, 0x74, - 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x20, 0x49, 0x44, 0x1a, 0x83, 0x02, 0x54, 0x68, 0x65, 0x20, 0x52, 0x65, 0x61, 0x64, 0x41, 0x73, + 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x84, 0x0a, 0x92, 0x41, 0xce, + 0x09, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x20, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, + 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x1a, 0xa8, 0x08, 0x54, 0x68, 0x65, 0x20, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, + 0x20, 0x61, 0x64, 0x64, 0x20, 0x61, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x74, + 0x6f, 0x20, 0x61, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x0a, 0x45, 0x61, 0x63, 0x68, 0x20, + 0x69, 0x74, 0x65, 0x6d, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x74, 0x79, 0x70, + 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x60, 0x20, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x20, 0x69, 0x73, 0x20, 0x61, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, + 0x65, 0x66, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x61, 0x73, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x69, + 0x65, 0x6c, 0x64, 0x20, 0x60, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x60, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x27, 0x73, 0x20, 0x49, 0x44, 0x20, 0x69, 0x6e, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x60, 0x69, 0x64, 0x60, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x2e, 0x0a, + 0x0a, 0x23, 0x23, 0x20, 0x45, 0x78, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x0a, 0x54, 0x6f, 0x20, 0x61, + 0x64, 0x64, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x60, + 0x75, 0x73, 0x65, 0x72, 0x60, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x60, 0x64, 0x6f, 0x63, 0x75, 0x6d, + 0x65, 0x6e, 0x74, 0x60, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x64, 0x65, 0x66, 0x69, 0x6e, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2c, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x50, 0x4f, 0x53, 0x54, + 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, + 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x3a, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x6a, 0x73, 0x6f, + 0x6e, 0x0a, 0x7b, 0x0a, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x64, 0x65, 0x66, 0x69, + 0x6e, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7b, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, 0x75, + 0x73, 0x65, 0x72, 0x22, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x79, 0x70, 0x65, 0x22, 0x3a, 0x22, + 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x22, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x3a, 0x7b, 0x0a, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x61, 0x64, 0x65, 0x72, 0x22, 0x3a, + 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x75, 0x6e, 0x69, + 0x6f, 0x6e, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x22, 0x63, 0x68, 0x69, 0x6c, 0x64, 0x22, 0x3a, 0x5b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x68, 0x69, + 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x64, + 0x55, 0x73, 0x65, 0x72, 0x73, 0x65, 0x74, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x6f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x22, 0x3a, 0x22, 0x22, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3a, 0x22, 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x5d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x2c, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x22, + 0x77, 0x72, 0x69, 0x74, 0x65, 0x72, 0x22, 0x3a, 0x7b, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x22, 0x74, 0x68, 0x69, 0x73, 0x22, 0x3a, 0x7b, 0x7d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x7d, 0x0a, 0x20, 0x20, 0x5d, 0x0a, 0x7d, 0x0a, 0x60, 0x60, 0x60, 0x0a, + 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x27, 0x73, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x64, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x2c, 0x20, 0x77, 0x68, 0x69, + 0x63, 0x68, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x6c, 0x6f, 0x6f, 0x6b, 0x20, 0x6c, 0x69, 0x6b, + 0x65, 0x20, 0x0a, 0x60, 0x60, 0x60, 0x0a, 0x7b, 0x22, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x22, + 0x3a, 0x20, 0x22, 0x30, 0x31, 0x47, 0x35, 0x30, 0x51, 0x56, 0x56, 0x31, 0x37, 0x50, 0x45, 0x43, + 0x4e, 0x56, 0x41, 0x48, 0x58, 0x31, 0x47, 0x47, 0x34, 0x59, 0x35, 0x4e, 0x43, 0x22, 0x7d, 0x0a, + 0x60, 0x60, 0x60, 0x0a, 0x2a, 0x17, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x4a, 0x50, 0x0a, + 0x03, 0x32, 0x30, 0x31, 0x12, 0x49, 0x0a, 0x16, 0x41, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, + 0x73, 0x66, 0x75, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x12, 0x2f, + 0x0a, 0x2d, 0x1a, 0x2b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x3a, 0x01, 0x2a, 0x22, 0x27, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2d, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x12, 0xc8, 0x04, 0x0a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, + 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xeb, + 0x03, 0x92, 0x41, 0xa6, 0x03, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x12, 0x2f, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, + 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, + 0x49, 0x44, 0x1a, 0x8b, 0x02, 0x54, 0x68, 0x65, 0x20, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, - 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2c, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x20, - 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x69, 0x64, 0x2c, 0x20, 0x61, 0x6c, - 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x2e, 0x20, - 0x41, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, - 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, - 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, - 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x70, - 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, 0x20, 0x77, 0x68, 0x65, 0x74, - 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, - 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x41, 0x50, 0x49, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x20, 0x77, 0x69, - 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x6f, - 0x72, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2e, 0x20, 0x2a, 0x0e, 0x52, 0x65, 0x61, 0x64, 0x41, - 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, - 0x36, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, - 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x86, 0x06, 0x0a, 0x0b, 0x52, 0x65, 0x61, 0x64, - 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, - 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, - 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb5, 0x05, 0x92, 0x41, 0x8f, 0x05, 0x0a, - 0x13, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x54, 0x75, - 0x70, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x6c, - 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, - 0x75, 0x70, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x1a, 0xc2, 0x04, 0x54, - 0x68, 0x65, 0x20, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x41, - 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x61, - 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x20, 0x28, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, - 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, - 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x20, 0x67, 0x69, - 0x76, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x73, 0x6f, 0x72, 0x74, 0x65, - 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x20, 0x74, - 0x69, 0x6d, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x20, 0x61, + 0x6c, 0x20, 0x75, 0x70, 0x73, 0x65, 0x72, 0x74, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x61, 0x73, 0x73, + 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, 0x6e, 0x20, 0x61, + 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x20, 0x69, 0x64, 0x2c, 0x20, 0x6f, 0x72, 0x20, 0x6f, 0x76, 0x65, 0x72, 0x77, 0x72, + 0x69, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x20, 0x6f, 0x6e, 0x65, 0x73, 0x2e, 0x20, 0x41, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, + 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, + 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6f, 0x66, 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x63, 0x61, 0x6c, + 0x6c, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x41, + 0x50, 0x49, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, + 0x20, 0x6b, 0x65, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, + 0x20, 0x74, 0x72, 0x75, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2e, 0x20, + 0x2a, 0x0f, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x4a, 0x48, 0x0a, 0x03, 0x32, 0x30, 0x34, 0x12, 0x41, 0x0a, 0x16, 0x41, 0x20, 0x73, 0x75, + 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x2e, 0x12, 0x27, 0x0a, 0x25, 0x1a, 0x23, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x57, 0x72, 0x69, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x3b, 0x3a, 0x01, 0x2a, 0x1a, 0x36, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xed, 0x03, 0x0a, + 0x0e, 0x52, 0x65, 0x61, 0x64, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x21, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, + 0x64, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x22, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, + 0x52, 0x65, 0x61, 0x64, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x93, 0x03, 0x92, 0x41, 0xd1, 0x02, 0x0a, 0x0a, 0x41, + 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x52, 0x65, 0x61, 0x64, 0x20, + 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x61, + 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x49, 0x44, 0x1a, 0x83, 0x02, 0x54, 0x68, 0x65, 0x20, 0x52, + 0x65, 0x61, 0x64, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x41, 0x50, + 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x2c, 0x20, 0x66, + 0x6f, 0x72, 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x69, + 0x64, 0x2c, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x64, 0x20, 0x66, 0x6f, 0x72, + 0x20, 0x69, 0x74, 0x2e, 0x20, 0x41, 0x6e, 0x20, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x69, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x74, + 0x68, 0x61, 0x74, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x74, + 0x75, 0x70, 0x6c, 0x65, 0x20, 0x6b, 0x65, 0x79, 0x2c, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6f, 0x66, + 0x20, 0x77, 0x68, 0x65, 0x74, 0x68, 0x65, 0x72, 0x20, 0x61, 0x20, 0x63, 0x61, 0x6c, 0x6c, 0x20, + 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x20, 0x41, 0x50, 0x49, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x6b, + 0x65, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x20, 0x74, + 0x72, 0x75, 0x65, 0x20, 0x6f, 0x72, 0x20, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x2e, 0x20, 0x2a, 0x0e, + 0x52, 0x65, 0x61, 0x64, 0x41, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x61, 0x73, 0x73, 0x65, 0x72, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0x86, 0x06, 0x0a, + 0x0b, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0x1e, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, + 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb5, 0x05, + 0x92, 0x41, 0x8f, 0x05, 0x0a, 0x13, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, + 0x69, 0x70, 0x20, 0x54, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x12, 0x26, 0x52, 0x65, 0x74, 0x75, 0x72, + 0x6e, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, + 0x74, 0x68, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, + 0x73, 0x1a, 0xc2, 0x04, 0x54, 0x68, 0x65, 0x20, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x72, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x20, 0x61, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x28, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x20, 0x61, 0x6e, 0x64, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x29, 0x20, + 0x74, 0x68, 0x61, 0x74, 0x20, 0x6f, 0x63, 0x63, 0x75, 0x72, 0x72, 0x65, 0x64, 0x20, 0x69, 0x6e, + 0x20, 0x61, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2c, 0x20, + 0x73, 0x6f, 0x72, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x61, 0x73, 0x63, 0x65, 0x6e, 0x64, + 0x69, 0x6e, 0x67, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x69, 0x6e, 0x63, 0x6c, + 0x75, 0x64, 0x65, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x6e, 0x65, 0x78, 0x74, 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x73, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x61, 0x66, + 0x74, 0x65, 0x72, 0x20, 0x74, 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, - 0x6b, 0x65, 0x6e, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x69, 0x73, 0x20, 0x75, 0x73, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6e, 0x65, 0x78, 0x74, - 0x20, 0x73, 0x65, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x2e, - 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, - 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x61, 0x66, 0x74, 0x65, 0x72, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x64, 0x65, 0x64, 0x20, 0x63, 0x6f, 0x6e, 0x74, - 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x2c, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, - 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, - 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x69, 0x74, 0x20, - 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x77, 0x68, 0x65, 0x6e, 0x20, - 0x6e, 0x65, 0x77, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x61, 0x72, 0x65, 0x20, - 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x6e, 0x65, 0x76, 0x65, 0x72, 0x20, 0x68, 0x61, 0x64, - 0x20, 0x61, 0x6e, 0x79, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x64, 0x64, 0x65, - 0x64, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, - 0x69, 0x73, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, - 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x0a, 0x59, 0x6f, 0x75, 0x20, 0x63, 0x61, 0x6e, 0x20, - 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x74, 0x79, 0x70, 0x65, 0x60, 0x20, 0x70, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x6f, 0x6e, 0x6c, 0x79, - 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, - 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x20, 0x74, - 0x68, 0x61, 0x74, 0x20, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, - 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x79, 0x70, 0x65, 0x2e, - 0x0a, 0x2a, 0x0b, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, - 0x12, 0xbb, 0x02, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, - 0x12, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x6b, 0x65, 0x6e, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x61, 0x6d, 0x65, 0x20, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x6f, 0x72, 0x64, 0x65, 0x72, 0x20, 0x66, 0x6f, + 0x72, 0x20, 0x69, 0x74, 0x20, 0x74, 0x6f, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, + 0x77, 0x68, 0x65, 0x6e, 0x20, 0x6e, 0x65, 0x77, 0x20, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x73, + 0x20, 0x61, 0x72, 0x65, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x65, 0x64, 0x2e, 0x20, 0x49, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x6e, 0x65, 0x76, 0x65, + 0x72, 0x20, 0x68, 0x61, 0x64, 0x20, 0x61, 0x6e, 0x79, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, + 0x20, 0x61, 0x64, 0x64, 0x65, 0x64, 0x20, 0x6f, 0x72, 0x20, 0x72, 0x65, 0x6d, 0x6f, 0x76, 0x65, + 0x64, 0x2c, 0x20, 0x74, 0x68, 0x69, 0x73, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x2e, 0x0a, 0x59, 0x6f, 0x75, + 0x20, 0x63, 0x61, 0x6e, 0x20, 0x75, 0x73, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x60, 0x74, 0x79, + 0x70, 0x65, 0x60, 0x20, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x20, 0x74, 0x6f, + 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x67, 0x65, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x69, + 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x20, 0x63, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x61, 0x66, 0x66, 0x65, 0x63, 0x74, 0x20, + 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, + 0x74, 0x79, 0x70, 0x65, 0x2e, 0x0a, 0x2a, 0x0b, 0x52, 0x65, 0x61, 0x64, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x1c, 0x12, 0x1a, 0x2f, 0x73, 0x74, 0x6f, 0x72, + 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x63, 0x68, + 0x61, 0x6e, 0x67, 0x65, 0x73, 0x12, 0xbb, 0x02, 0x0a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, + 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xea, 0x01, 0x92, 0x41, 0xd4, 0x01, 0x0a, 0x06, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, + 0x75, 0x6e, 0x69, 0x71, 0x75, 0x65, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x2a, 0x0b, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4a, 0x44, 0x0a, 0x03, 0x32, + 0x30, 0x31, 0x12, 0x3d, 0x0a, 0x16, 0x41, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, + 0x75, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x12, 0x23, 0x0a, 0x21, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0xea, 0x01, 0x92, 0x41, 0xd4, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, - 0x12, 0x0e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x1a, 0x67, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x75, 0x6e, 0x69, 0x71, 0x75, - 0x65, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, - 0x77, 0x68, 0x69, 0x63, 0x68, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, - 0x20, 0x61, 0x6e, 0x64, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, - 0x70, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x2a, 0x0b, 0x43, 0x72, 0x65, 0x61, 0x74, - 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4a, 0x44, 0x0a, 0x03, 0x32, 0x30, 0x31, 0x12, 0x3d, 0x0a, - 0x16, 0x41, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x20, 0x72, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x12, 0x23, 0x0a, 0x21, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, - 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x8e, - 0x02, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x1e, - 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, - 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xbd, 0x01, 0x92, 0x41, 0x87, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x0e, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x1a, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x65, 0x78, 0x69, 0x73, 0x74, - 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x2a, 0x0b, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4a, 0x44, 0x0a, 0x03, 0x32, 0x30, 0x30, 0x12, 0x3d, - 0x0a, 0x16, 0x41, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x20, 0x72, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x12, 0x23, 0x0a, 0x21, 0x1a, 0x1f, 0x2e, 0x6f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0xfa, 0xd2, 0xe4, - 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x55, 0x4e, 0x49, 0x4d, 0x50, 0x4c, 0x45, 0x4d, 0x45, 0x4e, 0x54, - 0x45, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, 0x32, 0x12, 0x2f, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, - 0xd2, 0x02, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, - 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x81, 0x02, 0x92, 0x41, 0xe3, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, - 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x1a, - 0x76, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x46, - 0x47, 0x41, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x20, 0x54, 0x68, 0x69, 0x73, 0x20, 0x64, - 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, - 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x6f, - 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x2a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x4a, 0x44, 0x0a, 0x03, 0x32, 0x30, 0x34, 0x12, 0x3d, 0x0a, 0x16, 0x41, - 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x12, 0x23, 0x0a, 0x21, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, - 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, - 0x2a, 0x12, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xaf, 0x01, 0x0a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, - 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x47, - 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, - 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x68, 0x92, 0x41, - 0x4b, 0x0a, 0x06, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x0b, 0x47, 0x65, 0x74, 0x20, 0x61, - 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x2a, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, - 0x61, 0x6e, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x20, 0x62, 0x79, 0x20, 0x69, 0x74, 0x73, 0x20, 0x69, 0x64, 0x65, 0x6e, 0x74, 0x69, 0x66, 0x69, - 0x65, 0x72, 0x2a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x14, 0x12, 0x12, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xa9, 0x02, 0x0a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x53, - 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, - 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x01, 0x92, 0x41, 0xc8, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x73, 0x12, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x73, 0x74, - 0x6f, 0x72, 0x65, 0x73, 0x1a, 0xa0, 0x01, 0x52, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, - 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, - 0x6f, 0x66, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, - 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x74, 0x6f, 0x20, 0x67, 0x65, - 0x74, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x20, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x73, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x69, 0x6e, 0x75, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, 0x77, 0x69, 0x6c, 0x6c, - 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x69, 0x66, 0x20, 0x74, 0x68, 0x65, - 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, 0x6f, 0x72, 0x65, 0x20, 0x73, - 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2e, 0x0a, 0x2a, 0x0a, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, 0x2f, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x73, 0x12, 0x80, 0x05, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x26, 0x2e, 0x6f, 0x70, 0x65, - 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, - 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x95, 0x04, 0x92, 0x41, - 0xde, 0x03, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, - 0x20, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x55, 0x5b, 0x45, 0x58, 0x50, 0x45, 0x52, - 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x41, 0x4c, 0x5d, 0x20, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x20, - 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, 0x68, - 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, - 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x1a, - 0xd9, 0x02, 0x54, 0x68, 0x65, 0x20, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x20, 0x4c, - 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, 0x69, - 0x73, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x73, 0x69, 0x6d, 0x69, 0x6c, 0x61, 0x72, 0x20, 0x74, - 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, - 0x74, 0x77, 0x6f, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x3a, - 0x20, 0x0a, 0x31, 0x2e, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x65, 0x61, 0x64, 0x20, 0x6f, 0x66, 0x20, - 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, - 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x62, 0x65, 0x66, 0x6f, 0x72, 0x65, 0x20, 0x72, 0x65, - 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x73, 0x20, 0x74, - 0x68, 0x65, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x63, 0x6c, 0x69, 0x65, 0x6e, - 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, 0x72, 0x65, 0x20, 0x63, 0x6f, - 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x0a, 0x32, 0x2e, 0x20, 0x54, 0x68, 0x65, - 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x72, 0x65, 0x73, 0x75, 0x6c, - 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, 0x20, 0x69, 0x73, 0x20, 0x6f, - 0x6e, 0x6c, 0x79, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, - 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, - 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x46, - 0x47, 0x41, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x53, 0x5f, - 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x2e, 0x20, 0x0a, 0x2a, 0x13, 0x53, 0x74, 0x72, + 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x0c, 0x3a, 0x01, 0x2a, 0x22, 0x07, 0x2f, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x73, 0x12, 0x8e, 0x02, 0x0a, 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x12, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, + 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xbd, 0x01, 0x92, 0x41, 0x87, 0x01, 0x0a, 0x06, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x73, 0x12, 0x0e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, 0x74, + 0x6f, 0x72, 0x65, 0x1a, 0x1a, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x20, + 0x65, 0x78, 0x69, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x2a, + 0x0b, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4a, 0x44, 0x0a, 0x03, + 0x32, 0x30, 0x30, 0x12, 0x3d, 0x0a, 0x16, 0x41, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x66, 0x75, 0x6c, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x12, 0x23, 0x0a, + 0x21, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0xfa, 0xd2, 0xe4, 0x93, 0x02, 0x0f, 0x12, 0x0d, 0x55, 0x4e, 0x49, 0x4d, 0x50, 0x4c, + 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x45, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x17, 0x3a, 0x01, 0x2a, + 0x32, 0x12, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, + 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xd2, 0x02, 0x0a, 0x0b, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, + 0x74, 0x6f, 0x72, 0x65, 0x12, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, + 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x81, 0x02, 0x92, 0x41, 0xe3, 0x01, 0x0a, 0x06, 0x53, 0x74, + 0x6f, 0x72, 0x65, 0x73, 0x12, 0x0e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x20, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x76, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x20, 0x61, 0x6e, 0x20, + 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2e, 0x20, 0x54, + 0x68, 0x69, 0x73, 0x20, 0x64, 0x6f, 0x65, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x64, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x64, 0x61, 0x74, 0x61, 0x20, 0x61, 0x73, 0x73, + 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x64, 0x20, 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, + 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x2c, 0x20, 0x6c, 0x69, 0x6b, 0x65, 0x20, 0x74, 0x75, 0x70, + 0x6c, 0x65, 0x73, 0x20, 0x6f, 0x72, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x2e, 0x2a, 0x0b, 0x44, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x4a, 0x44, 0x0a, 0x03, 0x32, 0x30, 0x34, + 0x12, 0x3d, 0x0a, 0x16, 0x41, 0x20, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x66, 0x75, 0x6c, + 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x12, 0x23, 0x0a, 0x21, 0x1a, 0x1f, + 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x2a, 0x12, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xaf, 0x01, 0x0a, 0x08, 0x47, 0x65, + 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x12, 0x1b, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, + 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, + 0x2e, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x68, 0x92, 0x41, 0x4b, 0x0a, 0x06, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x0b, + 0x47, 0x65, 0x74, 0x20, 0x61, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x1a, 0x2a, 0x52, 0x65, 0x74, + 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x6e, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x62, 0x79, 0x20, 0x69, 0x74, 0x73, 0x20, 0x69, 0x64, 0x65, + 0x6e, 0x74, 0x69, 0x66, 0x69, 0x65, 0x72, 0x2a, 0x08, 0x47, 0x65, 0x74, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x14, 0x12, 0x12, 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, + 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xa9, 0x02, 0x0a, 0x0a, + 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x1d, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, + 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xdb, 0x01, 0x92, 0x41, 0xc8, 0x01, + 0x0a, 0x06, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x1a, 0xa0, 0x01, 0x52, 0x65, 0x74, 0x75, + 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x65, 0x64, 0x20, + 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x4f, 0x70, 0x65, 0x6e, 0x46, 0x47, 0x41, 0x20, + 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x61, 0x20, 0x63, 0x6f, 0x6e, + 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x20, + 0x74, 0x6f, 0x20, 0x67, 0x65, 0x74, 0x20, 0x61, 0x64, 0x64, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x61, + 0x6c, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x63, 0x6f, + 0x6e, 0x74, 0x69, 0x6e, 0x75, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x65, 0x6d, 0x70, 0x74, 0x79, 0x20, 0x69, + 0x66, 0x20, 0x74, 0x68, 0x65, 0x72, 0x65, 0x20, 0x61, 0x72, 0x65, 0x20, 0x6e, 0x6f, 0x20, 0x6d, + 0x6f, 0x72, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2e, 0x0a, 0x2a, 0x0a, 0x4c, 0x69, + 0x73, 0x74, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x09, 0x12, 0x07, + 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x12, 0x80, 0x05, 0x0a, 0x13, 0x53, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, + 0x26, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, 0x2f, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x73, 0x74, - 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x2d, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6f, 0x62, 0x6a, 0x65, - 0x63, 0x74, 0x73, 0x30, 0x01, 0x12, 0xf2, 0x08, 0x0a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, - 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa1, 0x08, 0x92, 0x41, 0xf3, 0x07, 0x0a, 0x14, 0x52, - 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x51, 0x75, 0x65, 0x72, - 0x69, 0x65, 0x73, 0x12, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, - 0x65, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x1a, 0x87, 0x07, 0x54, 0x68, 0x65, 0x20, - 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x41, 0x50, 0x49, 0x20, - 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, 0x69, 0x73, 0x74, 0x20, 0x6f, - 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, - 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, - 0x79, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, - 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x77, 0x69, 0x74, 0x68, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x61, 0x63, 0x68, 0x69, 0x65, 0x76, - 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x62, 0x6f, 0x74, 0x68, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x20, 0x61, 0x6e, - 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x61, 0x72, 0x65, 0x20, 0x75, 0x73, - 0x65, 0x64, 0x2e, 0x0a, 0x41, 0x6e, 0x20, 0x60, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x60, 0x20, - 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, - 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, 0x79, 0x2e, 0x20, 0x49, 0x66, - 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, - 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, + 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, + 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x95, 0x04, 0x92, 0x41, 0xde, 0x03, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x68, 0x69, 0x70, 0x20, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x55, 0x5b, + 0x45, 0x58, 0x50, 0x45, 0x52, 0x49, 0x4d, 0x45, 0x4e, 0x54, 0x41, 0x4c, 0x5d, 0x20, 0x53, 0x74, + 0x72, 0x65, 0x61, 0x6d, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x79, + 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, + 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x1a, 0xd9, 0x02, 0x54, 0x68, 0x65, 0x20, 0x53, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x65, 0x64, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, + 0x41, 0x50, 0x49, 0x20, 0x69, 0x73, 0x20, 0x76, 0x65, 0x72, 0x79, 0x20, 0x73, 0x69, 0x6d, 0x69, + 0x6c, 0x61, 0x72, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, 0x74, 0x68, 0x65, 0x20, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x41, 0x50, 0x49, 0x2c, 0x20, + 0x77, 0x69, 0x74, 0x68, 0x20, 0x74, 0x77, 0x6f, 0x20, 0x64, 0x69, 0x66, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x3a, 0x20, 0x0a, 0x31, 0x2e, 0x20, 0x49, 0x6e, 0x73, 0x74, 0x65, 0x61, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x69, 0x6e, 0x67, 0x20, + 0x61, 0x6c, 0x6c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x62, 0x65, 0x66, 0x6f, + 0x72, 0x65, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x69, 0x6e, 0x67, 0x20, 0x61, 0x20, 0x72, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2c, 0x20, 0x69, 0x74, 0x20, 0x73, 0x74, 0x72, 0x65, + 0x61, 0x6d, 0x73, 0x20, 0x74, 0x68, 0x65, 0x6d, 0x20, 0x74, 0x6f, 0x20, 0x74, 0x68, 0x65, 0x20, + 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x20, 0x61, 0x73, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x63, 0x6f, 0x6c, 0x6c, 0x65, 0x63, 0x74, 0x65, 0x64, 0x2e, 0x20, 0x0a, 0x32, + 0x2e, 0x20, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, + 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x65, 0x64, + 0x20, 0x69, 0x73, 0x20, 0x6f, 0x6e, 0x6c, 0x79, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, + 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, + 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, + 0x4f, 0x50, 0x45, 0x4e, 0x46, 0x47, 0x41, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4f, 0x42, 0x4a, + 0x45, 0x43, 0x54, 0x53, 0x5f, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x2e, 0x20, 0x0a, + 0x2a, 0x13, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2d, 0x3a, 0x01, 0x2a, 0x22, 0x28, + 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x65, 0x64, 0x2d, 0x6c, 0x69, 0x73, 0x74, + 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x30, 0x01, 0x12, 0xf2, 0x08, 0x0a, 0x0b, 0x4c, + 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x12, 0x1e, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1f, 0x2e, 0x6f, 0x70, 0x65, + 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, + 0x63, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xa1, 0x08, 0x92, 0x41, + 0xf3, 0x07, 0x0a, 0x14, 0x52, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x68, 0x69, 0x70, + 0x20, 0x51, 0x75, 0x65, 0x72, 0x69, 0x65, 0x73, 0x12, 0x44, 0x4c, 0x69, 0x73, 0x74, 0x20, 0x61, + 0x6c, 0x6c, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x67, 0x69, 0x76, 0x65, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, + 0x74, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, + 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x1a, 0x87, + 0x07, 0x54, 0x68, 0x65, 0x20, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, + 0x20, 0x41, 0x50, 0x49, 0x20, 0x72, 0x65, 0x74, 0x75, 0x72, 0x6e, 0x73, 0x20, 0x61, 0x20, 0x6c, + 0x69, 0x73, 0x74, 0x20, 0x6f, 0x66, 0x20, 0x61, 0x6c, 0x6c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, + 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x67, 0x69, + 0x76, 0x65, 0x6e, 0x20, 0x74, 0x79, 0x70, 0x65, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x75, 0x73, 0x65, 0x72, 0x20, 0x68, 0x61, 0x73, 0x20, 0x61, 0x20, 0x72, 0x65, 0x6c, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x77, 0x69, 0x74, 0x68, 0x2e, 0x20, 0x54, 0x6f, 0x20, 0x61, + 0x63, 0x68, 0x69, 0x65, 0x76, 0x65, 0x20, 0x74, 0x68, 0x69, 0x73, 0x2c, 0x20, 0x62, 0x6f, 0x74, + 0x68, 0x20, 0x74, 0x68, 0x65, 0x20, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x20, 0x74, 0x75, 0x70, 0x6c, + 0x65, 0x73, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, + 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x61, + 0x72, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x0a, 0x41, 0x6e, 0x20, 0x60, 0x61, 0x75, 0x74, + 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x5f, 0x69, 0x64, 0x60, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x62, 0x65, 0x20, 0x73, 0x70, 0x65, 0x63, + 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x62, 0x6f, 0x64, + 0x79, 0x2e, 0x20, 0x49, 0x66, 0x20, 0x69, 0x74, 0x20, 0x69, 0x73, 0x20, 0x6e, 0x6f, 0x74, 0x20, + 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2c, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6c, + 0x61, 0x74, 0x65, 0x73, 0x74, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x49, 0x44, 0x20, 0x77, 0x69, 0x6c, + 0x6c, 0x20, 0x62, 0x65, 0x20, 0x75, 0x73, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, + 0x20, 0x73, 0x74, 0x72, 0x6f, 0x6e, 0x67, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x65, 0x64, 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x61, 0x75, 0x74, 0x68, 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x49, 0x44, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, - 0x75, 0x73, 0x65, 0x64, 0x2e, 0x20, 0x49, 0x74, 0x20, 0x69, 0x73, 0x20, 0x73, 0x74, 0x72, 0x6f, - 0x6e, 0x67, 0x6c, 0x79, 0x20, 0x72, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x65, 0x64, - 0x20, 0x74, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, 0x61, 0x75, 0x74, 0x68, - 0x6f, 0x72, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x20, - 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x74, 0x74, 0x65, 0x72, 0x20, 0x70, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x0a, 0x59, 0x6f, 0x75, 0x20, 0x6d, - 0x61, 0x79, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x79, 0x20, - 0x60, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x74, 0x75, 0x70, 0x6c, - 0x65, 0x73, 0x60, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, - 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, 0x20, 0x72, 0x65, 0x67, 0x75, - 0x6c, 0x61, 0x72, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, - 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x63, 0x6f, - 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x6c, 0x61, 0x74, 0x65, - 0x64, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x61, 0x6e, 0x20, - 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x22, 0x6f, 0x62, - 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x20, 0x66, 0x69, 0x65, 0x6c, 0x64, 0x20, 0x6f, 0x66, 0x20, - 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x73, 0x74, - 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x6f, 0x62, 0x6a, - 0x65, 0x63, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, 0x60, 0x3c, 0x74, 0x79, 0x70, - 0x65, 0x3e, 0x3a, 0x3c, 0x69, 0x64, 0x3e, 0x60, 0x20, 0x28, 0x65, 0x2e, 0x67, 0x2e, 0x20, 0x22, - 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x72, 0x6f, 0x61, 0x64, 0x6d, 0x61, 0x70, - 0x22, 0x29, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x20, 0x6f, - 0x66, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, - 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, - 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x65, 0x64, 0x20, - 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, + 0x6f, 0x64, 0x65, 0x6c, 0x20, 0x69, 0x64, 0x20, 0x66, 0x6f, 0x72, 0x20, 0x62, 0x65, 0x74, 0x74, + 0x65, 0x72, 0x20, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x2e, 0x0a, + 0x59, 0x6f, 0x75, 0x20, 0x6d, 0x61, 0x79, 0x20, 0x61, 0x6c, 0x73, 0x6f, 0x20, 0x73, 0x70, 0x65, + 0x63, 0x69, 0x66, 0x79, 0x20, 0x60, 0x63, 0x6f, 0x6e, 0x74, 0x65, 0x78, 0x74, 0x75, 0x61, 0x6c, + 0x5f, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x60, 0x20, 0x74, 0x68, 0x61, 0x74, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x74, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x20, 0x61, 0x73, + 0x20, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x20, 0x74, 0x75, 0x70, 0x6c, 0x65, 0x73, 0x2e, + 0x0a, 0x54, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x77, 0x69, + 0x6c, 0x6c, 0x20, 0x63, 0x6f, 0x6e, 0x74, 0x61, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, + 0x65, 0x6c, 0x61, 0x74, 0x65, 0x64, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x61, 0x6e, 0x20, 0x61, 0x72, 0x72, 0x61, 0x79, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x22, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x22, 0x20, 0x66, 0x69, 0x65, 0x6c, + 0x64, 0x20, 0x6f, 0x66, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x74, 0x68, 0x65, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, + 0x62, 0x65, 0x20, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, + 0x65, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x20, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x20, + 0x60, 0x3c, 0x74, 0x79, 0x70, 0x65, 0x3e, 0x3a, 0x3c, 0x69, 0x64, 0x3e, 0x60, 0x20, 0x28, 0x65, + 0x2e, 0x67, 0x2e, 0x20, 0x22, 0x64, 0x6f, 0x63, 0x75, 0x6d, 0x65, 0x6e, 0x74, 0x3a, 0x72, 0x6f, + 0x61, 0x64, 0x6d, 0x61, 0x70, 0x22, 0x29, 0x2e, 0x0a, 0x54, 0x68, 0x65, 0x20, 0x6e, 0x75, 0x6d, + 0x62, 0x65, 0x72, 0x20, 0x6f, 0x66, 0x20, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x20, 0x69, + 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x72, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x20, 0x61, + 0x72, 0x72, 0x61, 0x79, 0x20, 0x77, 0x69, 0x6c, 0x6c, 0x20, 0x62, 0x65, 0x20, 0x6c, 0x69, 0x6d, + 0x69, 0x74, 0x65, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x65, 0x78, 0x65, 0x63, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x20, 0x73, 0x70, + 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, + 0x6c, 0x61, 0x67, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x46, 0x47, 0x41, 0x5f, 0x4c, 0x49, 0x53, 0x54, + 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x53, 0x5f, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, + 0x45, 0x20, 0x61, 0x6e, 0x64, 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x70, + 0x65, 0x72, 0x20, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x46, 0x47, 0x41, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4f, 0x42, 0x4a, 0x45, - 0x43, 0x54, 0x53, 0x5f, 0x44, 0x45, 0x41, 0x44, 0x4c, 0x49, 0x4e, 0x45, 0x20, 0x61, 0x6e, 0x64, - 0x20, 0x62, 0x79, 0x20, 0x74, 0x68, 0x65, 0x20, 0x75, 0x70, 0x70, 0x65, 0x72, 0x20, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x20, 0x73, 0x70, 0x65, 0x63, 0x69, 0x66, 0x69, 0x65, 0x64, 0x20, 0x69, 0x6e, - 0x20, 0x74, 0x68, 0x65, 0x20, 0x66, 0x6c, 0x61, 0x67, 0x20, 0x4f, 0x50, 0x45, 0x4e, 0x46, 0x47, - 0x41, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x5f, 0x4f, 0x42, 0x4a, 0x45, 0x43, 0x54, 0x53, 0x5f, 0x4d, - 0x41, 0x58, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x53, 0x2c, 0x20, 0x77, 0x68, 0x69, 0x63, - 0x68, 0x65, 0x76, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x68, 0x69, 0x74, 0x20, 0x66, 0x69, 0x72, - 0x73, 0x74, 0x2e, 0x2a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, 0x2f, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, 0x64, 0x7d, 0x2f, 0x6c, 0x69, - 0x73, 0x74, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x42, 0xa1, 0x01, 0x0a, 0x0e, 0x63, - 0x6f, 0x6d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x76, 0x31, 0x42, 0x13, 0x4f, - 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, - 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2f, 0x76, 0x31, 0x3b, 0x6f, 0x70, - 0x65, 0x6e, 0x66, 0x67, 0x61, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, 0x58, 0x58, 0xaa, 0x02, 0x0a, - 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x56, 0x31, 0xca, 0x02, 0x0a, 0x4f, 0x70, 0x65, - 0x6e, 0x66, 0x67, 0x61, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x16, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, - 0x61, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, - 0xea, 0x02, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x3a, 0x3a, 0x56, 0x31, 0x62, 0x06, - 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x43, 0x54, 0x53, 0x5f, 0x4d, 0x41, 0x58, 0x5f, 0x52, 0x45, 0x53, 0x55, 0x4c, 0x54, 0x53, 0x2c, + 0x20, 0x77, 0x68, 0x69, 0x63, 0x68, 0x65, 0x76, 0x65, 0x72, 0x20, 0x69, 0x73, 0x20, 0x68, 0x69, + 0x74, 0x20, 0x66, 0x69, 0x72, 0x73, 0x74, 0x2e, 0x2a, 0x0b, 0x4c, 0x69, 0x73, 0x74, 0x4f, 0x62, + 0x6a, 0x65, 0x63, 0x74, 0x73, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x24, 0x3a, 0x01, 0x2a, 0x22, 0x1f, + 0x2f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x73, 0x2f, 0x7b, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x69, + 0x64, 0x7d, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x2d, 0x6f, 0x62, 0x6a, 0x65, 0x63, 0x74, 0x73, 0x42, + 0xa1, 0x01, 0x0a, 0x0e, 0x63, 0x6f, 0x6d, 0x2e, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, + 0x76, 0x31, 0x42, 0x13, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x53, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x31, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2f, + 0x76, 0x31, 0x3b, 0x6f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x76, 0x31, 0xa2, 0x02, 0x03, 0x4f, + 0x58, 0x58, 0xaa, 0x02, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x2e, 0x56, 0x31, 0xca, + 0x02, 0x0a, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x5c, 0x56, 0x31, 0xe2, 0x02, 0x16, 0x4f, + 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x5c, 0x56, 0x31, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0b, 0x4f, 0x70, 0x65, 0x6e, 0x66, 0x67, 0x61, 0x3a, + 0x3a, 0x56, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3676,122 +4076,135 @@ func file_openfga_v1_openfga_service_proto_rawDescGZIP() []byte { return file_openfga_v1_openfga_service_proto_rawDescData } -var file_openfga_v1_openfga_service_proto_msgTypes = make([]protoimpl.MessageInfo, 34) +var file_openfga_v1_openfga_service_proto_msgTypes = make([]protoimpl.MessageInfo, 40) var file_openfga_v1_openfga_service_proto_goTypes = []interface{}{ (*ListObjectsRequest)(nil), // 0: openfga.v1.ListObjectsRequest (*ListObjectsResponse)(nil), // 1: openfga.v1.ListObjectsResponse (*StreamedListObjectsRequest)(nil), // 2: openfga.v1.StreamedListObjectsRequest (*StreamedListObjectsResponse)(nil), // 3: openfga.v1.StreamedListObjectsResponse (*ReadRequest)(nil), // 4: openfga.v1.ReadRequest - (*ReadResponse)(nil), // 5: openfga.v1.ReadResponse - (*WriteRequest)(nil), // 6: openfga.v1.WriteRequest - (*WriteResponse)(nil), // 7: openfga.v1.WriteResponse - (*CheckRequest)(nil), // 8: openfga.v1.CheckRequest - (*CheckResponse)(nil), // 9: openfga.v1.CheckResponse - (*ExpandRequest)(nil), // 10: openfga.v1.ExpandRequest - (*ExpandResponse)(nil), // 11: openfga.v1.ExpandResponse - (*ReadAuthorizationModelRequest)(nil), // 12: openfga.v1.ReadAuthorizationModelRequest - (*ReadAuthorizationModelResponse)(nil), // 13: openfga.v1.ReadAuthorizationModelResponse - (*WriteAuthorizationModelRequest)(nil), // 14: openfga.v1.WriteAuthorizationModelRequest - (*WriteAuthorizationModelResponse)(nil), // 15: openfga.v1.WriteAuthorizationModelResponse - (*ReadAuthorizationModelsRequest)(nil), // 16: openfga.v1.ReadAuthorizationModelsRequest - (*ReadAuthorizationModelsResponse)(nil), // 17: openfga.v1.ReadAuthorizationModelsResponse - (*WriteAssertionsRequest)(nil), // 18: openfga.v1.WriteAssertionsRequest - (*WriteAssertionsResponse)(nil), // 19: openfga.v1.WriteAssertionsResponse - (*ReadAssertionsRequest)(nil), // 20: openfga.v1.ReadAssertionsRequest - (*ReadAssertionsResponse)(nil), // 21: openfga.v1.ReadAssertionsResponse - (*ReadChangesRequest)(nil), // 22: openfga.v1.ReadChangesRequest - (*ReadChangesResponse)(nil), // 23: openfga.v1.ReadChangesResponse - (*CreateStoreRequest)(nil), // 24: openfga.v1.CreateStoreRequest - (*CreateStoreResponse)(nil), // 25: openfga.v1.CreateStoreResponse - (*UpdateStoreRequest)(nil), // 26: openfga.v1.UpdateStoreRequest - (*UpdateStoreResponse)(nil), // 27: openfga.v1.UpdateStoreResponse - (*DeleteStoreRequest)(nil), // 28: openfga.v1.DeleteStoreRequest - (*DeleteStoreResponse)(nil), // 29: openfga.v1.DeleteStoreResponse - (*GetStoreRequest)(nil), // 30: openfga.v1.GetStoreRequest - (*GetStoreResponse)(nil), // 31: openfga.v1.GetStoreResponse - (*ListStoresRequest)(nil), // 32: openfga.v1.ListStoresRequest - (*ListStoresResponse)(nil), // 33: openfga.v1.ListStoresResponse - (*ContextualTupleKeys)(nil), // 34: openfga.v1.ContextualTupleKeys - (*TupleKey)(nil), // 35: openfga.v1.TupleKey - (*wrapperspb.Int32Value)(nil), // 36: google.protobuf.Int32Value - (*Tuple)(nil), // 37: openfga.v1.Tuple - (*TupleKeys)(nil), // 38: openfga.v1.TupleKeys - (*UsersetTree)(nil), // 39: openfga.v1.UsersetTree - (*AuthorizationModel)(nil), // 40: openfga.v1.AuthorizationModel - (*TypeDefinition)(nil), // 41: openfga.v1.TypeDefinition - (*Assertion)(nil), // 42: openfga.v1.Assertion - (*TupleChange)(nil), // 43: openfga.v1.TupleChange - (*timestamppb.Timestamp)(nil), // 44: google.protobuf.Timestamp - (*Store)(nil), // 45: openfga.v1.Store + (*ReadRequestTupleKey)(nil), // 5: openfga.v1.ReadRequestTupleKey + (*ReadResponse)(nil), // 6: openfga.v1.ReadResponse + (*WriteRequest)(nil), // 7: openfga.v1.WriteRequest + (*WriteResponse)(nil), // 8: openfga.v1.WriteResponse + (*CheckRequest)(nil), // 9: openfga.v1.CheckRequest + (*CheckRequestTupleKey)(nil), // 10: openfga.v1.CheckRequestTupleKey + (*CheckResponse)(nil), // 11: openfga.v1.CheckResponse + (*ExpandRequest)(nil), // 12: openfga.v1.ExpandRequest + (*ExpandRequestTupleKey)(nil), // 13: openfga.v1.ExpandRequestTupleKey + (*ExpandResponse)(nil), // 14: openfga.v1.ExpandResponse + (*ReadAuthorizationModelRequest)(nil), // 15: openfga.v1.ReadAuthorizationModelRequest + (*ReadAuthorizationModelResponse)(nil), // 16: openfga.v1.ReadAuthorizationModelResponse + (*WriteAuthorizationModelRequest)(nil), // 17: openfga.v1.WriteAuthorizationModelRequest + (*WriteAuthorizationModelResponse)(nil), // 18: openfga.v1.WriteAuthorizationModelResponse + (*ReadAuthorizationModelsRequest)(nil), // 19: openfga.v1.ReadAuthorizationModelsRequest + (*ReadAuthorizationModelsResponse)(nil), // 20: openfga.v1.ReadAuthorizationModelsResponse + (*WriteAssertionsRequest)(nil), // 21: openfga.v1.WriteAssertionsRequest + (*WriteAssertionsResponse)(nil), // 22: openfga.v1.WriteAssertionsResponse + (*ReadAssertionsRequest)(nil), // 23: openfga.v1.ReadAssertionsRequest + (*ReadAssertionsResponse)(nil), // 24: openfga.v1.ReadAssertionsResponse + (*ReadChangesRequest)(nil), // 25: openfga.v1.ReadChangesRequest + (*ReadChangesResponse)(nil), // 26: openfga.v1.ReadChangesResponse + (*CreateStoreRequest)(nil), // 27: openfga.v1.CreateStoreRequest + (*CreateStoreResponse)(nil), // 28: openfga.v1.CreateStoreResponse + (*UpdateStoreRequest)(nil), // 29: openfga.v1.UpdateStoreRequest + (*UpdateStoreResponse)(nil), // 30: openfga.v1.UpdateStoreResponse + (*DeleteStoreRequest)(nil), // 31: openfga.v1.DeleteStoreRequest + (*DeleteStoreResponse)(nil), // 32: openfga.v1.DeleteStoreResponse + (*GetStoreRequest)(nil), // 33: openfga.v1.GetStoreRequest + (*GetStoreResponse)(nil), // 34: openfga.v1.GetStoreResponse + (*ListStoresRequest)(nil), // 35: openfga.v1.ListStoresRequest + (*ListStoresResponse)(nil), // 36: openfga.v1.ListStoresResponse + (*Assertion)(nil), // 37: openfga.v1.Assertion + (*Assertions)(nil), // 38: openfga.v1.Assertions + nil, // 39: openfga.v1.WriteAuthorizationModelRequest.ConditionsEntry + (*ContextualTupleKeys)(nil), // 40: openfga.v1.ContextualTupleKeys + (*structpb.Struct)(nil), // 41: google.protobuf.Struct + (*wrapperspb.Int32Value)(nil), // 42: google.protobuf.Int32Value + (*Tuple)(nil), // 43: openfga.v1.Tuple + (*TupleKeys)(nil), // 44: openfga.v1.TupleKeys + (*UsersetTree)(nil), // 45: openfga.v1.UsersetTree + (*AuthorizationModel)(nil), // 46: openfga.v1.AuthorizationModel + (*TypeDefinition)(nil), // 47: openfga.v1.TypeDefinition + (*TupleChange)(nil), // 48: openfga.v1.TupleChange + (*timestamppb.Timestamp)(nil), // 49: google.protobuf.Timestamp + (*Store)(nil), // 50: openfga.v1.Store + (*Condition)(nil), // 51: openfga.v1.Condition } var file_openfga_v1_openfga_service_proto_depIdxs = []int32{ - 34, // 0: openfga.v1.ListObjectsRequest.contextual_tuples:type_name -> openfga.v1.ContextualTupleKeys - 34, // 1: openfga.v1.StreamedListObjectsRequest.contextual_tuples:type_name -> openfga.v1.ContextualTupleKeys - 35, // 2: openfga.v1.ReadRequest.tuple_key:type_name -> openfga.v1.TupleKey - 36, // 3: openfga.v1.ReadRequest.page_size:type_name -> google.protobuf.Int32Value - 37, // 4: openfga.v1.ReadResponse.tuples:type_name -> openfga.v1.Tuple - 38, // 5: openfga.v1.WriteRequest.writes:type_name -> openfga.v1.TupleKeys - 38, // 6: openfga.v1.WriteRequest.deletes:type_name -> openfga.v1.TupleKeys - 35, // 7: openfga.v1.CheckRequest.tuple_key:type_name -> openfga.v1.TupleKey - 34, // 8: openfga.v1.CheckRequest.contextual_tuples:type_name -> openfga.v1.ContextualTupleKeys - 35, // 9: openfga.v1.ExpandRequest.tuple_key:type_name -> openfga.v1.TupleKey - 39, // 10: openfga.v1.ExpandResponse.tree:type_name -> openfga.v1.UsersetTree - 40, // 11: openfga.v1.ReadAuthorizationModelResponse.authorization_model:type_name -> openfga.v1.AuthorizationModel - 41, // 12: openfga.v1.WriteAuthorizationModelRequest.type_definitions:type_name -> openfga.v1.TypeDefinition - 36, // 13: openfga.v1.ReadAuthorizationModelsRequest.page_size:type_name -> google.protobuf.Int32Value - 40, // 14: openfga.v1.ReadAuthorizationModelsResponse.authorization_models:type_name -> openfga.v1.AuthorizationModel - 42, // 15: openfga.v1.WriteAssertionsRequest.assertions:type_name -> openfga.v1.Assertion - 42, // 16: openfga.v1.ReadAssertionsResponse.assertions:type_name -> openfga.v1.Assertion - 36, // 17: openfga.v1.ReadChangesRequest.page_size:type_name -> google.protobuf.Int32Value - 43, // 18: openfga.v1.ReadChangesResponse.changes:type_name -> openfga.v1.TupleChange - 44, // 19: openfga.v1.CreateStoreResponse.created_at:type_name -> google.protobuf.Timestamp - 44, // 20: openfga.v1.CreateStoreResponse.updated_at:type_name -> google.protobuf.Timestamp - 44, // 21: openfga.v1.UpdateStoreResponse.created_at:type_name -> google.protobuf.Timestamp - 44, // 22: openfga.v1.UpdateStoreResponse.updated_at:type_name -> google.protobuf.Timestamp - 44, // 23: openfga.v1.GetStoreResponse.created_at:type_name -> google.protobuf.Timestamp - 44, // 24: openfga.v1.GetStoreResponse.updated_at:type_name -> google.protobuf.Timestamp - 36, // 25: openfga.v1.ListStoresRequest.page_size:type_name -> google.protobuf.Int32Value - 45, // 26: openfga.v1.ListStoresResponse.stores:type_name -> openfga.v1.Store - 4, // 27: openfga.v1.OpenFGAService.Read:input_type -> openfga.v1.ReadRequest - 6, // 28: openfga.v1.OpenFGAService.Write:input_type -> openfga.v1.WriteRequest - 8, // 29: openfga.v1.OpenFGAService.Check:input_type -> openfga.v1.CheckRequest - 10, // 30: openfga.v1.OpenFGAService.Expand:input_type -> openfga.v1.ExpandRequest - 16, // 31: openfga.v1.OpenFGAService.ReadAuthorizationModels:input_type -> openfga.v1.ReadAuthorizationModelsRequest - 12, // 32: openfga.v1.OpenFGAService.ReadAuthorizationModel:input_type -> openfga.v1.ReadAuthorizationModelRequest - 14, // 33: openfga.v1.OpenFGAService.WriteAuthorizationModel:input_type -> openfga.v1.WriteAuthorizationModelRequest - 18, // 34: openfga.v1.OpenFGAService.WriteAssertions:input_type -> openfga.v1.WriteAssertionsRequest - 20, // 35: openfga.v1.OpenFGAService.ReadAssertions:input_type -> openfga.v1.ReadAssertionsRequest - 22, // 36: openfga.v1.OpenFGAService.ReadChanges:input_type -> openfga.v1.ReadChangesRequest - 24, // 37: openfga.v1.OpenFGAService.CreateStore:input_type -> openfga.v1.CreateStoreRequest - 26, // 38: openfga.v1.OpenFGAService.UpdateStore:input_type -> openfga.v1.UpdateStoreRequest - 28, // 39: openfga.v1.OpenFGAService.DeleteStore:input_type -> openfga.v1.DeleteStoreRequest - 30, // 40: openfga.v1.OpenFGAService.GetStore:input_type -> openfga.v1.GetStoreRequest - 32, // 41: openfga.v1.OpenFGAService.ListStores:input_type -> openfga.v1.ListStoresRequest - 2, // 42: openfga.v1.OpenFGAService.StreamedListObjects:input_type -> openfga.v1.StreamedListObjectsRequest - 0, // 43: openfga.v1.OpenFGAService.ListObjects:input_type -> openfga.v1.ListObjectsRequest - 5, // 44: openfga.v1.OpenFGAService.Read:output_type -> openfga.v1.ReadResponse - 7, // 45: openfga.v1.OpenFGAService.Write:output_type -> openfga.v1.WriteResponse - 9, // 46: openfga.v1.OpenFGAService.Check:output_type -> openfga.v1.CheckResponse - 11, // 47: openfga.v1.OpenFGAService.Expand:output_type -> openfga.v1.ExpandResponse - 17, // 48: openfga.v1.OpenFGAService.ReadAuthorizationModels:output_type -> openfga.v1.ReadAuthorizationModelsResponse - 13, // 49: openfga.v1.OpenFGAService.ReadAuthorizationModel:output_type -> openfga.v1.ReadAuthorizationModelResponse - 15, // 50: openfga.v1.OpenFGAService.WriteAuthorizationModel:output_type -> openfga.v1.WriteAuthorizationModelResponse - 19, // 51: openfga.v1.OpenFGAService.WriteAssertions:output_type -> openfga.v1.WriteAssertionsResponse - 21, // 52: openfga.v1.OpenFGAService.ReadAssertions:output_type -> openfga.v1.ReadAssertionsResponse - 23, // 53: openfga.v1.OpenFGAService.ReadChanges:output_type -> openfga.v1.ReadChangesResponse - 25, // 54: openfga.v1.OpenFGAService.CreateStore:output_type -> openfga.v1.CreateStoreResponse - 27, // 55: openfga.v1.OpenFGAService.UpdateStore:output_type -> openfga.v1.UpdateStoreResponse - 29, // 56: openfga.v1.OpenFGAService.DeleteStore:output_type -> openfga.v1.DeleteStoreResponse - 31, // 57: openfga.v1.OpenFGAService.GetStore:output_type -> openfga.v1.GetStoreResponse - 33, // 58: openfga.v1.OpenFGAService.ListStores:output_type -> openfga.v1.ListStoresResponse - 3, // 59: openfga.v1.OpenFGAService.StreamedListObjects:output_type -> openfga.v1.StreamedListObjectsResponse - 1, // 60: openfga.v1.OpenFGAService.ListObjects:output_type -> openfga.v1.ListObjectsResponse - 44, // [44:61] is the sub-list for method output_type - 27, // [27:44] is the sub-list for method input_type - 27, // [27:27] is the sub-list for extension type_name - 27, // [27:27] is the sub-list for extension extendee - 0, // [0:27] is the sub-list for field type_name + 40, // 0: openfga.v1.ListObjectsRequest.contextual_tuples:type_name -> openfga.v1.ContextualTupleKeys + 41, // 1: openfga.v1.ListObjectsRequest.context:type_name -> google.protobuf.Struct + 40, // 2: openfga.v1.StreamedListObjectsRequest.contextual_tuples:type_name -> openfga.v1.ContextualTupleKeys + 41, // 3: openfga.v1.StreamedListObjectsRequest.context:type_name -> google.protobuf.Struct + 5, // 4: openfga.v1.ReadRequest.tuple_key:type_name -> openfga.v1.ReadRequestTupleKey + 42, // 5: openfga.v1.ReadRequest.page_size:type_name -> google.protobuf.Int32Value + 43, // 6: openfga.v1.ReadResponse.tuples:type_name -> openfga.v1.Tuple + 44, // 7: openfga.v1.WriteRequest.writes:type_name -> openfga.v1.TupleKeys + 44, // 8: openfga.v1.WriteRequest.deletes:type_name -> openfga.v1.TupleKeys + 10, // 9: openfga.v1.CheckRequest.tuple_key:type_name -> openfga.v1.CheckRequestTupleKey + 40, // 10: openfga.v1.CheckRequest.contextual_tuples:type_name -> openfga.v1.ContextualTupleKeys + 41, // 11: openfga.v1.CheckRequest.context:type_name -> google.protobuf.Struct + 13, // 12: openfga.v1.ExpandRequest.tuple_key:type_name -> openfga.v1.ExpandRequestTupleKey + 45, // 13: openfga.v1.ExpandResponse.tree:type_name -> openfga.v1.UsersetTree + 46, // 14: openfga.v1.ReadAuthorizationModelResponse.authorization_model:type_name -> openfga.v1.AuthorizationModel + 47, // 15: openfga.v1.WriteAuthorizationModelRequest.type_definitions:type_name -> openfga.v1.TypeDefinition + 39, // 16: openfga.v1.WriteAuthorizationModelRequest.conditions:type_name -> openfga.v1.WriteAuthorizationModelRequest.ConditionsEntry + 42, // 17: openfga.v1.ReadAuthorizationModelsRequest.page_size:type_name -> google.protobuf.Int32Value + 46, // 18: openfga.v1.ReadAuthorizationModelsResponse.authorization_models:type_name -> openfga.v1.AuthorizationModel + 37, // 19: openfga.v1.WriteAssertionsRequest.assertions:type_name -> openfga.v1.Assertion + 37, // 20: openfga.v1.ReadAssertionsResponse.assertions:type_name -> openfga.v1.Assertion + 42, // 21: openfga.v1.ReadChangesRequest.page_size:type_name -> google.protobuf.Int32Value + 48, // 22: openfga.v1.ReadChangesResponse.changes:type_name -> openfga.v1.TupleChange + 49, // 23: openfga.v1.CreateStoreResponse.created_at:type_name -> google.protobuf.Timestamp + 49, // 24: openfga.v1.CreateStoreResponse.updated_at:type_name -> google.protobuf.Timestamp + 49, // 25: openfga.v1.UpdateStoreResponse.created_at:type_name -> google.protobuf.Timestamp + 49, // 26: openfga.v1.UpdateStoreResponse.updated_at:type_name -> google.protobuf.Timestamp + 49, // 27: openfga.v1.GetStoreResponse.created_at:type_name -> google.protobuf.Timestamp + 49, // 28: openfga.v1.GetStoreResponse.updated_at:type_name -> google.protobuf.Timestamp + 42, // 29: openfga.v1.ListStoresRequest.page_size:type_name -> google.protobuf.Int32Value + 50, // 30: openfga.v1.ListStoresResponse.stores:type_name -> openfga.v1.Store + 10, // 31: openfga.v1.Assertion.tuple_key:type_name -> openfga.v1.CheckRequestTupleKey + 37, // 32: openfga.v1.Assertions.assertions:type_name -> openfga.v1.Assertion + 51, // 33: openfga.v1.WriteAuthorizationModelRequest.ConditionsEntry.value:type_name -> openfga.v1.Condition + 4, // 34: openfga.v1.OpenFGAService.Read:input_type -> openfga.v1.ReadRequest + 7, // 35: openfga.v1.OpenFGAService.Write:input_type -> openfga.v1.WriteRequest + 9, // 36: openfga.v1.OpenFGAService.Check:input_type -> openfga.v1.CheckRequest + 12, // 37: openfga.v1.OpenFGAService.Expand:input_type -> openfga.v1.ExpandRequest + 19, // 38: openfga.v1.OpenFGAService.ReadAuthorizationModels:input_type -> openfga.v1.ReadAuthorizationModelsRequest + 15, // 39: openfga.v1.OpenFGAService.ReadAuthorizationModel:input_type -> openfga.v1.ReadAuthorizationModelRequest + 17, // 40: openfga.v1.OpenFGAService.WriteAuthorizationModel:input_type -> openfga.v1.WriteAuthorizationModelRequest + 21, // 41: openfga.v1.OpenFGAService.WriteAssertions:input_type -> openfga.v1.WriteAssertionsRequest + 23, // 42: openfga.v1.OpenFGAService.ReadAssertions:input_type -> openfga.v1.ReadAssertionsRequest + 25, // 43: openfga.v1.OpenFGAService.ReadChanges:input_type -> openfga.v1.ReadChangesRequest + 27, // 44: openfga.v1.OpenFGAService.CreateStore:input_type -> openfga.v1.CreateStoreRequest + 29, // 45: openfga.v1.OpenFGAService.UpdateStore:input_type -> openfga.v1.UpdateStoreRequest + 31, // 46: openfga.v1.OpenFGAService.DeleteStore:input_type -> openfga.v1.DeleteStoreRequest + 33, // 47: openfga.v1.OpenFGAService.GetStore:input_type -> openfga.v1.GetStoreRequest + 35, // 48: openfga.v1.OpenFGAService.ListStores:input_type -> openfga.v1.ListStoresRequest + 2, // 49: openfga.v1.OpenFGAService.StreamedListObjects:input_type -> openfga.v1.StreamedListObjectsRequest + 0, // 50: openfga.v1.OpenFGAService.ListObjects:input_type -> openfga.v1.ListObjectsRequest + 6, // 51: openfga.v1.OpenFGAService.Read:output_type -> openfga.v1.ReadResponse + 8, // 52: openfga.v1.OpenFGAService.Write:output_type -> openfga.v1.WriteResponse + 11, // 53: openfga.v1.OpenFGAService.Check:output_type -> openfga.v1.CheckResponse + 14, // 54: openfga.v1.OpenFGAService.Expand:output_type -> openfga.v1.ExpandResponse + 20, // 55: openfga.v1.OpenFGAService.ReadAuthorizationModels:output_type -> openfga.v1.ReadAuthorizationModelsResponse + 16, // 56: openfga.v1.OpenFGAService.ReadAuthorizationModel:output_type -> openfga.v1.ReadAuthorizationModelResponse + 18, // 57: openfga.v1.OpenFGAService.WriteAuthorizationModel:output_type -> openfga.v1.WriteAuthorizationModelResponse + 22, // 58: openfga.v1.OpenFGAService.WriteAssertions:output_type -> openfga.v1.WriteAssertionsResponse + 24, // 59: openfga.v1.OpenFGAService.ReadAssertions:output_type -> openfga.v1.ReadAssertionsResponse + 26, // 60: openfga.v1.OpenFGAService.ReadChanges:output_type -> openfga.v1.ReadChangesResponse + 28, // 61: openfga.v1.OpenFGAService.CreateStore:output_type -> openfga.v1.CreateStoreResponse + 30, // 62: openfga.v1.OpenFGAService.UpdateStore:output_type -> openfga.v1.UpdateStoreResponse + 32, // 63: openfga.v1.OpenFGAService.DeleteStore:output_type -> openfga.v1.DeleteStoreResponse + 34, // 64: openfga.v1.OpenFGAService.GetStore:output_type -> openfga.v1.GetStoreResponse + 36, // 65: openfga.v1.OpenFGAService.ListStores:output_type -> openfga.v1.ListStoresResponse + 3, // 66: openfga.v1.OpenFGAService.StreamedListObjects:output_type -> openfga.v1.StreamedListObjectsResponse + 1, // 67: openfga.v1.OpenFGAService.ListObjects:output_type -> openfga.v1.ListObjectsResponse + 51, // [51:68] is the sub-list for method output_type + 34, // [34:51] is the sub-list for method input_type + 34, // [34:34] is the sub-list for extension type_name + 34, // [34:34] is the sub-list for extension extendee + 0, // [0:34] is the sub-list for field type_name } func init() { file_openfga_v1_openfga_service_proto_init() } @@ -3863,7 +4276,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadResponse); i { + switch v := v.(*ReadRequestTupleKey); i { case 0: return &v.state case 1: @@ -3875,7 +4288,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteRequest); i { + switch v := v.(*ReadResponse); i { case 0: return &v.state case 1: @@ -3887,7 +4300,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteResponse); i { + switch v := v.(*WriteRequest); i { case 0: return &v.state case 1: @@ -3899,7 +4312,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckRequest); i { + switch v := v.(*WriteResponse); i { case 0: return &v.state case 1: @@ -3911,7 +4324,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CheckResponse); i { + switch v := v.(*CheckRequest); i { case 0: return &v.state case 1: @@ -3923,7 +4336,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExpandRequest); i { + switch v := v.(*CheckRequestTupleKey); i { case 0: return &v.state case 1: @@ -3935,7 +4348,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ExpandResponse); i { + switch v := v.(*CheckResponse); i { case 0: return &v.state case 1: @@ -3947,7 +4360,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadAuthorizationModelRequest); i { + switch v := v.(*ExpandRequest); i { case 0: return &v.state case 1: @@ -3959,7 +4372,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadAuthorizationModelResponse); i { + switch v := v.(*ExpandRequestTupleKey); i { case 0: return &v.state case 1: @@ -3971,7 +4384,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteAuthorizationModelRequest); i { + switch v := v.(*ExpandResponse); i { case 0: return &v.state case 1: @@ -3983,7 +4396,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteAuthorizationModelResponse); i { + switch v := v.(*ReadAuthorizationModelRequest); i { case 0: return &v.state case 1: @@ -3995,7 +4408,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadAuthorizationModelsRequest); i { + switch v := v.(*ReadAuthorizationModelResponse); i { case 0: return &v.state case 1: @@ -4007,7 +4420,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadAuthorizationModelsResponse); i { + switch v := v.(*WriteAuthorizationModelRequest); i { case 0: return &v.state case 1: @@ -4019,7 +4432,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteAssertionsRequest); i { + switch v := v.(*WriteAuthorizationModelResponse); i { case 0: return &v.state case 1: @@ -4031,7 +4444,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*WriteAssertionsResponse); i { + switch v := v.(*ReadAuthorizationModelsRequest); i { case 0: return &v.state case 1: @@ -4043,7 +4456,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadAssertionsRequest); i { + switch v := v.(*ReadAuthorizationModelsResponse); i { case 0: return &v.state case 1: @@ -4055,7 +4468,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadAssertionsResponse); i { + switch v := v.(*WriteAssertionsRequest); i { case 0: return &v.state case 1: @@ -4067,7 +4480,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadChangesRequest); i { + switch v := v.(*WriteAssertionsResponse); i { case 0: return &v.state case 1: @@ -4079,7 +4492,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ReadChangesResponse); i { + switch v := v.(*ReadAssertionsRequest); i { case 0: return &v.state case 1: @@ -4091,7 +4504,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStoreRequest); i { + switch v := v.(*ReadAssertionsResponse); i { case 0: return &v.state case 1: @@ -4103,7 +4516,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CreateStoreResponse); i { + switch v := v.(*ReadChangesRequest); i { case 0: return &v.state case 1: @@ -4115,7 +4528,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStoreRequest); i { + switch v := v.(*ReadChangesResponse); i { case 0: return &v.state case 1: @@ -4127,7 +4540,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateStoreResponse); i { + switch v := v.(*CreateStoreRequest); i { case 0: return &v.state case 1: @@ -4139,7 +4552,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStoreRequest); i { + switch v := v.(*CreateStoreResponse); i { case 0: return &v.state case 1: @@ -4151,7 +4564,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteStoreResponse); i { + switch v := v.(*UpdateStoreRequest); i { case 0: return &v.state case 1: @@ -4163,7 +4576,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStoreRequest); i { + switch v := v.(*UpdateStoreResponse); i { case 0: return &v.state case 1: @@ -4175,7 +4588,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetStoreResponse); i { + switch v := v.(*DeleteStoreRequest); i { case 0: return &v.state case 1: @@ -4187,7 +4600,7 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListStoresRequest); i { + switch v := v.(*DeleteStoreResponse); i { case 0: return &v.state case 1: @@ -4199,6 +4612,42 @@ func file_openfga_v1_openfga_service_proto_init() { } } file_openfga_v1_openfga_service_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStoreRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openfga_v1_openfga_service_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GetStoreResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openfga_v1_openfga_service_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ListStoresRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openfga_v1_openfga_service_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ListStoresResponse); i { case 0: return &v.state @@ -4210,6 +4659,30 @@ func file_openfga_v1_openfga_service_proto_init() { return nil } } + file_openfga_v1_openfga_service_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Assertion); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_openfga_v1_openfga_service_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*Assertions); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } } type x struct{} out := protoimpl.TypeBuilder{ @@ -4217,7 +4690,7 @@ func file_openfga_v1_openfga_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_openfga_v1_openfga_service_proto_rawDesc, NumEnums: 0, - NumMessages: 34, + NumMessages: 40, NumExtensions: 0, NumServices: 1, }, diff --git a/proto/openfga/v1/openfga_service.pb.validate.go b/proto/openfga/v1/openfga_service.pb.validate.go index 7f69a8da..e6c020c1 100644 --- a/proto/openfga/v1/openfga_service.pb.validate.go +++ b/proto/openfga/v1/openfga_service.pb.validate.go @@ -145,6 +145,35 @@ func (m *ListObjectsRequest) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetContext()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, ListObjectsRequestValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, ListObjectsRequestValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetContext()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return ListObjectsRequestValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return ListObjectsRequestMultiError(errors) } @@ -445,6 +474,35 @@ func (m *StreamedListObjectsRequest) validate(all bool) error { } } + if all { + switch v := interface{}(m.GetContext()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, StreamedListObjectsRequestValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, StreamedListObjectsRequestValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetContext()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return StreamedListObjectsRequestValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return StreamedListObjectsRequestMultiError(errors) } @@ -805,6 +863,153 @@ var _ interface { var _ReadRequest_StoreId_Pattern = regexp.MustCompile("^[ABCDEFGHJKMNPQRSTVWXYZ0-9]{26}$") +// Validate checks the field values on ReadRequestTupleKey with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *ReadRequestTupleKey) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ReadRequestTupleKey with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ReadRequestTupleKeyMultiError, or nil if none found. +func (m *ReadRequestTupleKey) ValidateAll() error { + return m.validate(true) +} + +func (m *ReadRequestTupleKey) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(m.GetUser()) > 512 { + err := ReadRequestTupleKeyValidationError{ + field: "User", + reason: "value length must be at most 512 bytes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if m.GetRelation() != "" { + + if !_ReadRequestTupleKey_Relation_Pattern.MatchString(m.GetRelation()) { + err := ReadRequestTupleKeyValidationError{ + field: "Relation", + reason: "value does not match regex pattern \"^[^:#@\\\\s]{1,50}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + + if m.GetObject() != "" { + + if !_ReadRequestTupleKey_Object_Pattern.MatchString(m.GetObject()) { + err := ReadRequestTupleKeyValidationError{ + field: "Object", + reason: "value does not match regex pattern \"^[^\\\\s]{2,256}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + + if len(errors) > 0 { + return ReadRequestTupleKeyMultiError(errors) + } + + return nil +} + +// ReadRequestTupleKeyMultiError is an error wrapping multiple validation +// errors returned by ReadRequestTupleKey.ValidateAll() if the designated +// constraints aren't met. +type ReadRequestTupleKeyMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ReadRequestTupleKeyMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ReadRequestTupleKeyMultiError) AllErrors() []error { return m } + +// ReadRequestTupleKeyValidationError is the validation error returned by +// ReadRequestTupleKey.Validate if the designated constraints aren't met. +type ReadRequestTupleKeyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ReadRequestTupleKeyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ReadRequestTupleKeyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ReadRequestTupleKeyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ReadRequestTupleKeyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ReadRequestTupleKeyValidationError) ErrorName() string { + return "ReadRequestTupleKeyValidationError" +} + +// Error satisfies the builtin error interface +func (e ReadRequestTupleKeyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sReadRequestTupleKey.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ReadRequestTupleKeyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ReadRequestTupleKeyValidationError{} + +var _ReadRequestTupleKey_Relation_Pattern = regexp.MustCompile("^[^:#@\\s]{1,50}$") + +var _ReadRequestTupleKey_Object_Pattern = regexp.MustCompile("^[^\\s]{2,256}$") + // Validate checks the field values on ReadResponse with the rules defined in // the proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. @@ -1355,6 +1560,35 @@ func (m *CheckRequest) validate(all bool) error { // no validation rules for Trace + if all { + switch v := interface{}(m.GetContext()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, CheckRequestValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, CheckRequestValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetContext()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return CheckRequestValidationError{ + field: "Context", + reason: "embedded message failed validation", + cause: err, + } + } + } + if len(errors) > 0 { return CheckRequestMultiError(errors) } @@ -1436,6 +1670,153 @@ var _CheckRequest_StoreId_Pattern = regexp.MustCompile("^[ABCDEFGHJKMNPQRSTVWXYZ var _CheckRequest_AuthorizationModelId_Pattern = regexp.MustCompile("^[ABCDEFGHJKMNPQRSTVWXYZ0-9]{26}$") +// Validate checks the field values on CheckRequestTupleKey with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *CheckRequestTupleKey) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on CheckRequestTupleKey with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// CheckRequestTupleKeyMultiError, or nil if none found. +func (m *CheckRequestTupleKey) ValidateAll() error { + return m.validate(true) +} + +func (m *CheckRequestTupleKey) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if len(m.GetUser()) > 512 { + err := CheckRequestTupleKeyValidationError{ + field: "User", + reason: "value length must be at most 512 bytes", + } + if !all { + return err + } + errors = append(errors, err) + } + + if m.GetRelation() != "" { + + if !_CheckRequestTupleKey_Relation_Pattern.MatchString(m.GetRelation()) { + err := CheckRequestTupleKeyValidationError{ + field: "Relation", + reason: "value does not match regex pattern \"^[^:#@\\\\s]{1,50}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + + if m.GetObject() != "" { + + if !_CheckRequestTupleKey_Object_Pattern.MatchString(m.GetObject()) { + err := CheckRequestTupleKeyValidationError{ + field: "Object", + reason: "value does not match regex pattern \"^[^\\\\s]{2,256}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + + if len(errors) > 0 { + return CheckRequestTupleKeyMultiError(errors) + } + + return nil +} + +// CheckRequestTupleKeyMultiError is an error wrapping multiple validation +// errors returned by CheckRequestTupleKey.ValidateAll() if the designated +// constraints aren't met. +type CheckRequestTupleKeyMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m CheckRequestTupleKeyMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m CheckRequestTupleKeyMultiError) AllErrors() []error { return m } + +// CheckRequestTupleKeyValidationError is the validation error returned by +// CheckRequestTupleKey.Validate if the designated constraints aren't met. +type CheckRequestTupleKeyValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e CheckRequestTupleKeyValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e CheckRequestTupleKeyValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e CheckRequestTupleKeyValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e CheckRequestTupleKeyValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e CheckRequestTupleKeyValidationError) ErrorName() string { + return "CheckRequestTupleKeyValidationError" +} + +// Error satisfies the builtin error interface +func (e CheckRequestTupleKeyValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sCheckRequestTupleKey.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = CheckRequestTupleKeyValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = CheckRequestTupleKeyValidationError{} + +var _CheckRequestTupleKey_Relation_Pattern = regexp.MustCompile("^[^:#@\\s]{1,50}$") + +var _CheckRequestTupleKey_Object_Pattern = regexp.MustCompile("^[^\\s]{2,256}$") + // Validate checks the field values on CheckResponse with the rules defined in // the proto definition for this message. If any rules are violated, the first // error encountered is returned, or nil if there are no violations. @@ -1650,11 +2031,145 @@ func (m ExpandRequestMultiError) Error() string { } // AllErrors returns a list of validation violation errors. -func (m ExpandRequestMultiError) AllErrors() []error { return m } +func (m ExpandRequestMultiError) AllErrors() []error { return m } + +// ExpandRequestValidationError is the validation error returned by +// ExpandRequest.Validate if the designated constraints aren't met. +type ExpandRequestValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e ExpandRequestValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e ExpandRequestValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e ExpandRequestValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e ExpandRequestValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e ExpandRequestValidationError) ErrorName() string { return "ExpandRequestValidationError" } + +// Error satisfies the builtin error interface +func (e ExpandRequestValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sExpandRequest.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = ExpandRequestValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = ExpandRequestValidationError{} + +var _ExpandRequest_StoreId_Pattern = regexp.MustCompile("^[ABCDEFGHJKMNPQRSTVWXYZ0-9]{26}$") + +var _ExpandRequest_AuthorizationModelId_Pattern = regexp.MustCompile("^[ABCDEFGHJKMNPQRSTVWXYZ0-9]{26}$") + +// Validate checks the field values on ExpandRequestTupleKey with the rules +// defined in the proto definition for this message. If any rules are +// violated, the first error encountered is returned, or nil if there are no violations. +func (m *ExpandRequestTupleKey) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on ExpandRequestTupleKey with the rules +// defined in the proto definition for this message. If any rules are +// violated, the result is a list of violation errors wrapped in +// ExpandRequestTupleKeyMultiError, or nil if none found. +func (m *ExpandRequestTupleKey) ValidateAll() error { + return m.validate(true) +} + +func (m *ExpandRequestTupleKey) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if m.GetObject() != "" { + + if !_ExpandRequestTupleKey_Object_Pattern.MatchString(m.GetObject()) { + err := ExpandRequestTupleKeyValidationError{ + field: "Object", + reason: "value does not match regex pattern \"^[^\\\\s]{2,256}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + + if m.GetRelation() != "" { + + if !_ExpandRequestTupleKey_Relation_Pattern.MatchString(m.GetRelation()) { + err := ExpandRequestTupleKeyValidationError{ + field: "Relation", + reason: "value does not match regex pattern \"^[^:#@\\\\s]{1,50}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + } + + if len(errors) > 0 { + return ExpandRequestTupleKeyMultiError(errors) + } + + return nil +} + +// ExpandRequestTupleKeyMultiError is an error wrapping multiple validation +// errors returned by ExpandRequestTupleKey.ValidateAll() if the designated +// constraints aren't met. +type ExpandRequestTupleKeyMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m ExpandRequestTupleKeyMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m ExpandRequestTupleKeyMultiError) AllErrors() []error { return m } -// ExpandRequestValidationError is the validation error returned by -// ExpandRequest.Validate if the designated constraints aren't met. -type ExpandRequestValidationError struct { +// ExpandRequestTupleKeyValidationError is the validation error returned by +// ExpandRequestTupleKey.Validate if the designated constraints aren't met. +type ExpandRequestTupleKeyValidationError struct { field string reason string cause error @@ -1662,22 +2177,24 @@ type ExpandRequestValidationError struct { } // Field function returns field value. -func (e ExpandRequestValidationError) Field() string { return e.field } +func (e ExpandRequestTupleKeyValidationError) Field() string { return e.field } // Reason function returns reason value. -func (e ExpandRequestValidationError) Reason() string { return e.reason } +func (e ExpandRequestTupleKeyValidationError) Reason() string { return e.reason } // Cause function returns cause value. -func (e ExpandRequestValidationError) Cause() error { return e.cause } +func (e ExpandRequestTupleKeyValidationError) Cause() error { return e.cause } // Key function returns key value. -func (e ExpandRequestValidationError) Key() bool { return e.key } +func (e ExpandRequestTupleKeyValidationError) Key() bool { return e.key } // ErrorName returns error name. -func (e ExpandRequestValidationError) ErrorName() string { return "ExpandRequestValidationError" } +func (e ExpandRequestTupleKeyValidationError) ErrorName() string { + return "ExpandRequestTupleKeyValidationError" +} // Error satisfies the builtin error interface -func (e ExpandRequestValidationError) Error() string { +func (e ExpandRequestTupleKeyValidationError) Error() string { cause := "" if e.cause != nil { cause = fmt.Sprintf(" | caused by: %v", e.cause) @@ -1689,14 +2206,14 @@ func (e ExpandRequestValidationError) Error() string { } return fmt.Sprintf( - "invalid %sExpandRequest.%s: %s%s", + "invalid %sExpandRequestTupleKey.%s: %s%s", key, e.field, e.reason, cause) } -var _ error = ExpandRequestValidationError{} +var _ error = ExpandRequestTupleKeyValidationError{} var _ interface { Field() string @@ -1704,11 +2221,11 @@ var _ interface { Key() bool Cause() error ErrorName() string -} = ExpandRequestValidationError{} +} = ExpandRequestTupleKeyValidationError{} -var _ExpandRequest_StoreId_Pattern = regexp.MustCompile("^[ABCDEFGHJKMNPQRSTVWXYZ0-9]{26}$") +var _ExpandRequestTupleKey_Object_Pattern = regexp.MustCompile("^[^\\s]{2,256}$") -var _ExpandRequest_AuthorizationModelId_Pattern = regexp.MustCompile("^[ABCDEFGHJKMNPQRSTVWXYZ0-9]{26}$") +var _ExpandRequestTupleKey_Relation_Pattern = regexp.MustCompile("^[^:#@\\s]{1,50}$") // Validate checks the field values on ExpandResponse with the rules defined in // the proto definition for this message. If any rules are violated, the first @@ -2187,6 +2704,72 @@ func (m *WriteAuthorizationModelRequest) validate(all bool) error { errors = append(errors, err) } + if len(m.GetConditions()) > 25 { + err := WriteAuthorizationModelRequestValidationError{ + field: "Conditions", + reason: "value must contain no more than 25 pair(s)", + } + if !all { + return err + } + errors = append(errors, err) + } + + { + sorted_keys := make([]string, len(m.GetConditions())) + i := 0 + for key := range m.GetConditions() { + sorted_keys[i] = key + i++ + } + sort.Slice(sorted_keys, func(i, j int) bool { return sorted_keys[i] < sorted_keys[j] }) + for _, key := range sorted_keys { + val := m.GetConditions()[key] + _ = val + + if !_WriteAuthorizationModelRequest_Conditions_Pattern.MatchString(key) { + err := WriteAuthorizationModelRequestValidationError{ + field: fmt.Sprintf("Conditions[%v]", key), + reason: "value does not match regex pattern \"^[^:#@\\\\s]{1,50}$\"", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(val).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, WriteAuthorizationModelRequestValidationError{ + field: fmt.Sprintf("Conditions[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, WriteAuthorizationModelRequestValidationError{ + field: fmt.Sprintf("Conditions[%v]", key), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(val).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return WriteAuthorizationModelRequestValidationError{ + field: fmt.Sprintf("Conditions[%v]", key), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + } + if len(errors) > 0 { return WriteAuthorizationModelRequestMultiError(errors) } @@ -2275,6 +2858,8 @@ var _WriteAuthorizationModelRequest_SchemaVersion_InLookup = map[string]struct{} "1.1": {}, } +var _WriteAuthorizationModelRequest_Conditions_Pattern = regexp.MustCompile("^[^:#@\\s]{1,50}$") + // Validate checks the field values on WriteAuthorizationModelResponse with the // rules defined in the proto definition for this message. If any rules are // violated, the first error encountered is returned, or nil if there are no violations. @@ -4875,3 +5460,277 @@ var _ interface { Cause() error ErrorName() string } = ListStoresResponseValidationError{} + +// Validate checks the field values on Assertion with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Assertion) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Assertion with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in AssertionMultiError, or nil +// if none found. +func (m *Assertion) ValidateAll() error { + return m.validate(true) +} + +func (m *Assertion) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + if m.GetTupleKey() == nil { + err := AssertionValidationError{ + field: "TupleKey", + reason: "value is required", + } + if !all { + return err + } + errors = append(errors, err) + } + + if all { + switch v := interface{}(m.GetTupleKey()).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AssertionValidationError{ + field: "TupleKey", + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AssertionValidationError{ + field: "TupleKey", + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(m.GetTupleKey()).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AssertionValidationError{ + field: "TupleKey", + reason: "embedded message failed validation", + cause: err, + } + } + } + + // no validation rules for Expectation + + if len(errors) > 0 { + return AssertionMultiError(errors) + } + + return nil +} + +// AssertionMultiError is an error wrapping multiple validation errors returned +// by Assertion.ValidateAll() if the designated constraints aren't met. +type AssertionMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m AssertionMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m AssertionMultiError) AllErrors() []error { return m } + +// AssertionValidationError is the validation error returned by +// Assertion.Validate if the designated constraints aren't met. +type AssertionValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e AssertionValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e AssertionValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e AssertionValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e AssertionValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e AssertionValidationError) ErrorName() string { return "AssertionValidationError" } + +// Error satisfies the builtin error interface +func (e AssertionValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sAssertion.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = AssertionValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = AssertionValidationError{} + +// Validate checks the field values on Assertions with the rules defined in the +// proto definition for this message. If any rules are violated, the first +// error encountered is returned, or nil if there are no violations. +func (m *Assertions) Validate() error { + return m.validate(false) +} + +// ValidateAll checks the field values on Assertions with the rules defined in +// the proto definition for this message. If any rules are violated, the +// result is a list of violation errors wrapped in AssertionsMultiError, or +// nil if none found. +func (m *Assertions) ValidateAll() error { + return m.validate(true) +} + +func (m *Assertions) validate(all bool) error { + if m == nil { + return nil + } + + var errors []error + + for idx, item := range m.GetAssertions() { + _, _ = idx, item + + if all { + switch v := interface{}(item).(type) { + case interface{ ValidateAll() error }: + if err := v.ValidateAll(); err != nil { + errors = append(errors, AssertionsValidationError{ + field: fmt.Sprintf("Assertions[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + case interface{ Validate() error }: + if err := v.Validate(); err != nil { + errors = append(errors, AssertionsValidationError{ + field: fmt.Sprintf("Assertions[%v]", idx), + reason: "embedded message failed validation", + cause: err, + }) + } + } + } else if v, ok := interface{}(item).(interface{ Validate() error }); ok { + if err := v.Validate(); err != nil { + return AssertionsValidationError{ + field: fmt.Sprintf("Assertions[%v]", idx), + reason: "embedded message failed validation", + cause: err, + } + } + } + + } + + if len(errors) > 0 { + return AssertionsMultiError(errors) + } + + return nil +} + +// AssertionsMultiError is an error wrapping multiple validation errors +// returned by Assertions.ValidateAll() if the designated constraints aren't met. +type AssertionsMultiError []error + +// Error returns a concatenation of all the error messages it wraps. +func (m AssertionsMultiError) Error() string { + var msgs []string + for _, err := range m { + msgs = append(msgs, err.Error()) + } + return strings.Join(msgs, "; ") +} + +// AllErrors returns a list of validation violation errors. +func (m AssertionsMultiError) AllErrors() []error { return m } + +// AssertionsValidationError is the validation error returned by +// Assertions.Validate if the designated constraints aren't met. +type AssertionsValidationError struct { + field string + reason string + cause error + key bool +} + +// Field function returns field value. +func (e AssertionsValidationError) Field() string { return e.field } + +// Reason function returns reason value. +func (e AssertionsValidationError) Reason() string { return e.reason } + +// Cause function returns cause value. +func (e AssertionsValidationError) Cause() error { return e.cause } + +// Key function returns key value. +func (e AssertionsValidationError) Key() bool { return e.key } + +// ErrorName returns error name. +func (e AssertionsValidationError) ErrorName() string { return "AssertionsValidationError" } + +// Error satisfies the builtin error interface +func (e AssertionsValidationError) Error() string { + cause := "" + if e.cause != nil { + cause = fmt.Sprintf(" | caused by: %v", e.cause) + } + + key := "" + if e.key { + key = "key for " + } + + return fmt.Sprintf( + "invalid %sAssertions.%s: %s%s", + key, + e.field, + e.reason, + cause) +} + +var _ error = AssertionsValidationError{} + +var _ interface { + Field() string + Reason() string + Key() bool + Cause() error + ErrorName() string +} = AssertionsValidationError{}