Status for Dolphin Central

Recent events

2019-03-23T19:16:14.327822	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-ubu-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/4327', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-ubu-x64'}
2019-03-23T19:16:14.064923	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89685, 'properties': {'shortrev': ['7cfb62', 'Trigger'], 'revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'Trigger'], 'buildnumber': [4117, 'Build'], 'workername': ['hive', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-fifoci-sw-lin-mesa', 'Builder'], 'branchname': ['pr-7903', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'slavename': ['hive', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'pr_id': [7903, 'Trigger'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26327, 'complete_at': None, 'parent_buildid': 63302, 'submitted_at': 1553368572, 'parent_relationship': 'Triggered from', 'complete': False, 'external_idstring': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'sourcestamps': [{'project': '', 'revision': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1553368573, 'ssid': 7102, 'codebase': ''}]}, 'number': 4117, 'buildid': 63304, 'url': 'https://buildbot.dolphin-emu.org/#builders/17/builds/4117', 'buildrequest': {'buildrequestid': 89685, 'buildsetid': 26327, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368573, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 17, 'submitted_at': 1553368572, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-fifoci-sw-lin-mesa', 'masterids': [1], 'builderid': 17, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 17, 'started_at': 1553368574, 'state_string': 'starting', 'workerid': 6, 'masterid': 1}}
2019-03-23T19:16:13.810252	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:16:13.809439	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-deb-dbg-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/3787', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-deb-dbg-x64'}
2019-03-23T19:16:13.779953	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89687, 'properties': {'shortrev': ['7cfb62', 'Trigger'], 'revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'Trigger'], 'buildnumber': [4118, 'Build'], 'workername': ['hive', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-fifoci-ogl-lin-mesa', 'Builder'], 'branchname': ['pr-7903', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'slavename': ['hive', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'pr_id': [7903, 'Trigger'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26327, 'complete_at': None, 'parent_buildid': 63302, 'submitted_at': 1553368572, 'parent_relationship': 'Triggered from', 'complete': False, 'external_idstring': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'sourcestamps': [{'project': '', 'revision': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1553368573, 'ssid': 7102, 'codebase': ''}]}, 'number': 4118, 'buildid': 63303, 'url': 'https://buildbot.dolphin-emu.org/#builders/30/builds/4118', 'buildrequest': {'buildrequestid': 89687, 'buildsetid': 26327, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368573, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 30, 'submitted_at': 1553368572, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-fifoci-ogl-lin-mesa', 'masterids': [1], 'builderid': 30, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 30, 'started_at': 1553368574, 'state_string': 'starting', 'workerid': 6, 'masterid': 1}}
2019-03-23T19:16:13.543400	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89674, 'properties': {'warnings-count': [27, 'WarningCountingShellCommand'], 'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/home/buildslave/worker/pr-ubu-x64', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildername': ['pr-ubu-x64', 'Builder'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [4327, 'Build'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4327, 'buildid': 63302, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/4327', 'buildrequest': {'buildrequestid': 89674, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368540, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 2, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-ubu-x64', 'masterids': [1], 'builderid': 2, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368573, 'builderid': 2, 'started_at': 1553368540, 'state_string': 'build successful', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:16:13.261546	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:16:13.260321	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89679, 'properties': {'warnings-count': [61, 'WarningCountingShellCommand'], 'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/home/delroth/buildslave/pr-deb-dbg-x64', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildername': ['pr-deb-dbg-x64', 'Builder'], 'workername': ['debian', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [3787, 'Build'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['debian', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 3787, 'buildid': 63300, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/3787', 'buildrequest': {'buildrequestid': 89679, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368504, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 21, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-deb-dbg-x64', 'masterids': [1], 'builderid': 21, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368573, 'builderid': 21, 'started_at': 1553368504, 'state_string': 'build successful', 'workerid': 12, 'masterid': 1}}
2019-03-23T19:15:41.269963	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-ubu-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/4327', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-ubu-x64'}
2019-03-23T19:15:40.752813	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:40.751698	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'lint', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/4316', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder lint'}
2019-03-23T19:15:40.296694	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89674, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'buildnumber': [4327, 'Build'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-ubu-x64', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4327, 'buildid': 63302, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/4327', 'buildrequest': {'buildrequestid': 89674, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368540, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 2, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-ubu-x64', 'masterids': [1], 'builderid': 2, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 2, 'started_at': 1553368540, 'state_string': 'starting', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:15:40.205032	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:40.203938	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89680, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/home/buildslave/worker/lint', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildnumber': [4316, 'Build'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildername': ['lint', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4316, 'buildid': 63301, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/4316', 'buildrequest': {'buildrequestid': 89680, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368535, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 22, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'lint', 'masterids': [1], 'builderid': 22, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368540, 'builderid': 22, 'started_at': 1553368536, 'state_string': 'build successful', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:15:36.766018	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'lint', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/4316', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder lint'}
2019-03-23T19:15:36.712071	{'source': 'webserver', 'type': 'raw_gh_hook', 'gh_type': 'issue_comment', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T19:13:37Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': '<img width="967" alt="Screen Shot 2019-03-17 at 15 52 23" src="https://user-images.githubusercontent.com/1440715/54493136-c197f380-48cc-11e9-9063-71081c594388.png">\r\n\r\n**Known issues:**\r\n- ~~There\'s no hotkey for toggling the chat~~ (Maybe later?)\r\n- ~~Pressing Enter to send messages does not work yet~~\r\n- ~~Not usable when controllers are mapped to the keyboard~~\r\n- ~~The text cursor is not displaying properly~~', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903'}, 'locked': False, 'closed_at': None, 'number': 7903, 'labels': [], 'comments': 3, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYxODA4ODc4', 'state': 'open', 'updated_at': '2019-03-23T19:15:36Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903', 'created_at': '2019-03-17T00:11:15Z', 'title': 'Add imgui-based Netplay Chat', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/comments', 'id': 421866296}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-23T19:15:36Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903#issuecomment-475896830', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903', 'created_at': '2019-03-23T19:15:36Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475896830', 'body': "This doesn't seem to be implementable in a proper way without a global variable, so I reintroduced it.\r\n\r\nReasons for that:\r\n* Greatly increases complexity\r\n* The availability of ``g_renderer``at any given point varies greatly which makes it hard to interact with from the UI thread.", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTg5NjgzMA==', 'id': 475896830}}}
2019-03-23T19:15:36.712031	{'safe_author': True, 'source': 'ghhookparser', 'body': "This doesn't seem to be implementable in a proper way without a global variable, so I reintroduced it.\r\n\r\nReasons for that:\r\n* Greatly increases complexity\r\n* The availability of ``g_renderer``at any given point varies greatly which makes it hard to interact with from the UI thread.", 'action': 'created', 'author': 'spycrab', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7903#issuecomment-475896830', 'type': 'gh_issue_comment', 'title': 'Add imgui-based Netplay Chat', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T19:13:37Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': '<img width="967" alt="Screen Shot 2019-03-17 at 15 52 23" src="https://user-images.githubusercontent.com/1440715/54493136-c197f380-48cc-11e9-9063-71081c594388.png">\r\n\r\n**Known issues:**\r\n- ~~There\'s no hotkey for toggling the chat~~ (Maybe later?)\r\n- ~~Pressing Enter to send messages does not work yet~~\r\n- ~~Not usable when controllers are mapped to the keyboard~~\r\n- ~~The text cursor is not displaying properly~~', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903'}, 'locked': False, 'closed_at': None, 'number': 7903, 'labels': [], 'comments': 3, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYxODA4ODc4', 'state': 'open', 'updated_at': '2019-03-23T19:15:36Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903', 'created_at': '2019-03-17T00:11:15Z', 'title': 'Add imgui-based Netplay Chat', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/comments', 'id': 421866296}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-23T19:15:36Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903#issuecomment-475896830', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903', 'created_at': '2019-03-23T19:15:36Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475896830', 'body': "This doesn't seem to be implementable in a proper way without a global variable, so I reintroduced it.\r\n\r\nReasons for that:\r\n* Greatly increases complexity\r\n* The availability of ``g_renderer``at any given point varies greatly which makes it hard to interact with from the UI thread.", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTg5NjgzMA==', 'id': 475896830}}, 'id': 7903}
2019-03-23T19:15:36.256496	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:36.255478	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89680, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'buildnumber': [4316, 'Build'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildername': ['lint', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4316, 'buildid': 63301, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/4316', 'buildrequest': {'buildrequestid': 89680, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368535, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 22, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'lint', 'masterids': [1], 'builderid': 22, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 22, 'started_at': 1553368536, 'state_string': 'starting', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:15:36.220945	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-android', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/4337', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-android'}
2019-03-23T19:15:35.528354	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:35.527246	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89677, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/home/buildslave/worker/pr-android', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildnumber': [4337, 'Build'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-android', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4337, 'buildid': 63296, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/4337', 'buildrequest': {'buildrequestid': 89677, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368418, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 8, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-android', 'masterids': [1], 'builderid': 8, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368536, 'builderid': 8, 'started_at': 1553368419, 'state_string': 'build successful', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:15:05.415287	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-deb-dbg-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/3787', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-deb-dbg-x64'}
2019-03-23T19:15:04.844619	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:04.843380	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-deb-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/3801', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-deb-x64'}

Recent 'build_status' events

2019-03-23T19:16:14.327822	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-ubu-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/4327', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-ubu-x64'}
2019-03-23T19:16:13.809439	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-deb-dbg-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/3787', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-deb-dbg-x64'}
2019-03-23T19:15:41.269963	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-ubu-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/4327', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-ubu-x64'}
2019-03-23T19:15:40.751698	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'lint', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/4316', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder lint'}
2019-03-23T19:15:36.766018	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'lint', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/4316', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder lint'}
2019-03-23T19:15:36.220945	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-android', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/4337', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-android'}
2019-03-23T19:15:05.415287	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-deb-dbg-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/3787', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-deb-dbg-x64'}
2019-03-23T19:15:04.843380	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-deb-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/3801', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-deb-x64'}
2019-03-23T19:14:19.444858	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-freebsd-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/4370', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-freebsd-x64'}
2019-03-23T19:13:41.327554	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-deb-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/3801', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-deb-x64'}
2019-03-23T19:13:40.787130	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-freebsd-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/4370', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-freebsd-x64'}
2019-03-23T19:13:40.249788	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-win-dbg-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/4373', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-win-dbg-x64'}
2019-03-23T19:13:39.722966	{'shortrev': '7cfb62', 'source': 'buildbot', 'service': 'pr-android', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/4337', 'pending': True, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-android'}
2019-03-23T19:13:38.111867	{'shortrev': '7cfb62', 'source': 'prbuilder', 'service': 'default', 'success': True, 'url': '', 'pending': False, 'hash': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'type': 'build_status', 'pr': 7903, 'repo': 'dolphin-emu/dolphin', 'description': 'Very basic checks passed, handed off to Buildbot.'}
2019-03-23T17:55:11.938627	{'shortrev': '063543', 'source': 'buildbot', 'service': 'pr-win-dbg-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/4372', 'pending': False, 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-win-dbg-x64'}
2019-03-23T17:53:50.047053	{'shortrev': '063543', 'source': 'buildbot', 'service': 'pr-win-dbg-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/4372', 'pending': True, 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-win-dbg-x64'}
2019-03-23T17:53:49.487337	{'shortrev': '063543', 'source': 'buildbot', 'service': 'pr-win-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/4386', 'pending': False, 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-win-x64'}
2019-03-23T17:53:13.808633	{'shortrev': '063543', 'source': 'buildbot', 'service': 'pr-win-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/4386', 'pending': True, 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-win-x64'}
2019-03-23T17:53:13.230616	{'shortrev': '5d5d13', 'source': 'buildbot', 'service': 'pr-win-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/4385', 'pending': False, 'hash': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-win-x64'}
2019-03-23T17:51:14.108113	{'shortrev': '063543', 'source': 'buildbot', 'service': 'pr-android', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/4336', 'pending': False, 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-android'}
2019-03-23T17:50:58.497253	{'shortrev': '063543', 'source': 'buildbot', 'service': 'pr-deb-dbg-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/3786', 'pending': False, 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-deb-dbg-x64'}
2019-03-23T17:50:20.069443	{'shortrev': '5d5d13', 'source': 'buildbot', 'service': 'pr-win-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/4385', 'pending': True, 'hash': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-win-x64'}
2019-03-23T17:50:19.522612	{'shortrev': '5d5d13', 'source': 'buildbot', 'service': 'pr-win-dbg-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/4371', 'pending': False, 'hash': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-win-dbg-x64'}
2019-03-23T17:50:13.584411	{'shortrev': '063543', 'source': 'buildbot', 'service': 'pr-deb-dbg-x64', 'success': False, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/3786', 'pending': True, 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Auto build in progress on builder pr-deb-dbg-x64'}
2019-03-23T17:50:13.004008	{'shortrev': '063543', 'source': 'buildbot', 'service': 'pr-deb-x64', 'success': True, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/3800', 'pending': False, 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'type': 'build_status', 'pr': 7922, 'repo': 'dolphin-emu/dolphin', 'description': 'Build succeeded on builder pr-deb-x64'}

Recent 'gh_commit_comment' events

2018-12-26T21:12:26.840256	{'commit': '965b5b6b0a74f6d2f0db4fdf258881f5acfc00e3', 'source': 'ghhookparser', 'type': 'gh_commit_comment', 'url': 'https://github.com/dolphin-emu/dolphin/commit/965b5b6b0a74f6d2f0db4fdf258881f5acfc00e3#commitcomment-31784033', 'author': 'AndSalazar3', 'repo': 'dolphin-emu/dolphin'}
2018-12-26T12:00:58.721926	{'commit': 'd1ce8aca9d4fe144aeb5951ddeee68cbf220833c', 'source': 'ghhookparser', 'type': 'gh_commit_comment', 'url': 'https://github.com/dolphin-emu/dolphin/commit/d1ce8aca9d4fe144aeb5951ddeee68cbf220833c#commitcomment-31781119', 'author': 'JMC47', 'repo': 'dolphin-emu/dolphin'}
2018-12-26T11:58:05.229899	{'commit': 'd1ce8aca9d4fe144aeb5951ddeee68cbf220833c', 'source': 'ghhookparser', 'type': 'gh_commit_comment', 'url': 'https://github.com/dolphin-emu/dolphin/commit/d1ce8aca9d4fe144aeb5951ddeee68cbf220833c#commitcomment-31781097', 'author': 'jackrabbit72380', 'repo': 'dolphin-emu/dolphin'}

Recent 'gh_issue_comment' events

2019-03-23T19:15:36.712031	{'safe_author': True, 'source': 'ghhookparser', 'body': "This doesn't seem to be implementable in a proper way without a global variable, so I reintroduced it.\r\n\r\nReasons for that:\r\n* Greatly increases complexity\r\n* The availability of ``g_renderer``at any given point varies greatly which makes it hard to interact with from the UI thread.", 'action': 'created', 'author': 'spycrab', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7903#issuecomment-475896830', 'type': 'gh_issue_comment', 'title': 'Add imgui-based Netplay Chat', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T19:13:37Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': '<img width="967" alt="Screen Shot 2019-03-17 at 15 52 23" src="https://user-images.githubusercontent.com/1440715/54493136-c197f380-48cc-11e9-9063-71081c594388.png">\r\n\r\n**Known issues:**\r\n- ~~There\'s no hotkey for toggling the chat~~ (Maybe later?)\r\n- ~~Pressing Enter to send messages does not work yet~~\r\n- ~~Not usable when controllers are mapped to the keyboard~~\r\n- ~~The text cursor is not displaying properly~~', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903'}, 'locked': False, 'closed_at': None, 'number': 7903, 'labels': [], 'comments': 3, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYxODA4ODc4', 'state': 'open', 'updated_at': '2019-03-23T19:15:36Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903', 'created_at': '2019-03-17T00:11:15Z', 'title': 'Add imgui-based Netplay Chat', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/comments', 'id': 421866296}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-23T19:15:36Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903#issuecomment-475896830', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903', 'created_at': '2019-03-23T19:15:36Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475896830', 'body': "This doesn't seem to be implementable in a proper way without a global variable, so I reintroduced it.\r\n\r\nReasons for that:\r\n* Greatly increases complexity\r\n* The availability of ``g_renderer``at any given point varies greatly which makes it hard to interact with from the UI thread.", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTg5NjgzMA==', 'id': 475896830}}, 'id': 7903}
2019-03-23T15:56:16.228763	{'safe_author': True, 'source': 'ghhookparser', 'body': "Seems like lint doesn't understand that a CJK character isn't three columns wide just because it takes up 3 bytes in UTF-8. Oh well.", 'action': 'created', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#issuecomment-475880990', 'type': 'gh_issue_comment', 'title': '[WIP] Add a Verify tab to game properties', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T15:56:08Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'This PR adds a new tab to the game properties window where you can check for problems with your games. Hopefully this can cut down a bit on people who ask about problems that turn out to be caused by bad dumps. For instance, there\'s a message about not having combined the files that CleanRip produces, and there\'s a message you get if you\'ve pirated a single-layer version of a game that\'s supposed to be dual-layer. Some screenshots to show what it looks like:\r\n\r\nMy good dump of Rodea the Sky Soldier (NTSC-K):\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868219-0bc41d80-4d82-11e9-83a6-1b3f0bc32383.png)\r\n\r\nThe same game but with the IOS slot hex edited to reproduce https://bugs.dolphin-emu.org/issues/10319:\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868230-3b732580-4d82-11e9-96ba-24e392dec65b.png)\r\n\r\nThis is a WIP for now, but feel free to review, as long as it isn\'t about the `Process()` function (I\'m going to change it later). Left to do:\r\n\r\n- [ ] Integrate the "Check Partition Integrity" feature (currently in the Filesystem tab)\r\n- [ ] Integrate checksum calculation (currently in the Info tab)\r\n\r\nIt would also be nice to include the ability to verify hashes with Redump.org or a similar database (https://bugs.dolphin-emu.org/issues/10867), but that\'s complex enough that I don\'t want to do it in this PR.', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922'}, 'locked': False, 'closed_at': None, 'number': 7922, 'labels': [], 'comments': 0, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzODQxMzU0', 'state': 'open', 'updated_at': '2019-03-23T15:56:15Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'created_at': '2019-03-23T15:50:15Z', 'title': '[WIP] Add a Verify tab to game properties', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/comments', 'id': 424514343}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-23T15:56:15Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#issuecomment-475880990', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922', 'created_at': '2019-03-23T15:56:15Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475880990', 'body': "Seems like lint doesn't understand that a CJK character isn't three columns wide just because it takes up 3 bytes in UTF-8. Oh well.", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTg4MDk5MA==', 'id': 475880990}}, 'id': 7922}
2019-03-23T15:03:14.186319	{'safe_author': True, 'source': 'ghhookparser', 'body': "> I'm going to add some IR calibration logic which will move the in game cursor to maybe 3 or 4 select positions on the screen for the user to click/touch so the ideal Width/Height/Center settings can be calculated.\r\n> \r\n> I don't know if the game specific IR values should be removed or not. There are definitely some games that are going to need non-default values (Skyward Sword, for one).\r\n\r\nWe can cross that bridge when we come to it. I'm just putting this up so we don't tag a beta with broken touch pointer. \r\n\r\nOn the topic of game specific values, I looked over the forums and playstore reviews and didn't find a mention(after PR7500 was merged) of anyone complaining about the touch pointer not mapping 1-1. Seems that the users are able to do the mapping themselves when needed. I think this also plays into the fact that all mappings would need to be updated when any axis logic changes(like in pr7829).", 'action': 'created', 'author': 'zackhow', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7921#issuecomment-475876906', 'type': 'gh_issue_comment', 'title': 'Android: Fix touch IR', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5143, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5143, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5143, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 166, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T13:52:26Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 166, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T14:22:51Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "This fixes touch IR after improvements from PR7829.\r\n\r\nAlso I've removed the game specific IR values. Most games map fine with the default values and I have yet to read a single complaint on mapping the touch pointer. Going to just leave it up to the users to setup mapping if the defaults don't work for a specific game. @Helios747 You were right :)", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/zackhow/followers', 'url': 'https://api.github.com/users/zackhow', 'organizations_url': 'https://api.github.com/users/zackhow/orgs', 'node_id': 'MDQ6VXNlcjQyNzA0NA==', 'events_url': 'https://api.github.com/users/zackhow/events{/privacy}', 'repos_url': 'https://api.github.com/users/zackhow/repos', 'gists_url': 'https://api.github.com/users/zackhow/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/zackhow/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/zackhow/following{/other_user}', 'html_url': 'https://github.com/zackhow', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/427044?v=4', 'login': 'zackhow', 'subscriptions_url': 'https://api.github.com/users/zackhow/subscriptions', 'starred_url': 'https://api.github.com/users/zackhow/starred{/owner}{/repo}', 'id': 427044}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7921.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7921', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7921.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7921'}, 'locked': False, 'closed_at': None, 'number': 7921, 'labels': [], 'comments': 1, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzODMwMjI2', 'state': 'open', 'updated_at': '2019-03-23T15:03:13Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7921', 'created_at': '2019-03-23T12:36:38Z', 'title': 'Android: Fix touch IR', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921/comments', 'id': 424496320}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/zackhow/followers', 'url': 'https://api.github.com/users/zackhow', 'organizations_url': 'https://api.github.com/users/zackhow/orgs', 'node_id': 'MDQ6VXNlcjQyNzA0NA==', 'events_url': 'https://api.github.com/users/zackhow/events{/privacy}', 'repos_url': 'https://api.github.com/users/zackhow/repos', 'gists_url': 'https://api.github.com/users/zackhow/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/zackhow/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/zackhow/following{/other_user}', 'html_url': 'https://github.com/zackhow', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/427044?v=4', 'login': 'zackhow', 'subscriptions_url': 'https://api.github.com/users/zackhow/subscriptions', 'starred_url': 'https://api.github.com/users/zackhow/starred{/owner}{/repo}', 'id': 427044}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'MEMBER', 'updated_at': '2019-03-23T15:03:13Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/zackhow/followers', 'url': 'https://api.github.com/users/zackhow', 'organizations_url': 'https://api.github.com/users/zackhow/orgs', 'node_id': 'MDQ6VXNlcjQyNzA0NA==', 'events_url': 'https://api.github.com/users/zackhow/events{/privacy}', 'repos_url': 'https://api.github.com/users/zackhow/repos', 'gists_url': 'https://api.github.com/users/zackhow/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/zackhow/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/zackhow/following{/other_user}', 'html_url': 'https://github.com/zackhow', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/427044?v=4', 'login': 'zackhow', 'subscriptions_url': 'https://api.github.com/users/zackhow/subscriptions', 'starred_url': 'https://api.github.com/users/zackhow/starred{/owner}{/repo}', 'id': 427044}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7921#issuecomment-475876906', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921', 'created_at': '2019-03-23T15:03:13Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475876906', 'body': "> I'm going to add some IR calibration logic which will move the in game cursor to maybe 3 or 4 select positions on the screen for the user to click/touch so the ideal Width/Height/Center settings can be calculated.\r\n> \r\n> I don't know if the game specific IR values should be removed or not. There are definitely some games that are going to need non-default values (Skyward Sword, for one).\r\n\r\nWe can cross that bridge when we come to it. I'm just putting this up so we don't tag a beta with broken touch pointer. \r\n\r\nOn the topic of game specific values, I looked over the forums and playstore reviews and didn't find a mention(after PR7500 was merged) of anyone complaining about the touch pointer not mapping 1-1. Seems that the users are able to do the mapping themselves when needed. I think this also plays into the fact that all mappings would need to be updated when any axis logic changes(like in pr7829).", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTg3NjkwNg==', 'id': 475876906}}, 'id': 7921}
2019-03-23T14:35:02.873699	{'safe_author': True, 'source': 'ghhookparser', 'body': "I'm going to add some IR calibration logic which will move the in game cursor to maybe 3 or 4 select positions on the screen for the user to click/touch so the ideal Width/Height/Center settings can be calculated.\r\n\r\nI don't know if the game specific IR values should be removed or not. There are definitely some games that are going to need non-default values (Skyward Sword, for one).", 'action': 'created', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7921#issuecomment-475874791', 'type': 'gh_issue_comment', 'title': 'Android: Fix touch IR', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5143, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5143, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5143, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 166, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T13:52:26Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 166, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T14:22:51Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "This fixes touch IR after improvements from PR7829.\r\n\r\nAlso I've removed the game specific IR values. Most games map fine with the default values and I have yet to read a single complaint on mapping the touch pointer. Going to just leave it up to the users to setup mapping if the defaults don't work for a specific game. @Helios747 You were right :)", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/zackhow/followers', 'url': 'https://api.github.com/users/zackhow', 'organizations_url': 'https://api.github.com/users/zackhow/orgs', 'node_id': 'MDQ6VXNlcjQyNzA0NA==', 'events_url': 'https://api.github.com/users/zackhow/events{/privacy}', 'repos_url': 'https://api.github.com/users/zackhow/repos', 'gists_url': 'https://api.github.com/users/zackhow/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/zackhow/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/zackhow/following{/other_user}', 'html_url': 'https://github.com/zackhow', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/427044?v=4', 'login': 'zackhow', 'subscriptions_url': 'https://api.github.com/users/zackhow/subscriptions', 'starred_url': 'https://api.github.com/users/zackhow/starred{/owner}{/repo}', 'id': 427044}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7921.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7921', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7921.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7921'}, 'locked': False, 'closed_at': None, 'number': 7921, 'labels': [], 'comments': 0, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzODMwMjI2', 'state': 'open', 'updated_at': '2019-03-23T14:35:02Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7921', 'created_at': '2019-03-23T12:36:38Z', 'title': 'Android: Fix touch IR', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921/comments', 'id': 424496320}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'MEMBER', 'updated_at': '2019-03-23T14:35:02Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7921#issuecomment-475874791', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7921', 'created_at': '2019-03-23T14:35:02Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475874791', 'body': "I'm going to add some IR calibration logic which will move the in game cursor to maybe 3 or 4 select positions on the screen for the user to click/touch so the ideal Width/Height/Center settings can be calculated.\r\n\r\nI don't know if the game specific IR values should be removed or not. There are definitely some games that are going to need non-default values (Skyward Sword, for one).", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTg3NDc5MQ==', 'id': 475874791}}, 'id': 7921}
2019-03-23T04:12:08.436702	{'safe_author': False, 'source': 'ghhookparser', 'body': 'MotionPlus for what game ?', 'action': 'edited', 'author': 'falikhukoma1996', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#issuecomment-475837552', 'type': 'gh_issue_comment', 'title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'repo': 'dolphin-emu/dolphin', 'raw': {'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'action': 'edited', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5142, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5142, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5142, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 165, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T00:31:11Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 165, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T01:00:41Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'The emulated MotionPlus attachment is now enabled by default. ("Attach MotionPlus" setting in the emulated wiimote configuration)\r\n\r\nAngular velocity (gyro) data is generated from the existing IR/Tilt/Swing mappings.\r\n\r\nWii Sports Resort games are very playable with keyboard+mouse / gamepad.\r\n\r\nSkyward Sword is playable but select sections requiring unique movements will likely be difficult.\r\n\r\nRed Steel 2\'s tutorial was easy to complete with a keyboard and mouse but some changes will need to be done to allow easier ways to slowly move a wiimote about before performing fast swings.\r\n\r\n**Current problems:**\r\n~~The M+ initialization sequence involves a crypto "challenge" which will fail 50% of the time. (solution is being worked on)~~\r\nThanks everyone who helped break the M+ crypto!\r\n\r\nSkyward Sword\'s "cursor" movement is very different from any other game. It uses acceleration/gyro data in addition to IR data. It requires much more wiimote movement to reach screen edges than that of a typical game. This can be resolved with increased IR Width/Height settings but some tweaking of the underlying parameters will need to be done to support all games.\r\n\r\nAdditional input mappings will need to be added to support the special movements required by all games. But this can be done at a later time.', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7861.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7861.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861'}, 'locked': False, 'closed_at': None, 'number': 7861, 'labels': [], 'comments': 2, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjU4OTAwODUz', 'state': 'open', 'updated_at': '2019-03-23T04:12:07Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861', 'created_at': '2019-03-06T22:17:17Z', 'title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861/comments', 'id': 418035148}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/falikhukoma1996/followers', 'url': 'https://api.github.com/users/falikhukoma1996', 'organizations_url': 'https://api.github.com/users/falikhukoma1996/orgs', 'node_id': 'MDQ6VXNlcjQ1OTQzNDI2', 'events_url': 'https://api.github.com/users/falikhukoma1996/events{/privacy}', 'repos_url': 'https://api.github.com/users/falikhukoma1996/repos', 'gists_url': 'https://api.github.com/users/falikhukoma1996/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/falikhukoma1996/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/falikhukoma1996/following{/other_user}', 'html_url': 'https://github.com/falikhukoma1996', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/45943426?v=4', 'login': 'falikhukoma1996', 'subscriptions_url': 'https://api.github.com/users/falikhukoma1996/subscriptions', 'starred_url': 'https://api.github.com/users/falikhukoma1996/starred{/owner}{/repo}', 'id': 45943426}, 'changes': {'body': {'from': 'MotionPlus fir what game ?'}}, 'comment': {'author_association': 'NONE', 'updated_at': '2019-03-23T04:12:07Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/falikhukoma1996/followers', 'url': 'https://api.github.com/users/falikhukoma1996', 'organizations_url': 'https://api.github.com/users/falikhukoma1996/orgs', 'node_id': 'MDQ6VXNlcjQ1OTQzNDI2', 'events_url': 'https://api.github.com/users/falikhukoma1996/events{/privacy}', 'repos_url': 'https://api.github.com/users/falikhukoma1996/repos', 'gists_url': 'https://api.github.com/users/falikhukoma1996/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/falikhukoma1996/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/falikhukoma1996/following{/other_user}', 'html_url': 'https://github.com/falikhukoma1996', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/45943426?v=4', 'login': 'falikhukoma1996', 'subscriptions_url': 'https://api.github.com/users/falikhukoma1996/subscriptions', 'starred_url': 'https://api.github.com/users/falikhukoma1996/starred{/owner}{/repo}', 'id': 45943426}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#issuecomment-475837552', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861', 'created_at': '2019-03-23T04:11:57Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475837552', 'body': 'MotionPlus for what game ?', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTgzNzU1Mg==', 'id': 475837552}}, 'id': 7861}
2019-03-23T04:11:57.903564	{'safe_author': False, 'source': 'ghhookparser', 'body': 'MotionPlus fir what game ?', 'action': 'created', 'author': 'falikhukoma1996', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#issuecomment-475837552', 'type': 'gh_issue_comment', 'title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5142, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5142, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5142, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 165, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T00:31:11Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 165, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T01:00:41Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'The emulated MotionPlus attachment is now enabled by default. ("Attach MotionPlus" setting in the emulated wiimote configuration)\r\n\r\nAngular velocity (gyro) data is generated from the existing IR/Tilt/Swing mappings.\r\n\r\nWii Sports Resort games are very playable with keyboard+mouse / gamepad.\r\n\r\nSkyward Sword is playable but select sections requiring unique movements will likely be difficult.\r\n\r\nRed Steel 2\'s tutorial was easy to complete with a keyboard and mouse but some changes will need to be done to allow easier ways to slowly move a wiimote about before performing fast swings.\r\n\r\n**Current problems:**\r\n~~The M+ initialization sequence involves a crypto "challenge" which will fail 50% of the time. (solution is being worked on)~~\r\nThanks everyone who helped break the M+ crypto!\r\n\r\nSkyward Sword\'s "cursor" movement is very different from any other game. It uses acceleration/gyro data in addition to IR data. It requires much more wiimote movement to reach screen edges than that of a typical game. This can be resolved with increased IR Width/Height settings but some tweaking of the underlying parameters will need to be done to support all games.\r\n\r\nAdditional input mappings will need to be added to support the special movements required by all games. But this can be done at a later time.', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7861.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7861.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861'}, 'locked': False, 'closed_at': None, 'number': 7861, 'labels': [], 'comments': 1, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjU4OTAwODUz', 'state': 'open', 'updated_at': '2019-03-23T04:11:57Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861', 'created_at': '2019-03-06T22:17:17Z', 'title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861/comments', 'id': 418035148}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/falikhukoma1996/followers', 'url': 'https://api.github.com/users/falikhukoma1996', 'organizations_url': 'https://api.github.com/users/falikhukoma1996/orgs', 'node_id': 'MDQ6VXNlcjQ1OTQzNDI2', 'events_url': 'https://api.github.com/users/falikhukoma1996/events{/privacy}', 'repos_url': 'https://api.github.com/users/falikhukoma1996/repos', 'gists_url': 'https://api.github.com/users/falikhukoma1996/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/falikhukoma1996/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/falikhukoma1996/following{/other_user}', 'html_url': 'https://github.com/falikhukoma1996', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/45943426?v=4', 'login': 'falikhukoma1996', 'subscriptions_url': 'https://api.github.com/users/falikhukoma1996/subscriptions', 'starred_url': 'https://api.github.com/users/falikhukoma1996/starred{/owner}{/repo}', 'id': 45943426}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'NONE', 'updated_at': '2019-03-23T04:11:57Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/falikhukoma1996/followers', 'url': 'https://api.github.com/users/falikhukoma1996', 'organizations_url': 'https://api.github.com/users/falikhukoma1996/orgs', 'node_id': 'MDQ6VXNlcjQ1OTQzNDI2', 'events_url': 'https://api.github.com/users/falikhukoma1996/events{/privacy}', 'repos_url': 'https://api.github.com/users/falikhukoma1996/repos', 'gists_url': 'https://api.github.com/users/falikhukoma1996/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/falikhukoma1996/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/falikhukoma1996/following{/other_user}', 'html_url': 'https://github.com/falikhukoma1996', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/45943426?v=4', 'login': 'falikhukoma1996', 'subscriptions_url': 'https://api.github.com/users/falikhukoma1996/subscriptions', 'starred_url': 'https://api.github.com/users/falikhukoma1996/starred{/owner}{/repo}', 'id': 45943426}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#issuecomment-475837552', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7861', 'created_at': '2019-03-23T04:11:57Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475837552', 'body': 'MotionPlus fir what game ?', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTgzNzU1Mg==', 'id': 475837552}}, 'id': 7861}
2019-03-23T02:01:01.114815	{'safe_author': False, 'source': 'ghhookparser', 'body': 'Is there a reason these pull requests for debugger are not merged?', 'action': 'created', 'author': 'container1234', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7697#issuecomment-475829932', 'type': 'gh_issue_comment', 'title': 'Qt/Debugger Code View: Uses font based sizing and whitespace', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5142, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5142, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5142, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 165, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T00:31:11Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 165, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T01:00:41Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'Row height is now based on font size, allows more rows to fit on screen.\r\nAdded whitespace for padding. Also sets a minimum size for columns to reduce frequent resizing while scrolling. Some resizing still allowed.\r\nFixed the scrollbar to always work, allowing you to read the symbol text to the end.', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7697', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7697/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/TryTwo/followers', 'url': 'https://api.github.com/users/TryTwo', 'organizations_url': 'https://api.github.com/users/TryTwo/orgs', 'node_id': 'MDQ6VXNlcjEwNTMyODA2', 'events_url': 'https://api.github.com/users/TryTwo/events{/privacy}', 'repos_url': 'https://api.github.com/users/TryTwo/repos', 'gists_url': 'https://api.github.com/users/TryTwo/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/TryTwo/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/TryTwo/following{/other_user}', 'html_url': 'https://github.com/TryTwo', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/10532806?v=4', 'login': 'TryTwo', 'subscriptions_url': 'https://api.github.com/users/TryTwo/subscriptions', 'starred_url': 'https://api.github.com/users/TryTwo/starred{/owner}{/repo}', 'id': 10532806}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7697/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7697.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7697', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7697.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7697'}, 'locked': False, 'closed_at': None, 'number': 7697, 'labels': [], 'comments': 2, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjQ0MTkxNTM4', 'state': 'open', 'updated_at': '2019-03-23T02:01:00Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7697', 'created_at': '2019-01-12T01:34:24Z', 'title': 'Qt/Debugger Code View: Uses font based sizing and whitespace', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7697/comments', 'id': 398507446}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/container1234/followers', 'url': 'https://api.github.com/users/container1234', 'organizations_url': 'https://api.github.com/users/container1234/orgs', 'node_id': 'MDQ6VXNlcjIxMjc4MTQy', 'events_url': 'https://api.github.com/users/container1234/events{/privacy}', 'repos_url': 'https://api.github.com/users/container1234/repos', 'gists_url': 'https://api.github.com/users/container1234/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/container1234/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/container1234/following{/other_user}', 'html_url': 'https://github.com/container1234', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/21278142?v=4', 'login': 'container1234', 'subscriptions_url': 'https://api.github.com/users/container1234/subscriptions', 'starred_url': 'https://api.github.com/users/container1234/starred{/owner}{/repo}', 'id': 21278142}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-23T02:01:00Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/container1234/followers', 'url': 'https://api.github.com/users/container1234', 'organizations_url': 'https://api.github.com/users/container1234/orgs', 'node_id': 'MDQ6VXNlcjIxMjc4MTQy', 'events_url': 'https://api.github.com/users/container1234/events{/privacy}', 'repos_url': 'https://api.github.com/users/container1234/repos', 'gists_url': 'https://api.github.com/users/container1234/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/container1234/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/container1234/following{/other_user}', 'html_url': 'https://github.com/container1234', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/21278142?v=4', 'login': 'container1234', 'subscriptions_url': 'https://api.github.com/users/container1234/subscriptions', 'starred_url': 'https://api.github.com/users/container1234/starred{/owner}{/repo}', 'id': 21278142}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7697#issuecomment-475829932', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7697', 'created_at': '2019-03-23T02:01:00Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475829932', 'body': 'Is there a reason these pull requests for debugger are not merged?', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTgyOTkzMg==', 'id': 475829932}}, 'id': 7697}
2019-03-22T19:43:11.260439	{'safe_author': True, 'source': 'ghhookparser', 'body': "There's no play button on Android so is there a reason to clear the default ISO setting? Other than the play button, I think only mod launchers care about this setting and it can now be easily changed from Dolphin's UI. But we could wait on this PR until the `Paths` submenu is implemented.", 'action': 'created', 'author': 'Ebola16', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7920#issuecomment-475755786', 'type': 'gh_issue_comment', 'title': 'Android: Add Set as Default ISO to UI', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5140, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5140, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5140, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 166, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-22T18:05:52Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376769, 'open_issues': 166, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T16:45:13Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'Implements https://bugs.dolphin-emu.org/issues/10781\r\nAlso very useful for loading game mods\r\n\r\n![Screenshot_20190322-131707_Dolphin Emulator](https://user-images.githubusercontent.com/17330088/54841090-e7464380-4ca4-11e9-80ab-71cd38da2a17.jpg)', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7920.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7920', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7920.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7920'}, 'locked': False, 'closed_at': None, 'number': 7920, 'labels': [], 'comments': 1, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzNjgwNDkx', 'state': 'open', 'updated_at': '2019-03-22T19:43:10Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7920', 'created_at': '2019-03-22T16:27:52Z', 'title': 'Android: Add Set as Default ISO to UI', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920/comments', 'id': 424294864}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'MEMBER', 'updated_at': '2019-03-22T19:43:10Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7920#issuecomment-475755786', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920', 'created_at': '2019-03-22T19:43:10Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475755786', 'body': "There's no play button on Android so is there a reason to clear the default ISO setting? Other than the play button, I think only mod launchers care about this setting and it can now be easily changed from Dolphin's UI. But we could wait on this PR until the `Paths` submenu is implemented.", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTc1NTc4Ng==', 'id': 475755786}}, 'id': 7920}
2019-03-22T17:31:24.515094	{'safe_author': True, 'source': 'ghhookparser', 'body': 'Reminder to add MenuTag `CONFIG_LOG_CONFIGURATION` to SettingsFragment.java once #7274 is merged.', 'action': 'created', 'author': 'Ebola16', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7252#issuecomment-475710658', 'type': 'gh_issue_comment', 'title': 'Android: Add Log Configuration to UI', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5140, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5140, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5140, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 166, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-22T17:00:21Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376767, 'open_issues': 166, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T16:45:13Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "Implements https://bugs.dolphin-emu.org/issues/10709. \r\n\r\nThere was a weird bug where unwanted descriptions would pop up with the log type checkboxes. I worked around that with the changes included in CheckBoxSettingViewHolder. Let me know if that's not the proper way to fix that problem.\r\n\r\n![screenshot_20180712-020433_dolphin emulator](https://user-images.githubusercontent.com/17330088/42619661-a89382e6-8586-11e8-965a-9d098d879689.jpg)", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7252', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7252/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7252/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7252.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7252', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7252.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7252'}, 'locked': False, 'closed_at': None, 'number': 7252, 'labels': [], 'comments': 3, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjAwOTE1NzM4', 'state': 'open', 'updated_at': '2019-03-22T17:31:23Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7252', 'created_at': '2018-07-12T07:51:35Z', 'title': 'Android: Add Log Configuration to UI', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7252/comments', 'id': 340526620}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'MEMBER', 'updated_at': '2019-03-22T17:31:23Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7252#issuecomment-475710658', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7252', 'created_at': '2019-03-22T17:31:23Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475710658', 'body': 'Reminder to add MenuTag `CONFIG_LOG_CONFIGURATION` to SettingsFragment.java once #7274 is merged.', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTcxMDY1OA==', 'id': 475710658}}, 'id': 7252}
2019-03-22T16:45:58.718040	{'safe_author': True, 'source': 'ghhookparser', 'body': 'Can we show info text (like, in a tooltip or whatever) while the slider is being moved? I _think_ this was being used somewhere (not sure if it was Dolphin tho), and the current position indicated like "Safe. Does this and that.", "Accurate. Might not do something" and "Fast. Probably breaks" while the handle was dragged over/at that particular location.\r\nJust a thought tho.', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7909#issuecomment-475693776', 'type': 'gh_issue_comment', 'title': 'Add slider to change DPLII decoder quality', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5140, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5140, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5140, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 166, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-22T16:44:48Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376767, 'open_issues': 166, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T16:45:13Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'Users were commenting that their games had now lower audio quality with the new DPLII decoder (the old one just did not work at all, however the new one can add annoying artifacts). It seems this was so because of the chosen SURROUND_BLOCK_SIZE which was set to a too low of a value.\r\n\r\nAll the games I tested and played did not have complex music or just simple SFX, so I did not detect this problem at all.\r\nHowever I was not sure if I want to hard-code it to a higher value as it directly increases the audio latency, therefore this PR.\r\n\r\nQuality/latency equivalency (assuming sample rate of 48000):\r\n\r\n- Low - SURROUND_BLOCK_SIZE = 512 - Latency = ~10 ms **(old hard coded default)**\r\n- Medium - SURROUND_BLOCK_SIZE = 1024 - Latency = ~20 ms\r\n- High - SURROUND_BLOCK_SIZE = 2048 - Latency = ~40 ms **(new default)**\r\n- Highest - SURROUND_BLOCK_SIZE = 4096 - Latency = ~80 ms\r\n\r\nThis PR does not fix the stuttering when DPLII and stretching are used together, it will be fixed in another PR.\r\n\r\nImage:\r\n![image](https://user-images.githubusercontent.com/14236067/54528328-74169780-495b-11e9-98c3-15fe21ba7290.png)\r\n\r\nAny suggestion is more than welcome :)\r\n\r\n', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/LAGonauta/followers', 'url': 'https://api.github.com/users/LAGonauta', 'organizations_url': 'https://api.github.com/users/LAGonauta/orgs', 'node_id': 'MDQ6VXNlcjE0MjM2MDY3', 'events_url': 'https://api.github.com/users/LAGonauta/events{/privacy}', 'repos_url': 'https://api.github.com/users/LAGonauta/repos', 'gists_url': 'https://api.github.com/users/LAGonauta/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/LAGonauta/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/LAGonauta/following{/other_user}', 'html_url': 'https://github.com/LAGonauta', 'gravatar_id': '', 'avatar_url': 'https://avatars3.githubusercontent.com/u/14236067?v=4', 'login': 'LAGonauta', 'subscriptions_url': 'https://api.github.com/users/LAGonauta/subscriptions', 'starred_url': 'https://api.github.com/users/LAGonauta/starred{/owner}{/repo}', 'id': 14236067}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7909.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7909', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7909.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7909'}, 'locked': False, 'closed_at': None, 'number': 7909, 'labels': [], 'comments': 6, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYyMDI1Nzc2', 'state': 'open', 'updated_at': '2019-03-22T16:45:58Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7909', 'created_at': '2019-03-18T11:59:02Z', 'title': 'Add slider to change DPLII decoder quality', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909/comments', 'id': 422179774}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'MEMBER', 'updated_at': '2019-03-22T16:45:58Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7909#issuecomment-475693776', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909', 'created_at': '2019-03-22T16:45:58Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475693776', 'body': 'Can we show info text (like, in a tooltip or whatever) while the slider is being moved? I _think_ this was being used somewhere (not sure if it was Dolphin tho), and the current position indicated like "Safe. Does this and that.", "Accurate. Might not do something" and "Fast. Probably breaks" while the handle was dragged over/at that particular location.\r\nJust a thought tho.', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTY5Mzc3Ng==', 'id': 475693776}}, 'id': 7909}
2019-03-22T16:34:08.177929	{'safe_author': True, 'source': 'ghhookparser', 'body': "I don't think we should have this without having the default ISO exposed in the settings, since there otherwise would be no way to clear it without editing Dolphin.ini.", 'action': 'edited', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7920#issuecomment-475689120', 'type': 'gh_issue_comment', 'title': 'Android: Add Set as default ISO to UI', 'repo': 'dolphin-emu/dolphin', 'raw': {'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'action': 'edited', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5140, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5140, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5140, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-22T16:27:53Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376767, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T15:22:22Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'Implements https://bugs.dolphin-emu.org/issues/10781\r\nAlso very useful for loading game mods\r\n\r\n![Screenshot_20190322-121315_Dolphin Emulator](https://user-images.githubusercontent.com/17330088/54837903-dba34e80-4c9d-11e9-9171-5f35b6d183ce.jpg)', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7920.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7920', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7920.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7920'}, 'locked': False, 'closed_at': None, 'number': 7920, 'labels': [], 'comments': 1, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzNjgwNDkx', 'state': 'open', 'updated_at': '2019-03-22T16:34:07Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7920', 'created_at': '2019-03-22T16:27:52Z', 'title': 'Android: Add Set as default ISO to UI', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920/comments', 'id': 424294864}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'changes': {'body': {'from': "I don't think we should have this without having the default ISO exposed in the settings, since there otherwise would be no way to clear it from the GUI."}}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-22T16:34:07Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7920#issuecomment-475689120', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920', 'created_at': '2019-03-22T16:32:55Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475689120', 'body': "I don't think we should have this without having the default ISO exposed in the settings, since there otherwise would be no way to clear it without editing Dolphin.ini.", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTY4OTEyMA==', 'id': 475689120}}, 'id': 7920}
2019-03-22T16:32:55.902508	{'safe_author': True, 'source': 'ghhookparser', 'body': "I don't think we should have this without having the default ISO exposed in the settings, since there otherwise would be no way to clear it from the GUI.", 'action': 'created', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7920#issuecomment-475689120', 'type': 'gh_issue_comment', 'title': 'Android: Add Set as default ISO to UI', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5140, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5140, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5140, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-22T16:27:53Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376767, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T15:22:22Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'Implements https://bugs.dolphin-emu.org/issues/10781\r\nAlso very useful for loading game mods\r\n\r\n![Screenshot_20190322-121315_Dolphin Emulator](https://user-images.githubusercontent.com/17330088/54837903-dba34e80-4c9d-11e9-9171-5f35b6d183ce.jpg)', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7920.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7920', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7920.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7920'}, 'locked': False, 'closed_at': None, 'number': 7920, 'labels': [], 'comments': 0, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzNjgwNDkx', 'state': 'open', 'updated_at': '2019-03-22T16:32:55Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7920', 'created_at': '2019-03-22T16:27:52Z', 'title': 'Android: Add Set as default ISO to UI', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920/comments', 'id': 424294864}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-22T16:32:55Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7920#issuecomment-475689120', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7920', 'created_at': '2019-03-22T16:32:55Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475689120', 'body': "I don't think we should have this without having the default ISO exposed in the settings, since there otherwise would be no way to clear it from the GUI.", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTY4OTEyMA==', 'id': 475689120}}, 'id': 7920}
2019-03-22T00:39:53.444605	{'safe_author': False, 'source': 'ghhookparser', 'body': 'To be consistent with similar sliders in Dolphin, you should probably have labels on both sides of the slider:\r\n![image](https://user-images.githubusercontent.com/35514663/54793573-098e8180-4c11-11e9-87e1-1c3512409bfc.png)\r\n', 'action': 'created', 'author': '8times9', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7909#issuecomment-475453931', 'type': 'gh_issue_comment', 'title': 'Add slider to change DPLII decoder quality', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5136, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5136, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5136, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 166, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-21T23:26:55Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376767, 'open_issues': 166, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T00:24:39Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'Users were commenting that their games had now lower audio quality with the new DPLII decoder (the old one just did not work at all, however the new one can add annoying artifacts). It seems this was so because of the chosen SURROUND_BLOCK_SIZE which was set to a too low of a value.\r\n\r\nAll the games I tested and played did not have complex music or just simple SFX, so I did not detect this problem at all.\r\nHowever I was not sure if I want to hard-code it to a higher value as it directly increases the audio latency, therefore this PR.\r\n\r\nQuality/latency equivalency (assuming sample rate of 48000):\r\n\r\n- Low - SURROUND_BLOCK_SIZE = 512 - Latency = ~10 ms **(old hard coded default)**\r\n- Medium - SURROUND_BLOCK_SIZE = 1024 - Latency = ~20 ms\r\n- High - SURROUND_BLOCK_SIZE = 2048 - Latency = ~40 ms **(new default)**\r\n- Highest - SURROUND_BLOCK_SIZE = 4096 - Latency = ~80 ms\r\n\r\nThis PR does not fix the stuttering when DPLII and stretching are used together, it will be fixed in another PR.\r\n\r\nImage:\r\n![image](https://user-images.githubusercontent.com/14236067/54528328-74169780-495b-11e9-98c3-15fe21ba7290.png)\r\n\r\nAny suggestion is more than welcome :)\r\n\r\n', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/LAGonauta/followers', 'url': 'https://api.github.com/users/LAGonauta', 'organizations_url': 'https://api.github.com/users/LAGonauta/orgs', 'node_id': 'MDQ6VXNlcjE0MjM2MDY3', 'events_url': 'https://api.github.com/users/LAGonauta/events{/privacy}', 'repos_url': 'https://api.github.com/users/LAGonauta/repos', 'gists_url': 'https://api.github.com/users/LAGonauta/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/LAGonauta/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/LAGonauta/following{/other_user}', 'html_url': 'https://github.com/LAGonauta', 'gravatar_id': '', 'avatar_url': 'https://avatars3.githubusercontent.com/u/14236067?v=4', 'login': 'LAGonauta', 'subscriptions_url': 'https://api.github.com/users/LAGonauta/subscriptions', 'starred_url': 'https://api.github.com/users/LAGonauta/starred{/owner}{/repo}', 'id': 14236067}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7909.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7909', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7909.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7909'}, 'locked': False, 'closed_at': None, 'number': 7909, 'labels': [], 'comments': 5, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYyMDI1Nzc2', 'state': 'open', 'updated_at': '2019-03-22T00:39:52Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7909', 'created_at': '2019-03-18T11:59:02Z', 'title': 'Add slider to change DPLII decoder quality', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909/comments', 'id': 422179774}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/8times9/followers', 'url': 'https://api.github.com/users/8times9', 'organizations_url': 'https://api.github.com/users/8times9/orgs', 'node_id': 'MDQ6VXNlcjM1NTE0NjYz', 'events_url': 'https://api.github.com/users/8times9/events{/privacy}', 'repos_url': 'https://api.github.com/users/8times9/repos', 'gists_url': 'https://api.github.com/users/8times9/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/8times9/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/8times9/following{/other_user}', 'html_url': 'https://github.com/8times9', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/35514663?v=4', 'login': '8times9', 'subscriptions_url': 'https://api.github.com/users/8times9/subscriptions', 'starred_url': 'https://api.github.com/users/8times9/starred{/owner}{/repo}', 'id': 35514663}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-22T00:39:52Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/8times9/followers', 'url': 'https://api.github.com/users/8times9', 'organizations_url': 'https://api.github.com/users/8times9/orgs', 'node_id': 'MDQ6VXNlcjM1NTE0NjYz', 'events_url': 'https://api.github.com/users/8times9/events{/privacy}', 'repos_url': 'https://api.github.com/users/8times9/repos', 'gists_url': 'https://api.github.com/users/8times9/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/8times9/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/8times9/following{/other_user}', 'html_url': 'https://github.com/8times9', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/35514663?v=4', 'login': '8times9', 'subscriptions_url': 'https://api.github.com/users/8times9/subscriptions', 'starred_url': 'https://api.github.com/users/8times9/starred{/owner}{/repo}', 'id': 35514663}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7909#issuecomment-475453931', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909', 'created_at': '2019-03-22T00:39:52Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475453931', 'body': 'To be consistent with similar sliders in Dolphin, you should probably have labels on both sides of the slider:\r\n![image](https://user-images.githubusercontent.com/35514663/54793573-098e8180-4c11-11e9-87e1-1c3512409bfc.png)\r\n', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTQ1MzkzMQ==', 'id': 475453931}}, 'id': 7909}
2019-03-21T21:12:10.411637	{'safe_author': False, 'source': 'ghhookparser', 'body': "@MayImilae @stenzek\r\nIf that result wasn't convincing enough, I decided to perform the same test on an AMD machine (Radeon Pro 460, as reported by Dolphin) with 4 physical CPU cores. All the same settings and Metroid Prime save file scene, frame times over 20 sec:\r\n\r\n[Dolphin-macOS-portability-benchmark-AMD.zip](https://github.com/dolphin-emu/dolphin/files/2993949/Dolphin-macOS-portability-benchmark-AMD.zip)\r\n\r\nThe computed stats show a larger gap between the libraries:\r\n  - MoltenVK without MT:  mean 18.306593, variance 30.974926\r\n  - MoltenVK with MT: mean 18.41038, variance 29.487541\r\n  - gfx-portabilityw without MT: mean 14.572058, variance 17.192923\r\n  - gfx-portability with MT: mean 14.32026, variance 2.0200737\r\n\r\nAgain, these are frame times, so lower is better. gfx-portability shows 20% improvement in the average, and completely pins the frame stability when running with backend multi-threading option enabled in Dolphin.\r\n\r\nI don't know what else I can do to help. We've just published a release with all the latest improvements: https://github.com/gfx-rs/portability/releases/tag/0.5", 'action': 'edited', 'author': 'kvark', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7039#issuecomment-475403743', 'type': 'gh_issue_comment', 'title': 'Vulkan: macOS support via MoltenVK', 'repo': 'dolphin-emu/dolphin', 'raw': {'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'action': 'edited', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 169, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-21T17:02:41Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376756, 'open_issues': 169, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-21T18:45:16Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "It seems MoltenVK is now mature enough to handle the shaders Dolphin generates without completely falling over. It will be interesting to see how it performs compared to OpenGL, but more importantly, it enables mac users to use features blocked by the GL version, e.g. bounding box.\r\n\r\nWe'll also have to decide how to distribute MoltenVK. Currently, the loader searches for an environment variable named `LIBMOLTENVK_PATH`, and if present uses that. Otherwise, it looks in the application bundle directory, under `DolphinWx.app/Contents/Frameworks/libMoltenVK.dylib`.\r\n\r\nI'd suggest building MoltenVK externally, and copying the library in as a buildbot step. IMO, this is better than including yet another huge externals dependency, for a single platform.\r\n\r\n**Known limitations:**\r\n\r\n- In single core mode, enabling multithreading in graphics options can lead to lower performance. In dual core mode, it seems similar. Probably best to disable it though, due to MoltenVK doing its own threading internally.\r\n- Ubershaders cause the shader compiler to freak out. I haven't looked into whether this is a SPIRV-Cross (via MoltenVK) issue, or we need to update our glslang.\r\n", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/stenzek/followers', 'url': 'https://api.github.com/users/stenzek', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'node_id': 'MDQ6VXNlcjExMjg4MzE5', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'repos_url': 'https://api.github.com/users/stenzek/repos', 'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'html_url': 'https://github.com/stenzek', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'login': 'stenzek', 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'id': 11288319}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7039.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7039', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7039.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7039'}, 'locked': False, 'closed_at': '2018-11-30T11:55:30Z', 'number': 7039, 'labels': [], 'comments': 176, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MTkxNzI4NzMz', 'state': 'closed', 'updated_at': '2019-03-21T21:12:09Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7039', 'created_at': '2018-05-31T11:47:44Z', 'title': 'Vulkan: macOS support via MoltenVK', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039/comments', 'id': 328106337}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/kvark/followers', 'url': 'https://api.github.com/users/kvark', 'organizations_url': 'https://api.github.com/users/kvark/orgs', 'node_id': 'MDQ6VXNlcjEwNzMwMQ==', 'events_url': 'https://api.github.com/users/kvark/events{/privacy}', 'repos_url': 'https://api.github.com/users/kvark/repos', 'gists_url': 'https://api.github.com/users/kvark/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/kvark/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/kvark/following{/other_user}', 'html_url': 'https://github.com/kvark', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/107301?v=4', 'login': 'kvark', 'subscriptions_url': 'https://api.github.com/users/kvark/subscriptions', 'starred_url': 'https://api.github.com/users/kvark/starred{/owner}{/repo}', 'id': 107301}, 'changes': {'body': {'from': "@MayImilae @stenzek\r\nIf that result wasn't convincing enough, I decided to perform the same test on an AMD machine (Radeon Pro 460, as reported by Dolphin) with 4 physical CPU cores. All the same settings and Metroid Prime save file scene, 20 sec frame times:\r\n\r\n[Dolphin-macOS-portability-benchmark-AMD.zip](https://github.com/dolphin-emu/dolphin/files/2993949/Dolphin-macOS-portability-benchmark-AMD.zip)\r\n\r\nThe computed stats show a larger gap between the libraries:\r\n  - MoltenVK without MT:  mean 18.306593, variance 30.974926\r\n  - MoltenVK with MT: mean 18.41038, variance 29.487541\r\n  - gfx-portabilityw without MT: mean 14.572058, variance 17.192923\r\n  - gfx-portability with MT: mean 14.32026, variance 2.0200737\r\n\r\nAgain, these are frame times, so lower is better. gfx-portability shows 20% improvement in the average, and completely pins the frame stability when running with backend multi-threading option enabled in Dolphin.\r\n\r\nI don't know what else I can do to help. We've just published a release with all the latest improvements: https://github.com/gfx-rs/portability/releases/tag/0.5"}}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-21T21:12:09Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/kvark/followers', 'url': 'https://api.github.com/users/kvark', 'organizations_url': 'https://api.github.com/users/kvark/orgs', 'node_id': 'MDQ6VXNlcjEwNzMwMQ==', 'events_url': 'https://api.github.com/users/kvark/events{/privacy}', 'repos_url': 'https://api.github.com/users/kvark/repos', 'gists_url': 'https://api.github.com/users/kvark/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/kvark/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/kvark/following{/other_user}', 'html_url': 'https://github.com/kvark', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/107301?v=4', 'login': 'kvark', 'subscriptions_url': 'https://api.github.com/users/kvark/subscriptions', 'starred_url': 'https://api.github.com/users/kvark/starred{/owner}{/repo}', 'id': 107301}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7039#issuecomment-475403743', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039', 'created_at': '2019-03-21T21:10:22Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475403743', 'body': "@MayImilae @stenzek\r\nIf that result wasn't convincing enough, I decided to perform the same test on an AMD machine (Radeon Pro 460, as reported by Dolphin) with 4 physical CPU cores. All the same settings and Metroid Prime save file scene, frame times over 20 sec:\r\n\r\n[Dolphin-macOS-portability-benchmark-AMD.zip](https://github.com/dolphin-emu/dolphin/files/2993949/Dolphin-macOS-portability-benchmark-AMD.zip)\r\n\r\nThe computed stats show a larger gap between the libraries:\r\n  - MoltenVK without MT:  mean 18.306593, variance 30.974926\r\n  - MoltenVK with MT: mean 18.41038, variance 29.487541\r\n  - gfx-portabilityw without MT: mean 14.572058, variance 17.192923\r\n  - gfx-portability with MT: mean 14.32026, variance 2.0200737\r\n\r\nAgain, these are frame times, so lower is better. gfx-portability shows 20% improvement in the average, and completely pins the frame stability when running with backend multi-threading option enabled in Dolphin.\r\n\r\nI don't know what else I can do to help. We've just published a release with all the latest improvements: https://github.com/gfx-rs/portability/releases/tag/0.5", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTQwMzc0Mw==', 'id': 475403743}}, 'id': 7039}
2019-03-21T21:10:23.455139	{'safe_author': False, 'source': 'ghhookparser', 'body': "@MayImilae @stenzek\r\nIf that result wasn't convincing enough, I decided to perform the same test on an AMD machine (Radeon Pro 460, as reported by Dolphin) with 4 physical CPU cores. All the same settings and Metroid Prime save file scene, 20 sec frame times:\r\n\r\n[Dolphin-macOS-portability-benchmark-AMD.zip](https://github.com/dolphin-emu/dolphin/files/2993949/Dolphin-macOS-portability-benchmark-AMD.zip)\r\n\r\nThe computed stats show a larger gap between the libraries:\r\n  - MoltenVK without MT:  mean 18.306593, variance 30.974926\r\n  - MoltenVK with MT: mean 18.41038, variance 29.487541\r\n  - gfx-portabilityw without MT: mean 14.572058, variance 17.192923\r\n  - gfx-portability with MT: mean 14.32026, variance 2.0200737\r\n\r\nAgain, these are frame times, so lower is better. gfx-portability shows 20% improvement in the average, and completely pins the frame stability when running with backend multi-threading option enabled in Dolphin.\r\n\r\nI don't know what else I can do to help. We've just published a release with all the latest improvements: https://github.com/gfx-rs/portability/releases/tag/0.5", 'action': 'created', 'author': 'kvark', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7039#issuecomment-475403743', 'type': 'gh_issue_comment', 'title': 'Vulkan: macOS support via MoltenVK', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 169, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-21T17:02:41Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376756, 'open_issues': 169, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-21T18:45:16Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "It seems MoltenVK is now mature enough to handle the shaders Dolphin generates without completely falling over. It will be interesting to see how it performs compared to OpenGL, but more importantly, it enables mac users to use features blocked by the GL version, e.g. bounding box.\r\n\r\nWe'll also have to decide how to distribute MoltenVK. Currently, the loader searches for an environment variable named `LIBMOLTENVK_PATH`, and if present uses that. Otherwise, it looks in the application bundle directory, under `DolphinWx.app/Contents/Frameworks/libMoltenVK.dylib`.\r\n\r\nI'd suggest building MoltenVK externally, and copying the library in as a buildbot step. IMO, this is better than including yet another huge externals dependency, for a single platform.\r\n\r\n**Known limitations:**\r\n\r\n- In single core mode, enabling multithreading in graphics options can lead to lower performance. In dual core mode, it seems similar. Probably best to disable it though, due to MoltenVK doing its own threading internally.\r\n- Ubershaders cause the shader compiler to freak out. I haven't looked into whether this is a SPIRV-Cross (via MoltenVK) issue, or we need to update our glslang.\r\n", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/stenzek/followers', 'url': 'https://api.github.com/users/stenzek', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'node_id': 'MDQ6VXNlcjExMjg4MzE5', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'repos_url': 'https://api.github.com/users/stenzek/repos', 'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'html_url': 'https://github.com/stenzek', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'login': 'stenzek', 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'id': 11288319}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7039.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7039', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7039.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7039'}, 'locked': False, 'closed_at': '2018-11-30T11:55:30Z', 'number': 7039, 'labels': [], 'comments': 175, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MTkxNzI4NzMz', 'state': 'closed', 'updated_at': '2019-03-21T21:10:22Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7039', 'created_at': '2018-05-31T11:47:44Z', 'title': 'Vulkan: macOS support via MoltenVK', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039/comments', 'id': 328106337}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/kvark/followers', 'url': 'https://api.github.com/users/kvark', 'organizations_url': 'https://api.github.com/users/kvark/orgs', 'node_id': 'MDQ6VXNlcjEwNzMwMQ==', 'events_url': 'https://api.github.com/users/kvark/events{/privacy}', 'repos_url': 'https://api.github.com/users/kvark/repos', 'gists_url': 'https://api.github.com/users/kvark/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/kvark/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/kvark/following{/other_user}', 'html_url': 'https://github.com/kvark', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/107301?v=4', 'login': 'kvark', 'subscriptions_url': 'https://api.github.com/users/kvark/subscriptions', 'starred_url': 'https://api.github.com/users/kvark/starred{/owner}{/repo}', 'id': 107301}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-21T21:10:22Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/kvark/followers', 'url': 'https://api.github.com/users/kvark', 'organizations_url': 'https://api.github.com/users/kvark/orgs', 'node_id': 'MDQ6VXNlcjEwNzMwMQ==', 'events_url': 'https://api.github.com/users/kvark/events{/privacy}', 'repos_url': 'https://api.github.com/users/kvark/repos', 'gists_url': 'https://api.github.com/users/kvark/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/kvark/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/kvark/following{/other_user}', 'html_url': 'https://github.com/kvark', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/107301?v=4', 'login': 'kvark', 'subscriptions_url': 'https://api.github.com/users/kvark/subscriptions', 'starred_url': 'https://api.github.com/users/kvark/starred{/owner}{/repo}', 'id': 107301}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7039#issuecomment-475403743', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7039', 'created_at': '2019-03-21T21:10:22Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475403743', 'body': "@MayImilae @stenzek\r\nIf that result wasn't convincing enough, I decided to perform the same test on an AMD machine (Radeon Pro 460, as reported by Dolphin) with 4 physical CPU cores. All the same settings and Metroid Prime save file scene, 20 sec frame times:\r\n\r\n[Dolphin-macOS-portability-benchmark-AMD.zip](https://github.com/dolphin-emu/dolphin/files/2993949/Dolphin-macOS-portability-benchmark-AMD.zip)\r\n\r\nThe computed stats show a larger gap between the libraries:\r\n  - MoltenVK without MT:  mean 18.306593, variance 30.974926\r\n  - MoltenVK with MT: mean 18.41038, variance 29.487541\r\n  - gfx-portabilityw without MT: mean 14.572058, variance 17.192923\r\n  - gfx-portability with MT: mean 14.32026, variance 2.0200737\r\n\r\nAgain, these are frame times, so lower is better. gfx-portability shows 20% improvement in the average, and completely pins the frame stability when running with backend multi-threading option enabled in Dolphin.\r\n\r\nI don't know what else I can do to help. We've just published a release with all the latest improvements: https://github.com/gfx-rs/portability/releases/tag/0.5", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTQwMzc0Mw==', 'id': 475403743}}, 'id': 7039}
2019-03-21T10:46:20.213962	{'safe_author': True, 'source': 'ghhookparser', 'body': 'Please create issues on the bug tracker if there are regressions from these changes.', 'action': 'created', 'author': 'stenzek', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7753#issuecomment-475183274', 'type': 'gh_issue_comment', 'title': 'Move a significant amount of video backend logic to VideoCommon', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5134, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5134, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5134, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-21T01:45:24Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376752, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-21T08:33:35Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "**Huge scary pull request ahead!**\r\n\r\nThis pull request moves a decent amount of logic from the video backends to VideoCommon. It's something I've been putting off for a while now, but finally found the motivation/time to do.\r\n\r\nIn addition to the maintainability improvements, as all backends are now considered equal, it adds things like:\r\n- Post-processing to D3D\r\n- GPU texture decoding to D3D\r\n- Vulkan-style EFB cache to D3D and OpenGL\r\n- Vulkan-style EFB poke batching to D3D and OpenGL\r\n\r\nSome things makes easier in the future:\r\n- Better state tracking in OpenGL -> performance improvements (since all state is now controlled via pipelines, we know what it is, and it hasn't been changed by random functions)\r\n- Post-processing of XFB copies, rather than just the scanout (something I started a long time ago but was put off because of how much duplication there was in backends)\r\n- Multi-threading of the backends\r\n- Who doesn't like fewer lines of code for the same functionality\r\n- Re-implementing D3D12? :) (if we can keep it to 5k lines of code or so, in line with the other backends)\r\n\r\nUnfortunately, due to it being backend-specific, it does remove the **stencil buffer bounding box emulation**. I figured now that we have Vulkan/Metal on macOS, this removes one of the main uses for it.\r\n\r\nI'm sorry for the size of this PR, but with most of the changes touching the same code, if I separated it, I'd be writing a lot of code just to throw it out again. I started doing that, but it got old quick :(\r\n\r\nA rough work list:\r\n- [x] Use abstract textures for EFB emulation\r\n- [x] Move FramebufferManager to common and create implementation using abstract classes\r\n- [x] Move TextureCache functionality to common (EFB copies, palette texture conversion)\r\n- [x] Remove a lot of duplicated logic in Vulkan (largest backend by far...)\r\n- [x] Re-implement GPU texture decoding\r\n- [x] Implement texel buffers on OpenGL and Vulkan (for palette texture conversion)", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/stenzek/followers', 'url': 'https://api.github.com/users/stenzek', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'node_id': 'MDQ6VXNlcjExMjg4MzE5', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'repos_url': 'https://api.github.com/users/stenzek/repos', 'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'html_url': 'https://github.com/stenzek', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'login': 'stenzek', 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'id': 11288319}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7753.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7753', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7753.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7753'}, 'locked': False, 'closed_at': '2019-02-26T04:21:06Z', 'number': 7753, 'labels': [], 'comments': 51, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjQ4MTg1NTcx', 'state': 'closed', 'updated_at': '2019-03-21T10:46:19Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7753', 'created_at': '2019-01-28T15:39:38Z', 'title': 'Move a significant amount of video backend logic to VideoCommon', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753/comments', 'id': 403873761}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/stenzek/followers', 'url': 'https://api.github.com/users/stenzek', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'node_id': 'MDQ6VXNlcjExMjg4MzE5', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'repos_url': 'https://api.github.com/users/stenzek/repos', 'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'html_url': 'https://github.com/stenzek', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'login': 'stenzek', 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'id': 11288319}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-21T10:46:19Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/stenzek/followers', 'url': 'https://api.github.com/users/stenzek', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'node_id': 'MDQ6VXNlcjExMjg4MzE5', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'repos_url': 'https://api.github.com/users/stenzek/repos', 'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'html_url': 'https://github.com/stenzek', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'login': 'stenzek', 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'id': 11288319}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7753#issuecomment-475183274', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753', 'created_at': '2019-03-21T10:46:19Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475183274', 'body': 'Please create issues on the bug tracker if there are regressions from these changes.', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTE4MzI3NA==', 'id': 475183274}}, 'id': 7753}
2019-03-21T07:49:24.463418	{'safe_author': False, 'source': 'ghhookparser', 'body': 'Having this problem since 5.0-9638 version in D3D11 with Metroid Prime 2 when trying to activate the scanner and with LoZ-Twilight Princess when trying to load a save file (both GameCube and EU versions. G2MP01 and GZ2P01 IDs)\r\n![Error](https://user-images.githubusercontent.com/48786077/54738627-cfcb6580-4b93-11e9-801d-fb9feb850022.jpg)\r\n\r\nMy config\r\n![Config](https://user-images.githubusercontent.com/48786077/54738643-e07bdb80-4b93-11e9-8889-910072d9c39d.jpg)\r\n\r\nIn MP2 **Store EFB Copies to Texture only** is disabled by default.', 'action': 'edited', 'author': 'Intiroso', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7753#issuecomment-475137158', 'type': 'gh_issue_comment', 'title': 'Move a significant amount of video backend logic to VideoCommon', 'repo': 'dolphin-emu/dolphin', 'raw': {'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'action': 'edited', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-21T01:45:24Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376752, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-20T22:53:42Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "**Huge scary pull request ahead!**\r\n\r\nThis pull request moves a decent amount of logic from the video backends to VideoCommon. It's something I've been putting off for a while now, but finally found the motivation/time to do.\r\n\r\nIn addition to the maintainability improvements, as all backends are now considered equal, it adds things like:\r\n- Post-processing to D3D\r\n- GPU texture decoding to D3D\r\n- Vulkan-style EFB cache to D3D and OpenGL\r\n- Vulkan-style EFB poke batching to D3D and OpenGL\r\n\r\nSome things makes easier in the future:\r\n- Better state tracking in OpenGL -> performance improvements (since all state is now controlled via pipelines, we know what it is, and it hasn't been changed by random functions)\r\n- Post-processing of XFB copies, rather than just the scanout (something I started a long time ago but was put off because of how much duplication there was in backends)\r\n- Multi-threading of the backends\r\n- Who doesn't like fewer lines of code for the same functionality\r\n- Re-implementing D3D12? :) (if we can keep it to 5k lines of code or so, in line with the other backends)\r\n\r\nUnfortunately, due to it being backend-specific, it does remove the **stencil buffer bounding box emulation**. I figured now that we have Vulkan/Metal on macOS, this removes one of the main uses for it.\r\n\r\nI'm sorry for the size of this PR, but with most of the changes touching the same code, if I separated it, I'd be writing a lot of code just to throw it out again. I started doing that, but it got old quick :(\r\n\r\nA rough work list:\r\n- [x] Use abstract textures for EFB emulation\r\n- [x] Move FramebufferManager to common and create implementation using abstract classes\r\n- [x] Move TextureCache functionality to common (EFB copies, palette texture conversion)\r\n- [x] Remove a lot of duplicated logic in Vulkan (largest backend by far...)\r\n- [x] Re-implement GPU texture decoding\r\n- [x] Implement texel buffers on OpenGL and Vulkan (for palette texture conversion)", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/stenzek/followers', 'url': 'https://api.github.com/users/stenzek', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'node_id': 'MDQ6VXNlcjExMjg4MzE5', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'repos_url': 'https://api.github.com/users/stenzek/repos', 'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'html_url': 'https://github.com/stenzek', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'login': 'stenzek', 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'id': 11288319}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7753.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7753', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7753.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7753'}, 'locked': False, 'closed_at': '2019-02-26T04:21:06Z', 'number': 7753, 'labels': [], 'comments': 51, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjQ4MTg1NTcx', 'state': 'closed', 'updated_at': '2019-03-21T07:49:23Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7753', 'created_at': '2019-01-28T15:39:38Z', 'title': 'Move a significant amount of video backend logic to VideoCommon', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753/comments', 'id': 403873761}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Intiroso/followers', 'url': 'https://api.github.com/users/Intiroso', 'organizations_url': 'https://api.github.com/users/Intiroso/orgs', 'node_id': 'MDQ6VXNlcjQ4Nzg2MDc3', 'events_url': 'https://api.github.com/users/Intiroso/events{/privacy}', 'repos_url': 'https://api.github.com/users/Intiroso/repos', 'gists_url': 'https://api.github.com/users/Intiroso/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Intiroso/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Intiroso/following{/other_user}', 'html_url': 'https://github.com/Intiroso', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/48786077?v=4', 'login': 'Intiroso', 'subscriptions_url': 'https://api.github.com/users/Intiroso/subscriptions', 'starred_url': 'https://api.github.com/users/Intiroso/starred{/owner}{/repo}', 'id': 48786077}, 'changes': {'body': {'from': 'Having this problem since 5.0-9638 version with Metroid Prime 2 when trying to activate the scanner and with LoZ-Twilight Princess when trying to load a save file (both GameCube and EU versions. G2MP01 and GZ2P01 IDs)\r\n![Error](https://user-images.githubusercontent.com/48786077/54738627-cfcb6580-4b93-11e9-801d-fb9feb850022.jpg)\r\n\r\nMy config\r\n![Config](https://user-images.githubusercontent.com/48786077/54738643-e07bdb80-4b93-11e9-8889-910072d9c39d.jpg)\r\n\r\nIn MP2 **Store EFB Copies to Texture only** is disabled by default.'}}, 'comment': {'author_association': 'NONE', 'updated_at': '2019-03-21T07:49:23Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Intiroso/followers', 'url': 'https://api.github.com/users/Intiroso', 'organizations_url': 'https://api.github.com/users/Intiroso/orgs', 'node_id': 'MDQ6VXNlcjQ4Nzg2MDc3', 'events_url': 'https://api.github.com/users/Intiroso/events{/privacy}', 'repos_url': 'https://api.github.com/users/Intiroso/repos', 'gists_url': 'https://api.github.com/users/Intiroso/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Intiroso/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Intiroso/following{/other_user}', 'html_url': 'https://github.com/Intiroso', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/48786077?v=4', 'login': 'Intiroso', 'subscriptions_url': 'https://api.github.com/users/Intiroso/subscriptions', 'starred_url': 'https://api.github.com/users/Intiroso/starred{/owner}{/repo}', 'id': 48786077}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7753#issuecomment-475137158', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753', 'created_at': '2019-03-21T07:47:51Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475137158', 'body': 'Having this problem since 5.0-9638 version in D3D11 with Metroid Prime 2 when trying to activate the scanner and with LoZ-Twilight Princess when trying to load a save file (both GameCube and EU versions. G2MP01 and GZ2P01 IDs)\r\n![Error](https://user-images.githubusercontent.com/48786077/54738627-cfcb6580-4b93-11e9-801d-fb9feb850022.jpg)\r\n\r\nMy config\r\n![Config](https://user-images.githubusercontent.com/48786077/54738643-e07bdb80-4b93-11e9-8889-910072d9c39d.jpg)\r\n\r\nIn MP2 **Store EFB Copies to Texture only** is disabled by default.', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTEzNzE1OA==', 'id': 475137158}}, 'id': 7753}
2019-03-21T07:47:52.270447	{'safe_author': False, 'source': 'ghhookparser', 'body': 'Having this problem since 5.0-9638 version with Metroid Prime 2 when trying to activate the scanner and with LoZ-Twilight Princess when trying to load a save file (both GameCube and EU versions. G2MP01 and GZ2P01 IDs)\r\n![Error](https://user-images.githubusercontent.com/48786077/54738627-cfcb6580-4b93-11e9-801d-fb9feb850022.jpg)\r\n\r\nMy config\r\n![Config](https://user-images.githubusercontent.com/48786077/54738643-e07bdb80-4b93-11e9-8889-910072d9c39d.jpg)\r\n\r\nIn MP2 **Store EFB Copies to Texture only** is disabled by default.', 'action': 'created', 'author': 'Intiroso', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7753#issuecomment-475137158', 'type': 'gh_issue_comment', 'title': 'Move a significant amount of video backend logic to VideoCommon', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-21T01:45:24Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376752, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-20T22:53:42Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "**Huge scary pull request ahead!**\r\n\r\nThis pull request moves a decent amount of logic from the video backends to VideoCommon. It's something I've been putting off for a while now, but finally found the motivation/time to do.\r\n\r\nIn addition to the maintainability improvements, as all backends are now considered equal, it adds things like:\r\n- Post-processing to D3D\r\n- GPU texture decoding to D3D\r\n- Vulkan-style EFB cache to D3D and OpenGL\r\n- Vulkan-style EFB poke batching to D3D and OpenGL\r\n\r\nSome things makes easier in the future:\r\n- Better state tracking in OpenGL -> performance improvements (since all state is now controlled via pipelines, we know what it is, and it hasn't been changed by random functions)\r\n- Post-processing of XFB copies, rather than just the scanout (something I started a long time ago but was put off because of how much duplication there was in backends)\r\n- Multi-threading of the backends\r\n- Who doesn't like fewer lines of code for the same functionality\r\n- Re-implementing D3D12? :) (if we can keep it to 5k lines of code or so, in line with the other backends)\r\n\r\nUnfortunately, due to it being backend-specific, it does remove the **stencil buffer bounding box emulation**. I figured now that we have Vulkan/Metal on macOS, this removes one of the main uses for it.\r\n\r\nI'm sorry for the size of this PR, but with most of the changes touching the same code, if I separated it, I'd be writing a lot of code just to throw it out again. I started doing that, but it got old quick :(\r\n\r\nA rough work list:\r\n- [x] Use abstract textures for EFB emulation\r\n- [x] Move FramebufferManager to common and create implementation using abstract classes\r\n- [x] Move TextureCache functionality to common (EFB copies, palette texture conversion)\r\n- [x] Remove a lot of duplicated logic in Vulkan (largest backend by far...)\r\n- [x] Re-implement GPU texture decoding\r\n- [x] Implement texel buffers on OpenGL and Vulkan (for palette texture conversion)", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/stenzek/followers', 'url': 'https://api.github.com/users/stenzek', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'node_id': 'MDQ6VXNlcjExMjg4MzE5', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'repos_url': 'https://api.github.com/users/stenzek/repos', 'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'html_url': 'https://github.com/stenzek', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'login': 'stenzek', 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'id': 11288319}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7753.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7753', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7753.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7753'}, 'locked': False, 'closed_at': '2019-02-26T04:21:06Z', 'number': 7753, 'labels': [], 'comments': 50, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjQ4MTg1NTcx', 'state': 'closed', 'updated_at': '2019-03-21T07:47:51Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7753', 'created_at': '2019-01-28T15:39:38Z', 'title': 'Move a significant amount of video backend logic to VideoCommon', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753/comments', 'id': 403873761}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Intiroso/followers', 'url': 'https://api.github.com/users/Intiroso', 'organizations_url': 'https://api.github.com/users/Intiroso/orgs', 'node_id': 'MDQ6VXNlcjQ4Nzg2MDc3', 'events_url': 'https://api.github.com/users/Intiroso/events{/privacy}', 'repos_url': 'https://api.github.com/users/Intiroso/repos', 'gists_url': 'https://api.github.com/users/Intiroso/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Intiroso/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Intiroso/following{/other_user}', 'html_url': 'https://github.com/Intiroso', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/48786077?v=4', 'login': 'Intiroso', 'subscriptions_url': 'https://api.github.com/users/Intiroso/subscriptions', 'starred_url': 'https://api.github.com/users/Intiroso/starred{/owner}{/repo}', 'id': 48786077}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'NONE', 'updated_at': '2019-03-21T07:47:51Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Intiroso/followers', 'url': 'https://api.github.com/users/Intiroso', 'organizations_url': 'https://api.github.com/users/Intiroso/orgs', 'node_id': 'MDQ6VXNlcjQ4Nzg2MDc3', 'events_url': 'https://api.github.com/users/Intiroso/events{/privacy}', 'repos_url': 'https://api.github.com/users/Intiroso/repos', 'gists_url': 'https://api.github.com/users/Intiroso/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Intiroso/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Intiroso/following{/other_user}', 'html_url': 'https://github.com/Intiroso', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/48786077?v=4', 'login': 'Intiroso', 'subscriptions_url': 'https://api.github.com/users/Intiroso/subscriptions', 'starred_url': 'https://api.github.com/users/Intiroso/starred{/owner}{/repo}', 'id': 48786077}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7753#issuecomment-475137158', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7753', 'created_at': '2019-03-21T07:47:51Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475137158', 'body': 'Having this problem since 5.0-9638 version with Metroid Prime 2 when trying to activate the scanner and with LoZ-Twilight Princess when trying to load a save file (both GameCube and EU versions. G2MP01 and GZ2P01 IDs)\r\n![Error](https://user-images.githubusercontent.com/48786077/54738627-cfcb6580-4b93-11e9-801d-fb9feb850022.jpg)\r\n\r\nMy config\r\n![Config](https://user-images.githubusercontent.com/48786077/54738643-e07bdb80-4b93-11e9-8889-910072d9c39d.jpg)\r\n\r\nIn MP2 **Store EFB Copies to Texture only** is disabled by default.', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTEzNzE1OA==', 'id': 475137158}}, 'id': 7753}
2019-03-21T00:41:10.963654	{'safe_author': True, 'source': 'ghhookparser', 'body': 'We will also need this in `GetTextureFromOverlappingTextures` though the number of titles that exhibit this behavior will be minimal', 'action': 'created', 'author': 'iwubcode', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7914#issuecomment-475080135', 'type': 'gh_issue_comment', 'title': 'TextureCacheBase: Fix infinite loop in DoPartialTextureUpdates', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-20T22:53:02Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376752, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-20T22:53:42Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'I think this was code I wrote... whoops.', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7914', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7914/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/stenzek/followers', 'url': 'https://api.github.com/users/stenzek', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'node_id': 'MDQ6VXNlcjExMjg4MzE5', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'repos_url': 'https://api.github.com/users/stenzek/repos', 'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'html_url': 'https://github.com/stenzek', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'login': 'stenzek', 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'id': 11288319}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7914/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7914.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7914', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7914.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7914'}, 'locked': False, 'closed_at': None, 'number': 7914, 'labels': [], 'comments': 0, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYyNzk2MTAw', 'state': 'open', 'updated_at': '2019-03-21T00:41:10Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7914', 'created_at': '2019-03-20T10:06:58Z', 'title': 'TextureCacheBase: Fix infinite loop in DoPartialTextureUpdates', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7914/comments', 'id': 423165411}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'url': 'https://api.github.com/users/iwubcode', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'node_id': 'MDQ6VXNlcjE1MjI0NzIy', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'html_url': 'https://github.com/iwubcode', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'login': 'iwubcode', 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'id': 15224722}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-21T00:41:10Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/iwubcode/followers', 'url': 'https://api.github.com/users/iwubcode', 'organizations_url': 'https://api.github.com/users/iwubcode/orgs', 'node_id': 'MDQ6VXNlcjE1MjI0NzIy', 'events_url': 'https://api.github.com/users/iwubcode/events{/privacy}', 'repos_url': 'https://api.github.com/users/iwubcode/repos', 'gists_url': 'https://api.github.com/users/iwubcode/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/iwubcode/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/iwubcode/following{/other_user}', 'html_url': 'https://github.com/iwubcode', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/15224722?v=4', 'login': 'iwubcode', 'subscriptions_url': 'https://api.github.com/users/iwubcode/subscriptions', 'starred_url': 'https://api.github.com/users/iwubcode/starred{/owner}{/repo}', 'id': 15224722}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7914#issuecomment-475080135', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7914', 'created_at': '2019-03-21T00:41:10Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475080135', 'body': 'We will also need this in `GetTextureFromOverlappingTextures` though the number of titles that exhibit this behavior will be minimal', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTA4MDEzNQ==', 'id': 475080135}}, 'id': 7914}
2019-03-20T23:32:08.684730	{'safe_author': True, 'source': 'ghhookparser', 'body': '@dolphin-emu-bot rebuild', 'action': 'deleted', 'author': 'Ebola16', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7274#issuecomment-475067723', 'type': 'gh_issue_comment', 'title': 'Android: Dynamic SettingsActivity Titles', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'deleted', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-20T22:53:02Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376750, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-20T22:53:42Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'Implements https://bugs.dolphin-emu.org/issues/11012.\r\n\r\nThe old code always displayed "Settings". This PR allows different titles, which makes identifying the current menu easier for users. Example:\r\n\r\n![screenshot_20180716-225508_dolphin emulator](https://user-images.githubusercontent.com/17330088/42794386-7ca5247c-894c-11e8-8e44-b4e0bb3475c7.jpg)\r\n', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7274.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7274', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7274.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7274'}, 'locked': False, 'closed_at': None, 'number': 7274, 'labels': [], 'comments': 19, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjAxODEyNDk3', 'state': 'open', 'updated_at': '2019-03-20T23:30:56Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7274', 'created_at': '2018-07-17T03:05:11Z', 'title': 'Android: Dynamic SettingsActivity Titles', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274/comments', 'id': 341748931}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'MEMBER', 'updated_at': '2019-03-20T23:30:56Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7274#issuecomment-475067723', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274', 'created_at': '2019-03-20T23:30:56Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475067723', 'body': '@dolphin-emu-bot rebuild', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTA2NzcyMw==', 'id': 475067723}}, 'id': 7274}
2019-03-20T23:30:57.371330	{'safe_author': True, 'source': 'ghhookparser', 'body': '@dolphin-emu-bot rebuild', 'action': 'created', 'author': 'Ebola16', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7274#issuecomment-475067723', 'type': 'gh_issue_comment', 'title': 'Android: Dynamic SettingsActivity Titles', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-20T22:53:02Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376750, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-20T22:53:42Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'Implements https://bugs.dolphin-emu.org/issues/11012.\r\n\r\nThe old code always displayed "Settings". This PR allows different titles, which makes identifying the current menu easier for users. Example:\r\n\r\n![screenshot_20180716-225508_dolphin emulator](https://user-images.githubusercontent.com/17330088/42794386-7ca5247c-894c-11e8-8e44-b4e0bb3475c7.jpg)\r\n', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7274.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7274', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7274.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7274'}, 'locked': False, 'closed_at': None, 'number': 7274, 'labels': [], 'comments': 18, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjAxODEyNDk3', 'state': 'open', 'updated_at': '2019-03-20T23:30:56Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7274', 'created_at': '2018-07-17T03:05:11Z', 'title': 'Android: Dynamic SettingsActivity Titles', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274/comments', 'id': 341748931}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'MEMBER', 'updated_at': '2019-03-20T23:30:56Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7274#issuecomment-475067723', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7274', 'created_at': '2019-03-20T23:30:56Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475067723', 'body': '@dolphin-emu-bot rebuild', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTA2NzcyMw==', 'id': 475067723}}, 'id': 7274}
2019-03-20T23:26:06.945506	{'safe_author': True, 'source': 'ghhookparser', 'body': "Any review comments for this? This is the simplest PR I'm proposing.", 'action': 'created', 'author': 'Ebola16', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7810#issuecomment-475066795', 'type': 'gh_issue_comment', 'title': 'Android: Graphic setting description improvements', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-20T22:53:02Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376750, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-20T22:53:42Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "The first two commits are self-explanatory and are based on #7591.\r\n\r\nI also attempted to solve a problem involving SingleChoiceSetting options with long descriptions. For example, if we change Shader Compilation Mode to show setting value as description, important information would be missing. Merging the setting value with each setting's description would look horrible when choosing a setting too. I think the method I used in #7121 is the best way to go here.\r\n\r\nPinging @mahdihijazi @zackhow @MayImilae and @JosJuice in case you're interested in this.\r\n\r\n![screenshot_20190219-134448_dolphin emulator](https://user-images.githubusercontent.com/17330088/53044541-55ef7180-3459-11e9-931c-7793e756bb65.jpg)", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7810', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7810/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'author_association': 'MEMBER', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7810/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7810.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7810', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7810.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7810'}, 'locked': False, 'closed_at': None, 'number': 7810, 'labels': [], 'comments': 0, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjU0Mzk3NjU3', 'state': 'open', 'updated_at': '2019-03-20T23:26:06Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7810', 'created_at': '2019-02-19T20:28:44Z', 'title': 'Android: Graphic setting description improvements', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7810/comments', 'id': 412110015}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'MEMBER', 'updated_at': '2019-03-20T23:26:06Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Ebola16/followers', 'url': 'https://api.github.com/users/Ebola16', 'organizations_url': 'https://api.github.com/users/Ebola16/orgs', 'node_id': 'MDQ6VXNlcjE3MzMwMDg4', 'events_url': 'https://api.github.com/users/Ebola16/events{/privacy}', 'repos_url': 'https://api.github.com/users/Ebola16/repos', 'gists_url': 'https://api.github.com/users/Ebola16/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Ebola16/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Ebola16/following{/other_user}', 'html_url': 'https://github.com/Ebola16', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/17330088?v=4', 'login': 'Ebola16', 'subscriptions_url': 'https://api.github.com/users/Ebola16/subscriptions', 'starred_url': 'https://api.github.com/users/Ebola16/starred{/owner}{/repo}', 'id': 17330088}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7810#issuecomment-475066795', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7810', 'created_at': '2019-03-20T23:26:06Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475066795', 'body': "Any review comments for this? This is the simplest PR I'm proposing.", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTA2Njc5NQ==', 'id': 475066795}}, 'id': 7810}
2019-03-20T22:39:07.452917	{'safe_author': True, 'source': 'ghhookparser', 'body': 'Other bounding box games seem to work.  LGTM.', 'action': 'created', 'author': 'JMC47', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7915#issuecomment-475056500', 'type': 'gh_issue_comment', 'title': 'VideoBackends: Scale bounding box rectangle in the pixel shader', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 168, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-20T20:40:22Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376750, 'open_issues': 168, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-20T12:06:23Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': "During some testing-random-things-and-seeing-what-breaks, we discovered that sprite corruption bug at high IR in Paper Mario: The Thousand Year Door is due to differences in the bounding box coordinates returned to the game.\r\n\r\nI haven't looked at the code for the game, but I suspect it's doing something like:\r\n  - Set source rectangle to bounding box left/right/top/bottom\r\n  - Set destination stride to FIXED_VALUE\r\n  - Issue EFB Copy\r\n\r\nSo when the bounding box is off by one, the stride doesn't equal the width, and you get the sharing effect seen in https://bugs.dolphin-emu.org/issues/10838\r\n\r\nCurrently, we adjust the bounding box in the shader at the internal resolution, truncate this to an integer, then scale it to 1xIR after reading it back. Instead, this branch snaps the bounding box to 1xIR pixels by dividing by (well, actually multiplying by rcp(scale)) in the pixel shader instead, so the integer bounding box register contains the 1xIR rectangle, which is passed directly back to the game. We also round to the nearest integer, rather than truncating.\r\n\r\nThe last change is restoring the 7/12 pixel offset removed by the vertex shader. According to @Techjar, this fixes TTYD at higher internal resolutions. I guess the vertex positions must be really close to the edge of the pixels here.\r\n\r\nAlso, consolidated the whole thing into a helper function as cleanup (since it's shared by ubershaders and normal shaders).", 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7915', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7915/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/stenzek/followers', 'url': 'https://api.github.com/users/stenzek', 'organizations_url': 'https://api.github.com/users/stenzek/orgs', 'node_id': 'MDQ6VXNlcjExMjg4MzE5', 'events_url': 'https://api.github.com/users/stenzek/events{/privacy}', 'repos_url': 'https://api.github.com/users/stenzek/repos', 'gists_url': 'https://api.github.com/users/stenzek/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/stenzek/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/stenzek/following{/other_user}', 'html_url': 'https://github.com/stenzek', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/11288319?v=4', 'login': 'stenzek', 'subscriptions_url': 'https://api.github.com/users/stenzek/subscriptions', 'starred_url': 'https://api.github.com/users/stenzek/starred{/owner}{/repo}', 'id': 11288319}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7915/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7915.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7915', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7915.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7915'}, 'locked': False, 'closed_at': None, 'number': 7915, 'labels': [], 'comments': 1, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYyODM5MTcy', 'state': 'open', 'updated_at': '2019-03-20T22:39:06Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7915', 'created_at': '2019-03-20T12:15:07Z', 'title': 'VideoBackends: Scale bounding box rectangle in the pixel shader', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7915/comments', 'id': 423219523}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JMC47/followers', 'url': 'https://api.github.com/users/JMC47', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'node_id': 'MDQ6VXNlcjY1OTgyMDk=', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'repos_url': 'https://api.github.com/users/JMC47/repos', 'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'html_url': 'https://github.com/JMC47', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'login': 'JMC47', 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'id': 6598209}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-20T22:39:06Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JMC47/followers', 'url': 'https://api.github.com/users/JMC47', 'organizations_url': 'https://api.github.com/users/JMC47/orgs', 'node_id': 'MDQ6VXNlcjY1OTgyMDk=', 'events_url': 'https://api.github.com/users/JMC47/events{/privacy}', 'repos_url': 'https://api.github.com/users/JMC47/repos', 'gists_url': 'https://api.github.com/users/JMC47/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JMC47/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JMC47/following{/other_user}', 'html_url': 'https://github.com/JMC47', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6598209?v=4', 'login': 'JMC47', 'subscriptions_url': 'https://api.github.com/users/JMC47/subscriptions', 'starred_url': 'https://api.github.com/users/JMC47/starred{/owner}{/repo}', 'id': 6598209}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7915#issuecomment-475056500', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7915', 'created_at': '2019-03-20T22:39:06Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475056500', 'body': 'Other bounding box games seem to work.  LGTM.', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTA1NjUwMA==', 'id': 475056500}}, 'id': 7915}
2019-03-20T20:00:50.750233	{'safe_author': True, 'source': 'ghhookparser', 'body': 'That\'s a very roundabout way of providing a "feature" that is really just a workaround for lack of additional mappings. If anything, reloading the config should be the default action and there can be a "Change without reloading config" which is still weird leaving the emulator in a half changed state just to support this workaround.', 'action': 'created', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7908#issuecomment-475005129', 'type': 'gh_issue_comment', 'title': 'Android: add button to reload wiimote config', 'repo': 'dolphin-emu/dolphin', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 168, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-20T14:55:39Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376750, 'open_issues': 168, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-20T12:06:23Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'change wiimote extension without restart game.', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7908', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7908/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/weihuoya/followers', 'url': 'https://api.github.com/users/weihuoya', 'organizations_url': 'https://api.github.com/users/weihuoya/orgs', 'node_id': 'MDQ6VXNlcjM4MjczMzM=', 'events_url': 'https://api.github.com/users/weihuoya/events{/privacy}', 'repos_url': 'https://api.github.com/users/weihuoya/repos', 'gists_url': 'https://api.github.com/users/weihuoya/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/weihuoya/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/weihuoya/following{/other_user}', 'html_url': 'https://github.com/weihuoya', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/3827333?v=4', 'login': 'weihuoya', 'subscriptions_url': 'https://api.github.com/users/weihuoya/subscriptions', 'starred_url': 'https://api.github.com/users/weihuoya/starred{/owner}{/repo}', 'id': 3827333}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7908/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7908.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7908', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7908.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7908'}, 'locked': False, 'closed_at': None, 'number': 7908, 'labels': [], 'comments': 18, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYyMDEwOTA5', 'state': 'open', 'updated_at': '2019-03-20T20:00:49Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7908', 'created_at': '2019-03-18T11:11:06Z', 'title': 'Android: add button to reload wiimote config', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7908/comments', 'id': 422161195}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'MEMBER', 'updated_at': '2019-03-20T20:00:49Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7908#issuecomment-475005129', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7908', 'created_at': '2019-03-20T20:00:49Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475005129', 'body': 'That\'s a very roundabout way of providing a "feature" that is really just a workaround for lack of additional mappings. If anything, reloading the config should be the default action and there can be a "Change without reloading config" which is still weird leaving the emulator in a half changed state just to support this workaround.', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTAwNTEyOQ==', 'id': 475005129}}, 'id': 7908}
2019-03-20T18:02:00.170021	{'safe_author': False, 'source': 'ghhookparser', 'body': 'Hm, I\'m not sure about how to do it in nice UI/UX way. Maybe adding a short latency label under the slider ? But it would be redundant and then confusing since we already have a latency option.\r\nTrying to think like a user with a "powerful" PC (or as a user who wants the best sound quality possible), I would set it to Highest unaware of the lag it will produce.', 'action': 'edited', 'author': 'Dockolm', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7909#issuecomment-474960213', 'type': 'gh_issue_comment', 'title': 'Add slider to change DPLII decoder quality', 'repo': 'dolphin-emu/dolphin', 'raw': {'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'action': 'edited', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5135, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5135, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5135, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 168, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-20T14:55:39Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376750, 'open_issues': 168, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-20T12:06:23Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': 'Users were commenting that their games had now lower audio quality with the new DPLII decoder (the old one just did not work at all, however the new one can add annoying artifacts). It seems this was so because of the chosen SURROUND_BLOCK_SIZE which was set to a too low of a value.\r\n\r\nAll the games I tested and played did not have complex music or just simple SFX, so I did not detect this problem at all.\r\nHowever I was not sure if I want to hard-code it to a higher value as it directly increases the audio latency, therefore this PR.\r\n\r\nQuality/latency equivalency (assuming sample rate of 48000):\r\n\r\n- Low - SURROUND_BLOCK_SIZE = 512 - Latency = ~10 ms **(old hard coded default)**\r\n- Medium - SURROUND_BLOCK_SIZE = 1024 - Latency = ~20 ms\r\n- High - SURROUND_BLOCK_SIZE = 2048 - Latency = ~40 ms **(new default)**\r\n- Highest - SURROUND_BLOCK_SIZE = 4096 - Latency = ~80 ms\r\n\r\nThis PR does not fix the stuttering when DPLII and stretching are used together, it will be fixed in another PR.\r\n\r\nImage:\r\n![image](https://user-images.githubusercontent.com/14236067/54528328-74169780-495b-11e9-98c3-15fe21ba7290.png)\r\n\r\nAny suggestion is more than welcome :)\r\n\r\n', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/LAGonauta/followers', 'url': 'https://api.github.com/users/LAGonauta', 'organizations_url': 'https://api.github.com/users/LAGonauta/orgs', 'node_id': 'MDQ6VXNlcjE0MjM2MDY3', 'events_url': 'https://api.github.com/users/LAGonauta/events{/privacy}', 'repos_url': 'https://api.github.com/users/LAGonauta/repos', 'gists_url': 'https://api.github.com/users/LAGonauta/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/LAGonauta/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/LAGonauta/following{/other_user}', 'html_url': 'https://github.com/LAGonauta', 'gravatar_id': '', 'avatar_url': 'https://avatars3.githubusercontent.com/u/14236067?v=4', 'login': 'LAGonauta', 'subscriptions_url': 'https://api.github.com/users/LAGonauta/subscriptions', 'starred_url': 'https://api.github.com/users/LAGonauta/starred{/owner}{/repo}', 'id': 14236067}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7909.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7909', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7909.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7909'}, 'locked': False, 'closed_at': None, 'number': 7909, 'labels': [], 'comments': 5, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYyMDI1Nzc2', 'state': 'open', 'updated_at': '2019-03-20T18:01:59Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7909', 'created_at': '2019-03-18T11:59:02Z', 'title': 'Add slider to change DPLII decoder quality', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909/comments', 'id': 422179774}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Dockolm/followers', 'url': 'https://api.github.com/users/Dockolm', 'organizations_url': 'https://api.github.com/users/Dockolm/orgs', 'node_id': 'MDQ6VXNlcjEwNDE1MTQ2', 'events_url': 'https://api.github.com/users/Dockolm/events{/privacy}', 'repos_url': 'https://api.github.com/users/Dockolm/repos', 'gists_url': 'https://api.github.com/users/Dockolm/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Dockolm/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Dockolm/following{/other_user}', 'html_url': 'https://github.com/Dockolm', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/10415146?v=4', 'login': 'Dockolm', 'subscriptions_url': 'https://api.github.com/users/Dockolm/subscriptions', 'starred_url': 'https://api.github.com/users/Dockolm/starred{/owner}{/repo}', 'id': 10415146}, 'changes': {'body': {'from': 'Hm, I\'m not sure about how to do it in nice UI/UX way. Maybe adding a short latency label under the slider ? But it would be redundant and then confusing since we already have a latency option.\r\nTrying to think like a user with a "powerful" PC, I would set it to Highest unaware of the lag it will produce.'}}, 'comment': {'author_association': 'NONE', 'updated_at': '2019-03-20T18:01:59Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/Dockolm/followers', 'url': 'https://api.github.com/users/Dockolm', 'organizations_url': 'https://api.github.com/users/Dockolm/orgs', 'node_id': 'MDQ6VXNlcjEwNDE1MTQ2', 'events_url': 'https://api.github.com/users/Dockolm/events{/privacy}', 'repos_url': 'https://api.github.com/users/Dockolm/repos', 'gists_url': 'https://api.github.com/users/Dockolm/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/Dockolm/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/Dockolm/following{/other_user}', 'html_url': 'https://github.com/Dockolm', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/10415146?v=4', 'login': 'Dockolm', 'subscriptions_url': 'https://api.github.com/users/Dockolm/subscriptions', 'starred_url': 'https://api.github.com/users/Dockolm/starred{/owner}{/repo}', 'id': 10415146}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7909#issuecomment-474960213', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7909', 'created_at': '2019-03-20T18:00:17Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/474960213', 'body': 'Hm, I\'m not sure about how to do it in nice UI/UX way. Maybe adding a short latency label under the slider ? But it would be redundant and then confusing since we already have a latency option.\r\nTrying to think like a user with a "powerful" PC (or as a user who wants the best sound quality possible), I would set it to Highest unaware of the lag it will produce.', 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NDk2MDIxMw==', 'id': 474960213}}, 'id': 7909}

Recent 'gh_pull_request' events

2019-03-23T19:13:36.727183	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'spycrab', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7903', 'head_sha': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'title': 'Add imgui-based Netplay Chat', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'imgui_np_chat', 'repo': 'dolphin-emu/dolphin', 'id': 7903}
2019-03-23T17:49:24.496777	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'head_sha': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'title': '[WIP] Add a Verify tab to game properties', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'verify-disc', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T17:46:55.574791	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'head_sha': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'title': '[WIP] Add a Verify tab to game properties', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'verify-disc', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:15:44.018033	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'stenzek', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7853', 'head_sha': 'fa87fbc83452b5508d01753fb340574fca8fcd8f', 'title': 'Re-implement D3D12 video backend', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'd3d12', 'repo': 'dolphin-emu/dolphin', 'id': 7853}
2019-03-23T16:00:48.948906	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'head_sha': 'a30af0f164b3809616c257596256c540df6a5f4e', 'title': '[WIP] Add a Verify tab to game properties', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'verify-disc', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T15:56:07.969417	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'head_sha': '251a1dd9861d5fb7a19000d2aa3428123e80ee85', 'title': '[WIP] Add a Verify tab to game properties', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'verify-disc', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T15:50:16.453767	{'safe_author': True, 'source': 'ghhookparser', 'action': 'opened', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'head_sha': 'eaf57a65e632566279939a77a9749843043e01ce', 'title': '[WIP] Add a Verify tab to game properties', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'verify-disc', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T15:33:37.834091	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'stenzek', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7905', 'head_sha': '30d4fb9eaefcb3c09c70f1c44f6e2e406c54f747', 'title': 'Vulkan: Simplify command buffer fence tracking', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'vulkan-cleanup', 'repo': 'dolphin-emu/dolphin', 'id': 7905}
2019-03-23T15:20:15.948115	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861', 'head_sha': 'a1237bdf2fa84b4e59a261cfe7eb12eb838c101f', 'title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'mplus-emu', 'repo': 'dolphin-emu/dolphin', 'id': 7861}
2019-03-23T15:18:07.780225	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861', 'head_sha': 'a87b6cf003411a1b945b906d732d7ed1afb008ef', 'title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'mplus-emu', 'repo': 'dolphin-emu/dolphin', 'id': 7861}
2019-03-23T13:52:25.521153	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'spycrab', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7903', 'head_sha': 'f3bdb6b1b22e94ddbb5cdafe8bfde3ce7efaee0c', 'title': 'Add imgui-based Netplay Chat', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'imgui_np_chat', 'repo': 'dolphin-emu/dolphin', 'id': 7903}
2019-03-23T12:54:22.259580	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'zackhow', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7921', 'head_sha': 'fd323e7d4c5b9dafd98ff20f9761a6f40f9a2e3e', 'title': 'Android: Fix touch IR', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'fixir', 'repo': 'dolphin-emu/dolphin', 'id': 7921}
2019-03-23T12:45:49.055247	{'safe_author': True, 'source': 'ghhookparser', 'action': 'edited', 'author': 'zackhow', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7921', 'head_sha': '2fab8d689909a3f0ea9f2ca14dc6e777b791146c', 'title': 'Android: Fix touch IR', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'fixir', 'repo': 'dolphin-emu/dolphin', 'id': 7921}
2019-03-23T12:40:41.797692	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'zackhow', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7921', 'head_sha': '2fab8d689909a3f0ea9f2ca14dc6e777b791146c', 'title': 'Android: Fix touch IR', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'fixir', 'repo': 'dolphin-emu/dolphin', 'id': 7921}
2019-03-23T12:38:21.279037	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'zackhow', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7779', 'head_sha': 'fb121ff84b05af151a2240f72dbfb52986921c4c', 'title': 'Android: Overlay opacity options', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'opac', 'repo': 'dolphin-emu/dolphin', 'id': 7779}
2019-03-23T12:36:39.725156	{'safe_author': True, 'source': 'ghhookparser', 'action': 'opened', 'author': 'zackhow', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7921', 'head_sha': '66ba5acc9f2f5316049fa7376c02224fa8d45d8b', 'title': 'Android: Fix touch IR', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'fixir', 'repo': 'dolphin-emu/dolphin', 'id': 7921}
2019-03-23T12:15:13.485470	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'stenzek', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7853', 'head_sha': 'd06f05dd1d1ad2b8fc2128bcb1abf781eb76bc5b', 'title': 'Re-implement D3D12 video backend', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'd3d12', 'repo': 'dolphin-emu/dolphin', 'id': 7853}
2019-03-23T11:39:37.588550	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'stenzek', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7853', 'head_sha': '42e4b6a29b71ef9d23ee5f13338264c1374df8b6', 'title': 'Re-implement D3D12 video backend', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'd3d12', 'repo': 'dolphin-emu/dolphin', 'id': 7853}
2019-03-23T04:14:57.766316	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'stenzek', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7853', 'head_sha': '5e944075b65ee455892f4a706eea9a107b49d434', 'title': 'Re-implement D3D12 video backend', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'd3d12', 'repo': 'dolphin-emu/dolphin', 'id': 7853}
2019-03-23T00:31:11.044688	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7880', 'head_sha': '88f43afa1f5af3743dce62a4178f894c6c7d0b2c', 'title': 'WiimoteEmu: Implement 3rd-Party extension encryption and uDraw GameTablet.', 'base_sha': '672b582bec0ceecf8228358ef2579f3960c67b23', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'udraw-tablet-emu', 'repo': 'dolphin-emu/dolphin', 'id': 7880}
2019-03-22T20:18:29.986359	{'safe_author': True, 'source': 'ghhookparser', 'action': 'closed', 'author': 'spycrab', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7918', 'head_sha': '80fd01c3c36e7925fea1016c7f166b02cabdac74', 'title': 'InputCommon/OSX: Refactor IOKit controller interface', 'base_sha': '0a1aacb5d007dcc365e1de108632e7a29ed55605', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'iokit_refactor', 'repo': 'dolphin-emu/dolphin', 'id': 7918}
2019-03-22T18:05:52.190417	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'Ebola16', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7920', 'head_sha': '462cf6c7f89e22d4a9c34e198383bfc0bc7a3494', 'title': 'Android: Add Set as Default ISO to UI', 'base_sha': '0b3385ac1f4f2d40f5d2489d371b745271baad6a', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'DISO', 'repo': 'dolphin-emu/dolphin', 'id': 7920}
2019-03-22T17:18:14.955255	{'safe_author': True, 'source': 'ghhookparser', 'action': 'edited', 'author': 'Ebola16', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7920', 'head_sha': 'a5a696bc6a19e4fa95b743ad8a33c35e5d53bfa2', 'title': 'Android: Add Set as Default ISO to UI', 'base_sha': '0b3385ac1f4f2d40f5d2489d371b745271baad6a', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'DISO', 'repo': 'dolphin-emu/dolphin', 'id': 7920}
2019-03-22T17:00:20.976641	{'safe_author': True, 'source': 'ghhookparser', 'action': 'synchronize', 'author': 'Ebola16', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7920', 'head_sha': 'a5a696bc6a19e4fa95b743ad8a33c35e5d53bfa2', 'title': 'Android: Add Set as Default ISO to UI', 'base_sha': '0b3385ac1f4f2d40f5d2489d371b745271baad6a', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'DISO', 'repo': 'dolphin-emu/dolphin', 'id': 7920}
2019-03-22T16:46:58.944545	{'safe_author': True, 'source': 'ghhookparser', 'action': 'edited', 'author': 'Ebola16', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7920', 'head_sha': '37f026cbba8e382d9c08a975ced06ece815842c4', 'title': 'Android: Add Set as Default ISO to UI', 'base_sha': '0a1aacb5d007dcc365e1de108632e7a29ed55605', 'type': 'gh_pull_request', 'base_ref_name': 'master', 'head_ref_name': 'DISO', 'repo': 'dolphin-emu/dolphin', 'id': 7920}

Recent 'gh_pull_request_comment' events

2019-03-23T17:30:27.432064	{'source': 'ghhookparser', 'action': 'created', 'author': 'AdmiralCurtiss', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268402603', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T17:14:15.265905	{'source': 'ghhookparser', 'action': 'created', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268402042', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T17:08:48.328351	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401778', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T17:08:48.323995	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401707', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T17:03:43.442692	{'source': 'ghhookparser', 'action': 'created', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401674', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T17:02:22.664692	{'source': 'ghhookparser', 'action': 'created', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401636', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T17:01:14.740966	{'source': 'ghhookparser', 'action': 'created', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401597', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:59:38.310935	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401515', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:56:12.953703	{'source': 'ghhookparser', 'action': 'created', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401399', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:55:34.977873	{'source': 'ghhookparser', 'action': 'created', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401386', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:55:09.678193	{'source': 'ghhookparser', 'action': 'created', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401372', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:51:37.809211	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400763', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:51:37.805122	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400459', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:51:36.391440	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400649', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:51:36.385624	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400481', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:51:36.381506	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400982', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:51:36.379664	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400410', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:51:36.374001	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401077', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:51:36.341975	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401259', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7922}
2019-03-23T16:10:05.588123	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399935', 'hash': 'a1237bdf2fa84b4e59a261cfe7eb12eb838c101f', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7861}
2019-03-23T16:10:05.586934	{'source': 'ghhookparser', 'action': 'created', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399901', 'hash': 'a1237bdf2fa84b4e59a261cfe7eb12eb838c101f', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7861}
2019-03-23T14:43:31.378974	{'source': 'ghhookparser', 'action': 'created', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268397091', 'hash': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7861}
2019-03-23T14:42:04.998963	{'source': 'ghhookparser', 'action': 'created', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268397046', 'hash': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7861}
2019-03-23T14:39:55.260765	{'source': 'ghhookparser', 'action': 'created', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268396950', 'hash': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'is_part_of_review': False, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7861}
2019-03-23T14:17:13.436853	{'source': 'ghhookparser', 'action': 'created', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7903#discussion_r268396169', 'hash': 'f3bdb6b1b22e94ddbb5cdafe8bfde3ce7efaee0c', 'is_part_of_review': True, 'type': 'gh_pull_request_comment', 'repo': 'dolphin-emu/dolphin', 'id': 7903}

Recent 'gh_pull_request_review' events

2019-03-23T17:30:28.135599	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'AdmiralCurtiss', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218047963', 'comments': [{'pull_request_review_id': 218047963, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 106, 'body': "I'm guessing this should probably be `if (ShouldHaveChannelPartition() && !has_channel_partition)`?", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268402603', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMjYwMw==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)', 'updated_at': '2019-03-23T17:30:26Z', 'original_position': 106, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268402603', 'created_at': '2019-03-23T17:30:26Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/AdmiralCurtiss/followers', 'url': 'https://api.github.com/users/AdmiralCurtiss', 'organizations_url': 'https://api.github.com/users/AdmiralCurtiss/orgs', 'node_id': 'MDQ6VXNlcjQ1MjIyMzc=', 'events_url': 'https://api.github.com/users/AdmiralCurtiss/events{/privacy}', 'repos_url': 'https://api.github.com/users/AdmiralCurtiss/repos', 'gists_url': 'https://api.github.com/users/AdmiralCurtiss/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/AdmiralCurtiss/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/AdmiralCurtiss/following{/other_user}', 'html_url': 'https://github.com/AdmiralCurtiss', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/4522237?v=4', 'login': 'AdmiralCurtiss', 'subscriptions_url': 'https://api.github.com/users/AdmiralCurtiss/subscriptions', 'starred_url': 'https://api.github.com/users/AdmiralCurtiss/starred{/owner}{/repo}', 'id': 4522237}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268402603'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268402603'}}, 'id': 268402603}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T17:14:15.262273	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218047337', 'comments': [{'pull_request_review_id': 218047337, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 78, 'body': '@MayImilae, any thoughts?', 'path': 'Source/Core/DolphinQt/Config/VerifyWidget.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268402042', 'in_reply_to_id': 268401077, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMjA0Mg==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,103 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DolphinQt/Config/VerifyWidget.h"\n+\n+#include <memory>\n+\n+#include <QHeaderView>\n+#include <QLabel>\n+#include <QProgressDialog>\n+#include <QPushButton>\n+#include <QVBoxLayout>\n+\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeVerifier.h"\n+\n+VerifyWidget::VerifyWidget(std::shared_ptr<DiscIO::Volume> volume) : m_volume(std::move(volume))\n+{\n+  QVBoxLayout* layout = new QVBoxLayout(this);\n+\n+  m_problems = new QTableWidget(0, 2, this);\n+  m_problems->setHorizontalHeaderLabels({tr("Problem"), tr("Severity")});\n+  m_problems->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);\n+  m_problems->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);\n+  m_problems->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);\n+  m_problems->verticalHeader()->hide();\n+\n+  m_summary_text = new QTextEdit(this);\n+  m_summary_text->setReadOnly(true);\n+\n+  QPushButton* verify_button = new QPushButton(tr("Verify Integrity"));\n+  connect(verify_button, &QPushButton::clicked, this, &VerifyWidget::Verify);\n+\n+  layout->addWidget(m_problems);\n+  layout->addWidget(m_summary_text);\n+  layout->addWidget(verify_button);\n+\n+  layout->setStretchFactor(m_problems, 5);\n+  layout->setStretchFactor(m_summary_text, 2);\n+\n+  setLayout(layout);\n+}\n+\n+void VerifyWidget::Verify()\n+{\n+  DiscIO::VolumeVerifier verifier(*m_volume);\n+\n+  QProgressDialog* progress =\n+      new QProgressDialog(tr("Verifying"), tr("Cancel"), 0, verifier.GetMaxProgress(), this);\n+  progress->setWindowTitle(tr("Verifying"));\n+  progress->setWindowFlags(progress->windowFlags() & ~Qt::WindowContextHelpButtonHint);\n+  progress->setMinimumDuration(500);\n+  progress->setWindowModality(Qt::WindowModal);\n+\n+  verifier.Start();\n+  while (verifier.GetProgress() != verifier.GetMaxProgress())\n+  {\n+    progress->setValue(verifier.GetProgress());\n+    if (progress->wasCanceled())\n+      return;\n+\n+    verifier.Process();\n+  }\n+  verifier.Finish();\n+\n+  DiscIO::VolumeVerifier::Result result = verifier.GetResult();\n+  progress->setValue(verifier.GetProgress());\n+\n+  m_summary_text->setText(QString::fromStdString(result.summary_text));\n+\n+  m_problems->setRowCount(static_cast<int>(result.problems.size()));\n+  for (int i = 0; i < m_problems->rowCount(); ++i)\n+  {\n+    const DiscIO::VolumeVerifier::Problem problem = result.problems[i];\n+\n+    QString severity;\n+    switch (problem.severity)', 'updated_at': '2019-03-23T17:14:13Z', 'original_position': 78, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268402042', 'created_at': '2019-03-23T17:14:13Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268402042'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268402042'}}, 'id': 268402042}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T17:08:48.316598	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218047000', 'comments': [{'pull_request_review_id': 218047000, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 243, 'body': "I'm afraid not. Maybe 64-bit? No idea.", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401707', 'in_reply_to_id': 268401259, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTcwNw==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";', 'updated_at': '2019-03-23T17:08:46Z', 'original_position': 243, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401707', 'created_at': '2019-03-23T17:04:33Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401707'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401707'}}, 'id': 268401707}, {'pull_request_review_id': 218047000, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 503, 'body': "Ok, good to know. I'd like some sort of comment then so you can immediately see it is excluding Korean ones (which would be allowed here).", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401778', 'in_reply_to_id': 268400763, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTc3OA==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";\n+        for (const FileInfo& f : *file_info)\n+        {\n+          if (StringBeginsWith(f.GetName(), correct_ios))\n+          {\n+            has_correct_ios = true;\n+            break;\n+          }\n+        }\n+      }\n+    }\n+\n+    if (!has_correct_ios)\n+    {\n+      // This is reached for hacked dumps where the update partition has been replaced with\n+      // a very old update partition so that no updates will be installed.\n+      AddProblem(Severity::Low,\n+                 GetStringT("The update partition does not contain the IOS used by this title."));\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void VolumeVerifier::CheckCorrectlySigned(const Partition& partition, const std::string& error_text)\n+{\n+  IOS::HLE::Kernel ios;\n+  const auto es = ios.GetES();\n+  const std::vector<u8> cert_chain = m_volume.GetCertificateChain(partition);\n+\n+  if (IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTicket(partition), cert_chain) ||\n+      IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTMD(partition), cert_chain))\n+  {\n+    AddProblem(Severity::Low, error_text);\n+  }\n+}\n+\n+bool VolumeVerifier::IsDebugSigned() const\n+{\n+  const IOS::ES::TicketReader& ticket = m_volume.GetTicket(m_volume.GetGamePartition());\n+  return ticket.IsValid() ? ticket.GetConsoleType() == IOS::HLE::IOSC::ConsoleType::RVT : false;\n+}\n+\n+bool VolumeVerifier::ShouldHaveChannelPartition() const\n+{\n+  const std::unordered_set<std::string> channel_discs{\n+      "RFNE01", "RFNJ01", "RFNK01", "RFNP01", "RFNW01", "RFPE01", "RFPJ01", "RFPK01", "RFPP01",\n+      "RFPW01", "RGWE41", "RGWJ41", "RGWP41", "RGWX41", "RMCE01", "RMCJ01", "RMCK01", "RMCP01",\n+  };\n+\n+  return channel_discs.find(m_volume.GetGameID()) != channel_discs.end();\n+}\n+\n+bool VolumeVerifier::ShouldHaveMasterpiecePartitions() const\n+{\n+  const std::unordered_set<std::string> ssbb{"RSBE01", "RSBJ01", "RSBK01", "RSBP01"};\n+  return ssbb.find(m_volume.GetGameID()) != ssbb.end();\n+}\n+\n+bool VolumeVerifier::ShouldBeDualLayer() const\n+{\n+  // The Japanese versions of Xenoblade and The Last Story are single-layer\n+  // (unlike the other versions) and must not be added to this list.\n+  const std::unordered_set<std::string> dual_layer_discs{\n+      "R3ME01", "R3MP01", "R3OE01", "R3OJ01", "R3OP01", "RSBE01", "RSBJ01", "RSBK01", "RSBP01",\n+      "RXMJ8P", "S59E01", "S59JC8", "S59P01", "S5QJC8", "SK8X52", "SAKENS", "SAKPNS", "SK8V52",\n+      "SK8X52", "SLSEXJ", "SLSP01", "SQIE4Q", "SQIP4Q", "SQIY4Q", "SR5E41", "SR5P41", "SUOE41",\n+      "SUOP41", "SVXX52", "SVXY52", "SX4E01", "SX4P01", "SZ3EGT", "SZ3PGT",\n+  };\n+\n+  return dual_layer_discs.find(m_volume.GetGameID()) != dual_layer_discs.end();\n+}\n+\n+void VolumeVerifier::CheckDiscSize()\n+{\n+  if (!IsDisc(m_volume.GetVolumeType()))\n+    return;\n+\n+  const u64 biggest_offset = GetBiggestUsedOffset();\n+  if (biggest_offset > m_volume.GetSize())\n+  {\n+    const bool second_layer_missing =\n+        biggest_offset > SL_DVD_SIZE && m_volume.GetSize() >= SL_DVD_SIZE;\n+    const std::string text =\n+        second_layer_missing ?\n+            GetStringT(\n+                "This disc image is too small and lacks some data. The problem is most likely that "\n+                "this is a dual-layer disc that has been dumped as a single-layer disc.") :\n+            GetStringT(\n+                "This disc image is too small and lacks some data. If your dumping program saved "\n+                "the disc image as several parts, you need to merge them into one file.");\n+    AddProblem(Severity::High, text);\n+    return;\n+  }\n+\n+  if (ShouldBeDualLayer() && biggest_offset <= SL_DVD_R_SIZE)\n+  {\n+    AddProblem(\n+        Severity::Medium,\n+        GetStringT("This game has been hacked to fit on a single-layer DVD. Some content such as "\n+                   "pre-rendered videos, extra languages or entire game modes will be broken. "\n+                   "This problem generally only exists in illegal copies of games."));\n+  }\n+\n+  if (!m_volume.IsSizeAccurate())\n+  {\n+    AddProblem(Severity::Low, GetStringT("The format that the disc image is saved in does not "\n+                                         "store the size of the disc image."));\n+  }\n+  else if (!m_is_tgc)\n+  {\n+    const Platform platform = m_volume.GetVolumeType();\n+    const u64 size = m_volume.GetSize();\n+\n+    const bool valid_gamecube = size == MINI_DVD_SIZE;\n+    const bool valid_retail_wii = size == SL_DVD_SIZE || size == DL_DVD_SIZE;\n+    const bool valid_debug_wii = size == SL_DVD_R_SIZE || size == DL_DVD_R_SIZE;\n+\n+    const bool debug = IsDebugSigned();\n+    if ((platform == Platform::GameCubeDisc && !valid_gamecube) ||\n+        (platform == Platform::WiiDisc && (debug ? !valid_debug_wii : !valid_retail_wii)))\n+    {\n+      if (debug && valid_retail_wii)\n+      {\n+        AddProblem(Severity::Low,\n+                   GetStringT("This debug disc image has the size of a retail disc image."));\n+      }\n+      else\n+      {\n+        const bool small =\n+            (m_volume.GetVolumeType() == Platform::GameCubeDisc && size < MINI_DVD_SIZE) ||\n+            (m_volume.GetVolumeType() == Platform::WiiDisc && size < SL_DVD_SIZE);\n+\n+        if (small)\n+        {\n+          AddProblem(Severity::Low,\n+                     GetStringT("This disc image has an unusual size. This will likely make the "\n+                                "emulated loading times longer. When using netplay or sending "\n+                                "input recordings to other people, you will likely experience "\n+                                "desyncs if anyone is using a good dump."));\n+        }\n+        else\n+        {\n+          AddProblem(Severity::Low, GetStringT("This disc image has an unusual size."));\n+        }\n+      }\n+    }\n+  }\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset()\n+{\n+  std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+    partitions.emplace_back(m_volume.GetGamePartition());\n+\n+  u64 biggest_offset = 0;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (partition != PARTITION_NONE)\n+      biggest_offset = std::max(biggest_offset, partition.offset);\n+\n+    const std::optional<u64> fst_offset = GetFSTOffset(m_volume, partition);\n+    const std::optional<u64> fst_size = GetFSTSize(m_volume, partition);\n+    if (!fst_offset || !fst_size)\n+      break;\n+\n+    biggest_offset = std::max(\n+        biggest_offset, m_volume.PartitionOffsetToRawOffset(*fst_offset + *fst_size, partition));\n+\n+    const FileSystem* fs = m_volume.GetFileSystem(partition);\n+    if (!fs)\n+      break;\n+\n+    biggest_offset = std::max(biggest_offset, m_volume.PartitionOffsetToRawOffset(\n+                                                  GetBiggestUsedOffset(fs->GetRoot()), partition));\n+  }\n+  return biggest_offset;\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset(const FileInfo& file_info) const\n+{\n+  if (file_info.IsDirectory())\n+  {\n+    u64 biggest_offset = 0;\n+    for (const FileInfo& f : file_info)\n+      biggest_offset = std::max(biggest_offset, GetBiggestUsedOffset(f));\n+    return biggest_offset;\n+  }\n+  else\n+  {\n+    return file_info.GetOffset() + file_info.GetSize();\n+  }\n+}\n+\n+void VolumeVerifier::CheckMisc()\n+{\n+  const Region region = m_volume.GetRegion();\n+  const Platform platform = m_volume.GetVolumeType();\n+  const std::string game_id_unencrypted = m_volume.GetGameID(PARTITION_NONE);\n+  const std::string game_id_encrypted = m_volume.GetGameID(m_volume.GetGamePartition());\n+\n+  if (game_id_unencrypted != game_id_encrypted)\n+  {\n+    bool inconsistent_game_id = true;\n+    if (game_id_encrypted == "RELSAB")\n+    {\n+      if (StringBeginsWith(game_id_unencrypted, "410"))\n+      {\n+        // This is the Wii Backup Disc (aka "pinkfish" disc),\n+        // which legitimately has an inconsistent game ID.\n+        inconsistent_game_id = false;\n+      }\n+      else if (StringBeginsWith(game_id_unencrypted, "010"))\n+      {\n+        // Hacked version of the Wii Backup Disc (aka "pinkfish" disc).\n+        std::string proper_game_id = game_id_unencrypted;\n+        proper_game_id[0] = \'4\';\n+        AddProblem(Severity::Low,\n+                   StringFromFormat(GetStringT("The game ID is %s but should be %s.").c_str(),\n+                                    game_id_unencrypted.c_str(), proper_game_id.c_str()));\n+        inconsistent_game_id = false;\n+      }\n+    }\n+\n+    if (inconsistent_game_id)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The game ID is inconsistent."));\n+    }\n+  }\n+\n+  if (game_id_encrypted.size() < 4)\n+  {\n+    AddProblem(Severity::Low, GetStringT("The game ID is unusually short."));\n+  }\n+  else\n+  {\n+    const char country_code = game_id_encrypted[3];\n+    if (CountryCodeToRegion(country_code, platform, region) != region)\n+    {\n+      AddProblem(\n+          Severity::Medium,\n+          GetStringT("The region code does not match the game ID. If this is because the "\n+                     "region code has been modified, the game might run at the wrong speed, "\n+                     "graphical elements might be offset, or the game might not run at all."));\n+    }\n+  }\n+\n+  const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+  if (tmd.IsValid())\n+  {\n+    const u64 ios_id = tmd.GetIOSId() & 0xFF;\n+\n+    if (region == Region::NTSC_K && ios_id < 40 && ios_id != 4 && ios_id != 9 && ios_id != 21 &&\n+        ios_id != 37)', 'updated_at': '2019-03-23T17:08:46Z', 'original_position': 503, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401778', 'created_at': '2019-03-23T17:06:06Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401778'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401778'}}, 'id': 268401778}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T17:08:47.755584	{'source': 'ghhookparser', 'action': 'edited', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218047000', 'comments': [{'pull_request_review_id': 218047000, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 243, 'body': "I'm afraid not. Maybe 64-bit? No idea.", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401707', 'in_reply_to_id': 268401259, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTcwNw==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";', 'updated_at': '2019-03-23T17:08:46Z', 'original_position': 243, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401707', 'created_at': '2019-03-23T17:04:33Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401707'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401707'}}, 'id': 268401707}, {'pull_request_review_id': 218047000, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 503, 'body': "Ok, good to know. I'd like some sort of comment then so you can immediately see it is excluding Korean ones (which would be allowed here).", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401778', 'in_reply_to_id': 268400763, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTc3OA==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";\n+        for (const FileInfo& f : *file_info)\n+        {\n+          if (StringBeginsWith(f.GetName(), correct_ios))\n+          {\n+            has_correct_ios = true;\n+            break;\n+          }\n+        }\n+      }\n+    }\n+\n+    if (!has_correct_ios)\n+    {\n+      // This is reached for hacked dumps where the update partition has been replaced with\n+      // a very old update partition so that no updates will be installed.\n+      AddProblem(Severity::Low,\n+                 GetStringT("The update partition does not contain the IOS used by this title."));\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void VolumeVerifier::CheckCorrectlySigned(const Partition& partition, const std::string& error_text)\n+{\n+  IOS::HLE::Kernel ios;\n+  const auto es = ios.GetES();\n+  const std::vector<u8> cert_chain = m_volume.GetCertificateChain(partition);\n+\n+  if (IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTicket(partition), cert_chain) ||\n+      IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTMD(partition), cert_chain))\n+  {\n+    AddProblem(Severity::Low, error_text);\n+  }\n+}\n+\n+bool VolumeVerifier::IsDebugSigned() const\n+{\n+  const IOS::ES::TicketReader& ticket = m_volume.GetTicket(m_volume.GetGamePartition());\n+  return ticket.IsValid() ? ticket.GetConsoleType() == IOS::HLE::IOSC::ConsoleType::RVT : false;\n+}\n+\n+bool VolumeVerifier::ShouldHaveChannelPartition() const\n+{\n+  const std::unordered_set<std::string> channel_discs{\n+      "RFNE01", "RFNJ01", "RFNK01", "RFNP01", "RFNW01", "RFPE01", "RFPJ01", "RFPK01", "RFPP01",\n+      "RFPW01", "RGWE41", "RGWJ41", "RGWP41", "RGWX41", "RMCE01", "RMCJ01", "RMCK01", "RMCP01",\n+  };\n+\n+  return channel_discs.find(m_volume.GetGameID()) != channel_discs.end();\n+}\n+\n+bool VolumeVerifier::ShouldHaveMasterpiecePartitions() const\n+{\n+  const std::unordered_set<std::string> ssbb{"RSBE01", "RSBJ01", "RSBK01", "RSBP01"};\n+  return ssbb.find(m_volume.GetGameID()) != ssbb.end();\n+}\n+\n+bool VolumeVerifier::ShouldBeDualLayer() const\n+{\n+  // The Japanese versions of Xenoblade and The Last Story are single-layer\n+  // (unlike the other versions) and must not be added to this list.\n+  const std::unordered_set<std::string> dual_layer_discs{\n+      "R3ME01", "R3MP01", "R3OE01", "R3OJ01", "R3OP01", "RSBE01", "RSBJ01", "RSBK01", "RSBP01",\n+      "RXMJ8P", "S59E01", "S59JC8", "S59P01", "S5QJC8", "SK8X52", "SAKENS", "SAKPNS", "SK8V52",\n+      "SK8X52", "SLSEXJ", "SLSP01", "SQIE4Q", "SQIP4Q", "SQIY4Q", "SR5E41", "SR5P41", "SUOE41",\n+      "SUOP41", "SVXX52", "SVXY52", "SX4E01", "SX4P01", "SZ3EGT", "SZ3PGT",\n+  };\n+\n+  return dual_layer_discs.find(m_volume.GetGameID()) != dual_layer_discs.end();\n+}\n+\n+void VolumeVerifier::CheckDiscSize()\n+{\n+  if (!IsDisc(m_volume.GetVolumeType()))\n+    return;\n+\n+  const u64 biggest_offset = GetBiggestUsedOffset();\n+  if (biggest_offset > m_volume.GetSize())\n+  {\n+    const bool second_layer_missing =\n+        biggest_offset > SL_DVD_SIZE && m_volume.GetSize() >= SL_DVD_SIZE;\n+    const std::string text =\n+        second_layer_missing ?\n+            GetStringT(\n+                "This disc image is too small and lacks some data. The problem is most likely that "\n+                "this is a dual-layer disc that has been dumped as a single-layer disc.") :\n+            GetStringT(\n+                "This disc image is too small and lacks some data. If your dumping program saved "\n+                "the disc image as several parts, you need to merge them into one file.");\n+    AddProblem(Severity::High, text);\n+    return;\n+  }\n+\n+  if (ShouldBeDualLayer() && biggest_offset <= SL_DVD_R_SIZE)\n+  {\n+    AddProblem(\n+        Severity::Medium,\n+        GetStringT("This game has been hacked to fit on a single-layer DVD. Some content such as "\n+                   "pre-rendered videos, extra languages or entire game modes will be broken. "\n+                   "This problem generally only exists in illegal copies of games."));\n+  }\n+\n+  if (!m_volume.IsSizeAccurate())\n+  {\n+    AddProblem(Severity::Low, GetStringT("The format that the disc image is saved in does not "\n+                                         "store the size of the disc image."));\n+  }\n+  else if (!m_is_tgc)\n+  {\n+    const Platform platform = m_volume.GetVolumeType();\n+    const u64 size = m_volume.GetSize();\n+\n+    const bool valid_gamecube = size == MINI_DVD_SIZE;\n+    const bool valid_retail_wii = size == SL_DVD_SIZE || size == DL_DVD_SIZE;\n+    const bool valid_debug_wii = size == SL_DVD_R_SIZE || size == DL_DVD_R_SIZE;\n+\n+    const bool debug = IsDebugSigned();\n+    if ((platform == Platform::GameCubeDisc && !valid_gamecube) ||\n+        (platform == Platform::WiiDisc && (debug ? !valid_debug_wii : !valid_retail_wii)))\n+    {\n+      if (debug && valid_retail_wii)\n+      {\n+        AddProblem(Severity::Low,\n+                   GetStringT("This debug disc image has the size of a retail disc image."));\n+      }\n+      else\n+      {\n+        const bool small =\n+            (m_volume.GetVolumeType() == Platform::GameCubeDisc && size < MINI_DVD_SIZE) ||\n+            (m_volume.GetVolumeType() == Platform::WiiDisc && size < SL_DVD_SIZE);\n+\n+        if (small)\n+        {\n+          AddProblem(Severity::Low,\n+                     GetStringT("This disc image has an unusual size. This will likely make the "\n+                                "emulated loading times longer. When using netplay or sending "\n+                                "input recordings to other people, you will likely experience "\n+                                "desyncs if anyone is using a good dump."));\n+        }\n+        else\n+        {\n+          AddProblem(Severity::Low, GetStringT("This disc image has an unusual size."));\n+        }\n+      }\n+    }\n+  }\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset()\n+{\n+  std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+    partitions.emplace_back(m_volume.GetGamePartition());\n+\n+  u64 biggest_offset = 0;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (partition != PARTITION_NONE)\n+      biggest_offset = std::max(biggest_offset, partition.offset);\n+\n+    const std::optional<u64> fst_offset = GetFSTOffset(m_volume, partition);\n+    const std::optional<u64> fst_size = GetFSTSize(m_volume, partition);\n+    if (!fst_offset || !fst_size)\n+      break;\n+\n+    biggest_offset = std::max(\n+        biggest_offset, m_volume.PartitionOffsetToRawOffset(*fst_offset + *fst_size, partition));\n+\n+    const FileSystem* fs = m_volume.GetFileSystem(partition);\n+    if (!fs)\n+      break;\n+\n+    biggest_offset = std::max(biggest_offset, m_volume.PartitionOffsetToRawOffset(\n+                                                  GetBiggestUsedOffset(fs->GetRoot()), partition));\n+  }\n+  return biggest_offset;\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset(const FileInfo& file_info) const\n+{\n+  if (file_info.IsDirectory())\n+  {\n+    u64 biggest_offset = 0;\n+    for (const FileInfo& f : file_info)\n+      biggest_offset = std::max(biggest_offset, GetBiggestUsedOffset(f));\n+    return biggest_offset;\n+  }\n+  else\n+  {\n+    return file_info.GetOffset() + file_info.GetSize();\n+  }\n+}\n+\n+void VolumeVerifier::CheckMisc()\n+{\n+  const Region region = m_volume.GetRegion();\n+  const Platform platform = m_volume.GetVolumeType();\n+  const std::string game_id_unencrypted = m_volume.GetGameID(PARTITION_NONE);\n+  const std::string game_id_encrypted = m_volume.GetGameID(m_volume.GetGamePartition());\n+\n+  if (game_id_unencrypted != game_id_encrypted)\n+  {\n+    bool inconsistent_game_id = true;\n+    if (game_id_encrypted == "RELSAB")\n+    {\n+      if (StringBeginsWith(game_id_unencrypted, "410"))\n+      {\n+        // This is the Wii Backup Disc (aka "pinkfish" disc),\n+        // which legitimately has an inconsistent game ID.\n+        inconsistent_game_id = false;\n+      }\n+      else if (StringBeginsWith(game_id_unencrypted, "010"))\n+      {\n+        // Hacked version of the Wii Backup Disc (aka "pinkfish" disc).\n+        std::string proper_game_id = game_id_unencrypted;\n+        proper_game_id[0] = \'4\';\n+        AddProblem(Severity::Low,\n+                   StringFromFormat(GetStringT("The game ID is %s but should be %s.").c_str(),\n+                                    game_id_unencrypted.c_str(), proper_game_id.c_str()));\n+        inconsistent_game_id = false;\n+      }\n+    }\n+\n+    if (inconsistent_game_id)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The game ID is inconsistent."));\n+    }\n+  }\n+\n+  if (game_id_encrypted.size() < 4)\n+  {\n+    AddProblem(Severity::Low, GetStringT("The game ID is unusually short."));\n+  }\n+  else\n+  {\n+    const char country_code = game_id_encrypted[3];\n+    if (CountryCodeToRegion(country_code, platform, region) != region)\n+    {\n+      AddProblem(\n+          Severity::Medium,\n+          GetStringT("The region code does not match the game ID. If this is because the "\n+                     "region code has been modified, the game might run at the wrong speed, "\n+                     "graphical elements might be offset, or the game might not run at all."));\n+    }\n+  }\n+\n+  const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+  if (tmd.IsValid())\n+  {\n+    const u64 ios_id = tmd.GetIOSId() & 0xFF;\n+\n+    if (region == Region::NTSC_K && ios_id < 40 && ios_id != 4 && ios_id != 9 && ios_id != 21 &&\n+        ios_id != 37)', 'updated_at': '2019-03-23T17:08:46Z', 'original_position': 503, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401778', 'created_at': '2019-03-23T17:06:06Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401778'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401778'}}, 'id': 268401778}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T17:03:43.437554	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218046962', 'comments': [{'pull_request_review_id': 218046962, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 243, 'body': "By the way, do you know what the *xx* stands for? It seems to always be 64, but I'm not sure why.", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401674', 'in_reply_to_id': 268401259, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTY3NA==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";', 'updated_at': '2019-03-23T17:03:42Z', 'original_position': 243, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401674', 'created_at': '2019-03-23T17:03:42Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401674'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401674'}}, 'id': 268401674}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T17:02:22.662383	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218046915', 'comments': [{'pull_request_review_id': 218046915, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 39, 'body': "Having one comment at the top of the whole list makes it look a bit ambiguous whether the comment applies to just the first entry or the whole list, so I'd prefer to keep it this way.", 'path': 'Source/Core/DiscIO/VolumeVerifier.h', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401636', 'in_reply_to_id': 268400982, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTYzNg==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,92 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#pragma once\n+\n+#include <string>\n+#include <vector>\n+\n+#include "DiscIO/Volume.h"\n+\n+// To be used as follows:\n+//\n+// VolumeVerifier verifier(volume);\n+// verifier.Start();\n+// while (verifier.GetProgress() != verifier.GetMaxProgress())\n+//   verifier.Process();\n+// verifier.Finish();\n+// auto result = verifier.GetResult();\n+//\n+// Start, Process and Finish may take some time to run.\n+//\n+// GetResult() can be called before the processing is finished, but the result will be incomplete.\n+\n+namespace IOS::ES\n+{\n+class SignedBlobReader;\n+}\n+\n+namespace DiscIO\n+{\n+class FileInfo;\n+\n+class VolumeVerifier final\n+{\n+public:\n+  enum class Severity\n+  {\n+    None,  // Only used internally', 'updated_at': '2019-03-23T17:02:21Z', 'original_position': 39, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401636', 'created_at': '2019-03-23T17:02:21Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401636'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401636'}}, 'id': 268401636}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T17:01:14.735557	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218046866', 'comments': [{'pull_request_review_id': 218046866, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 503, 'body': "I got the list from https://hackmii.com/2008/09/korean-wii/. Maybe I should add that link to a comment? (The other IOSes below 40 did get added to Korean Wiis later on by system updates, but since they were old at that point, I don't think any games used them.)\r\n\r\nSince the checks are small enough to basically fit on one line, I think it would just be more cumbersome to put them in an array (or a set, rather).", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401597', 'in_reply_to_id': 268400763, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTU5Nw==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";\n+        for (const FileInfo& f : *file_info)\n+        {\n+          if (StringBeginsWith(f.GetName(), correct_ios))\n+          {\n+            has_correct_ios = true;\n+            break;\n+          }\n+        }\n+      }\n+    }\n+\n+    if (!has_correct_ios)\n+    {\n+      // This is reached for hacked dumps where the update partition has been replaced with\n+      // a very old update partition so that no updates will be installed.\n+      AddProblem(Severity::Low,\n+                 GetStringT("The update partition does not contain the IOS used by this title."));\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void VolumeVerifier::CheckCorrectlySigned(const Partition& partition, const std::string& error_text)\n+{\n+  IOS::HLE::Kernel ios;\n+  const auto es = ios.GetES();\n+  const std::vector<u8> cert_chain = m_volume.GetCertificateChain(partition);\n+\n+  if (IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTicket(partition), cert_chain) ||\n+      IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTMD(partition), cert_chain))\n+  {\n+    AddProblem(Severity::Low, error_text);\n+  }\n+}\n+\n+bool VolumeVerifier::IsDebugSigned() const\n+{\n+  const IOS::ES::TicketReader& ticket = m_volume.GetTicket(m_volume.GetGamePartition());\n+  return ticket.IsValid() ? ticket.GetConsoleType() == IOS::HLE::IOSC::ConsoleType::RVT : false;\n+}\n+\n+bool VolumeVerifier::ShouldHaveChannelPartition() const\n+{\n+  const std::unordered_set<std::string> channel_discs{\n+      "RFNE01", "RFNJ01", "RFNK01", "RFNP01", "RFNW01", "RFPE01", "RFPJ01", "RFPK01", "RFPP01",\n+      "RFPW01", "RGWE41", "RGWJ41", "RGWP41", "RGWX41", "RMCE01", "RMCJ01", "RMCK01", "RMCP01",\n+  };\n+\n+  return channel_discs.find(m_volume.GetGameID()) != channel_discs.end();\n+}\n+\n+bool VolumeVerifier::ShouldHaveMasterpiecePartitions() const\n+{\n+  const std::unordered_set<std::string> ssbb{"RSBE01", "RSBJ01", "RSBK01", "RSBP01"};\n+  return ssbb.find(m_volume.GetGameID()) != ssbb.end();\n+}\n+\n+bool VolumeVerifier::ShouldBeDualLayer() const\n+{\n+  // The Japanese versions of Xenoblade and The Last Story are single-layer\n+  // (unlike the other versions) and must not be added to this list.\n+  const std::unordered_set<std::string> dual_layer_discs{\n+      "R3ME01", "R3MP01", "R3OE01", "R3OJ01", "R3OP01", "RSBE01", "RSBJ01", "RSBK01", "RSBP01",\n+      "RXMJ8P", "S59E01", "S59JC8", "S59P01", "S5QJC8", "SK8X52", "SAKENS", "SAKPNS", "SK8V52",\n+      "SK8X52", "SLSEXJ", "SLSP01", "SQIE4Q", "SQIP4Q", "SQIY4Q", "SR5E41", "SR5P41", "SUOE41",\n+      "SUOP41", "SVXX52", "SVXY52", "SX4E01", "SX4P01", "SZ3EGT", "SZ3PGT",\n+  };\n+\n+  return dual_layer_discs.find(m_volume.GetGameID()) != dual_layer_discs.end();\n+}\n+\n+void VolumeVerifier::CheckDiscSize()\n+{\n+  if (!IsDisc(m_volume.GetVolumeType()))\n+    return;\n+\n+  const u64 biggest_offset = GetBiggestUsedOffset();\n+  if (biggest_offset > m_volume.GetSize())\n+  {\n+    const bool second_layer_missing =\n+        biggest_offset > SL_DVD_SIZE && m_volume.GetSize() >= SL_DVD_SIZE;\n+    const std::string text =\n+        second_layer_missing ?\n+            GetStringT(\n+                "This disc image is too small and lacks some data. The problem is most likely that "\n+                "this is a dual-layer disc that has been dumped as a single-layer disc.") :\n+            GetStringT(\n+                "This disc image is too small and lacks some data. If your dumping program saved "\n+                "the disc image as several parts, you need to merge them into one file.");\n+    AddProblem(Severity::High, text);\n+    return;\n+  }\n+\n+  if (ShouldBeDualLayer() && biggest_offset <= SL_DVD_R_SIZE)\n+  {\n+    AddProblem(\n+        Severity::Medium,\n+        GetStringT("This game has been hacked to fit on a single-layer DVD. Some content such as "\n+                   "pre-rendered videos, extra languages or entire game modes will be broken. "\n+                   "This problem generally only exists in illegal copies of games."));\n+  }\n+\n+  if (!m_volume.IsSizeAccurate())\n+  {\n+    AddProblem(Severity::Low, GetStringT("The format that the disc image is saved in does not "\n+                                         "store the size of the disc image."));\n+  }\n+  else if (!m_is_tgc)\n+  {\n+    const Platform platform = m_volume.GetVolumeType();\n+    const u64 size = m_volume.GetSize();\n+\n+    const bool valid_gamecube = size == MINI_DVD_SIZE;\n+    const bool valid_retail_wii = size == SL_DVD_SIZE || size == DL_DVD_SIZE;\n+    const bool valid_debug_wii = size == SL_DVD_R_SIZE || size == DL_DVD_R_SIZE;\n+\n+    const bool debug = IsDebugSigned();\n+    if ((platform == Platform::GameCubeDisc && !valid_gamecube) ||\n+        (platform == Platform::WiiDisc && (debug ? !valid_debug_wii : !valid_retail_wii)))\n+    {\n+      if (debug && valid_retail_wii)\n+      {\n+        AddProblem(Severity::Low,\n+                   GetStringT("This debug disc image has the size of a retail disc image."));\n+      }\n+      else\n+      {\n+        const bool small =\n+            (m_volume.GetVolumeType() == Platform::GameCubeDisc && size < MINI_DVD_SIZE) ||\n+            (m_volume.GetVolumeType() == Platform::WiiDisc && size < SL_DVD_SIZE);\n+\n+        if (small)\n+        {\n+          AddProblem(Severity::Low,\n+                     GetStringT("This disc image has an unusual size. This will likely make the "\n+                                "emulated loading times longer. When using netplay or sending "\n+                                "input recordings to other people, you will likely experience "\n+                                "desyncs if anyone is using a good dump."));\n+        }\n+        else\n+        {\n+          AddProblem(Severity::Low, GetStringT("This disc image has an unusual size."));\n+        }\n+      }\n+    }\n+  }\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset()\n+{\n+  std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+    partitions.emplace_back(m_volume.GetGamePartition());\n+\n+  u64 biggest_offset = 0;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (partition != PARTITION_NONE)\n+      biggest_offset = std::max(biggest_offset, partition.offset);\n+\n+    const std::optional<u64> fst_offset = GetFSTOffset(m_volume, partition);\n+    const std::optional<u64> fst_size = GetFSTSize(m_volume, partition);\n+    if (!fst_offset || !fst_size)\n+      break;\n+\n+    biggest_offset = std::max(\n+        biggest_offset, m_volume.PartitionOffsetToRawOffset(*fst_offset + *fst_size, partition));\n+\n+    const FileSystem* fs = m_volume.GetFileSystem(partition);\n+    if (!fs)\n+      break;\n+\n+    biggest_offset = std::max(biggest_offset, m_volume.PartitionOffsetToRawOffset(\n+                                                  GetBiggestUsedOffset(fs->GetRoot()), partition));\n+  }\n+  return biggest_offset;\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset(const FileInfo& file_info) const\n+{\n+  if (file_info.IsDirectory())\n+  {\n+    u64 biggest_offset = 0;\n+    for (const FileInfo& f : file_info)\n+      biggest_offset = std::max(biggest_offset, GetBiggestUsedOffset(f));\n+    return biggest_offset;\n+  }\n+  else\n+  {\n+    return file_info.GetOffset() + file_info.GetSize();\n+  }\n+}\n+\n+void VolumeVerifier::CheckMisc()\n+{\n+  const Region region = m_volume.GetRegion();\n+  const Platform platform = m_volume.GetVolumeType();\n+  const std::string game_id_unencrypted = m_volume.GetGameID(PARTITION_NONE);\n+  const std::string game_id_encrypted = m_volume.GetGameID(m_volume.GetGamePartition());\n+\n+  if (game_id_unencrypted != game_id_encrypted)\n+  {\n+    bool inconsistent_game_id = true;\n+    if (game_id_encrypted == "RELSAB")\n+    {\n+      if (StringBeginsWith(game_id_unencrypted, "410"))\n+      {\n+        // This is the Wii Backup Disc (aka "pinkfish" disc),\n+        // which legitimately has an inconsistent game ID.\n+        inconsistent_game_id = false;\n+      }\n+      else if (StringBeginsWith(game_id_unencrypted, "010"))\n+      {\n+        // Hacked version of the Wii Backup Disc (aka "pinkfish" disc).\n+        std::string proper_game_id = game_id_unencrypted;\n+        proper_game_id[0] = \'4\';\n+        AddProblem(Severity::Low,\n+                   StringFromFormat(GetStringT("The game ID is %s but should be %s.").c_str(),\n+                                    game_id_unencrypted.c_str(), proper_game_id.c_str()));\n+        inconsistent_game_id = false;\n+      }\n+    }\n+\n+    if (inconsistent_game_id)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The game ID is inconsistent."));\n+    }\n+  }\n+\n+  if (game_id_encrypted.size() < 4)\n+  {\n+    AddProblem(Severity::Low, GetStringT("The game ID is unusually short."));\n+  }\n+  else\n+  {\n+    const char country_code = game_id_encrypted[3];\n+    if (CountryCodeToRegion(country_code, platform, region) != region)\n+    {\n+      AddProblem(\n+          Severity::Medium,\n+          GetStringT("The region code does not match the game ID. If this is because the "\n+                     "region code has been modified, the game might run at the wrong speed, "\n+                     "graphical elements might be offset, or the game might not run at all."));\n+    }\n+  }\n+\n+  const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+  if (tmd.IsValid())\n+  {\n+    const u64 ios_id = tmd.GetIOSId() & 0xFF;\n+\n+    if (region == Region::NTSC_K && ios_id < 40 && ios_id != 4 && ios_id != 9 && ios_id != 21 &&\n+        ios_id != 37)', 'updated_at': '2019-03-23T17:01:13Z', 'original_position': 503, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401597', 'created_at': '2019-03-23T17:01:13Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401597'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401597'}}, 'id': 268401597}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T16:59:38.303407	{'source': 'ghhookparser', 'action': 'edited', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218046799', 'comments': [{'pull_request_review_id': 218046799, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 171, 'body': 'Duh, my bad. Only skimmed it, and start/end being similar fooled me.', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401515', 'in_reply_to_id': 268400459, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTUxNQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces', 'updated_at': '2019-03-23T16:59:36Z', 'original_position': 171, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401515', 'created_at': '2019-03-23T16:59:26Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401515'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401515'}}, 'id': 268401515}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T16:59:37.729349	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218046799', 'comments': [{'pull_request_review_id': 218046799, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 171, 'body': 'Duh, my bad. Only skimmed it, and start/end being similar fooled me.', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401515', 'in_reply_to_id': 268400459, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTUxNQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces', 'updated_at': '2019-03-23T16:59:36Z', 'original_position': 171, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401515', 'created_at': '2019-03-23T16:59:26Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401515'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401515'}}, 'id': 268401515}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T16:56:12.951902	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218046683', 'comments': [{'pull_request_review_id': 218046683, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 414, 'body': "Oops, you're right.", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401399', 'in_reply_to_id': 268400649, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTM5OQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";\n+        for (const FileInfo& f : *file_info)\n+        {\n+          if (StringBeginsWith(f.GetName(), correct_ios))\n+          {\n+            has_correct_ios = true;\n+            break;\n+          }\n+        }\n+      }\n+    }\n+\n+    if (!has_correct_ios)\n+    {\n+      // This is reached for hacked dumps where the update partition has been replaced with\n+      // a very old update partition so that no updates will be installed.\n+      AddProblem(Severity::Low,\n+                 GetStringT("The update partition does not contain the IOS used by this title."));\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void VolumeVerifier::CheckCorrectlySigned(const Partition& partition, const std::string& error_text)\n+{\n+  IOS::HLE::Kernel ios;\n+  const auto es = ios.GetES();\n+  const std::vector<u8> cert_chain = m_volume.GetCertificateChain(partition);\n+\n+  if (IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTicket(partition), cert_chain) ||\n+      IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTMD(partition), cert_chain))\n+  {\n+    AddProblem(Severity::Low, error_text);\n+  }\n+}\n+\n+bool VolumeVerifier::IsDebugSigned() const\n+{\n+  const IOS::ES::TicketReader& ticket = m_volume.GetTicket(m_volume.GetGamePartition());\n+  return ticket.IsValid() ? ticket.GetConsoleType() == IOS::HLE::IOSC::ConsoleType::RVT : false;\n+}\n+\n+bool VolumeVerifier::ShouldHaveChannelPartition() const\n+{\n+  const std::unordered_set<std::string> channel_discs{\n+      "RFNE01", "RFNJ01", "RFNK01", "RFNP01", "RFNW01", "RFPE01", "RFPJ01", "RFPK01", "RFPP01",\n+      "RFPW01", "RGWE41", "RGWJ41", "RGWP41", "RGWX41", "RMCE01", "RMCJ01", "RMCK01", "RMCP01",\n+  };\n+\n+  return channel_discs.find(m_volume.GetGameID()) != channel_discs.end();\n+}\n+\n+bool VolumeVerifier::ShouldHaveMasterpiecePartitions() const\n+{\n+  const std::unordered_set<std::string> ssbb{"RSBE01", "RSBJ01", "RSBK01", "RSBP01"};\n+  return ssbb.find(m_volume.GetGameID()) != ssbb.end();\n+}\n+\n+bool VolumeVerifier::ShouldBeDualLayer() const\n+{\n+  // The Japanese versions of Xenoblade and The Last Story are single-layer\n+  // (unlike the other versions) and must not be added to this list.\n+  const std::unordered_set<std::string> dual_layer_discs{\n+      "R3ME01", "R3MP01", "R3OE01", "R3OJ01", "R3OP01", "RSBE01", "RSBJ01", "RSBK01", "RSBP01",\n+      "RXMJ8P", "S59E01", "S59JC8", "S59P01", "S5QJC8", "SK8X52", "SAKENS", "SAKPNS", "SK8V52",\n+      "SK8X52", "SLSEXJ", "SLSP01", "SQIE4Q", "SQIP4Q", "SQIY4Q", "SR5E41", "SR5P41", "SUOE41",\n+      "SUOP41", "SVXX52", "SVXY52", "SX4E01", "SX4P01", "SZ3EGT", "SZ3PGT",\n+  };\n+\n+  return dual_layer_discs.find(m_volume.GetGameID()) != dual_layer_discs.end();\n+}\n+\n+void VolumeVerifier::CheckDiscSize()\n+{\n+  if (!IsDisc(m_volume.GetVolumeType()))\n+    return;\n+\n+  const u64 biggest_offset = GetBiggestUsedOffset();\n+  if (biggest_offset > m_volume.GetSize())\n+  {\n+    const bool second_layer_missing =\n+        biggest_offset > SL_DVD_SIZE && m_volume.GetSize() >= SL_DVD_SIZE;\n+    const std::string text =\n+        second_layer_missing ?\n+            GetStringT(\n+                "This disc image is too small and lacks some data. The problem is most likely that "\n+                "this is a dual-layer disc that has been dumped as a single-layer disc.") :\n+            GetStringT(\n+                "This disc image is too small and lacks some data. If your dumping program saved "\n+                "the disc image as several parts, you need to merge them into one file.");\n+    AddProblem(Severity::High, text);\n+    return;\n+  }\n+\n+  if (ShouldBeDualLayer() && biggest_offset <= SL_DVD_R_SIZE)\n+  {\n+    AddProblem(\n+        Severity::Medium,\n+        GetStringT("This game has been hacked to fit on a single-layer DVD. Some content such as "\n+                   "pre-rendered videos, extra languages or entire game modes will be broken. "\n+                   "This problem generally only exists in illegal copies of games."));\n+  }\n+\n+  if (!m_volume.IsSizeAccurate())\n+  {\n+    AddProblem(Severity::Low, GetStringT("The format that the disc image is saved in does not "\n+                                         "store the size of the disc image."));\n+  }\n+  else if (!m_is_tgc)\n+  {\n+    const Platform platform = m_volume.GetVolumeType();\n+    const u64 size = m_volume.GetSize();\n+\n+    const bool valid_gamecube = size == MINI_DVD_SIZE;\n+    const bool valid_retail_wii = size == SL_DVD_SIZE || size == DL_DVD_SIZE;\n+    const bool valid_debug_wii = size == SL_DVD_R_SIZE || size == DL_DVD_R_SIZE;\n+\n+    const bool debug = IsDebugSigned();\n+    if ((platform == Platform::GameCubeDisc && !valid_gamecube) ||\n+        (platform == Platform::WiiDisc && (debug ? !valid_debug_wii : !valid_retail_wii)))\n+    {\n+      if (debug && valid_retail_wii)\n+      {\n+        AddProblem(Severity::Low,\n+                   GetStringT("This debug disc image has the size of a retail disc image."));\n+      }\n+      else\n+      {\n+        const bool small =\n+            (m_volume.GetVolumeType() == Platform::GameCubeDisc && size < MINI_DVD_SIZE) ||\n+            (m_volume.GetVolumeType() == Platform::WiiDisc && size < SL_DVD_SIZE);\n+\n+        if (small)\n+        {\n+          AddProblem(Severity::Low,\n+                     GetStringT("This disc image has an unusual size. This will likely make the "\n+                                "emulated loading times longer. When using netplay or sending "\n+                                "input recordings to other people, you will likely experience "\n+                                "desyncs if anyone is using a good dump."));\n+        }\n+        else\n+        {\n+          AddProblem(Severity::Low, GetStringT("This disc image has an unusual size."));\n+        }\n+      }\n+    }\n+  }\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset()\n+{\n+  std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+    partitions.emplace_back(m_volume.GetGamePartition());\n+\n+  u64 biggest_offset = 0;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (partition != PARTITION_NONE)\n+      biggest_offset = std::max(biggest_offset, partition.offset);\n+\n+    const std::optional<u64> fst_offset = GetFSTOffset(m_volume, partition);\n+    const std::optional<u64> fst_size = GetFSTSize(m_volume, partition);\n+    if (!fst_offset || !fst_size)\n+      break;', 'updated_at': '2019-03-23T16:56:11Z', 'original_position': 414, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401399', 'created_at': '2019-03-23T16:56:11Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401399'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401399'}}, 'id': 268401399}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T16:55:34.973359	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218046660', 'comments': [{'pull_request_review_id': 218046660, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 171, 'body': 'This comment already points that out.', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401386', 'in_reply_to_id': 268400459, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTM4Ng==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces', 'updated_at': '2019-03-23T16:55:33Z', 'original_position': 171, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401386', 'created_at': '2019-03-23T16:55:33Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401386'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401386'}}, 'id': 268401386}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T16:55:09.673970	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218046640', 'comments': [{'pull_request_review_id': 218046640, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 124, 'body': "There is actually a comparison operator like that, I just didn't know about it. I'll change it.", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401372', 'in_reply_to_id': 268400410, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTM3Mg==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&', 'updated_at': '2019-03-23T16:55:08Z', 'original_position': 124, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401372', 'created_at': '2019-03-23T16:55:08Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401372'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401372'}}, 'id': 268401372}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T16:51:37.798458	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218045578', 'comments': [{'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 124, 'body': "Does `std::optional` not have a comparison operator against the contained type? Seems weird you'd have to type it out like that (C# Nullables just compare `false` if they don't hold any value)", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400410', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDQxMA==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 124, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400410', 'created_at': '2019-03-23T16:25:25Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400410'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400410'}}, 'id': 268400410}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 171, 'body': 'Hm, this string is singular, but the description is plural. Should we explicitly point out that the string uses the singular form "Masterpiece" instead of the plural "Masterpieces"?', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400459', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDQ1OQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 171, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400459', 'created_at': '2019-03-23T16:27:07Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400459'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400459'}}, 'id': 268400459}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 198, 'body': 'Is this magic number important enough for a named constant?', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400481', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDQ4MQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 198, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400481', 'created_at': '2019-03-23T16:27:51Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400481'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400481'}}, 'id': 268400481}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 414, 'body': 'Should this really be a `break` and not just a `continue`? Same for the one below.', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400649', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDY0OQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";\n+        for (const FileInfo& f : *file_info)\n+        {\n+          if (StringBeginsWith(f.GetName(), correct_ios))\n+          {\n+            has_correct_ios = true;\n+            break;\n+          }\n+        }\n+      }\n+    }\n+\n+    if (!has_correct_ios)\n+    {\n+      // This is reached for hacked dumps where the update partition has been replaced with\n+      // a very old update partition so that no updates will be installed.\n+      AddProblem(Severity::Low,\n+                 GetStringT("The update partition does not contain the IOS used by this title."));\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void VolumeVerifier::CheckCorrectlySigned(const Partition& partition, const std::string& error_text)\n+{\n+  IOS::HLE::Kernel ios;\n+  const auto es = ios.GetES();\n+  const std::vector<u8> cert_chain = m_volume.GetCertificateChain(partition);\n+\n+  if (IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTicket(partition), cert_chain) ||\n+      IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTMD(partition), cert_chain))\n+  {\n+    AddProblem(Severity::Low, error_text);\n+  }\n+}\n+\n+bool VolumeVerifier::IsDebugSigned() const\n+{\n+  const IOS::ES::TicketReader& ticket = m_volume.GetTicket(m_volume.GetGamePartition());\n+  return ticket.IsValid() ? ticket.GetConsoleType() == IOS::HLE::IOSC::ConsoleType::RVT : false;\n+}\n+\n+bool VolumeVerifier::ShouldHaveChannelPartition() const\n+{\n+  const std::unordered_set<std::string> channel_discs{\n+      "RFNE01", "RFNJ01", "RFNK01", "RFNP01", "RFNW01", "RFPE01", "RFPJ01", "RFPK01", "RFPP01",\n+      "RFPW01", "RGWE41", "RGWJ41", "RGWP41", "RGWX41", "RMCE01", "RMCJ01", "RMCK01", "RMCP01",\n+  };\n+\n+  return channel_discs.find(m_volume.GetGameID()) != channel_discs.end();\n+}\n+\n+bool VolumeVerifier::ShouldHaveMasterpiecePartitions() const\n+{\n+  const std::unordered_set<std::string> ssbb{"RSBE01", "RSBJ01", "RSBK01", "RSBP01"};\n+  return ssbb.find(m_volume.GetGameID()) != ssbb.end();\n+}\n+\n+bool VolumeVerifier::ShouldBeDualLayer() const\n+{\n+  // The Japanese versions of Xenoblade and The Last Story are single-layer\n+  // (unlike the other versions) and must not be added to this list.\n+  const std::unordered_set<std::string> dual_layer_discs{\n+      "R3ME01", "R3MP01", "R3OE01", "R3OJ01", "R3OP01", "RSBE01", "RSBJ01", "RSBK01", "RSBP01",\n+      "RXMJ8P", "S59E01", "S59JC8", "S59P01", "S5QJC8", "SK8X52", "SAKENS", "SAKPNS", "SK8V52",\n+      "SK8X52", "SLSEXJ", "SLSP01", "SQIE4Q", "SQIP4Q", "SQIY4Q", "SR5E41", "SR5P41", "SUOE41",\n+      "SUOP41", "SVXX52", "SVXY52", "SX4E01", "SX4P01", "SZ3EGT", "SZ3PGT",\n+  };\n+\n+  return dual_layer_discs.find(m_volume.GetGameID()) != dual_layer_discs.end();\n+}\n+\n+void VolumeVerifier::CheckDiscSize()\n+{\n+  if (!IsDisc(m_volume.GetVolumeType()))\n+    return;\n+\n+  const u64 biggest_offset = GetBiggestUsedOffset();\n+  if (biggest_offset > m_volume.GetSize())\n+  {\n+    const bool second_layer_missing =\n+        biggest_offset > SL_DVD_SIZE && m_volume.GetSize() >= SL_DVD_SIZE;\n+    const std::string text =\n+        second_layer_missing ?\n+            GetStringT(\n+                "This disc image is too small and lacks some data. The problem is most likely that "\n+                "this is a dual-layer disc that has been dumped as a single-layer disc.") :\n+            GetStringT(\n+                "This disc image is too small and lacks some data. If your dumping program saved "\n+                "the disc image as several parts, you need to merge them into one file.");\n+    AddProblem(Severity::High, text);\n+    return;\n+  }\n+\n+  if (ShouldBeDualLayer() && biggest_offset <= SL_DVD_R_SIZE)\n+  {\n+    AddProblem(\n+        Severity::Medium,\n+        GetStringT("This game has been hacked to fit on a single-layer DVD. Some content such as "\n+                   "pre-rendered videos, extra languages or entire game modes will be broken. "\n+                   "This problem generally only exists in illegal copies of games."));\n+  }\n+\n+  if (!m_volume.IsSizeAccurate())\n+  {\n+    AddProblem(Severity::Low, GetStringT("The format that the disc image is saved in does not "\n+                                         "store the size of the disc image."));\n+  }\n+  else if (!m_is_tgc)\n+  {\n+    const Platform platform = m_volume.GetVolumeType();\n+    const u64 size = m_volume.GetSize();\n+\n+    const bool valid_gamecube = size == MINI_DVD_SIZE;\n+    const bool valid_retail_wii = size == SL_DVD_SIZE || size == DL_DVD_SIZE;\n+    const bool valid_debug_wii = size == SL_DVD_R_SIZE || size == DL_DVD_R_SIZE;\n+\n+    const bool debug = IsDebugSigned();\n+    if ((platform == Platform::GameCubeDisc && !valid_gamecube) ||\n+        (platform == Platform::WiiDisc && (debug ? !valid_debug_wii : !valid_retail_wii)))\n+    {\n+      if (debug && valid_retail_wii)\n+      {\n+        AddProblem(Severity::Low,\n+                   GetStringT("This debug disc image has the size of a retail disc image."));\n+      }\n+      else\n+      {\n+        const bool small =\n+            (m_volume.GetVolumeType() == Platform::GameCubeDisc && size < MINI_DVD_SIZE) ||\n+            (m_volume.GetVolumeType() == Platform::WiiDisc && size < SL_DVD_SIZE);\n+\n+        if (small)\n+        {\n+          AddProblem(Severity::Low,\n+                     GetStringT("This disc image has an unusual size. This will likely make the "\n+                                "emulated loading times longer. When using netplay or sending "\n+                                "input recordings to other people, you will likely experience "\n+                                "desyncs if anyone is using a good dump."));\n+        }\n+        else\n+        {\n+          AddProblem(Severity::Low, GetStringT("This disc image has an unusual size."));\n+        }\n+      }\n+    }\n+  }\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset()\n+{\n+  std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+    partitions.emplace_back(m_volume.GetGamePartition());\n+\n+  u64 biggest_offset = 0;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (partition != PARTITION_NONE)\n+      biggest_offset = std::max(biggest_offset, partition.offset);\n+\n+    const std::optional<u64> fst_offset = GetFSTOffset(m_volume, partition);\n+    const std::optional<u64> fst_size = GetFSTSize(m_volume, partition);\n+    if (!fst_offset || !fst_size)\n+      break;', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 414, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400649', 'created_at': '2019-03-23T16:33:06Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400649'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400649'}}, 'id': 268400649}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 503, 'body': "This IOS list looks a bit odd, I don't see a correlation between 37 and the others. I mean, IOS37 fixed the hash comparison, but why the others? Non-Korean? WiiBrew isn't particularly helping there; at least not the [IOS History](https://wiibrew.org/wiki/IOS_History)\r\nAlso, thoughts on putting those into an array and doing a contains check instead?", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400763', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDc2Mw==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";\n+        for (const FileInfo& f : *file_info)\n+        {\n+          if (StringBeginsWith(f.GetName(), correct_ios))\n+          {\n+            has_correct_ios = true;\n+            break;\n+          }\n+        }\n+      }\n+    }\n+\n+    if (!has_correct_ios)\n+    {\n+      // This is reached for hacked dumps where the update partition has been replaced with\n+      // a very old update partition so that no updates will be installed.\n+      AddProblem(Severity::Low,\n+                 GetStringT("The update partition does not contain the IOS used by this title."));\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void VolumeVerifier::CheckCorrectlySigned(const Partition& partition, const std::string& error_text)\n+{\n+  IOS::HLE::Kernel ios;\n+  const auto es = ios.GetES();\n+  const std::vector<u8> cert_chain = m_volume.GetCertificateChain(partition);\n+\n+  if (IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTicket(partition), cert_chain) ||\n+      IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTMD(partition), cert_chain))\n+  {\n+    AddProblem(Severity::Low, error_text);\n+  }\n+}\n+\n+bool VolumeVerifier::IsDebugSigned() const\n+{\n+  const IOS::ES::TicketReader& ticket = m_volume.GetTicket(m_volume.GetGamePartition());\n+  return ticket.IsValid() ? ticket.GetConsoleType() == IOS::HLE::IOSC::ConsoleType::RVT : false;\n+}\n+\n+bool VolumeVerifier::ShouldHaveChannelPartition() const\n+{\n+  const std::unordered_set<std::string> channel_discs{\n+      "RFNE01", "RFNJ01", "RFNK01", "RFNP01", "RFNW01", "RFPE01", "RFPJ01", "RFPK01", "RFPP01",\n+      "RFPW01", "RGWE41", "RGWJ41", "RGWP41", "RGWX41", "RMCE01", "RMCJ01", "RMCK01", "RMCP01",\n+  };\n+\n+  return channel_discs.find(m_volume.GetGameID()) != channel_discs.end();\n+}\n+\n+bool VolumeVerifier::ShouldHaveMasterpiecePartitions() const\n+{\n+  const std::unordered_set<std::string> ssbb{"RSBE01", "RSBJ01", "RSBK01", "RSBP01"};\n+  return ssbb.find(m_volume.GetGameID()) != ssbb.end();\n+}\n+\n+bool VolumeVerifier::ShouldBeDualLayer() const\n+{\n+  // The Japanese versions of Xenoblade and The Last Story are single-layer\n+  // (unlike the other versions) and must not be added to this list.\n+  const std::unordered_set<std::string> dual_layer_discs{\n+      "R3ME01", "R3MP01", "R3OE01", "R3OJ01", "R3OP01", "RSBE01", "RSBJ01", "RSBK01", "RSBP01",\n+      "RXMJ8P", "S59E01", "S59JC8", "S59P01", "S5QJC8", "SK8X52", "SAKENS", "SAKPNS", "SK8V52",\n+      "SK8X52", "SLSEXJ", "SLSP01", "SQIE4Q", "SQIP4Q", "SQIY4Q", "SR5E41", "SR5P41", "SUOE41",\n+      "SUOP41", "SVXX52", "SVXY52", "SX4E01", "SX4P01", "SZ3EGT", "SZ3PGT",\n+  };\n+\n+  return dual_layer_discs.find(m_volume.GetGameID()) != dual_layer_discs.end();\n+}\n+\n+void VolumeVerifier::CheckDiscSize()\n+{\n+  if (!IsDisc(m_volume.GetVolumeType()))\n+    return;\n+\n+  const u64 biggest_offset = GetBiggestUsedOffset();\n+  if (biggest_offset > m_volume.GetSize())\n+  {\n+    const bool second_layer_missing =\n+        biggest_offset > SL_DVD_SIZE && m_volume.GetSize() >= SL_DVD_SIZE;\n+    const std::string text =\n+        second_layer_missing ?\n+            GetStringT(\n+                "This disc image is too small and lacks some data. The problem is most likely that "\n+                "this is a dual-layer disc that has been dumped as a single-layer disc.") :\n+            GetStringT(\n+                "This disc image is too small and lacks some data. If your dumping program saved "\n+                "the disc image as several parts, you need to merge them into one file.");\n+    AddProblem(Severity::High, text);\n+    return;\n+  }\n+\n+  if (ShouldBeDualLayer() && biggest_offset <= SL_DVD_R_SIZE)\n+  {\n+    AddProblem(\n+        Severity::Medium,\n+        GetStringT("This game has been hacked to fit on a single-layer DVD. Some content such as "\n+                   "pre-rendered videos, extra languages or entire game modes will be broken. "\n+                   "This problem generally only exists in illegal copies of games."));\n+  }\n+\n+  if (!m_volume.IsSizeAccurate())\n+  {\n+    AddProblem(Severity::Low, GetStringT("The format that the disc image is saved in does not "\n+                                         "store the size of the disc image."));\n+  }\n+  else if (!m_is_tgc)\n+  {\n+    const Platform platform = m_volume.GetVolumeType();\n+    const u64 size = m_volume.GetSize();\n+\n+    const bool valid_gamecube = size == MINI_DVD_SIZE;\n+    const bool valid_retail_wii = size == SL_DVD_SIZE || size == DL_DVD_SIZE;\n+    const bool valid_debug_wii = size == SL_DVD_R_SIZE || size == DL_DVD_R_SIZE;\n+\n+    const bool debug = IsDebugSigned();\n+    if ((platform == Platform::GameCubeDisc && !valid_gamecube) ||\n+        (platform == Platform::WiiDisc && (debug ? !valid_debug_wii : !valid_retail_wii)))\n+    {\n+      if (debug && valid_retail_wii)\n+      {\n+        AddProblem(Severity::Low,\n+                   GetStringT("This debug disc image has the size of a retail disc image."));\n+      }\n+      else\n+      {\n+        const bool small =\n+            (m_volume.GetVolumeType() == Platform::GameCubeDisc && size < MINI_DVD_SIZE) ||\n+            (m_volume.GetVolumeType() == Platform::WiiDisc && size < SL_DVD_SIZE);\n+\n+        if (small)\n+        {\n+          AddProblem(Severity::Low,\n+                     GetStringT("This disc image has an unusual size. This will likely make the "\n+                                "emulated loading times longer. When using netplay or sending "\n+                                "input recordings to other people, you will likely experience "\n+                                "desyncs if anyone is using a good dump."));\n+        }\n+        else\n+        {\n+          AddProblem(Severity::Low, GetStringT("This disc image has an unusual size."));\n+        }\n+      }\n+    }\n+  }\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset()\n+{\n+  std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+    partitions.emplace_back(m_volume.GetGamePartition());\n+\n+  u64 biggest_offset = 0;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (partition != PARTITION_NONE)\n+      biggest_offset = std::max(biggest_offset, partition.offset);\n+\n+    const std::optional<u64> fst_offset = GetFSTOffset(m_volume, partition);\n+    const std::optional<u64> fst_size = GetFSTSize(m_volume, partition);\n+    if (!fst_offset || !fst_size)\n+      break;\n+\n+    biggest_offset = std::max(\n+        biggest_offset, m_volume.PartitionOffsetToRawOffset(*fst_offset + *fst_size, partition));\n+\n+    const FileSystem* fs = m_volume.GetFileSystem(partition);\n+    if (!fs)\n+      break;\n+\n+    biggest_offset = std::max(biggest_offset, m_volume.PartitionOffsetToRawOffset(\n+                                                  GetBiggestUsedOffset(fs->GetRoot()), partition));\n+  }\n+  return biggest_offset;\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset(const FileInfo& file_info) const\n+{\n+  if (file_info.IsDirectory())\n+  {\n+    u64 biggest_offset = 0;\n+    for (const FileInfo& f : file_info)\n+      biggest_offset = std::max(biggest_offset, GetBiggestUsedOffset(f));\n+    return biggest_offset;\n+  }\n+  else\n+  {\n+    return file_info.GetOffset() + file_info.GetSize();\n+  }\n+}\n+\n+void VolumeVerifier::CheckMisc()\n+{\n+  const Region region = m_volume.GetRegion();\n+  const Platform platform = m_volume.GetVolumeType();\n+  const std::string game_id_unencrypted = m_volume.GetGameID(PARTITION_NONE);\n+  const std::string game_id_encrypted = m_volume.GetGameID(m_volume.GetGamePartition());\n+\n+  if (game_id_unencrypted != game_id_encrypted)\n+  {\n+    bool inconsistent_game_id = true;\n+    if (game_id_encrypted == "RELSAB")\n+    {\n+      if (StringBeginsWith(game_id_unencrypted, "410"))\n+      {\n+        // This is the Wii Backup Disc (aka "pinkfish" disc),\n+        // which legitimately has an inconsistent game ID.\n+        inconsistent_game_id = false;\n+      }\n+      else if (StringBeginsWith(game_id_unencrypted, "010"))\n+      {\n+        // Hacked version of the Wii Backup Disc (aka "pinkfish" disc).\n+        std::string proper_game_id = game_id_unencrypted;\n+        proper_game_id[0] = \'4\';\n+        AddProblem(Severity::Low,\n+                   StringFromFormat(GetStringT("The game ID is %s but should be %s.").c_str(),\n+                                    game_id_unencrypted.c_str(), proper_game_id.c_str()));\n+        inconsistent_game_id = false;\n+      }\n+    }\n+\n+    if (inconsistent_game_id)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The game ID is inconsistent."));\n+    }\n+  }\n+\n+  if (game_id_encrypted.size() < 4)\n+  {\n+    AddProblem(Severity::Low, GetStringT("The game ID is unusually short."));\n+  }\n+  else\n+  {\n+    const char country_code = game_id_encrypted[3];\n+    if (CountryCodeToRegion(country_code, platform, region) != region)\n+    {\n+      AddProblem(\n+          Severity::Medium,\n+          GetStringT("The region code does not match the game ID. If this is because the "\n+                     "region code has been modified, the game might run at the wrong speed, "\n+                     "graphical elements might be offset, or the game might not run at all."));\n+    }\n+  }\n+\n+  const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+  if (tmd.IsValid())\n+  {\n+    const u64 ios_id = tmd.GetIOSId() & 0xFF;\n+\n+    if (region == Region::NTSC_K && ios_id < 40 && ios_id != 4 && ios_id != 9 && ios_id != 21 &&\n+        ios_id != 37)', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 503, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400763', 'created_at': '2019-03-23T16:36:39Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400763'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400763'}}, 'id': 268400763}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 39, 'body': 'Thoughts on moving this comment _before_ the member? Visual Studio will show that comment in IntelliSense; not sure about other IDEs though.', 'path': 'Source/Core/DiscIO/VolumeVerifier.h', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400982', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDk4Mg==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,92 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#pragma once\n+\n+#include <string>\n+#include <vector>\n+\n+#include "DiscIO/Volume.h"\n+\n+// To be used as follows:\n+//\n+// VolumeVerifier verifier(volume);\n+// verifier.Start();\n+// while (verifier.GetProgress() != verifier.GetMaxProgress())\n+//   verifier.Process();\n+// verifier.Finish();\n+// auto result = verifier.GetResult();\n+//\n+// Start, Process and Finish may take some time to run.\n+//\n+// GetResult() can be called before the processing is finished, but the result will be incomplete.\n+\n+namespace IOS::ES\n+{\n+class SignedBlobReader;\n+}\n+\n+namespace DiscIO\n+{\n+class FileInfo;\n+\n+class VolumeVerifier final\n+{\n+public:\n+  enum class Severity\n+  {\n+    None,  // Only used internally', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 39, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400982', 'created_at': '2019-03-23T16:41:50Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400982'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400982'}}, 'id': 268400982}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 78, 'body': 'Do we want to use shading or text color to indicate severity as well, or should we just leave it as normal text?', 'path': 'Source/Core/DolphinQt/Config/VerifyWidget.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401077', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTA3Nw==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,103 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DolphinQt/Config/VerifyWidget.h"\n+\n+#include <memory>\n+\n+#include <QHeaderView>\n+#include <QLabel>\n+#include <QProgressDialog>\n+#include <QPushButton>\n+#include <QVBoxLayout>\n+\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeVerifier.h"\n+\n+VerifyWidget::VerifyWidget(std::shared_ptr<DiscIO::Volume> volume) : m_volume(std::move(volume))\n+{\n+  QVBoxLayout* layout = new QVBoxLayout(this);\n+\n+  m_problems = new QTableWidget(0, 2, this);\n+  m_problems->setHorizontalHeaderLabels({tr("Problem"), tr("Severity")});\n+  m_problems->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);\n+  m_problems->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);\n+  m_problems->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);\n+  m_problems->verticalHeader()->hide();\n+\n+  m_summary_text = new QTextEdit(this);\n+  m_summary_text->setReadOnly(true);\n+\n+  QPushButton* verify_button = new QPushButton(tr("Verify Integrity"));\n+  connect(verify_button, &QPushButton::clicked, this, &VerifyWidget::Verify);\n+\n+  layout->addWidget(m_problems);\n+  layout->addWidget(m_summary_text);\n+  layout->addWidget(verify_button);\n+\n+  layout->setStretchFactor(m_problems, 5);\n+  layout->setStretchFactor(m_summary_text, 2);\n+\n+  setLayout(layout);\n+}\n+\n+void VerifyWidget::Verify()\n+{\n+  DiscIO::VolumeVerifier verifier(*m_volume);\n+\n+  QProgressDialog* progress =\n+      new QProgressDialog(tr("Verifying"), tr("Cancel"), 0, verifier.GetMaxProgress(), this);\n+  progress->setWindowTitle(tr("Verifying"));\n+  progress->setWindowFlags(progress->windowFlags() & ~Qt::WindowContextHelpButtonHint);\n+  progress->setMinimumDuration(500);\n+  progress->setWindowModality(Qt::WindowModal);\n+\n+  verifier.Start();\n+  while (verifier.GetProgress() != verifier.GetMaxProgress())\n+  {\n+    progress->setValue(verifier.GetProgress());\n+    if (progress->wasCanceled())\n+      return;\n+\n+    verifier.Process();\n+  }\n+  verifier.Finish();\n+\n+  DiscIO::VolumeVerifier::Result result = verifier.GetResult();\n+  progress->setValue(verifier.GetProgress());\n+\n+  m_summary_text->setText(QString::fromStdString(result.summary_text));\n+\n+  m_problems->setRowCount(static_cast<int>(result.problems.size()));\n+  for (int i = 0; i < m_problems->rowCount(); ++i)\n+  {\n+    const DiscIO::VolumeVerifier::Problem problem = result.problems[i];\n+\n+    QString severity;\n+    switch (problem.severity)', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 78, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401077', 'created_at': '2019-03-23T16:45:10Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401077'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401077'}}, 'id': 268401077}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 243, 'body': 'Note to self: Dash at the end to avoid partial matches. File names are "IOS\u200c\u2009_nn_-_xx_-v\u2009_vv_.wad"', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401259', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTI1OQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 243, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401259', 'created_at': '2019-03-23T16:51:19Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401259'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401259'}}, 'id': 268401259}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T16:51:37.139571	{'source': 'ghhookparser', 'action': 'edited', 'pr_title': '[WIP] Add a Verify tab to game properties', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218045578', 'comments': [{'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 124, 'body': "Does `std::optional` not have a comparison operator against the contained type? Seems weird you'd have to type it out like that (C# Nullables just compare `false` if they don't hold any value)", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400410', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDQxMA==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 124, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400410', 'created_at': '2019-03-23T16:25:25Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400410'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400410'}}, 'id': 268400410}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 171, 'body': 'Hm, this string is singular, but the description is plural. Should we explicitly point out that the string uses the singular form "Masterpiece" instead of the plural "Masterpieces"?', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400459', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDQ1OQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 171, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400459', 'created_at': '2019-03-23T16:27:07Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400459'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400459'}}, 'id': 268400459}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 198, 'body': 'Is this magic number important enough for a named constant?', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400481', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDQ4MQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 198, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400481', 'created_at': '2019-03-23T16:27:51Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400481'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400481'}}, 'id': 268400481}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 414, 'body': 'Should this really be a `break` and not just a `continue`? Same for the one below.', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400649', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDY0OQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";\n+        for (const FileInfo& f : *file_info)\n+        {\n+          if (StringBeginsWith(f.GetName(), correct_ios))\n+          {\n+            has_correct_ios = true;\n+            break;\n+          }\n+        }\n+      }\n+    }\n+\n+    if (!has_correct_ios)\n+    {\n+      // This is reached for hacked dumps where the update partition has been replaced with\n+      // a very old update partition so that no updates will be installed.\n+      AddProblem(Severity::Low,\n+                 GetStringT("The update partition does not contain the IOS used by this title."));\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void VolumeVerifier::CheckCorrectlySigned(const Partition& partition, const std::string& error_text)\n+{\n+  IOS::HLE::Kernel ios;\n+  const auto es = ios.GetES();\n+  const std::vector<u8> cert_chain = m_volume.GetCertificateChain(partition);\n+\n+  if (IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTicket(partition), cert_chain) ||\n+      IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTMD(partition), cert_chain))\n+  {\n+    AddProblem(Severity::Low, error_text);\n+  }\n+}\n+\n+bool VolumeVerifier::IsDebugSigned() const\n+{\n+  const IOS::ES::TicketReader& ticket = m_volume.GetTicket(m_volume.GetGamePartition());\n+  return ticket.IsValid() ? ticket.GetConsoleType() == IOS::HLE::IOSC::ConsoleType::RVT : false;\n+}\n+\n+bool VolumeVerifier::ShouldHaveChannelPartition() const\n+{\n+  const std::unordered_set<std::string> channel_discs{\n+      "RFNE01", "RFNJ01", "RFNK01", "RFNP01", "RFNW01", "RFPE01", "RFPJ01", "RFPK01", "RFPP01",\n+      "RFPW01", "RGWE41", "RGWJ41", "RGWP41", "RGWX41", "RMCE01", "RMCJ01", "RMCK01", "RMCP01",\n+  };\n+\n+  return channel_discs.find(m_volume.GetGameID()) != channel_discs.end();\n+}\n+\n+bool VolumeVerifier::ShouldHaveMasterpiecePartitions() const\n+{\n+  const std::unordered_set<std::string> ssbb{"RSBE01", "RSBJ01", "RSBK01", "RSBP01"};\n+  return ssbb.find(m_volume.GetGameID()) != ssbb.end();\n+}\n+\n+bool VolumeVerifier::ShouldBeDualLayer() const\n+{\n+  // The Japanese versions of Xenoblade and The Last Story are single-layer\n+  // (unlike the other versions) and must not be added to this list.\n+  const std::unordered_set<std::string> dual_layer_discs{\n+      "R3ME01", "R3MP01", "R3OE01", "R3OJ01", "R3OP01", "RSBE01", "RSBJ01", "RSBK01", "RSBP01",\n+      "RXMJ8P", "S59E01", "S59JC8", "S59P01", "S5QJC8", "SK8X52", "SAKENS", "SAKPNS", "SK8V52",\n+      "SK8X52", "SLSEXJ", "SLSP01", "SQIE4Q", "SQIP4Q", "SQIY4Q", "SR5E41", "SR5P41", "SUOE41",\n+      "SUOP41", "SVXX52", "SVXY52", "SX4E01", "SX4P01", "SZ3EGT", "SZ3PGT",\n+  };\n+\n+  return dual_layer_discs.find(m_volume.GetGameID()) != dual_layer_discs.end();\n+}\n+\n+void VolumeVerifier::CheckDiscSize()\n+{\n+  if (!IsDisc(m_volume.GetVolumeType()))\n+    return;\n+\n+  const u64 biggest_offset = GetBiggestUsedOffset();\n+  if (biggest_offset > m_volume.GetSize())\n+  {\n+    const bool second_layer_missing =\n+        biggest_offset > SL_DVD_SIZE && m_volume.GetSize() >= SL_DVD_SIZE;\n+    const std::string text =\n+        second_layer_missing ?\n+            GetStringT(\n+                "This disc image is too small and lacks some data. The problem is most likely that "\n+                "this is a dual-layer disc that has been dumped as a single-layer disc.") :\n+            GetStringT(\n+                "This disc image is too small and lacks some data. If your dumping program saved "\n+                "the disc image as several parts, you need to merge them into one file.");\n+    AddProblem(Severity::High, text);\n+    return;\n+  }\n+\n+  if (ShouldBeDualLayer() && biggest_offset <= SL_DVD_R_SIZE)\n+  {\n+    AddProblem(\n+        Severity::Medium,\n+        GetStringT("This game has been hacked to fit on a single-layer DVD. Some content such as "\n+                   "pre-rendered videos, extra languages or entire game modes will be broken. "\n+                   "This problem generally only exists in illegal copies of games."));\n+  }\n+\n+  if (!m_volume.IsSizeAccurate())\n+  {\n+    AddProblem(Severity::Low, GetStringT("The format that the disc image is saved in does not "\n+                                         "store the size of the disc image."));\n+  }\n+  else if (!m_is_tgc)\n+  {\n+    const Platform platform = m_volume.GetVolumeType();\n+    const u64 size = m_volume.GetSize();\n+\n+    const bool valid_gamecube = size == MINI_DVD_SIZE;\n+    const bool valid_retail_wii = size == SL_DVD_SIZE || size == DL_DVD_SIZE;\n+    const bool valid_debug_wii = size == SL_DVD_R_SIZE || size == DL_DVD_R_SIZE;\n+\n+    const bool debug = IsDebugSigned();\n+    if ((platform == Platform::GameCubeDisc && !valid_gamecube) ||\n+        (platform == Platform::WiiDisc && (debug ? !valid_debug_wii : !valid_retail_wii)))\n+    {\n+      if (debug && valid_retail_wii)\n+      {\n+        AddProblem(Severity::Low,\n+                   GetStringT("This debug disc image has the size of a retail disc image."));\n+      }\n+      else\n+      {\n+        const bool small =\n+            (m_volume.GetVolumeType() == Platform::GameCubeDisc && size < MINI_DVD_SIZE) ||\n+            (m_volume.GetVolumeType() == Platform::WiiDisc && size < SL_DVD_SIZE);\n+\n+        if (small)\n+        {\n+          AddProblem(Severity::Low,\n+                     GetStringT("This disc image has an unusual size. This will likely make the "\n+                                "emulated loading times longer. When using netplay or sending "\n+                                "input recordings to other people, you will likely experience "\n+                                "desyncs if anyone is using a good dump."));\n+        }\n+        else\n+        {\n+          AddProblem(Severity::Low, GetStringT("This disc image has an unusual size."));\n+        }\n+      }\n+    }\n+  }\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset()\n+{\n+  std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+    partitions.emplace_back(m_volume.GetGamePartition());\n+\n+  u64 biggest_offset = 0;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (partition != PARTITION_NONE)\n+      biggest_offset = std::max(biggest_offset, partition.offset);\n+\n+    const std::optional<u64> fst_offset = GetFSTOffset(m_volume, partition);\n+    const std::optional<u64> fst_size = GetFSTSize(m_volume, partition);\n+    if (!fst_offset || !fst_size)\n+      break;', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 414, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400649', 'created_at': '2019-03-23T16:33:06Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400649'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400649'}}, 'id': 268400649}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 503, 'body': "This IOS list looks a bit odd, I don't see a correlation between 37 and the others. I mean, IOS37 fixed the hash comparison, but why the others? Non-Korean? WiiBrew isn't particularly helping there; at least not the [IOS History](https://wiibrew.org/wiki/IOS_History)\r\nAlso, thoughts on putting those into an array and doing a contains check instead?", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400763', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDc2Mw==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";\n+        for (const FileInfo& f : *file_info)\n+        {\n+          if (StringBeginsWith(f.GetName(), correct_ios))\n+          {\n+            has_correct_ios = true;\n+            break;\n+          }\n+        }\n+      }\n+    }\n+\n+    if (!has_correct_ios)\n+    {\n+      // This is reached for hacked dumps where the update partition has been replaced with\n+      // a very old update partition so that no updates will be installed.\n+      AddProblem(Severity::Low,\n+                 GetStringT("The update partition does not contain the IOS used by this title."));\n+    }\n+  }\n+\n+  return true;\n+}\n+\n+void VolumeVerifier::CheckCorrectlySigned(const Partition& partition, const std::string& error_text)\n+{\n+  IOS::HLE::Kernel ios;\n+  const auto es = ios.GetES();\n+  const std::vector<u8> cert_chain = m_volume.GetCertificateChain(partition);\n+\n+  if (IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::Ticket,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTicket(partition), cert_chain) ||\n+      IOS::HLE::IPC_SUCCESS !=\n+          es->VerifyContainer(IOS::HLE::Device::ES::VerifyContainerType::TMD,\n+                              IOS::HLE::Device::ES::VerifyMode::DoNotUpdateCertStore,\n+                              m_volume.GetTMD(partition), cert_chain))\n+  {\n+    AddProblem(Severity::Low, error_text);\n+  }\n+}\n+\n+bool VolumeVerifier::IsDebugSigned() const\n+{\n+  const IOS::ES::TicketReader& ticket = m_volume.GetTicket(m_volume.GetGamePartition());\n+  return ticket.IsValid() ? ticket.GetConsoleType() == IOS::HLE::IOSC::ConsoleType::RVT : false;\n+}\n+\n+bool VolumeVerifier::ShouldHaveChannelPartition() const\n+{\n+  const std::unordered_set<std::string> channel_discs{\n+      "RFNE01", "RFNJ01", "RFNK01", "RFNP01", "RFNW01", "RFPE01", "RFPJ01", "RFPK01", "RFPP01",\n+      "RFPW01", "RGWE41", "RGWJ41", "RGWP41", "RGWX41", "RMCE01", "RMCJ01", "RMCK01", "RMCP01",\n+  };\n+\n+  return channel_discs.find(m_volume.GetGameID()) != channel_discs.end();\n+}\n+\n+bool VolumeVerifier::ShouldHaveMasterpiecePartitions() const\n+{\n+  const std::unordered_set<std::string> ssbb{"RSBE01", "RSBJ01", "RSBK01", "RSBP01"};\n+  return ssbb.find(m_volume.GetGameID()) != ssbb.end();\n+}\n+\n+bool VolumeVerifier::ShouldBeDualLayer() const\n+{\n+  // The Japanese versions of Xenoblade and The Last Story are single-layer\n+  // (unlike the other versions) and must not be added to this list.\n+  const std::unordered_set<std::string> dual_layer_discs{\n+      "R3ME01", "R3MP01", "R3OE01", "R3OJ01", "R3OP01", "RSBE01", "RSBJ01", "RSBK01", "RSBP01",\n+      "RXMJ8P", "S59E01", "S59JC8", "S59P01", "S5QJC8", "SK8X52", "SAKENS", "SAKPNS", "SK8V52",\n+      "SK8X52", "SLSEXJ", "SLSP01", "SQIE4Q", "SQIP4Q", "SQIY4Q", "SR5E41", "SR5P41", "SUOE41",\n+      "SUOP41", "SVXX52", "SVXY52", "SX4E01", "SX4P01", "SZ3EGT", "SZ3PGT",\n+  };\n+\n+  return dual_layer_discs.find(m_volume.GetGameID()) != dual_layer_discs.end();\n+}\n+\n+void VolumeVerifier::CheckDiscSize()\n+{\n+  if (!IsDisc(m_volume.GetVolumeType()))\n+    return;\n+\n+  const u64 biggest_offset = GetBiggestUsedOffset();\n+  if (biggest_offset > m_volume.GetSize())\n+  {\n+    const bool second_layer_missing =\n+        biggest_offset > SL_DVD_SIZE && m_volume.GetSize() >= SL_DVD_SIZE;\n+    const std::string text =\n+        second_layer_missing ?\n+            GetStringT(\n+                "This disc image is too small and lacks some data. The problem is most likely that "\n+                "this is a dual-layer disc that has been dumped as a single-layer disc.") :\n+            GetStringT(\n+                "This disc image is too small and lacks some data. If your dumping program saved "\n+                "the disc image as several parts, you need to merge them into one file.");\n+    AddProblem(Severity::High, text);\n+    return;\n+  }\n+\n+  if (ShouldBeDualLayer() && biggest_offset <= SL_DVD_R_SIZE)\n+  {\n+    AddProblem(\n+        Severity::Medium,\n+        GetStringT("This game has been hacked to fit on a single-layer DVD. Some content such as "\n+                   "pre-rendered videos, extra languages or entire game modes will be broken. "\n+                   "This problem generally only exists in illegal copies of games."));\n+  }\n+\n+  if (!m_volume.IsSizeAccurate())\n+  {\n+    AddProblem(Severity::Low, GetStringT("The format that the disc image is saved in does not "\n+                                         "store the size of the disc image."));\n+  }\n+  else if (!m_is_tgc)\n+  {\n+    const Platform platform = m_volume.GetVolumeType();\n+    const u64 size = m_volume.GetSize();\n+\n+    const bool valid_gamecube = size == MINI_DVD_SIZE;\n+    const bool valid_retail_wii = size == SL_DVD_SIZE || size == DL_DVD_SIZE;\n+    const bool valid_debug_wii = size == SL_DVD_R_SIZE || size == DL_DVD_R_SIZE;\n+\n+    const bool debug = IsDebugSigned();\n+    if ((platform == Platform::GameCubeDisc && !valid_gamecube) ||\n+        (platform == Platform::WiiDisc && (debug ? !valid_debug_wii : !valid_retail_wii)))\n+    {\n+      if (debug && valid_retail_wii)\n+      {\n+        AddProblem(Severity::Low,\n+                   GetStringT("This debug disc image has the size of a retail disc image."));\n+      }\n+      else\n+      {\n+        const bool small =\n+            (m_volume.GetVolumeType() == Platform::GameCubeDisc && size < MINI_DVD_SIZE) ||\n+            (m_volume.GetVolumeType() == Platform::WiiDisc && size < SL_DVD_SIZE);\n+\n+        if (small)\n+        {\n+          AddProblem(Severity::Low,\n+                     GetStringT("This disc image has an unusual size. This will likely make the "\n+                                "emulated loading times longer. When using netplay or sending "\n+                                "input recordings to other people, you will likely experience "\n+                                "desyncs if anyone is using a good dump."));\n+        }\n+        else\n+        {\n+          AddProblem(Severity::Low, GetStringT("This disc image has an unusual size."));\n+        }\n+      }\n+    }\n+  }\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset()\n+{\n+  std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+    partitions.emplace_back(m_volume.GetGamePartition());\n+\n+  u64 biggest_offset = 0;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (partition != PARTITION_NONE)\n+      biggest_offset = std::max(biggest_offset, partition.offset);\n+\n+    const std::optional<u64> fst_offset = GetFSTOffset(m_volume, partition);\n+    const std::optional<u64> fst_size = GetFSTSize(m_volume, partition);\n+    if (!fst_offset || !fst_size)\n+      break;\n+\n+    biggest_offset = std::max(\n+        biggest_offset, m_volume.PartitionOffsetToRawOffset(*fst_offset + *fst_size, partition));\n+\n+    const FileSystem* fs = m_volume.GetFileSystem(partition);\n+    if (!fs)\n+      break;\n+\n+    biggest_offset = std::max(biggest_offset, m_volume.PartitionOffsetToRawOffset(\n+                                                  GetBiggestUsedOffset(fs->GetRoot()), partition));\n+  }\n+  return biggest_offset;\n+}\n+\n+u64 VolumeVerifier::GetBiggestUsedOffset(const FileInfo& file_info) const\n+{\n+  if (file_info.IsDirectory())\n+  {\n+    u64 biggest_offset = 0;\n+    for (const FileInfo& f : file_info)\n+      biggest_offset = std::max(biggest_offset, GetBiggestUsedOffset(f));\n+    return biggest_offset;\n+  }\n+  else\n+  {\n+    return file_info.GetOffset() + file_info.GetSize();\n+  }\n+}\n+\n+void VolumeVerifier::CheckMisc()\n+{\n+  const Region region = m_volume.GetRegion();\n+  const Platform platform = m_volume.GetVolumeType();\n+  const std::string game_id_unencrypted = m_volume.GetGameID(PARTITION_NONE);\n+  const std::string game_id_encrypted = m_volume.GetGameID(m_volume.GetGamePartition());\n+\n+  if (game_id_unencrypted != game_id_encrypted)\n+  {\n+    bool inconsistent_game_id = true;\n+    if (game_id_encrypted == "RELSAB")\n+    {\n+      if (StringBeginsWith(game_id_unencrypted, "410"))\n+      {\n+        // This is the Wii Backup Disc (aka "pinkfish" disc),\n+        // which legitimately has an inconsistent game ID.\n+        inconsistent_game_id = false;\n+      }\n+      else if (StringBeginsWith(game_id_unencrypted, "010"))\n+      {\n+        // Hacked version of the Wii Backup Disc (aka "pinkfish" disc).\n+        std::string proper_game_id = game_id_unencrypted;\n+        proper_game_id[0] = \'4\';\n+        AddProblem(Severity::Low,\n+                   StringFromFormat(GetStringT("The game ID is %s but should be %s.").c_str(),\n+                                    game_id_unencrypted.c_str(), proper_game_id.c_str()));\n+        inconsistent_game_id = false;\n+      }\n+    }\n+\n+    if (inconsistent_game_id)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The game ID is inconsistent."));\n+    }\n+  }\n+\n+  if (game_id_encrypted.size() < 4)\n+  {\n+    AddProblem(Severity::Low, GetStringT("The game ID is unusually short."));\n+  }\n+  else\n+  {\n+    const char country_code = game_id_encrypted[3];\n+    if (CountryCodeToRegion(country_code, platform, region) != region)\n+    {\n+      AddProblem(\n+          Severity::Medium,\n+          GetStringT("The region code does not match the game ID. If this is because the "\n+                     "region code has been modified, the game might run at the wrong speed, "\n+                     "graphical elements might be offset, or the game might not run at all."));\n+    }\n+  }\n+\n+  const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+  if (tmd.IsValid())\n+  {\n+    const u64 ios_id = tmd.GetIOSId() & 0xFF;\n+\n+    if (region == Region::NTSC_K && ios_id < 40 && ios_id != 4 && ios_id != 9 && ios_id != 21 &&\n+        ios_id != 37)', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 503, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400763', 'created_at': '2019-03-23T16:36:39Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400763'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400763'}}, 'id': 268400763}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 39, 'body': 'Thoughts on moving this comment _before_ the member? Visual Studio will show that comment in IntelliSense; not sure about other IDEs though.', 'path': 'Source/Core/DiscIO/VolumeVerifier.h', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400982', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMDk4Mg==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,92 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#pragma once\n+\n+#include <string>\n+#include <vector>\n+\n+#include "DiscIO/Volume.h"\n+\n+// To be used as follows:\n+//\n+// VolumeVerifier verifier(volume);\n+// verifier.Start();\n+// while (verifier.GetProgress() != verifier.GetMaxProgress())\n+//   verifier.Process();\n+// verifier.Finish();\n+// auto result = verifier.GetResult();\n+//\n+// Start, Process and Finish may take some time to run.\n+//\n+// GetResult() can be called before the processing is finished, but the result will be incomplete.\n+\n+namespace IOS::ES\n+{\n+class SignedBlobReader;\n+}\n+\n+namespace DiscIO\n+{\n+class FileInfo;\n+\n+class VolumeVerifier final\n+{\n+public:\n+  enum class Severity\n+  {\n+    None,  // Only used internally', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 39, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400982', 'created_at': '2019-03-23T16:41:50Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268400982'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268400982'}}, 'id': 268400982}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 78, 'body': 'Do we want to use shading or text color to indicate severity as well, or should we just leave it as normal text?', 'path': 'Source/Core/DolphinQt/Config/VerifyWidget.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401077', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTA3Nw==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,103 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DolphinQt/Config/VerifyWidget.h"\n+\n+#include <memory>\n+\n+#include <QHeaderView>\n+#include <QLabel>\n+#include <QProgressDialog>\n+#include <QPushButton>\n+#include <QVBoxLayout>\n+\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeVerifier.h"\n+\n+VerifyWidget::VerifyWidget(std::shared_ptr<DiscIO::Volume> volume) : m_volume(std::move(volume))\n+{\n+  QVBoxLayout* layout = new QVBoxLayout(this);\n+\n+  m_problems = new QTableWidget(0, 2, this);\n+  m_problems->setHorizontalHeaderLabels({tr("Problem"), tr("Severity")});\n+  m_problems->horizontalHeader()->setSectionResizeMode(0, QHeaderView::Stretch);\n+  m_problems->horizontalHeader()->setSectionResizeMode(1, QHeaderView::ResizeToContents);\n+  m_problems->verticalHeader()->setSectionResizeMode(QHeaderView::ResizeToContents);\n+  m_problems->verticalHeader()->hide();\n+\n+  m_summary_text = new QTextEdit(this);\n+  m_summary_text->setReadOnly(true);\n+\n+  QPushButton* verify_button = new QPushButton(tr("Verify Integrity"));\n+  connect(verify_button, &QPushButton::clicked, this, &VerifyWidget::Verify);\n+\n+  layout->addWidget(m_problems);\n+  layout->addWidget(m_summary_text);\n+  layout->addWidget(verify_button);\n+\n+  layout->setStretchFactor(m_problems, 5);\n+  layout->setStretchFactor(m_summary_text, 2);\n+\n+  setLayout(layout);\n+}\n+\n+void VerifyWidget::Verify()\n+{\n+  DiscIO::VolumeVerifier verifier(*m_volume);\n+\n+  QProgressDialog* progress =\n+      new QProgressDialog(tr("Verifying"), tr("Cancel"), 0, verifier.GetMaxProgress(), this);\n+  progress->setWindowTitle(tr("Verifying"));\n+  progress->setWindowFlags(progress->windowFlags() & ~Qt::WindowContextHelpButtonHint);\n+  progress->setMinimumDuration(500);\n+  progress->setWindowModality(Qt::WindowModal);\n+\n+  verifier.Start();\n+  while (verifier.GetProgress() != verifier.GetMaxProgress())\n+  {\n+    progress->setValue(verifier.GetProgress());\n+    if (progress->wasCanceled())\n+      return;\n+\n+    verifier.Process();\n+  }\n+  verifier.Finish();\n+\n+  DiscIO::VolumeVerifier::Result result = verifier.GetResult();\n+  progress->setValue(verifier.GetProgress());\n+\n+  m_summary_text->setText(QString::fromStdString(result.summary_text));\n+\n+  m_problems->setRowCount(static_cast<int>(result.problems.size()));\n+  for (int i = 0; i < m_problems->rowCount(); ++i)\n+  {\n+    const DiscIO::VolumeVerifier::Problem problem = result.problems[i];\n+\n+    QString severity;\n+    switch (problem.severity)', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 78, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401077', 'created_at': '2019-03-23T16:45:10Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401077'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401077'}}, 'id': 268401077}, {'pull_request_review_id': 218045578, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 243, 'body': 'Note to self: Dash at the end to avoid partial matches. File names are "IOS\u200c\u2009_nn_-_xx_-v\u2009_vv_.wad"', 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401259', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMTI1OQ==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)\n+    AddProblem(Severity::Medium, GetStringT("The channel partition is missing."));\n+\n+  if (ShouldHaveMasterpiecePartitions() &&\n+      types.cend() ==\n+          std::find_if(types.cbegin(), types.cend(), [](u32 type) { return type >= 0xFF; }))\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    AddProblem(Severity::Medium, GetStringT("The Masterpiece partitions are missing."));\n+  }\n+\n+  for (const Partition& partition : partitions)\n+  {\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_UPDATE) &&\n+        partition.offset != 0x50000)\n+    {\n+      AddProblem(Severity::Low, GetStringT("The update partition is not at its normal position."));\n+    }\n+\n+    const u64 normal_data_offset = IsDebugSigned() ? 0x838000 : 0xF800000;\n+    if (m_volume.GetPartitionType(partition) == std::optional<u32>(PARTITION_DATA) &&\n+        partition.offset != normal_data_offset && !has_channel_partition)\n+    {\n+      AddProblem(\n+          Severity::Low,\n+          GetStringT("The data partition is not at its normal position. This will affect the "\n+                     "emulated loading times. When using netplay or sending input recordings to "\n+                     "other people, you will experience desyncs if anyone is using a good dump."));\n+    }\n+  }\n+\n+  std::vector<Partition> partitions_result;\n+  for (const Partition& partition : partitions)\n+  {\n+    if (CheckPartition(partition))\n+      partitions_result.emplace_back(partition);\n+  }\n+\n+  return partitions;\n+}\n+\n+bool VolumeVerifier::CheckPartition(const Partition& partition)\n+{\n+  std::optional<u32> type = m_volume.GetPartitionType(partition);\n+  if (!type)\n+  {\n+    // Not sure if this can happen in practice\n+    AddProblem(Severity::Medium, GetStringT("The type of a partition could not be read."));\n+    return false;\n+  }\n+\n+  Severity severity = Severity::Medium;\n+  if (*type == PARTITION_DATA)\n+    severity = Severity::High;\n+  else if (*type == PARTITION_UPDATE)\n+    severity = Severity::Low;\n+\n+  std::string name = NameForPartitionType(*type, false);\n+  if (ShouldHaveMasterpiecePartitions() && *type > 0xFF)\n+  {\n+    // i18n: This string is referring to a game mode in Super Smash Bros. Brawl called Masterpieces\n+    // where you play demos of NES/SNES/N64 games. This string is referring to a specific such demo\n+    // rather than the game mode as a whole, so please use the singular form. Official translations:\n+    // 名作トライアル (Japanese), Masterpieces (English), Meisterstücke (German), Chefs-d\'œuvre\n+    // (French), Clásicos (Spanish), Capolavori (Italian), 클래식 게임 체험판 (Korean).\n+    // If your language is not one of the languages above, consider leaving the string untranslated\n+    // so that people will recognize it as the name of the game mode.\n+    name = StringFromFormat(GetStringT("%s (Masterpiece)").c_str(), name.c_str());\n+  }\n+\n+  if (partition.offset % VolumeWii::BLOCK_TOTAL_SIZE != 0)\n+  {\n+    AddProblem(Severity::Medium,\n+               StringFromFormat(GetStringT("The %s partition is not properly aligned.").c_str(),\n+                                name.c_str()));\n+  }\n+\n+  CheckCorrectlySigned(\n+      partition, StringFromFormat(GetStringT("The %s partition is not correctly signed.").c_str(),\n+                                  name.c_str()));\n+\n+  bool invalid_disc_header = false;\n+  std::vector<u8> disc_header(0x80);\n+  if (!m_volume.Read(0, disc_header.size(), disc_header.data(), partition))\n+  {\n+    invalid_disc_header = true;\n+  }\n+  else if (Common::swap32(disc_header.data() + 0x18) != 0x5D1C9EA3)\n+  {\n+    for (size_t i = 0; i < disc_header.size(); i += 4)\n+    {\n+      if (Common::swap32(disc_header.data() + i) != i)\n+      {\n+        invalid_disc_header = true;\n+        break;\n+      }\n+    }\n+\n+    // The loop above ends without breaking for discs that legitimately lack updates.\n+    // No such discs have been released to end users. Most such discs are debug signed,\n+    // but there is apparently at least one that is retail signed, the Movie-Ch Install Disc.\n+    return false;\n+  }\n+  if (invalid_disc_header)\n+  {\n+    // This can happen when certain programs that create WBFS files scrub the entirety of\n+    // the Masterpiece partitions in Super Smash Bros. Brawl without removing them from\n+    // the partition table. https://bugs.dolphin-emu.org/issues/8733\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not seem to contain valid data.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  const DiscIO::FileSystem* filesystem = m_volume.GetFileSystem(partition);\n+  if (!filesystem)\n+  {\n+    const std::string text = StringFromFormat(\n+        GetStringT("The %s partition does not have a valid file system.").c_str(), name.c_str());\n+    AddProblem(severity, text);\n+    return false;\n+  }\n+\n+  if (type == PARTITION_UPDATE)\n+  {\n+    std::unique_ptr<FileInfo> file_info = filesystem->FindFileInfo("_sys");\n+    bool has_correct_ios = false;\n+    if (file_info)\n+    {\n+      const IOS::ES::TMDReader& tmd = m_volume.GetTMD(m_volume.GetGamePartition());\n+      if (tmd.IsValid())\n+      {\n+        const std::string correct_ios = "IOS" + std::to_string(tmd.GetIOSId() & 0xFF) + "-";', 'updated_at': '2019-03-23T16:51:35Z', 'original_position': 243, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401259', 'created_at': '2019-03-23T16:51:19Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268401259'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268401259'}}, 'id': 268401259}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7922}
2019-03-23T16:10:06.221131	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#pullrequestreview-218044998', 'comments': [{'pull_request_review_id': 218044998, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'position': 101, 'body': 'A bunch of `constexpr` locals could help, but that kinds feels like cheating clang-format at this point :S', 'path': 'Source/Core/Core/HW/WiimoteEmu/MotionPlus.cpp', 'original_commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268399901', 'in_reply_to_id': 268387442, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5OTkwMQ==', 'commit_id': 'a1237bdf2fa84b4e59a261cfe7eb12eb838c101f', 'author_association': 'MEMBER', 'diff_hunk': '@@ -17,47 +24,101 @@ MotionPlus::MotionPlus() : Extension("MotionPlus")\n \n void MotionPlus::Reset()\n {\n-  reg_data = {};\n+  m_reg_data = {};\n \n-  constexpr std::array<u8, 6> initial_id = {0x00, 0x00, 0xA6, 0x20, 0x00, 0x05};\n+  m_progress_timer = {};\n \n-  // FYI: This ID changes on activation\n-  std::copy(std::begin(initial_id), std::end(initial_id), reg_data.ext_identifier);\n+  // Seeing as we allow disconnection of the M+, we\'ll say we\'re not integrated.\n+  // (0x00 or 0x01)\n+  constexpr u8 IS_INTEGRATED = 0x00;\n \n-  // TODO: determine meaning of calibration data:\n-  constexpr std::array<u8, 32> cdata = {\n-      0x78, 0xd9, 0x78, 0x38, 0x77, 0x9d, 0x2f, 0x0c, 0xcf, 0xf0, 0x31,\n-      0xad, 0xc8, 0x0b, 0x5e, 0x39, 0x6f, 0x81, 0x7b, 0x89, 0x78, 0x51,\n-      0x33, 0x60, 0xc9, 0xf5, 0x37, 0xc1, 0x2d, 0xe9, 0x15, 0x8d,\n-  };\n+  // FYI: This ID changes on activation/deactivation\n+  constexpr std::array<u8, 6> initial_id = {IS_INTEGRATED, 0x00, 0xA6, 0x20, 0x00, 0x05};\n+  m_reg_data.ext_identifier = initial_id;\n \n-  std::copy(std::begin(cdata), std::end(cdata), reg_data.calibration_data);\n+  // Build calibration data.\n \n-  // TODO: determine the meaning behind this:\n-  constexpr std::array<u8, 64> cert = {\n-      0x99, 0x1a, 0x07, 0x1b, 0x97, 0xf1, 0x11, 0x78, 0x0c, 0x42, 0x2b, 0x68, 0xdf,\n-      0x44, 0x38, 0x0d, 0x2b, 0x7e, 0xd6, 0x84, 0x84, 0x58, 0x65, 0xc9, 0xf2, 0x95,\n-      0xd9, 0xaf, 0xb6, 0xc4, 0x87, 0xd5, 0x18, 0xdb, 0x67, 0x3a, 0xc0, 0x71, 0xec,\n-      0x3e, 0xf4, 0xe6, 0x7e, 0x35, 0xa3, 0x29, 0xf8, 0x1f, 0xc5, 0x7c, 0x3d, 0xb9,\n-      0x56, 0x22, 0x95, 0x98, 0x8f, 0xfb, 0x66, 0x3e, 0x9a, 0xdd, 0xeb, 0x7e,\n+  // Matching signedness of my real Wiimote+.\n+  // This also results in all values following the "right-hand rule".\n+  constexpr u16 YAW_SCALE = CALIBRATION_ZERO - CALIBRATION_SCALE_OFFSET;\n+  constexpr u16 ROLL_SCALE = CALIBRATION_ZERO + CALIBRATION_SCALE_OFFSET;\n+  constexpr u16 PITCH_SCALE = CALIBRATION_ZERO - CALIBRATION_SCALE_OFFSET;\n+\n+#pragma pack(push, 1)\n+  struct CalibrationBlock\n+  {\n+    u16 yaw_zero = Common::swap16(CALIBRATION_ZERO);\n+    u16 roll_zero = Common::swap16(CALIBRATION_ZERO);\n+    u16 pitch_zero = Common::swap16(CALIBRATION_ZERO);\n+    u16 yaw_scale = Common::swap16(YAW_SCALE);\n+    u16 roll_scale = Common::swap16(ROLL_SCALE);\n+    u16 pitch_scale = Common::swap16(PITCH_SCALE);\n+    u8 degrees_div_6;\n   };\n \n-  std::copy(std::begin(cert), std::end(cert), reg_data.cert_data);\n+  struct CalibrationData\n+  {\n+    CalibrationBlock fast;\n+    u8 uid_1;\n+    Common::BigEndianValue<u16> crc32_msb;\n+    CalibrationBlock slow;\n+    u8 uid_2;\n+    Common::BigEndianValue<u16> crc32_lsb;\n+  };\n+#pragma pack(pop)\n+\n+  static_assert(sizeof(CalibrationData) == 0x20, "Bad size.");\n+\n+  static_assert(CALIBRATION_FAST_SCALE_DEGREES % 6 == 0, "Value should be divisible by 6.");\n+  static_assert(CALIBRATION_SLOW_SCALE_DEGREES % 6 == 0, "Value should be divisible by 6.");\n+\n+  CalibrationData calibration;\n+  calibration.fast.degrees_div_6 = CALIBRATION_FAST_SCALE_DEGREES / 6;\n+  calibration.slow.degrees_div_6 = CALIBRATION_SLOW_SCALE_DEGREES / 6;\n+\n+  // From what I can tell, this value is only used to compare against a previously made copy.\n+  // If the value matches that of the last connected wiimote which passed the "challenge",\n+  // then it seems the "challenge" is not performed a second time.\n+  calibration.uid_1 = 0x0b;\n+  calibration.uid_2 = 0xe9;\n+\n+  // Update checksum (crc32 of all data other than the checksum itself):\n+  const auto crc_result = crc32(crc32(0, reinterpret_cast<const u8*>(&calibration), 0xe),\n+                                reinterpret_cast<const u8*>(&calibration) + 0x10, 0xe);', 'updated_at': '2019-03-23T16:10:03Z', 'original_position': 101, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399901', 'created_at': '2019-03-23T16:09:06Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399901'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268399901'}}, 'id': 268399901}, {'pull_request_review_id': 218044998, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'position': 63, 'body': "Was mostly a question, didn't really think of the conversions there. +/-0 on change/no change, so I guess keep it until someone else brings it up.", 'path': 'Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp', 'original_commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268399935', 'in_reply_to_id': 268387339, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5OTkzNQ==', 'commit_id': 'a1237bdf2fa84b4e59a261cfe7eb12eb838c101f', 'author_association': 'MEMBER', 'diff_hunk': '@@ -184,27 +181,55 @@ WiimoteCommon::DataReportBuilder::AccelData ConvertAccelData(const Common::Vec3&\n           u16(MathUtil::Clamp(std::lround(scaled_accel.z + zero_g), 0l, MAX_VALUE))};\n }\n \n-Common::Matrix44 EmulateCursorMovement(ControllerEmu::Cursor* ir_group)\n+void EmulateCursor(MotionState* state, ControllerEmu::Cursor* ir_group, float time_elapsed)\n {\n   const auto cursor = ir_group->GetState(true);\n \n+  if (!cursor.IsVisible())\n+  {\n+    // Move the wiimote a kilometer forward so the sensor bar is always behind it.\n+    *state = {};\n+    state->position = {0, -1000, 0};\n+    return;\n+  }\n+\n   using Common::Matrix33;\n   using Common::Matrix44;\n \n   // Values are optimized for default settings in "Super Mario Galaxy 2"\n   // This seems to be acceptable for a good number of games.\n-  constexpr float YAW_ANGLE = 0.1472f;\n-  constexpr float PITCH_ANGLE = 0.121f;\n+  // constexpr float YAW_ANGLE = 0.1472f;\n+  // constexpr float PITCH_ANGLE = 0.121f;\n+  constexpr float YAW_ANGLE = 0.3f / 5 * 1.435f * 3;\n+  constexpr float PITCH_ANGLE = 0.3f / 5 * 1.34f * 3;\n \n   // Nintendo recommends a distance of 1-3 meters.\n-  constexpr float NEUTRAL_DISTANCE = 2.f;\n-\n+  constexpr float NEUTRAL_DISTANCE = 3.f;\n   constexpr float MOVE_DISTANCE = 1.f;\n \n-  return Matrix44::Translate({0, MOVE_DISTANCE * float(cursor.z), 0}) *\n-         Matrix44::FromMatrix33(Matrix33::RotateX(PITCH_ANGLE * cursor.y) *\n-                                Matrix33::RotateZ(YAW_ANGLE * cursor.x)) *\n-         Matrix44::Translate({0, -NEUTRAL_DISTANCE, 0});\n+  // TODO: Move state out of ControllerEmu::Cursor\n+  // TODO: Use ApproachPositionWithJerk\n+  // TODO: Move forward/backward after rotation.\n+  const auto new_position = Common::Vec3{0, NEUTRAL_DISTANCE - MOVE_DISTANCE * float(cursor.z), 0};\n+\n+  const auto target_angle = Common::Vec3(PITCH_ANGLE * -cursor.y, 0, YAW_ANGLE * -cursor.x);', 'updated_at': '2019-03-23T16:10:03Z', 'original_position': 63, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399935', 'created_at': '2019-03-23T16:09:58Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399935'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268399935'}}, 'id': 268399935}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7861}
2019-03-23T16:10:05.584683	{'source': 'ghhookparser', 'action': 'edited', 'pr_title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'author': 'BhaaLseN', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#pullrequestreview-218044998', 'comments': [{'pull_request_review_id': 218044998, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'position': 101, 'body': 'A bunch of `constexpr` locals could help, but that kinds feels like cheating clang-format at this point :S', 'path': 'Source/Core/Core/HW/WiimoteEmu/MotionPlus.cpp', 'original_commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268399901', 'in_reply_to_id': 268387442, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5OTkwMQ==', 'commit_id': 'a1237bdf2fa84b4e59a261cfe7eb12eb838c101f', 'author_association': 'MEMBER', 'diff_hunk': '@@ -17,47 +24,101 @@ MotionPlus::MotionPlus() : Extension("MotionPlus")\n \n void MotionPlus::Reset()\n {\n-  reg_data = {};\n+  m_reg_data = {};\n \n-  constexpr std::array<u8, 6> initial_id = {0x00, 0x00, 0xA6, 0x20, 0x00, 0x05};\n+  m_progress_timer = {};\n \n-  // FYI: This ID changes on activation\n-  std::copy(std::begin(initial_id), std::end(initial_id), reg_data.ext_identifier);\n+  // Seeing as we allow disconnection of the M+, we\'ll say we\'re not integrated.\n+  // (0x00 or 0x01)\n+  constexpr u8 IS_INTEGRATED = 0x00;\n \n-  // TODO: determine meaning of calibration data:\n-  constexpr std::array<u8, 32> cdata = {\n-      0x78, 0xd9, 0x78, 0x38, 0x77, 0x9d, 0x2f, 0x0c, 0xcf, 0xf0, 0x31,\n-      0xad, 0xc8, 0x0b, 0x5e, 0x39, 0x6f, 0x81, 0x7b, 0x89, 0x78, 0x51,\n-      0x33, 0x60, 0xc9, 0xf5, 0x37, 0xc1, 0x2d, 0xe9, 0x15, 0x8d,\n-  };\n+  // FYI: This ID changes on activation/deactivation\n+  constexpr std::array<u8, 6> initial_id = {IS_INTEGRATED, 0x00, 0xA6, 0x20, 0x00, 0x05};\n+  m_reg_data.ext_identifier = initial_id;\n \n-  std::copy(std::begin(cdata), std::end(cdata), reg_data.calibration_data);\n+  // Build calibration data.\n \n-  // TODO: determine the meaning behind this:\n-  constexpr std::array<u8, 64> cert = {\n-      0x99, 0x1a, 0x07, 0x1b, 0x97, 0xf1, 0x11, 0x78, 0x0c, 0x42, 0x2b, 0x68, 0xdf,\n-      0x44, 0x38, 0x0d, 0x2b, 0x7e, 0xd6, 0x84, 0x84, 0x58, 0x65, 0xc9, 0xf2, 0x95,\n-      0xd9, 0xaf, 0xb6, 0xc4, 0x87, 0xd5, 0x18, 0xdb, 0x67, 0x3a, 0xc0, 0x71, 0xec,\n-      0x3e, 0xf4, 0xe6, 0x7e, 0x35, 0xa3, 0x29, 0xf8, 0x1f, 0xc5, 0x7c, 0x3d, 0xb9,\n-      0x56, 0x22, 0x95, 0x98, 0x8f, 0xfb, 0x66, 0x3e, 0x9a, 0xdd, 0xeb, 0x7e,\n+  // Matching signedness of my real Wiimote+.\n+  // This also results in all values following the "right-hand rule".\n+  constexpr u16 YAW_SCALE = CALIBRATION_ZERO - CALIBRATION_SCALE_OFFSET;\n+  constexpr u16 ROLL_SCALE = CALIBRATION_ZERO + CALIBRATION_SCALE_OFFSET;\n+  constexpr u16 PITCH_SCALE = CALIBRATION_ZERO - CALIBRATION_SCALE_OFFSET;\n+\n+#pragma pack(push, 1)\n+  struct CalibrationBlock\n+  {\n+    u16 yaw_zero = Common::swap16(CALIBRATION_ZERO);\n+    u16 roll_zero = Common::swap16(CALIBRATION_ZERO);\n+    u16 pitch_zero = Common::swap16(CALIBRATION_ZERO);\n+    u16 yaw_scale = Common::swap16(YAW_SCALE);\n+    u16 roll_scale = Common::swap16(ROLL_SCALE);\n+    u16 pitch_scale = Common::swap16(PITCH_SCALE);\n+    u8 degrees_div_6;\n   };\n \n-  std::copy(std::begin(cert), std::end(cert), reg_data.cert_data);\n+  struct CalibrationData\n+  {\n+    CalibrationBlock fast;\n+    u8 uid_1;\n+    Common::BigEndianValue<u16> crc32_msb;\n+    CalibrationBlock slow;\n+    u8 uid_2;\n+    Common::BigEndianValue<u16> crc32_lsb;\n+  };\n+#pragma pack(pop)\n+\n+  static_assert(sizeof(CalibrationData) == 0x20, "Bad size.");\n+\n+  static_assert(CALIBRATION_FAST_SCALE_DEGREES % 6 == 0, "Value should be divisible by 6.");\n+  static_assert(CALIBRATION_SLOW_SCALE_DEGREES % 6 == 0, "Value should be divisible by 6.");\n+\n+  CalibrationData calibration;\n+  calibration.fast.degrees_div_6 = CALIBRATION_FAST_SCALE_DEGREES / 6;\n+  calibration.slow.degrees_div_6 = CALIBRATION_SLOW_SCALE_DEGREES / 6;\n+\n+  // From what I can tell, this value is only used to compare against a previously made copy.\n+  // If the value matches that of the last connected wiimote which passed the "challenge",\n+  // then it seems the "challenge" is not performed a second time.\n+  calibration.uid_1 = 0x0b;\n+  calibration.uid_2 = 0xe9;\n+\n+  // Update checksum (crc32 of all data other than the checksum itself):\n+  const auto crc_result = crc32(crc32(0, reinterpret_cast<const u8*>(&calibration), 0xe),\n+                                reinterpret_cast<const u8*>(&calibration) + 0x10, 0xe);', 'updated_at': '2019-03-23T16:10:03Z', 'original_position': 101, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399901', 'created_at': '2019-03-23T16:09:06Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399901'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268399901'}}, 'id': 268399901}, {'pull_request_review_id': 218044998, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'position': 63, 'body': "Was mostly a question, didn't really think of the conversions there. +/-0 on change/no change, so I guess keep it until someone else brings it up.", 'path': 'Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp', 'original_commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268399935', 'in_reply_to_id': 268387339, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5OTkzNQ==', 'commit_id': 'a1237bdf2fa84b4e59a261cfe7eb12eb838c101f', 'author_association': 'MEMBER', 'diff_hunk': '@@ -184,27 +181,55 @@ WiimoteCommon::DataReportBuilder::AccelData ConvertAccelData(const Common::Vec3&\n           u16(MathUtil::Clamp(std::lround(scaled_accel.z + zero_g), 0l, MAX_VALUE))};\n }\n \n-Common::Matrix44 EmulateCursorMovement(ControllerEmu::Cursor* ir_group)\n+void EmulateCursor(MotionState* state, ControllerEmu::Cursor* ir_group, float time_elapsed)\n {\n   const auto cursor = ir_group->GetState(true);\n \n+  if (!cursor.IsVisible())\n+  {\n+    // Move the wiimote a kilometer forward so the sensor bar is always behind it.\n+    *state = {};\n+    state->position = {0, -1000, 0};\n+    return;\n+  }\n+\n   using Common::Matrix33;\n   using Common::Matrix44;\n \n   // Values are optimized for default settings in "Super Mario Galaxy 2"\n   // This seems to be acceptable for a good number of games.\n-  constexpr float YAW_ANGLE = 0.1472f;\n-  constexpr float PITCH_ANGLE = 0.121f;\n+  // constexpr float YAW_ANGLE = 0.1472f;\n+  // constexpr float PITCH_ANGLE = 0.121f;\n+  constexpr float YAW_ANGLE = 0.3f / 5 * 1.435f * 3;\n+  constexpr float PITCH_ANGLE = 0.3f / 5 * 1.34f * 3;\n \n   // Nintendo recommends a distance of 1-3 meters.\n-  constexpr float NEUTRAL_DISTANCE = 2.f;\n-\n+  constexpr float NEUTRAL_DISTANCE = 3.f;\n   constexpr float MOVE_DISTANCE = 1.f;\n \n-  return Matrix44::Translate({0, MOVE_DISTANCE * float(cursor.z), 0}) *\n-         Matrix44::FromMatrix33(Matrix33::RotateX(PITCH_ANGLE * cursor.y) *\n-                                Matrix33::RotateZ(YAW_ANGLE * cursor.x)) *\n-         Matrix44::Translate({0, -NEUTRAL_DISTANCE, 0});\n+  // TODO: Move state out of ControllerEmu::Cursor\n+  // TODO: Use ApproachPositionWithJerk\n+  // TODO: Move forward/backward after rotation.\n+  const auto new_position = Common::Vec3{0, NEUTRAL_DISTANCE - MOVE_DISTANCE * float(cursor.z), 0};\n+\n+  const auto target_angle = Common::Vec3(PITCH_ANGLE * -cursor.y, 0, YAW_ANGLE * -cursor.x);', 'updated_at': '2019-03-23T16:10:03Z', 'original_position': 63, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399935', 'created_at': '2019-03-23T16:09:58Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/BhaaLseN/followers', 'url': 'https://api.github.com/users/BhaaLseN', 'organizations_url': 'https://api.github.com/users/BhaaLseN/orgs', 'node_id': 'MDQ6VXNlcjgyNjA1Mg==', 'events_url': 'https://api.github.com/users/BhaaLseN/events{/privacy}', 'repos_url': 'https://api.github.com/users/BhaaLseN/repos', 'gists_url': 'https://api.github.com/users/BhaaLseN/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/BhaaLseN/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/BhaaLseN/following{/other_user}', 'html_url': 'https://github.com/BhaaLseN', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/826052?v=4', 'login': 'BhaaLseN', 'subscriptions_url': 'https://api.github.com/users/BhaaLseN/subscriptions', 'starred_url': 'https://api.github.com/users/BhaaLseN/starred{/owner}{/repo}', 'id': 826052}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268399935'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268399935'}}, 'id': 268399935}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7861}
2019-03-23T14:43:31.979585	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#pullrequestreview-218041844', 'comments': [{'pull_request_review_id': 218041844, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'position': 166, 'body': 'Okay, fine. :P', 'path': 'Source/Core/Core/HW/WiimoteEmu/WiimoteEmu.cpp', 'original_commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268397091', 'in_reply_to_id': 268387820, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5NzA5MQ==', 'commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'author_association': 'MEMBER', 'diff_hunk': '@@ -748,14 +772,29 @@ Common::Vec3 Wiimote::GetAcceleration()\n   return accel;\n }\n \n+Common::Vec3 Wiimote::GetAngularVelocity()\n+{\n+  auto orientation = Common::Matrix33::Identity();\n+\n+  // TODO: Make a function out of this:', 'updated_at': '2019-03-23T14:43:30Z', 'original_position': 166, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268397091', 'created_at': '2019-03-23T14:43:30Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268397091'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268397091'}}, 'id': 268397091}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7861}
2019-03-23T14:42:04.994606	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#pullrequestreview-218041797', 'comments': [{'pull_request_review_id': 218041797, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'position': 101, 'body': "Yeah.. I was thinking about how to make that crc32 call less ugly.. I can throw in some `offsetof`s and `sizeof`s but I feel like it's just going to be even longer and harder to read then. :/", 'path': 'Source/Core/Core/HW/WiimoteEmu/MotionPlus.cpp', 'original_commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268397046', 'in_reply_to_id': 268387442, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5NzA0Ng==', 'commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'author_association': 'MEMBER', 'diff_hunk': '@@ -17,47 +24,101 @@ MotionPlus::MotionPlus() : Extension("MotionPlus")\n \n void MotionPlus::Reset()\n {\n-  reg_data = {};\n+  m_reg_data = {};\n \n-  constexpr std::array<u8, 6> initial_id = {0x00, 0x00, 0xA6, 0x20, 0x00, 0x05};\n+  m_progress_timer = {};\n \n-  // FYI: This ID changes on activation\n-  std::copy(std::begin(initial_id), std::end(initial_id), reg_data.ext_identifier);\n+  // Seeing as we allow disconnection of the M+, we\'ll say we\'re not integrated.\n+  // (0x00 or 0x01)\n+  constexpr u8 IS_INTEGRATED = 0x00;\n \n-  // TODO: determine meaning of calibration data:\n-  constexpr std::array<u8, 32> cdata = {\n-      0x78, 0xd9, 0x78, 0x38, 0x77, 0x9d, 0x2f, 0x0c, 0xcf, 0xf0, 0x31,\n-      0xad, 0xc8, 0x0b, 0x5e, 0x39, 0x6f, 0x81, 0x7b, 0x89, 0x78, 0x51,\n-      0x33, 0x60, 0xc9, 0xf5, 0x37, 0xc1, 0x2d, 0xe9, 0x15, 0x8d,\n-  };\n+  // FYI: This ID changes on activation/deactivation\n+  constexpr std::array<u8, 6> initial_id = {IS_INTEGRATED, 0x00, 0xA6, 0x20, 0x00, 0x05};\n+  m_reg_data.ext_identifier = initial_id;\n \n-  std::copy(std::begin(cdata), std::end(cdata), reg_data.calibration_data);\n+  // Build calibration data.\n \n-  // TODO: determine the meaning behind this:\n-  constexpr std::array<u8, 64> cert = {\n-      0x99, 0x1a, 0x07, 0x1b, 0x97, 0xf1, 0x11, 0x78, 0x0c, 0x42, 0x2b, 0x68, 0xdf,\n-      0x44, 0x38, 0x0d, 0x2b, 0x7e, 0xd6, 0x84, 0x84, 0x58, 0x65, 0xc9, 0xf2, 0x95,\n-      0xd9, 0xaf, 0xb6, 0xc4, 0x87, 0xd5, 0x18, 0xdb, 0x67, 0x3a, 0xc0, 0x71, 0xec,\n-      0x3e, 0xf4, 0xe6, 0x7e, 0x35, 0xa3, 0x29, 0xf8, 0x1f, 0xc5, 0x7c, 0x3d, 0xb9,\n-      0x56, 0x22, 0x95, 0x98, 0x8f, 0xfb, 0x66, 0x3e, 0x9a, 0xdd, 0xeb, 0x7e,\n+  // Matching signedness of my real Wiimote+.\n+  // This also results in all values following the "right-hand rule".\n+  constexpr u16 YAW_SCALE = CALIBRATION_ZERO - CALIBRATION_SCALE_OFFSET;\n+  constexpr u16 ROLL_SCALE = CALIBRATION_ZERO + CALIBRATION_SCALE_OFFSET;\n+  constexpr u16 PITCH_SCALE = CALIBRATION_ZERO - CALIBRATION_SCALE_OFFSET;\n+\n+#pragma pack(push, 1)\n+  struct CalibrationBlock\n+  {\n+    u16 yaw_zero = Common::swap16(CALIBRATION_ZERO);\n+    u16 roll_zero = Common::swap16(CALIBRATION_ZERO);\n+    u16 pitch_zero = Common::swap16(CALIBRATION_ZERO);\n+    u16 yaw_scale = Common::swap16(YAW_SCALE);\n+    u16 roll_scale = Common::swap16(ROLL_SCALE);\n+    u16 pitch_scale = Common::swap16(PITCH_SCALE);\n+    u8 degrees_div_6;\n   };\n \n-  std::copy(std::begin(cert), std::end(cert), reg_data.cert_data);\n+  struct CalibrationData\n+  {\n+    CalibrationBlock fast;\n+    u8 uid_1;\n+    Common::BigEndianValue<u16> crc32_msb;\n+    CalibrationBlock slow;\n+    u8 uid_2;\n+    Common::BigEndianValue<u16> crc32_lsb;\n+  };\n+#pragma pack(pop)\n+\n+  static_assert(sizeof(CalibrationData) == 0x20, "Bad size.");\n+\n+  static_assert(CALIBRATION_FAST_SCALE_DEGREES % 6 == 0, "Value should be divisible by 6.");\n+  static_assert(CALIBRATION_SLOW_SCALE_DEGREES % 6 == 0, "Value should be divisible by 6.");\n+\n+  CalibrationData calibration;\n+  calibration.fast.degrees_div_6 = CALIBRATION_FAST_SCALE_DEGREES / 6;\n+  calibration.slow.degrees_div_6 = CALIBRATION_SLOW_SCALE_DEGREES / 6;\n+\n+  // From what I can tell, this value is only used to compare against a previously made copy.\n+  // If the value matches that of the last connected wiimote which passed the "challenge",\n+  // then it seems the "challenge" is not performed a second time.\n+  calibration.uid_1 = 0x0b;\n+  calibration.uid_2 = 0xe9;\n+\n+  // Update checksum (crc32 of all data other than the checksum itself):\n+  const auto crc_result = crc32(crc32(0, reinterpret_cast<const u8*>(&calibration), 0xe),\n+                                reinterpret_cast<const u8*>(&calibration) + 0x10, 0xe);', 'updated_at': '2019-03-23T14:42:03Z', 'original_position': 101, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268397046', 'created_at': '2019-03-23T14:42:03Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268397046'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268397046'}}, 'id': 268397046}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7861}
2019-03-23T14:39:56.264077	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#pullrequestreview-218041710', 'comments': [{'pull_request_review_id': 218041710, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'position': 78, 'body': "They don't necessarily need to be the same. They are ugly magic values that I plan on hopefully killing in the future.", 'path': 'Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp', 'original_commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268396950', 'in_reply_to_id': 268387376, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5Njk1MA==', 'commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'author_association': 'MEMBER', 'diff_hunk': '@@ -184,27 +181,55 @@ WiimoteCommon::DataReportBuilder::AccelData ConvertAccelData(const Common::Vec3&\n           u16(MathUtil::Clamp(std::lround(scaled_accel.z + zero_g), 0l, MAX_VALUE))};\n }\n \n-Common::Matrix44 EmulateCursorMovement(ControllerEmu::Cursor* ir_group)\n+void EmulateCursor(MotionState* state, ControllerEmu::Cursor* ir_group, float time_elapsed)\n {\n   const auto cursor = ir_group->GetState(true);\n \n+  if (!cursor.IsVisible())\n+  {\n+    // Move the wiimote a kilometer forward so the sensor bar is always behind it.\n+    *state = {};\n+    state->position = {0, -1000, 0};\n+    return;\n+  }\n+\n   using Common::Matrix33;\n   using Common::Matrix44;\n \n   // Values are optimized for default settings in "Super Mario Galaxy 2"\n   // This seems to be acceptable for a good number of games.\n-  constexpr float YAW_ANGLE = 0.1472f;\n-  constexpr float PITCH_ANGLE = 0.121f;\n+  // constexpr float YAW_ANGLE = 0.1472f;\n+  // constexpr float PITCH_ANGLE = 0.121f;\n+  constexpr float YAW_ANGLE = 0.3f / 5 * 1.435f * 3;\n+  constexpr float PITCH_ANGLE = 0.3f / 5 * 1.34f * 3;\n \n   // Nintendo recommends a distance of 1-3 meters.\n-  constexpr float NEUTRAL_DISTANCE = 2.f;\n-\n+  constexpr float NEUTRAL_DISTANCE = 3.f;\n   constexpr float MOVE_DISTANCE = 1.f;\n \n-  return Matrix44::Translate({0, MOVE_DISTANCE * float(cursor.z), 0}) *\n-         Matrix44::FromMatrix33(Matrix33::RotateX(PITCH_ANGLE * cursor.y) *\n-                                Matrix33::RotateZ(YAW_ANGLE * cursor.x)) *\n-         Matrix44::Translate({0, -NEUTRAL_DISTANCE, 0});\n+  // TODO: Move state out of ControllerEmu::Cursor\n+  // TODO: Use ApproachPositionWithJerk\n+  // TODO: Move forward/backward after rotation.\n+  const auto new_position = Common::Vec3{0, NEUTRAL_DISTANCE - MOVE_DISTANCE * float(cursor.z), 0};\n+\n+  const auto target_angle = Common::Vec3(PITCH_ANGLE * -cursor.y, 0, YAW_ANGLE * -cursor.x);\n+\n+  // If cursor was hidden, jump to the target position/angle immediately.\n+  if (state->position.y < 0)\n+  {\n+    state->position = new_position;\n+    state->angle = target_angle;\n+\n+    return;\n+  }\n+\n+  state->acceleration = new_position - state->position;\n+  state->position = new_position;\n+\n+  // TODO: expose this setting in UI:\n+  constexpr auto MAX_ACCEL = float(MathUtil::TAU * 100);', 'updated_at': '2019-03-23T14:39:54Z', 'original_position': 78, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268396950', 'created_at': '2019-03-23T14:39:54Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268396950'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268396950'}}, 'id': 268396950}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7861}
2019-03-23T14:17:13.430641	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'Add imgui-based Netplay Chat', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7903#pullrequestreview-218040902', 'comments': [{'pull_request_review_id': 218040902, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903', 'position': 27, 'body': "Ah, didn't realize `ImGui::InputText` used it as it's state.", 'path': 'Source/Core/VideoCommon/NetPlayChatUI.h', 'original_commit_id': '74de4e1946e4f4280894e501f2709a5cc8f6a161', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268396169', 'in_reply_to_id': 268378831, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5NjE2OQ==', 'commit_id': 'f3bdb6b1b22e94ddbb5cdafe8bfde3ce7efaee0c', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,31 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#pragma once\n+\n+#include <array>\n+#include <deque>\n+#include <functional>\n+#include <memory>\n+#include <string>\n+#include <utility>\n+\n+class NetPlayChatUI\n+{\n+public:\n+  explicit NetPlayChatUI(std::function<void(const std::string&)> callback);\n+  ~NetPlayChatUI() = default;\n+\n+  void Display();\n+  void AppendChat(const std::string& message, const std::string& color);\n+  void SendMessage();\n+\n+private:\n+  char m_message_buf[256] = {};', 'updated_at': '2019-03-23T14:17:12Z', 'original_position': 25, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903#discussion_r268396169', 'created_at': '2019-03-23T14:17:11Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7903#discussion_r268396169'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268396169'}}, 'id': 268396169}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7903}
2019-03-23T14:09:08.539548	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'WIP - WiimoteEmu: MotionPlus is now mostly working.', 'author': 'jordan-woyak', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7861#pullrequestreview-218040624', 'comments': [{'pull_request_review_id': 218040624, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861', 'position': 63, 'body': "Well.. It's cause curly-initialization doesn't allow conversions (doubles to floats, in this case).\r\nI could make it use ()s consistently.", 'path': 'Source/Core/Core/HW/WiimoteEmu/Dynamics.cpp', 'original_commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268395917', 'in_reply_to_id': 268387339, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5NTkxNw==', 'commit_id': '82c5d2596b42977ecc1bcec0d33dd91591a857c0', 'author_association': 'MEMBER', 'diff_hunk': '@@ -184,27 +181,55 @@ WiimoteCommon::DataReportBuilder::AccelData ConvertAccelData(const Common::Vec3&\n           u16(MathUtil::Clamp(std::lround(scaled_accel.z + zero_g), 0l, MAX_VALUE))};\n }\n \n-Common::Matrix44 EmulateCursorMovement(ControllerEmu::Cursor* ir_group)\n+void EmulateCursor(MotionState* state, ControllerEmu::Cursor* ir_group, float time_elapsed)\n {\n   const auto cursor = ir_group->GetState(true);\n \n+  if (!cursor.IsVisible())\n+  {\n+    // Move the wiimote a kilometer forward so the sensor bar is always behind it.\n+    *state = {};\n+    state->position = {0, -1000, 0};\n+    return;\n+  }\n+\n   using Common::Matrix33;\n   using Common::Matrix44;\n \n   // Values are optimized for default settings in "Super Mario Galaxy 2"\n   // This seems to be acceptable for a good number of games.\n-  constexpr float YAW_ANGLE = 0.1472f;\n-  constexpr float PITCH_ANGLE = 0.121f;\n+  // constexpr float YAW_ANGLE = 0.1472f;\n+  // constexpr float PITCH_ANGLE = 0.121f;\n+  constexpr float YAW_ANGLE = 0.3f / 5 * 1.435f * 3;\n+  constexpr float PITCH_ANGLE = 0.3f / 5 * 1.34f * 3;\n \n   // Nintendo recommends a distance of 1-3 meters.\n-  constexpr float NEUTRAL_DISTANCE = 2.f;\n-\n+  constexpr float NEUTRAL_DISTANCE = 3.f;\n   constexpr float MOVE_DISTANCE = 1.f;\n \n-  return Matrix44::Translate({0, MOVE_DISTANCE * float(cursor.z), 0}) *\n-         Matrix44::FromMatrix33(Matrix33::RotateX(PITCH_ANGLE * cursor.y) *\n-                                Matrix33::RotateZ(YAW_ANGLE * cursor.x)) *\n-         Matrix44::Translate({0, -NEUTRAL_DISTANCE, 0});\n+  // TODO: Move state out of ControllerEmu::Cursor\n+  // TODO: Use ApproachPositionWithJerk\n+  // TODO: Move forward/backward after rotation.\n+  const auto new_position = Common::Vec3{0, NEUTRAL_DISTANCE - MOVE_DISTANCE * float(cursor.z), 0};\n+\n+  const auto target_angle = Common::Vec3(PITCH_ANGLE * -cursor.y, 0, YAW_ANGLE * -cursor.x);', 'updated_at': '2019-03-23T14:09:07Z', 'original_position': 63, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268395917', 'created_at': '2019-03-23T14:09:06Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/jordan-woyak/followers', 'url': 'https://api.github.com/users/jordan-woyak', 'organizations_url': 'https://api.github.com/users/jordan-woyak/orgs', 'node_id': 'MDQ6VXNlcjE3NjgyMTQ=', 'events_url': 'https://api.github.com/users/jordan-woyak/events{/privacy}', 'repos_url': 'https://api.github.com/users/jordan-woyak/repos', 'gists_url': 'https://api.github.com/users/jordan-woyak/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/jordan-woyak/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/jordan-woyak/following{/other_user}', 'html_url': 'https://github.com/jordan-woyak', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/1768214?v=4', 'login': 'jordan-woyak', 'subscriptions_url': 'https://api.github.com/users/jordan-woyak/subscriptions', 'starred_url': 'https://api.github.com/users/jordan-woyak/starred{/owner}{/repo}', 'id': 1768214}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7861'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7861#discussion_r268395917'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268395917'}}, 'id': 268395917}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7861}
2019-03-23T14:03:51.886069	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'Add imgui-based Netplay Chat', 'author': 'spycrab', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7903#pullrequestreview-218040463', 'comments': [{'pull_request_review_id': 218040463, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903', 'position': 12, 'body': "The idea was to actually abide by https://github.com/dolphin-emu/dolphin/pull/7903#discussion_r266224270. So the UI doesn't take up memory all of the time.\r\n", 'path': 'Source/Core/VideoCommon/RenderBase.h', 'original_commit_id': '74de4e1946e4f4280894e501f2709a5cc8f6a161', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268395770', 'in_reply_to_id': 268381718, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5NTc3MA==', 'commit_id': 'f3bdb6b1b22e94ddbb5cdafe8bfde3ce7efaee0c', 'author_association': 'MEMBER', 'diff_hunk': '@@ -242,6 +243,8 @@ class Renderer\n   void BeginUIFrame();\n   void EndUIFrame();\n \n+  std::unique_ptr<NetPlayChatUI>& GetNetPlayChatUI();', 'updated_at': '2019-03-23T14:03:50Z', 'original_position': 12, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903#discussion_r268395770', 'created_at': '2019-03-23T14:03:49Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7903#discussion_r268395770'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268395770'}}, 'id': 268395770}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7903}
2019-03-23T14:02:21.839248	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'Add imgui-based Netplay Chat', 'author': 'spycrab', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7903#pullrequestreview-218040403', 'comments': [{'pull_request_review_id': 218040403, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903', 'position': 27, 'body': "This wouldn't retain the input value, so it would keep resetting every time it was drawn...", 'path': 'Source/Core/VideoCommon/NetPlayChatUI.h', 'original_commit_id': '74de4e1946e4f4280894e501f2709a5cc8f6a161', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268395721', 'in_reply_to_id': 268378831, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5NTcyMQ==', 'commit_id': 'f3bdb6b1b22e94ddbb5cdafe8bfde3ce7efaee0c', 'author_association': 'MEMBER', 'diff_hunk': '@@ -0,0 +1,31 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#pragma once\n+\n+#include <array>\n+#include <deque>\n+#include <functional>\n+#include <memory>\n+#include <string>\n+#include <utility>\n+\n+class NetPlayChatUI\n+{\n+public:\n+  explicit NetPlayChatUI(std::function<void(const std::string&)> callback);\n+  ~NetPlayChatUI() = default;\n+\n+  void Display();\n+  void AppendChat(const std::string& message, const std::string& color);\n+  void SendMessage();\n+\n+private:\n+  char m_message_buf[256] = {};', 'updated_at': '2019-03-23T14:02:20Z', 'original_position': 25, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903#discussion_r268395721', 'created_at': '2019-03-23T14:02:20Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7903#discussion_r268395721'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268395721'}}, 'id': 268395721}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7903}
2019-03-23T12:50:30.281858	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'Android: Fix touch IR', 'author': 'zackhow', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7921#pullrequestreview-218038129', 'comments': [{'pull_request_review_id': 218038129, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7921', 'position': 7, 'body': "I guess in this instance it's ok to use an integer since it's an 'all or nothing' change. I usually use a bool in case a change should only apply once, such as the case in [InputOverlay](https://github.com/dolphin-emu/dolphin/blob/master/Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/overlay/InputOverlay.java#L1086) when setting the default button placements.", 'path': 'Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java', 'original_commit_id': 'd059aaa70095abcdebe10b54b8aa8615bce7d44a', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268393589', 'in_reply_to_id': 268393357, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5MzU4OQ==', 'commit_id': '2fab8d689909a3f0ea9f2ca14dc6e777b791146c', 'author_association': 'MEMBER', 'diff_hunk': '@@ -145,7 +145,20 @@ private static void initializeExternalStorage(Context context)\n     createWiimoteProfileDirectory(profileDirectory);\n \n     copyAsset("GCPadNew.ini", new File(configDirectory, "GCPadNew.ini"), true, context);\n-    copyAsset("WiimoteNew.ini", new File(configDirectory, "WiimoteNew.ini"), false, context);\n+\n+    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\n+    if (!prefs.getBoolean("WiimoteNewV2", false))', 'updated_at': '2019-03-23T12:50:28Z', 'original_position': 7, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7921#discussion_r268393589', 'created_at': '2019-03-23T12:50:28Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/zackhow/followers', 'url': 'https://api.github.com/users/zackhow', 'organizations_url': 'https://api.github.com/users/zackhow/orgs', 'node_id': 'MDQ6VXNlcjQyNzA0NA==', 'events_url': 'https://api.github.com/users/zackhow/events{/privacy}', 'repos_url': 'https://api.github.com/users/zackhow/repos', 'gists_url': 'https://api.github.com/users/zackhow/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/zackhow/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/zackhow/following{/other_user}', 'html_url': 'https://github.com/zackhow', 'gravatar_id': '', 'avatar_url': 'https://avatars0.githubusercontent.com/u/427044?v=4', 'login': 'zackhow', 'subscriptions_url': 'https://api.github.com/users/zackhow/subscriptions', 'starred_url': 'https://api.github.com/users/zackhow/starred{/owner}{/repo}', 'id': 427044}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7921'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7921#discussion_r268393589'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268393589'}}, 'id': 268393589}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7921}
2019-03-23T12:41:31.823187	{'source': 'ghhookparser', 'action': 'submitted', 'pr_title': 'Android: Fix touch IR', 'author': 'JosJuice', 'url': 'https://github.com/dolphin-emu/dolphin/pull/7921#pullrequestreview-218037883', 'comments': [{'pull_request_review_id': 218037883, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7921', 'position': 7, 'body': 'This is pretty ugly, but I guess we don\'t have much choice with the way the controller system currently works on Android...\r\n\r\nMaybe consider having a "WiimoteNewVersion" integer instead of a boolean so it\'ll be a bit cleaner if we need to do the same thing again later?', 'path': 'Source/Android/app/src/main/java/org/dolphinemu/dolphinemu/utils/DirectoryInitialization.java', 'original_commit_id': 'd059aaa70095abcdebe10b54b8aa8615bce7d44a', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268393357', 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODM5MzM1Nw==', 'commit_id': '2fab8d689909a3f0ea9f2ca14dc6e777b791146c', 'author_association': 'MEMBER', 'diff_hunk': '@@ -145,7 +145,20 @@ private static void initializeExternalStorage(Context context)\n     createWiimoteProfileDirectory(profileDirectory);\n \n     copyAsset("GCPadNew.ini", new File(configDirectory, "GCPadNew.ini"), true, context);\n-    copyAsset("WiimoteNew.ini", new File(configDirectory, "WiimoteNew.ini"), false, context);\n+\n+    SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(context);\n+    if (!prefs.getBoolean("WiimoteNewV2", false))', 'updated_at': '2019-03-23T12:41:30Z', 'original_position': 7, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7921#discussion_r268393357', 'created_at': '2019-03-23T12:41:30Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7921'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7921#discussion_r268393357'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268393357'}}, 'id': 268393357}], 'state': 'commented', 'type': 'gh_pull_request_review', 'repo': 'dolphin-emu/dolphin', 'pr_id': 7921}

Recent 'gh_push' events

2019-03-22T20:18:31.268881	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'InputCommon/OSX: Refactor IOKit controller interface', 'removed': [], 'hash': '80fd01c3c36e7925fea1016c7f166b02cabdac74', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/80fd01c3c36e7925fea1016c7f166b02cabdac74', 'modified': ['Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.h', 'Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7918 from spycrab/iokit_refactor\n\nInputCommon/OSX: Refactor IOKit controller interface', 'removed': [], 'hash': '672b582bec0ceecf8228358ef2579f3960c67b23', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/672b582bec0ceecf8228358ef2579f3960c67b23', 'modified': ['Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.h', 'Source/Core/InputCommon/ControllerInterface/OSX/OSXJoystick.mm'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'spycrab', 'before_sha': '0b3385ac1f4f2d40f5d2489d371b745271baad6a', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '672b582bec0ceecf8228358ef2579f3960c67b23'}
2019-03-22T16:44:49.078315	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'DiscExtractor: Fix extracting certificate chain and H3 hashes\n\nDolphin is currently not using this data, but still,\nthe way it was being extracted was not at all correct.', 'removed': [], 'hash': 'c558803cbd86212f1d69c908b2a3b78f9006ad75', 'author': {'email': 'josjuice@gmail.com', 'name': 'JosJuice', 'username': 'JosJuice'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/c558803cbd86212f1d69c908b2a3b78f9006ad75', 'modified': ['Source/Core/DiscIO/DiscExtractor.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7919 from JosJuice/disc-extractor-cert-h3\n\nDiscExtractor: Fix extracting certificate chain and H3 hashes', 'removed': [], 'hash': '0b3385ac1f4f2d40f5d2489d371b745271baad6a', 'author': {'email': 'josjuice@gmail.com', 'name': 'JosJuice', 'username': 'JosJuice'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/0b3385ac1f4f2d40f5d2489d371b745271baad6a', 'modified': ['Source/Core/DiscIO/DiscExtractor.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JosJuice', 'before_sha': '0a1aacb5d007dcc365e1de108632e7a29ed55605', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '0b3385ac1f4f2d40f5d2489d371b745271baad6a'}
2019-03-21T23:26:56.821494	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'DolphinQt/InputCommon: Fix a few memory leaks.', 'removed': [], 'hash': '725d34b2f03999abbfda59cfba37988258812e20', 'author': {'email': 'jordan.woyak@gmail.com', 'name': 'Jordan Woyak', 'username': 'jordan-woyak'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/725d34b2f03999abbfda59cfba37988258812e20', 'modified': ['Source/Core/DolphinQt/Config/GameConfigEdit.cpp', 'Source/Core/DolphinQt/Config/InfoWidget.cpp', 'Source/Core/DolphinQt/GameList/GameList.cpp', 'Source/Core/DolphinQt/MainWindow.cpp', 'Source/Core/DolphinQt/MenuBar.cpp', 'Source/Core/DolphinQt/QtUtils/DoubleClickEventFilter.cpp', 'Source/Core/DolphinQt/QtUtils/DoubleClickEventFilter.h', 'Source/Core/DolphinQt/QtUtils/WindowActivationEventFilter.cpp', 'Source/Core/DolphinQt/QtUtils/WindowActivationEventFilter.h', 'Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7906 from jordan-woyak/leak-fix\n\nDolphinQt/InputCommon: Fix a few memory leaks.', 'removed': [], 'hash': '0a1aacb5d007dcc365e1de108632e7a29ed55605', 'author': {'email': 'tilkax@gmail.com', 'name': 'Tilka', 'username': 'Tilka'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/0a1aacb5d007dcc365e1de108632e7a29ed55605', 'modified': ['Source/Core/DolphinQt/Config/GameConfigEdit.cpp', 'Source/Core/DolphinQt/Config/InfoWidget.cpp', 'Source/Core/DolphinQt/GameList/GameList.cpp', 'Source/Core/DolphinQt/MainWindow.cpp', 'Source/Core/DolphinQt/MenuBar.cpp', 'Source/Core/DolphinQt/QtUtils/DoubleClickEventFilter.cpp', 'Source/Core/DolphinQt/QtUtils/DoubleClickEventFilter.h', 'Source/Core/DolphinQt/QtUtils/WindowActivationEventFilter.cpp', 'Source/Core/DolphinQt/QtUtils/WindowActivationEventFilter.h', 'Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'Tilka', 'before_sha': '87cf94ec866844eee39ab69d5da17af4ace80443', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '0a1aacb5d007dcc365e1de108632e7a29ed55605'}
2019-03-21T23:22:19.055147	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'TextureCacheBase: Fix infinite loop in DoPartialTextureUpdates', 'removed': [], 'hash': 'bf0b52efc61bf1fc32c36358f4e5e6ac48636ff5', 'author': {'email': 'stenzek@gmail.com', 'name': 'Stenzek', 'username': 'stenzek'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/bf0b52efc61bf1fc32c36358f4e5e6ac48636ff5', 'modified': ['Source/Core/VideoCommon/TextureCacheBase.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7914 from stenzek/partial-update-infinite-loop\n\nTextureCacheBase: Fix infinite loop in DoPartialTextureUpdates', 'removed': [], 'hash': '87cf94ec866844eee39ab69d5da17af4ace80443', 'author': {'email': 'tilkax@gmail.com', 'name': 'Tilka', 'username': 'Tilka'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/87cf94ec866844eee39ab69d5da17af4ace80443', 'modified': ['Source/Core/VideoCommon/TextureCacheBase.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'Tilka', 'before_sha': 'b016417106be29876e24ca6d2b70dd8db8db5323', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '87cf94ec866844eee39ab69d5da17af4ace80443'}
2019-03-21T23:20:51.556033	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'DolphinQt: Make Ctrl+F show the game list search and select the search text if already open. Escape closes.', 'removed': [], 'hash': '94c4975b5dce974784c80ca97fe97f30d75ea228', 'author': {'email': 'jordan.woyak@gmail.com', 'name': 'Jordan Woyak', 'username': 'jordan-woyak'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/94c4975b5dce974784c80ca97fe97f30d75ea228', 'modified': ['Source/Core/DolphinQt/MainWindow.cpp', 'Source/Core/DolphinQt/MenuBar.cpp', 'Source/Core/DolphinQt/MenuBar.h', 'Source/Core/DolphinQt/SearchBar.cpp', 'Source/Core/DolphinQt/SearchBar.h'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7907 from jordan-woyak/search-close-with-esc\n\nDolphinQt: Make Ctrl+F show the game list search and escape close it.', 'removed': [], 'hash': 'b016417106be29876e24ca6d2b70dd8db8db5323', 'author': {'email': 'tilkax@gmail.com', 'name': 'Tilka', 'username': 'Tilka'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/b016417106be29876e24ca6d2b70dd8db8db5323', 'modified': ['Source/Core/DolphinQt/MainWindow.cpp', 'Source/Core/DolphinQt/MenuBar.cpp', 'Source/Core/DolphinQt/MenuBar.h', 'Source/Core/DolphinQt/SearchBar.cpp', 'Source/Core/DolphinQt/SearchBar.h'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'Tilka', 'before_sha': '094c852158a232ccef2037207f26ee3bc90fa07b', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': 'b016417106be29876e24ca6d2b70dd8db8db5323'}
2019-03-21T22:42:08.512971	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'MacUpdater: Fix updater not closing after update is completed', 'removed': [], 'hash': '544f6d547d9ed415662cda5e240f04f84bd46075', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/544f6d547d9ed415662cda5e240f04f84bd46075', 'modified': ['Source/Core/MacUpdater/MacUI.mm'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7916 from spycrab/issue_11623\n\nMacUpdater: Fix updater not closing after update is completed', 'removed': [], 'hash': '094c852158a232ccef2037207f26ee3bc90fa07b', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/094c852158a232ccef2037207f26ee3bc90fa07b', 'modified': ['Source/Core/MacUpdater/MacUI.mm'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'spycrab', 'before_sha': '8713a752f30f1b1ca972948f4d2c7898ff32db1a', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '094c852158a232ccef2037207f26ee3bc90fa07b'}
2019-03-21T13:41:50.923472	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'Qt/AudioPane: Fix volume box not keeping consistent width', 'removed': [], 'hash': 'd1f7f0fcc0f50312291fcaf0663e033c685e3336', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/d1f7f0fcc0f50312291fcaf0663e033c685e3336', 'modified': ['Source/Core/DolphinQt/Settings/AudioPane.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7917 from spycrab/issue_11628\n\nQt/AudioPane: Fix volume box not keeping consistent width', 'removed': [], 'hash': '8713a752f30f1b1ca972948f4d2c7898ff32db1a', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/8713a752f30f1b1ca972948f4d2c7898ff32db1a', 'modified': ['Source/Core/DolphinQt/Settings/AudioPane.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'spycrab', 'before_sha': 'fcd0dbef2c9861431f3207d69260766309ad0134', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '8713a752f30f1b1ca972948f4d2c7898ff32db1a'}
2019-03-20T22:53:03.883052	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'Qt/Mapping: Use QGridLayout in a few more places', 'removed': [], 'hash': 'e8b3c6cb3ec7fdbe9e2f8db128e6c1efbc43817e', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/e8b3c6cb3ec7fdbe9e2f8db128e6c1efbc43817e', 'modified': ['Source/Core/DolphinQt/Config/Mapping/GCPadEmu.cpp', 'Source/Core/DolphinQt/Config/Mapping/GCPadEmu.h', 'Source/Core/DolphinQt/Config/Mapping/HotkeyDebugging.cpp', 'Source/Core/DolphinQt/Config/Mapping/HotkeyDebugging.h', 'Source/Core/DolphinQt/Config/Mapping/HotkeyGeneral.cpp', 'Source/Core/DolphinQt/Config/Mapping/HotkeyGeneral.h', 'Source/Core/DolphinQt/Config/Mapping/HotkeyGraphics.cpp', 'Source/Core/DolphinQt/Config/Mapping/HotkeyGraphics.h', 'Source/Core/DolphinQt/Config/Mapping/WiimoteEmuExtension.cpp', 'Source/Core/DolphinQt/Config/Mapping/WiimoteEmuGeneral.cpp', 'Source/Core/DolphinQt/Config/Mapping/WiimoteEmuGeneral.h'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7901 from spycrab/issue_11585\n\nQt/Mapping: Use QGridLayout in a few more places', 'removed': [], 'hash': 'fcd0dbef2c9861431f3207d69260766309ad0134', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/fcd0dbef2c9861431f3207d69260766309ad0134', 'modified': ['Source/Core/DolphinQt/Config/Mapping/GCPadEmu.cpp', 'Source/Core/DolphinQt/Config/Mapping/GCPadEmu.h', 'Source/Core/DolphinQt/Config/Mapping/HotkeyDebugging.cpp', 'Source/Core/DolphinQt/Config/Mapping/HotkeyDebugging.h', 'Source/Core/DolphinQt/Config/Mapping/HotkeyGeneral.cpp', 'Source/Core/DolphinQt/Config/Mapping/HotkeyGeneral.h', 'Source/Core/DolphinQt/Config/Mapping/HotkeyGraphics.cpp', 'Source/Core/DolphinQt/Config/Mapping/HotkeyGraphics.h', 'Source/Core/DolphinQt/Config/Mapping/WiimoteEmuExtension.cpp', 'Source/Core/DolphinQt/Config/Mapping/WiimoteEmuGeneral.cpp', 'Source/Core/DolphinQt/Config/Mapping/WiimoteEmuGeneral.h'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'spycrab', 'before_sha': '96fec2eb708648d6b75da0d2a523c2c7c9d5088c', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': 'fcd0dbef2c9861431f3207d69260766309ad0134'}
2019-03-19T21:24:04.901441	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'ControllerInterface: Unbreak DirectInput POV Hats having bad values on init.', 'removed': [], 'hash': 'b53636827b2f37b0398c03eb630c1d70fcc6a046', 'author': {'email': 'jordan.woyak@gmail.com', 'name': 'Jordan Woyak', 'username': 'jordan-woyak'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/b53636827b2f37b0398c03eb630c1d70fcc6a046', 'modified': ['Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7913 from jordan-woyak/dinput-hat-fix\n\nControllerInterface: Unbreak DirectInput POV Hats having bad values on init.', 'removed': [], 'hash': '96fec2eb708648d6b75da0d2a523c2c7c9d5088c', 'author': {'email': 'JMC4789@gmail.com', 'name': 'JMC47', 'username': 'JMC47'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/96fec2eb708648d6b75da0d2a523c2c7c9d5088c', 'modified': ['Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JMC47', 'before_sha': '1fead4ffb6c17a526185113b1192816ffafd5c49', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '96fec2eb708648d6b75da0d2a523c2c7c9d5088c'}
2019-03-18T22:01:02.570050	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': "Disable Defer EFB Copies to RAM for Majora's Mask (VC)\n\nDefer EFB Copies to RAM being enabled causes graphical issues during Majora's Mask's screen shrinking effect.", 'removed': [], 'hash': 'cf9f0dc0adc71af6c2e1795d1361fb7c4cf542b4', 'author': {'email': '38867833+master0fdisaster@users.noreply.github.com', 'name': 'master0fdisaster', 'username': 'master0fdisaster'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/cf9f0dc0adc71af6c2e1795d1361fb7c4cf542b4', 'modified': ['Data/Sys/GameSettings/NAR.ini'], 'distinct': True, 'added': []}, {'message': "Merge pull request #7912 from master0fdisaster/master\n\nDisable Defer EFB Copies to RAM for Majora's Mask (VC)", 'removed': [], 'hash': '1fead4ffb6c17a526185113b1192816ffafd5c49', 'author': {'email': 'JMC4789@gmail.com', 'name': 'JMC47', 'username': 'JMC47'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/1fead4ffb6c17a526185113b1192816ffafd5c49', 'modified': ['Data/Sys/GameSettings/NAR.ini'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JMC47', 'before_sha': 'c54710844bea4c6dd2e7ddf5c4ad1d9dba7a0487', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '1fead4ffb6c17a526185113b1192816ffafd5c49'}
2019-03-18T20:59:30.181411	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'Added DPL2 decoder to XAudio2 and XAudio2_7 backends.', 'removed': [], 'hash': 'f37ff190e425bb695fb7c2b23c0a74f234149f99', 'author': {'email': 'lagonauta@gmail.com', 'name': 'LAGonauta', 'username': 'LAGonauta'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/f37ff190e425bb695fb7c2b23c0a74f234149f99', 'modified': ['Source/Core/AudioCommon/XAudio2Stream.cpp', 'Source/Core/AudioCommon/XAudio2_7Stream.cpp'], 'distinct': True, 'added': []}, {'message': 'Allow XAudio2 to be selected as a surround backend.', 'removed': [], 'hash': '99a35568ca9ff846f95b59f6e34a7d94059c19bc', 'author': {'email': 'lagonauta@gmail.com', 'name': 'LAGonauta', 'username': 'LAGonauta'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/99a35568ca9ff846f95b59f6e34a7d94059c19bc', 'modified': ['Source/Core/AudioCommon/AudioCommon.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #6171 from LAGonauta/xaudio2-surround\n\nAdded DPL2 decoder to XAudio2 and XAudio2_7 backends.', 'removed': [], 'hash': 'c54710844bea4c6dd2e7ddf5c4ad1d9dba7a0487', 'author': {'email': 'godisgovernment@gmail.com', 'name': 'shuffle2', 'username': 'shuffle2'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/c54710844bea4c6dd2e7ddf5c4ad1d9dba7a0487', 'modified': ['Source/Core/AudioCommon/AudioCommon.cpp', 'Source/Core/AudioCommon/XAudio2Stream.cpp', 'Source/Core/AudioCommon/XAudio2_7Stream.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'shuffle2', 'before_sha': '54e09886d8fdaa1eefbb28e19165fdea4900b61a', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': 'c54710844bea4c6dd2e7ddf5c4ad1d9dba7a0487'}
2019-03-17T01:41:17.337427	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'Qt/MD5Dialog: Make dialog modal', 'removed': [], 'hash': 'c4036d2d6a2cd147cc9a632d653d9dcd47e97625', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/c4036d2d6a2cd147cc9a632d653d9dcd47e97625', 'modified': ['Source/Core/DolphinQt/NetPlay/MD5Dialog.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7902 from spycrab/qt_modal_md5\n\nQt/MD5Dialog: Make dialog modal', 'removed': [], 'hash': '54e09886d8fdaa1eefbb28e19165fdea4900b61a', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/54e09886d8fdaa1eefbb28e19165fdea4900b61a', 'modified': ['Source/Core/DolphinQt/NetPlay/MD5Dialog.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'spycrab', 'before_sha': '7acefe8a289e691517412a7b79ef3bbfd1acb26d', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '54e09886d8fdaa1eefbb28e19165fdea4900b61a'}
2019-03-16T17:09:30.746096	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'Qt/NetPlayDialog: Prevent players from sending empty chat messages', 'removed': [], 'hash': 'e64b6d27c867ffcae55bc9e9940f4940ce8bd608', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/e64b6d27c867ffcae55bc9e9940f4940ce8bd608', 'modified': ['Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7898 from spycrab/qt_netplay_empty_chat\n\nQt/NetPlayDialog: Prevent players from sending empty chat messages', 'removed': [], 'hash': '7acefe8a289e691517412a7b79ef3bbfd1acb26d', 'author': {'email': 'JMC4789@gmail.com', 'name': 'JMC47', 'username': 'JMC47'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/7acefe8a289e691517412a7b79ef3bbfd1acb26d', 'modified': ['Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JMC47', 'before_sha': 'a40b5f913396181e384095df98c7c43757b14c75', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '7acefe8a289e691517412a7b79ef3bbfd1acb26d'}
2019-03-16T16:57:25.738955	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'Qt/GeneralPane: Align "Auto Update" on macOS', 'removed': [], 'hash': '502cba255f6f96a23f8f9249a57fbf756174b843', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/502cba255f6f96a23f8f9249a57fbf756174b843', 'modified': ['Source/Core/DolphinQt/Settings/GeneralPane.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7900 from spycrab/qt_general_align\n\nQt/GeneralPane: Align "Auto Update" on macOS', 'removed': [], 'hash': 'a40b5f913396181e384095df98c7c43757b14c75', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/a40b5f913396181e384095df98c7c43757b14c75', 'modified': ['Source/Core/DolphinQt/Settings/GeneralPane.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'spycrab', 'before_sha': 'ae533185c44a06a9ac01da1861dca3bc22c01fda', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': 'a40b5f913396181e384095df98c7c43757b14c75'}
2019-03-16T16:12:32.536498	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': "Qt/NetPlayDialog: Don't bold the player table headers", 'removed': [], 'hash': '2046f93de8058fb7f1b002dd69cf01130f0eff18', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/2046f93de8058fb7f1b002dd69cf01130f0eff18', 'modified': ['Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp'], 'distinct': True, 'added': []}, {'message': "Merge pull request #7899 from spycrab/qt_netplay_bold\n\nQt/NetPlayDialog: Don't bold the player table headers", 'removed': [], 'hash': 'ae533185c44a06a9ac01da1861dca3bc22c01fda', 'author': {'email': 'JMC4789@gmail.com', 'name': 'JMC47', 'username': 'JMC47'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/ae533185c44a06a9ac01da1861dca3bc22c01fda', 'modified': ['Source/Core/DolphinQt/NetPlay/NetPlayDialog.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JMC47', 'before_sha': '2a9f01c1ba7efe8377731d55c4fb805361c6cc61', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': 'ae533185c44a06a9ac01da1861dca3bc22c01fda'}
2019-03-16T16:07:44.945087	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'Qt/PadMappingDialog: Improve layout', 'removed': [], 'hash': '19dfd4d7ab36169a93c8546df8b6f37bfdc65da3', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/19dfd4d7ab36169a93c8546df8b6f37bfdc65da3', 'modified': ['Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7897 from spycrab/qt_mapping_dialog\n\nQt/PadMappingDialog: Improve layout', 'removed': [], 'hash': '2a9f01c1ba7efe8377731d55c4fb805361c6cc61', 'author': {'email': 'JMC4789@gmail.com', 'name': 'JMC47', 'username': 'JMC47'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/2a9f01c1ba7efe8377731d55c4fb805361c6cc61', 'modified': ['Source/Core/DolphinQt/NetPlay/PadMappingDialog.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JMC47', 'before_sha': 'e31ae0b3a0c26402f6a5be73a1546fa4b7c2f817', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '2a9f01c1ba7efe8377731d55c4fb805361c6cc61'}
2019-03-16T14:20:57.620980	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'Translation resources sync with Transifex', 'removed': [], 'hash': 'e31ae0b3a0c26402f6a5be73a1546fa4b7c2f817', 'author': {'email': 'josjuice@gmail.com', 'name': 'JosJuice', 'username': 'JosJuice'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/e31ae0b3a0c26402f6a5be73a1546fa4b7c2f817', 'modified': ['Languages/po/ar.po', 'Languages/po/ca.po', 'Languages/po/cs.po', 'Languages/po/da.po', 'Languages/po/de.po', 'Languages/po/dolphin-emu.pot', 'Languages/po/el.po', 'Languages/po/en.po', 'Languages/po/es.po', 'Languages/po/fa.po', 'Languages/po/fr.po', 'Languages/po/hr.po', 'Languages/po/hu.po', 'Languages/po/it.po', 'Languages/po/ja.po', 'Languages/po/ko.po', 'Languages/po/ms.po', 'Languages/po/nb.po', 'Languages/po/nl.po', 'Languages/po/pl.po', 'Languages/po/pt.po', 'Languages/po/pt_BR.po', 'Languages/po/ro.po', 'Languages/po/ru.po', 'Languages/po/sr.po', 'Languages/po/sv.po', 'Languages/po/tr.po', 'Languages/po/zh_CN.po', 'Languages/po/zh_TW.po'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JosJuice', 'before_sha': '08ca9ec21f3e94a4b1f37ef5a582db14900e22b3', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': 'e31ae0b3a0c26402f6a5be73a1546fa4b7c2f817'}
2019-03-16T13:58:18.443211	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'DolphinQt: Save movie when closing emulation\n\nMissing feature from DolphinWX.', 'removed': [], 'hash': '6c89957cf1a1c768d6cfc216dd4d466eb2f75ae0', 'author': {'email': 'josjuice@gmail.com', 'name': 'JosJuice', 'username': 'JosJuice'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/6c89957cf1a1c768d6cfc216dd4d466eb2f75ae0', 'modified': ['Source/Core/DolphinQt/MainWindow.cpp'], 'distinct': True, 'added': []}, {'message': 'DolphinQt: Fix OnStopRecording/OnExportRecording logic', 'removed': [], 'hash': '185b1cf90c0f9a786f98c9658bfb4b0fb6963ac8', 'author': {'email': 'josjuice@gmail.com', 'name': 'JosJuice', 'username': 'JosJuice'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/185b1cf90c0f9a786f98c9658bfb4b0fb6963ac8', 'modified': ['Source/Core/DolphinQt/MainWindow.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7884 from JosJuice/save-movie-on-exit\n\nDolphinQt: Save movie when closing emulation', 'removed': [], 'hash': '08ca9ec21f3e94a4b1f37ef5a582db14900e22b3', 'author': {'email': 'josjuice@gmail.com', 'name': 'JosJuice', 'username': 'JosJuice'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/08ca9ec21f3e94a4b1f37ef5a582db14900e22b3', 'modified': ['Source/Core/DolphinQt/MainWindow.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JosJuice', 'before_sha': '861fc42fc92258b71d2c3067dd97f4371f895175', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '08ca9ec21f3e94a4b1f37ef5a582db14900e22b3'}
2019-03-15T23:26:03.640723	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'Use proper view type of framebuffer images', 'removed': [], 'hash': '4173a8f54537e01cca5d52b69dfb7a9f98f08a47', 'author': {'email': 'kvarkus@gmail.com', 'name': 'Dzmitry Malyshau', 'username': 'kvark'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/4173a8f54537e01cca5d52b69dfb7a9f98f08a47', 'modified': ['Source/Core/VideoBackends/Vulkan/VKTexture.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7891 from kvark/vk-frame-view\n\n[vk] Use proper view type of framebuffer images', 'removed': [], 'hash': '861fc42fc92258b71d2c3067dd97f4371f895175', 'author': {'email': 'stenzek@gmail.com', 'name': 'Connor McLaughlin', 'username': 'stenzek'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/861fc42fc92258b71d2c3067dd97f4371f895175', 'modified': ['Source/Core/VideoBackends/Vulkan/VKTexture.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'stenzek', 'before_sha': 'c71216419bdf1d64520c289a2e1234b981c826ea', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '861fc42fc92258b71d2c3067dd97f4371f895175'}
2019-03-15T22:17:06.074305	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'change pixel format from BGRA to BGR0\n\nfor this kind of footage carrying alpha information makes no sense, and it additionally complicates things by hugely damaging compatibility of the resulting video. after this change alone the video becomes compatible with VfW/WinAPI and tools that rely on it (avisynth, virtualdub).\n\nfixes https://bugs.dolphin-emu.org/issues/11141 and https://bugs.dolphin-emu.org/issues/10193', 'removed': [], 'hash': '005e60fa22ed3df7c6e435036b0aa75a37a923f9', 'author': {'email': 'feos-theos@yandex.ru', 'name': 'feos', 'username': 'vadosnaprimer'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/005e60fa22ed3df7c6e435036b0aa75a37a923f9', 'modified': ['Source/Core/VideoCommon/AVIDump.cpp'], 'distinct': True, 'added': []}, {'message': 'decrease gop size (keyint)\n\nthis makes seeking a lot smoother (especially at high resolutions), while only adding less than 1% of filesize with this codec.', 'removed': [], 'hash': '7fd940411b375e2d7b17b6d219927842d95a1ee2', 'author': {'email': 'feos-theos@yandex.ru', 'name': 'feos', 'username': 'vadosnaprimer'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/7fd940411b375e2d7b17b6d219927842d95a1ee2', 'modified': ['Source/Core/VideoCommon/AVIDump.cpp'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7874 from vadosnaprimer/ffv1_fix\n\nFFV1 fix', 'removed': [], 'hash': 'c71216419bdf1d64520c289a2e1234b981c826ea', 'author': {'email': 'josjuice@gmail.com', 'name': 'JosJuice', 'username': 'JosJuice'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/c71216419bdf1d64520c289a2e1234b981c826ea', 'modified': ['Source/Core/VideoCommon/AVIDump.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JosJuice', 'before_sha': 'c57e5701cd01a9147cac77fa110a442d68f1ef73', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': 'c71216419bdf1d64520c289a2e1234b981c826ea'}
2019-03-15T18:25:22.870378	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': "Qt/GameList: Implement 'Open gamecube save folder'", 'removed': [], 'hash': '90522a76661cb85c48d95052ab1de94475b19477', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/90522a76661cb85c48d95052ab1de94475b19477', 'modified': ['Source/Core/DolphinQt/GameList/GameList.cpp', 'Source/Core/DolphinQt/GameList/GameList.h'], 'distinct': True, 'added': []}, {'message': "Merge pull request #7879 from spycrab/open_gc_save_folder\n\nQt/GameList: Implement 'Open gamecube save folder'", 'removed': [], 'hash': 'c57e5701cd01a9147cac77fa110a442d68f1ef73', 'author': {'email': 'tilkax@gmail.com', 'name': 'Tilka', 'username': 'Tilka'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/c57e5701cd01a9147cac77fa110a442d68f1ef73', 'modified': ['Source/Core/DolphinQt/GameList/GameList.cpp', 'Source/Core/DolphinQt/GameList/GameList.h'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'Tilka', 'before_sha': '011ecd92e8e2b0b78471cc7ad394b6ed1f7a451e', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': 'c57e5701cd01a9147cac77fa110a442d68f1ef73'}
2019-03-13T23:00:27.150863	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'ControllerInterface: Input detection improvements.', 'removed': [], 'hash': '48b69ca01841ba724049895a83d8d88ec95d66de', 'author': {'email': 'jordan.woyak@gmail.com', 'name': 'Jordan Woyak', 'username': 'jordan-woyak'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/48b69ca01841ba724049895a83d8d88ec95d66de', 'modified': ['Source/Core/InputCommon/ControlReference/ControlReference.cpp', 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp', 'Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.cpp', 'Source/Core/InputCommon/ControllerInterface/Device.cpp', 'Source/Core/InputCommon/ControllerInterface/Device.h', 'Source/Core/InputCommon/ControllerInterface/XInput/XInput.cpp', 'Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp'], 'distinct': True, 'added': []}, {'message': 'ControllerInterface/DolphinQt: Make mapping "all devices" way less hacky.', 'removed': [], 'hash': 'c389d68186ea7fa95d763d7bb55bc09e5a45c4cd', 'author': {'email': 'jordan.woyak@gmail.com', 'name': 'Jordan Woyak', 'username': 'jordan-woyak'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/c389d68186ea7fa95d763d7bb55bc09e5a45c4cd', 'modified': ['Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp', 'Source/Core/DolphinQt/Config/Mapping/IOWindow.h', 'Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp', 'Source/Core/DolphinQt/Config/Mapping/MappingButton.h', 'Source/Core/DolphinQt/Config/Mapping/MappingCommon.cpp', 'Source/Core/DolphinQt/Config/Mapping/MappingCommon.h', 'Source/Core/InputCommon/ControlReference/ControlReference.cpp', 'Source/Core/InputCommon/ControlReference/ControlReference.h', 'Source/Core/InputCommon/ControllerInterface/Device.cpp', 'Source/Core/InputCommon/ControllerInterface/Device.h'], 'distinct': True, 'added': []}, {'message': 'Merge pull request #7829 from jordan-woyak/detect-input-improve\n\nControllerInterface/DolphinQt: Improve input detection.', 'removed': [], 'hash': '011ecd92e8e2b0b78471cc7ad394b6ed1f7a451e', 'author': {'email': 'JMC4789@gmail.com', 'name': 'JMC47', 'username': 'JMC47'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/011ecd92e8e2b0b78471cc7ad394b6ed1f7a451e', 'modified': ['Source/Core/DolphinQt/Config/Mapping/IOWindow.cpp', 'Source/Core/DolphinQt/Config/Mapping/IOWindow.h', 'Source/Core/DolphinQt/Config/Mapping/MappingButton.cpp', 'Source/Core/DolphinQt/Config/Mapping/MappingButton.h', 'Source/Core/DolphinQt/Config/Mapping/MappingCommon.cpp', 'Source/Core/DolphinQt/Config/Mapping/MappingCommon.h', 'Source/Core/InputCommon/ControlReference/ControlReference.cpp', 'Source/Core/InputCommon/ControlReference/ControlReference.h', 'Source/Core/InputCommon/ControlReference/ExpressionParser.cpp', 'Source/Core/InputCommon/ControllerInterface/DInput/DInputJoystick.cpp', 'Source/Core/InputCommon/ControllerInterface/Device.cpp', 'Source/Core/InputCommon/ControllerInterface/Device.h', 'Source/Core/InputCommon/ControllerInterface/XInput/XInput.cpp', 'Source/Core/InputCommon/ControllerInterface/evdev/evdev.cpp'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JMC47', 'before_sha': 'bc9e9caf19749778d01b9721a1ff92acccf70fac', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '011ecd92e8e2b0b78471cc7ad394b6ed1f7a451e'}
2019-03-13T20:41:08.951840	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': "UICommon/ResourcePack: Mark ResourcePack's operator== as const", 'removed': [], 'hash': '9d096a5e1672266ea58185e361230c8a58f0e8d9', 'author': {'email': 'mathew1800@gmail.com', 'name': 'Lioncash', 'username': 'lioncash'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/9d096a5e1672266ea58185e361230c8a58f0e8d9', 'modified': ['Source/Core/UICommon/ResourcePack/ResourcePack.cpp', 'Source/Core/UICommon/ResourcePack/ResourcePack.h'], 'distinct': True, 'added': []}, {'message': 'UICommon/ResourcePack: Provide inequality operator to complement equality operator\n\nProvides symmetrical behavior with the equality operator.', 'removed': [], 'hash': '6045b442034d1baa9c88b37b4b271dda4ed240c2', 'author': {'email': 'mathew1800@gmail.com', 'name': 'Lioncash', 'username': 'lioncash'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/6045b442034d1baa9c88b37b4b271dda4ed240c2', 'modified': ['Source/Core/UICommon/ResourcePack/ResourcePack.cpp', 'Source/Core/UICommon/ResourcePack/ResourcePack.h'], 'distinct': True, 'added': []}, {'message': "Merge pull request #7888 from lioncash/const\n\n UICommon/ResourcePack: Mark ResourcePack's operator== as const", 'removed': [], 'hash': 'bc9e9caf19749778d01b9721a1ff92acccf70fac', 'author': {'email': 'josjuice@gmail.com', 'name': 'JosJuice', 'username': 'JosJuice'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/bc9e9caf19749778d01b9721a1ff92acccf70fac', 'modified': ['Source/Core/UICommon/ResourcePack/ResourcePack.cpp', 'Source/Core/UICommon/ResourcePack/ResourcePack.h'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'JosJuice', 'before_sha': '635afc1db458a61a6ed02e1ce1638c817dfa39e5', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': 'bc9e9caf19749778d01b9721a1ff92acccf70fac'}
2019-03-13T20:19:23.558883	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': "Qt: Don't use 'Dark Mode'", 'removed': [], 'hash': '339914f56de129f395b4407efce19c311301a832', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/339914f56de129f395b4407efce19c311301a832', 'modified': ['Source/Core/DolphinQt/Info.plist.in'], 'distinct': True, 'added': []}, {'message': "Merge pull request #7883 from spycrab/qt_no_dark_mode\n\nQt: Don't use 'Dark Mode'", 'removed': [], 'hash': '635afc1db458a61a6ed02e1ce1638c817dfa39e5', 'author': {'email': 'spycrab@users.noreply.github.com', 'name': 'spycrab', 'username': 'spycrab'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/635afc1db458a61a6ed02e1ce1638c817dfa39e5', 'modified': ['Source/Core/DolphinQt/Info.plist.in'], 'distinct': True, 'added': []}], 'deleted': False, 'pusher': 'spycrab', 'before_sha': '7b354fa7ac9fd1a5430d9e1fbf089f7f30ec8d9f', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '635afc1db458a61a6ed02e1ce1638c817dfa39e5'}
2019-03-13T18:12:56.055787	{'ref_name': 'master', 'source': 'ghhookparser', 'ref_type': 'heads', 'base_ref_name': None, 'commits': [{'message': 'PowerPC: Factor out CR helpers into POD class', 'removed': [], 'hash': 'e3075f38346d53d98d316a71b55b14fa10ac4210', 'author': {'email': 'dolphin@crystalgamma.de', 'name': 'CrystalGamma'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/e3075f38346d53d98d316a71b55b14fa10ac4210', 'modified': ['Source/Core/Core/CMakeLists.txt', 'Source/Core/Core/Core.vcxproj', 'Source/Core/Core/GeckoCode.cpp', 'Source/Core/Core/HLE/HLE_Misc.cpp', 'Source/Core/Core/HLE/HLE_VarArgs.cpp', 'Source/Core/Core/PowerPC/GDBStub.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_Branch.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_FPUtils.h', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_Integer.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_LoadStore.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_SystemRegisters.cpp', 'Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp', 'Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp', 'Source/Core/Core/PowerPC/Jit64/Jit_SystemRegisters.cpp', 'Source/Core/Core/PowerPC/Jit64Common/Jit64AsmCommon.cpp', 'Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp', 'Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp', 'Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp', 'Source/Core/Core/PowerPC/PPCTables.cpp', 'Source/Core/Core/PowerPC/PowerPC.cpp', 'Source/Core/Core/PowerPC/PowerPC.h', 'Source/Core/DolphinQt/Debugger/CodeWidget.cpp', 'Source/Core/DolphinQt/Debugger/RegisterWidget.cpp'], 'distinct': True, 'added': ['Source/Core/Core/PowerPC/ConditionRegister.cpp', 'Source/Core/Core/PowerPC/ConditionRegister.h']}, {'message': 'Merge pull request #7637 from CrystalGamma/pr-crhelpers\n\nPowerPC: Factor out CR helpers into POD class', 'removed': [], 'hash': '7b354fa7ac9fd1a5430d9e1fbf089f7f30ec8d9f', 'author': {'email': 'tilkax@gmail.com', 'name': 'Tilka', 'username': 'Tilka'}, 'url': 'https://github.com/dolphin-emu/dolphin/commit/7b354fa7ac9fd1a5430d9e1fbf089f7f30ec8d9f', 'modified': ['Source/Core/Core/CMakeLists.txt', 'Source/Core/Core/Core.vcxproj', 'Source/Core/Core/GeckoCode.cpp', 'Source/Core/Core/HLE/HLE_Misc.cpp', 'Source/Core/Core/HLE/HLE_VarArgs.cpp', 'Source/Core/Core/PowerPC/GDBStub.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_Branch.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_FPUtils.h', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_FloatingPoint.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_Integer.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_LoadStore.cpp', 'Source/Core/Core/PowerPC/Interpreter/Interpreter_SystemRegisters.cpp', 'Source/Core/Core/PowerPC/Jit64/Jit_FloatingPoint.cpp', 'Source/Core/Core/PowerPC/Jit64/Jit_Integer.cpp', 'Source/Core/Core/PowerPC/Jit64/Jit_SystemRegisters.cpp', 'Source/Core/Core/PowerPC/Jit64Common/Jit64AsmCommon.cpp', 'Source/Core/Core/PowerPC/JitArm64/JitArm64_FloatingPoint.cpp', 'Source/Core/Core/PowerPC/JitArm64/JitArm64_RegCache.cpp', 'Source/Core/Core/PowerPC/JitArm64/JitArm64_SystemRegisters.cpp', 'Source/Core/Core/PowerPC/PPCTables.cpp', 'Source/Core/Core/PowerPC/PowerPC.cpp', 'Source/Core/Core/PowerPC/PowerPC.h', 'Source/Core/DolphinQt/Debugger/CodeWidget.cpp', 'Source/Core/DolphinQt/Debugger/RegisterWidget.cpp'], 'distinct': True, 'added': ['Source/Core/Core/PowerPC/ConditionRegister.cpp', 'Source/Core/Core/PowerPC/ConditionRegister.h']}], 'deleted': False, 'pusher': 'Tilka', 'before_sha': '7eae5b91d697511570f204d08f36f79ca1a7af5c', 'repo': 'dolphin-emu/dolphin', 'forced': False, 'created': False, 'type': 'gh_push', 'after_sha': '7b354fa7ac9fd1a5430d9e1fbf089f7f30ec8d9f'}

Recent 'internal_log' events

2019-03-23T19:16:13.810252	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:16:13.261546	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:40.752813	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:40.205032	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:36.256496	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:35.528354	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:04.844619	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:15:04.278801	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:14:18.902144	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:40.788250	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:40.250487	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:39.723658	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:39.147420	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:38.114500	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 59, 'pathname': '/home/central/sadm/central/buildbot.py', 'args': "('/home/buildbot/pr-jobdir/new/cf9a47a3-f864-4c09-81e0-acd0e322dda3',)", 'msg': 'Sent build request: %r'}
2019-03-23T19:13:37.488591	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:37.486164	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 77, 'pathname': '/home/central/sadm/central/buildbot.py', 'args': "(7903, None, 'unknown')", 'msg': 'PR %s mergeable: %s (%s)'}
2019-03-23T19:13:36.732505	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:07.829625	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:07.826949	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 196, 'pathname': '/home/central/sadm/central/github.py', 'args': '()', 'msg': "Watched repo 'dolphin-emu/gcdsp-ida' has our hook installed"}
2019-03-23T19:13:07.278514	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:06.616440	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:06.613975	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 196, 'pathname': '/home/central/sadm/central/github.py', 'args': '()', 'msg': "Watched repo 'dolphin-emu/hwtests' has our hook installed"}
2019-03-23T19:13:05.918520	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:05.308193	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 657, 'pathname': '/home/central/venv/lib/python3.5/site-packages/requests/packages/urllib3/connectionpool.py', 'args': '()', 'msg': 'Starting new HTTPS connection (1): api.github.com'}
2019-03-23T19:13:05.305045	{'level': 'INFO', 'source': 'logging', 'type': 'internal_log', 'lineno': 196, 'pathname': '/home/central/sadm/central/github.py', 'args': '()', 'msg': "Watched repo 'dolphin-emu/www' has our hook installed"}

Recent 'irc_message' events

2019-03-23T18:24:43.014984	{'source': 'ircclient', 'type': 'irc_message', 'who': 'spycrab0', 'direct': False, 'what': 'Stenzek: Do you know of any reliable way to wait until g_renderer is initialized?', 'modes': {'o'}, 'where': '#dolphin-dev'}
2019-03-23T16:08:52.654315	{'source': 'ircclient', 'type': 'irc_message', 'who': 'Billiard', 'direct': False, 'what': "flacs: you had said we have two bigint libs in dolphin. mbedtls, what's the other one?", 'modes': {'o'}, 'where': '#dolphin-dev'}
2019-03-23T15:52:09.654153	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JosJuice', 'direct': False, 'what': '*discs', 'modes': set(), 'where': '#dolphin-dev'}
2019-03-23T15:50:49.199348	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JosJuice', 'direct': False, 'what': "(Also, I might be interested in seeing how Dragon Quest X disc work with it, because I don't really know what partition layout they have...)", 'modes': set(), 'where': '#dolphin-dev'}
2019-03-23T15:50:25.928753	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JosJuice', 'direct': False, 'what': 'JMC47: ^ You might be interested in that', 'modes': set(), 'where': '#dolphin-dev'}
2019-03-23T04:30:08.905327	{'source': 'ircclient', 'type': 'irc_message', 'who': 'Stenzek', 'direct': False, 'what': 'strange', 'modes': set(), 'where': '#dolphin-dev'}
2019-03-23T04:27:14.660102	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': "Stenzek: whatever's on an i7-7700 laptop", 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T04:27:03.758221	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': 'hm', 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T04:18:19.578621	{'source': 'ircclient', 'type': 'irc_message', 'who': 'Stenzek', 'direct': False, 'what': 'also it uses dx11 to populate the gpu list, so in theory it should be the same', 'modes': set(), 'where': '#dolphin-dev'}
2019-03-23T04:18:02.944641	{'source': 'ircclient', 'type': 'irc_message', 'who': 'Stenzek', 'direct': False, 'what': 'which igpu?', 'modes': set(), 'where': '#dolphin-dev'}
2019-03-23T04:17:59.317056	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': 'does it not support D3D12?', 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T04:17:56.044944	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': 'wtf', 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T04:17:54.920173	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': "I can't select my iGPU still >.>", 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T04:17:15.965925	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': 'thanks!', 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T04:16:55.984274	{'source': 'ircclient', 'type': 'irc_message', 'who': 'Stenzek', 'direct': False, 'what': 'JMC47: sure, send me a link', 'modes': set(), 'where': '#dolphin-dev'}
2019-03-23T04:15:20.394129	{'source': 'ircclient', 'type': 'irc_message', 'who': 'Stenzek', 'direct': False, 'what': 'okay, *now* D3D12 should be done. No sampler slowdown anymore', 'modes': set(), 'where': '#dolphin-dev'}
2019-03-23T04:14:18.062107	{'source': 'ircclient', 'type': 'irc_message', 'who': 'Stenzek', 'direct': False, 'what': 'lol, saw "turn off dualcore" coming :P', 'modes': set(), 'where': '#dolphin-dev'}
2019-03-23T02:38:34.935703	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': 'since the article is more or less gonna need this eventually anyway', 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T02:38:20.935292	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': 'Stenzek: if you need a tester for this, let me know', 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T02:19:14.982081	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': 'I had to restart, now I can see the netplay chat', 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T02:19:01.895869	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': 'apparently Windows was glitched', 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T02:18:57.101682	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': "spycrab0: I found out why imgui stuff wasn't working on my PC", 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T02:17:12.246372	{'source': 'ircclient', 'type': 'irc_message', 'who': 'spycrab0', 'direct': False, 'what': 'Anyone wanna take a look at https://github.com/dolphin-emu/dolphin/pull/7903?', 'modes': {'o'}, 'where': '#dolphin-dev'}
2019-03-23T01:43:24.827662	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': "Stenzek: you wanna read through the article when you get some free time?  I know you've been busy, but it's mostly put together now.", 'modes': {'v'}, 'where': '#dolphin-dev'}
2019-03-23T01:09:41.051458	{'source': 'ircclient', 'type': 'irc_message', 'who': 'JMC47', 'direct': False, 'what': 'yep', 'modes': {'v'}, 'where': '#dolphin-dev'}

Recent 'issue' events

2019-03-23T10:14:14.474697	{'issue': 6498, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 2, 'author': 'JosJuice', 'title': 'Dolphin Lacks the ability to check Gamecube Disc Integrity'}
2019-03-23T08:29:13.909648	{'issue': 10809, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 5, 'author': 'JMC4789', 'title': 'Second Sight horrible framerate drops/chugging with Dual Core'}
2019-03-23T04:41:25.250605	{'issue': 10809, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 4, 'author': 'xerxes', 'title': 'Second Sight horrible framerate drops/chugging with Dual Core'}
2019-03-23T04:21:52.813539	{'issue': 10801, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 3, 'author': 'xerxes', 'title': 'Eternal Darkness slight aspect ratio shift when pausing'}
2019-03-23T04:11:35.941857	{'issue': 10828, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 4, 'author': 'xerxes', 'title': 'PoP Sands of Time input delay on overwrite save dialogue'}
2019-03-23T04:05:50.022711	{'issue': 11632, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 1, 'author': 'JMC4789', 'title': "Tony Hawk's Pro Skater 3 CPU thread too fast crash"}
2019-03-23T03:50:59.746364	{'issue': 11632, 'source': 'redmine', 'new': True, 'type': 'issue', 'update': 0, 'author': 'xerxes', 'title': "Tony Hawk's Pro Skater 3 CPU thread too fast crash"}
2019-03-23T01:07:40.216102	{'issue': 11631, 'source': 'redmine', 'new': True, 'type': 'issue', 'update': 0, 'author': 'xerxes', 'title': "Tony Hawk's Pro Skater 3 misaligned videos"}
2019-03-22T20:27:28.074937	{'issue': 11332, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 3, 'author': 'spycrab0', 'title': 'Build MacOSX Could not load the Qt platform plugin "cocoa" in "" even though it was found.'}
2019-03-21T23:22:52.727504	{'issue': 11549, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 3, 'author': 'Billiard26', 'title': 'Search box should close with Escape'}
2019-03-21T22:16:51.738575	{'issue': 11630, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 2, 'author': 'JosJuice', 'title': 'Metroid Prime 2 and LoZ Twilight Pricness crash since #7753'}
2019-03-21T21:58:40.189333	{'issue': 11630, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 1, 'author': 'Intiroso', 'title': 'Metroid Prime 2 and LoZ Twilight Pricness crash since #7753'}
2019-03-21T21:56:35.312571	{'issue': 11630, 'source': 'redmine', 'new': True, 'type': 'issue', 'update': 0, 'author': 'Intiroso', 'title': 'Metroid Prime 2 and LoZ Twilight Pricness crash since #7753'}
2019-03-21T20:12:45.374656	{'issue': 11332, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 2, 'author': 'kvark', 'title': 'Build MacOSX Could not load the Qt platform plugin "cocoa" in "" even though it was found.'}
2019-03-21T17:36:17.478642	{'issue': 10408, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 9, 'author': 'BDClark', 'title': "Mayflash GameCube Controller Adapter doesn't work over usbip"}
2019-03-21T14:07:42.685165	{'issue': 11481, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 3, 'author': 'spycrab0', 'title': 'Compiling with ENABLE_LTO prevents Qt GUI from loading'}
2019-03-21T13:50:06.879892	{'issue': 11628, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 2, 'author': 'spycrab0', 'title': "Qt/AudioPane (macOS): Volume slider box doesn't keep consistent size"}
2019-03-21T13:27:52.208372	{'issue': 11628, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 1, 'author': 'spycrab0', 'title': "Qt/AudioPane (macOS): Volume slider box doesn't keep consistent size"}
2019-03-21T12:50:15.367352	{'issue': 11623, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 1, 'author': 'spycrab0', 'title': 'macOS Updater stays open when update is completed'}
2019-03-21T10:42:36.937156	{'issue': 11629, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 6, 'author': 'JosJuice', 'title': 'Mario Kart Double Dash on Android glitches'}
2019-03-21T08:06:03.861969	{'issue': 11629, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 5, 'author': 'krux', 'title': 'Mario Kart Double Dash on Android glitches'}
2019-03-21T08:01:16.477956	{'issue': 11629, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 4, 'author': 'krux', 'title': 'Mario Kart Double Dash on Android glitches'}
2019-03-21T08:00:12.045436	{'issue': 11629, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 3, 'author': 'krux', 'title': 'Mario Kart Double Dash on Android glitches'}
2019-03-21T05:52:12.461923	{'issue': 11629, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 2, 'author': 'JosJuice', 'title': 'Mario Kart Double Dash on Android glitches'}
2019-03-21T04:53:51.366140	{'issue': 11629, 'source': 'redmine', 'new': False, 'type': 'issue', 'update': 1, 'author': 'Stenzek', 'title': 'Mario Kart Double Dash on Android glitches'}

Recent 'pull_request_fifoci_status' events

2019-03-23T18:01:32.421979	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde'}
2019-03-23T17:56:37.996114	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': '063543e9bfada3b8a1ccecebe0dd209406f26bde'}
2019-03-23T17:55:30.631156	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54'}
2019-03-23T17:52:45.223756	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54'}
2019-03-23T16:24:35.169961	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7853, 'type': 'pull_request_fifoci_status', 'hash': 'fa87fbc83452b5508d01753fb340574fca8fcd8f'}
2019-03-23T16:22:05.221892	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7853, 'type': 'pull_request_fifoci_status', 'hash': 'fa87fbc83452b5508d01753fb340574fca8fcd8f'}
2019-03-23T16:13:13.102643	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e'}
2019-03-23T16:07:14.168485	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': '251a1dd9861d5fb7a19000d2aa3428123e80ee85'}
2019-03-23T16:07:10.669545	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': 'a30af0f164b3809616c257596256c540df6a5f4e'}
2019-03-23T16:03:16.696486	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': '251a1dd9861d5fb7a19000d2aa3428123e80ee85'}
2019-03-23T15:59:54.725091	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': 'eaf57a65e632566279939a77a9749843043e01ce'}
2019-03-23T15:56:41.463474	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7922, 'type': 'pull_request_fifoci_status', 'hash': 'eaf57a65e632566279939a77a9749843043e01ce'}
2019-03-23T15:41:51.491958	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7905, 'type': 'pull_request_fifoci_status', 'hash': '30d4fb9eaefcb3c09c70f1c44f6e2e406c54f747'}
2019-03-23T15:39:21.677199	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7905, 'type': 'pull_request_fifoci_status', 'hash': '30d4fb9eaefcb3c09c70f1c44f6e2e406c54f747'}
2019-03-23T15:28:22.294321	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7861, 'type': 'pull_request_fifoci_status', 'hash': 'a1237bdf2fa84b4e59a261cfe7eb12eb838c101f'}
2019-03-23T15:25:52.666339	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7861, 'type': 'pull_request_fifoci_status', 'hash': 'a1237bdf2fa84b4e59a261cfe7eb12eb838c101f'}
2019-03-23T14:00:43.016410	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7903, 'type': 'pull_request_fifoci_status', 'hash': 'f3bdb6b1b22e94ddbb5cdafe8bfde3ce7efaee0c'}
2019-03-23T13:58:12.774862	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7903, 'type': 'pull_request_fifoci_status', 'hash': 'f3bdb6b1b22e94ddbb5cdafe8bfde3ce7efaee0c'}
2019-03-23T13:04:57.080907	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7921, 'type': 'pull_request_fifoci_status', 'hash': 'fd323e7d4c5b9dafd98ff20f9761a6f40f9a2e3e'}
2019-03-23T12:59:45.799403	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7921, 'type': 'pull_request_fifoci_status', 'hash': 'fd323e7d4c5b9dafd98ff20f9761a6f40f9a2e3e'}
2019-03-23T12:58:59.733214	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7921, 'type': 'pull_request_fifoci_status', 'hash': '2fab8d689909a3f0ea9f2ca14dc6e777b791146c'}
2019-03-23T12:52:27.109862	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7779, 'type': 'pull_request_fifoci_status', 'hash': 'fb121ff84b05af151a2240f72dbfb52986921c4c'}
2019-03-23T12:51:07.822944	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7921, 'type': 'pull_request_fifoci_status', 'hash': '2fab8d689909a3f0ea9f2ca14dc6e777b791146c'}
2019-03-23T12:47:35.688699	{'source': 'buildbot', 'service': 'pr-fifoci-sw-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7779, 'type': 'pull_request_fifoci_status', 'hash': 'fb121ff84b05af151a2240f72dbfb52986921c4c'}
2019-03-23T12:46:21.736821	{'source': 'buildbot', 'service': 'pr-fifoci-ogl-lin-mesa', 'repo': 'dolphin-emu/dolphin', 'pr': 7921, 'type': 'pull_request_fifoci_status', 'hash': '66ba5acc9f2f5316049fa7376c02224fa8d45d8b'}

Recent 'raw_bb_hook' events

2019-03-23T19:16:14.064923	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89685, 'properties': {'shortrev': ['7cfb62', 'Trigger'], 'revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'Trigger'], 'buildnumber': [4117, 'Build'], 'workername': ['hive', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-fifoci-sw-lin-mesa', 'Builder'], 'branchname': ['pr-7903', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'slavename': ['hive', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'pr_id': [7903, 'Trigger'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26327, 'complete_at': None, 'parent_buildid': 63302, 'submitted_at': 1553368572, 'parent_relationship': 'Triggered from', 'complete': False, 'external_idstring': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'sourcestamps': [{'project': '', 'revision': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1553368573, 'ssid': 7102, 'codebase': ''}]}, 'number': 4117, 'buildid': 63304, 'url': 'https://buildbot.dolphin-emu.org/#builders/17/builds/4117', 'buildrequest': {'buildrequestid': 89685, 'buildsetid': 26327, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368573, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 17, 'submitted_at': 1553368572, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-fifoci-sw-lin-mesa', 'masterids': [1], 'builderid': 17, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 17, 'started_at': 1553368574, 'state_string': 'starting', 'workerid': 6, 'masterid': 1}}
2019-03-23T19:16:13.779953	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89687, 'properties': {'shortrev': ['7cfb62', 'Trigger'], 'revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'Trigger'], 'buildnumber': [4118, 'Build'], 'workername': ['hive', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-fifoci-ogl-lin-mesa', 'Builder'], 'branchname': ['pr-7903', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'slavename': ['hive', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'pr_id': [7903, 'Trigger'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26327, 'complete_at': None, 'parent_buildid': 63302, 'submitted_at': 1553368572, 'parent_relationship': 'Triggered from', 'complete': False, 'external_idstring': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'sourcestamps': [{'project': '', 'revision': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1553368573, 'ssid': 7102, 'codebase': ''}]}, 'number': 4118, 'buildid': 63303, 'url': 'https://buildbot.dolphin-emu.org/#builders/30/builds/4118', 'buildrequest': {'buildrequestid': 89687, 'buildsetid': 26327, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368573, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 30, 'submitted_at': 1553368572, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-fifoci-ogl-lin-mesa', 'masterids': [1], 'builderid': 30, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 30, 'started_at': 1553368574, 'state_string': 'starting', 'workerid': 6, 'masterid': 1}}
2019-03-23T19:16:13.543400	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89674, 'properties': {'warnings-count': [27, 'WarningCountingShellCommand'], 'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/home/buildslave/worker/pr-ubu-x64', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildername': ['pr-ubu-x64', 'Builder'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [4327, 'Build'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4327, 'buildid': 63302, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/4327', 'buildrequest': {'buildrequestid': 89674, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368540, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 2, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-ubu-x64', 'masterids': [1], 'builderid': 2, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368573, 'builderid': 2, 'started_at': 1553368540, 'state_string': 'build successful', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:16:13.260321	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89679, 'properties': {'warnings-count': [61, 'WarningCountingShellCommand'], 'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/home/delroth/buildslave/pr-deb-dbg-x64', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildername': ['pr-deb-dbg-x64', 'Builder'], 'workername': ['debian', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [3787, 'Build'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['debian', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 3787, 'buildid': 63300, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/3787', 'buildrequest': {'buildrequestid': 89679, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368504, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 21, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-deb-dbg-x64', 'masterids': [1], 'builderid': 21, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368573, 'builderid': 21, 'started_at': 1553368504, 'state_string': 'build successful', 'workerid': 12, 'masterid': 1}}
2019-03-23T19:15:40.296694	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89674, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'buildnumber': [4327, 'Build'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-ubu-x64', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4327, 'buildid': 63302, 'url': 'https://buildbot.dolphin-emu.org/#builders/2/builds/4327', 'buildrequest': {'buildrequestid': 89674, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368540, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 2, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-ubu-x64', 'masterids': [1], 'builderid': 2, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 2, 'started_at': 1553368540, 'state_string': 'starting', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:15:40.203938	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89680, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/home/buildslave/worker/lint', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildnumber': [4316, 'Build'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildername': ['lint', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4316, 'buildid': 63301, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/4316', 'buildrequest': {'buildrequestid': 89680, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368535, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 22, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'lint', 'masterids': [1], 'builderid': 22, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368540, 'builderid': 22, 'started_at': 1553368536, 'state_string': 'build successful', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:15:36.255478	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89680, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'buildnumber': [4316, 'Build'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildername': ['lint', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4316, 'buildid': 63301, 'url': 'https://buildbot.dolphin-emu.org/#builders/22/builds/4316', 'buildrequest': {'buildrequestid': 89680, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368535, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 22, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'lint', 'masterids': [1], 'builderid': 22, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 22, 'started_at': 1553368536, 'state_string': 'starting', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:15:35.527246	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89677, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/home/buildslave/worker/pr-android', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildnumber': [4337, 'Build'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-android', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4337, 'buildid': 63296, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/4337', 'buildrequest': {'buildrequestid': 89677, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368418, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 8, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-android', 'masterids': [1], 'builderid': 8, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368536, 'builderid': 8, 'started_at': 1553368419, 'state_string': 'build successful', 'workerid': 9, 'masterid': 1}}
2019-03-23T19:15:04.405871	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89679, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'buildnumber': [3787, 'Build'], 'workername': ['debian', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-deb-dbg-x64', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['debian', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 3787, 'buildid': 63300, 'url': 'https://buildbot.dolphin-emu.org/#builders/21/builds/3787', 'buildrequest': {'buildrequestid': 89679, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368504, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 21, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-deb-dbg-x64', 'masterids': [1], 'builderid': 21, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 21, 'started_at': 1553368504, 'state_string': 'starting', 'workerid': 12, 'masterid': 1}}
2019-03-23T19:15:04.277411	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89675, 'properties': {'warnings-count': [60, 'WarningCountingShellCommand'], 'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/home/delroth/buildslave/pr-deb-x64', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildername': ['pr-deb-x64', 'Builder'], 'workername': ['debian', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [3801, 'Build'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['debian', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 3801, 'buildid': 63297, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/3801', 'buildrequest': {'buildrequestid': 89675, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368418, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 6, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-deb-x64', 'masterids': [1], 'builderid': 6, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368504, 'builderid': 6, 'started_at': 1553368419, 'state_string': 'build successful', 'workerid': 12, 'masterid': 1}}
2019-03-23T19:14:18.900972	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89682, 'properties': {'warnings-count': [8, 'WarningCountingShellCommand'], 'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'builddir': ['/usr/home/buildbot/freebsd/pr-freebsd-x64', 'Worker'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'got_revision': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'GitNoBranch'], 'buildername': ['pr-freebsd-x64', 'Builder'], 'workername': ['freebsd', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [4370, 'Build'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['freebsd', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4370, 'buildid': 63299, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/4370', 'buildrequest': {'buildrequestid': 89682, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368419, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 34, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-freebsd-x64', 'masterids': [1], 'builderid': 34, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553368459, 'builderid': 34, 'started_at': 1553368419, 'state_string': 'build successful', 'workerid': 8, 'masterid': 1}}
2019-03-23T19:13:39.258019	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89675, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'buildnumber': [3801, 'Build'], 'workername': ['debian', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-deb-x64', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['debian', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 3801, 'buildid': 63297, 'url': 'https://buildbot.dolphin-emu.org/#builders/6/builds/3801', 'buildrequest': {'buildrequestid': 89675, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368418, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 6, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-deb-x64', 'masterids': [1], 'builderid': 6, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 6, 'started_at': 1553368419, 'state_string': 'starting', 'workerid': 12, 'masterid': 1}}
2019-03-23T19:13:39.239116	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89682, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'buildnumber': [4370, 'Build'], 'workername': ['freebsd', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-freebsd-x64', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['freebsd', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4370, 'buildid': 63299, 'url': 'https://buildbot.dolphin-emu.org/#builders/34/builds/4370', 'buildrequest': {'buildrequestid': 89682, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368419, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 34, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-freebsd-x64', 'masterids': [1], 'builderid': 34, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 34, 'started_at': 1553368419, 'state_string': 'starting', 'workerid': 8, 'masterid': 1}}
2019-03-23T19:13:39.179975	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89676, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'buildnumber': [4373, 'Build'], 'workername': ['windows', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-win-dbg-x64', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['windows', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4373, 'buildid': 63298, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/4373', 'buildrequest': {'buildrequestid': 89676, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368419, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 7, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-win-dbg-x64', 'masterids': [1], 'builderid': 7, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 7, 'started_at': 1553368419, 'state_string': 'starting', 'workerid': 4, 'masterid': 1}}
2019-03-23T19:13:39.146363	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89677, 'properties': {'shortrev': ['7cfb62', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7903/head', 'Build'], 'headrev': ['7cfb626a834cdc065e56e529bbed81df755a7c09', 'try build'], 'buildnumber': [4337, 'Build'], 'workername': ['ubuntu', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-android', 'Builder'], 'branchname': ['pr-7903', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['ubuntu', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7903, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26326, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553368418, 'parent_relationship': None, 'complete': False, 'external_idstring': '7903-7cfb62', 'reason': "'try' job by user Central (on behalf of: spycrab)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7903/head', 'created_at': 1552781481, 'ssid': 6991, 'codebase': ''}]}, 'number': 4337, 'buildid': 63296, 'url': 'https://buildbot.dolphin-emu.org/#builders/8/builds/4337', 'buildrequest': {'buildrequestid': 89677, 'buildsetid': 26326, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553368418, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 8, 'submitted_at': 1553368418, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-android', 'masterids': [1], 'builderid': 8, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 8, 'started_at': 1553368419, 'state_string': 'starting', 'workerid': 9, 'masterid': 1}}
2019-03-23T18:01:31.267776	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89670, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'shortrev': ['063543', 'Trigger'], 'revision': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'Build'], 'builddir': ['/home/buildslave/slave/pr-fifoci-ogl-lin-mesa', 'Worker'], 'got_revision': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'GitNoBranch'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'Trigger'], 'buildername': ['pr-fifoci-ogl-lin-mesa', 'Builder'], 'workername': ['hive', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [4117, 'Build'], 'branchname': ['pr-7922', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'slavename': ['hive', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'pr_id': [7922, 'Trigger'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26323, 'complete_at': None, 'parent_buildid': 63286, 'submitted_at': 1553363384, 'parent_relationship': 'Triggered from', 'complete': False, 'external_idstring': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'sourcestamps': [{'project': '', 'revision': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553363384, 'ssid': 7101, 'codebase': ''}]}, 'number': 4117, 'buildid': 63295, 'url': 'https://buildbot.dolphin-emu.org/#builders/30/builds/4117', 'buildrequest': {'buildrequestid': 89670, 'buildsetid': 26323, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363729, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 30, 'submitted_at': 1553363384, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-fifoci-ogl-lin-mesa', 'masterids': [1], 'builderid': 30, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553364091, 'builderid': 30, 'started_at': 1553363730, 'state_string': 'build successful', 'workerid': 6, 'masterid': 1}}
2019-03-23T17:56:36.806704	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89668, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'shortrev': ['063543', 'Trigger'], 'revision': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'Build'], 'builddir': ['/home/buildslave/slave/pr-fifoci-sw-lin-mesa', 'Worker'], 'got_revision': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'GitNoBranch'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'Trigger'], 'buildername': ['pr-fifoci-sw-lin-mesa', 'Builder'], 'workername': ['hive', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [4116, 'Build'], 'branchname': ['pr-7922', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'slavename': ['hive', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'pr_id': [7922, 'Trigger'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26323, 'complete_at': None, 'parent_buildid': 63286, 'submitted_at': 1553363384, 'parent_relationship': 'Triggered from', 'complete': False, 'external_idstring': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'sourcestamps': [{'project': '', 'revision': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553363384, 'ssid': 7101, 'codebase': ''}]}, 'number': 4116, 'buildid': 63292, 'url': 'https://buildbot.dolphin-emu.org/#builders/17/builds/4116', 'buildrequest': {'buildrequestid': 89668, 'buildsetid': 26323, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363564, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 17, 'submitted_at': 1553363384, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-fifoci-sw-lin-mesa', 'masterids': [1], 'builderid': 17, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553363797, 'builderid': 17, 'started_at': 1553363564, 'state_string': 'build successful', 'workerid': 6, 'masterid': 1}}
2019-03-23T17:55:29.623508	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89670, 'properties': {'shortrev': ['063543', 'Trigger'], 'revision': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'Trigger'], 'buildnumber': [4117, 'Build'], 'workername': ['hive', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-fifoci-ogl-lin-mesa', 'Builder'], 'branchname': ['pr-7922', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'slavename': ['hive', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'pr_id': [7922, 'Trigger'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26323, 'complete_at': None, 'parent_buildid': 63286, 'submitted_at': 1553363384, 'parent_relationship': 'Triggered from', 'complete': False, 'external_idstring': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'sourcestamps': [{'project': '', 'revision': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553363384, 'ssid': 7101, 'codebase': ''}]}, 'number': 4117, 'buildid': 63295, 'url': 'https://buildbot.dolphin-emu.org/#builders/30/builds/4117', 'buildrequest': {'buildrequestid': 89670, 'buildsetid': 26323, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363729, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 30, 'submitted_at': 1553363384, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-fifoci-ogl-lin-mesa', 'masterids': [1], 'builderid': 30, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 30, 'started_at': 1553363730, 'state_string': 'starting', 'workerid': 6, 'masterid': 1}}
2019-03-23T17:55:29.500827	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89655, 'properties': {'warnings-count': [27, 'WarningCountingShellCommand'], 'shortrev': ['5d5d13', 'Trigger'], 'revision': ['5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'Build'], 'builddir': ['/home/buildslave/slave/pr-fifoci-ogl-lin-mesa', 'Worker'], 'got_revision': ['5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'GitNoBranch'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'Trigger'], 'buildername': ['pr-fifoci-ogl-lin-mesa', 'Builder'], 'workername': ['hive', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [4116, 'Build'], 'branchname': ['pr-7922', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'slavename': ['hive', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'pr_id': [7922, 'Trigger'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26321, 'complete_at': None, 'parent_buildid': 63277, 'submitted_at': 1553363234, 'parent_relationship': 'Triggered from', 'complete': False, 'external_idstring': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'sourcestamps': [{'project': '', 'revision': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553363235, 'ssid': 7100, 'codebase': ''}]}, 'number': 4116, 'buildid': 63280, 'url': 'https://buildbot.dolphin-emu.org/#builders/30/builds/4116', 'buildrequest': {'buildrequestid': 89655, 'buildsetid': 26321, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363235, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 30, 'submitted_at': 1553363234, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-fifoci-ogl-lin-mesa', 'masterids': [1], 'builderid': 30, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553363729, 'builderid': 30, 'started_at': 1553363236, 'state_string': 'build successful', 'workerid': 6, 'masterid': 1}}
2019-03-23T17:55:11.400102	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89659, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'shortrev': ['063543', 'try build'], 'revision': [None, 'Build'], 'builddir': ['C:\\buildbot\\pr-win-dbg-x64', 'Worker'], 'repository': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'build_url': ['https://dl.dolphin-emu.org/prs/pr-7922-dolphin-latest-dbg-x64.7z', 'SetProperty'], 'got_revision': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'GitNoBranch'], 'buildername': ['pr-win-dbg-x64', 'Builder'], 'workername': ['windows', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [4372, 'Build'], 'branchname': ['pr-7922', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['windows', 'Worker (deprecated)'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7922, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26322, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553363368, 'parent_relationship': None, 'complete': False, 'external_idstring': '7922-063543', 'reason': "'try' job by user Central (on behalf of: JosJuice)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553356219, 'ssid': 7095, 'codebase': ''}]}, 'number': 4372, 'buildid': 63294, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/4372', 'buildrequest': {'buildrequestid': 89659, 'buildsetid': 26322, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363628, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 7, 'submitted_at': 1553363368, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-win-dbg-x64', 'masterids': [1], 'builderid': 7, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553363711, 'builderid': 7, 'started_at': 1553363629, 'state_string': 'build successful', 'workerid': 4, 'masterid': 1}}
2019-03-23T17:53:48.979351	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89659, 'properties': {'shortrev': ['063543', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'try build'], 'buildnumber': [4372, 'Build'], 'workername': ['windows', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-win-dbg-x64', 'Builder'], 'branchname': ['pr-7922', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['windows', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7922, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26322, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553363368, 'parent_relationship': None, 'complete': False, 'external_idstring': '7922-063543', 'reason': "'try' job by user Central (on behalf of: JosJuice)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553356219, 'ssid': 7095, 'codebase': ''}]}, 'number': 4372, 'buildid': 63294, 'url': 'https://buildbot.dolphin-emu.org/#builders/7/builds/4372', 'buildrequest': {'buildrequestid': 89659, 'buildsetid': 26322, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363628, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 7, 'submitted_at': 1553363368, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-win-dbg-x64', 'masterids': [1], 'builderid': 7, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 7, 'started_at': 1553363629, 'state_string': 'starting', 'workerid': 4, 'masterid': 1}}
2019-03-23T17:53:48.872465	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89661, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'shortrev': ['063543', 'try build'], 'revision': [None, 'Build'], 'builddir': ['C:\\buildbot\\pr-win-x64', 'Worker'], 'repository': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'build_url': ['https://dl.dolphin-emu.org/prs/pr-7922-dolphin-latest-x64.7z', 'SetProperty'], 'got_revision': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'GitNoBranch'], 'buildername': ['pr-win-x64', 'Builder'], 'workername': ['windows', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [4386, 'Build'], 'branchname': ['pr-7922', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['windows', 'Worker (deprecated)'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7922, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26322, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553363368, 'parent_relationship': None, 'complete': False, 'external_idstring': '7922-063543', 'reason': "'try' job by user Central (on behalf of: JosJuice)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553356219, 'ssid': 7095, 'codebase': ''}]}, 'number': 4386, 'buildid': 63293, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/4386', 'buildrequest': {'buildrequestid': 89661, 'buildsetid': 26322, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363592, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 20, 'submitted_at': 1553363368, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-win-x64', 'masterids': [1], 'builderid': 20, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553363629, 'builderid': 20, 'started_at': 1553363593, 'state_string': 'build successful', 'workerid': 4, 'masterid': 1}}
2019-03-23T17:53:12.785328	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89661, 'properties': {'shortrev': ['063543', 'try build'], 'revision': [None, 'Build'], 'scheduler': ['pr', 'Scheduler'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'try build'], 'buildnumber': [4386, 'Build'], 'workername': ['windows', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-win-x64', 'Builder'], 'branchname': ['pr-7922', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['windows', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7922, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26322, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553363368, 'parent_relationship': None, 'complete': False, 'external_idstring': '7922-063543', 'reason': "'try' job by user Central (on behalf of: JosJuice)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553356219, 'ssid': 7095, 'codebase': ''}]}, 'number': 4386, 'buildid': 63293, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/4386', 'buildrequest': {'buildrequestid': 89661, 'buildsetid': 26322, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363592, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 20, 'submitted_at': 1553363368, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-win-x64', 'masterids': [1], 'builderid': 20, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 20, 'started_at': 1553363593, 'state_string': 'starting', 'workerid': 4, 'masterid': 1}}
2019-03-23T17:53:12.702190	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89646, 'properties': {'warnings-count': [0, 'WarningCountingShellCommand'], 'shortrev': ['5d5d13', 'try build'], 'revision': [None, 'Build'], 'builddir': ['C:\\buildbot\\pr-win-x64', 'Worker'], 'repository': ['', 'Build'], 'scheduler': ['pr', 'Scheduler'], 'build_url': ['https://dl.dolphin-emu.org/prs/pr-7922-dolphin-latest-x64.7z', 'SetProperty'], 'got_revision': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'GitNoBranch'], 'buildername': ['pr-win-x64', 'Builder'], 'workername': ['windows', 'Worker'], 'project': ['', 'Build'], 'buildnumber': [4385, 'Build'], 'branchname': ['pr-7922', 'try build'], 'repo': ['dolphin-emu/dolphin', 'try build'], 'slavename': ['windows', 'Worker (deprecated)'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'try build'], 'baserev': ['672b582bec0ceecf8228358ef2579f3960c67b23', 'try build'], 'pr_id': [7922, 'try build'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26320, 'complete_at': None, 'parent_buildid': None, 'submitted_at': 1553363218, 'parent_relationship': None, 'complete': False, 'external_idstring': '7922-5d5d13', 'reason': "'try' job by user Central (on behalf of: JosJuice)", 'sourcestamps': [{'project': '', 'revision': None, 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553356219, 'ssid': 7095, 'codebase': ''}]}, 'number': 4385, 'buildid': 63291, 'url': 'https://buildbot.dolphin-emu.org/#builders/20/builds/4385', 'buildrequest': {'buildrequestid': 89646, 'buildsetid': 26320, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363418, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 20, 'submitted_at': 1553363218, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-win-x64', 'masterids': [1], 'builderid': 20, 'description': None, 'tags': []}, 'results': 0, 'complete': True, 'complete_at': 1553363593, 'builderid': 20, 'started_at': 1553363419, 'state_string': 'build successful', 'workerid': 4, 'masterid': 1}}
2019-03-23T17:52:44.135370	{'source': 'webserver', 'type': 'raw_bb_hook', 'raw': {'buildrequestid': 89668, 'properties': {'shortrev': ['063543', 'Trigger'], 'revision': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'Build'], 'scheduler': ['pr-fifoci-lin', 'Scheduler'], 'branch': ['refs/pull/7922/head', 'Build'], 'headrev': ['063543e9bfada3b8a1ccecebe0dd209406f26bde', 'Trigger'], 'buildnumber': [4116, 'Build'], 'workername': ['hive', 'Worker'], 'project': ['', 'Build'], 'buildername': ['pr-fifoci-sw-lin-mesa', 'Builder'], 'branchname': ['pr-7922', 'Trigger'], 'repo': ['dolphin-emu/dolphin', 'Trigger'], 'slavename': ['hive', 'Worker (deprecated)'], 'repository': ['', 'Build'], 'pr_id': [7922, 'Trigger'], 'codebase': ['', 'Build']}, 'buildset': {'results': -1, 'bsid': 26323, 'complete_at': None, 'parent_buildid': 63286, 'submitted_at': 1553363384, 'parent_relationship': 'Triggered from', 'complete': False, 'external_idstring': None, 'reason': "The Triggerable scheduler named 'pr-fifoci-lin' triggered this build", 'sourcestamps': [{'project': '', 'revision': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'repository': '', 'patch': None, 'branch': 'refs/pull/7922/head', 'created_at': 1553363384, 'ssid': 7101, 'codebase': ''}]}, 'number': 4116, 'buildid': 63292, 'url': 'https://buildbot.dolphin-emu.org/#builders/17/builds/4116', 'buildrequest': {'buildrequestid': 89668, 'buildsetid': 26323, 'priority': 0, 'results': -1, 'complete': False, 'claimed_at': 1553363564, 'complete_at': None, 'claimed_by_masterid': 1, 'builderid': 17, 'submitted_at': 1553363384, 'waited_for': False, 'claimed': True}, 'builder': {'name': 'pr-fifoci-sw-lin-mesa', 'masterids': [1], 'builderid': 17, 'description': None, 'tags': []}, 'results': None, 'complete': False, 'complete_at': None, 'builderid': 17, 'started_at': 1553363564, 'state_string': 'starting', 'workerid': 6, 'masterid': 1}}

Recent 'raw_gh_hook' events

2019-03-23T19:15:36.712071	{'source': 'webserver', 'type': 'raw_gh_hook', 'gh_type': 'issue_comment', 'raw': {'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T19:13:37Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'issue': {'assignees': [], 'body': '<img width="967" alt="Screen Shot 2019-03-17 at 15 52 23" src="https://user-images.githubusercontent.com/1440715/54493136-c197f380-48cc-11e9-9063-71081c594388.png">\r\n\r\n**Known issues:**\r\n- ~~There\'s no hotkey for toggling the chat~~ (Maybe later?)\r\n- ~~Pressing Enter to send messages does not work yet~~\r\n- ~~Not usable when controllers are mapped to the keyboard~~\r\n- ~~The text cursor is not displaying properly~~', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903', 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/events', 'milestone': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'author_association': 'CONTRIBUTOR', 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/labels{/name}', 'repository_url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'pull_request': {'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.patch', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903', 'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.diff', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903'}, 'locked': False, 'closed_at': None, 'number': 7903, 'labels': [], 'comments': 3, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYxODA4ODc4', 'state': 'open', 'updated_at': '2019-03-23T19:15:36Z', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903', 'created_at': '2019-03-17T00:11:15Z', 'title': 'Add imgui-based Netplay Chat', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/comments', 'id': 421866296}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'author_association': 'CONTRIBUTOR', 'updated_at': '2019-03-23T19:15:36Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903#issuecomment-475896830', 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903', 'created_at': '2019-03-23T19:15:36Z', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments/475896830', 'body': "This doesn't seem to be implementable in a proper way without a global variable, so I reintroduced it.\r\n\r\nReasons for that:\r\n* Greatly increases complexity\r\n* The availability of ``g_renderer``at any given point varies greatly which makes it hard to interact with from the UI thread.", 'node_id': 'MDEyOklzc3VlQ29tbWVudDQ3NTg5NjgzMA==', 'id': 475896830}}}
2019-03-23T19:13:36.727260	{'source': 'webserver', 'type': 'raw_gh_hook', 'gh_type': 'pull_request', 'raw': {'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.diff', 'body': '<img width="967" alt="Screen Shot 2019-03-17 at 15 52 23" src="https://user-images.githubusercontent.com/1440715/54493136-c197f380-48cc-11e9-9063-71081c594388.png">\r\n\r\n**Known issues:**\r\n- ~~There\'s no hotkey for toggling the chat~~ (Maybe later?)\r\n- ~~Pressing Enter to send messages does not work yet~~\r\n- ~~Not usable when controllers are mapped to the keyboard~~\r\n- ~~The text cursor is not displaying properly~~', 'additions': 209, 'merged_by': None, 'requested_reviewers': [], 'maintainer_can_modify': True, 'merged': False, 'draft': False, 'author_association': 'CONTRIBUTOR', 'number': 7903, 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903', 'labels': [], 'merged_at': None, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYxODA4ODc4', 'state': 'open', 'review_comments': 37, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903/comments', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7903', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/comments', 'assignees': [], 'mergeable': None, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903', 'commits': 4, 'milestone': None, 'merge_commit_sha': 'd911ab628a258798a3f47fcc0b07ba03fd04a3db', 'rebaseable': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'mergeable_state': 'unknown', 'locked': False, 'changed_files': 17, '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7903'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/7cfb626a834cdc065e56e529bbed81df755a7c09'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903/commits'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7903/comments'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903/comments'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7903/commits', 'closed_at': None, 'base': {'ref': 'master', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'label': 'dolphin-emu:master', 'repo': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T17:49:24Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'sha': '672b582bec0ceecf8228358ef2579f3960c67b23'}, 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7903.patch', 'comments': 3, 'head': {'ref': 'imgui_np_chat', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'label': 'spycrab:imgui_np_chat', 'repo': {'forks_count': 0, 'events_url': 'https://api.github.com/repos/spycrab/dolphin/events', 'pulls_url': 'https://api.github.com/repos/spycrab/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/spycrab/dolphin/languages', 'git_url': 'git://github.com/spycrab/dolphin.git', 'name': 'dolphin', 'watchers_count': 0, 'forks': 0, 'milestones_url': 'https://api.github.com/repos/spycrab/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/spycrab/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'watchers': 0, 'labels_url': 'https://api.github.com/repos/spycrab/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/spycrab/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/spycrab/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/spycrab/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/spycrab/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/spycrab/dolphin/teams', 'tags_url': 'https://api.github.com/repos/spycrab/dolphin/tags', 'stargazers_count': 0, 'node_id': 'MDEwOlJlcG9zaXRvcnk4ODM0OTU4NQ==', 'clone_url': 'https://github.com/spycrab/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/spycrab/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/spycrab/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/spycrab/dolphin', 'contributors_url': 'https://api.github.com/repos/spycrab/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/spycrab/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/spycrab/dolphin/notifications{?since,all,participating}', 'fork': True, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'spycrab/dolphin', 'open_issues_count': 0, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/spycrab/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/spycrab/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/spycrab/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/spycrab/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/spycrab/dolphin', 'trees_url': 'https://api.github.com/repos/spycrab/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/spycrab/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/spycrab/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T19:13:33Z', 'archived': False, 'svn_url': 'https://github.com/spycrab/dolphin', 'has_projects': True, 'subscription_url': 'https://api.github.com/repos/spycrab/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/spycrab/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/spycrab/dolphin/issues{/number}', 'size': 339529, 'open_issues': 0, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/spycrab/dolphin/releases{/id}', 'ssh_url': 'git@github.com:spycrab/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/spycrab/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/spycrab/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/spycrab/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/spycrab/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/spycrab/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-16T14:35:14Z', 'statuses_url': 'https://api.github.com/repos/spycrab/dolphin/statuses/{sha}', 'created_at': '2017-04-15T13:46:17Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/spycrab/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/spycrab/dolphin/git/refs{/sha}', 'id': 88349585}, 'sha': '7cfb626a834cdc065e56e529bbed81df755a7c09'}, 'deletions': 27, 'updated_at': '2019-03-23T19:13:35Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/7cfb626a834cdc065e56e529bbed81df755a7c09', 'created_at': '2019-03-17T00:11:15Z', 'title': 'Add imgui-based Netplay Chat', 'requested_teams': [], 'id': 261808878}, 'action': 'synchronize', 'number': 7903, 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T17:49:24Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'after': '7cfb626a834cdc065e56e529bbed81df755a7c09', 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/spycrab/followers', 'url': 'https://api.github.com/users/spycrab', 'organizations_url': 'https://api.github.com/users/spycrab/orgs', 'node_id': 'MDQ6VXNlcjE0NDA3MTU=', 'events_url': 'https://api.github.com/users/spycrab/events{/privacy}', 'repos_url': 'https://api.github.com/users/spycrab/repos', 'gists_url': 'https://api.github.com/users/spycrab/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/spycrab/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/spycrab/following{/other_user}', 'html_url': 'https://github.com/spycrab', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/1440715?v=4', 'login': 'spycrab', 'subscriptions_url': 'https://api.github.com/users/spycrab/subscriptions', 'starred_url': 'https://api.github.com/users/spycrab/starred{/owner}{/repo}', 'id': 1440715}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'before': 'f3bdb6b1b22e94ddbb5cdafe8bfde3ce7efaee0c'}}
2019-03-23T17:49:24.496813	{'source': 'webserver', 'type': 'raw_gh_hook', 'gh_type': 'pull_request', 'raw': {'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.diff', 'body': 'This PR adds a new tab to the game properties window where you can check for problems with your games. Hopefully this can cut down a bit on people who ask about problems that turn out to be caused by bad dumps. For instance, there\'s a message about not having combined the files that CleanRip produces, and there\'s a message you get if you\'ve pirated a single-layer version of a game that\'s supposed to be dual-layer. Some screenshots to show what it looks like:\r\n\r\nMy good dump of Rodea the Sky Soldier (NTSC-K):\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868219-0bc41d80-4d82-11e9-83a6-1b3f0bc32383.png)\r\n\r\nThe same game but with the IOS slot hex edited to reproduce https://bugs.dolphin-emu.org/issues/10319:\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868230-3b732580-4d82-11e9-96ba-24e392dec65b.png)\r\n\r\nThis is a WIP for now, but feel free to review, as long as it isn\'t about the `Process()` function (I\'m going to change it later). Left to do:\r\n\r\n- [ ] Integrate the "Check Partition Integrity" feature (currently in the Filesystem tab)\r\n- [ ] Integrate checksum calculation (currently in the Info tab)\r\n\r\nIt would also be nice to include the ability to verify hashes with Redump.org or a similar database (https://bugs.dolphin-emu.org/issues/10867), but that\'s complex enough that I don\'t want to do it in this PR.', 'additions': 1124, 'merged_by': None, 'requested_reviewers': [], 'maintainer_can_modify': True, 'merged': False, 'draft': False, 'author_association': 'CONTRIBUTOR', 'number': 7922, 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922', 'labels': [], 'merged_at': None, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzODQxMzU0', 'state': 'open', 'review_comments': 19, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/comments', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/comments', 'assignees': [], 'mergeable': None, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'commits': 6, 'milestone': None, 'merge_commit_sha': 'dd1d1a70306c0dc4e19f2307a8870dd790dfadd6', 'rebaseable': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'mergeable_state': 'unknown', 'locked': False, 'changed_files': 36, '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/063543e9bfada3b8a1ccecebe0dd209406f26bde'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/commits'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/comments'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/comments'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/commits', 'closed_at': None, 'base': {'ref': 'master', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'label': 'dolphin-emu:master', 'repo': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T17:46:55Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'sha': '672b582bec0ceecf8228358ef2579f3960c67b23'}, 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.patch', 'comments': 1, 'head': {'ref': 'verify-disc', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'label': 'JosJuice:verify-disc', 'repo': {'forks_count': 2, 'events_url': 'https://api.github.com/repos/JosJuice/dolphin/events', 'pulls_url': 'https://api.github.com/repos/JosJuice/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/JosJuice/dolphin/languages', 'git_url': 'git://github.com/JosJuice/dolphin.git', 'name': 'dolphin', 'watchers_count': 2, 'forks': 2, 'milestones_url': 'https://api.github.com/repos/JosJuice/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/JosJuice/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'watchers': 2, 'labels_url': 'https://api.github.com/repos/JosJuice/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/JosJuice/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/JosJuice/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/JosJuice/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/JosJuice/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/JosJuice/dolphin/teams', 'tags_url': 'https://api.github.com/repos/JosJuice/dolphin/tags', 'stargazers_count': 2, 'node_id': 'MDEwOlJlcG9zaXRvcnkyNjA1NzEzOA==', 'clone_url': 'https://github.com/JosJuice/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/JosJuice/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/JosJuice/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/JosJuice/dolphin', 'contributors_url': 'https://api.github.com/repos/JosJuice/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/JosJuice/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/JosJuice/dolphin/notifications{?since,all,participating}', 'fork': True, 'homepage': None, 'full_name': 'JosJuice/dolphin', 'open_issues_count': 0, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/JosJuice/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/JosJuice/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/JosJuice/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/JosJuice/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/JosJuice/dolphin', 'trees_url': 'https://api.github.com/repos/JosJuice/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/JosJuice/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/JosJuice/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T17:49:22Z', 'archived': False, 'svn_url': 'https://github.com/JosJuice/dolphin', 'has_projects': True, 'subscription_url': 'https://api.github.com/repos/JosJuice/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/JosJuice/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/JosJuice/dolphin/issues{/number}', 'size': 339614, 'open_issues': 0, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.', 'releases_url': 'https://api.github.com/repos/JosJuice/dolphin/releases{/id}', 'ssh_url': 'git@github.com:JosJuice/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/JosJuice/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/JosJuice/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/JosJuice/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/JosJuice/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/JosJuice/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T16:47:51Z', 'statuses_url': 'https://api.github.com/repos/JosJuice/dolphin/statuses/{sha}', 'created_at': '2014-11-01T17:12:40Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/JosJuice/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/JosJuice/dolphin/git/refs{/sha}', 'id': 26057138}, 'sha': '063543e9bfada3b8a1ccecebe0dd209406f26bde'}, 'deletions': 83, 'updated_at': '2019-03-23T17:49:23Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/063543e9bfada3b8a1ccecebe0dd209406f26bde', 'created_at': '2019-03-23T15:50:15Z', 'title': '[WIP] Add a Verify tab to game properties', 'requested_teams': [], 'id': 263841354}, 'action': 'synchronize', 'number': 7922, 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T17:46:55Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'after': '063543e9bfada3b8a1ccecebe0dd209406f26bde', 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'before': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54'}}
2019-03-23T17:46:55.574854	{'source': 'webserver', 'type': 'raw_gh_hook', 'gh_type': 'pull_request', 'raw': {'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.diff', 'body': 'This PR adds a new tab to the game properties window where you can check for problems with your games. Hopefully this can cut down a bit on people who ask about problems that turn out to be caused by bad dumps. For instance, there\'s a message about not having combined the files that CleanRip produces, and there\'s a message you get if you\'ve pirated a single-layer version of a game that\'s supposed to be dual-layer. Some screenshots to show what it looks like:\r\n\r\nMy good dump of Rodea the Sky Soldier (NTSC-K):\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868219-0bc41d80-4d82-11e9-83a6-1b3f0bc32383.png)\r\n\r\nThe same game but with the IOS slot hex edited to reproduce https://bugs.dolphin-emu.org/issues/10319:\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868230-3b732580-4d82-11e9-96ba-24e392dec65b.png)\r\n\r\nThis is a WIP for now, but feel free to review, as long as it isn\'t about the `Process()` function (I\'m going to change it later). Left to do:\r\n\r\n- [ ] Integrate the "Check Partition Integrity" feature (currently in the Filesystem tab)\r\n- [ ] Integrate checksum calculation (currently in the Info tab)\r\n\r\nIt would also be nice to include the ability to verify hashes with Redump.org or a similar database (https://bugs.dolphin-emu.org/issues/10867), but that\'s complex enough that I don\'t want to do it in this PR.', 'additions': 1124, 'merged_by': None, 'requested_reviewers': [], 'maintainer_can_modify': True, 'merged': False, 'draft': False, 'author_association': 'CONTRIBUTOR', 'number': 7922, 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922', 'labels': [], 'merged_at': None, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzODQxMzU0', 'state': 'open', 'review_comments': 19, 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/comments', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'assignee': None, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/comments', 'assignees': [], 'mergeable': None, 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'commits': 6, 'milestone': None, 'merge_commit_sha': 'e063c3208e0471494d94a34d037fd0e7d4105805', 'rebaseable': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'mergeable_state': 'unknown', 'locked': False, 'changed_files': 36, '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/5d5d131b140f9a2d1ce5a27226d917e4efad1b54'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/commits'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/comments'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/comments'}}, 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/commits', 'closed_at': None, 'base': {'ref': 'master', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'label': 'dolphin-emu:master', 'repo': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T16:15:43Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'sha': '672b582bec0ceecf8228358ef2579f3960c67b23'}, 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.patch', 'comments': 1, 'head': {'ref': 'verify-disc', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'label': 'JosJuice:verify-disc', 'repo': {'forks_count': 2, 'events_url': 'https://api.github.com/repos/JosJuice/dolphin/events', 'pulls_url': 'https://api.github.com/repos/JosJuice/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/JosJuice/dolphin/languages', 'git_url': 'git://github.com/JosJuice/dolphin.git', 'name': 'dolphin', 'watchers_count': 2, 'forks': 2, 'milestones_url': 'https://api.github.com/repos/JosJuice/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/JosJuice/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'watchers': 2, 'labels_url': 'https://api.github.com/repos/JosJuice/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/JosJuice/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/JosJuice/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/JosJuice/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/JosJuice/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/JosJuice/dolphin/teams', 'tags_url': 'https://api.github.com/repos/JosJuice/dolphin/tags', 'stargazers_count': 2, 'node_id': 'MDEwOlJlcG9zaXRvcnkyNjA1NzEzOA==', 'clone_url': 'https://github.com/JosJuice/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/JosJuice/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/JosJuice/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/JosJuice/dolphin', 'contributors_url': 'https://api.github.com/repos/JosJuice/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/JosJuice/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/JosJuice/dolphin/notifications{?since,all,participating}', 'fork': True, 'homepage': None, 'full_name': 'JosJuice/dolphin', 'open_issues_count': 0, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/JosJuice/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/JosJuice/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/JosJuice/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/JosJuice/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/JosJuice/dolphin', 'trees_url': 'https://api.github.com/repos/JosJuice/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/JosJuice/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/JosJuice/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T17:46:52Z', 'archived': False, 'svn_url': 'https://github.com/JosJuice/dolphin', 'has_projects': True, 'subscription_url': 'https://api.github.com/repos/JosJuice/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/JosJuice/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/JosJuice/dolphin/issues{/number}', 'size': 339614, 'open_issues': 0, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.', 'releases_url': 'https://api.github.com/repos/JosJuice/dolphin/releases{/id}', 'ssh_url': 'git@github.com:JosJuice/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/JosJuice/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/JosJuice/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/JosJuice/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/JosJuice/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/JosJuice/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T16:47:51Z', 'statuses_url': 'https://api.github.com/repos/JosJuice/dolphin/statuses/{sha}', 'created_at': '2014-11-01T17:12:40Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/JosJuice/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/JosJuice/dolphin/git/refs{/sha}', 'id': 26057138}, 'sha': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54'}, 'deletions': 83, 'updated_at': '2019-03-23T17:46:54Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'created_at': '2019-03-23T15:50:15Z', 'title': '[WIP] Add a Verify tab to game properties', 'requested_teams': [], 'id': 263841354}, 'action': 'synchronize', 'number': 7922, 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T16:15:43Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'after': '5d5d131b140f9a2d1ce5a27226d917e4efad1b54', 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'before': 'a30af0f164b3809616c257596256c540df6a5f4e'}}
2019-03-23T17:30:28.135632	{'source': 'webserver', 'type': 'raw_gh_hook', 'gh_type': 'pull_request_review', 'raw': {'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.diff', 'body': 'This PR adds a new tab to the game properties window where you can check for problems with your games. Hopefully this can cut down a bit on people who ask about problems that turn out to be caused by bad dumps. For instance, there\'s a message about not having combined the files that CleanRip produces, and there\'s a message you get if you\'ve pirated a single-layer version of a game that\'s supposed to be dual-layer. Some screenshots to show what it looks like:\r\n\r\nMy good dump of Rodea the Sky Soldier (NTSC-K):\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868219-0bc41d80-4d82-11e9-83a6-1b3f0bc32383.png)\r\n\r\nThe same game but with the IOS slot hex edited to reproduce https://bugs.dolphin-emu.org/issues/10319:\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868230-3b732580-4d82-11e9-96ba-24e392dec65b.png)\r\n\r\nThis is a WIP for now, but feel free to review, as long as it isn\'t about the `Process()` function (I\'m going to change it later). Left to do:\r\n\r\n- [ ] Integrate the "Check Partition Integrity" feature (currently in the Filesystem tab)\r\n- [ ] Integrate checksum calculation (currently in the Info tab)\r\n\r\nIt would also be nice to include the ability to verify hashes with Redump.org or a similar database (https://bugs.dolphin-emu.org/issues/10867), but that\'s complex enough that I don\'t want to do it in this PR.', 'assignees': [], 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'requested_reviewers': [], 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/a30af0f164b3809616c257596256c540df6a5f4e', 'milestone': None, 'merge_commit_sha': 'e063c3208e0471494d94a34d037fd0e7d4105805', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'author_association': 'CONTRIBUTOR', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/commits', 'head': {'ref': 'verify-disc', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'label': 'JosJuice:verify-disc', 'repo': {'forks_count': 2, 'events_url': 'https://api.github.com/repos/JosJuice/dolphin/events', 'pulls_url': 'https://api.github.com/repos/JosJuice/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/JosJuice/dolphin/languages', 'git_url': 'git://github.com/JosJuice/dolphin.git', 'name': 'dolphin', 'watchers_count': 2, 'forks': 2, 'milestones_url': 'https://api.github.com/repos/JosJuice/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/JosJuice/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'watchers': 2, 'labels_url': 'https://api.github.com/repos/JosJuice/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/JosJuice/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/JosJuice/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/JosJuice/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/JosJuice/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/JosJuice/dolphin/teams', 'tags_url': 'https://api.github.com/repos/JosJuice/dolphin/tags', 'stargazers_count': 2, 'node_id': 'MDEwOlJlcG9zaXRvcnkyNjA1NzEzOA==', 'clone_url': 'https://github.com/JosJuice/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/JosJuice/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/JosJuice/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/JosJuice/dolphin', 'contributors_url': 'https://api.github.com/repos/JosJuice/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/JosJuice/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/JosJuice/dolphin/notifications{?since,all,participating}', 'fork': True, 'homepage': None, 'full_name': 'JosJuice/dolphin', 'open_issues_count': 0, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/JosJuice/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/JosJuice/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/JosJuice/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/JosJuice/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/JosJuice/dolphin', 'trees_url': 'https://api.github.com/repos/JosJuice/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/JosJuice/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/JosJuice/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T16:00:47Z', 'archived': False, 'svn_url': 'https://github.com/JosJuice/dolphin', 'has_projects': True, 'subscription_url': 'https://api.github.com/repos/JosJuice/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/JosJuice/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/JosJuice/dolphin/issues{/number}', 'size': 339614, 'open_issues': 0, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.', 'releases_url': 'https://api.github.com/repos/JosJuice/dolphin/releases{/id}', 'ssh_url': 'git@github.com:JosJuice/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/JosJuice/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/JosJuice/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/JosJuice/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/JosJuice/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/JosJuice/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T16:47:51Z', 'statuses_url': 'https://api.github.com/repos/JosJuice/dolphin/statuses/{sha}', 'created_at': '2014-11-01T17:12:40Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/JosJuice/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/JosJuice/dolphin/git/refs{/sha}', 'id': 26057138}, 'sha': 'a30af0f164b3809616c257596256c540df6a5f4e'}, '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/a30af0f164b3809616c257596256c540df6a5f4e'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/commits'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/comments'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/comments'}}, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/comments', 'locked': False, 'closed_at': None, 'number': 7922, 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.patch', 'merged_at': None, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzODQxMzU0', 'base': {'ref': 'master', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'label': 'dolphin-emu:master', 'repo': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T16:15:43Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'sha': '672b582bec0ceecf8228358ef2579f3960c67b23'}, 'state': 'open', 'labels': [], 'updated_at': '2019-03-23T17:30:26Z', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/comments', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'created_at': '2019-03-23T15:50:15Z', 'title': '[WIP] Add a Verify tab to game properties', 'assignee': None, 'requested_teams': [], 'id': 263841354}, 'action': 'submitted', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T16:15:43Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'review': {'state': 'commented', 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'body': None, 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/AdmiralCurtiss/followers', 'url': 'https://api.github.com/users/AdmiralCurtiss', 'organizations_url': 'https://api.github.com/users/AdmiralCurtiss/orgs', 'node_id': 'MDQ6VXNlcjQ1MjIyMzc=', 'events_url': 'https://api.github.com/users/AdmiralCurtiss/events{/privacy}', 'repos_url': 'https://api.github.com/users/AdmiralCurtiss/repos', 'gists_url': 'https://api.github.com/users/AdmiralCurtiss/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/AdmiralCurtiss/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/AdmiralCurtiss/following{/other_user}', 'html_url': 'https://github.com/AdmiralCurtiss', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/4522237?v=4', 'login': 'AdmiralCurtiss', 'subscriptions_url': 'https://api.github.com/users/AdmiralCurtiss/subscriptions', 'starred_url': 'https://api.github.com/users/AdmiralCurtiss/starred{/owner}{/repo}', 'id': 4522237}, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218047963', 'submitted_at': '2019-03-23T17:30:26Z', '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#pullrequestreview-218047963'}}, 'node_id': 'MDE3OlB1bGxSZXF1ZXN0UmV2aWV3MjE4MDQ3OTYz', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'CONTRIBUTOR', 'id': 218047963}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/AdmiralCurtiss/followers', 'url': 'https://api.github.com/users/AdmiralCurtiss', 'organizations_url': 'https://api.github.com/users/AdmiralCurtiss/orgs', 'node_id': 'MDQ6VXNlcjQ1MjIyMzc=', 'events_url': 'https://api.github.com/users/AdmiralCurtiss/events{/privacy}', 'repos_url': 'https://api.github.com/users/AdmiralCurtiss/repos', 'gists_url': 'https://api.github.com/users/AdmiralCurtiss/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/AdmiralCurtiss/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/AdmiralCurtiss/following{/other_user}', 'html_url': 'https://github.com/AdmiralCurtiss', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/4522237?v=4', 'login': 'AdmiralCurtiss', 'subscriptions_url': 'https://api.github.com/users/AdmiralCurtiss/subscriptions', 'starred_url': 'https://api.github.com/users/AdmiralCurtiss/starred{/owner}{/repo}', 'id': 4522237}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}}}
2019-03-23T17:30:27.432139	{'source': 'webserver', 'type': 'raw_gh_hook', 'gh_type': 'pull_request_review_comment', 'raw': {'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.diff', 'body': 'This PR adds a new tab to the game properties window where you can check for problems with your games. Hopefully this can cut down a bit on people who ask about problems that turn out to be caused by bad dumps. For instance, there\'s a message about not having combined the files that CleanRip produces, and there\'s a message you get if you\'ve pirated a single-layer version of a game that\'s supposed to be dual-layer. Some screenshots to show what it looks like:\r\n\r\nMy good dump of Rodea the Sky Soldier (NTSC-K):\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868219-0bc41d80-4d82-11e9-83a6-1b3f0bc32383.png)\r\n\r\nThe same game but with the IOS slot hex edited to reproduce https://bugs.dolphin-emu.org/issues/10319:\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868230-3b732580-4d82-11e9-96ba-24e392dec65b.png)\r\n\r\nThis is a WIP for now, but feel free to review, as long as it isn\'t about the `Process()` function (I\'m going to change it later). Left to do:\r\n\r\n- [ ] Integrate the "Check Partition Integrity" feature (currently in the Filesystem tab)\r\n- [ ] Integrate checksum calculation (currently in the Info tab)\r\n\r\nIt would also be nice to include the ability to verify hashes with Redump.org or a similar database (https://bugs.dolphin-emu.org/issues/10867), but that\'s complex enough that I don\'t want to do it in this PR.', 'assignees': [], 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'requested_reviewers': [], 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/a30af0f164b3809616c257596256c540df6a5f4e', 'milestone': None, 'merge_commit_sha': 'e063c3208e0471494d94a34d037fd0e7d4105805', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'author_association': 'CONTRIBUTOR', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/commits', 'head': {'ref': 'verify-disc', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'label': 'JosJuice:verify-disc', 'repo': {'forks_count': 2, 'events_url': 'https://api.github.com/repos/JosJuice/dolphin/events', 'pulls_url': 'https://api.github.com/repos/JosJuice/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/JosJuice/dolphin/languages', 'git_url': 'git://github.com/JosJuice/dolphin.git', 'name': 'dolphin', 'watchers_count': 2, 'forks': 2, 'milestones_url': 'https://api.github.com/repos/JosJuice/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/JosJuice/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/6716818?v=4', 'login': 'JosJuice', 'subscriptions_url': 'https://api.github.com/users/JosJuice/subscriptions', 'starred_url': 'https://api.github.com/users/JosJuice/starred{/owner}{/repo}', 'id': 6716818}, 'watchers': 2, 'labels_url': 'https://api.github.com/repos/JosJuice/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/JosJuice/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/JosJuice/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/JosJuice/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/JosJuice/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/JosJuice/dolphin/teams', 'tags_url': 'https://api.github.com/repos/JosJuice/dolphin/tags', 'stargazers_count': 2, 'node_id': 'MDEwOlJlcG9zaXRvcnkyNjA1NzEzOA==', 'clone_url': 'https://github.com/JosJuice/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/JosJuice/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/JosJuice/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/JosJuice/dolphin', 'contributors_url': 'https://api.github.com/repos/JosJuice/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/JosJuice/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/JosJuice/dolphin/notifications{?since,all,participating}', 'fork': True, 'homepage': None, 'full_name': 'JosJuice/dolphin', 'open_issues_count': 0, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/JosJuice/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/JosJuice/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/JosJuice/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/JosJuice/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/JosJuice/dolphin', 'trees_url': 'https://api.github.com/repos/JosJuice/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/JosJuice/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/JosJuice/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T16:00:47Z', 'archived': False, 'svn_url': 'https://github.com/JosJuice/dolphin', 'has_projects': True, 'subscription_url': 'https://api.github.com/repos/JosJuice/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/JosJuice/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/JosJuice/dolphin/issues{/number}', 'size': 339614, 'open_issues': 0, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube/Wii emulator, allowing you to play games for these two platforms on PC, with improvements.', 'releases_url': 'https://api.github.com/repos/JosJuice/dolphin/releases{/id}', 'ssh_url': 'git@github.com:JosJuice/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/JosJuice/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/JosJuice/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/JosJuice/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/JosJuice/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/JosJuice/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-22T16:47:51Z', 'statuses_url': 'https://api.github.com/repos/JosJuice/dolphin/statuses/{sha}', 'created_at': '2014-11-01T17:12:40Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/JosJuice/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/JosJuice/dolphin/git/refs{/sha}', 'id': 26057138}, 'sha': 'a30af0f164b3809616c257596256c540df6a5f4e'}, '_links': {'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922'}, 'statuses': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/a30af0f164b3809616c257596256c540df6a5f4e'}, 'review_comment': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}'}, 'commits': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/commits'}, 'issue': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922'}, 'comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/comments'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'review_comments': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/comments'}}, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922/comments', 'locked': False, 'closed_at': None, 'number': 7922, 'issue_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/7922', 'patch_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.patch', 'merged_at': None, 'node_id': 'MDExOlB1bGxSZXF1ZXN0MjYzODQxMzU0', 'base': {'ref': 'master', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'label': 'dolphin-emu:master', 'repo': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T16:15:43Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'sha': '672b582bec0ceecf8228358ef2579f3960c67b23'}, 'state': 'open', 'labels': [], 'updated_at': '2019-03-23T17:30:26Z', 'review_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments{/number}', 'review_comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922/comments', 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922', 'created_at': '2019-03-23T15:50:15Z', 'title': '[WIP] Add a Verify tab to game properties', 'assignee': None, 'requested_teams': [], 'id': 263841354}, 'action': 'created', 'repository': {'forks_count': 1210, 'events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/events', 'pulls_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls{/number}', 'languages_url': 'https://api.github.com/repos/dolphin-emu/dolphin/languages', 'git_url': 'git://github.com/dolphin-emu/dolphin.git', 'name': 'dolphin', 'watchers_count': 5144, 'forks': 1210, 'milestones_url': 'https://api.github.com/repos/dolphin-emu/dolphin/milestones{/number}', 'branches_url': 'https://api.github.com/repos/dolphin-emu/dolphin/branches{/branch}', 'owner': {'site_admin': False, 'followers_url': 'https://api.github.com/users/dolphin-emu/followers', 'url': 'https://api.github.com/users/dolphin-emu', 'organizations_url': 'https://api.github.com/users/dolphin-emu/orgs', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/users/dolphin-emu/events{/privacy}', 'repos_url': 'https://api.github.com/users/dolphin-emu/repos', 'gists_url': 'https://api.github.com/users/dolphin-emu/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/dolphin-emu/received_events', 'type': 'Organization', 'following_url': 'https://api.github.com/users/dolphin-emu/following{/other_user}', 'html_url': 'https://github.com/dolphin-emu', 'gravatar_id': '', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'login': 'dolphin-emu', 'subscriptions_url': 'https://api.github.com/users/dolphin-emu/subscriptions', 'starred_url': 'https://api.github.com/users/dolphin-emu/starred{/owner}{/repo}', 'id': 5050316}, 'watchers': 5144, 'labels_url': 'https://api.github.com/repos/dolphin-emu/dolphin/labels{/name}', 'contents_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contents/{+path}', 'compare_url': 'https://api.github.com/repos/dolphin-emu/dolphin/compare/{base}...{head}', 'issue_comment_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/comments{/number}', 'subscribers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscribers', 'teams_url': 'https://api.github.com/repos/dolphin-emu/dolphin/teams', 'tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/tags', 'stargazers_count': 5144, 'node_id': 'MDEwOlJlcG9zaXRvcnkxMTU3NzMwNA==', 'clone_url': 'https://github.com/dolphin-emu/dolphin.git', 'mirror_url': None, 'deployments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/deployments', 'downloads_url': 'https://api.github.com/repos/dolphin-emu/dolphin/downloads', 'has_pages': False, 'html_url': 'https://github.com/dolphin-emu/dolphin', 'contributors_url': 'https://api.github.com/repos/dolphin-emu/dolphin/contributors', 'git_commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/commits{/sha}', 'has_downloads': True, 'notifications_url': 'https://api.github.com/repos/dolphin-emu/dolphin/notifications{?since,all,participating}', 'fork': False, 'homepage': 'https://dolphin-emu.org/', 'full_name': 'dolphin-emu/dolphin', 'open_issues_count': 167, 'has_wiki': True, 'comments_url': 'https://api.github.com/repos/dolphin-emu/dolphin/comments{/number}', 'merges_url': 'https://api.github.com/repos/dolphin-emu/dolphin/merges', 'has_issues': False, 'git_tags_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/tags{/sha}', 'blobs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/blobs{/sha}', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin', 'trees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/trees{/sha}', 'keys_url': 'https://api.github.com/repos/dolphin-emu/dolphin/keys{/key_id}', 'assignees_url': 'https://api.github.com/repos/dolphin-emu/dolphin/assignees{/user}', 'pushed_at': '2019-03-23T16:15:43Z', 'archived': False, 'svn_url': 'https://github.com/dolphin-emu/dolphin', 'has_projects': False, 'subscription_url': 'https://api.github.com/repos/dolphin-emu/dolphin/subscription', 'collaborators_url': 'https://api.github.com/repos/dolphin-emu/dolphin/collaborators{/collaborator}', 'issues_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues{/number}', 'size': 376771, 'open_issues': 167, 'license': {'node_id': 'MDc6TGljZW5zZTg=', 'key': 'gpl-2.0', 'name': 'GNU General Public License v2.0', 'spdx_id': 'GPL-2.0', 'url': 'https://api.github.com/licenses/gpl-2.0'}, 'description': 'Dolphin is a GameCube / Wii emulator, allowing you to play games for these two platforms on PC with improvements.', 'releases_url': 'https://api.github.com/repos/dolphin-emu/dolphin/releases{/id}', 'ssh_url': 'git@github.com:dolphin-emu/dolphin.git', 'issue_events_url': 'https://api.github.com/repos/dolphin-emu/dolphin/issues/events{/number}', 'commits_url': 'https://api.github.com/repos/dolphin-emu/dolphin/commits{/sha}', 'language': 'C++', 'forks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/forks', 'default_branch': 'master', 'stargazers_url': 'https://api.github.com/repos/dolphin-emu/dolphin/stargazers', 'archive_url': 'https://api.github.com/repos/dolphin-emu/dolphin/{archive_format}{/ref}', 'updated_at': '2019-03-23T15:29:19Z', 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/{sha}', 'created_at': '2013-07-22T09:07:57Z', 'private': False, 'hooks_url': 'https://api.github.com/repos/dolphin-emu/dolphin/hooks', 'git_refs_url': 'https://api.github.com/repos/dolphin-emu/dolphin/git/refs{/sha}', 'id': 11577304}, 'sender': {'site_admin': False, 'followers_url': 'https://api.github.com/users/AdmiralCurtiss/followers', 'url': 'https://api.github.com/users/AdmiralCurtiss', 'organizations_url': 'https://api.github.com/users/AdmiralCurtiss/orgs', 'node_id': 'MDQ6VXNlcjQ1MjIyMzc=', 'events_url': 'https://api.github.com/users/AdmiralCurtiss/events{/privacy}', 'repos_url': 'https://api.github.com/users/AdmiralCurtiss/repos', 'gists_url': 'https://api.github.com/users/AdmiralCurtiss/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/AdmiralCurtiss/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/AdmiralCurtiss/following{/other_user}', 'html_url': 'https://github.com/AdmiralCurtiss', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/4522237?v=4', 'login': 'AdmiralCurtiss', 'subscriptions_url': 'https://api.github.com/users/AdmiralCurtiss/subscriptions', 'starred_url': 'https://api.github.com/users/AdmiralCurtiss/starred{/owner}{/repo}', 'id': 4522237}, 'organization': {'url': 'https://api.github.com/orgs/dolphin-emu', 'node_id': 'MDEyOk9yZ2FuaXphdGlvbjUwNTAzMTY=', 'events_url': 'https://api.github.com/orgs/dolphin-emu/events', 'repos_url': 'https://api.github.com/orgs/dolphin-emu/repos', 'members_url': 'https://api.github.com/orgs/dolphin-emu/members{/member}', 'issues_url': 'https://api.github.com/orgs/dolphin-emu/issues', 'public_members_url': 'https://api.github.com/orgs/dolphin-emu/public_members{/member}', 'login': 'dolphin-emu', 'hooks_url': 'https://api.github.com/orgs/dolphin-emu/hooks', 'avatar_url': 'https://avatars2.githubusercontent.com/u/5050316?v=4', 'description': '', 'id': 5050316}, 'comment': {'pull_request_review_id': 218047963, 'pull_request_url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'position': 106, 'body': "I'm guessing this should probably be `if (ShouldHaveChannelPartition() && !has_channel_partition)`?", 'path': 'Source/Core/DiscIO/VolumeVerifier.cpp', 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268402603', '_links': {'pull_request': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922'}, 'html': {'href': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268402603'}, 'self': {'href': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/comments/268402603'}}, 'node_id': 'MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDI2ODQwMjYwMw==', 'commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e', 'author_association': 'CONTRIBUTOR', 'diff_hunk': '@@ -0,0 +1,648 @@\n+// Copyright 2019 Dolphin Emulator Project\n+// Licensed under GPLv2+\n+// Refer to the license.txt file included.\n+\n+#include "DiscIO/VolumeVerifier.h"\n+\n+#include <algorithm>\n+#include <cinttypes>\n+#include <limits>\n+#include <optional>\n+#include <string>\n+#include <unordered_set>\n+\n+#include "Common/Align.h"\n+#include "Common/Assert.h"\n+#include "Common/MsgHandler.h"\n+#include "Common/StringUtil.h"\n+#include "Common/Swap.h"\n+#include "Core/IOS/Device.h"\n+#include "Core/IOS/ES/ES.h"\n+#include "Core/IOS/ES/Formats.h"\n+#include "Core/IOS/IOS.h"\n+#include "Core/IOS/IOSC.h"\n+#include "DiscIO/Blob.h"\n+#include "DiscIO/DiscExtractor.h"\n+#include "DiscIO/Enums.h"\n+#include "DiscIO/Filesystem.h"\n+#include "DiscIO/Volume.h"\n+#include "DiscIO/VolumeWii.h"\n+\n+namespace DiscIO\n+{\n+constexpr u64 MINI_DVD_SIZE = 1459978240;  // GameCube\n+constexpr u64 SL_DVD_SIZE = 4699979776;    // Wii retail\n+constexpr u64 SL_DVD_R_SIZE = 4707319808;  // Wii RVT-R\n+constexpr u64 DL_DVD_SIZE = 8511160320;    // Wii retail\n+constexpr u64 DL_DVD_R_SIZE = 8543666176;  // Wii RVT-R\n+\n+constexpr int BLOCK_SIZE = 0x8000;\n+\n+VolumeVerifier::VolumeVerifier(const Volume& volume)\n+    : m_volume(volume), m_started(false), m_done(false), m_progress(0),\n+      m_max_progress(Common::AlignUp(volume.GetSize(), BLOCK_SIZE) / BLOCK_SIZE)\n+{\n+}\n+\n+void VolumeVerifier::Start()\n+{\n+  ASSERT(!m_started);\n+  m_started = true;\n+\n+  m_is_tgc = m_volume.GetBlobType() == BlobType::TGC;\n+  m_is_datel = !GetBootDOLOffset(m_volume, m_volume.GetGamePartition()).has_value();\n+  m_is_not_retail =\n+      (m_volume.GetVolumeType() == Platform::WiiDisc && !m_volume.IsEncryptedAndHashed()) ||\n+      IsDebugSigned();\n+\n+  const std::vector<Partition> partitions = CheckPartitions();\n+  if (m_volume.GetVolumeType() == Platform::WiiWAD)\n+    CheckCorrectlySigned(PARTITION_NONE, GetStringT("This title is not correctly signed."));\n+  CheckDiscSize();\n+  CheckMisc();\n+}\n+\n+std::vector<Partition> VolumeVerifier::CheckPartitions()\n+{\n+  const std::vector<Partition> partitions = m_volume.GetPartitions();\n+  if (partitions.empty())\n+  {\n+    if (m_volume.GetVolumeType() != Platform::WiiWAD &&\n+        !m_volume.GetFileSystem(m_volume.GetGamePartition()))\n+    {\n+      AddProblem(Severity::High, GetStringT("The filesystem is invalid or could not be read."));\n+      return {};\n+    }\n+    return {m_volume.GetGamePartition()};\n+  }\n+\n+  std::optional<u32> partitions_in_first_table = m_volume.ReadSwapped<u32>(0x40000, PARTITION_NONE);\n+  if (partitions_in_first_table && *partitions_in_first_table > 8)\n+  {\n+    // Not sure if 8 actually is the limit, but there certainly aren\'t any discs\n+    // released that have as many partitions as 8 in the first partition table.\n+    // The only game that has that many partitions in total is Super Smash Bros. Brawl,\n+    // and that game places all partitions other than UPDATE and DATA in the second table.\n+    AddProblem(Severity::Low,\n+               GetStringT("There are too many partitions in the first partition table."));\n+  }\n+\n+  std::vector<u32> types;\n+  for (const Partition& partition : partitions)\n+  {\n+    const std::optional<u32> type = m_volume.GetPartitionType(partition);\n+    if (type)\n+      types.emplace_back(*type);\n+  }\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_UPDATE) == types.cend())\n+    AddProblem(Severity::Low, GetStringT("The update partition is missing."));\n+\n+  if (std::find(types.cbegin(), types.cend(), PARTITION_DATA) == types.cend())\n+    AddProblem(Severity::High, GetStringT("The data partition is missing."));\n+\n+  const bool has_channel_partition =\n+      std::find(types.cbegin(), types.cend(), PARTITION_CHANNEL) != types.cend();\n+  if (ShouldHaveChannelPartition() && has_channel_partition)', 'updated_at': '2019-03-23T17:30:26Z', 'original_position': 106, 'html_url': 'https://github.com/dolphin-emu/dolphin/pull/7922#discussion_r268402603', 'created_at': '2019-03-23T17:30:26Z', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/AdmiralCurtiss/followers', 'url': 'https://api.github.com/users/AdmiralCurtiss', 'organizations_url': 'https://api.github.com/users/AdmiralCurtiss/orgs', 'node_id': 'MDQ6VXNlcjQ1MjIyMzc=', 'events_url': 'https://api.github.com/users/AdmiralCurtiss/events{/privacy}', 'repos_url': 'https://api.github.com/users/AdmiralCurtiss/repos', 'gists_url': 'https://api.github.com/users/AdmiralCurtiss/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/AdmiralCurtiss/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/AdmiralCurtiss/following{/other_user}', 'html_url': 'https://github.com/AdmiralCurtiss', 'gravatar_id': '', 'avatar_url': 'https://avatars1.githubusercontent.com/u/4522237?v=4', 'login': 'AdmiralCurtiss', 'subscriptions_url': 'https://api.github.com/users/AdmiralCurtiss/subscriptions', 'starred_url': 'https://api.github.com/users/AdmiralCurtiss/starred{/owner}{/repo}', 'id': 4522237}, 'id': 268402603, 'original_commit_id': 'a30af0f164b3809616c257596256c540df6a5f4e'}}}
2019-03-23T17:14:15.265972	{'source': 'webserver', 'type': 'raw_gh_hook', 'gh_type': 'pull_request_review_comment', 'raw': {'pull_request': {'diff_url': 'https://github.com/dolphin-emu/dolphin/pull/7922.diff', 'body': 'This PR adds a new tab to the game properties window where you can check for problems with your games. Hopefully this can cut down a bit on people who ask about problems that turn out to be caused by bad dumps. For instance, there\'s a message about not having combined the files that CleanRip produces, and there\'s a message you get if you\'ve pirated a single-layer version of a game that\'s supposed to be dual-layer. Some screenshots to show what it looks like:\r\n\r\nMy good dump of Rodea the Sky Soldier (NTSC-K):\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868219-0bc41d80-4d82-11e9-83a6-1b3f0bc32383.png)\r\n\r\nThe same game but with the IOS slot hex edited to reproduce https://bugs.dolphin-emu.org/issues/10319:\r\n\r\n![image](https://user-images.githubusercontent.com/6716818/54868230-3b732580-4d82-11e9-96ba-24e392dec65b.png)\r\n\r\nThis is a WIP for now, but feel free to review, as long as it isn\'t about the `Process()` function (I\'m going to change it later). Left to do:\r\n\r\n- [ ] Integrate the "Check Partition Integrity" feature (currently in the Filesystem tab)\r\n- [ ] Integrate checksum calculation (currently in the Info tab)\r\n\r\nIt would also be nice to include the ability to verify hashes with Redump.org or a similar database (https://bugs.dolphin-emu.org/issues/10867), but that\'s complex enough that I don\'t want to do it in this PR.', 'assignees': [], 'url': 'https://api.github.com/repos/dolphin-emu/dolphin/pulls/7922', 'requested_reviewers': [], 'statuses_url': 'https://api.github.com/repos/dolphin-emu/dolphin/statuses/a30af0f164b3809616c257596256c540df6a5f4e', 'milestone': None, 'merge_commit_sha': 'e063c3208e0471494d94a34d037fd0e7d4105805', 'user': {'site_admin': False, 'followers_url': 'https://api.github.com/users/JosJuice/followers', 'url': 'https://api.github.com/users/JosJuice', 'organizations_url': 'https://api.github.com/users/JosJuice/orgs', 'node_id': 'MDQ6VXNlcjY3MTY4MTg=', 'events_url': 'https://api.github.com/users/JosJuice/events{/privacy}', 'repos_url': 'https://api.github.com/users/JosJuice/repos', 'gists_url': 'https://api.github.com/users/JosJuice/gists{/gist_id}', 'received_events_url': 'https://api.github.com/users/JosJuice/received_events', 'type': 'User', 'following_url': 'https://api.github.com/users/JosJuice/following{/other_user}', 'html_url': 'https://github.com/JosJuice', 'gravat