syntax = "proto2";

// Both sha1 and sha256 are encoded with base64 with URL and Filename Safe Alphabet with padding removed
message AndroidAppDeliveryData {
  optional int64 downloadSize = 1;
  optional string sha1 = 2;
  optional string downloadUrl = 3;
  repeated AppFileMetadata additionalFile = 4;
  repeated HttpCookie downloadAuthCookie = 5;
  optional bool forwardLocked = 6;
  optional int64 refundTimeout = 7;
  optional bool serverInitiated = 8;
  optional int64 postInstallRefundWindowMillis = 9;
  optional bool immediateStartNeeded = 10;
  optional AndroidAppPatchData patchData = 11;
  optional EncryptionParams encryptionParams = 12;
  optional string downloadUrlGzipped = 13;
  optional int64 downloadSizeGzipped = 14;
  repeated Split split = 15;
  optional string sha256 = 19;
}
message Split {
  optional string name = 1;
  optional int64 size = 2;
  optional int64 sizeGzipped = 3;
  optional string sha1 = 4;
  optional string downloadUrl = 5;
  optional string downloadUrlGzipped = 6;
  optional string sha256 = 9;
}
message AndroidAppPatchData {
  optional int32 baseVersionCode = 1;
  optional string baseSha1 = 2;
  optional string downloadUrl = 3;
  optional int32 patchFormat = 4;
  optional int64 maxPatchSize = 5;
}
message AppFileMetadata {
  optional int32 fileType = 1;
  optional int32 versionCode = 2;
  optional int64 size = 3;
  optional string downloadUrl = 4;
  optional int64 sizeGzipped = 6;
  optional string downloadUrlGzipped = 7;
  optional string sha1 = 8;
}
message EncryptionParams {
  optional int32 version = 1;
  optional string encryptionKey = 2;
  optional string hmacKey = 3;
}
message HttpCookie {
  optional string name = 1;
  optional string value = 2;
}
message Address {
  optional string name = 1;
  optional string addressLine1 = 2;
  optional string addressLine2 = 3;
  optional string city = 4;
  optional string state = 5;
  optional string postalCode = 6;
  optional string postalCountry = 7;
  optional string dependentLocality = 8;
  optional string sortingCode = 9;
  optional string languageCode = 10;
  optional string phoneNumber = 11;
  optional bool isReduced = 12;
  optional string firstName = 13;
  optional string lastName = 14;
  optional string email = 15;
}
message BookAuthor {
  optional string name = 1;
  optional string deprecatedQuery = 2;
  optional Docid docid = 3;
}
message BookDetails {
  repeated BookSubject subject = 3;
  optional string publisher = 4;
  optional string publicationDate = 5;
  optional string isbn = 6;
  optional int32 numberOfPages = 7;
  optional string subtitle = 8;
  repeated BookAuthor author = 9;
  optional string readerUrl = 10;
  optional string downloadEpubUrl = 11;
  optional string downloadPdfUrl = 12;
  optional string acsEpubTokenUrl = 13;
  optional string acsPdfTokenUrl = 14;
  optional bool epubAvailable = 15;
  optional bool pdfAvailable = 16;
  optional string aboutTheAuthor = 17;
  repeated group Identifier = 18 {
    optional int32 type = 19;
    optional string identifier = 20;
  }
}
message BookSubject {
  optional string name = 1;
  optional string query = 2;
  optional string subjectId = 3;
}
message BrowseLink {
  optional string name = 1;
  optional string dataUrl = 3;
  optional Image icon = 5;
  optional UnknownCategoryContainer unknownCategoryContainer = 4;
}
message UnknownCategoryContainer {
  optional CategoryIdContainer categoryIdContainer = 5;
}
message CategoryIdContainer {
  optional string categoryId = 4;
}
message BrowseResponse {
  optional string contentsUrl = 1;
  optional string promoUrl = 2;
  repeated BrowseLink category = 3;
  repeated BrowseLink breadcrumb = 4;
  optional CategoryContainer categoryContainer = 9;
}
message CategoryContainer {
  repeated BrowseLink category = 4;
}
message AddressChallenge {
  optional string responseAddressParam = 1;
  optional string responseCheckboxesParam = 2;
  optional string title = 3;
  optional string descriptionHtml = 4;
  repeated FormCheckbox checkbox = 5;
  optional Address address = 6;
  repeated InputValidationError errorInputField = 7;
  optional string errorHtml = 8;
  repeated int32 requiredField = 9;
}
message AuthenticationChallenge {
  optional int32 authenticationType = 1;
  optional string responseAuthenticationTypeParam = 2;
  optional string responseRetryCountParam = 3;
  optional string pinHeaderText = 4;
  optional string pinDescriptionTextHtml = 5;
  optional string gaiaHeaderText = 6;
  optional string gaiaDescriptionTextHtml = 7;
}
message BuyResponse {
  optional PurchaseNotificationResponse purchaseResponse = 1;
  optional group CheckoutInfo = 2 {
    optional LineItem item = 3;
    repeated LineItem subItem = 4;
    repeated group CheckoutOption = 5 {
      optional string formOfPayment = 6;
      optional string encodedAdjustedCart = 7;
      optional string instrumentId = 15;
      repeated LineItem item = 16;
      repeated LineItem subItem = 17;
      optional LineItem total = 18;
      repeated string footerHtml = 19;
      optional int32 instrumentFamily = 29;
      repeated int32 deprecatedInstrumentInapplicableReason = 30;
      optional bool selectedInstrument = 32;
      optional LineItem summary = 33;
      repeated string footnoteHtml = 35;
      optional Instrument instrument = 43;
      optional string purchaseCookie = 45;
      repeated string disabledReason = 48;
    }
    optional string deprecatedCheckoutUrl = 10;
    optional string addInstrumentUrl = 11;
    repeated string footerHtml = 20;
    repeated int32 eligibleInstrumentFamily = 31;
    repeated string footnoteHtml = 36;
    repeated Instrument eligibleInstrument = 44;
  }
  optional string continueViaUrl = 8;
  optional string purchaseStatusUrl = 9;
  optional string checkoutServiceId = 12;
  optional bool checkoutTokenRequired = 13;
  optional string baseCheckoutUrl = 14;
  repeated string tosCheckboxHtml = 37;
  optional int32 iabPermissionError = 38;
  optional PurchaseStatusResponse purchaseStatusResponse = 39;
  optional string purchaseCookie = 46;
  optional Challenge challenge = 49;
  optional string downloadToken = 55;
}
message Challenge {
  optional AddressChallenge addressChallenge = 1;
  optional AuthenticationChallenge authenticationChallenge = 2;
}
message FormCheckbox {
  optional string description = 1;
  optional bool checked = 2;
  optional bool required = 3;
}
message LineItem {
  optional string name = 1;
  optional string description = 2;
  optional Offer offer = 3;
  optional Money amount = 4;
}
message Money {
  optional int64 micros = 1;
  optional string currencyCode = 2;
  optional string formattedAmount = 3;
}
message PurchaseNotificationResponse {
  optional int32 status = 1;
  optional DebugInfo debugInfo = 2;
  optional string localizedErrorMessage = 3;
  optional string purchaseId = 4;
}
message PurchaseStatusResponse {
  optional int32 status = 1;
  optional string statusMsg = 2;
  optional string statusTitle = 3;
  optional string briefMessage = 4;
  optional string infoUrl = 5;
  optional LibraryUpdate libraryUpdate = 6;
  optional Instrument rejectedInstrument = 7;
  optional AndroidAppDeliveryData appDeliveryData = 8;
}
message DeliveryResponse {
  optional AndroidAppDeliveryData appDeliveryData = 2;
}

message Docid {
  optional string backendDocid = 1;
  optional int32 type = 2;
  optional int32 backend = 3;
}
message Install {
  optional fixed64 androidId = 1;
  optional int32 version = 2;
  optional bool bundled = 3;
}
message Offer {
  optional int64 micros = 1;
  optional string currencyCode = 2;
  optional string formattedAmount = 3;
  repeated Offer convertedPrice = 4;
  optional bool checkoutFlowRequired = 5;
  optional int64 fullPriceMicros = 6;
  optional string formattedFullAmount = 7;
  optional int32 offerType = 8;
  optional RentalTerms rentalTerms = 9;
  optional int64 onSaleDate = 10;
  repeated string promotionLabel = 11;
  optional SubscriptionTerms subscriptionTerms = 12;
  optional string formattedName = 13;
  optional string formattedDescription = 14;
  optional bool sale = 22;
  optional string message = 26;
  optional int64 saleEndTimestamp = 30;
  optional string saleMessage = 31;
}
message OwnershipInfo {
  optional int64 initiationTimestampMsec = 1;
  optional int64 validUntilTimestampMsec = 2;
  optional bool autoRenewing = 3;
  optional int64 refundTimeoutTimestampMsec = 4;
  optional int64 postDeliveryRefundWindowMsec = 5;
}
message RentalTerms {
  optional int32 grantPeriodSeconds = 1;
  optional int32 activatePeriodSeconds = 2;
}
message SubscriptionTerms {
  optional TimePeriod recurringPeriod = 1;
  optional TimePeriod trialPeriod = 2;
}
message TimePeriod {
  optional int32 unit = 1;
  optional int32 count = 2;
}
message BillingAddressSpec {
  optional int32 billingAddressType = 1;
  repeated int32 requiredField = 2;
}
message CarrierBillingCredentials {
  optional string value = 1;
  optional int64 expiration = 2;
}
message CarrierBillingInstrument {
  optional string instrumentKey = 1;
  optional string accountType = 2;
  optional string currencyCode = 3;
  optional int64 transactionLimit = 4;
  optional string subscriberIdentifier = 5;
  optional EncryptedSubscriberInfo encryptedSubscriberInfo = 6;
  optional CarrierBillingCredentials credentials = 7;
  optional CarrierTos acceptedCarrierTos = 8;
}
message CarrierBillingInstrumentStatus {
  optional CarrierTos carrierTos = 1;
  optional bool associationRequired = 2;
  optional bool passwordRequired = 3;
  optional PasswordPrompt carrierPasswordPrompt = 4;
  optional int32 apiVersion = 5;
  optional string name = 6;
}
message CarrierTos {
  optional CarrierTosEntry dcbTos = 1;
  optional CarrierTosEntry piiTos = 2;
  optional bool needsDcbTosAcceptance = 3;
  optional bool needsPiiTosAcceptance = 4;
}
message CarrierTosEntry {
  optional string url = 1;
  optional string version = 2;
}
message CreditCardInstrument {
  optional int32 type = 1;
  optional string escrowHandle = 2;
  optional string lastDigits = 3;
  optional int32 expirationMonth = 4;
  optional int32 expirationYear = 5;
  repeated EfeParam escrowEfeParam = 6;
}
message EfeParam {
  optional int32 key = 1;
  optional string value = 2;
}
message InputValidationError {
  optional int32 inputField = 1;
  optional string errorMessage = 2;
}
message Instrument {
  optional string instrumentId = 1;
  optional Address billingAddress = 2;
  optional CreditCardInstrument creditCard = 3;
  optional CarrierBillingInstrument carrierBilling = 4;
  optional BillingAddressSpec billingAddressSpec = 5;
  optional int32 instrumentFamily = 6;
  optional CarrierBillingInstrumentStatus carrierBillingStatus = 7;
  optional string displayTitle = 8;
}
message PasswordPrompt {
  optional string prompt = 1;
  optional string forgotPasswordUrl = 2;
}
message ContainerMetadata {
  optional string browseUrl = 1;
  optional string nextPageUrl = 2;
  optional double relevance = 3;
  optional int64 estimatedResults = 4;
  optional string analyticsCookie = 5;
  optional bool ordered = 6;
}

message DebugInfo {
  repeated string message = 1;
  repeated group Timing = 2 {
    optional string name = 3;
    optional double timeInMs = 4;
  }
}

message BulkDetailsEntry {
  optional DocV2 doc = 1;
}
message BulkDetailsRequest {
  repeated string docid = 1;
  optional bool includeChildDocs = 2;
}
message BulkDetailsResponse {
  repeated BulkDetailsEntry entry = 1;
}
message DetailsResponse {
  optional DocV1 docV1 = 1;
  optional string analyticsCookie = 2;
  optional Review userReview = 3;
  optional DocV2 docV2 = 4;
  optional string footerHtml = 5;
  repeated Badge badge = 7;
  optional Features features = 12;
  optional string detailsStreamUrl = 13;
  optional string userReviewUrl = 14;
  optional string postAcquireDetailsStreamUrl = 17;
}
message Badge {
  optional string label = 1;
  optional Image image = 2;
  optional BadgeContainer1 badgeContainer1 = 4;
  optional string message = 11;
}
message BadgeContainer1 {
  optional BadgeContainer2 badgeContainer2 = 1;
}
message BadgeContainer2 {
  optional BadgeLinkContainer badgeLinkContainer = 2;
}
message BadgeLinkContainer {
  optional string link = 2;
}
message Features {
  repeated Feature featurePresence = 1;
  repeated Feature featureRating = 2;
}
message Feature {
  optional string label = 1;
  optional string value = 3;
}
message DeviceConfigurationProto {
  optional int32 touchScreen = 1;
  optional int32 keyboard = 2;
  optional int32 navigation = 3;
  optional int32 screenLayout = 4;
  optional bool hasHardKeyboard = 5;
  optional bool hasFiveWayNavigation = 6;
  optional int32 screenDensity = 7;
  optional int32 glEsVersion = 8;
  repeated string systemSharedLibrary = 9;
  repeated string systemAvailableFeature = 10;
  repeated string nativePlatform = 11;
  optional int32 screenWidth = 12;
  optional int32 screenHeight = 13;
  repeated string systemSupportedLocale = 14;
  repeated string glExtension = 15;
  optional int32 deviceClass = 16;
  optional int32 maxApkDownloadSizeMb = 17;
}
message Document {
  optional Docid docid = 1;
  optional Docid fetchDocid = 2;
  optional Docid sampleDocid = 3;
  optional string title = 4;
  optional string url = 5;
  repeated string snippet = 6;
  optional Offer priceDeprecated = 7;
  optional Availability availability = 9;
  repeated Image image = 10;
  repeated Document child = 11;
  optional AggregateRating aggregateRating = 13;
  repeated Offer offer = 14;
  repeated TranslatedText translatedSnippet = 15;
  repeated DocumentVariant documentVariant = 16;
  repeated string categoryId = 17;
  repeated Document decoration = 18;
  repeated Document parent = 19;
  optional string privacyPolicyUrl = 20;
}
message DocumentVariant {
  optional int32 variationType = 1;
  optional Rule rule = 2;
  optional string title = 3;
  repeated string snippet = 4;
  optional string recentChanges = 5;
  repeated TranslatedText autoTranslation = 6;
  repeated Offer offer = 7;
  optional int64 channelId = 9;
  repeated Document child = 10;
  repeated Document decoration = 11;
}
message Image {
  optional int32 imageType = 1;
  optional group Dimension = 2 {
    optional int32 width = 3;
    optional int32 height = 4;
  }
  optional string imageUrl = 5;
  optional string altTextLocalized = 6;
  optional string secureUrl = 7;
  optional int32 positionInSequence = 8;
  optional bool supportsFifeUrlOptions = 9;
  optional group Citation = 10 {
    optional string titleLocalized = 11;
    optional string url = 12;
  }
  optional string color = 15;
  optional int32 screenshotSetNumber = 21;
}
message TranslatedText {
  optional string text = 1;
  optional string sourceLocale = 2;
  optional string targetLocale = 3;
}

message PlusOneData {
  optional bool setByUser = 1;
  optional int64 total = 2;
  optional int64 circlesTotal = 3;
  repeated PlusPerson circlesPeople = 4;
}
message PlusPerson {
  optional string displayName = 2;
  optional string profileImageUrl = 4;
}

message AlbumDetails {
  optional string name = 1;
  optional MusicDetails details = 2;
  optional ArtistDetails displayArtist = 3;
}
message AppDetails {
  optional string developerName = 1;
  optional int32 majorVersionNumber = 2;
  optional int32 versionCode = 3;
  optional string versionString = 4;
  optional string title = 5;
  repeated string appCategory = 7;
  optional int32 contentRating = 8;
  optional int64 installationSize = 9;
  repeated string permission = 10;
  optional string developerEmail = 11;
  optional string developerWebsite = 12;
  optional string numDownloads = 13;
  optional string packageName = 14;
  optional string recentChangesHtml = 15;
  optional string uploadDate = 16;
  repeated FileMetadata file = 17;
  optional string appType = 18;
  optional bool unstable = 21;
  optional bool hasInstantLink = 24;
  optional string containsAds = 30;
  optional Dependencies dependencies = 34;
  optional TestingProgramInfo testingProgramInfo = 35;
  optional EarlyAccessInfo earlyAccessInfo = 36;
  optional string instantLink = 43;
  optional string developerAddress = 45;
}
message Dependencies {
  optional int32 unknown1 = 1;
  optional int64 unknown2 = 2;
  repeated Dependency dependency = 3;
  optional int32 unknown3 = 4;
}
message Dependency {
  optional string packageName = 1;
  optional int32 version = 2;
  optional int32 unknown4 = 4;
}
message TestingProgramInfo {
  optional bool subscribed = 2;
  optional bool subscribed1 = 3;
  optional string testingProgramEmail = 5;
}
message EarlyAccessInfo {
  optional string email = 3;
}
message ArtistDetails {
  optional string detailsUrl = 1;
  optional string name = 2;
  optional ArtistExternalLinks externalLinks = 3;
}
message ArtistExternalLinks {
  repeated string websiteUrl = 1;
  optional string googlePlusProfileUrl = 2;
  optional string youtubeChannelUrl = 3;
}
message DocumentDetails {
  optional AppDetails appDetails = 1;
  optional AlbumDetails albumDetails = 2;
  optional ArtistDetails artistDetails = 3;
  optional SongDetails songDetails = 4;
  optional BookDetails bookDetails = 5;
  optional VideoDetails videoDetails = 6;
  optional SubscriptionDetails subscriptionDetails = 7;
  optional MagazineDetails magazineDetails = 8;
  optional TvShowDetails tvShowDetails = 9;
  optional TvSeasonDetails tvSeasonDetails = 10;
  optional TvEpisodeDetails tvEpisodeDetails = 11;
}
message FileMetadata {
  optional int32 fileType = 1;
  optional int32 versionCode = 2;
  optional int64 size = 3;
}
message MagazineDetails {
  optional string parentDetailsUrl = 1;
  optional string deviceAvailabilityDescriptionHtml = 2;
  optional string psvDescription = 3;
  optional string deliveryFrequencyDescription = 4;
}
message MusicDetails {
  optional int32 censoring = 1;
  optional int32 durationSec = 2;
  optional string originalReleaseDate = 3;
  optional string label = 4;
  repeated ArtistDetails artist = 5;
  repeated string genre = 6;
  optional string releaseDate = 7;
  repeated int32 releaseType = 8;
}
message SongDetails {
  optional string name = 1;
  optional MusicDetails details = 2;
  optional string albumName = 3;
  optional int32 trackNumber = 4;
  optional string previewUrl = 5;
  optional ArtistDetails displayArtist = 6;
}
message SubscriptionDetails {
  optional int32 subscriptionPeriod = 1;
}
message Trailer {
  optional string trailerId = 1;
  optional string title = 2;
  optional string thumbnailUrl = 3;
  optional string watchUrl = 4;
  optional string duration = 5;
}
message TvEpisodeDetails {
  optional string parentDetailsUrl = 1;
  optional int32 episodeIndex = 2;
  optional string releaseDate = 3;
}
message TvSeasonDetails {
  optional string parentDetailsUrl = 1;
  optional int32 seasonIndex = 2;
  optional string releaseDate = 3;
  optional string broadcaster = 4;
}
message TvShowDetails {
  optional int32 seasonCount = 1;
  optional int32 startYear = 2;
  optional int32 endYear = 3;
  optional string broadcaster = 4;
}
message VideoCredit {
  optional int32 creditType = 1;
  optional string credit = 2;
  repeated string name = 3;
}
message VideoDetails {
  repeated VideoCredit credit = 1;
  optional string duration = 2;
  optional string releaseDate = 3;
  optional string contentRating = 4;
  optional int64 likes = 5;
  optional int64 dislikes = 6;
  repeated string genre = 7;
  repeated Trailer trailer = 8;
  repeated VideoRentalTerm rentalTerm = 9;
}
message VideoRentalTerm {
  optional int32 offerType = 1;
  optional string offerAbbreviation = 2;
  optional string rentalHeader = 3;
  repeated group Term = 4 {
    optional string header = 5;
    optional string body = 6;
  }
}
message Bucket {
  repeated DocV1 document = 1;
  optional bool multiCorpus = 2;
  optional string title = 3;
  optional string iconUrl = 4;
  optional string fullContentsUrl = 5;
  optional double relevance = 6;
  optional int64 estimatedResults = 7;
  optional string analyticsCookie = 8;
  optional string fullContentsListUrl = 9;
  optional string nextPageUrl = 10;
  optional bool ordered = 11;
}
message ListResponse {
  repeated Bucket bucket = 1;
  repeated DocV2 doc = 2;
}
message DocV1 {
  optional Document finskyDoc = 1;
  optional string docid = 2;
  optional string detailsUrl = 3;
  optional string reviewsUrl = 4;
  optional string relatedListUrl = 5;
  optional string moreByListUrl = 6;
  optional string shareUrl = 7;
  optional string creator = 8;
  optional DocumentDetails details = 9;
  optional string descriptionHtml = 10;
  optional string relatedBrowseUrl = 11;
  optional string moreByBrowseUrl = 12;
  optional string relatedHeader = 13;
  optional string moreByHeader = 14;
  optional string title = 15;
  optional PlusOneData plusOneData = 16;
  optional string warningMessage = 17;
}

message DocV2 {
  optional string docid = 1;
  optional string backendDocid = 2;
  optional int32 docType = 3;
  optional int32 backendId = 4;
  optional string title = 5;
  optional string creator = 6;
  optional string descriptionHtml = 7;
  repeated Offer offer = 8;
  optional Availability availability = 9;
  repeated Image image = 10;
  repeated DocV2 child = 11;
  optional ContainerMetadata containerMetadata = 12;
  optional DocumentDetails details = 13;
  optional AggregateRating aggregateRating = 14;
  optional RelatedLinks relatedLinks = 15;
  optional string detailsUrl = 16;
  optional string shareUrl = 17;
  optional string reviewsUrl = 18;
  optional string backendUrl = 19;
  optional string purchaseDetailsUrl = 20;
  optional bool detailsReusable = 21;
  optional string subtitle = 22;
  optional UnknownCategoryContainer unknownCategoryContainer = 24;
  optional Unknown25 unknown25 = 25;
  optional string descriptionShort = 27;
  optional string reviewSnippetsUrl = 31;
  optional string reviewQuestionsUrl = 34;
}
message Unknown25 {
  repeated Unknown25Item item = 2;
}
message Unknown25Item {
  optional string label = 1;
  optional Unknown25Container container = 3;
}
message Unknown25Container {
  optional string value = 2;
}
message RelatedLinks {
  optional RelatedLinksUnknown1 unknown1 = 10;
  optional string privacyPolicyUrl = 18;
  optional RelatedLink youMightAlsoLike = 24;
  optional Rated rated = 29;
  repeated RelatedLink relatedLinks = 34;
  optional CategoryInfo categoryInfo = 53;
}
message RelatedLinksUnknown1 {
  optional RelatedLinksUnknown2 unknown2 = 2;
}
message RelatedLinksUnknown2 {
  optional string homeUrl = 2;
  optional string nextPageUrl = 3;
}
message Rated {
  optional string label = 1;
  optional Image image = 2;
  optional string learnMoreHtmlLink = 4;
}
message RelatedLink {
  optional string label = 1;
  optional string url1 = 2;
  optional string url2 = 3;
}
message CategoryInfo {
  optional string appType = 1;
  optional string appCategory = 2;
}
message EncryptedSubscriberInfo {
  optional string data = 1;
  optional string encryptedKey = 2;
  optional string signature = 3;
  optional string initVector = 4;
  optional int32 googleKeyVersion = 5;
  optional int32 carrierKeyVersion = 6;
}
message Availability {
  optional int32 restriction = 5;
  optional int32 offerType = 6;
  optional Rule rule = 7;
  repeated group PerDeviceAvailabilityRestriction = 9 {
    optional fixed64 androidId = 10;
    optional int32 deviceRestriction = 11;
    optional int64 channelId = 12;
    optional FilterEvaluationInfo filterInfo = 15;
  }
  optional bool availableIfOwned = 13;
  repeated Install install = 14;
  optional FilterEvaluationInfo filterInfo = 16;
  optional OwnershipInfo ownershipInfo = 17;
}
message FilterEvaluationInfo {
  repeated RuleEvaluation ruleEvaluation = 1;
}
message Rule {
  optional bool negate = 1;
  optional int32 operator = 2;
  optional int32 key = 3;
  repeated string stringArg = 4;
  repeated int64 longArg = 5;
  repeated double doubleArg = 6;
  repeated Rule subrule = 7;
  optional int32 responseCode = 8;
  optional string comment = 9;
  repeated fixed64 stringArgHash = 10;
  repeated int32 constArg = 11;
}
message RuleEvaluation {
  optional Rule rule = 1;
  repeated string actualStringValue = 2;
  repeated int64 actualLongValue = 3;
  repeated bool actualBoolValue = 4;
  repeated double actualDoubleValue = 5;
}
message LibraryAppDetails {
  optional string certificateHash = 2;
  optional int64 refundTimeoutTimestampMsec = 3;
  optional int64 postDeliveryRefundWindowMsec = 4;
}
message LibraryInAppDetails {
  optional string signedPurchaseData = 1;
  optional string signature = 2;
}
message LibraryMutation {
  optional Docid docid = 1;
  optional int32 offerType = 2;
  optional int64 documentHash = 3;
  optional bool deleted = 4;
  optional LibraryAppDetails appDetails = 5;
  optional LibrarySubscriptionDetails subscriptionDetails = 6;
  optional LibraryInAppDetails inAppDetails = 7;
}
message LibrarySubscriptionDetails {
  optional int64 initiationTimestampMsec = 1;
  optional int64 validUntilTimestampMsec = 2;
  optional bool autoRenewing = 3;
  optional int64 trialUntilTimestampMsec = 4;
}
message LibraryUpdate {
  optional int32 status = 1;
  optional int32 corpus = 2;
  optional bytes serverToken = 3;
  repeated LibraryMutation mutation = 4;
  optional bool hasMore = 5;
  optional string libraryId = 6;
}

message AndroidAppNotificationData {
  optional int32 versionCode = 1;
  optional string assetId = 2;
}
message InAppNotificationData {
  optional string checkoutOrderId = 1;
  optional string inAppNotificationId = 2;
}
message LibraryDirtyData {
  optional int32 backend = 1;
}
message Notification {
  optional int32 notificationType = 1;
  optional int64 timestamp = 3;
  optional Docid docid = 4;
  optional string docTitle = 5;
  optional string userEmail = 6;
  optional AndroidAppNotificationData appData = 7;
  optional AndroidAppDeliveryData appDeliveryData = 8;
  optional PurchaseRemovalData purchaseRemovalData = 9;
  optional UserNotificationData userNotificationData = 10;
  optional InAppNotificationData inAppNotificationData = 11;
  optional PurchaseDeclinedData purchaseDeclinedData = 12;
  optional string notificationId = 13;
  optional LibraryUpdate libraryUpdate = 14;
  optional LibraryDirtyData libraryDirtyData = 15;
}
message PurchaseDeclinedData {
  optional int32 reason = 1;
  optional bool showNotification = 2;
}
message PurchaseRemovalData {
  optional bool malicious = 1;
}
message UserNotificationData {
  optional string notificationTitle = 1;
  optional string notificationText = 2;
  optional string tickerText = 3;
  optional string dialogTitle = 4;
  optional string dialogText = 5;
}

message AggregateRating {
  optional int32 type = 1;
  optional float starRating = 2;
  optional uint64 ratingsCount = 3;
  optional uint64 oneStarRatings = 4;
  optional uint64 twoStarRatings = 5;
  optional uint64 threeStarRatings = 6;
  optional uint64 fourStarRatings = 7;
  optional uint64 fiveStarRatings = 8;
  optional uint64 thumbsUpCount = 9;
  optional uint64 thumbsDownCount = 10;
  optional uint64 commentCount = 11;
  optional double bayesianMeanRating = 12;
}

message AcceptTosResponse {
}message CarrierBillingConfig {
   optional string id = 1;
   optional string name = 2;
   optional int32 apiVersion = 3;
   optional string provisioningUrl = 4;
   optional string credentialsUrl = 5;
   optional bool tosRequired = 6;
   optional bool perTransactionCredentialsRequired = 7;
   optional bool sendSubscriberIdWithCarrierBillingRequests = 8;
}
message BillingConfig {
  optional CarrierBillingConfig carrierBillingConfig = 1;
  optional int32 maxIabApiVersion = 2;
}
message CorpusMetadata {
  optional int32 backend = 1;
  optional string name = 2;
  optional string landingUrl = 3;
  optional string libraryName = 4;
  optional string recsWidgetUrl = 6;
  optional string shopName = 7;
}
message Experiments {
  repeated string experimentId = 1;
}
message SelfUpdateConfig {
  optional int32 latestClientVersionCode = 1;
}
message TocResponse {
  repeated CorpusMetadata corpus = 1;
  optional int32 tosVersionDeprecated = 2;
  optional string tosContent = 3;
  optional string homeUrl = 4;
  optional Experiments experiments = 5;
  optional string tosCheckboxTextMarketingEmails = 6;
  optional string tosToken = 7;
  optional string iconOverrideUrl = 9;
  optional SelfUpdateConfig selfUpdateConfig = 10;
  optional bool requiresUploadDeviceConfig = 11;
  optional BillingConfig billingConfig = 12;
  optional string recsWidgetUrl = 13;
  optional string socialHomeUrl = 15;
  optional bool ageVerificationRequired = 16;
  optional bool gplusSignupEnabled = 17;
  optional bool redeemEnabled = 18;
  optional string helpUrl = 19;
  optional int32 themeId = 20;
  optional string entertainmentHomeUrl = 21;
  optional string cookie = 22;
}
message Payload {
  optional ListResponse listResponse = 1;
  optional DetailsResponse detailsResponse = 2;
  optional ReviewResponse reviewResponse = 3;
  optional BuyResponse buyResponse = 4;
  optional SearchResponse searchResponse = 5;
  optional TocResponse tocResponse = 6;
  optional BrowseResponse browseResponse = 7;
  optional PurchaseStatusResponse purchaseStatusResponse = 8;
  optional string logResponse = 10;
  optional string flagContentResponse = 13;
  optional BulkDetailsResponse bulkDetailsResponse = 19;
  optional DeliveryResponse deliveryResponse = 21;
  optional AcceptTosResponse acceptTosResponse = 22;
  optional AndroidCheckinResponse androidCheckinResponse = 26;
  optional UploadDeviceConfigResponse uploadDeviceConfigResponse = 28;
  optional SearchSuggestResponse searchSuggestResponse = 40;
  optional TestingProgramResponse testingProgramResponse = 80;
}
message PreFetch {
  optional string url = 1;
  optional ResponseWrapper response = 2;
  optional string etag = 3;
  optional int64 ttl = 4;
  optional int64 softTtl = 5;
}
message ServerMetadata {
  optional int64 latencyMillis = 1;
}

message Targets {
  repeated int64 targetId = 1;
  optional bytes signature = 2;
}

message ServerCookie {
  optional int32 type = 1;
  optional bytes token = 2;
}
message ServerCookies {
  repeated ServerCookie serverCookie = 1;
}
message ResponseWrapper {
  optional Payload payload = 1;
  optional ServerCommands commands = 2;
  repeated PreFetch preFetch = 3;
  repeated Notification notification = 4;
  optional ServerMetadata serverMetadata = 5;
  optional Targets targets = 6;
  optional ServerCookies serverCookies = 7;
  optional bytes serverLogsCookie = 9;
}
message ResponseWrapperApi {
  optional PayloadApi payload = 1;
}
message PayloadApi {
  optional UserProfileResponse userProfileResponse = 5;
}
message UserProfileResponse {
  optional UserProfile userProfile = 1;
}
message ServerCommands {
  optional bool clearCache = 1;
  optional string displayErrorMessage = 2;
  optional string logErrorStacktrace = 3;
}
message GetReviewsResponse {
  repeated Review review = 1;
  optional int64 matchingCount = 2;
}
message Review {
  optional string authorName = 1;
  optional string url = 2;
  optional string source = 3;
  optional string documentVersion = 4;
  optional int64 timestampMsec = 5;
  optional int32 starRating = 6;
  optional string title = 7;
  optional string comment = 8;
  optional string commentId = 9;
  optional string deviceName = 19;
  optional string replyText = 29;
  optional int64 replyTimestampMsec = 30;
  optional ReviewAuthor author = 31;
  optional UserProfile userProfile = 33;
}
message ReviewAuthor {
  optional string name = 2;
  optional Image avatar = 5;
}
message UserProfile {
  optional string personIdString = 1;
  optional string personId = 2;
  optional int32 unknown1 = 3;
  optional int32 unknown2 = 4;
  optional string name = 5;
  repeated Image image = 10;
  optional string googlePlusUrl = 19;
  optional string googlePlusTagline = 22;
}
message ReviewResponse {
  optional GetReviewsResponse getResponse = 1;
  optional string nextPageUrl = 2;
  optional Review userReview = 3;
}

message RelatedSearch {
  optional string searchUrl = 1;
  optional string header = 2;
  optional int32 backendId = 3;
  optional int32 docType = 4;
  optional bool current = 5;
}
message SearchResponse {
  optional string originalQuery = 1;
  optional string suggestedQuery = 2;
  optional bool aggregateQuery = 3;
  repeated Bucket bucket = 4;
  repeated DocV2 doc = 5;
  repeated RelatedSearch relatedSearch = 6;
  optional string nextPageUrl = 10;
}
message SearchSuggestResponse {
  repeated SearchSuggestEntry entry = 1;
}
message SearchSuggestEntry {
  optional int32 type = 1;
  optional string suggestedQuery = 2;
  optional ImageContainer imageContainer = 5;
  message ImageContainer {
    optional string imageUrl = 5;
  }
  optional string title = 6;
  optional PackageNameContainer packageNameContainer = 8;
  message PackageNameContainer {
    optional string packageName = 1;
  }
}
message TestingProgramResponse {
  optional TestingProgramResult result = 2;
}
message TestingProgramResult {
  optional TestingProgramDetails details = 4;
}
message TestingProgramDetails {
  optional bool flag1 = 2;
  optional int64 id = 3;
  optional bool unsubscribed = 4;
}

message LogRequest {
  optional int64 timestamp = 1;
  optional string downloadConfirmationQuery = 2;
}
message TestingProgramRequest {
  optional string packageName = 1;
  optional bool subscribe = 2;
}
message UploadDeviceConfigRequest {
  optional DeviceConfigurationProto deviceConfiguration = 1;
  optional string manufacturer = 2;
  optional string gcmRegistrationId = 3;
}
message UploadDeviceConfigResponse {
  optional string uploadDeviceConfigToken = 1;
}
message AndroidCheckinRequest {
  optional string imei = 1;
  optional int64 id = 2;
  optional string digest = 3;
  optional AndroidCheckinProto checkin = 4;
  optional string desiredBuild = 5;
  optional string locale = 6;
  optional int64 loggingId = 7;
  optional string marketCheckin = 8;
  repeated string macAddr = 9;
  optional string meid = 10;
  repeated string accountCookie = 11;
  optional string timeZone = 12;
  optional fixed64 securityToken = 13;
  optional int32 version = 14;
  repeated string otaCert = 15;
  optional string serialNumber = 16;
  optional string esn = 17;
  optional DeviceConfigurationProto deviceConfiguration = 18;
  repeated string macAddrType = 19;
  optional int32 fragment = 20;
  optional string userName = 21;
  optional int32 userSerialNumber = 22;
}
message AndroidCheckinResponse {
  optional bool statsOk = 1;
  repeated AndroidIntentProto intent = 2;
  optional int64 timeMsec = 3;
  optional string digest = 4;
  repeated GservicesSetting setting = 5;
  optional bool marketOk = 6;
  optional fixed64 androidId = 7;
  optional fixed64 securityToken = 8;
  optional bool settingsDiff = 9;
  repeated string deleteSetting = 10;
  optional string deviceCheckinConsistencyToken = 12;
}
message GservicesSetting {
  optional bytes name = 1;
  optional bytes value = 2;
}
message AndroidBuildProto {
  optional string id = 1;
  optional string product = 2;
  optional string carrier = 3;
  optional string radio = 4;
  optional string bootloader = 5;
  optional string client = 6;
  optional int64 timestamp = 7;
  optional int32 googleServices = 8;
  optional string device = 9;
  optional int32 sdkVersion = 10;
  optional string model = 11;
  optional string manufacturer = 12;
  optional string buildProduct = 13;
  optional bool otaInstalled = 14;
}
message AndroidCheckinProto {
  optional AndroidBuildProto build = 1;
  optional int64 lastCheckinMsec = 2;
  repeated AndroidEventProto event = 3;
  repeated AndroidStatisticProto stat = 4;
  repeated string requestedGroup = 5;
  optional string cellOperator = 6;
  optional string simOperator = 7;
  optional string roaming = 8;
  optional int32 userNumber = 9;
}
message AndroidEventProto {
  optional string tag = 1;
  optional string value = 2;
  optional int64 timeMsec = 3;
}
message AndroidIntentProto {
  optional string action = 1;
  optional string dataUri = 2;
  optional string mimeType = 3;
  optional string javaClass = 4;
  repeated group Extra = 5 {
    optional string name = 6;
    optional string value = 7;
  }
}
message AndroidStatisticProto {
  optional string tag = 1;
  optional int32 count = 2;
  optional float sum = 3;
}
message ClientLibraryState {
  optional int32 corpus = 1;
  optional bytes serverToken = 2;
  optional int64 hashCodeSum = 3;
  optional int32 librarySize = 4;
  optional string libraryId = 5;
}
message AndroidDataUsageProto {
  optional int32 version = 1;
  optional int64 currentReportMsec = 2;
  repeated KeyToPackageNameMapping keyToPackageNameMapping = 3;
  repeated PayloadLevelAppStat payloadLevelAppStat = 4;
  repeated IpLayerNetworkStat ipLayerNetworkStat = 5;
}
message AndroidUsageStatsReport {
  optional int64 androidId = 1;
  optional int64 loggingId = 2;
  optional UsageStatsExtensionProto usageStats = 3;
}
message AppBucket {
  optional int64 bucketStartMsec = 1;
  optional int64 bucketDurationMsec = 2;
  repeated StatCounters statCounters = 3;
  optional int64 operationCount = 4;
}
message CounterData {
  optional int64 bytes = 1;
  optional int64 packets = 2;
}
message IpLayerAppStat {
  optional int32 packageKey = 1;
  optional int32 applicationTag = 2;
  repeated AppBucket ipLayerAppBucket = 3;
}
message IpLayerNetworkBucket {
  optional int64 bucketStartMsec = 1;
  optional int64 bucketDurationMsec = 2;
  repeated StatCounters statCounters = 3;
  optional int64 networkActiveDuration = 4;
}
message IpLayerNetworkStat {
  optional string networkDetails = 1;
  optional int32 type = 2;
  repeated IpLayerNetworkBucket ipLayerNetworkBucket = 3;
  repeated IpLayerAppStat ipLayerAppStat = 4;
}
message KeyToPackageNameMapping {
  optional int32 packageKey = 1;
  optional string uidName = 2;
  repeated PackageInfo sharedPackageList = 3;
}
message PackageInfo {
  optional string pkgName = 1;
  optional int32 versionCode = 2;
}
message PayloadLevelAppStat {
  optional int32 packageKey = 1;
  optional int32 applicationTag = 2;
  repeated AppBucket payloadLevelAppBucket = 3;
}
message StatCounters {
  optional int32 networkProto = 1;
  optional int32 direction = 2;
  optional CounterData counterData = 3;
  optional int32 fgBg = 4;
}
message UsageStatsExtensionProto {
  optional AndroidDataUsageProto dataUsage = 1;
}
message ModifyLibraryRequest {
  optional string libraryId = 1;
  repeated string addPackageName = 2;
  repeated string removePackageName = 3;
}
message UrlRequestWrapper {
  optional DeveloperAppsRequest developerAppsRequest = 49;
}
message DeveloperAppsRequest {
  optional DeveloperIdContainer developerIdContainer1 = 1;
  optional DeveloperIdContainer developerIdContainer2 = 2;
  optional int32 unknownInt3 = 3;
}
message DeveloperIdContainer {
  optional string developerId = 1;
  optional int32 unknownInt2 = 2;
  optional int32 unknownInt3 = 3;
}
