{"action":"created","comment":{"url":"https://api.github.com/repos/angular/material/pulls/comments/32598318","id":32598318,"diff_hunk":"@@ -0,0 +1,452 @@\n+/**\n+ * @ngdoc module\n+ * @name material.components.virtualRepeat\n+ */\n+angular.module('material.components.virtualRepeat', [\n+  'material.core',\n+  'material.core.gestures'\n+])\n+.directive('mdVirtualRepeatContainer', VirtualRepeatContainerDirective)\n+.directive('mdVirtualRepeat', VirtualRepeatDirective);\n+\n+\n+/**\n+ * @ngdoc directive\n+ * @name mdVirtualRepeatContainer\n+ * @module material.components.virtualRepeat\n+ * @restrict E\n+ * @description\n+ * `md-virtual-repeat-container` provides the scroll container for md-virtual-repeat.\n+ *\n+ * Virtual repeat is a limited substitute for ng-repeat that allows renders only\n+ * enough dom nodes to fill the container and recycling them as the user scrolls.\n+ *\n+ * @usage\n+ * <hljs lang=\"html\">\n+ * <md-virtual-repeat-container md-horizonal>\n+ *   <div md-virtual-repeat=\"i in items\">Hello {{i}}!</div>\n+ * </md-virtual-repeat-containr>\n+ *\n+ * <md-virtual-repeat-container md-horizonal>\n+ *   <div md-virtual-repeat=\"i in items\">Hello {{i}}!</div>\n+ * </md-virtual-repeat-containr>\n+ * </hljs>\n+ *\n+ * @param {boolean=} md-horizontal Whether the container should scroll horizontally\n+ *     (defaults to scrolling vertically).\n+ */\n+function VirtualRepeatContainerDirective() {\n+  return {\n+    controller: VirtualRepeatContainerController,\n+    replace: true,\n+    require: 'virtualRepeatContainer',\n+    restrict: 'E',\n+    template: VirtualRepeatContainerTemplate\n+  };\n+}\n+\n+\n+function VirtualRepeatContainerTemplate($element, $attrs) {\n+  var innerHtml = $element[0].innerHTML;\n+  $element[0].innerHTML = '';\n+  // TODO: we probably don't need the container anymore.\n+  return '<div class=\"md-virtual-repeat-container ' +\n+      ($attrs.mdHorizontal ? 'md-horizontal' : 'md-vertical') + '\">' +\n+    '<div class=\"md-virtual-repeat-scroller\">' +\n+      '<div class=\"md-virtual-repeat-sizer\"></div>' +\n+      '<div class=\"md-virtual-repeat-offsetter\">' +\n+        innerHtml +\n+      '</div>' +\n+    '</div>' +\n+  '</div>';\n+}\n+\n+\n+function VirtualRepeatContainerController($scope, $element, $attrs, $timeout, $window) {\n+  this.$scope = $scope;\n+  this.$element = $element;\n+  this.$attrs = $attrs;\n+  this.$timeout = $timeout;\n+  this.$window = $window;\n+\n+  this.size = 0;\n+  this.scrollSize = 0;\n+  this.scrollOffset = 0;\n+  this.repeater = null;\n+\n+  this.scroller = $element[0].getElementsByClassName('md-virtual-repeat-scroller')[0];\n+  this.sizer = this.scroller.getElementsByClassName('md-virtual-repeat-sizer')[0];\n+  this.offsetter = this.scroller.getElementsByClassName('md-virtual-repeat-offsetter')[0];\n+\n+  this.handleScroll_ = angular.bind(this, this.handleScroll_, !!$attrs.mdHorizontal);\n+\n+  $window.requestAnimationFrame(angular.bind(this, this.updateSize));\n+  if ($attrs.ngHide) {\n+    $scope.$watch($attrs.ngHide, angular.bind(this, function(hidden) {\n+      if (!hidden) {\n+        $window.requestAnimationFrame(angular.bind(this, this.updateSize));\n+      }\n+    }));\n+  }\n+}\n+\n+\n+/** Called by the md-virtual-repeat inside of the container at startup. */\n+VirtualRepeatContainerController.prototype.register = function(repeaterCtrl) {\n+  this.repeater = repeaterCtrl;\n+  \n+  angular.element(this.scroller)\n+      .on('scroll wheel touchmove touchend', this.handleScroll_);\n+};\n+\n+\n+/** @return {boolean} Whether the container is configured for horizontal scrolling. */\n+VirtualRepeatContainerController.prototype.isHorizontal = function() {\n+  return !!this.$attrs.mdHorizontal;\n+};\n+\n+\n+/** @return {number} The size (width or height) of the container. */\n+VirtualRepeatContainerController.prototype.getSize = function() {\n+  return this.size;\n+};\n+\n+\n+/** Instructs the container to re-measure its size. */\n+VirtualRepeatContainerController.prototype.updateSize = function() {\n+  this.size = this.$attrs.mdHorizontal\n+      ? this.$element[0].clientWidth\n+      : this.$element[0].clientHeight;\n+  this.repeater && this.repeater.containerUpdated();\n+};\n+\n+\n+/** @return {number} The container's scrollHeight or scrollWidth. */\n+VirtualRepeatContainerController.prototype.getScrollSize = function() {\n+  return this.scrollSize;\n+};\n+\n+\n+/**\n+ * Sets the scrollHeight or scrollWidth. Called by the repeater based on\n+ * its item count and item size.\n+ * @param {number} The new size.\n+ */\n+VirtualRepeatContainerController.prototype.setScrollSize = function(size) {\n+  if (this.scrollSize !== size) {\n+    this.sizer.style[this.$attrs.mdHorizontal ? 'width' : 'height'] = size + 'px';\n+  }\n+\n+  this.scrollSize = size;\n+};\n+\n+\n+/** @return {number} The container's current scroll offset. */\n+VirtualRepeatContainerController.prototype.getScrollOffset = function() {\n+  return this.scrollOffset;\n+};\n+\n+\n+VirtualRepeatContainerController.prototype.resetScroll = function() {\n+  this.scroller[this.$attrs.mdHorizontal ? 'scrollLeft' : 'scrollTop'] = 0;\n+  this.handleScroll_(!!this.$attrs.mdHorizontal);\n+};\n+\n+\n+VirtualRepeatContainerController.prototype.handleScroll_ = function(horizontal) {\n+  var NUM_EXTRA = 3;\n+\n+  var transform, offset;\n+  if (horizontal) {\n+    offset = this.scroller.scrollLeft;\n+    transform = 'translateX(';\n+  } else {\n+    offset = this.scroller.scrollTop;\n+    transform = 'translateY(';\n+  }\n+\n+  if (offset === this.scrollOffset) return;\n+  this.scrollOffset = offset;\n+\n+  var itemSize = this.repeater.getItemSize();\n+  transform += Math.max(0,\n+      Math.floor(this.scrollOffset / itemSize) - NUM_EXTRA) * itemSize + 'px)';\n+\n+  this.offsetter.style.webkitTransform = transform;\n+  this.offsetter.style.transform = transform;\n+\n+  this.repeater.containerUpdated();\n+};\n+\n+\n+/**\n+ * @ngdoc directive\n+ * @name mdVirtualRepeat\n+ * @module material.components.virtualRepeat\n+ * @restrict A\n+ * @description\n+ * `md-virtual-repeat` specifies an element to repeat using virtual scrolling.\n+ *\n+ * Virtual repeat is a limited substitute for ng-repeat that allows renders only\n+ * enough dom nodes to fill the container and recycling them as the user scrolls.\n+ *\n+ * @usage\n+ * <hljs lang=\"html\">\n+ * <md-virtual-repeat-container md-horizonal>\n+ *   <div md-virtual-repeat=\"i in items\">Hello {{i}}!</div>\n+ * </md-virtual-repeat-containr>\n+ *\n+ * <md-virtual-repeat-container md-horizonal>\n+ *   <div md-virtual-repeat=\"i in items\">Hello {{i}}!</div>\n+ * </md-virtual-repeat-containr>\n+ * </hljs>\n+ *\n+ * @param {number=} md-size The height or width of the repeated elements (which\n+ *     must be identical for each element). TODO: If absent, the directive will attempt to\n+ *     measure the computed style of the element at startup.\n+ */\n+function VirtualRepeatDirective($parse) {\n+  return {\n+    controller: VirtualRepeatController,\n+    priority: 1000,\n+    require: ['mdVirtualRepeat', '^mdVirtualRepeatContainer'],\n+    restrict: 'A',\n+    terminal: true,\n+    transclude: 'element',\n+    compile: function VirtualRepeatCompile($element, $attrs) {\n+      var expression = $attrs.mdVirtualRepeat;\n+      var match = expression.match(/^\\s*([\\s\\S]+?)\\s+in\\s+([\\s\\S]+?)\\s*$/);\n+      var lhs = match[1];\n+      var rhs = $parse(match[2]);\n+      var extraName = $attrs.mdExtraName && $parse($attrs.mdExtraName);\n+\n+      return function VirtualRepeatLink($scope, $element, $attrs, ctrl, $transclude) {\n+        ctrl[0].link_(ctrl[1], $transclude, lhs, rhs, extraName);\n+      };\n+    }\n+  };\n+}\n+\n+\n+function VirtualRepeatController($scope, $element, $attrs, $browser, $document) {\n+  this.$scope = $scope;\n+  this.$element = $element;\n+  this.$attrs = $attrs;\n+  this.$browser = $browser;\n+  this.$document = $document;\n+\n+  this.browserCheckUrlChange = $browser.$$checkUrlChange;\n+  this.newStartIndex = 0;\n+  this.newEndIndex = 0;\n+  this.startIndex = 0;\n+  this.endIndex = 0;\n+  // TODO: measure width/height of first element from dom if not provided.\n+  // getComputedStyle?\n+  this.itemSize = $scope.$eval($attrs.mdSize);\n+  this.blocks = {};\n+  this.pooledBlocks = [];\n+}\n+\n+\n+/**\n+ * Called at startup by the md-virtual-repeat postLink function.\n+ * @param {!VirtualRepeatContainerController} The container's controller.\n+ * @param {!Function} The repeated element's bound transclude function.\n+ * @param {string} lhs The left hand side of the repeat expression, indicating\n+ *     the name for each item in the array.\n+ * @param {!Function} rhs A compiled expression based on the right hand side\n+ *     of the repeat expression. Points to the array to repeat over.\n+ */\n+VirtualRepeatController.prototype.link_ = function(container, transclude, lhs, rhs, extraName) {\n+  this.container = container;\n+  this.transclude = transclude;\n+  this.lhs = lhs;\n+  this.rhs = rhs;\n+  this.extraName = extraName;\n+  this.sized = false;\n+\n+  this.container.register(this);\n+};\n+\n+\n+/**\n+ * Called by the container. Informs us that the containers scroll or size has\n+ * changed.\n+ */\n+VirtualRepeatController.prototype.containerUpdated = function() {\n+  if (!this.sized) {\n+    this.sized = true;\n+    this.$scope.$watchCollection(this.rhs, angular.bind(this, this.virtualRepeatUpdate_));\n+    this.items = this.rhs(this.$scope);","path":"src/components/virtualRepeater/virtualRepeater.js","position":280,"original_position":280,"commit_id":"fe30ec6b785ce2cdd7973b06246405fb5c8e297d","original_commit_id":"fe30ec6b785ce2cdd7973b06246405fb5c8e297d","user":{"login":"gkalpak","id":8604205,"avatar_url":"https://avatars.githubusercontent.com/u/8604205?v=3","gravatar_id":"","url":"https://api.github.com/users/gkalpak","html_url":"https://github.com/gkalpak","followers_url":"https://api.github.com/users/gkalpak/followers","following_url":"https://api.github.com/users/gkalpak/following{/other_user}","gists_url":"https://api.github.com/users/gkalpak/gists{/gist_id}","starred_url":"https://api.github.com/users/gkalpak/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/gkalpak/subscriptions","organizations_url":"https://api.github.com/users/gkalpak/orgs","repos_url":"https://api.github.com/users/gkalpak/repos","events_url":"https://api.github.com/users/gkalpak/events{/privacy}","received_events_url":"https://api.github.com/users/gkalpak/received_events","type":"User","site_admin":false},"body":"This is redundant (I think) - `$watchCollection()` will take care of that.","created_at":"2015-06-17T06:29:14Z","updated_at":"2015-06-17T06:29:14Z","html_url":"https://github.com/angular/material/pull/3301#discussion_r32598318","pull_request_url":"https://api.github.com/repos/angular/material/pulls/3301","_links":{"self":{"href":"https://api.github.com/repos/angular/material/pulls/comments/32598318"},"html":{"href":"https://github.com/angular/material/pull/3301#discussion_r32598318"},"pull_request":{"href":"https://api.github.com/repos/angular/material/pulls/3301"}}},"pull_request":{"url":"https://api.github.com/repos/angular/material/pulls/3301","id":37851042,"html_url":"https://github.com/angular/material/pull/3301","diff_url":"https://github.com/angular/material/pull/3301.diff","patch_url":"https://github.com/angular/material/pull/3301.patch","issue_url":"https://api.github.com/repos/angular/material/issues/3301","number":3301,"state":"open","locked":false,"title":"feat(Virtual repeater): Initial implementation","user":{"login":"kseamon","id":923677,"avatar_url":"https://avatars.githubusercontent.com/u/923677?v=3","gravatar_id":"","url":"https://api.github.com/users/kseamon","html_url":"https://github.com/kseamon","followers_url":"https://api.github.com/users/kseamon/followers","following_url":"https://api.github.com/users/kseamon/following{/other_user}","gists_url":"https://api.github.com/users/kseamon/gists{/gist_id}","starred_url":"https://api.github.com/users/kseamon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kseamon/subscriptions","organizations_url":"https://api.github.com/users/kseamon/orgs","repos_url":"https://api.github.com/users/kseamon/repos","events_url":"https://api.github.com/users/kseamon/events{/privacy}","received_events_url":"https://api.github.com/users/kseamon/received_events","type":"User","site_admin":false},"body":"Implements a virtual repeater to use instead of ng-repeat for substantially\r\nbetter performance in components.\r\n\r\nAlso tweaks the karma config to include component css.","created_at":"2015-06-16T23:01:13Z","updated_at":"2015-06-17T06:29:14Z","closed_at":null,"merged_at":null,"merge_commit_sha":"0d7f184dc196418ff794008e457e5291b2b8e185","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/angular/material/pulls/3301/commits","review_comments_url":"https://api.github.com/repos/angular/material/pulls/3301/comments","review_comment_url":"https://api.github.com/repos/angular/material/pulls/comments{/number}","comments_url":"https://api.github.com/repos/angular/material/issues/3301/comments","statuses_url":"https://api.github.com/repos/angular/material/statuses/fe30ec6b785ce2cdd7973b06246405fb5c8e297d","head":{"label":"kseamon:virtual-pr-rebase","ref":"virtual-pr-rebase","sha":"fe30ec6b785ce2cdd7973b06246405fb5c8e297d","user":{"login":"kseamon","id":923677,"avatar_url":"https://avatars.githubusercontent.com/u/923677?v=3","gravatar_id":"","url":"https://api.github.com/users/kseamon","html_url":"https://github.com/kseamon","followers_url":"https://api.github.com/users/kseamon/followers","following_url":"https://api.github.com/users/kseamon/following{/other_user}","gists_url":"https://api.github.com/users/kseamon/gists{/gist_id}","starred_url":"https://api.github.com/users/kseamon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kseamon/subscriptions","organizations_url":"https://api.github.com/users/kseamon/orgs","repos_url":"https://api.github.com/users/kseamon/repos","events_url":"https://api.github.com/users/kseamon/events{/privacy}","received_events_url":"https://api.github.com/users/kseamon/received_events","type":"User","site_admin":false},"repo":{"id":26448555,"name":"material","full_name":"kseamon/material","owner":{"login":"kseamon","id":923677,"avatar_url":"https://avatars.githubusercontent.com/u/923677?v=3","gravatar_id":"","url":"https://api.github.com/users/kseamon","html_url":"https://github.com/kseamon","followers_url":"https://api.github.com/users/kseamon/followers","following_url":"https://api.github.com/users/kseamon/following{/other_user}","gists_url":"https://api.github.com/users/kseamon/gists{/gist_id}","starred_url":"https://api.github.com/users/kseamon/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kseamon/subscriptions","organizations_url":"https://api.github.com/users/kseamon/orgs","repos_url":"https://api.github.com/users/kseamon/repos","events_url":"https://api.github.com/users/kseamon/events{/privacy}","received_events_url":"https://api.github.com/users/kseamon/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/kseamon/material","description":"Material design for Angular","fork":true,"url":"https://api.github.com/repos/kseamon/material","forks_url":"https://api.github.com/repos/kseamon/material/forks","keys_url":"https://api.github.com/repos/kseamon/material/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kseamon/material/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kseamon/material/teams","hooks_url":"https://api.github.com/repos/kseamon/material/hooks","issue_events_url":"https://api.github.com/repos/kseamon/material/issues/events{/number}","events_url":"https://api.github.com/repos/kseamon/material/events","assignees_url":"https://api.github.com/repos/kseamon/material/assignees{/user}","branches_url":"https://api.github.com/repos/kseamon/material/branches{/branch}","tags_url":"https://api.github.com/repos/kseamon/material/tags","blobs_url":"https://api.github.com/repos/kseamon/material/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kseamon/material/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kseamon/material/git/refs{/sha}","trees_url":"https://api.github.com/repos/kseamon/material/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kseamon/material/statuses/{sha}","languages_url":"https://api.github.com/repos/kseamon/material/languages","stargazers_url":"https://api.github.com/repos/kseamon/material/stargazers","contributors_url":"https://api.github.com/repos/kseamon/material/contributors","subscribers_url":"https://api.github.com/repos/kseamon/material/subscribers","subscription_url":"https://api.github.com/repos/kseamon/material/subscription","commits_url":"https://api.github.com/repos/kseamon/material/commits{/sha}","git_commits_url":"https://api.github.com/repos/kseamon/material/git/commits{/sha}","comments_url":"https://api.github.com/repos/kseamon/material/comments{/number}","issue_comment_url":"https://api.github.com/repos/kseamon/material/issues/comments{/number}","contents_url":"https://api.github.com/repos/kseamon/material/contents/{+path}","compare_url":"https://api.github.com/repos/kseamon/material/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kseamon/material/merges","archive_url":"https://api.github.com/repos/kseamon/material/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kseamon/material/downloads","issues_url":"https://api.github.com/repos/kseamon/material/issues{/number}","pulls_url":"https://api.github.com/repos/kseamon/material/pulls{/number}","milestones_url":"https://api.github.com/repos/kseamon/material/milestones{/number}","notifications_url":"https://api.github.com/repos/kseamon/material/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kseamon/material/labels{/name}","releases_url":"https://api.github.com/repos/kseamon/material/releases{/id}","created_at":"2014-11-10T18:07:23Z","updated_at":"2014-11-10T17:54:25Z","pushed_at":"2015-06-16T22:59:13Z","git_url":"git://github.com/kseamon/material.git","ssh_url":"git@github.com:kseamon/material.git","clone_url":"https://github.com/kseamon/material.git","svn_url":"https://github.com/kseamon/material","homepage":null,"size":37220,"stargazers_count":0,"watchers_count":0,"language":null,"has_issues":false,"has_downloads":true,"has_wiki":false,"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":"angular:master","ref":"master","sha":"0c66974109ca4878868953481cb8b4b9f0324545","user":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"repo":{"id":21399598,"name":"material","full_name":"angular/material","owner":{"login":"angular","id":139426,"avatar_url":"https://avatars.githubusercontent.com/u/139426?v=3","gravatar_id":"","url":"https://api.github.com/users/angular","html_url":"https://github.com/angular","followers_url":"https://api.github.com/users/angular/followers","following_url":"https://api.github.com/users/angular/following{/other_user}","gists_url":"https://api.github.com/users/angular/gists{/gist_id}","starred_url":"https://api.github.com/users/angular/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/angular/subscriptions","organizations_url":"https://api.github.com/users/angular/orgs","repos_url":"https://api.github.com/users/angular/repos","events_url":"https://api.github.com/users/angular/events{/privacy}","received_events_url":"https://api.github.com/users/angular/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/angular/material","description":"Material design for Angular","fork":false,"url":"https://api.github.com/repos/angular/material","forks_url":"https://api.github.com/repos/angular/material/forks","keys_url":"https://api.github.com/repos/angular/material/keys{/key_id}","collaborators_url":"https://api.github.com/repos/angular/material/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/angular/material/teams","hooks_url":"https://api.github.com/repos/angular/material/hooks","issue_events_url":"https://api.github.com/repos/angular/material/issues/events{/number}","events_url":"https://api.github.com/repos/angular/material/events","assignees_url":"https://api.github.com/repos/angular/material/assignees{/user}","branches_url":"https://api.github.com/repos/angular/material/branches{/branch}","tags_url":"https://api.github.com/repos/angular/material/tags","blobs_url":"https://api.github.com/repos/angular/material/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/angular/material/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/angular/material/git/refs{/sha}","trees_url":"https://api.github.com/repos/angular/material/git/trees{/sha}","statuses_url":"https://api.github.com/repos/angular/material/statuses/{sha}","languages_url":"https://api.github.com/repos/angular/material/languages","stargazers_url":"https://api.github.com/repos/angular/material/stargazers","contributors_url":"https://api.github.com/repos/angular/material/contributors","subscribers_url":"https://api.github.com/repos/angular/material/subscribers","subscription_url":"https://api.github.com/repos/angular/material/subscription","commits_url":"https://api.github.com/repos/angular/material/commits{/sha}","git_commits_url":"https://api.github.com/repos/angular/material/git/commits{/sha}","comments_url":"https://api.github.com/repos/angular/material/comments{/number}","issue_comment_url":"https://api.github.com/repos/angular/material/issues/comments{/number}","contents_url":"https://api.github.com/repos/angular/material/contents/{+path}","compare_url":"https://api.github.com/repos/angular/material/compare/{base}...{head}","merges_url":"https://api.github.com/repos/angular/material/merges","archive_url":"https://api.github.com/repos/angular/material/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/angular/material/downloads","issues_url":"https://api.github.com/repos/angular/material/issues{/number}","pulls_url":"https://api.github.com/repos/angular/material/pulls{/number}","milestones_url":"https://api.github.com/repos/angular/material/milestones{/number}","notifications_url":"https://api.github.com/repos/angular/material/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/angular/material/labels{/name}","releases_url":"https://api.github.com/repos/angular/material/releases{/id}","created_at":"2014-07-01T19:20:06Z","updated_at":"2015-06-17T05:04:42Z","pushed_at":"2015-06-17T03:51:01Z","git_url":"git://github.com/angular/material.git","ssh_url":"git@github.com:angular/material.git","clone_url":"https://github.com/angular/material.git","svn_url":"https://github.com/angular/material","homepage":"https://material.angularjs.org/","size":87365,"stargazers_count":8883,"watchers_count":8883,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":1395,"mirror_url":null,"open_issues_count":832,"forks":1395,"open_issues":832,"watchers":8883,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/angular/material/pulls/3301"},"html":{"href":"https://github.com/angular/material/pull/3301"},"issue":{"href":"https://api.github.com/repos/angular/material/issues/3301"},"comments":{"href":"https://api.github.com/repos/angular/material/issues/3301/comments"},"review_comments":{"href":"https://api.github.com/repos/angular/material/pulls/3301/comments"},"review_comment":{"href":"https://api.github.com/repos/angular/material/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/angular/material/pulls/3301/commits"},"statuses":{"href":"https://api.github.com/repos/angular/material/statuses/fe30ec6b785ce2cdd7973b06246405fb5c8e297d"}}}}