+function find_all_ratios(json)
+{
+ let ratios = {};
+ let players = {};
+ for (const player of json['players']) {
+ players[player['player_id']] = {
+ 'gender': player['gender'],
+ 'last_point_seen': null,
+ };
+ }
+ for (const match of json['matches']) {
+ for (const [q,p] of Object.entries(players)) {
+ p.on_field_since = null;
+ }
+ for (const e of match['events']) {
+ let p = players[e['player']];
+ let type = e['type'];
+ if (type === 'in') {
+ p.on_field_since = 1;
+ } else if (type === 'out') {
+ p.on_field_since = null;
+ } else if (type === 'pull' || type == 'their_pull') { // We assume no cross-gender subs for now.
+ let code = find_gender_ratio_code(players);
+ if (ratios[code] === undefined) {
+ ratios[code] = code;
+ if (code !== '4 F, 3 M' && code !== '4 M, 3 F' && code !== '3 M, 2 F' && code !== '3 F, 2 M') {
+ console.log('Unexpected gender ratio ' + code + ' first seen at: ' +
+ match['description'] + ', ' + format_time(e['t']));
+ }
+ }
+ }
+ }
+ }
+ return ratios;
+}
+