// This file was generated by Cobalt's Config parser based on the configuration
// YAML in the cobalt_config repository. Edit the YAML there to make changes.
#pragma once

namespace a {
namespace b {
// Metric ID Constants
// Daily rare event counts
const uint32_t kDailyRareEventCountsMetricId = 1;
// Module views
const uint32_t kModuleViewsMetricId = 2;

// Report ID Constants
// Fuchsia Ledger Daily Rare Events
const uint32_t kFuchsiaLedgerDailyRareEventsReportId = 1;
// Fuchsia Module Daily Launch Counts
const uint32_t kFuchsiaModuleDailyLaunchCountsReportId = 2;

// The base64 encoding of the bytes of a serialized CobaltRegistry proto message.
const char kConfig[] = "CmUIChAFGAEyXRUAAIA/OlYKDkxlZGdlci1zdGFydHVwCh1Db21taXRzLXJlY2VpdmVkLW91dC1vZi1vcmRlcgoOQ29tbWl0cy1tZXJnZWQKFU1lcmdlZC1jb21taXRzLW1lcmdlZAoMCAoQBRgCIgQIAhACEpgBCAoQBRgBIhdEYWlseSByYXJlIGV2ZW50IGNvdW50cypJRGFpbHkgY291bnRzIG9mIHNldmVyYWwgZXZlbnRzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIG9jY3VyIHJhcmVseSBpZiBldmVyLjIqCgpFdmVudCBuYW1lEhwKGldoaWNoIHJhcmUgZXZlbnQgb2NjdXJyZWQ/OAISfQgKEAUYAiIMTW9kdWxlIHZpZXdzKjVUcmFja3MgZWFjaCBpbmNpZGVuY2Ugb2Ygdmlld2luZyBhIG1vZHVsZSBieSBpdHMgVVJMLjIuCgN1cmwSJwolVGhlIFVSTCBvZiB0aGUgbW9kdWxlIGJlaW5nIGxhdW5jaGVkLjgCGqQBCAoQBRgBIiBGdWNoc2lhIExlZGdlciBEYWlseSBSYXJlIEV2ZW50cyo8QSBkYWlseSByZXBvcnQgb2YgZXZlbnRzIHRoYXQgYXJlIGV4cGVjdGVkIHRvIGhhcHBlbiByYXJlbHkuMAFCDAoKRXZlbnQgbmFtZVICEANaKAoAEiQKImZ1Y2hzaWEtY29iYWx0LXJlcG9ydHMtcDItdGVzdC1hcHAaoAEIChAFGAIiIkZ1Y2hzaWEgTW9kdWxlIERhaWx5IExhdW5jaCBDb3VudHMqPUEgZGFpbHkgcmVwb3J0IG9mIHRoZSBkYWlseSBjb3VudHMgb2YgbW9kdWxlIGxhdW5jaGVzIGJ5IFVSTC4wAkIFCgN1cmxSAhADWigKABIkCiJmdWNoc2lhLWNvYmFsdC1yZXBvcnRzLXAyLXRlc3QtYXBw";
}
}
