{"action":"created","comment":{"url":"https://api.github.com/repos/mapsme/omim/pulls/comments/43880240","id":43880240,"diff_hunk":"@@ -27,108 +27,549 @@\n #include <string>\n #include <vector>\n #include <iostream>\n+#include <chrono>\n+#include <type_traits>\n \n namespace osmoh\n {\n-  class Time\n+\n+class Time\n+{\n+  enum State\n   {\n-  public:\n-    enum EFlags\n-    {\n-      eNone = 0,\n-      eHours = 1,\n-      eMinutes = 2,\n-      ePlus = 4,\n-      eMinus = 8,\n-      eExt = 16,\n-      eSunrise = 32,\n-      eSunset = 64\n-    };\n-\n-    uint8_t hours;\n-    uint8_t minutes;\n-    uint8_t flags;\n-\n-    Time() : hours(0), minutes(0), flags(eNone) {}\n-    inline Time & Hours(uint8_t h) { hours = h; flags |= eHours; return *this; }\n-    inline Time & Minutes(uint8_t m) { minutes = m; flags |= eMinutes; return *this; }\n-    inline Time & Sunset() { flags = eSunset; return *this; }\n-    inline Time & Sunrise() { flags = eSunrise; return *this; }\n-\n-    friend std::ostream & operator << (std::ostream & s, Time const & t);\n+    IsNotTime = 0,\n+    HaveHours = 1,\n+    HaveMinutes = 2,\n   };\n \n-  class TimeSpan\n+  using TStateRep = std::underlying_type<State>::type;\n+\n+ public:\n+  enum class Event\n   {\n-  public:\n-    Time from;\n-    Time to;\n-    uint8_t flags;\n-    Time period;\n+    NotEvent,\n+    Dawn,\n+    Sunrise,\n+    Sunset,\n+    Dusk\n+  };\n \n-    TimeSpan() : flags(Time::eNone) {}\n+  using THours = std::chrono::hours;\n+  using TMinutes = std::chrono::minutes;\n \n-    friend std::ostream & operator << (std::ostream & s, TimeSpan const & span);\n-  };\n \n-  class Weekdays\n-  {\n-  public:\n-    uint8_t weekdays;\n-    uint16_t nth;\n-    int32_t offset;\n+  Time() = default;\n+  Time(Time const &) = default;\n+  Time(THours const hours);\n+  Time(TMinutes const minutes);\n+  Time(THours const hours, TMinutes const minutes);\n+  Time(Event const event);\n \n-    Weekdays() : weekdays(0), nth(0), offset(0) {}\n+  Time & operator=(Time const &) = default;\n \n-    friend std::ostream & operator << (std::ostream & s, Weekdays const & w);\n-  };\n+  THours::rep GetHoursCount() const;\n+  TMinutes::rep GetMinutesCount() const;\n+\n+  THours GetHours() const;\n+  TMinutes GetMinutes() const;\n+\n+  void SetHours(THours const hours);\n+  void SetMinutes(TMinutes const minutes);\n+\n+  Event GetEvent() const {return m_event;}\n+  void SetEvent(Event const event);\n+\n+  bool IsEvent() const;\n+  bool IsEventOffset() const;\n+  bool IsHoursMinutes() const;\n+  bool IsMinutes() const;\n+  bool IsTime() const;\n+  bool HasValue() const;\n+\n+  Time operator+(Time const & t);\n+  Time operator-(Time const & t);\n+  Time & operator-();\n+\n+ private:\n+  Time GetEventTime() const;\n+\n+\n+  Event m_event{Event::NotEvent};\n+  TMinutes m_duration{TMinutes::zero()};\n+  TStateRep m_state{State::IsNotTime};\n+};\n+\n+inline constexpr Time::THours operator \"\"_h(uint64_t h)\n+{\n+  return Time::THours(h);\n+}\n+\n+inline constexpr Time::TMinutes operator \"\"_min(uint64_t m)\n+{\n+  return Time::TMinutes(m);\n+}\n+\n+std::ostream & operator<<(std::ostream & ost, Time::Event const event);\n+std::ostream & operator<<(std::ostream & ost, Time const & time);\n+\n+class Timespan\n+{\n+ public:\n+  Timespan() = default;\n+  Timespan(Timespan const &) = default;\n+  Timespan(Time const & start, bool plus = false);\n+  Timespan(Time const & start, Time const & end, bool plus = false);\n+  Timespan(Time const & start, Time const & end, Time const & period);\n+\n+  bool IsEmpty() const;\n+  bool IsOpen() const;\n+  bool HasStart() const;\n+  bool HasEnd() const;\n+  bool HasPlus() const;\n+  bool HasPeriod() const;\n+\n+  Time const & GetStart() const;\n+  Time const & GetEnd() const;\n+  Time const & GetPeriod() const;\n \n-  class State\n+  void SetStart(Time const & start);\n+  void SetEnd(Time const & end);\n+  void SetPeriod(Time const & period);\n+  void SetPlus(bool const plus);\n+\n+  bool IsValid() const;\n+\n+ private:\n+  Time m_start;\n+  Time m_end;\n+  Time m_period;\n+  bool m_plus{false};\n+};\n+\n+using TTimespans = std::vector<Timespan>;\n+\n+std::ostream & operator<<(std::ostream & ost, Timespan const & span);\n+std::ostream & operator<<(std::ostream & ost, osmoh::TTimespans const & timespans);\n+\n+class NthEntry\n+{\n+ public:\n+  enum class Nth\n   {\n-  public:\n-    enum EState {\n-      eUnknown = 0,\n-      eClosed = 1,\n-      eOpen = 2\n-    };\n+    None,\n+    First,\n+    Second,\n+    Third,\n+    Fourth,\n+    Fifth\n+  };\n+\n+\n+  bool IsEmpty() const;\n+  bool HasStart() const;\n+  bool HasEnd() const;\n+\n+  Nth GetStart() const;\n+  Nth GetEnd() const;\n+\n+  void SetStart(Nth const s);\n+  void SetEnd(Nth const e);\n+\n+ private:\n+  Nth m_start{};\n+  Nth m_end{};\n+};\n+\n+std::ostream & operator<<(std::ostream & ost, NthEntry const entry);\n+\n+enum class Weekday\n+{\n+  None,\n+  Sunday,\n+  Monday,\n+  Tuesday,\n+  Wednesday,\n+  Thursday,\n+  Friday,\n+  Saturday\n+};\n+\n+inline constexpr Weekday ToWeekday(uint64_t const day)\n+{\n+  using TDay = decltype(day);\n+  return ((day <= static_cast<TDay>(Weekday::None) ||\n+           day > static_cast<TDay>(Weekday::Saturday))\n+          ? Weekday::None\n+          : static_cast<Weekday>(day));\n+}\n+\n+inline constexpr Weekday operator \"\"_day(uint64_t day)\n+{\n+  return ToWeekday(day);\n+}\n+\n+std::ostream & operator<<(std::ostream & ost, Weekday const wday);\n+\n+class WeekdayRange\n+{\n+  using TNths = std::vector<NthEntry>;\n+\n+ public:\n+  bool HasWday(Weekday const & wday) const;\n+\n+  bool HasSunday() const;\n+  bool HasMonday() const;\n+  bool HasTuesday() const;\n+  bool HasWednesday() const;\n+  bool HasThursday() const;\n+  bool HasFriday() const;\n+  bool HasSaturday() const;\n+\n+  bool HasStart() const;\n+  bool HasEnd() const;\n+  bool IsEmpty() const;\n+\n+  Weekday GetStart() const;\n+  Weekday GetEnd() const;\n+  size_t GetDaysCount() const;\n+\n+  void SetStart(Weekday const & wday);\n+  void SetEnd(Weekday const & wday);\n+\n+  int32_t GetOffset() const;\n+  void SetOffset(int32_t const offset);\n+\n+  bool HasNth() const;\n+  TNths const & GetNths() const;\n+\n+  void AddNth(NthEntry const & entry);\n+\n+ private:\n+  Weekday m_start{};\n+  Weekday m_end{};\n+  int32_t m_offset{};\n+  TNths m_nths;\n+};\n+\n+using TWeekdayRanges = std::vector<WeekdayRange>;\n+\n+std::ostream & operator<<(std::ostream & ost, WeekdayRange const & range);\n+std::ostream & operator<<(std::ostream & ost, TWeekdayRanges const & ranges);\n+\n+class Holiday\n+{\n+ public:\n+  bool IsPlural() const;\n+  void SetPlural(bool const plural);\n+\n+  int32_t GetOffset() const;\n+  void SetOffset(int32_t const offset);\n+\n+ private:\n+  bool m_plural{false};\n+  int32_t m_offset{};\n+};\n+\n+using THolidays = std::vector<Holiday>;\n+\n+std::ostream & operator<<(std::ostream & ost, Holiday const & holiday);\n+std::ostream & operator<<(std::ostream & ost, THolidays const & holidys);\n+\n+/// Correspond to weekday_selector in osm opening hours\n+class Weekdays\n+{\n+ public:\n+  bool IsEmpty() const;\n+  bool HasWeekday() const;\n+  bool HasHolidays() const;\n+\n+  TWeekdayRanges const & GetWeekdayRanges() const;\n+  THolidays const & GetHolidays() const;\n \n-    uint8_t state;\n-    std::string comment;\n+  void SetWeekdayRanges(TWeekdayRanges const ranges);\n+  void SetHolidays(THolidays const & holidays);\n \n-    State() : state(eUnknown) {}\n+  void AddWeekdayRange(WeekdayRange const range);\n+  void AddHoliday(Holiday const & holiday);\n+\n+ private:\n+  TWeekdayRanges m_weekdayRanges;\n+  THolidays m_holidays;\n+};\n+\n+std::ostream & operator<<(std::ostream & ost, Weekdays const & weekday);\n+\n+class DateOffset\n+{\n+ public:\n+  bool IsEmpty() const;\n+  bool HasWDayOffset() const;\n+  bool HasOffset() const;\n+\n+  bool IsWDayOffsetPositive() const;\n+\n+  Weekday GetWDayOffset() const;\n+  int32_t GetOffset() const;\n+\n+  void SetWDayOffset(Weekday const wday);\n+  void SetOffset(int32_t const offset);\n+  void SetWDayOffsetPositive(bool const on);\n+\n+ private:\n+  Weekday m_wday_offset{Weekday::None};\n+  bool m_positive{true};\n+  int32_t m_offset{};\n+};\n+\n+std::ostream & operator<<(std::ostream & ost, DateOffset const & offset);\n+\n+class MonthDay\n+{\n+ public:\n+  enum class Month\n+  {\n+    None,\n+    Jan,\n+    Feb,\n+    Mar,\n+    Apr,\n+    May,\n+    Jun,\n+    Jul,\n+    Aug,\n+    Sep,\n+    Oct,\n+    Nov,\n+    Dec\n   };\n \n-  class TimeRule\n+  enum class VariableDate\n   {\n-  public:\n-    std::vector<Weekdays> weekdays;\n-    std::vector<TimeSpan> timespan;\n-    State state;\n-    uint8_t int_flags = 0;\n+    None,\n+    Easter\n   };\n-} // namespace osmoh\n \n-class OSMTimeRange\n+  using TYear = uint16_t;\n+  using TDayNum = uint8_t;\n+\n+\n+  bool IsEmpty() const;\n+  bool IsVariable() const;\n+\n+  bool HasYear() const;\n+  bool HasMonth() const;\n+  bool HasDayNum() const;\n+  bool HasOffset() const;\n+\n+  TYear GetYear() const;\n+  Month GetMonth() const;\n+  TDayNum GetDayNum() const;\n+  DateOffset const & GetOffset() const;\n+  VariableDate GetVariableDate() const;\n+\n+  void SetYear(TYear const year);\n+  void SetMonth(Month const month);\n+  void SetDayNum(TDayNum const daynum);\n+  void SetOffset(DateOffset const & offset);\n+  void SetVariableDate(VariableDate const date);\n+\n+ private:\n+  TYear m_year{};\n+  Month m_month{Month::None};\n+  TDayNum m_daynum{};\n+  VariableDate m_variable_date{VariableDate::None};\n+  DateOffset m_offset{};\n+};\n+\n+inline constexpr MonthDay::Month ToMonth(uint64_t const month)\n {\n-  std::string m_sourceString;\n-  bool m_valid;\n-  osmoh::State::EState m_state;\n-  std::vector<osmoh::TimeRule> m_rules;\n-  std::string m_comment;\n+  using TMonth = decltype(month);\n+  return ((month <= static_cast<TMonth>(MonthDay::Month::None) ||\n+           month > static_cast<TMonth>(MonthDay::Month::Dec))\n+          ? MonthDay::Month::None\n+          : static_cast<osmoh::MonthDay::Month>(month));\n+}\n \n-public:\n-  OSMTimeRange(std::string const & rules);\n+inline constexpr MonthDay::Month operator \"\"_M(uint64_t month)\n+{\n+  return ToMonth(month);\n+}\n+\n+std::ostream & operator<<(std::ostream & ost, MonthDay::Month const month);\n+std::ostream & operator<<(std::ostream & ost, MonthDay::VariableDate const date);\n+std::ostream & operator<<(std::ostream & ost, MonthDay const md);\n \n-  inline bool IsValid() const { return m_valid; }\n-  inline bool IsOpen() const { return m_state == osmoh::State::eOpen; }\n-  inline bool IsClosed() const { return m_state == osmoh::State::eClosed; }\n-  inline bool IsUnknown() const { return m_state == osmoh::State::eUnknown; }\n-  inline std::string const & Comment() const { return m_comment; }\n+class MonthdayRange\n+{\n+ public:\n+  bool IsEmpty() const;\n+  bool HasStart() const;\n+  bool HasEnd() const;\n+  bool HasPeriod() const;\n+  bool HasPlus() const;\n \n-  OSMTimeRange & operator()(time_t timestamp);\n-  OSMTimeRange & operator()(std::string const & timestr, char const * timefmt=\"%d-%m-%Y %R\");\n+  MonthDay const & GetStart() const;\n+  MonthDay const & GetEnd() const;\n+  uint32_t GetPeriod() const;\n \n-private:\n-  void parse();\n+  void SetStart(MonthDay const & start);\n+  void SetEnd(MonthDay const & end);\n+  void SetPeriod(uint32_t const period);\n+  void SetPlus(bool const plus);\n+\n+ private:\n+  MonthDay m_start;\n+  MonthDay m_end;\n+  uint32_t m_period{};\n+  bool m_plus{false};\n };\n \n+using TMonthdayRanges = std::vector<MonthdayRange>;\n+\n+std::ostream & operator<<(std::ostream & ost, MonthdayRange const & range);\n+std::ostream & operator<<(std::ostream & ost, TMonthdayRanges const & ranges);\n+\n+\n+class YearRange\n+{\n+ public:\n+  using TYear = uint16_t;\n+\n+\n+  bool IsEmpty() const;\n+  bool IsOpen() const;\n+  bool HasStart() const;\n+  bool HasEnd() const;\n+  bool HasPlus() const;\n+  bool HasPeriod() const;\n+\n+  TYear GetStart() const;\n+  TYear GetEnd() const;\n+  uint32_t GetPeriod() const;\n+\n+  void SetStart(TYear const start);\n+  void SetEnd(TYear const end);\n+  void SetPlus(bool const plus);\n+  void SetPeriod(uint32_t const period);\n+\n+ private:\n+  TYear m_start{};\n+  TYear m_end{};\n+  bool m_plus{false};\n+  uint32_t m_period{0};\n+};\n+\n+using TYearRanges = std::vector<YearRange>;\n+\n+std::ostream & operator<<(std::ostream & ost, YearRange const range);\n+std::ostream & operator<<(std::ostream & ost, TYearRanges const ranges);\n+\n+class WeekRange\n+{\n+ public:\n+  using TWeek = uint8_t;\n+\n+\n+  bool IsEmpty() const;\n+  bool IsOpen() const;\n+  bool HasStart() const;\n+  bool HasEnd() const;\n+  bool HasPeriod() const;\n+\n+  TWeek GetStart() const;\n+  TWeek GetEnd() const;\n+  uint32_t GetPeriod() const;\n+\n+  void SetStart(TWeek const start);\n+  void SetEnd(TWeek const end);\n+  void SetPeriod(uint32_t const period);\n+\n+ private:\n+  TWeek m_start{};\n+  TWeek m_end{};\n+  uint32_t m_period{0};\n+};\n+\n+using TWeekRanges = std::vector<WeekRange>;\n+\n+std::ostream & operator<<(std::ostream & ost, WeekRange const range);\n+std::ostream & operator<<(std::ostream & ost, TWeekRanges const ranges);\n+\n+class RuleSequence\n+{\n+ public:\n+  enum class Modifier\n+  {\n+    DefaultOpen,\n+    Open,\n+    Closed,\n+    Unknown\n+  };\n+\n+\n+  bool IsEmpty() const;\n+  bool Is24Per7() const;\n+\n+  bool HasYears() const;\n+  bool HasMonths() const;\n+  bool HasWeeks() const;\n+  bool HasWeekdays() const;\n+  bool HasTimes() const;\n+  bool HasComment() const;\n+  bool HasModifierComment() const;\n+  bool HasSeparatorForReadability() const;\n+\n+  TYearRanges const & GetYears() const;\n+  TMonthdayRanges const & GetMonths() const;\n+  TWeekRanges const & GetWeeks() const;\n+  Weekdays const & GetWeekdays() const;\n+  TTimespans const & GetTimes() const;\n+\n+  std::string const & GetComment() const;\n+  std::string const & GetModifierComment() const;\n+  std::string const & GetAnySeparator() const;\n+\n+  Modifier GetModifier() const;\n+\n+  void Set24Per7(bool const on);\n+  void SetYears(TYearRanges const & years);\n+  void SetMonths(TMonthdayRanges const & months);\n+  void SetWeeks(TWeekRanges const & weeks);\n+\n+  void SetWeekdays(Weekdays const & weekdays);\n+  void SetTimes(TTimespans const & times);\n+\n+  void SetComment(std::string const & comment);\n+  void SetModifierComment(std::string & comment);\n+  void SetAnySeparator(std::string const & separator);\n+  void SetSeparatorForReadability(bool const on);\n+\n+  void SetModifier(Modifier const modifier);\n+\n+ private:\n+  void dump() const;\n+\n+ private:\n+  bool m_24_per_7{false};\n+\n+  TYearRanges m_years;\n+  TMonthdayRanges m_months;\n+  TWeekRanges m_weeks;\n+\n+  Weekdays m_weekdays;\n+  TTimespans m_times;\n+\n+  std::string m_comment;\n+  std::string m_any_separator{\";\"};\n+  bool m_separator_for_readablility{false};","path":"3party/opening_hours/osm_time_range.hpp","position":660,"original_position":662,"commit_id":"5f3fa4465f1f39db69286310b8fe9384f041b019","original_commit_id":"1727d3448f9c96f54148e988806a2cdf45def15e","user":{"login":"mgsergio","id":6658987,"avatar_url":"https://avatars.githubusercontent.com/u/6658987?v=3","gravatar_id":"","url":"https://api.github.com/users/mgsergio","html_url":"https://github.com/mgsergio","followers_url":"https://api.github.com/users/mgsergio/followers","following_url":"https://api.github.com/users/mgsergio/following{/other_user}","gists_url":"https://api.github.com/users/mgsergio/gists{/gist_id}","starred_url":"https://api.github.com/users/mgsergio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mgsergio/subscriptions","organizations_url":"https://api.github.com/users/mgsergio/orgs","repos_url":"https://api.github.com/users/mgsergio/repos","events_url":"https://api.github.com/users/mgsergio/events{/privacy}","received_events_url":"https://api.github.com/users/mgsergio/received_events","type":"User","site_admin":false},"body":"type foo{intit}; Универсальная инициализация из c++11. Она круче тем, что не дает делать\r\nпреобразования стандартных типов с потерей информации. И еще, кода создаешь объект и вызываешь конструктор по умолчанию, компилятор не путает его с объявлением функции.\r\n```\r\nMyClass foo(); // function returning MyClass\r\nMyClass foo{}; // instance of MyClass\r\n```","created_at":"2015-11-04T13:35:51Z","updated_at":"2015-11-04T13:35:51Z","html_url":"https://github.com/mapsme/omim/pull/358#discussion_r43880240","pull_request_url":"https://api.github.com/repos/mapsme/omim/pulls/358","_links":{"self":{"href":"https://api.github.com/repos/mapsme/omim/pulls/comments/43880240"},"html":{"href":"https://github.com/mapsme/omim/pull/358#discussion_r43880240"},"pull_request":{"href":"https://api.github.com/repos/mapsme/omim/pulls/358"}}},"pull_request":{"url":"https://api.github.com/repos/mapsme/omim/pulls/358","id":48552732,"html_url":"https://github.com/mapsme/omim/pull/358","diff_url":"https://github.com/mapsme/omim/pull/358.diff","patch_url":"https://github.com/mapsme/omim/pull/358.patch","issue_url":"https://api.github.com/repos/mapsme/omim/issues/358","number":358,"state":"open","locked":false,"title":"[DO NOT MERGE] Fix old parser","user":{"login":"mgsergio","id":6658987,"avatar_url":"https://avatars.githubusercontent.com/u/6658987?v=3","gravatar_id":"","url":"https://api.github.com/users/mgsergio","html_url":"https://github.com/mgsergio","followers_url":"https://api.github.com/users/mgsergio/followers","following_url":"https://api.github.com/users/mgsergio/following{/other_user}","gists_url":"https://api.github.com/users/mgsergio/gists{/gist_id}","starred_url":"https://api.github.com/users/mgsergio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mgsergio/subscriptions","organizations_url":"https://api.github.com/users/mgsergio/orgs","repos_url":"https://api.github.com/users/mgsergio/repos","events_url":"https://api.github.com/users/mgsergio/events{/privacy}","received_events_url":"https://api.github.com/users/mgsergio/received_events","type":"User","site_admin":false},"body":"Make parsing code more readable, maintainable, and predictable.\r\nOne can test every selector independently. ","created_at":"2015-10-23T08:14:29Z","updated_at":"2015-11-04T13:35:51Z","closed_at":null,"merged_at":null,"merge_commit_sha":"25c4a3043984accdbcb6067b2c1e40d6f1b4dead","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/mapsme/omim/pulls/358/commits","review_comments_url":"https://api.github.com/repos/mapsme/omim/pulls/358/comments","review_comment_url":"https://api.github.com/repos/mapsme/omim/pulls/comments{/number}","comments_url":"https://api.github.com/repos/mapsme/omim/issues/358/comments","statuses_url":"https://api.github.com/repos/mapsme/omim/statuses/5f3fa4465f1f39db69286310b8fe9384f041b019","head":{"label":"mgsergio:fix-old-parser","ref":"fix-old-parser","sha":"5f3fa4465f1f39db69286310b8fe9384f041b019","user":{"login":"mgsergio","id":6658987,"avatar_url":"https://avatars.githubusercontent.com/u/6658987?v=3","gravatar_id":"","url":"https://api.github.com/users/mgsergio","html_url":"https://github.com/mgsergio","followers_url":"https://api.github.com/users/mgsergio/followers","following_url":"https://api.github.com/users/mgsergio/following{/other_user}","gists_url":"https://api.github.com/users/mgsergio/gists{/gist_id}","starred_url":"https://api.github.com/users/mgsergio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mgsergio/subscriptions","organizations_url":"https://api.github.com/users/mgsergio/orgs","repos_url":"https://api.github.com/users/mgsergio/repos","events_url":"https://api.github.com/users/mgsergio/events{/privacy}","received_events_url":"https://api.github.com/users/mgsergio/received_events","type":"User","site_admin":false},"repo":{"id":43430406,"name":"omim","full_name":"mgsergio/omim","owner":{"login":"mgsergio","id":6658987,"avatar_url":"https://avatars.githubusercontent.com/u/6658987?v=3","gravatar_id":"","url":"https://api.github.com/users/mgsergio","html_url":"https://github.com/mgsergio","followers_url":"https://api.github.com/users/mgsergio/followers","following_url":"https://api.github.com/users/mgsergio/following{/other_user}","gists_url":"https://api.github.com/users/mgsergio/gists{/gist_id}","starred_url":"https://api.github.com/users/mgsergio/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mgsergio/subscriptions","organizations_url":"https://api.github.com/users/mgsergio/orgs","repos_url":"https://api.github.com/users/mgsergio/repos","events_url":"https://api.github.com/users/mgsergio/events{/privacy}","received_events_url":"https://api.github.com/users/mgsergio/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/mgsergio/omim","description":"MAPS.ME - Offline OpenStreetMap maps for iOS/Android/Mac/Linux/Windows","fork":true,"url":"https://api.github.com/repos/mgsergio/omim","forks_url":"https://api.github.com/repos/mgsergio/omim/forks","keys_url":"https://api.github.com/repos/mgsergio/omim/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mgsergio/omim/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mgsergio/omim/teams","hooks_url":"https://api.github.com/repos/mgsergio/omim/hooks","issue_events_url":"https://api.github.com/repos/mgsergio/omim/issues/events{/number}","events_url":"https://api.github.com/repos/mgsergio/omim/events","assignees_url":"https://api.github.com/repos/mgsergio/omim/assignees{/user}","branches_url":"https://api.github.com/repos/mgsergio/omim/branches{/branch}","tags_url":"https://api.github.com/repos/mgsergio/omim/tags","blobs_url":"https://api.github.com/repos/mgsergio/omim/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mgsergio/omim/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mgsergio/omim/git/refs{/sha}","trees_url":"https://api.github.com/repos/mgsergio/omim/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mgsergio/omim/statuses/{sha}","languages_url":"https://api.github.com/repos/mgsergio/omim/languages","stargazers_url":"https://api.github.com/repos/mgsergio/omim/stargazers","contributors_url":"https://api.github.com/repos/mgsergio/omim/contributors","subscribers_url":"https://api.github.com/repos/mgsergio/omim/subscribers","subscription_url":"https://api.github.com/repos/mgsergio/omim/subscription","commits_url":"https://api.github.com/repos/mgsergio/omim/commits{/sha}","git_commits_url":"https://api.github.com/repos/mgsergio/omim/git/commits{/sha}","comments_url":"https://api.github.com/repos/mgsergio/omim/comments{/number}","issue_comment_url":"https://api.github.com/repos/mgsergio/omim/issues/comments{/number}","contents_url":"https://api.github.com/repos/mgsergio/omim/contents/{+path}","compare_url":"https://api.github.com/repos/mgsergio/omim/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mgsergio/omim/merges","archive_url":"https://api.github.com/repos/mgsergio/omim/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mgsergio/omim/downloads","issues_url":"https://api.github.com/repos/mgsergio/omim/issues{/number}","pulls_url":"https://api.github.com/repos/mgsergio/omim/pulls{/number}","milestones_url":"https://api.github.com/repos/mgsergio/omim/milestones{/number}","notifications_url":"https://api.github.com/repos/mgsergio/omim/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mgsergio/omim/labels{/name}","releases_url":"https://api.github.com/repos/mgsergio/omim/releases{/id}","created_at":"2015-09-30T11:59:31Z","updated_at":"2015-09-30T12:01:39Z","pushed_at":"2015-11-04T13:14:26Z","git_url":"git://github.com/mgsergio/omim.git","ssh_url":"git@github.com:mgsergio/omim.git","clone_url":"https://github.com/mgsergio/omim.git","svn_url":"https://github.com/mgsergio/omim","homepage":null,"size":1817838,"stargazers_count":0,"watchers_count":0,"language":"C++","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"mapsme:master","ref":"master","sha":"488a71d5d588bddf563314d9b3b54e3988e427a6","user":{"login":"mapsme","id":14185141,"avatar_url":"https://avatars.githubusercontent.com/u/14185141?v=3","gravatar_id":"","url":"https://api.github.com/users/mapsme","html_url":"https://github.com/mapsme","followers_url":"https://api.github.com/users/mapsme/followers","following_url":"https://api.github.com/users/mapsme/following{/other_user}","gists_url":"https://api.github.com/users/mapsme/gists{/gist_id}","starred_url":"https://api.github.com/users/mapsme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mapsme/subscriptions","organizations_url":"https://api.github.com/users/mapsme/orgs","repos_url":"https://api.github.com/users/mapsme/repos","events_url":"https://api.github.com/users/mapsme/events{/privacy}","received_events_url":"https://api.github.com/users/mapsme/received_events","type":"Organization","site_admin":false},"repo":{"id":42798033,"name":"omim","full_name":"mapsme/omim","owner":{"login":"mapsme","id":14185141,"avatar_url":"https://avatars.githubusercontent.com/u/14185141?v=3","gravatar_id":"","url":"https://api.github.com/users/mapsme","html_url":"https://github.com/mapsme","followers_url":"https://api.github.com/users/mapsme/followers","following_url":"https://api.github.com/users/mapsme/following{/other_user}","gists_url":"https://api.github.com/users/mapsme/gists{/gist_id}","starred_url":"https://api.github.com/users/mapsme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mapsme/subscriptions","organizations_url":"https://api.github.com/users/mapsme/orgs","repos_url":"https://api.github.com/users/mapsme/repos","events_url":"https://api.github.com/users/mapsme/events{/privacy}","received_events_url":"https://api.github.com/users/mapsme/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/mapsme/omim","description":"MAPS.ME - Offline OpenStreetMap maps for iOS/Android/Mac/Linux/Windows","fork":false,"url":"https://api.github.com/repos/mapsme/omim","forks_url":"https://api.github.com/repos/mapsme/omim/forks","keys_url":"https://api.github.com/repos/mapsme/omim/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mapsme/omim/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mapsme/omim/teams","hooks_url":"https://api.github.com/repos/mapsme/omim/hooks","issue_events_url":"https://api.github.com/repos/mapsme/omim/issues/events{/number}","events_url":"https://api.github.com/repos/mapsme/omim/events","assignees_url":"https://api.github.com/repos/mapsme/omim/assignees{/user}","branches_url":"https://api.github.com/repos/mapsme/omim/branches{/branch}","tags_url":"https://api.github.com/repos/mapsme/omim/tags","blobs_url":"https://api.github.com/repos/mapsme/omim/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mapsme/omim/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mapsme/omim/git/refs{/sha}","trees_url":"https://api.github.com/repos/mapsme/omim/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mapsme/omim/statuses/{sha}","languages_url":"https://api.github.com/repos/mapsme/omim/languages","stargazers_url":"https://api.github.com/repos/mapsme/omim/stargazers","contributors_url":"https://api.github.com/repos/mapsme/omim/contributors","subscribers_url":"https://api.github.com/repos/mapsme/omim/subscribers","subscription_url":"https://api.github.com/repos/mapsme/omim/subscription","commits_url":"https://api.github.com/repos/mapsme/omim/commits{/sha}","git_commits_url":"https://api.github.com/repos/mapsme/omim/git/commits{/sha}","comments_url":"https://api.github.com/repos/mapsme/omim/comments{/number}","issue_comment_url":"https://api.github.com/repos/mapsme/omim/issues/comments{/number}","contents_url":"https://api.github.com/repos/mapsme/omim/contents/{+path}","compare_url":"https://api.github.com/repos/mapsme/omim/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mapsme/omim/merges","archive_url":"https://api.github.com/repos/mapsme/omim/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mapsme/omim/downloads","issues_url":"https://api.github.com/repos/mapsme/omim/issues{/number}","pulls_url":"https://api.github.com/repos/mapsme/omim/pulls{/number}","milestones_url":"https://api.github.com/repos/mapsme/omim/milestones{/number}","notifications_url":"https://api.github.com/repos/mapsme/omim/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mapsme/omim/labels{/name}","releases_url":"https://api.github.com/repos/mapsme/omim/releases{/id}","created_at":"2015-09-20T02:57:13Z","updated_at":"2015-11-04T12:06:57Z","pushed_at":"2015-11-04T13:19:53Z","git_url":"git://github.com/mapsme/omim.git","ssh_url":"git@github.com:mapsme/omim.git","clone_url":"https://github.com/mapsme/omim.git","svn_url":"https://github.com/mapsme/omim","homepage":null,"size":1904220,"stargazers_count":1448,"watchers_count":1448,"language":"C++","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":161,"mirror_url":null,"open_issues_count":55,"forks":161,"open_issues":55,"watchers":1448,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/mapsme/omim/pulls/358"},"html":{"href":"https://github.com/mapsme/omim/pull/358"},"issue":{"href":"https://api.github.com/repos/mapsme/omim/issues/358"},"comments":{"href":"https://api.github.com/repos/mapsme/omim/issues/358/comments"},"review_comments":{"href":"https://api.github.com/repos/mapsme/omim/pulls/358/comments"},"review_comment":{"href":"https://api.github.com/repos/mapsme/omim/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/mapsme/omim/pulls/358/commits"},"statuses":{"href":"https://api.github.com/repos/mapsme/omim/statuses/5f3fa4465f1f39db69286310b8fe9384f041b019"}}}}