Skip to content

Instantly share code, notes, and snippets.

@horrorho
Last active August 16, 2016 05:07
Show Gist options
  • Save horrorho/9c0ff20055b854f4298750cfad635fe2 to your computer and use it in GitHub Desktop.
Save horrorho/9c0ff20055b854f4298750cfad635fe2 to your computer and use it in GitHub Desktop.
// Partial CloudKit protobuf definition dump.
// https://github.com/sysdream/Protod
package CKDP;
message PackageManifestHeader {
optional int32 version = 1;
optional bytes signature = 2;
}
message PackageManifestSection {
optional bytes signature = 1;
optional int64 size = 2;
optional bool lastSection = 3;
}
message PackageManifestItem {
optional bytes signature = 1;
optional int64 size = 2;
optional bool lastItem = 3;
}
package CKDP;
import "options.proto";
import "clouddb_client.proto";
import "options.proto";
import "clouddb_client.proto";
import "clouddb_client_records.proto";
message ShareSaveRequest {
optional Share share = 1;
optional bytes shortTokenHash = 2;
optional bytes protectedFullToken = 3;
}
message ShareSaveResponse {
optional Share share = 1;
}
message ShareRetrieveRequest {
optional ShareIdentifier shareId = 1;
optional RecordZoneIdentifier zoneId = 2;
}
message ShareRetrieveResponse {
repeated Share share = 1;
}
message ShareDeleteRequest {
optional ShareIdentifier shareId = 1;
optional string etag = 2;
optional ProtectionInfo selfAddedPcs = 3;
}
message ShareDeleteResponse {
}
message ShareAcceptRequest {
optional ShareIdentifier shareId = 1;
optional string etag = 2;
optional ProtectionInfo selfAddedPcs = 3;
optional ProtectionInfo publicParticipantPublicKey = 4;
}
message ShareAcceptResponse {
optional Share share = 1;
}
message ShareTokenSaveRequest {
optional ShareIdentifier shareId = 1;
optional bytes shortTokenHash = 2;
optional bytes protectedFullToken = 3;
}
message ShareTokenSaveResponse {
optional string routingKey = 1;
}
message ShareTokenRetrieveRequest {
optional string routingKey = 1;
optional bytes shortTokenHash = 2;
optional ShareIdentifier shareId = 3;
}
message ShareTokenRetrieveResponse {
optional string container = 1;
optional RequestOperation.Header.ContainerEnvironment containerEnvironment = 2;
optional ShareIdentifier shareId = 3;
optional string etag = 4;
optional Participant.ShareParticipantType participantType = 5;
optional Participant.ShareParticipantState participantState = 6;
optional Share.Permission permission = 7;
optional ProtectionInfo selfAddedPcs = 8;
optional bytes protectedFullToken = 9;
optional string ownerFirstName = 10;
optional string ownerLastName = 11;
}
message ShareTokenDeleteRequest {
optional string routingKey = 1;
optional bytes shortTokenHash = 2;
}
message ShareTokenDeleteResponse {
}
message Share {
enum Permission {
none = 1;
readOnly = 2;
readWrite = 3;
}
optional ShareIdentifier shareId = 1;
optional string etag = 2;
optional Permission publicAccess = 3;
optional ProtectionInfo invitedPcs = 4;
optional ProtectionInfo selfAddedPcs = 5;
repeated Participant participant = 6;
optional string shortTokenRoutingKey = 7;
optional bytes internalAppSpecificMetadata = 100;
optional bytes shortTokenHash = 101;
}
message Participant {
enum ShareParticipantType {
owner = 1;
administrator = 2;
user = 3;
publicUser = 4;
}
enum ShareParticipantState {
invited = 1;
accepted = 2;
removed = 3;
tombstoned = 4;
}
optional Identifier participantId = 1;
optional Identifier userId = 2;
optional ContactInformation contactInformation = 3;
optional ShareParticipantState state = 4;
optional ShareParticipantType participantType = 5;
optional Share.Permission permission = 6;
optional Identifier inviterId = 7;
optional bool createdOutOfProcess = 8;
optional ProtectionInfo publicKey = 9;
optional int64 acceptTimestamp = 10;
}
message ContactInformation {
optional string emailAddress = 1;
optional string containerScopedUserId = 2;
optional string firstName = 3;
optional string lastName = 4;
}
message CommentedOnId {
optional ShareIdentifier shareIdentifier = 1;
optional bytes itemId = 2;
}
message LikeInfo {
optional int32 likeCount = 1;
optional bool likedByCurrentUser = 2;
}
message LikedId {
optional ShareIdentifier shareIdentifier = 1;
optional Identifier commentIdentifier = 2;
optional bytes itemId = 3;
}
message CommentSummary {
optional CommentedOnId identifier = 1;
optional LikeInfo likeInfo = 2;
}
message CommentContent {
optional bool encrypted = 1 [default = false];
optional bytes comment = 2;
}
message Comment {
optional Identifier commentId = 1;
optional string path = 2;
optional Date createdAt = 3;
optional Identifier from = 4;
optional CommentContent commentContent = 5;
optional LikeInfo likeInfo = 6;
}
message PostCommentRequest {
optional CommentedOnId identifier = 1;
optional string path = 2;
optional CommentContent commentContent = 3;
}
package CKDP;
import "options.proto";
import "clouddb_client.proto";
message TokenRegistrationBody {
optional bytes token = 1;
optional string bundleIdentifier = 2;
optional APNSEnv apnsEnv = 3;
}
message TokenRegistrationRequest {
optional TokenRegistrationBody tokenRegistrationBody = 1;
}
message TokenRegistrationResponse {
}
message TokenUnregistrationRequest {
optional TokenRegistrationBody tokenRegistrationBody = 1;
}
message TokenUnregistrationResponse {
}
message SetBadgeCountRequest {
optional uint32 badgeCount = 1;
optional bool forDevice = 2;
}
message SetBadgeCountResponse {
}
message NotificationSyncRequest {
optional bytes serverChangeToken = 1;
optional uint32 maxChanges = 2;
optional bool wantsChanges = 3;
}
message NotificationSyncResponse {
message PushMessage {
optional bool isRead = 1;
optional string uuid = 2;
optional SourceService source = 3;
optional string dialog = 4;
optional string sound = 5;
optional int32 badgeCount = 6;
optional bytes payload = 7;
optional string category = 8;
}
enum SourceService {
DATABASE = 1;
SHARING = 2;
UNKNOWN = 999;
}
optional bytes changeID = 1;
repeated PushMessage pushMessage = 2;
optional bool moreAvailable = 3;
}
message NotificationMarkReadRequest {
optional string uuid = 1;
}
message NotificationMarkReadResponse {
}
package CKDP;
import "options.proto";
import "clouddb_client.proto";
import "clouddb_client_records.proto";
message PulseData {
enum PulseState {
viewing = 1;
editing = 2;
offline = 3;
custom = 4;
invisible = 5;
}
optional Identifier user = 1;
optional PulseState state = 2;
optional int64 customState = 3 [default = 0];
optional int64 stateTTLMillis = 4 [default = 60000];
optional Date lastViewed = 5;
optional Date lastEdited = 6;
optional Date lastCustom = 7;
optional Date lastInvisible = 8;
}
message PulseRequest {
optional ShareIdentifier shareId = 1;
optional string etag = 3;
optional bytes pushToken = 4;
optional PulseData pulseData = 5;
optional bool reset = 6 [default = false];
optional int64 lookbackWindowMillis = 7 [default = 0];
optional APNSEnv apnsEnv = 8;
}
message PulseResponse {
optional string current_etag = 1;
repeated PulseData userData = 2;
}
package CKDP;
import "options.proto";
enum APNSEnv {
production = 0;
development = 1;
}
message Operation {
enum Type {
noneType = 0;
zoneSaveType = 200;
zoneRetrieveType = 201;
zoneDeleteType = 202;
zoneRetrieveChangesType = 203;
recordSaveType = 210;
recordRetrieveType = 211;
recordRetrieveVersionsType = 212;
recordRetrieveChangesType = 213;
recordDeleteType = 214;
queryRetrieveType = 220;
assetUploadTokenRetrieveType = 230;
containerDeleteType = 240;
containerResetType = 241;
containerSchemaPromotionType = 242;
userAvailableQuotaType = 243;
webAuthTokenRetrieveType = 250;
subscriptionCreateType = 300;
subscriptionRetrieveType = 301;
subscriptionDeleteType = 302;
userRetrieveType = 400;
userQueryType = 401;
userPrivacySettingsRetrieveType = 402;
userPrivacySettingsUpdateType = 403;
userPrivacySettingsResetType = 404;
userPrivacySettingsBatchLookup = 405;
shareSaveType = 500;
shareRetrieveType = 501;
shareDeleteType = 502;
shareAcceptType = 503;
shareTokenSaveType = 510;
shareTokenRetrieveType = 511;
shareTokenDeleteType = 512;
postCommentType = 600;
getCommentsType = 601;
getCommentType = 613;
deleteCommentType = 602;
likeType = 610;
unlikeType = 611;
getLikesType = 612;
pulseType = 700;
pushRegisterType = 800;
pushUnregisterType = 801;
pushBadgeType = 802;
pushSyncType = 803;
pushReadType = 804;
mescalSignatureType = 1000;
mescalSessionInfoType = 1001;
mescalCertificateType = 1002;
}
optional string operationUUID = 1;
optional Type type = 2;
optional bool synchronousMode = 3;
optional bool last = 4;
}
message RequestOperation {
message Header {
enum ContainerEnvironment {
production = 1;
sandbox = 2;
}
enum Database {
privateDB = 1;
publicDB = 2;
sharedDB = 3;
}
enum IsolationLevel {
zone = 1;
operation = 2;
}
optional string userToken = 1;
optional string applicationContainer = 2;
optional string applicationBundle = 3;
optional string applicationVersion = 4;
optional uint64 applicationConfigVersion = 5;
optional uint64 globalConfigVersion = 6;
optional Identifier deviceIdentifier = 7;
optional string deviceSoftwareVersion = 8;
optional string deviceHardwareVersion = 9;
optional string deviceLibraryName = 10;
optional string deviceLibraryVersion = 11;
optional string deviceFlowControlKey = 12;
optional uint64 deviceFlowControlBudget = 13;
optional uint64 deviceFlowControlBudgetCap = 14;
optional float deviceFlowControlRegeneration = 15;
optional uint64 deviceProtocolVersion = 16;
optional Locale locale = 17;
optional string mmcsProtocolVersion = 18;
optional ContainerEnvironment applicationContainerEnvironment = 19;
optional bytes clientChangeToken = 20;
optional string deviceAssignedName = 21;
optional string deviceHardwareID = 22;
optional Database targetDatabase = 23;
optional string userIDContainerID = 24;
optional IsolationLevel isolationLevel = 25;
}
optional Header header = 1;
optional Operation request = 2;
}
message ResponseOperation {
message Result {
message Error {
message Client {
enum Code {
unknown = 1;
expiredAppConfig = 2;
expiredGlobalConfig = 3;
badSyntax = 4;
forbidden = 5;
throttled = 6;
refused = 7;
notSupported = 8;
exists = 9;
requestAlreadyProcessed = 10;
badAuthToken = 11;
needsAuthentication = 12;
mescalSignatureMissing = 13;
invalidMescalSignature = 14;
opLockFailure = 15;
atomicFailure = 16;
resetNeeded = 17;
fieldsPerTypeLimitExceeded = 18;
typeBusy = 19;
numRecordTypesLimitExceeded = 20;
invalidContainer = 21;
invalidRecordTypeName = 22;
invalidFieldName = 23;
invalidFieldValue = 24;
invalidIdentifier = 25;
fieldNotQueryable = 26;
fieldNotSortable = 27;
queryFilterLimitExceeded = 28;
queryFilterValuesLimitExceeded = 29;
membershipQueryLimitExceeded = 30;
notificationAdditionalFieldLimitExceeded = 31;
notificationAdditionalFieldInvalidType = 32;
subscriptionLimitExceeded = 33;
uniqueTriggerLimitExceeded = 34;
triggerSubscriptionBindingTypeMismatch = 35;
zoneSizeLimitExceeded = 36;
zoneCountLimitExceeded = 37;
uniqueFieldFailure = 38;
validatingReferenceError = 39;
fullResetNeeded = 40;
alreadyShared = 41;
emailOutOfNetwork = 42;
duplicateSubscription = 43;
expiredPutReceipt = 46;
quotaExceeded = 47;
zoneNotFound = 48;
invalidBundleId = 49;
unsupportedDevice = 50;
blacklisted = 51;
recordProtectionInfoTagMismatch = 52;
zoneProtectionInfoTagMismatch = 53;
assetSizeLimitExceeded = 54;
batchOperationLimitExceeded = 55;
requestSizeLimitExceeded = 56;
recordSizeLimitExceeded = 57;
databaseCommitSizeExceeded = 58;
userDeletedDataForZone = 59;
staleRecordUpdate = 60;
shareParticipantLimitExceeded = 61;
shareParticipantError = 62;
}
optional Code type = 1;
}
message Server {
enum Code {
unknown = 1;
overloaded = 2;
notFound = 3;
containerUnavailable = 4;
mescalSignatureParseError = 6;
zoneBusy = 7;
zoneUnavailable = 8;
}
optional Code type = 1;
}
message Extension {
optional string extensionName = 1;
optional uint32 typeCode = 2;
optional bytes extensionPayload = 3;
}
optional Client clientError = 1;
optional Server serverError = 2;
optional Extension extensionError = 7;
optional int32 retryAfterSeconds = 3;
optional string errorDescription = 4;
optional string errorKey = 5;
optional string errorInternal = 6;
}
enum Code {
success = 1;
partial = 2;
failure = 3;
indeterminate = 4;
}
optional Code code = 1;
optional Error error = 2;
}
optional uint32 operationCost = 1;
optional Operation response = 2;
optional Result result = 3;
}
message Locale {
optional string languageCode = 1;
optional string regionCode = 2;
repeated string enabledKeyboards = 3;
optional string activeKeyboard = 4;
}
message Identifier {
enum Type {
record = 1;
device = 2;
subscription = 3;
share = 4;
comment = 5;
recordZone = 6;
user = 7;
}
optional string name = 1;
optional Type type = 2;
}
message RecordIdentifier {
optional Identifier value = 1;
optional RecordZoneIdentifier zoneIdentifier = 2;
}
message RecordZoneIdentifier {
optional Identifier value = 1;
optional Identifier ownerIdentifier = 2;
}
message ShareIdentifier {
optional Identifier value = 1;
optional RecordZoneIdentifier zoneIdentifier = 2;
}
message ProtectionInfo {
optional bytes protectionInfo = 1;
optional string protectionInfoTag = 2;
}
message Configuration {
message Field {
message Value {
enum Type {
bytesType = 1;
boolType = 2;
longType = 3;
doubleType = 4;
stringType = 5;
fieldType = 6;
listType = 7;
}
optional Type type = 1;
optional bytes bytesValue = 2;
optional bool boolValue = 3;
optional int64 longValue = 4;
optional double doubleValue = 5;
optional string stringValue = 6;
repeated Field fieldValues = 7;
repeated Value listValues = 8;
}
optional string name = 1;
optional Value value = 2;
}
repeated Field fields = 1;
optional uint64 created = 2;
optional uint64 expires = 3;
}
package CKDP;
import "options.proto";
import "clouddb_client.proto";
import "clouddb_client_sharing.proto";
message ZoneSaveRequest {
optional Zone recordZone = 1;
optional string etag = 2;
optional string zoneProtectionInfoTag = 3;
}
message ZoneSaveResponse {
}
message ZoneRetrieveRequest {
optional RecordZoneIdentifier zoneIdentifier = 1;
}
message ZoneRetrieveResponse {
message ZoneSummary {
optional Zone targetZone = 1;
optional bytes currentServerContinuationToken = 2;
optional bytes clientChangeToken = 3;
optional int32 deviceCount = 4;
optional int64 assetQuotaUsage = 5;
optional int64 metadataQuotaUsage = 6;
}
repeated ZoneSummary zoneSummary = 1;
}
message ZoneDeleteRequest {
optional RecordZoneIdentifier zoneIdentifier = 1;
optional bool userPurge = 2;
}
message ZoneDeleteResponse {
}
message ZoneRetrieveChangesRequest {
optional bytes syncContinuationToken = 1;
optional uint32 maxChangedZones = 2;
}
message ZoneRetrieveChangesResponse {
message ChangedZone {
enum ChangeType {
updated = 1;
deleted = 2;
}
optional RecordZoneIdentifier zoneIdentifier = 1;
optional ChangeType changeType = 2;
}
enum Status {
hasPendingChanges = 1;
syncComplete = 2;
}
repeated ChangedZone changedZones = 1;
optional bytes syncContinuationToken = 2;
optional Status status = 3;
}
message RequestedFields {
repeated Record.Field.Identifier fields = 1;
}
message AssetsToDownload {
optional bool allAssets = 1;
optional RequestedFields assetFields = 2;
}
message RecordSaveRequest {
message ConflictLoserUpdate {
repeated string conflictLoserEtags = 1;
}
message ShareIdUpdate {
optional ShareIdentifier shareId = 1;
}
enum SaveSemantics {
failIfOutdated = 1;
failIfExists = 2;
override = 3;
}
optional Record record = 1;
optional bool merge = 2;
repeated Record.Field.Identifier fieldsToDeleteIfExistOnMerge = 3;
optional string etag = 4;
optional ConflictLoserUpdate conflictLoserUpdate = 5;
optional SaveSemantics saveSemantics = 6;
optional string zoneProtectionInfoTag = 7;
optional string recordProtectionInfoTag = 8;
repeated string conflictLosersToResolve = 9;
optional string shareEtag = 10;
optional ShareIdUpdate shareIDUpdate = 11;
}
message RecordSaveResponse {
optional string etag = 2;
optional Date.Statistics timeStatistics = 3;
optional Record serverFields = 4;
}
message RecordRetrieveRequest {
message RetrieveAssetURL {
enum Type {
publishedURL = 1;
streamingURL = 2;
}
optional RequestedFields assetFields = 1;
optional int64 requestedTTL = 2;
optional Type type = 3;
}
optional RecordIdentifier recordIdentifier = 1;
optional RequestedFields requestedFields = 2;
optional string versionETag = 3;
optional string clientVersionETag = 4;
optional RetrieveAssetURL getAssetURL = 5;
optional AssetsToDownload assetsToDownload = 6;
}
message RecordRetrieveResponse {
optional Record record = 1;
optional bool clientVersionETagMatch = 2;
}
message RecordRetrieveVersionsRequest {
optional RecordIdentifier recordIdentifier = 1;
optional RequestedFields requestedFields = 2;
optional string minimumVersionEtag = 3;
optional AssetsToDownload assetsToDownload = 4;
}
message RecordRetrieveVersionsResponse {
optional bool isDeleted = 1;
repeated Record recordVersions = 2;
}
message RecordRetrieveChangesRequest {
enum ChangeTypes {
records = 1;
shares = 2;
recordsAndShares = 3;
}
optional bytes syncContinuationToken = 1;
optional RecordZoneIdentifier zoneIdentifier = 2;
optional RequestedFields requestedFields = 3;
optional uint32 maxChanges = 4;
optional ChangeTypes requestedChangeTypes = 5;
optional AssetsToDownload assetsToDownload = 6;
}
message RecordRetrieveChangesResponse {
message RecordChange {
enum Type {
idAndEtag = 1;
fullRecord = 2;
recordDeleted = 3;
}
optional RecordIdentifier recordIdentifier = 1;
optional string etag = 2;
optional Record.Type recordType = 3;
optional Type type = 4;
optional Record record = 5;
}
message ShareChange {
optional ShareIdentifier shareIdentifier = 1;
optional RecordChange.Type changeType = 2;
optional Share share = 3;
}
enum Status {
inconsistent = 1;
consistent = 2;
noPendingChanges = 3;
}
repeated RecordChange changedRecord = 1;
optional bytes syncContinuationToken = 2;
optional bytes clientChangeToken = 3;
optional Status status = 4;
repeated ShareChange changedShare = 5;
}
message RecordDeleteRequest {
optional RecordIdentifier recordIdentifier = 1;
optional string etag = 2;
}
message RecordDeleteResponse {
}
message UserAvailableQuotaRequest {
}
message UserAvailableQuotaResponse {
optional uint64 storageAvailableBytes = 1;
}
message UserRetrieveRequest {
}
message UserRetrieveResponse {
optional Record user = 1;
}
message QueryRetrieveRequest {
optional Query query = 1;
optional bytes continuationMarker = 2;
optional uint32 limit = 3;
optional RecordZoneIdentifier zoneIdentifier = 4;
optional RequestedFields requestedFields = 5;
optional AssetsToDownload assetsToDownload = 6;
}
message QueryRetrieveResponse {
message QueryResult {
enum Type {
idAndEtag = 1;
fullRecord = 2;
}
optional RecordIdentifier identifier = 1;
optional string etag = 2;
optional Type type = 3;
optional Record record = 4;
}
repeated QueryResult queryResults = 1;
optional bytes continuationMarker = 2;
}
message AssetUploadTokenRetrieveRequest {
message RecordAssetUpload {
optional RecordIdentifier recordId = 1;
optional Record.Type type = 2;
repeated AssetField assetFields = 3;
}
message AssetField {
optional Record.Field.Identifier field = 1;
repeated Asset assets = 2;
}
optional Record.Type type = 1;
optional Record.Field.Identifier field = 2;
repeated Asset assets = 3;
repeated RecordAssetUpload uploads = 4;
}
package CKDP;
import "options.proto";
import "clouddb_client.proto";
import "clouddb_client_records.proto";
message Subscription {
message Notification {
message Alert {
optional string text = 1;
optional string localizedKey = 2;
repeated string localizedArguments = 3;
optional string actionLocKey = 4;
optional string launchImage = 5;
optional string soundName = 6;
optional string category = 7;
}
optional Alert alert = 1;
optional bool shouldBadge = 2;
repeated string additionalFields = 3;
optional bool shouldSendContentAvailable = 4;
}
enum EvaluationType {
trigger = 1;
sync = 2;
metasync = 3;
}
enum RecordMutationType {
insert = 1;
update = 2;
remove = 3;
}
enum OwnerType {
user = 1;
device = 2;
}
optional Identifier identifier = 1;
optional EvaluationType evaluationType = 2;
optional OwnerType owner = 3;
repeated RecordMutationType mutationTriggers = 4;
optional Notification notification = 5;
repeated Query.Filter filters = 6;
repeated Record.Type recordTypes = 7;
optional bool fireOnce = 8;
optional RecordZoneIdentifier zoneIdentifier = 10;
}
message SubscriptionCreateRequest {
optional Subscription subscription = 1;
}
message SubscriptionCreateResponse {
}
message SubscriptionRetrieveRequest {
optional Identifier identifier = 1;
}
message SubscriptionRetrieveResponse {
repeated Subscription subscriptions = 1;
}
message SubscriptionDeleteRequest {
optional Identifier identifier = 1;
}
message SubscriptionDeleteResponse {
}
package CKDP;
import "options.proto";
import "clouddb_client.proto";
import "clouddb_client_records.proto";
message UserQueryRequest {
optional User.Alias alias = 1;
repeated Query.Sort sortedBy = 2;
optional string pcsServiceType = 3;
}
message UserQueryResponse {
optional User user = 1;
}
message UserPrivacySettingsRetrieveRequest {
}
message UserPrivacySettingsRetrieveResponse {
optional UserPrivacySettings userPrivacySettings = 1;
repeated string applicationBundle = 2;
}
message UserPrivacySettingsUpdateRequest {
optional string bundleIdentifier = 1;
optional UserPrivacySettings userPrivacySettings = 2;
}
message UserPrivacySettingsUpdateResponse {
}
message UserPrivacySettingsResetRequest {
}
message UserPrivacySettingsResetResponse {
}
message UserPrivacySettingsBatchLookupResponse {
message ContainerPrivacySettings {
optional string applicationContainer = 1;
optional RequestOperation.Header.ContainerEnvironment applicationContainerEnvironment = 2;
repeated string applicationBundle = 3;
optional UserPrivacySettings userPrivacySettings = 4;
}
repeated ContainerPrivacySettings containerPrivacySettings = 1;
}
message UserPrivacySettingsBatchLookupRequest {
}
message User {
message Alias {
enum Type {
hashedEmailAddressType = 1;
containerUserIdentifier = 2;
}
optional string identifier = 1;
optional Type type = 2;
}
optional Identifier identifier = 1;
optional Alias alias = 2;
optional string firstName = 3;
optional string lastName = 4;
optional ProtectionInfo protectionInfo = 5;
}
message UserPrivacySettings {
optional bool discoverable = 1;
}
package CKDP;
import "google/protobuf/descriptor.proto";
enum ServerType {
CKDatabaseService = 0;
CKShareService = 1;
CKDeviceService = 2;
}
enum PartitionType {
userPartition = 0;
appPartition = 1;
databaseSpecificPartition = 2;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment