{"action":"created","comment":{"url":"https://api.github.com/repos/zotero/zotero/pulls/comments/230252763","pull_request_review_id":163294155,"id":230252763,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIzMDI1Mjc2Mw==","diff_hunk":"@@ -144,6 +144,238 @@ var CSL_TYPE_MAPPINGS = {\n  * @class Functions for text manipulation and other miscellaneous purposes\n  */\n Zotero.Utilities = {\n+\t/**\n+\t * Get an identifier from an item whether it's in 'extra' or a separate field\n+\t *\n+\t * @param {Zotero.Item} item\n+\t * @return {Object|null}\n+\t */\n+\t\"getItemIdentifier\": function (item) {\n+\t\tlet DOI = item.getField('DOI') || item.getExtraField('DOI');\n+\t\tif (DOI) {\n+\t\t\treturn {DOI};\n+\t\t}\n+\t\t\n+\t\tlet ISBN = item.getField('ISBN') || item.getExtraField('ISBN');\n+\t\tif (ISBN) {\n+\t\t\treturn {ISBN};\n+\t\t}\n+\t\t\n+\t\tlet PMID = item.getField('PMID') || item.getExtraField('PMID');\n+\t\tif (PMID) {\n+\t\t\treturn {PMID};\n+\t\t}\n+\t\t\n+\t\tlet arXiv = item.getField('arXiv') || item.getExtraField('arXiv');\n+\t\tif (arXiv) {\n+\t\t\treturn {arXiv};\n+\t\t}\n+\t\t\n+\t\treturn null;\n+\t},\n+\t\n+\t/**\n+\t * Resolve an identifier by using fields like title, authors, years, etc.\n+\t *\n+\t * @param {Object} item\n+\t * @return {Promise<Object>}\n+\t */\n+\t\"resolveIdentifier\": async function (item) {\n+\t\tlet uri = ZOTERO_CONFIG.RESOLVE_URL + 'resolve';\n+\t\tlet res = await Zotero.HTTP.request(\n+\t\t\t\"POST\",\n+\t\t\turi,\n+\t\t\t{\n+\t\t\t\tsuccessCodes: [200],\n+\t\t\t\theaders: {\n+\t\t\t\t\t'Content-Type': 'application/json'\n+\t\t\t\t},\n+\t\t\t\tbody: JSON.stringify(item.toJSON())\n+\t\t\t}\n+\t\t);\n+\t\t\n+\t\treturn JSON.parse(res.response);\n+\t},\n+\t\n+\t/**\n+\t * Translate an item from a given URL\n+\t *\n+\t * @param {String} url\n+\t * @return {Promise<Object|null>}\n+\t */\n+\t\"getItemFromURL\": async function (url) {\n+\t\tlet doc = (await Zotero.HTTP.processDocuments(url, doc => doc))[0];\n+\t\t\n+\t\tlet translate = new Zotero.Translate.Web();\n+\t\ttranslate.setDocument(doc);\n+\t\t\n+\t\tlet translators = await translate.getTranslators();\n+\t\tif (!translators.length) {\n+\t\t\treturn null;\n+\t\t}\n+\t\t\n+\t\ttranslate.setTranslator(translators[0]);\n+\t\tlet options = {\n+\t\t\tlibraryID: false\n+\t\t};\n+\t\t\n+\t\tlet newItems;\n+\t\ttry {\n+\t\t\tnewItems = await translate.translate(options);\n+\t\t\tif (!newItems.length) {\n+\t\t\t\treturn null;\n+\t\t\t}\n+\t\t}\n+\t\tcatch (e) {\n+\t\t\tZotero.logError(e);\n+\t\t\treturn null;\n+\t\t}\n+\t\t\n+\t\treturn newItems[0];\n+\t},\n+\t\n+\t/**\n+\t * Get an item by identifier\n+\t *\n+\t * @param {Object} identifier\n+\t * @return {Promise<Object|null>}\n+\t */\n+\t\"getItemFromAPI\": async function (identifier) {\n+\t\tlet translate = new Zotero.Translate.Search();\n+\t\ttranslate.setIdentifier(identifier);\n+\t\t\n+\t\tlet translators = await translate.getTranslators();\n+\t\ttranslate.setTranslator(translators);\n+\t\tlet newItems;\n+\t\ttry {\n+\t\t\tnewItems = await translate.translate({\n+\t\t\t\tlibraryID: false\n+\t\t\t});\n+\t\t}\n+\t\tcatch (e) {\n+\t\t\tZotero.logError(e);\n+\t\t\treturn null;\n+\t\t}\n+\t\treturn newItems[0];\n+\t},\n+\t\n+\t/**\n+\t * Update item metadata\n+\t *\n+\t * @param {Zotero.Item} item\n+\t * @return {Promise<bool>}\n+\t */\n+\t\"updateMetadata\": async function (item) {\n+\t\t// Get an identifier from the item\n+\t\tlet identifier = Zotero.Utilities.getItemIdentifier(item);\n+\t\tif (!identifier) {\n+\t\t\t// If no identifier is found, use other item fields to resolve it\n+\t\t\tlet resolvedIdentifier = await Zotero.Utilities.resolveIdentifier(item);\n+\t\t\t// For now, resolve only DOI identifiers\n+\t\t\tif (resolvedIdentifier.DOI) {\n+\t\t\t\tidentifier = resolvedIdentifier;\n+\t\t\t}\n+\t\t}\n+\t\t\n+\t\tlet newItem = null;\n+\t\t\n+\t\tif (identifier) {\n+\t\t\tlet item1 = await Zotero.Utilities.getItemFromAPI(identifier);\n+\t\t\tlet item2 = null;\n+\t\t\t\n+\t\t\tif (identifier.DOI) {\n+\t\t\t\titem2 = await Zotero.Utilities.getItemFromURL('https://dx.doi.org/' + identifier.DOI);\n+\t\t\t}\n+\t\t\t\n+\t\t\t// If both items are translated\n+\t\t\tif (item1 && item2) {\n+\t\t\t\t// Combine item1 and item2\n+\t\t\t\tfor (let key in item2) {\n+\t\t\t\t\tif (Zotero.Utilities.fieldIsValidForType(key, item1.itemType)) {\n+\t\t\t\t\t\t// Add all item2 fields that doesn't exist in item1\n+\t\t\t\t\t\tif (!item1[key] && item2[key]) {\n+\t\t\t\t\t\t\titem1[key] = item2[key];\n+\t\t\t\t\t\t}\n+\t\t\t\t\t}\n+\t\t\t\t}\n+\t\t\t\tnewItem = item1;\n+\t\t\t}\n+\t\t\t// If only item1 is translated\n+\t\t\telse if (item1) {\n+\t\t\t\tnewItem = item1;\n+\t\t\t}\n+\t\t\t// If only item2 is translated\n+\t\t\telse if (item2) {\n+\t\t\t\tnewItem = item2;\n+\t\t\t}\n+\t\t}\n+\t\t\n+\t\t// Translate by URL if translation by identifier failed\n+\t\tif (!newItem && item.getField('url')) {","path":"chrome/content/zotero/xpcom/utilities.js","position":171,"original_position":171,"commit_id":"fb093d0ee5814853aaf33d61deedbc24b6605f9e","original_commit_id":"fb093d0ee5814853aaf33d61deedbc24b6605f9e","user":{"login":"dstillman","id":783082,"node_id":"MDQ6VXNlcjc4MzA4Mg==","avatar_url":"https://avatars0.githubusercontent.com/u/783082?v=4","gravatar_id":"","url":"https://api.github.com/users/dstillman","html_url":"https://github.com/dstillman","followers_url":"https://api.github.com/users/dstillman/followers","following_url":"https://api.github.com/users/dstillman/following{/other_user}","gists_url":"https://api.github.com/users/dstillman/gists{/gist_id}","starred_url":"https://api.github.com/users/dstillman/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/dstillman/subscriptions","organizations_url":"https://api.github.com/users/dstillman/orgs","repos_url":"https://api.github.com/users/dstillman/repos","events_url":"https://api.github.com/users/dstillman/events{/privacy}","received_events_url":"https://api.github.com/users/dstillman/received_events","type":"User","site_admin":false},"body":"It's not strictly necessary, and would be a little annoying to do, but technically we should avoid trying the URL if we already tried the DOI above. We don't have to do that in the initial implementation, but should at least add a TODO to skip URLs we tried from resolved DOIs.","created_at":"2018-11-02T02:05:24Z","updated_at":"2018-11-02T02:40:34Z","html_url":"https://github.com/zotero/zotero/pull/1582#discussion_r230252763","pull_request_url":"https://api.github.com/repos/zotero/zotero/pulls/1582","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/zotero/zotero/pulls/comments/230252763"},"html":{"href":"https://github.com/zotero/zotero/pull/1582#discussion_r230252763"},"pull_request":{"href":"https://api.github.com/repos/zotero/zotero/pulls/1582"}}},"pull_request":{"url":"https://api.github.com/repos/zotero/zotero/pulls/1582","id":221448515,"node_id":"MDExOlB1bGxSZXF1ZXN0MjIxNDQ4NTE1","html_url":"https://github.com/zotero/zotero/pull/1582","diff_url":"https://github.com/zotero/zotero/pull/1582.diff","patch_url":"https://github.com/zotero/zotero/pull/1582.patch","issue_url":"https://api.github.com/repos/zotero/zotero/issues/1582","number":1582,"state":"open","locked":false,"title":"Update metadata","user":{"login":"mrtcode","id":6362989,"node_id":"MDQ6VXNlcjYzNjI5ODk=","avatar_url":"https://avatars3.githubusercontent.com/u/6362989?v=4","gravatar_id":"","url":"https://api.github.com/users/mrtcode","html_url":"https://github.com/mrtcode","followers_url":"https://api.github.com/users/mrtcode/followers","following_url":"https://api.github.com/users/mrtcode/following{/other_user}","gists_url":"https://api.github.com/users/mrtcode/gists{/gist_id}","starred_url":"https://api.github.com/users/mrtcode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrtcode/subscriptions","organizations_url":"https://api.github.com/users/mrtcode/orgs","repos_url":"https://api.github.com/users/mrtcode/repos","events_url":"https://api.github.com/users/mrtcode/events{/privacy}","received_events_url":"https://api.github.com/users/mrtcode/received_events","type":"User","site_admin":false},"body":"Uses an item identifier and URL to translate and update metadata. If the identifier is not found between item fields, it tries to resolve DOI by fields like 'title', 'authors', 'year', etc.","created_at":"2018-10-09T13:53:34Z","updated_at":"2018-11-02T02:40:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"e3d1c1f6d9995b780270383075dd4680e742efd9","assignee":null,"assignees":[],"requested_reviewers":[],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/zotero/zotero/pulls/1582/commits","review_comments_url":"https://api.github.com/repos/zotero/zotero/pulls/1582/comments","review_comment_url":"https://api.github.com/repos/zotero/zotero/pulls/comments{/number}","comments_url":"https://api.github.com/repos/zotero/zotero/issues/1582/comments","statuses_url":"https://api.github.com/repos/zotero/zotero/statuses/fb093d0ee5814853aaf33d61deedbc24b6605f9e","head":{"label":"mrtcode:update-metadata","ref":"update-metadata","sha":"fb093d0ee5814853aaf33d61deedbc24b6605f9e","user":{"login":"mrtcode","id":6362989,"node_id":"MDQ6VXNlcjYzNjI5ODk=","avatar_url":"https://avatars3.githubusercontent.com/u/6362989?v=4","gravatar_id":"","url":"https://api.github.com/users/mrtcode","html_url":"https://github.com/mrtcode","followers_url":"https://api.github.com/users/mrtcode/followers","following_url":"https://api.github.com/users/mrtcode/following{/other_user}","gists_url":"https://api.github.com/users/mrtcode/gists{/gist_id}","starred_url":"https://api.github.com/users/mrtcode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrtcode/subscriptions","organizations_url":"https://api.github.com/users/mrtcode/orgs","repos_url":"https://api.github.com/users/mrtcode/repos","events_url":"https://api.github.com/users/mrtcode/events{/privacy}","received_events_url":"https://api.github.com/users/mrtcode/received_events","type":"User","site_admin":false},"repo":{"id":90237991,"node_id":"MDEwOlJlcG9zaXRvcnk5MDIzNzk5MQ==","name":"zotero","full_name":"mrtcode/zotero","private":false,"owner":{"login":"mrtcode","id":6362989,"node_id":"MDQ6VXNlcjYzNjI5ODk=","avatar_url":"https://avatars3.githubusercontent.com/u/6362989?v=4","gravatar_id":"","url":"https://api.github.com/users/mrtcode","html_url":"https://github.com/mrtcode","followers_url":"https://api.github.com/users/mrtcode/followers","following_url":"https://api.github.com/users/mrtcode/following{/other_user}","gists_url":"https://api.github.com/users/mrtcode/gists{/gist_id}","starred_url":"https://api.github.com/users/mrtcode/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/mrtcode/subscriptions","organizations_url":"https://api.github.com/users/mrtcode/orgs","repos_url":"https://api.github.com/users/mrtcode/repos","events_url":"https://api.github.com/users/mrtcode/events{/privacy}","received_events_url":"https://api.github.com/users/mrtcode/received_events","type":"User","site_admin":false},"html_url":"https://github.com/mrtcode/zotero","description":"Zotero is a free, easy-to-use tool to help you collect, organize, cite, and share your research sources.","fork":true,"url":"https://api.github.com/repos/mrtcode/zotero","forks_url":"https://api.github.com/repos/mrtcode/zotero/forks","keys_url":"https://api.github.com/repos/mrtcode/zotero/keys{/key_id}","collaborators_url":"https://api.github.com/repos/mrtcode/zotero/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/mrtcode/zotero/teams","hooks_url":"https://api.github.com/repos/mrtcode/zotero/hooks","issue_events_url":"https://api.github.com/repos/mrtcode/zotero/issues/events{/number}","events_url":"https://api.github.com/repos/mrtcode/zotero/events","assignees_url":"https://api.github.com/repos/mrtcode/zotero/assignees{/user}","branches_url":"https://api.github.com/repos/mrtcode/zotero/branches{/branch}","tags_url":"https://api.github.com/repos/mrtcode/zotero/tags","blobs_url":"https://api.github.com/repos/mrtcode/zotero/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/mrtcode/zotero/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/mrtcode/zotero/git/refs{/sha}","trees_url":"https://api.github.com/repos/mrtcode/zotero/git/trees{/sha}","statuses_url":"https://api.github.com/repos/mrtcode/zotero/statuses/{sha}","languages_url":"https://api.github.com/repos/mrtcode/zotero/languages","stargazers_url":"https://api.github.com/repos/mrtcode/zotero/stargazers","contributors_url":"https://api.github.com/repos/mrtcode/zotero/contributors","subscribers_url":"https://api.github.com/repos/mrtcode/zotero/subscribers","subscription_url":"https://api.github.com/repos/mrtcode/zotero/subscription","commits_url":"https://api.github.com/repos/mrtcode/zotero/commits{/sha}","git_commits_url":"https://api.github.com/repos/mrtcode/zotero/git/commits{/sha}","comments_url":"https://api.github.com/repos/mrtcode/zotero/comments{/number}","issue_comment_url":"https://api.github.com/repos/mrtcode/zotero/issues/comments{/number}","contents_url":"https://api.github.com/repos/mrtcode/zotero/contents/{+path}","compare_url":"https://api.github.com/repos/mrtcode/zotero/compare/{base}...{head}","merges_url":"https://api.github.com/repos/mrtcode/zotero/merges","archive_url":"https://api.github.com/repos/mrtcode/zotero/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/mrtcode/zotero/downloads","issues_url":"https://api.github.com/repos/mrtcode/zotero/issues{/number}","pulls_url":"https://api.github.com/repos/mrtcode/zotero/pulls{/number}","milestones_url":"https://api.github.com/repos/mrtcode/zotero/milestones{/number}","notifications_url":"https://api.github.com/repos/mrtcode/zotero/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/mrtcode/zotero/labels{/name}","releases_url":"https://api.github.com/repos/mrtcode/zotero/releases{/id}","deployments_url":"https://api.github.com/repos/mrtcode/zotero/deployments","created_at":"2017-05-04T08:10:45Z","updated_at":"2018-10-09T12:56:42Z","pushed_at":"2018-10-23T08:26:42Z","git_url":"git://github.com/mrtcode/zotero.git","ssh_url":"git@github.com:mrtcode/zotero.git","clone_url":"https://github.com/mrtcode/zotero.git","svn_url":"https://github.com/mrtcode/zotero","homepage":"https://www.zotero.org","size":102826,"stargazers_count":0,"watchers_count":0,"language":"JavaScript","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"zotero:master","ref":"master","sha":"6abfd3b5b03969564424dc03313d63ae1de86100","user":{"login":"zotero","id":891917,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg5MTkxNw==","avatar_url":"https://avatars0.githubusercontent.com/u/891917?v=4","gravatar_id":"","url":"https://api.github.com/users/zotero","html_url":"https://github.com/zotero","followers_url":"https://api.github.com/users/zotero/followers","following_url":"https://api.github.com/users/zotero/following{/other_user}","gists_url":"https://api.github.com/users/zotero/gists{/gist_id}","starred_url":"https://api.github.com/users/zotero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zotero/subscriptions","organizations_url":"https://api.github.com/users/zotero/orgs","repos_url":"https://api.github.com/users/zotero/repos","events_url":"https://api.github.com/users/zotero/events{/privacy}","received_events_url":"https://api.github.com/users/zotero/received_events","type":"Organization","site_admin":false},"repo":{"id":2656556,"node_id":"MDEwOlJlcG9zaXRvcnkyNjU2NTU2","name":"zotero","full_name":"zotero/zotero","private":false,"owner":{"login":"zotero","id":891917,"node_id":"MDEyOk9yZ2FuaXphdGlvbjg5MTkxNw==","avatar_url":"https://avatars0.githubusercontent.com/u/891917?v=4","gravatar_id":"","url":"https://api.github.com/users/zotero","html_url":"https://github.com/zotero","followers_url":"https://api.github.com/users/zotero/followers","following_url":"https://api.github.com/users/zotero/following{/other_user}","gists_url":"https://api.github.com/users/zotero/gists{/gist_id}","starred_url":"https://api.github.com/users/zotero/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/zotero/subscriptions","organizations_url":"https://api.github.com/users/zotero/orgs","repos_url":"https://api.github.com/users/zotero/repos","events_url":"https://api.github.com/users/zotero/events{/privacy}","received_events_url":"https://api.github.com/users/zotero/received_events","type":"Organization","site_admin":false},"html_url":"https://github.com/zotero/zotero","description":"Zotero is a free, easy-to-use tool to help you collect, organize, cite, and share your research sources.","fork":false,"url":"https://api.github.com/repos/zotero/zotero","forks_url":"https://api.github.com/repos/zotero/zotero/forks","keys_url":"https://api.github.com/repos/zotero/zotero/keys{/key_id}","collaborators_url":"https://api.github.com/repos/zotero/zotero/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/zotero/zotero/teams","hooks_url":"https://api.github.com/repos/zotero/zotero/hooks","issue_events_url":"https://api.github.com/repos/zotero/zotero/issues/events{/number}","events_url":"https://api.github.com/repos/zotero/zotero/events","assignees_url":"https://api.github.com/repos/zotero/zotero/assignees{/user}","branches_url":"https://api.github.com/repos/zotero/zotero/branches{/branch}","tags_url":"https://api.github.com/repos/zotero/zotero/tags","blobs_url":"https://api.github.com/repos/zotero/zotero/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/zotero/zotero/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/zotero/zotero/git/refs{/sha}","trees_url":"https://api.github.com/repos/zotero/zotero/git/trees{/sha}","statuses_url":"https://api.github.com/repos/zotero/zotero/statuses/{sha}","languages_url":"https://api.github.com/repos/zotero/zotero/languages","stargazers_url":"https://api.github.com/repos/zotero/zotero/stargazers","contributors_url":"https://api.github.com/repos/zotero/zotero/contributors","subscribers_url":"https://api.github.com/repos/zotero/zotero/subscribers","subscription_url":"https://api.github.com/repos/zotero/zotero/subscription","commits_url":"https://api.github.com/repos/zotero/zotero/commits{/sha}","git_commits_url":"https://api.github.com/repos/zotero/zotero/git/commits{/sha}","comments_url":"https://api.github.com/repos/zotero/zotero/comments{/number}","issue_comment_url":"https://api.github.com/repos/zotero/zotero/issues/comments{/number}","contents_url":"https://api.github.com/repos/zotero/zotero/contents/{+path}","compare_url":"https://api.github.com/repos/zotero/zotero/compare/{base}...{head}","merges_url":"https://api.github.com/repos/zotero/zotero/merges","archive_url":"https://api.github.com/repos/zotero/zotero/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/zotero/zotero/downloads","issues_url":"https://api.github.com/repos/zotero/zotero/issues{/number}","pulls_url":"https://api.github.com/repos/zotero/zotero/pulls{/number}","milestones_url":"https://api.github.com/repos/zotero/zotero/milestones{/number}","notifications_url":"https://api.github.com/repos/zotero/zotero/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/zotero/zotero/labels{/name}","releases_url":"https://api.github.com/repos/zotero/zotero/releases{/id}","deployments_url":"https://api.github.com/repos/zotero/zotero/deployments","created_at":"2011-10-27T07:46:48Z","updated_at":"2018-11-01T15:31:04Z","pushed_at":"2018-10-31T12:40:24Z","git_url":"git://github.com/zotero/zotero.git","ssh_url":"git@github.com:zotero/zotero.git","clone_url":"https://github.com/zotero/zotero.git","svn_url":"https://github.com/zotero/zotero","homepage":"https://www.zotero.org","size":104033,"stargazers_count":1258,"watchers_count":1258,"language":"JavaScript","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":false,"has_pages":false,"forks_count":245,"mirror_url":null,"archived":false,"open_issues_count":488,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":245,"open_issues":488,"watchers":1258,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/zotero/zotero/pulls/1582"},"html":{"href":"https://github.com/zotero/zotero/pull/1582"},"issue":{"href":"https://api.github.com/repos/zotero/zotero/issues/1582"},"comments":{"href":"https://api.github.com/repos/zotero/zotero/issues/1582/comments"},"review_comments":{"href":"https://api.github.com/repos/zotero/zotero/pulls/1582/comments"},"review_comment":{"href":"https://api.github.com/repos/zotero/zotero/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/zotero/zotero/pulls/1582/commits"},"statuses":{"href":"https://api.github.com/repos/zotero/zotero/statuses/fb093d0ee5814853aaf33d61deedbc24b6605f9e"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"dstillman"}}