diff --git a/internal/core/src/pb/common.pb.cc b/internal/core/src/pb/common.pb.cc index 73f7970b22..468f18d715 100644 --- a/internal/core/src/pb/common.pb.cc +++ b/internal/core/src/pb/common.pb.cc @@ -308,6 +308,7 @@ const ::PROTOBUF_NAMESPACE_ID::uint32 TableStruct_common_2eproto::offsets[] PROT PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_type_), PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_privilege_), PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_name_index_), + PROTOBUF_FIELD_OFFSET(::milvus::proto::common::PrivilegeExt, object_name_indexs_), }; static const ::PROTOBUF_NAMESPACE_ID::internal::MigrationSchema schemas[] PROTOBUF_SECTION_VARIABLE(protodesc_cold) = { { 0, -1, sizeof(::milvus::proto::common::Status)}, @@ -356,107 +357,118 @@ const char descriptor_table_protodef_common_2eproto[] PROTOBUF_SECTION_VARIABLE( "*\n\004base\030\001 \001(\0132\034.milvus.proto.common.MsgB" "ase\"M\n\014DMLMsgHeader\022*\n\004base\030\001 \001(\0132\034.milv" "us.proto.common.MsgBase\022\021\n\tshardName\030\002 \001" - "(\t\"\237\001\n\014PrivilegeExt\0224\n\013object_type\030\001 \001(\016" + "(\t\"\273\001\n\014PrivilegeExt\0224\n\013object_type\030\001 \001(\016" "2\037.milvus.proto.common.ObjectType\022>\n\020obj" "ect_privilege\030\002 \001(\0162$.milvus.proto.commo" "n.ObjectPrivilege\022\031\n\021object_name_index\030\003" - " \001(\005*\323\010\n\tErrorCode\022\013\n\007Success\020\000\022\023\n\017Unexp" - "ectedError\020\001\022\021\n\rConnectFailed\020\002\022\024\n\020Permi" - "ssionDenied\020\003\022\027\n\023CollectionNotExists\020\004\022\023" - "\n\017IllegalArgument\020\005\022\024\n\020IllegalDimension\020" - "\007\022\024\n\020IllegalIndexType\020\010\022\031\n\025IllegalCollec" - "tionName\020\t\022\017\n\013IllegalTOPK\020\n\022\024\n\020IllegalRo" - "wRecord\020\013\022\023\n\017IllegalVectorID\020\014\022\027\n\023Illega" - "lSearchResult\020\r\022\020\n\014FileNotFound\020\016\022\016\n\nMet" - "aFailed\020\017\022\017\n\013CacheFailed\020\020\022\026\n\022CannotCrea" - "teFolder\020\021\022\024\n\020CannotCreateFile\020\022\022\026\n\022Cann" - "otDeleteFolder\020\023\022\024\n\020CannotDeleteFile\020\024\022\023" - "\n\017BuildIndexError\020\025\022\020\n\014IllegalNLIST\020\026\022\025\n" - "\021IllegalMetricType\020\027\022\017\n\013OutOfMemory\020\030\022\021\n" - "\rIndexNotExist\020\031\022\023\n\017EmptyCollection\020\032\022\033\n" - "\027UpdateImportTaskFailure\020\033\022\032\n\026Collection" - "NameNotFound\020\034\022\033\n\027CreateCredentialFailur" - "e\020\035\022\033\n\027UpdateCredentialFailure\020\036\022\033\n\027Dele" - "teCredentialFailure\020\037\022\030\n\024GetCredentialFa" - "ilure\020 \022\030\n\024ListCredUsersFailure\020!\022\022\n\016Get" - "UserFailure\020\"\022\025\n\021CreateRoleFailure\020#\022\023\n\017" - "DropRoleFailure\020$\022\032\n\026OperateUserRoleFail" - "ure\020%\022\025\n\021SelectRoleFailure\020&\022\025\n\021SelectUs" - "erFailure\020\'\022\031\n\025SelectResourceFailure\020(\022\033" - "\n\027OperatePrivilegeFailure\020)\022\026\n\022SelectGra" - "ntFailure\020*\022!\n\035RefreshPolicyInfoCacheFai" - "lure\020+\022\025\n\021ListPolicyFailure\020,\022\022\n\016NotShar" - "dLeader\020-\022\026\n\022NoReplicaAvailable\020.\022\023\n\017Seg" - "mentNotFound\020/\022\022\n\rDDRequestRace\020\350\007*X\n\nIn" - "dexState\022\022\n\016IndexStateNone\020\000\022\014\n\010Unissued" - "\020\001\022\016\n\nInProgress\020\002\022\014\n\010Finished\020\003\022\n\n\006Fail" - "ed\020\004*\202\001\n\014SegmentState\022\024\n\020SegmentStateNon" - "e\020\000\022\014\n\010NotExist\020\001\022\013\n\007Growing\020\002\022\n\n\006Sealed" - "\020\003\022\013\n\007Flushed\020\004\022\014\n\010Flushing\020\005\022\013\n\007Dropped" - "\020\006\022\r\n\tImporting\020\007*>\n\017PlaceholderType\022\010\n\004" - "None\020\000\022\020\n\014BinaryVector\020d\022\017\n\013FloatVector\020" - "e*\266\014\n\007MsgType\022\r\n\tUndefined\020\000\022\024\n\020CreateCo" - "llection\020d\022\022\n\016DropCollection\020e\022\021\n\rHasCol" - "lection\020f\022\026\n\022DescribeCollection\020g\022\023\n\017Sho" - "wCollections\020h\022\024\n\020GetSystemConfigs\020i\022\022\n\016" - "LoadCollection\020j\022\025\n\021ReleaseCollection\020k\022" - "\017\n\013CreateAlias\020l\022\r\n\tDropAlias\020m\022\016\n\nAlter" - "Alias\020n\022\024\n\017CreatePartition\020\310\001\022\022\n\rDropPar" - "tition\020\311\001\022\021\n\014HasPartition\020\312\001\022\026\n\021Describe" - "Partition\020\313\001\022\023\n\016ShowPartitions\020\314\001\022\023\n\016Loa" - "dPartitions\020\315\001\022\026\n\021ReleasePartitions\020\316\001\022\021" - "\n\014ShowSegments\020\372\001\022\024\n\017DescribeSegment\020\373\001\022" - "\021\n\014LoadSegments\020\374\001\022\024\n\017ReleaseSegments\020\375\001" - "\022\024\n\017HandoffSegments\020\376\001\022\030\n\023LoadBalanceSeg" - "ments\020\377\001\022\025\n\020DescribeSegments\020\200\002\022\020\n\013Creat" - "eIndex\020\254\002\022\022\n\rDescribeIndex\020\255\002\022\016\n\tDropInd" - "ex\020\256\002\022\013\n\006Insert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n\005Flush" - "\020\222\003\022\027\n\022ResendSegmentStats\020\223\003\022\013\n\006Search\020\364" - "\003\022\021\n\014SearchResult\020\365\003\022\022\n\rGetIndexState\020\366\003" - "\022\032\n\025GetIndexBuildProgress\020\367\003\022\034\n\027GetColle" - "ctionStatistics\020\370\003\022\033\n\026GetPartitionStatis" - "tics\020\371\003\022\r\n\010Retrieve\020\372\003\022\023\n\016RetrieveResult" - "\020\373\003\022\024\n\017WatchDmChannels\020\374\003\022\025\n\020RemoveDmCha" - "nnels\020\375\003\022\027\n\022WatchQueryChannels\020\376\003\022\030\n\023Rem" - "oveQueryChannels\020\377\003\022\035\n\030SealedSegmentsCha" - "ngeInfo\020\200\004\022\027\n\022WatchDeltaChannels\020\201\004\022\024\n\017G" - "etShardLeaders\020\202\004\022\020\n\013GetReplicas\020\203\004\022\020\n\013S" - "egmentInfo\020\330\004\022\017\n\nSystemInfo\020\331\004\022\024\n\017GetRec" - "overyInfo\020\332\004\022\024\n\017GetSegmentState\020\333\004\022\r\n\010Ti" - "meTick\020\260\t\022\023\n\016QueryNodeStats\020\261\t\022\016\n\tLoadIn" - "dex\020\262\t\022\016\n\tRequestID\020\263\t\022\017\n\nRequestTSO\020\264\t\022" - "\024\n\017AllocateSegment\020\265\t\022\026\n\021SegmentStatisti" - "cs\020\266\t\022\025\n\020SegmentFlushDone\020\267\t\022\017\n\nDataNode" - "Tt\020\270\t\022\025\n\020CreateCredential\020\334\013\022\022\n\rGetCrede" - "ntial\020\335\013\022\025\n\020DeleteCredential\020\336\013\022\025\n\020Updat" - "eCredential\020\337\013\022\026\n\021ListCredUsernames\020\340\013\022\017" - "\n\nCreateRole\020\300\014\022\r\n\010DropRole\020\301\014\022\024\n\017Operat" - "eUserRole\020\302\014\022\017\n\nSelectRole\020\303\014\022\017\n\nSelectU" - "ser\020\304\014\022\023\n\016SelectResource\020\305\014\022\025\n\020OperatePr" - "ivilege\020\306\014\022\020\n\013SelectGrant\020\307\014\022\033\n\026RefreshP" - "olicyInfoCache\020\310\014\022\017\n\nListPolicy\020\311\014*\"\n\007Ds" - "lType\022\007\n\003Dsl\020\000\022\016\n\nBoolExprV1\020\001*B\n\017Compac" - "tionState\022\021\n\rUndefiedState\020\000\022\r\n\tExecutin" - "g\020\001\022\r\n\tCompleted\020\002*X\n\020ConsistencyLevel\022\n" - "\n\006Strong\020\000\022\013\n\007Session\020\001\022\013\n\007Bounded\020\002\022\016\n\n" - "Eventually\020\003\022\016\n\nCustomized\020\004*\257\001\n\013ImportS" - "tate\022\021\n\rImportPending\020\000\022\020\n\014ImportFailed\020" - "\001\022\021\n\rImportStarted\020\002\022\024\n\020ImportDownloaded" - "\020\003\022\020\n\014ImportParsed\020\004\022\023\n\017ImportPersisted\020" - "\005\022\023\n\017ImportCompleted\020\006\022\026\n\022ImportAllocSeg" - "ment\020\n*(\n\nObjectType\022\016\n\nCollection\020\000\022\n\n\006" - "Global\020\001*\212\002\n\017ObjectPrivilege\022\020\n\014Privileg" - "eAll\020\000\022\035\n\031PrivilegeCreateCollection\020\001\022\033\n" - "\027PrivilegeDropCollection\020\002\022\037\n\033PrivilegeD" - "escribeCollection\020\003\022\034\n\030PrivilegeShowColl" - "ections\020\004\022\021\n\rPrivilegeLoad\020\005\022\024\n\020Privileg" - "eRelease\020\006\022\027\n\023PrivilegeCompaction\020\007\022\023\n\017P" - "rivilegeInsert\020\010\022\023\n\017PrivilegeDelete\020\t:^\n" - "\021privilege_ext_obj\022\037.google.protobuf.Mes" - "sageOptions\030\351\007 \001(\0132!.milvus.proto.common" - ".PrivilegeExtBW\n\016io.milvus.grpcB\013CommonP" - "rotoP\001Z3github.com/milvus-io/milvus/inte" - "rnal/proto/commonpb\240\001\001b\006proto3" + " \001(\005\022\032\n\022object_name_indexs\030\004 \001(\005*\323\010\n\tErr" + "orCode\022\013\n\007Success\020\000\022\023\n\017UnexpectedError\020\001" + "\022\021\n\rConnectFailed\020\002\022\024\n\020PermissionDenied\020" + "\003\022\027\n\023CollectionNotExists\020\004\022\023\n\017IllegalArg" + "ument\020\005\022\024\n\020IllegalDimension\020\007\022\024\n\020Illegal" + "IndexType\020\010\022\031\n\025IllegalCollectionName\020\t\022\017" + "\n\013IllegalTOPK\020\n\022\024\n\020IllegalRowRecord\020\013\022\023\n" + "\017IllegalVectorID\020\014\022\027\n\023IllegalSearchResul" + "t\020\r\022\020\n\014FileNotFound\020\016\022\016\n\nMetaFailed\020\017\022\017\n" + "\013CacheFailed\020\020\022\026\n\022CannotCreateFolder\020\021\022\024" + "\n\020CannotCreateFile\020\022\022\026\n\022CannotDeleteFold" + "er\020\023\022\024\n\020CannotDeleteFile\020\024\022\023\n\017BuildIndex" + "Error\020\025\022\020\n\014IllegalNLIST\020\026\022\025\n\021IllegalMetr" + "icType\020\027\022\017\n\013OutOfMemory\020\030\022\021\n\rIndexNotExi" + "st\020\031\022\023\n\017EmptyCollection\020\032\022\033\n\027UpdateImpor" + "tTaskFailure\020\033\022\032\n\026CollectionNameNotFound" + "\020\034\022\033\n\027CreateCredentialFailure\020\035\022\033\n\027Updat" + "eCredentialFailure\020\036\022\033\n\027DeleteCredential" + "Failure\020\037\022\030\n\024GetCredentialFailure\020 \022\030\n\024L" + "istCredUsersFailure\020!\022\022\n\016GetUserFailure\020" + "\"\022\025\n\021CreateRoleFailure\020#\022\023\n\017DropRoleFail" + "ure\020$\022\032\n\026OperateUserRoleFailure\020%\022\025\n\021Sel" + "ectRoleFailure\020&\022\025\n\021SelectUserFailure\020\'\022" + "\031\n\025SelectResourceFailure\020(\022\033\n\027OperatePri" + "vilegeFailure\020)\022\026\n\022SelectGrantFailure\020*\022" + "!\n\035RefreshPolicyInfoCacheFailure\020+\022\025\n\021Li" + "stPolicyFailure\020,\022\022\n\016NotShardLeader\020-\022\026\n" + "\022NoReplicaAvailable\020.\022\023\n\017SegmentNotFound" + "\020/\022\022\n\rDDRequestRace\020\350\007*X\n\nIndexState\022\022\n\016" + "IndexStateNone\020\000\022\014\n\010Unissued\020\001\022\016\n\nInProg" + "ress\020\002\022\014\n\010Finished\020\003\022\n\n\006Failed\020\004*\202\001\n\014Seg" + "mentState\022\024\n\020SegmentStateNone\020\000\022\014\n\010NotEx" + "ist\020\001\022\013\n\007Growing\020\002\022\n\n\006Sealed\020\003\022\013\n\007Flushe" + "d\020\004\022\014\n\010Flushing\020\005\022\013\n\007Dropped\020\006\022\r\n\tImport" + "ing\020\007*>\n\017PlaceholderType\022\010\n\004None\020\000\022\020\n\014Bi" + "naryVector\020d\022\017\n\013FloatVector\020e*\266\014\n\007MsgTyp" + "e\022\r\n\tUndefined\020\000\022\024\n\020CreateCollection\020d\022\022" + "\n\016DropCollection\020e\022\021\n\rHasCollection\020f\022\026\n" + "\022DescribeCollection\020g\022\023\n\017ShowCollections" + "\020h\022\024\n\020GetSystemConfigs\020i\022\022\n\016LoadCollecti" + "on\020j\022\025\n\021ReleaseCollection\020k\022\017\n\013CreateAli" + "as\020l\022\r\n\tDropAlias\020m\022\016\n\nAlterAlias\020n\022\024\n\017C" + "reatePartition\020\310\001\022\022\n\rDropPartition\020\311\001\022\021\n" + "\014HasPartition\020\312\001\022\026\n\021DescribePartition\020\313\001" + "\022\023\n\016ShowPartitions\020\314\001\022\023\n\016LoadPartitions\020" + "\315\001\022\026\n\021ReleasePartitions\020\316\001\022\021\n\014ShowSegmen" + "ts\020\372\001\022\024\n\017DescribeSegment\020\373\001\022\021\n\014LoadSegme" + "nts\020\374\001\022\024\n\017ReleaseSegments\020\375\001\022\024\n\017HandoffS" + "egments\020\376\001\022\030\n\023LoadBalanceSegments\020\377\001\022\025\n\020" + "DescribeSegments\020\200\002\022\020\n\013CreateIndex\020\254\002\022\022\n" + "\rDescribeIndex\020\255\002\022\016\n\tDropIndex\020\256\002\022\013\n\006Ins" + "ert\020\220\003\022\013\n\006Delete\020\221\003\022\n\n\005Flush\020\222\003\022\027\n\022Resen" + "dSegmentStats\020\223\003\022\013\n\006Search\020\364\003\022\021\n\014SearchR" + "esult\020\365\003\022\022\n\rGetIndexState\020\366\003\022\032\n\025GetIndex" + "BuildProgress\020\367\003\022\034\n\027GetCollectionStatist" + "ics\020\370\003\022\033\n\026GetPartitionStatistics\020\371\003\022\r\n\010R" + "etrieve\020\372\003\022\023\n\016RetrieveResult\020\373\003\022\024\n\017Watch" + "DmChannels\020\374\003\022\025\n\020RemoveDmChannels\020\375\003\022\027\n\022" + "WatchQueryChannels\020\376\003\022\030\n\023RemoveQueryChan" + "nels\020\377\003\022\035\n\030SealedSegmentsChangeInfo\020\200\004\022\027" + "\n\022WatchDeltaChannels\020\201\004\022\024\n\017GetShardLeade" + "rs\020\202\004\022\020\n\013GetReplicas\020\203\004\022\020\n\013SegmentInfo\020\330" + "\004\022\017\n\nSystemInfo\020\331\004\022\024\n\017GetRecoveryInfo\020\332\004" + "\022\024\n\017GetSegmentState\020\333\004\022\r\n\010TimeTick\020\260\t\022\023\n" + "\016QueryNodeStats\020\261\t\022\016\n\tLoadIndex\020\262\t\022\016\n\tRe" + "questID\020\263\t\022\017\n\nRequestTSO\020\264\t\022\024\n\017AllocateS" + "egment\020\265\t\022\026\n\021SegmentStatistics\020\266\t\022\025\n\020Seg" + "mentFlushDone\020\267\t\022\017\n\nDataNodeTt\020\270\t\022\025\n\020Cre" + "ateCredential\020\334\013\022\022\n\rGetCredential\020\335\013\022\025\n\020" + "DeleteCredential\020\336\013\022\025\n\020UpdateCredential\020" + "\337\013\022\026\n\021ListCredUsernames\020\340\013\022\017\n\nCreateRole" + "\020\300\014\022\r\n\010DropRole\020\301\014\022\024\n\017OperateUserRole\020\302\014" + "\022\017\n\nSelectRole\020\303\014\022\017\n\nSelectUser\020\304\014\022\023\n\016Se" + "lectResource\020\305\014\022\025\n\020OperatePrivilege\020\306\014\022\020" + "\n\013SelectGrant\020\307\014\022\033\n\026RefreshPolicyInfoCac" + "he\020\310\014\022\017\n\nListPolicy\020\311\014*\"\n\007DslType\022\007\n\003Dsl" + "\020\000\022\016\n\nBoolExprV1\020\001*B\n\017CompactionState\022\021\n" + "\rUndefiedState\020\000\022\r\n\tExecuting\020\001\022\r\n\tCompl" + "eted\020\002*X\n\020ConsistencyLevel\022\n\n\006Strong\020\000\022\013" + "\n\007Session\020\001\022\013\n\007Bounded\020\002\022\016\n\nEventually\020\003" + "\022\016\n\nCustomized\020\004*\257\001\n\013ImportState\022\021\n\rImpo" + "rtPending\020\000\022\020\n\014ImportFailed\020\001\022\021\n\rImportS" + "tarted\020\002\022\024\n\020ImportDownloaded\020\003\022\020\n\014Import" + "Parsed\020\004\022\023\n\017ImportPersisted\020\005\022\023\n\017ImportC" + "ompleted\020\006\022\026\n\022ImportAllocSegment\020\n*2\n\nOb" + "jectType\022\016\n\nCollection\020\000\022\n\n\006Global\020\001\022\010\n\004" + "User\020\002*\206\005\n\017ObjectPrivilege\022\020\n\014PrivilegeA" + "ll\020\000\022\035\n\031PrivilegeCreateCollection\020\001\022\033\n\027P" + "rivilegeDropCollection\020\002\022\037\n\033PrivilegeDes" + "cribeCollection\020\003\022\034\n\030PrivilegeShowCollec" + "tions\020\004\022\021\n\rPrivilegeLoad\020\005\022\024\n\020PrivilegeR" + "elease\020\006\022\027\n\023PrivilegeCompaction\020\007\022\023\n\017Pri" + "vilegeInsert\020\010\022\023\n\017PrivilegeDelete\020\t\022\032\n\026P" + "rivilegeGetStatistics\020\n\022\030\n\024PrivilegeCrea" + "teIndex\020\013\022\030\n\024PrivilegeIndexDetail\020\014\022\026\n\022P" + "rivilegeDropIndex\020\r\022\023\n\017PrivilegeSearch\020\016" + "\022\022\n\016PrivilegeFlush\020\017\022\022\n\016PrivilegeQuery\020\020" + "\022\030\n\024PrivilegeLoadBalance\020\021\022\023\n\017PrivilegeI" + "mport\020\022\022\034\n\030PrivilegeCreateOwnership\020\023\022\027\n" + "\023PrivilegeUpdateUser\020\024\022\032\n\026PrivilegeDropO" + "wnership\020\025\022\034\n\030PrivilegeSelectOwnership\020\026" + "\022\034\n\030PrivilegeManageOwnership\020\027\022\027\n\023Privil" + "egeSelectUser\020\030:^\n\021privilege_ext_obj\022\037.g" + "oogle.protobuf.MessageOptions\030\351\007 \001(\0132!.m" + "ilvus.proto.common.PrivilegeExtBW\n\016io.mi" + "lvus.grpcB\013CommonProtoP\001Z3github.com/mil" + "vus-io/milvus/internal/proto/commonpb\240\001\001" + "b\006proto3" ; static const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable*const descriptor_table_common_2eproto_deps[1] = { &::descriptor_table_google_2fprotobuf_2fdescriptor_2eproto, @@ -477,7 +489,7 @@ static ::PROTOBUF_NAMESPACE_ID::internal::SCCInfoBase*const descriptor_table_com static ::PROTOBUF_NAMESPACE_ID::internal::once_flag descriptor_table_common_2eproto_once; static bool descriptor_table_common_2eproto_initialized = false; const ::PROTOBUF_NAMESPACE_ID::internal::DescriptorTable descriptor_table_common_2eproto = { - &descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 4750, + &descriptor_table_common_2eproto_initialized, descriptor_table_protodef_common_2eproto, "common.proto", 5168, &descriptor_table_common_2eproto_once, descriptor_table_common_2eproto_sccs, descriptor_table_common_2eproto_deps, 11, 1, schemas, file_default_instances, TableStruct_common_2eproto::offsets, file_level_metadata_common_2eproto, 11, file_level_enum_descriptors_common_2eproto, file_level_service_descriptors_common_2eproto, @@ -763,6 +775,7 @@ bool ObjectType_IsValid(int value) { switch (value) { case 0: case 1: + case 2: return true; default: return false; @@ -785,6 +798,21 @@ bool ObjectPrivilege_IsValid(int value) { case 7: case 8: case 9: + case 10: + case 11: + case 12: + case 13: + case 14: + case 15: + case 16: + case 17: + case 18: + case 19: + case 20: + case 21: + case 22: + case 23: + case 24: return true; default: return false; @@ -3948,15 +3976,15 @@ PrivilegeExt::PrivilegeExt(const PrivilegeExt& from) _internal_metadata_(nullptr) { _internal_metadata_.MergeFrom(from._internal_metadata_); ::memcpy(&object_type_, &from.object_type_, - static_cast(reinterpret_cast(&object_name_index_) - - reinterpret_cast(&object_type_)) + sizeof(object_name_index_)); + static_cast(reinterpret_cast(&object_name_indexs_) - + reinterpret_cast(&object_type_)) + sizeof(object_name_indexs_)); // @@protoc_insertion_point(copy_constructor:milvus.proto.common.PrivilegeExt) } void PrivilegeExt::SharedCtor() { ::memset(&object_type_, 0, static_cast( - reinterpret_cast(&object_name_index_) - - reinterpret_cast(&object_type_)) + sizeof(object_name_index_)); + reinterpret_cast(&object_name_indexs_) - + reinterpret_cast(&object_type_)) + sizeof(object_name_indexs_)); } PrivilegeExt::~PrivilegeExt() { @@ -3983,8 +4011,8 @@ void PrivilegeExt::Clear() { (void) cached_has_bits; ::memset(&object_type_, 0, static_cast( - reinterpret_cast(&object_name_index_) - - reinterpret_cast(&object_type_)) + sizeof(object_name_index_)); + reinterpret_cast(&object_name_indexs_) - + reinterpret_cast(&object_type_)) + sizeof(object_name_indexs_)); _internal_metadata_.Clear(); } @@ -4019,6 +4047,13 @@ const char* PrivilegeExt::_InternalParse(const char* ptr, ::PROTOBUF_NAMESPACE_I CHK_(ptr); } else goto handle_unusual; continue; + // int32 object_name_indexs = 4; + case 4: + if (PROTOBUF_PREDICT_TRUE(static_cast<::PROTOBUF_NAMESPACE_ID::uint8>(tag) == 32)) { + object_name_indexs_ = ::PROTOBUF_NAMESPACE_ID::internal::ReadVarint(&ptr); + CHK_(ptr); + } else goto handle_unusual; + continue; default: { handle_unusual: if ((tag & 7) == 4 || tag == 0) { @@ -4090,6 +4125,19 @@ bool PrivilegeExt::MergePartialFromCodedStream( break; } + // int32 object_name_indexs = 4; + case 4: { + if (static_cast< ::PROTOBUF_NAMESPACE_ID::uint8>(tag) == (32 & 0xFF)) { + + DO_((::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::ReadPrimitive< + ::PROTOBUF_NAMESPACE_ID::int32, ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::TYPE_INT32>( + input, &object_name_indexs_))); + } else { + goto handle_unusual; + } + break; + } + default: { handle_unusual: if (tag == 0) { @@ -4134,6 +4182,11 @@ void PrivilegeExt::SerializeWithCachedSizes( ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32(3, this->object_name_index(), output); } + // int32 object_name_indexs = 4; + if (this->object_name_indexs() != 0) { + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32(4, this->object_name_indexs(), output); + } + if (_internal_metadata_.have_unknown_fields()) { ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFields( _internal_metadata_.unknown_fields(), output); @@ -4164,6 +4217,11 @@ void PrivilegeExt::SerializeWithCachedSizes( target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(3, this->object_name_index(), target); } + // int32 object_name_indexs = 4; + if (this->object_name_indexs() != 0) { + target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::WriteInt32ToArray(4, this->object_name_indexs(), target); + } + if (_internal_metadata_.have_unknown_fields()) { target = ::PROTOBUF_NAMESPACE_ID::internal::WireFormat::SerializeUnknownFieldsToArray( _internal_metadata_.unknown_fields(), target); @@ -4204,6 +4262,13 @@ size_t PrivilegeExt::ByteSizeLong() const { this->object_name_index()); } + // int32 object_name_indexs = 4; + if (this->object_name_indexs() != 0) { + total_size += 1 + + ::PROTOBUF_NAMESPACE_ID::internal::WireFormatLite::Int32Size( + this->object_name_indexs()); + } + int cached_size = ::PROTOBUF_NAMESPACE_ID::internal::ToCachedSize(total_size); SetCachedSize(cached_size); return total_size; @@ -4240,6 +4305,9 @@ void PrivilegeExt::MergeFrom(const PrivilegeExt& from) { if (from.object_name_index() != 0) { set_object_name_index(from.object_name_index()); } + if (from.object_name_indexs() != 0) { + set_object_name_indexs(from.object_name_indexs()); + } } void PrivilegeExt::CopyFrom(const ::PROTOBUF_NAMESPACE_ID::Message& from) { @@ -4266,6 +4334,7 @@ void PrivilegeExt::InternalSwap(PrivilegeExt* other) { swap(object_type_, other->object_type_); swap(object_privilege_, other->object_privilege_); swap(object_name_index_, other->object_name_index_); + swap(object_name_indexs_, other->object_name_indexs_); } ::PROTOBUF_NAMESPACE_ID::Metadata PrivilegeExt::GetMetadata() const { diff --git a/internal/core/src/pb/common.pb.h b/internal/core/src/pb/common.pb.h index 644dce6fc8..320bb6451c 100644 --- a/internal/core/src/pb/common.pb.h +++ b/internal/core/src/pb/common.pb.h @@ -481,12 +481,13 @@ inline bool ImportState_Parse( enum ObjectType : int { Collection = 0, Global = 1, + User = 2, ObjectType_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), ObjectType_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() }; bool ObjectType_IsValid(int value); constexpr ObjectType ObjectType_MIN = Collection; -constexpr ObjectType ObjectType_MAX = Global; +constexpr ObjectType ObjectType_MAX = User; constexpr int ObjectType_ARRAYSIZE = ObjectType_MAX + 1; const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ObjectType_descriptor(); @@ -514,12 +515,27 @@ enum ObjectPrivilege : int { PrivilegeCompaction = 7, PrivilegeInsert = 8, PrivilegeDelete = 9, + PrivilegeGetStatistics = 10, + PrivilegeCreateIndex = 11, + PrivilegeIndexDetail = 12, + PrivilegeDropIndex = 13, + PrivilegeSearch = 14, + PrivilegeFlush = 15, + PrivilegeQuery = 16, + PrivilegeLoadBalance = 17, + PrivilegeImport = 18, + PrivilegeCreateOwnership = 19, + PrivilegeUpdateUser = 20, + PrivilegeDropOwnership = 21, + PrivilegeSelectOwnership = 22, + PrivilegeManageOwnership = 23, + PrivilegeSelectUser = 24, ObjectPrivilege_INT_MIN_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::min(), ObjectPrivilege_INT_MAX_SENTINEL_DO_NOT_USE_ = std::numeric_limits<::PROTOBUF_NAMESPACE_ID::int32>::max() }; bool ObjectPrivilege_IsValid(int value); constexpr ObjectPrivilege ObjectPrivilege_MIN = PrivilegeAll; -constexpr ObjectPrivilege ObjectPrivilege_MAX = PrivilegeDelete; +constexpr ObjectPrivilege ObjectPrivilege_MAX = PrivilegeSelectUser; constexpr int ObjectPrivilege_ARRAYSIZE = ObjectPrivilege_MAX + 1; const ::PROTOBUF_NAMESPACE_ID::EnumDescriptor* ObjectPrivilege_descriptor(); @@ -2112,6 +2128,7 @@ class PrivilegeExt : kObjectTypeFieldNumber = 1, kObjectPrivilegeFieldNumber = 2, kObjectNameIndexFieldNumber = 3, + kObjectNameIndexsFieldNumber = 4, }; // .milvus.proto.common.ObjectType object_type = 1; void clear_object_type(); @@ -2128,6 +2145,11 @@ class PrivilegeExt : ::PROTOBUF_NAMESPACE_ID::int32 object_name_index() const; void set_object_name_index(::PROTOBUF_NAMESPACE_ID::int32 value); + // int32 object_name_indexs = 4; + void clear_object_name_indexs(); + ::PROTOBUF_NAMESPACE_ID::int32 object_name_indexs() const; + void set_object_name_indexs(::PROTOBUF_NAMESPACE_ID::int32 value); + // @@protoc_insertion_point(class_scope:milvus.proto.common.PrivilegeExt) private: class _Internal; @@ -2136,6 +2158,7 @@ class PrivilegeExt : int object_type_; int object_privilege_; ::PROTOBUF_NAMESPACE_ID::int32 object_name_index_; + ::PROTOBUF_NAMESPACE_ID::int32 object_name_indexs_; mutable ::PROTOBUF_NAMESPACE_ID::internal::CachedSize _cached_size_; friend struct ::TableStruct_common_2eproto; }; @@ -2990,6 +3013,20 @@ inline void PrivilegeExt::set_object_name_index(::PROTOBUF_NAMESPACE_ID::int32 v // @@protoc_insertion_point(field_set:milvus.proto.common.PrivilegeExt.object_name_index) } +// int32 object_name_indexs = 4; +inline void PrivilegeExt::clear_object_name_indexs() { + object_name_indexs_ = 0; +} +inline ::PROTOBUF_NAMESPACE_ID::int32 PrivilegeExt::object_name_indexs() const { + // @@protoc_insertion_point(field_get:milvus.proto.common.PrivilegeExt.object_name_indexs) + return object_name_indexs_; +} +inline void PrivilegeExt::set_object_name_indexs(::PROTOBUF_NAMESPACE_ID::int32 value) { + + object_name_indexs_ = value; + // @@protoc_insertion_point(field_set:milvus.proto.common.PrivilegeExt.object_name_indexs) +} + #ifdef __GNUC__ #pragma GCC diagnostic pop #endif // __GNUC__ diff --git a/internal/proto/common.proto b/internal/proto/common.proto index 81cb5cd24f..dc85462832 100644 --- a/internal/proto/common.proto +++ b/internal/proto/common.proto @@ -276,6 +276,7 @@ enum ImportState { enum ObjectType { Collection = 0; Global = 1; + User = 2; } enum ObjectPrivilege { @@ -289,12 +290,29 @@ enum ObjectPrivilege { PrivilegeCompaction = 7; PrivilegeInsert = 8; PrivilegeDelete = 9; + + PrivilegeGetStatistics = 10; + PrivilegeCreateIndex = 11; + PrivilegeIndexDetail = 12; + PrivilegeDropIndex = 13; + PrivilegeSearch = 14; + PrivilegeFlush = 15; + PrivilegeQuery = 16; + PrivilegeLoadBalance = 17; + PrivilegeImport = 18; + PrivilegeCreateOwnership = 19; + PrivilegeUpdateUser = 20; + PrivilegeDropOwnership = 21; + PrivilegeSelectOwnership = 22; + PrivilegeManageOwnership = 23; + PrivilegeSelectUser = 24; } message PrivilegeExt { ObjectType object_type = 1; ObjectPrivilege object_privilege = 2; int32 object_name_index = 3; + int32 object_name_indexs = 4; } extend google.protobuf.MessageOptions { diff --git a/internal/proto/commonpb/common.pb.go b/internal/proto/commonpb/common.pb.go index c616b724eb..537c38bebf 100644 --- a/internal/proto/commonpb/common.pb.go +++ b/internal/proto/commonpb/common.pb.go @@ -685,16 +685,19 @@ type ObjectType int32 const ( ObjectType_Collection ObjectType = 0 ObjectType_Global ObjectType = 1 + ObjectType_User ObjectType = 2 ) var ObjectType_name = map[int32]string{ 0: "Collection", 1: "Global", + 2: "User", } var ObjectType_value = map[string]int32{ "Collection": 0, "Global": 1, + "User": 2, } func (x ObjectType) String() string { @@ -718,19 +721,49 @@ const ( ObjectPrivilege_PrivilegeCompaction ObjectPrivilege = 7 ObjectPrivilege_PrivilegeInsert ObjectPrivilege = 8 ObjectPrivilege_PrivilegeDelete ObjectPrivilege = 9 + ObjectPrivilege_PrivilegeGetStatistics ObjectPrivilege = 10 + ObjectPrivilege_PrivilegeCreateIndex ObjectPrivilege = 11 + ObjectPrivilege_PrivilegeIndexDetail ObjectPrivilege = 12 + ObjectPrivilege_PrivilegeDropIndex ObjectPrivilege = 13 + ObjectPrivilege_PrivilegeSearch ObjectPrivilege = 14 + ObjectPrivilege_PrivilegeFlush ObjectPrivilege = 15 + ObjectPrivilege_PrivilegeQuery ObjectPrivilege = 16 + ObjectPrivilege_PrivilegeLoadBalance ObjectPrivilege = 17 + ObjectPrivilege_PrivilegeImport ObjectPrivilege = 18 + ObjectPrivilege_PrivilegeCreateOwnership ObjectPrivilege = 19 + ObjectPrivilege_PrivilegeUpdateUser ObjectPrivilege = 20 + ObjectPrivilege_PrivilegeDropOwnership ObjectPrivilege = 21 + ObjectPrivilege_PrivilegeSelectOwnership ObjectPrivilege = 22 + ObjectPrivilege_PrivilegeManageOwnership ObjectPrivilege = 23 + ObjectPrivilege_PrivilegeSelectUser ObjectPrivilege = 24 ) var ObjectPrivilege_name = map[int32]string{ - 0: "PrivilegeAll", - 1: "PrivilegeCreateCollection", - 2: "PrivilegeDropCollection", - 3: "PrivilegeDescribeCollection", - 4: "PrivilegeShowCollections", - 5: "PrivilegeLoad", - 6: "PrivilegeRelease", - 7: "PrivilegeCompaction", - 8: "PrivilegeInsert", - 9: "PrivilegeDelete", + 0: "PrivilegeAll", + 1: "PrivilegeCreateCollection", + 2: "PrivilegeDropCollection", + 3: "PrivilegeDescribeCollection", + 4: "PrivilegeShowCollections", + 5: "PrivilegeLoad", + 6: "PrivilegeRelease", + 7: "PrivilegeCompaction", + 8: "PrivilegeInsert", + 9: "PrivilegeDelete", + 10: "PrivilegeGetStatistics", + 11: "PrivilegeCreateIndex", + 12: "PrivilegeIndexDetail", + 13: "PrivilegeDropIndex", + 14: "PrivilegeSearch", + 15: "PrivilegeFlush", + 16: "PrivilegeQuery", + 17: "PrivilegeLoadBalance", + 18: "PrivilegeImport", + 19: "PrivilegeCreateOwnership", + 20: "PrivilegeUpdateUser", + 21: "PrivilegeDropOwnership", + 22: "PrivilegeSelectOwnership", + 23: "PrivilegeManageOwnership", + 24: "PrivilegeSelectUser", } var ObjectPrivilege_value = map[string]int32{ @@ -744,6 +777,21 @@ var ObjectPrivilege_value = map[string]int32{ "PrivilegeCompaction": 7, "PrivilegeInsert": 8, "PrivilegeDelete": 9, + "PrivilegeGetStatistics": 10, + "PrivilegeCreateIndex": 11, + "PrivilegeIndexDetail": 12, + "PrivilegeDropIndex": 13, + "PrivilegeSearch": 14, + "PrivilegeFlush": 15, + "PrivilegeQuery": 16, + "PrivilegeLoadBalance": 17, + "PrivilegeImport": 18, + "PrivilegeCreateOwnership": 19, + "PrivilegeUpdateUser": 20, + "PrivilegeDropOwnership": 21, + "PrivilegeSelectOwnership": 22, + "PrivilegeManageOwnership": 23, + "PrivilegeSelectUser": 24, } func (x ObjectPrivilege) String() string { @@ -1231,6 +1279,7 @@ type PrivilegeExt struct { ObjectType ObjectType `protobuf:"varint,1,opt,name=object_type,json=objectType,proto3,enum=milvus.proto.common.ObjectType" json:"object_type,omitempty"` ObjectPrivilege ObjectPrivilege `protobuf:"varint,2,opt,name=object_privilege,json=objectPrivilege,proto3,enum=milvus.proto.common.ObjectPrivilege" json:"object_privilege,omitempty"` ObjectNameIndex int32 `protobuf:"varint,3,opt,name=object_name_index,json=objectNameIndex,proto3" json:"object_name_index,omitempty"` + ObjectNameIndexs int32 `protobuf:"varint,4,opt,name=object_name_indexs,json=objectNameIndexs,proto3" json:"object_name_indexs,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -1282,6 +1331,13 @@ func (m *PrivilegeExt) GetObjectNameIndex() int32 { return 0 } +func (m *PrivilegeExt) GetObjectNameIndexs() int32 { + if m != nil { + return m.ObjectNameIndexs + } + return 0 +} + var E_PrivilegeExtObj = &proto.ExtensionDesc{ ExtendedType: (*descriptor.MessageOptions)(nil), ExtensionType: (*PrivilegeExt)(nil), @@ -1320,152 +1376,160 @@ func init() { func init() { proto.RegisterFile("common.proto", fileDescriptor_555bd8c177793206) } var fileDescriptor_555bd8c177793206 = []byte{ - // 2342 bytes of a gzipped FileDescriptorProto + // 2473 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xa4, 0x58, 0x49, 0x73, 0x24, 0x47, - 0xf5, 0x57, 0x75, 0xf7, 0xa8, 0xd5, 0xd9, 0x2d, 0x29, 0x95, 0xd2, 0x68, 0xda, 0xb3, 0x78, 0xe4, - 0xfe, 0xdb, 0x7f, 0x44, 0x83, 0x25, 0xb0, 0x23, 0x80, 0x20, 0xc2, 0x04, 0x52, 0xb7, 0xa4, 0xe9, - 0xb0, 0x96, 0xa6, 0xa4, 0x19, 0x3b, 0x88, 0x00, 0x45, 0x76, 0xd5, 0x53, 0xab, 0x66, 0xaa, 0x2a, - 0x8b, 0xca, 0x6c, 0x8d, 0x9a, 0x93, 0x31, 0x37, 0x4e, 0x60, 0xbe, 0x00, 0x1f, 0x80, 0x7d, 0x31, - 0x1c, 0xd9, 0xb1, 0x01, 0x73, 0xe1, 0xc2, 0x0e, 0x47, 0xb8, 0xb3, 0x7a, 0x25, 0x5e, 0x66, 0x6d, - 0xd2, 0xc8, 0x70, 0xe0, 0x56, 0xf9, 0x7b, 0x2f, 0xdf, 0x96, 0x6f, 0xc9, 0x2c, 0xd2, 0x70, 0x44, - 0x10, 0x88, 0x70, 0x25, 0x8a, 0x85, 0x12, 0x6c, 0x3e, 0xf0, 0xfc, 0x93, 0x91, 0x34, 0xab, 0x15, - 0x43, 0xba, 0xba, 0x34, 0x14, 0x62, 0xe8, 0xc3, 0xaa, 0x06, 0x07, 0xa3, 0xa3, 0x55, 0x17, 0xa4, - 0x13, 0x7b, 0x91, 0x12, 0xb1, 0x61, 0x6c, 0x1d, 0x92, 0xc9, 0x7d, 0xc5, 0xd5, 0x48, 0xb2, 0xa7, - 0x08, 0x81, 0x38, 0x16, 0xf1, 0xa1, 0x23, 0x5c, 0x68, 0x5a, 0x4b, 0xd6, 0xf2, 0xcc, 0x13, 0x0f, - 0xaf, 0x5c, 0x20, 0x75, 0x65, 0x03, 0xd9, 0x3a, 0xc2, 0x05, 0xbb, 0x06, 0xe9, 0x27, 0x5b, 0x24, - 0x93, 0x31, 0x70, 0x29, 0xc2, 0x66, 0x69, 0xc9, 0x5a, 0xae, 0xd9, 0xc9, 0xaa, 0xf5, 0x3e, 0xd2, - 0x78, 0x1a, 0xc6, 0x77, 0xb8, 0x3f, 0x82, 0x3e, 0xf7, 0x62, 0x46, 0x49, 0xf9, 0x1e, 0x8c, 0xb5, - 0xfc, 0x9a, 0x8d, 0x9f, 0x6c, 0x81, 0x5c, 0x3a, 0x41, 0x72, 0xb2, 0xd1, 0x2c, 0x5a, 0x4f, 0x92, - 0xfa, 0xd3, 0x30, 0xee, 0x72, 0xc5, 0xdf, 0x66, 0x1b, 0x23, 0x15, 0x97, 0x2b, 0xae, 0x77, 0x35, - 0x6c, 0xfd, 0xdd, 0xba, 0x4e, 0x2a, 0xeb, 0xbe, 0x18, 0xe4, 0x22, 0x2d, 0x4d, 0x4c, 0x44, 0x9e, - 0x10, 0xda, 0xf7, 0xb9, 0x03, 0xc7, 0xc2, 0x77, 0x21, 0xd6, 0x26, 0xa1, 0x5c, 0xc5, 0x87, 0xa9, - 0x5c, 0xc5, 0x87, 0xec, 0x03, 0xa4, 0xa2, 0xc6, 0x91, 0xb1, 0x66, 0xe6, 0x89, 0x47, 0x2f, 0x8c, - 0x40, 0x41, 0xcc, 0xc1, 0x38, 0x02, 0x5b, 0xef, 0xc0, 0x10, 0x68, 0x45, 0xb2, 0x59, 0x5e, 0x2a, - 0x2f, 0x37, 0xec, 0x64, 0xd5, 0xfa, 0xd8, 0x19, 0xbd, 0x5b, 0xb1, 0x18, 0x45, 0xac, 0x47, 0x1a, - 0x51, 0x8e, 0xc9, 0xa6, 0xb5, 0x54, 0x5e, 0xae, 0x3f, 0xf1, 0xd8, 0x7f, 0xd3, 0xa6, 0x8d, 0xb6, - 0xcf, 0x6c, 0x6d, 0x3d, 0x4e, 0xaa, 0x6b, 0xae, 0x1b, 0x83, 0x94, 0x6c, 0x86, 0x94, 0xbc, 0x28, - 0x71, 0xa6, 0xe4, 0x45, 0x18, 0xa3, 0x48, 0xc4, 0x4a, 0xfb, 0x52, 0xb6, 0xf5, 0x77, 0xeb, 0x05, - 0x8b, 0x54, 0x77, 0xe4, 0x70, 0x9d, 0x4b, 0x60, 0xef, 0x27, 0x53, 0x81, 0x1c, 0x1e, 0x6a, 0x7f, - 0xcd, 0x89, 0x5f, 0xbf, 0xd0, 0x82, 0x1d, 0x39, 0xd4, 0x7e, 0x56, 0x03, 0xf3, 0x81, 0x01, 0x0e, - 0xe4, 0xb0, 0xd7, 0x4d, 0x24, 0x9b, 0x05, 0xbb, 0x4e, 0x6a, 0xca, 0x0b, 0x40, 0x2a, 0x1e, 0x44, - 0xcd, 0xf2, 0x92, 0xb5, 0x5c, 0xb1, 0x73, 0x80, 0x5d, 0x25, 0x53, 0x52, 0x8c, 0x62, 0x07, 0x7a, - 0xdd, 0x66, 0x45, 0x6f, 0xcb, 0xd6, 0xad, 0xa7, 0x48, 0x6d, 0x47, 0x0e, 0x6f, 0x01, 0x77, 0x21, - 0x66, 0xef, 0x21, 0x95, 0x01, 0x97, 0xc6, 0xa2, 0xfa, 0xdb, 0x5b, 0x84, 0x1e, 0xd8, 0x9a, 0xb3, - 0xf5, 0x71, 0xd2, 0xe8, 0xee, 0x6c, 0xff, 0x0f, 0x12, 0xd0, 0x74, 0x79, 0xcc, 0x63, 0x77, 0x97, - 0x07, 0x69, 0x22, 0xe6, 0x40, 0xeb, 0x15, 0x8b, 0x34, 0xfa, 0xb1, 0x77, 0xe2, 0xf9, 0x30, 0x84, - 0x8d, 0x53, 0xc5, 0x3e, 0x4c, 0xea, 0x62, 0x70, 0x17, 0x1c, 0x55, 0x8c, 0xdd, 0xcd, 0x0b, 0xf5, - 0xec, 0x69, 0x3e, 0x1d, 0x3e, 0x22, 0xb2, 0x6f, 0xb6, 0x47, 0x68, 0x22, 0x21, 0x4a, 0x05, 0xff, - 0xc7, 0x94, 0x33, 0x62, 0x32, 0x23, 0xec, 0x59, 0x71, 0x16, 0x60, 0x6d, 0x32, 0x97, 0x08, 0x0c, - 0x79, 0x00, 0x87, 0x5e, 0xe8, 0xc2, 0xa9, 0x3e, 0x84, 0x4b, 0x29, 0x2f, 0xba, 0xd2, 0x43, 0xb8, - 0xfd, 0xcb, 0x29, 0x52, 0xcb, 0xaa, 0x98, 0xd5, 0x49, 0x75, 0x7f, 0xe4, 0x38, 0x20, 0x25, 0x9d, - 0x60, 0xf3, 0x64, 0xf6, 0x76, 0x08, 0xa7, 0x11, 0x38, 0x0a, 0x5c, 0xcd, 0x43, 0x2d, 0x36, 0x47, - 0xa6, 0x3b, 0x22, 0x0c, 0xc1, 0x51, 0x9b, 0xdc, 0xf3, 0xc1, 0xa5, 0x25, 0xb6, 0x40, 0x68, 0x1f, - 0xe2, 0xc0, 0x93, 0xd2, 0x13, 0x61, 0x17, 0x42, 0x0f, 0x5c, 0x5a, 0x66, 0x57, 0xc8, 0x7c, 0x47, - 0xf8, 0x3e, 0x38, 0xca, 0x13, 0xe1, 0xae, 0x50, 0x1b, 0xa7, 0x9e, 0x54, 0x92, 0x56, 0x50, 0x6c, - 0xcf, 0xf7, 0x61, 0xc8, 0xfd, 0xb5, 0x78, 0x38, 0x0a, 0x20, 0x54, 0xf4, 0x12, 0xca, 0x48, 0xc0, - 0xae, 0x17, 0x40, 0x88, 0x92, 0x68, 0xb5, 0x80, 0x6a, 0x63, 0x31, 0x5a, 0x74, 0x8a, 0x3d, 0x44, - 0x2e, 0x27, 0x68, 0x41, 0x01, 0x0f, 0x80, 0xd6, 0xd8, 0x2c, 0xa9, 0x27, 0xa4, 0x83, 0xbd, 0xfe, - 0xd3, 0x94, 0x14, 0x24, 0xd8, 0xe2, 0xbe, 0x0d, 0x8e, 0x88, 0x5d, 0x5a, 0x2f, 0x98, 0x70, 0x07, - 0x1c, 0x25, 0xe2, 0x5e, 0x97, 0x36, 0xd0, 0xe0, 0x04, 0xdc, 0x07, 0x1e, 0x3b, 0xc7, 0x36, 0xc8, - 0x91, 0xaf, 0xe8, 0x34, 0xa3, 0xa4, 0xb1, 0xe9, 0xf9, 0xb0, 0x2b, 0xd4, 0xa6, 0x18, 0x85, 0x2e, - 0x9d, 0x61, 0x33, 0x84, 0xec, 0x80, 0xe2, 0x49, 0x04, 0x66, 0x51, 0x6d, 0x87, 0x3b, 0xc7, 0x90, - 0x00, 0x94, 0x2d, 0x12, 0xd6, 0xe1, 0x61, 0x28, 0x54, 0x27, 0x06, 0xae, 0x60, 0x53, 0xd7, 0x27, - 0x9d, 0x43, 0x73, 0xce, 0xe0, 0x9e, 0x0f, 0x94, 0xe5, 0xdc, 0x5d, 0xf0, 0x21, 0xe3, 0x9e, 0xcf, - 0xb9, 0x13, 0x1c, 0xb9, 0x17, 0xd0, 0xf8, 0xf5, 0x91, 0xe7, 0xbb, 0x3a, 0x24, 0xe6, 0x58, 0x2e, - 0xa3, 0x8d, 0x89, 0xf1, 0xbb, 0xdb, 0xbd, 0xfd, 0x03, 0xba, 0xc8, 0x2e, 0x93, 0xb9, 0x04, 0xd9, - 0x01, 0x15, 0x7b, 0x8e, 0x0e, 0xde, 0x15, 0x34, 0x75, 0x6f, 0xa4, 0xf6, 0x8e, 0x76, 0x20, 0x10, - 0xf1, 0x98, 0x36, 0xf1, 0x40, 0xb5, 0xa4, 0xf4, 0x88, 0xe8, 0x43, 0xa8, 0x61, 0x23, 0x88, 0xd4, - 0x38, 0x0f, 0x2f, 0xbd, 0xca, 0xae, 0x91, 0x2b, 0xb7, 0x23, 0x97, 0x2b, 0xe8, 0x05, 0xd8, 0x3c, - 0x0e, 0xb8, 0xbc, 0x87, 0xee, 0x8e, 0x62, 0xa0, 0xd7, 0xd8, 0x55, 0xb2, 0x78, 0xf6, 0x2c, 0xb2, - 0x60, 0x5d, 0xc7, 0x8d, 0xc6, 0xdb, 0x4e, 0x0c, 0x2e, 0x84, 0xca, 0xe3, 0x7e, 0xba, 0xf1, 0x46, - 0x2e, 0xf5, 0x41, 0xe2, 0xc3, 0x48, 0x34, 0x9e, 0x3f, 0x48, 0xbc, 0xc9, 0x9a, 0x64, 0x61, 0x0b, - 0xd4, 0x83, 0x94, 0x25, 0xa4, 0x6c, 0x7b, 0x52, 0x93, 0x6e, 0x4b, 0x88, 0x65, 0x4a, 0x79, 0x84, - 0x31, 0x32, 0xb3, 0x05, 0x0a, 0xc1, 0x14, 0x6b, 0x61, 0x9c, 0x8c, 0x79, 0xb6, 0xf0, 0x21, 0x85, - 0xff, 0x0f, 0x63, 0xd0, 0x8d, 0x45, 0x54, 0x04, 0x1f, 0x45, 0x37, 0xf7, 0x22, 0x88, 0xb9, 0x02, - 0x94, 0x51, 0xa4, 0x3d, 0x86, 0x72, 0xf6, 0x01, 0x23, 0x50, 0x84, 0xff, 0x3f, 0x87, 0x8b, 0x5a, - 0xdf, 0x81, 0x39, 0x9c, 0x70, 0x83, 0xe9, 0x7c, 0x29, 0x69, 0x19, 0xbd, 0x4e, 0x94, 0x64, 0x15, - 0x9d, 0x12, 0xdf, 0x89, 0xa9, 0x62, 0xf6, 0x6d, 0xc5, 0x3c, 0x54, 0x29, 0xde, 0x66, 0x8f, 0x90, - 0x1b, 0x36, 0x1c, 0xc5, 0x20, 0x8f, 0xfb, 0xc2, 0xf7, 0x9c, 0x71, 0x2f, 0x3c, 0x12, 0x59, 0x4a, - 0x22, 0xcb, 0xbb, 0xd0, 0x12, 0x0c, 0x8b, 0xa1, 0xa7, 0xf0, 0xbb, 0x31, 0x26, 0xbb, 0x42, 0xed, - 0x63, 0x83, 0xdb, 0xd6, 0x2d, 0x93, 0x3e, 0x8e, 0x5a, 0x76, 0x85, 0x0d, 0x91, 0xef, 0x39, 0x7c, - 0xed, 0x84, 0x7b, 0x3e, 0x1f, 0xf8, 0x40, 0x57, 0x30, 0x28, 0xfb, 0x30, 0xc4, 0x92, 0xcd, 0xce, - 0x77, 0x95, 0x31, 0x32, 0xdd, 0xed, 0xda, 0xf0, 0x89, 0x11, 0x48, 0x65, 0x73, 0x07, 0xe8, 0x9f, - 0xab, 0xed, 0x67, 0x09, 0xd1, 0x49, 0x85, 0x17, 0x0a, 0x40, 0x15, 0xf9, 0x6a, 0x57, 0x84, 0x40, - 0x27, 0x58, 0x83, 0x4c, 0xdd, 0x0e, 0x3d, 0x29, 0x47, 0xe0, 0x52, 0x0b, 0x0b, 0xaa, 0x17, 0xf6, - 0x63, 0x31, 0xc4, 0xd9, 0x45, 0x4b, 0x48, 0xdd, 0xf4, 0x42, 0x4f, 0x1e, 0xeb, 0x56, 0x42, 0xc8, - 0x64, 0x52, 0x59, 0x95, 0xf6, 0xf3, 0x16, 0x69, 0x24, 0x36, 0x18, 0xe1, 0x0b, 0x84, 0x16, 0xd7, - 0xb9, 0xf8, 0x2c, 0xa1, 0x2d, 0x6c, 0x6b, 0x5b, 0xb1, 0xb8, 0xef, 0x85, 0x43, 0x5a, 0x42, 0x69, - 0xfb, 0xc0, 0x7d, 0x2d, 0xb9, 0x4e, 0xaa, 0x9b, 0xfe, 0x48, 0xab, 0xa9, 0x68, 0xa5, 0xb8, 0x40, - 0xb6, 0x4b, 0x48, 0xc2, 0x04, 0x88, 0xc0, 0xa5, 0x93, 0x6c, 0x9a, 0xd4, 0x4c, 0xda, 0x23, 0xad, - 0xda, 0xfe, 0x10, 0x99, 0x3d, 0x37, 0xf7, 0xd9, 0x14, 0xa9, 0x24, 0xaa, 0x29, 0x69, 0xac, 0x7b, - 0x21, 0x8f, 0xc7, 0xa6, 0xb7, 0x50, 0x17, 0x6b, 0x6e, 0xd3, 0x17, 0x5c, 0x25, 0x00, 0xb4, 0x5f, - 0x6c, 0xe8, 0xc1, 0xab, 0x37, 0x4e, 0x93, 0xda, 0xed, 0xd0, 0x85, 0x23, 0x2f, 0x04, 0x97, 0x4e, - 0xe8, 0x9a, 0x37, 0xd5, 0x92, 0x17, 0x9f, 0x8b, 0x11, 0x44, 0x63, 0x0a, 0x18, 0x60, 0xe1, 0xde, - 0xe2, 0xb2, 0x00, 0x1d, 0xe1, 0xb9, 0x75, 0xf5, 0xb5, 0x6e, 0x50, 0xdc, 0x3e, 0xd4, 0xe7, 0x76, - 0x2c, 0xee, 0xe7, 0x98, 0xa4, 0xc7, 0xa8, 0x69, 0x0b, 0xd4, 0xfe, 0x58, 0x2a, 0x08, 0x3a, 0x22, - 0x3c, 0xf2, 0x86, 0x92, 0x7a, 0xa8, 0x69, 0x5b, 0x70, 0xb7, 0xb0, 0xfd, 0x2e, 0x66, 0x8e, 0x0d, - 0x3e, 0x70, 0x59, 0x94, 0x7a, 0x4f, 0x77, 0x3d, 0x6d, 0xea, 0x9a, 0xef, 0x71, 0x49, 0x7d, 0x74, - 0x05, 0xad, 0x34, 0xcb, 0x00, 0x0f, 0x75, 0xcd, 0x57, 0x10, 0x9b, 0x75, 0xc8, 0x16, 0xc8, 0xac, - 0xe1, 0xef, 0xf3, 0x58, 0x79, 0x5a, 0xc8, 0x4b, 0x96, 0x4e, 0x9f, 0x58, 0x44, 0x39, 0xf6, 0x32, - 0x0e, 0x99, 0xc6, 0x2d, 0x2e, 0x73, 0xe8, 0xa7, 0x16, 0x5b, 0x24, 0x73, 0xa9, 0x6b, 0x39, 0xfe, - 0x33, 0x8b, 0xcd, 0x93, 0x19, 0x74, 0x2d, 0xc3, 0x24, 0xfd, 0xb9, 0x06, 0xd1, 0x89, 0x02, 0xf8, - 0x8a, 0x96, 0x90, 0x78, 0x51, 0xc0, 0x7f, 0xa1, 0x95, 0xa1, 0x84, 0x24, 0x89, 0x24, 0x7d, 0xd5, - 0x42, 0x4b, 0x53, 0x65, 0x09, 0x4c, 0x5f, 0xd3, 0x8c, 0x28, 0x35, 0x63, 0x7c, 0x5d, 0x33, 0x26, - 0x32, 0x33, 0xf4, 0x0d, 0x8d, 0xde, 0xe2, 0xa1, 0x2b, 0x8e, 0x8e, 0x32, 0xf4, 0x4d, 0x8b, 0x35, - 0xc9, 0x3c, 0x6e, 0x5f, 0xe7, 0x3e, 0x0f, 0x9d, 0x9c, 0xff, 0x2d, 0x8b, 0x5d, 0x26, 0xf4, 0x9c, - 0x3a, 0x49, 0x9f, 0x2b, 0x31, 0x9a, 0xc6, 0x57, 0x17, 0x0f, 0xfd, 0x62, 0x49, 0xc7, 0x2a, 0x61, - 0x34, 0xd8, 0x97, 0x4a, 0x6c, 0xc6, 0x04, 0xdd, 0xac, 0xbf, 0x5c, 0x62, 0x75, 0x32, 0xd9, 0x0b, - 0x25, 0xc4, 0x8a, 0x7e, 0x16, 0xf3, 0x7b, 0xd2, 0x74, 0x50, 0xfa, 0x39, 0x2c, 0xa3, 0x4b, 0x3a, - 0xbf, 0xe9, 0x0b, 0x38, 0x9d, 0x99, 0x0d, 0x12, 0x42, 0xb7, 0x50, 0x3b, 0x92, 0x7e, 0x5e, 0xef, - 0x30, 0xe3, 0x8f, 0xfe, 0xb5, 0xac, 0x43, 0x53, 0x9c, 0x85, 0x7f, 0x2b, 0xa3, 0x09, 0x5b, 0xa0, - 0xf2, 0x72, 0xa6, 0x7f, 0x2f, 0xb3, 0xab, 0xe4, 0x72, 0x8a, 0xe9, 0xc9, 0x94, 0x15, 0xf2, 0x3f, - 0xca, 0xec, 0x3a, 0xb9, 0x82, 0x6d, 0x3a, 0xcb, 0x1b, 0xdc, 0xe4, 0x49, 0xe5, 0x39, 0x92, 0xfe, - 0xb3, 0xcc, 0xae, 0x91, 0xc5, 0x2d, 0x50, 0xd9, 0x79, 0x14, 0x88, 0xff, 0x2a, 0xb3, 0x69, 0x32, - 0x65, 0xe3, 0xe8, 0x82, 0x13, 0xa0, 0xaf, 0x96, 0xf1, 0x50, 0xd3, 0x65, 0x62, 0xce, 0x6b, 0x65, - 0x0c, 0xf5, 0x33, 0x5c, 0x39, 0xc7, 0xdd, 0xa0, 0x73, 0xcc, 0xc3, 0x10, 0x7c, 0x49, 0x5f, 0x2f, - 0x63, 0x40, 0x6d, 0x08, 0xc4, 0x09, 0x14, 0xe0, 0x37, 0xb4, 0xd3, 0x9a, 0xf9, 0x23, 0x23, 0x88, - 0xc7, 0x19, 0xe1, 0xcd, 0x32, 0x1e, 0x8d, 0xe1, 0x3f, 0x4b, 0x79, 0xab, 0xcc, 0x6e, 0x90, 0xa6, - 0x69, 0x16, 0xe9, 0xc1, 0x20, 0x71, 0x08, 0xd8, 0x5e, 0xe9, 0x73, 0x95, 0x4c, 0x62, 0x17, 0x7c, - 0xc5, 0xb3, 0x7d, 0x9f, 0xaa, 0xa0, 0x5d, 0x58, 0x5c, 0x79, 0x57, 0x95, 0xf4, 0xf9, 0x0a, 0x9e, - 0xe8, 0x16, 0xa8, 0xa4, 0xb1, 0x4a, 0xfa, 0x69, 0x8d, 0x24, 0x92, 0xb5, 0xc8, 0x5f, 0x55, 0xd8, - 0x2c, 0x21, 0xa6, 0x26, 0x35, 0xf0, 0xeb, 0x54, 0x14, 0xde, 0x5d, 0x4e, 0x20, 0xd6, 0x8d, 0x9d, - 0xfe, 0x26, 0x53, 0x50, 0xe8, 0x7c, 0xf4, 0xb7, 0x15, 0x0c, 0xd9, 0x81, 0x17, 0xc0, 0x81, 0xe7, - 0xdc, 0xa3, 0x5f, 0xad, 0x61, 0xc8, 0xb4, 0x47, 0xbb, 0xc2, 0x05, 0x73, 0xc2, 0x5f, 0xab, 0x61, - 0xc2, 0x60, 0x1e, 0x9a, 0x84, 0xf9, 0xba, 0x5e, 0x27, 0xdd, 0xbb, 0xd7, 0xa5, 0xdf, 0xc0, 0x3b, - 0x14, 0x49, 0xd6, 0x07, 0xfb, 0x7b, 0xf4, 0x9b, 0x35, 0x54, 0xb5, 0xe6, 0xfb, 0xc2, 0xe1, 0x2a, - 0xab, 0x86, 0x6f, 0xd5, 0xb0, 0x9c, 0x0a, 0xda, 0x93, 0x53, 0x7b, 0xb1, 0x86, 0xb1, 0x4f, 0x70, - 0x9d, 0x6c, 0x5d, 0x6c, 0x8a, 0xdf, 0xd6, 0x52, 0xf1, 0x05, 0x87, 0x96, 0x1c, 0x28, 0xfa, 0x1d, - 0xcd, 0x77, 0xfe, 0x5a, 0x40, 0x7f, 0x57, 0x4f, 0xf2, 0xab, 0x80, 0xfd, 0xbe, 0x6e, 0xea, 0xe3, - 0xec, 0x3d, 0x80, 0xfe, 0x41, 0xc3, 0xe7, 0xef, 0x0e, 0xf4, 0x8f, 0x75, 0x34, 0xac, 0x38, 0xfe, - 0xf1, 0x0a, 0x2c, 0xe9, 0x9f, 0xea, 0x68, 0x41, 0x3e, 0xe8, 0xe9, 0x77, 0x1b, 0x18, 0xac, 0x74, - 0xc4, 0xd3, 0xef, 0x35, 0xd0, 0xcd, 0x73, 0xc3, 0x9d, 0x7e, 0xbf, 0xa1, 0x8f, 0x23, 0x1b, 0xeb, - 0xf4, 0x07, 0x05, 0x00, 0xb9, 0xe8, 0x0f, 0x1b, 0xba, 0x03, 0x9d, 0x19, 0xe5, 0xf4, 0x47, 0x0d, - 0xb4, 0xed, 0xfc, 0x10, 0xa7, 0x3f, 0x6e, 0x98, 0xe3, 0xce, 0xc6, 0x37, 0xfd, 0x49, 0x03, 0x2b, - 0xe0, 0xe2, 0xc1, 0x4d, 0x5f, 0xd2, 0xba, 0xf2, 0x91, 0x4d, 0x5f, 0x6e, 0xb4, 0x5b, 0xa4, 0xda, - 0x95, 0xbe, 0x9e, 0x1b, 0x55, 0x52, 0xee, 0x4a, 0x9f, 0x4e, 0x60, 0x9b, 0x5d, 0x17, 0xc2, 0xdf, - 0x38, 0x8d, 0xe2, 0x3b, 0xef, 0xa5, 0x56, 0x7b, 0x9d, 0xcc, 0x76, 0x44, 0x10, 0xf1, 0xac, 0xdc, - 0xf4, 0xa8, 0x30, 0x33, 0x06, 0x5c, 0x93, 0x2a, 0x13, 0xd8, 0xab, 0x37, 0x4e, 0xc1, 0x19, 0xe9, - 0x89, 0x66, 0xe1, 0x12, 0x37, 0x61, 0x90, 0x5d, 0x5a, 0x6a, 0x3f, 0x4b, 0x68, 0x47, 0x84, 0xd2, - 0x93, 0x0a, 0x42, 0x67, 0xbc, 0x0d, 0x27, 0xe0, 0xeb, 0xb9, 0xa9, 0x62, 0x11, 0x0e, 0xe9, 0x84, - 0x7e, 0x27, 0x80, 0xbe, 0xef, 0x9b, 0xe9, 0xba, 0x8e, 0x77, 0x01, 0xfd, 0x18, 0x98, 0x21, 0x64, - 0xe3, 0x04, 0x42, 0x35, 0xe2, 0xbe, 0x3f, 0xa6, 0x65, 0x5c, 0x77, 0x46, 0x52, 0x89, 0xc0, 0xfb, - 0xa4, 0x9e, 0xdf, 0x5f, 0xb1, 0x48, 0xdd, 0x8c, 0xd2, 0xcc, 0x34, 0xb3, 0xec, 0x43, 0xe8, 0x7a, - 0x5a, 0x38, 0xde, 0x65, 0x35, 0x94, 0x0c, 0x7d, 0x2b, 0x67, 0xda, 0x57, 0x3c, 0x56, 0xe9, 0xa3, - 0xc3, 0x40, 0x5d, 0x71, 0x3f, 0xf4, 0x05, 0x77, 0xf5, 0x3c, 0xcf, 0xb6, 0xf6, 0x79, 0x2c, 0xf5, - 0x50, 0xc7, 0xab, 0x7e, 0x22, 0x3f, 0xd6, 0xfe, 0xb8, 0xf4, 0x52, 0x0e, 0xe6, 0x3e, 0x4f, 0xe2, - 0xf0, 0x34, 0xa0, 0x4e, 0xf6, 0x34, 0xd3, 0x49, 0x7b, 0x99, 0x90, 0xfc, 0xe1, 0xa6, 0xfd, 0xc9, - 0x87, 0xe0, 0x04, 0x46, 0x65, 0xcb, 0x17, 0x03, 0xee, 0x53, 0xab, 0xfd, 0x99, 0x12, 0x99, 0x3d, - 0xf7, 0x38, 0x43, 0x8b, 0xb2, 0xc5, 0x9a, 0x8f, 0xe7, 0x75, 0x83, 0x3c, 0x94, 0x21, 0x0f, 0x8c, - 0x7a, 0x0b, 0xaf, 0x7f, 0x19, 0xf9, 0xdc, 0xcc, 0x2f, 0xb1, 0x9b, 0xe4, 0x5a, 0x4e, 0x7c, 0x70, - 0xd2, 0x63, 0xbb, 0x6d, 0x66, 0x0c, 0xe7, 0x47, 0x7e, 0x05, 0xe3, 0x98, 0x51, 0xb1, 0x07, 0x98, - 0x87, 0x57, 0xfe, 0x92, 0x34, 0xa3, 0x8c, 0x4e, 0xe2, 0x5b, 0x28, 0xb7, 0x31, 0x4b, 0x26, 0x5a, - 0xc5, 0xc8, 0x65, 0x84, 0x64, 0xcc, 0x4c, 0x9d, 0x01, 0x93, 0x71, 0x53, 0xfb, 0xa0, 0x20, 0x73, - 0xd9, 0x73, 0xf6, 0x10, 0x4e, 0xd5, 0xa1, 0x18, 0xdc, 0x65, 0x37, 0x57, 0xcc, 0x6f, 0xa8, 0x95, - 0xf4, 0x37, 0xd4, 0xca, 0x0e, 0x48, 0xc9, 0x87, 0xb0, 0x17, 0x69, 0x1b, 0x9b, 0x7f, 0xa9, 0xea, - 0x77, 0xfa, 0x23, 0x17, 0xff, 0xfd, 0x28, 0xbc, 0xbb, 0xed, 0xd9, 0xa8, 0xb0, 0xda, 0x1b, 0xdc, - 0x5d, 0x7f, 0x86, 0xcc, 0x78, 0x22, 0xdd, 0x37, 0x8c, 0x23, 0x67, 0xbd, 0xde, 0xd1, 0xfb, 0xfa, - 0x28, 0xa3, 0x6f, 0x7d, 0xf4, 0xc9, 0xa1, 0xa7, 0x8e, 0x47, 0x03, 0x94, 0xb6, 0x6a, 0xd8, 0x1e, - 0xf7, 0x44, 0xf2, 0xb5, 0xea, 0x85, 0x0a, 0x7b, 0x85, 0x6f, 0x7e, 0x90, 0xad, 0x1a, 0x8d, 0xd1, - 0xe0, 0x0b, 0x96, 0x35, 0x98, 0xd4, 0xd0, 0x93, 0xff, 0x0e, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x59, - 0x0b, 0xcb, 0x66, 0x13, 0x00, 0x00, + 0xf5, 0x57, 0x75, 0xb7, 0x96, 0xce, 0x6e, 0x49, 0x4f, 0x29, 0x8d, 0xa6, 0x3d, 0x8b, 0x47, 0xd6, + 0xdf, 0xfe, 0x33, 0x08, 0x5b, 0x03, 0xe3, 0x08, 0x20, 0x88, 0x30, 0x81, 0xd4, 0x2d, 0x69, 0x14, + 0x1e, 0x2d, 0x94, 0x34, 0xb6, 0x83, 0x08, 0x98, 0x48, 0x55, 0x3d, 0x75, 0xd7, 0x4c, 0x75, 0x65, + 0x51, 0x99, 0xad, 0x51, 0x73, 0x32, 0x26, 0x82, 0x33, 0x98, 0x2f, 0xc0, 0x07, 0x60, 0x5f, 0x0c, + 0x47, 0x76, 0x6c, 0xb6, 0x0b, 0x17, 0x76, 0x38, 0xc2, 0x9d, 0xd5, 0x2b, 0xf1, 0x32, 0x6b, 0x6b, + 0xcd, 0x18, 0x0e, 0xdc, 0x3a, 0x7f, 0xef, 0xe5, 0xdb, 0x97, 0xac, 0x66, 0x4d, 0x4f, 0xf6, 0xfb, + 0x32, 0x5a, 0x8d, 0x13, 0xa9, 0x25, 0x9f, 0xef, 0x07, 0xe1, 0xc9, 0x40, 0xd9, 0xd3, 0xaa, 0x25, + 0x5d, 0x58, 0xea, 0x4a, 0xd9, 0x0d, 0xf1, 0x9a, 0x01, 0x8f, 0x06, 0xc7, 0xd7, 0x7c, 0x54, 0x5e, + 0x12, 0xc4, 0x5a, 0x26, 0x96, 0x71, 0xf9, 0x36, 0x9b, 0x38, 0xd0, 0x42, 0x0f, 0x14, 0x7f, 0x8a, + 0x31, 0x4c, 0x12, 0x99, 0xdc, 0xf6, 0xa4, 0x8f, 0x2d, 0x67, 0xc9, 0xb9, 0x3a, 0x73, 0xfd, 0xe1, + 0xd5, 0x07, 0x48, 0x5d, 0xdd, 0x20, 0xb6, 0xb6, 0xf4, 0xd1, 0xad, 0x63, 0xf6, 0x93, 0x2f, 0xb2, + 0x89, 0x04, 0x85, 0x92, 0x51, 0xab, 0xb2, 0xe4, 0x5c, 0xad, 0xbb, 0xe9, 0x69, 0xf9, 0xbd, 0xac, + 0xf9, 0x34, 0x0e, 0x9f, 0x11, 0xe1, 0x00, 0xf7, 0x45, 0x90, 0x70, 0x60, 0xd5, 0xbb, 0x38, 0x34, + 0xf2, 0xeb, 0x2e, 0xfd, 0xe4, 0x0b, 0x6c, 0xfc, 0x84, 0xc8, 0xe9, 0x45, 0x7b, 0x58, 0x7e, 0x92, + 0x35, 0x9e, 0xc6, 0x61, 0x47, 0x68, 0xf1, 0x36, 0xd7, 0x38, 0xab, 0xf9, 0x42, 0x0b, 0x73, 0xab, + 0xe9, 0x9a, 0xdf, 0xcb, 0x97, 0x58, 0x6d, 0x3d, 0x94, 0x47, 0x85, 0x48, 0xc7, 0x10, 0x53, 0x91, + 0x27, 0x0c, 0xf6, 0x43, 0xe1, 0x61, 0x4f, 0x86, 0x3e, 0x26, 0xc6, 0x24, 0x92, 0xab, 0x45, 0x37, + 0x93, 0xab, 0x45, 0x97, 0xbf, 0x9f, 0xd5, 0xf4, 0x30, 0xb6, 0xd6, 0xcc, 0x5c, 0x7f, 0xf4, 0x81, + 0x11, 0x28, 0x89, 0x39, 0x1c, 0xc6, 0xe8, 0x9a, 0x1b, 0x14, 0x02, 0xa3, 0x48, 0xb5, 0xaa, 0x4b, + 0xd5, 0xab, 0x4d, 0x37, 0x3d, 0x2d, 0x7f, 0x74, 0x44, 0xef, 0x56, 0x22, 0x07, 0x31, 0xdf, 0x66, + 0xcd, 0xb8, 0xc0, 0x54, 0xcb, 0x59, 0xaa, 0x5e, 0x6d, 0x5c, 0x7f, 0xec, 0xbf, 0x69, 0x33, 0x46, + 0xbb, 0x23, 0x57, 0x97, 0x9f, 0x60, 0x93, 0x6b, 0xbe, 0x9f, 0xa0, 0x52, 0x7c, 0x86, 0x55, 0x82, + 0x38, 0x75, 0xa6, 0x12, 0xc4, 0x14, 0xa3, 0x58, 0x26, 0xda, 0xf8, 0x52, 0x75, 0xcd, 0xef, 0xe5, + 0x17, 0x1d, 0x36, 0xb9, 0xa3, 0xba, 0xeb, 0x42, 0x21, 0x7f, 0x1f, 0x9b, 0xea, 0xab, 0xee, 0x6d, + 0xe3, 0xaf, 0xcd, 0xf8, 0xa5, 0x07, 0x5a, 0xb0, 0xa3, 0xba, 0xc6, 0xcf, 0xc9, 0xbe, 0xfd, 0x41, + 0x01, 0xee, 0xab, 0xee, 0x76, 0x27, 0x95, 0x6c, 0x0f, 0xfc, 0x12, 0xab, 0xeb, 0xa0, 0x8f, 0x4a, + 0x8b, 0x7e, 0xdc, 0xaa, 0x2e, 0x39, 0x57, 0x6b, 0x6e, 0x01, 0xf0, 0x0b, 0x6c, 0x4a, 0xc9, 0x41, + 0xe2, 0xe1, 0x76, 0xa7, 0x55, 0x33, 0xd7, 0xf2, 0xf3, 0xf2, 0x53, 0xac, 0xbe, 0xa3, 0xba, 0x37, + 0x50, 0xf8, 0x98, 0xf0, 0x77, 0xb3, 0xda, 0x91, 0x50, 0xd6, 0xa2, 0xc6, 0xdb, 0x5b, 0x44, 0x1e, + 0xb8, 0x86, 0x73, 0xf9, 0x63, 0xac, 0xd9, 0xd9, 0xb9, 0xf9, 0x3f, 0x48, 0x20, 0xd3, 0x55, 0x4f, + 0x24, 0xfe, 0xae, 0xe8, 0x67, 0x85, 0x58, 0x00, 0xcb, 0xaf, 0x39, 0xac, 0xb9, 0x9f, 0x04, 0x27, + 0x41, 0x88, 0x5d, 0xdc, 0x38, 0xd5, 0xfc, 0x43, 0xac, 0x21, 0x8f, 0xee, 0xa0, 0xa7, 0xcb, 0xb1, + 0xbb, 0xf2, 0x40, 0x3d, 0x7b, 0x86, 0xcf, 0x84, 0x8f, 0xc9, 0xfc, 0x37, 0xdf, 0x63, 0x90, 0x4a, + 0x88, 0x33, 0xc1, 0xff, 0xb1, 0xe4, 0xac, 0x98, 0xdc, 0x08, 0x77, 0x56, 0x8e, 0x02, 0x7c, 0x85, + 0xcd, 0xa5, 0x02, 0x23, 0xd1, 0xc7, 0xdb, 0x41, 0xe4, 0xe3, 0xa9, 0x49, 0xc2, 0x78, 0xc6, 0x4b, + 0xae, 0x6c, 0x13, 0xcc, 0x1f, 0x67, 0xfc, 0x3e, 0x5e, 0x65, 0x92, 0x32, 0xee, 0xc2, 0x19, 0x66, + 0xb5, 0xf2, 0xcb, 0x29, 0x56, 0xcf, 0x7b, 0x9e, 0x37, 0xd8, 0xe4, 0xc1, 0xc0, 0xf3, 0x50, 0x29, + 0x18, 0xe3, 0xf3, 0x6c, 0xf6, 0x56, 0x84, 0xa7, 0x31, 0x7a, 0x1a, 0x7d, 0xc3, 0x03, 0x0e, 0x9f, + 0x63, 0xd3, 0x6d, 0x19, 0x45, 0xe8, 0xe9, 0x4d, 0x11, 0x84, 0xe8, 0x43, 0x85, 0x2f, 0x30, 0xd8, + 0xc7, 0xa4, 0x1f, 0x28, 0x15, 0xc8, 0xa8, 0x83, 0x51, 0x80, 0x3e, 0x54, 0xf9, 0x79, 0x36, 0xdf, + 0x96, 0x61, 0x88, 0x9e, 0x0e, 0x64, 0xb4, 0x2b, 0xf5, 0xc6, 0x69, 0xa0, 0xb4, 0x82, 0x1a, 0x89, + 0xdd, 0x0e, 0x43, 0xec, 0x8a, 0x70, 0x2d, 0xe9, 0x0e, 0xfa, 0x18, 0x69, 0x18, 0x27, 0x19, 0x29, + 0xd8, 0x09, 0xfa, 0x18, 0x91, 0x24, 0x98, 0x2c, 0xa1, 0xc6, 0x5a, 0x8a, 0x2d, 0x4c, 0xf1, 0x87, + 0xd8, 0xb9, 0x14, 0x2d, 0x29, 0x10, 0x7d, 0x84, 0x3a, 0x9f, 0x65, 0x8d, 0x94, 0x74, 0xb8, 0xb7, + 0xff, 0x34, 0xb0, 0x92, 0x04, 0x57, 0xde, 0x73, 0xd1, 0x93, 0x89, 0x0f, 0x8d, 0x92, 0x09, 0xcf, + 0xa0, 0xa7, 0x65, 0xb2, 0xdd, 0x81, 0x26, 0x19, 0x9c, 0x82, 0x07, 0x28, 0x12, 0xaf, 0xe7, 0xa2, + 0x1a, 0x84, 0x1a, 0xa6, 0x39, 0xb0, 0xe6, 0x66, 0x10, 0xe2, 0xae, 0xd4, 0x9b, 0x72, 0x10, 0xf9, + 0x30, 0xc3, 0x67, 0x18, 0xdb, 0x41, 0x2d, 0xd2, 0x08, 0xcc, 0x92, 0xda, 0xb6, 0xf0, 0x7a, 0x98, + 0x02, 0xc0, 0x17, 0x19, 0x6f, 0x8b, 0x28, 0x92, 0xba, 0x9d, 0xa0, 0xd0, 0xb8, 0x69, 0xba, 0x19, + 0xe6, 0xc8, 0x9c, 0x11, 0x3c, 0x08, 0x11, 0x78, 0xc1, 0xdd, 0xc1, 0x10, 0x73, 0xee, 0xf9, 0x82, + 0x3b, 0xc5, 0x89, 0x7b, 0x81, 0x8c, 0x5f, 0x1f, 0x04, 0xa1, 0x6f, 0x42, 0x62, 0xd3, 0x72, 0x8e, + 0x6c, 0x4c, 0x8d, 0xdf, 0xbd, 0xb9, 0x7d, 0x70, 0x08, 0x8b, 0xfc, 0x1c, 0x9b, 0x4b, 0x91, 0x1d, + 0xd4, 0x49, 0xe0, 0x99, 0xe0, 0x9d, 0x27, 0x53, 0xf7, 0x06, 0x7a, 0xef, 0x78, 0x07, 0xfb, 0x32, + 0x19, 0x42, 0x8b, 0x12, 0x6a, 0x24, 0x65, 0x29, 0x82, 0x87, 0x48, 0xc3, 0x46, 0x3f, 0xd6, 0xc3, + 0x22, 0xbc, 0x70, 0x81, 0x5f, 0x64, 0xe7, 0x6f, 0xc5, 0xbe, 0xd0, 0xb8, 0xdd, 0xa7, 0x51, 0x73, + 0x28, 0xd4, 0x5d, 0x72, 0x77, 0x90, 0x20, 0x5c, 0xe4, 0x17, 0xd8, 0xe2, 0x68, 0x2e, 0xf2, 0x60, + 0x5d, 0xa2, 0x8b, 0xd6, 0xdb, 0x76, 0x82, 0x3e, 0x46, 0x3a, 0x10, 0x61, 0x76, 0xf1, 0x72, 0x21, + 0xf5, 0x7e, 0xe2, 0xc3, 0x44, 0xb4, 0x9e, 0xdf, 0x4f, 0xbc, 0xc2, 0x5b, 0x6c, 0x61, 0x0b, 0xf5, + 0xfd, 0x94, 0x25, 0xa2, 0xdc, 0x0c, 0x94, 0x21, 0xdd, 0x52, 0x98, 0xa8, 0x8c, 0xf2, 0x08, 0xe7, + 0x6c, 0x66, 0x0b, 0x35, 0x81, 0x19, 0xb6, 0x4c, 0x71, 0xb2, 0xe6, 0xb9, 0x32, 0xc4, 0x0c, 0xfe, + 0x3f, 0x8a, 0x41, 0x27, 0x91, 0x71, 0x19, 0x7c, 0x94, 0xdc, 0xdc, 0x8b, 0x31, 0x11, 0x1a, 0x49, + 0x46, 0x99, 0xf6, 0x18, 0xc9, 0x39, 0x40, 0x8a, 0x40, 0x19, 0xfe, 0xff, 0x02, 0x2e, 0x6b, 0x7d, + 0x07, 0xd5, 0x70, 0xca, 0x8d, 0x76, 0x4e, 0x66, 0xa4, 0xab, 0xe4, 0x75, 0xaa, 0x24, 0xef, 0xff, + 0x8c, 0xf8, 0x4e, 0x2a, 0x15, 0x7b, 0x6f, 0x2b, 0x11, 0x91, 0xce, 0xf0, 0x15, 0xfe, 0x08, 0xbb, + 0xec, 0xe2, 0x71, 0x82, 0xaa, 0xb7, 0x2f, 0xc3, 0xc0, 0x1b, 0x6e, 0x47, 0xc7, 0x32, 0x2f, 0x49, + 0x62, 0x79, 0x17, 0x59, 0x42, 0x61, 0xb1, 0xf4, 0x0c, 0x7e, 0x9c, 0x62, 0xb2, 0x2b, 0xf5, 0x01, + 0x8d, 0xc3, 0x9b, 0x66, 0xc0, 0xc2, 0x13, 0xa4, 0x65, 0x57, 0xba, 0x18, 0x87, 0x81, 0x27, 0xd6, + 0x4e, 0x44, 0x10, 0x8a, 0xa3, 0x10, 0x61, 0x95, 0x82, 0x72, 0x80, 0x5d, 0x6a, 0xd9, 0x3c, 0xbf, + 0xd7, 0x38, 0x67, 0xd3, 0x9d, 0x8e, 0x8b, 0x1f, 0x1f, 0xa0, 0xd2, 0xae, 0xf0, 0x10, 0xfe, 0x3c, + 0xb9, 0xf2, 0x1c, 0x63, 0xa6, 0xa8, 0xe8, 0xf9, 0x81, 0xa4, 0xa2, 0x38, 0xed, 0xca, 0x08, 0x61, + 0x8c, 0x37, 0xd9, 0xd4, 0xad, 0x28, 0x50, 0x6a, 0x80, 0x3e, 0x38, 0xd4, 0x50, 0xdb, 0xd1, 0x7e, + 0x22, 0xbb, 0xb4, 0xe9, 0xa0, 0x42, 0xd4, 0xcd, 0x20, 0x0a, 0x54, 0xcf, 0x8c, 0x12, 0xc6, 0x26, + 0xd2, 0xce, 0xaa, 0xad, 0xbc, 0xe0, 0xb0, 0x66, 0x6a, 0x83, 0x15, 0xbe, 0xc0, 0xa0, 0x7c, 0x2e, + 0xc4, 0xe7, 0x05, 0xed, 0xd0, 0x58, 0xdb, 0x4a, 0xe4, 0xbd, 0x20, 0xea, 0x42, 0x85, 0xa4, 0x1d, + 0xa0, 0x08, 0x8d, 0xe4, 0x06, 0x9b, 0xdc, 0x0c, 0x07, 0x46, 0x4d, 0xcd, 0x28, 0xa5, 0x03, 0xb1, + 0x8d, 0x13, 0x89, 0x0a, 0x20, 0x46, 0x1f, 0x26, 0xf8, 0x34, 0xab, 0xdb, 0xb2, 0x27, 0xda, 0xe4, + 0xca, 0x07, 0xd9, 0xec, 0x99, 0x57, 0x02, 0x9f, 0x62, 0xb5, 0x54, 0x35, 0xb0, 0xe6, 0x7a, 0x10, + 0x89, 0x64, 0x68, 0x67, 0x0b, 0xf8, 0xd4, 0x73, 0x9b, 0xa1, 0x14, 0x3a, 0x05, 0x70, 0xe5, 0xa5, + 0xa6, 0x59, 0xd3, 0xe6, 0xe2, 0x34, 0xab, 0xdf, 0x8a, 0x7c, 0x3c, 0x0e, 0x22, 0xf4, 0x61, 0xcc, + 0xf4, 0xbc, 0xed, 0x96, 0xa2, 0xf9, 0x7c, 0x8a, 0x20, 0x19, 0x53, 0xc2, 0x90, 0x1a, 0xf7, 0x86, + 0x50, 0x25, 0xe8, 0x98, 0xf2, 0xd6, 0x31, 0x8f, 0xc0, 0xa3, 0xf2, 0xf5, 0xae, 0xc9, 0x5b, 0x4f, + 0xde, 0x2b, 0x30, 0x05, 0x3d, 0xd2, 0xb4, 0x85, 0xfa, 0x60, 0xa8, 0x34, 0xf6, 0xdb, 0x32, 0x3a, + 0x0e, 0xba, 0x0a, 0x02, 0xd2, 0x74, 0x53, 0x0a, 0xbf, 0x74, 0xfd, 0x0e, 0x55, 0x8e, 0x8b, 0x21, + 0x0a, 0x55, 0x96, 0x7a, 0xd7, 0x4c, 0x3d, 0x63, 0xea, 0x5a, 0x18, 0x08, 0x05, 0x21, 0xb9, 0x42, + 0x56, 0xda, 0x63, 0x9f, 0x92, 0xba, 0x16, 0x6a, 0x4c, 0xec, 0x39, 0xe2, 0x0b, 0x6c, 0xd6, 0xf2, + 0xef, 0x8b, 0x44, 0x07, 0x46, 0xc8, 0xcb, 0x8e, 0x29, 0x9f, 0x44, 0xc6, 0x05, 0xf6, 0x0a, 0x2d, + 0x99, 0xe6, 0x0d, 0xa1, 0x0a, 0xe8, 0x27, 0x0e, 0x5f, 0x64, 0x73, 0x99, 0x6b, 0x05, 0xfe, 0x53, + 0x87, 0xcf, 0xb3, 0x19, 0x72, 0x2d, 0xc7, 0x14, 0xfc, 0xcc, 0x80, 0xe4, 0x44, 0x09, 0xfc, 0xb9, + 0x91, 0x90, 0x7a, 0x51, 0xc2, 0x7f, 0x61, 0x94, 0x91, 0x84, 0xb4, 0x88, 0x14, 0xbc, 0xea, 0x90, + 0xa5, 0x99, 0xb2, 0x14, 0x86, 0xd7, 0x0c, 0x23, 0x49, 0xcd, 0x19, 0x5f, 0x37, 0x8c, 0xa9, 0xcc, + 0x1c, 0x7d, 0xc3, 0xa0, 0x37, 0x44, 0xe4, 0xcb, 0xe3, 0xe3, 0x1c, 0x7d, 0xd3, 0xe1, 0x2d, 0x36, + 0x4f, 0xd7, 0xd7, 0x45, 0x28, 0x22, 0xaf, 0xe0, 0x7f, 0xcb, 0xe1, 0xe7, 0x18, 0x9c, 0x51, 0xa7, + 0xe0, 0xf9, 0x0a, 0x87, 0x2c, 0xbe, 0xa6, 0x79, 0xe0, 0x0b, 0x15, 0x13, 0xab, 0x94, 0xd1, 0x62, + 0x5f, 0xac, 0xf0, 0x19, 0x1b, 0x74, 0x7b, 0xfe, 0x52, 0x85, 0x37, 0xd8, 0xc4, 0x76, 0xa4, 0x30, + 0xd1, 0xf0, 0x19, 0xaa, 0xef, 0x09, 0x3b, 0x41, 0xe1, 0xb3, 0xd4, 0x46, 0xe3, 0xa6, 0xbe, 0xe1, + 0x45, 0xda, 0xce, 0xdc, 0x45, 0x85, 0x91, 0x5f, 0xea, 0x1d, 0x05, 0x9f, 0x33, 0x37, 0xec, 0xfa, + 0x83, 0xbf, 0x56, 0x4d, 0x68, 0xca, 0xbb, 0xf0, 0x6f, 0x55, 0x32, 0x61, 0x0b, 0x75, 0xd1, 0xce, + 0xf0, 0xf7, 0x2a, 0xbf, 0xc0, 0xce, 0x65, 0x98, 0xd9, 0x4c, 0x79, 0x23, 0xff, 0xa3, 0xca, 0x2f, + 0xb1, 0xf3, 0x34, 0xa6, 0xf3, 0xba, 0xa1, 0x4b, 0x81, 0xd2, 0x81, 0xa7, 0xe0, 0x9f, 0x55, 0x7e, + 0x91, 0x2d, 0x6e, 0xa1, 0xce, 0xf3, 0x51, 0x22, 0xfe, 0xab, 0xca, 0xa7, 0xd9, 0x94, 0x4b, 0xab, + 0x0b, 0x4f, 0x10, 0x5e, 0xad, 0x52, 0x52, 0xb3, 0x63, 0x6a, 0xce, 0x6b, 0x55, 0x0a, 0xf5, 0xb3, + 0x42, 0x7b, 0xbd, 0x4e, 0xbf, 0xdd, 0x13, 0x51, 0x84, 0xa1, 0x82, 0xd7, 0xab, 0x14, 0x50, 0x17, + 0xfb, 0xf2, 0x04, 0x4b, 0xf0, 0x1b, 0xc6, 0x69, 0xc3, 0xfc, 0xe1, 0x01, 0x26, 0xc3, 0x9c, 0xf0, + 0x66, 0x95, 0x52, 0x63, 0xf9, 0x47, 0x29, 0x6f, 0x55, 0xf9, 0x65, 0xd6, 0xb2, 0xc3, 0x22, 0x4b, + 0x0c, 0x11, 0xbb, 0x48, 0xe3, 0x15, 0x9e, 0xaf, 0xe5, 0x12, 0x3b, 0x18, 0x6a, 0x91, 0xdf, 0xfb, + 0x64, 0x8d, 0xec, 0xa2, 0xe6, 0x2a, 0xa6, 0xaa, 0x82, 0x17, 0x6a, 0x94, 0xd1, 0x2d, 0xd4, 0xe9, + 0x60, 0x55, 0xf0, 0x29, 0x83, 0xa4, 0x92, 0x8d, 0xc8, 0x5f, 0xd5, 0xf8, 0x2c, 0x63, 0xb6, 0x27, + 0x0d, 0xf0, 0xeb, 0x4c, 0x14, 0xbd, 0x5d, 0x4e, 0x30, 0x31, 0x83, 0x1d, 0x7e, 0x93, 0x2b, 0x28, + 0x4d, 0x3e, 0xf8, 0x6d, 0x8d, 0x42, 0x76, 0x18, 0xf4, 0xf1, 0x30, 0xf0, 0xee, 0xc2, 0x57, 0xea, + 0x14, 0x32, 0xe3, 0xd1, 0xae, 0xf4, 0xd1, 0x66, 0xf8, 0xab, 0x75, 0x2a, 0x18, 0xaa, 0x43, 0x5b, + 0x30, 0x5f, 0x33, 0xe7, 0x74, 0x7a, 0x6f, 0x77, 0xe0, 0xeb, 0xf4, 0x86, 0x62, 0xe9, 0xf9, 0xf0, + 0x60, 0x0f, 0xbe, 0x51, 0x27, 0x55, 0x6b, 0x61, 0x28, 0x3d, 0xa1, 0xf3, 0x6e, 0xf8, 0x66, 0x9d, + 0xda, 0xa9, 0xa4, 0x3d, 0xcd, 0xda, 0x4b, 0x75, 0x8a, 0x7d, 0x8a, 0x9b, 0x62, 0xeb, 0xd0, 0x50, + 0xfc, 0x96, 0x91, 0x4a, 0xdf, 0x7b, 0x64, 0xc9, 0xa1, 0x86, 0x6f, 0x1b, 0xbe, 0xb3, 0xcf, 0x02, + 0xf8, 0x5d, 0x23, 0xad, 0xaf, 0x12, 0xf6, 0xfb, 0x86, 0xed, 0x8f, 0xd1, 0x77, 0x00, 0xfc, 0xc1, + 0xc0, 0x67, 0xdf, 0x0e, 0xf0, 0xc7, 0x06, 0x19, 0x56, 0x5e, 0xff, 0xf4, 0x08, 0x56, 0xf0, 0xa7, + 0x06, 0x59, 0x50, 0x2c, 0x7a, 0xf8, 0x4e, 0x93, 0x82, 0x95, 0xad, 0x78, 0xf8, 0x6e, 0x93, 0xdc, + 0x3c, 0xb3, 0xdc, 0xe1, 0x7b, 0x4d, 0x93, 0x8e, 0x7c, 0xad, 0xc3, 0xf7, 0x4b, 0x00, 0x71, 0xc1, + 0x0f, 0x9a, 0x66, 0x02, 0x8d, 0xac, 0x72, 0xf8, 0x61, 0x93, 0x6c, 0x3b, 0xbb, 0xc4, 0xe1, 0x47, + 0x4d, 0x9b, 0xee, 0x7c, 0x7d, 0xc3, 0x8f, 0x9b, 0xd4, 0x01, 0x0f, 0x5e, 0xdc, 0xf0, 0xb2, 0xd1, + 0x55, 0xac, 0x6c, 0x78, 0xa5, 0xb9, 0xb2, 0xcc, 0x26, 0x3b, 0x2a, 0x34, 0x7b, 0x63, 0x92, 0x55, + 0x3b, 0x2a, 0x84, 0x31, 0x1a, 0xb3, 0xeb, 0x52, 0x86, 0x1b, 0xa7, 0x71, 0xf2, 0xcc, 0x7b, 0xc0, + 0x59, 0x59, 0x67, 0xb3, 0x6d, 0xd9, 0x8f, 0x45, 0xde, 0x6e, 0x66, 0x55, 0xd8, 0x1d, 0x83, 0xbe, + 0x2d, 0x95, 0x31, 0x9a, 0xd5, 0x1b, 0xa7, 0xe8, 0x0d, 0xcc, 0x46, 0x73, 0xe8, 0x48, 0x97, 0x28, + 0xc8, 0x3e, 0x54, 0x56, 0x9e, 0x63, 0xd0, 0x96, 0x91, 0x0a, 0x94, 0xc6, 0xc8, 0x1b, 0xde, 0xc4, + 0x13, 0x0c, 0xcd, 0xde, 0xd4, 0x89, 0x8c, 0xba, 0x30, 0x66, 0xbe, 0x13, 0xd0, 0xbc, 0xf7, 0xed, + 0x76, 0x5d, 0xa7, 0xb7, 0x80, 0xf9, 0x18, 0x98, 0x61, 0x6c, 0xe3, 0x04, 0x23, 0x3d, 0x10, 0x61, + 0x38, 0x84, 0x2a, 0x9d, 0xdb, 0x03, 0xa5, 0x65, 0x3f, 0xf8, 0x84, 0xd9, 0xdf, 0x5f, 0x76, 0x58, + 0xc3, 0xae, 0xd2, 0xdc, 0x34, 0x7b, 0xdc, 0xc7, 0xc8, 0x0f, 0x8c, 0x70, 0x7a, 0xcb, 0x1a, 0x28, + 0x5d, 0xfa, 0x4e, 0xc1, 0x74, 0xa0, 0x45, 0xa2, 0xb3, 0x8f, 0x0e, 0x0b, 0x75, 0xe4, 0xbd, 0x28, + 0x94, 0xc2, 0x37, 0xfb, 0x3c, 0xbf, 0xba, 0x2f, 0x12, 0x65, 0x96, 0x3a, 0x3d, 0xf5, 0x53, 0xf9, + 0x89, 0xf1, 0xc7, 0x87, 0xf1, 0x02, 0x2c, 0x7c, 0x9e, 0xa0, 0xe5, 0x69, 0x41, 0x53, 0xec, 0x59, + 0xa5, 0xb3, 0x95, 0xeb, 0x8c, 0x15, 0x9f, 0x79, 0xc6, 0x9f, 0x62, 0x09, 0x8e, 0x51, 0x54, 0xb6, + 0x42, 0x79, 0x24, 0x42, 0x70, 0xe8, 0x0d, 0x60, 0x8a, 0xa2, 0xb2, 0xf2, 0xe9, 0x71, 0x36, 0x7b, + 0xe6, 0xa3, 0x8e, 0x6c, 0xcb, 0x0f, 0x6b, 0x21, 0x65, 0xee, 0x32, 0x7b, 0x28, 0x47, 0xee, 0x5b, + 0xfa, 0x0e, 0x3d, 0x04, 0x73, 0xf2, 0x99, 0xed, 0x5f, 0xe1, 0x57, 0xd8, 0xc5, 0x82, 0x78, 0xff, + 0xce, 0xa7, 0xc1, 0xdb, 0xca, 0x19, 0xce, 0x2e, 0xff, 0x1a, 0x45, 0x34, 0xa7, 0xd2, 0x34, 0xb0, + 0x9f, 0x60, 0xc5, 0x17, 0xa8, 0x5d, 0x6a, 0x30, 0x41, 0x5f, 0x45, 0x85, 0x8d, 0x79, 0x59, 0xc1, + 0x24, 0xc5, 0x30, 0x27, 0xa4, 0x0b, 0x67, 0x6a, 0x04, 0x4c, 0x17, 0x4f, 0x9d, 0x5e, 0xcd, 0x39, + 0x48, 0x33, 0xab, 0x18, 0x17, 0x8c, 0xde, 0xea, 0x67, 0x42, 0x60, 0xe7, 0x52, 0x63, 0x84, 0x62, + 0xb0, 0x0e, 0x6a, 0x11, 0x84, 0xd0, 0xa4, 0x44, 0x8d, 0xc4, 0xc5, 0xde, 0x98, 0x1e, 0x51, 0x9e, + 0xee, 0xb0, 0x19, 0x7a, 0xcf, 0x14, 0xcf, 0x68, 0xb3, 0xfd, 0x66, 0x47, 0x30, 0x33, 0x1f, 0x01, + 0x46, 0xd4, 0x95, 0xd6, 0x34, 0xcc, 0x8d, 0x3a, 0x6a, 0x0a, 0x04, 0xf8, 0x48, 0x74, 0xad, 0xdd, + 0x7b, 0xf7, 0x22, 0x4c, 0x54, 0x2f, 0x88, 0x61, 0x7e, 0x24, 0x68, 0x76, 0x44, 0x99, 0xba, 0x58, + 0x18, 0x09, 0x05, 0x99, 0x5e, 0x5c, 0x3a, 0x37, 0x9a, 0x30, 0x33, 0x24, 0x0a, 0xea, 0xe2, 0x08, + 0x75, 0x47, 0x44, 0xa2, 0x5b, 0x52, 0x78, 0x7e, 0x44, 0x61, 0x69, 0x3a, 0xb5, 0x3e, 0x20, 0xd9, + 0x5c, 0xfe, 0x17, 0xc4, 0x6d, 0x3c, 0xd5, 0xb7, 0xe5, 0xd1, 0x1d, 0x7e, 0x65, 0xd5, 0xfe, 0x75, + 0xb8, 0x9a, 0xfd, 0x75, 0xb8, 0xba, 0x83, 0x4a, 0x91, 0xc8, 0xd8, 0xd4, 0x47, 0xeb, 0x2f, 0x93, + 0xe6, 0xbf, 0x95, 0x47, 0x1e, 0xfc, 0x8f, 0x55, 0xe9, 0xbf, 0x12, 0x77, 0x36, 0x2e, 0x9d, 0xf6, + 0x8e, 0xee, 0xac, 0x3f, 0xcb, 0x66, 0x02, 0x99, 0xdd, 0xeb, 0x26, 0xb1, 0xb7, 0xde, 0x68, 0x9b, + 0x7b, 0xfb, 0x24, 0x63, 0xdf, 0xf9, 0xc8, 0x93, 0xdd, 0x40, 0xf7, 0x06, 0x47, 0x24, 0xed, 0x9a, + 0x65, 0x7b, 0x22, 0x90, 0xe9, 0xaf, 0x6b, 0x41, 0xa4, 0x69, 0x62, 0x87, 0xf6, 0x4f, 0xcd, 0x6b, + 0x56, 0x63, 0x7c, 0xf4, 0x79, 0xc7, 0x39, 0x9a, 0x30, 0xd0, 0x93, 0xff, 0x0e, 0x00, 0x00, 0xff, + 0xff, 0xa4, 0x96, 0x88, 0xfc, 0x1a, 0x15, 0x00, 0x00, } diff --git a/internal/proto/milvus.proto b/internal/proto/milvus.proto index 738abed97a..a0f48899d7 100644 --- a/internal/proto/milvus.proto +++ b/internal/proto/milvus.proto @@ -263,6 +263,11 @@ message ReleaseCollectionRequest { * WARNING: This API is experimental and not useful for now. */ message GetStatisticsRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeGetStatistics + object_name_index: 3 + }; // Not useful for now common.MsgBase base = 1; // Not useful for now @@ -290,6 +295,11 @@ message GetStatisticsResponse { * Get collection statistics like row_count. */ message GetCollectionStatisticsRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeGetStatistics + object_name_index: 3 + }; // Not useful for now common.MsgBase base = 1; // Not useful for now @@ -518,6 +528,11 @@ message ShowSegmentsResponse { * Create index for vector datas */ message CreateIndexRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeCreateIndex + object_name_index: 3 + }; // Not useful for now common.MsgBase base = 1; // Not useful for now @@ -537,6 +552,11 @@ message CreateIndexRequest { * Current release of Milvus only supports showing latest built index. */ message DescribeIndexRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeIndexDetail + object_name_index: 3 + }; // Not useful for now common.MsgBase base = 1; // Not useful for now @@ -577,6 +597,11 @@ message DescribeIndexResponse { * Get index building progress */ message GetIndexBuildProgressRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeIndexDetail + object_name_index: 3 + }; // Not useful for now common.MsgBase base = 1; // Not useful for now @@ -596,6 +621,11 @@ message GetIndexBuildProgressResponse { } message GetIndexStateRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeIndexDetail + object_name_index: 3 + }; common.MsgBase base = 1; // must string db_name = 2 ; string collection_name = 3; // must @@ -610,6 +640,11 @@ message GetIndexStateResponse { } message DropIndexRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeDropIndex + object_name_index: 3 + }; common.MsgBase base = 1; // must string db_name = 2; string collection_name = 3; // must @@ -660,6 +695,11 @@ message DeleteRequest { message SearchRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeSearch + object_name_index: 3 + }; common.MsgBase base = 1; // must string db_name = 2; string collection_name = 3; // must @@ -688,6 +728,11 @@ message SearchResults { } message FlushRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeFlush + object_name_indexs: 3 + }; common.MsgBase base = 1; string db_name = 2; repeated string collection_names = 3; @@ -700,6 +745,11 @@ message FlushResponse{ } message QueryRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeQuery + object_name_index: 3 + }; common.MsgBase base = 1; string db_name = 2; string collection_name = 3; @@ -821,6 +871,11 @@ message GetMetricsResponse { * Do load balancing operation from src_nodeID to dst_nodeID. */ message LoadBalanceRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeLoadBalance + object_name_index: 5 + }; common.MsgBase base = 1; int64 src_nodeID = 2; repeated int64 dst_nodeIDs = 3; @@ -880,6 +935,11 @@ message GetFlushStateResponse { } message ImportRequest { + option (common.privilege_ext_obj) = { + object_type: Collection + object_privilege: PrivilegeImport + object_name_index: 1 + }; string collection_name = 1; // target collection string partition_name = 2; // target partition repeated string channel_names = 3; // channel names for the collection @@ -951,6 +1011,11 @@ service ProxyService { // https://wiki.lfaidata.foundation/display/MIL/MEP+27+--+Support+Basic+Authentication message CreateCredentialRequest { + option (common.privilege_ext_obj) = { + object_type: Global + object_privilege: PrivilegeCreateOwnership + object_name_index: -1 + }; // Not useful for now common.MsgBase base = 1; // username @@ -964,6 +1029,11 @@ message CreateCredentialRequest { } message UpdateCredentialRequest { + option (common.privilege_ext_obj) = { + object_type: User + object_privilege: PrivilegeUpdateUser + object_name_index: 2 + }; // Not useful for now common.MsgBase base = 1; // username @@ -979,6 +1049,11 @@ message UpdateCredentialRequest { } message DeleteCredentialRequest { + option (common.privilege_ext_obj) = { + object_type: Global + object_privilege: PrivilegeDropOwnership + object_name_index: -1 + }; // Not useful for now common.MsgBase base = 1; // Not useful for now @@ -993,6 +1068,11 @@ message ListCredUsersResponse { } message ListCredUsersRequest { + option (common.privilege_ext_obj) = { + object_type: Global + object_privilege: PrivilegeSelectOwnership + object_name_index: -1 + }; // Not useful for now common.MsgBase base = 1; } @@ -1007,6 +1087,11 @@ message UserEntity { } message CreateRoleRequest { + option (common.privilege_ext_obj) = { + object_type: Global + object_privilege: PrivilegeCreateOwnership + object_name_index: -1 + }; // Not useful for now common.MsgBase base = 1; // role @@ -1014,6 +1099,11 @@ message CreateRoleRequest { } message DropRoleRequest { + option (common.privilege_ext_obj) = { + object_type: Global + object_privilege: PrivilegeDropOwnership + object_name_index: -1 + }; // Not useful for now common.MsgBase base = 1; // role name @@ -1026,6 +1116,11 @@ enum OperateUserRoleType { } message OperateUserRoleRequest { + option (common.privilege_ext_obj) = { + object_type: Global + object_privilege: PrivilegeManageOwnership + object_name_index: -1 + }; // Not useful for now common.MsgBase base = 1; // username @@ -1037,6 +1132,11 @@ message OperateUserRoleRequest { } message SelectRoleRequest { + option (common.privilege_ext_obj) = { + object_type: Global + object_privilege: PrivilegeSelectOwnership + object_name_index: -1 + }; // Not useful for now common.MsgBase base = 1; // role @@ -1058,6 +1158,11 @@ message SelectRoleResponse { } message SelectUserRequest { + option (common.privilege_ext_obj) = { + object_type: User + object_privilege: PrivilegeSelectUser + object_name_index: 2 + }; // Not useful for now common.MsgBase base = 1; // user @@ -1107,6 +1212,11 @@ message GrantEntity { } message SelectGrantRequest { + option (common.privilege_ext_obj) = { + object_type: Global + object_privilege: PrivilegeSelectOwnership + object_name_index: -1 + }; // Not useful for now common.MsgBase base = 1; // grant @@ -1126,6 +1236,11 @@ enum OperatePrivilegeType { } message OperatePrivilegeRequest { + option (common.privilege_ext_obj) = { + object_type: Global + object_privilege: PrivilegeManageOwnership + object_name_index: -1 + }; // Not useful for now common.MsgBase base = 1; // grant diff --git a/internal/proto/milvuspb/milvus.pb.go b/internal/proto/milvuspb/milvus.pb.go index 3fe6942494..3cca88991d 100644 --- a/internal/proto/milvuspb/milvus.pb.go +++ b/internal/proto/milvuspb/milvus.pb.go @@ -7049,326 +7049,332 @@ func init() { func init() { proto.RegisterFile("milvus.proto", fileDescriptor_02345ba45cc0e303) } var fileDescriptor_02345ba45cc0e303 = []byte{ - // 5101 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xd4, 0x3d, 0x5b, 0x6c, 0x1c, 0x47, - 0x72, 0x9c, 0x5d, 0xee, 0xab, 0xf6, 0xc1, 0x65, 0xf3, 0xb5, 0x5e, 0x49, 0x16, 0x35, 0xb6, 0xce, - 0xb4, 0x74, 0xa2, 0x2c, 0xca, 0x96, 0xcf, 0xb2, 0xcf, 0xb6, 0x24, 0x5a, 0x12, 0x61, 0x3d, 0xe8, - 0xa1, 0xec, 0xe0, 0x62, 0x18, 0x93, 0xe1, 0x4e, 0x73, 0x39, 0xd6, 0xec, 0xcc, 0x6a, 0x66, 0x96, - 0x14, 0xfd, 0x11, 0x18, 0xb8, 0x4b, 0x72, 0x41, 0x9c, 0x3b, 0x1c, 0x72, 0xc8, 0xe1, 0x3e, 0xf2, - 0x40, 0x90, 0x04, 0x08, 0x70, 0x09, 0x72, 0x49, 0x80, 0x00, 0xc9, 0x47, 0x12, 0xe0, 0x3e, 0x02, - 0x23, 0x48, 0x2e, 0x5f, 0x41, 0x90, 0x7c, 0x1e, 0x02, 0xe4, 0x2f, 0x01, 0xee, 0x33, 0x41, 0x82, - 0x7e, 0xcc, 0x6c, 0xcf, 0x6c, 0xcf, 0x72, 0xc9, 0x3d, 0x99, 0x14, 0xbf, 0xb6, 0xab, 0xab, 0xbb, - 0xab, 0xab, 0xab, 0xab, 0xaa, 0xbb, 0xaa, 0x87, 0x50, 0xe9, 0x58, 0xf6, 0x4e, 0xcf, 0x5f, 0xee, - 0x7a, 0x6e, 0xe0, 0xa2, 0x19, 0xb1, 0xb4, 0xcc, 0x0a, 0xcd, 0x4a, 0xcb, 0xed, 0x74, 0x5c, 0x87, - 0x01, 0x9b, 0x15, 0xbf, 0xb5, 0x8d, 0x3b, 0x06, 0x2f, 0x2d, 0xb6, 0x5d, 0xb7, 0x6d, 0xe3, 0x8b, - 0xb4, 0xb4, 0xd9, 0xdb, 0xba, 0x68, 0x62, 0xbf, 0xe5, 0x59, 0xdd, 0xc0, 0xf5, 0x18, 0x86, 0xfa, - 0xdb, 0x0a, 0xa0, 0x1b, 0x1e, 0x36, 0x02, 0x7c, 0xcd, 0xb6, 0x0c, 0x5f, 0xc3, 0x8f, 0x7a, 0xd8, - 0x0f, 0xd0, 0x4b, 0x30, 0xb9, 0x69, 0xf8, 0xb8, 0xa1, 0x2c, 0x2a, 0x4b, 0xe5, 0x95, 0x93, 0xcb, - 0xb1, 0x81, 0xf9, 0x80, 0x77, 0xfd, 0xf6, 0x75, 0xc3, 0xc7, 0x1a, 0xc5, 0x44, 0x0b, 0x50, 0x30, - 0x37, 0x75, 0xc7, 0xe8, 0xe0, 0x46, 0x66, 0x51, 0x59, 0x2a, 0x69, 0x79, 0x73, 0xf3, 0x9e, 0xd1, - 0xc1, 0xe8, 0x05, 0x98, 0x6a, 0xb9, 0xb6, 0x8d, 0x5b, 0x81, 0xe5, 0x3a, 0x0c, 0x21, 0x4b, 0x11, - 0x6a, 0x7d, 0x30, 0x45, 0x9c, 0x85, 0x9c, 0x41, 0x68, 0x68, 0x4c, 0xd2, 0x6a, 0x56, 0x50, 0x7d, - 0xa8, 0xaf, 0x7a, 0x6e, 0xf7, 0x49, 0x51, 0x17, 0x0d, 0x9a, 0x15, 0x07, 0xfd, 0x2d, 0x05, 0xa6, - 0xaf, 0xd9, 0x01, 0xf6, 0x8e, 0x29, 0x53, 0x7e, 0x90, 0x81, 0x05, 0xb6, 0x6a, 0x37, 0x22, 0xf4, - 0xa3, 0xa4, 0x72, 0x1e, 0xf2, 0x4c, 0xee, 0x28, 0x99, 0x15, 0x8d, 0x97, 0xd0, 0x29, 0x00, 0x7f, - 0xdb, 0xf0, 0x4c, 0x5f, 0x77, 0x7a, 0x9d, 0x46, 0x6e, 0x51, 0x59, 0xca, 0x69, 0x25, 0x06, 0xb9, - 0xd7, 0xeb, 0x20, 0x0d, 0xa6, 0x5b, 0xae, 0xe3, 0x5b, 0x7e, 0x80, 0x9d, 0xd6, 0x9e, 0x6e, 0xe3, - 0x1d, 0x6c, 0x37, 0xf2, 0x8b, 0xca, 0x52, 0x6d, 0xe5, 0xac, 0x94, 0xee, 0x1b, 0x7d, 0xec, 0x3b, - 0x04, 0x59, 0xab, 0xb7, 0x12, 0x90, 0xab, 0xe8, 0xf3, 0x37, 0xa7, 0x8a, 0x4a, 0x5d, 0x69, 0xfc, - 0x5f, 0xf8, 0xa7, 0xa8, 0xbf, 0xa3, 0xc0, 0x1c, 0x11, 0xa2, 0x63, 0xc1, 0xac, 0x90, 0xc2, 0x8c, - 0x48, 0xe1, 0x1f, 0x29, 0x30, 0x7b, 0xdb, 0xf0, 0x8f, 0xc7, 0x6a, 0x9e, 0x02, 0x08, 0xac, 0x0e, - 0xd6, 0xfd, 0xc0, 0xe8, 0x74, 0xe9, 0x8a, 0x4e, 0x6a, 0x25, 0x02, 0xd9, 0x20, 0x00, 0xf5, 0x6b, - 0x50, 0xb9, 0xee, 0xba, 0xb6, 0x86, 0xfd, 0xae, 0xeb, 0xf8, 0x18, 0x5d, 0x86, 0xbc, 0x1f, 0x18, - 0x41, 0xcf, 0xe7, 0x44, 0x9e, 0x90, 0x12, 0xb9, 0x41, 0x51, 0x34, 0x8e, 0x4a, 0xe4, 0x7a, 0xc7, - 0xb0, 0x7b, 0x8c, 0xc6, 0xa2, 0xc6, 0x0a, 0xea, 0x87, 0x50, 0xdb, 0x08, 0x3c, 0xcb, 0x69, 0xff, - 0x0c, 0x3b, 0x2f, 0x85, 0x9d, 0xff, 0x87, 0x02, 0xcf, 0xac, 0x52, 0xfd, 0xb7, 0x79, 0x4c, 0xb6, - 0x8d, 0x0a, 0x95, 0x3e, 0x64, 0x6d, 0x95, 0xb2, 0x3a, 0xab, 0xc5, 0x60, 0x89, 0xc5, 0xc8, 0x25, - 0x16, 0x23, 0x14, 0xa6, 0xac, 0x28, 0x4c, 0x9f, 0xe6, 0xa0, 0x29, 0x9b, 0xe8, 0x38, 0x2c, 0xfd, - 0x6a, 0xb4, 0xc3, 0x33, 0xb4, 0x51, 0x62, 0x7f, 0x72, 0xab, 0xd3, 0x1f, 0x6d, 0x83, 0x02, 0x22, - 0x45, 0x90, 0x9c, 0x69, 0x56, 0x32, 0xd3, 0x15, 0x98, 0xdb, 0xb1, 0xbc, 0xa0, 0x67, 0xd8, 0x7a, - 0x6b, 0xdb, 0x70, 0x1c, 0x6c, 0x53, 0xde, 0x11, 0xd5, 0x97, 0x5d, 0x2a, 0x69, 0x33, 0xbc, 0xf2, - 0x06, 0xab, 0x23, 0x0c, 0xf4, 0xd1, 0xcb, 0x30, 0xdf, 0xdd, 0xde, 0xf3, 0xad, 0xd6, 0x40, 0xa3, - 0x1c, 0x6d, 0x34, 0x1b, 0xd6, 0xc6, 0x5a, 0x9d, 0x87, 0xe9, 0x16, 0xd5, 0x9e, 0xa6, 0x4e, 0x38, - 0xc9, 0x58, 0x9b, 0xa7, 0xac, 0xad, 0xf3, 0x8a, 0x07, 0x21, 0x9c, 0x90, 0x15, 0x22, 0xf7, 0x82, - 0x96, 0xd0, 0xa0, 0x40, 0x1b, 0xcc, 0xf0, 0xca, 0xf7, 0x83, 0x56, 0xbf, 0x4d, 0x5c, 0xef, 0x15, - 0x93, 0x7a, 0xaf, 0x01, 0x05, 0xaa, 0xc7, 0xb1, 0xdf, 0x28, 0x51, 0x32, 0xc3, 0x22, 0x5a, 0x83, - 0x29, 0x3f, 0x30, 0xbc, 0x40, 0xef, 0xba, 0xbe, 0x45, 0xf8, 0xe2, 0x37, 0x60, 0x31, 0xbb, 0x54, - 0x5e, 0x59, 0x94, 0x2e, 0xd2, 0xbb, 0x78, 0x6f, 0xd5, 0x08, 0x8c, 0x75, 0xc3, 0xf2, 0xb4, 0x1a, - 0x6d, 0xb8, 0x1e, 0xb6, 0x93, 0x2b, 0xd7, 0xf2, 0x58, 0xca, 0x55, 0x26, 0xd9, 0x15, 0x99, 0x64, - 0xab, 0x7f, 0xad, 0xc0, 0xdc, 0x1d, 0xd7, 0x30, 0x8f, 0xc7, 0x3e, 0x3b, 0x0b, 0x35, 0x0f, 0x77, - 0x6d, 0xab, 0x65, 0x90, 0xf5, 0xd8, 0xc4, 0x1e, 0xdd, 0x69, 0x39, 0xad, 0xca, 0xa1, 0xf7, 0x28, - 0xf0, 0x6a, 0xe1, 0xf3, 0x37, 0x27, 0xeb, 0xb9, 0x46, 0x56, 0xfd, 0x9e, 0x02, 0x0d, 0x0d, 0xdb, - 0xd8, 0xf0, 0x8f, 0x87, 0xa2, 0x60, 0x94, 0xe5, 0x1b, 0x59, 0xf5, 0x27, 0x0a, 0xcc, 0xde, 0xc2, - 0x01, 0xd9, 0x9c, 0x96, 0x1f, 0x58, 0xad, 0x23, 0xf5, 0x4d, 0x5e, 0x80, 0xa9, 0xae, 0xe1, 0x05, - 0x56, 0x84, 0x17, 0x6e, 0xd5, 0x5a, 0x04, 0x66, 0xfb, 0xed, 0x22, 0xcc, 0xb4, 0x7b, 0x86, 0x67, - 0x38, 0x01, 0xc6, 0xc2, 0x06, 0x62, 0xca, 0x0c, 0x45, 0x55, 0xd1, 0xfe, 0x51, 0x7f, 0x49, 0x81, - 0xb9, 0xc4, 0x34, 0xc7, 0x51, 0x5e, 0xaf, 0x42, 0x8e, 0xfc, 0xf2, 0x1b, 0x19, 0xba, 0x97, 0xce, - 0xa4, 0xed, 0xa5, 0x0f, 0x88, 0x9d, 0xa0, 0x9b, 0x89, 0xe1, 0xab, 0xdf, 0x55, 0xe0, 0xd9, 0x5b, - 0x38, 0x10, 0xd4, 0xda, 0x71, 0x60, 0xbc, 0xfa, 0x6d, 0x05, 0x4e, 0xa7, 0x92, 0x75, 0x24, 0x8c, - 0xfa, 0xa9, 0x02, 0xf3, 0x1b, 0xdb, 0xee, 0x6e, 0x9f, 0xa4, 0x27, 0xc1, 0xa0, 0xb8, 0x2d, 0xcc, - 0x26, 0x6c, 0x21, 0xba, 0x04, 0x93, 0xc1, 0x5e, 0x17, 0xd3, 0xcd, 0x5d, 0x5b, 0x39, 0xb5, 0x2c, - 0x39, 0x2d, 0x2d, 0x13, 0x22, 0x1f, 0xec, 0x75, 0xb1, 0x46, 0x51, 0xd1, 0x8b, 0x50, 0x4f, 0xb0, - 0x3c, 0xb4, 0x1c, 0x53, 0x71, 0x9e, 0xfb, 0xa1, 0xa5, 0x9d, 0x14, 0x2d, 0xed, 0x7f, 0x65, 0x60, - 0x61, 0x60, 0xda, 0xe3, 0x2c, 0x80, 0x8c, 0x9e, 0x8c, 0x94, 0x1e, 0xa2, 0xd4, 0x04, 0x54, 0xcb, - 0x24, 0x47, 0x98, 0xec, 0x52, 0x56, 0xab, 0x0a, 0x46, 0xd5, 0xf4, 0xd1, 0x05, 0x40, 0x03, 0xb6, - 0x8e, 0xed, 0xd3, 0x49, 0x6d, 0x3a, 0x69, 0xec, 0xa8, 0x41, 0x95, 0x5a, 0x3b, 0xc6, 0x96, 0x49, - 0x6d, 0x56, 0x62, 0xee, 0x7c, 0x74, 0x09, 0x66, 0x2d, 0xe7, 0x2e, 0xee, 0xb8, 0xde, 0x9e, 0xde, - 0xc5, 0x5e, 0x0b, 0x3b, 0x81, 0xd1, 0xc6, 0x7e, 0x23, 0x4f, 0x29, 0x9a, 0x09, 0xeb, 0xd6, 0xfb, - 0x55, 0xe8, 0x0a, 0x2c, 0x3c, 0xea, 0x61, 0x6f, 0x4f, 0xf7, 0xb1, 0xb7, 0x63, 0xb5, 0xb0, 0x6e, - 0xec, 0x18, 0x96, 0x6d, 0x6c, 0xda, 0xb8, 0x51, 0x58, 0xcc, 0x2e, 0x15, 0xb5, 0x39, 0x5a, 0xbd, - 0xc1, 0x6a, 0xaf, 0x85, 0x95, 0xea, 0x9f, 0x2b, 0x30, 0xcf, 0x8e, 0x3e, 0xeb, 0xa1, 0x92, 0x39, - 0x62, 0xd3, 0x12, 0xd7, 0x81, 0xfc, 0xa0, 0x56, 0x8d, 0xa9, 0x40, 0xf5, 0x87, 0x0a, 0xcc, 0x92, - 0x13, 0xc8, 0xd3, 0x44, 0xf3, 0x9f, 0x2a, 0x30, 0x73, 0xdb, 0xf0, 0x9f, 0x26, 0x92, 0xff, 0x8d, - 0xbb, 0x1d, 0x11, 0xcd, 0x4f, 0x87, 0x7d, 0x1c, 0xf4, 0x4f, 0x72, 0x12, 0xff, 0x44, 0xfd, 0xcb, - 0xbe, 0x5b, 0xf2, 0x74, 0x4d, 0x50, 0xfd, 0x2b, 0x05, 0x4e, 0xdd, 0xc2, 0x41, 0x44, 0xf5, 0xf1, - 0xf0, 0x5f, 0x46, 0x14, 0xaa, 0x6f, 0x31, 0x27, 0x40, 0x4a, 0xfc, 0x91, 0x18, 0xdb, 0x5f, 0xcb, - 0xc0, 0x1c, 0xb1, 0x3a, 0xc7, 0x43, 0x08, 0x46, 0x39, 0xc4, 0x4a, 0x04, 0x25, 0x27, 0xdd, 0x09, - 0xa1, 0x09, 0xcf, 0x8f, 0x6c, 0xc2, 0xd5, 0x3f, 0xcb, 0x30, 0xd7, 0x43, 0xe4, 0xc6, 0x38, 0xcb, - 0x22, 0xa1, 0x35, 0x23, 0xa5, 0x55, 0x85, 0x4a, 0x04, 0x59, 0x5b, 0x0d, 0xcd, 0x6f, 0x0c, 0x76, - 0x5c, 0xad, 0xaf, 0xfa, 0x99, 0x02, 0xf3, 0xe1, 0x15, 0xc1, 0x06, 0x6e, 0x77, 0xb0, 0x13, 0x1c, - 0x5e, 0x86, 0x92, 0x12, 0x90, 0x91, 0x48, 0xc0, 0x49, 0x28, 0xf9, 0x6c, 0x9c, 0xe8, 0xf4, 0xdf, - 0x07, 0xa8, 0x7f, 0xa3, 0xc0, 0xc2, 0x00, 0x39, 0xe3, 0x2c, 0x62, 0x03, 0x0a, 0x96, 0x63, 0xe2, - 0xc7, 0x11, 0x35, 0x61, 0x91, 0xd4, 0x6c, 0xf6, 0x2c, 0xdb, 0x8c, 0xc8, 0x08, 0x8b, 0xe8, 0x0c, - 0x54, 0xb0, 0x43, 0x7c, 0x0c, 0x9d, 0xe2, 0x52, 0x41, 0x2e, 0x6a, 0x65, 0x06, 0x5b, 0x23, 0x20, - 0xd2, 0x78, 0xcb, 0xc2, 0xb4, 0x71, 0x8e, 0x35, 0xe6, 0x45, 0xf5, 0xd7, 0x15, 0x98, 0x21, 0x52, - 0xc8, 0xa9, 0xf7, 0x9f, 0x2c, 0x37, 0x17, 0xa1, 0x2c, 0x88, 0x19, 0x9f, 0x88, 0x08, 0x52, 0x1f, - 0xc2, 0x6c, 0x9c, 0x9c, 0x71, 0xb8, 0xf9, 0x2c, 0x40, 0xb4, 0x56, 0x6c, 0x37, 0x64, 0x35, 0x01, - 0xa2, 0x7e, 0x96, 0x09, 0x83, 0x08, 0x94, 0x4d, 0x47, 0x7c, 0x77, 0x49, 0x97, 0x44, 0xd4, 0xe7, - 0x25, 0x0a, 0xa1, 0xd5, 0xab, 0x50, 0xc1, 0x8f, 0x03, 0xcf, 0xd0, 0xbb, 0x86, 0x67, 0x74, 0xd8, - 0xb6, 0x1a, 0x49, 0xf5, 0x96, 0x69, 0xb3, 0x75, 0xda, 0x8a, 0x0c, 0x42, 0x45, 0x84, 0x0d, 0x92, - 0x67, 0x83, 0x50, 0x08, 0x35, 0x18, 0x7f, 0x4f, 0x9c, 0x3d, 0x2e, 0xcd, 0xc7, 0x9d, 0x21, 0xf1, - 0xa9, 0xe4, 0x92, 0x53, 0xf9, 0x03, 0x05, 0xea, 0x74, 0x0a, 0xab, 0x3c, 0x70, 0x64, 0xb9, 0x4e, - 0xa2, 0x8d, 0x92, 0x68, 0x33, 0x64, 0xef, 0xbd, 0x06, 0x79, 0xce, 0xf7, 0xec, 0xa8, 0x7c, 0xe7, - 0x0d, 0xf6, 0x99, 0x86, 0xfa, 0x7b, 0x0a, 0xcc, 0x25, 0x58, 0x3e, 0x8e, 0xc0, 0x3f, 0x00, 0xc4, - 0x66, 0x68, 0xf6, 0xa7, 0x1d, 0xda, 0xe9, 0xb3, 0x52, 0xa3, 0x94, 0x64, 0x92, 0x36, 0x6d, 0x25, - 0x20, 0xbe, 0xfa, 0x63, 0x05, 0x4e, 0xde, 0xc2, 0x01, 0x45, 0xbd, 0x4e, 0x94, 0xce, 0xba, 0xe7, - 0xb6, 0x3d, 0xec, 0xfb, 0x4f, 0xaf, 0x7c, 0xfc, 0x26, 0x73, 0xec, 0x64, 0x53, 0x1a, 0x87, 0xff, - 0x67, 0xa0, 0x42, 0xc7, 0xc0, 0xa6, 0xee, 0xb9, 0xbb, 0x3e, 0x97, 0xa3, 0x32, 0x87, 0x69, 0xee, - 0x2e, 0x15, 0x88, 0xc0, 0x0d, 0x0c, 0x9b, 0x21, 0x70, 0x8b, 0x42, 0x21, 0xa4, 0x9a, 0xee, 0xc1, - 0x90, 0x30, 0xd2, 0x39, 0x7e, 0x7a, 0x79, 0xfc, 0xfb, 0xec, 0x32, 0x4c, 0x9c, 0xca, 0x38, 0xbc, - 0x7d, 0x85, 0xb9, 0x9d, 0x6c, 0x32, 0xb5, 0x95, 0xd3, 0xd2, 0x36, 0xc2, 0x60, 0x0c, 0x1b, 0x9d, - 0x86, 0xf2, 0x96, 0x61, 0xd9, 0xba, 0x87, 0x0d, 0xdf, 0x75, 0xf8, 0x44, 0x81, 0x80, 0x34, 0x0a, - 0x51, 0x7f, 0xa4, 0xb0, 0x48, 0xed, 0x53, 0xae, 0xf1, 0x7e, 0x90, 0x81, 0xea, 0x9a, 0xe3, 0x63, - 0x2f, 0x38, 0xfe, 0x47, 0x13, 0xf4, 0x16, 0x94, 0xe9, 0xc4, 0x7c, 0xdd, 0x34, 0x02, 0x83, 0x5b, - 0xb3, 0x67, 0xa5, 0xa1, 0x99, 0x9b, 0x04, 0x6f, 0xd5, 0x08, 0x0c, 0x8d, 0x71, 0xc7, 0x27, 0xbf, - 0xd1, 0x09, 0x28, 0x6d, 0x1b, 0xfe, 0xb6, 0xfe, 0x10, 0xef, 0x31, 0x7f, 0xb1, 0xaa, 0x15, 0x09, - 0xe0, 0x5d, 0xbc, 0xe7, 0xa3, 0x67, 0xa0, 0xe8, 0xf4, 0x3a, 0x6c, 0x83, 0x15, 0x16, 0x95, 0xa5, - 0xaa, 0x56, 0x70, 0x7a, 0x1d, 0xb2, 0xbd, 0xd8, 0x85, 0x74, 0xb1, 0x91, 0x55, 0xff, 0x21, 0x03, - 0xb5, 0xbb, 0x3d, 0x72, 0x22, 0xa2, 0x11, 0xa6, 0x9e, 0x1d, 0x1c, 0x4e, 0x2a, 0xcf, 0x41, 0x96, - 0xf9, 0x16, 0xa4, 0x45, 0x43, 0x3a, 0x83, 0xb5, 0x55, 0x5f, 0x23, 0x48, 0x34, 0xba, 0xd2, 0x6b, - 0xb5, 0xb8, 0x9b, 0x96, 0xa5, 0x54, 0x97, 0x08, 0x84, 0x39, 0x69, 0x27, 0xa0, 0x84, 0x3d, 0x2f, - 0x72, 0xe2, 0xe8, 0x9c, 0xb0, 0xe7, 0xb1, 0x4a, 0x15, 0x2a, 0x46, 0xeb, 0xa1, 0xe3, 0xee, 0xda, - 0xd8, 0x6c, 0x63, 0x93, 0xae, 0x7f, 0x51, 0x8b, 0xc1, 0x98, 0x84, 0x10, 0x09, 0xd0, 0x5b, 0x4e, - 0x40, 0xcd, 0x7b, 0x96, 0x48, 0x08, 0x81, 0xdc, 0x70, 0x02, 0x52, 0x6d, 0x62, 0x1b, 0x07, 0x98, - 0x56, 0x17, 0x58, 0x35, 0x83, 0xf0, 0xea, 0x5e, 0x37, 0x6a, 0x5d, 0x64, 0xd5, 0x0c, 0x42, 0xaa, - 0x4f, 0x42, 0xa9, 0x7f, 0x03, 0x5e, 0xea, 0x5f, 0x61, 0xb2, 0x8b, 0xef, 0x9f, 0x28, 0x50, 0x5d, - 0xa5, 0x5d, 0x3d, 0x05, 0xd2, 0x87, 0x60, 0x12, 0x3f, 0xee, 0x7a, 0x7c, 0x0f, 0xd1, 0xdf, 0x43, - 0x05, 0x8a, 0x49, 0x4d, 0xa9, 0x91, 0x55, 0xff, 0x37, 0x0b, 0xd5, 0x0d, 0x6c, 0x78, 0xad, 0xed, - 0xa7, 0xe2, 0x7e, 0xa6, 0x0e, 0x59, 0xd3, 0xb7, 0xf9, 0x3c, 0xc9, 0x4f, 0x74, 0x1e, 0xa6, 0xbb, - 0xb6, 0xd1, 0xc2, 0xdb, 0xae, 0x6d, 0x62, 0x4f, 0x6f, 0x7b, 0x6e, 0x8f, 0x45, 0x10, 0x2b, 0x5a, - 0x5d, 0xa8, 0xb8, 0x45, 0xe0, 0xe8, 0x55, 0x28, 0x9a, 0xbe, 0xad, 0xd3, 0x83, 0x6d, 0x81, 0x2a, - 0x5d, 0xf9, 0xfc, 0x56, 0x7d, 0x9b, 0x9e, 0x6b, 0x0b, 0x26, 0xfb, 0x81, 0x9e, 0x83, 0xaa, 0xdb, - 0x0b, 0xba, 0xbd, 0x40, 0x67, 0x5b, 0xb6, 0x51, 0xa4, 0xe4, 0x55, 0x18, 0x90, 0xee, 0x68, 0x1f, - 0xdd, 0x84, 0xaa, 0x4f, 0x59, 0x19, 0xfa, 0xb4, 0xa5, 0x51, 0x7d, 0xab, 0x0a, 0x6b, 0xc7, 0x9d, - 0xda, 0x17, 0xa1, 0x1e, 0x78, 0xc6, 0x0e, 0xb6, 0x85, 0x08, 0x0d, 0x50, 0xf9, 0x9c, 0x62, 0xf0, - 0x7e, 0x78, 0x33, 0x25, 0x9e, 0x53, 0x4e, 0x8b, 0xe7, 0xa0, 0x1a, 0x64, 0x9c, 0x47, 0x34, 0x54, - 0x98, 0xd5, 0x32, 0xce, 0x23, 0xf5, 0x5d, 0x98, 0xbc, 0x6d, 0x05, 0x94, 0xb1, 0x64, 0xd7, 0x2b, - 0xf4, 0x44, 0x41, 0xf7, 0xf6, 0x33, 0x50, 0xf4, 0xdc, 0x5d, 0xa6, 0xce, 0x88, 0xbf, 0x55, 0xd1, - 0x0a, 0x9e, 0xbb, 0x4b, 0x75, 0x15, 0x4d, 0x32, 0x71, 0x3d, 0xcc, 0xbc, 0xc7, 0x8c, 0xc6, 0x4b, - 0xea, 0x9f, 0x28, 0x7d, 0x61, 0x22, 0x0a, 0xc8, 0x3f, 0x9c, 0x06, 0x7a, 0x0b, 0x0a, 0x1e, 0x6b, - 0x3f, 0x34, 0xc4, 0x2d, 0x8e, 0x44, 0xd5, 0x69, 0xd8, 0x6a, 0xf4, 0xf0, 0xcd, 0x37, 0x14, 0xa8, - 0xdc, 0xb4, 0x7b, 0xfe, 0x93, 0x10, 0x7e, 0x59, 0x00, 0x21, 0x2b, 0x0d, 0x20, 0xa8, 0xdf, 0xc9, - 0x40, 0x95, 0x93, 0x31, 0x8e, 0x3f, 0x91, 0x4a, 0xca, 0x06, 0x94, 0xc9, 0x90, 0xba, 0x8f, 0xdb, - 0xe1, 0xf5, 0x48, 0x79, 0x65, 0x45, 0xea, 0x3d, 0xc7, 0xc8, 0xa0, 0x59, 0x04, 0x1b, 0xb4, 0xd1, - 0x3b, 0x4e, 0xe0, 0xed, 0x69, 0xd0, 0x8a, 0x00, 0xcd, 0x8f, 0x60, 0x2a, 0x51, 0x4d, 0x84, 0xe8, - 0x21, 0xde, 0xe3, 0xe7, 0x10, 0xf2, 0x13, 0xbd, 0x2c, 0xe6, 0x7f, 0xa4, 0x19, 0xc4, 0x3b, 0xae, - 0xd3, 0xbe, 0xe6, 0x79, 0xc6, 0x1e, 0xcf, 0x0f, 0xb9, 0x9a, 0xf9, 0x8a, 0xa2, 0xfe, 0x6d, 0x06, - 0x2a, 0xef, 0xf5, 0xb0, 0xb7, 0x77, 0x94, 0x7a, 0x29, 0xd4, 0xab, 0x93, 0x82, 0x5e, 0x1d, 0x50, - 0x05, 0x39, 0x89, 0x2a, 0x90, 0x28, 0xb4, 0xbc, 0x54, 0xa1, 0xc9, 0xf6, 0x7a, 0xe1, 0x40, 0x7b, - 0xbd, 0x98, 0x1a, 0xbb, 0xfd, 0x63, 0x25, 0x62, 0xe1, 0x58, 0xbb, 0x31, 0xe6, 0xd9, 0x64, 0x0e, - 0xec, 0xd9, 0x8c, 0xbc, 0x1b, 0x7f, 0xa8, 0x40, 0xe9, 0x03, 0xdc, 0x0a, 0x5c, 0x8f, 0xe8, 0x1f, - 0x49, 0x33, 0x65, 0x04, 0x2f, 0x33, 0x93, 0xf4, 0x32, 0x2f, 0x43, 0xd1, 0x32, 0x75, 0x83, 0xc8, - 0x17, 0x1d, 0x77, 0x98, 0x53, 0x53, 0xb0, 0x4c, 0x2a, 0x88, 0xa3, 0xdf, 0xa7, 0x7f, 0x4f, 0x81, - 0x0a, 0xa3, 0xd9, 0x67, 0x2d, 0x5f, 0x17, 0x86, 0x53, 0x64, 0x42, 0xcf, 0x0b, 0xd1, 0x44, 0x6f, - 0x4f, 0xf4, 0x87, 0xbd, 0x06, 0x40, 0x98, 0xcc, 0x9b, 0xb3, 0x3d, 0xb3, 0x28, 0xa5, 0x96, 0x35, - 0xa7, 0x0c, 0xbf, 0x3d, 0xa1, 0x95, 0x48, 0x2b, 0xda, 0xc5, 0xf5, 0x02, 0xe4, 0x68, 0x6b, 0xf5, - 0x7f, 0x14, 0x98, 0xb9, 0x61, 0xd8, 0xad, 0x55, 0xcb, 0x0f, 0x0c, 0xa7, 0x35, 0x86, 0x1b, 0x73, - 0x15, 0x0a, 0x6e, 0x57, 0xb7, 0xf1, 0x56, 0xc0, 0x49, 0x3a, 0x33, 0x64, 0x46, 0x8c, 0x0d, 0x5a, - 0xde, 0xed, 0xde, 0xc1, 0x5b, 0x01, 0x7a, 0x03, 0x8a, 0x6e, 0x57, 0xf7, 0xac, 0xf6, 0x76, 0xc0, - 0xb9, 0x3f, 0x42, 0xe3, 0x82, 0xdb, 0xd5, 0x48, 0x0b, 0xe1, 0x9a, 0x62, 0xf2, 0x80, 0xd7, 0x14, - 0xea, 0x3f, 0x0f, 0x4c, 0x7f, 0x8c, 0x3d, 0x70, 0x15, 0x8a, 0x96, 0x13, 0xe8, 0xa6, 0xe5, 0x87, - 0x2c, 0x38, 0x25, 0x97, 0x21, 0x27, 0xa0, 0x33, 0xa0, 0x6b, 0xea, 0x04, 0x64, 0x6c, 0xf4, 0x36, - 0xc0, 0x96, 0xed, 0x1a, 0xbc, 0x35, 0xe3, 0xc1, 0x69, 0xf9, 0xf6, 0x21, 0x68, 0x61, 0xfb, 0x12, - 0x6d, 0x44, 0x7a, 0xe8, 0x2f, 0xe9, 0x3f, 0x29, 0x30, 0xb7, 0x8e, 0x3d, 0x96, 0x09, 0x14, 0xf0, - 0x1b, 0xc5, 0x35, 0x67, 0xcb, 0x8d, 0x5f, 0xea, 0x2a, 0x89, 0x4b, 0xdd, 0x9f, 0xcd, 0x45, 0x66, - 0xec, 0x10, 0xc2, 0x42, 0x0b, 0xe1, 0x21, 0x24, 0x0c, 0xa0, 0xb0, 0x43, 0x5c, 0x2d, 0x65, 0x99, - 0x38, 0xbd, 0xe2, 0x59, 0x56, 0xfd, 0x0d, 0x96, 0x3f, 0x21, 0x9d, 0xd4, 0xe1, 0x05, 0x76, 0x1e, - 0xb8, 0xa6, 0x4f, 0xe8, 0xfd, 0x2f, 0x41, 0x42, 0x77, 0xa4, 0x28, 0xa2, 0xef, 0x2b, 0xb0, 0x98, - 0x4e, 0xd5, 0x38, 0x26, 0xfa, 0x6d, 0xc8, 0x59, 0xce, 0x96, 0x1b, 0xde, 0x60, 0x9d, 0x93, 0xee, - 0x05, 0xf9, 0xb8, 0xac, 0xa1, 0xfa, 0xe3, 0x0c, 0xd4, 0xdf, 0x63, 0xf1, 0xf8, 0x2f, 0x7c, 0xf9, - 0x3b, 0xb8, 0xa3, 0xfb, 0xd6, 0x27, 0x38, 0x5c, 0xfe, 0x0e, 0xee, 0x6c, 0x58, 0x9f, 0xe0, 0x98, - 0x64, 0xe4, 0xe2, 0x92, 0x31, 0xfc, 0x82, 0x56, 0xbc, 0xa1, 0x2c, 0xc4, 0x6f, 0x28, 0xe7, 0x21, - 0xef, 0xb8, 0x26, 0x5e, 0x5b, 0xe5, 0x07, 0x37, 0x5e, 0xea, 0x8b, 0x5a, 0xe9, 0x60, 0xa2, 0x46, - 0x86, 0xa2, 0x5d, 0x98, 0x2c, 0x91, 0x8f, 0xd0, 0xc8, 0x8a, 0xea, 0xb7, 0x14, 0x68, 0xde, 0xc2, - 0x41, 0x92, 0xab, 0x47, 0x27, 0x7f, 0xdf, 0x56, 0xe0, 0x84, 0x94, 0xa0, 0x71, 0x44, 0xef, 0xf5, - 0xb8, 0xe8, 0xc9, 0x2f, 0x4f, 0x07, 0x86, 0xe4, 0x52, 0x77, 0x09, 0x2a, 0xab, 0xbd, 0x4e, 0x27, - 0x72, 0xc6, 0xce, 0x40, 0xc5, 0x63, 0x3f, 0xd9, 0x61, 0x8a, 0x59, 0xe6, 0x32, 0x87, 0x91, 0x23, - 0x93, 0x7a, 0x1e, 0xaa, 0xbc, 0x09, 0xa7, 0xba, 0x09, 0x45, 0x8f, 0xff, 0xe6, 0xf8, 0x51, 0x59, - 0x9d, 0x83, 0x19, 0x0d, 0xb7, 0x89, 0xd0, 0x7b, 0x77, 0x2c, 0xe7, 0x21, 0x1f, 0x46, 0xfd, 0xba, - 0x02, 0xb3, 0x71, 0x38, 0xef, 0xeb, 0x0a, 0x14, 0x0c, 0xd3, 0xf4, 0xb0, 0xef, 0x0f, 0x5d, 0x96, - 0x6b, 0x0c, 0x47, 0x0b, 0x91, 0x05, 0xce, 0x65, 0x46, 0xe6, 0x9c, 0xaa, 0xc3, 0xf4, 0x2d, 0x1c, - 0xdc, 0xc5, 0x81, 0x37, 0x56, 0x98, 0xbc, 0x41, 0x8e, 0x35, 0xb4, 0x31, 0x17, 0x8b, 0xb0, 0xa8, - 0x7e, 0xa6, 0x00, 0x12, 0x47, 0x18, 0x67, 0x99, 0x45, 0x2e, 0x67, 0xe2, 0x5c, 0x66, 0x89, 0x4a, - 0x9d, 0xae, 0xeb, 0x60, 0x27, 0x10, 0x1d, 0xb1, 0x6a, 0x04, 0x0d, 0x73, 0x37, 0xd0, 0x1d, 0xd7, - 0x30, 0xaf, 0x1b, 0xf6, 0x78, 0x8e, 0xc3, 0x29, 0x00, 0xdf, 0x6b, 0xe9, 0x7c, 0x1f, 0x67, 0xb8, - 0x5e, 0xf2, 0x5a, 0xf7, 0xd8, 0x56, 0x3e, 0x0d, 0x65, 0xd3, 0x0f, 0x78, 0x75, 0x18, 0xb5, 0x05, - 0xd3, 0x0f, 0x58, 0x3d, 0xcd, 0x0e, 0xf6, 0xb1, 0x61, 0x63, 0x53, 0x17, 0x82, 0x5e, 0x93, 0x14, - 0xad, 0xce, 0x2a, 0x36, 0x22, 0xb8, 0x64, 0x73, 0xe5, 0xa4, 0x9b, 0x6b, 0x0b, 0x16, 0xee, 0x1a, - 0x4e, 0xcf, 0xb0, 0x6f, 0xb8, 0x9d, 0xae, 0x11, 0x4b, 0x28, 0x4d, 0x2a, 0x4a, 0x45, 0xa2, 0x28, - 0x9f, 0x65, 0x99, 0x6f, 0xcc, 0x39, 0xa7, 0x73, 0x9a, 0xd4, 0x04, 0x08, 0xbb, 0x59, 0x29, 0x34, - 0x14, 0xd5, 0x87, 0xc6, 0xe0, 0x38, 0xe3, 0xac, 0x2c, 0xa5, 0x2e, 0xec, 0x4a, 0x54, 0xe3, 0x7d, - 0x98, 0xfa, 0x16, 0x3c, 0x43, 0xd3, 0x11, 0x43, 0x50, 0xec, 0xc2, 0x3d, 0xd9, 0x81, 0x22, 0xe9, - 0xe0, 0x57, 0x32, 0x54, 0x17, 0x0e, 0xf4, 0x30, 0x0e, 0xe1, 0x57, 0xe3, 0xf7, 0xdc, 0xcf, 0xa7, - 0xe4, 0x3c, 0xc7, 0x47, 0xe4, 0x5a, 0x7b, 0x09, 0xa6, 0xf0, 0x63, 0xdc, 0xea, 0x05, 0x96, 0xd3, - 0x5e, 0xb7, 0x0d, 0xe7, 0x9e, 0xcb, 0x6d, 0x53, 0x12, 0x8c, 0x9e, 0x87, 0x2a, 0x59, 0x06, 0xb7, - 0x17, 0x70, 0x3c, 0x66, 0xa4, 0xe2, 0x40, 0xd2, 0x1f, 0x99, 0xaf, 0x8d, 0x03, 0x6c, 0x72, 0x3c, - 0x66, 0xb1, 0x92, 0xe0, 0x01, 0x56, 0x12, 0xb0, 0x7f, 0x10, 0x56, 0xfe, 0x8b, 0x92, 0x60, 0x25, - 0xef, 0xe1, 0xa8, 0x58, 0x79, 0x1b, 0xa0, 0x83, 0xbd, 0x36, 0x5e, 0xa3, 0x56, 0x80, 0x5d, 0x02, - 0x2c, 0x49, 0xad, 0x40, 0xbf, 0x83, 0xbb, 0x61, 0x03, 0x4d, 0x68, 0xab, 0xde, 0x82, 0x19, 0x09, - 0x0a, 0x51, 0x70, 0xbe, 0xdb, 0xf3, 0x5a, 0x38, 0xbc, 0x47, 0x0a, 0x8b, 0xc4, 0x20, 0x06, 0x86, - 0xd7, 0xc6, 0x01, 0x17, 0x5a, 0x5e, 0x52, 0xaf, 0xd0, 0xd0, 0x10, 0xbd, 0x73, 0x88, 0x49, 0x6a, - 0x3c, 0xcc, 0xad, 0x0c, 0x84, 0xb9, 0xb7, 0x68, 0x1c, 0x46, 0x6c, 0x37, 0x66, 0x8a, 0xc2, 0x16, - 0xe9, 0x0a, 0x9b, 0xfc, 0x0d, 0x4c, 0x58, 0x54, 0x7f, 0xaa, 0x40, 0x75, 0xad, 0xd3, 0x75, 0xfb, - 0x21, 0x88, 0x91, 0x4f, 0xa5, 0x83, 0x37, 0xb7, 0x19, 0xd9, 0xcd, 0xed, 0x73, 0x50, 0x8d, 0xbf, - 0x96, 0x60, 0x57, 0x44, 0x95, 0x96, 0xf8, 0x4a, 0xe2, 0x04, 0x94, 0x3c, 0x77, 0x57, 0x27, 0x3a, - 0xd5, 0xe4, 0xc9, 0x10, 0x45, 0xcf, 0xdd, 0x25, 0x9a, 0xd6, 0x44, 0xb3, 0x90, 0xdb, 0xb2, 0xec, - 0x28, 0x8f, 0x87, 0x15, 0xd0, 0xeb, 0xe4, 0xcc, 0xc6, 0x82, 0xa5, 0xf9, 0x51, 0x8f, 0x4e, 0x61, - 0x0b, 0xf5, 0x43, 0xa8, 0x85, 0xb3, 0x1e, 0xf3, 0xf1, 0x4f, 0x60, 0xf8, 0x0f, 0xc3, 0x3c, 0x05, - 0x56, 0x50, 0xcf, 0xb3, 0x18, 0x1a, 0xed, 0x3f, 0xb6, 0xe8, 0x08, 0x26, 0x09, 0x06, 0xdf, 0x4b, - 0xf4, 0xb7, 0xfa, 0x8f, 0x19, 0x98, 0x4f, 0x62, 0x8f, 0x43, 0xd2, 0x95, 0xf8, 0xfe, 0x91, 0xbf, - 0xe5, 0x10, 0x47, 0xe3, 0x7b, 0x87, 0xaf, 0x40, 0xcb, 0xed, 0x39, 0x01, 0x57, 0x40, 0x64, 0x05, - 0x6e, 0x90, 0x32, 0x5a, 0x80, 0x82, 0x65, 0xea, 0x36, 0x39, 0xde, 0x31, 0xe3, 0x94, 0xb7, 0xcc, - 0x3b, 0xe4, 0xe8, 0xf7, 0x6a, 0xe8, 0x72, 0x8d, 0x9c, 0xdc, 0xc0, 0xf0, 0x51, 0x0d, 0x32, 0x96, - 0xc9, 0xe3, 0x1d, 0x19, 0xcb, 0x24, 0xc2, 0x44, 0xef, 0x05, 0x68, 0x22, 0x2e, 0xcf, 0xcc, 0x25, - 0x52, 0x50, 0x25, 0xd0, 0xf7, 0x42, 0x20, 0xf1, 0xca, 0x28, 0x1a, 0x8f, 0xce, 0x52, 0xcf, 0xb9, - 0xa8, 0x95, 0x09, 0x6c, 0x8d, 0x81, 0xd4, 0x06, 0xcc, 0x13, 0xd2, 0xd8, 0x14, 0x1f, 0x90, 0x05, - 0x09, 0x7d, 0xad, 0xef, 0x28, 0xb0, 0x30, 0x50, 0x35, 0x0e, 0xaf, 0xaf, 0x89, 0xcb, 0x5f, 0x5e, - 0x39, 0x2f, 0x55, 0x35, 0xf2, 0xc5, 0x0d, 0x65, 0xe5, 0xbb, 0xcc, 0x31, 0xd2, 0x58, 0xf2, 0xe5, - 0x13, 0x4e, 0xe5, 0x59, 0x82, 0xfa, 0xae, 0x15, 0x6c, 0xeb, 0xf4, 0x75, 0x10, 0xf5, 0x4a, 0x58, - 0x34, 0xbb, 0xa8, 0xd5, 0x08, 0x7c, 0x83, 0x80, 0x89, 0x67, 0xe2, 0xab, 0xdf, 0x54, 0x60, 0x26, - 0x46, 0xd6, 0x38, 0x6c, 0x7a, 0x83, 0x38, 0x6c, 0xac, 0x23, 0xce, 0xa9, 0x45, 0x29, 0xa7, 0xf8, - 0x68, 0x54, 0x19, 0x47, 0x2d, 0xd4, 0x7f, 0x55, 0xa0, 0x2c, 0xd4, 0x90, 0x93, 0x20, 0xaf, 0xeb, - 0x9f, 0x04, 0x23, 0xc0, 0x48, 0x6c, 0x78, 0x0e, 0xfa, 0x2a, 0x4a, 0x48, 0x66, 0x17, 0xb2, 0xe9, - 0x4c, 0x1f, 0xdd, 0x86, 0x1a, 0x63, 0x53, 0x44, 0xba, 0xf4, 0x82, 0x26, 0xca, 0x13, 0x34, 0x3c, - 0x93, 0x53, 0xa9, 0x55, 0x7d, 0xa1, 0xc4, 0x42, 0x9b, 0xae, 0x89, 0xe9, 0x48, 0xb9, 0x81, 0x73, - 0x59, 0x45, 0x6c, 0x4a, 0x7c, 0x5b, 0x1b, 0x1b, 0x26, 0xf6, 0xa2, 0xb9, 0x45, 0x65, 0xe2, 0x4c, - 0xb2, 0xdf, 0x3a, 0xf1, 0xf5, 0xb9, 0xb2, 0x05, 0x06, 0x22, 0xc7, 0x00, 0xf4, 0x25, 0x98, 0x32, - 0x3b, 0xb1, 0xa7, 0x69, 0xa1, 0xf7, 0x6b, 0x76, 0x84, 0x37, 0x69, 0x31, 0x82, 0x26, 0xe3, 0x04, - 0xfd, 0xb7, 0x12, 0x3d, 0xf6, 0xf5, 0xb0, 0x89, 0x9d, 0xc0, 0x32, 0xec, 0xc3, 0xcb, 0x64, 0x13, - 0x8a, 0x3d, 0x1f, 0x7b, 0x82, 0x6d, 0x88, 0xca, 0xa4, 0xae, 0x6b, 0xf8, 0xfe, 0xae, 0xeb, 0x99, - 0x9c, 0xca, 0xa8, 0x3c, 0x24, 0x35, 0x91, 0x3d, 0x10, 0x95, 0xa7, 0x26, 0x5e, 0x81, 0x85, 0x8e, - 0x6b, 0x5a, 0x5b, 0x96, 0x2c, 0xa3, 0x91, 0x34, 0x9b, 0x0b, 0xab, 0x63, 0xed, 0xd4, 0xef, 0x67, - 0x60, 0xe1, 0xfd, 0xae, 0xf9, 0x05, 0xcc, 0x79, 0x11, 0xca, 0xae, 0x6d, 0xae, 0xc7, 0xa7, 0x2d, - 0x82, 0x08, 0x86, 0x83, 0x77, 0x23, 0x0c, 0x76, 0x2b, 0x2f, 0x82, 0x86, 0xa6, 0x6d, 0x1e, 0x8a, - 0x37, 0xf9, 0x61, 0xbc, 0x69, 0xc3, 0x02, 0x0b, 0x11, 0x3f, 0x61, 0xd6, 0xa8, 0x1f, 0xc3, 0x1c, - 0x51, 0xcd, 0x64, 0x98, 0xf7, 0x7d, 0xec, 0x8d, 0xa9, 0x71, 0x4e, 0x42, 0x29, 0xec, 0x39, 0xcc, - 0xa8, 0xed, 0x03, 0xd4, 0xdb, 0x30, 0x9b, 0x18, 0xeb, 0x90, 0x33, 0x52, 0x17, 0x01, 0x34, 0xd7, - 0xc6, 0xef, 0x38, 0x81, 0x15, 0xec, 0x11, 0xf3, 0x2e, 0xb8, 0x4b, 0xf4, 0x37, 0xc1, 0x20, 0x63, - 0x0c, 0xc1, 0xf8, 0x45, 0x98, 0x66, 0x3b, 0x8e, 0xf4, 0x74, 0x78, 0xe6, 0xbe, 0x0a, 0x79, 0x4c, - 0x07, 0xe1, 0xe7, 0xfe, 0xd3, 0x72, 0x15, 0x1b, 0x51, 0xab, 0x71, 0x74, 0xf5, 0x17, 0x60, 0x6a, - 0xd5, 0x73, 0xbb, 0xe3, 0x8d, 0x4e, 0xbd, 0x07, 0x1b, 0x8b, 0x6e, 0x60, 0x91, 0x00, 0xe8, 0x79, - 0xf4, 0xef, 0x14, 0x98, 0xbf, 0xdf, 0xc5, 0x9e, 0x11, 0x60, 0xc2, 0x8b, 0xf1, 0x46, 0x1a, 0xb6, - 0xbf, 0x62, 0x54, 0x64, 0xe3, 0x54, 0xa0, 0x37, 0x62, 0x2f, 0xb6, 0xe4, 0xc7, 0x82, 0x04, 0x95, - 0x42, 0xe6, 0xf7, 0x1f, 0x2a, 0x30, 0xbd, 0x81, 0x89, 0x0d, 0x19, 0x8f, 0xfc, 0xcb, 0x30, 0x49, - 0x28, 0x1a, 0x75, 0x91, 0x28, 0x32, 0x3a, 0x07, 0xd3, 0x96, 0xd3, 0xb2, 0x7b, 0x26, 0xd6, 0xc9, - 0x5c, 0x75, 0xe2, 0x42, 0x71, 0xc3, 0x3d, 0xc5, 0x2b, 0x08, 0xc9, 0xc4, 0x3c, 0xaa, 0x8f, 0x99, - 0x48, 0x46, 0xf9, 0x31, 0x6c, 0x38, 0xe5, 0x20, 0xc3, 0xbd, 0x02, 0x39, 0x32, 0x4c, 0x68, 0xac, - 0xe5, 0xad, 0xfa, 0x52, 0xad, 0x31, 0x6c, 0xf5, 0x1b, 0x0a, 0x20, 0x91, 0x45, 0xe3, 0x6c, 0xe0, - 0xd7, 0xc4, 0x00, 0x79, 0x76, 0x28, 0xe9, 0x6c, 0xa6, 0x51, 0x68, 0x5c, 0x58, 0x29, 0xba, 0x8c, - 0xe3, 0xac, 0x14, 0x99, 0xd7, 0xd0, 0x95, 0x12, 0x98, 0x40, 0x91, 0xc5, 0x95, 0xa2, 0x92, 0x28, - 0x59, 0x29, 0x42, 0x73, 0xb8, 0x52, 0x8c, 0xc2, 0x70, 0xa5, 0xe8, 0x70, 0xca, 0x41, 0x86, 0x7b, - 0x05, 0x72, 0x64, 0x98, 0xfd, 0x99, 0x14, 0xae, 0x14, 0xc5, 0x16, 0x56, 0x8a, 0x13, 0xf0, 0xe4, - 0x57, 0xaa, 0x3f, 0xd3, 0xfe, 0x4a, 0xa9, 0x50, 0xb9, 0xbf, 0xf9, 0x31, 0x6e, 0x05, 0x43, 0xb4, - 0xe3, 0x59, 0x98, 0x5a, 0xf7, 0xac, 0x1d, 0xcb, 0xc6, 0xed, 0x61, 0x6a, 0xf6, 0x9b, 0x0a, 0x54, - 0x6f, 0x79, 0x86, 0x13, 0xb8, 0xa1, 0xaa, 0x3d, 0x14, 0x3f, 0xaf, 0x43, 0xa9, 0x1b, 0x8e, 0xc6, - 0x17, 0xfe, 0x79, 0x79, 0x00, 0x23, 0x4e, 0x93, 0xd6, 0x6f, 0xa6, 0x7e, 0x00, 0xb3, 0x94, 0x92, - 0x24, 0xd9, 0x6f, 0x42, 0x91, 0x6a, 0x5c, 0x8b, 0x5f, 0x1e, 0x94, 0x57, 0x54, 0xf9, 0x79, 0x41, - 0x9c, 0x86, 0x16, 0xb5, 0x51, 0xff, 0x5d, 0x81, 0x32, 0xad, 0xeb, 0x4f, 0xf0, 0xe0, 0x5b, 0xfb, - 0x35, 0xc8, 0xbb, 0x94, 0xe5, 0x43, 0xe3, 0x9c, 0xe2, 0xaa, 0x68, 0xbc, 0x01, 0x71, 0x3f, 0xd9, - 0x2f, 0x51, 0xbd, 0x02, 0x03, 0x71, 0x05, 0x5b, 0x68, 0x33, 0xda, 0xa9, 0x8e, 0x1d, 0x6d, 0x7e, - 0x61, 0x13, 0xf5, 0xd3, 0x48, 0x26, 0x29, 0xc2, 0xe1, 0xf7, 0xed, 0x57, 0x12, 0x86, 0x70, 0x31, - 0x9d, 0x8a, 0x84, 0x25, 0x24, 0x87, 0x9e, 0x18, 0x09, 0x63, 0x1e, 0x7a, 0xa2, 0xe5, 0x1e, 0x76, - 0xe8, 0x11, 0x09, 0xe9, 0x2f, 0xf6, 0x8f, 0x14, 0x58, 0xe0, 0xc6, 0x28, 0x92, 0xa3, 0x23, 0x60, - 0x09, 0xfa, 0x2a, 0x37, 0x9a, 0x59, 0x6a, 0x34, 0x5f, 0x1c, 0x66, 0x34, 0x23, 0x3a, 0x05, 0xab, - 0x79, 0x16, 0x4a, 0x77, 0x29, 0xd2, 0x3b, 0x8f, 0x03, 0xd4, 0x80, 0xc2, 0x0e, 0xf6, 0x7c, 0xcb, - 0x75, 0xf8, 0xd6, 0x0d, 0x8b, 0xe7, 0xce, 0x40, 0x31, 0x7c, 0x68, 0x85, 0x0a, 0x90, 0xbd, 0x66, - 0xdb, 0xf5, 0x09, 0x54, 0x81, 0xe2, 0x1a, 0x7f, 0x4d, 0x54, 0x57, 0xce, 0xbd, 0x0d, 0x33, 0x12, - 0xe3, 0x8c, 0xa6, 0xa1, 0x7a, 0xcd, 0xa4, 0x5e, 0xdc, 0x03, 0x97, 0x00, 0xeb, 0x13, 0x68, 0x1e, - 0x90, 0x86, 0x3b, 0xee, 0x0e, 0x45, 0xbc, 0xe9, 0xb9, 0x1d, 0x0a, 0x57, 0xce, 0x5d, 0x80, 0x59, - 0x19, 0xa5, 0xa8, 0x04, 0x39, 0x3a, 0xf3, 0xfa, 0x04, 0x02, 0xc8, 0x6b, 0x78, 0xc7, 0x7d, 0x88, - 0xeb, 0xca, 0xca, 0x5f, 0x9c, 0x83, 0x2a, 0xa3, 0x9d, 0x3f, 0x0b, 0x46, 0x3a, 0xd4, 0x93, 0xdf, - 0x41, 0x42, 0x5f, 0x96, 0xdf, 0x2e, 0xca, 0x3f, 0x97, 0xd4, 0x1c, 0x26, 0x38, 0xea, 0x04, 0xfa, - 0x10, 0x6a, 0xf1, 0x2f, 0x07, 0x21, 0x79, 0xf4, 0x54, 0xfa, 0x79, 0xa1, 0xfd, 0x3a, 0xd7, 0xa1, - 0x1a, 0xfb, 0xe8, 0x0f, 0x92, 0x2f, 0xa6, 0xec, 0xc3, 0x40, 0x4d, 0xb9, 0x96, 0x10, 0x3f, 0xcc, - 0xc3, 0xa8, 0x8f, 0x7f, 0x85, 0x23, 0x85, 0x7a, 0xe9, 0xa7, 0x3a, 0xf6, 0xa3, 0xde, 0x80, 0xe9, - 0x81, 0x8f, 0x64, 0xa0, 0x0b, 0x29, 0xb7, 0x08, 0xf2, 0x8f, 0x69, 0xec, 0x37, 0xc4, 0x2e, 0xa0, - 0xc1, 0x0f, 0xd9, 0xa0, 0x65, 0xf9, 0x0a, 0xa4, 0x7d, 0xda, 0xa7, 0x79, 0x71, 0x64, 0xfc, 0x88, - 0x71, 0xbf, 0xac, 0xc0, 0x42, 0xca, 0x17, 0x16, 0xd0, 0xe5, 0xb4, 0x2b, 0xa5, 0x21, 0x9f, 0x89, - 0x68, 0xbe, 0x7c, 0xb0, 0x46, 0x11, 0x21, 0x0e, 0x4c, 0x25, 0x3e, 0x30, 0x80, 0xce, 0xa7, 0xbe, - 0x8a, 0x1c, 0xfc, 0xfa, 0x42, 0xf3, 0xcb, 0xa3, 0x21, 0x47, 0xe3, 0x7d, 0x04, 0x53, 0x89, 0xd7, - 0xf5, 0x29, 0xe3, 0xc9, 0xdf, 0xe0, 0xef, 0xb7, 0xa0, 0x5f, 0x83, 0x6a, 0xec, 0x19, 0x7c, 0x8a, - 0xc4, 0xcb, 0x9e, 0xca, 0xef, 0xd7, 0xf5, 0x47, 0x50, 0x11, 0x5f, 0xab, 0xa3, 0xa5, 0xb4, 0xbd, - 0x34, 0xd0, 0xf1, 0x41, 0xb6, 0x52, 0xff, 0x95, 0xe9, 0x90, 0xad, 0x34, 0xf0, 0x30, 0x77, 0xf4, - 0xad, 0x24, 0xf4, 0x3f, 0x74, 0x2b, 0x1d, 0x78, 0x88, 0xaf, 0x2b, 0xf4, 0x4e, 0x5b, 0xf2, 0x8a, - 0x19, 0xad, 0xa4, 0xc9, 0x66, 0xfa, 0x7b, 0xed, 0xe6, 0xe5, 0x03, 0xb5, 0x89, 0xb8, 0xf8, 0x10, - 0x6a, 0xf1, 0xb7, 0xba, 0x29, 0x5c, 0x94, 0x3e, 0x6f, 0x6e, 0x9e, 0x1f, 0x09, 0x37, 0x1a, 0xec, - 0x7d, 0x28, 0x0b, 0x9f, 0x36, 0x44, 0x2f, 0x0c, 0x91, 0x63, 0xf1, 0x3b, 0x7f, 0xfb, 0x71, 0xf2, - 0x3d, 0x28, 0x45, 0x5f, 0x24, 0x44, 0x67, 0x53, 0xe5, 0xf7, 0x20, 0x5d, 0x6e, 0x00, 0xf4, 0x3f, - 0x37, 0x88, 0xbe, 0x24, 0xed, 0x73, 0xe0, 0x7b, 0x84, 0xfb, 0x75, 0x1a, 0x4d, 0x9f, 0xbd, 0x7c, - 0x18, 0x36, 0x7d, 0xf1, 0xcd, 0xce, 0x7e, 0xdd, 0x6e, 0x43, 0x35, 0xf6, 0xd2, 0x2e, 0x6d, 0x0b, - 0x4b, 0x1e, 0x40, 0x36, 0xcf, 0x8d, 0x82, 0x1a, 0xad, 0xdf, 0x36, 0x54, 0x63, 0xef, 0x9e, 0x52, - 0x46, 0x92, 0x3d, 0xf3, 0x4a, 0x19, 0x49, 0xfa, 0x8c, 0x4a, 0x9d, 0x40, 0x9f, 0x0a, 0x4f, 0xac, - 0x62, 0xcf, 0xd8, 0xd0, 0xa5, 0xa1, 0xfd, 0xc8, 0x5e, 0xf1, 0x35, 0x57, 0x0e, 0xd2, 0x24, 0x22, - 0x81, 0x4b, 0x15, 0x63, 0x69, 0xba, 0x54, 0x1d, 0x64, 0xa5, 0x36, 0x20, 0xcf, 0x5e, 0x32, 0x21, - 0x35, 0xe5, 0xcd, 0xa2, 0xf0, 0xcc, 0xa9, 0xf9, 0x9c, 0x14, 0x27, 0xfe, 0xb6, 0x87, 0x75, 0xca, - 0x6e, 0x1f, 0x53, 0x3a, 0x8d, 0xbd, 0x5e, 0x19, 0xb5, 0x53, 0x0d, 0xf2, 0x2c, 0xaf, 0x3e, 0xa5, - 0xd3, 0xd8, 0x5b, 0x91, 0xe6, 0x70, 0x1c, 0x76, 0x8e, 0x9d, 0x40, 0xeb, 0x90, 0xa3, 0xa1, 0x5a, - 0x74, 0x66, 0x58, 0xca, 0xf9, 0xb0, 0x1e, 0x63, 0x59, 0xe9, 0xea, 0x04, 0xba, 0x0f, 0x39, 0x1a, - 0xf5, 0x4a, 0xe9, 0x51, 0xcc, 0x1b, 0x6f, 0x0e, 0x45, 0x09, 0x49, 0x34, 0xa1, 0x22, 0x26, 0x8b, - 0xa6, 0x98, 0x2c, 0x49, 0x3a, 0x6d, 0x73, 0x14, 0xcc, 0x70, 0x14, 0xb6, 0x8d, 0xfa, 0x61, 0xeb, - 0xf4, 0x6d, 0x34, 0x10, 0x12, 0x4f, 0xdf, 0x46, 0x83, 0x51, 0x70, 0x75, 0x02, 0xfd, 0xaa, 0x02, - 0x8d, 0xb4, 0x0c, 0x46, 0x94, 0xea, 0x01, 0x0d, 0x4b, 0xc3, 0x6c, 0xbe, 0x72, 0xc0, 0x56, 0x11, - 0x2d, 0x9f, 0xd0, 0x60, 0xd9, 0x40, 0xce, 0xe2, 0xc5, 0xb4, 0xfe, 0x52, 0xf2, 0xf0, 0x9a, 0x2f, - 0x8d, 0xde, 0x20, 0x1a, 0x7b, 0x13, 0xca, 0x42, 0xa0, 0x2e, 0x45, 0xf3, 0x0e, 0x46, 0x18, 0x53, - 0x56, 0x55, 0x12, 0xf3, 0x63, 0xe2, 0x4d, 0x13, 0xdd, 0x52, 0x84, 0x51, 0xcc, 0x9b, 0x4b, 0x11, - 0xef, 0x58, 0x9e, 0x9c, 0x3a, 0x81, 0x30, 0x54, 0xc4, 0xac, 0xb7, 0x14, 0x69, 0x94, 0x24, 0xcc, - 0x35, 0x5f, 0x1c, 0x01, 0x33, 0x1a, 0x46, 0x07, 0xe8, 0x67, 0x9d, 0xa5, 0xd8, 0xba, 0x81, 0xc4, - 0xb7, 0xe6, 0x0b, 0xfb, 0xe2, 0x89, 0x66, 0x5f, 0xc8, 0x23, 0x4b, 0xe1, 0xfe, 0x60, 0xa6, 0xd9, - 0x08, 0x67, 0x91, 0xc1, 0x14, 0xa5, 0x94, 0xb3, 0x48, 0x6a, 0x36, 0x54, 0xf3, 0xe2, 0xc8, 0xf8, - 0xd1, 0x7c, 0x1e, 0x41, 0x3d, 0x99, 0xd2, 0x95, 0x72, 0xc6, 0x4d, 0xc9, 0x30, 0x6b, 0x5e, 0x18, - 0x11, 0x5b, 0xb4, 0x87, 0x27, 0x06, 0x69, 0xfa, 0x39, 0x2b, 0xd8, 0xa6, 0xd9, 0x44, 0xa3, 0xcc, - 0x5a, 0x4c, 0x5c, 0x1a, 0x65, 0xd6, 0xb1, 0x34, 0x25, 0x6e, 0xbc, 0x68, 0x88, 0x3e, 0xcd, 0x78, - 0x89, 0x09, 0x32, 0x29, 0x76, 0x26, 0x9e, 0x4e, 0xc2, 0xdc, 0xcf, 0x78, 0xe8, 0x1f, 0x9d, 0x1b, - 0x29, 0x3f, 0x60, 0x98, 0xfb, 0x29, 0xcf, 0x25, 0x60, 0x47, 0xb7, 0x44, 0x66, 0x43, 0xca, 0x51, - 0x4a, 0x9e, 0x1a, 0x91, 0x72, 0x74, 0x4b, 0x49, 0x96, 0xa0, 0x1b, 0xab, 0x9e, 0x0c, 0x13, 0x0f, - 0xbf, 0x0b, 0x49, 0x86, 0x0f, 0xf7, 0xbf, 0xae, 0xa8, 0x27, 0x63, 0xb2, 0x29, 0x03, 0xa4, 0x84, - 0x6e, 0x47, 0x18, 0x20, 0x19, 0xd9, 0x4c, 0x19, 0x20, 0x25, 0x00, 0x3a, 0x82, 0xef, 0x1a, 0x8b, - 0x32, 0xa6, 0x98, 0x42, 0x59, 0x24, 0x32, 0xc5, 0x14, 0x4a, 0x03, 0xa4, 0xcc, 0xa3, 0xef, 0x47, - 0x10, 0x53, 0xb4, 0xdc, 0x40, 0x88, 0x71, 0x3f, 0xf2, 0xef, 0x43, 0x31, 0x0c, 0x0b, 0xa2, 0xe7, - 0x53, 0x5d, 0xc4, 0x03, 0x74, 0xf8, 0x11, 0x4c, 0x25, 0x6e, 0xf0, 0x52, 0x44, 0x54, 0x1e, 0x2a, - 0xdc, 0x7f, 0x3d, 0xa1, 0x1f, 0x7c, 0x4a, 0x61, 0xc2, 0x40, 0x00, 0x2f, 0x45, 0xd5, 0x0f, 0x46, - 0xb1, 0xc4, 0x01, 0x08, 0x61, 0x43, 0x07, 0x10, 0xe2, 0x4e, 0x43, 0x07, 0x10, 0x83, 0x2f, 0x4c, - 0x22, 0x93, 0x17, 0x94, 0x29, 0x12, 0x99, 0x72, 0x33, 0xbc, 0x1f, 0x8b, 0x36, 0xa1, 0x2c, 0x5c, - 0x6f, 0xa3, 0x61, 0xa4, 0x89, 0x77, 0xf0, 0x29, 0xae, 0x82, 0xe4, 0xa6, 0x5c, 0x9d, 0x58, 0xe9, - 0x41, 0x65, 0xdd, 0x73, 0x1f, 0x87, 0xdf, 0x52, 0xfc, 0x82, 0x0c, 0xfd, 0xd5, 0x16, 0xd4, 0x18, - 0x82, 0x8e, 0x1f, 0x07, 0xba, 0xbb, 0xf9, 0x31, 0x3a, 0xb9, 0xcc, 0xfe, 0x1f, 0xc1, 0x72, 0xf8, - 0xff, 0x08, 0x96, 0x6f, 0x5a, 0x36, 0xbe, 0xcf, 0x33, 0x06, 0xff, 0xb3, 0x30, 0xe4, 0xe1, 0x5a, - 0x74, 0x65, 0xad, 0xf1, 0x7f, 0x89, 0xf0, 0xce, 0xe3, 0xe0, 0xfe, 0xe6, 0xc7, 0xd7, 0x8d, 0xcf, - 0xdf, 0x2c, 0x40, 0x6e, 0x65, 0xf9, 0xd2, 0xf2, 0x4b, 0x50, 0xb3, 0x22, 0xf4, 0xb6, 0xd7, 0x6d, - 0x5d, 0x2f, 0xb3, 0x46, 0xeb, 0xa4, 0x9f, 0x75, 0xe5, 0xe7, 0x2f, 0xb7, 0xad, 0x60, 0xbb, 0xb7, - 0x49, 0x96, 0xe0, 0x22, 0x43, 0xbb, 0x60, 0xb9, 0xfc, 0xd7, 0x45, 0xcb, 0x09, 0xb0, 0xe7, 0x18, - 0x36, 0xfb, 0x57, 0x09, 0x1c, 0xda, 0xdd, 0xfc, 0x5d, 0x45, 0xd9, 0xcc, 0x53, 0xd0, 0xe5, 0xff, - 0x0f, 0x00, 0x00, 0xff, 0xff, 0xbe, 0xa2, 0xfe, 0xb7, 0x8c, 0x61, 0x00, 0x00, + // 5188 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xdc, 0x3d, 0x4b, 0x6c, 0x1c, 0x47, + 0x76, 0xec, 0x19, 0xce, 0xef, 0xcd, 0x87, 0xc3, 0xe2, 0x6f, 0x3c, 0x92, 0x2c, 0xaa, 0x6d, 0xd9, + 0xb4, 0xb4, 0xa6, 0x6c, 0xca, 0x96, 0xd7, 0xb2, 0x57, 0xb6, 0x24, 0x5a, 0x12, 0x61, 0x7d, 0xe8, + 0xa6, 0xec, 0x60, 0xe3, 0x18, 0x8d, 0xe6, 0x74, 0x71, 0xd8, 0x56, 0x4f, 0xf7, 0xa8, 0xbb, 0x87, + 0x14, 0x9d, 0xcb, 0x02, 0x9b, 0xdd, 0x6c, 0x90, 0xcd, 0x2e, 0x36, 0xbf, 0x45, 0x0e, 0xf9, 0x20, + 0xd8, 0x1c, 0x02, 0x6c, 0x82, 0x38, 0x09, 0x10, 0x60, 0x73, 0xc8, 0x39, 0x46, 0xbe, 0x87, 0x20, + 0x59, 0x24, 0xc7, 0x45, 0x80, 0x1c, 0x02, 0xe4, 0x90, 0x63, 0x82, 0x04, 0xf5, 0xe9, 0x9e, 0xea, + 0x9e, 0xea, 0xe1, 0x90, 0xb3, 0x32, 0x29, 0xf3, 0x34, 0xf5, 0xea, 0x55, 0xd5, 0xab, 0x57, 0xef, + 0xbd, 0x7a, 0x55, 0xef, 0x55, 0x13, 0x2a, 0x1d, 0xcb, 0xde, 0xe9, 0xf9, 0xcb, 0x5d, 0xcf, 0x0d, + 0x5c, 0x34, 0x23, 0x96, 0x96, 0x59, 0xa1, 0x59, 0x69, 0xb9, 0x9d, 0x8e, 0xeb, 0x30, 0x60, 0xb3, + 0xe2, 0xb7, 0xb6, 0x71, 0xc7, 0xe0, 0xa5, 0xc5, 0xb6, 0xeb, 0xb6, 0x6d, 0x7c, 0x81, 0x96, 0x36, + 0x7b, 0x5b, 0x17, 0x4c, 0xec, 0xb7, 0x3c, 0xab, 0x1b, 0xb8, 0x1e, 0xc3, 0x50, 0x7f, 0x47, 0x01, + 0x74, 0xdd, 0xc3, 0x46, 0x80, 0xaf, 0xda, 0x96, 0xe1, 0x6b, 0xf8, 0x61, 0x0f, 0xfb, 0x01, 0x7a, + 0x09, 0x26, 0x37, 0x0d, 0x1f, 0x37, 0x94, 0x45, 0x65, 0xa9, 0xbc, 0x72, 0x72, 0x39, 0x36, 0x30, + 0x1f, 0xf0, 0x8e, 0xdf, 0xbe, 0x66, 0xf8, 0x58, 0xa3, 0x98, 0x68, 0x01, 0x0a, 0xe6, 0xa6, 0xee, + 0x18, 0x1d, 0xdc, 0xc8, 0x2c, 0x2a, 0x4b, 0x25, 0x2d, 0x6f, 0x6e, 0xde, 0x35, 0x3a, 0x18, 0x3d, + 0x0f, 0x53, 0x2d, 0xd7, 0xb6, 0x71, 0x2b, 0xb0, 0x5c, 0x87, 0x21, 0x64, 0x29, 0x42, 0xad, 0x0f, + 0xa6, 0x88, 0xb3, 0x90, 0x33, 0x08, 0x0d, 0x8d, 0x49, 0x5a, 0xcd, 0x0a, 0xaa, 0x0f, 0xf5, 0x55, + 0xcf, 0xed, 0x3e, 0x2e, 0xea, 0xa2, 0x41, 0xb3, 0xe2, 0xa0, 0xbf, 0xad, 0xc0, 0xf4, 0x55, 0x3b, + 0xc0, 0xde, 0x31, 0x65, 0xca, 0x0f, 0x33, 0xb0, 0xc0, 0x56, 0xed, 0x7a, 0x84, 0x7e, 0x94, 0x54, + 0xce, 0x43, 0x9e, 0xc9, 0x1d, 0x25, 0xb3, 0xa2, 0xf1, 0x12, 0x3a, 0x05, 0xe0, 0x6f, 0x1b, 0x9e, + 0xe9, 0xeb, 0x4e, 0xaf, 0xd3, 0xc8, 0x2d, 0x2a, 0x4b, 0x39, 0xad, 0xc4, 0x20, 0x77, 0x7b, 0x1d, + 0xa4, 0xc1, 0x74, 0xcb, 0x75, 0x7c, 0xcb, 0x0f, 0xb0, 0xd3, 0xda, 0xd3, 0x6d, 0xbc, 0x83, 0xed, + 0x46, 0x7e, 0x51, 0x59, 0xaa, 0xad, 0x9c, 0x95, 0xd2, 0x7d, 0xbd, 0x8f, 0x7d, 0x9b, 0x20, 0x6b, + 0xf5, 0x56, 0x02, 0x72, 0x19, 0x7d, 0x76, 0x65, 0xaa, 0xa8, 0xd4, 0x95, 0xc6, 0xff, 0x85, 0x7f, + 0x8a, 0xfa, 0xbb, 0x0a, 0xcc, 0x11, 0x21, 0x3a, 0x16, 0xcc, 0x0a, 0x29, 0xcc, 0x88, 0x14, 0xfe, + 0xa1, 0x02, 0xb3, 0xb7, 0x0c, 0xff, 0x78, 0xac, 0xe6, 0x29, 0x80, 0xc0, 0xea, 0x60, 0xdd, 0x0f, + 0x8c, 0x4e, 0x97, 0xae, 0xe8, 0xa4, 0x56, 0x22, 0x90, 0x0d, 0x02, 0x50, 0xbf, 0x0a, 0x95, 0x6b, + 0xae, 0x6b, 0x6b, 0xd8, 0xef, 0xba, 0x8e, 0x8f, 0xd1, 0x45, 0xc8, 0xfb, 0x81, 0x11, 0xf4, 0x7c, + 0x4e, 0xe4, 0x09, 0x29, 0x91, 0x1b, 0x14, 0x45, 0xe3, 0xa8, 0x44, 0xae, 0x77, 0x0c, 0xbb, 0xc7, + 0x68, 0x2c, 0x6a, 0xac, 0xa0, 0x7e, 0x08, 0xb5, 0x8d, 0xc0, 0xb3, 0x9c, 0xf6, 0x4f, 0xb1, 0xf3, + 0x52, 0xd8, 0xf9, 0xbf, 0x2b, 0xf0, 0xd4, 0x2a, 0xb5, 0x7f, 0x9b, 0xc7, 0x44, 0x6d, 0x54, 0xa8, + 0xf4, 0x21, 0x6b, 0xab, 0x94, 0xd5, 0x59, 0x2d, 0x06, 0x4b, 0x2c, 0x46, 0x2e, 0xb1, 0x18, 0xa1, + 0x30, 0x65, 0x45, 0x61, 0xfa, 0x5a, 0x0e, 0x9a, 0xb2, 0x89, 0x8e, 0xc3, 0xd2, 0xaf, 0x44, 0x1a, + 0x9e, 0xa1, 0x8d, 0x12, 0xfa, 0xc9, 0x77, 0x9d, 0xfe, 0x68, 0x1b, 0x14, 0x10, 0x19, 0x82, 0xe4, + 0x4c, 0xb3, 0x92, 0x99, 0xae, 0xc0, 0xdc, 0x8e, 0xe5, 0x05, 0x3d, 0xc3, 0xd6, 0x5b, 0xdb, 0x86, + 0xe3, 0x60, 0x9b, 0xf2, 0x8e, 0x98, 0xbe, 0xec, 0x52, 0x49, 0x9b, 0xe1, 0x95, 0xd7, 0x59, 0x1d, + 0x61, 0xa0, 0x8f, 0x5e, 0x81, 0xf9, 0xee, 0xf6, 0x9e, 0x6f, 0xb5, 0x06, 0x1a, 0xe5, 0x68, 0xa3, + 0xd9, 0xb0, 0x36, 0xd6, 0xea, 0x3c, 0x4c, 0xb7, 0xa8, 0xf5, 0x34, 0x75, 0xc2, 0x49, 0xc6, 0xda, + 0x3c, 0x65, 0x6d, 0x9d, 0x57, 0xdc, 0x0f, 0xe1, 0x84, 0xac, 0x10, 0xb9, 0x17, 0xb4, 0x84, 0x06, + 0x05, 0xda, 0x60, 0x86, 0x57, 0xbe, 0x1f, 0xb4, 0xfa, 0x6d, 0xe2, 0x76, 0xaf, 0x98, 0xb4, 0x7b, + 0x0d, 0x28, 0x50, 0x3b, 0x8e, 0xfd, 0x46, 0x89, 0x92, 0x19, 0x16, 0xd1, 0x1a, 0x4c, 0xf9, 0x81, + 0xe1, 0x05, 0x7a, 0xd7, 0xf5, 0x2d, 0xc2, 0x17, 0xbf, 0x01, 0x8b, 0xd9, 0xa5, 0xf2, 0xca, 0xa2, + 0x74, 0x91, 0xde, 0xc5, 0x7b, 0xab, 0x46, 0x60, 0xac, 0x1b, 0x96, 0xa7, 0xd5, 0x68, 0xc3, 0xf5, + 0xb0, 0x9d, 0xdc, 0xb8, 0x96, 0xc7, 0x32, 0xae, 0x32, 0xc9, 0xae, 0xc8, 0x24, 0x5b, 0xfd, 0x4b, + 0x05, 0xe6, 0x6e, 0xbb, 0x86, 0x79, 0x3c, 0xf4, 0xec, 0x2c, 0xd4, 0x3c, 0xdc, 0xb5, 0xad, 0x96, + 0x41, 0xd6, 0x63, 0x13, 0x7b, 0x54, 0xd3, 0x72, 0x5a, 0x95, 0x43, 0xef, 0x52, 0xe0, 0xe5, 0xc2, + 0x67, 0x57, 0x26, 0xeb, 0xb9, 0x46, 0x56, 0xfd, 0xbe, 0x02, 0x0d, 0x0d, 0xdb, 0xd8, 0xf0, 0x8f, + 0x87, 0xa1, 0x60, 0x94, 0xe5, 0x1b, 0x59, 0xf5, 0x3f, 0x15, 0x98, 0xbd, 0x89, 0x03, 0xa2, 0x9c, + 0x96, 0x1f, 0x58, 0xad, 0x23, 0xf5, 0x4d, 0x9e, 0x87, 0xa9, 0xae, 0xe1, 0x05, 0x56, 0x84, 0x17, + 0xaa, 0x6a, 0x2d, 0x02, 0x33, 0x7d, 0xbb, 0x00, 0x33, 0xed, 0x9e, 0xe1, 0x19, 0x4e, 0x80, 0xb1, + 0xa0, 0x40, 0xcc, 0x98, 0xa1, 0xa8, 0x2a, 0xd2, 0x1f, 0x36, 0x5f, 0x68, 0x64, 0xd5, 0x6f, 0x28, + 0x30, 0x97, 0x98, 0xef, 0x38, 0x56, 0xec, 0x35, 0xc8, 0x91, 0x5f, 0x7e, 0x23, 0x43, 0x95, 0xea, + 0x4c, 0x9a, 0x52, 0x7d, 0x40, 0x36, 0x0c, 0xaa, 0x55, 0x0c, 0x9f, 0x38, 0x84, 0x4f, 0xdf, 0xc4, + 0x81, 0x60, 0xdf, 0x8e, 0xc3, 0x0a, 0xf4, 0xf9, 0xf4, 0x5d, 0x05, 0x4e, 0xa7, 0xd2, 0x77, 0x24, + 0x1c, 0xfb, 0x6f, 0x05, 0xe6, 0x37, 0xb6, 0xdd, 0xdd, 0x3e, 0x49, 0x8f, 0x83, 0x53, 0xf1, 0xdd, + 0x31, 0x9b, 0xd8, 0x1d, 0xd1, 0xcb, 0x30, 0x19, 0xec, 0x75, 0x31, 0x55, 0xf7, 0xda, 0xca, 0xa9, + 0x65, 0xc9, 0xf9, 0x69, 0x99, 0x10, 0x79, 0x7f, 0xaf, 0x8b, 0x35, 0x8a, 0x8a, 0x5e, 0x80, 0x7a, + 0x82, 0xf7, 0xe1, 0x5e, 0x32, 0x15, 0x67, 0xbe, 0x1f, 0xee, 0xbd, 0x93, 0xe2, 0xde, 0xfb, 0x5f, + 0x19, 0x58, 0x18, 0x98, 0xf6, 0x38, 0x0b, 0x20, 0xa3, 0x27, 0x23, 0xa5, 0x87, 0x98, 0x39, 0x01, + 0xd5, 0x32, 0xc9, 0xa1, 0x26, 0xbb, 0x94, 0xd5, 0xaa, 0xc2, 0x36, 0x6b, 0xfa, 0xe8, 0x45, 0x40, + 0x03, 0xbb, 0x1f, 0xd3, 0xdc, 0x49, 0x6d, 0x3a, 0xb9, 0xfd, 0xd1, 0x2d, 0x56, 0xba, 0xff, 0x31, + 0xb6, 0x4c, 0x6a, 0xb3, 0x92, 0x0d, 0xd0, 0x47, 0x2f, 0xc3, 0xac, 0xe5, 0xdc, 0xc1, 0x1d, 0xd7, + 0xdb, 0xd3, 0xbb, 0xd8, 0x6b, 0x61, 0x27, 0x30, 0xda, 0xd8, 0x6f, 0xe4, 0x29, 0x45, 0x33, 0x61, + 0xdd, 0x7a, 0xbf, 0x0a, 0x5d, 0x82, 0x85, 0x87, 0x3d, 0xec, 0xed, 0xe9, 0x3e, 0xf6, 0x76, 0xac, + 0x16, 0xd6, 0x8d, 0x1d, 0xc3, 0xb2, 0x8d, 0x4d, 0x1b, 0x37, 0x0a, 0x8b, 0xd9, 0xa5, 0xa2, 0x36, + 0x47, 0xab, 0x37, 0x58, 0xed, 0xd5, 0xb0, 0x52, 0xfd, 0x33, 0x05, 0xe6, 0xd9, 0x61, 0x68, 0x3d, + 0x34, 0x3b, 0x47, 0xbc, 0xd9, 0xc4, 0xad, 0x22, 0x3f, 0xba, 0x55, 0x63, 0x46, 0x51, 0xfd, 0x54, + 0x81, 0x59, 0x72, 0x26, 0x79, 0x92, 0x68, 0xfe, 0x13, 0x05, 0x66, 0x6e, 0x19, 0xfe, 0x93, 0x44, + 0xf2, 0xbf, 0x72, 0x47, 0x24, 0xa2, 0xf9, 0xc9, 0xd8, 0x31, 0x07, 0x3d, 0x96, 0x9c, 0xc4, 0x63, + 0x51, 0xff, 0xa2, 0xef, 0xa8, 0x3c, 0x59, 0x13, 0x54, 0x7f, 0xa4, 0xc0, 0xa9, 0x9b, 0x38, 0x88, + 0xa8, 0x3e, 0x1e, 0x1e, 0xcd, 0x88, 0x42, 0xf5, 0x1d, 0xe6, 0x0d, 0x48, 0x89, 0x3f, 0x92, 0xcd, + 0xf6, 0x97, 0x33, 0x30, 0x47, 0x76, 0x9d, 0xe3, 0x21, 0x04, 0xa3, 0x1c, 0x6b, 0x25, 0x82, 0x92, + 0x93, 0x6a, 0x42, 0xb8, 0x85, 0xe7, 0x47, 0xde, 0xc2, 0xd5, 0x3f, 0xcd, 0x30, 0xd7, 0x43, 0xe4, + 0xc6, 0x38, 0xcb, 0x22, 0xa1, 0x35, 0x23, 0xa5, 0x55, 0x85, 0x4a, 0x04, 0x59, 0x5b, 0x0d, 0xb7, + 0xdf, 0x18, 0xec, 0xb8, 0xee, 0xbe, 0xea, 0xb7, 0x15, 0x98, 0x0f, 0x2f, 0x0d, 0x36, 0x70, 0xbb, + 0x83, 0x9d, 0xe0, 0xf0, 0x32, 0x94, 0x94, 0x80, 0x8c, 0x44, 0x02, 0x4e, 0x42, 0xc9, 0x67, 0xe3, + 0x44, 0xf7, 0x01, 0x7d, 0x80, 0xfa, 0x57, 0x0a, 0x2c, 0x0c, 0x90, 0x33, 0xce, 0x22, 0x36, 0xa0, + 0x60, 0x39, 0x26, 0x7e, 0x14, 0x51, 0x13, 0x16, 0x49, 0xcd, 0x66, 0xcf, 0xb2, 0xcd, 0x88, 0x8c, + 0xb0, 0x88, 0xce, 0x40, 0x05, 0x3b, 0xc4, 0xc7, 0xd0, 0x29, 0x2e, 0x15, 0xe4, 0xa2, 0x56, 0x66, + 0xb0, 0x35, 0x02, 0x22, 0x8d, 0xb7, 0x2c, 0x4c, 0x1b, 0xe7, 0x58, 0x63, 0x5e, 0x54, 0x7f, 0x45, + 0x81, 0x19, 0x22, 0x85, 0x9c, 0x7a, 0xff, 0xf1, 0x72, 0x73, 0x11, 0xca, 0x82, 0x98, 0xf1, 0x89, + 0x88, 0x20, 0xf5, 0x01, 0xcc, 0xc6, 0xc9, 0x19, 0x87, 0x9b, 0x4f, 0x03, 0x44, 0x6b, 0xc5, 0xb4, + 0x21, 0xab, 0x09, 0x10, 0xf5, 0x37, 0x32, 0x61, 0x58, 0x81, 0xb2, 0xe9, 0x88, 0x6f, 0x33, 0xe9, + 0x92, 0x88, 0xf6, 0xbc, 0x44, 0x21, 0xb4, 0x7a, 0x15, 0x2a, 0xf8, 0x51, 0xe0, 0x19, 0x7a, 0xd7, + 0xf0, 0x8c, 0x0e, 0x53, 0xab, 0x91, 0x4c, 0x6f, 0x99, 0x36, 0x5b, 0xa7, 0xad, 0xc8, 0x20, 0x54, + 0x44, 0xd8, 0x20, 0x79, 0x36, 0x08, 0x85, 0xf4, 0xcf, 0x69, 0xe5, 0x46, 0x56, 0xfd, 0x47, 0xe2, + 0xf5, 0x71, 0xb1, 0x3e, 0xee, 0x9c, 0x89, 0xcf, 0x29, 0x27, 0x9d, 0x53, 0xa5, 0x91, 0x55, 0xff, + 0x40, 0x81, 0x3a, 0x9d, 0xcb, 0x2a, 0x0f, 0x2e, 0x59, 0xae, 0x93, 0x68, 0xac, 0x24, 0x1a, 0x0f, + 0xd1, 0xc6, 0xd7, 0x21, 0xcf, 0x57, 0x22, 0x3b, 0xea, 0x4a, 0xf0, 0x06, 0xfb, 0xcc, 0x47, 0xfd, + 0x7d, 0x05, 0xe6, 0x12, 0xbc, 0x1f, 0x47, 0x05, 0xee, 0x03, 0x62, 0x33, 0x34, 0xfb, 0xd3, 0x0e, + 0x77, 0xee, 0xb3, 0xd2, 0x6d, 0x2a, 0xc9, 0x24, 0x6d, 0xda, 0x4a, 0x40, 0x7c, 0xf5, 0xc7, 0x0a, + 0x9c, 0xbc, 0x89, 0x03, 0x8a, 0x7a, 0x8d, 0x98, 0xa1, 0x75, 0xcf, 0x6d, 0x7b, 0xd8, 0xf7, 0xbf, + 0x00, 0x82, 0xf2, 0x9b, 0xcc, 0xe7, 0x93, 0xcd, 0x6d, 0x9c, 0x85, 0x38, 0x03, 0x15, 0x3a, 0x18, + 0x36, 0x75, 0xcf, 0xdd, 0xf5, 0xb9, 0x40, 0x95, 0x39, 0x4c, 0x73, 0x77, 0xa9, 0x64, 0x04, 0x6e, + 0x60, 0xd8, 0x0c, 0x81, 0x6f, 0x36, 0x14, 0x42, 0xaa, 0xa9, 0x56, 0x86, 0x84, 0x91, 0xce, 0xf1, + 0x17, 0x80, 0xd9, 0x3f, 0x60, 0x37, 0x67, 0xe2, 0x9c, 0xc6, 0x61, 0xf2, 0xab, 0xcc, 0x35, 0x65, + 0xb3, 0xaa, 0xad, 0x9c, 0x96, 0xb6, 0x11, 0x06, 0x63, 0xd8, 0xe8, 0x34, 0x94, 0xb7, 0x0c, 0xcb, + 0xd6, 0x3d, 0x6c, 0xf8, 0xae, 0xc3, 0x67, 0x0c, 0x04, 0xa4, 0x51, 0x88, 0xfa, 0xb7, 0x0a, 0x8b, + 0xef, 0x7e, 0x11, 0x8c, 0x61, 0xb5, 0x91, 0x55, 0x7f, 0x98, 0x81, 0xea, 0x9a, 0xe3, 0x63, 0x2f, + 0x38, 0xfe, 0xe7, 0x18, 0xf4, 0x16, 0x94, 0xe9, 0x0c, 0x7d, 0xdd, 0x34, 0x02, 0x83, 0x6f, 0x7d, + 0x4f, 0x4b, 0x23, 0x3b, 0x37, 0x08, 0xde, 0xaa, 0x11, 0x18, 0x1a, 0x63, 0x93, 0x4f, 0x7e, 0xa3, + 0x13, 0x50, 0xda, 0x36, 0xfc, 0x6d, 0xfd, 0x01, 0xde, 0x63, 0xce, 0x65, 0x55, 0x2b, 0x12, 0xc0, + 0xbb, 0x78, 0xcf, 0x47, 0x4f, 0x41, 0xd1, 0xe9, 0x75, 0x98, 0xca, 0x15, 0x16, 0x95, 0xa5, 0xaa, + 0x56, 0x70, 0x7a, 0x1d, 0xa2, 0x70, 0x8c, 0x5d, 0xc5, 0x46, 0x56, 0xfd, 0x9b, 0x0c, 0xd4, 0xee, + 0xf4, 0xc8, 0xf1, 0x89, 0x06, 0xa8, 0x7a, 0x76, 0x70, 0x38, 0xf1, 0x3c, 0x07, 0x59, 0xe6, 0x88, + 0x90, 0x16, 0x0d, 0xe9, 0x0c, 0xd6, 0x56, 0x7d, 0x8d, 0x20, 0xd1, 0xe0, 0x4c, 0xaf, 0xd5, 0xe2, + 0x3e, 0x5d, 0x96, 0x52, 0x5d, 0x22, 0x10, 0xe6, 0xd1, 0x9d, 0x80, 0x12, 0xf6, 0xbc, 0xc8, 0xe3, + 0xa3, 0x73, 0xc2, 0x9e, 0xc7, 0x2a, 0x55, 0xa8, 0x18, 0xad, 0x07, 0x8e, 0xbb, 0x6b, 0x63, 0xb3, + 0x8d, 0x4d, 0x2a, 0x08, 0x45, 0x2d, 0x06, 0x63, 0xa2, 0x42, 0x24, 0x40, 0x6f, 0x39, 0x01, 0xf5, + 0x05, 0xb2, 0x44, 0x54, 0x08, 0xe4, 0xba, 0x13, 0x90, 0x6a, 0x13, 0xdb, 0x38, 0xc0, 0xb4, 0xba, + 0xc0, 0xaa, 0x19, 0x84, 0x57, 0xf7, 0xba, 0x51, 0xeb, 0x22, 0xab, 0x66, 0x10, 0x52, 0x7d, 0x12, + 0x4a, 0xfd, 0x0b, 0xf4, 0x52, 0xff, 0xbe, 0x93, 0x02, 0xd4, 0x9f, 0x28, 0x50, 0x5d, 0xa5, 0x5d, + 0x3d, 0x01, 0xd2, 0x87, 0x60, 0x12, 0x3f, 0xea, 0x7a, 0x5c, 0x99, 0xe8, 0xef, 0xa1, 0x02, 0xc5, + 0xa4, 0xa6, 0xd4, 0xc8, 0xaa, 0xdf, 0x9c, 0x84, 0xea, 0x06, 0x36, 0xbc, 0xd6, 0xf6, 0x13, 0x71, + 0x99, 0x53, 0x87, 0xac, 0xe9, 0xdb, 0x7c, 0x9e, 0xe4, 0x27, 0x3a, 0x0f, 0xd3, 0x5d, 0xdb, 0x68, + 0xe1, 0x6d, 0xd7, 0x36, 0xb1, 0xa7, 0xb7, 0x3d, 0xb7, 0xc7, 0x02, 0x90, 0x15, 0xad, 0x2e, 0x54, + 0xdc, 0x24, 0x70, 0xf4, 0x1a, 0x14, 0x4d, 0xdf, 0xd6, 0xe9, 0x29, 0xb8, 0x40, 0xad, 0xaf, 0x7c, + 0x7e, 0xab, 0xbe, 0x4d, 0x0f, 0xc1, 0x05, 0x93, 0xfd, 0x40, 0xcf, 0x40, 0xd5, 0xed, 0x05, 0xdd, + 0x5e, 0xa0, 0x33, 0x95, 0x6d, 0x14, 0x29, 0x79, 0x15, 0x06, 0xa4, 0x1a, 0xed, 0xa3, 0x1b, 0x50, + 0xf5, 0x29, 0x2b, 0x43, 0x07, 0xb8, 0x34, 0xaa, 0xdb, 0x55, 0x61, 0xed, 0xb8, 0x07, 0xfc, 0x02, + 0xd4, 0x03, 0xcf, 0xd8, 0xc1, 0xb6, 0x10, 0xe0, 0x01, 0x2a, 0x9f, 0x53, 0x0c, 0xde, 0x8f, 0x8e, + 0xa6, 0x84, 0x83, 0xca, 0x69, 0xe1, 0x20, 0x54, 0x83, 0x8c, 0xf3, 0x90, 0x46, 0x1a, 0xb3, 0x5a, + 0xc6, 0x79, 0xc8, 0x04, 0xa1, 0xd6, 0xc8, 0xaa, 0xef, 0xc2, 0xe4, 0x2d, 0x2b, 0xa0, 0x1c, 0x26, + 0xea, 0xaf, 0xd0, 0x73, 0x08, 0x55, 0xf2, 0xa7, 0xa0, 0xe8, 0xb9, 0xbb, 0xcc, 0xae, 0x11, 0x9f, + 0xac, 0xa2, 0x15, 0x3c, 0x77, 0x97, 0x1a, 0x2d, 0x9a, 0xac, 0xe2, 0x7a, 0x98, 0x79, 0x98, 0x19, + 0x8d, 0x97, 0xd4, 0x3f, 0x56, 0xfa, 0x52, 0x45, 0x2c, 0x91, 0x7f, 0x38, 0x53, 0xf4, 0x16, 0x14, + 0x3c, 0xd6, 0x7e, 0x68, 0xa8, 0x5c, 0x1c, 0x89, 0xda, 0xd5, 0xb0, 0xd5, 0xc8, 0x02, 0x48, 0x4e, + 0x98, 0x95, 0x1b, 0x76, 0xcf, 0x7f, 0x1c, 0x5a, 0x20, 0x0b, 0x3b, 0x64, 0xe5, 0x61, 0x10, 0xba, + 0x1a, 0x53, 0x8b, 0x59, 0xf5, 0x7b, 0x19, 0xa8, 0x72, 0x7a, 0xc6, 0x71, 0x35, 0x52, 0x69, 0xda, + 0x80, 0x32, 0x19, 0x5b, 0xf7, 0x71, 0x3b, 0xbc, 0x5d, 0x29, 0xaf, 0xac, 0x48, 0x5d, 0xed, 0x18, + 0x19, 0x34, 0x2d, 0x61, 0x83, 0x36, 0x7a, 0xc7, 0x09, 0xbc, 0x3d, 0x0d, 0x5a, 0x11, 0xa0, 0xf9, + 0x11, 0x4c, 0x25, 0xaa, 0x89, 0x34, 0x3d, 0xc0, 0x7b, 0xfc, 0xd0, 0x42, 0x7e, 0xa2, 0x57, 0xc4, + 0x84, 0x92, 0xb4, 0x2d, 0xf2, 0xb6, 0xeb, 0xb4, 0xaf, 0x7a, 0x9e, 0xb1, 0xc7, 0x13, 0x4e, 0x2e, + 0x67, 0xbe, 0xac, 0xa8, 0x7f, 0x9d, 0x81, 0xca, 0x7b, 0x3d, 0xec, 0xed, 0x1d, 0xa5, 0xa5, 0x0a, + 0x2d, 0xed, 0xa4, 0x60, 0x69, 0x07, 0x8c, 0x43, 0x4e, 0x62, 0x1c, 0x24, 0x26, 0x2e, 0x2f, 0x35, + 0x71, 0x32, 0xed, 0x2f, 0x1c, 0x48, 0xfb, 0x8b, 0xc3, 0x83, 0xc1, 0xf5, 0x46, 0x56, 0xfd, 0x23, + 0x25, 0xe2, 0xe5, 0x58, 0xfa, 0x19, 0x73, 0x7a, 0x32, 0x07, 0x76, 0x7a, 0x46, 0xd6, 0xcf, 0x4f, + 0x15, 0x28, 0x7d, 0x80, 0x5b, 0x81, 0xeb, 0x11, 0x8b, 0x24, 0x69, 0xa6, 0x8c, 0xe0, 0x89, 0x66, + 0x92, 0x9e, 0xe8, 0x45, 0x28, 0x5a, 0xa6, 0x6e, 0x10, 0x41, 0xa3, 0xe3, 0x0e, 0xf3, 0x77, 0x0a, + 0x96, 0x49, 0x25, 0x72, 0xf4, 0x7b, 0xf9, 0xef, 0x2b, 0x50, 0x61, 0x34, 0xfb, 0xac, 0xe5, 0x1b, + 0xc2, 0x70, 0x8a, 0x4c, 0xfa, 0x79, 0x21, 0x9a, 0xe8, 0xad, 0x89, 0xfe, 0xb0, 0x57, 0x01, 0x08, + 0x93, 0x79, 0x73, 0xa6, 0x3c, 0x8b, 0x52, 0x6a, 0x59, 0x73, 0xca, 0xf0, 0x5b, 0x13, 0x5a, 0x89, + 0xb4, 0xa2, 0x5d, 0x5c, 0x2b, 0x40, 0x8e, 0xb6, 0x56, 0xff, 0x47, 0x81, 0x99, 0xeb, 0x86, 0xdd, + 0x5a, 0xb5, 0xfc, 0xc0, 0x70, 0x5a, 0x63, 0x78, 0x38, 0x97, 0xa1, 0xe0, 0x76, 0x75, 0x1b, 0x6f, + 0x05, 0x9c, 0xa4, 0x33, 0x43, 0x66, 0xc4, 0xd8, 0xa0, 0xe5, 0xdd, 0xee, 0x6d, 0xbc, 0x15, 0xa0, + 0x37, 0xa1, 0xe8, 0x76, 0x75, 0xcf, 0x6a, 0x6f, 0x07, 0x9c, 0xfb, 0x23, 0x34, 0x2e, 0xb8, 0x5d, + 0x8d, 0xb4, 0x10, 0x2e, 0x37, 0x26, 0x0f, 0x78, 0xb9, 0x41, 0xce, 0xa8, 0x89, 0xe9, 0x8f, 0xa1, + 0x03, 0x97, 0xa1, 0x68, 0x39, 0x81, 0x6e, 0x5a, 0x7e, 0xc8, 0x82, 0x53, 0x72, 0x19, 0x72, 0x02, + 0x3a, 0x03, 0xba, 0xa6, 0x4e, 0x40, 0xc6, 0x46, 0x6f, 0x03, 0x6c, 0xd9, 0xae, 0xc1, 0x5b, 0x33, + 0x1e, 0x9c, 0x96, 0xab, 0x0f, 0x41, 0x0b, 0xdb, 0x97, 0x68, 0x23, 0xd2, 0x43, 0x7f, 0x49, 0xff, + 0x5e, 0x81, 0xb9, 0x75, 0xec, 0xb1, 0x1c, 0xa3, 0x80, 0xdf, 0x4c, 0xae, 0x39, 0x5b, 0x6e, 0xfc, + 0x72, 0x58, 0x49, 0x5c, 0x0e, 0xff, 0x74, 0x2e, 0x44, 0x63, 0xe7, 0x13, 0x16, 0xa2, 0x08, 0xcf, + 0x27, 0x61, 0x20, 0x86, 0x1d, 0xf4, 0x6a, 0x29, 0xcb, 0xc4, 0xe9, 0x15, 0xcf, 0xbb, 0xea, 0xaf, + 0xb1, 0x3c, 0x0c, 0xe9, 0xa4, 0x0e, 0x2f, 0xb0, 0xf3, 0xc0, 0x4d, 0x7e, 0x62, 0x03, 0x78, 0x0e, + 0x12, 0xb6, 0x23, 0xc5, 0x10, 0xfd, 0x96, 0x02, 0x8b, 0xe9, 0x54, 0x8d, 0xb3, 0x57, 0xbf, 0x0d, + 0x39, 0xcb, 0xd9, 0x72, 0xc3, 0x7b, 0xaf, 0x73, 0x52, 0x5d, 0x90, 0x8f, 0xcb, 0x1a, 0xaa, 0xff, + 0x90, 0x81, 0xfa, 0x7b, 0x2c, 0xae, 0xff, 0xb9, 0x2f, 0x7f, 0x07, 0x77, 0x74, 0xdf, 0xfa, 0x04, + 0x87, 0xcb, 0xdf, 0xc1, 0x9d, 0x0d, 0xeb, 0x13, 0x1c, 0x93, 0x8c, 0x5c, 0x5c, 0x32, 0x86, 0x5f, + 0xf4, 0x8a, 0xf7, 0x9a, 0x85, 0xf8, 0xbd, 0xe6, 0x3c, 0xe4, 0x1d, 0xd7, 0xc4, 0x6b, 0xab, 0xfc, + 0x4c, 0xc7, 0x4b, 0x7d, 0x51, 0x2b, 0x1d, 0x4c, 0xd4, 0xc8, 0x50, 0xb4, 0x0b, 0x93, 0xa5, 0x08, + 0x12, 0x1a, 0x59, 0x51, 0xfd, 0x8e, 0x02, 0xcd, 0x9b, 0x38, 0x48, 0x72, 0xf5, 0xe8, 0xe4, 0xef, + 0xbb, 0x0a, 0x9c, 0x90, 0x12, 0x34, 0x8e, 0xe8, 0xbd, 0x11, 0x17, 0x3d, 0xf9, 0x95, 0xeb, 0xc0, + 0x90, 0x5c, 0xea, 0x5e, 0x86, 0xca, 0x6a, 0xaf, 0xd3, 0x89, 0xbc, 0xb2, 0x33, 0x50, 0xf1, 0xd8, + 0x4f, 0x76, 0xce, 0x62, 0x3b, 0x73, 0x99, 0xc3, 0xc8, 0x69, 0x4a, 0x3d, 0x0f, 0x55, 0xde, 0x84, + 0x53, 0xdd, 0x84, 0xa2, 0xc7, 0x7f, 0x73, 0xfc, 0xa8, 0xac, 0xce, 0xc1, 0x8c, 0x86, 0xdb, 0x44, + 0xe8, 0xbd, 0xdb, 0x96, 0xf3, 0x80, 0x0f, 0xa3, 0x7e, 0x5d, 0x81, 0xd9, 0x38, 0x9c, 0xf7, 0x75, + 0x09, 0x0a, 0x86, 0x69, 0x7a, 0xd8, 0xf7, 0x87, 0x2e, 0xcb, 0x55, 0x86, 0xa3, 0x85, 0xc8, 0x02, + 0xe7, 0x32, 0x23, 0x73, 0x4e, 0xd5, 0x61, 0xfa, 0x26, 0x0e, 0xee, 0xe0, 0xc0, 0x1b, 0x2b, 0xdc, + 0xde, 0x20, 0x07, 0x1d, 0xda, 0x98, 0x8b, 0x45, 0x58, 0x54, 0xbf, 0xad, 0x00, 0x12, 0x47, 0x18, + 0x67, 0x99, 0x45, 0x2e, 0x67, 0xe2, 0x5c, 0x66, 0x09, 0x4f, 0x9d, 0xae, 0xeb, 0x60, 0x27, 0x10, + 0x1d, 0xb1, 0x6a, 0x04, 0xa5, 0xe2, 0xf7, 0x13, 0x05, 0xd0, 0x6d, 0xd7, 0x30, 0xaf, 0x19, 0xf6, + 0x78, 0x8e, 0xc3, 0x29, 0x00, 0xdf, 0x6b, 0xe9, 0x5c, 0x8f, 0x33, 0xdc, 0x2e, 0x79, 0xad, 0xbb, + 0x4c, 0x95, 0x4f, 0x43, 0xd9, 0xf4, 0x03, 0x5e, 0x1d, 0x46, 0x7f, 0xc1, 0xf4, 0x03, 0x56, 0x4f, + 0xf3, 0x8e, 0x7d, 0x6c, 0xd8, 0xd8, 0xd4, 0x85, 0xe0, 0xd9, 0x24, 0x45, 0xab, 0xb3, 0x8a, 0x8d, + 0x08, 0x2e, 0x51, 0xae, 0x5c, 0x7a, 0x0e, 0xe0, 0x74, 0x23, 0xa7, 0x6e, 0xc1, 0xc2, 0x1d, 0xc3, + 0xe9, 0x19, 0xf6, 0x75, 0xb7, 0xd3, 0x35, 0x62, 0x39, 0xab, 0x49, 0x8b, 0xa9, 0x48, 0x2c, 0xe6, + 0xd3, 0x2c, 0x95, 0x8e, 0xb9, 0xeb, 0x74, 0x72, 0x93, 0x9a, 0x00, 0x61, 0xe3, 0x14, 0x1a, 0x8a, + 0xea, 0x43, 0x63, 0x70, 0x9c, 0x71, 0x96, 0x98, 0x52, 0x17, 0x76, 0x25, 0xda, 0xf3, 0x3e, 0x4c, + 0x7d, 0x0b, 0x9e, 0xa2, 0xf9, 0x8d, 0x21, 0x28, 0x76, 0x4d, 0x9f, 0xec, 0x40, 0x91, 0x74, 0xf0, + 0x8b, 0x19, 0x6a, 0x14, 0x07, 0x7a, 0x18, 0x87, 0xf0, 0xcb, 0xf1, 0x4b, 0xf1, 0x67, 0x53, 0xd2, + 0xaa, 0xe3, 0x23, 0x72, 0xf3, 0xbd, 0x04, 0x53, 0xf8, 0x11, 0x6e, 0xf5, 0x02, 0xcb, 0x69, 0xaf, + 0xdb, 0x86, 0x73, 0xd7, 0xe5, 0x9b, 0x54, 0x12, 0x8c, 0x9e, 0x85, 0x2a, 0x59, 0x06, 0xb7, 0x17, + 0x70, 0x3c, 0xb6, 0x5b, 0xc5, 0x81, 0xa4, 0x3f, 0x32, 0x5f, 0x1b, 0x07, 0xd8, 0xe4, 0x78, 0x6c, + 0xeb, 0x4a, 0x82, 0x07, 0x58, 0x49, 0xc0, 0xfe, 0x41, 0x58, 0xf9, 0xcf, 0x4a, 0x82, 0x95, 0xbc, + 0x87, 0xa3, 0x62, 0xe5, 0x2d, 0x80, 0x0e, 0xf6, 0xda, 0x78, 0x8d, 0x6e, 0x07, 0xec, 0x5a, 0x60, + 0x49, 0xba, 0x1d, 0xf4, 0x3b, 0xb8, 0x13, 0x36, 0xd0, 0x84, 0xb6, 0xea, 0x4d, 0x98, 0x91, 0xa0, + 0x10, 0x4b, 0xe7, 0xbb, 0x3d, 0xaf, 0x85, 0xc3, 0x2b, 0xa6, 0xb0, 0x48, 0x76, 0xc6, 0xc0, 0xf0, + 0xda, 0x38, 0xe0, 0x42, 0xcb, 0x4b, 0xea, 0x25, 0x1a, 0x50, 0xa2, 0xb7, 0x10, 0x31, 0x49, 0x8d, + 0xc7, 0xcd, 0x95, 0x81, 0xb8, 0xf9, 0x16, 0x0d, 0xda, 0x88, 0xed, 0xc6, 0xcc, 0x79, 0xd8, 0x22, + 0x5d, 0x61, 0x93, 0x3f, 0xb3, 0x09, 0x8b, 0xea, 0xff, 0x2a, 0x50, 0x5d, 0xeb, 0x74, 0xdd, 0x7e, + 0x98, 0x62, 0xe4, 0xe3, 0xe9, 0xe0, 0xed, 0x6e, 0x46, 0x76, 0xbb, 0xfb, 0x0c, 0x54, 0xe3, 0x0f, + 0x32, 0xd8, 0xed, 0x51, 0xa5, 0x25, 0x3e, 0xc4, 0x38, 0x01, 0x25, 0xcf, 0xdd, 0xd5, 0x89, 0x71, + 0x35, 0x79, 0x76, 0x45, 0xd1, 0x73, 0x77, 0x89, 0xc9, 0x35, 0xd1, 0x2c, 0xe4, 0xb6, 0x2c, 0x3b, + 0x4a, 0x0c, 0x62, 0x05, 0xf4, 0x06, 0x39, 0xbc, 0xb1, 0x58, 0x6b, 0x7e, 0xd4, 0x33, 0x54, 0xd8, + 0x82, 0xd9, 0x30, 0xd4, 0x50, 0xd4, 0x0f, 0xa1, 0x16, 0x4e, 0x7f, 0xcc, 0x87, 0x46, 0x81, 0xe1, + 0x3f, 0x08, 0x33, 0x20, 0x58, 0x41, 0x3d, 0xcf, 0x22, 0x6f, 0xb4, 0xff, 0xd8, 0xea, 0x23, 0x98, + 0x24, 0x18, 0x5c, 0xa9, 0xe8, 0x6f, 0xf5, 0xef, 0x32, 0x30, 0x9f, 0xc4, 0x1e, 0x87, 0xa4, 0x4b, + 0x71, 0x45, 0x92, 0xbf, 0x1b, 0x11, 0x47, 0xe3, 0x4a, 0xc4, 0x97, 0xa2, 0xe5, 0xf6, 0x9c, 0x80, + 0x5b, 0x22, 0xb2, 0x14, 0xd7, 0x49, 0x19, 0x2d, 0x40, 0xc1, 0x32, 0x75, 0x9b, 0x1c, 0xf8, 0xd8, + 0x76, 0x95, 0xb7, 0xcc, 0xdb, 0xe4, 0x30, 0xf8, 0x5a, 0xe8, 0x84, 0x8d, 0x9c, 0x36, 0xc1, 0xf0, + 0x51, 0x0d, 0x32, 0x96, 0xc9, 0x83, 0x23, 0x19, 0xcb, 0x24, 0x52, 0x45, 0x6f, 0x0a, 0x68, 0x8a, + 0x2f, 0xcf, 0xf9, 0x25, 0xe2, 0x50, 0x25, 0xd0, 0xf7, 0x42, 0x20, 0xf1, 0xd3, 0x28, 0x1a, 0x0f, + 0xee, 0x52, 0x5f, 0xba, 0xa8, 0x95, 0x09, 0x6c, 0x8d, 0x81, 0xd4, 0x06, 0xcc, 0x13, 0xd2, 0xd8, + 0x14, 0xef, 0x93, 0x05, 0x09, 0xbd, 0xaf, 0xef, 0x29, 0xb0, 0x30, 0x50, 0x35, 0x0e, 0xaf, 0xaf, + 0x8a, 0xcb, 0x5f, 0x5e, 0x39, 0x2f, 0xb5, 0x39, 0xf2, 0xc5, 0x0d, 0x65, 0xe5, 0xd7, 0x99, 0xab, + 0xa4, 0xb1, 0xb4, 0xce, 0xc7, 0x9c, 0x24, 0xb4, 0x04, 0xf5, 0x5d, 0x2b, 0xd8, 0xd6, 0xe9, 0x4b, + 0x24, 0xea, 0xa7, 0xb0, 0x60, 0x78, 0x51, 0xab, 0x11, 0xf8, 0x06, 0x01, 0x13, 0x5f, 0xc5, 0x57, + 0xbf, 0xa5, 0xc0, 0x4c, 0x8c, 0xac, 0x71, 0xd8, 0xf4, 0x26, 0x71, 0xe1, 0x58, 0x47, 0x9c, 0x53, + 0x8b, 0x52, 0x4e, 0xf1, 0xd1, 0xa8, 0x55, 0x8e, 0x5a, 0xa8, 0x3f, 0x56, 0xa0, 0x2c, 0xd4, 0x90, + 0xb3, 0x21, 0xaf, 0xeb, 0x9f, 0x0d, 0x23, 0xc0, 0x48, 0x6c, 0x78, 0x06, 0xfa, 0xb6, 0x4a, 0x48, + 0x93, 0x17, 0xf2, 0xf4, 0x4c, 0x1f, 0xdd, 0x82, 0x1a, 0x63, 0x53, 0x44, 0xba, 0xf4, 0xca, 0x26, + 0xca, 0x40, 0x34, 0x3c, 0x93, 0x53, 0xa9, 0x55, 0x7d, 0xa1, 0xc4, 0xe2, 0xa0, 0xae, 0x89, 0xe9, + 0x48, 0xb9, 0x81, 0x93, 0x5a, 0x45, 0x6c, 0x4a, 0xbc, 0x5d, 0x1b, 0x1b, 0x26, 0xf6, 0xa2, 0xb9, + 0x45, 0x65, 0xe2, 0x5e, 0xb2, 0xdf, 0x3a, 0xf1, 0xfe, 0xb9, 0xd5, 0x05, 0x06, 0x22, 0x07, 0x03, + 0xf4, 0x1c, 0x4c, 0x99, 0x9d, 0xd8, 0x33, 0xb8, 0xd0, 0x1f, 0x36, 0x3b, 0xc2, 0xfb, 0xb7, 0x18, + 0x41, 0x93, 0x71, 0x82, 0xbe, 0xd1, 0x7f, 0x58, 0xec, 0x61, 0x13, 0x3b, 0x81, 0x65, 0xd8, 0x87, + 0x97, 0xc9, 0x26, 0x14, 0x7b, 0x3e, 0xf6, 0x84, 0x4d, 0x22, 0x2a, 0x93, 0xba, 0xae, 0xe1, 0xfb, + 0xbb, 0xae, 0x67, 0x72, 0x2a, 0xa3, 0xf2, 0x90, 0xa4, 0x47, 0xf6, 0x18, 0x55, 0x9e, 0xf4, 0x78, + 0x09, 0x16, 0x3a, 0xae, 0x69, 0x6d, 0x59, 0xb2, 0x5c, 0x49, 0xd2, 0x6c, 0x2e, 0xac, 0x8e, 0xb5, + 0x0b, 0x9f, 0x71, 0xcc, 0x88, 0xcf, 0x38, 0x7e, 0x90, 0x81, 0x85, 0xf7, 0xbb, 0xe6, 0xe7, 0xc0, + 0x87, 0x45, 0x28, 0xbb, 0xb6, 0xb9, 0x1e, 0x67, 0x85, 0x08, 0x22, 0x18, 0x0e, 0xde, 0x8d, 0x30, + 0xd8, 0x25, 0xbe, 0x08, 0x1a, 0x9a, 0x24, 0x7a, 0x28, 0x7e, 0xe5, 0x87, 0xf1, 0xab, 0xf4, 0xd9, + 0x95, 0x7c, 0x31, 0x53, 0x9f, 0x6d, 0x64, 0xd4, 0x9f, 0x87, 0x05, 0x16, 0x6e, 0x7e, 0xcc, 0x5c, + 0x0a, 0xd7, 0x68, 0x4e, 0x5c, 0xa3, 0x8f, 0x61, 0x8e, 0x58, 0x73, 0x32, 0xf4, 0xfb, 0x3e, 0xf6, + 0xc6, 0x34, 0x52, 0x27, 0xa1, 0x14, 0x8e, 0x16, 0xa6, 0xf7, 0xf6, 0x01, 0xea, 0xcf, 0xc1, 0x6c, + 0x62, 0xac, 0x43, 0xce, 0x32, 0x9c, 0xc9, 0xbc, 0x38, 0x93, 0x45, 0x00, 0xcd, 0xb5, 0xf1, 0x3b, + 0x4e, 0x60, 0x05, 0x7b, 0xc4, 0x4b, 0x10, 0xdc, 0x2f, 0xfa, 0x9b, 0x60, 0x90, 0x71, 0x87, 0x60, + 0xfc, 0xaa, 0x02, 0xd3, 0x4c, 0x73, 0x49, 0x57, 0x87, 0x5f, 0x85, 0xd7, 0x20, 0x8f, 0xe9, 0x28, + 0xfc, 0x46, 0xe1, 0xb4, 0xdc, 0x54, 0x47, 0xe4, 0x6a, 0x1c, 0x5d, 0xaa, 0x46, 0x01, 0x4c, 0xad, + 0x7a, 0x6e, 0x77, 0x3c, 0x8a, 0xa8, 0x67, 0x62, 0x63, 0xd1, 0xd7, 0x2c, 0x12, 0xc0, 0xdd, 0x34, + 0xc1, 0xf8, 0x27, 0x05, 0xe6, 0xef, 0x75, 0xb1, 0x67, 0x04, 0x98, 0x30, 0x6d, 0xbc, 0xd1, 0x87, + 0xe9, 0x6e, 0x8c, 0xb2, 0x6c, 0x9c, 0x32, 0xf4, 0x66, 0xec, 0xed, 0x99, 0xfc, 0x3c, 0x92, 0xa0, + 0xb2, 0x9f, 0xc3, 0x1e, 0xce, 0x6b, 0x41, 0x9c, 0xd7, 0x8f, 0x14, 0x98, 0xde, 0xc0, 0x64, 0x1f, + 0x1b, 0x6f, 0x4a, 0x17, 0x61, 0x92, 0x50, 0x39, 0xea, 0x02, 0x53, 0x64, 0x74, 0x0e, 0xa6, 0x2d, + 0xa7, 0x65, 0xf7, 0x4c, 0xac, 0x93, 0xf9, 0xeb, 0xc4, 0x8d, 0xe3, 0xce, 0xc3, 0x14, 0xaf, 0x20, + 0xd3, 0x20, 0x5b, 0xb4, 0x54, 0xc6, 0x1f, 0x31, 0x19, 0x8f, 0x92, 0x7c, 0x18, 0x09, 0xca, 0x41, + 0x48, 0x78, 0x15, 0x72, 0x64, 0xe8, 0xd0, 0x89, 0x90, 0xb7, 0xea, 0xab, 0x89, 0xc6, 0xb0, 0xd5, + 0x5f, 0x50, 0x00, 0x89, 0x6c, 0x1b, 0xc7, 0x4a, 0xbc, 0x2e, 0x06, 0xf7, 0xb3, 0x43, 0x49, 0x67, + 0x33, 0x8d, 0xc2, 0xfa, 0xea, 0xa7, 0xd1, 0xea, 0xd1, 0xe5, 0x1e, 0x67, 0xf5, 0xc8, 0xbc, 0x86, + 0xae, 0x9e, 0xc0, 0x04, 0x8a, 0x2c, 0xae, 0x1e, 0x95, 0x58, 0xc9, 0xea, 0x11, 0x9a, 0xe9, 0xea, + 0x71, 0xfb, 0xde, 0x68, 0x64, 0xc8, 0xa2, 0x31, 0x62, 0xc3, 0x45, 0xa3, 0x23, 0x2b, 0x07, 0x19, + 0xf9, 0x55, 0xc8, 0x91, 0x11, 0xf7, 0xe7, 0x57, 0xb8, 0x68, 0x14, 0x5b, 0x58, 0x34, 0x4e, 0xc0, + 0xe3, 0x5f, 0xb4, 0xfe, 0x4c, 0xfb, 0x8b, 0xa6, 0x42, 0xe5, 0xde, 0xe6, 0xc7, 0xb8, 0x15, 0x0c, + 0xb1, 0xbc, 0x67, 0x61, 0x6a, 0xdd, 0xb3, 0x76, 0x2c, 0x1b, 0xb7, 0x87, 0x99, 0xf0, 0x6f, 0x29, + 0x50, 0xbd, 0xe9, 0x19, 0x4e, 0xe0, 0x86, 0x66, 0xfc, 0x50, 0xfc, 0xbc, 0x06, 0xa5, 0x6e, 0x38, + 0x1a, 0x97, 0x81, 0x67, 0xe5, 0x51, 0x97, 0x38, 0x4d, 0x5a, 0xbf, 0x99, 0xfa, 0x01, 0xcc, 0x52, + 0x4a, 0x92, 0x64, 0x5f, 0x81, 0x22, 0x35, 0xe6, 0x16, 0xbf, 0xe8, 0x28, 0xaf, 0xa8, 0xf2, 0x23, + 0x8d, 0x38, 0x0d, 0x2d, 0x6a, 0xa3, 0xfe, 0x9b, 0x02, 0x65, 0x5a, 0xd7, 0x9f, 0xe0, 0xc1, 0xb5, + 0xfc, 0x75, 0xc8, 0xbb, 0x94, 0xe5, 0x43, 0x83, 0xb3, 0xe2, 0xaa, 0x68, 0xbc, 0x01, 0xf1, 0x90, + 0xd9, 0x2f, 0xd1, 0x22, 0x03, 0x03, 0x71, 0x9b, 0x5c, 0x68, 0x33, 0xda, 0xa9, 0x59, 0x1e, 0x6d, + 0x7e, 0x61, 0x13, 0x7a, 0x56, 0x63, 0x32, 0x49, 0x11, 0x0e, 0xaf, 0xc2, 0x5f, 0x4e, 0xec, 0xb1, + 0x8b, 0xe9, 0x54, 0xc8, 0x37, 0xd9, 0x98, 0x65, 0x25, 0x67, 0xb5, 0x18, 0x59, 0x63, 0x9e, 0xd5, + 0x22, 0x11, 0x18, 0x76, 0x56, 0x13, 0x89, 0xeb, 0x0b, 0xc0, 0xbf, 0x28, 0xb0, 0xc0, 0xf7, 0xb4, + 0x48, 0xb6, 0x8e, 0x80, 0x4d, 0xe8, 0x2b, 0x7c, 0xef, 0xcd, 0xd2, 0xbd, 0xf7, 0x85, 0x61, 0x7b, + 0x6f, 0x44, 0xe7, 0x3e, 0x9b, 0xef, 0x59, 0x28, 0xdd, 0xa1, 0x0d, 0xdf, 0x79, 0x14, 0xa0, 0x06, + 0x14, 0x76, 0xb0, 0xe7, 0x5b, 0xae, 0xc3, 0x55, 0x3c, 0x2c, 0x9e, 0x3b, 0x03, 0xc5, 0xf0, 0x35, + 0x1a, 0x2a, 0x40, 0xf6, 0xaa, 0x6d, 0xd7, 0x27, 0x50, 0x05, 0x8a, 0x6b, 0xfc, 0xc9, 0x55, 0x5d, + 0x39, 0xf7, 0x36, 0xcc, 0x48, 0xf6, 0x7d, 0x34, 0x0d, 0xd5, 0xab, 0x26, 0xf5, 0x2e, 0xef, 0xbb, + 0x04, 0x58, 0x9f, 0x40, 0xf3, 0x80, 0x34, 0xdc, 0x71, 0x77, 0x28, 0xe2, 0x0d, 0xcf, 0xed, 0x50, + 0xb8, 0x72, 0xee, 0x45, 0x98, 0x95, 0x51, 0x8f, 0x4a, 0x90, 0xa3, 0xdc, 0xa8, 0x4f, 0x20, 0x80, + 0xbc, 0x86, 0x77, 0xdc, 0x07, 0xb8, 0xae, 0xac, 0xfc, 0xf9, 0x39, 0xa8, 0x32, 0xda, 0xf9, 0xdb, + 0x69, 0xa4, 0x43, 0x3d, 0xf9, 0xf9, 0x28, 0xf4, 0x25, 0xf9, 0x8d, 0xa9, 0xfc, 0x2b, 0x53, 0xcd, + 0x61, 0xc2, 0xa4, 0x4e, 0xa0, 0x0f, 0xa1, 0x16, 0xff, 0xe0, 0x12, 0x92, 0x87, 0x86, 0xa5, 0x5f, + 0x65, 0xda, 0xaf, 0x73, 0x1d, 0xaa, 0xb1, 0x6f, 0x25, 0x21, 0xf9, 0x02, 0xcb, 0xbe, 0xa7, 0xd4, + 0x94, 0x5b, 0x13, 0xf1, 0x7b, 0x46, 0x8c, 0xfa, 0xf8, 0xc7, 0x4b, 0x52, 0xa8, 0x97, 0x7e, 0xe1, + 0x64, 0x3f, 0xea, 0x0d, 0x98, 0x1e, 0xf8, 0xb6, 0x08, 0x7a, 0x31, 0xe5, 0x42, 0x44, 0xfe, 0x0d, + 0x92, 0xfd, 0x86, 0xd8, 0x05, 0x34, 0xf8, 0xfd, 0x1f, 0xb4, 0x2c, 0x5f, 0x81, 0xb4, 0x2f, 0x22, + 0x35, 0x2f, 0x8c, 0x8c, 0x1f, 0x31, 0xee, 0x9b, 0x0a, 0x2c, 0xa4, 0x7c, 0x86, 0x02, 0x5d, 0x4c, + 0xbb, 0x1d, 0x1b, 0xf2, 0x51, 0x8d, 0xe6, 0x2b, 0x07, 0x6b, 0x14, 0x11, 0xe2, 0xc0, 0x54, 0xe2, + 0x2b, 0x0c, 0xe8, 0x7c, 0xea, 0xd3, 0xd1, 0xc1, 0x4f, 0x54, 0x34, 0xbf, 0x34, 0x1a, 0x72, 0x34, + 0xde, 0x47, 0x30, 0x95, 0xf8, 0x04, 0x41, 0xca, 0x78, 0xf2, 0x0f, 0x15, 0xec, 0xb7, 0xa0, 0x5f, + 0x85, 0x6a, 0xec, 0x5b, 0x01, 0x29, 0x12, 0x2f, 0xfb, 0x9e, 0xc0, 0x7e, 0x5d, 0x7f, 0x04, 0x15, + 0xf1, 0x49, 0x3f, 0x5a, 0x4a, 0xd3, 0xa5, 0x81, 0x8e, 0x0f, 0xa2, 0x4a, 0xfd, 0xa7, 0xb8, 0x43, + 0x54, 0x69, 0xe0, 0xf5, 0xf2, 0xe8, 0xaa, 0x24, 0xf4, 0x3f, 0x54, 0x95, 0x0e, 0x3c, 0xc4, 0xd7, + 0x15, 0x7a, 0x3d, 0x2f, 0x79, 0xea, 0x8d, 0x56, 0xd2, 0x64, 0x33, 0xfd, 0x51, 0x7b, 0xf3, 0xe2, + 0x81, 0xda, 0x44, 0x5c, 0x7c, 0x00, 0xb5, 0xf8, 0x83, 0xe6, 0x14, 0x2e, 0x4a, 0xdf, 0x80, 0x37, + 0xcf, 0x8f, 0x84, 0x1b, 0x0d, 0xf6, 0x3e, 0x94, 0x85, 0x2f, 0x42, 0xa2, 0xe7, 0x87, 0xc8, 0xb1, + 0xf8, 0x79, 0xc4, 0xfd, 0x38, 0xf9, 0x1e, 0x94, 0xa2, 0x0f, 0x39, 0xa2, 0xb3, 0xa9, 0xf2, 0x7b, + 0x90, 0x2e, 0x37, 0x00, 0xfa, 0x5f, 0x69, 0x44, 0xcf, 0x49, 0xfb, 0x1c, 0xf8, 0x8c, 0xe3, 0x7e, + 0x9d, 0x46, 0xd3, 0x67, 0x2f, 0x3e, 0x86, 0x4d, 0x5f, 0x7c, 0xb4, 0xb4, 0x5f, 0xb7, 0xdb, 0x50, + 0x8d, 0x3d, 0x3e, 0x4c, 0x53, 0x61, 0xc9, 0xe3, 0xd0, 0xe6, 0xb9, 0x51, 0x50, 0xa3, 0xf5, 0xdb, + 0x86, 0x6a, 0xec, 0xe1, 0x57, 0xca, 0x48, 0xb2, 0x07, 0x6f, 0x29, 0x23, 0x49, 0xdf, 0x91, 0xa9, + 0x13, 0xe8, 0x6b, 0xc2, 0x1b, 0xb3, 0xd8, 0x83, 0x3e, 0xf4, 0xf2, 0xd0, 0x7e, 0x64, 0x0f, 0x1b, + 0x9b, 0x2b, 0x07, 0x69, 0x12, 0x91, 0xc0, 0xa5, 0x8a, 0xb1, 0x34, 0x5d, 0xaa, 0x0e, 0xb2, 0x52, + 0x1b, 0x90, 0x67, 0x2f, 0xb8, 0x90, 0x9a, 0xf2, 0x8c, 0x53, 0x78, 0xde, 0xd5, 0x7c, 0x46, 0x8a, + 0x13, 0x7f, 0xd3, 0xc4, 0x3a, 0x65, 0x37, 0xa5, 0x29, 0x9d, 0xc6, 0x5e, 0xed, 0x8c, 0xda, 0xa9, + 0x06, 0x79, 0xf6, 0x8c, 0x20, 0xa5, 0xd3, 0xd8, 0x1b, 0x99, 0xe6, 0x70, 0x1c, 0x76, 0xde, 0x9d, + 0x40, 0xeb, 0x90, 0xa3, 0xe1, 0x67, 0x74, 0x66, 0x58, 0x62, 0xfd, 0xb0, 0x1e, 0x63, 0xb9, 0xf7, + 0xea, 0x04, 0xba, 0x07, 0x39, 0x1a, 0xc0, 0x4b, 0xe9, 0x51, 0xcc, 0x8e, 0x6f, 0x0e, 0x45, 0x09, + 0x49, 0x34, 0xa1, 0x22, 0x66, 0xc2, 0xa6, 0x6c, 0x59, 0x92, 0x5c, 0xe1, 0xe6, 0x28, 0x98, 0xe1, + 0x28, 0x4c, 0x8d, 0xfa, 0xa1, 0xf8, 0x74, 0x35, 0x1a, 0x08, 0xf3, 0xa7, 0xab, 0xd1, 0x60, 0x64, + 0x5f, 0x9d, 0x40, 0xbf, 0xa4, 0x40, 0x23, 0x2d, 0x3d, 0x13, 0xa5, 0x7a, 0x40, 0xc3, 0x72, 0x4c, + 0x9b, 0xaf, 0x1e, 0xb0, 0x55, 0x44, 0xcb, 0x27, 0x34, 0xee, 0x37, 0x90, 0x90, 0x79, 0x21, 0xad, + 0xbf, 0x94, 0x24, 0xc3, 0xe6, 0x4b, 0xa3, 0x37, 0x88, 0xc6, 0xde, 0x84, 0xb2, 0x10, 0x73, 0x4c, + 0xb1, 0xbc, 0x83, 0xc1, 0xd2, 0x94, 0x55, 0x95, 0x84, 0x2f, 0x99, 0x78, 0xd3, 0x2c, 0xbe, 0x14, + 0x61, 0x14, 0x93, 0x02, 0x53, 0xc4, 0x3b, 0x96, 0x04, 0xa8, 0x4e, 0x20, 0x0c, 0x15, 0x31, 0xa5, + 0x2f, 0x45, 0x1a, 0x25, 0xd9, 0x80, 0xcd, 0x17, 0x46, 0xc0, 0x8c, 0x86, 0xd1, 0x01, 0xfa, 0x29, + 0x75, 0x29, 0x7b, 0xdd, 0x40, 0x56, 0x5f, 0xf3, 0xf9, 0x7d, 0xf1, 0xc4, 0x6d, 0x5f, 0x48, 0x92, + 0x4b, 0xe1, 0xfe, 0x60, 0x1a, 0xdd, 0x08, 0x67, 0x91, 0xc1, 0xb4, 0xab, 0x94, 0xb3, 0x48, 0x6a, + 0x86, 0x57, 0xf3, 0xc2, 0xc8, 0xf8, 0xd1, 0x7c, 0x1e, 0x42, 0x3d, 0x99, 0xa6, 0x96, 0x72, 0xc6, + 0x4d, 0xc9, 0x9a, 0x6b, 0xbe, 0x38, 0x22, 0xb6, 0xb8, 0x1f, 0x9e, 0x18, 0xa4, 0xe9, 0x67, 0xac, + 0x60, 0x9b, 0x66, 0x48, 0x8d, 0x32, 0x6b, 0x31, 0x19, 0x6b, 0x94, 0x59, 0xc7, 0x52, 0xaf, 0xf8, + 0xe6, 0x45, 0xb3, 0x0d, 0xd2, 0x36, 0x2f, 0x31, 0xe9, 0x27, 0x65, 0x9f, 0x89, 0x67, 0xc6, 0x30, + 0xf7, 0x33, 0x9e, 0xc5, 0x80, 0xce, 0x8d, 0x94, 0xea, 0x30, 0xcc, 0xfd, 0x94, 0xa7, 0x45, 0xb0, + 0xa3, 0x5b, 0x22, 0x49, 0x23, 0xe5, 0x28, 0x25, 0xcf, 0xf2, 0x48, 0x39, 0xba, 0xa5, 0xe4, 0x7d, + 0x50, 0xc5, 0xaa, 0x27, 0x23, 0xde, 0xc3, 0xef, 0x42, 0x92, 0xa1, 0xce, 0xfd, 0xaf, 0x2b, 0xea, + 0xc9, 0x50, 0x72, 0xca, 0x00, 0x29, 0x11, 0xe7, 0x11, 0x06, 0x48, 0x46, 0x61, 0x53, 0x06, 0x48, + 0x09, 0xd6, 0x8e, 0xe0, 0xbb, 0xc6, 0xa2, 0x9f, 0x29, 0x5b, 0xa1, 0x2c, 0x42, 0x9a, 0xb2, 0x15, + 0x4a, 0x03, 0xb7, 0xcc, 0xa3, 0xef, 0x07, 0x31, 0x53, 0xac, 0xdc, 0x40, 0x94, 0x73, 0x3f, 0xf2, + 0xef, 0x41, 0x31, 0x8c, 0x42, 0xa2, 0x67, 0x53, 0x5d, 0xc4, 0x03, 0x74, 0xf8, 0x11, 0x4c, 0x25, + 0x6e, 0xf0, 0x52, 0x44, 0x54, 0x1e, 0x85, 0xdc, 0x7f, 0x3d, 0xa1, 0x1f, 0xaf, 0x4a, 0x61, 0xc2, + 0x40, 0x1c, 0x30, 0xc5, 0xd4, 0x0f, 0x06, 0xbe, 0xc4, 0x01, 0x08, 0x61, 0x43, 0x07, 0x10, 0x42, + 0x55, 0x43, 0x07, 0x10, 0x83, 0x34, 0x4c, 0x22, 0x93, 0x17, 0x94, 0x29, 0x12, 0x99, 0x72, 0x5b, + 0xbc, 0x1f, 0x8b, 0x36, 0xa1, 0x2c, 0x5c, 0x79, 0xa3, 0x61, 0xa4, 0x89, 0x77, 0xf5, 0x29, 0xae, + 0x82, 0xe4, 0xf6, 0x5c, 0x9d, 0x58, 0xe9, 0x41, 0x65, 0xdd, 0x73, 0x1f, 0x85, 0x1f, 0x9c, 0xfc, + 0x9c, 0x36, 0xfa, 0xcb, 0x2d, 0xa8, 0x31, 0x04, 0x1d, 0x3f, 0x0a, 0x74, 0x77, 0xf3, 0x63, 0x74, + 0x72, 0x99, 0xfd, 0x1b, 0x87, 0xe5, 0xf0, 0xdf, 0x38, 0x2c, 0xdf, 0xb0, 0x6c, 0x7c, 0x8f, 0x67, + 0x41, 0xfe, 0x47, 0x61, 0xc8, 0xab, 0xbc, 0xe8, 0xca, 0x5a, 0xe3, 0xff, 0x49, 0xe2, 0x9d, 0x47, + 0xc1, 0xbd, 0xcd, 0x8f, 0xaf, 0x19, 0x9f, 0x5d, 0x29, 0x40, 0x6e, 0x65, 0xf9, 0xe5, 0xe5, 0x97, + 0xa0, 0x66, 0x45, 0xe8, 0x6d, 0xaf, 0xdb, 0xba, 0x56, 0x66, 0x8d, 0xd6, 0x49, 0x3f, 0xeb, 0xca, + 0xcf, 0x5e, 0x6c, 0x5b, 0xc1, 0x76, 0x6f, 0x93, 0x2c, 0xc1, 0x05, 0x86, 0xf6, 0xa2, 0xe5, 0xf2, + 0x5f, 0x17, 0x2c, 0x27, 0xc0, 0x9e, 0x63, 0xd8, 0xec, 0x3f, 0x4c, 0x70, 0x68, 0x77, 0xf3, 0xf7, + 0x14, 0x65, 0x33, 0x4f, 0x41, 0x17, 0xff, 0x3f, 0x00, 0x00, 0xff, 0xff, 0xff, 0xb6, 0x47, 0x70, + 0xc3, 0x62, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/internal/proxy/impl.go b/internal/proxy/impl.go index 95a40adef6..6d96006130 100644 --- a/internal/proxy/impl.go +++ b/internal/proxy/impl.go @@ -3873,10 +3873,6 @@ func (node *Proxy) CreateCredential(ctx context.Context, req *milvuspb.CreateCre if !node.checkHealthy() { return unhealthyStatus(), errorutil.UnhealthyError() } - // validate root permission - if isValid, status := node.validateAdminPermission(ctx); !isValid { - return status, errorutil.PermissionDenyError() - } // validate params username := req.Username if err := ValidateUsername(username); err != nil { @@ -3999,10 +3995,6 @@ func (node *Proxy) DeleteCredential(ctx context.Context, req *milvuspb.DeleteCre if !node.checkHealthy() { return unhealthyStatus(), errorutil.UnhealthyError() } - // validate root permission - if isValid, status := node.validateAdminPermission(ctx); !isValid { - return status, errorutil.PermissionDenyError() - } if req.Username == util.UserRoot { return &commonpb.Status{ @@ -4064,18 +4056,6 @@ func (node *Proxy) SendRetrieveResult(ctx context.Context, req *internalpb.Retri }, nil } -func (node *Proxy) validateAdminPermission(ctx context.Context) (bool, *commonpb.Status) { - err := ValidateAdminPermission(ctx) - if err != nil { - logger.Error("fail to validate admin permission", zap.Error(err)) - return false, &commonpb.Status{ - ErrorCode: commonpb.ErrorCode_PermissionDenied, - Reason: err.Error(), - } - } - return true, nil -} - func (node *Proxy) CreateRole(ctx context.Context, req *milvuspb.CreateRoleRequest) (*commonpb.Status, error) { logger.Debug("CreateRole", zap.Any("req", req)) if code, ok := node.checkHealthyAndReturnCode(); !ok { @@ -4093,10 +4073,6 @@ func (node *Proxy) CreateRole(ctx context.Context, req *milvuspb.CreateRoleReque }, err } - if isValid, status := node.validateAdminPermission(ctx); !isValid { - return status, errorutil.PermissionDenyError() - } - result, err := node.rootCoord.CreateRole(ctx, req) if err != nil { logger.Error("fail to create role", zap.Error(err)) @@ -4119,9 +4095,6 @@ func (node *Proxy) DropRole(ctx context.Context, req *milvuspb.DropRoleRequest) Reason: err.Error(), }, err } - if isValid, status := node.validateAdminPermission(ctx); !isValid { - return status, errorutil.PermissionDenyError() - } result, err := node.rootCoord.DropRole(ctx, req) if err != nil { logger.Error("fail to drop role", zap.String("role_name", req.RoleName), zap.Error(err)) @@ -4150,9 +4123,6 @@ func (node *Proxy) OperateUserRole(ctx context.Context, req *milvuspb.OperateUse Reason: err.Error(), }, err } - if isValid, status := node.validateAdminPermission(ctx); !isValid { - return status, errorutil.PermissionDenyError() - } result, err := node.rootCoord.OperateUserRole(ctx, req) if err != nil { @@ -4181,11 +4151,6 @@ func (node *Proxy) SelectRole(ctx context.Context, req *milvuspb.SelectRoleReque }, err } } - if isValid, status := node.validateAdminPermission(ctx); !isValid { - return &milvuspb.SelectRoleResponse{ - Status: status, - }, errorutil.PermissionDenyError() - } result, err := node.rootCoord.SelectRole(ctx, req) if err != nil { @@ -4216,21 +4181,6 @@ func (node *Proxy) SelectUser(ctx context.Context, req *milvuspb.SelectUserReque }, err } } - curUser, err := GetCurUserFromContext(ctx) - if err != nil { - return &milvuspb.SelectUserResponse{ - Status: &commonpb.Status{ - ErrorCode: commonpb.ErrorCode_UnexpectedError, - Reason: err.Error(), - }, - }, err - } - isSelf := req.User != nil && req.User.Name == curUser - if isValid, status := node.validateAdminPermission(ctx); !isValid && !isSelf { - return &milvuspb.SelectUserResponse{ - Status: status, - }, errorutil.PermissionDenyError() - } result, err := node.rootCoord.SelectUser(ctx, req) if err != nil { @@ -4282,9 +4232,6 @@ func (node *Proxy) OperatePrivilege(ctx context.Context, req *milvuspb.OperatePr if code, ok := node.checkHealthyAndReturnCode(); !ok { return errorutil.UnhealthyStatus(code), errorutil.UnhealthyError() } - if isValid, status := node.validateAdminPermission(ctx); !isValid { - return status, errorutil.PermissionDenyError() - } if err := node.validPrivilegeParams(req); err != nil { return &commonpb.Status{ ErrorCode: commonpb.ErrorCode_IllegalArgument, @@ -4342,12 +4289,6 @@ func (node *Proxy) SelectGrant(ctx context.Context, req *milvuspb.SelectGrantReq return &milvuspb.SelectGrantResponse{Status: errorutil.UnhealthyStatus(code)}, errorutil.UnhealthyError() } - if isValid, status := node.validateAdminPermission(ctx); !isValid { - return &milvuspb.SelectGrantResponse{ - Status: status, - }, errorutil.PermissionDenyError() - } - if err := node.validGrantParams(req); err != nil { return &milvuspb.SelectGrantResponse{ Status: &commonpb.Status{ diff --git a/internal/proxy/meta_cache.go b/internal/proxy/meta_cache.go index e3dab22a39..9a80ef9c7b 100644 --- a/internal/proxy/meta_cache.go +++ b/internal/proxy/meta_cache.go @@ -670,7 +670,11 @@ func (m *MetaCache) InitPolicyInfo(info []string, userRoles []string) { m.privilegeInfos = util.StringSet(info) for _, userRole := range userRoles { - user, role := funcutil.DecodeUserRoleCache(userRole) + user, role, err := funcutil.DecodeUserRoleCache(userRole) + if err != nil { + log.Warn("invalid user-role key", zap.String("user-role", userRole), zap.Error(err)) + continue + } if m.userToRoles[user] == nil { m.userToRoles[user] = make(map[string]struct{}) } @@ -705,13 +709,19 @@ func (m *MetaCache) RefreshPolicyInfo(op typeutil.CacheOp) error { case typeutil.CacheRevokePrivilege: delete(m.privilegeInfos, op.OpKey) case typeutil.CacheAddUserToRole: - user, role := funcutil.DecodeUserRoleCache(op.OpKey) + user, role, err := funcutil.DecodeUserRoleCache(op.OpKey) + if err != nil { + return fmt.Errorf("invalid opKey, fail to decode, op_type: %d, op_key: %s", int(op.OpType), op.OpKey) + } if m.userToRoles[user] == nil { m.userToRoles[user] = make(map[string]struct{}) } m.userToRoles[user][role] = struct{}{} case typeutil.CacheRemoveUserFromRole: - user, role := funcutil.DecodeUserRoleCache(op.OpKey) + user, role, err := funcutil.DecodeUserRoleCache(op.OpKey) + if err != nil { + return fmt.Errorf("invalid opKey, fail to decode, op_type: %d, op_key: %s", int(op.OpType), op.OpKey) + } if m.userToRoles[user] != nil { delete(m.userToRoles[user], role) } diff --git a/internal/proxy/privilege_interceptor.go b/internal/proxy/privilege_interceptor.go index 078bb2d8b3..e60a9c5c5c 100644 --- a/internal/proxy/privilege_interceptor.go +++ b/internal/proxy/privilege_interceptor.go @@ -6,6 +6,8 @@ import ( "reflect" "strings" + "github.com/milvus-io/milvus/internal/proto/commonpb" + "github.com/milvus-io/milvus/internal/util" "github.com/casbin/casbin/v2" @@ -87,17 +89,24 @@ func PrivilegeInterceptor(ctx context.Context, req interface{}) (context.Context return ctx, err } roleNames = append(roleNames, util.RolePublic) - resourceType := privilegeExt.ObjectType.String() - resourceNameIndex := privilegeExt.ObjectNameIndex - resourceName := funcutil.GetResourceName(req, privilegeExt.ObjectNameIndex) - resourcePrivilege := privilegeExt.ObjectPrivilege.String() + objectType := privilegeExt.ObjectType.String() + objectNameIndex := privilegeExt.ObjectNameIndex + objectName := funcutil.GetObjectName(req, objectNameIndex) + if isCurUserObject(objectType, username, objectName) { + return ctx, nil + } + objectNameIndexs := privilegeExt.ObjectNameIndexs + objectNames := funcutil.GetObjectNames(req, objectNameIndexs) + objectPrivilege := privilegeExt.ObjectPrivilege.String() policyInfo := strings.Join(globalMetaCache.GetPrivilegeInfo(ctx), ",") log.Debug("current request info", zap.String("username", username), zap.Strings("role_names", roleNames), - zap.String("resource_type", resourceType), zap.String("resource_privilege", resourcePrivilege), zap.Int32("resource_index", resourceNameIndex), zap.String("resource_name", resourceName), + zap.String("object_type", objectType), zap.String("object_privilege", objectPrivilege), + zap.Int32("object_index", objectNameIndex), zap.String("object_name", objectName), + zap.Strings("object_names", objectNames), zap.String("policy_info", policyInfo)) - policy := fmt.Sprintf("[%s]", strings.Join(globalMetaCache.GetPrivilegeInfo(ctx), ",")) + policy := fmt.Sprintf("[%s]", policyInfo) b := []byte(policy) a := jsonadapter.NewAdapter(&b) policyModel, err := initPolicyModel() @@ -112,12 +121,38 @@ func PrivilegeInterceptor(ctx context.Context, req interface{}) (context.Context return ctx, err } for _, roleName := range roleNames { - isPermit, err := e.Enforce(roleName, funcutil.PolicyForResource(resourceType, resourceName), privilegeExt.ObjectPrivilege.String()) + permitFunc := func(resName string) (bool, error) { + object := funcutil.PolicyForResource(objectType, objectName) + isPermit, err := e.Enforce(roleName, object, objectPrivilege) + if err != nil { + log.Error("Enforce fail", zap.String("role", roleName), zap.String("object", object), zap.String("privilege", objectPrivilege), zap.Error(err)) + return false, err + } + return isPermit, nil + } + + // handle the api which refers one resource + permitObject, err := permitFunc(objectName) if err != nil { - log.Error("Enforce fail", zap.String("policy", policy), zap.String("role", roleName), zap.Error(err)) return ctx, err } - if isPermit { + if permitObject { + return ctx, nil + } + + // handle the api which refers many resources + permitObjects := true + for _, name := range objectNames { + p, err := permitFunc(name) + if err != nil { + return ctx, err + } + if !p { + permitObjects = false + break + } + } + if permitObjects && len(objectNames) != 0 { return ctx, nil } } @@ -128,6 +163,16 @@ func PrivilegeInterceptor(ctx context.Context, req interface{}) (context.Context type ErrPermissionDenied struct{} -func (e ErrPermissionDenied) Error() string { +func (e *ErrPermissionDenied) Error() string { return "permission deny" } + +// isCurUserObject Determine whether it is an Object of type User that operates on its own user information, +// like updating password or viewing your own role information. +// make users operate their own user information when the related privileges are not granted. +func isCurUserObject(objectType string, curUser string, object string) bool { + if objectType != commonpb.ObjectType_User.String() { + return false + } + return curUser == object +} diff --git a/internal/proxy/proxy_test.go b/internal/proxy/proxy_test.go index 6a3df36d15..4e071f8c92 100644 --- a/internal/proxy/proxy_test.go +++ b/internal/proxy/proxy_test.go @@ -2169,10 +2169,6 @@ func TestProxy(t *testing.T) { } } createCredentialReq := constructCreateCredentialRequest() - // permission deny - invalidCtx := GetContext(context.Background(), "foo:12345") - _, err := proxy.CreateCredential(invalidCtx, createCredentialReq) - assert.Error(t, err) // success resp, err := proxy.CreateCredential(ctx, createCredentialReq) assert.NoError(t, err) @@ -2311,10 +2307,6 @@ func TestProxy(t *testing.T) { } } delCredReq := constructDelCredRequest() - // permission deny - invalidCtx := GetContext(context.Background(), "foo:12345") - _, err := proxy.DeleteCredential(invalidCtx, delCredReq) - assert.Error(t, err) deleteResp, err := proxy.DeleteCredential(ctx, delCredReq) assert.NoError(t, err) @@ -3177,10 +3169,6 @@ func TestProxy(t *testing.T) { cancel() } -func getNotRootCtx() context.Context { - return GetContext(context.Background(), "foo:12345") -} - func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) { var wg sync.WaitGroup wg.Add(1) @@ -3192,9 +3180,6 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) { assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) entity.Name = "unit_test" - _, err := proxy.CreateRole(getNotRootCtx(), &milvuspb.CreateRoleRequest{Entity: entity}) - assert.Error(t, err) - resp, _ = proxy.CreateRole(ctx, &milvuspb.CreateRoleRequest{Entity: entity}) assert.Equal(t, commonpb.ErrorCode_Success, resp.ErrorCode) @@ -3225,28 +3210,16 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) { ObjectName: "col1", Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()}, Role: &milvuspb.RoleEntity{Name: roleName}, - Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.Load.String()}}, + Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoad.String())}}, }, } privilegeResp, _ := proxy.OperatePrivilege(ctx, privilegeRequest) assert.Equal(t, commonpb.ErrorCode_Success, privilegeResp.ErrorCode) - _, err := proxy.SelectUser(context.Background(), &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true}) - assert.Error(t, err) - - _, err = proxy.SelectUser(getNotRootCtx(), &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true}) - assert.Error(t, err) - userResp, _ := proxy.SelectUser(ctx, &milvuspb.SelectUserRequest{User: &milvuspb.UserEntity{Name: username}, IncludeRoleInfo: true}) assert.Equal(t, commonpb.ErrorCode_Success, userResp.Status.ErrorCode) roleNumOfUser := len(userResp.Results[0].Roles) - _, err = proxy.OperateUserRole(getNotRootCtx(), &milvuspb.OperateUserRoleRequest{ - Username: username, - RoleName: roleName, - Type: milvuspb.OperateUserRoleType_AddUserToRole, - }) - assert.Error(t, err) roleResp, _ = proxy.OperateUserRole(ctx, &milvuspb.OperateUserRoleRequest{ Username: username, RoleName: roleName, @@ -3261,9 +3234,6 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) { privilegeResp, _ = proxy.OperatePrivilege(ctx, privilegeRequest) assert.Equal(t, commonpb.ErrorCode_Success, privilegeResp.ErrorCode) - _, err = proxy.DropRole(getNotRootCtx(), &milvuspb.DropRoleRequest{RoleName: roleName}) - assert.Error(t, err) - roleResp, _ = proxy.DropRole(ctx, &milvuspb.DropRoleRequest{RoleName: roleName}) assert.Equal(t, commonpb.ErrorCode_Success, roleResp.ErrorCode) @@ -3305,9 +3275,6 @@ func testProxyRole(ctx context.Context, t *testing.T, proxy *Proxy) { _, err := proxy.SelectRole(ctx, &milvuspb.SelectRoleRequest{Role: &milvuspb.RoleEntity{Name: " "}}) assert.Error(t, err) - _, err = proxy.SelectRole(getNotRootCtx(), &milvuspb.SelectRoleRequest{Role: &milvuspb.RoleEntity{Name: " "}}) - assert.Error(t, err) - resp, _ := proxy.SelectRole(ctx, &milvuspb.SelectRoleRequest{}) assert.Equal(t, commonpb.ErrorCode_Success, resp.Status.ErrorCode) roleNum := len(resp.Results) @@ -3428,7 +3395,8 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) { resp, _ = proxy.OperatePrivilege(ctx, req) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) - req.Entity.Grantor.Privilege.Name = util.All.String() + req.Entity.Grantor.Privilege.Name = util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String()) + resp, _ = proxy.OperatePrivilege(ctx, req) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) @@ -3449,9 +3417,7 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) { assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) req.Entity.Role = &milvuspb.RoleEntity{Name: "admin"} - _, err := proxy.OperatePrivilege(getNotRootCtx(), req) - assert.Error(t, err) - _, err = proxy.OperatePrivilege(context.Background(), req) + _, err := proxy.OperatePrivilege(context.Background(), req) assert.Error(t, err) resp, _ = proxy.OperatePrivilege(ctx, req) @@ -3460,8 +3426,7 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) { req.Entity.Grantor.Privilege.Name = "not existed" resp, _ = proxy.OperatePrivilege(ctx, req) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) - req.Entity.Grantor.Privilege.Name = util.All.String() - + req.Entity.Grantor.Privilege.Name = util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String()) req.Entity.Object.Name = "not existed" resp, _ = proxy.OperatePrivilege(ctx, req) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) @@ -3477,7 +3442,7 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) { Role: &milvuspb.RoleEntity{Name: "public"}, Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()}, ObjectName: "col1", - Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.Load.String()}}, + Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoad.String())}}, }, Type: milvuspb.OperatePrivilegeType_Grant, } @@ -3510,8 +3475,6 @@ func testProxyPrivilege(ctx context.Context, t *testing.T, proxy *Proxy) { assert.NotEqual(t, commonpb.ErrorCode_Success, results.Status.ErrorCode) selectReq.Entity.Role = &milvuspb.RoleEntity{Name: "public"} - _, err = proxy.SelectGrant(getNotRootCtx(), selectReq) - assert.Error(t, err) results, _ = proxy.SelectGrant(ctx, selectReq) assert.Equal(t, commonpb.ErrorCode_Success, results.Status.ErrorCode) @@ -3564,7 +3527,7 @@ func testProxyPrivilegeFail(ctx context.Context, t *testing.T, proxy *Proxy, rea Role: &milvuspb.RoleEntity{Name: "admin"}, ObjectName: "col1", Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()}, - Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.All.String()}}, + Grantor: &milvuspb.GrantorEntity{Privilege: &milvuspb.PrivilegeEntity{Name: util.MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String())}}, }, }) assert.NotEqual(t, commonpb.ErrorCode_Success, resp.ErrorCode) diff --git a/internal/proxy/util.go b/internal/proxy/util.go index 86255cbc58..a361365abe 100644 --- a/internal/proxy/util.go +++ b/internal/proxy/util.go @@ -696,21 +696,3 @@ func GetRole(username string) ([]string, error) { } return globalMetaCache.GetUserRole(username), nil } - -func ValidateAdminPermission(ctx context.Context) error { - curUser, err := GetCurUserFromContext(ctx) - if err != nil { - return fmt.Errorf("fail to get current user info from the context, err: %w", err) - } - roles, err := GetRole(curUser) - if err != nil { - return fmt.Errorf("fail to get role for the current user info, currtent user:%s, err: %w", curUser, err) - } - for _, role := range roles { - if role == util.RoleAdmin { - return nil - } - } - - return fmt.Errorf("the current user doesn't have privileges of the admin role, can't execute this api") -} diff --git a/internal/proxy/util_test.go b/internal/proxy/util_test.go index 1d1b3029dd..5db55d9a6c 100644 --- a/internal/proxy/util_test.go +++ b/internal/proxy/util_test.go @@ -714,29 +714,3 @@ func TestGetRole(t *testing.T) { assert.Nil(t, err) assert.Equal(t, 1, len(roles)) } - -func TestValidateAdminPermission(t *testing.T) { - root := "root" - password := "123456" - - err := ValidateAdminPermission(context.Background()) - assert.NotNil(t, err) - - globalMetaCache = nil - err = ValidateAdminPermission(GetContext(context.Background(), fmt.Sprintf("%s%s%s", root, util.CredentialSeperator, password))) - assert.NotNil(t, err) - - globalMetaCache = &mockCache{ - getUserRoleFunc: func(username string) []string { - if username == "root" { - return []string{"role1", "admin", "role2"} - } - return []string{"role1"} - }, - } - err = ValidateAdminPermission(GetContext(context.Background(), fmt.Sprintf("%s%s%s", root, util.CredentialSeperator, password))) - assert.Nil(t, err) - - err = ValidateAdminPermission(GetContext(context.Background(), fmt.Sprintf("%s%s%s", "test", util.CredentialSeperator, password))) - assert.NotNil(t, err) -} diff --git a/internal/rootcoord/root_coord.go b/internal/rootcoord/root_coord.go index 3a8e85cef1..d69da94761 100644 --- a/internal/rootcoord/root_coord.go +++ b/internal/rootcoord/root_coord.go @@ -1294,12 +1294,15 @@ func (c *Core) initRbac() (initError error) { commonpb.ObjectPrivilege_PrivilegeDescribeCollection.String(), commonpb.ObjectPrivilege_PrivilegeShowCollections.String(), } + collectionPrivileges := []string{ + commonpb.ObjectPrivilege_PrivilegeIndexDetail.String(), + } for _, globalPrivilege := range globalPrivileges { if initError = c.MetaTable.OperatePrivilege(util.DefaultTenant, &milvuspb.GrantEntity{ Role: &milvuspb.RoleEntity{Name: util.RolePublic}, Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Global.String()}, - ObjectName: funcutil.GlobalResourceName, + ObjectName: funcutil.AnyObjectName, Grantor: &milvuspb.GrantorEntity{ User: &milvuspb.UserEntity{Name: util.RoleAdmin}, Privilege: &milvuspb.PrivilegeEntity{Name: globalPrivilege}, @@ -1308,6 +1311,19 @@ func (c *Core) initRbac() (initError error) { return } } + for _, collectionPrivilege := range collectionPrivileges { + if initError = c.MetaTable.OperatePrivilege(util.DefaultTenant, &milvuspb.GrantEntity{ + Role: &milvuspb.RoleEntity{Name: util.RolePublic}, + Object: &milvuspb.ObjectEntity{Name: commonpb.ObjectType_Collection.String()}, + ObjectName: funcutil.AnyObjectName, + Grantor: &milvuspb.GrantorEntity{ + User: &milvuspb.UserEntity{Name: util.RoleAdmin}, + Privilege: &milvuspb.PrivilegeEntity{Name: collectionPrivilege}, + }, + }, milvuspb.OperatePrivilegeType_Grant); initError != nil { + return + } + } return nil } @@ -3328,7 +3344,7 @@ func (c *Core) isValidGrantor(entity *milvuspb.GrantorEntity, object string) err if entity.Privilege == nil { return fmt.Errorf("the privilege entity in the grantor entity is nil") } - if privilegeName := util.PrivilegeNameForDb(entity.Privilege.Name); privilegeName == "" { + if privilegeName := util.PrivilegeNameForMetastore(entity.Privilege.Name); privilegeName == "" { return fmt.Errorf("the privilege name in the privilege entity is invalid, current value: %s", entity.Privilege.Name) } privileges, ok := util.GetObjectPrivileges()[object] @@ -3377,11 +3393,11 @@ func (c *Core) OperatePrivilege(ctx context.Context, in *milvuspb.OperatePrivile return failStatus(commonpb.ErrorCode_OperatePrivilegeFailure, err.Error()), err } - logger.Debug("before PrivilegeNameForDb", zap.String("privilege", in.Entity.Grantor.Privilege.Name)) - in.Entity.Grantor.Privilege.Name = util.PrivilegeNameForDb(in.Entity.Grantor.Privilege.Name) - logger.Debug("after PrivilegeNameForDb", zap.String("privilege", in.Entity.Grantor.Privilege.Name)) + logger.Debug("before PrivilegeNameForMetastore", zap.String("privilege", in.Entity.Grantor.Privilege.Name)) + in.Entity.Grantor.Privilege.Name = util.PrivilegeNameForMetastore(in.Entity.Grantor.Privilege.Name) + logger.Debug("after PrivilegeNameForMetastore", zap.String("privilege", in.Entity.Grantor.Privilege.Name)) if in.Entity.Object.Name == commonpb.ObjectType_Global.String() { - in.Entity.ObjectName = funcutil.GlobalResourceName + in.Entity.ObjectName = funcutil.AnyObjectName } if err := c.MetaTable.OperatePrivilege(util.DefaultTenant, in.Entity, in.Type); err != nil { errMsg := "fail to operate the privilege" diff --git a/internal/util/constant.go b/internal/util/constant.go index c60a5acbf5..9ba9ffb2b0 100644 --- a/internal/util/constant.go +++ b/internal/util/constant.go @@ -16,7 +16,11 @@ package util -import "github.com/milvus-io/milvus/internal/proto/commonpb" +import ( + "strings" + + "github.com/milvus-io/milvus/internal/proto/commonpb" +) // Meta Prefix consts const ( @@ -34,80 +38,10 @@ const ( DefaultTenant = "" RoleAdmin = "admin" RolePublic = "public" + + PrivilegeWord = "Privilege" ) -// ObjectPrivilegeAPI privilege name for using api -type ObjectPrivilegeAPI int32 - -func (o ObjectPrivilegeAPI) String() string { - switch o { - case All: - return "All" - case CreateCollection: - return "CreateCollection" - case DropCollection: - return "DropCollection" - case DescribeCollection: - return "DescribeCollection" - case ShowCollections: - return "ShowCollections" - case Load: - return "Load" - case Release: - return "Release" - case Compact: - return "Compact" - case Insert: - return "Insert" - case Delete: - return "Delete" - default: - return "" - } -} - -const ( - All ObjectPrivilegeAPI = iota - CreateCollection - DropCollection - DescribeCollection - ShowCollections - Load - Release - Compact - Insert - Delete - - None = 999 -) - -func GetObjectPrivilegeFromName(name string) ObjectPrivilegeAPI { - switch name { - case All.String(): - return All - case CreateCollection.String(): - return CreateCollection - case DropCollection.String(): - return DropCollection - case DescribeCollection.String(): - return DescribeCollection - case ShowCollections.String(): - return ShowCollections - case Load.String(): - return Load - case Release.String(): - return Release - case Compact.String(): - return Compact - case Insert.String(): - return Insert - case Delete.String(): - return Delete - default: - return None - } -} - // StringSet convert array to map for conveniently check if the array contains an element func StringSet(strings []string) map[string]struct{} { stringsMap := make(map[string]struct{}) @@ -129,34 +63,60 @@ func StringList(stringMap map[string]struct{}) []string { func GetObjectPrivileges() map[string][]string { return map[string][]string{ commonpb.ObjectType_Collection.String(): { - Load.String(), - Release.String(), - Compact.String(), - Insert.String(), - Delete.String(), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoad.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeRelease.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCompaction.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeInsert.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDelete.String()), + + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeGetStatistics.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCreateIndex.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeIndexDetail.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDropIndex.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeSearch.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeFlush.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeQuery.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeLoadBalance.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeImport.String()), }, commonpb.ObjectType_Global.String(): { - All.String(), - CreateCollection.String(), - DropCollection.String(), - DescribeCollection.String(), - ShowCollections.String(), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeAll.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCreateCollection.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDropCollection.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDescribeCollection.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeShowCollections.String()), + + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeCreateOwnership.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeDropOwnership.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeSelectOwnership.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeManageOwnership.String()), + }, + commonpb.ObjectType_User.String(): { + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeUpdateUser.String()), + MetaStore2API(commonpb.ObjectPrivilege_PrivilegeSelectUser.String()), }, } } +// MetaStore2API convert meta-store's privilege name to api's +// example: PrivilegeAll -> All +func MetaStore2API(name string) string { + return name[strings.Index(name, PrivilegeWord)+len(PrivilegeWord):] +} + func PrivilegeNameForAPI(name string) string { - index, ok := commonpb.ObjectPrivilege_value[name] + _, ok := commonpb.ObjectPrivilege_value[name] if !ok { return "" } - return ObjectPrivilegeAPI(index).String() + return MetaStore2API(name) } -func PrivilegeNameForDb(name string) string { - o := GetObjectPrivilegeFromName(name) - if o == None { +func PrivilegeNameForMetastore(name string) string { + dbPrivilege := PrivilegeWord + name + _, ok := commonpb.ObjectPrivilege_value[dbPrivilege] + if !ok { return "" } - return commonpb.ObjectPrivilege_name[int32(o)] + return dbPrivilege } diff --git a/internal/util/funcutil/func.go b/internal/util/funcutil/func.go index 77dbbfdd1c..db57214f2f 100644 --- a/internal/util/funcutil/func.go +++ b/internal/util/funcutil/func.go @@ -394,9 +394,12 @@ func EncodeUserRoleCache(user string, role string) string { return fmt.Sprintf("%s/%s", user, role) } -func DecodeUserRoleCache(cache string) (string, string) { +func DecodeUserRoleCache(cache string) (string, string, error) { index := strings.LastIndex(cache, "/") + if index == -1 { + return "", "", fmt.Errorf("invalid param, cache: [%s]", cache) + } user := cache[:index] role := cache[index+1:] - return user, role + return user, role, nil } diff --git a/internal/util/funcutil/func_test.go b/internal/util/funcutil/func_test.go index beb0cfea7f..bcbb4ff561 100644 --- a/internal/util/funcutil/func_test.go +++ b/internal/util/funcutil/func_test.go @@ -539,7 +539,11 @@ func TestUserRoleCache(t *testing.T) { user, role := "foo", "root" cache := EncodeUserRoleCache(user, role) assert.Equal(t, fmt.Sprintf("%s/%s", user, role), cache) - u, r := DecodeUserRoleCache(cache) + u, r, err := DecodeUserRoleCache(cache) assert.Equal(t, user, u) assert.Equal(t, role, r) + assert.NoError(t, err) + + _, _, err = DecodeUserRoleCache("foo") + assert.Error(t, err) } diff --git a/internal/util/funcutil/policy.go b/internal/util/funcutil/policy.go index c0f1ba81ff..81349c1b9f 100644 --- a/internal/util/funcutil/policy.go +++ b/internal/util/funcutil/policy.go @@ -13,7 +13,7 @@ import ( ) const ( - GlobalResourceName = "*" + AnyObjectName = "*" ) func GetVersion(m proto.GeneratedMessage) (string, error) { @@ -53,13 +53,42 @@ func GetPrivilegeExtObj(m proto.GeneratedMessage) (commonpb.PrivilegeExt, error) }, nil } -func GetResourceName(m proto.GeneratedMessage, index int32) string { +// GetObjectName get object name from the grpc message according to the filed index. The filed is a string. +func GetObjectName(m proto.GeneratedMessage, index int32) string { if index <= 0 { - return GlobalResourceName + return AnyObjectName } msg := proto.MessageReflect(proto.MessageV1(m)) msgDesc := msg.Descriptor() - return msg.Get(msgDesc.Fields().ByNumber(protoreflect.FieldNumber(index))).String() + value := msg.Get(msgDesc.Fields().ByNumber(protoreflect.FieldNumber(index))) + user, ok := value.Interface().(protoreflect.Message) + if ok { + userDesc := user.Descriptor() + value = user.Get(userDesc.Fields().ByNumber(protoreflect.FieldNumber(1))) + if value.String() == "" { + return AnyObjectName + } + } + return value.String() +} + +// GetObjectNames get object names from the grpc message according to the filed index. The filed is an array. +func GetObjectNames(m proto.GeneratedMessage, index int32) []string { + if index <= 0 { + return []string{} + } + msg := proto.MessageReflect(proto.MessageV1(m)) + msgDesc := msg.Descriptor() + value := msg.Get(msgDesc.Fields().ByNumber(protoreflect.FieldNumber(index))) + names, ok := value.Interface().(protoreflect.List) + if !ok { + return []string{} + } + res := make([]string, names.Len()) + for i := 0; i < names.Len(); i++ { + res[i] = names.Get(i).String() + } + return res } func PolicyForPrivilege(roleName string, objectType string, objectName string, privilege string) string { diff --git a/internal/util/funcutil/policy_test.go b/internal/util/funcutil/policy_test.go index 4207198ee3..6405e9dac1 100644 --- a/internal/util/funcutil/policy_test.go +++ b/internal/util/funcutil/policy_test.go @@ -44,12 +44,36 @@ func Test_GetPrivilegeExtObj(t *testing.T) { } func Test_GetResourceName(t *testing.T) { - request := &milvuspb.HasCollectionRequest{ - DbName: "test", - CollectionName: "col1", + { + request := &milvuspb.HasCollectionRequest{ + DbName: "test", + CollectionName: "col1", + } + assert.Equal(t, "*", GetObjectName(request, 0)) + assert.Equal(t, "col1", GetObjectName(request, 3)) } - assert.Equal(t, "*", GetResourceName(request, 0)) - assert.Equal(t, "col1", GetResourceName(request, 3)) + + { + request := &milvuspb.SelectUserRequest{ + User: &milvuspb.UserEntity{Name: "test"}, + } + assert.Equal(t, "test", GetObjectName(request, 2)) + + request = &milvuspb.SelectUserRequest{} + assert.Equal(t, "*", GetObjectName(request, 2)) + } + +} + +func Test_GetResourceNames(t *testing.T) { + request := &milvuspb.FlushRequest{ + DbName: "test", + CollectionNames: []string{"col1", "col2"}, + } + assert.Equal(t, 0, len(GetObjectNames(request, 0))) + assert.Equal(t, 0, len(GetObjectNames(request, 2))) + names := GetObjectNames(request, 3) + assert.Equal(t, 2, len(names)) } func Test_PolicyForPrivilege(t *testing.T) {