{"action":"created","comment":{"url":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/comments/34383959","id":34383959,"diff_hunk":"@@ -278,8 +279,240 @@ static u8 filter_solution(gnss_solution* soln, dops_t* dops)\n   return 0;\n }\n \n+/** Checks pvt_iter residuals.\n+ *\n+ * \\param n_used length of omp\n+ * \\param omp residual vector calculated by pvt_solve\n+ * \\param rx_state reference to pvt solver state allocated in calc_PVT\n+ * \\param residual If not null, used to output double value of residual\n+ *\n+ * \\return residual < PVT_RESIDUAL_THRESHOLD\n+ */\n+static bool residual_test(u8 n_used, double omp[n_used],\n+                          const double rx_state[],\n+                          double *residual)\n+{\n+  /* Very liberal threshold. Typical range 20 - 120 */\n+#define PVT_RESIDUAL_THRESHOLD 3000\n+\n+  /* Need to add clock offset to observed-minus-predicted calculated by last\n+   * iteration of pvt_solve before computing residual. */\n+  for (int i = 0; i < n_used; i++) {\n+    omp[i] -= rx_state[3];\n+  }\n+  double norm = vector_norm(n_used, omp);\n+  if (residual) {\n+    *residual = norm;\n+  }\n+  return norm < PVT_RESIDUAL_THRESHOLD;\n+}\n+\n+/* Iterates pvt_solve until it converges or PVT_MAX_ITERATIONS is reached.\n+ *\n+ * Return value:\n+ *   0: solution converged\n+ *  -1: solution failed to converge\n+ *\n+ *  Results stored in rx_state, omp, H\n+ */\n+static s8 pvt_iter(double rx_state[],\n+                   const u8 n_used,\n+                   const navigation_measurement_t *nav_meas[n_used],\n+                   double omp[n_used],\n+                   double H[4][4])\n+{\n+  /* Reset state to zero */\n+  for(u8 i=4; i<8; i++) {\n+    rx_state[i] = 0;\n+  }\n+\n+  u8 iters;\n+  /* Newton-Raphson iteration. */\n+  for (iters=0; iters<PVT_MAX_ITERATIONS; iters++) {\n+    if (pvt_solve(rx_state, n_used, nav_meas, omp, H) > 0) {\n+      break;\n+    }\n+  }\n+\n+  if (iters >= PVT_MAX_ITERATIONS) {\n+    /* Reset state if solution fails */\n+    rx_state[0] = 0;\n+    rx_state[1] = 0;\n+    rx_state[2] = 0;\n+    return -1;\n+  }\n+\n+  return 0;\n+}\n+\n+/* See pvt_solve_raim for parameter meanings.\n+ *\n+ * Return values:\n+ *    1: repaired solution, using one fewer observation\n+ *       returns prn of removed measurement if removed_prn ptr is passed\n+ *\n+ *   -1: no reasonable solution possible\n+ *\n+ *  Results stored in rx_state, omp, H\n+ */\n+\n+static s8 pvt_repair(double rx_state[],\n+                     const u8 n_used,\n+                     const navigation_measurement_t nav_meas[n_used],\n+                     double omp[n_used],\n+                     double H[4][4],\n+                     u8 *removed_prn)\n+{\n+  /* Try solving with n-1 navigation measurements. */\n+  s8 one_less = n_used - 1;\n+  s8 bad_sat = -1;\n+  u8 num_passing = 0;\n+\n+  const navigation_measurement_t *nav_meas_subset[n_used];\n+  for (s8 i = 0; i < n_used; i++) {\n+    nav_meas_subset[i] = &nav_meas[i];\n+  }\n+\n+  /* Carefully ordered.\n+   * Permutes nav measurements so that each one is excluded from one test.\n+   */\n+  for (s8 drop = one_less; drop >= 0; drop--) {\n+    /* Swaps the last omitted value with the one at index `drop'.\n+     * On first iteration, does nothing (omits last nav_meas) */\n+    const navigation_measurement_t *temp;\n+    temp = nav_meas_subset[drop];\n+    nav_meas_subset[drop] = nav_meas_subset[one_less];\n+    nav_meas_subset[one_less] = temp;\n+\n+    s8 flag = pvt_iter(rx_state, n_used - 1, nav_meas_subset, omp, H);\n+\n+    if (flag == -1) {\n+      /* Didn't converge. */\n+      // TODO(dsk) this may be unnecessary; use continue instead\n+      return -1;\n+    }\n+\n+    if (residual_test(n_used-1, omp, rx_state, 0)) {\n+      num_passing++;\n+      bad_sat = drop;\n+    }\n+  }\n+\n+  if (num_passing == 1) {\n+    /* Repair is possible by omitting bad_sat. Recalculate that solution. */\n+    for (s8 i = 0; i < n_used; i++) {\n+      nav_meas_subset[i] = &nav_meas[i];\n+    }\n+    nav_meas_subset[bad_sat] = nav_meas_subset[one_less];\n+    s8 flag = pvt_iter(rx_state, n_used - 1, nav_meas_subset, omp, H);\n+    assert(flag == 0);\n+    if (removed_prn) {\n+      *removed_prn = nav_meas[bad_sat].prn;\n+    }\n+    return 1;\n+  } else {\n+    return -1;\n+  }\n+}\n+\n+/* Calculate pvt solution, perform RAIM check, attempt to repair if needed.\n+ *\n+ * See calc_PVT for parameter meanings.\n+ *\n+ * Return values:\n+ *    2: solution ok, but raim check was not used\n+ *         (exactly 4 measurements, or explicitly disabled)\n+ *\n+ *    1: repaired solution, using one fewer observation\n+ *       returns prn of removed measurement if removed_prn ptr is passed\n+ *\n+ *    0: inital solution ok\n+ *\n+ *   -1: repair failed\n+ *   -2: not enough satellites to attempt repair\n+ *   -3: pvt_iter didn't converge\n+ *\n+ *  Results stored in rx_state, H\n+ */\n+static s8 pvt_solve_raim(double rx_state[],\n+                         const u8 n_used,\n+                         const navigation_measurement_t nav_meas[n_used],\n+                         bool disable_raim,\n+                         double H[4][4],\n+                         u8 *removed_prn,\n+                         double residual)\n+{\n+  double omp[n_used];\n+\n+  assert(n_used <= MAX_CHANNELS);\n+\n+  const navigation_measurement_t *nav_meas_ptrs[n_used];\n+  for (s8 i = 0; i < n_used; i++) {\n+    nav_meas_ptrs[i] = &nav_meas[i];\n+  }\n+\n+  s8 flag = pvt_iter(rx_state, n_used, nav_meas_ptrs, omp, H);\n+\n+  if (flag == -1) {\n+    /* Iteration didn't converge. Don't attempt to repair; too CPU intensive. */\n+    return -3;\n+  }\n+  if (flag >= 0 && (disable_raim || residual_test(n_used, omp, rx_state, &residual))) {\n+    /* Solution ok, or raim check disabled. */\n+    if (disable_raim || n_used == 4) {\n+      /* Residual test couldn't have detected an error. */\n+      return 2;\n+    }\n+    return 0;\n+  } else {\n+    if (n_used < 6) {\n+      /* Not enough measurements to repair.\n+       * 6 are needed because a 4 dimensional system is exactly constrained,\n+       * so the bad measurement can't be detected.\n+       */\n+      return -2;\n+    }\n+    return pvt_repair(rx_state, n_used, nav_meas, omp, H, removed_prn);\n+  }\n+}\n+\n+/** Error strings for calc_PVT() negative (failure) return codes.\n+ *  e.g. `pvt_err_msg[-ret - 1]`\n+ *    where `ret` is the return value of calc_PVT(). */\n+const char *pvt_err_msg[] = {\n+  \"PDOP too high\",\n+  \"Altitude unreasonable\",\n+  \"ITAR lockout\",\n+  \"RAIM repair attempted, failed\",\n+  \"RAIM repair impossible (not enough measurements)\",\n+  \"Took too long to converge\",\n+  \"Not enough measurements for solution (< 4)\",\n+};\n+\n+/** Try to calculate a single point gps solution\n+ *\n+ * \\param n_used number of measurments\n+ * \\param nav_meas array of measurements\n+ * \\param disable_raim passing True will omit raim check/repair functionality\n+ * \\param soln output solution struct\n+ * \\param dops output doppler information\n+ * \\return Non-negative values indicate success; refer to pvt_solve_raim.\n+ *         For negative values, refer to pvt_err_msg().\n+ */\n+/*\n+ *  failure:\n+ *   -1: PDOP is too high to yield a good solution.\n+ *   -2: Altitude is unreasonable.\n+ *   -3: Velocity is greater than 1000kts.\n+ *   -4: RAIM check failed and repair was unsuccessful\n+ *   -5: RAIM check failed and repair was impossible (not enough measurements)\n+ *   -6: pvt_iter didn't converge\n+ *   -7: < 4 measurements\n+ */\n+","path":"src/pvt.c","position":328,"original_position":328,"commit_id":"c8445c98f4ebf64bea7fcdec83e070dc5418f9ee","original_commit_id":"c8445c98f4ebf64bea7fcdec83e070dc5418f9ee","user":{"login":"fnoble","id":163239,"avatar_url":"https://avatars.githubusercontent.com/u/163239?v=3","gravatar_id":"","url":"https://api.github.com/users/fnoble","html_url":"https://github.com/fnoble","followers_url":"https://api.github.com/users/fnoble/followers","following_url":"https://api.github.com/users/fnoble/following{/other_user}","gists_url":"https://api.github.com/users/fnoble/gists{/gist_id}","starred_url":"https://api.github.com/users/fnoble/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/fnoble/subscriptions","organizations_url":"https://api.github.com/users/fnoble/orgs","repos_url":"https://api.github.com/users/fnoble/repos","events_url":"https://api.github.com/users/fnoble/events{/privacy}","received_events_url":"https://api.github.com/users/fnoble/received_events","type":"User","site_admin":false},"body":"Get rid of newline","created_at":"2015-07-10T18:44:39Z","updated_at":"2015-07-10T18:44:39Z","html_url":"https://github.com/swift-nav/libswiftnav/pull/156#discussion_r34383959","pull_request_url":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/156","_links":{"self":{"href":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/comments/34383959"},"html":{"href":"https://github.com/swift-nav/libswiftnav/pull/156#discussion_r34383959"},"pull_request":{"href":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/156"}}},"pull_request":{"url":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/156","id":36466457,"html_url":"https://github.com/swift-nav/libswiftnav/pull/156","diff_url":"https://github.com/swift-nav/libswiftnav/pull/156.diff","patch_url":"https://github.com/swift-nav/libswiftnav/pull/156.patch","issue_url":"https://api.github.com/repos/swift-nav/libswiftnav/issues/156","number":156,"state":"open","locked":false,"title":"Integrity","user":{"login":"kovach","id":635136,"avatar_url":"https://avatars.githubusercontent.com/u/635136?v=3","gravatar_id":"","url":"https://api.github.com/users/kovach","html_url":"https://github.com/kovach","followers_url":"https://api.github.com/users/kovach/followers","following_url":"https://api.github.com/users/kovach/following{/other_user}","gists_url":"https://api.github.com/users/kovach/gists{/gist_id}","starred_url":"https://api.github.com/users/kovach/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kovach/subscriptions","organizations_url":"https://api.github.com/users/kovach/orgs","repos_url":"https://api.github.com/users/kovach/repos","events_url":"https://api.github.com/users/kovach/events{/privacy}","received_events_url":"https://api.github.com/users/kovach/received_events","type":"User","site_admin":false},"body":"least-squares residual testing, with extra logging code for analysis\r\n\r\nwork in progress","created_at":"2015-05-29T01:20:36Z","updated_at":"2015-07-10T18:44:39Z","closed_at":null,"merged_at":null,"merge_commit_sha":"4c58e3c33591e660eb2cdf404716937011a1b0f0","assignee":{"login":"kovach","id":635136,"avatar_url":"https://avatars.githubusercontent.com/u/635136?v=3","gravatar_id":"","url":"https://api.github.com/users/kovach","html_url":"https://github.com/kovach","followers_url":"https://api.github.com/users/kovach/followers","following_url":"https://api.github.com/users/kovach/following{/other_user}","gists_url":"https://api.github.com/users/kovach/gists{/gist_id}","starred_url":"https://api.github.com/users/kovach/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kovach/subscriptions","organizations_url":"https://api.github.com/users/kovach/orgs","repos_url":"https://api.github.com/users/kovach/repos","events_url":"https://api.github.com/users/kovach/events{/privacy}","received_events_url":"https://api.github.com/users/kovach/received_events","type":"User","site_admin":false},"milestone":null,"commits_url":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/156/commits","review_comments_url":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/156/comments","review_comment_url":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/comments{/number}","comments_url":"https://api.github.com/repos/swift-nav/libswiftnav/issues/156/comments","statuses_url":"https://api.github.com/repos/swift-nav/libswiftnav/statuses/c8445c98f4ebf64bea7fcdec83e070dc5418f9ee","head":{"label":"kovach:integrity","ref":"integrity","sha":"c8445c98f4ebf64bea7fcdec83e070dc5418f9ee","user":{"login":"kovach","id":635136,"avatar_url":"https://avatars.githubusercontent.com/u/635136?v=3","gravatar_id":"","url":"https://api.github.com/users/kovach","html_url":"https://github.com/kovach","followers_url":"https://api.github.com/users/kovach/followers","following_url":"https://api.github.com/users/kovach/following{/other_user}","gists_url":"https://api.github.com/users/kovach/gists{/gist_id}","starred_url":"https://api.github.com/users/kovach/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kovach/subscriptions","organizations_url":"https://api.github.com/users/kovach/orgs","repos_url":"https://api.github.com/users/kovach/repos","events_url":"https://api.github.com/users/kovach/events{/privacy}","received_events_url":"https://api.github.com/users/kovach/received_events","type":"User","site_admin":false},"repo":{"id":25057091,"name":"libswiftnav","full_name":"kovach/libswiftnav","owner":{"login":"kovach","id":635136,"avatar_url":"https://avatars.githubusercontent.com/u/635136?v=3","gravatar_id":"","url":"https://api.github.com/users/kovach","html_url":"https://github.com/kovach","followers_url":"https://api.github.com/users/kovach/followers","following_url":"https://api.github.com/users/kovach/following{/other_user}","gists_url":"https://api.github.com/users/kovach/gists{/gist_id}","starred_url":"https://api.github.com/users/kovach/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kovach/subscriptions","organizations_url":"https://api.github.com/users/kovach/orgs","repos_url":"https://api.github.com/users/kovach/repos","events_url":"https://api.github.com/users/kovach/events{/privacy}","received_events_url":"https://api.github.com/users/kovach/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kovach/libswiftnav","description":"A portable C library implementing GNSS related functions and algorithms.","fork":true,"url":"https://api.github.com/repos/kovach/libswiftnav","forks_url":"https://api.github.com/repos/kovach/libswiftnav/forks","keys_url":"https://api.github.com/repos/kovach/libswiftnav/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kovach/libswiftnav/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kovach/libswiftnav/teams","hooks_url":"https://api.github.com/repos/kovach/libswiftnav/hooks","issue_events_url":"https://api.github.com/repos/kovach/libswiftnav/issues/events{/number}","events_url":"https://api.github.com/repos/kovach/libswiftnav/events","assignees_url":"https://api.github.com/repos/kovach/libswiftnav/assignees{/user}","branches_url":"https://api.github.com/repos/kovach/libswiftnav/branches{/branch}","tags_url":"https://api.github.com/repos/kovach/libswiftnav/tags","blobs_url":"https://api.github.com/repos/kovach/libswiftnav/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kovach/libswiftnav/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kovach/libswiftnav/git/refs{/sha}","trees_url":"https://api.github.com/repos/kovach/libswiftnav/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kovach/libswiftnav/statuses/{sha}","languages_url":"https://api.github.com/repos/kovach/libswiftnav/languages","stargazers_url":"https://api.github.com/repos/kovach/libswiftnav/stargazers","contributors_url":"https://api.github.com/repos/kovach/libswiftnav/contributors","subscribers_url":"https://api.github.com/repos/kovach/libswiftnav/subscribers","subscription_url":"https://api.github.com/repos/kovach/libswiftnav/subscription","commits_url":"https://api.github.com/repos/kovach/libswiftnav/commits{/sha}","git_commits_url":"https://api.github.com/repos/kovach/libswiftnav/git/commits{/sha}","comments_url":"https://api.github.com/repos/kovach/libswiftnav/comments{/number}","issue_comment_url":"https://api.github.com/repos/kovach/libswiftnav/issues/comments{/number}","contents_url":"https://api.github.com/repos/kovach/libswiftnav/contents/{+path}","compare_url":"https://api.github.com/repos/kovach/libswiftnav/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kovach/libswiftnav/merges","archive_url":"https://api.github.com/repos/kovach/libswiftnav/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kovach/libswiftnav/downloads","issues_url":"https://api.github.com/repos/kovach/libswiftnav/issues{/number}","pulls_url":"https://api.github.com/repos/kovach/libswiftnav/pulls{/number}","milestones_url":"https://api.github.com/repos/kovach/libswiftnav/milestones{/number}","notifications_url":"https://api.github.com/repos/kovach/libswiftnav/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kovach/libswiftnav/labels{/name}","releases_url":"https://api.github.com/repos/kovach/libswiftnav/releases{/id}","created_at":"2014-10-10T23:40:17Z","updated_at":"2015-04-03T00:22:25Z","pushed_at":"2015-07-10T17:46:22Z","git_url":"git://github.com/kovach/libswiftnav.git","ssh_url":"git@github.com:kovach/libswiftnav.git","clone_url":"https://github.com/kovach/libswiftnav.git","svn_url":"https://github.com/kovach/libswiftnav","homepage":"","size":7991,"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":"swift-nav:master","ref":"master","sha":"5adbeb3d3143c4f8b8ea58219cc56793ab485d5e","user":{"login":"swift-nav","id":1069835,"avatar_url":"https://avatars.githubusercontent.com/u/1069835?v=3","gravatar_id":"","url":"https://api.github.com/users/swift-nav","html_url":"https://github.com/swift-nav","followers_url":"https://api.github.com/users/swift-nav/followers","following_url":"https://api.github.com/users/swift-nav/following{/other_user}","gists_url":"https://api.github.com/users/swift-nav/gists{/gist_id}","starred_url":"https://api.github.com/users/swift-nav/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/swift-nav/subscriptions","organizations_url":"https://api.github.com/users/swift-nav/orgs","repos_url":"https://api.github.com/users/swift-nav/repos","events_url":"https://api.github.com/users/swift-nav/events{/privacy}","received_events_url":"https://api.github.com/users/swift-nav/received_events","type":"Organization","site_admin":false},"repo":{"id":7901696,"name":"libswiftnav","full_name":"swift-nav/libswiftnav","owner":{"login":"swift-nav","id":1069835,"avatar_url":"https://avatars.githubusercontent.com/u/1069835?v=3","gravatar_id":"","url":"https://api.github.com/users/swift-nav","html_url":"https://github.com/swift-nav","followers_url":"https://api.github.com/users/swift-nav/followers","following_url":"https://api.github.com/users/swift-nav/following{/other_user}","gists_url":"https://api.github.com/users/swift-nav/gists{/gist_id}","starred_url":"https://api.github.com/users/swift-nav/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/swift-nav/subscriptions","organizations_url":"https://api.github.com/users/swift-nav/orgs","repos_url":"https://api.github.com/users/swift-nav/repos","events_url":"https://api.github.com/users/swift-nav/events{/privacy}","received_events_url":"https://api.github.com/users/swift-nav/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/swift-nav/libswiftnav","description":"A portable C library implementing GNSS related functions and algorithms.","fork":false,"url":"https://api.github.com/repos/swift-nav/libswiftnav","forks_url":"https://api.github.com/repos/swift-nav/libswiftnav/forks","keys_url":"https://api.github.com/repos/swift-nav/libswiftnav/keys{/key_id}","collaborators_url":"https://api.github.com/repos/swift-nav/libswiftnav/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/swift-nav/libswiftnav/teams","hooks_url":"https://api.github.com/repos/swift-nav/libswiftnav/hooks","issue_events_url":"https://api.github.com/repos/swift-nav/libswiftnav/issues/events{/number}","events_url":"https://api.github.com/repos/swift-nav/libswiftnav/events","assignees_url":"https://api.github.com/repos/swift-nav/libswiftnav/assignees{/user}","branches_url":"https://api.github.com/repos/swift-nav/libswiftnav/branches{/branch}","tags_url":"https://api.github.com/repos/swift-nav/libswiftnav/tags","blobs_url":"https://api.github.com/repos/swift-nav/libswiftnav/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/swift-nav/libswiftnav/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/swift-nav/libswiftnav/git/refs{/sha}","trees_url":"https://api.github.com/repos/swift-nav/libswiftnav/git/trees{/sha}","statuses_url":"https://api.github.com/repos/swift-nav/libswiftnav/statuses/{sha}","languages_url":"https://api.github.com/repos/swift-nav/libswiftnav/languages","stargazers_url":"https://api.github.com/repos/swift-nav/libswiftnav/stargazers","contributors_url":"https://api.github.com/repos/swift-nav/libswiftnav/contributors","subscribers_url":"https://api.github.com/repos/swift-nav/libswiftnav/subscribers","subscription_url":"https://api.github.com/repos/swift-nav/libswiftnav/subscription","commits_url":"https://api.github.com/repos/swift-nav/libswiftnav/commits{/sha}","git_commits_url":"https://api.github.com/repos/swift-nav/libswiftnav/git/commits{/sha}","comments_url":"https://api.github.com/repos/swift-nav/libswiftnav/comments{/number}","issue_comment_url":"https://api.github.com/repos/swift-nav/libswiftnav/issues/comments{/number}","contents_url":"https://api.github.com/repos/swift-nav/libswiftnav/contents/{+path}","compare_url":"https://api.github.com/repos/swift-nav/libswiftnav/compare/{base}...{head}","merges_url":"https://api.github.com/repos/swift-nav/libswiftnav/merges","archive_url":"https://api.github.com/repos/swift-nav/libswiftnav/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/swift-nav/libswiftnav/downloads","issues_url":"https://api.github.com/repos/swift-nav/libswiftnav/issues{/number}","pulls_url":"https://api.github.com/repos/swift-nav/libswiftnav/pulls{/number}","milestones_url":"https://api.github.com/repos/swift-nav/libswiftnav/milestones{/number}","notifications_url":"https://api.github.com/repos/swift-nav/libswiftnav/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/swift-nav/libswiftnav/labels{/name}","releases_url":"https://api.github.com/repos/swift-nav/libswiftnav/releases{/id}","created_at":"2013-01-29T21:32:13Z","updated_at":"2015-07-10T07:52:15Z","pushed_at":"2015-07-10T17:47:06Z","git_url":"git://github.com/swift-nav/libswiftnav.git","ssh_url":"git@github.com:swift-nav/libswiftnav.git","clone_url":"https://github.com/swift-nav/libswiftnav.git","svn_url":"https://github.com/swift-nav/libswiftnav","homepage":"","size":17949,"stargazers_count":35,"watchers_count":35,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":45,"mirror_url":null,"open_issues_count":48,"forks":45,"open_issues":48,"watchers":35,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/156"},"html":{"href":"https://github.com/swift-nav/libswiftnav/pull/156"},"issue":{"href":"https://api.github.com/repos/swift-nav/libswiftnav/issues/156"},"comments":{"href":"https://api.github.com/repos/swift-nav/libswiftnav/issues/156/comments"},"review_comments":{"href":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/156/comments"},"review_comment":{"href":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/swift-nav/libswiftnav/pulls/156/commits"},"statuses":{"href":"https://api.github.com/repos/swift-nav/libswiftnav/statuses/c8445c98f4ebf64bea7fcdec83e070dc5418f9ee"}}}}