{"action":"created","comment":{"url":"https://api.github.com/repos/kripken/emscripten/pulls/comments/224895051","pull_request_review_id":164382761,"id":224895051,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDIyNDg5NTA1MQ==","diff_hunk":"@@ -574,99 +579,126 @@ class Dummy(object):\n     libc_deps += ['wasm-libc']\n   if shared.Settings.USE_PTHREADS:\n     libc_name = 'libc-mt'\n-    force.add('pthreads')\n-    force.add('pthreads_asmjs')\n+    include.add('pthreads')\n+    include.add('pthreads_asmjs')\n+  include.add(malloc_name())\n+  if shared.Settings.WASM_BACKEND:\n+    include.add('compiler-rt')\n+\n+  Library = namedtuple('Library', ['shortname', 'suffix', 'create', 'symbols', 'deps', 'can_noexcept'])\n \n-  system_libs = [('libcxx',        'a', create_libcxx,      libcxx_symbols,      ['libcxxabi'], True), # noqa\n-                 ('libcxxabi',     ext, create_libcxxabi,   libcxxabi_symbols,   [libc_name],   False), # noqa\n-                 ('gl',            ext, create_gl,          gl_symbols,          [libc_name],   False), # noqa\n-                 ('al',            ext, create_al,          al_symbols,          [libc_name],   False), # noqa\n-                 ('html5',         ext, create_html5,       html5_symbols,       [],            False), # noqa\n-                 ('compiler-rt',   'a', create_compiler_rt, compiler_rt_symbols, [libc_name],   False), # noqa\n-                 (malloc_name(),   ext, create_malloc,      [],                  [],            False)] # noqa\n+  system_libs = [Library('libcxx',        'a', create_libcxx,      libcxx_symbols,      ['libcxxabi'], True), # noqa\n+                 Library('libcxxabi',     ext, create_libcxxabi,   libcxxabi_symbols,   [libc_name],   False), # noqa\n+                 Library('gl',            ext, create_gl,          gl_symbols,          [libc_name],   False), # noqa\n+                 Library('al',            ext, create_al,          al_symbols,          [libc_name],   False), # noqa\n+                 Library('html5',         ext, create_html5,       html5_symbols,       [],            False), # noqa\n+                 Library('compiler-rt',   'a', create_compiler_rt, compiler_rt_symbols, [libc_name],   False), # noqa\n+                 Library(malloc_name(),   ext, create_malloc,      [],                  [],            False)] # noqa\n \n   if shared.Settings.USE_PTHREADS:\n-    system_libs += [('pthreads',       ext, create_pthreads,       pthreads_symbols,       [libc_name],  False), # noqa\n-                    ('pthreads_asmjs', ext, create_pthreads_asmjs, asmjs_pthreads_symbols, [libc_name],  False)] # noqa\n+    system_libs += [Library('pthreads',       ext, create_pthreads,       pthreads_symbols,       [libc_name],  False), # noqa\n+                    Library('pthreads_asmjs', ext, create_pthreads_asmjs, asmjs_pthreads_symbols, [libc_name],  False)] # noqa\n \n-  system_libs += [(libc_name, ext, create_libc, libc_symbols, libc_deps, False)]\n+  system_libs.append(Library(libc_name, ext, create_libc, libc_symbols, libc_deps, False))\n \n   # if building to wasm, we need more math code, since we have less builtins\n   if shared.Settings.WASM:\n-    system_libs += [('wasm-libc', ext, create_wasm_libc, wasm_libc_symbols, [], False)]\n+    system_libs.append(Library('wasm-libc', ext, create_wasm_libc, wasm_libc_symbols, [], False))\n \n   # Add libc-extras at the end, as libc may end up requiring them, and they depend on nothing.\n-  system_libs += [('libc-extras', ext, create_libc_extras, libc_extras_symbols, [], False)]\n+  system_libs.append(Library('libc-extras', ext, create_libc_extras, libc_extras_symbols, [], False))\n \n-  force.add(malloc_name())\n-  if shared.Settings.WASM_BACKEND:\n-    force.add('compiler-rt')\n+  ret = []\n+  included = set()\n \n-  # Go over libraries to figure out which we must include\n   def maybe_noexcept(name):\n     if shared.Settings.DISABLE_EXCEPTION_CATCHING:\n       name += '_noexcept'\n     return name\n-  ret = []\n-  has = need = None\n \n-  all_names = [s[0] for s in system_libs]\n+  system_libs_map = {l.shortname: l for l in system_libs}\n+\n+  def add_library(lib):\n+    if lib.shortname in included:\n+      return\n+    included.add(lib.shortname)\n \n-  for shortname, suffix, create, library_symbols, deps, can_noexcept in system_libs:\n-    assert all(d in all_names for d in deps)\n-    force_this = force_all or shortname in force\n-    if can_noexcept:\n+    shortname = lib.shortname\n+    if lib.can_noexcept:\n       shortname = maybe_noexcept(shortname)\n-    if force_this and not shared.Settings.WASM_OBJECT_FILES:\n-      # .a files do not always link in all their parts; don't use them when forced\n-      # When using wasm object files there are only .a archives but they get\n-      # included via --whole-archive.\n-      suffix = 'bc'\n-    name = shortname + '.' + suffix\n-\n-    if not force_this:\n-      need = set()\n-      has = set()\n+    name = shortname + '.' + lib.suffix\n+\n+    logging.debug('including %s' % name)\n+\n+    def do_create():\n+      return lib.create(name)\n+\n+    libfile = shared.Cache.get(name, do_create, extension=lib.suffix)\n+    need_whole_archive = lib.shortname in force and lib.suffix != 'bc'\n+    ret.append((libfile, need_whole_archive))\n+\n+    # Recursively add dependencies\n+    for d in lib.deps:\n+      add_library(system_libs_map[d])\n+\n+  # Go over libraries to figure out which we must include\n+  for lib in system_libs:\n+    if lib.shortname in included:\n+      continue\n+    force_this = lib.shortname in force\n+    if not force_this and only_forced:\n+      continue\n+    include_this = force_this or lib.shortname in include","path":"tools/system_libs.py","position":136,"original_position":136,"commit_id":"78b94c281415adef859f36a9b0370fe23f6e2539","original_commit_id":"78b94c281415adef859f36a9b0370fe23f6e2539","user":{"login":"jgravelle-google","id":20847303,"node_id":"MDQ6VXNlcjIwODQ3MzAz","avatar_url":"https://avatars3.githubusercontent.com/u/20847303?v=4","gravatar_id":"","url":"https://api.github.com/users/jgravelle-google","html_url":"https://github.com/jgravelle-google","followers_url":"https://api.github.com/users/jgravelle-google/followers","following_url":"https://api.github.com/users/jgravelle-google/following{/other_user}","gists_url":"https://api.github.com/users/jgravelle-google/gists{/gist_id}","starred_url":"https://api.github.com/users/jgravelle-google/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/jgravelle-google/subscriptions","organizations_url":"https://api.github.com/users/jgravelle-google/orgs","repos_url":"https://api.github.com/users/jgravelle-google/repos","events_url":"https://api.github.com/users/jgravelle-google/events{/privacy}","received_events_url":"https://api.github.com/users/jgravelle-google/received_events","type":"User","site_admin":false},"body":"Wait we have an `include` and an `included`? That's really hard to keep straight at first glance. We should rename one of them to `included_in_link` or `to_be_included` or `to_include` or something to make it more than a one-char difference","created_at":"2018-10-12T19:39:28Z","updated_at":"2018-10-12T19:59:17Z","html_url":"https://github.com/kripken/emscripten/pull/7274#discussion_r224895051","pull_request_url":"https://api.github.com/repos/kripken/emscripten/pulls/7274","author_association":"COLLABORATOR","_links":{"self":{"href":"https://api.github.com/repos/kripken/emscripten/pulls/comments/224895051"},"html":{"href":"https://github.com/kripken/emscripten/pull/7274#discussion_r224895051"},"pull_request":{"href":"https://api.github.com/repos/kripken/emscripten/pulls/7274"}}},"pull_request":{"url":"https://api.github.com/repos/kripken/emscripten/pulls/7274","id":222549047,"node_id":"MDExOlB1bGxSZXF1ZXN0MjIyNTQ5MDQ3","html_url":"https://github.com/kripken/emscripten/pull/7274","diff_url":"https://github.com/kripken/emscripten/pull/7274.diff","patch_url":"https://github.com/kripken/emscripten/pull/7274.patch","issue_url":"https://api.github.com/repos/kripken/emscripten/issues/7274","number":7274,"state":"open","locked":false,"title":"Implement EMCC_FORCE_STDLIBS using --whole-archive","user":{"login":"sbc100","id":515813,"node_id":"MDQ6VXNlcjUxNTgxMw==","avatar_url":"https://avatars2.githubusercontent.com/u/515813?v=4","gravatar_id":"","url":"https://api.github.com/users/sbc100","html_url":"https://github.com/sbc100","followers_url":"https://api.github.com/users/sbc100/followers","following_url":"https://api.github.com/users/sbc100/following{/other_user}","gists_url":"https://api.github.com/users/sbc100/gists{/gist_id}","starred_url":"https://api.github.com/users/sbc100/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/sbc100/subscriptions","organizations_url":"https://api.github.com/users/sbc100/orgs","repos_url":"https://api.github.com/users/sbc100/repos","events_url":"https://api.github.com/users/sbc100/events{/privacy}","received_events_url":"https://api.github.com/users/sbc100/received_events","type":"User","site_admin":false},"body":"Previously when using EMCC_FORCE_STDLIBS we were building a second\r\n`.bc` copy of any `.a` libraries.  Not that we have\r\n--whole-archive/--no-whole-archive we no longer need to do this.\r\n\r\nThis change also refactors a bunch of code in system_libs that\r\nincludes a couple of fixes:\r\n\r\n- Libraries can now depend in other libraries that appear earlier in\r\n  the list.\r\n- Libraries that are depended on by forced libraries are not themselves\r\n  treated as forced.","created_at":"2018-10-12T18:25:49Z","updated_at":"2018-10-12T19:59:17Z","closed_at":null,"merged_at":null,"merge_commit_sha":"72ca9fabf42dd629c5627b338cf88f3e73548706","assignee":null,"assignees":[],"requested_reviewers":[{"login":"kripken","id":173661,"node_id":"MDQ6VXNlcjE3MzY2MQ==","avatar_url":"https://avatars0.githubusercontent.com/u/173661?v=4","gravatar_id":"","url":"https://api.github.com/users/kripken","html_url":"https://github.com/kripken","followers_url":"https://api.github.com/users/kripken/followers","following_url":"https://api.github.com/users/kripken/following{/other_user}","gists_url":"https://api.github.com/users/kripken/gists{/gist_id}","starred_url":"https://api.github.com/users/kripken/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kripken/subscriptions","organizations_url":"https://api.github.com/users/kripken/orgs","repos_url":"https://api.github.com/users/kripken/repos","events_url":"https://api.github.com/users/kripken/events{/privacy}","received_events_url":"https://api.github.com/users/kripken/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[],"milestone":null,"commits_url":"https://api.github.com/repos/kripken/emscripten/pulls/7274/commits","review_comments_url":"https://api.github.com/repos/kripken/emscripten/pulls/7274/comments","review_comment_url":"https://api.github.com/repos/kripken/emscripten/pulls/comments{/number}","comments_url":"https://api.github.com/repos/kripken/emscripten/issues/7274/comments","statuses_url":"https://api.github.com/repos/kripken/emscripten/statuses/78b94c281415adef859f36a9b0370fe23f6e2539","head":{"label":"kripken:use_whole_archive_for_force","ref":"use_whole_archive_for_force","sha":"78b94c281415adef859f36a9b0370fe23f6e2539","user":{"login":"kripken","id":173661,"node_id":"MDQ6VXNlcjE3MzY2MQ==","avatar_url":"https://avatars0.githubusercontent.com/u/173661?v=4","gravatar_id":"","url":"https://api.github.com/users/kripken","html_url":"https://github.com/kripken","followers_url":"https://api.github.com/users/kripken/followers","following_url":"https://api.github.com/users/kripken/following{/other_user}","gists_url":"https://api.github.com/users/kripken/gists{/gist_id}","starred_url":"https://api.github.com/users/kripken/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kripken/subscriptions","organizations_url":"https://api.github.com/users/kripken/orgs","repos_url":"https://api.github.com/users/kripken/repos","events_url":"https://api.github.com/users/kripken/events{/privacy}","received_events_url":"https://api.github.com/users/kripken/received_events","type":"User","site_admin":false},"repo":{"id":1357796,"node_id":"MDEwOlJlcG9zaXRvcnkxMzU3Nzk2","name":"emscripten","full_name":"kripken/emscripten","private":false,"owner":{"login":"kripken","id":173661,"node_id":"MDQ6VXNlcjE3MzY2MQ==","avatar_url":"https://avatars0.githubusercontent.com/u/173661?v=4","gravatar_id":"","url":"https://api.github.com/users/kripken","html_url":"https://github.com/kripken","followers_url":"https://api.github.com/users/kripken/followers","following_url":"https://api.github.com/users/kripken/following{/other_user}","gists_url":"https://api.github.com/users/kripken/gists{/gist_id}","starred_url":"https://api.github.com/users/kripken/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kripken/subscriptions","organizations_url":"https://api.github.com/users/kripken/orgs","repos_url":"https://api.github.com/users/kripken/repos","events_url":"https://api.github.com/users/kripken/events{/privacy}","received_events_url":"https://api.github.com/users/kripken/received_events","type":"User","site_admin":false},"html_url":"https://github.com/kripken/emscripten","description":"Emscripten: An LLVM-to-JavaScript Compiler","fork":false,"url":"https://api.github.com/repos/kripken/emscripten","forks_url":"https://api.github.com/repos/kripken/emscripten/forks","keys_url":"https://api.github.com/repos/kripken/emscripten/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kripken/emscripten/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kripken/emscripten/teams","hooks_url":"https://api.github.com/repos/kripken/emscripten/hooks","issue_events_url":"https://api.github.com/repos/kripken/emscripten/issues/events{/number}","events_url":"https://api.github.com/repos/kripken/emscripten/events","assignees_url":"https://api.github.com/repos/kripken/emscripten/assignees{/user}","branches_url":"https://api.github.com/repos/kripken/emscripten/branches{/branch}","tags_url":"https://api.github.com/repos/kripken/emscripten/tags","blobs_url":"https://api.github.com/repos/kripken/emscripten/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kripken/emscripten/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kripken/emscripten/git/refs{/sha}","trees_url":"https://api.github.com/repos/kripken/emscripten/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kripken/emscripten/statuses/{sha}","languages_url":"https://api.github.com/repos/kripken/emscripten/languages","stargazers_url":"https://api.github.com/repos/kripken/emscripten/stargazers","contributors_url":"https://api.github.com/repos/kripken/emscripten/contributors","subscribers_url":"https://api.github.com/repos/kripken/emscripten/subscribers","subscription_url":"https://api.github.com/repos/kripken/emscripten/subscription","commits_url":"https://api.github.com/repos/kripken/emscripten/commits{/sha}","git_commits_url":"https://api.github.com/repos/kripken/emscripten/git/commits{/sha}","comments_url":"https://api.github.com/repos/kripken/emscripten/comments{/number}","issue_comment_url":"https://api.github.com/repos/kripken/emscripten/issues/comments{/number}","contents_url":"https://api.github.com/repos/kripken/emscripten/contents/{+path}","compare_url":"https://api.github.com/repos/kripken/emscripten/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kripken/emscripten/merges","archive_url":"https://api.github.com/repos/kripken/emscripten/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kripken/emscripten/downloads","issues_url":"https://api.github.com/repos/kripken/emscripten/issues{/number}","pulls_url":"https://api.github.com/repos/kripken/emscripten/pulls{/number}","milestones_url":"https://api.github.com/repos/kripken/emscripten/milestones{/number}","notifications_url":"https://api.github.com/repos/kripken/emscripten/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kripken/emscripten/labels{/name}","releases_url":"https://api.github.com/repos/kripken/emscripten/releases{/id}","deployments_url":"https://api.github.com/repos/kripken/emscripten/deployments","created_at":"2011-02-12T05:23:30Z","updated_at":"2018-10-12T18:56:48Z","pushed_at":"2018-10-12T19:56:39Z","git_url":"git://github.com/kripken/emscripten.git","ssh_url":"git@github.com:kripken/emscripten.git","clone_url":"https://github.com/kripken/emscripten.git","svn_url":"https://github.com/kripken/emscripten","homepage":"","size":166249,"stargazers_count":15659,"watchers_count":15659,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1828,"mirror_url":null,"archived":false,"open_issues_count":1614,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":1828,"open_issues":1614,"watchers":15659,"default_branch":"incoming"}},"base":{"label":"kripken:incoming","ref":"incoming","sha":"3159858854598f687c6fff8259ddf75f6aa73e17","user":{"login":"kripken","id":173661,"node_id":"MDQ6VXNlcjE3MzY2MQ==","avatar_url":"https://avatars0.githubusercontent.com/u/173661?v=4","gravatar_id":"","url":"https://api.github.com/users/kripken","html_url":"https://github.com/kripken","followers_url":"https://api.github.com/users/kripken/followers","following_url":"https://api.github.com/users/kripken/following{/other_user}","gists_url":"https://api.github.com/users/kripken/gists{/gist_id}","starred_url":"https://api.github.com/users/kripken/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kripken/subscriptions","organizations_url":"https://api.github.com/users/kripken/orgs","repos_url":"https://api.github.com/users/kripken/repos","events_url":"https://api.github.com/users/kripken/events{/privacy}","received_events_url":"https://api.github.com/users/kripken/received_events","type":"User","site_admin":false},"repo":{"id":1357796,"node_id":"MDEwOlJlcG9zaXRvcnkxMzU3Nzk2","name":"emscripten","full_name":"kripken/emscripten","private":false,"owner":{"login":"kripken","id":173661,"node_id":"MDQ6VXNlcjE3MzY2MQ==","avatar_url":"https://avatars0.githubusercontent.com/u/173661?v=4","gravatar_id":"","url":"https://api.github.com/users/kripken","html_url":"https://github.com/kripken","followers_url":"https://api.github.com/users/kripken/followers","following_url":"https://api.github.com/users/kripken/following{/other_user}","gists_url":"https://api.github.com/users/kripken/gists{/gist_id}","starred_url":"https://api.github.com/users/kripken/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/kripken/subscriptions","organizations_url":"https://api.github.com/users/kripken/orgs","repos_url":"https://api.github.com/users/kripken/repos","events_url":"https://api.github.com/users/kripken/events{/privacy}","received_events_url":"https://api.github.com/users/kripken/received_events","type":"User","site_admin":false},"html_url":"https://github.com/kripken/emscripten","description":"Emscripten: An LLVM-to-JavaScript Compiler","fork":false,"url":"https://api.github.com/repos/kripken/emscripten","forks_url":"https://api.github.com/repos/kripken/emscripten/forks","keys_url":"https://api.github.com/repos/kripken/emscripten/keys{/key_id}","collaborators_url":"https://api.github.com/repos/kripken/emscripten/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/kripken/emscripten/teams","hooks_url":"https://api.github.com/repos/kripken/emscripten/hooks","issue_events_url":"https://api.github.com/repos/kripken/emscripten/issues/events{/number}","events_url":"https://api.github.com/repos/kripken/emscripten/events","assignees_url":"https://api.github.com/repos/kripken/emscripten/assignees{/user}","branches_url":"https://api.github.com/repos/kripken/emscripten/branches{/branch}","tags_url":"https://api.github.com/repos/kripken/emscripten/tags","blobs_url":"https://api.github.com/repos/kripken/emscripten/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/kripken/emscripten/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/kripken/emscripten/git/refs{/sha}","trees_url":"https://api.github.com/repos/kripken/emscripten/git/trees{/sha}","statuses_url":"https://api.github.com/repos/kripken/emscripten/statuses/{sha}","languages_url":"https://api.github.com/repos/kripken/emscripten/languages","stargazers_url":"https://api.github.com/repos/kripken/emscripten/stargazers","contributors_url":"https://api.github.com/repos/kripken/emscripten/contributors","subscribers_url":"https://api.github.com/repos/kripken/emscripten/subscribers","subscription_url":"https://api.github.com/repos/kripken/emscripten/subscription","commits_url":"https://api.github.com/repos/kripken/emscripten/commits{/sha}","git_commits_url":"https://api.github.com/repos/kripken/emscripten/git/commits{/sha}","comments_url":"https://api.github.com/repos/kripken/emscripten/comments{/number}","issue_comment_url":"https://api.github.com/repos/kripken/emscripten/issues/comments{/number}","contents_url":"https://api.github.com/repos/kripken/emscripten/contents/{+path}","compare_url":"https://api.github.com/repos/kripken/emscripten/compare/{base}...{head}","merges_url":"https://api.github.com/repos/kripken/emscripten/merges","archive_url":"https://api.github.com/repos/kripken/emscripten/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/kripken/emscripten/downloads","issues_url":"https://api.github.com/repos/kripken/emscripten/issues{/number}","pulls_url":"https://api.github.com/repos/kripken/emscripten/pulls{/number}","milestones_url":"https://api.github.com/repos/kripken/emscripten/milestones{/number}","notifications_url":"https://api.github.com/repos/kripken/emscripten/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/kripken/emscripten/labels{/name}","releases_url":"https://api.github.com/repos/kripken/emscripten/releases{/id}","deployments_url":"https://api.github.com/repos/kripken/emscripten/deployments","created_at":"2011-02-12T05:23:30Z","updated_at":"2018-10-12T18:56:48Z","pushed_at":"2018-10-12T19:56:39Z","git_url":"git://github.com/kripken/emscripten.git","ssh_url":"git@github.com:kripken/emscripten.git","clone_url":"https://github.com/kripken/emscripten.git","svn_url":"https://github.com/kripken/emscripten","homepage":"","size":166249,"stargazers_count":15659,"watchers_count":15659,"language":"C","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":1828,"mirror_url":null,"archived":false,"open_issues_count":1614,"license":{"key":"other","name":"Other","spdx_id":"NOASSERTION","url":null,"node_id":"MDc6TGljZW5zZTA="},"forks":1828,"open_issues":1614,"watchers":15659,"default_branch":"incoming"}},"_links":{"self":{"href":"https://api.github.com/repos/kripken/emscripten/pulls/7274"},"html":{"href":"https://github.com/kripken/emscripten/pull/7274"},"issue":{"href":"https://api.github.com/repos/kripken/emscripten/issues/7274"},"comments":{"href":"https://api.github.com/repos/kripken/emscripten/issues/7274/comments"},"review_comments":{"href":"https://api.github.com/repos/kripken/emscripten/pulls/7274/comments"},"review_comment":{"href":"https://api.github.com/repos/kripken/emscripten/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/kripken/emscripten/pulls/7274/commits"},"statuses":{"href":"https://api.github.com/repos/kripken/emscripten/statuses/78b94c281415adef859f36a9b0370fe23f6e2539"}},"author_association":"COLLABORATOR"}}
{"actor":{"display_login":"jgravelle-google"}}