{"action":"created","comment":{"url":"https://api.github.com/repos/elastic/kibana/pulls/comments/77094146","id":77094146,"diff_hunk":"@@ -0,0 +1,174 @@\n+/**\n+ * The HashedItemStore associates JSON objects with states in browser history and persists these\n+ * objects in sessionStorage. We persist them so that when a tab is closed and re-opened, we can\n+ * retain access to the state objects referenced by the browser history.\n+ *\n+ * Because there is a limit on how much data we can put into sessionStorage, the HashedItemStore\n+ * will attempt to remove old items from storage once that limit is reached.\n+ *\n+ * -------------------------------------------------------------------------------------------------\n+ *\n+ * Consideration 1: We can't (easily) mirror the browser history\n+ *\n+ * If we use letters to indicate a unique state object, and numbers to represent the same state\n+ * occurring again (due to action by the user), a history could look like this:\n+ *\n+ * Old < - - - - - - - - > New\n+ * A1 | B1 | C1 | A2 | D1 | E1\n+ *\n+ * If the user navigates back to C1 and starts to create new states, persisted history states will\n+ * become inaccessible:\n+ *\n+ * Old < - - - - - - - - - - -> New\n+ * A1 | B1 | C1 | F1 | G1 | H1 | I1  (new history states)\n+ *                A2 | D1 | E1       (inaccessible persisted history states)\n+ *\n+ * Theoretically, we could build a mirror of the browser history. When the onpopstate event is\n+ * dispatched, we could determine whether we have gone back or forward in history. Then, when\n+ * a new state is persisted, we could delete all of the persisted items which are no longer\n+ * accessible. (Note that this would require reference-counting so that A isn't removed while D and\n+ * E are, since A would still have a remaining reference from A1).\n+ *\n+ * However, the History API doesn't allow us to read from the history beyond the current state. This\n+ * means that if a session is restored, we can't rebuild this browser history mirror.\n+ *\n+ * Due to this imperfect implementation, HashedItemStore ignores the possibility of inaccessible\n+ * history states. In the future, we could implement this history mirror and persist it in\n+ * sessionStorage too. Then, when restoring a session, we can just retrieve it from sessionStorage.\n+ *\n+ * -------------------------------------------------------------------------------------------------\n+ *\n+ * Consideration 2: We can't tell when we've hit the browser history limit\n+ *\n+ * Because some of our persisted history states may no longer be referenced by the browser history,\n+ * and we have no way of knowing which ones, we have no way of knowing whether we've persisted a\n+ * number of accessible states beyond the browser history length limit.\n+ *\n+ * More fundamentally, the browser history length limit is a browser implementation detail, so it\n+ * can change from browser to browser, or over time. Respecting this limit would introduce a lot of\n+ * (unnecessary?) complexity.\n+ *\n+ * For these reasons, HashedItemStore doesn't concern itself with this constraint.\n+ */\n+\n+import {\n+ sortBy,\n+ values,\n+} from 'lodash';\n+\n+export default class HashedItemStore {\n+\n+  /**\n+   * HashedItemStore uses objects called indexed items to refer to items that have been persisted\n+   * in sessionStorage. An indexed item is shaped {hash, touched}. The touched date is when the item\n+   * was last referenced by the browser history.\n+   */\n+  constructor(sessionStorage) {\n+    this._sessionStorage = sessionStorage;\n+\n+    // Store indexed items in descending order by touched (oldest first, newest last). We'll use\n+    // this to remove older items when we run out of storage space.\n+    this._indexedItems = [];\n+    // Associate item hashes with the corresponding indexed items. We'll use this to quickly look\n+    // up an item and update its touched date when it reoccurs in the browser history.\n+    this._hashToIndexedItemMap = {};","path":"src/ui/public/state_management/state_storage/hashed_item_store.js","position":74,"original_position":74,"commit_id":"be196964e2121520fe8092aef0d9f7a93add07ca","original_commit_id":"be196964e2121520fe8092aef0d9f7a93add07ca","user":{"login":"thomasneirynck","id":1833023,"avatar_url":"https://avatars.githubusercontent.com/u/1833023?v=3","gravatar_id":"","url":"https://api.github.com/users/thomasneirynck","html_url":"https://github.com/thomasneirynck","followers_url":"https://api.github.com/users/thomasneirynck/followers","following_url":"https://api.github.com/users/thomasneirynck/following{/other_user}","gists_url":"https://api.github.com/users/thomasneirynck/gists{/gist_id}","starred_url":"https://api.github.com/users/thomasneirynck/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thomasneirynck/subscriptions","organizations_url":"https://api.github.com/users/thomasneirynck/orgs","repos_url":"https://api.github.com/users/thomasneirynck/repos","events_url":"https://api.github.com/users/thomasneirynck/events{/privacy}","received_events_url":"https://api.github.com/users/thomasneirynck/received_events","type":"User","site_admin":false},"body":"IMHO, we don't need two data structures to keep track of the items. I would remove the Map. I assume this would be at most 100s/1000s items big? Just looking for the hash in the `_indexedItems` array works well too I think. It would reduce the footprint of this component, and you don't need to maintain two collections.","created_at":"2016-08-31T23:51:05Z","updated_at":"2016-08-31T23:51:05Z","html_url":"https://github.com/elastic/kibana/pull/8022#discussion_r77094146","pull_request_url":"https://api.github.com/repos/elastic/kibana/pulls/8022","_links":{"self":{"href":"https://api.github.com/repos/elastic/kibana/pulls/comments/77094146"},"html":{"href":"https://github.com/elastic/kibana/pull/8022#discussion_r77094146"},"pull_request":{"href":"https://api.github.com/repos/elastic/kibana/pulls/8022"}}},"pull_request":{"url":"https://api.github.com/repos/elastic/kibana/pulls/8022","id":81769409,"html_url":"https://github.com/elastic/kibana/pull/8022","diff_url":"https://github.com/elastic/kibana/pull/8022.diff","patch_url":"https://github.com/elastic/kibana/pull/8022.patch","issue_url":"https://api.github.com/repos/elastic/kibana/issues/8022","number":8022,"state":"open","locked":false,"title":"[state] store actual state value in session storage","user":{"login":"spalger","id":1329312,"avatar_url":"https://avatars.githubusercontent.com/u/1329312?v=3","gravatar_id":"","url":"https://api.github.com/users/spalger","html_url":"https://github.com/spalger","followers_url":"https://api.github.com/users/spalger/followers","following_url":"https://api.github.com/users/spalger/following{/other_user}","gists_url":"https://api.github.com/users/spalger/gists{/gist_id}","starred_url":"https://api.github.com/users/spalger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spalger/subscriptions","organizations_url":"https://api.github.com/users/spalger/orgs","repos_url":"https://api.github.com/users/spalger/repos","events_url":"https://api.github.com/users/spalger/events{/privacy}","received_events_url":"https://api.github.com/users/spalger/received_events","type":"User","site_admin":false},"body":"Fixes: https://github.com/elastic/kibana/issues/3947\r\n\r\nLet me start by saying that I'm not a fan of this as a long term solution. In the long term I think that a proper undo/redo stack should be implemented (similar to the work being done in https://github.com/elastic/kibana/pull/8019), but until we get there I think this is the least intrusive and most backwards-compatible way to move forward.\r\n\r\n## Approach \r\nThis solution focuses on the way that the `appState` and `globalState` communicate with the URL. By intercepting all reads/writes to the `$location` service in the `State` classes (superclass for both app and global state) we can store a hash of the content in the URL, and the actual content in `sessionStorage`.\r\n\r\nIf `sessionStorage` is full then calls to `sessionStorage.setItem()` will start to throw errors and the State class will simply remove old history entries until there is enough space to store the desired history entry.\r\n\r\n![2016-08-18 00_42_39](https://cloud.githubusercontent.com/assets/1329312/17765769/b44392f6-64dc-11e6-98cf-52d37db4bd6d.gif)\r\n\r\nSome pseudo-code examples:\r\n\r\nbefore\r\n```js\r\n// read the appState by its hash\r\nappState = rison.decode($location.search()._a)\r\n\r\n// parse the json out of the url\r\n$location.search('_a', rison.encode(appState))\r\n```\r\n\r\nafter\r\n```js\r\n// lookup the appState by it's hash\r\nappState = hashingStore.lookup($location.search()._a)\r\n\r\n// write the hash of the appState to the URL\r\n$location.search('_a', hashingStore.add(appState))\r\n```\r\n\r\n## Backwards Compatability\r\n\r\nThe hashes are prefixed with `h@` so they can be spotted by the `State` class. When the `State` does not see the `h@` prefix it parses the value as rison and immediately replaces it with it's hash. To see this in action, try clicking the \"visualize\" button at the bottom of the field quick stats panel in Discover. The `_a` query param in those urls is still consumed by the `appState`, but the URL displayed once Visualize is ready has the hashes instead. Note that the back-button takes you directly back to discover (the history entry was replaced).","created_at":"2016-08-18T07:36:46Z","updated_at":"2016-08-31T23:51:05Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e89f4113884aa7ded5f1c633a4bee10d3f319c24","assignee":{"login":"tylersmalley","id":40265,"avatar_url":"https://avatars.githubusercontent.com/u/40265?v=3","gravatar_id":"","url":"https://api.github.com/users/tylersmalley","html_url":"https://github.com/tylersmalley","followers_url":"https://api.github.com/users/tylersmalley/followers","following_url":"https://api.github.com/users/tylersmalley/following{/other_user}","gists_url":"https://api.github.com/users/tylersmalley/gists{/gist_id}","starred_url":"https://api.github.com/users/tylersmalley/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tylersmalley/subscriptions","organizations_url":"https://api.github.com/users/tylersmalley/orgs","repos_url":"https://api.github.com/users/tylersmalley/repos","events_url":"https://api.github.com/users/tylersmalley/events{/privacy}","received_events_url":"https://api.github.com/users/tylersmalley/received_events","type":"User","site_admin":false},"assignees":[{"login":"tylersmalley","id":40265,"avatar_url":"https://avatars.githubusercontent.com/u/40265?v=3","gravatar_id":"","url":"https://api.github.com/users/tylersmalley","html_url":"https://github.com/tylersmalley","followers_url":"https://api.github.com/users/tylersmalley/followers","following_url":"https://api.github.com/users/tylersmalley/following{/other_user}","gists_url":"https://api.github.com/users/tylersmalley/gists{/gist_id}","starred_url":"https://api.github.com/users/tylersmalley/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tylersmalley/subscriptions","organizations_url":"https://api.github.com/users/tylersmalley/orgs","repos_url":"https://api.github.com/users/tylersmalley/repos","events_url":"https://api.github.com/users/tylersmalley/events{/privacy}","received_events_url":"https://api.github.com/users/tylersmalley/received_events","type":"User","site_admin":false},{"login":"cjcenizal","id":1238659,"avatar_url":"https://avatars.githubusercontent.com/u/1238659?v=3","gravatar_id":"","url":"https://api.github.com/users/cjcenizal","html_url":"https://github.com/cjcenizal","followers_url":"https://api.github.com/users/cjcenizal/followers","following_url":"https://api.github.com/users/cjcenizal/following{/other_user}","gists_url":"https://api.github.com/users/cjcenizal/gists{/gist_id}","starred_url":"https://api.github.com/users/cjcenizal/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/cjcenizal/subscriptions","organizations_url":"https://api.github.com/users/cjcenizal/orgs","repos_url":"https://api.github.com/users/cjcenizal/repos","events_url":"https://api.github.com/users/cjcenizal/events{/privacy}","received_events_url":"https://api.github.com/users/cjcenizal/received_events","type":"User","site_admin":false},{"login":"thomasneirynck","id":1833023,"avatar_url":"https://avatars.githubusercontent.com/u/1833023?v=3","gravatar_id":"","url":"https://api.github.com/users/thomasneirynck","html_url":"https://github.com/thomasneirynck","followers_url":"https://api.github.com/users/thomasneirynck/followers","following_url":"https://api.github.com/users/thomasneirynck/following{/other_user}","gists_url":"https://api.github.com/users/thomasneirynck/gists{/gist_id}","starred_url":"https://api.github.com/users/thomasneirynck/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/thomasneirynck/subscriptions","organizations_url":"https://api.github.com/users/thomasneirynck/orgs","repos_url":"https://api.github.com/users/thomasneirynck/repos","events_url":"https://api.github.com/users/thomasneirynck/events{/privacy}","received_events_url":"https://api.github.com/users/thomasneirynck/received_events","type":"User","site_admin":false}],"milestone":null,"commits_url":"https://api.github.com/repos/elastic/kibana/pulls/8022/commits","review_comments_url":"https://api.github.com/repos/elastic/kibana/pulls/8022/comments","review_comment_url":"https://api.github.com/repos/elastic/kibana/pulls/comments{/number}","comments_url":"https://api.github.com/repos/elastic/kibana/issues/8022/comments","statuses_url":"https://api.github.com/repos/elastic/kibana/statuses/be196964e2121520fe8092aef0d9f7a93add07ca","head":{"label":"spalger:implement/storeStateInLocalstorage","ref":"implement/storeStateInLocalstorage","sha":"be196964e2121520fe8092aef0d9f7a93add07ca","user":{"login":"spalger","id":1329312,"avatar_url":"https://avatars.githubusercontent.com/u/1329312?v=3","gravatar_id":"","url":"https://api.github.com/users/spalger","html_url":"https://github.com/spalger","followers_url":"https://api.github.com/users/spalger/followers","following_url":"https://api.github.com/users/spalger/following{/other_user}","gists_url":"https://api.github.com/users/spalger/gists{/gist_id}","starred_url":"https://api.github.com/users/spalger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spalger/subscriptions","organizations_url":"https://api.github.com/users/spalger/orgs","repos_url":"https://api.github.com/users/spalger/repos","events_url":"https://api.github.com/users/spalger/events{/privacy}","received_events_url":"https://api.github.com/users/spalger/received_events","type":"User","site_admin":false},"repo":{"id":12307386,"name":"kibana","full_name":"spalger/kibana","owner":{"login":"spalger","id":1329312,"avatar_url":"https://avatars.githubusercontent.com/u/1329312?v=3","gravatar_id":"","url":"https://api.github.com/users/spalger","html_url":"https://github.com/spalger","followers_url":"https://api.github.com/users/spalger/followers","following_url":"https://api.github.com/users/spalger/following{/other_user}","gists_url":"https://api.github.com/users/spalger/gists{/gist_id}","starred_url":"https://api.github.com/users/spalger/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/spalger/subscriptions","organizations_url":"https://api.github.com/users/spalger/orgs","repos_url":"https://api.github.com/users/spalger/repos","events_url":"https://api.github.com/users/spalger/events{/privacy}","received_events_url":"https://api.github.com/users/spalger/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/spalger/kibana","description":"Kibana","fork":true,"url":"https://api.github.com/repos/spalger/kibana","forks_url":"https://api.github.com/repos/spalger/kibana/forks","keys_url":"https://api.github.com/repos/spalger/kibana/keys{/key_id}","collaborators_url":"https://api.github.com/repos/spalger/kibana/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/spalger/kibana/teams","hooks_url":"https://api.github.com/repos/spalger/kibana/hooks","issue_events_url":"https://api.github.com/repos/spalger/kibana/issues/events{/number}","events_url":"https://api.github.com/repos/spalger/kibana/events","assignees_url":"https://api.github.com/repos/spalger/kibana/assignees{/user}","branches_url":"https://api.github.com/repos/spalger/kibana/branches{/branch}","tags_url":"https://api.github.com/repos/spalger/kibana/tags","blobs_url":"https://api.github.com/repos/spalger/kibana/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/spalger/kibana/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/spalger/kibana/git/refs{/sha}","trees_url":"https://api.github.com/repos/spalger/kibana/git/trees{/sha}","statuses_url":"https://api.github.com/repos/spalger/kibana/statuses/{sha}","languages_url":"https://api.github.com/repos/spalger/kibana/languages","stargazers_url":"https://api.github.com/repos/spalger/kibana/stargazers","contributors_url":"https://api.github.com/repos/spalger/kibana/contributors","subscribers_url":"https://api.github.com/repos/spalger/kibana/subscribers","subscription_url":"https://api.github.com/repos/spalger/kibana/subscription","commits_url":"https://api.github.com/repos/spalger/kibana/commits{/sha}","git_commits_url":"https://api.github.com/repos/spalger/kibana/git/commits{/sha}","comments_url":"https://api.github.com/repos/spalger/kibana/comments{/number}","issue_comment_url":"https://api.github.com/repos/spalger/kibana/issues/comments{/number}","contents_url":"https://api.github.com/repos/spalger/kibana/contents/{+path}","compare_url":"https://api.github.com/repos/spalger/kibana/compare/{base}...{head}","merges_url":"https://api.github.com/repos/spalger/kibana/merges","archive_url":"https://api.github.com/repos/spalger/kibana/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/spalger/kibana/downloads","issues_url":"https://api.github.com/repos/spalger/kibana/issues{/number}","pulls_url":"https://api.github.com/repos/spalger/kibana/pulls{/number}","milestones_url":"https://api.github.com/repos/spalger/kibana/milestones{/number}","notifications_url":"https://api.github.com/repos/spalger/kibana/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/spalger/kibana/labels{/name}","releases_url":"https://api.github.com/repos/spalger/kibana/releases{/id}","deployments_url":"https://api.github.com/repos/spalger/kibana/deployments","created_at":"2013-08-22T20:39:03Z","updated_at":"2015-05-08T18:10:59Z","pushed_at":"2016-08-31T19:28:34Z","git_url":"git://github.com/spalger/kibana.git","ssh_url":"git@github.com:spalger/kibana.git","clone_url":"https://github.com/spalger/kibana.git","svn_url":"https://github.com/spalger/kibana","homepage":"http://www.elasticsearch.org/overview/kibana/","size":211621,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":3,"mirror_url":null,"open_issues_count":3,"forks":3,"open_issues":3,"watchers":0,"default_branch":"master"}},"base":{"label":"elastic:master","ref":"master","sha":"fdcd9a31679e9993c6017b609b946e6e9cfecb42","user":{"login":"elastic","id":6764390,"avatar_url":"https://avatars.githubusercontent.com/u/6764390?v=3","gravatar_id":"","url":"https://api.github.com/users/elastic","html_url":"https://github.com/elastic","followers_url":"https://api.github.com/users/elastic/followers","following_url":"https://api.github.com/users/elastic/following{/other_user}","gists_url":"https://api.github.com/users/elastic/gists{/gist_id}","starred_url":"https://api.github.com/users/elastic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elastic/subscriptions","organizations_url":"https://api.github.com/users/elastic/orgs","repos_url":"https://api.github.com/users/elastic/repos","events_url":"https://api.github.com/users/elastic/events{/privacy}","received_events_url":"https://api.github.com/users/elastic/received_events","type":"Organization","site_admin":false},"repo":{"id":7833168,"name":"kibana","full_name":"elastic/kibana","owner":{"login":"elastic","id":6764390,"avatar_url":"https://avatars.githubusercontent.com/u/6764390?v=3","gravatar_id":"","url":"https://api.github.com/users/elastic","html_url":"https://github.com/elastic","followers_url":"https://api.github.com/users/elastic/followers","following_url":"https://api.github.com/users/elastic/following{/other_user}","gists_url":"https://api.github.com/users/elastic/gists{/gist_id}","starred_url":"https://api.github.com/users/elastic/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/elastic/subscriptions","organizations_url":"https://api.github.com/users/elastic/orgs","repos_url":"https://api.github.com/users/elastic/repos","events_url":"https://api.github.com/users/elastic/events{/privacy}","received_events_url":"https://api.github.com/users/elastic/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/elastic/kibana","description":":bar_chart: Kibana analytics and search dashboard for Elasticsearch","fork":false,"url":"https://api.github.com/repos/elastic/kibana","forks_url":"https://api.github.com/repos/elastic/kibana/forks","keys_url":"https://api.github.com/repos/elastic/kibana/keys{/key_id}","collaborators_url":"https://api.github.com/repos/elastic/kibana/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/elastic/kibana/teams","hooks_url":"https://api.github.com/repos/elastic/kibana/hooks","issue_events_url":"https://api.github.com/repos/elastic/kibana/issues/events{/number}","events_url":"https://api.github.com/repos/elastic/kibana/events","assignees_url":"https://api.github.com/repos/elastic/kibana/assignees{/user}","branches_url":"https://api.github.com/repos/elastic/kibana/branches{/branch}","tags_url":"https://api.github.com/repos/elastic/kibana/tags","blobs_url":"https://api.github.com/repos/elastic/kibana/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/elastic/kibana/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/elastic/kibana/git/refs{/sha}","trees_url":"https://api.github.com/repos/elastic/kibana/git/trees{/sha}","statuses_url":"https://api.github.com/repos/elastic/kibana/statuses/{sha}","languages_url":"https://api.github.com/repos/elastic/kibana/languages","stargazers_url":"https://api.github.com/repos/elastic/kibana/stargazers","contributors_url":"https://api.github.com/repos/elastic/kibana/contributors","subscribers_url":"https://api.github.com/repos/elastic/kibana/subscribers","subscription_url":"https://api.github.com/repos/elastic/kibana/subscription","commits_url":"https://api.github.com/repos/elastic/kibana/commits{/sha}","git_commits_url":"https://api.github.com/repos/elastic/kibana/git/commits{/sha}","comments_url":"https://api.github.com/repos/elastic/kibana/comments{/number}","issue_comment_url":"https://api.github.com/repos/elastic/kibana/issues/comments{/number}","contents_url":"https://api.github.com/repos/elastic/kibana/contents/{+path}","compare_url":"https://api.github.com/repos/elastic/kibana/compare/{base}...{head}","merges_url":"https://api.github.com/repos/elastic/kibana/merges","archive_url":"https://api.github.com/repos/elastic/kibana/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/elastic/kibana/downloads","issues_url":"https://api.github.com/repos/elastic/kibana/issues{/number}","pulls_url":"https://api.github.com/repos/elastic/kibana/pulls{/number}","milestones_url":"https://api.github.com/repos/elastic/kibana/milestones{/number}","notifications_url":"https://api.github.com/repos/elastic/kibana/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/elastic/kibana/labels{/name}","releases_url":"https://api.github.com/repos/elastic/kibana/releases{/id}","deployments_url":"https://api.github.com/repos/elastic/kibana/deployments","created_at":"2013-01-26T04:00:59Z","updated_at":"2016-08-31T15:18:33Z","pushed_at":"2016-08-31T22:31:26Z","git_url":"git://github.com/elastic/kibana.git","ssh_url":"git@github.com:elastic/kibana.git","clone_url":"https://github.com/elastic/kibana.git","svn_url":"https://github.com/elastic/kibana","homepage":"https://www.elastic.co/products/kibana","size":263617,"stargazers_count":5922,"watchers_count":5922,"language":"JavaScript","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":2167,"mirror_url":null,"open_issues_count":1155,"forks":2167,"open_issues":1155,"watchers":5922,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/elastic/kibana/pulls/8022"},"html":{"href":"https://github.com/elastic/kibana/pull/8022"},"issue":{"href":"https://api.github.com/repos/elastic/kibana/issues/8022"},"comments":{"href":"https://api.github.com/repos/elastic/kibana/issues/8022/comments"},"review_comments":{"href":"https://api.github.com/repos/elastic/kibana/pulls/8022/comments"},"review_comment":{"href":"https://api.github.com/repos/elastic/kibana/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/elastic/kibana/pulls/8022/commits"},"statuses":{"href":"https://api.github.com/repos/elastic/kibana/statuses/be196964e2121520fe8092aef0d9f7a93add07ca"}}}}
{"actor":{"display_login":"thomasneirynck"}}