{"action":"created","comment":{"url":"https://api.github.com/repos/keyme/grbl/pulls/comments/86013129","pull_request_review_id":6690894,"id":86013129,"diff_hunk":"@@ -8,45 +8,165 @@\n #include \"limits.h\"\n #include \"protocol.h\"\n #include \"stepper.h\"\n+#include \"report.h\"\n+\n+enum magazine_edge_type {\n+  E_MAGAZINE_EDGE_TYPE_RISING = 0,\n+  E_MAGAZINE_EDGE_TYPE_FALLING\n+};\n+\n+struct probe_window {\n+  int32_t inboard;\n+  int32_t outboard;\n+  bool direction;\n+};\n+\n+static struct {\n+  int32_t delta_pos_limit;\n+  int32_t lash;\n+  int32_t spacing;\n+  struct probe_window probe_events[2];\n+  uint8_t evt_no;\n+  bool on_probe;\n+  uint32_t mag_events;\n+} mag_state;\n+\n \n void magazine_init()\n {\n-  MAGAZINE_ALIGNMENT_DDR &= ~(MAGAZINE_ALIGNMENT_MASK); // Configure as input pin\n-  MAGAZINE_ALIGNMENT_PORT |= MAGAZINE_ALIGNMENT_MASK; // Enable internal pull-up resistors. Normal high operation\n-  memcpy(sys.probe_position, sys.position, sizeof(int32_t) * N_AXIS); // Set the magazine alignment position to the current position\n+  // Configure as input pin\n+  MAGAZINE_ALIGNMENT_DDR &= ~(MAGAZINE_ALIGNMENT_MASK);\n+\n+  // Enable internal pull-up resistors. Normal high operation\n+  MAGAZINE_ALIGNMENT_PORT |= MAGAZINE_ALIGNMENT_MASK;\n+\n+  // Set the magazine alignment position to the current position\n+  memcpy(sys.probe_position, sys.position, sizeof(int32_t) * N_AXIS);\n+}\n+\n+void magazine_gap_reset(void)\n+{\n+  mag_state.delta_pos_limit = settings.mag_gap_limit * settings.steps_per_mm[C_AXIS];\n+}\n+\n+int32_t magazine_lash(void)\n+{\n+  return mag_state.lash;\n+}\n+\n+int32_t magazine_spacing(void)\n+{\n+  return mag_state.spacing;\n+}\n+\n+bool magazine_direction(void)\n+{\n+  // NOTE: the !! here is a binary clamp\n+  return !!(DIRECTION_PORT & get_direction_mask(C_AXIS));\n+}\n+\n+bool magazine_lash_possible(void)\n+{\n+  // Magazine lash is possible when the carousel has changed direction\n+  // since the last magazine flag.\n+  const int last_evt_no = mag_state.evt_no ? 0 : 1;\n+  const struct probe_window *current_event = &mag_state.probe_events[mag_state.evt_no];\n+  const struct probe_window *last_event = &mag_state.probe_events[last_evt_no];\n+\n+  if (mag_state.mag_events < 2) {\n+    return false;\n+  }\n+\n+  return current_event->direction != last_event->direction;\n+}\n+\n+void magazine_calculate_loss(void)\n+{\n+  const int last_evt_no = mag_state.evt_no ? 0 : 1;\n+  const struct probe_window *current_event = &mag_state.probe_events[mag_state.evt_no];\n+  const struct probe_window *last_event = &mag_state.probe_events[last_evt_no];\n+\n+  // Select which slop type we can detect based on whether or not lash\n+  // is possible\n+  int32_t * const property = magazine_lash_possible() ?\n+    &mag_state.lash : &mag_state.spacing;\n+\n+  // Which edge we use as a reference point for our slop calculation\n+  // depends on which direction we are moving in.\n+  if (magazine_direction()) {\n+    *property = abs(current_event->outboard - last_event->outboard);\n+  } else {\n+    *property = abs(current_event->inboard - last_event->inboard);\n+  }\n+}\n+\n+void magazine_record_edge(enum magazine_edge_type edge)\n+{\n+  // Update our edge events based on which direction we are travelling\n+  // in, and whether or not it is a rising or falling edge\n+  struct probe_window *current_event = &mag_state.probe_events[mag_state.evt_no];\n+  if (magazine_direction() ^ (E_MAGAZINE_EDGE_TYPE_RISING == edge)) {\n+    current_event->inboard = sys.position[C_AXIS];\n+  } else {\n+    current_event->outboard = sys.position[C_AXIS];\n+  }\n+}\n+\n+void magazine_loss_detector(const uint8_t magazine_alignment_on)\n+{\n+  // When the probe is detected, copy the current carousel position\n+  // into the probe position. If we were not previously on a flag,\n+  // begin recording a magazine flag event, otherwise, end the event\n+  // and calculate the loss\n+  if (magazine_alignment_on && !mag_state.on_probe) {\n+    mag_state.on_probe = true;\n+    mag_state.probe_events[mag_state.evt_no].direction = magazine_direction();\n+    magazine_record_edge(E_MAGAZINE_EDGE_TYPE_RISING);\n+    mag_state.mag_events++;\n+  } else if (mag_state.on_probe) {\n+    mag_state.on_probe = false;\n+    magazine_record_edge(E_MAGAZINE_EDGE_TYPE_FALLING);\n+    mag_state.evt_no = mag_state.evt_no ? 0 : 1;\n+\n+    magazine_calculate_loss();\n+    request_report(REQUEST_SLOP_REPORT, 0);\n+  }\n+\n }\n \n //KeyMe function\n // Monitors the gap in units between mags and throws an alarm if the gap is larger than a\n-// specified threshold.\n+// specified threshold. Additionally, magazine slop can be calculated\n+// if turned on via compiler flag\n void magazine_gap_monitor()\n {\n   const uint8_t magazine_alignment_on = magazine_get_state();\n-  // When the probe is detected, copy the current position of all axes\n-  // into sys.probe_position\n-  if(magazine_alignment_on){\n-    memcpy(sys.probe_position, sys.position, sizeof(int32_t) * N_AXIS);\n+  // When the probe is detected, copy the current carousel position\n+  // into the probe position\n+  if (magazine_alignment_on) {\n+    sys.probe_position[C_AXIS] = sys.position[C_AXIS];\n   }\n \n-  if(limits.mag_gap_check == 0)\n+#ifdef USE_CAROUSEL_LOSS\n+  magazine_loss_detector(magazine_alignment_on);\n+#endif\n+\n+  if (limits.mag_gap_check == 0) {\n     return;\n+  }\n \n   // Activate alarm if the gap between the current position and the previous\n   // probe position becomes too large. Only do this when the system has already homed\n   const int32_t cur_pos = sys.position[C_AXIS];\n   const int32_t probe_pos = sys.probe_position[C_AXIS];\n-  const int32_t delta_pos_mm = abs(cur_pos - probe_pos) / settings.steps_per_mm[C_AXIS];\n-  if(delta_pos_mm > settings.mag_gap_limit){\n+  const int32_t delta_pos = abs(cur_pos - probe_pos);","path":"magazine.c","position":166,"original_position":166,"commit_id":"fc4e386950b7ccf87613ee72b627aafbed3b3d8a","original_commit_id":"fc4e386950b7ccf87613ee72b627aafbed3b3d8a","user":{"login":"StephanCoetzee","id":17838292,"avatar_url":"https://avatars.githubusercontent.com/u/17838292?v=3","gravatar_id":"","url":"https://api.github.com/users/StephanCoetzee","html_url":"https://github.com/StephanCoetzee","followers_url":"https://api.github.com/users/StephanCoetzee/followers","following_url":"https://api.github.com/users/StephanCoetzee/following{/other_user}","gists_url":"https://api.github.com/users/StephanCoetzee/gists{/gist_id}","starred_url":"https://api.github.com/users/StephanCoetzee/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/StephanCoetzee/subscriptions","organizations_url":"https://api.github.com/users/StephanCoetzee/orgs","repos_url":"https://api.github.com/users/StephanCoetzee/repos","events_url":"https://api.github.com/users/StephanCoetzee/events{/privacy}","received_events_url":"https://api.github.com/users/StephanCoetzee/received_events","type":"User","site_admin":false},"body":"To the question in your other comment - yes, I agree with this.","created_at":"2016-11-01T20:08:27Z","updated_at":"2016-11-01T20:08:27Z","html_url":"https://github.com/keyme/grbl/pull/58#discussion_r86013129","pull_request_url":"https://api.github.com/repos/keyme/grbl/pulls/58","_links":{"self":{"href":"https://api.github.com/repos/keyme/grbl/pulls/comments/86013129"},"html":{"href":"https://github.com/keyme/grbl/pull/58#discussion_r86013129"},"pull_request":{"href":"https://api.github.com/repos/keyme/grbl/pulls/58"}}},"pull_request":{"url":"https://api.github.com/repos/keyme/grbl/pulls/58","id":91849886,"html_url":"https://github.com/keyme/grbl/pull/58","diff_url":"https://github.com/keyme/grbl/pull/58.diff","patch_url":"https://github.com/keyme/grbl/pull/58.patch","issue_url":"https://api.github.com/repos/keyme/grbl/issues/58","number":58,"state":"open","locked":false,"title":"Enable carousel braking.  Add analysis tools","user":{"login":"Jeff-Ciesielski","id":759677,"avatar_url":"https://avatars.githubusercontent.com/u/759677?v=3","gravatar_id":"","url":"https://api.github.com/users/Jeff-Ciesielski","html_url":"https://github.com/Jeff-Ciesielski","followers_url":"https://api.github.com/users/Jeff-Ciesielski/followers","following_url":"https://api.github.com/users/Jeff-Ciesielski/following{/other_user}","gists_url":"https://api.github.com/users/Jeff-Ciesielski/gists{/gist_id}","starred_url":"https://api.github.com/users/Jeff-Ciesielski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Jeff-Ciesielski/subscriptions","organizations_url":"https://api.github.com/users/Jeff-Ciesielski/orgs","repos_url":"https://api.github.com/users/Jeff-Ciesielski/repos","events_url":"https://api.github.com/users/Jeff-Ciesielski/events{/privacy}","received_events_url":"https://api.github.com/users/Jeff-Ciesielski/received_events","type":"User","site_admin":false},"body":"This PR turns on braking for the carousel, which should help to increase overall ejection accuracy.   Additionally, GRBL has been instrumented to add lash/slip detection capabilities via external analysis tools (also included).","created_at":"2016-11-01T19:43:51Z","updated_at":"2016-11-01T20:29:18Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3185bd255a2fe29e03abdb08e4fb1c0c2985a60d","assignee":null,"assignees":[],"milestone":null,"commits_url":"https://api.github.com/repos/keyme/grbl/pulls/58/commits","review_comments_url":"https://api.github.com/repos/keyme/grbl/pulls/58/comments","review_comment_url":"https://api.github.com/repos/keyme/grbl/pulls/comments{/number}","comments_url":"https://api.github.com/repos/keyme/grbl/issues/58/comments","statuses_url":"https://api.github.com/repos/keyme/grbl/statuses/fc4e386950b7ccf87613ee72b627aafbed3b3d8a","head":{"label":"Jeff-Ciesielski:jeff/carousel_slop","ref":"jeff/carousel_slop","sha":"fc4e386950b7ccf87613ee72b627aafbed3b3d8a","user":{"login":"Jeff-Ciesielski","id":759677,"avatar_url":"https://avatars.githubusercontent.com/u/759677?v=3","gravatar_id":"","url":"https://api.github.com/users/Jeff-Ciesielski","html_url":"https://github.com/Jeff-Ciesielski","followers_url":"https://api.github.com/users/Jeff-Ciesielski/followers","following_url":"https://api.github.com/users/Jeff-Ciesielski/following{/other_user}","gists_url":"https://api.github.com/users/Jeff-Ciesielski/gists{/gist_id}","starred_url":"https://api.github.com/users/Jeff-Ciesielski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Jeff-Ciesielski/subscriptions","organizations_url":"https://api.github.com/users/Jeff-Ciesielski/orgs","repos_url":"https://api.github.com/users/Jeff-Ciesielski/repos","events_url":"https://api.github.com/users/Jeff-Ciesielski/events{/privacy}","received_events_url":"https://api.github.com/users/Jeff-Ciesielski/received_events","type":"User","site_admin":false},"repo":{"id":70179623,"name":"grbl","full_name":"Jeff-Ciesielski/grbl","owner":{"login":"Jeff-Ciesielski","id":759677,"avatar_url":"https://avatars.githubusercontent.com/u/759677?v=3","gravatar_id":"","url":"https://api.github.com/users/Jeff-Ciesielski","html_url":"https://github.com/Jeff-Ciesielski","followers_url":"https://api.github.com/users/Jeff-Ciesielski/followers","following_url":"https://api.github.com/users/Jeff-Ciesielski/following{/other_user}","gists_url":"https://api.github.com/users/Jeff-Ciesielski/gists{/gist_id}","starred_url":"https://api.github.com/users/Jeff-Ciesielski/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Jeff-Ciesielski/subscriptions","organizations_url":"https://api.github.com/users/Jeff-Ciesielski/orgs","repos_url":"https://api.github.com/users/Jeff-Ciesielski/repos","events_url":"https://api.github.com/users/Jeff-Ciesielski/events{/privacy}","received_events_url":"https://api.github.com/users/Jeff-Ciesielski/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Jeff-Ciesielski/grbl","description":"An open source, embedded, high performance g-code-parser and CNC milling controller written in optimized C that will run on a straight Arduino","fork":true,"url":"https://api.github.com/repos/Jeff-Ciesielski/grbl","forks_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/forks","keys_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/teams","hooks_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/hooks","issue_events_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/issues/events{/number}","events_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/events","assignees_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/assignees{/user}","branches_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/branches{/branch}","tags_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/tags","blobs_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/git/refs{/sha}","trees_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/statuses/{sha}","languages_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/languages","stargazers_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/stargazers","contributors_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/contributors","subscribers_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/subscribers","subscription_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/subscription","commits_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/commits{/sha}","git_commits_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/git/commits{/sha}","comments_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/comments{/number}","issue_comment_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/issues/comments{/number}","contents_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/contents/{+path}","compare_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/merges","archive_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/downloads","issues_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/issues{/number}","pulls_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/pulls{/number}","milestones_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/milestones{/number}","notifications_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/labels{/name}","releases_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/releases{/id}","deployments_url":"https://api.github.com/repos/Jeff-Ciesielski/grbl/deployments","created_at":"2016-10-06T18:04:20Z","updated_at":"2016-10-06T18:04:21Z","pushed_at":"2016-11-01T19:48:43Z","git_url":"git://github.com/Jeff-Ciesielski/grbl.git","ssh_url":"git@github.com:Jeff-Ciesielski/grbl.git","clone_url":"https://github.com/Jeff-Ciesielski/grbl.git","svn_url":"https://github.com/Jeff-Ciesielski/grbl","homepage":"http://dank.bengler.no/-/page/show/5470_grbl","size":2460,"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":"4axis"}},"base":{"label":"keyme:4axis","ref":"4axis","sha":"09e5088073b480604b59c11a2564b28f090f1e65","user":{"login":"keyme","id":3791919,"avatar_url":"https://avatars.githubusercontent.com/u/3791919?v=3","gravatar_id":"","url":"https://api.github.com/users/keyme","html_url":"https://github.com/keyme","followers_url":"https://api.github.com/users/keyme/followers","following_url":"https://api.github.com/users/keyme/following{/other_user}","gists_url":"https://api.github.com/users/keyme/gists{/gist_id}","starred_url":"https://api.github.com/users/keyme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/keyme/subscriptions","organizations_url":"https://api.github.com/users/keyme/orgs","repos_url":"https://api.github.com/users/keyme/repos","events_url":"https://api.github.com/users/keyme/events{/privacy}","received_events_url":"https://api.github.com/users/keyme/received_events","type":"Organization","site_admin":false},"repo":{"id":22109018,"name":"grbl","full_name":"keyme/grbl","owner":{"login":"keyme","id":3791919,"avatar_url":"https://avatars.githubusercontent.com/u/3791919?v=3","gravatar_id":"","url":"https://api.github.com/users/keyme","html_url":"https://github.com/keyme","followers_url":"https://api.github.com/users/keyme/followers","following_url":"https://api.github.com/users/keyme/following{/other_user}","gists_url":"https://api.github.com/users/keyme/gists{/gist_id}","starred_url":"https://api.github.com/users/keyme/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/keyme/subscriptions","organizations_url":"https://api.github.com/users/keyme/orgs","repos_url":"https://api.github.com/users/keyme/repos","events_url":"https://api.github.com/users/keyme/events{/privacy}","received_events_url":"https://api.github.com/users/keyme/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/keyme/grbl","description":"An open source, embedded, high performance g-code-parser and CNC milling controller written in optimized C that will run on a straight Arduino","fork":true,"url":"https://api.github.com/repos/keyme/grbl","forks_url":"https://api.github.com/repos/keyme/grbl/forks","keys_url":"https://api.github.com/repos/keyme/grbl/keys{/key_id}","collaborators_url":"https://api.github.com/repos/keyme/grbl/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/keyme/grbl/teams","hooks_url":"https://api.github.com/repos/keyme/grbl/hooks","issue_events_url":"https://api.github.com/repos/keyme/grbl/issues/events{/number}","events_url":"https://api.github.com/repos/keyme/grbl/events","assignees_url":"https://api.github.com/repos/keyme/grbl/assignees{/user}","branches_url":"https://api.github.com/repos/keyme/grbl/branches{/branch}","tags_url":"https://api.github.com/repos/keyme/grbl/tags","blobs_url":"https://api.github.com/repos/keyme/grbl/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/keyme/grbl/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/keyme/grbl/git/refs{/sha}","trees_url":"https://api.github.com/repos/keyme/grbl/git/trees{/sha}","statuses_url":"https://api.github.com/repos/keyme/grbl/statuses/{sha}","languages_url":"https://api.github.com/repos/keyme/grbl/languages","stargazers_url":"https://api.github.com/repos/keyme/grbl/stargazers","contributors_url":"https://api.github.com/repos/keyme/grbl/contributors","subscribers_url":"https://api.github.com/repos/keyme/grbl/subscribers","subscription_url":"https://api.github.com/repos/keyme/grbl/subscription","commits_url":"https://api.github.com/repos/keyme/grbl/commits{/sha}","git_commits_url":"https://api.github.com/repos/keyme/grbl/git/commits{/sha}","comments_url":"https://api.github.com/repos/keyme/grbl/comments{/number}","issue_comment_url":"https://api.github.com/repos/keyme/grbl/issues/comments{/number}","contents_url":"https://api.github.com/repos/keyme/grbl/contents/{+path}","compare_url":"https://api.github.com/repos/keyme/grbl/compare/{base}...{head}","merges_url":"https://api.github.com/repos/keyme/grbl/merges","archive_url":"https://api.github.com/repos/keyme/grbl/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/keyme/grbl/downloads","issues_url":"https://api.github.com/repos/keyme/grbl/issues{/number}","pulls_url":"https://api.github.com/repos/keyme/grbl/pulls{/number}","milestones_url":"https://api.github.com/repos/keyme/grbl/milestones{/number}","notifications_url":"https://api.github.com/repos/keyme/grbl/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/keyme/grbl/labels{/name}","releases_url":"https://api.github.com/repos/keyme/grbl/releases{/id}","deployments_url":"https://api.github.com/repos/keyme/grbl/deployments","created_at":"2014-07-22T15:18:06Z","updated_at":"2016-10-24T22:05:49Z","pushed_at":"2016-11-01T19:48:44Z","git_url":"git://github.com/keyme/grbl.git","ssh_url":"git@github.com:keyme/grbl.git","clone_url":"https://github.com/keyme/grbl.git","svn_url":"https://github.com/keyme/grbl","homepage":"http://dank.bengler.no/-/page/show/5470_grbl","size":2518,"stargazers_count":1,"watchers_count":1,"language":"C","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":5,"mirror_url":null,"open_issues_count":5,"forks":5,"open_issues":5,"watchers":1,"default_branch":"4axis"}},"_links":{"self":{"href":"https://api.github.com/repos/keyme/grbl/pulls/58"},"html":{"href":"https://github.com/keyme/grbl/pull/58"},"issue":{"href":"https://api.github.com/repos/keyme/grbl/issues/58"},"comments":{"href":"https://api.github.com/repos/keyme/grbl/issues/58/comments"},"review_comments":{"href":"https://api.github.com/repos/keyme/grbl/pulls/58/comments"},"review_comment":{"href":"https://api.github.com/repos/keyme/grbl/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/keyme/grbl/pulls/58/commits"},"statuses":{"href":"https://api.github.com/repos/keyme/grbl/statuses/fc4e386950b7ccf87613ee72b627aafbed3b3d8a"}}}}
{"actor":{"display_login":"StephanCoetzee"}}